diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 23ed5435..5c1c3bac 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,28 +1,31 @@ name: Dokka publication on: - push: - branches: [ master ] + workflow_dispatch: + release: + types: [ created ] jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest timeout-minutes: 40 steps: - - uses: actions/checkout@v2 - - uses: DeLaGuardo/setup-graalvm@4.0 + - uses: actions/checkout@v3.0.0 + - uses: actions/setup-java@v3.0.0 with: - graalvm: 21.2.0 - java: java11 - arch: amd64 - - uses: actions/cache@v2 + java-version: 11 + distribution: liberica + - name: Cache konan + uses: actions/cache@v3.0.1 with: - path: ~/.gradle/caches + path: ~/.konan key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} restore-keys: | ${{ runner.os }}-gradle- - - run: ./gradlew dokkaHtmlMultiModule --build-cache --no-daemon --no-parallel --stacktrace - - uses: JamesIves/github-pages-deploy-action@4.1.0 + - uses: gradle/gradle-build-action@v2.1.5 + with: + arguments: dokkaHtmlMultiModule --no-parallel + - uses: JamesIves/github-pages-deploy-action@v4.3.0 with: branch: gh-pages folder: build/dokka/htmlMultiModule diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e607e4b7..ab9243f1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,32 +9,18 @@ jobs: publish: environment: name: publish - env: - publishing.github: false strategy: matrix: os: [ macOS-latest, windows-latest ] runs-on: ${{matrix.os}} steps: - - name: Checkout the repo - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: DeLaGuardo/setup-graalvm@4.0 + - uses: actions/checkout@v3.0.0 + - uses: actions/setup-java@v3.10.0 with: - graalvm: 21.2.0 - java: java11 - arch: amd64 - - name: Cache gradle - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- + java-version: 11 + distribution: liberica - name: Cache konan - uses: actions/cache@v2 + uses: actions/cache@v3.0.1 with: path: ~/.konan key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} @@ -42,14 +28,23 @@ jobs: ${{ runner.os }}-gradle- - name: Publish Windows Artifacts if: matrix.os == 'windows-latest' - shell: cmd - run: > - ./gradlew release --no-daemon --build-cache -Ppublishing.enabled=true - -Ppublishing.space.user=${{ secrets.SPACE_APP_ID }} - -Ppublishing.space.token=${{ secrets.SPACE_APP_SECRET }} + uses: gradle/gradle-build-action@v2.4.0 + with: + arguments: | + publishAllPublicationsToSpaceRepository + -Ppublishing.targets=all + -Ppublishing.space.user=${{ secrets.SPACE_APP_ID }} + -Ppublishing.space.token=${{ secrets.SPACE_APP_SECRET }} - name: Publish Mac Artifacts if: matrix.os == 'macOS-latest' - run: > - ./gradlew release --no-daemon --build-cache -Ppublishing.enabled=true - -Ppublishing.space.user=${{ secrets.SPACE_APP_ID }} - -Ppublishing.space.token=${{ secrets.SPACE_APP_SECRET }} + uses: gradle/gradle-build-action@v2.4.0 + with: + arguments: | + publishMacosX64PublicationToSpaceRepository + publishMacosArm64PublicationToSpaceRepository + publishIosX64PublicationToSpaceRepository + publishIosArm64PublicationToSpaceRepository + publishIosSimulatorArm64PublicationToSpaceRepository + -Ppublishing.targets=all + -Ppublishing.space.user=${{ secrets.SPACE_APP_ID }} + -Ppublishing.space.token=${{ secrets.SPACE_APP_SECRET }} diff --git a/CHANGELOG.md b/CHANGELOG.md index ac4a5574..ee7190af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,12 @@ ### Security +## 0.6.2 - 2023-07-29 + +### Changed +- Meta to Json serializer now serializes a single item with index as an array. It is important for plotly integration. +- Meta to Json serializes Meta without children a value as literal or array instead of an object with `@value` field. + ## 0.6.1 - 2023-03-31 ### Added diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e..00000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index b6a8a566..a973a25f 100644 --- a/README.md +++ b/README.md @@ -3,47 +3,39 @@ ![Gradle build](https://github.com/mipt-npm/dataforge-core/workflows/Gradle%20build/badge.svg) -
-* ### [dataforge-context](dataforge-context) +### [dataforge-context](dataforge-context) > > > **Maturity**: DEVELOPMENT -
-* ### [dataforge-data](dataforge-data) +### [dataforge-data](dataforge-data) > > > **Maturity**: EXPERIMENTAL -
-* ### [dataforge-io](dataforge-io) +### [dataforge-io](dataforge-io) > > > **Maturity**: PROTOTYPE -
-* ### [dataforge-meta](dataforge-meta) +### [dataforge-meta](dataforge-meta) > > > **Maturity**: DEVELOPMENT -
-* ### [dataforge-scripting](dataforge-scripting) +### [dataforge-scripting](dataforge-scripting) > > > **Maturity**: PROTOTYPE -
-* ### [dataforge-workspace](dataforge-workspace) +### [dataforge-workspace](dataforge-workspace) > > > **Maturity**: EXPERIMENTAL -
-* ### [dataforge-io-yaml](dataforge-io/dataforge-io-yaml) +### [dataforge-io/dataforge-io-yaml](dataforge-io/dataforge-io-yaml) > YAML meta converters and Front Matter envelope format > > **Maturity**: PROTOTYPE -
diff --git a/build.gradle.kts b/build.gradle.kts index bc123f49..bbab94eb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { allprojects { group = "space.kscience" - version = "0.6.1" + version = "0.6.2" } subprojects { diff --git a/dataforge-context/README.md b/dataforge-context/README.md new file mode 100644 index 00000000..06e06f3a --- /dev/null +++ b/dataforge-context/README.md @@ -0,0 +1,32 @@ +# Module dataforge-context + +Context and provider definitions + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-context:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-context:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-context:0.6.2-dev-2") +} +``` diff --git a/dataforge-data/README.md b/dataforge-data/README.md new file mode 100644 index 00000000..3b74b2de --- /dev/null +++ b/dataforge-data/README.md @@ -0,0 +1,32 @@ +# Module dataforge-data + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-data:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-data:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-data:0.6.2-dev-2") +} +``` diff --git a/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/ReduceAction.kt b/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/ReduceAction.kt index c14152f8..fe823bd7 100644 --- a/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/ReduceAction.kt +++ b/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/ReduceAction.kt @@ -112,7 +112,6 @@ internal class ReduceAction( * A one-to-one mapping action */ @DFExperimental -@Suppress("FunctionName") public inline fun Action.Companion.reduce( noinline builder: ReduceGroupBuilder.() -> Unit, ): Action = ReduceAction(typeOf(), builder) diff --git a/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/SplitAction.kt b/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/SplitAction.kt index 88e6061b..24745929 100644 --- a/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/SplitAction.kt +++ b/dataforge-data/src/commonMain/kotlin/space/kscience/dataforge/actions/SplitAction.kt @@ -87,7 +87,6 @@ internal class SplitAction( * Action that splits each incoming element into a number of fragments defined in builder */ @DFExperimental -@Suppress("FunctionName") public inline fun Action.Companion.split( noinline builder: SplitBuilder.() -> Unit, ): Action = SplitAction(typeOf(), builder) \ No newline at end of file diff --git a/dataforge-io/README.md b/dataforge-io/README.md new file mode 100644 index 00000000..6ce35db3 --- /dev/null +++ b/dataforge-io/README.md @@ -0,0 +1,32 @@ +# Module dataforge-io + +IO module + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-io:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-io:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-io:0.6.2-dev-2") +} +``` diff --git a/dataforge-io/build.gradle.kts b/dataforge-io/build.gradle.kts index 91319d4d..9f2030c7 100644 --- a/dataforge-io/build.gradle.kts +++ b/dataforge-io/build.gradle.kts @@ -10,8 +10,8 @@ kscience { jvm() js() native() - useSerialization("1.4.1") - useSerialization("1.4.1", sourceSet = space.kscience.gradle.DependencySourceSet.TEST) { + useSerialization() + useSerialization(sourceSet = space.kscience.gradle.DependencySourceSet.TEST) { cbor() } dependencies { @@ -20,6 +20,6 @@ kscience { } } -readme{ +readme { maturity = space.kscience.gradle.Maturity.PROTOTYPE } \ No newline at end of file diff --git a/dataforge-io/dataforge-io-yaml/README.md b/dataforge-io/dataforge-io-yaml/README.md new file mode 100644 index 00000000..452ba504 --- /dev/null +++ b/dataforge-io/dataforge-io-yaml/README.md @@ -0,0 +1,32 @@ +# Module dataforge-io-yaml + +YAML meta IO + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-io-yaml:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-io-yaml:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-io-yaml:0.6.2-dev-2") +} +``` diff --git a/dataforge-io/dataforge-io-yaml/build.gradle.kts b/dataforge-io/dataforge-io-yaml/build.gradle.kts index b33e1b9a..505ce360 100644 --- a/dataforge-io/dataforge-io-yaml/build.gradle.kts +++ b/dataforge-io/dataforge-io-yaml/build.gradle.kts @@ -4,10 +4,6 @@ plugins { description = "YAML meta IO" -repositories { - mavenCentral() -} - kscience { jvm() js() @@ -20,10 +16,6 @@ kscience { } } -repositories{ - maven("https://dl.bintray.com/mamoe/yamlkt") -} - readme{ maturity = space.kscience.gradle.Maturity.PROTOTYPE description =""" diff --git a/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt b/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt index 4bb3c82d..f3d9e02a 100644 --- a/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt +++ b/dataforge-io/src/commonMain/kotlin/space/kscience/dataforge/io/JsonMetaFormat.kt @@ -6,7 +6,7 @@ package space.kscience.dataforge.io import io.ktor.utils.io.core.Input import io.ktor.utils.io.core.Output import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonElement import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -19,8 +19,8 @@ import space.kscience.dataforge.meta.toMeta public class JsonMetaFormat(private val json: Json = DEFAULT_JSON) : MetaFormat { override fun writeMeta(output: Output, meta: Meta, descriptor: MetaDescriptor?) { - val jsonObject = meta.toJson(descriptor) - output.writeUtf8String(json.encodeToString(JsonObject.serializer(), jsonObject)) + val jsonElement = meta.toJson(descriptor) + output.writeUtf8String(json.encodeToString(JsonElement.serializer(), jsonElement)) } override fun readMeta(input: Input, descriptor: MetaDescriptor?): Meta { diff --git a/dataforge-meta/README.md b/dataforge-meta/README.md new file mode 100644 index 00000000..0088dcf7 --- /dev/null +++ b/dataforge-meta/README.md @@ -0,0 +1,32 @@ +# Module dataforge-meta + +Meta definition and basic operations on meta + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-meta:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-meta:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-meta:0.6.2-dev-2") +} +``` diff --git a/dataforge-meta/build.gradle.kts b/dataforge-meta/build.gradle.kts index decf0760..51b07113 100644 --- a/dataforge-meta/build.gradle.kts +++ b/dataforge-meta/build.gradle.kts @@ -6,7 +6,7 @@ kscience { jvm() js() native() - useSerialization("1.4.1"){ + useSerialization{ json() } } diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt index e36f0e55..7dc44785 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/JsonMeta.kt @@ -23,7 +23,6 @@ public fun Value.toJson(descriptor: MetaDescriptor? = null): JsonElement = when } //Use these methods to customize JSON key mapping -@Suppress("NULLABLE_EXTENSION_OPERATOR_WITH_SAFE_CALL_RECEIVER") private fun String.toJsonKey(descriptor: MetaDescriptor?) = descriptor?.attributes?.get("jsonName").string ?: toString() private fun Meta.toJsonWithIndex(descriptor: MetaDescriptor?, index: String?): JsonElement = if (items.isEmpty()) { @@ -35,9 +34,13 @@ private fun Meta.toJsonWithIndex(descriptor: MetaDescriptor?, index: String?): J val childDescriptor = descriptor?.children?.get(body) if (list.size == 1) { val (token, element) = list.first() - //do not add empty element - val child: JsonElement = element.toJsonWithIndex(childDescriptor, token.index) - body to child + //do not add an empty element + val child: JsonElement = element.toJsonWithIndex(childDescriptor, token.index) + if(token.index == null) { + body to child + } else { + body to JsonArray(listOf(child)) + } } else { val elements: List = list.sortedBy { it.key.index }.mapIndexed { index, entry -> //Use index if it is not equal to the item order @@ -61,30 +64,24 @@ private fun Meta.toJsonWithIndex(descriptor: MetaDescriptor?, index: String?): J JsonObject(pairs.toMap()) } -public fun Meta.toJson(descriptor: MetaDescriptor? = null): JsonObject { - val element = toJsonWithIndex(descriptor, null) - return if (element is JsonObject) { - element - } else { - buildJsonObject { - put("@value", element) - } - } -} +/** + * Convert Meta to [JsonElement]. Meta with children is converted to [JsonObject]. + * Meta without children is converted to either [JsonPrimitive] or [JsonArray] depending on the value type. + * An empty Meta is converted to an empty JsonObject. + */ +public fun Meta.toJson(descriptor: MetaDescriptor? = null): JsonElement = toJsonWithIndex(descriptor, null) /** * Convert a Json primitive to a [Value] */ -public fun JsonPrimitive.toValue(descriptor: MetaDescriptor?): Value { - return when (this) { - JsonNull -> Null - else -> { - if (isString) { - StringValue(content) - } else { - //consider using LazyParse - content.parseValue() - } +public fun JsonPrimitive.toValue(descriptor: MetaDescriptor?): Value = when (this) { + JsonNull -> Null + else -> { + if (isString) { + content.asValue() + } else { + //consider using LazyParse + content.parseValue() } } } diff --git a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt index e051c10c..73950f53 100644 --- a/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt +++ b/dataforge-meta/src/commonMain/kotlin/space/kscience/dataforge/meta/Value.kt @@ -226,7 +226,7 @@ public fun > E.asValue(): Value = EnumValue(this) /** - * Create Value from String using closest match conversion + * Create Value from String using the closest match conversion */ public fun String.parseValue(): Value { diff --git a/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt b/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt index de660e10..0f270bc6 100644 --- a/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt +++ b/dataforge-meta/src/commonTest/kotlin/space/kscience/dataforge/meta/MetaSerializationTest.kt @@ -1,15 +1,45 @@ package space.kscience.dataforge.meta import kotlinx.serialization.json.Json +import space.kscience.dataforge.names.asName import kotlin.test.Test import kotlin.test.assertEquals class MetaSerializationTest { @Test - fun singleValueDeserialization(){ + fun singleValueDeserialization() { val string = "ddd" val meta = Json.decodeFromString(MetaSerializer, string) assertEquals(string, meta.value?.string) } + + @Test + fun complexMeta() { + val meta = Meta { + "a" put 28.3 + "b" put doubleArrayOf(1.0, 2.0, 3.2) + "child" put Meta { + "a" put "aString" + "sns[0]" put Meta { + "d" put 0 + } + "sns[1]" put Meta { + "d" put 1 + } + setIndexed( + "sns2".asName(), + listOf( + Meta { "d" put "first" }, + Meta("53") + ) + ) + } + } + + val string = Json.encodeToString(MetaSerializer, meta) + println(string) + val reconstructed = Json.decodeFromString(MetaSerializer, string) + assertEquals(meta, reconstructed) + } } \ No newline at end of file diff --git a/dataforge-scripting/README.md b/dataforge-scripting/README.md new file mode 100644 index 00000000..c4d2caad --- /dev/null +++ b/dataforge-scripting/README.md @@ -0,0 +1,32 @@ +# Module dataforge-scripting + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-scripting:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-scripting:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-scripting:0.6.2-dev-2") +} +``` diff --git a/dataforge-workspace/README.md b/dataforge-workspace/README.md new file mode 100644 index 00000000..2aafb8df --- /dev/null +++ b/dataforge-workspace/README.md @@ -0,0 +1,32 @@ +# Module dataforge-workspace + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:dataforge-workspace:0.6.2-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:dataforge-workspace:0.6.2-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:dataforge-workspace:0.6.2-dev-2") +} +``` diff --git a/docs/templates/ARTIFACT-TEMPLATE.md b/docs/templates/ARTIFACT-TEMPLATE.md deleted file mode 100644 index 6b921b05..00000000 --- a/docs/templates/ARTIFACT-TEMPLATE.md +++ /dev/null @@ -1,29 +0,0 @@ -> #### Artifact: -> -> This module artifact: `${group}:${name}:${version}`. -> -> -> [![Maven Central](https://img.shields.io/maven-central/v/space.kscience/${name}.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22space.kscience%22%20AND%20a:%22${name}%22) -> -> **Gradle:** -> -> ```gradle -> repositories { -> maven { url 'https://repo.kotlin.link' } -> } -> -> dependencies { -> implementation '${group}:${name}:${version}' -> } -> ``` -> **Gradle Kotlin DSL:** -> -> ```kotlin -> repositories { -> maven("https://https://repo.kotlin.link") -> } -> -> dependencies { -> implementation("${group}:${name}:${version}") -> } -> ``` \ No newline at end of file diff --git a/docs/templates/README-TEMPLATE.md b/docs/templates/README-TEMPLATE.md index a28f0db3..762e5d7e 100644 --- a/docs/templates/README-TEMPLATE.md +++ b/docs/templates/README-TEMPLATE.md @@ -3,4 +3,4 @@ ![Gradle build](https://github.com/mipt-npm/dataforge-core/workflows/Gradle%20build/badge.svg) -$modules +${modules} diff --git a/gradle.properties b/gradle.properties index 813d5d08..27743a30 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.mpp.stability.nowarn=true kotlin.incremental.js.ir=true kotlin.native.ignoreDisabledTargets=true -toolsVersion=0.14.5-kotlin-1.8.20-RC +toolsVersion=0.14.9-kotlin-1.8.20 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1bef7e8..15de9024 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists