From 2ec4cd023bb82005c1959b429efce42e874a7386 Mon Sep 17 00:00:00 2001 From: Anthon van der Neut Date: Wed, 14 Jan 2015 20:36:54 +0100 Subject: initial setup --- .hgignore | 11 ++++ Makefile | 12 +++++ README.rst | 6 +++ __init__.py | 33 ++++++++++++ setup.py | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/test_base.py | 8 +++ tox.ini | 7 +++ 7 files changed, 228 insertions(+) create mode 100644 .hgignore create mode 100644 Makefile create mode 100644 README.rst create mode 100644 __init__.py create mode 100644 setup.py create mode 100644 test/test_base.py create mode 100644 tox.ini diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..0cf8ac3 --- /dev/null +++ b/.hgignore @@ -0,0 +1,11 @@ +syntax: glob + +*.pyc +*~ +*.bak +*.o +*.orig +dist +build +*.egg-info +.tox diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d9a38fd --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ + +UTILNAME:=base +PKGNAME:=ruamel.base +VERSION:=$$(python setup.py --version) +REGEN:=/home/bin/ruamel_util_new util --published Base --skip-hg + +include ~/.config/ruamel_util_new/Makefile.inc + +clean: + rm -rf build .tox $(PKGNAME).egg-info/ README.pdf + find . -name "*.pyc" -exec rm {} + + @find . -name "__pycache__" -print0 | xargs -r -0 rm -rf diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..3746069 --- /dev/null +++ b/README.rst @@ -0,0 +1,6 @@ + +ruamel.base + +- provides a single definition point for ``ruamel/__init__.py`` and + ``ruamel/*/__init__.py`` +- (future) place for elements common to multiple packages \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..2e68e44 --- /dev/null +++ b/__init__.py @@ -0,0 +1,33 @@ +# coding: utf-8 + + +def _convert_version(tup): + """create a PEP 386 pseudo-format conformant string from tuple tup""" + ret_val = str(tup[0]) # first is always digit + next_sep = "." # separator for next extension, can be "" or "." + for x in tup[1:]: + if isinstance(x, int): + ret_val += next_sep + str(x) + next_sep = '.' + continue + first_letter = x[0].lower() + next_sep = '' + if first_letter in 'abcr': + ret_val += 'rc' if first_letter == 'r' else first_letter + elif first_letter in 'pd': + ret_val += '.post' if first_letter == 'p' else '.dev' + return ret_val + + +version_info = (0, 1) +__version__ = _convert_version(version_info) + +del _convert_version + + +def main(): + # No direct import of base in order not to pollute namespace. + # If other utility 'bodies' exist in this directory a module level + # import here, would get you all of its initialisations/imports as well + from base import main as util_main + util_main() diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2ff0475 --- /dev/null +++ b/setup.py @@ -0,0 +1,151 @@ +#! /usr/bin/env python +# coding: utf-8 + +from __future__ import print_function + +import sys +import os +from textwrap import dedent + +name_space = 'ruamel' +package_name = 'base' +full_package_name = name_space + '.' + package_name + +exclude_files = [ + 'setup.py', +] + + +def get_version(): + v_i = 'version_info = ' + for line in open('__init__.py'): + if not line.startswith(v_i): + continue + s_e = line[len(v_i):].strip()[1:-1].split(', ') + els = [x.strip()[1:-1] if x[0] in '\'"' else int(x) for x in s_e] + return els + + +def _check_convert_version(tup): + """create a PEP 386 pseudo-format conformant string from tuple tup""" + ret_val = str(tup[0]) # first is always digit + next_sep = "." # separator for next extension, can be "" or "." + nr_digits = 0 # nr of adjacent digits in rest, to verify + post_dev = False # are we processig post/dev + for x in tup[1:]: + if isinstance(x, int): + nr_digits += 1 + if nr_digits > 2: + raise ValueError("to many consecutive digits " + ret_val) + ret_val += next_sep + str(x) + next_sep = '.' + continue + first_letter = x[0].lower() + next_sep = '' + if first_letter in 'abcr': + if post_dev: + raise ValueError("release level specified after " + "post/dev:" + x) + nr_digits = 0 + ret_val += 'rc' if first_letter == 'r' else first_letter + elif first_letter in 'pd': + nr_digits = 1 # only one can follow + post_dev = True + ret_val += '.post' if first_letter == 'p' else '.dev' + else: + raise ValueError('First letter of "' + x + '" not recognised') + return ret_val + + +version_info = get_version() +version_str = _check_convert_version(version_info) + +if __name__ == '__main__': + # put here so setup.py can be imported more easily + from setuptools import setup, find_packages, Extension + from setuptools.command import install_lib + + +class MyInstallLib(install_lib.install_lib): + "create __init__.py on the fly" + def run(self): + install_lib.install_lib.run(self) + init_txt = dedent('''\ + # coding: utf-8 + # Copyright © 2013-2015 Anthon van der Neut, RUAMEL bvba + "generated __init__.py " + try: + __import__('pkg_resources').declare_namespace(__name__) + except ImportError: + pass + ''') + init_paths = ["ruamel/std",] # "ruamel/ext"] + for init_path_s in init_paths: + init_path = init_path_s.split('/') + for product_init in [ + os.path.join( + *([self.install_dir] + init_path[:p+1] + ['__init__.py'])) + for p in range(len(init_path)) + ]: + if not os.path.exists(product_init): + d = os.path.dirname(product_init) + if not os.path.exists(d): + os.makedirs(d) + print('creating %s' % product_init) + with open(product_init, "w") as fp: + fp.write(init_txt) + setup = os.path.join(self.install_dir, 'setup.py') + + def install(self): + fpp = full_package_name.split('.') # full package path + full_exclude_files = [os.path.join(*(fpp + [x])) + for x in exclude_files] + alt_files = [] + outfiles = install_lib.install_lib.install(self) + for x in outfiles: + for full_exclude_file in full_exclude_files: + if full_exclude_file in x: + os.remove(x) + break + else: + alt_files.append(x) + return alt_files + + +def main(): + install_requires = [ + ] + # if sys.version_info < (3, 4): + # install_requires.append("") + packages = [full_package_name] + [(full_package_name + '.' + x) for x + in find_packages(exclude=['tests'])] + setup( + name=full_package_name, + version=version_str, + description="common elements for ruamel packages, " + "hierarchy structure with __init__.py", + install_requires=install_requires, + long_description=open('README.rst').read(), + url='https://bitbucket.org/ruamel/' + package_name, + author='Anthon van der Neut', + author_email='a.van.der.neut@ruamel.eu', + license="MIT license", + package_dir={full_package_name: '.'}, + namespace_packages=[name_space], + packages=packages, + cmdclass={'install_lib': MyInstallLib}, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + ] + ) + +if __name__ == '__main__': + if len(sys.argv) > 1 and sys.argv[1] == 'sdist': + assert full_package_name == os.path.abspath(os.path.dirname( + __file__)).split('site-packages' + os.path.sep)[1].replace( + os.path.sep, '.') + main() diff --git a/test/test_base.py b/test/test_base.py new file mode 100644 index 0000000..d2c0125 --- /dev/null +++ b/test/test_base.py @@ -0,0 +1,8 @@ + + +# default for tox stub is to Fail +def test_base(): + import ruamel + import ruamel.std + # import ruamel.ext + assert True diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..4082297 --- /dev/null +++ b/tox.ini @@ -0,0 +1,7 @@ +[tox] +envlist = py26,py27,py33,py34 + +[testenv] +commands = py.test test +deps = + pytest -- cgit v1.2.1