diff options
author | Ask Solem <ask@celeryproject.org> | 2012-06-21 15:23:37 +0100 |
---|---|---|
committer | Ask Solem <ask@celeryproject.org> | 2012-06-21 15:23:37 +0100 |
commit | 5cedbd24a12284123ae90ef148e13284ed91d47e (patch) | |
tree | 157044429639af27eec046437cb5963cfaf4596c /extra | |
parent | df458539b7b0a81c3f452405d3fc7f6612b47eda (diff) | |
download | kombu-5cedbd24a12284123ae90ef148e13284ed91d47e.tar.gz |
contrib directory now named 'extra'
Diffstat (limited to 'extra')
-rwxr-xr-x | extra/doc2ghpages | 13 | ||||
-rwxr-xr-x | extra/release/bump_version.py | 166 | ||||
-rwxr-xr-x | extra/release/doc4allmods | 37 | ||||
-rwxr-xr-x | extra/release/flakeplus.py | 126 | ||||
-rwxr-xr-x | extra/release/jython-run-tests | 8 | ||||
-rwxr-xr-x | extra/release/removepyc.sh | 3 | ||||
-rwxr-xr-x | extra/release/verify-reference-index.sh | 19 | ||||
l--------- | extra/requirements | 1 |
8 files changed, 373 insertions, 0 deletions
diff --git a/extra/doc2ghpages b/extra/doc2ghpages new file mode 100755 index 00000000..5ebc7aaa --- /dev/null +++ b/extra/doc2ghpages @@ -0,0 +1,13 @@ +#!/bin/bash + +git checkout master +(cd docs; + rm -rf .build; + make html; + (cd .build/html; + sphinx-to-github;)) +git checkout gh-pages +cp -r docs/.build/html/* . +git commit . -m "Autogenerated documentation for github." +git push origin gh-pages +git checkout master diff --git a/extra/release/bump_version.py b/extra/release/bump_version.py new file mode 100755 index 00000000..02d8727c --- /dev/null +++ b/extra/release/bump_version.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python + +from __future__ import absolute_import +from __future__ import with_statement + +import errno +import os +import re +import sys +import subprocess + +from contextlib import contextmanager +from tempfile import NamedTemporaryFile + +rq = lambda s: s.strip("\"'") + + +def cmd(*args): + return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0] + + +@contextmanager +def no_enoent(): + try: + yield + except OSError, exc: + if exc.errno != errno.ENOENT: + raise + + +class StringVersion(object): + + def decode(self, s): + s = rq(s) + text = "" + major, minor, release = s.split(".") + if not release.isdigit(): + pos = release.index(re.split("\d+", release)[1][0]) + release, text = release[:pos], release[pos:] + return int(major), int(minor), int(release), text + + def encode(self, v): + return ".".join(map(str, v[:3])) + v[3] +to_str = StringVersion().encode +from_str = StringVersion().decode + + +class TupleVersion(object): + + def decode(self, s): + v = list(map(rq, s.split(", "))) + return (tuple(map(int, v[0:3])) + + tuple(["".join(v[3:])])) + + def encode(self, v): + v = list(v) + + def quote(lit): + if isinstance(lit, basestring): + return '"%s"' % (lit, ) + return str(lit) + + if not v[-1]: + v.pop() + return ", ".join(map(quote, v)) + + +class VersionFile(object): + + def __init__(self, filename): + self.filename = filename + self._kept = None + + def _as_orig(self, version): + return self.wb % {"version": self.type.encode(version), + "kept": self._kept} + + def write(self, version): + pattern = self.regex + with no_enoent(): + with NamedTemporaryFile() as dest: + with open(self.filename) as orig: + for line in orig: + if pattern.match(line): + dest.write(self._as_orig(version)) + else: + dest.write(line) + os.rename(dest.name, self.filename) + + def parse(self): + pattern = self.regex + gpos = 0 + with open(self.filename) as fh: + for line in fh: + m = pattern.match(line) + if m: + if "?P<keep>" in pattern.pattern: + self._kept, gpos = m.groupdict()["keep"], 1 + return self.type.decode(m.groups()[gpos]) + + +class PyVersion(VersionFile): + regex = re.compile(r'^VERSION\s*=\s*\((.+?)\)') + wb = "VERSION = (%(version)s)\n" + type = TupleVersion() + + +class SphinxVersion(VersionFile): + regex = re.compile(r'^:[Vv]ersion:\s*(.+?)$') + wb = ':Version: %(version)s\n' + type = StringVersion() + + +class CPPVersion(VersionFile): + regex = re.compile(r'^\#\s*define\s*(?P<keep>\w*)VERSION\s+(.+)') + wb = '#define %(kept)sVERSION "%(version)s"\n' + type = StringVersion() + + +_filetype_to_type = {"py": PyVersion, + "rst": SphinxVersion, + "c": CPPVersion, + "h": CPPVersion} + +def filetype_to_type(filename): + _, _, suffix = filename.rpartition(".") + return _filetype_to_type[suffix](filename) + + +def bump(*files, **kwargs): + version = kwargs.get("version") + files = [filetype_to_type(f) for f in files] + versions = [v.parse() for v in files] + current = list(reversed(sorted(versions)))[0] # find highest + + if version: + next = from_str(version) + else: + major, minor, release, text = current + if text: + raise Exception("Can't bump alpha releases") + next = (major, minor, release + 1, text) + + print("Bump version from %s -> %s" % (to_str(current), to_str(next))) + + for v in files: + print(" writing %r..." % (v.filename, )) + v.write(next) + + print(cmd("git", "commit", "-m", "Bumps version to %s" % (to_str(next), ), + *[f.filename for f in files])) + print(cmd("git", "tag", "v%s" % (to_str(next), ))) + + +def main(argv=sys.argv, version=None): + if not len(argv) > 1: + print("Usage: distdir [docfile] -- <custom version>") + sys.exit(0) + if "--" in argv: + c = argv.index('--') + version = argv[c + 1] + argv = argv[:c] + bump(*argv[1:], version=version) + +if __name__ == "__main__": + main() diff --git a/extra/release/doc4allmods b/extra/release/doc4allmods new file mode 100755 index 00000000..4651dcd4 --- /dev/null +++ b/extra/release/doc4allmods @@ -0,0 +1,37 @@ +#!/bin/bash + +PACKAGE="$1" +SKIP_PACKAGES="$PACKAGE tests management urls" +SKIP_FILES="kombu.utils.eventio.rst + kombu.transport.django.migrations.rst + kombu.transport.django.migrations.0001_initial.rst + kombu.transport.django.management.rst + kombu.transport.django.management.commands.rst" + +modules=$(find "$PACKAGE" -name "*.py") + +failed=0 +for module in $modules; do + dotted=$(echo $module | sed 's/\//\./g') + name=${dotted%.__init__.py} + name=${name%.py} + rst=$name.rst + skip=0 + for skip_package in $SKIP_PACKAGES; do + [ $(echo "$name" | cut -d. -f 2) == "$skip_package" ] && skip=1 + done + for skip_file in $SKIP_FILES; do + [ "$skip_file" == "$rst" ] && skip=1 + done + + if [ $skip -eq 0 ]; then + if [ ! -f "docs/reference/$rst" ]; then + if [ ! -f "docs/internals/reference/$rst" ]; then + echo $rst :: FAIL + failed=1 + fi + fi + fi +done + +exit $failed diff --git a/extra/release/flakeplus.py b/extra/release/flakeplus.py new file mode 100755 index 00000000..6fe1f1fc --- /dev/null +++ b/extra/release/flakeplus.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python +from __future__ import absolute_import +from __future__ import with_statement + +import os +import re +import sys + +from collections import defaultdict +from unipath import Path + +RE_COMMENT = r'^\s*\#' +RE_NOQA = r'.+?\#\s+noqa+' +RE_MULTILINE_COMMENT_O = r'^\s*(?:\'\'\'|""").+?(?:\'\'\'|""")' +RE_MULTILINE_COMMENT_S = r'^\s*(?:\'\'\'|""")' +RE_MULTILINE_COMMENT_E = r'(?:^|.+?)(?:\'\'\'|""")' +RE_WITH = r'(?:^|\s+)with\s+' +RE_WITH_IMPORT = r'''from\s+ __future__\s+ import\s+ with_statement''' +RE_PRINT = r'''(?:^|\s+)print\((?:"|')(?:\W+?)?[A-Z0-9:]{2,}''' +RE_ABS_IMPORT = r'''from\s+ __future__\s+ import\s+ absolute_import''' + +acc = defaultdict(lambda: {"abs": False, "print": False}) + + +def compile(regex): + return re.compile(regex, re.VERBOSE) + + +class FlakePP(object): + re_comment = compile(RE_COMMENT) + re_ml_comment_o = compile(RE_MULTILINE_COMMENT_O) + re_ml_comment_s = compile(RE_MULTILINE_COMMENT_S) + re_ml_comment_e = compile(RE_MULTILINE_COMMENT_E) + re_abs_import = compile(RE_ABS_IMPORT) + re_print = compile(RE_PRINT) + re_with_import = compile(RE_WITH_IMPORT) + re_with = compile(RE_WITH) + re_noqa = compile(RE_NOQA) + map = {"abs": True, "print": False, + "with": False, "with-used": False} + + def __init__(self, verbose=False): + self.verbose = verbose + self.steps = (("abs", self.re_abs_import), + ("with", self.re_with_import), + ("with-used", self.re_with), + ("print", self.re_print)) + + def analyze_fh(self, fh): + steps = self.steps + filename = fh.name + acc = dict(self.map) + index = 0 + errors = [0] + + def error(fmt, **kwargs): + errors[0] += 1 + self.announce(fmt, **dict(kwargs, filename=filename)) + + for index, line in enumerate(self.strip_comments(fh)): + for key, pattern in steps: + if pattern.match(line): + acc[key] = True + if index: + if not acc["abs"]: + error("%(filename)s: missing abs import") + if acc["with-used"] and not acc["with"]: + error("%(filename)s: missing with import") + if acc["print"]: + error("%(filename)s: left over print statement") + + return filename, errors[0], acc + + def analyze_file(self, filename): + with open(filename) as fh: + return self.analyze_fh(fh) + + def analyze_tree(self, dir): + for dirpath, _, filenames in os.walk(dir): + for path in (Path(dirpath, f) for f in filenames): + if path.endswith(".py"): + yield self.analyze_file(path) + + def analyze(self, *paths): + for path in map(Path, paths): + if path.isdir(): + for res in self.analyze_tree(path): + yield res + else: + yield self.analyze_file(path) + + def strip_comments(self, fh): + re_comment = self.re_comment + re_ml_comment_o = self.re_ml_comment_o + re_ml_comment_s = self.re_ml_comment_s + re_ml_comment_e = self.re_ml_comment_e + re_noqa = self.re_noqa + in_ml = False + + for line in fh.readlines(): + if in_ml: + if re_ml_comment_e.match(line): + in_ml = False + else: + if re_noqa.match(line) or re_ml_comment_o.match(line): + pass + elif re_ml_comment_s.match(line): + in_ml = True + elif re_comment.match(line): + pass + else: + yield line + + def announce(self, fmt, **kwargs): + sys.stderr.write((fmt + "\n") % kwargs) + + +def main(argv=sys.argv, exitcode=0): + for _, errors, _ in FlakePP(verbose=True).analyze(*argv[1:]): + if errors: + exitcode = 1 + return exitcode + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/extra/release/jython-run-tests b/extra/release/jython-run-tests new file mode 100755 index 00000000..cd4136c6 --- /dev/null +++ b/extra/release/jython-run-tests @@ -0,0 +1,8 @@ +#!/bin/bash +base=${1:-.} +nosetests --with-xunit \ + --xunit-file="$base/nosetests.xml" +# coverage doesn't with with jython +echo "<coverage />" > "$base/coverage.html" +mkdir -p "$base/cover" +touch "$base/cover/index.html" diff --git a/extra/release/removepyc.sh b/extra/release/removepyc.sh new file mode 100755 index 00000000..9aaf3658 --- /dev/null +++ b/extra/release/removepyc.sh @@ -0,0 +1,3 @@ +#!/bin/bash +(cd "${1:-.}"; + find . -name "*.pyc" | xargs rm -- 2>/dev/null) || echo "ok" diff --git a/extra/release/verify-reference-index.sh b/extra/release/verify-reference-index.sh new file mode 100755 index 00000000..feaa0da9 --- /dev/null +++ b/extra/release/verify-reference-index.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +verify_index() { + modules=$(grep "kombu." "$1" | \ + perl -ple's/^\s*|\s*$//g;s{\.}{/}g;') + retval=0 + for module in $modules; do + if [ ! -f "$module.py" ]; then + if [ ! -f "$module/__init__.py" ]; then + echo "Outdated reference: $module" + retval=1 + fi + fi + done + + return $retval +} + +verify_index docs/reference/index.rst diff --git a/extra/requirements b/extra/requirements new file mode 120000 index 00000000..41e330fa --- /dev/null +++ b/extra/requirements @@ -0,0 +1 @@ +../requirements/
\ No newline at end of file |