Giter Club home page Giter Club logo

pytest-flakes's Introduction

pytest-flakes

py.test plugin for efficiently checking python source with pyflakes.

Usage

install via:

pip install pytest-flakes

if you then type:

py.test --flakes

every file ending in .py will be discovered and run through pyflakes, starting from the command line arguments.

Simple usage example

Consider you have this code:

# content of module.py

import os
from os.path import *

def some_function():
    pass

Running it with pytest-flakes installed shows two issues:

$ py.test -q --flakes
F
================================= FAILURES =================================
______________________________ pyflakes-check ______________________________
/tmp/doc-exec-685/module.py:2: UnusedImport
'os' imported but unused
/tmp/doc-exec-685/module.py:3: ImportStarUsed
'from os.path import *' used; unable to detect undefined names
1 failed in 0.00 seconds

These are only two of the many issues that pytest-flakes can find.

Configuring pyflakes options per project and file

You may configure pyflakes-checking options for your project by adding an flakes-ignore entry to your setup.cfg or pytest.ini file like this:

# content of setup.cfg
[pytest]
flakes-ignore = ImportStarUsed

This would globally prevent complaints about star imports. Rerunning with the above example will now look better:

$ py.test -q --flakes
F
================================= FAILURES =================================
_________________ pyflakes-check(ignoring ImportStarUsed) __________________
/tmp/doc-exec-685/module.py:2: UnusedImport
'os' imported but unused
1 failed in 0.00 seconds

But of course we still would want to delete the import os line to have a clean pass.

If you have some files where you want to specifically ignore some errors or warnings you can start a flakes-ignore line with a glob-pattern and a space-separated list of codes:

# content of setup.cfg
[pytest]
flakes-ignore =
    *.py UnusedImport
    doc/conf.py ALL

Ignoring certain lines in files

You can ignore errors per line by appending special comments to them like this:

import sys # noqa
app # pragma: no flakes

Running pyflakes checks and no other tests

You can restrict your test run to only perform "flakes" tests and not any other tests by typing:

py.test --flakes -m flakes

This will only run tests that are marked with the "flakes" keyword which is added for the flakes test items added by this plugin.

If you are using pytest < 2.4, then use the following invocation to the same effect:

py.test --flakes -k flakes

Notes

The repository of this plugin is at https://github.com/asmeurer/pytest-flakes

For more info on py.test see http://pytest.org

The code is partially based on Ronny Pfannschmidt's pytest-codecheckers plugin and Holger Krekel's pytest-pep8.

Changes

4.0.5 - 2021-12-02

  • Further fixes for deprecations in the upcoming pytest 7.0. [nicoddemus]

4.0.4 - 2021-10-26

  • Fix pytest-flakes for deprecations in the upcoming pytest 7.0. [bluetech]
  • Fix the pytest-flakes test suite in Python 3.10. [bluetech]
  • Replace Travis CI with GitHub Actions. [bluetech]

4.0.3 - 2020-11-27

  • Future proof some code against future versions of pytest. [RonnyPfannschmidt]

4.0.2 - 2020-09-18

  • Fix calling pytest --flakes directly on an __init__.py file. [akeeman]

4.0.1 - 2020-07-28

  • Maintenance of pytest-flakes has moved from fschulze to asmeurer. The repo for pytest-flakes is now at https://github.com/asmeurer/pytest-flakes/
  • Fix test failures. [asmeurer]
  • Fix deprecation warnings from pytest. [asmeurer]
  • Fix invalid escape sequences. [akeeman]

4.0.0 - 2018-08-01

  • Require pytest >= 2.8.0 and remove pytest-cache requirement. Cache is included in pytest since that version. [smarlowucf (Sean Marlow)]

3.0.2 - 2018-05-16

  • Fix typo in name of flakes marker. [fschulze]

3.0.1 - 2018-05-16

  • Always register flakes marker, not only when the --flakes option is used. [fschulze]

3.0.0 - 2018-05-16

  • Drop support for Python 3.3. It still works so far, but isn't tested anymore. [fschulze]
  • Add flakes marker required since pytest 3.1. [fschulze]
  • Use pyflakes.api.isPythonFile to detect Python files. This might test more files than before and thus could cause previously uncaught failures. [asmeurer (Aaron Meurer)]

