Use six.iteritems to make dict work on Python2/3

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
This commit is contained in:
Eric Guo
2014-01-10 22:41:54 +08:00
parent 70ef2252bc
commit 3aeff452af
13 changed files with 44 additions and 25 deletions

View File

@@ -18,6 +18,7 @@ import re
import urllib import urllib
from flask.ext import gravatar as gravatar_ext from flask.ext import gravatar as gravatar_ext
import six
from dashboard import parameters from dashboard import parameters
from dashboard import vault from dashboard import vault
@@ -64,7 +65,7 @@ def extend_record(record):
parent = parent.copy() parent = parent.copy()
_extend_record_common_fields(parent) _extend_record_common_fields(parent)
for k, v in parent.iteritems(): for k, v in six.iteritems(parent):
record['parent_%s' % k] = v record['parent_%s' % k] = v
record['review_number'] = parent.get('review_number') record['review_number'] = parent.get('review_number')
@@ -186,7 +187,7 @@ def make_link(title, uri=None, options=None):
param_values.update(options) param_values.update(options)
if param_values: if param_values:
uri += '?' + '&'.join(['%s=%s' % (n, safe_encode(v)) uri += '?' + '&'.join(['%s=%s' % (n, safe_encode(v))
for n, v in param_values.iteritems()]) for n, v in six.iteritems(param_values)])
return '<a href="%(uri)s">%(title)s</a>' % {'uri': uri, 'title': title} return '<a href="%(uri)s">%(title)s</a>' % {'uri': uri, 'title': title}

View File

@@ -13,6 +13,9 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import six
MEMORY_STORAGE_CACHED = 0 MEMORY_STORAGE_CACHED = 0
@@ -49,7 +52,7 @@ class CachedMemoryStorage(MemoryStorage):
if record.get('company_name') == '*robots': if record.get('company_name') == '*robots':
return return
self.records[record['record_id']] = record 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) self._add_to_index(index, record, key)
for bp_id in (record.get('blueprint_id') or []): for bp_id in (record.get('blueprint_id') or []):
if bp_id in self.blueprint_id_index: if bp_id in self.blueprint_id_index:
@@ -75,7 +78,7 @@ class CachedMemoryStorage(MemoryStorage):
return have_updates return have_updates
def _remove_record_from_index(self, record): 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']) index[record[key]].remove(record['record_id'])
def _add_to_index(self, record_index, record, key): def _add_to_index(self, record_index, record, key):

View File

@@ -17,6 +17,7 @@ import os
import flask import flask
from oslo.config import cfg from oslo.config import cfg
import six
from dashboard import memory_storage from dashboard import memory_storage
from stackalytics.openstack.common import log as logging 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() project_types = get_project_type_options()
if project_type in project_types: if project_type in project_types:
return True return True
for p, g in project_types.iteritems(): for p, g in six.iteritems(project_types):
if project_type in g: if project_type in g:
return True return True
return False return False

View File

