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)