2.0.0 - 2017-05-12

  • Dropped support/testing for Python 2.5, 2.6, 3.2. [fschulze]
  • Added testing for Python 3.6. [fschulze]
  • Fixed some packaging and metadata errors. [fladi (Michael Fladischer), fschulze]

1.0.1 - 2015-09-17

  • Compatibility with upcoming pytest. [RonnyPfannschmidt (Ronny Pfannschmidt)]

1.0.0 - 2015-05-01

  • Fix issue #6 - support PEP263 for source file encoding. [The-Compiler (Florian Bruhin), fschulze]
  • Clarified license to be MIT like pytest-pep8 from which this is derived. [fschulze]

0.2 - 2013-02-11

  • Adapt to pytest-2.4.2 using add_marker() API. [fschulze, hpk42 (Holger Krekel)]
  • Allow errors to be skipped per line by appending # noqa or # pragma: no flakes [fschulze, silviot (Silvio Tomatis)]
  • Python 3.x compatibility. [fschulze, encukou (Petr Viktorin)]

0.1 - 2013-02-04

  • Initial release. [fschulze (Florian Schulze)]

pytest-flakes's People

Contributors

akeeman avatar asmeurer avatar bluetech avatar fladi avatar fschulze avatar hpk42 avatar hugovk avatar jayvdb avatar nicoddemus avatar ronnypfannschmidt avatar silviot avatar smarlowucf 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

pytest-flakes's Issues

PytestDeprecationWarning printed with every test run

Every time I run my tests with pytest-flakes, I get the following deprecation warning:

/Users/aaronmeurer/anaconda3/lib/python3.7/site-packages/pytest_flakes.py:51
  /Users/aaronmeurer/anaconda3/lib/python3.7/site-packages/pytest_flakes.py:51: PytestDeprecationWarning: direct construction of FlakesItem has been deprecated, please use FlakesItem.from_parent
    return FlakesItem(path, parent, flakes_ignore)

It looks like it should be easy to fix.

Failure installing since 4.0.2 release

Since the 4.0.2 release (within the last hour) I'm having installation failures.

The following is happening both in my TravisCI builds, as well as on my local Linux machine with Python 3.8.3 and pip 20.1.1:

$ pip install pytest-flakes==4.0.2
Collecting pytest-flakes==4.0.2
  Downloading pytest_flakes-4.0.2-py2.py3-none-any.whl (10 kB)
ERROR: pytest-flakes has an invalid wheel, multiple .dist-info directories found: pytest_flakes-4.0.1.dist-info, pytest_flakes-4.0.2.dist-info

Seemingly broken with pytest 3.7.0

================================================ test session starts =================================================
platform darwin -- Python 3.6.3, pytest-3.7.0, py-1.5.2, pluggy-0.7.1
Django settings: settings (from environment variable)
rootdir: /Users/sigmavirus24/work/workproject, inifile: pytest.ini
plugins: tap-2.2, flakes-3.0.2, django-3.3.3, asyncio-0.9.0
collected 0 items / 1 errors

======================================================= ERRORS =======================================================
_________________________________________________ ERROR collecting  __________________________________________________
../../.virtualenvs/workproject/lib/python3.6/site-packages/_pytest/runner.py:201: in __init__
    self.result = func()
../../.virtualenvs/workproject/lib/python3.6/site-packages/_pytest/runner.py:261: in <lambda>
    call = CallInfo(lambda: list(collector.collect()), "collect")
../../.virtualenvs/workproject/lib/python3.6/site-packages/_pytest/main.py:475: in collect
    for x in self._collect(arg):
../../.virtualenvs/workproject/lib/python3.6/site-packages/_pytest/main.py:505: in _collect
    col = root._collectfile(pkginit)
E   AttributeError: 'FlakesItem' object has no attribute '_collectfile'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
============================================== 1 error in 0.72 seconds ===============================================

This works fine with pytest 3.6.3

pytest 3.7.0 regression?

Hi,

After upgrading to the 3.7.0 (or 3.7.1) pytest I've got the following CollectError:

