Coder Social home page Coder Social logo

citation-file-format / cffconvert Goto Github PK

View Code? Open in Web Editor NEW
93.0 7.0 28.0 2.34 MB

Command line program to validate and convert CITATION.cff files.

License: Apache License 2.0

Python 98.72% TeX 0.80% Dockerfile 0.01% HTML 0.47%
citation citation-files attribution software-sustainability bibtex endnote ris cff schemaorg codemeta

cffconvert's Introduction

cffconvert

Zenodo DOI testing linting Code Smells PyPI Badge CII Best Practices Research Software Directory fair-software.eu FAIR checklist badge Docker Pulls PyPI - Downloads PePy GitHub commits since latest release (by SemVer including pre-releases)

Command line program to validate and convert CITATION.cff files.

Supported input versions of the Citation File Format

Citation File Format schema version Link to Zenodo release
1.3.0 unreleased
1.2.0 Zenodo DOI
1.1.0 Zenodo DOI
1.0.3 Zenodo DOI
1.0.2 Zenodo DOI
1.0.1 Zenodo DOI

Supported output formats

  1. APA-like plaintext
  2. BibTeX
  3. CodeMeta
  4. EndNote
  5. RIS
  6. schema.org JSON
  7. Zenodo JSON

cffconvert does not support converting items from references or preferred-citation keys at the moment.

Installing

To install in user space,

python3 -m pip install --user cffconvert

Ensure that the user space directory ~/.local/bin/ is on the PATH.

which cffconvert

should now return the location of the program.

See docs/alternative-install-options.md for alternative install options.

Docker

cffconvert is available from DockerHub: https://hub.docker.com/r/citationcff/cffconvert

Example usage:

docker run --rm -v $PWD:/app citationcff/cffconvert --validate
docker run --rm -v $PWD:/app citationcff/cffconvert --version
docker run --rm -v $PWD:/app citationcff/cffconvert --help
# etc

pre-commit hook

cffconvert is also available as a pre-commit hook. Add the following to your .pre-commit-config.yaml file to start validating your CITATION.cff automatically whenever you issue a git commit:

repos:
  - repo: https://github.com/citation-file-format/cffconvert
    rev: 054bda51dbe278b3e86f27c890e3f3ac877d616c
    hooks:
      - id: validate-cff

Command line interface

See cffconvert's options:

cffconvert --help

Shows:

Usage: cffconvert [OPTIONS]

  Command line program to validate and convert CITATION.cff files.

Options:
  -i, --infile PATH               Path to the CITATION.cff input file. If this
                                  option is omitted, './CITATION.cff' is used.
  -o, --outfile PATH              Path to the output file.
  -f, --format [apalike|bibtex|cff|codemeta|endnote|ris|schema.org|zenodo]
                                  Output format.
  -u, --url TEXT                  URL to the CITATION.cff input file.
  -h, --help                      Show help and exit.
  --show-trace                    Show error trace.
  --validate                      Validate the CITATION.cff file and exit.
  --version                       Print version and exit.
  --verbose                       Control output verbosity.

  If this program is useful to you, consider giving it a star on GitHub:
  https://github.com/citation-file-format/cffconvert

Example usage

Validating a local CITATION.cff file

cffconvert --validate
cffconvert --validate -i CITATION.cff
cffconvert --validate -i ${PWD}/CITATION.cff
cffconvert --validate -i ../some-other-dir/CITATION.cff

Validating a remote CITATION.cff file

cffconvert --validate --url https://github.com/<org>/<repo>
cffconvert --validate --url https://github.com/<org>/<repo>/commit/<sha>
cffconvert --validate --url https://github.com/<org>/<repo>/tree/<sha>
cffconvert --validate --url https://github.com/<org>/<repo>/tree/<tag>
cffconvert --validate --url https://github.com/<org>/<repo>/tree/<branch>

Converting metadata to other formats

If there is a valid CITATION.cff file in the current directory, you can convert to various other formats and print the result on standard out with:

cffconvert -f bibtex
cffconvert -f codemeta
cffconvert -f endnote
cffconvert -f ris
cffconvert -f schema.org
cffconvert -f zenodo
cffconvert -f apalike