@@ -21,6 +21,7 @@ import time
import flask import flask
from flask.ext import gravatar as gravatar_ext from flask.ext import gravatar as gravatar_ext
from oslo.config import cfg from oslo.config import cfg
import six
from dashboard import decorators from dashboard import decorators
from dashboard import helpers from dashboard import helpers
@@ -386,7 +387,7 @@ def get_release_json(release):
def get_metrics_json(): def get_metrics_json():
query = (flask.request.args.get('query') or '').lower() query = (flask.request.args.get('query') or '').lower()
return sorted([{'id': m, 'text': t} 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], if t.lower().find(query) >= 0],
key=operator.itemgetter('text')) key=operator.itemgetter('text'))
@@ -405,7 +406,7 @@ def get_metric_json(metric):
@decorators.exception_handler() @decorators.exception_handler()
def get_project_types_json(): def get_project_types_json():
return [{'id': m, 'text': m, 'items': list(t)} 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/<project_type>') @app.route('/api/1.0/project_types/<project_type>')
@@ -413,7 +414,7 @@ def get_project_types_json():
@decorators.exception_handler() @decorators.exception_handler()
def get_project_type_json(project_type): def get_project_type_json(project_type):
if project_type != 'all': 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): if (project_type == pt) or (project_type in groups):
break break
else: else:
@@ -502,7 +503,7 @@ gravatar = gravatar_ext.Gravatar(app, size=64, rating='g', default='wavatar')
@app.template_filter('make_url') @app.template_filter('make_url')
def to_url_params(dict_params, base_url): def to_url_params(dict_params, base_url):
return base_url + '?' + '&'.join( 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') @app.template_filter('remove_ctrl_chars')

View File

@@ -17,6 +17,7 @@ import hashlib
import json import json
from github import MainClass from github import MainClass
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
from stackalytics.processor import normalizer from stackalytics.processor import normalizer
@@ -112,7 +113,7 @@ def _store_default_data(runtime_storage_inst, default_data):
normalizer.normalize_default_data(default_data) normalizer.normalize_default_data(default_data)
LOG.debug('Update runtime storage with 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: if key in STORE_FUNCS:
STORE_FUNCS[key](runtime_storage_inst, value) STORE_FUNCS[key](runtime_storage_inst, value)
else: else:

View File

@@ -20,6 +20,8 @@ import re
import StringIO import StringIO
import urlparse import urlparse
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
from stackalytics.processor import utils from stackalytics.processor import utils
@@ -98,7 +100,7 @@ def _retrieve_mails(uri):
email['date'] = int(email_utils.mktime_tz( email['date'] = int(email_utils.mktime_tz(
email_utils.parsedate_tz(email['date']))) 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() collection = set()
for item in re.finditer(pattern, email['body']): for item in re.finditer(pattern, email['body']):
groups = item.groupdict() groups = item.groupdict()

View File

@@ -13,6 +13,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
from stackalytics.processor import utils from stackalytics.processor import utils
@@ -63,6 +65,6 @@ NORMALIZERS = {
def normalize_default_data(default_data): def normalize_default_data(default_data):
for key, normalizer in NORMALIZERS.iteritems(): for key, normalizer in six.iteritems(NORMALIZERS):
if key in default_data: if key in default_data:
normalizer(default_data[key]) normalizer(default_data[key])

View File

@@ -16,6 +16,8 @@
import bisect import bisect
import time import time
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
from stackalytics.processor import launchpad_utils from stackalytics.processor import launchpad_utils
from stackalytics.processor import utils from stackalytics.processor import utils
@@ -226,7 +228,7 @@ class RecordProcessor(object):
def _spawn_review(self, record): def _spawn_review(self, record):
# copy everything except patchsets and flatten user data # 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']]) if k not in ['patchSets', 'owner', 'createdOn']])
owner = record['owner'] owner = record['owner']
if 'email' not in owner or 'username' not in owner: if 'email' not in owner or 'username' not in owner:
@@ -267,7 +269,7 @@ class RecordProcessor(object):
continue # not reviewed by anyone continue # not reviewed by anyone
for approval in patch['approvals']: for approval in patch['approvals']:
# copy everything and flatten user data # 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']]) if k not in ['by', 'grantedOn', 'value']])
reviewer = approval['by'] reviewer = approval['by']
@@ -336,7 +338,7 @@ class RecordProcessor(object):
def _process_blueprint(self, record): def _process_blueprint(self, record):
bpd_author = record.get('drafter') or record.get('owner') 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]) if k.find('_link') < 0])
bpd['record_type'] = 'bpd' bpd['record_type'] = 'bpd'
bpd['primary_key'] = 'bpd:' + record['id'] bpd['primary_key'] = 'bpd:' + record['id']
@@ -348,7 +350,7 @@ class RecordProcessor(object):
yield bpd yield bpd
if record.get('assignee') and record['date_completed']: 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]) if k.find('_link') < 0])
bpc['record_type'] = 'bpc' bpc['record_type'] = 'bpc'
bpc['primary_key'] = 'bpc:' + record['id'] bpc['primary_key'] = 'bpc:' + record['id']
@@ -466,7 +468,7 @@ class RecordProcessor(object):
'date': record['date'] '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: if bp_name in mentioned_blueprints:
bp['count'] = mentioned_blueprints[bp_name]['count'] bp['count'] = mentioned_blueprints[bp_name]['count']
bp['date'] = mentioned_blueprints[bp_name]['date'] bp['date'] = mentioned_blueprints[bp_name]['date']
@@ -514,7 +516,7 @@ class RecordProcessor(object):
users_reviews[launchpad_id] = [review] users_reviews[launchpad_id] = [review]
reviews_index = {} 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']) reviews.sort(key=lambda x: x['date'])
review_number = 0 review_number = 0
for review in reviews: for review in reviews:
@@ -568,7 +570,7 @@ class RecordProcessor(object):
for user in self.runtime_storage_inst.get_all_users() for user in self.runtime_storage_inst.get_all_users()
if user['core']]) if user['core']])
for key, marks in marks_per_patch.iteritems(): for key, marks in six.iteritems(marks_per_patch):
if len(marks) < 2: if len(marks) < 2:
continue continue