ERROR at setup of pyflakes-check(ignoring ImportStarUsed UnusedImport) 
...
E           CollectError: ImportError while importing test module '/Users/user/someproject/somefile.py'
...
E               from env import (  # noqa
E           E   ImportError: No module named env

Yes, this is a file which supposed to be working only in prod environment and on localhost it will have ImportError. pytest-flakes was working totally fine on this file before updating pytest to 3.7.0.

Drop support for older versions of Python and pytest

I didn't want to mess with too many changes at once in #29, but we should drop support for Python 2 and Python 3.4, and older versions of pytest. I'd say we should require at least pytest >=5 so that we don't need to have the hasattr('from_parent') check.

Python3 compatibility issue

I am trying to make some library of mine Python2/3 compatbile. For testing I use pytest with your flakes extension. Thanks for this.

With Python 2.7 the test run fine:

# python2 setup.py test
running pytest
running egg_info
writing pmatic.egg-info/PKG-INFO
writing top-level names to pmatic.egg-info/top_level.txt
writing dependency_links to pmatic.egg-info/dependency_links.txt
reading manifest file 'pmatic.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'pmatic.egg-info/SOURCES.txt'
running build_ext
================================================================= test session starts =================================================================
platform linux2 -- Python 2.7.9 -- py-1.4.25 -- pytest-2.6.3
plugins: cache, flakes
collected 34 items

setup.py s
update-file-headers.py s
examples/list_available_methods.py s
examples/list_rooms.py s
examples/list_shutter_contact_states.py s
examples/switch_off_all_lamps.py s
examples/switch_on_single_power_switch.py s
examples/lowlevel_api/list_shutter_contact_states.py s
pmatic/__init__.py s
pmatic/entities.py s
pmatic/utils.py s
pmatic/api/__init__.py s
pmatic/api/abstract.py s
pmatic/api/local.py s
pmatic/api/remote.py s
tests/TestAPI.py s
tests/test_api.py s......
tests/test_entities.py s.....
tests/test_utils.py s....

================================================== 15 passed, 19 skipped, 1 warnings in 0.11 seconds =================================================

But with python3 there is an exception within pytest_flakes.py:

# python3 setup.py test
running pytest
running egg_info
writing pmatic.egg-info/PKG-INFO
writing top-level names to pmatic.egg-info/top_level.txt
writing dependency_links to pmatic.egg-info/dependency_links.txt
reading manifest file 'pmatic.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'pmatic.egg-info/SOURCES.txt'
running build_ext
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/usr/lib/python3/dist-packages/_pytest/main.py", line 80, in wrap_session
INTERNALERROR>     config.do_configure()
INTERNALERROR>   File "/usr/lib/python3/dist-packages/_pytest/config.py", line 618, in do_configure
INTERNALERROR>     self.hook.pytest_configure(config=self)
INTERNALERROR>   File "/usr/lib/python3/dist-packages/_pytest/core.py", line 413, in __call__
INTERNALERROR>     return self._docall(methods, kwargs)
INTERNALERROR>   File "/usr/lib/python3/dist-packages/_pytest/core.py", line 424, in _docall
INTERNALERROR>     res = mc.execute()
INTERNALERROR>   File "/usr/lib/python3/dist-packages/_pytest/core.py", line 315, in execute
INTERNALERROR>     res = method(**kwargs)
INTERNALERROR>   File "/root/git/pmatic/pytest_flakes-1.0.1-py3.4.egg/pytest_flakes.py", line 36, in pytest_configure
INTERNALERROR>     config._flakes = FlakesPlugin(config)
INTERNALERROR>   File "/root/git/pmatic/pytest_flakes-1.0.1-py3.4.egg/pytest_flakes.py", line 43, in __init__
INTERNALERROR>     self.mtimes = config.cache.get(HISTKEY, {})
INTERNALERROR> AttributeError: 'Config' object has no attribute 'cache'

I added these attributes to my setup.py:

    setup_requires=['pytest-runner'],
    tests_require=['pytest', 'pytest-flakes'],
)

And this is my pytest.ini:

[pytest]
testpaths = tests
addopts = --flakes
flakes-ignore =
    playground.py ALL

While collecting the information together I found a solution for the issue. When adding pytest-cache to the setup.py tests_require argument like this it works:

    tests_require=['pytest', 'pytest-flakes', 'pytest-cache'],

More PytestDeprecationWarnings: TerminalReporter.writer attribute is deprecated

Hi,

FYI, similar to #26:

[    3s] ============================= test session starts ==============================
[    3s] platform linux -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- /usr/bin/python3
[    3s] cachedir: .pytest_cache
[    3s] rootdir: /home/abuild/rpmbuild/BUILD/pytest-flakes-4.0.1, inifile: tox.ini
[    3s] plugins: flakes-4.0.1
[    3s] collecting ... collected 7 items
[    3s] 
...
[    3s] 
[    3s] =============================== warnings summary ===============================
[    3s] test_flakes.py::test_unused_import
[    3s] test_flakes.py::test_syntax_error
[    3s] test_flakes.py::test_noqa
[    3s] test_flakes.py::test_pep263
[    3s] test_flakes.py::test_non_py_ext
[    3s] test_flakes.py::test_flakesignore
[    3s]   /usr/lib/python3.8/site-packages/_pytest/compat.py:333: PytestDeprecationWarning: The TerminalReporter.writer attribute is deprecated, use TerminalReporter._tw instead at your own risk.
[    3s]   See https://docs.pytest.org/en/latest/deprecations.html#terminalreporter-writer for more information.
[    3s]     return getattr(object, name, default)

license?

Hi, I wouldn't mind using your project but unfortunately for me to do so, I'd need to know under which license it's licensed. Any chance to add a license doc to the sources?

error running a __init__.py only

I noticed there are a few caces involving __init__.py files and the flakes pytest plugin that result in the following error

$ pytest --flakes my_repo/__init__.py
=============================== test session starts ================================
platform linux -- Python 3.8.0, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: /path/to/my_repo, configfile: pyproject.toml
plugins: flakes-4.0.1
collected 0 items / 1 error                                                        

====================================== ERRORS ======================================
__________________________ ERROR collecting test session ___________________________
.venv/lib/python3.8/site-packages/_pytest/runner.py:294: in from_call
    result = func()  # type: Optional[_T]
.venv/lib/python3.8/site-packages/_pytest/runner.py:324: in <lambda>
    call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
.venv/lib/python3.8/site-packages/_pytest/main.py:576: in collect
    yield from self._collect(fspath, parts)
.venv/lib/python3.8/site-packages/_pytest/main.py:662: in _collect
    yield next(iter(m[0].collect()))
.venv/lib/python3.8/site-packages/_pytest/nodes.py:457: in collect
    raise NotImplementedError("abstract")
E   NotImplementedError: abstract
============================= short test summary info ==============================
ERROR  - NotImplementedError: abstract
!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!
================================= 1 error in 0.12s =================================

Test failures in master

It looks like there are test failures in master. I did a test Travis build on my fork at https://travis-ci.org/github/asmeurer/pytest-flakes.

The test failure looks like

______________________________ test_syntax_error _______________________________
testdir = <Testdir local('/tmp/pytest-of-travis/pytest-0/test_syntax_error0')>
    def test_syntax_error(testdir):
        testdir.makeini("""
    [pytest]
    python_files=check_*.py
    """)
        testdir.makepyfile("""
    for x in []
        pass
    """)
        result = testdir.runpytest("--flakes", "--ignore", testdir)
