From 97200f1b9206707577ef056fbd0481b1dccaccc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Bedn=C3=A1=C5=99?= Date: Fri, 29 May 2020 00:01:38 +0200 Subject: [PATCH] feat(clientLibs): add Kotlin and Scala client library (#18198) * feat(clientLibs): add Kotlin and Scala client library Signed-off-by: Jakub Bednar * feat(clientLibs): add Kotlin logo from - https://resources.jetbrains.com/storage/products/kotlin/docs/kotlin_logos.zip Signed-off-by: Jakub Bednar * feat(clientLibs): add Scala logo from - https://github.com/kaeawc/scala-logo Signed-off-by: Jakub Bednar * fix(clientLibs): fixing logos, small code cleanup * fix(clientLibs): run prettier Co-authored-by: Russ Savage --- .../components/ClientKotlinOverlay.tsx | 86 +++++++++++ .../components/ClientScalaOverlay.tsx | 89 ++++++++++++ ui/src/clientLibraries/constants/index.ts | 133 +++++++++++++++++- .../clientLibraries/graphics/KotlinLogo.tsx | 66 +++++++++ ui/src/clientLibraries/graphics/ScalaLogo.tsx | 89 ++++++++++++ ui/src/clientLibraries/graphics/index.ts | 4 + ui/src/index.tsx | 10 ++ 7 files changed, 470 insertions(+), 7 deletions(-) create mode 100644 ui/src/clientLibraries/components/ClientKotlinOverlay.tsx create mode 100644 ui/src/clientLibraries/components/ClientScalaOverlay.tsx create mode 100644 ui/src/clientLibraries/graphics/KotlinLogo.tsx create mode 100644 ui/src/clientLibraries/graphics/ScalaLogo.tsx diff --git a/ui/src/clientLibraries/components/ClientKotlinOverlay.tsx b/ui/src/clientLibraries/components/ClientKotlinOverlay.tsx new file mode 100644 index 0000000000..5244d8c0e1 --- /dev/null +++ b/ui/src/clientLibraries/components/ClientKotlinOverlay.tsx @@ -0,0 +1,86 @@ +// Libraries +import React, {FunctionComponent} from 'react' +import {connect} from 'react-redux' + +// Components +import ClientLibraryOverlay from 'src/clientLibraries/components/ClientLibraryOverlay' +import TemplatedCodeSnippet from 'src/shared/components/TemplatedCodeSnippet' + +// Constants +import {clientKotlinLibrary} from 'src/clientLibraries/constants' + +// Types +import {AppState} from 'src/types' + +// Selectors +import {getOrg} from 'src/organizations/selectors' + +interface StateProps { + org: string +} + +type Props = StateProps + +const ClientKotlinOverlay: FunctionComponent = props => { + const { + name, + url, + buildWithMavenCodeSnippet, + buildWithGradleCodeSnippet, + initializeClientCodeSnippet, + executeQueryCodeSnippet, + } = clientKotlinLibrary + const {org} = props + const server = window.location.origin + + return ( + +

+ For more detailed and up to date information check out the{' '} + + GitHub Repository + +

+
Add Dependency
+

Build with Maven

+ +

Build with Gradle

+ +
Initialize the Client
+ +
Execute a Flux query
+ +
+ ) +} + +const mstp = (state: AppState): StateProps => { + return { + org: getOrg(state).id, + } +} + +export {ClientKotlinOverlay} +export default connect( + mstp, + null +)(ClientKotlinOverlay) diff --git a/ui/src/clientLibraries/components/ClientScalaOverlay.tsx b/ui/src/clientLibraries/components/ClientScalaOverlay.tsx new file mode 100644 index 0000000000..ebbfa82121 --- /dev/null +++ b/ui/src/clientLibraries/components/ClientScalaOverlay.tsx @@ -0,0 +1,89 @@ +// Libraries +import React, {FunctionComponent} from 'react' +import {connect} from 'react-redux' + +// Components +import ClientLibraryOverlay from 'src/clientLibraries/components/ClientLibraryOverlay' +import TemplatedCodeSnippet from 'src/shared/components/TemplatedCodeSnippet' + +// Constants +import {clientScalaLibrary} from 'src/clientLibraries/constants' + +// Types +import {AppState} from 'src/types' + +// Selectors +import {getOrg} from 'src/organizations/selectors' + +interface StateProps { + org: string +} + +type Props = StateProps + +const ClientScalaOverlay: FunctionComponent = props => { + const { + name, + url, + buildWithSBTCodeSnippet, + buildWithMavenCodeSnippet, + buildWithGradleCodeSnippet, + initializeClientCodeSnippet, + executeQueryCodeSnippet, + } = clientScalaLibrary + const {org} = props + const server = window.location.origin + + return ( + +

