From f4c8944241041471d67551d94a380c4fa8e13e09 Mon Sep 17 00:00:00 2001 From: "Elf M. Sternberg" Date: Sat, 4 Jun 2016 17:54:28 -0700 Subject: [PATCH] Initial check-in of Cookiecutter version. --- .gitignore | 3 +- AUTHORS.rst | 11 ++ CONTRIBUTING.rst | 128 ++++++++++++++++ HISTORY.rst | 8 + LICENSE | 2 +- MANIFEST.in | 16 +- Makefile | 85 +++++++++++ README.rst | 31 ++++ docs/Makefile | 177 ++++++++++++++++++++++ docs/authors.rst | 1 + docs/conf.py | 275 ++++++++++++++++++++++++++++++++++ docs/contributing.rst | 1 + docs/history.rst | 1 + docs/index.rst | 27 ++++ docs/installation.rst | 49 ++++++ docs/make.bat | 242 ++++++++++++++++++++++++++++++ docs/readme.rst | 1 + docs/usage.rst | 7 + polymorph/__init__.py | 5 + polymorph/polyloader.py | 178 ++++++++++++++++++++++ requirements_dev.txt | 10 ++ setup.cfg | 18 +++ setup.py | 131 ++++++---------- tests/__init__.py | 1 + tests/polytestmix/__init__.py | 0 tests/polytestmix/test1.py | 0 tests/polytestmix/test2.2 | 0 tests/polytestmix/test3.3 | 0 tests/test_polymorph.py | 59 ++++++++ tox.ini | 16 ++ 30 files changed, 1391 insertions(+), 92 deletions(-) create mode 100644 AUTHORS.rst create mode 100644 CONTRIBUTING.rst create mode 100644 HISTORY.rst create mode 100644 Makefile create mode 100644 README.rst create mode 100644 docs/Makefile create mode 100644 docs/authors.rst create mode 100644 docs/conf.py create mode 100644 docs/contributing.rst create mode 100644 docs/history.rst create mode 100644 docs/index.rst create mode 100644 docs/installation.rst create mode 100644 docs/make.bat create mode 100644 docs/readme.rst create mode 100644 docs/usage.rst create mode 100644 polymorph/__init__.py create mode 100644 polymorph/polyloader.py create mode 100644 requirements_dev.txt create mode 100644 setup.cfg mode change 100755 => 100644 setup.py create mode 100644 tests/__init__.py create mode 100644 tests/polytestmix/__init__.py create mode 100644 tests/polytestmix/test1.py create mode 100644 tests/polytestmix/test2.2 create mode 100644 tests/polytestmix/test3.3 create mode 100644 tests/test_polymorph.py create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index 394611b..09857c7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ bower_components *.pyc \#*# .#* -catalogia/settings.hy +*.egg-info +build/* diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..6aa3394 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,11 @@ +======= Credits ======= + +Development Lead +---------------- + +- Kenneth M. "Elf" Sternberg elf.sternberg@gmail.com + +Contributors +------------ + +None yet. Why not be the first? diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000..49f8b35 --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,128 @@ +Contributing +============ + +Contributions are welcome, and they are greatly appreciated! Every +little bit helps, and credit will always be given. + +You can contribute in many ways: + +Types of Contributions +---------------------- + +Report Bugs +~~~~~~~~~~~ + +Report bugs at +https://github.com/elfsternberg/py-polymorphic-loader/issues. + +If you are reporting a bug, please include: + +- Your operating system name and version. +- Any details about your local setup that might be helpful in + troubleshooting. +- Detailed steps to reproduce the bug. + +Fix Bugs +~~~~~~~~ + +Look through the GitHub issues for bugs. Anything tagged with "bug" is +open to whoever wants to implement it. + +Implement Features +~~~~~~~~~~~~~~~~~~ + +Look through the GitHub issues for features. Anything tagged with +"feature" is open to whoever wants to implement it. + +Write Documentation +~~~~~~~~~~~~~~~~~~~ + +py-polymorphic-loader could always use more documentation, whether as +part of the official py-polymorphic-loader docs, in docstrings, or even +on the web in blog posts, articles, and such. + +Submit Feedback +~~~~~~~~~~~~~~~ + +The best way to send feedback is to file an issue at +https://github.com/elfsternberg/py-polymorphic-loader/issues. + +If you are proposing a feature: + +- Explain in detail how it would work. +- Keep the scope as narrow as possible, to make it easier to implement. +- Remember that this is a volunteer-driven project, and that + contributions are welcome :) + +Get Started! +------------ + +Ready to contribute? Here's how to set up py-polymorphic-loader for +local development. + +1. Fork the py-polymorphic-loader repo on GitHub. +2. Clone your fork locally: + + :: + + $ git clone git@github.com:your_name_here/py-polymorphic-loader.git + +3. Install your local copy into a virtualenv. Assuming you have + virtualenvwrapper installed, this is how you set up your fork for + local development: + + :: + + $ mkvirtualenv py-polymorphic-loader + $ cd py-polymorphic-loader/ + $ python setup.py develop + +4. Create a branch for local development: + + :: + + $ git checkout -b name-of-your-bugfix-or-feature + + Now you can make your changes locally. + +5. When you're done making changes, check that your changes pass flake8 + and the tests, including testing other Python versions with tox: + + :: + + $ flake8 py-polymorphic-loader tests + $ python setup.py test or py.test + $ tox + + To get flake8 and tox, just pip install them into your virtualenv. + +6. Commit your changes and push your branch to GitHub: + + :: + + $ git add . + $ git commit -m "Your detailed description of your changes." + $ git push origin name-of-your-bugfix-or-feature + +7. Submit a pull request through the GitHub website. + +Pull Request Guidelines +----------------------- + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests. +2. If the pull request adds functionality, the docs should be updated. + Put your new functionality into a function with a docstring, and add + the feature to the list in README.rst. +3. The pull request should work for Python 2.6, 2.7, 3.3, 3.4 and 3.5, + and for PyPy. Check + https://travis-ci.org/elfsternberg/py-polymorphic-loader/pull_requests + and make sure that the tests pass for all supported Python versions. + +Tips +---- + +To run a subset of tests: + +$ py.test tests.test\_py-polymorphic-loader diff --git a/HISTORY.rst b/HISTORY.rst new file mode 100644 index 0000000..c07417e --- /dev/null +++ b/HISTORY.rst @@ -0,0 +1,8 @@ +History +======= + +0.1.0 (2016-06-01) +------------------ + +- First release on PyPI. + diff --git a/LICENSE b/LICENSE index bd22866..d050c35 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2004-2016 Elf M. Sternberg +Copyright (c) 2016 Kenneth M. "Elf" Sternberg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/MANIFEST.in b/MANIFEST.in index 1b2a0de..68e47f0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,11 @@ -include *.py +include AUTHORS.md +include CONTRIBUTING.md +include HISTORY.md include LICENSE -exclude run_tests.py -exclude requirements.txt -exclude README.md -recursive-include *.py -prune tests +include README.md + +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + +recursive-include docs *.md conf.py Makefile make.bat *.jpg *.png *.gif diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7650be7 --- /dev/null +++ b/Makefile @@ -0,0 +1,85 @@ +.PHONY: clean-pyc clean-build docs clean +define BROWSER_PYSCRIPT +import os, webbrowser, sys +try: + from urllib import pathname2url +except: + from urllib.request import pathname2url + +webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1]))) +endef +export BROWSER_PYSCRIPT +BROWSER := python -c "$$BROWSER_PYSCRIPT" + +help: + @echo "clean - remove all build, test, coverage and Python artifacts" + @echo "clean-build - remove build artifacts" + @echo "clean-pyc - remove Python file artifacts" + @echo "clean-test - remove test and coverage artifacts" + @echo "lint - check style with flake8" + @echo "test - run tests quickly with the default Python" + @echo "test-all - run tests on every Python version with tox" + @echo "coverage - check code coverage quickly with the default Python" + @echo "docs - generate Sphinx HTML documentation, including API docs" + @echo "release - package and upload a release" + @echo "dist - package" + @echo "install - install the package to the active Python's site-packages" + +clean: clean-build clean-pyc clean-test + +clean-build: + rm -fr build/ + rm -fr dist/ + rm -fr .eggs/ + find . -name '*.egg-info' -exec rm -fr {} + + find . -name '*.egg' -exec rm -f {} + + +clean-pyc: + find . -name '*.pyc' -exec rm -f {} + + find . -name '*.pyo' -exec rm -f {} + + find . -name '*~' -exec rm -f {} + + find . -name '__pycache__' -exec rm -fr {} + + +clean-test: + rm -fr .tox/ + rm -f .coverage + rm -fr htmlcov/ + +lint: + flake8 py-polymorphic-loader tests + +test: + py.test + + +test-all: + tox + +coverage: + coverage run --source py-polymorphic-loader py.test + coverage report -m + coverage html + $(BROWSER) htmlcov/index.html + +docs: + rm -f docs/py-polymorphic-loader.rst + rm -f docs/modules.rst + sphinx-apidoc -o docs/ py-polymorphic-loader + $(MAKE) -C docs clean + $(MAKE) -C docs html + $(BROWSER) docs/_build/html/index.html + +servedocs: docs + watchmedo shell-command -p '*.rst' -c '$(MAKE) -C docs html' -R -D . + +release: clean + python setup.py sdist upload + python setup.py bdist_wheel upload + +dist: clean + python setup.py sdist + python setup.py bdist_wheel + ls -l dist + +install: clean + python setup.py install diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..defddb6 --- /dev/null +++ b/README.rst @@ -0,0 +1,31 @@ +**polyloader** is a python module to hook into Python's import machinery +and insert your own syntax parser/recognizer. Importlib uses filename +suffixes to recognize which compiler to use, but is internally +hard-coded to only recognize ".py" as a valid suffix. + +To use: +------- + +Import polyloader in your python script's launcher or library, as well +as the syntax compiler(s) you plan to use. For example, if you have +`Mochi `__ and +`Hy `__ installed, and you wanted to +write a Django app, edit manage.py and add the following lines at the +top: + +:: + + from mochi.main import compile_file as mochi_compile + from hy.importer import ast_compile as hy_compile + from polyloader import polyimport + polyimport(mochi_compile, ['.mochi']) + polyimport(hy_compile, ['.hy'])} + +Now your views can be written in Hy and your models in Mochi, and +everything will just work. + +Dependencies +------------ + +polymorph is self-contained. It has no dependencies other than Python +itself and your choice of language. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..09d7d1d --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# 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 " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @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 " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @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/py-polymorphic-loader.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/py-polymorphic-loader.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/py-polymorphic-loader" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/py-polymorphic-loader" + @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." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @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." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/authors.rst b/docs/authors.rst new file mode 100644 index 0000000..e122f91 --- /dev/null +++ b/docs/authors.rst @@ -0,0 +1 @@ +.. include:: ../AUTHORS.rst diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..7fc79a1 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,275 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# py-polymorphic-loader documentation build configuration file, created by +# sphinx-quickstart on Tue Jul 9 22:26:36 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('.')) + +# Get the project root dir, which is the parent dir of this +cwd = os.getcwd() +project_root = os.path.dirname(cwd) + +# Insert the project root dir as the first element in the PYTHONPATH. +# This lets us ensure that the source package is imported, and that its +# version is used. +sys.path.insert(0, project_root) + +import py-polymorphic-loader + +# -- 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 = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# 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'py-polymorphic-loader' +copyright = u'2016, Kenneth M. "Elf" Sternberg' + +# 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 = py-polymorphic-loader.__version__ +# The full version, including alpha/beta/rc tags. +release = py-polymorphic-loader.__version__ + +# 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 = [] + +# If true, keep warnings as "system message" paragraphs in the built +# documents. +#keep_warnings = False + + +# -- 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 = 'py-polymorphic-loaderdoc' + + +# -- 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', 'py-polymorphic-loader.tex', + u'py-polymorphic-loader Documentation', + u'Kenneth M. "Elf" Sternberg', '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', 'py-polymorphic-loader', + u'py-polymorphic-loader Documentation', + [u'Kenneth M. "Elf" Sternberg'], 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', 'py-polymorphic-loader', + u'py-polymorphic-loader Documentation', + u'Kenneth M. "Elf" Sternberg', + 'py-polymorphic-loader', + 'One line description of project.', + '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' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/docs/contributing.rst b/docs/contributing.rst new file mode 100644 index 0000000..e582053 --- /dev/null +++ b/docs/contributing.rst @@ -0,0 +1 @@ +.. include:: ../CONTRIBUTING.rst diff --git a/docs/history.rst b/docs/history.rst new file mode 100644 index 0000000..2506499 --- /dev/null +++ b/docs/history.rst @@ -0,0 +1 @@ +.. include:: ../HISTORY.rst diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..ea96316 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,27 @@ +.. py-polymorphic-loader documentation master file, created by + sphinx-quickstart on Tue Jul 9 22:26:36 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to py-polymorphic-loader's documentation! +====================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + readme + installation + usage + contributing + authors + history + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..5eca886 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,49 @@ +.. highlight:: shell + +============ +Installation +============ + + +Stable release +-------------- + +To install py-polymorphic-loader, run this command in your terminal: + +.. code-block:: console + + $ pip install py-polymorphic-loader + +If you don't have `pip`_ installed, this `Python installation guide`_ can guide +you through the process. + +.. _pip: https://pip.pypa.io +.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ + + +From sources +------------ + +The sources for py-polymorphic-loader can be downloaded from the `Github repo`_. + +You can either clone the public repository: + +.. code-block:: console + + $ git clone git://github.com/elfsternberg/py-polymorphic-loader + +Or download the `tarball`_: + +.. code-block:: console + + $ curl -OL https://github.com/elfsternberg/py-polymorphic-loader/tarball/master + +Once you have a copy of the source, you can install it with: + +.. code-block:: console + + $ python setup.py install + + +.. _Github repo: https://github.com/elfsternberg/py-polymorphic-loader +.. _tarball: https://github.com/elfsternberg/py-polymorphic-loader/tarball/master diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..7177dbe --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,242 @@ +@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. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + 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 +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +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\py-polymorphic-loader.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\py-polymorphic-loader.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" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF 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 +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/docs/readme.rst b/docs/readme.rst new file mode 100644 index 0000000..72a3355 --- /dev/null +++ b/docs/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst diff --git a/docs/usage.rst b/docs/usage.rst new file mode 100644 index 0000000..587eb68 --- /dev/null +++ b/docs/usage.rst @@ -0,0 +1,7 @@ +===== +Usage +===== + +To use py-polymorphic-loader in a project:: + + import py-polymorphic-loader diff --git a/polymorph/__init__.py b/polymorph/__init__.py new file mode 100644 index 0000000..89795e2 --- /dev/null +++ b/polymorph/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +__author__ = 'Kenneth M. "Elf" Sternberg' +__email__ = 'elf.sternberg@gmail.com' +__version__ = '0.1.0' diff --git a/polymorph/polyloader.py b/polymorph/polyloader.py new file mode 100644 index 0000000..d414a02 --- /dev/null +++ b/polymorph/polyloader.py @@ -0,0 +1,178 @@ +# polyloader.py +# +# Copyright (c) 2016 Elf M. Sternberg +# +# 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. +# + +""" Utilities for initializing extended path-hooks into the Python runtime """ +__all__ = [] # Exports nothing; this module is called for its side-effects + +import os +import sys + +from importlib import machinery +from importlib.machinery import SOURCE_SUFFIXES as PY_SOURCE_SUFFIXES +from pkgutil import iter_importer_modules + +try: + from importlib._bootstrap import _get_supported_file_loaders +except: + from importlib._bootstrap_external import _get_supported_file_loaders + +__author__ = 'Elf M. Sternberg' +__version__ = '2016.05.29' +__contact__ = 'elf.sternberg@gmail.com' + +def _call_with_frames_removed(f, *args, **kwds): + # Hack. This function name and signature is hard-coded into + # Python's import.c. The name and signature trigger importlib to + # remove itself from any stacktraces. See import.c for details. + return f(*args, **kwds) + + +class ExtendedSourceFileLoader(machinery.SourceFileLoader): + """Override the get_code method. Falls back on the SourceFileLoader + if it's a Python file, which will generate pyc files as needed, + or works its way into the Extended version. This method does + not yet address the generation of .pyc/.pyo files from source + files. + + """ + + _source_handlers = [] + + @classmethod + def get_extended_suffixes(cls): + suffixes = [] + for compiler, csuffx in cls._source_handlers: + suffixes = suffixes + list(csuffx) + return suffixes + + @classmethod + def get_extended_suffixes_inclusive(cls): + return PY_SOURCE_SUFFIXES + cls.get_extended_suffixes() + + # TODO: Address the generation of .pyc/.pyo files from source files. + # See importlib/_bootstrap.py for details is SourceFileLoader of + # how that's done. + def get_code(self, fullname): + source_path = self.get_filename(fullname) + if source_path.endswith(tuple(PY_SOURCE_SUFFIXES)): + return super(ExtendedSourceFileLoader, self).get_code(fullname) + + for compiler, suffixes in self._source_handlers: + if source_path.endswith(suffixes): + return compiler(source_path, fullname) + else: + raise ImportError("Could not find compiler for %s (%s)" % (fullname, source_path)) + +# Provide a working namespace for our new FileFinder. +class ExtendedFileFinder(machinery.FileFinder): + + # Taken from inspect.py and modified to support alternate suffixes. + @staticmethod + def getmodulename(path): + fname = os.path.basename(path) + suffixes = [(-len(suffix), suffix) + for suffix in (machinery.all_suffixes() + + ExtendedSourceFileLoader.get_extended_suffixes())] + suffixes.sort() # try longest suffixes first, in case they overlap + for neglen, suffix in suffixes: + if fname.endswith(suffix): + return fname[:neglen] + return None + + # Taken from pkgutil.py and modified to support alternate suffixes. + @staticmethod + def iter_modules(importer, prefix=''): + if importer.path is None or not os.path.isdir(importer.path): + return + + yielded = {} + try: + filenames = os.listdir(importer.path) + except OSError: + # ignore unreadable directories like import does + filenames = [] + filenames.sort() # handle packages before same-named modules + + for fn in filenames: + modname = ExtendedFileFinder.getmodulename(fn) + if modname == '__init__' or modname in yielded: + continue + + path = os.path.join(importer.path, fn) + ispkg = False + + if not modname and os.path.isdir(path) and '.' not in fn: + modname = fn + try: + dircontents = os.listdir(path) + except OSError: + # ignore unreadable directories like import does + dircontents = [] + for fn in dircontents: + subname = ExtendedFileFinder.getmodulename(fn) + if subname == '__init__': + ispkg = True + break + else: + continue # not a package + + if modname and '.' not in modname: + yielded[modname] = 1 + yield prefix + modname, ispkg + pass + + +# Monkeypatch both path_hooks and iter_importer_modules to make our +# modules recognizable to the module iterator functions. This is +# probably horribly fragile, but there doesn't seem to be a more +# robust way of doing it at the moment, and these names are stable +# from python 2.7 up. + +def install(compiler, suffixes): + """ Install a compiler and suffix(es) into Python's sys.path_hooks, so + that modules ending with thoses suffixes will be parsed into + python executable modules automatically. + """ + + filefinder = [(f, i) for i, f in enumerate(sys.path_hooks) + if repr(f).find('path_hook_for_FileFinder') != -1] + if not filefinder: + return + filefinder, fpos = filefinder[0] + + ExtendedSourceFileLoader._source_handlers = (ExtendedSourceFileLoader._source_handlers + + [(compiler, tuple(suffixes))]) + + supported_loaders = _get_supported_file_loaders() + sourceloader = [(l, i) for i, l in enumerate(supported_loaders) + if repr(l[0]).find('importlib.SourceFileLoader') != -1] + if not sourceloader: + return + + sourceloader, spos = sourceloader[0] + supported_loaders[spos] = (ExtendedSourceFileLoader, + ExtendedSourceFileLoader.get_extended_suffixes_inclusive()) + sys.path_hooks[fpos] = ExtendedFileFinder.path_hook(*supported_loaders) + iter_importer_modules.register(ExtendedFileFinder, ExtendedFileFinder.iter_modules) + if sys.path[0] !== "": + sys.path.insert(0, "") diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..0f8b477 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,10 @@ +bumpversion==0.5.3 +wheel==0.23.0 +watchdog==0.8.3 +flake8==2.4.1 +tox==2.1.1 +coverage==4.0 +Sphinx==1.3.1 +cryptography==1.0.1 +PyYAML==3.11 +pytest==2.8.3 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..cc870e5 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,18 @@ +[bumpversion] +current_version = 0.1.0 +commit = True +tag = True + +[bumpversion:file:setup.py] +search = version='{current_version}' +replace = version='{new_version}' + +[bumpversion:file:polymorph/__init__.py] +search = __version__ = '{current_version}' +replace = __version__ = '{new_version}' + +[wheel] +universal = 1 + +[flake8] +exclude = docs diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index c824930..5da5917 --- a/setup.py +++ b/setup.py @@ -1,95 +1,58 @@ -#!/usr/bin/python +#!/usr/bin/env python +# -*- coding: utf-8 -*- -import ast -import os -import re -import sys try: - from setuptools import setup, Command -except ImportError as excp: - from distutils.core import setup, Command - -from unittest import TestLoader, TextTestRunner + from setuptools import setup +except ImportError: + from distutils.core import setup -os.environ['COPY_EXTENDED_ATTRIBUTES_DISABLE'] = 'true' -os.environ['COPYFILE_DISABLE'] = 'true' +with open('README.rst') as readme_file: + readme = readme_file.read() +with open('HISTORY.rst') as history_file: + history = history_file.read() -def _read_doc(): - """ - Parse docstring from file 'polyloader.py' and avoid importing - this module directly. - """ - with open('polyloader.py', 'r') as f: - tree = ast.parse(f.read()) - return ast.get_docstring(tree) +requirements = [ + # TODO: put package requirements here +] +test_requirements = [ + # TODO: put package test requirements here +] -def _read_attr(attr_name): - """ - Parse attribute from file 'polyloader.py' and avoid importing - this module directly. - - __version__, __author__, __contact__, - """ - regex = attr_name + r"\s+=\s+'(.+)'" - with open('polyloader.py', 'r') as f: - match = re.search(regex, f.read()) - # Second item in the group is the value of attribute. - return match.group(1) - - -class TestCommand(Command): - """Run tests.""" - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - -polyloader_version = _read_attr('__version__') -if 'bdist_msi' in sys.argv: - polyloader_version, _, _ = polyloader_version.partition('-') - - -class TestCommand(Command): - """Run tests.""" - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - test_suite = TestLoader().discover('./tests', pattern='*_test.py') - test_results = TextTestRunner(verbosity=2).run(test_suite) - - -setup(name = 'polyloader', - version = polyloader_version, - description = 'Python artbitrary syntax import hooks', - author = _read_attr('__author__'), - author_email = _read_attr('__contact__'), - url = 'https://github.com/elfsternberg/py-polymorphic-loader', - keywords = ['python', 'import', 'language', 'hy', 'mochi'], - classifiers = [ - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'Natural Language :: English', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Topic :: Software Development :: Libraries :: Python Modules'], - long_description = "\n".join(_read_doc().split('\n')), - cmdclass={"test": TestCommand}, - py_modules = ['polyloader'], - install_requires=[ - 'future', +setup( + name='py-polymorphic-loader', + version='0.1.0', + description="Importlib shim that enables mixed syntax in Python packages and executables.", + long_description=readme + '\n\n' + history, + author='Kenneth M. "Elf" Sternberg', + author_email='elf.sternberg@gmail.com', + url='https://github.com/elfsternberg/py-polymorphic-loader', + packages=[ + 'py-polymorphic-loader', ], + package_dir={'py-polymorphic-loader': 'polymorph'}, + include_package_data=True, + install_requires=requirements, + license="MIT", + zip_safe=False, + keywords='py-polymorphic-loader', + classifiers=[ + 'Development Status :: 2 - Pre-Alpha', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License (MIT)', + 'Operating System :: OS Independent', + 'Natural Language :: English', + "Programming Language :: Python :: 2", + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Topic :: Software Development :: Libraries :: Python Modules' + ], + test_suite='tests', + tests_require=test_requirements ) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/tests/polytestmix/__init__.py b/tests/polytestmix/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/polytestmix/test1.py b/tests/polytestmix/test1.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/polytestmix/test2.2 b/tests/polytestmix/test2.2 new file mode 100644 index 0000000..e69de29 diff --git a/tests/polytestmix/test3.3 b/tests/polytestmix/test3.3 new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_polymorph.py b/tests/test_polymorph.py new file mode 100644 index 0000000..bd5f83c --- /dev/null +++ b/tests/test_polymorph.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +test_py-polymorphic-loader +---------------------------------- + +Tests for `py-polymorphic-loader` module. +""" + +import pytest + + +from py_polymorphic_loader import polymorph + +# Note that these compilers don't actually load anything out of the +# source files. That's not the point. The point is to show that the +# correct compiler has been found for a given extension. + +def compiler2(filename): + return compile("result='Success for %s'" % (filename), filename, "exec") + +def compiler3(filename): + return compile("result='Success for %s'" % (filename), filename, "exec") + +class Test_Polymorph_1(object): + def test_import1(self): + import polytestmix + polytestmix.install(compiler2, ['.2']) + polytestmix.install(compiler3, ['.3']) + assert(polytestmix.test2.result = "Success for test2") + assert(polytestmix.test3.result = "Success for test3") + +class Test_Polymorph_2(object): + def test_import2(self): + import polytestmix + polytestmix.install(compiler2, ['.2']) + polytestmix.install(compiler3, ['.3']) + assert(polytestmix.test2.result = "Success for test2") + +class Test_Polymorph_2(object): + def test_import2(self): + import polytestmix.test3 + polytestmix.install(compiler2, ['.2']) + polytestmix.install(compiler3, ['.3']) + assert(polytestmix.test3.result = "Success for test3") + +class Test_Polymorph_Iterator(object): + ''' The Django Compatibility test. ''' + def test_iterator(self): + import polytestmix.test3 + polytestmix.install(compiler2, ['.2']) + polytestmix.install(compiler3, ['.3']) + target_dir = os.path.join('.', 'polytestmix') + files = set([name for _, name, is_pkg in pkgutil.iter_modules([targetdir]) + if not is_pkg and not name.startswith('_')]) + assert(files == set(['test2.2', 'test3.3', 'test1.py'])) + + diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..0f46f77 --- /dev/null +++ b/tox.ini @@ -0,0 +1,16 @@ +[tox] +envlist = py26, py27, py33, py34, py35 + +[testenv] +setenv = + PYTHONPATH = {toxinidir}:{toxinidir}/py-polymorphic-loader +deps = + -r{toxinidir}/requirements_dev.txt +commands = + py.test --basetemp={envtmpdir} + + +; If you want to make tox run the tests with the same versions, create a +; requirements.txt with the pinned versions and uncomment the following lines: +; deps = +; -r{toxinidir}/requirements.txt