Giter Club home page Giter Club logo

googleapis / discovery-artifact-manager Goto Github PK

View Code? Open in Web Editor NEW
41.0 41.0 49.0 418.04 MB

The Discovery Artifact Manager is intended to facilitate testing, publishing, and synchronization of generators and artifacts for client libraries and generated code samples of Google APIs defined by the API Discovery Service.

License: Apache License 2.0

Groovy 0.05% Java 61.52% Python 16.74% PHP 0.06% Go 7.01% Shell 0.10% Ruby 0.03% Vim Snippet 14.27% Starlark 0.22%

discovery-artifact-manager's Introduction

Google APIs

This repository contains the original interface definitions of public Google APIs that support both REST and gRPC protocols. Reading the original interface definitions can provide a better understanding of Google APIs and help you to utilize them more efficiently. You can also use these definitions with open source tools to generate client libraries, documentation, and other artifacts.

Building

Bazel

The recommended way to build the API client libraries is through Bazel >= 4.2.2.

First, install bazel.

To build all libraries:

bazel build //...

To test all libraries:

bazel test //...

To build one library in all languages:

bazel build //google/example/library/v1/...

To build the Java package for one library:

bazel build //google/example/library/v1:google-cloud-example-library-v1-java

Bazel packages exist in all the libraries for Java, Go, Python, Ruby, Node.js, PHP and C#.

Overview

Google APIs are typically deployed as API services that are hosted under different DNS names. One API service may implement multiple APIs and multiple versions of the same API.

Google APIs use Protocol Buffers version 3 (proto3) as their Interface Definition Language (IDL) to define the API interface and the structure of the payload messages. The same interface definition is used for both REST and RPC versions of the API, which can be accessed over different wire protocols.

There are several ways of accessing Google APIs:

  1. JSON over HTTP: You can access all Google APIs directly using JSON over HTTP, using Google API client library or third-party API client libraries.

  2. Protocol Buffers over gRPC: You can access Google APIs published in this repository through GRPC, which is a high-performance binary RPC protocol over HTTP/2. It offers many useful features, including request/response multiplex and full-duplex streaming.

  3. Google Cloud Client Libraries: You can use these libraries to access Google Cloud APIs. They are based on gRPC for better performance and provide idiomatic client surface for better developer experience.

Discussions

This repo contains copies of Google API definitions and related files. For discussions or to raise issues about Google API client libraries, GRPC or Google Cloud Client Libraries please refer to the repos associated with each area.

Repository Structure

This repository uses a directory hierarchy that reflects the Google API product structure. In general, every API has its own root directory, and each major version of the API has its own subdirectory. The proto package names exactly match the directory: this makes it easy to locate the proto definitions and ensures that the generated client libraries have idiomatic namespaces in most programming languages. Alongside the API directories live the configuration files for the GAPIC toolkit.

NOTE: The major version of an API is used to indicate breaking change to the API.

Generate gRPC Source Code

To generate gRPC source code for Google APIs in this repository, you first need to install both Protocol Buffers and gRPC on your local machine, then you can run make LANGUAGE=xxx all to generate the source code. You need to integrate the generated source code into your application build system.

NOTE: The Makefile is only intended to generate source code for the entire repository. It is not for generating linkable client library for a specific API. Please see other repositories under https://github.com/googleapis for generating linkable client libraries.

Go gRPC Source Code

It is difficult to generate Go gRPC source code from this repository, since Go has different directory structure. Please use this repository instead.

discovery-artifact-manager's People

Contributors

andreamlin avatar bcoe avatar bshaffer avatar cclauss avatar chingor13 avatar codyoss avatar dazuma avatar dfrenkel avatar dwsupplee avatar garrettjonesgoogle avatar google-cloud-policy-bot[bot] avatar googleapis-publisher avatar justinbeckwith avatar renovate-bot avatar saicheems avatar surferjeffatgoogle avatar tcoffee-google avatar vam-google avatar vchudnov-g avatar yihanzhen avatar yoshi-code-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

discovery-artifact-manager's Issues

Recreate CI

CI on this repo hasn't run since 2017, and the current scripts are no longer relevant. A bunch of things are currently being gutted from this repo (notably pretty much all client library generation and release scripts). I believe what will remain once that process is complete is:

  • Updating the discovery doc cache
  • Generating Apiary samples