+ For more detailed and up to date information check out the{' '} + + GitHub Repository + +

+
Add Dependency
+

Build with sbt

+ +

Build with Maven

+ +

Build with Gradle

+ +
Initialize the Client
+ +
Execute a Flux query
+ +
+ ) +} + +const mstp = (state: AppState): StateProps => { + return { + org: getOrg(state).id, + } +} + +export {ClientScalaOverlay} +export default connect( + mstp, + null +)(ClientScalaOverlay) diff --git a/ui/src/clientLibraries/constants/index.ts b/ui/src/clientLibraries/constants/index.ts index 8c0864b108..4a7e1bb1e2 100644 --- a/ui/src/clientLibraries/constants/index.ts +++ b/ui/src/clientLibraries/constants/index.ts @@ -1,11 +1,15 @@ import {SFC} from 'react' -import CSharpLogo from '../graphics/CSharpLogo' -import GoLogo from '../graphics/GoLogo' -import JavaLogo from '../graphics/JavaLogo' -import JSLogo from '../graphics/JSLogo' -import PHPLogo from '../graphics/PHPLogo' -import PythonLogo from '../graphics/PythonLogo' -import RubyLogo from '../graphics/RubyLogo' +import { + CSharpLogo, + GoLogo, + JavaLogo, + JSLogo, + KotlinLogo, + PHPLogo, + PythonLogo, + RubyLogo, + ScalaLogo, +} from '../graphics' export interface ClientLibrary { id: string @@ -392,12 +396,127 @@ $writeApi->write($point, WritePrecision::S, $bucket, $org);`, $writeApi->write($dataArray, WritePrecision::S, $bucket, $org);`, } +export const clientKotlinLibrary = { + id: 'kotlin', + name: 'Kotlin', + url: + 'https://github.com/influxdata/influxdb-client-java/tree/master/client-kotlin', + image: KotlinLogo, + buildWithMavenCodeSnippet: ` + com.influxdb + influxdb-client-kotlin + 1.8.0 +`, + buildWithGradleCodeSnippet: `dependencies { + compile "com.influxdb:influxdb-client-kotlin:1.8.0" +}`, + initializeClientCodeSnippet: `package example + +import com.influxdb.client.kotlin.InfluxDBClientKotlinFactory +import kotlinx.coroutines.channels.consumeEach +import kotlinx.coroutines.channels.filter +import kotlinx.coroutines.channels.take +import kotlinx.coroutines.runBlocking + +fun main() = runBlocking { + + // You can generate a Token from the "Tokens Tab" in the UI + val token = "<%= token %>" + val org = "<%= org %>" + val bucket = "<%= bucket %>" + + val client = InfluxDBClientKotlinFactory.create("<%= server %>", token.toCharArray(), org) +}`, + executeQueryCodeSnippet: `val query = ("from(bucket: \\"$bucket\\")" + + " |> range(start: -1d)" + + " |> filter(fn: (r) => (r[\\"_measurement\\"] == \\"cpu\\" and r[\\"_field\\"] == \\"usage_system\\"))") + +// Result is returned as a stream +val results = client.getQueryKotlinApi().query(query) + +// Example of additional result stream processing on client side +results + // filter on client side using \`filter\` built-in operator + .filter { "cpu0" == it.getValueByKey("cpu") } + // take first 20 records + .take(20) + // print results + .consumeEach { println("Measurement: $\{it.measurement}, value: $\{it.value}") } + +client.close()`, +} + +export const clientScalaLibrary = { + id: 'scala', + name: 'Scala', + url: + 'https://github.com/influxdata/influxdb-client-java/tree/master/client-scala', + image: ScalaLogo, + buildWithSBTCodeSnippet: `libraryDependencies += "com.influxdb" % "influxdb-client-scala" % "1.8.0"`, + buildWithMavenCodeSnippet: ` + com.influxdb + influxdb-client-scala + 1.8.0 +`, + buildWithGradleCodeSnippet: `dependencies { + compile "com.influxdb:influxdb-client-scala:1.8.0" +}`, + initializeClientCodeSnippet: `package example + +import akka.actor.ActorSystem +import akka.stream.scaladsl.Sink +import com.influxdb.client.scala.InfluxDBClientScalaFactory +import com.influxdb.query.FluxRecord + +import scala.concurrent.Await +import scala.concurrent.duration.Duration + +object InfluxDB2ScalaExample { + + implicit val system: ActorSystem = ActorSystem("it-tests") + + def main(args: Array[String]): Unit = { + + // You can generate a Token from the "Tokens Tab" in the UI + val token = "<%= token %>" + val org = "<%= org %>" + val bucket = "<%= bucket %>" + + val client = InfluxDBClientScalaFactory.create("<%= server %>", token.toCharArray, org) + } +}`, + executeQueryCodeSnippet: `val query = (s"""from(bucket: "$bucket")""" + + " |> range(start: -1d)" + + " |> filter(fn: (r) => (r[\\"_measurement\\"] == \\"cpu\\" and r[\\"_field\\"] == \\"usage_system\\"))") + +// Result is returned as a stream +val results = client.getQueryScalaApi().query(query) + +// Example of additional result stream processing on client side +val sink = results + // filter on client side using \`filter\` built-in operator + .filter(it => "cpu0" == it.getValueByKey("cpu")) + // take first 20 records + .take(20) + // print results + .runWith(Sink.foreach[FluxRecord](it => println(s"Measurement: $\{it.getMeasurement}, value: $\{it.getValue}") + )) + +// wait to finish +Await.result(sink, Duration.Inf) + +client.close() +system.terminate()`, +} + export const clientLibraries: ClientLibrary[] = [ clientCSharpLibrary, clientGoLibrary, clientJavaLibrary, clientJSLibrary, + clientKotlinLibrary, clientPHPLibrary, clientPythonLibrary, clientRubyLibrary, + clientScalaLibrary, ] diff --git a/ui/src/clientLibraries/graphics/KotlinLogo.tsx b/ui/src/clientLibraries/graphics/KotlinLogo.tsx new file mode 100644 index 0000000000..be80615727 --- /dev/null +++ b/ui/src/clientLibraries/graphics/KotlinLogo.tsx @@ -0,0 +1,66 @@ +// Libraries +import React, {SFC} from 'react' + +const KotlinLogo: SFC = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default KotlinLogo diff --git a/ui/src/clientLibraries/graphics/ScalaLogo.tsx b/ui/src/clientLibraries/graphics/ScalaLogo.tsx new file mode 100644 index 0000000000..f63f81bccb --- /dev/null +++ b/ui/src/clientLibraries/graphics/ScalaLogo.tsx @@ -0,0 +1,89 @@ +// Libraries +import React, {SFC} from 'react' + +const ScalaLogo: SFC = () => { + return ( + + + + + + + + + + + + + + + + + + + + + ) +} + +export default ScalaLogo diff --git a/ui/src/clientLibraries/graphics/index.ts b/ui/src/clientLibraries/graphics/index.ts index 00f0a9cb9c..2748e0facc 100644 --- a/ui/src/clientLibraries/graphics/index.ts +++ b/ui/src/clientLibraries/graphics/index.ts @@ -4,9 +4,11 @@ import GoLogo from 'src/clientLibraries/graphics/GoLogo' import {GoogleLogo} from 'src/clientLibraries/graphics/GoogleLogo' import JavaLogo from 'src/clientLibraries/graphics/JavaLogo' import JSLogo from 'src/clientLibraries/graphics/JSLogo' +import KotlinLogo from 'src/clientLibraries/graphics/KotlinLogo' import PHPLogo from 'src/clientLibraries/graphics/PHPLogo' import PythonLogo from 'src/clientLibraries/graphics/PythonLogo' import RubyLogo from 'src/clientLibraries/graphics/RubyLogo' +import ScalaLogo from 'src/clientLibraries/graphics/ScalaLogo' export { CSharpLogo, @@ -15,7 +17,9 @@ export { GoogleLogo, JavaLogo, JSLogo, + KotlinLogo, PHPLogo, PythonLogo, RubyLogo, + ScalaLogo, } diff --git a/ui/src/index.tsx b/ui/src/index.tsx index 25d34c8878..cfc52bc91c 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -54,9 +54,11 @@ import ClientCSharpOverlay from 'src/clientLibraries/components/ClientCSharpOver import ClientGoOverlay from 'src/clientLibraries/components/ClientGoOverlay' import ClientJavaOverlay from 'src/clientLibraries/components/ClientJavaOverlay' import ClientJSOverlay from 'src/clientLibraries/components/ClientJSOverlay' +import ClientKotlinOverlay from 'src/clientLibraries/components/ClientKotlinOverlay' import ClientPHPOverlay from 'src/clientLibraries/components/ClientPHPOverlay' import ClientPythonOverlay from 'src/clientLibraries/components/ClientPythonOverlay' import ClientRubyOverlay from 'src/clientLibraries/components/ClientRubyOverlay' +import ClientScalaOverlay from 'src/clientLibraries/components/ClientScalaOverlay' import TemplateImportOverlay from 'src/templates/components/TemplateImportOverlay' import TemplateExportOverlay from 'src/templates/components/TemplateExportOverlay' import VariablesIndex from 'src/variables/containers/VariablesIndex' @@ -371,6 +373,10 @@ class Root extends PureComponent { path="javascript-node" component={ClientJSOverlay} /> + +