Skip to content

Commit

Permalink
Merge pull request #12 from cisagov/lineage/skeleton
Browse files Browse the repository at this point in the history
⚠️ CONFLICT! Lineage pull request for: skeleton
  • Loading branch information
mcdonnnj authored Jul 9, 2020
2 parents 9349616 + 8af6657 commit 7b2633d
Show file tree
Hide file tree
Showing 5 changed files with 216 additions and 17 deletions.
28 changes: 13 additions & 15 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,23 +49,22 @@ jobs:
run: pre-commit run --all-files
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.6, 3.7, 3.8]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v1
with:
python-version: 3.8
- name: Store installed Python version
run: |
echo "::set-env name=PY_VERSION::"\
"$(python -c "import platform;print(platform.python_version())")"
python-version: ${{ matrix.python-version }}
- name: Cache pip test requirements
uses: actions/cache@v1
with:
path: ${{ env.PIP_CACHE_DIR }}
key: "${{ runner.os }}-pip-test-py${{ env.PY_VERSION }}-\
key: "${{ runner.os }}-pip-test-py${{ matrix.python-version }}-\
${{ hashFiles('**/requirements-test.txt') }}"
restore-keys: |
${{ runner.os }}-pip-test-py${{ env.PY_VERSION }}-
${{ runner.os }}-pip-test-py${{ matrix.python-version }}-
${{ runner.os }}-pip-test-
${{ runner.os }}-pip-
- name: Install dependencies
Expand All @@ -84,23 +83,22 @@ jobs:
build:
runs-on: ubuntu-latest
needs: [lint, test]
strategy:
matrix:
python-version: [3.6, 3.7, 3.8]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v1
with:
python-version: 3.8
- name: Store installed Python version
run: |
echo "::set-env name=PY_VERSION::"\
"$(python -c "import platform;print(platform.python_version())")"
python-version: ${{ matrix.python-version }}
- name: Cache pip build requirements
uses: actions/cache@v1
with:
path: ${{ env.PIP_CACHE_DIR }}
key: "${{ runner.os }}-pip-build-py${{ env.PY_VERSION }}-\
key: "${{ runner.os }}-pip-build-py${{ matrix.python-version }}-\
${{ hashFiles('**/requirements.txt') }}"
restore-keys: |
${{ runner.os }}-pip-build-py${{ env.PY_VERSION }}-
${{ runner.os }}-pip-build-py${{ matrix.python-version }}-
${{ runner.os }}-pip-build-
${{ runner.os }}-pip-
- name: Install dependencies
Expand All @@ -112,5 +110,5 @@ jobs:
- name: Upload artifacts
uses: actions/upload-artifact@v1
with:
name: dist
name: dist-${{ matrix.python-version }}
path: dist
15 changes: 13 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,21 @@ There are a few ways to do this, but we prefer to use
[`pyenv-virtualenv`](https://github.com/pyenv/pyenv-virtualenv) to create and
manage a Python virtual environment specific to this project.

If you already have `pyenv` and `pyenv-virtualenv` configured you can take
advantage of the `setup-env` tool in this repo to automate the entire
environment configuration process.

```console
./setup-env
```

Otherwise, follow the steps below to manually configure your environment.

#### Installing and using `pyenv` and `pyenv-virtualenv`

On the Mac, installation is as simple as `brew install pyenv pyenv-virtualenv`
and adding this to your profile:
On the Mac, we recommend installing [brew](https://brew.sh/). Then installation
is as simple as `brew install pyenv pyenv-virtualenv` and adding this to your
profile:

```bash
eval "$(pyenv init -)"
Expand Down
1 change: 1 addition & 0 deletions requirements-test.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
--requirement requirements.txt
-e .[test]
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
-e .
wheel
188 changes: 188 additions & 0 deletions setup-env
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
#!/usr/bin/env bash

set -o nounset
set -o errexit
set -o pipefail

USAGE=$(cat << 'END_OF_LINE'
Configure a developement environment for this repository.
It does the following:
- Verifies pyenv and pyenv-virtualenv are installed.
- Creates a Python virtual environment.
- Configures the activation of the virtual enviroment for the repo directory.
- Installs the requirements needed for development.
- Installs git pre-commit hooks.
- Configures git upstream remote "lineage" repositories.
Usage:
setup-env [options] [virt_env_name]
setup-env (-h | --help)
Options:
-f --force Delete virtual enviroment if it already exists.
-h --help Show this message.
-i --install-hooks Install hook environments for all environments in the
pre-commit config file.
END_OF_LINE
)

# Flag to force deletion and creation of virtual environment
FORCE=0

# Positional parameters
PARAMS=""

# Parse command line arguments
while (( "$#" )); do
case "$1" in
-f|--force)
FORCE=1
shift
;;
-h|--help)
echo "${USAGE}"
exit 0
;;
-i|--install-hooks)
INSTALL_HOOKS=1
shift
;;
-*) # unsupported flags
echo "Error: Unsupported flag $1" >&2
exit 1
;;
*) # preserve positional arguments
PARAMS="$PARAMS $1"
shift
;;
esac
done

# set positional arguments in their proper place
eval set -- "$PARAMS"

# Check to see if pyenv is installed
if [ -z "$(command -v pyenv)" ] || [ -z "$(command -v pyenv-virtualenv)" ]; then
echo "pyenv and pyenv-virtualenv are required."
if [[ "$OSTYPE" == "darwin"* ]]; then
cat << 'END_OF_LINE'
On the Mac, we recommend installing brew, https://brew.sh/. Then installation
is as simple as `brew install pyenv pyenv-virtualenv` and adding this to your
profile:
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
END_OF_LINE

fi
cat << 'END_OF_LINE'
For Linux, Windows Subsystem for Linux (WSL), or on the Mac (if you don't want
to use "brew") you can use https://github.com/pyenv/pyenv-installer to install
the necessary tools. Before running this ensure that you have installed the
prerequisites for your platform according to the pyenv wiki page,
https://github.com/pyenv/pyenv/wiki/common-build-problems.
On WSL you should treat your platform as whatever Linux distribution you've
chosen to install.
Once you have installed "pyenv" you will need to add the following lines to
your ".bashrc":
export PATH="$PATH:$HOME/.pyenv/bin"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
END_OF_LINE
exit 1
fi

set +o nounset
# Determine the virtual environment name
if [ "$1" ]; then
# Use the user-provided environment name
env_name=$1
else
# Set the environment name to the last part of the working directory.
env_name=${PWD##*/}
fi
set -o nounset

# Remove any lingering local configuration.
if [ $FORCE -ne 0 ]; then
rm -f .python-version
pyenv virtualenv-delete --force "${env_name}" || true
elif [[ -f .python-version ]]; then
cat << 'END_OF_LINE'
An existing .python-version file was found. Either remove this file yourself
or re-run with --force option to have it deleted along with the associated
virtual environment.
rm .python-version
END_OF_LINE
exit 1
fi

# Create a new virtual environment for this project
if ! pyenv virtualenv "${env_name}"; then
cat << END_OF_LINE
An existing virtual environment named $env_name was found. Either delete this
environment yourself or re-run with --force option to have it deleted.
pyenv virtualenv-delete ${env_name}
END_OF_LINE
exit 1
fi

# Set the local application-specific Python version(s) by writing the
# version name to a file named `.python-version'.
pyenv local "${env_name}"

# Upgrade pip and friends
python3 -m pip install --upgrade pip setuptools wheel

# Find a requirements file (if possible) and install
for req_file in "requirements-dev.txt" "requirements-test.txt" "requirements.txt"; do
if [[ -f $req_file ]]; then
pip install --requirement $req_file
break
fi
done

# Install git pre-commit hooks now or later.
pre-commit install ${INSTALL_HOOKS:+"--install-hooks"}

# Setup git remotes from lineage configuration
# This could fail if the remotes are already setup, but that is ok.
set +o errexit

eval "$(python3 << 'END_OF_LINE'
from pathlib import Path
import yaml
import sys
LINEAGE_CONFIG = Path(".github/lineage.yml")
if not LINEAGE_CONFIG.exists():
print("No lineage configuration found.", file=sys.stderr)
sys.exit(0)
with LINEAGE_CONFIG.open("r") as f:
lineage = yaml.safe_load(stream=f)
if lineage["version"] == "1":
for parent_name, v in lineage["lineage"].items():
remote_url = v["remote-url"]
print(f"git remote add {parent_name} {remote_url};")
print(f"git remote set-url --push {parent_name} no_push;")
else:
print(f'Unsupported lineage version: {lineage["version"]}', file=sys.stderr)
END_OF_LINE
)"

# Qapla
echo "Success!"

0 comments on commit 7b2633d

Please sign in to comment.