From 5f101e9c967271935d3a5ad33dc67a4a79a6e60c Mon Sep 17 00:00:00 2001 From: "andrei.kislitsyn" Date: Fri, 6 Jun 2025 16:36:36 +0400 Subject: [PATCH 1/8] add a plugin example project --- .../build.gradle.kts | 25 ++++++ .../gradle.properties | 2 + .../settings.gradle.kts | 11 +++ .../kotlinx/dataframe/examples/plugin/Main.kt | 79 +++++++++++++++++++ jetbrains_repositories_new.csv | 70 ++++++++++++++++ settings.gradle.kts | 2 + 6 files changed, 189 insertions(+) create mode 100644 examples/kotlin-dataframe-plugin-example/build.gradle.kts create mode 100644 examples/kotlin-dataframe-plugin-example/gradle.properties create mode 100644 examples/kotlin-dataframe-plugin-example/settings.gradle.kts create mode 100644 examples/kotlin-dataframe-plugin-example/src/main/kotlin/org/jetbrains/kotlinx/dataframe/examples/plugin/Main.kt create mode 100644 jetbrains_repositories_new.csv diff --git a/examples/kotlin-dataframe-plugin-example/build.gradle.kts b/examples/kotlin-dataframe-plugin-example/build.gradle.kts new file mode 100644 index 0000000000..32329694fa --- /dev/null +++ b/examples/kotlin-dataframe-plugin-example/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("jvm") version "2.2.20-dev-3524" + kotlin("plugin.dataframe") version "2.2.20-dev-3524" +} + +group = "org.example" +version = "1.0-SNAPSHOT" + +repositories { + maven("https://packages.jetbrains.team/maven/p/kt/dev/") + mavenCentral() +} + + +dependencies { + implementation("org.jetbrains.kotlinx:dataframe:1.0.0-Beta2") + testImplementation(kotlin("test")) +} + +tasks.test { + useJUnitPlatform() +} +kotlin { + jvmToolchain(11) +} \ No newline at end of file diff --git a/examples/kotlin-dataframe-plugin-example/gradle.properties b/examples/kotlin-dataframe-plugin-example/gradle.properties new file mode 100644 index 0000000000..23817686a1 --- /dev/null +++ b/examples/kotlin-dataframe-plugin-example/gradle.properties @@ -0,0 +1,2 @@ +kotlin.code.style=official +kotlin.incremental=false diff --git a/examples/kotlin-dataframe-plugin-example/settings.gradle.kts b/examples/kotlin-dataframe-plugin-example/settings.gradle.kts new file mode 100644 index 0000000000..243729eb9d --- /dev/null +++ b/examples/kotlin-dataframe-plugin-example/settings.gradle.kts @@ -0,0 +1,11 @@ +pluginManagement { + repositories { + maven("https://packages.jetbrains.team/maven/p/kt/dev/") + mavenCentral() + gradlePluginPortal() + } +} +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" +} +rootProject.name = "kdf_plugin_example" \ No newline at end of file diff --git a/examples/kotlin-dataframe-plugin-example/src/main/kotlin/org/jetbrains/kotlinx/dataframe/examples/plugin/Main.kt b/examples/kotlin-dataframe-plugin-example/src/main/kotlin/org/jetbrains/kotlinx/dataframe/examples/plugin/Main.kt new file mode 100644 index 0000000000..d0c9952fda --- /dev/null +++ b/examples/kotlin-dataframe-plugin-example/src/main/kotlin/org/jetbrains/kotlinx/dataframe/examples/plugin/Main.kt @@ -0,0 +1,79 @@ +package org.jetbrains.kotlinx.dataframe.examples.plugin + +import org.jetbrains.kotlinx.dataframe.DataFrame +import org.jetbrains.kotlinx.dataframe.annotations.ColumnName +import org.jetbrains.kotlinx.dataframe.annotations.DataSchema +import org.jetbrains.kotlinx.dataframe.api.* +import org.jetbrains.kotlinx.dataframe.io.readCsv +import org.jetbrains.kotlinx.dataframe.io.writeCsv +import java.net.URL + +/* + * Declare data schema for the DataFrame from jetbrains_repositories.csv. + */ +@DataSchema +data class Repositories( + @ColumnName("full_name") + val fullName: String, + @ColumnName("html_url") + val htmlUrl: URL, + @ColumnName("stargazers_count") + val stargazersCount: Int, + val topics: String, + val watchers: Int +) + +/* + * Define kinds of repositories: + */ +enum class RepoKind { + Kotlin, IntelliJ, Other +} + +/* + * A rule for determining the kind of repository based on its name and topics. + */ +fun getKind(fullName: String, topics: List): RepoKind { + fun checkContains(name: String) = name in topics || fullName.lowercase().contains(name) + + return when { + checkContains("kotlin") -> RepoKind.Kotlin + checkContains("idea") || checkContains("intellij") -> RepoKind.IntelliJ + else -> RepoKind.Other + } +} + + +fun main() { + val repos = DataFrame + // Read DataFrame from the CSV file. + .readCsv("https://raw.githubusercontent.com/Kotlin/dataframe/master/data/jetbrains_repositories.csv") + // And convert it to match the `Repositories` schema. + .convertTo() + + // Rename columns to CamelCase + val reposUpdated = repos.renameToCamelCase() + // Convert values in the "topic" column (which were `String` initially) + // to the list of topics. + .convert { topics }.with { + val inner = it.removePrefix("[").removeSuffix("]") + if (inner.isEmpty()) emptyList() else inner.split(',').map(String::trim) + } + // Filter rows, keeping only repos with more than 150 stars. + .filter { it.stargazersCount > 150 } + // Add a new column with the number of topics. + .add("topicCount") { topics.size } + // Add a new column with the kind of repository. + .add("kind") { getKind(fullName, topics) } + + // Write an updated DataFrame to a CSV file. + reposUpdated.writeCsv("jetbrains_repositories_new.csv") + + // TODO: Add Kandy Plot + /*reposUpdated.groupBy { kind }.max { stargazersCount }.plot { + bars { + x(kind) + y(stargazersCount) + } + }*/ +} diff --git a/jetbrains_repositories_new.csv b/jetbrains_repositories_new.csv new file mode 100644 index 0000000000..a173a21f44 --- /dev/null +++ b/jetbrains_repositories_new.csv @@ -0,0 +1,70 @@ +fullName,htmlUrl,stargazersCount,topics,watchers,topicCount,kind +JetBrains/colorSchemeTool,https://github.com/JetBrains/colorSchemeTool,290,[],290,0,Other +JetBrains/ideavim,https://github.com/JetBrains/ideavim,6120,"[ideavim, intellij, intellij-platform, jb-official, kotlin, vim, vim-emulator]",6120,7,Kotlin +JetBrains/Grammar-Kit,https://github.com/JetBrains/Grammar-Kit,534,[],534,0,Other +JetBrains/la-clojure,https://github.com/JetBrains/la-clojure,218,[],218,0,Other +JetBrains/MPS,https://github.com/JetBrains/MPS,1241,"[domain-specific-language, dsl]",1241,2,Other +JetBrains/intellij-community,https://github.com/JetBrains/intellij-community,12926,"[code-editor, ide, intellij, intellij-community, intellij-platform]",12926,5,IntelliJ +JetBrains/intellij-scala,https://github.com/JetBrains/intellij-scala,1066,"[intellij-idea, intellij-plugin, scala]",1066,3,IntelliJ +JetBrains/kotlin,https://github.com/JetBrains/kotlin,39402,"[compiler, gradle-plugin, intellij-plugin, kotlin, kotlin-library, maven-plugin, programming-language]",39402,7,Kotlin +JetBrains/kotlin-web-demo,https://github.com/JetBrains/kotlin-web-demo,167,[],167,0,Kotlin +JetBrains/youtrack-workflows,https://github.com/JetBrains/youtrack-workflows,164,[],164,0,Other +JetBrains/intellij-plugins,https://github.com/JetBrains/intellij-plugins,1737,[],1737,0,IntelliJ +JetBrains/jediterm,https://github.com/JetBrains/jediterm,483,[],483,0,Other +JetBrains/kotlin-eclipse,https://github.com/JetBrains/kotlin-eclipse,168,[],168,0,Kotlin +JetBrains/resharper-rider-samples,https://github.com/JetBrains/resharper-rider-samples,182,[],182,0,Other +JetBrains/meta-runner-power-pack,https://github.com/JetBrains/meta-runner-power-pack,247,[],247,0,Other +JetBrains/pty4j,https://github.com/JetBrains/pty4j,233,[],233,0,Other +JetBrains/Exposed,https://github.com/JetBrains/Exposed,5688,"[dao, kotlin, orm, sql]",5688,4,Kotlin +JetBrains/kotlin-web-site,https://github.com/JetBrains/kotlin-web-site,1074,[kotlin],1074,1,Kotlin +JetBrains/phpstorm-workshop,https://github.com/JetBrains/phpstorm-workshop,277,"[exercise, php, phpstorm, phpstorm-workshop, workshop-materials]",277,5,Other +JetBrains/xodus,https://github.com/JetBrains/xodus,936,"[database, db, embedded-database, entity-store, java, key-value, kotlin, log-structured, nosql, schema-less, snapshot-isolation, transactional, xodus, youtrack]",936,14,Kotlin +JetBrains/Nitra,https://github.com/JetBrains/Nitra,548,[],548,0,Other +JetBrains/idea-gitignore,https://github.com/JetBrains/idea-gitignore,1181,"[gitignore, ignore-files, intellij, intellij-plugin, java]",1181,5,IntelliJ +JetBrains/swot,https://github.com/JetBrains/swot,1072,[],1072,0,Other +JetBrains/intellij-sdk-docs,https://github.com/JetBrains/intellij-sdk-docs,990,"[docs, intellij, intellij-platform, intellij-plugin, intellijidea-plugin, jetbrains, sdk]",990,7,IntelliJ +JetBrains/markdown,https://github.com/JetBrains/markdown,285,[],285,0,Other +JetBrains/Arend,https://github.com/JetBrains/Arend,562,[arend],562,1,Other +JetBrains/phpstorm-stubs,https://github.com/JetBrains/phpstorm-stubs,1110,[],1110,0,Other +JetBrains/gradle-intellij-plugin,https://github.com/JetBrains/gradle-intellij-plugin,1058,"[gradle, gradle-intellij-plugin, gradle-kotlin-dsl, groovy, intellij, intellij-ides, intellij-platform, intellij-plugin, intellij-sdk, jetbrains-plugin, kotlin, plugin-verifier, publishing-dsl, setup-dsl, teamcity, travis-configuration]",1058,16,Kotlin +JetBrains/svg-sprite-loader,https://github.com/JetBrains/svg-sprite-loader,1815,"[sprite, svg, svg-sprite, svg-stack, webpack, webpack-loader, webpack-plugin, webpack2, webpack3]",1815,9,Other +JetBrains/resharper-unity,https://github.com/JetBrains/resharper-unity,1017,"[hacktoberfest, jetbrains, plugin, resharper, resharper-plugin, rider, unity, unity-editor]",1017,8,Other +JetBrains/jdk8u_jdk,https://github.com/JetBrains/jdk8u_jdk,176,[],176,0,Other +JetBrains/kotlin-native,https://github.com/JetBrains/kotlin-native,7101,"[c, compiler, kotlin, llvm, objective-c]",7101,5,Kotlin +JetBrains/android,https://github.com/JetBrains/android,724,[],724,0,Other +JetBrains/Unity3dRider,https://github.com/JetBrains/Unity3dRider,358,[],358,0,Other +JetBrains/youtrack-mobile,https://github.com/JetBrains/youtrack-mobile,210,"[android, ios, react, react-native, youtrack]",210,5,Other +JetBrains/resharper-fsharp,https://github.com/JetBrains/resharper-fsharp,245,"[fsharp, hacktoberfest, jetbrains, plugin, resharper, rider]",245,6,Other +JetBrains/svg-mixer,https://github.com/JetBrains/svg-mixer,151,[],151,0,Other +JetBrains/kotlin-wrappers,https://github.com/JetBrains/kotlin-wrappers,919,"[css, kotlin, kotlin-js, react, react-router-dom, redux, styled-components]",919,7,Kotlin +JetBrains/create-react-kotlin-app,https://github.com/JetBrains/create-react-kotlin-app,2424,"[create-react-app, jetbrains-ui, kotlin, react, webpack]",2424,5,Kotlin +JetBrains/ideolog,https://github.com/JetBrains/ideolog,186,[],186,0,Other +JetBrains/kotlin-playground,https://github.com/JetBrains/kotlin-playground,251,"[kotlin, kotlin-playground, playground]",251,3,Kotlin +JetBrains/ring-ui,https://github.com/JetBrains/ring-ui,2836,"[components, jetbrains-ui, react]",2836,3,Other +JetBrains/inspection-plugin,https://github.com/JetBrains/inspection-plugin,252,[],252,0,Other +JetBrains/gradle-idea-ext-plugin,https://github.com/JetBrains/gradle-idea-ext-plugin,155,[],155,0,IntelliJ +JetBrains/awesome-pycharm,https://github.com/JetBrains/awesome-pycharm,186,"[awesome, ide, pycharm, python, web-development]",186,5,Other +JetBrains/rd,https://github.com/JetBrains/rd,279,[hacktoberfest],279,1,Other +JetBrains/kotlinconf-app,https://github.com/JetBrains/kotlinconf-app,2628,[],2628,0,Kotlin +JetBrains/java-annotations,https://github.com/JetBrains/java-annotations,226,[],226,0,Other +JetBrains/JetBrainsRuntime,https://github.com/JetBrains/JetBrainsRuntime,370,"[intellij-platform, jdk, openjdk]",370,3,Other +JetBrains/lets-plot-kotlin,https://github.com/JetBrains/lets-plot-kotlin,228,"[data-science, geotools, ggplot, graphics, jupyter, jupyter-notebook, jupyter-notebooks, jvm, kotlin, kotlin-api, kotlin-js, kotlin-kernel, plot, plot-kotlin, plot-library, statistical-data]",228,16,Kotlin +JetBrains/JetBrainsMono,https://github.com/JetBrains/JetBrainsMono,6059,"[coding-font, font, ligatures, monospaced-font, programming-font, programming-ligatures]",6059,6,Other +JetBrains/lets-plot,https://github.com/JetBrains/lets-plot,699,"[data-science, data-visualization, datalore, geo-spatial, ggplot, jupyter, jupyter-notebooks, kotlin, plot, plot-library, pycharm, python, sciview, sciview-plugin, statistical-data]",699,15,Kotlin +JetBrains/kotless,https://github.com/JetBrains/kotless,886,"[devops, faas, gradle-plugin, kotlin, lambda, serverless, web]",886,7,Kotlin +JetBrains/web-types,https://github.com/JetBrains/web-types,169,[],169,0,Other +JetBrains/intellij-platform-plugin-template,https://github.com/JetBrains/intellij-platform-plugin-template,1133,"[intellij, intellij-idea, intellij-idea-plugin, intellij-platform, intellij-plugin, intellij-plugins, jetbrains-plugin]",1133,7,IntelliJ +JetBrains/KotlinDL,https://github.com/JetBrains/KotlinDL,695,"[deeplearning, gpu, kotlin, tensorflow]",695,4,Kotlin +JetBrains/intellij-sdk-code-samples,https://github.com/JetBrains/intellij-sdk-code-samples,412,"[intellij, intellij-idea, intellij-platform, intellij-plugin, intellij-plugins, intellij-sdk, jetbrains, jetbrains-plugin, jetbrains-plugins]",412,9,IntelliJ +JetBrains/skija,https://github.com/JetBrains/skija,2242,"[2d, graphics, java, skia]",2242,4,Other +JetBrains/projector-docker,https://github.com/JetBrains/projector-docker,1853,"[awt, docker, swing]",1853,3,Other +JetBrains/projector-server,https://github.com/JetBrains/projector-server,1025,"[awt, swing]",1025,2,Other +JetBrains/projector-client,https://github.com/JetBrains/projector-client,701,"[awt, swing]",701,2,Other +JetBrains/kotlin-spark-api,https://github.com/JetBrains/kotlin-spark-api,257,"[bigdata, kotlin, nullability, scala, spark]",257,5,Kotlin +JetBrains/php-timeline,https://github.com/JetBrains/php-timeline,207,[],207,0,Other +JetBrains/projector-installer,https://github.com/JetBrains/projector-installer,655,"[awt, swing]",655,2,Other +JetBrains/skiko,https://github.com/JetBrains/skiko,519,[],519,0,Other +JetBrains/compose-jb,https://github.com/JetBrains/compose-jb,6805,"[android, awt, compose, declarative-ui, desktop, gui, javascript, kotlin, multiplatform, reactive, swing, ui]",6805,12,Kotlin +JetBrains/compose-for-web-demos,https://github.com/JetBrains/compose-for-web-demos,175,[],175,0,Other +JetBrains/phpstorm-attributes,https://github.com/JetBrains/phpstorm-attributes,220,"[php8, phpstorm]",220,2,Other +JetBrains/Qodana,https://github.com/JetBrains/Qodana,335,"[ci-cd, code-inspection, qodana]",335,3,Other diff --git a/settings.gradle.kts b/settings.gradle.kts index bade37d6ac..cbe75f5ae4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -50,3 +50,5 @@ include("dataframe-openapi-generator") include("dataframe-geo") include("plugins:public-api-modifier") include("dataframe-compiler-plugin-core") + +includeBuild("examples/kotlin-dataframe-plugin-example") From 741f7bc3fc937d52d4bb489f9eca43613f44c716 Mon Sep 17 00:00:00 2001 From: "andrei.kislitsyn" Date: Fri, 6 Jun 2025 18:18:30 +0400 Subject: [PATCH 2/8] add a plugin example project docs --- docs/StardustDocs/topics/Compiler-Plugin.md | 37 ++++++++++++++++++- docs/StardustDocs/topics/Home.topic | 1 + .../topics/compilerPluginExamples.md | 3 ++ .../topics/guides/Guides-And-Examples.md | 5 +++ examples/README.md | 2 + .../kotlin-dataframe-plugin-example/README.md | 11 ++++++ 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 examples/kotlin-dataframe-plugin-example/README.md diff --git a/docs/StardustDocs/topics/Compiler-Plugin.md b/docs/StardustDocs/topics/Compiler-Plugin.md index dbf0bf3648..e9d9452ac0 100644 --- a/docs/StardustDocs/topics/Compiler-Plugin.md +++ b/docs/StardustDocs/topics/Compiler-Plugin.md @@ -1,9 +1,36 @@ # Kotlin DataFrame Compiler Plugin -Kotlin DataFrame compiler plugin: available in Gradle projects, is coming to Kotlin Notebook and Maven projects soon. + +Explore the Kotlin DataFrame Compiler Plugin — +a powerful tool for on-the-fly generating type-safe accessors in DataFrames. + + + +Explore the Kotlin DataFrame Compiler Plugin — +a powerful tool for on-the-fly generating type-safe accessors in DataFrames. + + + +Explore the Kotlin DataFrame Compiler Plugin — +a powerful tool for on-the-fly generating type-safe accessors in DataFrames. + + + +> Now available in Gradle projects, is coming to Kotlin Notebook and Maven projects soon. + +**Kotlin DataFrame Compiler Plugin** is a Kotlin compiler plugin that automatically generates +**[type-safe extension properties](extensionPropertiesApi.md)** for your DataFrame, +allowing you to access columns and rows in a type-safe way and avoid mistakes in column names. + +## Why use it? + +- Access columns as regular properties: `df.name` instead of `df["name"]`. +- Get full IDE and compiler support: autocompletion, refactoring, and type checking. +- Improve code readability and safety when working with DataFrame. Check out this video that shows how expressions update the schema of a dataframe: -