Writing to a file

# with i/o redirection:
cffconvert -f bibtex > bibtex.bib
cffconvert -f zenodo > .zenodo.json
cffconvert -f endnote > ${PWD}/endnote.enw
# etc

# without i/o redirection
cffconvert -f bibtex -o bibtex.bib
cffconvert -f zenodo -o .zenodo.json
cffconvert -f endnote -o ${PWD}/endnote.enw
# etc

cffconvert's People

Contributors

abelsiqueira avatar andreaschrader avatar dependabot[bot] avatar firefly-cpp avatar jspaaks avatar kurtmckee avatar monperrus avatar musicinmybrain avatar nialov avatar ots22 avatar sdruskat avatar sverhoeven avatar tommos0 avatar wleoncio avatar zmoon 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  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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

cffconvert's Issues

Failed install with python 3.7

pip install fails with python 3.7 environment. Happens in same way with 3.7 installed via homebrew and with a python3.7 conda environment (I couldn't get virtualenv working to test that too). Issues seems to be with ruamel.yaml:

https://pypi.org/project/cffconvert/#files does only list python 3.6 should cffconvert refuse to install on python 3.7 environments (is that possible?)

conda create -n py37 -c anaconda python=3.7 
conda activate py37
pip install cffconvert
Collecting cffconvert
  Using cached https://files.pythonhosted.org/packages/79/ee/6a359b57860b48badfe5538a1ea906c500532a35f76d46b9866f915968f4/cffconvert-1.0.1.tar.gz
Collecting click==6.7 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/34/c1/8806f99713ddb993c5366c362b2f908f18269f8d792aff1abfd700775a77/click-6.7-py2.py3-none-any.whl
Collecting PyYAML==3.12 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz
Collecting requests==2.18.4 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl
Collecting pykwalifire==2.0.1 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/60/6d/bba1b8c3db8cdf2236819431883859f9226f89156afb72364b94d9233752/pykwalifire-2.0.1-py2.py3-none-any.whl
Collecting pytest==3.3.2 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/38/af/8dcf688d192914928393f931b7b550f2530299bbb08018b2f17efa6aab73/pytest-3.3.2-py2.py3-none-any.whl
Collecting pytest-cov==2.5.1 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/30/7d/7f6a78ae44a1248ee28cc777586c18b28a1df903470e5d34a6e25712b8aa/pytest_cov-2.5.1-py2.py3-none-any.whl
Collecting pytest-runner==4.2 (from cffconvert)
  Using cached https://files.pythonhosted.org/packages/72/a4/d7a5738a3096f22a98bec1609e237b250ebff04e5ea2930305d485337263/pytest_runner-4.2-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests==2.18.4->cffconvert)
  Using cached https://files.pythonhosted.org/packages/27/cc/6dd9a3869f15c2edfab863b992838277279ce92663d334df9ecf5106f5c6/idna-2.6-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests==2.18.4->cffconvert)
  Using cached https://files.pythonhosted.org/packages/63/cb/6965947c13a94236f6d4b8223e21beb4d576dc72e8130bd7880f600839b8/urllib3-1.22-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.18.4->cffconvert)
  Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Requirement already satisfied: certifi>=2017.4.17 in ./miniconda3/envs/py37/lib/python3.7/site-packages (from requests==2.18.4->cffconvert) (2018.8.24)
Collecting docopt>=0.6.2 (from pykwalifire==2.0.1->cffconvert)
Collecting ruamel.yaml<0.12.0,>=0.11.0 (from pykwalifire==2.0.1->cffconvert)
  Using cached https://files.pythonhosted.org/packages/6a/d0/1b8feda986ec3440df38ace0088b7e46d1eba769bea0f91b90c526427076/ruamel.yaml-0.11.15.tar.gz
    Complete output from command python setup.py egg_info:
    Warning: 'keywords' should be a list, got type 'NoneType'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/cq/dnv1cdh95n773pwj1x49tmtr0000gp/T/pip-install-5tdy_gtf/ruamel.yaml/setup.py", line 715, in <module>
        main()
      File "/private/var/folders/cq/dnv1cdh95n773pwj1x49tmtr0000gp/T/pip-install-5tdy_gtf/ruamel.yaml/setup.py", line 712, in main
        setup(**kw)
      File "/Users/howison/miniconda3/envs/py37/lib/python3.7/site-packages/setuptools/__init__.py", line 140, in setup
        return distutils.core.setup(**attrs)
      File "/Users/howison/miniconda3/envs/py37/lib/python3.7/distutils/core.py", line 108, in setup
        _setup_distribution = dist = klass(attrs)
      File "/Users/howison/miniconda3/envs/py37/lib/python3.7/site-packages/setuptools/dist.py", line 370, in __init__
        k: v for k, v in attrs.items()
      File "/Users/howison/miniconda3/envs/py37/lib/python3.7/distutils/dist.py", line 267, in __init__
        getattr(self.metadata, "set_" + key)(val)
      File "/Users/howison/miniconda3/envs/py37/lib/python3.7/distutils/dist.py", line 1203, in set_keywords
        self.keywords = _ensure_list(value, 'keywords')
      File "/Users/howison/miniconda3/envs/py37/lib/python3.7/distutils/dist.py", line 40, in _ensure_list
        value = list(value)
    TypeError: 'NoneType' object is not iterable
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/cq/dnv1cdh95n773pwj1x49tmtr0000gp/T/pip-install-5tdy_gtf/ruamel.yaml/

Hard dependency on exact version numbers

The hard dependency on exact version numbers makes this difficult to use. Would it be possible to use more soft requirements e.g. >= or if semantic versioning is supported by the dependency, use that instead e.g.

requests >= 2.20.0, < 3.0.0

export_as_linked_data with schema argument

curently there is some discussion on the flavours of linked data (e.g. schema.org, codemeta)
#62

We could instead have a method export_as_linked_data(flavor='schema.org')
with other flavors as we see fit.

schema 1.1.0 and higher can't be retrieved because it is in a different location than earlier schemas

This part
https://github.com/citation-file-format/cff-converter-python/blob/232acb23015d449c9441597cd614620270e770c8/cffconvert/citation.py#L133-L144

will be affected by the fact that the schema URL can be in one of two places (not counting Zenodo)
Probably best if I just make a dict based on semver

something like

d= {
   "1.0.1": "https://raw.githubusercontent.com/citation-file-format/schema/1.0.1/CFF-Core/schema.yaml",
   "1.0.2": "https://raw.githubusercontent.com/citation-file-format/schema/1.0.2/CFF-Core/schema.yaml",
   "1.0.3": "https://raw.githubusercontent.com/citation-file-format/schema/1.0.3-1/CFF-Core/schema.yaml",
   "1.1.0": "https://raw.githubusercontent.com/citation-file-format/citation-file-format/master/schema.yaml"
}

I can then retrieve the URL with e.g. d["1.0.3"].

license format documentation

I use license LGPL (>= 2.0, < 3), but cffconvert complains that it is not in the list of licenses without providing info on where the list is. I then found out that this is the list, which tells me to use LGPL-2.0-or-later.

Would it be an idea to update line 209 of citation.py from:
raise ValueError("Provided license {0} not in list of licenses".format(spdx_license_code))

to:
raise ValueError("Provided license {0} not in list of licenses, see https://spdx.org/licenses/ for possible licenses".format(spdx_license_code))

license enum conversion

I may have an issue regarding licenses with converting from cff to zenodo. Both use a restricted vocabulary/enums for the license value, but cff uses SPDX while zenodo.json uses https://licenses.opendefinition.org/licenses/groups/all.json it seems. (needs confirmation)

specific problem occurs with license GPL-2.0-only (SPDX) v GPL-2.0 (opendefinition). on this repo/version: https://github.com/NLeSC/structure-from-motion/releases/tag/1.0.4. on zenodo the error is:

{
    "errors": "Unknown error occured."
}

doi: null in zenodo export

when i do:

cffconvert -f zenodo --url https://github.com/ERA-URBAN/netcdf2littler/tree/6adc6f1c3839937b66dd33d3655ab0b92b396c24

I get a null value for doi:

Note: suspect keys will be included in the output.
{
    "creators": [
        {
            "affiliation": "Netherlands eScience Center",
            "name": "van Haren, Ronald"
        }
    ],
    "doi": null,
    "keywords": [
        "WRF",
        "WRFDA",
        "LITTLE_R",
        "netCDF"
    ],
    "license": {
        "id": "Apache-2.0"
    },
    "publication_date": "2018-05-31",
    "title": "netcdf2littler",
    "version": "1.0.0"
}

and similar for codemeta export.

trouble installing cffconvert in Ubuntu

I am trying to install cffconvert, but run into various error messages.

When doing pip install cffconvert I see the following messages among the printed output:

  • error: command 'gcc' failed with exit status 1
  • Failed building wheel for ruamel.yaml
  • Command "/home/vincent/anaconda3/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-qfu5s255/ruamel.yaml/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-82yhofem/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-qfu5s255/ruamel.yaml/

I am using Python 3.6.2 and I get the same error message when trying to install cffconvert directly from github following the instructions in the README.

In addition when I run pytest, which of course is expected to fail when the package is not well installed I get the following error messages:

(cffconvert) vincent@vincent-VB:~/GGIR/cff-converter-python$ pytest test/
=============================================================== test session starts ===============================================================
platform linux -- Python 3.6.2, pytest-3.3.2, py-1.5.4, pluggy-0.6.0
rootdir: /home/vincent/GGIR/cff-converter-python, inifile: pytest.ini
plugins: cov-2.5.1
collected 0 items / 3 errors                                                                                                                      

===================================================================== ERRORS ======================================================================
_____________________________________________________ ERROR collecting test/citation_test.py ______________________________________________________
ImportError while importing test module '/home/vincent/GGIR/cff-converter-python/test/citation_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/citation_test.py:4: in <module>
    from cffconvert import Citation
cffconvert/__init__.py:1: in <module>
    from cffconvert.citation import Citation
cffconvert/citation.py:8: in <module>
    from pykwalifire.core import Core
E   ModuleNotFoundError: No module named 'pykwalifire'
________________________________________________________ ERROR collecting test/cli_test.py ________________________________________________________
ImportError while importing test module '/home/vincent/GGIR/cff-converter-python/test/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/cli_test.py:4: in <module>
    from cffconvert import cli as cffconvert_cli
cffconvert/__init__.py:1: in <module>
    from cffconvert.citation import Citation
cffconvert/citation.py:8: in <module>
    from pykwalifire.core import Core
E   ModuleNotFoundError: No module named 'pykwalifire'
____________________________________________________ ERROR collecting test/consistency_test.py ____________________________________________________
ImportError while importing test module '/home/vincent/GGIR/cff-converter-python/test/consistency_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test/consistency_test.py:5: in <module>
    from cffconvert.version import __version__ as expected_version
cffconvert/__init__.py:1: in <module>
    from cffconvert.citation import Citation
cffconvert/citation.py:8: in <module>
    from pykwalifire.core import Core
E   ModuleNotFoundError: No module named 'pykwalifire'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 3 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
============================================================= 3 error in 0.79 seconds =============================================================

Finally, it may be worth mentioning that I am trying to use the cff file in a repository with primarily R code, so if there would be a way to avoid having to use Python for the cff file that would be great.

validator stumbles when validating ggir cff

$ cffconvert --version
0.0.5
$ cffconvert --url https://github.com/wadpac/GGIR/blob/c43d428699c6f6c863090e29e5fb9101b67f523b/CITATION.cff --validate

Traceback (most recent call last):
  File "/home/daisycutter/.venv35/bin/cffconvert", line 11, in <module>
    sys.exit(cli())
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/cffconvert/cli.py", line 60, in cli
    remove=remove, suspect_keys=suspect_keys, validate=validate)
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/cffconvert/citation.py", line 54, in __init__
    self._validate()
  File "/home/daisycutter/.venv35/lib/python3.5/site-packages/cffconvert/citation.py", line 131, in _validate
    r = requests.get(schema_urls[semver])
