From 3aeff452afed6703e317aaaf7bc0c087c5bd9241 Mon Sep 17 00:00:00 2001 From: Eric Guo Date: Fri, 10 Jan 2014 22:41:54 +0800 Subject: [PATCH] Use six.iteritems to make dict work on Python2/3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit six.iteritems returns an iterator over dictionary‘s items. This replaces dictionary.iteritems() on Python 2 and dictionary.items() on Python 3. See http://pythonhosted.org/six/#six.iteritems Part of blueprint py33 Change-Id: I72ef4e2ab6944e58069f9476b2e6dca10c9c94aa --- dashboard/helpers.py | 5 +++-- dashboard/memory_storage.py | 7 +++++-- dashboard/vault.py | 3 ++- dashboard/web.py | 9 +++++---- stackalytics/processor/default_data_processor.py | 3 ++- stackalytics/processor/mls.py | 4 +++- stackalytics/processor/normalizer.py | 4 +++- stackalytics/processor/record_processor.py | 16 +++++++++------- stackalytics/processor/runtime_storage.py | 3 ++- stackalytics/processor/utils.py | 4 +++- stackalytics/processor/vcs.py | 3 ++- tests/api/test_api.py | 5 +++-- tests/unit/test_record_processor.py | 3 ++- 13 files changed, 44 insertions(+), 25 deletions(-) diff --git a/dashboard/helpers.py b/dashboard/helpers.py index 641c35433..af0072ad4 100644 --- a/dashboard/helpers.py +++ b/dashboard/helpers.py @@ -18,6 +18,7 @@ import re import urllib from flask.ext import gravatar as gravatar_ext +import six from dashboard import parameters from dashboard import vault @@ -64,7 +65,7 @@ def extend_record(record): parent = parent.copy() _extend_record_common_fields(parent) - for k, v in parent.iteritems(): + for k, v in six.iteritems(parent): record['parent_%s' % k] = v record['review_number'] = parent.get('review_number') @@ -186,7 +187,7 @@ def make_link(title, uri=None, options=None): param_values.update(options) if param_values: uri += '?' + '&'.join(['%s=%s' % (n, safe_encode(v)) - for n, v in param_values.iteritems()]) + for n, v in six.iteritems(param_values)]) return '%(title)s' % {'uri': uri, 'title': title} diff --git a/dashboard/memory_storage.py b/dashboard/memory_storage.py index f9a208f1a..30703169a 100644 --- a/dashboard/memory_storage.py +++ b/dashboard/memory_storage.py @@ -13,6 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import six + + MEMORY_STORAGE_CACHED = 0 @@ -49,7 +52,7 @@ class CachedMemoryStorage(MemoryStorage): if record.get('company_name') == '*robots': return self.records[record['record_id']] = record - for key, index in self.indexes.iteritems(): + for key, index in six.iteritems(self.indexes): self._add_to_index(index, record, key) for bp_id in (record.get('blueprint_id') or []): if bp_id in self.blueprint_id_index: @@ -75,7 +78,7 @@ class CachedMemoryStorage(MemoryStorage): return have_updates def _remove_record_from_index(self, record): - for key, index in self.indexes.iteritems(): + for key, index in six.iteritems(self.indexes): index[record[key]].remove(record['record_id']) def _add_to_index(self, record_index, record, key): diff --git a/dashboard/vault.py b/dashboard/vault.py index d7dff49b6..7edd076c0 100644 --- a/dashboard/vault.py +++ b/dashboard/vault.py @@ -17,6 +17,7 @@ import os import flask from oslo.config import cfg +import six from dashboard import memory_storage from stackalytics.openstack.common import log as logging @@ -179,7 +180,7 @@ def is_project_type_valid(project_type): project_types = get_project_type_options() if project_type in project_types: return True - for p, g in project_types.iteritems(): + for p, g in six.iteritems(project_types): if project_type in g: return True return False diff --git a/dashboard/web.py b/dashboard/web.py index 553f9ece0..2da2d8771 100644 --- a/dashboard/web.py +++ b/dashboard/web.py @@ -21,6 +21,7 @@ import time import flask from flask.ext import gravatar as gravatar_ext from oslo.config import cfg +import six from dashboard import decorators from dashboard import helpers @@ -386,7 +387,7 @@ def get_release_json(release): def get_metrics_json(): query = (flask.request.args.get('query') or '').lower() return sorted([{'id': m, 'text': t} - for m, t in parameters.METRIC_LABELS.iteritems() + for m, t in six.iteritems(parameters.METRIC_LABELS) if t.lower().find(query) >= 0], key=operator.itemgetter('text')) @@ -405,7 +406,7 @@ def get_metric_json(metric): @decorators.exception_handler() def get_project_types_json(): return [{'id': m, 'text': m, 'items': list(t)} - for m, t in vault.get_project_type_options().iteritems()] + for m, t in six.iteritems(vault.get_project_type_options())] @app.route('/api/1.0/project_types/') @@ -413,7 +414,7 @@ def get_project_types_json(): @decorators.exception_handler() def get_project_type_json(project_type): if project_type != 'all': - for pt, groups in vault.get_project_type_options().iteritems(): + for pt, groups in six.iteritems(vault.get_project_type_options()): if (project_type == pt) or (project_type in groups): break else: @@ -502,7 +503,7 @@ gravatar = gravatar_ext.Gravatar(app, size=64, rating='g', default='wavatar') @app.template_filter('make_url') def to_url_params(dict_params, base_url): return base_url + '?' + '&'.join( - ['%s=%s' % (k, v) for k, v in dict_params.iteritems()]) + ['%s=%s' % (k, v) for k, v in six.iteritems(dict_params)]) @app.template_filter('remove_ctrl_chars') diff --git a/stackalytics/processor/default_data_processor.py b/stackalytics/processor/default_data_processor.py index d444fec58..5ad7af614 100644 --- a/stackalytics/processor/default_data_processor.py +++ b/stackalytics/processor/default_data_processor.py @@ -17,6 +17,7 @@ import hashlib import json from github import MainClass +import six from stackalytics.openstack.common import log as logging from stackalytics.processor import normalizer @@ -112,7 +113,7 @@ def _store_default_data(runtime_storage_inst, default_data): normalizer.normalize_default_data(default_data) LOG.debug('Update runtime storage with default data') - for key, value in default_data.iteritems(): + for key, value in six.iteritems(default_data): if key in STORE_FUNCS: STORE_FUNCS[key](runtime_storage_inst, value) else: diff --git a/stackalytics/processor/mls.py b/stackalytics/processor/mls.py index 931c011ec..ea80033b6 100644 --- a/stackalytics/processor/mls.py +++ b/stackalytics/processor/mls.py @@ -20,6 +20,8 @@ import re import StringIO import urlparse +import six + from stackalytics.openstack.common import log as logging from stackalytics.processor import utils @@ -98,7 +100,7 @@ def _retrieve_mails(uri): email['date'] = int(email_utils.mktime_tz( email_utils.parsedate_tz(email['date']))) - for pattern_name, pattern in MESSAGE_PATTERNS.iteritems(): + for pattern_name, pattern in six.iteritems(MESSAGE_PATTERNS): collection = set() for item in re.finditer(pattern, email['body']): groups = item.groupdict() diff --git a/stackalytics/processor/normalizer.py b/stackalytics/processor/normalizer.py index 7b58343f6..83d086807 100644 --- a/stackalytics/processor/normalizer.py +++ b/stackalytics/processor/normalizer.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +import six + from stackalytics.openstack.common import log as logging from stackalytics.processor import utils @@ -63,6 +65,6 @@ NORMALIZERS = { def normalize_default_data(default_data): - for key, normalizer in NORMALIZERS.iteritems(): + for key, normalizer in six.iteritems(NORMALIZERS): if key in default_data: normalizer(default_data[key]) diff --git a/stackalytics/processor/record_processor.py b/stackalytics/processor/record_processor.py index 8a9e765c6..1b8e44e74 100644 --- a/stackalytics/processor/record_processor.py +++ b/stackalytics/processor/record_processor.py @@ -16,6 +16,8 @@ import bisect import time +import six + from stackalytics.openstack.common import log as logging from stackalytics.processor import launchpad_utils from stackalytics.processor import utils @@ -226,7 +228,7 @@ class RecordProcessor(object): def _spawn_review(self, record): # copy everything except patchsets and flatten user data - review = dict([(k, v) for k, v in record.iteritems() + review = dict([(k, v) for k, v in six.iteritems(record) if k not in ['patchSets', 'owner', 'createdOn']]) owner = record['owner'] if 'email' not in owner or 'username' not in owner: @@ -267,7 +269,7 @@ class RecordProcessor(object): continue # not reviewed by anyone for approval in patch['approvals']: # copy everything and flatten user data - mark = dict([(k, v) for k, v in approval.iteritems() + mark = dict([(k, v) for k, v in six.iteritems(approval) if k not in ['by', 'grantedOn', 'value']]) reviewer = approval['by'] @@ -336,7 +338,7 @@ class RecordProcessor(object): def _process_blueprint(self, record): bpd_author = record.get('drafter') or record.get('owner') - bpd = dict([(k, v) for k, v in record.iteritems() + bpd = dict([(k, v) for k, v in six.iteritems(record) if k.find('_link') < 0]) bpd['record_type'] = 'bpd' bpd['primary_key'] = 'bpd:' + record['id'] @@ -348,7 +350,7 @@ class RecordProcessor(object): yield bpd if record.get('assignee') and record['date_completed']: - bpc = dict([(k, v) for k, v in record.iteritems() + bpc = dict([(k, v) for k, v in six.iteritems(record) if k.find('_link') < 0]) bpc['record_type'] = 'bpc' bpc['primary_key'] = 'bpc:' + record['id'] @@ -466,7 +468,7 @@ class RecordProcessor(object): 'date': record['date'] } - for bp_name, bp in valid_blueprints.iteritems(): + for bp_name, bp in six.iteritems(valid_blueprints): if bp_name in mentioned_blueprints: bp['count'] = mentioned_blueprints[bp_name]['count'] bp['date'] = mentioned_blueprints[bp_name]['date'] @@ -514,7 +516,7 @@ class RecordProcessor(object): users_reviews[launchpad_id] = [review] reviews_index = {} - for launchpad_id, reviews in users_reviews.iteritems(): + for launchpad_id, reviews in six.iteritems(users_reviews): reviews.sort(key=lambda x: x['date']) review_number = 0 for review in reviews: @@ -568,7 +570,7 @@ class RecordProcessor(object): for user in self.runtime_storage_inst.get_all_users() if user['core']]) - for key, marks in marks_per_patch.iteritems(): + for key, marks in six.iteritems(marks_per_patch): if len(marks) < 2: continue diff --git a/stackalytics/processor/runtime_storage.py b/stackalytics/processor/runtime_storage.py index 920ba0640..9b0455961 100644 --- a/stackalytics/processor/runtime_storage.py +++ b/stackalytics/processor/runtime_storage.py @@ -16,6 +16,7 @@ import re import memcache +import six from stackalytics.openstack.common import log as logging from stackalytics.processor import utils @@ -111,7 +112,7 @@ class MemcachedStorage(RuntimeStorage): original = self.memcached.get(self._get_record_name(record_id)) need_update = False - for field, value in correction.iteritems(): + for field, value in six.iteritems(correction): if (field not in original) or (original[field] != value): need_update = True original[field] = value diff --git a/stackalytics/processor/utils.py b/stackalytics/processor/utils.py index 020b3f5b9..07736d856 100644 --- a/stackalytics/processor/utils.py +++ b/stackalytics/processor/utils.py @@ -20,7 +20,9 @@ import re import time import urllib + import iso8601 +import six from stackalytics.openstack.common import log as logging @@ -145,7 +147,7 @@ def make_age_string(seconds): def merge_records(original, new): need_update = False - for key, value in new.iteritems(): + for key, value in six.iteritems(new): if original.get(key) != value: need_update = True original[key] = value diff --git a/stackalytics/processor/vcs.py b/stackalytics/processor/vcs.py index 82833252a..b947b75ed 100644 --- a/stackalytics/processor/vcs.py +++ b/stackalytics/processor/vcs.py @@ -18,6 +18,7 @@ import re import shutil import sh +import six from stackalytics.openstack.common import log as logging from stackalytics.processor import utils @@ -202,7 +203,7 @@ class Git(Vcs): commit['lines_added'] = int(lines_changed or 0) commit['lines_deleted'] = int(lines_deleted or 0) - for pattern_name, pattern in MESSAGE_PATTERNS.iteritems(): + for pattern_name, pattern in six.iteritems(MESSAGE_PATTERNS): collection = set() for item in re.finditer(pattern, commit['message']): collection.add(item.group('id')) diff --git a/tests/api/test_api.py b/tests/api/test_api.py index eafeb4777..c6dbc9d5e 100644 --- a/tests/api/test_api.py +++ b/tests/api/test_api.py @@ -18,6 +18,7 @@ import itertools import uuid import mock +import six import testtools from dashboard import web @@ -155,12 +156,12 @@ def _add_generated_records(data, *generators): def algebraic_product(**kwargs): position_to_key = {} values = [] - for key, value in kwargs.iteritems(): + for key, value in six.iteritems(kwargs): position_to_key[len(values)] = key values.append(value) for chain in itertools.product(*values): result = {} - for position, key in position_to_key.iteritems(): + for position, key in six.iteritems(position_to_key): result[key] = chain[position] yield result diff --git a/tests/unit/test_record_processor.py b/tests/unit/test_record_processor.py index 4d280d040..ef2767506 100644 --- a/tests/unit/test_record_processor.py +++ b/tests/unit/test_record_processor.py @@ -16,6 +16,7 @@ import itertools import mock +import six import testtools from stackalytics.processor import record_processor @@ -1101,7 +1102,7 @@ class TestRecordProcessor(testtools.TestCase): self.assertEqual(set(['nova', 'neutron']), set(modules)) def assertRecordsMatch(self, expected, actual): - for key, value in expected.iteritems(): + for key, value in six.iteritems(expected): self.assertEqual(value, actual[key], 'Values for key %s do not match' % key)