Added boilerplate code for python
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
[bumpversion]
|
||||
current_version = 0.1.0
|
||||
commit = True
|
||||
tag = True
|
||||
|
||||
[bumpversion:file:setup.py]
|
||||
|
||||
[bumpversion:file:docs/conf.py]
|
||||
|
||||
[bumpversion:file:src/stockstack/__init__.py]
|
||||
@@ -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/cookiecutter
|
||||
#
|
||||
# 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: 'yes'
|
||||
codeclimate: 'yes'
|
||||
codecov: 'yes'
|
||||
command_line_interface: 'click'
|
||||
command_line_interface_bin_name: 'stockstack'
|
||||
coveralls: 'yes'
|
||||
distribution_name: 'stockstack'
|
||||
email: 'freemo@gmail.com'
|
||||
full_name: 'Jeffrey Phillips Freeman'
|
||||
github_username: 'stockstack'
|
||||
landscape: 'yes'
|
||||
package_name: 'stockstack'
|
||||
project_name: 'StockStack'
|
||||
project_short_description: 'StockStack reference implementation'
|
||||
release_date: '2016-3-19'
|
||||
repo_name: 'stockstack'
|
||||
requiresio: 'yes'
|
||||
scrutinizer: 'yes'
|
||||
sphinx_doctest: 'yes'
|
||||
sphinx_theme: 'sphinx-py3doc-enhanced-theme'
|
||||
test_matrix_configurator: 'yes'
|
||||
test_matrix_separate_coverage: 'yes'
|
||||
test_runner: 'pytest'
|
||||
travis: 'yes'
|
||||
version: '0.1.0'
|
||||
website: 'http://JeffreyFreeman.me'
|
||||
year: 'now'
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
[paths]
|
||||
source = src
|
||||
|
||||
[run]
|
||||
branch = true
|
||||
source =
|
||||
src
|
||||
tests
|
||||
parallel = true
|
||||
|
||||
[report]
|
||||
show_missing = true
|
||||
precision = 2
|
||||
omit = *migrations*
|
||||
@@ -0,0 +1 @@
|
||||
3.9.0
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
language: python
|
||||
python: '3.9'
|
||||
sudo: false
|
||||
env:
|
||||
global:
|
||||
- LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so
|
||||
- SEGFAULT_SIGNALS=all
|
||||
matrix:
|
||||
- TOXENV=check
|
||||
- TOXENV=docs
|
||||
|
||||
- TOXENV=2.7-cover,coveralls,codecov
|
||||
- TOXENV=2.7-nocov
|
||||
- TOXENV=3.3-cover,coveralls,codecov
|
||||
- TOXENV=3.3-nocov
|
||||
- TOXENV=3.4-cover,coveralls,codecov
|
||||
- TOXENV=3.4-nocov
|
||||
- TOXENV=3.5-cover,coveralls,codecov
|
||||
- TOXENV=3.5-nocov
|
||||
- TOXENV=pypy-cover,coveralls,codecov
|
||||
- TOXENV=pypy-nocov
|
||||
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
|
||||
before_cache:
|
||||
- rm -rf $HOME/.cache/pip/log
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cache/pip
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
||||
on_failure: always
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
FROM python:3
|
||||
|
||||
LABEL maintainer="Jeffrey Phillips Freeman jeffrey.freeman@cleverthis.com"
|
||||
|
||||
ENV PYENV_ROOT="/.pyenv" \
|
||||
PATH="/.pyenv/bin:/.pyenv/shims:$PATH"
|
||||
|
||||
RUN curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
|
||||
|
||||
RUN apt update -y && \
|
||||
apt-get upgrade -y && \
|
||||
apt-get dist-upgrade -y && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
libssl-dev \
|
||||
libreadline-gplv2-dev \
|
||||
libncursesw5-dev \
|
||||
libssl-dev \
|
||||
libsqlite3-dev \
|
||||
tk-dev \
|
||||
libgdbm-dev \
|
||||
libc6-dev \
|
||||
libbz2-dev \
|
||||
nano && \
|
||||
apt-get clean && \
|
||||
rm -r /var/lib/apt/lists/*
|
||||
|
||||
#RUN pyenv install 2.7.18 && \
|
||||
# pyenv install 3.3.7 && \
|
||||
# pyenv install 3.4.10 && \
|
||||
# pyenv install 3.5.10 && \
|
||||
# pyenv install 3.9.0 && \
|
||||
# pyenv install pypy-5.7.1
|
||||
|
||||
RUN pyenv install 3.9.0 && \
|
||||
pyenv install 2.7.18 && \
|
||||
pyenv global 2.7.18 && \
|
||||
pyenv global 3.9.0
|
||||
RUN /.pyenv/versions/3.9.0/bin/python3.9 -m pip install --upgrade pip
|
||||
RUN pip install tox
|
||||
|
||||
RUN mkdir -p /usr/src/boilerplate && \
|
||||
chmod a+rwx -R /usr/src/boilerplate && \
|
||||
mkdir /.cache && \
|
||||
chmod a+rwx /.cache && \
|
||||
mkdir /.tox && \
|
||||
chmod a+rwx /.tox
|
||||
|
||||
VOLUME /usr/src/boilerplate
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
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
|
||||
|
||||
include docker-compose.yml
|
||||
include Dockerfile
|
||||
include .python-version
|
||||
|
||||
global-exclude *.py[cod] __pycache__ *.so *.dylib
|
||||
Executable
+65
@@ -0,0 +1,65 @@
|
||||
#!/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` and `matrix` into bootstrap environment...")
|
||||
subprocess.check_call([join(bin_path, "pip"), "install", "jinja2", "matrix"])
|
||||
activate = join(bin_path, "activate_this.py")
|
||||
# noinspection PyCompatibility
|
||||
exec(compile(open(activate, "rb").read(), activate, "exec"), dict(__file__=activate))
|
||||
|
||||
import jinja2
|
||||
|
||||
import matrix
|
||||
|
||||
jinja = jinja2.Environment(
|
||||
loader=jinja2.FileSystemLoader(join(base_path, "ci", "templates")),
|
||||
trim_blocks=True,
|
||||
lstrip_blocks=True,
|
||||
keep_trailing_newline=True
|
||||
)
|
||||
|
||||
tox_environments = {}
|
||||
for (alias, conf) in matrix.from_file(join(base_path, "setup.cfg")).items():
|
||||
python = conf["python_versions"]
|
||||
deps = conf["dependencies"]
|
||||
tox_environments[alias] = {
|
||||
"python": "python" + python if "py" not in python else python,
|
||||
"deps": deps.split(),
|
||||
}
|
||||
if "coverage_flags" in conf:
|
||||
cover = {"false": False, "true": True}[conf["coverage_flags"].lower()]
|
||||
tox_environments[alias].update(cover=cover)
|
||||
if "environment_variables" in conf:
|
||||
env_vars = conf["environment_variables"]
|
||||
tox_environments[alias].update(env_vars=env_vars.split())
|
||||
|
||||
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.")
|
||||
@@ -0,0 +1,38 @@
|
||||
language: python
|
||||
python: '3.5'
|
||||
sudo: false
|
||||
env:
|
||||
global:
|
||||
- LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so
|
||||
- SEGFAULT_SIGNALS=all
|
||||
matrix:
|
||||
- TOXENV=check
|
||||
- TOXENV=docs
|
||||
{% for env, config in tox_environments|dictsort %}{{ '' }}
|
||||
- TOXENV={{ env }}{% if config.cover %},coveralls,codecov{% endif -%}
|
||||
{% 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
|
||||
before_cache:
|
||||
- rm -rf $HOME/.cache/pip/log
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cache/pip
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
||||
on_failure: always
|
||||
@@ -0,0 +1,138 @@
|
||||
[tox]
|
||||
envlist =
|
||||
clean,
|
||||
check,
|
||||
{% for env in tox_environments|sort %}
|
||||
{{ env }},
|
||||
{% endfor %}
|
||||
report,
|
||||
docs
|
||||
|
||||
[testenv]
|
||||
basepython =
|
||||
{docs,spell}: python2.7
|
||||
{clean,check,report,extension-coveralls,coveralls,codecov}: python3.5
|
||||
setenv =
|
||||
PYTHONPATH={toxinidir}/tests
|
||||
PYTHONUNBUFFERED=yes
|
||||
passenv =
|
||||
*
|
||||
deps =
|
||||
pytest
|
||||
pytest-travis-fold
|
||||
commands =
|
||||
{posargs:py.test -vv --ignore=src}
|
||||
|
||||
[testenv:spell]
|
||||
setenv =
|
||||
SPELLCHECK=1
|
||||
commands =
|
||||
sphinx-build -b spelling docs dist/docs
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
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:bootstrap]
|
||||
deps =
|
||||
jinja2
|
||||
matrix
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
python ci/bootstrap.py
|
||||
passenv =
|
||||
*
|
||||
|
||||
[testenv:check]
|
||||
deps =
|
||||
docutils
|
||||
check-manifest
|
||||
flake8
|
||||
readme-renderer
|
||||
pygments
|
||||
isort
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
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
|
||||
usedevelop = false
|
||||
commands =
|
||||
coverage combine --append
|
||||
coverage report
|
||||
coveralls []
|
||||
|
||||
[testenv:codecov]
|
||||
deps =
|
||||
codecov
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
coverage combine --append
|
||||
coverage report
|
||||
coverage xml --ignore-errors
|
||||
codecov []
|
||||
|
||||
|
||||
[testenv:report]
|
||||
deps = coverage
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
coverage combine --append
|
||||
coverage report
|
||||
coverage html
|
||||
|
||||
[testenv:clean]
|
||||
commands = coverage erase
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
deps = coverage
|
||||
|
||||
{% for env, config in tox_environments|dictsort %}
|
||||
[testenv:{{ env }}]
|
||||
basepython = {env:TOXPYTHON:{{ config.python }}}
|
||||
{% if config.cover or config.env_vars %}
|
||||
setenv =
|
||||
{[testenv]setenv}
|
||||
{% endif %}
|
||||
{% for var in config.env_vars %}
|
||||
{{ var }}
|
||||
{% endfor %}
|
||||
{% if config.cover %}
|
||||
WITH_COVERAGE=yes
|
||||
usedevelop = true
|
||||
commands =
|
||||
{posargs:py.test --cov --cov-report=term-missing -vv}
|
||||
{% endif %}
|
||||
{% if config.cover or config.deps %}
|
||||
deps =
|
||||
{[testenv]deps}
|
||||
{% endif %}
|
||||
{% if config.cover %}
|
||||
pytest-cov
|
||||
{% endif %}
|
||||
{% for dep in config.deps %}
|
||||
{{ dep }}
|
||||
{% endfor %}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
version: '2'
|
||||
services:
|
||||
boilerplate:
|
||||
image: boilerplate/boilerplate:latest
|
||||
build: .
|
||||
@@ -0,0 +1 @@
|
||||
.. include:: ../AUTHORS.md
|
||||
@@ -0,0 +1 @@
|
||||
.. include:: ../CHANGELOG.md
|
||||
@@ -0,0 +1,54 @@
|
||||
# -*- 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 = u'Boilerplate'
|
||||
year = '2024'
|
||||
author = u'Jeffrey Phillips Freeman'
|
||||
copyright = '{0}, {1}'.format(year, author)
|
||||
version = release = u'0.1.0'
|
||||
|
||||
pygments_style = 'trac'
|
||||
templates_path = ['.']
|
||||
extlinks = {
|
||||
'issue': ('https://git.cleverthis.com/cleverthis/base/base-python/-/issues%s', '#'),
|
||||
'pr': ('https://git.cleverthis.com/cleverthis/base/base-python/-/merge_requests%s', 'PR #'),
|
||||
}
|
||||
import sphinx_py3doc_enhanced_theme
|
||||
html_theme = "sphinx_py3doc_enhanced_theme"
|
||||
html_theme_path = [sphinx_py3doc_enhanced_theme.get_html_theme_path()]
|
||||
html_theme_options = {
|
||||
'githuburl': 'https://git.cleverthis.com/cleverthis/base/base-python'
|
||||
}
|
||||
|
||||
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
|
||||
@@ -0,0 +1 @@
|
||||
.. include:: ../CONTRIBUTING.md
|
||||
@@ -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`
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
============
|
||||
Installation
|
||||
============
|
||||
|
||||
At the command line::
|
||||
|
||||
pip install boilerplate
|
||||
@@ -0,0 +1 @@
|
||||
.. include:: ../README.md
|
||||
@@ -0,0 +1,9 @@
|
||||
boilerplate
|
||||
==========
|
||||
|
||||
.. testsetup::
|
||||
|
||||
from boilerplate import *
|
||||
|
||||
.. automodule:: boilerplate
|
||||
:members:
|
||||
@@ -0,0 +1,7 @@
|
||||
Reference
|
||||
=========
|
||||
|
||||
.. toctree::
|
||||
:glob:
|
||||
|
||||
boilerplate*
|
||||
@@ -0,0 +1,3 @@
|
||||
sphinx>=1.3
|
||||
sphinx-py3doc-enhanced-theme
|
||||
-e .
|
||||
@@ -0,0 +1,11 @@
|
||||
builtin
|
||||
builtins
|
||||
classmethod
|
||||
staticmethod
|
||||
classmethods
|
||||
staticmethods
|
||||
args
|
||||
kwargs
|
||||
callstack
|
||||
Changelog
|
||||
Indices
|
||||
@@ -0,0 +1,7 @@
|
||||
=====
|
||||
Usage
|
||||
=====
|
||||
|
||||
To use Boilerplate in a project::
|
||||
|
||||
import boilerplate
|
||||
@@ -0,0 +1,77 @@
|
||||
[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
|
||||
--ignore=docs/conf.py
|
||||
--ignore=setup.py
|
||||
--ignore=ci
|
||||
--ignore=.eggs
|
||||
--doctest-modules
|
||||
--doctest-glob=\*.rst
|
||||
--tb=short
|
||||
|
||||
[isort]
|
||||
force_single_line=True
|
||||
line_length=120
|
||||
known_first_party=boilerplate
|
||||
default_section=THIRDPARTY
|
||||
forced_separate=test_boilerplate
|
||||
not_skip = __init__.py
|
||||
skip = migrations, south_migrations
|
||||
|
||||
[matrix]
|
||||
# This is the configuration for the `./bootstrap.py` script.
|
||||
# It generates `.travis.yml`, `tox.ini` and `appveyor.yml`.
|
||||
#
|
||||
# Syntax: [alias:] value [!variable[glob]] [&variable[glob]]
|
||||
#
|
||||
# alias:
|
||||
# - is used to generate the tox environment
|
||||
# - it's optional
|
||||
# - if not present the alias will be computed from the `value`
|
||||
# value:
|
||||
# - a value of "-" means empty
|
||||
# !variable[glob]:
|
||||
# - exclude the combination of the current `value` with
|
||||
# any value matching the `glob` in `variable`
|
||||
# - can use as many you want
|
||||
# &variable[glob]:
|
||||
# - only include the combination of the current `value`
|
||||
# when there's a value matching `glob` in `variable`
|
||||
# - can use as many you want
|
||||
|
||||
python_versions =
|
||||
3.9
|
||||
|
||||
dependencies =
|
||||
# 1.4: Django==1.4.16 !python_versions[3.*]
|
||||
# 1.5: Django==1.5.11
|
||||
# 1.6: Django==1.6.8
|
||||
# 1.7: Django==1.7.1 !python_versions[2.6]
|
||||
# Deps commented above are provided as examples. That's what you would use in a Django project.
|
||||
|
||||
coverage_flags =
|
||||
cover: true
|
||||
nocov: false
|
||||
|
||||
environment_variables =
|
||||
-
|
||||
@@ -0,0 +1,75 @@
|
||||
#!/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='boilerplate',
|
||||
version='0.1.0',
|
||||
license='Apache',
|
||||
description='A starter project for Python',
|
||||
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='CleverThis',
|
||||
author_email='jeffrey.freeman@cleverthis.com',
|
||||
url='https://git.cleverthis.com/cleverthis/base/base-python',
|
||||
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 :: Apache License',
|
||||
'Operating System :: Unix',
|
||||
'Operating System :: POSIX',
|
||||
'Operating System :: Microsoft :: Windows',
|
||||
'Programming Language :: Python',
|
||||
'Programming Language :: Python :: 3.9',
|
||||
'Programming Language :: Python :: Implementation :: CPython',
|
||||
# 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=[
|
||||
'click',
|
||||
],
|
||||
extras_require={
|
||||
# eg:
|
||||
# 'rst': ['docutils>=0.11'],
|
||||
# ':python_version=="2.6"': ['argparse'],
|
||||
},
|
||||
entry_points={
|
||||
'console_scripts': [
|
||||
'boilerplate = boilerplate.cli:main',
|
||||
]
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1 @@
|
||||
__version__ = "0.1.0"
|
||||
@@ -0,0 +1,14 @@
|
||||
"""
|
||||
Entrypoint module, in case you use `python -mboilerplate`.
|
||||
|
||||
|
||||
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 boilerplate.cli import main
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,23 @@
|
||||
"""
|
||||
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 -mboilerplate` python will execute
|
||||
``__main__.py`` as a script. That means there won't be any
|
||||
``boilerplate.__main__`` in ``sys.modules``.
|
||||
- When you import __main__ it will get executed again (as a module) because
|
||||
there's no ``boilerplate.__main__`` in ``sys.modules``.
|
||||
|
||||
Also see (1) from http://click.pocoo.org/5/setuptools/#setuptools-integration
|
||||
"""
|
||||
import click
|
||||
|
||||
|
||||
@click.command()
|
||||
@click.argument('names', nargs=-1)
|
||||
def main(names):
|
||||
click.echo(repr(names))
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
from click.testing import CliRunner
|
||||
|
||||
from boilerplate.cli import main
|
||||
|
||||
|
||||
def test_main():
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(main, [])
|
||||
|
||||
assert result.output == '()\n'
|
||||
assert result.exit_code == 0
|
||||
@@ -0,0 +1,128 @@
|
||||
[tox]
|
||||
envlist =
|
||||
clean,
|
||||
build,
|
||||
check,
|
||||
3.9-cover,
|
||||
3.9-nocov,
|
||||
report,
|
||||
docs
|
||||
|
||||
[testenv]
|
||||
basepython =
|
||||
{clean,check,report,extension-coveralls,coveralls,codecov,docs,spell,build}: python3.9
|
||||
setenv =
|
||||
PYTHONPATH={toxinidir}/tests
|
||||
PYTHONUNBUFFERED=yes
|
||||
passenv =
|
||||
*
|
||||
deps =
|
||||
pytest
|
||||
pytest-travis-fold
|
||||
commands =
|
||||
{posargs:py.test -vv --ignore=src}
|
||||
|
||||
[testenv:spell]
|
||||
setenv =
|
||||
SPELLCHECK=1
|
||||
commands =
|
||||
sphinx-build -b spelling docs build/docs
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
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 build/docs
|
||||
#sphinx-build -b linkcheck docs build/docs
|
||||
sphinx-build docs build/docs
|
||||
|
||||
[testenv:bootstrap]
|
||||
deps =
|
||||
jinja2
|
||||
matrix
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
python ci/bootstrap.py
|
||||
passenv =
|
||||
*
|
||||
|
||||
[testenv:build]
|
||||
commands =
|
||||
python setup.py sdist bdist_wheel --universal
|
||||
|
||||
[testenv:check]
|
||||
deps =
|
||||
docutils
|
||||
check-manifest
|
||||
flake8
|
||||
readme-renderer
|
||||
pygments
|
||||
isort
|
||||
twine
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
twine check dist/*
|
||||
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
|
||||
usedevelop = false
|
||||
commands =
|
||||
- coverage combine --append
|
||||
coverage report
|
||||
coveralls []
|
||||
|
||||
[testenv:codecov]
|
||||
deps =
|
||||
codecov
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
- coverage combine --append
|
||||
coverage report
|
||||
coverage xml --ignore-errors
|
||||
codecov []
|
||||
|
||||
|
||||
[testenv:report]
|
||||
deps = coverage
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
commands =
|
||||
- coverage combine --append
|
||||
coverage report
|
||||
coverage html
|
||||
|
||||
[testenv:clean]
|
||||
commands = coverage erase
|
||||
skip_install = true
|
||||
usedevelop = false
|
||||
deps = coverage
|
||||
|
||||
|
||||
[testenv:3.9-nocov]
|
||||
basepython = {env:TOXPYTHON:python3.9}
|
||||
|
||||
[testenv:3.9-cover]
|
||||
basepython = {env:TOXPYTHON:python3.9}
|
||||
setenv =
|
||||
{[testenv]setenv}
|
||||
WITH_COVERAGE=yes
|
||||
usedevelop = true
|
||||
commands =
|
||||
{posargs:py.test --cov --cov-report=term-missing -vv}
|
||||
deps =
|
||||
{[testenv]deps}
|
||||
pytest-cov
|
||||
Reference in New Issue
Block a user