View File

@@ -16,6 +16,7 @@
import re import re
import memcache import memcache
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
from stackalytics.processor import utils from stackalytics.processor import utils
@@ -111,7 +112,7 @@ class MemcachedStorage(RuntimeStorage):
original = self.memcached.get(self._get_record_name(record_id)) original = self.memcached.get(self._get_record_name(record_id))
need_update = False 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): if (field not in original) or (original[field] != value):
need_update = True need_update = True
original[field] = value original[field] = value

View File

@@ -20,7 +20,9 @@ import re
import time import time
import urllib import urllib
import iso8601 import iso8601
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
@@ -145,7 +147,7 @@ def make_age_string(seconds):
def merge_records(original, new): def merge_records(original, new):
need_update = False need_update = False
for key, value in new.iteritems(): for key, value in six.iteritems(new):
if original.get(key) != value: if original.get(key) != value:
need_update = True need_update = True
original[key] = value original[key] = value

View File

@@ -18,6 +18,7 @@ import re
import shutil import shutil
import sh import sh
import six
from stackalytics.openstack.common import log as logging from stackalytics.openstack.common import log as logging
from stackalytics.processor import utils from stackalytics.processor import utils
@@ -202,7 +203,7 @@ class Git(Vcs):
commit['lines_added'] = int(lines_changed or 0) commit['lines_added'] = int(lines_changed or 0)
commit['lines_deleted'] = int(lines_deleted 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() collection = set()
for item in re.finditer(pattern, commit['message']): for item in re.finditer(pattern, commit['message']):
collection.add(item.group('id')) collection.add(item.group('id'))

View File

@@ -18,6 +18,7 @@ import itertools
import uuid import uuid
import mock import mock
import six
import testtools import testtools
from dashboard import web from dashboard import web
@@ -155,12 +156,12 @@ def _add_generated_records(data, *generators):
def algebraic_product(**kwargs): def algebraic_product(**kwargs):
position_to_key = {} position_to_key = {}
values = [] values = []
for key, value in kwargs.iteritems(): for key, value in six.iteritems(kwargs):
position_to_key[len(values)] = key position_to_key[len(values)] = key
values.append(value) values.append(value)
for chain in itertools.product(*values): for chain in itertools.product(*values):
result = {} result = {}
for position, key in position_to_key.iteritems(): for position, key in six.iteritems(position_to_key):
result[key] = chain[position] result[key] = chain[position]
yield result yield result

View File

@@ -16,6 +16,7 @@
import itertools import itertools
import mock import mock
import six
import testtools import testtools
from stackalytics.processor import record_processor from stackalytics.processor import record_processor
@@ -1101,7 +1102,7 @@ class TestRecordProcessor(testtools.TestCase):
self.assertEqual(set(['nova', 'neutron']), set(modules)) self.assertEqual(set(['nova', 'neutron']), set(modules))
def assertRecordsMatch(self, expected, actual): def assertRecordsMatch(self, expected, actual):
for key, value in expected.iteritems(): for key, value in six.iteritems(expected):
self.assertEqual(value, actual[key], self.assertEqual(value, actual[key],
'Values for key %s do not match' % key) 'Values for key %s do not match' % key)