Skip to content

Commit 90da61e

Browse files
Merge pull request #3 from nhumrich/master
Add support for python3
2 parents 4b31c74 + 2ce1ae3 commit 90da61e

File tree

2 files changed

+40
-34
lines changed

2 files changed

+40
-34
lines changed

gdapi.py

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#!/usr/bin/env python
22
# PYTHON_ARGCOMPLETE_OK
33

4+
from __future__ import print_function
5+
import six
46
import re
57
import requests
68
import collections
@@ -45,7 +47,7 @@ def _prefix(cmd):
4547
def echo(fn):
4648
def wrapped(*args, **kw):
4749
ret = fn(*args, **kw)
48-
print fn.__name__, repr(ret)
50+
print(fn.__name__, repr(ret))
4951
return ret
5052
return wrapped
5153

@@ -56,7 +58,7 @@ def wrapped(*args, **kw):
5658
start = time.time()
5759
ret = fn(*args, **kw)
5860
delta = time.time() - start
59-
print delta, args[1], fn.__name__
61+
print(delta, args[1], fn.__name__)
6062
return ret
6163
else:
6264
return fn(*args, **kw)
@@ -78,7 +80,7 @@ def _as_table(self):
7880
if not hasattr(self, 'type'):
7981
return str(self.__dict__)
8082
data = [('Type', 'Id', 'Name', 'Value')]
81-
for k, v in self.iteritems():
83+
for k, v in six.iteritems(self):
8284
if self._is_public(k, v):
8385
if v is None:
8486
v = 'null'
@@ -99,7 +101,7 @@ def _is_list(self):
99101

100102
def __repr__(self):
101103
data = {}
102-
for k, v in self.__dict__.iteritems():
104+
for k, v in six.iteritems(self.__dict__):
103105
if self._is_public(k, v):
104106
data[k] = v
105107
return repr(data)
@@ -204,7 +206,7 @@ def object_hook(self, obj):
204206
if isinstance(obj, dict):
205207
result = RestObject()
206208

207-
for k, v in obj.iteritems():
209+
for k, v in six.iteritems(obj):
208210
setattr(result, k, self.object_hook(v))
209211

210212
for link in ['next', 'prev']:
@@ -216,9 +218,9 @@ def object_hook(self, obj):
216218
pass
217219

218220
if hasattr(result, 'type') and isinstance(getattr(result, 'type'),
219-
basestring):
221+
six.string_types):
220222
if hasattr(result, 'links'):
221-
for link_name, link in result.links.iteritems():
223+
for link_name, link in six.iteritems(result.links):
222224
cb = lambda _link=link, **kw: self._get(_link,
223225
data=kw)
224226
if hasattr(result, link_name):
@@ -227,7 +229,7 @@ def object_hook(self, obj):
227229
setattr(result, link_name, cb)
228230

229231
if hasattr(result, 'actions'):
230-
for link_name, link in result.actions.iteritems():
232+
for link_name, link in six.iteritems(result.actions):
231233
cb = lambda _link_name=link_name, _result=result, \
232234
*args, **kw: self.action(_result, _link_name,
233235
*args, **kw)
@@ -338,7 +340,7 @@ def by_id(self, type, id, **kw):
338340
url = '/'.join([url, id])
339341
try:
340342
return self._get(url, self._to_dict(**kw))
341-
except ApiError, e:
343+
except ApiError as e:
342344
if e.error.status == 404:
343345
return None
344346
else:
@@ -367,7 +369,7 @@ def _validate_list(self, type, **kw):
367369
if hasattr(collection_filters, k):
368370
return
369371

370-
for filter_name, filter_value in collection_filters.iteritems():
372+
for filter_name, filter_value in six.iteritems(collection_filters):
371373
for m in filter_value.modifiers:
372374
if k == '_'.join([filter_name, m]):
373375
return
@@ -395,7 +397,7 @@ def delete(self, *args):
395397
return self._delete(i.links.self)
396398

397399
def action(self, obj, action_name, *args, **kw):
398-
url = obj.actions[action_name]
400+
url = getattr(obj.actions, action_name)
399401
return self._post(url, data=self._to_dict(*args, **kw))
400402

401403
def _is_list(self, obj):
@@ -411,7 +413,7 @@ def _is_list(self, obj):
411413
def _to_value(self, value):
412414
if isinstance(value, dict):
413415
ret = {}
414-
for k, v in value.iteritems():
416+
for k, v in six.iteritems(value):
415417
ret[k] = self._to_value(v)
416418
return ret
417419

@@ -445,10 +447,10 @@ def _to_dict(self, *args, **kw):
445447
for i in args:
446448
value = self._to_value(i)
447449
if isinstance(value, dict):
448-
for k, v in value.iteritems():
450+
for k, v in six.iteritems(value):
449451
ret[k] = v
450452

451-
for k, v in kw.iteritems():
453+
for k, v in six.iteritems(kw):
452454
ret[k] = self._to_value(v)
453455

454456
return ret
@@ -470,15 +472,14 @@ def _bind_methods(self, schema):
470472
('create', 'collectionMethods', POST_METHOD, self.create)
471473
]
472474

