From 94186f5aea35dea47c2b28ae663cd0b9910880be Mon Sep 17 00:00:00 2001 From: Michal Kwiatkowski Date: Sat, 16 Apr 2011 22:51:21 +0200 Subject: [PATCH] Added pyatom project for gathering some more metrics. --- pythoscope/generator/objects_namer.py | 1 + pythoscope/inspector/static.py | 11 +++++++++-- pythoscope/serializer.py | 4 ++++ tools/gather-metrics.py | 15 +++++++++++++-- tools/projects/pyatom-1.2.tar.gz | Bin 0 -> 6294 bytes tools/projects/pyatom_poe_from_readme.py | 18 ++++++++++++++++++ 6 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 tools/projects/pyatom-1.2.tar.gz create mode 100644 tools/projects/pyatom_poe_from_readme.py diff --git a/pythoscope/generator/objects_namer.py b/pythoscope/generator/objects_namer.py index 114ad84..d65d2f3 100644 --- a/pythoscope/generator/objects_namer.py +++ b/pythoscope/generator/objects_namer.py @@ -9,6 +9,7 @@ def get_name_base_for_object(obj): common_names = {'list': 'alist', 'dict': 'adict', 'array.array': 'array', + 'datetime': 'dt', # we can't name it 'datetime', because that is module's name 'types.FunctionType': 'function', 'types.GeneratorType': 'generator'} return common_names.get(obj.type_name, underscore(obj.type_name)) diff --git a/pythoscope/inspector/static.py b/pythoscope/inspector/static.py index 3e9c911..8f91efc 100644 --- a/pythoscope/inspector/static.py +++ b/pythoscope/inspector/static.py @@ -27,10 +27,15 @@ def unindent(string): """Remove the initial part of whitespace from string. >>> unindent("1 + 2 + 3\\n") - '1 + 2 + 3\\n' + '1 + 2 + 3' >>> unindent(" def fun():\\n return 42\\n") - 'def fun():\\n return 42\\n' + 'def fun():\\n return 42' + >>> unindent("\\n def fun():\\n return 42\\n") + 'def fun():\\n return 42' + >>> unindent(" def fun():\\n return 42\\n\\n") + 'def fun():\\n return 42' """ + string = re.sub(r'^\n*', '', string.rstrip()) # ignore leading and trailing newlines match = re.match(r'^([\t ]+)', string) if not match: return string @@ -61,6 +66,8 @@ def is_generator_definition(definition): True >>> is_generator_definition(" def indented_gen():\\n yield 3\\n") True + >>> is_generator_definition("\\n def indented_gen():\\n yield 3\\n") + True """ try: return is_generator_code(function_code_from_definition(definition)) diff --git a/pythoscope/serializer.py b/pythoscope/serializer.py index 66eae11..e6fd44d 100644 --- a/pythoscope/serializer.py +++ b/pythoscope/serializer.py @@ -211,6 +211,10 @@ class LibraryObject(SerializedObject): ("Element(%s)", ["tagName", "namespaceURI", "prefix"], set([("xml.dom.minidom", "Element")])), + ('datetime', 'datetime'): + ("datetime.datetime(%s)", + ["year", "month", "day", "hour", "minute", "second", "microsecond", "tzinfo"], + set(["datetime"])), } def __init__(self, obj, serialize): diff --git a/tools/gather-metrics.py b/tools/gather-metrics.py index 8d194a8..2a9857e 100644 --- a/tools/gather-metrics.py +++ b/tools/gather-metrics.py @@ -75,7 +75,7 @@ def contains_dynamic_inspection_error(output): def run_nosetests(project_dir, test_path): notify("Running nosetests on the generated test module...") - command = "nosetests -w %s %s" % (project_dir, test_path) + command = "PYTHONPATH=%s nosetests -w %s %s" % (project_dir, project_dir, test_path) print " $", command status, output = commands.getstatusoutput(command) print output @@ -95,7 +95,7 @@ def get_test_counts(output): def run_nosetests_with_coverage(project_dir, test_path, cover_package): notify("Running nosetests with coverage on the generated test module...") - command = "nosetests --with-coverage --cover-package=%s -w %s %s" % (cover_package, project_dir, test_path) + command = "PYTHONPATH=%s nosetests --with-coverage --cover-package=%s -w %s %s" % (project_dir, cover_package, project_dir, test_path) print " $", command status, output = commands.getstatusoutput(command) print output @@ -109,6 +109,11 @@ def extract_coverage_percent(output): for line in output.splitlines(): if line.startswith("TOTAL"): return line.split()[3] + else: + # If there was only one module, coverage doesn't report TOTAL. + for line in output.splitlines(): + if "%" in line: + return line.split()[3] raise GatheringError("Can't find coverage in the output.") def cleanup_project(project_dir): @@ -165,6 +170,12 @@ def main(): appfile="isodate/*.py", testfile="tests/*.py", cover_package="isodate"), + dict(project="pyatom-1.2", + poes=["pyatom_poe_from_readme.py"], + snippets=[], + appfile="pyatom.py", + testfile="tests/*.py", + cover_package="pyatom"), ] try: results = map(lambda p: gather_metrics_from_project(**p), projects) diff --git a/tools/projects/pyatom-1.2.tar.gz b/tools/projects/pyatom-1.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..0bddebdad3668607f9f07034b6c0bef05b61f257 GIT binary patch literal 6294 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 literal 0 HcmV?d00001 diff --git a/tools/projects/pyatom_poe_from_readme.py b/tools/projects/pyatom_poe_from_readme.py new file mode 100644 index 0000000..ab2a018 --- /dev/null +++ b/tools/projects/pyatom_poe_from_readme.py @@ -0,0 +1,18 @@ +from pyatom import AtomFeed +import datetime + +feed = AtomFeed(title="My Blog", + subtitle="My example blog for a feed test.", + feed_url="http://example.org/feed", + url="http://example.org", + author="Me") + +# Do this for each feed entry +feed.add(title="My Post", + content="Body of my post", + content_type="html", + author="Me", + url="http://example.org/entry1", + updated=datetime.datetime.utcnow()) + +print feed.to_string()