Giter Club home page Giter Club logo

pyproject-parser's Introduction

pyproject-parser

Parser for 'pyproject.toml'

Docs Documentation Build Status Docs Check Status
Tests Linux Test Status Windows Test Status macOS Test Status Coverage
PyPI PyPI - Package Version PyPI - Supported Python Versions PyPI - Supported Implementations PyPI - Wheel
Anaconda Conda - Package Version Conda - Platform
Activity GitHub last commit GitHub commits since tagged version Maintenance PyPI - Downloads
QA CodeFactor Grade Flake8 Status mypy status
Other License GitHub top language Requirements Status

Installation

pyproject-parser can be installed from PyPI or Anaconda.

To install with pip:

$ python -m pip install pyproject-parser

To install with conda:

$ conda install -c conda-forge pyproject-parser

pyproject-parser also has an optional README validation feature, which checks the README will render correctly on PyPI. This requires that the readme extra is installed:

$ python -m pip install pyproject-parser[readme]

pyproject-parser's People

Contributors

domdfcoding avatar repo-helper[bot] avatar

Stargazers

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

Watchers

 avatar  avatar

pyproject-parser's Issues

Add `consolekit` and `sdjson` to `tests/requirements.txt`

Description

cachecontrol and sdjson are missed in tests/requirements.txt

Steps to Reproduce

  1. $ git clone https://github.com/repo-helper/pyproject-parser && cd pyproject-parser
  2. $ python3 -m venv .venv && source .venv/bin/activate
  3. $ python3 -m pip -r requirements.txt -r tests/requirements.txt
  4. $ python3 -m pytest -vra

Actual result:

Traceback (most recent call last):
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 782, in import_plugin
    __import__(importspec)
