Compare commits

...

14 Commits

Author SHA1 Message Date
ac87a140cc fixes 2021-09-04 19:34:24 +06:00
0dbe3a866b dependencies update 2021-09-04 19:09:16 +06:00
7c50c58a90 fix 2021-05-01 20:22:12 +06:00
ceff1eb1ef updates 2021-05-01 20:12:06 +06:00
46d6d429bb one more fix for web 2021-03-14 21:53:26 +06:00
dd9e71c9a2 fix in web view for loading of config 2021-03-14 21:46:41 +06:00
6d2ffb8a6e Update gradle.properties 2021-03-12 00:11:37 +06:00
25767eecb2 add github badge onto web version 2021-03-02 17:19:17 +06:00
603da9a021 fixes in saves 2021-03-02 16:51:08 +06:00
b43016bb24 repositories properties now checked 2021-03-02 16:45:46 +06:00
4c4845803d Merge pull request #3 from InsanusMokrassar/rewrite_with_web
add and web target
2021-03-02 14:11:38 +06:00
4ec7d3847f update workflows 2021-03-02 14:02:57 +06:00
2bbfe99ff4 add web publish step 2021-03-02 13:53:12 +06:00
881d268ea9 complete main part 2021-03-02 13:44:33 +06:00
18 changed files with 177 additions and 59 deletions

17
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
on: [push]
name: Build
jobs:
build-ubuntu:
name: Commit release
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup JDK
uses: actions/setup-java@v1
with:
java-version: 11
- name: Build
run: ./gradlew build packageUberJarForCurrentOS

View File

@@ -1,4 +1,7 @@
on: [push] on:
push:
branches:
- master
name: Commit release name: Commit release
@@ -16,7 +19,13 @@ jobs:
- name: Set version from gradle.properties - name: Set version from gradle.properties
run: echo "version=` cat gradle.properties | grep ^version= | grep -o [\\.0-9]* `" >> $GITHUB_ENV run: echo "version=` cat gradle.properties | grep ^version= | grep -o [\\.0-9]* `" >> $GITHUB_ENV
- name: Build - name: Build
run: ./gradlew packageUberJarForCurrentOS run: ./gradlew build packageUberJarForCurrentOS
- name: Publish Web
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./web/build/distributions
publish_branch: site
- name: Create Release - name: Create Release
id: create_release id: create_release
uses: actions/create-release@v1 uses: actions/create-release@v1

View File

@@ -1,6 +1,5 @@
buildscript { buildscript {
repositories { repositories {
jcenter()
google() google()
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()
@@ -8,7 +7,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.0.2' classpath 'com.android.tools.build:gradle:4.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:$dexcount_version" classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:$dexcount_version"
@@ -19,10 +18,8 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
mavenLocal() mavenLocal()
jcenter()
mavenCentral() mavenCentral()
google() google()
maven { url "https://kotlin.bintray.com/kotlinx" }
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" } maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
} }
} }

View File