Those two items will probably remain in this repo for some time, and it will be useful to cover their tests (if any) in CI. We should set that up.

28 pull requests had merge conflicts and were not merged

From December 14 until January 27, 28 automatically generated discovery document updates could not be merged due to merge conflicts.

During the same period, hundreds of pull requests were successfully merged because they contained no conflicts, for example #828.

When I click on the merge button, the conflicts are so large and complex I have no hope of resolving them.

I ask for help for the original authors of this code:
@saicheems @andreamlin @vchudnov-g @tcoffee-google

Why did the generated code conflict?

Dockerfile no longer builds

Environment details

  • OS: macos

Steps to reproduce

  1. Clone the repo
  2. cd server
  3. docker build .

Will fail on the follow step: RUN virtualenv /env -p python3

Fix failing tests

The following tests fail on my local machine. I think we've been ignoring test failures recently during sample generation, but this makes it hard to verify that necessary changes work as intended. We should fix or formally disable these tests.


com.google.api.codegen.advising.AdviserTest > missing_package_name FAILED
    java.lang.IllegalArgumentException at AdviserTest.java:86

com.google.api.codegen.advising.AdviserTest > missing_language_settings FAILED
    java.lang.IllegalArgumentException at AdviserTest.java:63

com.google.api.codegen.metacode.SampleInitCodeTest > testSimpleField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testFormattedFieldBadFieldWithValue FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testNestedListField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testBadField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMultipleListEntries FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListFieldMismatchedFieldThenList FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListEmbeddedField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testRegex FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMultipleFields FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testBadSubField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListFieldIndexGap FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testCompoundingStructureList FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testEmbeddedFieldList FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testAssignment FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListEmbeddedMultipleFields FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMultipleMapEntries FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMapField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMapFieldBadStringIndexUnclosedDoubleQuotes FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMapFieldBadIntIndex FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testEmbeddedField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testFormattedFieldBadField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMultipleFormattedEntries FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testFormattedField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListFieldBadIndex FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testListFieldMismatchedListThenField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testMapFieldBadStringIndexUnclosedSingleQuotes FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testCompoundingStructure FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testNestedMixedField FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.metacode.SampleInitCodeTest > testFormattedFieldWithValues FAILED
    java.lang.IllegalArgumentException at SampleInitCodeTest.java:54

com.google.api.codegen.transformer.php.PhpModelTypeNameConverterTest > testGetEnumValue FAILED
    java.lang.IllegalArgumentException at PhpModelTypeNameConverterTest.java:33

com.google.api.codegen.transformer.nodejs.NodeJSModelTypeNameConverterTest > testGetEnumValue FAILED
    java.lang.IllegalArgumentException at NodeJSModelTypeNameConverterTest.java:33

com.google.api.codegen.transformer.go.GoModelTypeNameConverterTest > testGetEnumValue FAILED
    java.lang.IllegalArgumentException at GoModelTypeNameConverterTest.java:54

com.google.api.codegen.transformer.go.GoGapicSurfaceTransformerTest > classMethod FAILED
    java.lang.IllegalArgumentException at GoGapicSurfaceTransformerTest.java:50

com.google.api.codegen.transformer.csharp.CSharpModelTypeNameConverterTest > testGetEnumValue FAILED
    java.lang.IllegalArgumentException at CSharpModelTypeNameConverterTest.java:33

com.google.api.codegen.transformer.ruby.RubyModelTypeNameConverterTest > testGetEnumValue FAILED
    java.lang.IllegalArgumentException at RubyModelTypeNameConverterTest.java:33

com.google.api.codegen.GapicCodeGeneratorTest > library[go] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[php] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[java] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[java] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[ruby] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[ruby_doc] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[ruby] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[ruby] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[py] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[py] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[nodejs] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[nodejs_doc] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[nodejs] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[nodejs] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[csharp] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.GapicCodeGeneratorTest > library[client_config] FAILED
    java.lang.IllegalArgumentException at GapicCodeGeneratorTest.java:148

com.google.api.codegen.ConfigGenerationTest > longrunning FAILED
    java.lang.IllegalArgumentException at ConfigGenerationTest.java:75

com.google.api.codegen.ConfigGenerationTest > library FAILED
    java.lang.IllegalArgumentException at ConfigGenerationTest.java:65

