diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79f6256 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# Python bytecode: +*.py[co] + +# Packaging files: +*.egg* + +# Sphinx docs: +build + +# SQLite3 database files: +*.db + +# Logs: +*.log + +# Eclipse +.project +.pydevproject +.settings + +# Linux Editors +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +.elc +auto-save-list +tramp +.\#* +*.swp +*.swo + +# Mac +.DS_Store +._* + +# Windows +Thumbs.db +Desktop.ini + +.ropeproject +_build/ +*.sqlite3 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt new file mode 100644 index 0000000..dc72595 --- /dev/null +++ b/CONTRIBUTORS.txt @@ -0,0 +1 @@ +Jan Dittberner diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8c51745 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2014 Jan Dittberner + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..66d830e --- /dev/null +++ b/README.rst @@ -0,0 +1,13 @@ +======= +gvafile +======= + +This is the GNUViech Admin fileserver administration tool project. + +GNUViech Admin is a suite of tools for server management used for hosting +customer management at `Jan Dittberner IT-Consulting & -Solutions +`_. + +Read the :doc:`Installation instructions ` to get started locally. + +The project page for gvafile is at http://dev.gnuviech-server.de/gvafile. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..9842cf5 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/{{ project_name }}.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/{{ project_name }}.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/{{ project_name }}" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/{{ project_name }}" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/__init__.py b/docs/__init__.py new file mode 100644 index 0000000..8772c82 --- /dev/null +++ b/docs/__init__.py @@ -0,0 +1 @@ +# Included so that Django's startproject comment runs against the docs directory diff --git a/docs/changelog.rst b/docs/changelog.rst new file mode 100644 index 0000000..53fa8dd --- /dev/null +++ b/docs/changelog.rst @@ -0,0 +1,5 @@ +Changelog +========= + +* :release:`0.0.1 <2014-12-25>` +* :feature:`-` initial setup of django application and celery worker diff --git a/docs/code.rst b/docs/code.rst new file mode 100644 index 0000000..2b273a7 --- /dev/null +++ b/docs/code.rst @@ -0,0 +1,76 @@ +================== +Code documentation +================== + +.. index:: Django + +gvafile is implemented as `Django`_ project and provides some `Celery`_ tasks. + +.. _Django: https://www.djangoproject.com/ +.. _Celery: http://www.celeryproject.org/ + + +The project module :py:mod:`gvafile` +==================================== + +.. automodule:: gvafile + + +:py:mod:`gvafile.celery` +------------------------ + +.. automodule:: gvafile.celery + :members: + + +:py:mod:`gvafile.urls` +---------------------- + +.. automodule:: gvafile.urls + + +:py:mod:`gvafile.wsgi` +---------------------- + +.. automodule:: gvafile.wsgi + :members: + + +:py:mod:`gvafile.settings` +-------------------------- + +.. automodule:: gvafile.settings + +:py:mod:`gvafile.settings.base` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: gvafile.settings.base + :members: + +:py:mod:`gvafile.settings.local` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: gvafile.settings.local + +:py:mod:`gvafile.settings.production` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: gvafile.settings.production + +:py:mod:`gvafile.settings.test` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automodule:: gvafile.settings.test + + +:py:mod:`osusers` app +===================== + +.. automodule:: osusers + +:py:mod:`osusers.tasks` +----------------------- + +.. automodule:: osusers.tasks + :members: + :undoc-members: diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..dc4f85e --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,251 @@ +# -*- coding: utf-8 -*- +# pymode:lint_ignore=E501 +# +# gvafile documentation build configuration file, created by +# sphinx-quickstart on Sun Feb 17 11:46:20 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath(os.path.join('..', 'gvafile'))) + +os.environ['GVAFILE_ALLOWED_HOSTS'] = 'localhost' +os.environ['GVAFILE_SERVER_EMAIL'] = 'root@localhost' + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['releases', 'sphinx.ext.autodoc', 'celery.contrib.sphinx'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +releases_issue_uri = 'https://dev.gnuviech-server.de/gvafile/ticket/%s' + +releases_release_uri = 'https://dev.gnuviech-server.de/gvafile/milestone/%s' + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'gvafile' +copyright = u'2014, Jan Dittberner' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.0.1' +# The full version, including alpha/beta/rc tags. +release = '0.0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'gvafiledoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + #'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'gvafile.tex', u'gvafile Documentation', + u'Jan Dittberner', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'gvafile', u'gvafile Documentation', + [u'Jan Dittberner'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'gvafile', u'gvafile Documentation', + u'Jan Dittberner', 'gvafile', 'GNUViech admin filserver tools.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' diff --git a/docs/deploy.rst b/docs/deploy.rst new file mode 100644 index 0000000..124e75a --- /dev/null +++ b/docs/deploy.rst @@ -0,0 +1,10 @@ +Deploy +======== + +The production deployment for gvafile is performed using saltstack and consists +of the following steps: + +* installation of native dependencies +* setup of a virtualenv +* installation of gvafile production dependencies inside the virtualenv +* setup of celery worker under control of supervisord diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..03a7866 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,27 @@ +.. gvafile documentation master file, created by + sphinx-quickstart on Sun Feb 17 11:46:20 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. include:: ../README.rst + +Welcome to gvafile's documentation! +==================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + install + deploy + code + changelog + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/install.rst b/docs/install.rst new file mode 100644 index 0000000..ed35fa9 --- /dev/null +++ b/docs/install.rst @@ -0,0 +1,84 @@ +.. index:: installation + +======= +Install +======= + +Working Environment +=================== + +You have several options in setting up your working environment. We recommend +using virtualenv to separate the dependencies of your project from your +system's python environment. If on Linux or Mac OS X, you can also use +virtualenvwrapper to help manage multiple virtualenvs across different +projects. + +.. index:: virtualenv + +Virtualenv Only +--------------- + +First, make sure you are using `virtualenv`_. Once that's installed, create +your virtualenv: + +.. code-block:: sh + + $ virtualenv --distribute gvafile + +.. _virtualenv: https://virtualenv.pypa.io/en/latest/ + +You will also need to ensure that the virtualenv has the project directory +added to the path. Adding the project directory will allow `django-admin.py` to +be able to change settings using the `--settings` flag. + +.. index:: virtualenvwrapper + +Virtualenv with virtualenvwrapper +------------------------------------ + +In Linux and Mac OSX, you can install `virtualenvwrapper +`_, which will take care +of managing your virtual environments and adding the project path to the +`site-directory` for you: + +.. code-block:: sh + + $ mkdir gvafile + $ mkvirtualenv -a gvafile gvafile-dev + $ cd gvafile && add2virtualenv `pwd` + + +.. index:: pip, requirements, dependencies + +Installation of Dependencies +============================= + +Depending on where you are installing dependencies: + +In development: + +.. code-block:: sh + + $ pip install -r requirements/local.txt + +For production: + +.. code-block:: sh + + $ pip install -r requirements.txt + +.. index:: celery, worker, file queue + +Running the Celery worker +========================= + +gvafile uses the `Celery`_ distributed task queue system. The gvafile logix is +executed by a celery worker. After all dependencies are installed you can go +into the gvafile directory and run the celery worker with: + +.. code-block:: sh + + $ cd gvafile + $ celery -A gvafile worker -Q file -l info + +.. _Celery: http://www.celeryproject.org/ diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..c8212a0 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,190 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\{{ project_name }}.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\{{ project_name }}.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/gvafile/gvafile/__init__.py b/gvafile/gvafile/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gvafile/gvafile/celery.py b/gvafile/gvafile/celery.py new file mode 100644 index 0000000..b8285f0 --- /dev/null +++ b/gvafile/gvafile/celery.py @@ -0,0 +1,23 @@ +""" +This module defines the Celery_ app for gvafile. + +.. _Celery: http://www.celeryproject.org/ + +""" +from __future__ import absolute_import + +import os + +from celery import Celery + +from django.conf import settings + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', + 'gvafile.settings.production') + + +#: The Celery application +app = Celery('gvafile') + +app.config_from_object('django.conf:settings') +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) diff --git a/gvafile/gvafile/settings/__init__.py b/gvafile/gvafile/settings/__init__.py new file mode 100644 index 0000000..4f53a5e --- /dev/null +++ b/gvafile/gvafile/settings/__init__.py @@ -0,0 +1,3 @@ +""" +This module contains settings for various environments. +""" diff --git a/gvafile/gvafile/settings/base.py b/gvafile/gvafile/settings/base.py new file mode 100644 index 0000000..470a9cf --- /dev/null +++ b/gvafile/gvafile/settings/base.py @@ -0,0 +1,281 @@ +# -*- coding: utf-8 -*- +# pymode:lint_ignore=E501 +""" +Common settings and globals. + +""" + +from os.path import abspath, basename, dirname, join, normpath +from sys import path +from os import environ + +# Normally you should not import ANYTHING from Django directly +# into your settings, but ImproperlyConfigured is an exception. +from django.core.exceptions import ImproperlyConfigured + + +def get_env_setting(setting): + """ + Get the environment setting or return exception. + + :param str setting: name of an environment setting + :raises ImproperlyConfigured: if the environment setting is not defined + :return: environment setting value + :rtype: str + """ + try: + return environ[setting] + except KeyError: + error_msg = "Set the %s env variable" % setting + raise ImproperlyConfigured(error_msg) + + +########## PATH CONFIGURATION +# Absolute filesystem path to the Django project directory: +DJANGO_ROOT = dirname(dirname(abspath(__file__))) + +# Absolute filesystem path to the top-level project folder: +SITE_ROOT = dirname(DJANGO_ROOT) + +# Site name: +SITE_NAME = basename(DJANGO_ROOT) + +# Add our project to our pythonpath, this way we don't need to type our project +# name in our dotted import paths: +path.append(DJANGO_ROOT) +########## END PATH CONFIGURATION + + +########## DEBUG CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug +DEBUG = False + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug +TEMPLATE_DEBUG = DEBUG +########## END DEBUG CONFIGURATION + + +########## MANAGER CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins +ADMINS = ( + (get_env_setting('GVAFILE_ADMIN_NAME'), get_env_setting('GVAFILE_ADMIN_EMAIL')), +) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers +MANAGERS = ADMINS +########## END MANAGER CONFIGURATION + + +########## DATABASE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': normpath(join(DJANGO_ROOT, 'default.db')), + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + }, +} +########## END DATABASE CONFIGURATION + + +########## GENERAL CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone +TIME_ZONE = 'Europe/Berlin' + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code +LANGUAGE_CODE = 'en-us' + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id +SITE_ID = 1 + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n +USE_I18N = True + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n +USE_L10N = True + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-tz +USE_TZ = True +########## END GENERAL CONFIGURATION + + +########## MEDIA CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root +MEDIA_ROOT = normpath(join(SITE_ROOT, 'media')) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url +MEDIA_URL = '/media/' +########## END MEDIA CONFIGURATION + + +########## STATIC FILE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root +STATIC_ROOT = normpath(join(SITE_ROOT, 'assets')) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url +STATIC_URL = '/static/' + +# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS +STATICFILES_DIRS = ( + normpath(join(SITE_ROOT, 'static')), +) + +# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +) +########## END STATIC FILE CONFIGURATION + + +########## SECRET CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key +# Note: This key should only be used for development and testing. +SECRET_KEY = get_env_setting('GVAFILE_SECRETKEY') +########## END SECRET CONFIGURATION + + +########## SITE CONFIGURATION +# Hosts/domain names that are valid for this site +# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts +ALLOWED_HOSTS = [] +########## END SITE CONFIGURATION + + +########## FIXTURE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS +FIXTURE_DIRS = ( + normpath(join(SITE_ROOT, 'fixtures')), +) +########## END FIXTURE CONFIGURATION + + +########## TEMPLATE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors +TEMPLATE_CONTEXT_PROCESSORS = ( + 'django.contrib.auth.context_processors.auth', + 'django.core.context_processors.debug', + 'django.core.context_processors.i18n', + 'django.core.context_processors.media', + 'django.core.context_processors.static', + 'django.core.context_processors.tz', + 'django.contrib.messages.context_processors.messages', + 'django.core.context_processors.request', +) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-dirs +TEMPLATE_DIRS = ( + normpath(join(SITE_ROOT, 'templates')), +) +########## END TEMPLATE CONFIGURATION + + +########## MIDDLEWARE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes +MIDDLEWARE_CLASSES = ( + # Default Django middleware. + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) +########## END MIDDLEWARE CONFIGURATION + + +########## URL CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf +ROOT_URLCONF = '%s.urls' % SITE_NAME +########## END URL CONFIGURATION + + +########## TEST RUNNER CONFIGURATION +TEST_RUNNER = 'django.test.runner.DiscoverRunner' +########## END TEST RUNNER CONFIGURATION + + +########## APP CONFIGURATION +DJANGO_APPS = ( + # Default Django apps: + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + # Useful template tags: + # 'django.contrib.humanize', + + # Admin panel and documentation: + 'django.contrib.admin', + # 'django.contrib.admindocs', +) + +# Apps specific for this project go here. +LOCAL_APPS = ( + 'osusers', +) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps +INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS +########## END APP CONFIGURATION + + +########## LOGGING CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} +########## END LOGGING CONFIGURATION + + +########## WSGI CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application +WSGI_APPLICATION = '%s.wsgi.application' % SITE_NAME +########## END WSGI CONFIGURATION + + +########## CELERY CONFIGURATION +BROKER_URL = get_env_setting('GVAFILE_BROKER_URL') +CELERY_RESULT_BACKEND = 'amqp' +CELERY_RESULT_PERSISTENT = True +CELERY_TASK_RESULT_EXPIRES = None +CELERY_ACCEPT_CONTENT = ['yaml'] +CELERY_RESULT_SERIALIZER = 'yaml' +########## END CELERY CONFIGURATION diff --git a/gvafile/gvafile/settings/local.py b/gvafile/gvafile/settings/local.py new file mode 100644 index 0000000..dbd4381 --- /dev/null +++ b/gvafile/gvafile/settings/local.py @@ -0,0 +1,51 @@ +# pymode:lint_ignore=W0401,E501 +""" +Development settings and globals based on :py:mod:`gvafile.settings.base`. + +""" + +from __future__ import absolute_import + +from .base import * + + +########## DEBUG CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug +DEBUG = True + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug +TEMPLATE_DEBUG = DEBUG +########## END DEBUG CONFIGURATION + + +########## EMAIL CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' +########## END EMAIL CONFIGURATION + + +########## CACHE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + } +} +########## END CACHE CONFIGURATION + + +########## TOOLBAR CONFIGURATION +# See: http://django-debug-toolbar.readthedocs.org/en/latest/installation.html#explicit-setup +INSTALLED_APPS += ( + 'debug_toolbar', +) + +MIDDLEWARE_CLASSES += ( + 'debug_toolbar.middleware.DebugToolbarMiddleware', +) + +DEBUG_TOOLBAR_PATCH_SETTINGS = False + +# http://django-debug-toolbar.readthedocs.org/en/latest/installation.html +INTERNAL_IPS = ('127.0.0.1',) +########## END TOOLBAR CONFIGURATION diff --git a/gvafile/gvafile/settings/production.py b/gvafile/gvafile/settings/production.py new file mode 100644 index 0000000..4419785 --- /dev/null +++ b/gvafile/gvafile/settings/production.py @@ -0,0 +1,50 @@ +# pymode:lint_ignore=W0401,E501 +""" +Production settings and globals based on :py:mod:`gvafile.settings.base`. + +""" + +from __future__ import absolute_import + +from .base import * + +########## HOST CONFIGURATION +# See: https://docs.djangoproject.com/en/1.5/releases/1.5/#allowed-hosts-required-in-production +ALLOWED_HOSTS = get_env_setting('GVAFILE_ALLOWED_HOSTS').split(',') +########## END HOST CONFIGURATION + +########## EMAIL CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host +#EMAIL_HOST = environ.get('EMAIL_HOST', 'smtp.gmail.com') + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host-password +#EMAIL_HOST_PASSWORD = environ.get('EMAIL_HOST_PASSWORD', '') + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host-user +#EMAIL_HOST_USER = environ.get('EMAIL_HOST_USER', 'your_email@example.com') + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-port +#EMAIL_PORT = environ.get('EMAIL_PORT', 587) + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix +EMAIL_SUBJECT_PREFIX = '[%s] ' % SITE_NAME + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-use-tls +#EMAIL_USE_TLS = True + +# See: https://docs.djangoproject.com/en/dev/ref/settings/#server-email +SERVER_EMAIL = get_env_setting('GVAFILE_SERVER_EMAIL') +########## END EMAIL CONFIGURATION + +########## DATABASE CONFIGURATION +#DATABASES = {} +########## END DATABASE CONFIGURATION + + +########## CACHE CONFIGURATION +# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches +#CACHES = {} +########## END CACHE CONFIGURATION diff --git a/gvafile/gvafile/settings/test.py b/gvafile/gvafile/settings/test.py new file mode 100644 index 0000000..a132e85 --- /dev/null +++ b/gvafile/gvafile/settings/test.py @@ -0,0 +1,20 @@ +# pymode:lint_ignore=W0401 +""" +Test settings based on :py:mod:`gvafile.settings.base`. + +""" +from __future__ import absolute_import + +from .base import * + +########## IN-MEMORY TEST DATABASE +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": ":memory:", + "USER": "", + "PASSWORD": "", + "HOST": "", + "PORT": "", + }, +} diff --git a/gvafile/gvafile/urls.py b/gvafile/gvafile/urls.py new file mode 100644 index 0000000..ca59fb7 --- /dev/null +++ b/gvafile/gvafile/urls.py @@ -0,0 +1,25 @@ +""" +This module defines the main URLConf for gvaldap. + +""" + +from django.conf.urls import patterns, include, url +from django.conf import settings + +# Uncomment the next two lines to enable the admin: +from django.contrib import admin +admin.autodiscover() + +urlpatterns = patterns( + '', + url(r'^admin/', include(admin.site.urls)), +) + +# Uncomment the next line to serve media files in dev. +# urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +if settings.DEBUG: + import debug_toolbar + urlpatterns += patterns('', + url(r'^__debug__/', include(debug_toolbar.urls)), + ) diff --git a/gvafile/gvafile/wsgi.py b/gvafile/gvafile/wsgi.py new file mode 100644 index 0000000..41fde2d --- /dev/null +++ b/gvafile/gvafile/wsgi.py @@ -0,0 +1,14 @@ +""" +WSGI config for gvafile project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ +""" + +import os +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvafile.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() diff --git a/gvafile/manage.py b/gvafile/manage.py new file mode 100755 index 0000000..3970649 --- /dev/null +++ b/gvafile/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvafile.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/gvafile/osusers/__init__.py b/gvafile/osusers/__init__.py new file mode 100644 index 0000000..b960717 --- /dev/null +++ b/gvafile/osusers/__init__.py @@ -0,0 +1,3 @@ +""" +This module contains :py:mod:`osusers.tasks`. +""" diff --git a/gvafile/osusers/models.py b/gvafile/osusers/models.py new file mode 100644 index 0000000..d1ff455 --- /dev/null +++ b/gvafile/osusers/models.py @@ -0,0 +1,3 @@ +""" +Empty models module required for Django to accept this as an app. +""" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0b95660 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +# This file is here because many Platforms as a Service look for +# requirements.txt in the root directory of a project. +-r requirements/production.txt diff --git a/requirements/base.txt b/requirements/base.txt new file mode 100644 index 0000000..776286d --- /dev/null +++ b/requirements/base.txt @@ -0,0 +1,11 @@ +Django==1.7.1 +amqp==1.4.6 +bpython==0.13.1 +anyjson==0.3.3 +argparse==1.2.1 +billiard==3.3.0.19 +celery==3.1.17 +kombu==3.0.24 +pytz==2014.10 +wsgiref==0.1.2 +PyYAML==3.11 diff --git a/requirements/local.txt b/requirements/local.txt new file mode 100644 index 0000000..4bdfc63 --- /dev/null +++ b/requirements/local.txt @@ -0,0 +1,7 @@ +# Local development dependencies go here +-r base.txt +coverage==3.7.1 +django-debug-toolbar==1.2.2 +Sphinx==1.2.3 +sqlparse==0.1.14 +releases==0.7.0 diff --git a/requirements/production.txt b/requirements/production.txt new file mode 100644 index 0000000..696dc7c --- /dev/null +++ b/requirements/production.txt @@ -0,0 +1,3 @@ +# Pro-tip: Try not to put anything here. There should be no dependency in +# production that isn't in development. +-r base.txt diff --git a/requirements/test.txt b/requirements/test.txt new file mode 100644 index 0000000..bb78fde --- /dev/null +++ b/requirements/test.txt @@ -0,0 +1,3 @@ +# Test dependencies go here. +-r base.txt +coverage==3.7.1