ModuleNotFoundError: No module named 'consolekit'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/ancieg/pyproject-parser/.venv/bin/pytest", line 8, in <module>
    sys.exit(console_main())
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 189, in console_main
    code = main()
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 147, in main
    config = _prepareconfig(args, plugins)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 328, in _prepareconfig
    config = pluginmanager.hook.pytest_cmdline_parse(
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_callers.py", line 133, in _multicall
    teardown[0].send(outcome)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/helpconfig.py", line 103, in pytest_cmdline_parse
    config: Config = outcome.get_result()
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_result.py", line 108, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 1075, in pytest_cmdline_parse
    self.parse(args)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 1425, in parse
    self._preparse(args, addopts=addopts)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 1327, in _preparse
    self.hook.pytest_load_initial_conftests(
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_callers.py", line 155, in _multicall
    return outcome.get_result()
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_result.py", line 108, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/pluggy/_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 1153, in pytest_load_initial_conftests
    self.pluginmanager._set_initial_conftests(
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 564, in _set_initial_conftests
    self._try_load_conftest(anchor, importmode, rootpath)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 586, in _try_load_conftest
    self._getconftestmodules(x, importmode, rootpath)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 610, in _getconftestmodules
    mod = self._importconftest(conftestpath, importmode, rootpath)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 658, in _importconftest
    self.consider_conftest(mod)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 740, in consider_conftest
    self.register(conftestmodule, name=conftestmodule.__file__)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 495, in register
    self.consider_module(plugin)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 748, in consider_module
    self._import_plugin_specs(getattr(mod, "pytest_plugins", []))
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 755, in _import_plugin_specs
    self.import_plugin(import_spec)
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 784, in import_plugin
    raise ImportError(
  File "/home/ancieg/pyproject-parser/.venv/lib64/python3/site-packages/_pytest/config/__init__.py", line 782, in import_plugin
    __import__(importspec)
ImportError: Error importing plugin "consolekit.testing": No module named 'consolekit'

Expected result:

The tests passed successfully.

Reproduces how often:

Always.

Version

  • Operating System: ALT Workstation K 10.2 (Sorbaronia Mitschurinii)
  • Python: 3.9.16
  • pyproject-parser: v0.9.1 (f24f2e8)

Installation source

$ git clone https://github.com/repo-helper/pyproject-parser && cd pyproject-parser

Other Additional Information:

When I installed consolekit and run pytest again, the error changed (summary only):

============================================================================== short test summary info ===============================================================================
SKIPPED [1] tests/test_utils.py:47: could not import 'readme_renderer': No module named 'readme_renderer'
SKIPPED [1] tests/test_utils.py:36: could not import 'readme_renderer': No module named 'readme_renderer'
SKIPPED [2] tests/test_config.py:363: Message differs on Windows.
SKIPPED [1] tests/test_config.py:465: Error differs on 3.6
SKIPPED [1] tests/test_config.py:363: Error differs on 3.6
SKIPPED [2] tests/test_pyproject_class.py:76: Error differs on 3.6
SKIPPED [2] tests/test_pyproject_class.py:76: Message differs on Windows.
FAILED tests/test_cli.py::test_info_readme_license[False-0-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-first_build_requirement] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_check_extra_deprecation_warning[duplicate_extra_3] - FileNotFoundError: [Errno 2] No such file or directory: 'pyproject-parser'
FAILED tests/test_cli.py::test_info_readme_license[False-4-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-project] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-build-system] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-build-system] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-all] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-first_author] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-all] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-fourth_keyword] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-fourth_keyword] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-first_author] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-tool.whey.base-classifiers] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-first_author] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-fourth_keyword] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-build-system.requires] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-project.authors] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-project] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-0-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-project.urls.Source Code] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-project.urls.Source Code] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-build-system.requires] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-tool.whey.base-classifiers] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-project.urls.Source Code] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-tool.whey.base-classifiers] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-fourth_keyword] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_check_extra_deprecation_warning[duplicate_extra_2] - FileNotFoundError: [Errno 2] No such file or directory: 'pyproject-parser'
FAILED tests/test_cli.py::test_info[None-build-system] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-project.urls.Source Code] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-first_build_requirement] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_check_extra_deprecation_warning[duplicate_extra_1] - FileNotFoundError: [Errno 2] No such file or directory: 'pyproject-parser'
FAILED tests/test_cli.py::test_info_readme_license[False-2-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-1-project.readme.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-project.authors] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-build-system.requires] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-project] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[0-build-system] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-project.authors] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-0-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-1-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-project.authors] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-0-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-1-project.license.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-all] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-project] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-2-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-tool.whey.base-classifiers] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[None-build-system.requires] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-4-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-first_author] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-None-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-4-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-1-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-all] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-0-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-1-project.license] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-0-project.readme.file] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-0-0-project.readme] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[False-None-1-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[4-first_build_requirement] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info_readme_license[True-2-0-project.license.text] - ModuleNotFoundError: No module named 'sdjson'
FAILED tests/test_cli.py::test_info[2-first_build_requirement] - ModuleNotFoundError: No module named 'sdjson'
==================================================================== 139 failed, 397 passed, 10 skipped in 15.45s ====================================================================

After sdjson installation the error changed again:

============================================================================== short test summary info ===============================================================================
SKIPPED [2] tests/test_pyproject_class.py:76: Error differs on 3.6
SKIPPED [2] tests/test_pyproject_class.py:76: Message differs on Windows.
SKIPPED [2] tests/test_config.py:363: Message differs on Windows.
SKIPPED [1] tests/test_config.py:465: Error differs on 3.6
SKIPPED [1] tests/test_config.py:363: Error differs on 3.6
SKIPPED [1] tests/test_utils.py:36: could not import 'readme_renderer': No module named 'readme_renderer'
SKIPPED [1] tests/test_utils.py:47: could not import 'readme_renderer': No module named 'readme_renderer'
FAILED tests/test_cli.py::test_check_extra_deprecation_warning[duplicate_extra_3] - FileNotFoundError: [Errno 2] No such file or directory: 'pyproject-parser'
FAILED tests/test_cli.py::test_check_extra_deprecation_warning[duplicate_extra_2] - FileNotFoundError: [Errno 2] No such file or directory: 'pyproject-parser'
FAILED tests/test_cli.py::test_check_extra_deprecation_warning[duplicate_extra_1] - FileNotFoundError: [Errno 2] No such file or directory: 'pyproject-parser'
===================================================================== 3 failed, 533 passed, 10 skipped in 6.09s ======================================================================

0.4.2: setuptools<>sphinx integration does not work

Looks like setuptools<>sphinx integration does not work.

+ /usr/bin/python3 setup.py build_sphinx -b man --build-dir build/sphinx
running build_sphinx
Running Sphinx v4.3.2

Configuration error:
config directory doesn't contain a conf.py file (/home/tkloczko/rpmbuild/BUILD/pyproject-parser-0.4.2)

All because docuemntation source is stored in doc-source/ when setuptools<>sphinx integration by default is looking for docs/conf.py.
Thre are two possible solutions:

  • rename doc-source/ to docs/
  • apply below patch
--- a/setup.cfg~        2021-08-11 12:25:07.000000000 +0100
+++ b/setup.cfg 2022-01-14 09:51:52.648856535 +0000
@@ -55,3 +55,6 @@
     pyproject-parser=pyproject_parser.__main__:main
     check-pyproject=pyproject_parser.__main__:main
     pyproject-fmt=pyproject_parser.__main__:main
+
+[build_sphinx]
+source-dir = doc-source

https://www.sphinx-doc.org/en/master/usage/advanced/setuptools.html

Mixed type arrays in pyproject.toml lead to error

Description

TOML 1.0.0 supports mixed type arrays, but the toml library does not, leading to parsing errors.

Steps to Reproduce

This is a valid poetry pyproject.toml working without issues:

[tool.poetry]
name = "dummy-project"
version = "0.1.0"
description = ""
authors = ["John Doe <[email protected]>"]
readme = "README.md"
packages = [{include = "dummy_project"}]

include = [
  # having both a string and an object here seems to trigger the problem:
  "CHANGELOG.md",
  { path = "tests", format = "sdist" },
  # ----
]

[tool.poetry.dependencies]
python = "^3.8"
pyproject-parser = "^0.8.0"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Now let's parse it:

import pyproject_parser
pyproject_parser.PyProject.load("pyproject.toml")

Actual result:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/pyproject_parser/__init__.py", line 176, in load
    config = dom_toml.load(filename)
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/dom_toml/__init__.py", line 217, in load
    return loads(
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/dom_toml/__init__.py", line 171, in loads
    return toml.loads(  # type: ignore[return-value]
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/toml/decoder.py", line 511, in loads
    ret = decoder.load_line(line, currentlevel, multikey,
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/toml/decoder.py", line 778, in load_line
    value, vtype = self.load_value(pair[1], strictly_valid)
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/toml/decoder.py", line 880, in load_value
    return (self.load_array(v), "array")
  File "/local/home/a.pirogov/.cache/pypoetry/virtualenvs/dummy-project-oiKNdZ99-py3.8/lib/python3.8/site-packages/toml/decoder.py", line 1002, in load_array
    a[b] = a[b] + ',' + a[b + 1]
IndexError: list index out of range

Expected result:

No exception.

Reproduces how often:

Always

Version

  • Python: 3.8
  • pyproject-parser: 0.8

Installation source

PyPI

Other Additional Information:

I think the simplest fix would be to switch from the toml to the tomli library, which parses the file just fine.

Dependency problems with conda distribution - only works with python 3.8

The conda distribution of this package (and several other packages, such as whey) either have a dependency on dom-toml when the name of the package in the repo is dom_toml or depend on the python 3.8 abi. As a result you cannot install this project or recent versions of whey into a non-python 3.8 environment using conda.

Really, you should avoid package names with underscores and should not include the python abi dependency in pure python noarch packages.

0.4.3: pytest is failing because messing `pyproject_examples` module

I'm trying to package your module as an rpm package. So I'm using the typical PEP517 based build, install and test cycle used on building packages from non-root account.

  • python3 -sBm build -w --no-isolation
  • because I'm calling build with --no-isolation I'm using during all processes only locally installed modules
  • install .whl file in </install/prefix>
  • run pytest with PYTHONPATH pointing to sitearch and sitelib inside </install/prefix>

I cannot find where is pyproject_examples module.
Here is pytest output:

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-pyproject-parser-0.4.3-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-pyproject-parser-0.4.3-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra
=========================================================================== test session starts ============================================================================
platform linux -- Python 3.8.13, pytest-7.1.2, pluggy-1.0.0
Test session started at 16:42:58
rootdir: /home/tkloczko/rpmbuild/BUILD/pyproject-parser-0.4.3, configfile: tox.ini
plugins: datadir-1.3.1, regressions-2.3.1
collected 54 items / 4 errors

================================================================================== ERRORS ==================================================================================
____________________________________________________________________ ERROR collecting tests/test_cli.py ____________________________________________________________________
ImportError while importing test module '/home/tkloczko/rpmbuild/BUILD/pyproject-parser-0.4.3/tests/test_cli.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib64/python3.8/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_cli.py:12: in <module>
    from pyproject_examples import valid_buildsystem_config, valid_pep621_config
E   ModuleNotFoundError: No module named 'pyproject_examples'
__________________________________________________________________ ERROR collecting tests/test_config.py ___________________________________________________________________
ImportError while importing test module '/home/tkloczko/rpmbuild/BUILD/pyproject-parser-0.4.3/tests/test_config.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib64/python3.8/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_config.py:11: in <module>
    from pyproject_examples import (
E   ModuleNotFoundError: No module named 'pyproject_examples'
__________________________________________________________________ ERROR collecting tests/test_dumping.py __________________________________________________________________
ImportError while importing test module '/home/tkloczko/rpmbuild/BUILD/pyproject-parser-0.4.3/tests/test_dumping.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib64/python3.8/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_dumping.py:5: in <module>
    from pyproject_examples.example_configs import COMPLETE_A, COMPLETE_A_WITH_FILES, COMPLETE_B, COMPLETE_PROJECT_A
E   ModuleNotFoundError: No module named 'pyproject_examples'
______________________________________________________________ ERROR collecting tests/test_pyproject_class.py ______________________________________________________________
ImportError while importing test module '/home/tkloczko/rpmbuild/BUILD/pyproject-parser-0.4.3/tests/test_pyproject_class.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib64/python3.8/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_pyproject_class.py:9: in <module>
    from pyproject_examples import (
E   ModuleNotFoundError: No module named 'pyproject_examples'
============================================================================= warnings summary =============================================================================
../../../../../usr/lib/python3.8/site-packages/_pytest/config/__init__.py:1252
  /usr/lib/python3.8/site-packages/_pytest/config/__init__.py:1252: PytestConfigWarning: Unknown config option: timeout

    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
========================================================================= short test summary info ==========================================================================
ERROR tests/test_cli.py
ERROR tests/test_config.py
ERROR tests/test_dumping.py
ERROR tests/test_pyproject_class.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 4 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
======================================================================= 1 warning, 4 errors in 0.28s =======================================================================

0.7.0: tests is falling in exceptions

Description

Tests crash during check bad config.

Steps to Reproduce

  1. Run python3 -m pytest

Actual result:

Output:

____________________ test_pep621_class_bad_config[bad_name] ____________________

config = '[project]\nname = "???????12345=============☃"\nversion = "2020.0.0"'
expects = <class 'dom_toml.parser.BadConfigError'>
match = "The value for 'project.name' is invalid."
tmp_pathplus = PosixPathPlus('/usr/src/tmp/pytest-of-builder/pytest-0/test_pep621_class_bad_config_b0')

    @pytest.mark.parametrize(
    		"config, expects, match",
    		[
    				*bad_pep621_config,
    				# pytest.param(
    				# 		'[project]\nname = "foo"\nversion = "1.2.3"\n[project.optional-dependencies]\nwith-hyphen = []',
    				# 		TypeError,
    				# 		"Invalid extra name 'with-hyphen'",
    				# 		id="extra_invalid_a",
    				# 		),
    				pytest.param(
    						'[project]\nname = "foo"\nversion = "1.2.3"\n[project.optional-dependencies]\n"quoted?" = []',
    						TypeError,
    						r"Invalid extra name 'quoted\?'",
    						id="extra_invalid_b",
    						),
    				pytest.param(
    						'[project]\nname = "foo"\nversion = "1.2.3"\n[project.optional-dependencies]\n"number#1" = []',
    						TypeError,
    						"Invalid extra name 'number#1'",
    						id="extra_invalid_c",
    						),
    				]
    		)
    def test_pep621_class_bad_config(
    		config: str,
    		expects: Type[Exception],
    		match: str,
    		tmp_pathplus: PathPlus,
    		):
    	(tmp_pathplus / "pyproject.toml").write_clean(config)
    
    	with in_directory(tmp_pathplus), pytest.raises(expects, match=match):
>   		PEP621Parser().parse(dom_toml.load(tmp_pathplus / "pyproject.toml")["project"])

tests/test_config.py:323: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pyproject_parser.parsers.PEP621Parser object at 0x7fcf62cde440>
config = {'name': '???????12345=============☃', 'version': '2020.0.0'}
set_defaults = False

    def parse(  # type: ignore[override]
    	self,
    	config: Dict[str, TOML_TYPES],
    	set_defaults: bool = False,
    	) -> ProjectDict:
    	"""
    	Parse the TOML configuration.
    
    	:param config:
    	:param set_defaults: If :py:obj:`True`, the values in
    		:attr:`self.defaults <dom_toml.parser.AbstractConfigParser.defaults>` and
    		:attr:`self.factories <dom_toml.parser.AbstractConfigParser.factories>`
    		will be set as defaults for the returned mapping.
    	"""
    
    	dynamic_fields = config.get("dynamic", [])
    
    	if "name" in dynamic_fields:
    		raise BadConfigError("The 'project.name' field may not be dynamic.")
    
>   	super_parsed_config = super().parse(config, set_defaults=set_defaults)

pyproject_parser/parsers.py:1093: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pyproject_parser.parsers.PEP621Parser object at 0x7fcf62cde440>
config = {'name': '???????12345=============☃', 'version': '2020.0.0'}
set_defaults = False

    def parse(
    		self,
    		config: Dict[str, TOML_TYPES],
    		set_defaults: bool = False,
    		) -> Dict[str, TOML_TYPES]:
    	"""
    	Parse the TOML configuration.
    
    	:param config:
    	:param set_defaults: If :py:obj:`True`, the values in
    		:attr:`self.defaults <dom_toml.parser.AbstractConfigParser.defaults>` and
    		:attr:`self.factories <dom_toml.parser.AbstractConfigParser.factories>`
    		will be set as defaults for the returned mapping.
    	"""
    
    	for key in self.required_keys:
    		if key in config:
    			continue
    		elif set_defaults and (key in self.defaults or key in self.factories):
    			continue  # pragma: no cover https://github.com/nedbat/coveragepy/issues/198
    		else:
    			raise BadConfigError(f"The {construct_path([self.table_name, key])!r} field must be provided.")
    
>   	return super().parse(config, set_defaults)

pyproject_parser/parsers.py:116: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pyproject_parser.parsers.PEP621Parser object at 0x7fcf62cde440>
config = {'name': '???????12345=============☃', 'version': '2020.0.0'}
set_defaults = False

    def parse(
    		self,
    		config: Dict[str, TOML_TYPES],
    		set_defaults: bool = False,
    		) -> Dict[str, TOML_TYPES]:
    	r"""
    	Parse the TOML configuration.
    
    	This function iterates over the list of keys given in :attr:`~.keys`.
    	For each key, it searches for a method on the class called :file:`parse_{<key>}`.
    
    	* If the method exists, that method is called, passing the value as the only argument.
    	  The value returned from that method is included in the parsed configuration.
    	  The signature of those methods is:
    
    	  .. parsed-literal::
    
    		def visit_<key>(
    			self,
    			config: :class:`typing.Dict`\[:class:`str`\, :py:obj:`typing.Any`\],
    			) -> :py:obj:`typing.Any`\:
    
    	* If the method doesn't exist, the value is included in the parsed configuration unchanged.
    
    	* Missing keys are ignored. Override this function in a subclass if you need that behaviour.
    
    	Once all keys have been parsed the configuration is returned.
    
    	:param config:
    	:param set_defaults: If :py:obj:`True`, the values in :attr:`.AbstractConfigParser.defaults`
    		and :attr:`.AbstractConfigParser.factories` will be set as defaults for the returned mapping.
    
    	.. versionchanged:: 0.3.0
    
    		Added the ``set_defaults`` keyword argument.
    	"""
    
    	parsed_config = {}
    
    	for key in self.keys:
    		if key not in config:
    			# Ignore absent values
    			pass
    
    		elif hasattr(self, f"parse_{key.replace('-', '_')}"):
>   			parsed_config[key] = getattr(self, f"parse_{key.replace('-', '_')}")(config)

/usr/lib/python3/site-packages/dom_toml/parser.py:233: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

args = ({'name': '???????12345=============☃', 'version': '2020.0.0'},)
kwds = {}

    @functools.wraps(f)
    def wrapper(*args, **kwds):
    	try:
>   		return f(*args, **kwds)

pyproject_parser/parsers.py:72: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

config = {'name': '???????12345=============☃', 'version': '2020.0.0'}

    @staticmethod
    @_documentation_url("https://whey.readthedocs.io/en/latest/configuration.html#tconf-project.name")
    def parse_name(config: Dict[str, TOML_TYPES]) -> str:
    	"""
    	Parse the :pep621:`name` key, giving the name of the project.
    
    	* **Format**: :toml:`String`
    	* **Core Metadata**: :core-meta:`Name`
    
    	This key is required, and must be defined statically.
    
    	Tools SHOULD normalize this name, as specified by :pep:`503`,
    	as soon as it is read for internal consistency.
    
    	:bold-title:`Example:`
    
    	.. code-block:: TOML
    
    		[project]
    		name = "spam"
    
    	:param config: The unparsed TOML config for the :pep621:`project table <table-name>`.
    	"""
    
    	name = config["name"]
    	normalized_name = _NormalisedName(normalize(name))
    	normalized_name.unnormalized = name
    
    	# https://packaging.python.org/specifications/core-metadata/#name
    	if not name_re.match(normalized_name):
>   		raise BadConfigError(f"The value {name!r} for 'project.name' is invalid.")
E     dom_toml.parser.BadConfigError: The value '???????12345=============☃' for 'project.name' is invalid.

pyproject_parser/parsers.py:328: BadConfigError

During handling of the above exception, another exception occurred:

config = '[project]\nname = "???????12345=============☃"\nversion = "2020.0.0"'
expects = <class 'dom_toml.parser.BadConfigError'>
match = "The value for 'project.name' is invalid."
tmp_pathplus = PosixPathPlus('/usr/src/tmp/pytest-of-builder/pytest-0/test_pep621_class_bad_config_b0')

    @pytest.mark.parametrize(
    		"config, expects, match",
    		[
    				*bad_pep621_config,
    				# pytest.param(
    				# 		'[project]\nname = "foo"\nversion = "1.2.3"\n[project.optional-dependencies]\nwith-hyphen = []',
    				# 		TypeError,
    				# 		"Invalid extra name 'with-hyphen'",
    				# 		id="extra_invalid_a",
    				# 		),
    				pytest.param(
    						'[project]\nname = "foo"\nversion = "1.2.3"\n[project.optional-dependencies]\n"quoted?" = []',
    						TypeError,
    						r"Invalid extra name 'quoted\?'",
    						id="extra_invalid_b",
    						),
    				pytest.param(
    						'[project]\nname = "foo"\nversion = "1.2.3"\n[project.optional-dependencies]\n"number#1" = []',
    						TypeError,
    						"Invalid extra name 'number#1'",
    						id="extra_invalid_c",
    						),
    				]
    		)
    def test_pep621_class_bad_config(
    		config: str,
    		expects: Type[Exception],
    		match: str,
    		tmp_pathplus: PathPlus,
    		):
    	(tmp_pathplus / "pyproject.toml").write_clean(config)
    
>   	with in_directory(tmp_pathplus), pytest.raises(expects, match=match):
E    AssertionError: Regex pattern "The value for 'project.name' is invalid." does not match "The value '???????12345=============☃' for 'project.name' is invalid.".

tests/test_config.py:322: AssertionError

and few similar cases.

Expected result:

Tests pass.

Reproduces how often:

Always.

Version

  • Operating System: ALT Workstation K 10.1, with Sisyphus repository (01.10.2022).
  • Python: Python 3.10.7 (main, Sep 13 2022, 12:33:40) [GCC 12.1.1 20220518 (ALT Sisyphus 12.1.1-alt1)]
  • pyproject-parser: git checkout v0.7.0

Installation source

GitHub repository.

Other Additional Information:

It looks like an error in pytest.raises or in packaging (incompatible versions?). I think so because an BadConfigError exception leads to raise another one (AssertionError).

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.