UnboundLocalError: local variable 'semver' referenced before assignment

UnsafeLoaderWarning warning

Whenever I run cffconvert, it will output a warning about an unsafe YAML loader:

$ cffconvert --validate -if CITATION.cff 
/home/thomas/.local/lib/python3.6/site-packages/pykwalifire/core.py:91: UnsafeLoaderWarning: 
The default 'Loader' for 'load(stream)' without further arguments can be unsafe.
Use 'load(stream, Loader=ruamel.yaml.Loader)' explicitly if that is OK.
Alternatively include the following in your code:

  import warnings
  warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)

In most other cases you should consider using 'safe_load(stream)'
  self.source = yaml.load(stream)

Python version is 3.6.7, OS is Ubuntu 18.10

google cloud function: invalid license value still valid

add static code analysis

maybe sonarcloud, codacy or codeclimate
possibly also pylint for local tests before committing

Mention web service in README

The README should mention the available web service at some point, at least if it's stable (and perhaps has a more accessible URL).

Make exports more robust against incomplete CITATION.cff files

When exporting a CITATION.cff that has no doi field, I get an error when doing this: https://github.com/citation-file-format/cff-converter-python/blob/cc70305d4d3acf94ad3ece684c19e4c9f2762a66/citationcff/citation.py#L80

