diff --git a/requestbuilder/command.py b/requestbuilder/command.py index 7d2f857..9d15f6e 100644 --- a/requestbuilder/command.py +++ b/requestbuilder/command.py @@ -12,7 +12,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -from __future__ import absolute_import +from __future__ import absolute_import, print_function import argparse import bdb @@ -37,6 +37,9 @@ from requestbuilder.suite import RequestBuilder from requestbuilder.util import add_default_routes, aggregate_subclass_fields +import six + + class BaseCommand(object): """ The basis for a command line tool. To invoke this as a command line tool, @@ -241,7 +244,7 @@ class BaseCommand(object): self.log.debug('parsed arguments from CLI: %s', str(cli_args)) def distribute_args(self): - for key, val in self.args.iteritems(): + for key, val in six.iteritems(self.args): # If a location to route this to was supplied, put it there, too. if key not in self._arg_routes: raise TypeError('got unrecognized arg: "{0}"'.format(key)) @@ -276,12 +279,12 @@ class BaseCommand(object): if getattr(err, 'filename', None): err_bits[-1] += ':' err_bits.append(err.filename) - print >> sys.stderr, ' '.join(err_bits) + print(' '.join(err_bits), file=sys.stderr) else: if len(err.args) > 0 and err.args[0]: - print >> sys.stderr, msg_prefix, err.args[0] + print(msg_prefix, err.args[0], file=sys.stderr) else: - print >> sys.stderr, msg_prefix, str(err) + print(msg_prefix, str(err), file=sys.stderr) # Since we don't even have a config file to consult our options for # determining when debugging is on are limited to what we got at # the command line. @@ -337,12 +340,12 @@ class BaseCommand(object): if getattr(err, 'filename', None): err_bits[-1] += ':' err_bits.append(err.filename) - print >> sys.stderr, ' '.join(err_bits) + print(' '.join(err_bits), file=sys.stderr) else: if len(err.args) > 0 and err.args[0]: - print >> sys.stderr, msg_prefix, err.args[0] + print(msg_prefix, err.args[0], file=sys.stderr) else: - print >> sys.stderr, msg_prefix, str(err) + print(msg_prefix, str(err), file=sys.stderr) if self.debug: raise sys.exit(1) @@ -384,7 +387,7 @@ def _debugger_usr1_handler(_, frame): frame_dict = {'_frame': frame} frame_dict.update(frame.f_globals) frame_dict.update(frame.f_locals) - print >> sys.stderr, ''.join(traceback.format_stack(frame)) + print(''.join(traceback.format_stack(frame)), file=sys.stderr) def _rewrap_description(text, width=70): diff --git a/requestbuilder/config.py b/requestbuilder/config.py index f8329ec..a0a7e8a 100644 --- a/requestbuilder/config.py +++ b/requestbuilder/config.py @@ -14,11 +14,14 @@ from __future__ import absolute_import -import ConfigParser import itertools import logging +import six +from six.moves import configparser + + class ConfigView(object): def __init__(self, data, region=None, user=None): self.log = data.log @@ -87,7 +90,7 @@ class ConfigView(object): @staticmethod def __get_all_options(confdict, option): matches = {} - for section, options in confdict.iteritems(): + for section, options in six.iteritems(confdict): if '*' not in section and option in options: matches[section] = options[option] return matches @@ -115,7 +118,7 @@ class ConfigData(object): self._parse_config(filenames) def _parse_config(self, filenames): - parser = ConfigParser.SafeConfigParser() + parser = configparser.SafeConfigParser() parser.read(filenames) for section in parser.sections(): if section == 'global': diff --git a/requestbuilder/request.py b/requestbuilder/request.py index 8e15e4f..4f3001b 100644 --- a/requestbuilder/request.py +++ b/requestbuilder/request.py @@ -12,7 +12,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -from __future__ import absolute_import +from __future__ import absolute_import, print_function import argparse import copy @@ -31,6 +31,9 @@ from requestbuilder.util import aggregate_subclass_fields from requestbuilder.xmlparse import parse_listdelimited_aws_xml +import six + + class BaseRequest(BaseCommand): """ The basis for a command line tool that represents a request. The data for @@ -216,7 +219,7 @@ class BaseRequest(BaseCommand): if isinstance(err, ServerError): msg = '{0}: {1}'.format(os.path.basename(sys.argv[0]), err.format_for_cli()) - print >> sys.stderr, msg + print(msg, file=sys.stderr) if self.debug: raise sys.exit(1) @@ -323,7 +326,7 @@ class AWSQueryRequest(BaseRequest): if args is None: pass elif isinstance(args, dict): - for (key, val) in args.iteritems(): + for (key, val) in six.iteritems(args): # Prefix.Key1, Prefix.Key2, ... if prefix: prefixed_key = '{0}.{1}'.format(prefix, key) @@ -434,7 +437,7 @@ def _process_filters(cli_filters): filter_args[key].append(val) # Build the flattenable [{'Name': key, 'Value': [value, ...]}, ...] filters = [{'Name': name, 'Value': values} for (name, values) - in filter_args.iteritems()] + in six.iteritems(filter_args)] return filters diff --git a/requestbuilder/service.py b/requestbuilder/service.py index 1f51cb0..e0f1d47 100644 --- a/requestbuilder/service.py +++ b/requestbuilder/service.py @@ -106,7 +106,7 @@ class BaseService(RegionConfigurableMixin): def session(self): if self._session is None: self._session = requests.session() - for key, val in self.session_args.iteritems(): + for key, val in six.iteritems(self.session_args): setattr(self._session, key, val) for adapter in self._session.adapters.values(): # send_request handles retries to allow for re-signing @@ -282,7 +282,7 @@ class BaseService(RegionConfigurableMixin): self.log.debug('request method: %s', request.method) self.log.debug('request url: %s', p_request.url) if isinstance(p_request.headers, (dict, collections.Mapping)): - for key, val in sorted(p_request.headers.iteritems()): + for key, val in sorted(six.iteritems(p_request.headers)): if key.lower().endswith('password'): val = '' self.log.debug('request header: %s: %s', key, val) @@ -315,7 +315,7 @@ class BaseService(RegionConfigurableMixin): val = '' self.log.debug('request data: %s: %s', key, val) if isinstance(request.files, (dict, collections.Mapping)): - for key, val in sorted(request.files.iteritems()): + for key, val in sorted(six.iteritems(request.files)): if hasattr(val, '__len__'): val = '<{0} bytes>'.format(len(val)) self.log.debug('request file: %s: %s', key, val) diff --git a/setup.py b/setup.py index fbd9dca..86395e7 100644 --- a/setup.py +++ b/setup.py @@ -88,6 +88,9 @@ setup(name='requestbuilder', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', 'Topic :: Internet'], cmdclass={'build_py': build_py_with_git_version, 'sdist': sdist_with_git_version})