diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..661d317 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +*.py[cod] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +var +sdist +develop-eggs +.installed.cfg +lib +lib64 + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml +htmlcov +cover +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Complexity +output/*.html +output/*/index.html + +# Sphinx +docs/_build \ No newline at end of file diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..45b6a02 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,5 @@ +======= +Credits +======= + +* viaForensics diff --git a/HISTORY.rst b/HISTORY.rst new file mode 100644 index 0000000..70b0d98 --- /dev/null +++ b/HISTORY.rst @@ -0,0 +1,9 @@ +.. :changelog: + +History +------- + +0.1.0 (2014-12-15) +--------------------- + +* Initial release. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..24e5215 --- /dev/null +++ b/LICENSE @@ -0,0 +1,3 @@ +(c) Copyright 2014 viaForensics. All rights reserved. + +See datagrid-gtk2/data/LICENSE.txt for complete credits. \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..37d50c5 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,8 @@ +include AUTHORS.rst +include HISTORY.rst +include LICENSE +include README.rst +include requirements.txt + +recursive-include *.so +recursive-include datagrid-gtk2/data * \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9504a39 --- /dev/null +++ b/Makefile @@ -0,0 +1,83 @@ +SHELL := /bin/bash +.PHONY: clean-pyc clean-build docs clean + +help: + @echo "clean-build - remove build artifacts" + @echo "clean-pyc - remove Python file artifacts" + @echo "lint - check style with flake8" + @echo "test - run tests quickly with the default Python" + @echo "test-unit - run unit tests quickly with the default Python (assumes separate 'functional' test directory)" + @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 "dist-wheel - package with wheel" + @echo "deb-dist - create deb package; requires python-stdeb installed" + @echo "virtualenv - make virtualenv and install requirements; requires virtualenvwrapper" + @echo "virtualenv-gtk - link required PyGTK paths to virtualenv" + +clean: clean-build clean-pyc + rm -fr htmlcov/ + +clean-build: + rm -fr build/ + rm -fr dist/ + rm -fr deb_dist/ + rm -fr *.egg-info + +clean-pyc: + find . -name '*.pyc' -exec rm -f {} + + find . -name '*.pyo' -exec rm -f {} + + find . -name '*~' -exec rm -f {} + + +lint: + flake8 datagrid-gtk2 + +test: + python setup.py nosetests + +test-unit: + python setup.py nosetests --exclude=functional + +coverage: + coverage run --source datagrid-gtk2 setup.py test + coverage report -m + coverage html + xdg-open htmlcov/index.html + +docs: + rm -f docs/datagrid-gtk2.rst + rm -f docs/modules.rst + sphinx-apidoc -o docs/api datagrid-gtk2 --force + $(MAKE) -C docs clean + $(MAKE) -C docs html + xdg-open docs/_build/html/index.html + +# WARNING: open source only +# release: clean +# python setup.py sdist upload +# python setup.py bdist_wheel upload +# END WARNING + +dist: clean + python setup.py sdist + python setup.py bdist_egg + ls -l dist + +# NOTE: dist-wheel requires wheel Python package +dist-wheel: clean + python setup.py sdist + python setup.py bdist_wheel + ls -l dist + +# NOTE: deb-dist requires python-stdeb .deb pkg installed +deb-dist: clean + python setup.py --command-packages=stdeb.command bdist_deb + ls -l deb_dist + +virtualenv: + test -d $(WORKON_HOME)/datagrid-gtk2 || virtualenv $(WORKON_HOME)/datagrid-gtk2 + . $(WORKON_HOME)/datagrid-gtk2/bin/activate; pip install -r requirements.txt -r test_requirements.txt + +virtualenv-gtk: + ln -sf /usr/lib/python2.7/dist-packages/{glib,gobject,cairo,gtk-2.0,pygtk.py,pygtk.pth} $(VIRTUAL_ENV)/lib/python2.7/site-packages \ No newline at end of file diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..49e7cf6 --- /dev/null +++ b/README.rst @@ -0,0 +1,5 @@ +=============================== +datagrid-gtk2 +=============================== + +MVC framework for working with the GTK2 TreeView widget. \ No newline at end of file diff --git a/bin/buildtools/create_encrypted_deb_pkg.sh b/bin/buildtools/create_encrypted_deb_pkg.sh new file mode 100644 index 0000000..f3b7352 --- /dev/null +++ b/bin/buildtools/create_encrypted_deb_pkg.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +### +# Create a .deb package from Python library in the current working directory +# with CodeMeter-encrypted bytecode. +# +# NOTE: this is a work in progress that has been tested on Santoku 0.4 and +# currently requires the following: +# +# - sudo apt-get install dpkg-dev debhelper python-all-dev +# - sudo pip install stdeb # (outside of virtualenv) +# - viaForensics pycEncrypt utility available in executable path +# +# IMPORTANT: deactivate any active virtualenv before you run this script. +# +# Example: +# ./create_encrypted_deb_pkg.sh 5000342 2000 124 /my_path/versionkeys/RSApublic-v1.key + +FIRM_CODE=$1 +PRODUCT_CODE=$2 +MEM_LOCATION=$3 +PUBLIC_KEY_LOCATION=$4 + +CUR_DIR=`pwd` +MODIFY_PKG_SCRIPT="${CUR_DIR}/bin/buildtools/modify_deb_pkg.sh" + +if [[ ! -f $PUBLIC_KEY_LOCATION ]]; then + echo "[!] Public key for CodeMeter bytecode encryption not found" + exit 1 +fi +KEY_PATH=`realpath ${PUBLIC_KEY_LOCATION}` + +# build package +echo "==> Building package" +python setup.py --command-packages=stdeb.command sdist_dsc +if [[ -f $MODIFY_PKG_SCRIPT ]]; then + ${MODIFY_PKG_SCRIPT} +fi +cd deb_dist/datagrid-gtk2-* +dpkg-buildpackage -uc -us + +# unpackage .deb pkg and modify it for codemeter encryption +# FIXME: obviously ideally this wouldn't be necessary, but packaging tools +# seem to have a need to introspect Python files, which is broken by our +# CodeMeter dependency -- how else to fix? +echo "==> Processing package for CodeMeter encryption" +BUILD_DIR="/tmp/datagrid-gtk2_build" +cd $CUR_DIR +DEB_NAME=`find ./deb_dist -type f -name "python-datagrid-gtk2*.deb" | xargs basename` +rm -rf $BUILD_DIR +mkdir $BUILD_DIR +echo "==> Processing package: ${DEB_NAME}" +cp deb_dist/$DEB_NAME $BUILD_DIR +cd $BUILD_DIR +dpkg-deb -x $DEB_NAME . +dpkg-deb -e $DEB_NAME +rm $DEB_NAME +cd $BUILD_DIR/usr/lib/python2.7/dist-packages +# remove pyshared-related items +find datagrid-gtk2 -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \; +find datagrid-gtk2*.egg-info -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \; +rm -rf $BUILD_DIR/usr/share/pyshared +rm -rf $BUILD_DIR/usr/lib/python2.7/dist-packages/datagrid-gtk2*.egg-info/requires.txt +rm -rf $BUILD_DIR/DEBIAN/md5sums +# compile and encrypt source +find datagrid-gtk2 -type f -name "*.pyc" -exec rm {} \; +python -m compileall datagrid-gtk2 +find datagrid-gtk2 -type f -name "*.py" -exec rm {} \; +find datagrid-gtk2 -type f -name "*.pyc" -exec pycEncrypt e f${FIRM_CODE} p${PRODUCT_CODE} R${MEM_LOCATION} ${KEY_PATH} {} {} \; + +# rebuild package +cd $BUILD_DIR +dpkg-deb -b . /tmp/$DEB_NAME +mv /tmp/$DEB_NAME $CUR_DIR +rm -rf $BUILD_DIR \ No newline at end of file diff --git a/bin/buildtools/debian/postinst b/bin/buildtools/debian/postinst new file mode 100644 index 0000000..7487f0a --- /dev/null +++ b/bin/buildtools/debian/postinst @@ -0,0 +1,12 @@ +#!/bin/sh +set -e + +# Automatically added by dh_python2: +if which pycompile >/dev/null 2>&1; then + pycompile -p viaextract +fi + +# End automatically added section + +# use custom CodeMeter-enabled python interpeter +sudo sed -i "s/\#\!\/usr\/bin\/python/\#\!\/usr\/local\/bin\/python.via/g" /usr/bin/datagrid-gtk2 diff --git a/bin/buildtools/modify_deb_pkg.sh b/bin/buildtools/modify_deb_pkg.sh new file mode 100644 index 0000000..6c62d04 --- /dev/null +++ b/bin/buildtools/modify_deb_pkg.sh @@ -0,0 +1 @@ +cp bin/buildtools/debian/postinst deb_dist/datagrid-gtk2-*/debian/ \ No newline at end of file diff --git a/bin/datagrid-gtk2-debug b/bin/datagrid-gtk2-debug new file mode 100644 index 0000000..b24b862 --- /dev/null +++ b/bin/datagrid-gtk2-debug @@ -0,0 +1,3 @@ +#!/bin/bash +export VIA_DEBUG=1 +python -m datagrid-gtk2.main \ No newline at end of file diff --git a/datagrid-gtk2/__init__.py b/datagrid-gtk2/__init__.py new file mode 100644 index 0000000..1abbf80 --- /dev/null +++ b/datagrid-gtk2/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +__author__ = 'viaForensics' +__email__ = 'info@viaforensics.com' +__version__ = '0.1.0' + +# Set default logging handler to avoid "No handler found" warnings. +import logging +logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/datagrid-gtk2/data/LICENSE.txt b/datagrid-gtk2/data/LICENSE.txt new file mode 100644 index 0000000..daa6c57 --- /dev/null +++ b/datagrid-gtk2/data/LICENSE.txt @@ -0,0 +1 @@ +(c) Copyright 2014 viaForensics. All rights reserved. \ No newline at end of file diff --git a/datagrid-gtk2/data/README b/datagrid-gtk2/data/README new file mode 100644 index 0000000..78457de --- /dev/null +++ b/datagrid-gtk2/data/README @@ -0,0 +1 @@ +Package data files go here. See setup.py \ No newline at end of file diff --git a/datagrid-gtk2/main.py b/datagrid-gtk2/main.py new file mode 100644 index 0000000..0fe6357 --- /dev/null +++ b/datagrid-gtk2/main.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +"""Main module.""" + +import logging +logger = logging.getLogger(__name__) + + +def main(): + """This is the main function.""" + logger.info('Printing hello message.') + print 'Hello from datagrid-gtk2' + + +if __name__ == '__main__': + main() diff --git a/datagrid-gtk2/tests/__init__.py b/datagrid-gtk2/tests/__init__.py new file mode 100644 index 0000000..eb966b7 --- /dev/null +++ b/datagrid-gtk2/tests/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +# NOTE: tests directory can go either inside or outside package directory. +# In cases where the production environment is likely to be quite different +# from the development environment, it can be useful to distribute the +# tests to be able to run them in the production environment. diff --git a/datagrid-gtk2/tests/test_datagrid-gtk2.py b/datagrid-gtk2/tests/test_datagrid-gtk2.py new file mode 100644 index 0000000..9e85e0f --- /dev/null +++ b/datagrid-gtk2/tests/test_datagrid-gtk2.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +test_datagrid-gtk2 +---------------------------------- + +Tests for `datagrid-gtk2` module. +""" + +import unittest + + +class TestDatagrid-gtk2(unittest.TestCase): + + def setUp(self): + pass + + def test_something(self): + pass + + def tearDown(self): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..1e95131 --- /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/datagrid-gtk2.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/datagrid-gtk2.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/datagrid-gtk2" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/datagrid-gtk2" + @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." \ No newline at end of file diff --git a/docs/authors.rst b/docs/authors.rst new file mode 100644 index 0000000..94292d0 --- /dev/null +++ b/docs/authors.rst @@ -0,0 +1 @@ +.. include:: ../AUTHORS.rst \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..8010bd7 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,275 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# datagrid-gtk2 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 datagrid-gtk2 + +# -- 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'] + +# 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'datagrid-gtk2' +copyright = u'2014, viaForensics' + +# 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 = datagrid-gtk2.__version__ +# The full version, including alpha/beta/rc tags. +release = datagrid-gtk2.__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 = 'datagrid-gtk2doc' + + +# -- 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', 'datagrid-gtk2.tex', + u'datagrid-gtk2 Documentation', + u'viaForensics', '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', 'datagrid-gtk2', + u'datagrid-gtk2 Documentation', + [u'viaForensics'], 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', 'datagrid-gtk2', + u'datagrid-gtk2 Documentation', + u'viaForensics', + 'datagrid-gtk2', + '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 \ No newline at end of file diff --git a/docs/contributing.rst b/docs/contributing.rst new file mode 100644 index 0000000..3bdd7dc --- /dev/null +++ b/docs/contributing.rst @@ -0,0 +1 @@ +.. include:: ../CONTRIBUTING.rst \ No newline at end of file diff --git a/docs/history.rst b/docs/history.rst new file mode 100644 index 0000000..bec23d8 --- /dev/null +++ b/docs/history.rst @@ -0,0 +1 @@ +.. include:: ../HISTORY.rst \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..04aa73d --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,33 @@ +.. datagrid-gtk2 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 datagrid-gtk2's documentation! +====================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + readme + installation + usage + contributing + authors + history + +API: + +.. toctree:: + :maxdepth: 2 + + api/modules + +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..2200186 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,12 @@ +============ +Installation +============ + +At the command line:: + + $ easy_install datagrid-gtk2 + +Or, if you have virtualenvwrapper installed:: + + $ mkvirtualenv datagrid-gtk2 + $ pip install datagrid-gtk2 \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9409d60 --- /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\datagrid-gtk2.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\datagrid-gtk2.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 \ No newline at end of file diff --git a/docs/readme.rst b/docs/readme.rst new file mode 100644 index 0000000..6b2b3ec --- /dev/null +++ b/docs/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst \ No newline at end of file diff --git a/docs/usage.rst b/docs/usage.rst new file mode 100644 index 0000000..94c9c69 --- /dev/null +++ b/docs/usage.rst @@ -0,0 +1,7 @@ +======== +Usage +======== + +To use datagrid-gtk2 in a project:: + + import datagrid-gtk2 \ No newline at end of file diff --git a/extra_requirements.txt b/extra_requirements.txt new file mode 100644 index 0000000..d5b342a --- /dev/null +++ b/extra_requirements.txt @@ -0,0 +1,12 @@ +# This file contains requirements that are not needed, +# but are recommended specially with regard to static analysis +ipython +ipdb +prospector[with_everything] +flake8 +flake8-blind-except +flake8-debugger +flake8-docstrings +flake8-import-order +flake8-quotes +pep8-naming \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..98392d5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +# wheel==0.23.0 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..887cd4d --- /dev/null +++ b/setup.cfg @@ -0,0 +1,15 @@ +[wheel] +universal = 1 + +[nosetests] +with-coverage=1 +cover-package=datagrid-gtk2 +cover-erase=1 +cover-xml=1 +cover-xml-file=coverage.xml +cover-inclusive=1 +with-xunit=1 +# NOTES ON ADDITIONAL OPTIONS: +# --cover-html when run interactively to view HTML coverage output +# --with-specplugin to view nicely human-readable RSpec output; you won't see +# coverage info in stdout if you do this \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..4f36795 --- /dev/null +++ b/setup.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import os +import re + +from setuptools import setup, find_packages + + +SETUP_DIR = os.path.dirname(os.path.realpath(__file__)) +EGG_RE = re.compile('#egg=([^#@\n]+)') + +readme = open(os.path.join(SETUP_DIR, 'README.rst')).read() +history = open( + os.path.join( + SETUP_DIR, 'HISTORY.rst')).read().replace('.. :changelog:', '') + + +def handle_requirement_line(line, requirements, dependency_links): + """Add line to given requirements and dependency_links lists. + + Parse a line from a requirements file, adding entries to the given + requirements or dependency_links lists if appropriate. + """ + line = line.strip() + if not line or line.startswith('#'): + pass + elif line.startswith('-e'): + # We parse these into two stanzas for setuptools. + # We place the requested egg in install_requires and + # place its URI in dependency_links. + dependency_link = line[len('-e'):].lstrip() + egg_search = EGG_RE.search(dependency_link) + if egg_search is None: + raise ValueError( + 'dependency link %s has no #egg= part' % + dependency_link) + else: + requirements.append(egg_search.group(1)) + dependency_links.append(dependency_link) + else: + requirements.append(line) + +# NOTE: requirements retrieved from repos instead of PyPI will not be included +requirements = [] +dependency_links = [] +with open(os.path.join(SETUP_DIR, 'requirements.txt'), 'r') as file_: + for line in file_: + handle_requirement_line(line, requirements, dependency_links) + +# NOTE: recommended to install these in your environment eg. via pip before +# running tests; else they may not be installed to a preferred location. +test_requirements = [] +if os.path.isfile('test_requirements.txt'): + with open(os.path.join(SETUP_DIR, 'test_requirements.txt'), 'r') as file_: + for line in file_: + handle_requirement_line(line, test_requirements, dependency_links) + + +def recurse_data_files(path): + """Return a list of files for given path. + + :param str path: Directory path + :returns: All file paths in given path + :rtype: list + """ + matches = [] + for root, dirnames, filenames in os.walk(path): + matches.append(root + '/*') + return matches + + +setup( + name='datagrid-gtk2', + version='0.1.0', + description='MVC framework for working with the GTK2 TreeView widget.', + long_description=readme + '\n\n' + history, + author='viaForensics', + author_email='info@viaforensics.com', + url='https://viaforensics.com', + packages=find_packages(), + package_dir={'datagrid-gtk2': + 'datagrid-gtk2'}, + package_data={'datagrid-gtk2': recurse_data_files('data')}, + include_package_data=True, + # data_files=[('/destination/path', ['file1', file2']),] + # NOTE: ^^^ any files that need to be installed outside the pkg dir + # include_data_files=True, + install_requires=requirements, + dependency_links=dependency_links, + zip_safe=False, + keywords='datagrid-gtk2', + classifiers=[ + 'Natural Language :: English', + "Programming Language :: Python :: 2", + ], + test_suite='datagrid-gtk2.tests', + tests_require=test_requirements, + entry_points=(""" + [console_scripts] + datagrid-gtk2 = datagrid-gtk2.main:main + """) +) \ No newline at end of file diff --git a/test_requirements.txt b/test_requirements.txt new file mode 100644 index 0000000..75476ee --- /dev/null +++ b/test_requirements.txt @@ -0,0 +1,6 @@ +nose>=1.3 +coverage>=3.5 +nosexcover>=1.0 +spec>=0.11 +mock>=1.0 +Sphinx==1.2.3 \ No newline at end of file