Probably the same for exporting as RIS or EndNote, and for other keys like date-released and repository-code; title and author should be covered by a validator (refs #6) since I believe the standard requires those fields to be present.

Schema bugfix releases ignored for validation

The CFF schema can have bugfix-releases, that update the schema file but not the version of CFF (https://github.com/citation-file-format/schema#versioning). E.g. for CFF 1.0.3, the bugfix schema version 1.0.3-1 is available:
https://raw.githubusercontent.com/citation-file-format/schema/1.0.3-1/CFF-Core/schema.yaml

Instead of the newest bugfix schema release, the original buggy schema is used. I stumbled across this problem when I tried to include the SPDX version identifier "EPL-2.0" and this was not an allowed value. I also can't just change the version field or give the updated schema file as argument.

Should @context be the CodeMeta schema instead of schema.org?

This issue is referring to https://github.com/citation-file-format/cff-converter-python/blob/master/cff_converter_python/citation.py#L303:

CFF-Core can easily be represented in a pure schema.org contexted codemeta.json file. However, I think there are two reasons why it would perhaps make sense to change the context to https://doi.org/10.5063/schema/codemeta-2.0 (cf. https://github.com/codemeta/codemeta/blob/master/codemeta.json#L2).

  1. It makes the exported codemeta.json future-proof in that it doesn't require the user to change the @context value in order to use the CodeMeta fields that extend schema.org.
  2. There are plans to extend CFF to cover the full field set of CodeMeta, in which case the converter (once it would include the new CFF "module") would produce invalid CodeMeta files if the context was left at schema.org.

On the other hand (cf. codemeta/codemeta#180 (comment)), "plain" schema.org files are "unknowingly compatible", hence I'm not sure what the best option would be here, and hence would like to hear your thoughts on this.

zenodo export orcid identifier should maybe not include https://orcid.org part?

zenodo says "Not a valid orcid identifier" when I made a release of this repo, with this orcid in its .zenodo.json:

https://github.com/citation-file-format/cff-converter-python/blob/79a216efd792acbb715222838244b0979961687c/.zenodo.json#L18

here the complete error from https://zenodo.org/account/settings/github/repository/citation-file-format/cff-converter-python:

{
    "status": 400, 
    "message": "Validation error.", 
    "errors": [
        {
            "field": "metadata.creators.3.orcid", 
            "message": "Not a valid ORCID identifier."
        }
    ]
}

warnings in stdout

I think currently warnings (well at least the one about suspect keys) end up in stdout (and thus silently in the output wehen redirect to file..)

maybe better to put them in stderr?

update readme to use pytest not unittest

I'm considering addding a pytest.ini to be explicit about where to look for tests. Alternatively, that same information can also be stored inside setup.cfg. My preference is to use pytest.ini because it will

  1. tell you that pytest is the testing framework (as opposed to nose/nosetest/unittest) and
  2. it will specify exactly how to run tests
    Any objections or counter arguments @Tommos0?

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.