From 5fbbdac265f43651a93111abd102b88446de4966 Mon Sep 17 00:00:00 2001 From: David Moreau Simard Date: Tue, 6 Mar 2018 01:51:51 -0500 Subject: [PATCH] Bootstrap the repository with the basic machinery (#1) - Make the project installable with pbr - Use tox to run tests, build docs, runserver - Flesh out the README a little bit - Real docs is WIP. Change-Id: I3dc92250cd93add0cdf11c6a67d8f1081560d4e1 --- .gitignore | 1 + .travis.yml | 7 --- README.md | 23 ---------- README.rst | 69 ++++++++++++++++++++++++++++++ doc/source/_static/screenshot.png | Bin 0 -> 46027 bytes requirements.txt | 2 + scripts/createvenv.sh | 17 -------- scripts/runserver.sh | 18 -------- scripts/test.sh | 16 ------- setup.cfg | 59 +++++++++++++++++++++++++ setup.py | 22 ++++++++++ test-requirements.txt | 5 +++ tox.ini | 52 ++++++++++++++++++++++ 13 files changed, 210 insertions(+), 81 deletions(-) delete mode 100644 .travis.yml delete mode 100644 README.md create mode 100644 README.rst create mode 100644 doc/source/_static/screenshot.png delete mode 100755 scripts/createvenv.sh delete mode 100755 scripts/runserver.sh delete mode 100755 scripts/test.sh create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index b987a36..7db6ea9 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ nosetests.xml coverage.xml *,cover .hypothesis/ +reports/ # Translations *.mo diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b5676ed..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -dist: trusty -sudo: required -language: python -python: - - 3 -install: pip install -r requirements.txt -script: python manage.py test diff --git a/README.md b/README.md deleted file mode 100644 index 557c77a..0000000 --- a/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# ara django - -## requirements - -python3 - -## install - -create virtual env - - ./scripts/createvenv.sh - -## start - -run test server - - ./scripts/runserver.sh - -then visit [http://127.0.0.1:8000/api/v1/](http://127.0.0.1:8000/api/v1/) - -## tests - - ./scripts/test.sh diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..d2831f6 --- /dev/null +++ b/README.rst @@ -0,0 +1,69 @@ +ara-django +========== + +.. image:: doc/source/_static/screenshot.png + +An experiment with Django at the core of the ARA 1.0 backend. +This is not stable or production-ready. + +If you are looking for ARA Records Ansible, the Ansible callback plugin and +reporting interface, you will find the repository here_. + +We are prototyping outside the main repository due to the vast changes +involved and will merge back as appropriate. + +.. _here: https://github.com/openstack/ara + +Documentation +============= + +*Work in progress* + +This is python3 only right now. + +**TL;DR**: Using tox is convenient for the time being:: + + # Use the source Luke + git clone https://github.com/dmsimard/ara-django + cd ara-django + + # Install tox + pip install tox # (or the tox python library from your distro packages) + + # Run test server -> http://127.0.0.1:8000/api/v1/ + tox -e runserver + + # Run actual tests or get coverage + tox -e pep8 + tox -e py35 + tox -e cover + + # Build docs + tox -e docs + +Contributors +============ + +See contributors on GitHub_. + +.. _GitHub: https://github.com/dmsimard/ara-django/graphs/contributors + +Copyright +========= + +:: + + Copyright (c) 2018 Red Hat, Inc. + + ARA is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ARA is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ARA. If not, see . diff --git a/doc/source/_static/screenshot.png b/doc/source/_static/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..99aa9763cf3c9e80093c0162a9fa355cc2692cda GIT binary patch literal 46027 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 obL)3b!0iQuP3$)lTh6TN&grg$(kZ9i_^S-r+=2.0.0 # Apache-2.0 + Django<2 djangorestframework envparse diff --git a/scripts/createvenv.sh b/scripts/createvenv.sh deleted file mode 100755 index 26113bc..0000000 --- a/scripts/createvenv.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -RED='\033[0;31m' -NOCOLOR='\033[0m' - -if [ ! -f requirements.txt ]; then - echo -e "${RED}You seems to be in the wrong directory" - echo -e "Execute this script from the root of ara with ./scripts/${0##*/}${NOCOLOR}" - exit 1 -fi - -[ -d "venv" ] && rm -rf venv -python3 -m venv venv -source venv/bin/activate -pip install -r requirements.txt -pip install -r test-requirements.txt -deactivate diff --git a/scripts/runserver.sh b/scripts/runserver.sh deleted file mode 100755 index 9ae7117..0000000 --- a/scripts/runserver.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -RED='\033[0;31m' -NOCOLOR='\033[0m' - -if [ ! -f requirements.txt ]; then - echo -e "${RED}You seems to be in the wrong directory" - echo -e "Execute this script from the root of ara with ./scripts/${0##*/}${NOCOLOR}" - exit 1 -fi - -source venv/bin/activate - -python manage.py migrate -python manage.py collectstatic --clear --no-input -DJANGO_DEBUG=1 python manage.py runserver - -deactivate diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100755 index aec7d1d..0000000 --- a/scripts/test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -RED='\033[0;31m' -NOCOLOR='\033[0m' - -if [ ! -f requirements.txt ]; then - echo -e "${RED}You seems to be in the wrong directory" - echo -e "Execute this script from the root of ara with ./scripts/${0##*/}${NOCOLOR}" - exit 1 -fi - -source venv/bin/activate - -python manage.py test - -deactivate diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..632a2f3 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,59 @@ +[metadata] +name = ara-backend +summary = ARA Records Ansible backend +description-file = + README.rst +author = OpenStack Community +author-email = openstack-dev@lists.openstack.org +home-page = https://github.com/openstack/ara-backend +classifier = + Environment :: OpenStack + Intended Audience :: Information Technology + Intended Audience :: System Administrators + Intended Audience :: Developers + Topic :: Utilities + License :: OSI Approved :: GNU General Public License v3 (GPLv3) + Operating System :: POSIX :: Linux + Programming Language :: Python + Programming Language :: Python :: 2 + Programming Language :: Python :: 2.7 + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.5 + Development Status :: 4 - Beta + +[global] +setup-hooks = + pbr.hooks.setup_hook + +[files] +packages = + ara-backend + +[build_sphinx] +source-dir = doc/source +build-dir = doc/build +all_files = 1 + +[upload_sphinx] +upload-dir = docs/html + +[coverage:report] +ignore_errors = True +include = + ara/* + api/* +omit = + /usr* + setup.py + *egg* + .venv/* + +[coverage:html] +directory = reports + +[wheel] +universal = 1 + +[pbr] +skip_authors = True +skip_changelog = True diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..bda9dc3 --- /dev/null +++ b/setup.py @@ -0,0 +1,22 @@ +# Copyright (c) 2018 Red Hat, Inc. +# +# This file is part of ARA: Ansible Run Analysis. +# +# ARA is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# ARA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with ARA. If not, see . + +import setuptools + +setuptools.setup( + setup_requires=['pbr'], + pbr=True) diff --git a/test-requirements.txt b/test-requirements.txt index fe9d594..9f82842 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1 +1,6 @@ factory-boy +bandit>=1.1.0 # Apache-2.0 +coverage +flake8 +sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 +sphinx-rtd-theme diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..7ad72e6 --- /dev/null +++ b/tox.ini @@ -0,0 +1,52 @@ +[tox] +minversion = 2.0 +envlist = py35,pep8 +skipdist = True + +[testenv] +basepython = python3 +sitepackages = False +usedevelop = True +install_command = pip install -U {opts} {packages} -c{env:CONSTRAINTS_FILE:/dev/null} +setenv = VIRTUAL_ENV={envdir} +deps = -r{toxinidir}/test-requirements.txt + +[testenv:venv] +commands = {posargs} + +[testenv:docs] +commands = sphinx-build -W -b html doc/source doc/build/html + +[testenv:pep8] +commands = + flake8 ara api + bandit -r ara api + +[testenv:py35] +commands = python manage.py test + +[testenv:runserver] +commands = + python manage.py migrate + python manage.py collectstatic --clear --no-input + python manage.py runserver +setenv = + DJANGO_DEBUG=1 + +[testenv:cover] +commands = + coverage erase + coverage run {toxinidir}/manage.py test ara + coverage run -a {toxinidir}/manage.py test api + coverage html + +[flake8] +# E123, E125 skipped as they are invalid PEP-8. +# E741, short ambiguous variable names +# H106 Don’t put vim configuration in source files +# H203 Use assertIs(Not)None to check for None +max-line-length = 120 +ignore = E123,E125,E741 +enable-extensions=H106,H203 +show-source = True +exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build