@@ -30,19 +30,19 @@ suspend fun HttpClient.getLicenses(): Map<String, License> {
suspend fun HttpClient.searchLicense(name: String): List<License> { suspend fun HttpClient.searchLicense(name: String): List<License> {
val licenses = licenses ?: getLicenses() val licenses = licenses ?: getLicenses()
val lowerCase = name.toLowerCase() val lowerCase = name.lowercase()
val upperCase = name.toUpperCase() val upperCase = name.uppercase()
return licenses.values.filter { return licenses.values.filter {
it.title.toLowerCase().contains(lowerCase) || it.title.toUpperCase().contains(upperCase) || it.title.contains(name) it.title.lowercase().contains(lowerCase) || it.title.uppercase().contains(upperCase) || it.title.contains(name)
|| it.id.toLowerCase().contains(lowerCase) || it.id.toUpperCase().contains(upperCase) || it.id.contains(name) || it.id.lowercase().contains(lowerCase) || it.id.uppercase().contains(upperCase) || it.id.contains(name)
} }
} }
fun Map<String, License>.searchLicense(name: String): List<License> { fun Map<String, License>.searchLicense(name: String): List<License> {
val lowerCase = name.toLowerCase() val lowerCase = name.lowercase()
val upperCase = name.toUpperCase() val upperCase = name.uppercase()
return values.filter { return values.filter {
it.title.toLowerCase().contains(lowerCase) || it.title.toUpperCase().contains(upperCase) || it.title.contains(name) it.title.lowercase().contains(lowerCase) || it.title.uppercase().contains(upperCase) || it.title.contains(name)
|| it.id.toLowerCase().contains(lowerCase) || it.id.toUpperCase().contains(upperCase) || it.id.contains(name) || it.id.lowercase().contains(lowerCase) || it.id.uppercase().contains(upperCase) || it.id.contains(name)
} }
} }

View File

@@ -2,6 +2,9 @@ package dev.inmo.kmppscriptbuilder.core.models
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
const val defaultProjectName = "\${project.name}"
const val defaultProjectDescription = "\${project.name}"
@Serializable @Serializable
data class MavenConfig( data class MavenConfig(
val name: String, val name: String,
@@ -22,14 +25,20 @@ data class MavenPublishingRepository(
name.toUpperCase() name.toUpperCase()
} }
fun build(indent: String) = """maven { fun build(indent: String): String {
name = "$name" val usernameProperty = "${nameCapitalized}_USER"
url = uri("$url") val passwordProperty = "${nameCapitalized}_PASSWORD"
credentials { return """if ((project.hasProperty('${usernameProperty}') || System.getenv('${usernameProperty}') != null) && (project.hasProperty('${passwordProperty}') || System.getenv('${passwordProperty}') != null)) {
username = project.hasProperty('${nameCapitalized}_USER') ? project.property('${nameCapitalized}_USER') : System.getenv('${nameCapitalized}_USER') maven {
password = project.hasProperty('${nameCapitalized}_PASSWORD') ? project.property('${nameCapitalized}_PASSWORD') : System.getenv('${nameCapitalized}_PASSWORD') name = "$name"
url = uri("$url")
credentials {
username = project.hasProperty('${usernameProperty}') ? project.property('${usernameProperty}') : System.getenv('${usernameProperty}')
password = project.hasProperty('${passwordProperty}') ? project.property('${passwordProperty}') : System.getenv('${passwordProperty}')
}
} }
}""".replace("\n", "\n$indent") }""".replace("\n", "\n$indent")
}
} }
val SonatypeRepository = MavenPublishingRepository("sonatype", "https://oss.sonatype.org/service/local/staging/deploy/maven2/") val SonatypeRepository = MavenPublishingRepository("sonatype", "https://oss.sonatype.org/service/local/staging/deploy/maven2/")

View File

@@ -3,12 +3,14 @@ package dev.inmo.kmppscriptbuilder.desktop
import androidx.compose.desktop.Window import androidx.compose.desktop.Window
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.Colors
import androidx.compose.material.MaterialTheme
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.init
import dev.inmo.kmppscriptbuilder.desktop.views.* import dev.inmo.kmppscriptbuilder.desktop.utils.loadConfigFile
import dev.inmo.kmppscriptbuilder.desktop.views.BuilderView
import java.io.File import java.io.File
//private val uncaughtExceptionsBC = BroadcastChannel<DefaultErrorHandler.ErrorEvent>(Channel.CONFLATED) //private val uncaughtExceptionsBC = BroadcastChannel<DefaultErrorHandler.ErrorEvent>(Channel.CONFLATED)

View File

@@ -0,0 +1,17 @@
package dev.inmo.kmppscriptbuilder.desktop.utils
import java.awt.Desktop
import java.net.URI
fun openLink(link: String): Boolean {
val desktop = if (Desktop.isDesktopSupported()) Desktop.getDesktop() else null
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
desktop.browse(URI(link))
return true
} catch (e: Exception) {
e.printStackTrace()
}
}
return false
}

View File

@@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.svgResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.core.models.Config import dev.inmo.kmppscriptbuilder.core.models.Config
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.*
@@ -45,7 +45,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/open_file.svg"), painter = painterResource("images/open_file.svg"),
contentDescription = "Open file" contentDescription = "Open file"
) )
} }
@@ -57,7 +57,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/save_file.svg"), painter = painterResource("images/save_file.svg"),
contentDescription = "Save file" contentDescription = "Save file"
) )
} }
@@ -70,7 +70,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/export_gradle.svg"), painter = painterResource("images/export_gradle.svg"),
contentDescription = "Export Gradle script" contentDescription = "Export Gradle script"
) )
} }
@@ -84,7 +84,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/save_as.svg"), painter = painterResource("images/save_as.svg"),
contentDescription = "Export Gradle script" contentDescription = "Export Gradle script"
) )
} }
@@ -100,4 +100,4 @@ class BuilderView : View() {
} }
} }
} }
} }

View File

