Skip to content

Commit 8aee07c

Browse files
Automated commit of generated code
1 parent 5c18bfd commit 8aee07c

File tree

7 files changed

+60
-12
lines changed

7 files changed

+60
-12
lines changed

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/ColumnsContainer.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ import kotlin.reflect.KProperty
1818
*
1919
* Base interface for [DataFrame] and [ColumnSelectionDsl]
2020
*
21-
* @param T Schema marker. Used to generate extension properties for typed column access.
21+
* @param T Schema marker. Used to resolve generated extension properties for typed column access.
2222
*/
23-
public interface ColumnsContainer<out T> {
23+
public interface ColumnsContainer<out T> : ColumnsScope<T> {
2424

2525
// region columns
2626

@@ -54,7 +54,7 @@ public interface ColumnsContainer<out T> {
5454

5555
// region get
5656

57-
public operator fun get(columnName: String): AnyCol = getColumn(columnName)
57+
public override operator fun get(columnName: String): AnyCol = getColumn(columnName)
5858

5959
public operator fun get(columnPath: ColumnPath): AnyCol = getColumn(columnPath)
6060

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.jetbrains.kotlinx.dataframe
2+
3+
/**
4+
* Provides minimal API required for generated column properties:
5+
*
6+
* `val ColumnsScope<Schema marker>.column: DataColumn<String> get() = this["column"] as DataColumn<String>`
7+
*
8+
* @param T Schema marker. Used to resolve generated extension properties for typed column access.
9+
*/
10+
public interface ColumnsScope<out T> {
11+
public operator fun get(columnName: String): AnyCol
12+
}

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/DataFrameGet.kt

+23
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.jetbrains.kotlinx.dataframe.AnyCol
44
import org.jetbrains.kotlinx.dataframe.AnyColumnReference
55
import org.jetbrains.kotlinx.dataframe.ColumnSelector
66
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
7+
import org.jetbrains.kotlinx.dataframe.ColumnsScope
78
import org.jetbrains.kotlinx.dataframe.ColumnsSelector
89
import org.jetbrains.kotlinx.dataframe.DataColumn
910
import org.jetbrains.kotlinx.dataframe.DataFrame
@@ -58,6 +59,28 @@ public fun <T> ColumnsContainer<T>.getFrameColumn(columnName: String): FrameColu
5859
public fun <T> ColumnsContainer<T>.getColumnGroup(columnPath: ColumnPath): ColumnGroup<*> =
5960
get(columnPath).asColumnGroup()
6061

62+
/**
63+
* Utility property to access scope with only dataframe column properties for code completion,
64+
* filtering out DataFrame API.
65+
*
66+
* It's a quick way to check that code generation in notebooks or compiler plugin
67+
* worked as expected or find columns you're interested in.
68+
*
69+
* In notebooks:
70+
* ```
71+
* val df = DataFrame.read("file.csv")
72+
* ==== next code cell
73+
* df. // column properties are mixed together with methods, not easy to find unless you already know names
74+
* df.properties(). // easy to overview available columns
75+
* ```
76+
* In compiler plugin:
77+
* ```
78+
* val df = @Import DataFrame.read("file.csv")
79+
* df.properties().
80+
* ```
81+
*/
82+
public fun <T> DataFrame<T>.properties(): ColumnsScope<T> = this
83+
6184
// region getColumn
6285

6386
public fun <T> ColumnsContainer<T>.getColumn(name: String): AnyCol =

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/codeGen/CodeGeneratorImpl.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.dataframe.impl.codeGen.InterfaceGenerationMode.WithFields
1212
import org.jetbrains.dataframe.keywords.HardKeywords
1313
import org.jetbrains.dataframe.keywords.ModifierKeywords
1414
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
15+
import org.jetbrains.kotlinx.dataframe.ColumnsScope
1516
import org.jetbrains.kotlinx.dataframe.DataColumn
1617
import org.jetbrains.kotlinx.dataframe.DataFrame
1718
import org.jetbrains.kotlinx.dataframe.DataRow
@@ -166,7 +167,7 @@ internal object FullyQualifiedNames : TypeRenderingStrategy {
166167
internal object ShortNames : TypeRenderingStrategy {
167168

168169
private val dataRow = DataRow::class.simpleName!!
169-
private val columnsContainer = ColumnsContainer::class.simpleName!!
170+
private val columnsContainer = ColumnsScope::class.simpleName!!
170171
private val dataFrame = DataFrame::class.simpleName!!
171172
private val dataColumn = DataColumn::class.simpleName!!
172173
private val columnGroup = ColumnGroup::class.simpleName!!
@@ -565,7 +566,7 @@ public fun Code.toStandaloneSnippet(packageName: String, additionalImports: List
565566
appendLine("package $packageName")
566567
appendLine()
567568
}
568-
appendLine("import org.jetbrains.kotlinx.dataframe.ColumnsContainer")
569+
appendLine("import org.jetbrains.kotlinx.dataframe.ColumnsScope")
569570
appendLine("import org.jetbrains.kotlinx.dataframe.DataColumn")
570571
appendLine("import org.jetbrains.kotlinx.dataframe.DataFrame")
571572
appendLine("import org.jetbrains.kotlinx.dataframe.DataRow")

core/generated-sources/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt

+13-1
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,11 @@ internal fun DataFrameHtmlData.print() = println(this)
518518
/**
519519
* By default, cell content is formatted as text
520520
* Use [RenderedContent.media] or [IMG], [IFRAME] if you need custom HTML inside a cell.
521-
* @return DataFrameHtmlData with table script and css definitions. Can be saved as an *.html file and displayed in the browser
521+
*
522+
* The [DataFrameHtmlData] be saved as an *.html file and displayed in the browser.
523+
* If you save it as a file and find it in the project tree,
524+
* the ["Open in browser"](https://www.jetbrains.com/help/idea/editing-html-files.html#ws_html_preview_output_procedure) feature of IntelliJ IDEA will automatically reload the file content when it's updated
525+
* @return DataFrameHtmlData with table script and css definitions
522526
*/
523527
public fun <T> DataFrame<T>.toStandaloneHTML(
524528
configuration: DisplayConfiguration = DisplayConfiguration.DEFAULT,
@@ -620,10 +624,18 @@ public data class DataFrameHtmlData(
620624
destination.writeText(toString())
621625
}
622626

627+
public fun writeHTML(destination: String) {
628+
File(destination).writeText(toString())
629+
}
630+
623631
public fun writeHTML(destination: Path) {
624632
destination.writeText(toString())
625633
}
626634

635+
/**
636+
* Opens a new tab in your default browser.
637+
* Consider [writeHTML] with the [HTML file auto-reload](https://www.jetbrains.com/help/idea/editing-html-files.html#ws_html_preview_output_procedure) feature of IntelliJ IDEA if you want to experiment with the output and run program multiple times
638+
*/
627639
public fun openInBrowser() {
628640
val file = File.createTempFile("df_rendering", ".html")
629641
writeHTML(file)

core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/CodeGenerationTests.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.jetbrains.dataframe.impl.codeGen.InterfaceGenerationMode
66
import org.jetbrains.dataframe.impl.codeGen.ReplCodeGenerator
77
import org.jetbrains.dataframe.impl.codeGen.generate
88
import org.jetbrains.kotlinx.dataframe.AnyRow
9-
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
9+
import org.jetbrains.kotlinx.dataframe.ColumnsScope
1010
import org.jetbrains.kotlinx.dataframe.DataColumn
1111
import org.jetbrains.kotlinx.dataframe.DataRow
1212
import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
@@ -30,7 +30,7 @@ class CodeGenerationTests : BaseTest() {
3030

3131
val personShortName = Person::class.simpleName!!
3232

33-
val dfName = (ColumnsContainer::class).simpleName!!
33+
val dfName = (ColumnsScope::class).simpleName!!
3434
val dfRowName = (DataRow::class).simpleName!!
3535
val dataCol = (DataColumn::class).simpleName!!
3636
val dataRow = (DataRow::class).simpleName!!

core/generated-sources/src/test/kotlin/org/jetbrains/kotlinx/dataframe/codeGen/ReplCodeGenTests.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import io.kotest.matchers.shouldBe
44
import io.kotest.matchers.string.shouldNotBeEmpty
55
import org.jetbrains.dataframe.impl.codeGen.ReplCodeGenerator
66
import org.jetbrains.dataframe.impl.codeGen.process
7-
import org.jetbrains.kotlinx.dataframe.ColumnsContainer
7+
import org.jetbrains.kotlinx.dataframe.ColumnsScope
88
import org.jetbrains.kotlinx.dataframe.DataColumn
99
import org.jetbrains.kotlinx.dataframe.DataRow
1010
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
@@ -20,7 +20,7 @@ import org.junit.Test
2020
@Suppress("ktlint:standard:class-naming")
2121
class ReplCodeGenTests : BaseTest() {
2222

23-
val dfName = (ColumnsContainer::class).simpleName!!
23+
val dfName = (ColumnsScope::class).simpleName!!
2424
val dfRowName = (DataRow::class).simpleName!!
2525
val dataCol = (DataColumn::class).simpleName!!
2626
val intName = Int::class.simpleName!!
@@ -192,7 +192,7 @@ class ReplCodeGenTests : BaseTest() {
192192
repl.process<Test3.B>()
193193
repl.process<Test3.D>()
194194
val c = repl.process(Test3.df, Test3::df)
195-
"""val .*ColumnsContainer<\w*>.x:""".toRegex().findAll(c.declarations).count() shouldBe 1
195+
"""val .*ColumnsScope<\w*>.x:""".toRegex().findAll(c.declarations).count() shouldBe 1
196196
}
197197

198198
object Test4 {
@@ -216,6 +216,6 @@ class ReplCodeGenTests : BaseTest() {
216216
repl.process<Test4.A>()
217217
repl.process<Test4.B>()
218218
val c = repl.process(Test4.df, Test4::df)
219-
"""val .*ColumnsContainer<\w*>.a:""".toRegex().findAll(c.declarations).count() shouldBe 1
219+
"""val .*ColumnsScope<\w*>.a:""".toRegex().findAll(c.declarations).count() shouldBe 1
220220
}
221221
}

0 commit comments

Comments
 (0)