com.google.api.codegen.ConfigGenerationTest > no_path_templates FAILED
    java.lang.IllegalArgumentException at ConfigGenerationTest.java:70

com.google.api.codegen.grpcmetadatagen.PackageMetadataGeneratorTest > python_library FAILED
    java.lang.IllegalArgumentException at PackageMetadataGeneratorTest.java:69

com.google.api.codegen.grpcmetadatagen.PackageMetadataGeneratorTest > java_grpc_stubs FAILED
    java.lang.IllegalArgumentException at PackageMetadataGeneratorTest.java:69

com.google.api.codegen.grpcmetadatagen.PackageMetadataGeneratorTest > java_library FAILED
    java.lang.IllegalArgumentException at PackageMetadataGeneratorTest.java:69

com.google.api.codegen.grpcmetadatagen.PackageMetadataGeneratorTest > java_common_protos FAILED
    java.lang.IllegalArgumentException at PackageMetadataGeneratorTest.java:69

Enable master branch protection

      This repository does not seem to have master branch
      protection enabled, at least in the way I'm expecting.
      I was hoping for:

      - master branch protection
      - requiring at least one code reviewer
      - requiring at least two status checks
      - enforcing rules for admins

      Please turn it on!

Add JS checker

toolkit is getting support for generating JS samples. We need to add JS to compilecheck,, even if it 's initially a no-op.

FR: sort discovery document keys

This should make reading a discovery document diff possible.

The generators should be sorting already (otherwise, generated clients would also be seeing tons of code churn).

Python: oauth2client is deprecated and should be replaced with google-auth

Is your feature request related to a problem? Please describe.
https://github.com/googleapis/oauth2client is deprecated. Consequently, automatically generated code samples shouldn't continue to produce code that uses oauth2client for default credentials.

Describe the solution you'd like
A simplest way would be replace fragments that use

from oauth2client.client import GoogleCredentials

credentials = GoogleCredentials.get_application_default()

with

from google import auth

credentials, _ = auth.default()

and update instructions to install both google-api-python-client and google-auth:
pip install --upgrade google-api-python-client google-auth

Describe alternatives you've considered
This is probably the best and the simplest solution to the oauth2client deprecation.

Implement self-consistent Discovery doc and client library updates

[[ DRAFT ]]