@@ -2,7 +2,7 @@ package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.runtime.* import androidx.compose.runtime.*
import dev.inmo.kmppscriptbuilder.core.models.Developer import dev.inmo.kmppscriptbuilder.core.models.Developer
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.CommonTextField
class DeveloperState( class DeveloperState(
id: String = "", id: String = "",

View File

@@ -53,7 +53,7 @@ class LicensesView: VerticalView("Licenses") {
licensesOffersToShow.clear() licensesOffersToShow.clear()
if (licenseSearchFilter.isNotEmpty()) { if (licenseSearchFilter.isNotEmpty()) {
licensesOffersToShow.addAll( licensesOffersToShow.addAll(
availableLicensesState.filter { filterText.all { symbol -> symbol.toLowerCase() in it.title } } availableLicensesState.filter { filterText.all { symbol -> symbol.lowercaseChar() in it.title } }
) )
} }
} }

View File

@@ -1,11 +1,13 @@
package dev.inmo.kmppscriptbuilder.desktop.views package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.Button
import androidx.compose.runtime.* import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.CommonText
import dev.inmo.kmppscriptbuilder.desktop.utils.VerticalView
abstract class ListView<T>(title: String) : VerticalView(title) { abstract class ListView<T>(title: String) : VerticalView(title) {
protected val itemsList = mutableStateListOf<T>() protected val itemsList = mutableStateListOf<T>()

View File

@@ -2,8 +2,7 @@ package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.runtime.* import androidx.compose.runtime.*
import dev.inmo.kmppscriptbuilder.core.models.MavenConfig import dev.inmo.kmppscriptbuilder.core.models.*
import dev.inmo.kmppscriptbuilder.core.models.SonatypeRepository
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.*
class MavenInfoView : VerticalView("Project information") { class MavenInfoView : VerticalView("Project information") {
@@ -18,8 +17,8 @@ class MavenInfoView : VerticalView("Project information") {
var mavenConfig: MavenConfig var mavenConfig: MavenConfig
get() = MavenConfig( get() = MavenConfig(
projectNameProperty, projectNameProperty.ifBlank { defaultProjectName },
projectDescriptionProperty, projectDescriptionProperty.ifBlank { defaultProjectDescription },
projectUrlProperty, projectUrlProperty,
projectVcsUrlProperty, projectVcsUrlProperty,
includeGpgSignProperty, includeGpgSignProperty,

View File

@@ -2,7 +2,7 @@ package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.runtime.* import androidx.compose.runtime.*
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.CommonTextField
class RepositoryState( class RepositoryState(
name: String = "", name: String = "",

View File

@@ -6,27 +6,27 @@ kotlin.incremental.js=true
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
kotlin_version=1.4.30 kotlin_version=1.5.21
kotlin_coroutines_version=1.4.2 kotlin_coroutines_version=1.5.2
kotlin_serialisation_core_version=1.1.0 kotlin_serialisation_core_version=1.2.2
ktor_version=1.5.1 ktor_version=1.6.3
micro_utils_version=0.4.27 micro_utils_version=0.5.24
compose_version=0.3.0 compose_version=1.0.0-alpha3
# ANDROID # ANDROID
android_minSdkVersion=21 android_minSdkVersion=21
android_compileSdkVersion=30 android_compileSdkVersion=30
android_buildToolsVersion=30.0.2 android_buildToolsVersion=30.0.3
dexcount_version=2.0.0 dexcount_version=3.0.0
junit_version=4.12 junit_version=4.12
test_ext_junit_version=1.1.2 test_ext_junit_version=1.1.2
espresso_core=3.3.0 espresso_core=3.3.0
# Dokka # Dokka
dokka_version=1.4.20 dokka_version=1.5.0
# Project data # Project data

View File

@@ -1,16 +1,81 @@
package dev.inmo.kmppscriptbuilder.web package dev.inmo.kmppscriptbuilder.web
import dev.inmo.kmppscriptbuilder.core.models.Config
import dev.inmo.kmppscriptbuilder.core.utils.serialFormat
import dev.inmo.kmppscriptbuilder.web.views.* import dev.inmo.kmppscriptbuilder.web.views.*
import kotlinx.browser.document import kotlinx.browser.document
import kotlinx.dom.appendElement
import org.w3c.dom.*
import org.w3c.dom.url.URL
import org.w3c.files.*
fun saveFile(content: String, filename: String) {
val a = document.body!!.appendElement("a") {
setAttribute("style", "visibility:hidden; display: none")
} as HTMLAnchorElement
val blob = Blob(arrayOf(content), BlobPropertyBag(
"application/*;charset=utf-8"
))
val url = URL.createObjectURL(blob)
a.href = url
a.download = filename
a.click()
URL.revokeObjectURL(url)
a.remove()
}
fun main() { fun main() {
document.addEventListener( document.addEventListener(
"DOMContentLoaded", "DOMContentLoaded",
{ {
val builderView = BuilderView() val builderView = BuilderView()
document.body ?.onclick = {
println(builderView.config) (document.getElementById("openConfig") as HTMLElement).onclick = {
Unit val targetInput = document.body!!.appendElement("input") {
setAttribute("style", "visibility:hidden; display: none")
} as HTMLInputElement
targetInput.type = "file"
targetInput.onchange = {
targetInput.files ?.also { files ->
for (i in (0 until files.length) ) {
files[i] ?.also { file ->
val reader = FileReader()
reader.onload = {
val content = it.target.asDynamic().result as String
builderView.config = serialFormat.decodeFromString(Config.serializer(), content)
false
}
reader.readAsText(file)
}
}
}
}
targetInput.click()
targetInput.remove()
false
}
(document.getElementById("saveConfig") as HTMLElement).onclick = {
val filename = "publish.kpsb"
val content = serialFormat.encodeToString(Config.serializer(), builderView.config)
saveFile(content, filename)
false
}
(document.getElementById("exportScript") as HTMLElement).onclick = {
val filename = "publish.gradle"
val content = builderView.config.run {
type.buildMavenGradleConfig(
mavenConfig,
licenses
)
}
saveFile(content, filename)
false
} }
} }
) )

View File

@@ -1,7 +1,6 @@
package dev.inmo.kmppscriptbuilder.web.views package dev.inmo.kmppscriptbuilder.web.views
import dev.inmo.kmppscriptbuilder.core.models.MavenConfig import dev.inmo.kmppscriptbuilder.core.models.*
import dev.inmo.kmppscriptbuilder.core.models.SonatypeRepository
import kotlinx.browser.document import kotlinx.browser.document
import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLElement
import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLInputElement
@@ -18,8 +17,8 @@ class MavenProjectInfoView : View {
var mavenConfig: MavenConfig var mavenConfig: MavenConfig
get() = MavenConfig( get() = MavenConfig(
nameElement.value, nameElement.value.ifBlank { defaultProjectName },
descriptionElement.value, descriptionElement.value.ifBlank { defaultProjectDescription },
urlElement.value, urlElement.value,
vcsUrlElement.value, vcsUrlElement.value,
includeGpgElement.checked, includeGpgElement.checked,
@@ -39,6 +38,6 @@ class MavenProjectInfoView : View {
developersView.developers = value.developers developersView.developers = value.developers
val reposWithoutSonatype = value.repositories.filter { it != SonatypeRepository } val reposWithoutSonatype = value.repositories.filter { it != SonatypeRepository }
includeMavenCentralElement.checked = value.repositories.size != reposWithoutSonatype.size includeMavenCentralElement.checked = value.repositories.size != reposWithoutSonatype.size
repositoriesView.repositories = value.repositories repositoriesView.repositories = reposWithoutSonatype
} }
} }

View File

@@ -21,7 +21,7 @@ class RepositoriesView(rootElement: HTMLElement) : MutableListView<MavenPublishi
override fun HTMLElement.addContentBeforeRemoveButton(value: MavenPublishingRepository) { override fun HTMLElement.addContentBeforeRemoveButton(value: MavenPublishingRepository) {
createTextField("Repository name", "This name will be used to identify repository in grade").value = value.name createTextField("Repository name", "This name will be used to identify repository in grade").value = value.name
createTextField("Repository URL", "For example: https://repo.maven.apache.org/maven2/").value = value.name createTextField("Repository URL", "For example: https://repo.maven.apache.org/maven2/").value = value.url
} }
override fun HTMLElement.updateElement(from: MavenPublishingRepository, to: MavenPublishingRepository) { override fun HTMLElement.updateElement(from: MavenPublishingRepository, to: MavenPublishingRepository) {

View File

@@ -10,11 +10,13 @@
<nav class="uk-navbar-container" uk-navbar> <nav class="uk-navbar-container" uk-navbar>
<div class="uk-navbar-left"> <div class="uk-navbar-left">
<div class="uk-padding-small uk-text-lead">Kotlin Publication Scripts Builder</div> <div class="uk-padding-small uk-text-lead">Kotlin Publication Scripts Builder</div>
<div class="uk-padding-small"><a href="https://github.com/InsanusMokrassar/KotlinPublicationScriptsBuilder"><img src="https://img.shields.io/github/stars/InsanusMokrassar/KotlinPublicationScriptsBuilder?label=Github&style=plastic"/></a></div>
</div> </div>
<div class="uk-navbar-right"> <div class="uk-navbar-right">
<ul class="uk-navbar-nav"> <ul class="uk-navbar-nav">
<li uk-tooltip="title: Open file"><a href="#"><span uk-icon="icon: pull"></span></a></li><!--Open file--> <li uk-tooltip="title: Open config" id="openConfig"><a href="#"><span uk-icon="icon: pull"></span></a></li><!--Open file-->
<li uk-tooltip="title: Save file"><a href="#"><span uk-icon="icon: push"></span></a></li><!--Save file--> <li uk-tooltip="title: Save config" id="saveConfig"><a href="#"><span uk-icon="icon: push"></span></a></li><!--Save file-->
<li uk-tooltip="title: Export script" id="exportScript"><a href="#"><span uk-icon="icon: upload"></span></a></li><!--Save file-->
</ul> </ul>
</div> </div>
</nav> </nav>