summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Collins <elic@assurancetechnologies.com>2011-08-17 11:51:08 -0400
committerEli Collins <elic@assurancetechnologies.com>2011-08-17 11:51:08 -0400
commitf3a121563512d51133cbacf50c96b1a3dccde31d (patch)
tree081e1a83805003ebfb8b433f1513c413040aa944
parentd2ffaa3eecd9866918a20547d02c3a1b45dc8fdb (diff)
downloadpasslib-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.in2
-rw-r--r--passlib.komodoproject2
-rw-r--r--passlib/_setup/__init__.py5
-rw-r--r--passlib/_setup/cond2to3.py (renamed from passlib/setup/cond2to3.py)0
-rw-r--r--passlib/_setup/stamp.py57
-rw-r--r--passlib/setup/__init__.py1
-rw-r--r--setup.cfg7
-rw-r--r--setup.py109
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"
diff --git a/setup.cfg b/setup.cfg
index 38574b1..cce5f16 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -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
diff --git a/setup.py b/setup.py
index c3b7a38..12c420f 100644
--- a/setup.py
+++ b/setup.py
@@ -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
)
#=========================================================