diff options
author | Eli Collins <elic@assurancetechnologies.com> | 2011-08-17 11:51:08 -0400 |
---|---|---|
committer | Eli Collins <elic@assurancetechnologies.com> | 2011-08-17 11:51:08 -0400 |
commit | f3a121563512d51133cbacf50c96b1a3dccde31d (patch) | |
tree | 081e1a83805003ebfb8b433f1513c413040aa944 | |
parent | d2ffaa3eecd9866918a20547d02c3a1b45dc8fdb (diff) | |
download | passlib-f3a121563512d51133cbacf50c96b1a3dccde31d.tar.gz |
setup script enhancements
* added code to make builtin snapshots & releases with correct version # easier,
no longer dependant on egg_info's tag_date (which didn't make PEP compatible
version strings anyways).
* moved passlib.setup to passlib._setup - not really publically useful anyways,
and name was causing nose/unitest to get confused
* added tests/*.cfg to setup & manifest
-rw-r--r-- | MANIFEST.in | 2 | ||||
-rw-r--r-- | passlib.komodoproject | 2 | ||||
-rw-r--r-- | passlib/_setup/__init__.py | 5 | ||||
-rw-r--r-- | passlib/_setup/cond2to3.py (renamed from passlib/setup/cond2to3.py) | 0 | ||||
-rw-r--r-- | passlib/_setup/stamp.py | 57 | ||||
-rw-r--r-- | passlib/setup/__init__.py | 1 | ||||
-rw-r--r-- | setup.cfg | 7 | ||||
-rw-r--r-- | setup.py | 109 |
8 files changed, 145 insertions, 38 deletions
diff --git a/MANIFEST.in b/MANIFEST.in index b3853b0..f29430e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ recursive-include docs * -include LICENSE README CHANGES passlib/*.cfg +include LICENSE README CHANGES passlib/*.cfg passlib/tests/*.cfg prune docs/_build prune *.komodoproject diff --git a/passlib.komodoproject b/passlib.komodoproject index 324caf1..b579f50 100644 --- a/passlib.komodoproject +++ b/passlib.komodoproject @@ -3,7 +3,7 @@ <project id="ab14e891-3bad-4dee-94c1-e8ad8d6ca1a9" kpf_version="5" name="passlib.komodoproject"> <preference-set idref="ab14e891-3bad-4dee-94c1-e8ad8d6ca1a9"> <string relative="path" id="import_dirname"></string> - <string id="import_exclude_matches">*$py.class;*.egg-info;cover;_build;dist;build;.*;*.*~;*.bak;*.tmp;CVS;.#*;*.pyo;*.pyc;.svn;*%*;tmp*.html;.DS_Store</string> + <string id="import_exclude_matches">__pycache__;*$py.class;*.egg-info;cover;_build;dist;build;.*;*.*~;*.bak;*.tmp;CVS;.#*;*.pyo;*.pyc;.svn;*%*;tmp*.html;.DS_Store</string> <string id="import_include_matches"></string> <boolean id="import_live">1</boolean> </preference-set> diff --git a/passlib/_setup/__init__.py b/passlib/_setup/__init__.py new file mode 100644 index 0000000..814c93a --- /dev/null +++ b/passlib/_setup/__init__.py @@ -0,0 +1,5 @@ +"""passlib.setup - helpers used by passlib's setup.py script + +note that unlike the rest of passlib, the code in this package must +work *unaltered* under both python 2 & 3 +""" diff --git a/passlib/setup/cond2to3.py b/passlib/_setup/cond2to3.py index 12cb0a8..12cb0a8 100644 --- a/passlib/setup/cond2to3.py +++ b/passlib/_setup/cond2to3.py diff --git a/passlib/_setup/stamp.py b/passlib/_setup/stamp.py new file mode 100644 index 0000000..14abd59 --- /dev/null +++ b/passlib/_setup/stamp.py @@ -0,0 +1,57 @@ +"update version string during build" +#========================================================= +# imports +#========================================================= +from __future__ import with_statement +#core +import os +import re +import time +from distutils.dist import Distribution +#pkg +#local +__all__ = [ + "stamp_source", + "stamp_distutils_output", +] +#========================================================= +# helpers +#========================================================= +def get_command_class(opts, name): + return opts['cmdclass'].get(name) or Distribution().get_command_class(name) + +def stamp_source(base_dir, version, dry_run=False): + "update version string in passlib dist" + path = os.path.join(base_dir, "passlib", "__init__.py") + with open(path) as fh: + input = fh.read() + output = re.sub('(?m)^__version__\s*=.*$', + '__version__ = ' + repr(version), + input) + assert output != input, "failed to match" + if not dry_run: + os.unlink(path) # sdist likes to use hardlinks + with open(path, "w") as fh: + fh.write(output) + +def stamp_distutils_output(opts, version): + + # subclass buildpy to update version string in source + _build_py = get_command_class(opts, "build_py") + class build_py(_build_py): + def build_packages(self): + _build_py.build_packages(self) + stamp_source(self.build_lib, version, self.dry_run) + opts['cmdclass']['build_py'] = build_py + + # subclass sdist to do same thing + _sdist = get_command_class(opts, "sdist") + class sdist(_sdist): + def make_release_tree(self, base_dir, files): + _sdist.make_release_tree(self, base_dir, files) + stamp_source(base_dir, version, self.dry_run) + opts['cmdclass']['sdist'] = sdist + +#========================================================= +# eof +#========================================================= diff --git a/passlib/setup/__init__.py b/passlib/setup/__init__.py deleted file mode 100644 index 2966610..0000000 --- a/passlib/setup/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"passlib.setup - package containing helpers used by passlib's setup.py script" @@ -1,10 +1,3 @@ -[egg_info] -# XXX: should stop relying on this section, -# it's only used by setuptools/distribute, -# and will be phased out in distutils2 -tag_build = a1.dev -tag_date = true - [upload] sign = true @@ -1,16 +1,18 @@ """passlib setup script""" #========================================================= -#init script env -- ensure cwd = root of source dir +# init script env -- ensure cwd = root of source dir #========================================================= import os root_dir = os.path.abspath(os.path.join(__file__,"..")) os.chdir(root_dir) #========================================================= -#imports +# imports #========================================================= import re import sys +import time + py3k = (sys.version_info[0] >= 3) try: @@ -19,31 +21,68 @@ try: except ImportError: from distutils import setup has_distribute = False - + #========================================================= -#enable various 2to3 options +# init setup options #========================================================= -opts = { "cmdclass": {} } +opts = { "cmdclass": { } } +args = sys.argv[1:] +#========================================================= +# 2to3 translation +#========================================================= if py3k: - #monkeypatch preprocessor into lib2to3 - from passlib.setup.cond2to3 import patch2to3 + # monkeypatch preprocessor into lib2to3 + from passlib._setup.cond2to3 import patch2to3 patch2to3() - #enable 2to3 translation in build_py + # enable 2to3 translation in build_py if has_distribute: opts['use_2to3'] = True else: - #if we can't use distribute's "use_2to3" flag, - #have to override build_py command + # if we can't use distribute's "use_2to3" flag, + # have to override build_py command from distutils.command.build_py import build_py_2to3 as build_py opts['cmdclass']['build_py'] = build_py #========================================================= -#version string +# version string / datestamps #========================================================= from passlib import __version__ as VERSION +# if this is an hg checkout of passlib, add datestamp to version string. +# XXX: could check for *absence* of PKG-INFO instead +if os.path.exists(os.path.join(root_dir, "passlib.komodoproject")): + + # check for --for-release flag indicating this isn't a snapshot + for_release = False + i = 0 + while i < len(args): + v = args[i] + if v == '--for-release': + for_release = True + del args[i] + break + elif not v.startswith("-"): + break + i += 1 + + if for_release: + assert '.dev' not in VERSION and '.post' not in VERSION + else: + # add datestamp if doing a snapshot + dstr = time.strftime("%Y%m%d") + if VERSION.endswith(".dev0") or VERSION.endswith(".post0"): + VERSION = VERSION[:-1] + dstr + else: + assert '.dev' not in VERSION and '.post' not in VERSION + VERSION += ".post" + dstr + + # subclass build_py & sdist so they rewrite passlib/__init__.py + # to have the correct version string + from passlib._setup.stamp import stamp_distutils_output + stamp_distutils_output(opts, VERSION) + #========================================================= #static text #========================================================= @@ -71,21 +110,44 @@ All releases are signed with the gpg key """ KEYWORDS = "password secret hash security crypt md5-crypt \ -sha256-crypt sha512-crypt bcrypt apache htpasswd htdigest pbkdf2 ntlm" +sha256-crypt sha512-crypt bcrypt apache htpasswd htdigest pbkdf2" + +CLASSIFIERS = """\ +Intended Audience :: Developers +License :: OSI Approved :: BSD License +Natural Language :: English +Operating System :: OS Independent +Programming Language :: Python :: 2.5 +Programming Language :: Python :: 2.6 +Programming Language :: Python :: 2.7 +Programming Language :: Python :: 3 +Topic :: Security :: Cryptography +Topic :: Software Development :: Libraries +""".splitlines() + +is_release = False +if '.dev' in VERSION: + CLASSIFIERS.append("Development Status :: 3 - Alpha") +elif '.post' in VERSION: + CLASSIFIERS.append("Development Status :: 4 - Beta") +else: + is_release = True + CLASSIFIERS.append("Development Status :: 5 - Production/Stable") #========================================================= #run setup #========================================================= +# XXX: could omit 'passlib.setup' from eggs, but not sdist setup( #package info packages = [ "passlib", "passlib.handlers", - "passlib.setup", "passlib.tests", "passlib.utils", + "passlib._setup", ], - package_data = { "passlib": ["*.cfg"] }, + package_data = { "passlib": ["*.cfg" ], "passlib.tests": ["*.cfg"] }, zip_safe=True, #metadata @@ -96,29 +158,20 @@ setup( license = "BSD", url = "http://passlib.googlecode.com", - download_url = "http://passlib.googlecode.com/files/passlib-" + VERSION + ".tar.gz", + download_url = + ("http://passlib.googlecode.com/files/passlib-" + VERSION + ".tar.gz") + if is_release else None, description = SUMMARY, long_description = DESCRIPTION, keywords = KEYWORDS, - classifiers = [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", - "Natural Language :: English", - "Operating System :: OS Independent", - "Programming Language :: Python :: 2.5", - "Programming Language :: Python :: 2.6", - "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3", - "Topic :: Security :: Cryptography", - "Topic :: Software Development :: Libraries", - ], + classifiers = CLASSIFIERS, tests_require = 'nose >= 1.0', test_suite = 'nose.collector', #extra opts + script_args=args, **opts ) #========================================================= |