diff --git a/src/calibre/customize/zipplugin.py b/src/calibre/customize/zipplugin.py index fec7842afd..a079d53744 100644 --- a/src/calibre/customize/zipplugin.py +++ b/src/calibre/customize/zipplugin.py @@ -14,8 +14,8 @@ from functools import partial from calibre import as_unicode from calibre.customize import (Plugin, numeric_version, platform, InvalidPlugin, PluginNotFound) -from polyglot.builtins import (itervalues, iterkeys, map, - string_or_bytes, unicode_type) +from polyglot.builtins import (itervalues, map, string_or_bytes, + unicode_type) # PEP 302 based plugin loading mechanism, works around the bug in zipimport in # python 2.x that prevents importing from zip files in locations whose paths @@ -281,7 +281,7 @@ class PluginLoader(object): # Legacy plugins if '__init__' not in names: - for name in list(iterkeys(names)): + for name in tuple(names): if '.' not in name and name.endswith('plugin'): names['__init__'] = names[name] break diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index ba9e696ce5..cc39b7f0a8 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -12,7 +12,7 @@ import os, shutil, uuid, json, glob, time, hashlib, errno, sys from functools import partial import apsw -from polyglot.builtins import (iteritems, iterkeys, itervalues, +from polyglot.builtins import (iteritems, itervalues, unicode_type, reraise, string_or_bytes) from calibre import isbytestring, force_unicode, prints, as_unicode @@ -223,7 +223,7 @@ def SortedConcatenate(sep=','): def finalize(ctxt): if len(ctxt) == 0: return None - return sep.join(map(ctxt.get, sorted(iterkeys(ctxt)))) + return sep.join(map(ctxt.get, sorted(ctxt))) return ({}, step, finalize) @@ -248,7 +248,7 @@ def AumSortedConcatenate(): ctxt[ndx] = ':::'.join((author, sort, link)) def finalize(ctxt): - keys = list(iterkeys(ctxt)) + keys = list(ctxt) l = len(keys) if l == 0: return None @@ -734,7 +734,7 @@ class DB(object): } # Create Tag Browser categories for custom columns - for k in sorted(iterkeys(self.custom_column_label_map)): + for k in sorted(self.custom_column_label_map): v = self.custom_column_label_map[k] if v['normalized']: is_category = True diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index f04f16edeb..1a408939df 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -11,7 +11,7 @@ import os, traceback, random, shutil, operator from io import BytesIO from collections import defaultdict, Set, MutableSet from functools import wraps, partial -from polyglot.builtins import iteritems, iterkeys, itervalues, unicode_type, zip, string_or_bytes +from polyglot.builtins import iteritems, itervalues, unicode_type, zip, string_or_bytes from time import time from calibre import isbytestring, as_unicode @@ -170,7 +170,7 @@ class Cache(object): # Reconstruct the user categories, putting them into field_metadata fm = self.field_metadata fm.remove_dynamic_categories() - for user_cat in sorted(iterkeys(self._pref('user_categories', {})), key=sort_key): + for user_cat in sorted(self._pref('user_categories', {}), key=sort_key): cat_name = '@' + user_cat # add the '@' to avoid name collision while cat_name: try: @@ -181,7 +181,7 @@ class Cache(object): # add grouped search term user categories muc = frozenset(self._pref('grouped_search_make_user_categories', [])) - for cat in sorted(iterkeys(self._pref('grouped_search_terms', {})), key=sort_key): + for cat in sorted(self._pref('grouped_search_terms', {}), key=sort_key): if cat in muc: # There is a chance that these can be duplicates of an existing # user category. Print the exception and continue. @@ -1117,7 +1117,7 @@ class Cache(object): @read_api def get_a_dirtied_book(self): if self.dirtied_cache: - return random.choice(tuple(iterkeys(self.dirtied_cache))) + return random.choice(tuple(self.dirtied_cache)) return None @read_api @@ -1339,7 +1339,7 @@ class Cache(object): user_mi = mi.get_all_user_metadata(make_copy=False) fm = self.field_metadata - for key in iterkeys(user_mi): + for key in user_mi: if (key in fm and user_mi[key]['datatype'] == fm[key]['datatype'] and ( user_mi[key]['datatype'] != 'text' or ( user_mi[key]['is_multiple'] == fm[key]['is_multiple']))): @@ -1458,7 +1458,7 @@ class Cache(object): size_map = table.remove_formats(formats_map, self.backend) self.fields['size'].table.update_sizes(size_map) - self._update_last_modified(tuple(iterkeys(formats_map))) + self._update_last_modified(tuple(formats_map)) @read_api def get_next_series_num_for(self, series, field='series', current_indices=False): diff --git a/src/calibre/db/categories.py b/src/calibre/db/categories.py index 38489a40fb..cc6ea00dd8 100644 --- a/src/calibre/db/categories.py +++ b/src/calibre/db/categories.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' import copy from functools import partial -from polyglot.builtins import iteritems, iterkeys, unicode_type, map +from polyglot.builtins import iteritems, unicode_type, map from calibre.constants import ispy3 from calibre.ebooks.metadata import author_to_author_sort @@ -219,7 +219,7 @@ def get_categories(dbcache, sort='name', book_ids=None, first_letter_sort=False) taglist[c] = dict(map(lambda t:(icu_lower(t.name), t), items)) # Add the category values to the user categories - for user_cat in sorted(iterkeys(user_categories), key=sort_key): + for user_cat in sorted(user_categories, key=sort_key): items = [] names_seen = {} user_cat_is_gst = user_cat in gst diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index d42ab52db9..f7e699ef1a 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -19,7 +19,7 @@ from calibre.utils.config_base import tweaks from calibre.utils.icu import sort_key from calibre.utils.date import UNDEFINED_DATE, clean_date_for_sort, parse_date from calibre.utils.localization import calibre_langcode_to_name -from polyglot.builtins import iteritems, iterkeys +from polyglot.builtins import iteritems def bool_sort_key(bools_are_tristate): @@ -184,7 +184,7 @@ class OneToOneField(Field): return {item_id} def __iter__(self): - return iterkeys(self.table.book_col_map) + return iter(self.table.book_col_map) def sort_keys_for_books(self, get_metadata, lang_map): bcmg = self.table.book_col_map.get @@ -456,7 +456,7 @@ class ManyToOneField(Field): return self.table.col_book_map.get(item_id, set()) def __iter__(self): - return iterkeys(self.table.id_map) + return iter(self.table.id_map) def sort_keys_for_books(self, get_metadata, lang_map): sk_map = LazySortMap(self._default_sort_key, self._sort_key, self.table.id_map) @@ -507,7 +507,7 @@ class ManyToManyField(Field): return self.table.col_book_map.get(item_id, set()) def __iter__(self): - return iterkeys(self.table.id_map) + return iter(self.table.id_map) def sort_keys_for_books(self, get_metadata, lang_map): sk_map = LazySortMap(self._default_sort_key, self._sort_key, self.table.id_map) @@ -561,7 +561,7 @@ class IdentifiersField(ManyToManyField): 'Sort by identifier keys' bcmg = self.table.book_col_map.get dv = {self._default_sort_key:None} - return lambda book_id: tuple(sorted(iterkeys(bcmg(book_id, dv)))) + return lambda book_id: tuple(sorted(bcmg(book_id, dv))) def iter_searchable_values(self, get_metadata, candidates, default_value=()): bcm = self.table.book_col_map diff --git a/src/calibre/db/lazy.py b/src/calibre/db/lazy.py index e3c5128ed4..e200b86b97 100644 --- a/src/calibre/db/lazy.py +++ b/src/calibre/db/lazy.py @@ -15,7 +15,7 @@ from copy import deepcopy from calibre.ebooks.metadata.book.base import Metadata, SIMPLE_GET, TOP_LEVEL_IDENTIFIERS, NULL_VALUES, ALL_METADATA_FIELDS from calibre.ebooks.metadata.book.formatter import SafeFormat from calibre.utils.date import utcnow -from polyglot.builtins import iterkeys, unicode_type +from polyglot.builtins import unicode_type # Lazy format metadata retrieval {{{ ''' @@ -393,7 +393,7 @@ class ProxyMetadata(Metadata): def all_field_keys(self): um = ga(self, '_user_metadata') - return frozenset(ALL_METADATA_FIELDS.union(iterkeys(um))) + return frozenset(ALL_METADATA_FIELDS.union(frozenset(um))) @property def _proxy_metadata(self): diff --git a/src/calibre/db/schema_upgrades.py b/src/calibre/db/schema_upgrades.py index 7b5dc28832..d9859b366a 100644 --- a/src/calibre/db/schema_upgrades.py +++ b/src/calibre/db/schema_upgrades.py @@ -11,7 +11,7 @@ import os from calibre import prints from calibre.utils.date import isoformat, DEFAULT_DATE -from polyglot.builtins import iterkeys, itervalues, unicode_type +from polyglot.builtins import itervalues, unicode_type class SchemaUpgrade(object): @@ -596,7 +596,7 @@ class SchemaUpgrade(object): custom_recipe_filename) bdir = os.path.dirname(custom_recipes.file_path) for id_, title, script in recipes: - existing = frozenset(map(int, iterkeys(custom_recipes))) + existing = frozenset(map(int, custom_recipes)) if id_ in existing: id_ = max(existing) + 1000 id_ = str(id_) diff --git a/src/calibre/db/search.py b/src/calibre/db/search.py index b4cea09c71..19b9b00109 100644 --- a/src/calibre/db/search.py +++ b/src/calibre/db/search.py @@ -19,7 +19,7 @@ from calibre.utils.date import parse_date, UNDEFINED_DATE, now, dt_as_local from calibre.utils.icu import primary_contains, sort_key from calibre.utils.localization import lang_map, canonicalize_lang from calibre.utils.search_query_parser import SearchQueryParser, ParseException -from polyglot.builtins import iteritems, iterkeys, unicode_type, string_or_bytes +from polyglot.builtins import iteritems, unicode_type, string_or_bytes CONTAINS_MATCH = 0 EQUALS_MATCH = 1 @@ -445,7 +445,7 @@ class SavedSearchQueries(object): # {{{ db._set_pref(self.opt_name, smap) def names(self): - return sorted(iterkeys(self.queries), key=sort_key) + return sorted(self.queries, key=sort_key) # }}} diff --git a/src/calibre/db/tests/filesystem.py b/src/calibre/db/tests/filesystem.py index 11c9fbe0d7..aac9480b0a 100644 --- a/src/calibre/db/tests/filesystem.py +++ b/src/calibre/db/tests/filesystem.py @@ -13,7 +13,6 @@ from io import BytesIO from calibre.constants import iswindows from calibre.db.tests.base import BaseTest from calibre.ptempfile import TemporaryDirectory -from polyglot.builtins import iterkeys class FilesystemTest(BaseTest): @@ -56,7 +55,7 @@ class FilesystemTest(BaseTest): cache2 = self.init_cache(cl) for c in (cache, cache2): data = self.get_filesystem_data(c, 1) - ae(set(iterkeys(orig_data)), set(iterkeys(data))) + ae(set(orig_data), set(data)) ae(orig_data, data, 'Filesystem data does not match') ae(c.field_for('path', 1), 'Moved/Moved (1)') ae(c.field_for('path', 3), 'Moved1/Moved1 (3)') diff --git a/src/calibre/db/tests/legacy.py b/src/calibre/db/tests/legacy.py index 9310392882..b0f88feb30 100644 --- a/src/calibre/db/tests/legacy.py +++ b/src/calibre/db/tests/legacy.py @@ -14,7 +14,7 @@ from operator import itemgetter from calibre.library.field_metadata import fm_as_dict from calibre.db.tests.base import BaseTest -from polyglot.builtins import iteritems, iterkeys, range +from polyglot.builtins import iteritems, range # Utils {{{ @@ -316,9 +316,9 @@ class LegacyTest(BaseTest): db = self.init_old() cache = ndb.new_api tmap = cache.get_id_map('tags') - t = next(iterkeys(tmap)) + t = next(iter(tmap)) pmap = cache.get_id_map('publisher') - p = next(iterkeys(pmap)) + p = next(iter(pmap)) run_funcs(self, db, ndb, ( ('delete_tag_using_id', t), ('delete_publisher_using_id', p), diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index 3b90b4d93d..5c0a138d61 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -13,7 +13,7 @@ from time import time from calibre.utils.date import utc_tz from calibre.db.tests.base import BaseTest -from polyglot.builtins import iteritems, iterkeys, itervalues, range +from polyglot.builtins import iteritems, itervalues, range class ReadingTest(BaseTest): @@ -439,7 +439,7 @@ class ReadingTest(BaseTest): 'Test getting the author sort for authors from the db' cache = self.init_cache() table = cache.fields['authors'].table - table.set_sort_names({next(iterkeys(table.id_map)): 'Fake Sort'}, cache.backend) + table.set_sort_names({next(iter(table.id_map)): 'Fake Sort'}, cache.backend) authors = tuple(itervalues(table.id_map)) nval = cache.author_sort_from_authors(authors) diff --git a/src/calibre/db/view.py b/src/calibre/db/view.py index 7fd51e783d..c183b9d65a 100644 --- a/src/calibre/db/view.py +++ b/src/calibre/db/view.py @@ -9,8 +9,8 @@ __docformat__ = 'restructuredtext en' import weakref, operator, numbers from functools import partial -from polyglot.builtins import (iteritems, iterkeys, itervalues, map, - unicode_type, range, zip) +from polyglot.builtins import (iteritems, itervalues, map, + unicode_type, range) from calibre.ebooks.metadata import title_sort from calibre.utils.config_base import tweaks, prefs @@ -374,8 +374,7 @@ class View(object): self.marked_ids = dict.fromkeys(id_dict, u'true') else: # Ensure that all the items in the dict are text - self.marked_ids = dict(zip(iterkeys(id_dict), map(unicode_type, - itervalues(id_dict)))) + self.marked_ids = {k: unicode_type(v) for k, v in iteritems(id_dict)} # This invalidates all searches in the cache even though the cache may # be shared by multiple views. This is not ideal, but... cmids = set(self.marked_ids) diff --git a/src/calibre/devices/mtp/windows/driver.py b/src/calibre/devices/mtp/windows/driver.py index f99a0309c6..7cfe575aea 100644 --- a/src/calibre/devices/mtp/windows/driver.py +++ b/src/calibre/devices/mtp/windows/driver.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' import time, threading, traceback from functools import wraps, partial -from polyglot.builtins import iteritems, iterkeys, itervalues, unicode_type, zip +from polyglot.builtins import iteritems, itervalues, unicode_type, zip from itertools import chain from calibre import as_unicode, prints, force_unicode @@ -107,7 +107,7 @@ class MTP_DEVICE(MTPDeviceBase): # Get device data for detected devices. If there is an error, we will # try again for that device the next time this method is called. - for dev in tuple(iterkeys(self.detected_devices)): + for dev in tuple(self.detected_devices): data = self.detected_devices.get(dev, None) if data is None or data is False: try: diff --git a/src/calibre/devices/scanner.py b/src/calibre/devices/scanner.py index 1eb5a24b95..3b8a141300 100644 --- a/src/calibre/devices/scanner.py +++ b/src/calibre/devices/scanner.py @@ -13,7 +13,7 @@ from threading import Lock from calibre import prints, as_unicode from calibre.constants import (iswindows, isosx, plugins, islinux, isfreebsd, isnetbsd) -from polyglot.builtins import iterkeys, range +from polyglot.builtins import range osx_scanner = linux_scanner = freebsd_scanner = netbsd_scanner = None @@ -77,7 +77,7 @@ class LibUSBScanner(object): dev = USBDevice(*dev) dev.busnum, dev.devnum = fingerprint[:2] ans.add(dev) - extra = set(iterkeys(self.libusb.cache)) - seen + extra = set(self.libusb.cache) - seen for x in extra: self.libusb.cache.pop(x, None) return ans diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index 8dfe3f468e..560e25985a 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -1321,7 +1321,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): self._debug('processed cache. count=', len(books_on_device)) count_of_cache_items_deleted = 0 if self.client_cache_uses_lpaths: - for lpath in tuple(self.known_metadata.iterkeys()): + for lpath in tuple(self.known_metadata): if lpath not in lpaths_on_device: try: uuid = self.known_metadata[lpath].get('uuid', None) diff --git a/src/calibre/ebooks/docx/cleanup.py b/src/calibre/ebooks/docx/cleanup.py index 6d71805fc0..6a283a4b5c 100644 --- a/src/calibre/ebooks/docx/cleanup.py +++ b/src/calibre/ebooks/docx/cleanup.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import os -from polyglot.builtins import iterkeys, itervalues, range +from polyglot.builtins import itervalues, range NBSP = '\xa0' @@ -54,7 +54,7 @@ def merge_run(run): def liftable(css): # A is liftable if all its styling would work just as well if it is # specified on the parent element. - prefixes = {x.partition('-')[0] for x in iterkeys(css)} + prefixes = {x.partition('-')[0] for x in css} return not (prefixes - {'text', 'font', 'letter', 'color', 'background'}) diff --git a/src/calibre/ebooks/docx/writer/styles.py b/src/calibre/ebooks/docx/writer/styles.py index f1c918ad6b..272553f33d 100644 --- a/src/calibre/ebooks/docx/writer/styles.py +++ b/src/calibre/ebooks/docx/writer/styles.py @@ -15,7 +15,7 @@ from lxml import etree from calibre.ebooks import parse_css_length from calibre.ebooks.docx.writer.utils import convert_color, int_or_zero from calibre.utils.localization import lang_as_iso639_1 -from polyglot.builtins import iteritems, iterkeys, unicode_type +from polyglot.builtins import iteritems, unicode_type from tinycss.css21 import CSS21Parser css_parser = CSS21Parser() @@ -721,7 +721,7 @@ class StylesManager(object): heading_styles.append(style) style.id = style.name = val style.seq = i - self.combined_styles = sorted(iterkeys(counts), key=attrgetter('seq')) + self.combined_styles = sorted(counts, key=attrgetter('seq')) [ls.apply() for ls in self.combined_styles] descendant_style_map = {} diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 4bb37b6c9b..97e84827c6 100644 --- a/src/calibre/ebooks/metadata/book/base.py +++ b/src/calibre/ebooks/metadata/book/base.py @@ -14,7 +14,7 @@ from calibre.ebooks.metadata.book import (SC_COPYABLE_FIELDS, TOP_LEVEL_IDENTIFIERS, ALL_METADATA_FIELDS) from calibre.library.field_metadata import FieldMetadata from calibre.utils.icu import sort_key -from polyglot.builtins import iteritems, iterkeys, unicode_type +from polyglot.builtins import iteritems, unicode_type # Special sets used to optimize the performance of getting and setting # attributes on Metadata objects @@ -137,7 +137,7 @@ class Metadata(object): return object.__getattribute__(self, field) except AttributeError: pass - if field in iterkeys(_data['user_metadata']): + if field in _data['user_metadata']: d = _data['user_metadata'][field] val = d['#value#'] if d['datatype'] != 'composite': @@ -180,7 +180,7 @@ class Metadata(object): if val and val.lower() != 'und': langs = [val] _data['languages'] = langs - elif field in iterkeys(_data['user_metadata']): + elif field in _data['user_metadata']: _data['user_metadata'][field]['#value#'] = val _data['user_metadata'][field]['#extra#'] = extra else: @@ -190,7 +190,7 @@ class Metadata(object): self.__dict__[field] = val def __iter__(self): - return iterkeys(object.__getattribute__(self, '_data')) + return iter(object.__getattribute__(self, '_data')) def has_key(self, key): return key in object.__getattribute__(self, '_data') @@ -219,7 +219,7 @@ class Metadata(object): def get_extra(self, field, default=None): _data = object.__getattribute__(self, '_data') - if field in iterkeys(_data['user_metadata']): + if field in _data['user_metadata']: try: return _data['user_metadata'][field]['#extra#'] except: @@ -287,14 +287,14 @@ class Metadata(object): ''' return a list of the custom fields in this book ''' - return iterkeys(object.__getattribute__(self, '_data')['user_metadata']) + return iter(object.__getattribute__(self, '_data')['user_metadata']) def all_field_keys(self): ''' All field keys known by this instance, even if their value is None ''' _data = object.__getattribute__(self, '_data') - return frozenset(ALL_METADATA_FIELDS.union(iterkeys(_data['user_metadata']))) + return frozenset(ALL_METADATA_FIELDS.union(frozenset(_data['user_metadata']))) def metadata_for_field(self, key): ''' @@ -320,7 +320,7 @@ class Metadata(object): v = self.get(attr, None) if v is not None: result[attr] = v - for attr in iterkeys(_data['user_metadata']): + for attr in _data['user_metadata']: v = self.get(attr, None) if v is not None: result[attr] = v diff --git a/src/calibre/ebooks/metadata/sources/google_images.py b/src/calibre/ebooks/metadata/sources/google_images.py index a40eca4589..39cd9d2197 100644 --- a/src/calibre/ebooks/metadata/sources/google_images.py +++ b/src/calibre/ebooks/metadata/sources/google_images.py @@ -91,7 +91,7 @@ class GoogleImages(Source): continue if 'ou' in data: ans[data['ou']] = True - return list(ans.iterkeys()) + return list(ans) def test(): diff --git a/src/calibre/ebooks/metadata/sources/identify.py b/src/calibre/ebooks/metadata/sources/identify.py index c807d0e87a..ca3f5b606e 100644 --- a/src/calibre/ebooks/metadata/sources/identify.py +++ b/src/calibre/ebooks/metadata/sources/identify.py @@ -27,7 +27,7 @@ from calibre.utils.html2text import html2text from calibre.utils.icu import lower from calibre.utils.date import UNDEFINED_DATE from calibre.utils.formatter import EvalFormatter -from polyglot.builtins import iteritems, iterkeys, itervalues, unicode_type +from polyglot.builtins import iteritems, itervalues, unicode_type # Download worker {{{ @@ -439,7 +439,7 @@ def identify(log, abort, # {{{ pass sort_kwargs = dict(kwargs) - for k in list(iterkeys(sort_kwargs)): + for k in list(sort_kwargs): if k not in ('title', 'authors', 'identifiers'): sort_kwargs.pop(k) diff --git a/src/calibre/ebooks/mobi/debug/index.py b/src/calibre/ebooks/mobi/debug/index.py index e9446f266f..0f84e99575 100644 --- a/src/calibre/ebooks/mobi/debug/index.py +++ b/src/calibre/ebooks/mobi/debug/index.py @@ -15,7 +15,7 @@ from calibre.ebooks.mobi.reader.headers import NULL_INDEX from calibre.ebooks.mobi.reader.index import (CNCX, parse_indx_header, parse_tagx_section, parse_index_record, INDEX_HEADER_FIELDS) from calibre.ebooks.mobi.reader.ncx import (tag_fieldname_map, default_entry) -from polyglot.builtins import iteritems, iterkeys, range +from polyglot.builtins import iteritems, range File = namedtuple('File', 'file_number name divtbl_count start_position length') @@ -140,11 +140,11 @@ class SKELIndex(Index): self.records = [] if self.table is not None: - for i, text in enumerate(iterkeys(self.table)): + for i, text in enumerate(self.table): tag_map = self.table[text] - if set(iterkeys(tag_map)) != {1, 6}: + if set(tag_map) != {1, 6}: raise ValueError('SKEL Index has unknown tags: %s'% - (set(iterkeys(tag_map))-{1,6})) + (set(tag_map)-{1,6})) self.records.append(File( i, # file_number text, # name @@ -161,11 +161,11 @@ class SECTIndex(Index): self.records = [] if self.table is not None: - for i, text in enumerate(iterkeys(self.table)): + for i, text in enumerate(self.table): tag_map = self.table[text] - if set(iterkeys(tag_map)) != {2, 3, 4, 6}: + if set(tag_map) != {2, 3, 4, 6}: raise ValueError('Chunk Index has unknown tags: %s'% - (set(iterkeys(tag_map))-{2, 3, 4, 6})) + (set(tag_map)-{2, 3, 4, 6})) toc_text = self.cncx[tag_map[2][0]] self.records.append(Elem( @@ -186,9 +186,9 @@ class GuideIndex(Index): self.records = [] if self.table is not None: - for i, text in enumerate(iterkeys(self.table)): + for i, text in enumerate(self.table): tag_map = self.table[text] - if set(iterkeys(tag_map)) not in ({1, 6}, {1, 2, 3}): + if set(tag_map) not in ({1, 6}, {1, 2, 3}): raise ValueError('Guide Index has unknown tags: %s'% tag_map) @@ -217,7 +217,7 @@ class NCXIndex(Index): entry['name'] = text entry['num'] = num - for tag in iterkeys(tag_fieldname_map): + for tag in tag_fieldname_map: fieldname, i = tag_fieldname_map[tag] if tag in tag_map: fieldvalue = tag_map[tag][i] diff --git a/src/calibre/ebooks/mobi/reader/mobi8.py b/src/calibre/ebooks/mobi/reader/mobi8.py index a1a0cfecc1..07d72f1d36 100644 --- a/src/calibre/ebooks/mobi/reader/mobi8.py +++ b/src/calibre/ebooks/mobi/reader/mobi8.py @@ -24,7 +24,7 @@ from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.mobi.utils import read_font_record from calibre.ebooks.oeb.parse_utils import parse_html from calibre.ebooks.oeb.base import XPath, XHTML, xml2text -from polyglot.builtins import iterkeys, range, zip +from polyglot.builtins import range, zip from polyglot.urllib import urldefrag Part = namedtuple('Part', @@ -134,7 +134,7 @@ class Mobi8Reader(object): File = namedtuple('File', 'file_number name divtbl_count start_position length') - for i, text in enumerate(iterkeys(table)): + for i, text in enumerate(table): tag_map = table[text] self.files.append(File(i, text, tag_map[1][0], tag_map[6][0], tag_map[6][1])) @@ -143,7 +143,7 @@ class Mobi8Reader(object): if self.header.dividx != NULL_INDEX: table, cncx = read_index(self.kf8_sections, self.header.dividx, self.header.codec) - for i, text in enumerate(iterkeys(table)): + for i, text in enumerate(table): tag_map = table[text] toc_text = cncx[tag_map[2][0]] self.elems.append(Elem(int(text), toc_text, tag_map[3][0], @@ -156,7 +156,7 @@ class Mobi8Reader(object): Item = namedtuple('Item', 'type title pos_fid') - for i, ref_type in enumerate(iterkeys(table)): + for i, ref_type in enumerate(table): tag_map = table[ref_type] # ref_type, ref_title, div/frag number title = cncx[tag_map[1][0]] diff --git a/src/calibre/ebooks/mobi/reader/ncx.py b/src/calibre/ebooks/mobi/reader/ncx.py index cc87ea1b07..c98b6aa891 100644 --- a/src/calibre/ebooks/mobi/reader/ncx.py +++ b/src/calibre/ebooks/mobi/reader/ncx.py @@ -13,7 +13,7 @@ from calibre import replace_entities from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.mobi.reader.headers import NULL_INDEX from calibre.ebooks.mobi.reader.index import read_index -from polyglot.builtins import iteritems, iterkeys +from polyglot.builtins import iteritems tag_fieldname_map = { 1: ['pos',0], @@ -63,7 +63,7 @@ def read_ncx(sections, index, codec): entry['name'] = text entry['num'] = num - for tag in iterkeys(tag_fieldname_map): + for tag in tag_fieldname_map: fieldname, i = tag_fieldname_map[tag] if tag in tag_map: fieldvalue = tag_map[tag][i] diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py index 6760605650..4ca8eec878 100644 --- a/src/calibre/ebooks/mobi/utils.py +++ b/src/calibre/ebooks/mobi/utils.py @@ -14,7 +14,7 @@ from io import BytesIO from calibre.utils.img import save_cover_data_to, scale_image, image_to_data, image_from_data, resize_image from calibre.utils.imghdr import what from calibre.ebooks import normalize -from polyglot.builtins import iterkeys, unicode_type, range +from polyglot.builtins import unicode_type, range from tinycss.color3 import parse_color_string IMAGE_MAX_SIZE = 10 * 1024 * 1024 @@ -589,7 +589,7 @@ class CNCX(object): # {{{ offset = 0 buf = BytesIO() RECORD_LIMIT = 0x10000 - 1024 # kindlegen appears to use 1024, PDB limit is 0x10000 - for key in iterkeys(self.strings): + for key in self.strings: utf8 = utf8_text(key[:self.MAX_STRING_LENGTH]) l = len(utf8) sz_bytes = encint(l) diff --git a/src/calibre/ebooks/mobi/writer2/indexer.py b/src/calibre/ebooks/mobi/writer2/indexer.py index 68ec0633c7..2d415fcea4 100644 --- a/src/calibre/ebooks/mobi/writer2/indexer.py +++ b/src/calibre/ebooks/mobi/writer2/indexer.py @@ -14,7 +14,7 @@ from collections import OrderedDict, defaultdict from calibre.ebooks.mobi.utils import (encint, encode_number_as_hex, encode_tbs, align_block, RECORD_SIZE, CNCX as CNCX_) -from polyglot.builtins import filter, iteritems, iterkeys, itervalues, map, range +from polyglot.builtins import filter, iteritems, itervalues, map, range class CNCX(CNCX_): # {{{ @@ -317,7 +317,7 @@ class TBS(object): # {{{ if first_node is not None and first_node.depth > 0: parent_section_index = (first_node.index if first_node.depth == 1 else first_node.parent_index) else: - parent_section_index = max(iterkeys(self.section_map)) + parent_section_index = max(iter(self.section_map)) else: # Non terminal record diff --git a/src/calibre/ebooks/oeb/polish/main.py b/src/calibre/ebooks/oeb/polish/main.py index 655b80b24c..11cc0519ca 100644 --- a/src/calibre/ebooks/oeb/polish/main.py +++ b/src/calibre/ebooks/oeb/polish/main.py @@ -23,7 +23,7 @@ from calibre.ebooks.oeb.polish.jacket import ( replace_jacket, add_or_replace_jacket, find_existing_jacket, remove_jacket) from calibre.ebooks.oeb.polish.css import remove_unused_css from calibre.utils.logging import Log -from polyglot.builtins import iteritems, iterkeys +from polyglot.builtins import iteritems ALL_OPTS = { 'embed': False, @@ -264,7 +264,7 @@ def gui_polish(data): file_map = {x:x for x in files} opts = ALL_OPTS.copy() opts.update(data) - O = namedtuple('Options', ' '.join(iterkeys(ALL_OPTS))) + O = namedtuple('Options', ' '.join(ALL_OPTS)) opts = O(**opts) log = Log(level=Log.DEBUG) report = [] @@ -279,7 +279,7 @@ def gui_polish(data): def tweak_polish(container, actions, customization=None): opts = ALL_OPTS.copy() opts.update(actions) - O = namedtuple('Options', ' '.join(iterkeys(ALL_OPTS))) + O = namedtuple('Options', ' '.join(ALL_OPTS)) opts = O(**opts) report = [] changed = polish_one(container, opts, report.append, customization=customization) @@ -335,7 +335,7 @@ def main(args=None): for k, v in iteritems(popts): popts[k] = getattr(opts, k, None) - O = namedtuple('Options', ' '.join(iterkeys(popts))) + O = namedtuple('Options', ' '.join(popts)) popts = O(**popts) report = [] if not tuple(filter(None, (getattr(popts, name) for name in ALL_OPTS))): diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index a4efb4c9ac..cacc4684ca 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -21,7 +21,7 @@ from calibre.ebooks.oeb.base import (XHTML, XHTML_NS, CSS_MIME, OEB_STYLES, from calibre.ebooks.oeb.stylizer import Stylizer from calibre.utils.filenames import ascii_filename, ascii_text from calibre.utils.icu import numeric_sort_key -from polyglot.builtins import iteritems, iterkeys, unicode_type, string_or_bytes +from polyglot.builtins import iteritems, unicode_type, string_or_bytes COLLAPSE = re.compile(r'[ \t\r\n\v]+') STRIPNUM = re.compile(r'[-0-9]+$') @@ -674,7 +674,7 @@ class CSSFlattener(object): self.flatten_node(body, stylizer, names, styles, pseudo_styles, fsize, item.id) items = sorted(((key, val) for (val, key) in iteritems(styles)), key=lambda x:numeric_sort_key(x[0])) # :hover must come after link and :active must come after :hover - psels = sorted(iterkeys(pseudo_styles), key=lambda x : + psels = sorted(pseudo_styles, key=lambda x : {'hover':1, 'active':2}.get(x, 0)) for psel in psels: styles = pseudo_styles[psel] diff --git a/src/calibre/ebooks/pdf/render/common.py b/src/calibre/ebooks/pdf/render/common.py index 8c89f2589c..eb53bb9031 100644 --- a/src/calibre/ebooks/pdf/render/common.py +++ b/src/calibre/ebooks/pdf/render/common.py @@ -14,7 +14,7 @@ from binascii import hexlify from calibre.constants import plugins, ispy3 from calibre.utils.logging import default_log -from polyglot.builtins import iteritems, iterkeys, unicode_type +from polyglot.builtins import iteritems, unicode_type pdf_float = plugins['speedup'][0].pdf_float @@ -146,7 +146,7 @@ class Dictionary(dict): def pdf_serialize(self, stream): stream.write(b'<<' + EOL) - sorted_keys = sorted(iterkeys(self), + sorted_keys = sorted(self, key=lambda x:({'Type':'1', 'Subtype':'2'}.get( x, x)+x)) for k in sorted_keys: diff --git a/src/calibre/ebooks/pdf/render/fonts.py b/src/calibre/ebooks/pdf/render/fonts.py index aca2292c77..1853ba5eb2 100644 --- a/src/calibre/ebooks/pdf/render/fonts.py +++ b/src/calibre/ebooks/pdf/render/fonts.py @@ -11,7 +11,7 @@ import re from itertools import groupby from operator import itemgetter from collections import Counter, OrderedDict -from polyglot.builtins import iteritems, iterkeys, map, zip +from polyglot.builtins import iteritems, map, zip from calibre import as_unicode from calibre.ebooks.pdf.render.common import (Array, String, Stream, @@ -204,7 +204,7 @@ class Font(object): widths = {g:w for g, w in iteritems(widths) if w != most_common} groups = Array() - for k, g in groupby(enumerate(iterkeys(widths)), lambda i_x:i_x[0]-i_x[1]): + for k, g in groupby(enumerate(widths), lambda i_x:i_x[0]-i_x[1]): group = list(map(itemgetter(1), g)) gwidths = [widths[g] for g in group] if len(set(gwidths)) == 1 and len(group) > 1: diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py index 19ccb10311..a8adb593e4 100644 --- a/src/calibre/gui2/actions/choose_library.py +++ b/src/calibre/gui2/actions/choose_library.py @@ -20,7 +20,7 @@ from calibre.utils.icu import sort_key from calibre.gui2 import (gprefs, warning_dialog, Dispatcher, error_dialog, question_dialog, info_dialog, open_local_file, choose_dir) from calibre.gui2.actions import InterfaceAction -from polyglot.builtins import iterkeys, unicode_type, range +from polyglot.builtins import unicode_type, range def db_class(): @@ -40,7 +40,7 @@ class LibraryUsageStats(object): # {{{ # Rename the current library. Renaming of other libraries is # handled by the switch function q = os.path.basename(lp) - for loc in list(iterkeys(self.stats)): + for loc in list(self.stats): bn = posixpath.basename(loc) if bn.lower() == q.lower(): self.rename(loc, lp) diff --git a/src/calibre/gui2/dialogs/opml.py b/src/calibre/gui2/dialogs/opml.py index 2b6bde5f3f..209198c808 100644 --- a/src/calibre/gui2/dialogs/opml.py +++ b/src/calibre/gui2/dialogs/opml.py @@ -17,7 +17,7 @@ from lxml import etree from calibre.gui2 import choose_files, error_dialog from calibre.utils.icu import sort_key -from polyglot.builtins import iterkeys, unicode_type +from polyglot.builtins import unicode_type Group = namedtuple('Group', 'title feeds') @@ -49,7 +49,7 @@ def import_opml(raw, preserve_groups=True): break groups[parent].append((title, url)) - for title in sorted(iterkeys(groups), key=sort_key): + for title in sorted(groups, key=sort_key): yield Group(title, uniq(groups[title], kmap=itemgetter(1))) diff --git a/src/calibre/gui2/icon_theme.py b/src/calibre/gui2/icon_theme.py index d8d6b839bc..e4c48f9562 100644 --- a/src/calibre/gui2/icon_theme.py +++ b/src/calibre/gui2/icon_theme.py @@ -36,7 +36,7 @@ from calibre.utils.zipfile import ZipFile, ZIP_STORED from calibre.utils.filenames import atomic_rename from lzma.xz import compress, decompress from polyglot.queue import Queue, Empty -from polyglot.builtins import iteritems, iterkeys, map, range, reraise +from polyglot.builtins import iteritems, map, range, reraise IMAGE_EXTENSIONS = {'png', 'jpg', 'jpeg'} THEME_COVER = 'icon-theme-cover.jpg' @@ -362,7 +362,7 @@ def create_themeball(report, progress=None, abort=None): except Exception: return sys.exc_info() - errors = tuple(filter(None, pool.map(optimize, tuple(iterkeys(report.name_map))))) + errors = tuple(filter(None, pool.map(optimize, tuple(report.name_map)))) pool.close(), pool.join() if abort is not None and abort.is_set(): return diff --git a/src/calibre/gui2/library/caches.py b/src/calibre/gui2/library/caches.py index dd0b925003..d622507ab7 100644 --- a/src/calibre/gui2/library/caches.py +++ b/src/calibre/gui2/library/caches.py @@ -12,7 +12,7 @@ from collections import OrderedDict from PyQt5.Qt import QImage, QPixmap from calibre.db.utils import ThumbnailCache as TC -from polyglot.builtins import interkeys, itervalues +from polyglot.builtins import itervalues class ThumbnailCache(TC): @@ -68,7 +68,7 @@ class CoverCache(dict): self._pop(key) # pop() so that item is moved to the top self.items[key] = val if len(self.items) > self.limit: - del self.items[next(iterkeys(self.items))] + del self.items[next(iter(self.items))] def clear(self): with self.lock: @@ -85,6 +85,6 @@ class CoverCache(dict): self.limit = limit if len(self.items) > self.limit: extra = len(self.items) - self.limit - remove = tuple(iterkeys(self))[:extra] + remove = tuple(self)[:extra] for k in remove: self._pop(k) diff --git a/src/calibre/gui2/preferences/behavior.py b/src/calibre/gui2/preferences/behavior.py index 5acc1ffd2b..badbbbff24 100644 --- a/src/calibre/gui2/preferences/behavior.py +++ b/src/calibre/gui2/preferences/behavior.py @@ -18,7 +18,7 @@ from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.oeb.iterator import is_supported from calibre.constants import iswindows from calibre.utils.icu import sort_key -from polyglot.builtins import iterkeys, unicode_type +from polyglot.builtins import unicode_type class OutputFormatSetting(Setting): @@ -50,7 +50,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): choices = [(x.upper(), x) for x in output_formats] r('output_format', prefs, choices=choices, setting=OutputFormatSetting) - restrictions = sorted(iterkeys(db.prefs['virtual_libraries']), key=sort_key) + restrictions = sorted(db.prefs['virtual_libraries'], key=sort_key) choices = [('', '')] + [(x, x) for x in restrictions] # check that the virtual library still exists vls = db.prefs['virtual_lib_on_startup'] diff --git a/src/calibre/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py index bec93d7226..d87e1c65c3 100644 --- a/src/calibre/gui2/preferences/tweaks.py +++ b/src/calibre/gui2/preferences/tweaks.py @@ -19,7 +19,7 @@ from calibre import isbytestring from calibre.utils.icu import lower from calibre.utils.search_query_parser import (ParseException, SearchQueryParser) -from polyglot.builtins import iteritems, iterkeys, unicode_type, range +from polyglot.builtins import iteritems, unicode_type, range from PyQt5.Qt import ( QAbstractListModel, Qt, QStyledItemDelegate, QStyle, QStyleOptionViewItem, @@ -188,8 +188,8 @@ class Tweaks(QAbstractListModel, AdaptSQP): # {{{ pos += 1 self.tweaks.sort() - default_keys = set(iterkeys(dl)) - custom_keys = set(iterkeys(l)) + default_keys = set(dl) + custom_keys = set(l) self.plugin_tweaks = {} for key in custom_keys - default_keys: diff --git a/src/calibre/gui2/tweak_book/editor/themes.py b/src/calibre/gui2/tweak_book/editor/themes.py index 758c931d6f..46e1163814 100644 --- a/src/calibre/gui2/tweak_book/editor/themes.py +++ b/src/calibre/gui2/tweak_book/editor/themes.py @@ -18,7 +18,7 @@ from calibre.gui2 import error_dialog from calibre.gui2.tweak_book import tprefs from calibre.gui2.tweak_book.editor import syntax_text_char_format from calibre.gui2.tweak_book.widgets import Dialog -from polyglot.builtins import iteritems, iterkeys, unicode_type, range +from polyglot.builtins import iteritems, unicode_type, range underline_styles = {'single', 'dash', 'dot', 'dash_dot', 'dash_dot_dot', 'wave', 'spell'} @@ -310,11 +310,11 @@ def theme_format(theme, name): def custom_theme_names(): - return tuple(iterkeys(tprefs['custom_themes'])) + return tuple(tprefs['custom_themes']) def builtin_theme_names(): - return tuple(iterkeys(THEMES)) + return tuple(THEMES) def all_theme_names(): @@ -612,8 +612,8 @@ class ThemeEditor(Dialog): def update_theme(self, name): data = tprefs['custom_themes'][name] - extra = set(iterkeys(data)) - set(iterkeys(THEMES[default_theme()])) - missing = set(iterkeys(THEMES[default_theme()])) - set(iterkeys(data)) + extra = set(data) - set(THEMES[default_theme()]) + missing = set(THEMES[default_theme()]) - set(data) for k in extra: data.pop(k) for k in missing: diff --git a/src/calibre/gui2/tweak_book/manage_fonts.py b/src/calibre/gui2/tweak_book/manage_fonts.py index bc1d0c06f3..58b51eb58c 100644 --- a/src/calibre/gui2/tweak_book/manage_fonts.py +++ b/src/calibre/gui2/tweak_book/manage_fonts.py @@ -22,7 +22,7 @@ from calibre.gui2.tweak_book.widgets import Dialog, BusyCursor from calibre.utils.icu import primary_sort_key as sort_key from calibre.utils.fonts.scanner import font_scanner, NoFonts from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont -from polyglot.builtins import iteritems, iterkeys, unicode_type +from polyglot.builtins import iteritems, unicode_type def show_font_face_rule_for_font_file(file_data, added_name, parent=None): @@ -103,7 +103,7 @@ class AllFonts(QAbstractTableModel): def do_sort(self): reverse = not self.sorted_on[1] - self.items = sorted(iterkeys(self.font_data), key=sort_key, reverse=reverse) + self.items = sorted(self.font_data, key=sort_key, reverse=reverse) if self.sorted_on[0] != 'name': self.items.sort(key=self.font_data.get, reverse=reverse) diff --git a/src/calibre/gui2/tweak_book/preferences.py b/src/calibre/gui2/tweak_book/preferences.py index 5ee795480e..470e476285 100644 --- a/src/calibre/gui2/tweak_book/preferences.py +++ b/src/calibre/gui2/tweak_book/preferences.py @@ -10,7 +10,7 @@ import numbers from operator import attrgetter, methodcaller from collections import namedtuple from polyglot.builtins import ( - iteritems, iterkeys, itervalues, map, unicode_type, range) + iteritems, itervalues, map, unicode_type, range) from itertools import product from copy import copy, deepcopy @@ -594,7 +594,7 @@ class TemplatesDialog(Dialog): # {{{ self.l = l = QVBoxLayout(self) self.syntaxes = s = QComboBox(self) - s.addItems(sorted(iterkeys(DEFAULT_TEMPLATES))) + s.addItems(sorted(DEFAULT_TEMPLATES)) s.setCurrentIndex(s.findText('html')) h = QHBoxLayout() l.addLayout(h) diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py index abe2535916..de8397b5ca 100644 --- a/src/calibre/gui2/tweak_book/search.py +++ b/src/calibre/gui2/tweak_book/search.py @@ -34,7 +34,7 @@ from calibre.gui2.tweak_book.widgets import BusyCursor from calibre.gui2.widgets2 import FlowLayout, HistoryComboBox from calibre.utils.icu import primary_contains from calibre.ebooks.conversion.search_replace import REGEX_FLAGS, compile_regular_expression -from polyglot.builtins import iteritems, iterkeys, unicode_type, range +from polyglot.builtins import iteritems, unicode_type, range # The search panel {{{ @@ -1220,7 +1220,7 @@ class SavedSearches(QWidget): return err() searches = [] for item in obj['searches']: - if not isinstance(item, dict) or not set(iterkeys(item)).issuperset(needed_keys): + if not isinstance(item, dict) or not set(item).issuperset(needed_keys): return err searches.append({k:item[k] for k in needed_keys}) diff --git a/src/calibre/gui2/viewer/config.py b/src/calibre/gui2/viewer/config.py index 2eae758e1d..8f310d53e8 100644 --- a/src/calibre/gui2/viewer/config.py +++ b/src/calibre/gui2/viewer/config.py @@ -22,7 +22,7 @@ from calibre.gui2 import min_available_height, error_dialog from calibre.gui2.languages import LanguagesEdit from calibre.gui2.shortcuts import ShortcutConfig from calibre.gui2.viewer.config_ui import Ui_Dialog -from polyglot.builtins import iteritems, iterkeys, unicode_type +from polyglot.builtins import iteritems, unicode_type def config(defaults=None): @@ -213,7 +213,7 @@ class ConfigDialog(QDialog, Ui_Dialog): for x in ('load', 'delete'): m = getattr(self, '%s_theme_button'%x).menu() m.clear() - for x in iterkeys(self.themes): + for x in self.themes: title = x[len('theme_'):] ac = m.addAction(title) ac.theme_id = x diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index c8fdfbf5c9..21413d4e31 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -20,7 +20,7 @@ from calibre.db.search import CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH, _match from calibre.ebooks.metadata import title_sort, author_to_author_sort from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre import prints, force_unicode -from polyglot.builtins import (iteritems, iterkeys, itervalues, map, +from polyglot.builtins import (iteritems, itervalues, map, unicode_type, string_or_bytes, zip) @@ -918,7 +918,7 @@ class ResultCache(SearchQueryParser): # {{{ self.marked_ids_dict = dict.fromkeys(id_dict, u'true') else: # Ensure that all the items in the dict are text - self.marked_ids_dict = dict(zip(iterkeys(id_dict), map(unicode_type, + self.marked_ids_dict = dict(zip(iter(id_dict), map(unicode_type, itervalues(id_dict)))) # Set the values in the cache diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 80f11ea65e..02c76a9f97 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -47,7 +47,7 @@ from calibre.db.lazy import FormatMetadata, FormatsList from calibre.db.categories import Tag, CATEGORY_SORTS from calibre.utils.localization import (canonicalize_lang, calibre_langcode_to_name) -from polyglot.builtins import iteritems, iterkeys, unicode_type, string_or_bytes +from polyglot.builtins import iteritems, unicode_type, string_or_bytes copyfile = os.link if hasattr(os, 'link') else shutil.copyfile SPOOL_SIZE = 30*1024*1024 @@ -1798,7 +1798,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # First, build the maps. We need a category->items map and an # item -> (item_id, sort_val) map to use in the books loop - for category in iterkeys(tb_cats): + for category in tb_cats: cat = tb_cats[category] if not cat['is_category'] or cat['kind'] in ['user', 'search'] \ or category in ['news', 'formats'] or cat.get('is_csp', @@ -1854,7 +1854,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): md.append((category, cat['rec_index'], cat['is_multiple'].get('cache_to_list', None), False)) - for category in iterkeys(tb_cats): + for category in tb_cats: cat = tb_cats[category] if cat['datatype'] == 'composite' and \ cat['display'].get('make_category', False): @@ -1959,7 +1959,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # and building the Tag instances. categories = {} tag_class = Tag - for category in iterkeys(tb_cats): + for category in tb_cats: if category not in tcategories: continue cat = tb_cats[category] @@ -2373,7 +2373,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): self.set_identifiers(id, identifiers, notify=False, commit=False) user_mi = mi.get_all_user_metadata(make_copy=False) - for key in iterkeys(user_mi): + for key in user_mi: if key in self.field_metadata and \ user_mi[key]['datatype'] == self.field_metadata[key]['datatype'] and \ (user_mi[key]['datatype'] != 'text' or diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index 9abdd6d853..523f322521 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -7,7 +7,7 @@ import traceback from collections import OrderedDict from calibre.utils.config_base import tweaks -from polyglot.builtins import iteritems, iterkeys, itervalues +from polyglot.builtins import iteritems, itervalues category_icon_map = { 'authors' : 'user_profile.png', @@ -509,7 +509,7 @@ class FieldMetadata(object): return self.is_custom_field(key) or key.startswith('@') def ignorable_field_keys(self): - return [k for k in iterkeys(self._tb_cats) if self.is_ignorable_field(k)] + return [k for k in self._tb_cats if self.is_ignorable_field(k)] def is_series_index(self, key): try: diff --git a/src/calibre/library/restore.py b/src/calibre/library/restore.py index 4a2f428f60..153d005dd1 100644 --- a/src/calibre/library/restore.py +++ b/src/calibre/library/restore.py @@ -16,8 +16,7 @@ from calibre.library.prefs import DBPrefs from calibre.constants import filesystem_encoding from calibre.utils.date import utcfromtimestamp from calibre import isbytestring -from polyglot.builtins import iteritems, iterkeys -i +from polyglot.builtins import iteritems NON_EBOOK_EXTENSIONS = frozenset([ 'jpg', 'jpeg', 'gif', 'png', 'bmp', @@ -249,7 +248,7 @@ class Restore(Thread): self.failed_restores.append((book, traceback.format_exc())) self.progress_callback(book['mi'].title, i+1) - for author in iterkeys(self.authors_links): + for author in self.authors_links: link, ign = self.authors_links[author] db.conn.execute('UPDATE authors SET link=? WHERE name=?', (link, author.replace(',', '|'))) diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index 8b4b6e6c83..47045156ef 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' import os from calibre.utils.date import isoformat, DEFAULT_DATE -from polyglot.builtins import iterkeys, itervalues, unicode_type +from polyglot.builtins import itervalues, unicode_type class SchemaUpgrade(object): @@ -590,7 +590,7 @@ class SchemaUpgrade(object): custom_recipe_filename bdir = os.path.dirname(custom_recipes.file_path) for id_, title, script in recipes: - existing = frozenset(map(int, iterkeys(custom_recipes))) + existing = frozenset(map(int, custom_recipes)) if id_ in existing: id_ = max(existing) + 1000 id_ = str(id_) diff --git a/src/calibre/srv/ajax.py b/src/calibre/srv/ajax.py index dd577408f5..f9d3b31b32 100644 --- a/src/calibre/srv/ajax.py +++ b/src/calibre/srv/ajax.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' from functools import partial -from polyglot.builtins import iteritems, iterkeys, itervalues, unicode_type, zip, string_or_bytes +from polyglot.builtins import iteritems, itervalues, unicode_type, zip, string_or_bytes from itertools import cycle from calibre import force_unicode @@ -83,7 +83,7 @@ def book_to_json(ctx, rd, db, book_id, if mtime is not None: v['mtime'] = isoformat(mtime, as_utc=True) data['format_metadata'] = mi.format_metadata - fmts = set(x.lower() for x in iterkeys(mi.format_metadata)) + fmts = set(x.lower() for x in mi.format_metadata) pf = prefs['output_format'].lower() other_fmts = list(fmts) try: diff --git a/src/calibre/srv/auto_reload.py b/src/calibre/srv/auto_reload.py index 7051a540d8..4c0d3dbdf7 100644 --- a/src/calibre/srv/auto_reload.py +++ b/src/calibre/srv/auto_reload.py @@ -17,7 +17,7 @@ from calibre.srv.standalone import create_option_parser from calibre.srv.utils import create_sock_pair from calibre.srv.web_socket import DummyHandler from calibre.utils.monotonic import monotonic -from polyglot.builtins import iterkeys, itervalues +from polyglot.builtins import itervalues from polyglot.queue import Queue, Empty MAX_RETRIES = 10 @@ -76,7 +76,7 @@ if islinux: def loop(self): while True: - r = select.select([self.srv_sock] + list(iterkeys(self.fd_map)), [], [])[0] + r = select.select([self.srv_sock] + list(self.fd_map), [], [])[0] modified = set() for fd in r: if fd is self.srv_sock: diff --git a/src/calibre/srv/handler.py b/src/calibre/srv/handler.py index d4ec69c111..abf609f404 100644 --- a/src/calibre/srv/handler.py +++ b/src/calibre/srv/handler.py @@ -15,7 +15,7 @@ from calibre.srv.routes import Router from calibre.srv.users import UserManager from calibre.utils.date import utcnow from calibre.utils.search_query_parser import ParseException -from polyglot.builtins import iterkeys, itervalues +from polyglot.builtins import itervalues class Context(object): @@ -67,7 +67,7 @@ class Context(object): allowed_libraries = self.library_broker.allowed_libraries(lf) if not allowed_libraries: raise HTTPForbidden('The user {} is not allowed to access any libraries on this server'.format(request_data.username)) - library_id = library_id or next(iterkeys(allowed_libraries)) + library_id = library_id or next(iter(allowed_libraries)) if library_id in allowed_libraries: return self.library_broker.get(library_id) raise HTTPForbidden('The user {} is not allowed to access the library {}'.format(request_data.username, library_id)) @@ -79,7 +79,7 @@ class Context(object): allowed_libraries = self.library_broker.allowed_libraries(lf) if not allowed_libraries: raise HTTPForbidden('The user {} is not allowed to access any libraries on this server'.format(request_data.username)) - return dict(allowed_libraries), next(iterkeys(allowed_libraries)) + return dict(allowed_libraries), next(iter(allowed_libraries)) def restriction_for(self, request_data, db): return self.user_manager.library_restriction(request_data.username, path_for_db(db)) diff --git a/src/calibre/srv/library_broker.py b/src/calibre/srv/library_broker.py index 6d02eb062e..1e5681d7a6 100644 --- a/src/calibre/srv/library_broker.py +++ b/src/calibre/srv/library_broker.py @@ -13,7 +13,7 @@ from calibre.db.cache import Cache from calibre.db.legacy import LibraryDatabase, create_backend, set_global_state from calibre.utils.filenames import samefile as _samefile from calibre.utils.monotonic import monotonic -from polyglot.builtins import iteritems, iterkeys, itervalues +from polyglot.builtins import iteritems, itervalues def canonicalize_path(p): @@ -121,7 +121,7 @@ class LibraryBroker(object): @property def default_library(self): - return next(iterkeys(self.lmap)) + return next(iter(self.lmap)) @property def library_map(self): diff --git a/src/calibre/srv/render_book.py b/src/calibre/srv/render_book.py index 8f9a5cd7f6..c689a1c0de 100644 --- a/src/calibre/srv/render_book.py +++ b/src/calibre/srv/render_book.py @@ -27,7 +27,7 @@ from calibre.ebooks.oeb.polish.toc import get_toc, get_landmarks from calibre.ebooks.oeb.polish.utils import guess_type from calibre.utils.short_uuid import uuid4 from calibre.utils.logging import default_log -from polyglot.builtins import iteritems, iterkeys, map, unicode_type +from polyglot.builtins import iteritems, map, unicode_type from polyglot.urllib import quote, urlparse RENDER_VERSION = 1 @@ -416,7 +416,7 @@ def map_epub_type(epub_type, attribs, elem): roles = OrderedDict([(k, True) for k in role.split()]) if role else OrderedDict() if val not in roles: roles[val] = True - role = ' '.join(iterkeys(roles)) + role = ' '.join(roles) if in_attribs is None: attribs.append(['role', role]) else: diff --git a/src/calibre/srv/tests/ajax.py b/src/calibre/srv/tests/ajax.py index af47b60d95..7707bd6d2b 100644 --- a/src/calibre/srv/tests/ajax.py +++ b/src/calibre/srv/tests/ajax.py @@ -13,7 +13,6 @@ from httplib import OK, NOT_FOUND, FORBIDDEN from calibre.ebooks.metadata.meta import get_metadata from calibre.srv.tests.base import LibraryBaseTest -from polyglot.builtins import iterkeys from polyglot.urllib import urlencode, quote @@ -46,12 +45,12 @@ class ContentTest(LibraryBaseTest): self.ae(request('/%s?id_is_uuid=true' % db.field_for('uuid', 1))[1], onedata) r, data = request('s') - self.ae(set(iterkeys(data)), set(map(str, db.all_book_ids()))) + self.ae(set(data), set(map(str, db.all_book_ids()))) r, zdata = request('s', headers={'Accept-Encoding':'gzip'}) self.ae(r.getheader('Content-Encoding'), 'gzip') self.ae(json.loads(zlib.decompress(zdata, 16+zlib.MAX_WBITS)), data) r, data = request('s?ids=1,2') - self.ae(set(iterkeys(data)), {'1', '2'}) + self.ae(set(data), {'1', '2'}) # }}} diff --git a/src/calibre/utils/date.py b/src/calibre/utils/date.py index d125122707..0035c88dfb 100644 --- a/src/calibre/utils/date.py +++ b/src/calibre/utils/date.py @@ -14,7 +14,7 @@ from calibre import strftime from calibre.constants import iswindows, isosx, plugins, preferred_encoding from calibre.utils.iso8601 import utc_tz, local_tz, UNDEFINED_DATE from calibre.utils.localization import lcdata -from polyglot.builtins import iterkeys, unicode_type +from polyglot.builtins import unicode_type _utc_tz = utc_tz _local_tz = local_tz @@ -478,7 +478,7 @@ def replace_months(datestr, clang): else: return datestr - for k in iterkeys(dictoen): + for k in dictoen: tmp = re.sub(k, dictoen[k], datestr) if tmp != datestr: break diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index 6c5ac38db8..7fc69c0123 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -14,7 +14,7 @@ from calibre.constants import ( filesystem_encoding, iswindows, plugins, preferred_encoding, isosx ) from calibre.utils.localization import get_udc -from polyglot.builtins import iteritems, iterkeys, itervalues, unicode_type, range +from polyglot.builtins import iteritems, itervalues, unicode_type, range def ascii_text(orig): @@ -467,7 +467,7 @@ class WindowsAtomicFolderMove(object): def delete_originals(self): import win32file - for path in iterkeys(self.handle_map): + for path in self.handle_map: win32file.DeleteFile(path) self.close_handles() diff --git a/src/calibre/utils/fonts/sfnt/cmap.py b/src/calibre/utils/fonts/sfnt/cmap.py index aff1f88267..cc6c8b6cd7 100644 --- a/src/calibre/utils/fonts/sfnt/cmap.py +++ b/src/calibre/utils/fonts/sfnt/cmap.py @@ -16,7 +16,7 @@ from collections import OrderedDict from calibre.utils.fonts.utils import read_bmp_prefix from calibre.utils.fonts.sfnt import UnknownTable, max_power_of_two from calibre.utils.fonts.sfnt.errors import UnsupportedFont -from polyglot.builtins import iterkeys, range +from polyglot.builtins import range def split_range(start_code, end_code, cmap): # {{{ @@ -229,7 +229,7 @@ class CmapTable(UnknownTable): def set_character_map(self, cmap): self.version, self.num_tables = 0, 1 fmt = b'>7H' - codes = sorted(iterkeys(cmap)) + codes = sorted(cmap) if not codes: start_code = [0xffff] diff --git a/src/calibre/utils/fonts/sfnt/container.py b/src/calibre/utils/fonts/sfnt/container.py index d833ba023c..17d7c54d38 100644 --- a/src/calibre/utils/fonts/sfnt/container.py +++ b/src/calibre/utils/fonts/sfnt/container.py @@ -25,7 +25,6 @@ from calibre.utils.fonts.sfnt.cmap import CmapTable from calibre.utils.fonts.sfnt.kern import KernTable from calibre.utils.fonts.sfnt.gsub import GSUBTable from calibre.utils.fonts.sfnt.cff.table import CFFTable -from polyglot.builtins import iterkeys # OpenType spec: http://www.microsoft.com/typography/otspec/otff.htm @@ -84,13 +83,13 @@ class Sfnt(object): def __iter__(self): '''Iterate over the table tags in order.''' - for x in sorted(iterkeys(self.tables)): + for x in sorted(self.tables): yield x # Although the optimal order is not alphabetical, the OTF spec says # they should be alphabetical, so we stick with that. See # http://partners.adobe.com/public/developer/opentype/index_recs.html # for optimal order. - # keys = list(self.tables.iterkeys()) + # keys = list(self.tables) # order = {x:i for i, x in enumerate((b'head', b'hhea', b'maxp', b'OS/2', # b'hmtx', b'LTSH', b'VDMX', b'hdmx', b'cmap', b'fpgm', b'prep', # b'cvt ', b'loca', b'glyf', b'CFF ', b'kern', b'name', b'post', diff --git a/src/calibre/utils/fonts/sfnt/subset.py b/src/calibre/utils/fonts/sfnt/subset.py index 51d3d485ce..388c3dd9a5 100644 --- a/src/calibre/utils/fonts/sfnt/subset.py +++ b/src/calibre/utils/fonts/sfnt/subset.py @@ -217,7 +217,7 @@ def print_stats(old_stats, new_stats): prints('='*80) old_total = sum(old_stats.itervalues()) new_total = sum(new_stats.itervalues()) - tables = sorted(old_stats.iterkeys(), key=lambda x:old_stats[x], + tables = sorted(old_stats, key=lambda x:old_stats[x], reverse=True) for table in tables: osz = old_stats[table] diff --git a/src/calibre/web/feeds/recipes/collection.py b/src/calibre/web/feeds/recipes/collection.py index d27b21af49..94b900c4ed 100644 --- a/src/calibre/web/feeds/recipes/collection.py +++ b/src/calibre/web/feeds/recipes/collection.py @@ -18,7 +18,7 @@ from calibre.constants import numeric_version from calibre.utils.iso8601 import parse_iso8601 from calibre.utils.date import now as nowf, utcnow, local_tz, isoformat, EPOCH, UNDEFINED_DATE from calibre.utils.recycle_bin import delete_file -from polyglot.builtins import iteritems, iterkeys, unicode_type +from polyglot.builtins import iteritems, unicode_type NS = 'http://calibre-ebook.com/recipe_collection' E = ElementMaker(namespace=NS, nsmap={None:NS}) @@ -164,7 +164,7 @@ def add_custom_recipes(script_map): from calibre.web.feeds.recipes import custom_recipes, \ custom_recipe_filename id_ = 1000 - keys = tuple(map(int, iterkeys(custom_recipes))) + keys = tuple(map(int, custom_recipes)) if keys: id_ = max(keys)+1 bdir = os.path.dirname(custom_recipes.file_path) diff --git a/src/polyglot/builtins.py b/src/polyglot/builtins.py index 96c226b182..24c781e401 100644 --- a/src/polyglot/builtins.py +++ b/src/polyglot/builtins.py @@ -8,6 +8,11 @@ import sys is_py3 = sys.version_info.major >= 3 + +def iterkeys(d): + return iter(d) + + if is_py3: def reraise(tp, value, tb=None): try: @@ -38,9 +43,6 @@ if is_py3: def itervalues(d): return iter(d.values()) - def iterkeys(d): - return iter(d) - def environ_item(x): if isinstance(x, bytes): x = x.decode('utf-8') @@ -65,9 +67,6 @@ else: def iteritems(d): return d.iteritems() - def iterkeys(d): - return d.iterkeys() - def itervalues(d): return d.itervalues() diff --git a/src/tinycss/__init__.py b/src/tinycss/__init__.py index 10827136ea..73451baf94 100644 --- a/src/tinycss/__init__.py +++ b/src/tinycss/__init__.py @@ -17,8 +17,6 @@ from tinycss.page3 import CSSPage3Parser from tinycss.fonts3 import CSSFonts3Parser from tinycss.media3 import CSSMedia3Parser -from polyglot.builtins import iterkeys - PARSER_MODULES = { 'page3': CSSPage3Parser, @@ -50,5 +48,5 @@ def make_parser(*features, **kwargs): def make_full_parser(**kwargs): ''' A parser that parses all supported CSS 3 modules in addition to CSS 2.1 ''' - features = tuple(iterkeys(PARSER_MODULES)) + features = tuple(PARSER_MODULES) return make_parser(*features, **kwargs)