commit 905da700793eb2a16d712ec4d759d3f179e6c0b4 Author: Harshad Sharma Date: Fri Jun 16 09:47:06 2017 +0530 Project skeleton with cookiecutter-pylibrary. diff --git a/.bumpversion.cfg b/.bumpversion.cfg new file mode 100644 index 0000000..9e69f86 --- /dev/null +++ b/.bumpversion.cfg @@ -0,0 +1,13 @@ +[bumpversion] +current_version = 0.1.0 +commit = True +tag = True + +[bumpversion:file:setup.py] + +[bumpversion:file:README.rst] + +[bumpversion:file:docs/conf.py] + +[bumpversion:file:src/qutescript/__init__.py] + diff --git a/.cookiecutterrc b/.cookiecutterrc new file mode 100644 index 0000000..efc866a --- /dev/null +++ b/.cookiecutterrc @@ -0,0 +1,49 @@ +# This file exists so you can easily regenerate your project. +# +# `cookiepatcher` is a convenient shim around `cookiecutter` +# for regenerating projects (it will generate a .cookiecutterrc +# automatically for any template). To use it: +# +# pip install cookiepatcher +# cookiepatcher gh:ionelmc/cookiecutter-pylibrary project-path +# +# See: +# https://pypi.python.org/pypi/cookiepatcher +# +# Alternatively, you can run: +# +# cookiecutter --overwrite-if-exists --config-file=project-path/.cookiecutterrc gh:ionelmc/cookiecutter-pylibrary + +default_context: + + appveyor: 'no' + c_extension_cython: 'no' + c_extension_optional: 'no' + c_extension_support: 'no' + codacy: 'no' + codeclimate: 'no' + codecov: 'no' + command_line_interface: 'argparse' + command_line_interface_bin_name: 'qutescript' + coveralls: 'no' + distribution_name: 'qutescript' + email: 'harshad@sharma.io' + full_name: 'Harshad Sharma' + github_username: 'hiway' + landscape: 'no' + package_name: 'qutescript' + project_name: 'qutescript' + project_short_description: 'Painless userscripts for qutebrowser.' + release_date: 'today' + repo_name: 'python-qutescript' + requiresio: 'no' + scrutinizer: 'no' + sphinx_doctest: 'no' + sphinx_theme: 'sphinx-rtd-theme' + test_matrix_configurator: 'no' + test_matrix_separate_coverage: 'no' + test_runner: 'pytest' + travis: 'yes' + version: '0.1.0' + website: 'https://github.com/hiway/' + year: 'now' diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..74081a4 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,16 @@ +[paths] +source = + src/qutescript + */site-packages/qutescript + +[run] +branch = true +source = + qutescript + tests +parallel = true + +[report] +show_missing = true +precision = 2 +omit = *migrations* diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4000618 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# see http://editorconfig.org +root = true + +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 4 +charset = utf-8 + +[*.{bat,cmd,ps1}] +end_of_line = crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a74475a --- /dev/null +++ b/.gitignore @@ -0,0 +1,64 @@ +*.py[cod] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +.eggs +parts +bin +var +sdist +wheelhouse +develop-eggs +.installed.cfg +lib +lib64 +venv*/ +pyvenv*/ + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +.coverage.* +nosetests.xml +coverage.xml +htmlcov + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject +.idea +*.iml +*.komodoproject + +# Complexity +output/*.html +output/*/index.html + +# Sphinx +docs/_build + +.DS_Store +*~ +.*.sw[po] +.build +.ve +.env +.cache +.pytest +.bootstrap +.appveyor.token +*.bak diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1a9adea --- /dev/null +++ b/.travis.yml @@ -0,0 +1,49 @@ +language: python +sudo: false +cache: pip +env: + global: + - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so + - SEGFAULT_SIGNALS=all + matrix: + - TOXENV=check + - TOXENV=docs +matrix: + include: + - python: '2.7' + env: + - TOXENV=py27,report + - python: '3.3' + env: + - TOXENV=py33,report + - python: '3.4' + env: + - TOXENV=py34,report + - python: '3.5' + env: + - TOXENV=py35,report + - python: '3.6' + env: + - TOXENV=py36,report + - python: 'pypy-5.4' + env: + - TOXENV=pypy,report +before_install: + - python --version + - uname -a + - lsb_release -a +install: + - pip install tox + - virtualenv --version + - easy_install --version + - pip --version + - tox --version +script: + - tox -v +after_failure: + - more .tox/log/* | cat + - more .tox/*/log/* | cat +notifications: + email: + on_success: never + on_failure: always diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..03d1d07 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,5 @@ + +Authors +======= + +* Harshad Sharma - https://github.com/hiway/ diff --git a/CHANGELOG.rst b/CHANGELOG.rst new file mode 100644 index 0000000..77bd986 --- /dev/null +++ b/CHANGELOG.rst @@ -0,0 +1,8 @@ + +Changelog +========= + +0.1.0 (2017-06-16) +------------------ + +* First release on PyPI. diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000..2c254be --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,90 @@ +============ +Contributing +============ + +Contributions are welcome, and they are greatly appreciated! Every +little bit helps, and credit will always be given. + +Bug reports +=========== + +When `reporting a bug `_ please include: + + * Your operating system name and version. + * Any details about your local setup that might be helpful in troubleshooting. + * Detailed steps to reproduce the bug. + +Documentation improvements +========================== + +qutescript could always use more documentation, whether as part of the +official qutescript docs, in docstrings, or even on the web in blog posts, +articles, and such. + +Feature requests and feedback +============================= + +The best way to send feedback is to file an issue at https://github.com/hiway/python-qutescript/issues. + +If you are proposing a feature: + +* Explain in detail how it would work. +* Keep the scope as narrow as possible, to make it easier to implement. +* Remember that this is a volunteer-driven project, and that code contributions are welcome :) + +Development +=========== + +To set up `python-qutescript` for local development: + +1. Fork `python-qutescript `_ + (look for the "Fork" button). +2. Clone your fork locally:: + + git clone git@github.com:your_name_here/python-qutescript.git + +3. Create a branch for local development:: + + git checkout -b name-of-your-bugfix-or-feature + + Now you can make your changes locally. + +4. When you're done making changes, run all the checks, doc builder and spell checker with `tox `_ one command:: + + tox + +5. Commit your changes and push your branch to GitHub:: + + git add . + git commit -m "Your detailed description of your changes." + git push origin name-of-your-bugfix-or-feature + +6. Submit a pull request through the GitHub website. + +Pull Request Guidelines +----------------------- + +If you need some code review or feedback while you're developing the code just make the pull request. + +For merging, you should: + +1. Include passing tests (run ``tox``) [1]_. +2. Update documentation when there's new API, functionality etc. +3. Add a note to ``CHANGELOG.rst`` about the changes. +4. Add yourself to ``AUTHORS.rst``. + +.. [1] If you don't have all the necessary python versions available locally you can rely on Travis - it will + `run the tests `_ for each change you add in the pull request. + + It will be slower though ... + +Tips +---- + +To run a subset of tests:: + + tox -e envname -- py.test -k test_myfeature + +To run all the test environments in *parallel* (you need to ``pip install detox``):: + + detox diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..569acd0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017, Harshad Sharma +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..92351c4 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,21 @@ +graft docs +graft examples +graft src +graft ci +graft tests + +include .bumpversion.cfg +include .coveragerc +include .cookiecutterrc +include .editorconfig +include .isort.cfg + +include AUTHORS.rst +include CHANGELOG.rst +include CONTRIBUTING.rst +include LICENSE +include README.rst + +include tox.ini .travis.yml appveyor.yml + +global-exclude *.py[cod] __pycache__ *.so *.dylib diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..8f6179e --- /dev/null +++ b/README.rst @@ -0,0 +1,88 @@ +======== +Overview +======== + +.. start-badges + +.. list-table:: + :stub-columns: 1 + + * - docs + - |docs| + * - tests + - | |travis| + | + * - package + - | |version| |wheel| |supported-versions| |supported-implementations| + | |commits-since| + +.. |docs| image:: https://readthedocs.org/projects/python-qutescript/badge/?style=flat + :target: https://readthedocs.org/projects/python-qutescript + :alt: Documentation Status + +.. |travis| image:: https://travis-ci.org/hiway/python-qutescript.svg?branch=master + :alt: Travis-CI Build Status + :target: https://travis-ci.org/hiway/python-qutescript + +.. |version| image:: https://img.shields.io/pypi/v/qutescript.svg + :alt: PyPI Package latest release + :target: https://pypi.python.org/pypi/qutescript + +.. |commits-since| image:: https://img.shields.io/github/commits-since/hiway/python-qutescript/v0.1.0.svg + :alt: Commits since latest release + :target: https://github.com/hiway/python-qutescript/compare/v0.1.0...master + +.. |wheel| image:: https://img.shields.io/pypi/wheel/qutescript.svg + :alt: PyPI Wheel + :target: https://pypi.python.org/pypi/qutescript + +.. |supported-versions| image:: https://img.shields.io/pypi/pyversions/qutescript.svg + :alt: Supported versions + :target: https://pypi.python.org/pypi/qutescript + +.. |supported-implementations| image:: https://img.shields.io/pypi/implementation/qutescript.svg + :alt: Supported implementations + :target: https://pypi.python.org/pypi/qutescript + + +.. end-badges + +Painless userscripts for qutebrowser. + +* Free software: BSD license + +Installation +============ + +:: + + pip install qutescript + +Documentation +============= + +https://python-qutescript.readthedocs.io/ + +Development +=========== + +To run the all tests run:: + + tox + +Note, to combine the coverage data from all the tox environments run: + +.. list-table:: + :widths: 10 90 + :stub-columns: 1 + + - - Windows + - :: + + set PYTEST_ADDOPTS=--cov-append + tox + + - - Other + - :: + + PYTEST_ADDOPTS=--cov-append tox diff --git a/ci/bootstrap.py b/ci/bootstrap.py new file mode 100755 index 0000000..e5292aa --- /dev/null +++ b/ci/bootstrap.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, print_function, unicode_literals + +import os +import sys +from os.path import abspath +from os.path import dirname +from os.path import exists +from os.path import join + + +if __name__ == "__main__": + base_path = dirname(dirname(abspath(__file__))) + print("Project path: {0}".format(base_path)) + env_path = join(base_path, ".tox", "bootstrap") + if sys.platform == "win32": + bin_path = join(env_path, "Scripts") + else: + bin_path = join(env_path, "bin") + if not exists(env_path): + import subprocess + + print("Making bootstrap env in: {0} ...".format(env_path)) + try: + subprocess.check_call(["virtualenv", env_path]) + except subprocess.CalledProcessError: + subprocess.check_call([sys.executable, "-m", "virtualenv", env_path]) + print("Installing `jinja2` into bootstrap environment...") + subprocess.check_call([join(bin_path, "pip"), "install", "jinja2"]) + activate = join(bin_path, "activate_this.py") + # noinspection PyCompatibility + exec(compile(open(activate, "rb").read(), activate, "exec"), dict(__file__=activate)) + + import jinja2 + + import subprocess + + jinja = jinja2.Environment( + loader=jinja2.FileSystemLoader(join(base_path, "ci", "templates")), + trim_blocks=True, + lstrip_blocks=True, + keep_trailing_newline=True + ) + + tox_environments = [ + line.strip() + # WARNING: 'tox' must be installed globally or in the project's virtualenv + for line in subprocess.check_output(['tox', '--listenvs'], universal_newlines=True).splitlines() + ] + tox_environments = [line for line in tox_environments if line not in ['clean', 'report', 'docs', 'check']] + + for name in os.listdir(join("ci", "templates")): + with open(join(base_path, name), "w") as fh: + fh.write(jinja.get_template(name).render(tox_environments=tox_environments)) + print("Wrote {}".format(name)) + print("DONE.") diff --git a/ci/templates/.travis.yml b/ci/templates/.travis.yml new file mode 100644 index 0000000..7006bdd --- /dev/null +++ b/ci/templates/.travis.yml @@ -0,0 +1,36 @@ +language: python +sudo: false +cache: pip +env: + global: + - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so + - SEGFAULT_SIGNALS=all + matrix: + - TOXENV=check + - TOXENV=docs +matrix: + include: +{%- for env in tox_environments %}{{ '' }} + - python: '{{ '{0[0]}-5.4'.format(env.split('-')) if env.startswith('pypy') else '{0[2]}.{0[3]}'.format(env) }}' + env: + - TOXENV={{ env }},report +{%- endfor %}{{ '' }} +before_install: + - python --version + - uname -a + - lsb_release -a +install: + - pip install tox + - virtualenv --version + - easy_install --version + - pip --version + - tox --version +script: + - tox -v +after_failure: + - more .tox/log/* | cat + - more .tox/*/log/* | cat +notifications: + email: + on_success: never + on_failure: always diff --git a/docs/authors.rst b/docs/authors.rst new file mode 100644 index 0000000..e122f91 --- /dev/null +++ b/docs/authors.rst @@ -0,0 +1 @@ +.. include:: ../AUTHORS.rst diff --git a/docs/changelog.rst b/docs/changelog.rst new file mode 100644 index 0000000..565b052 --- /dev/null +++ b/docs/changelog.rst @@ -0,0 +1 @@ +.. include:: ../CHANGELOG.rst diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..2ce3c88 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import os + + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.coverage', + 'sphinx.ext.doctest', + 'sphinx.ext.extlinks', + 'sphinx.ext.ifconfig', + 'sphinx.ext.napoleon', + 'sphinx.ext.todo', + 'sphinx.ext.viewcode', +] +if os.getenv('SPELLCHECK'): + extensions += 'sphinxcontrib.spelling', + spelling_show_suggestions = True + spelling_lang = 'en_US' + +source_suffix = '.rst' +master_doc = 'index' +project = 'qutescript' +year = '2017' +author = 'Harshad Sharma' +copyright = '{0}, {1}'.format(year, author) +version = release = '0.1.0' + +pygments_style = 'trac' +templates_path = ['.'] +extlinks = { + 'issue': ('https://github.com/hiway/python-qutescript/issues/%s', '#'), + 'pr': ('https://github.com/hiway/python-qutescript/pull/%s', 'PR #'), +} +# on_rtd is whether we are on readthedocs.org +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + +if not on_rtd: # only set the theme if we're building docs locally + html_theme = 'sphinx_rtd_theme' + +html_use_smartypants = True +html_last_updated_fmt = '%b %d, %Y' +html_split_index = False +html_sidebars = { + '**': ['searchbox.html', 'globaltoc.html', 'sourcelink.html'], +} +html_short_title = '%s-%s' % (project, version) + +napoleon_use_ivar = True +napoleon_use_rtype = False +napoleon_use_param = False diff --git a/docs/contributing.rst b/docs/contributing.rst new file mode 100644 index 0000000..e582053 --- /dev/null +++ b/docs/contributing.rst @@ -0,0 +1 @@ +.. include:: ../CONTRIBUTING.rst diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..40f35b5 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,22 @@ +======== +Contents +======== + +.. toctree:: + :maxdepth: 2 + + readme + installation + usage + reference/index + contributing + authors + changelog + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..a9abcc2 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,7 @@ +============ +Installation +============ + +At the command line:: + + pip install qutescript diff --git a/docs/readme.rst b/docs/readme.rst new file mode 100644 index 0000000..72a3355 --- /dev/null +++ b/docs/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst diff --git a/docs/reference/index.rst b/docs/reference/index.rst new file mode 100644 index 0000000..00bf841 --- /dev/null +++ b/docs/reference/index.rst @@ -0,0 +1,7 @@ +Reference +========= + +.. toctree:: + :glob: + + qutescript* diff --git a/docs/reference/qutescript.rst b/docs/reference/qutescript.rst new file mode 100644 index 0000000..6686d81 --- /dev/null +++ b/docs/reference/qutescript.rst @@ -0,0 +1,9 @@ +qutescript +========== + +.. testsetup:: + + from qutescript import * + +.. automodule:: qutescript + :members: diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..8a8a404 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +sphinx>=1.3 +sphinx-rtd-theme +-e . diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt new file mode 100644 index 0000000..f95eb78 --- /dev/null +++ b/docs/spelling_wordlist.txt @@ -0,0 +1,11 @@ +builtin +builtins +classmethod +staticmethod +classmethods +staticmethods +args +kwargs +callstack +Changelog +Indices diff --git a/docs/usage.rst b/docs/usage.rst new file mode 100644 index 0000000..b4ccf6c --- /dev/null +++ b/docs/usage.rst @@ -0,0 +1,7 @@ +===== +Usage +===== + +To use qutescript in a project:: + + import qutescript diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..690ebac --- /dev/null +++ b/setup.cfg @@ -0,0 +1,35 @@ +[bdist_wheel] +universal = 1 + +[flake8] +max-line-length = 140 +exclude = tests/*,*/migrations/*,*/south_migrations/* + +[tool:pytest] +norecursedirs = + .git + .tox + .env + dist + build + south_migrations + migrations +python_files = + test_*.py + *_test.py + tests.py +addopts = + -rxEfsw + --strict + --doctest-modules + --doctest-glob=\*.rst + --tb=short + +[isort] +force_single_line = True +line_length = 120 +known_first_party = qutescript +default_section = THIRDPARTY +forced_separate = test_qutescript +not_skip = __init__.py +skip = migrations, south_migrations diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..6ecb45e --- /dev/null +++ b/setup.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- +from __future__ import absolute_import +from __future__ import print_function + +import io +import re +from glob import glob +from os.path import basename +from os.path import dirname +from os.path import join +from os.path import splitext + +from setuptools import find_packages +from setuptools import setup + + +def read(*names, **kwargs): + return io.open( + join(dirname(__file__), *names), + encoding=kwargs.get('encoding', 'utf8') + ).read() + + +setup( + name='qutescript', + version='0.1.0', + license='BSD', + description='Painless userscripts for qutebrowser.', + long_description='%s\n%s' % ( + re.compile('^.. start-badges.*^.. end-badges', re.M | re.S).sub('', read('README.rst')), + re.sub(':[a-z]+:`~?(.*?)`', r'``\1``', read('CHANGELOG.rst')) + ), + author='Harshad Sharma', + author_email='harshad@sharma.io', + url='https://github.com/hiway/python-qutescript', + packages=find_packages('src'), + package_dir={'': 'src'}, + py_modules=[splitext(basename(path))[0] for path in glob('src/*.py')], + include_package_data=True, + zip_safe=False, + classifiers=[ + # complete classifier list: http://pypi.python.org/pypi?%3Aaction=list_classifiers + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Operating System :: Unix', + 'Operating System :: POSIX', + 'Operating System :: Microsoft :: Windows', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + # uncomment if you test on these interpreters: + # 'Programming Language :: Python :: Implementation :: IronPython', + # 'Programming Language :: Python :: Implementation :: Jython', + # 'Programming Language :: Python :: Implementation :: Stackless', + 'Topic :: Utilities', + ], + keywords=[ + # eg: 'keyword1', 'keyword2', 'keyword3', + ], + install_requires=[ + # eg: 'aspectlib==1.1.1', 'six>=1.7', + ], + extras_require={ + # eg: + # 'rst': ['docutils>=0.11'], + # ':python_version=="2.6"': ['argparse'], + }, + entry_points={ + 'console_scripts': [ + 'qutescript = qutescript.cli:main', + ] + }, +) diff --git a/src/qutescript/__init__.py b/src/qutescript/__init__.py new file mode 100644 index 0000000..3dc1f76 --- /dev/null +++ b/src/qutescript/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/src/qutescript/__main__.py b/src/qutescript/__main__.py new file mode 100644 index 0000000..5b90587 --- /dev/null +++ b/src/qutescript/__main__.py @@ -0,0 +1,14 @@ +""" +Entrypoint module, in case you use `python -mqutescript`. + + +Why does this file exist, and why __main__? For more info, read: + +- https://www.python.org/dev/peps/pep-0338/ +- https://docs.python.org/2/using/cmdline.html#cmdoption-m +- https://docs.python.org/3/using/cmdline.html#cmdoption-m +""" +from qutescript.cli import main + +if __name__ == "__main__": + main() diff --git a/src/qutescript/cli.py b/src/qutescript/cli.py new file mode 100644 index 0000000..8a58ffa --- /dev/null +++ b/src/qutescript/cli.py @@ -0,0 +1,27 @@ +""" +Module that contains the command line app. + +Why does this file exist, and why not put this in __main__? + + You might be tempted to import things from __main__ later, but that will cause + problems: the code will get executed twice: + + - When you run `python -mqutescript` python will execute + ``__main__.py`` as a script. That means there won't be any + ``qutescript.__main__`` in ``sys.modules``. + - When you import __main__ it will get executed again (as a module) because + there's no ``qutescript.__main__`` in ``sys.modules``. + + Also see (1) from http://click.pocoo.org/5/setuptools/#setuptools-integration +""" +import argparse + + +parser = argparse.ArgumentParser(description='Command description.') +parser.add_argument('names', metavar='NAME', nargs=argparse.ZERO_OR_MORE, + help="A name of something.") + + +def main(args=None): + args = parser.parse_args(args=args) + print(args.names) diff --git a/tests/test_qutescript.py b/tests/test_qutescript.py new file mode 100644 index 0000000..a047b9d --- /dev/null +++ b/tests/test_qutescript.py @@ -0,0 +1,6 @@ + +from qutescript.cli import main + + +def test_main(): + main([]) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..508a01a --- /dev/null +++ b/tox.ini @@ -0,0 +1,104 @@ +; a generative tox configuration, see: https://testrun.org/tox/latest/config.html#generative-envlist + +[tox] +envlist = + clean, + check, + {py27,py33,py34,py35,py36,pypy}, + report, + docs + +[testenv] +basepython = + pypy: {env:TOXPYTHON:pypy} + {py27,docs,spell}: {env:TOXPYTHON:python2.7} + py33: {env:TOXPYTHON:python3.3} + py34: {env:TOXPYTHON:python3.4} + py35: {env:TOXPYTHON:python3.5} + py36: {env:TOXPYTHON:python3.6} + {bootstrap,clean,check,report,coveralls,codecov}: {env:TOXPYTHON:python3} +setenv = + PYTHONPATH={toxinidir}/tests + PYTHONUNBUFFERED=yes +passenv = + * +usedevelop = false +deps = + pytest + pytest-travis-fold + pytest-cov +commands = + {posargs:py.test --cov --cov-report=term-missing -vv tests} + +[testenv:bootstrap] +deps = + jinja2 + matrix +skip_install = true +commands = + python ci/bootstrap.py +passenv = + * + +[testenv:spell] +setenv = + SPELLCHECK=1 +commands = + sphinx-build -b spelling docs dist/docs +skip_install = true +deps = + -r{toxinidir}/docs/requirements.txt + sphinxcontrib-spelling + pyenchant + +[testenv:docs] +deps = + -r{toxinidir}/docs/requirements.txt +commands = + sphinx-build {posargs:-E} -b html docs dist/docs + sphinx-build -b linkcheck docs dist/docs + +[testenv:check] +deps = + docutils + check-manifest + flake8 + readme-renderer + pygments + isort +skip_install = true +commands = + python setup.py check --strict --metadata --restructuredtext + check-manifest {toxinidir} + flake8 src tests setup.py + isort --verbose --check-only --diff --recursive src tests setup.py + +[testenv:coveralls] +deps = + coveralls +skip_install = true +commands = + coveralls [] + +[testenv:codecov] +deps = + codecov +skip_install = true +commands = + coverage xml --ignore-errors + codecov [] + + +[testenv:report] +deps = coverage +skip_install = true +commands = + coverage combine --append + coverage report + coverage html + +[testenv:clean] +commands = coverage erase +skip_install = true +deps = coverage +