aboutsummaryrefslogtreecommitdiff
path: root/ci
diff options
context:
space:
mode:
authorBobby <[email protected]>2022-08-30 18:13:03 -0400
committerBobby <[email protected]>2022-08-30 18:13:03 -0400
commitb2026facd54d94c2145c48eeaac779672b0d9e80 (patch)
tree3cd70e0fdff96ce26d009a75156ab752a84a2d74 /ci
downloadedify-b2026facd54d94c2145c48eeaac779672b0d9e80.tar.xz
edify-b2026facd54d94c2145c48eeaac779672b0d9e80.zip
Add initial project skeleton.
Diffstat (limited to 'ci')
-rwxr-xr-xci/bootstrap.py93
-rw-r--r--ci/requirements.txt5
-rw-r--r--ci/templates/.appveyor.yml46
-rw-r--r--ci/templates/.github/workflows/github-actions.yml65
4 files changed, 209 insertions, 0 deletions
diff --git a/ci/bootstrap.py b/ci/bootstrap.py
new file mode 100755
index 0000000..3ca06b7
--- /dev/null
+++ b/ci/bootstrap.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+from __future__ import print_function
+from __future__ import unicode_literals
+
+import os
+import subprocess
+import sys
+from os.path import abspath
+from os.path import dirname
+from os.path import exists
+from os.path import join
+from os.path import relpath
+
+base_path = dirname(dirname(abspath(__file__)))
+templates_path = join(base_path, "ci", "templates")
+
+
+def check_call(args):
+ print("+", *args)
+ subprocess.check_call(args)
+
+
+def exec_in_env():
+ 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:
+ check_call([sys.executable, "-m", "venv", env_path])
+ except subprocess.CalledProcessError:
+ try:
+ check_call([sys.executable, "-m", "virtualenv", env_path])
+ except subprocess.CalledProcessError:
+ check_call(["virtualenv", env_path])
+ print("Installing `jinja2` into bootstrap environment...")
+ check_call([join(bin_path, "pip"), "install", "jinja2", "tox"])
+ python_executable = join(bin_path, "python")
+ if not os.path.exists(python_executable):
+ python_executable += '.exe'
+
+ print("Re-executing with: {0}".format(python_executable))
+ print("+ exec", python_executable, __file__, "--no-env")
+ os.execv(python_executable, [python_executable, __file__, "--no-env"])
+
+
+def main():
+ import jinja2
+
+ print("Project path: {0}".format(base_path))
+
+ jinja = jinja2.Environment(
+ loader=jinja2.FileSystemLoader(templates_path),
+ trim_blocks=True,
+ lstrip_blocks=True,
+ keep_trailing_newline=True,
+ )
+
+ tox_environments = [
+ line.strip()
+ # 'tox' need not be installed globally, but must be importable
+ # by the Python that is running this script.
+ # This uses sys.executable the same way that the call in
+ # cookiecutter-pylibrary/hooks/post_gen_project.py
+ # invokes this bootstrap.py itself.
+ for line in subprocess.check_output([sys.executable, '-m', 'tox', '--listenvs'], universal_newlines=True).splitlines()
+ ]
+ tox_environments = [line for line in tox_environments if line.startswith('py')]
+
+ for root, _, files in os.walk(templates_path):
+ for name in files:
+ relative = relpath(root, templates_path)
+ with open(join(base_path, relative, name), "w") as fh:
+ fh.write(jinja.get_template(join(relative, name)).render(tox_environments=tox_environments))
+ print("Wrote {}".format(name))
+ print("DONE.")
+
+
+if __name__ == "__main__":
+ args = sys.argv[1:]
+ if args == ["--no-env"]:
+ main()
+ elif not args:
+ exec_in_env()
+ else:
+ print("Unexpected arguments {0}".format(args), file=sys.stderr)
+ sys.exit(1)
diff --git a/ci/requirements.txt b/ci/requirements.txt
new file mode 100644
index 0000000..a0ef106
--- /dev/null
+++ b/ci/requirements.txt
@@ -0,0 +1,5 @@
+virtualenv>=16.6.0
+pip>=19.1.1
+setuptools>=18.0.1
+six>=1.14.0
+tox
diff --git a/ci/templates/.appveyor.yml b/ci/templates/.appveyor.yml
new file mode 100644
index 0000000..a64923b
--- /dev/null
+++ b/ci/templates/.appveyor.yml
@@ -0,0 +1,46 @@
+version: '{branch}-{build}'
+build: off
+image: Visual Studio 2019
+environment:
+ matrix:
+ - TOXENV: check
+ TOXPYTHON: C:\Python36\python.exe
+ PYTHON_HOME: C:\Python36
+ PYTHON_VERSION: '3.6'
+ PYTHON_ARCH: '32'
+{% for env in tox_environments %}
+{% if env.startswith(('py2', 'py3')) %}
+ - TOXENV: {{ env }},codecov{{ "" }}
+ TOXPYTHON: C:\Python{{ env[2:4] }}\python.exe
+ PYTHON_HOME: C:\Python{{ env[2:4] }}
+ PYTHON_VERSION: '{{ env[2] }}.{{ env[3] }}'
+ PYTHON_ARCH: '32'
+{% if 'nocov' in env %}
+ WHEEL_PATH: .tox/dist
+{% endif %}
+ - TOXENV: {{ env }},codecov{{ "" }}
+ TOXPYTHON: C:\Python{{ env[2:4] }}-x64\python.exe
+ PYTHON_HOME: C:\Python{{ env[2:4] }}-x64
+ PYTHON_VERSION: '{{ env[2] }}.{{ env[3] }}'
+ PYTHON_ARCH: '64'
+{% if 'nocov' in env %}
+ WHEEL_PATH: .tox/dist
+{% endif %}
+{% endif %}{% endfor %}
+init:
+ - ps: echo $env:TOXENV
+ - ps: ls C:\Python*
+install:
+ - '%PYTHON_HOME%\python -mpip install --progress-bar=off tox -rci/requirements.txt'
+ - '%PYTHON_HOME%\Scripts\virtualenv --version'
+ - '%PYTHON_HOME%\Scripts\pip --version'
+ - '%PYTHON_HOME%\Scripts\tox --version'
+test_script:
+ - %PYTHON_HOME%\Scripts\tox
+on_failure:
+ - ps: dir "env:"
+ - ps: get-content .tox\*\log\*
+
+### To enable remote debugging uncomment this (also, see: http://www.appveyor.com/docs/how-to/rdp-to-build-worker):
+# on_finish:
+# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
diff --git a/ci/templates/.github/workflows/github-actions.yml b/ci/templates/.github/workflows/github-actions.yml
new file mode 100644
index 0000000..7ee6426
--- /dev/null
+++ b/ci/templates/.github/workflows/github-actions.yml
@@ -0,0 +1,65 @@
+name: build
+on: [push, pull_request]
+jobs:
+ test:
+ name: {{ '${{ matrix.name }}' }}
+ runs-on: {{ '${{ matrix.os }}' }}
+ timeout-minutes: 30
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - name: 'check'
+ python: '3.9'
+ toxpython: 'python3.9'
+ tox_env: 'check'
+ os: 'ubuntu-latest'
+ - name: 'docs'
+ python: '3.9'
+ toxpython: 'python3.9'
+ tox_env: 'docs'
+ os: 'ubuntu-latest'
+{% for env in tox_environments %}
+{% set prefix = env.split('-')[0] -%}
+{% if prefix.startswith('pypy') %}
+{% set python %}pypy-{{ prefix[4] }}.{{ prefix[5] }}{% endset %}
+{% set cpython %}pp{{ prefix[4:5] }}{% endset %}
+{% set toxpython %}pypy{{ prefix[4] }}.{{ prefix[5] }}{% endset %}
+{% else %}
+{% set python %}{{ prefix[2] }}.{{ prefix[3:] }}{% endset %}
+{% set cpython %}cp{{ prefix[2:] }}{% endset %}
+{% set toxpython %}python{{ prefix[2] }}.{{ prefix[3:] }}{% endset %}
+{% endif %}
+{% for os, python_arch in [
+ ['ubuntu', 'x64'],
+ ['windows', 'x64'],
+ ['macos', 'x64'],
+] %}
+ - name: '{{ env }} ({{ os }})'
+ python: '{{ python }}'
+ toxpython: '{{ toxpython }}'
+ python_arch: '{{ python_arch }}'
+ tox_env: '{{ env }}{% if 'cover' in env %},codecov{% endif %}'
+ os: '{{ os }}-latest'
+{% endfor %}
+{% endfor %}
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ - uses: actions/setup-python@v2
+ with:
+ python-version: {{ '${{ matrix.python }}' }}
+ architecture: {{ '${{ matrix.python_arch }}' }}
+ - name: install dependencies
+ run: |
+ python -mpip install --progress-bar=off -r ci/requirements.txt
+ virtualenv --version
+ pip --version
+ tox --version
+ pip list --format=freeze
+ - name: test
+ env:
+ TOXPYTHON: '{{ '${{ matrix.toxpython }}' }}'
+ run: >
+ tox -e {{ '${{ matrix.tox_env }}' }} -v