This repository was created to address synchronization of Discovery doc sources, sample generators, sample correctness tests, and client libraries (googleapis/gapic-generator#587) by allowing version control across these entities. This issue proposes a precise mechanism for implementing consistent updates across the repository.

A local cache of Discovery docs avoids inconsistent changes during the update due to live changes in the Discovery service. A mechanism has been implemented (#21, #22) to update this local cache on demand from live APIs. However, during a development test cycle, the cache may be preserved to avoid introducing external changes.

An internally consistent update may choose to update, or not, the local Discovery doc cache. It then invokes each language's client library generator to update client library artifacts. These generators make changes to the repository file system isolated to their separate corresponding subdirectories, hence may be run concurrently. Following regeneration and testing of client libraries, the sample generation and testing process may be invoked.

After all these updates, in the absence of errors, a single commit captures consistent changes across the repository. The update may then choose to release, or not, the client libraries, likely depending on whether or not Discovery sources have been updated to recent versions. The update may also choose to publish, or not, updated samples, likely depending on whether these have passed all tests. Note that updated client libraries may be released (to maintain consistency with API backends) even in cases where samples are not updated due to test failures; in such cases, it may be desirable to withdraw failing samples until working updates are available.

runDiscoGen fails with NPE

Environment details

  • OS: Linux
  • Java version:
openjdk version "1.8.0_181-google-v7"
OpenJDK Runtime Environment (build 1.8.0_181-google-v7-313002728-313002728)
OpenJDK 64-Bit Server VM (build 25.181-b01, mixed mode)

Steps to reproduce

  1. You want to generate code samples for Cloud Billing (pick any service in scope) for the purpose of uploading them to be used by the Google Cloud Docs website, so you cd toolkit and run
./gradlew runDiscoGen "-Pclargs=--discovery_doc=../discoveries/cloudbilling.v1.json,--gapic_yaml=./src/main/resources/com/google/api/codegen/py/python_gapic.yaml,--output=/tmp/docs/billing/"

Expected

Code samples for Cloud Billing are produced in /tmp/docs/billing and can be reviewed and uploaded

Actual

> Task :runDiscoGen
the generator class 'com.google.api.codegen.gapic.MainGapicProviderFactory' does not extend the expected class 'com.google.api.codegen.discovery.DiscoveryProviderFactory'Exception in thread "main" java.lang.NullPointerException
        at com.google.api.codegen.DiscoveryFragmentGeneratorApi.process(DiscoveryFragmentGeneratorApi.java:144)
        at com.google.api.codegen.DiscoveryFragmentGeneratorApi.run(DiscoveryFragmentGeneratorApi.java:194)
        at com.google.api.codegen.DiscoveryFragmentGeneratorTool.generate(DiscoveryFragmentGeneratorTool.java:113)
        at com.google.api.codegen.DiscoveryFragmentGeneratorTool.main(DiscoveryFragmentGeneratorTool.java:86)


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':runDiscoGen'.
> Process 'command '/usr/local/buildtools/java/jdk8-google-v7-64/bin/java'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED in 2s

When updating discovery cache, the revision check should be more loose

Currently when the discovery cache is updated, the revision fields are checked. If the new document has an "older" revision than what is currently in the cache, the update is aborted.

However, we currently have multiple cases where our cached discovery doc has a revision, but the latest from the discovery service has no revision field. (Two examples are content v2 and bigquery v2). This is causing https://github.com/googleapis/discovery-artifact-manager/blob/master/src/main/common/updatedisco.go#L229 to think the "empty" revision is "older" than our cached version. We should relax the check to allow this case.

[Policy Bot] found one or more issues with this repository.

Policy Bot found one or more issues with this repository.

  • Default branch is 'main'
  • Branch protection is enabled
  • Renovate bot is enabled
  • Merge commits disabled
  • There is a CODEOWNERS file
  • There is a valid LICENSE.md
  • There is a CODE_OF_CONDUCT.md
  • There is a CONTRIBUTING.md
  • There is a SECURITY.md

Security Policy violation Binary Artifacts

This issue was automatically created by Allstar.

Security Policy Violation
Project is out of compliance with Binary Artifacts policy: binaries present in source code

Rule Description
Binary Artifacts are an increased security risk in your repository. Binary artifacts cannot be reviewed, allowing the introduction of possibly obsolete or maliciously subverted executables. For more information see the Security Scorecards Documentation for Binary Artifacts.

Remediation Steps
To remediate, remove the generated executable artifacts from the repository.

Artifacts Found

  • discoGen-0.0.5.jar

Additional Information
This policy is drawn from Security Scorecards, which is a tool that scores a project's adherence to security best practices. You may wish to run a Scorecards scan directly on this repository for more details.


Allstar has been installed on all Google managed GitHub orgs. Policies are gradually being rolled out and enforced by the GOSST and OSPO teams. Learn more at http://go/allstar

This issue will auto resolve when the policy is in compliance.

Issue created by Allstar. See https://github.com/ossf/allstar/ for more information. For questions specific to the repository, please contact the owner or maintainer.

When discoveries change, regenerate corresponding samples into new PR

In order for us to update samples more proactively, let's implement the following:

After syncing new Discoveries, our nightly job should re-generate samples

  • for any Discoveries that have changed, or
  • if any of the code in this repo has changed.

If those new samples are different than the corresponding existing samples, the new samples should go into a PR for review by the owners of this repo.

The owners of this repo will thus be automatically notified when new samples need to be published. After approving and merging the PR, we can then pull it into our local workspaces and push the new samples to GCS where they can be visible to the world.

gradlew does not work with JDK11 or 14

Environment details

  • OS: Mac OS (same results on Linux with latest OpenJDK or with OpenJDK 11)
  • Java version:
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.1+7, mixed mode, sharing)

or

openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10)
OpenJDK 64-Bit Server VM (build 11.0.7+10, mixed mode)

Steps to reproduce

  1. git clone https://github.com/googleapis/discovery-artifact-manager.git
  2. cd discovery-artifact-manager/toolkit
  3. ./gradlew test
Expected

All tests pass

Actual
FAILURE: Build failed with an exception.

* What went wrong:
Could not determine java version from '14.0.1'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
Workaround

Switching to older JDK8

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.