summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorAsk Solem <ask@celeryproject.org>2012-06-21 15:23:37 +0100
committerAsk Solem <ask@celeryproject.org>2012-06-21 15:23:37 +0100
commit5cedbd24a12284123ae90ef148e13284ed91d47e (patch)
tree157044429639af27eec046437cb5963cfaf4596c /extra
parentdf458539b7b0a81c3f452405d3fc7f6612b47eda (diff)
downloadkombu-5cedbd24a12284123ae90ef148e13284ed91d47e.tar.gz
contrib directory now named 'extra'
Diffstat (limited to 'extra')
-rwxr-xr-xextra/doc2ghpages13
-rwxr-xr-xextra/release/bump_version.py166
-rwxr-xr-xextra/release/doc4allmods37
-rwxr-xr-xextra/release/flakeplus.py126
-rwxr-xr-xextra/release/jython-run-tests8
-rwxr-xr-xextra/release/removepyc.sh3
-rwxr-xr-xextra/release/verify-reference-index.sh19
l---------extra/requirements1
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