From 1deb4f905ec0637fe8c12842b0df6257a6ed0409 Mon Sep 17 00:00:00 2001 From: Joe Koberg Date: Thu, 21 Feb 2013 11:47:30 -0500 Subject: [PATCH 1/2] 2to3 conversion --- examples/meta_example.py | 4 ++-- examples/query_fluent_example.py | 6 +++--- examples/speed_example.py | 4 ++-- examples/test_attachment.py | 2 +- v1pysdk/__init__.py | 4 ++-- v1pysdk/base_asset.py | 13 ++++++------- v1pysdk/client.py | 15 ++++++++------- v1pysdk/query.py | 4 ++-- v1pysdk/tests/__init__.py | 2 +- v1pysdk/tests/connect_tests.py | 4 ++-- v1pysdk/v1meta.py | 12 ++++++------ v1pysdk/v1poll.py | 4 ++-- v1pysdk/yamlquery.py | 30 +++++++++++++++--------------- 13 files changed, 52 insertions(+), 52 deletions(-) diff --git a/examples/meta_example.py b/examples/meta_example.py index e62104f..b2815b6 100644 --- a/examples/meta_example.py +++ b/examples/meta_example.py @@ -4,7 +4,7 @@ my_story = v1.Story('1005') -print s.Name +print(s.Name) # 'New Story 2' s.Owners # [] @@ -13,6 +13,6 @@ for my_story in v1.Story,where(Name='New Story 2'): - print my_story.Name + print(my_story.Name) diff --git a/examples/query_fluent_example.py b/examples/query_fluent_example.py index 52d8d93..c134ac6 100644 --- a/examples/query_fluent_example.py +++ b/examples/query_fluent_example.py @@ -5,12 +5,12 @@ for t in v1.AssetType.select('Name').where(Name='Story'): - print t + print(t) for s in v1.Story.select('Name'): - print s.CreateDate # fetched on demand - print s.Name + print(s.CreateDate) # fetched on demand + print(s.Name) diff --git a/examples/speed_example.py b/examples/speed_example.py index 473c26a..386b779 100644 --- a/examples/speed_example.py +++ b/examples/speed_example.py @@ -12,7 +12,7 @@ def process_queries(queries): try: asset._v1_refresh() yield str(asset) - except Exception, e: + except Exception as e: yield 'Error! %s(%s)'%(asset._v1_asset_type_name, asset._v1_oid) all_assets = list(process_queries()) @@ -22,7 +22,7 @@ def process_queries(queries): elapsed = t1 - t0 count = len(all_assets) -print "%d assets in %0.4fs (%0.4fs/asset)"%(count, elapsed, elapsed/count) +print("%d assets in %0.4fs (%0.4fs/asset)"%(count, elapsed, elapsed/count)) out = open('output.txt', 'w').write('\n'.join([str(a) for a in all_assets])) diff --git a/examples/test_attachment.py b/examples/test_attachment.py index d6a8144..b038e35 100644 --- a/examples/test_attachment.py +++ b/examples/test_attachment.py @@ -34,6 +34,6 @@ attachment.file_data = '\x00\xFF'*20000 -print len(attachment.file_data) +print(len(attachment.file_data)) diff --git a/v1pysdk/__init__.py b/v1pysdk/__init__.py index b179654..c242700 100644 --- a/v1pysdk/__init__.py +++ b/v1pysdk/__init__.py @@ -7,6 +7,6 @@ """ -from v1meta import V1Meta -from v1poll import V1Poll +from .v1meta import V1Meta +from .v1poll import V1Poll diff --git a/v1pysdk/base_asset.py b/v1pysdk/base_asset.py index f759dd7..07b43e6 100644 --- a/v1pysdk/base_asset.py +++ b/v1pysdk/base_asset.py @@ -1,9 +1,9 @@ from pprint import pformat as pf -from query import V1Query +from .query import V1Query -class BaseAsset(object): +class BaseAsset(object, metaclass=IterableType): """Provides common methods for the dynamically derived asset type classes built by V1Meta.asset_class""" @@ -51,13 +51,12 @@ def __iter__(Class): "The type that's instantiated to make THIS class must have an __iter__, " "so we provide a metaclass (a thing that provides a class when instantiated) " "that knows how to be iterated over, so we can say list(v1.Story)" - __metaclass__ = IterableType def __new__(Class, oid): "Tries to get an instance out of the cache first, otherwise creates one" cache_key = (Class._v1_asset_type_name, int(oid)) cache = Class._v1_v1meta.global_cache - if cache.has_key(cache_key): + if cache_key in cache: self = cache[cache_key] else: self = object.__new__(Class) @@ -111,7 +110,7 @@ def repr_shallow(self, d): return pf( dict( (k, self.repr_dummy(v)) for (k,v) - in d.items() + in list(d.items()) if v ) ) @@ -127,12 +126,12 @@ def __repr__(self): def _v1_getattr(self, attr): "Intercept access to missing attribute names. " "first return uncommitted data, then refresh if needed, then get single attr, else fail" - if self._v1_new_data.has_key(attr): + if attr in self._v1_new_data: value = self._v1_new_data[attr] else: if self._v1_needs_refresh: self._v1_refresh() - if attr not in self._v1_current_data.keys(): + if attr not in list(self._v1_current_data.keys()): self._v1_current_data[attr] = self._v1_get_single_attr(attr) value = self._v1_current_data[attr] return value diff --git a/v1pysdk/client.py b/v1pysdk/client.py index 787c586..1266345 100644 --- a/v1pysdk/client.py +++ b/v1pysdk/client.py @@ -1,9 +1,10 @@ import logging, time, base64 -import urllib2 -from urllib2 import Request, urlopen, HTTPError, HTTPBasicAuthHandler -from urllib import urlencode -from urlparse import urlunparse +import urllib.request, urllib.error, urllib.parse +from urllib.request import Request, urlopen, HTTPBasicAuthHandler +from urllib.error import HTTPError +from urllib.parse import urlencode +from urllib.parse import urlunparse try: from xml.etree import ElementTree @@ -38,10 +39,10 @@ def __init__(self, address='localhost', instance='VersionOne.Web', username='', def _install_opener(self): base_url = self.build_url('') - password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() + password_manager = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_manager.add_password(None, base_url, self.username, self.password) handlers = [HandlerClass(password_manager) for HandlerClass in AUTH_HANDLERS] - self.opener = urllib2.build_opener(*handlers) + self.opener = urllib.request.build_opener(*handlers) def http_get(self, url): request = Request(url) @@ -73,7 +74,7 @@ def fetch(self, path, query='', postdata=None): response = self.http_get(url) body = response.read() return (None, body) - except HTTPError, e: + except HTTPError as e: if e.code == 401: raise body = e.fp.read() diff --git a/v1pysdk/query.py b/v1pysdk/query.py index efa88a2..9a2c1e7 100644 --- a/v1pysdk/query.py +++ b/v1pysdk/query.py @@ -1,5 +1,5 @@ -from urllib import urlencode +from urllib.parse import urlencode class V1Query(object): """A fluent query object. Use .select() and .where() to add items to the @@ -33,7 +33,7 @@ def get_sel_string(self): return ','.join(self.sel_list) def get_where_string(self): - terms = list("{0}='{1}'".format(attrname, criteria) for attrname, criteria in self.where_terms.items()) + terms = list("{0}='{1}'".format(attrname, criteria) for attrname, criteria in list(self.where_terms.items())) if self.where_string: terms.append(self.where_string) return ';'.join(terms) diff --git a/v1pysdk/tests/__init__.py b/v1pysdk/tests/__init__.py index e494681..28f8f31 100644 --- a/v1pysdk/tests/__init__.py +++ b/v1pysdk/tests/__init__.py @@ -1,3 +1,3 @@ -import connect_tests +from . import connect_tests import meta_tests diff --git a/v1pysdk/tests/connect_tests.py b/v1pysdk/tests/connect_tests.py index d3a615b..aca2814 100644 --- a/v1pysdk/tests/connect_tests.py +++ b/v1pysdk/tests/connect_tests.py @@ -9,8 +9,8 @@ class TestV1Connection(TestCase): def test_connect(self, username='admin', password='admin'): server = V1Server(username=username, password=password) code, body = server.get('/rest-1.v1/Data/Story') - print "\n\nCode: ", code - print "Body: ", body + print("\n\nCode: ", code) + print("Body: ", body) elem = fromstring(body) self.assertThat(elem.tag, Equals('Assets')) diff --git a/v1pysdk/v1meta.py b/v1pysdk/v1meta.py index 7a15fc1..321928f 100644 --- a/v1pysdk/v1meta.py +++ b/v1pysdk/v1meta.py @@ -3,10 +3,10 @@ except ImportError: from elementtree import ElementTree -from client import * -from base_asset import BaseAsset -from cache_decorator import memoized -from special_class_methods import special_classes +from .client import * +from .base_asset import BaseAsset +from .cache_decorator import memoized +from .special_class_methods import special_classes class V1Meta(object): @@ -85,14 +85,14 @@ def commit(self): for asset in self.dirtylist: try: asset._v1_commit() - except V1Error, e: + except V1Error as e: errors.append(e) self.dirtylist = [] return errors def generate_update_doc(self, newdata): update_doc = Element('Asset') - for attrname, newvalue in newdata.items(): + for attrname, newvalue in list(newdata.items()): if isinstance(newvalue, BaseAsset): node = Element('Relation') node.set('name', attrname) diff --git a/v1pysdk/v1poll.py b/v1pysdk/v1poll.py index 8210533..540d66a 100644 --- a/v1pysdk/v1poll.py +++ b/v1pysdk/v1poll.py @@ -1,7 +1,7 @@ -from v1meta import V1Meta +from .v1meta import V1Meta import sqlite3 from collections import defaultdict @@ -27,7 +27,7 @@ def run_on_new(self, asset_type_name, handler_function): def poll(self): raise NotImplementedError - for asset_type, callback in self.registrations.items(): + for asset_type, callback in list(self.registrations.items()): callback_id = callback.__module__ + '.' + callback.__name__ rows = self.db.query(""" select asset_type, min(last_moment) diff --git a/v1pysdk/yamlquery.py b/v1pysdk/yamlquery.py index 7299b2a..4921451 100644 --- a/v1pysdk/yamlquery.py +++ b/v1pysdk/yamlquery.py @@ -1,5 +1,5 @@ -import urllib +import urllib.request, urllib.parse, urllib.error import yaml def encode_v1_whereterm(input): @@ -12,11 +12,11 @@ def single_or_list(input, separator=','): return str(input) def where_terms(data): - if data.has_key("where"): - for attrname, value in data['where'].items(): + if "where" in data: + for attrname, value in list(data['where'].items()): yield("%s='%s'"%(attrname, encode_v1_whereterm(value))) - if data.has_key("filter"): + if "filter" in data: filter = data['filter'] if isinstance(filter, list): for term in filter: @@ -29,33 +29,33 @@ def query_params(data): if wherestring: yield('where', wherestring) - if data.has_key("select"): + if "select" in data: yield('sel', single_or_list(data['select'])) - if data.has_key('asof'): + if 'asof' in data: yield('asof', data['asof']) - if data.has_key('sort'): + if 'sort' in data: yield('sort', single_or_list(data['sort'])) - if data.has_key('page'): + if 'page' in data: yield('page', "%(size)d,%(start)d"%data['page']) - if data.has_key('find'): + if 'find' in data: yield('find', data['find']) - if data.has_key('findin'): + if 'findin' in data: yield('findin', single_or_list(data['findin'])) - if data.has_key('op'): + if 'op' in data: yield('op', data['op']) def query_from_yaml(yamlstring): data = yaml.load(yamlstring) - if data and data.has_key('from'): - path = '/' + urllib.quote(data['from']) - url = path + '?' + urllib.urlencode(list(query_params(data))) + if data and 'from' in data: + path = '/' + urllib.parse.quote(data['from']) + url = path + '?' + urllib.parse.urlencode(list(query_params(data))) return url raise Exception("Invalid yaml output: " + str(data)) @@ -87,5 +87,5 @@ def query_from_yaml(yamlstring): op: Delete """ -print query_from_yaml(code) +print(query_from_yaml(code)) From 404047ecd0389e93862c14755d8d95bd53f4905a Mon Sep 17 00:00:00 2001 From: Joe Koberg Date: Thu, 21 Feb 2013 12:02:30 -0500 Subject: [PATCH 2/2] move type to new location since we now reference it in class statement --- v1pysdk/base_asset.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/v1pysdk/base_asset.py b/v1pysdk/base_asset.py index 07b43e6..6b59a61 100644 --- a/v1pysdk/base_asset.py +++ b/v1pysdk/base_asset.py @@ -3,6 +3,12 @@ from .query import V1Query +class IterableType(type): + def __iter__(Class): + for instance in Class.query(): + instance.needs_refresh = True + yield instance + class BaseAsset(object, metaclass=IterableType): """Provides common methods for the dynamically derived asset type classes built by V1Meta.asset_class""" @@ -42,11 +48,6 @@ def create(Class, **newdata): "create new asset on server and return created asset proxy instance" return Class._v1_v1meta.create_asset(Class._v1_asset_type_name, newdata) - class IterableType(type): - def __iter__(Class): - for instance in Class.query(): - instance.needs_refresh = True - yield instance "The type that's instantiated to make THIS class must have an __iter__, " "so we provide a metaclass (a thing that provides a class when instantiated) "