473-
for type_name, type in schema.types.iteritems():
475+
for type_name, typ in six.iteritems(schema.types):
474476
for name_variant in self._type_name_variants(type_name):
475477
for method_name, type_collection, test_method, m in bindings:
476478
# double lambda for lexical binding hack, I'm sure there's
477479
# a better way to do this
478480
cb = lambda type_name=type_name, method=m: \
479481
lambda *args, **kw: method(type_name, *args, **kw)
480-
if hasattr(type, type_collection) and \
481-
test_method in type[type_collection]:
482+
if test_method in getattr(typ, type_collection, []):
482483
setattr(self, '_'.join([method_name, name_variant]),
483484
cb())
484485

@@ -537,14 +538,17 @@ def _print_cli(client, obj):
537538
return
538539

539540
if JSON:
540-
print client._marshall(obj, indent=2, sort_keys=True)
541+
print(client._marshall(obj, indent=2, sort_keys=True))
541542
elif callable(getattr(obj, '_as_table')):
542-
print obj._as_table()
543+
print(obj._as_table())
543544
else:
544-
print obj
545+
print(obj)
545546

546547
# {{{ http://code.activestate.com/recipes/267662/ (r7)
547-
import cStringIO
548+
try:
549+
from cStringIO import StringIO
550+
except ImportError:
551+
from io import StringIO
548552
import operator
549553

550554

@@ -580,15 +584,16 @@ def rowWrapper(row):
580584
len(delim)*(len(maxWidths)-1))
581585
# select the appropriate justify method
582586
justify = {'center': str.center, 'right': str.rjust, 'left': str.ljust}[justify.lower()] # NOQA
583-
output = cStringIO.StringIO()
587+
output = StringIO()
584588
if separateRows:
585-
print >> output, rowSeparator
589+
print(rowSeparator, file=output)
586590
for physicalRows in logicalRows:
587591
for row in physicalRows:
588-
print >> output, prefix \
589-
+ delim.join([justify(str(item), width) for (item, width) in zip(row, maxWidths)]) + postfix # NOQA
592+
print(prefix
593+
+ delim.join([justify(str(item), width) for (item, width) in zip(row, maxWidths)]) + postfix, # NOQA
594+
file=output)
590595
if separateRows or hasHeader:
591-
print >> output, rowSeparator
596+
print(rowSeparator, file=output)
592597
hasHeader = False
593598
return output.getvalue()
594599
# End {{{ http://code.activestate.com/recipes/267662/ (r7)
@@ -610,7 +615,7 @@ def from_env(prefix=PREFIX + '_', factory=Client, **kw):
610615

611616
def _from_env(prefix=PREFIX + '_', factory=Client, **kw):
612617
result = dict(kw)
613-
for k, v in kw.iteritems():
618+
for k, v in six.iteritems(kw):
614619
if v is not None:
615620
result[k] = v
616621
else:
@@ -651,7 +656,7 @@ def _general_args(help=True):
651656
def _list_args(subparsers, client, type, schema):
652657
help_msg = LIST[0:len(LIST)-1].capitalize() + ' ' + type
653658
subparser = subparsers.add_parser(LIST + type, help=help_msg)
654-
for name, filter in schema.collectionFilters.iteritems():
659+
for name, filter in six.iteritems(schema.collectionFilters):
655660
subparser.add_argument('--' + name)
656661
for m in filter.modifiers:
657662
if m != 'eq':
@@ -686,7 +691,7 @@ def _generic_args(subparsers, field_key, type, schema,
686691
subparser = subparsers.add_parser(prefix, help=help_msg)
687692

688693
if schema is not None:
689-
for name, field in schema.iteritems():
694+
for name, field in six.iteritems(schema):
690695
if field.get(field_key) is True:
691696
if field.get('type').startswith('array'):
692697
subparser.add_argument('--' + name, nargs='*')
@@ -701,7 +706,7 @@ def _generic_args(subparsers, field_key, type, schema,
701706
def _full_args(client):
702707
parser = _general_args()
703708
subparsers = parser.add_subparsers(help='Sub-Command Help')
704-
for type, schema in client.schema.types.iteritems():
709+
for type, schema in six.iteritems(client.schema.types):
705710
if schema.listable:
706711
subparser = _list_args(subparsers, client, type, schema)
707712
subparser.set_defaults(_action=LIST, _type=type)
@@ -721,7 +726,7 @@ def _full_args(client):
721726
subparser.set_defaults(_action=DELETE, _type=type)
722727

723728
try:
724-
for name, args in schema.resourceActions.iteritems():
729+
for name, args in six.iteritems(schema.resourceActions):
725730
action_schema = None
726731
try:
727732
action_schema = client.schema.types[args.input]
@@ -783,7 +788,7 @@ def _run_cli(client, namespace):
783788
obj = client.action(obj, command_type[len(ACTION):], **args)
784789
if obj:
785790
_print_cli(client, obj)
786-
except ApiError, e:
791+
except ApiError as e:
787792
import sys
788793

789794
sys.stderr.write('Error : {}\n'.format(e.error))

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
argcomplete==0.7.0
2-
requests==2.2.1
1+
argcomplete
2+
requests
3+
six

0 commit comments

Comments
 (0)