>       assert "1: invalid syntax" in result.stdout.str()
E       AssertionError: assert '1: invalid syntax' in ''
E        +  where '' = <bound method LineMatcher.str of <_pytest.pytester.LineMatcher object at 0x7f3e69cf66a0>>()
E        +    where <bound method LineMatcher.str of <_pytest.pytester.LineMatcher object at 0x7f3e69cf66a0>> = <_pytest.pytester.LineMatcher object at 0x7f3e69cf66a0>.str
E        +      where <_pytest.pytester.LineMatcher object at 0x7f3e69cf66a0> = <RunResult ret=ExitCode.INTERNAL_ERROR len(stdout.lines)=0 len(stderr.lines)=40 duration=0.01s>.stdout
/home/travis/build/asmeurer/pytest-flakes/test_flakes.py:24: AssertionError
----------------------------- Captured stderr call -----------------------------
Traceback (most recent call last):
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/pytester.py", line 932, in runpytest_inprocess
    reprec = self.inline_run(*args, **kwargs)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/pytester.py", line 898, in inline_run
    ret = pytest.main(list(args), plugins=plugins)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/__init__.py", line 105, in main
    config = _prepareconfig(args, plugins)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/__init__.py", line 258, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/pluggy/callers.py", line 203, in _multicall
    gen.send(outcome)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/helpconfig.py", line 90, in pytest_cmdline_parse
    config = outcome.get_result()
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/__init__.py", line 836, in pytest_cmdline_parse
    self.parse(args)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/__init__.py", line 1044, in parse
    self._preparse(args, addopts=addopts)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/__init__.py", line 980, in _preparse
    self._initini(args)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/__init__.py", line 903, in _initini
    args, namespace=copy.copy(self.option)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/argparsing.py", line 158, in parse_known_and_unknown_args
    return optparser.parse_known_args(strargs, namespace=namespace)
  File "/opt/python/3.6.7/lib/python3.6/argparse.py", line 1766, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/opt/python/3.6.7/lib/python3.6/argparse.py", line 1807, in _parse_known_args
    option_tuple = self._parse_optional(arg_string)
  File "/home/travis/build/asmeurer/pytest-flakes/.tox/py36/lib/python3.6/site-packages/_pytest/config/argparsing.py", line 427, in _parse_optional
    if not arg_string[0] in self.prefix_chars:
TypeError: 'Testdir' object does not support indexing

False report with PEP 484 type comment

If a code has PEP 484 type comment

from mod import SomeClass

a = b.get()   # type: SomeClass

pytest-flakes will mistakenly report that SomeClass is import but not used.

This report is not shown if running standalone pyflakes.

pyflakes explicitly says that it supports this case:

Mark names used in PEP 484 # type: ... comments as used

pytest-flakes doesn't respect PEP 263 encoding markers

I noticed pytest-flakes doesn't respect PEP 263 encoding markers.

This means with a non-UTF8 aware locale (e.g. LC_ALL=C) or with an OS which doesn't use UTF-8 by default (e.g. latin1 on Windows), files containing UTF-8 won't be checkable:

$ LC_ALL=C ./venv/bin/py.test --flakes snowman.py -rs
[...]
platform linux -- Python 3.4.3 -- py-1.4.27 -- pytest-2.7.1
[...]
venv/lib/python3.4/site-packages/pytest_flakes.py:75: in runtest
    found_errors, out = check_file(self.fspath, self.flakesignore)
venv/lib/python3.4/site-packages/pytest_flakes.py:124: in check_file
    codeString = path.read()
venv/lib/python3.4/site-packages/py/_path/common.py:133: in read
    return f.read()
venv/lib/python3.4/encodings/ascii.py:26: in decode
    return codecs.ascii_decode(input, self.errors)[0]
E   UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 29: ordinal not in range(128)

snowman.py:

# encoding=utf-8

snowman = "☃"

A normal flake8 snowman.py works fine.

This breaks pytest's tests with tox >= 2.0.0 as it isolates environment variables by default.

A possible fix would be to use tokenize.open:

--- pytest_flakes.py.ori    2015-05-22 07:46:50.005433885 +0200
+++ pytest_flakes.py    2015-05-22 07:47:35.018767377 +0200
@@ -4,6 +4,7 @@
 import py
 import pytest
 import sys
+import tokenize


 def assignment_monkeypatched_init(self, name, source):
@@ -121,7 +122,8 @@


 def check_file(path, flakesignore):
-    codeString = path.read()
+    with tokenize.open(str(path)) as f:
+        codeString = f.read()
     filename = py.builtin._totext(path)
     errors = []
     try:

That seems to fix it for Python 3 - but I haven't tested Python 2 yet. Maybe it's enough to just use normal reading there, or maybe tokenize.open has to be backported, like coverage.py did.

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.