diff --git a/setup/commands.py b/setup/commands.py index a993a42ac9..ff86033b13 100644 --- a/setup/commands.py +++ b/setup/commands.py @@ -13,7 +13,7 @@ __all__ = [ 'git_version', 'develop', 'install', 'kakasi', 'coffee', 'rapydscript', 'cacerts', 'recent_uas', 'resources', - 'check', 'to3', 'unicode_check', 'test', + 'check', 'to3', 'unicode_check', 'iterators_check', 'test', 'sdist', 'bootstrap', 'manual', 'tag_release', 'upload_to_server', @@ -55,9 +55,10 @@ gui = GUI() from setup.check import Check check = Check() -from setup.port import To3, UnicodeCheck +from setup.port import To3, UnicodeCheck, IteratorsCheck to3 = To3() unicode_check = UnicodeCheck() +iterators_check = IteratorsCheck() from setup.test import Test test = Test() diff --git a/setup/port.py b/setup/port.py index 11f6343124..ef81146ac7 100644 --- a/setup/port.py +++ b/setup/port.py @@ -131,6 +131,12 @@ class To3(Base): return re.search(r'^RefactoringTool: No changes to ' + f, output, flags=re.M) is None +def edit_file(f): + subprocess.Popen([ + 'vim', '-S', os.path.join(Command.SRC, '../session.vim'), '-f', f + ]).wait() + + class UnicodeCheck(Base): description = 'Check for unicode porting status' @@ -169,9 +175,63 @@ class UnicodeCheck(Base): return self.get_error_statement(f) is not None def report_file_error(self, f, num_left): - subprocess.Popen([ - 'vim', '-S', os.path.join(self.SRC, '../session.vim'), '-f', f - ]).wait() + edit_file(f) + self.info('%d files left to check' % num_left) if self.file_has_errors(f): raise SystemExit(self.get_error_statement(f)) + + +def has_import(text, module, name): + pat = re.compile(r'^from\s+{}\s+import\s+.*\b{}\b'.format(module, name), re.MULTILINE) + if pat.search(text) is not None: + return True + pat = re.compile(r'^from\s+{}\s+import\s+\([^)]*\b{}\b'.format(module, name), re.MULTILINE | re.DOTALL) + if pat.search(text) is not None: + return True + return False + + +class IteratorsCheck(Base): + + description = 'Check for builtins changed to return iterators porting status' + CACHE = 'check_iterators.json' + + def get_errors_in_file(self, f): + pat = re.compile(r'\b(range|map|filter|zip)\(') + text = open(f, 'rb').read().decode('utf-8') + matches = tuple(pat.finditer(text)) + if not matches: + return [] + ans = [] + names = {m.group(1) for m in matches} + imported_names = {n for n in names if has_import(text, 'polyglot.builtins', n)} + safe_funcs = 'list|tuple|set|frozenset|join' + func_pat = r'({})\('.format(safe_funcs) + for_pat = re.compile(r'\bfor\s+.+?\s+\bin\b') + for i, line in enumerate(text.splitlines()): + m = pat.search(line) + if m is not None: + itname = m.group(1) + if itname in imported_names: + continue + start = m.start() + if start > 0: + if line[start-1] == '*': + continue + if line[start-1] == '(': + if re.search(func_pat + itname, line) is not None: + continue + fm = for_pat.search(line) + if fm is not None and fm.start() < start: + continue + ans.append('%s:%s' % (i, itname)) + return ans + + def file_has_errors(self, f): + return bool(self.get_errors_in_file(f)) + + def report_file_error(self, f, num_left): + edit_file(f) self.info('%d files left to check' % num_left) + if self.file_has_errors(f): + raise SystemExit('\n'.join(self.get_errors_in_file(f))) diff --git a/src/calibre/db/cli/cmd_list.py b/src/calibre/db/cli/cmd_list.py index a5de2ccc19..2ca97ee016 100644 --- a/src/calibre/db/cli/cmd_list.py +++ b/src/calibre/db/cli/cmd_list.py @@ -13,7 +13,7 @@ from calibre import prints from calibre.db.cli.utils import str_width from calibre.ebooks.metadata import authors_to_string from calibre.utils.date import isoformat -from polyglot.builtins import iteritems, unicode_type +from polyglot.builtins import iteritems, unicode_type, map readonly = True version = 0 # change this if you change signature of implementation() @@ -183,7 +183,7 @@ def do_list( if not screen_width: screen_width = 80 field_width = screen_width // len(fields) - base_widths = map(lambda x: min(x + 1, field_width), widths) + base_widths = list(map(lambda x: min(x + 1, field_width), widths)) while sum(base_widths) < screen_width: adjusted = False diff --git a/src/calibre/db/cli/cmd_list_categories.py b/src/calibre/db/cli/cmd_list_categories.py index 6165c50877..ef193165e4 100644 --- a/src/calibre/db/cli/cmd_list_categories.py +++ b/src/calibre/db/cli/cmd_list_categories.py @@ -10,7 +10,7 @@ from textwrap import TextWrapper from io import BytesIO from calibre import prints -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, map readonly = True version = 0 # change this if you change signature of implementation() @@ -86,7 +86,7 @@ def do_list(fields, data, opts): if not screen_width: screen_width = 80 field_width = screen_width // len(fields) - base_widths = map(lambda x: min(x + 1, field_width), widths) + base_widths = list(map(lambda x: min(x + 1, field_width), widths)) while sum(base_widths) < screen_width: adjusted = False @@ -107,7 +107,7 @@ def do_list(fields, data, opts): with ColoredStream(sys.stdout, fg='green'): prints(''.join(titles)) - wrappers = map(lambda x: TextWrapper(x - 1), widths) + wrappers = list(map(lambda x: TextWrapper(x - 1), widths)) for record in data: text = [ diff --git a/src/calibre/db/cli/utils.py b/src/calibre/db/cli/utils.py index c09014486a..56eb5f15ea 100644 --- a/src/calibre/db/cli/utils.py +++ b/src/calibre/db/cli/utils.py @@ -4,6 +4,8 @@ from __future__ import absolute_import, division, print_function, unicode_literals +from polyglot.builtins import map + import unicodedata eaw = unicodedata.east_asian_width diff --git a/src/calibre/db/tests/legacy.py b/src/calibre/db/tests/legacy.py index 31b5eb519c..4246f94286 100644 --- a/src/calibre/db/tests/legacy.py +++ b/src/calibre/db/tests/legacy.py @@ -13,7 +13,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, range +from polyglot.builtins import iteritems, range, zip from polyglot import reprlib # Utils {{{ diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index 3e6f59d6b6..a9a7e184a7 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -8,6 +8,7 @@ Device drivers. import sys, time, pprint from functools import partial +from polyglot.builtins import zip DAY_MAP = dict(Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6) MONTH_MAP = dict(Jan=1, Feb=2, Mar=3, Apr=4, May=5, Jun=6, Jul=7, Aug=8, Sep=9, Oct=10, Nov=11, Dec=12) diff --git a/src/calibre/devices/jetbook/driver.py b/src/calibre/devices/jetbook/driver.py index e6fedf3589..aefa076788 100644 --- a/src/calibre/devices/jetbook/driver.py +++ b/src/calibre/devices/jetbook/driver.py @@ -14,7 +14,7 @@ import sys from calibre.devices.usbms.driver import USBMS from calibre.ebooks.metadata import string_to_authors -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, map class JETBOOK(USBMS): @@ -79,7 +79,7 @@ class JETBOOK(USBMS): if match is not None: mi.title = check_unicode(match.group('title')) authors = string_to_authors(match.group('authors')) - mi.authors = map(check_unicode, authors) + mi.authors = list(map(check_unicode, authors)) return mi diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py index 9984b1316f..fb6f358137 100644 --- a/src/calibre/devices/prs505/sony_cache.py +++ b/src/calibre/devices/prs505/sony_cache.py @@ -16,6 +16,7 @@ from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.metadata import authors_to_string, title_sort, \ authors_to_sort_string from polyglot.binary import from_base64_bytes +from polyglot.builtins import zip ''' cahceExt.xml diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index 7b8dd203a4..f663898839 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -23,7 +23,7 @@ from calibre.devices.errors import DeviceError from calibre.devices.usbms.deviceconfig import DeviceConfig from calibre.constants import iswindows, islinux, isosx, isfreebsd, plugins from calibre.utils.filenames import ascii_filename as sanitize -from polyglot.builtins import iteritems, string_or_bytes +from polyglot.builtins import iteritems, string_or_bytes, map if isosx: usbobserver, usbobserver_err = plugins['usbobserver'] @@ -355,7 +355,7 @@ class Device(DeviceConfig, DevicePlugin): g = m.groupdict() if g['p'] is None: g['p'] = 0 - return map(int, (g.get('m'), g.get('p'))) + return list(map(int, (g.get('m'), g.get('p')))) def cmp_key(x): ''' diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 5b204904ee..3fcb27ee30 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -20,7 +20,7 @@ from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.device import Device from calibre.devices.usbms.books import BookList, Book from calibre.ebooks.metadata.book.json_codec import JsonCodec -from polyglot.builtins import itervalues, unicode_type, string_or_bytes +from polyglot.builtins import itervalues, unicode_type, string_or_bytes, zip BASE_TIME = None @@ -335,7 +335,7 @@ class USBMS(CLI, Device): self.report_progress(1.0, _('Transferring books to device...')) debug_print('USBMS: finished uploading %d books'%(len(files))) - return zip(paths, cycle([on_card])) + return list(zip(paths, cycle([on_card]))) def upload_cover(self, path, filename, metadata, filepath): ''' diff --git a/src/calibre/ebooks/comic/input.py b/src/calibre/ebooks/comic/input.py index fb6db0d152..25ff18572f 100755 --- a/src/calibre/ebooks/comic/input.py +++ b/src/calibre/ebooks/comic/input.py @@ -15,7 +15,7 @@ from calibre.ptempfile import PersistentTemporaryDirectory from calibre.utils.icu import numeric_sort_key from calibre.utils.ipc.server import Server from calibre.utils.ipc.job import ParallelJob -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, map from polyglot.queue import Empty # If the specified screen has either dimension larger than this value, no image diff --git a/src/calibre/ebooks/conversion/plugins/comic_input.py b/src/calibre/ebooks/conversion/plugins/comic_input.py index 75ed0e03be..13301d96f8 100644 --- a/src/calibre/ebooks/conversion/plugins/comic_input.py +++ b/src/calibre/ebooks/conversion/plugins/comic_input.py @@ -12,7 +12,7 @@ import shutil, textwrap, codecs, os from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation from calibre import CurrentDir from calibre.ptempfile import PersistentTemporaryDirectory -from polyglot.builtins import getcwd +from polyglot.builtins import getcwd, map class ComicInput(InputFormatPlugin): diff --git a/src/calibre/ebooks/conversion/plugins/epub_output.py b/src/calibre/ebooks/conversion/plugins/epub_output.py index ec1a1fc540..7af7f9ed4c 100644 --- a/src/calibre/ebooks/conversion/plugins/epub_output.py +++ b/src/calibre/ebooks/conversion/plugins/epub_output.py @@ -12,7 +12,7 @@ from calibre.customize.conversion import (OutputFormatPlugin, OptionRecommendation) from calibre.ptempfile import TemporaryDirectory from calibre import CurrentDir -from polyglot.builtins import unicode_type, filter +from polyglot.builtins import unicode_type, filter, map, zip block_level_tags = ( 'address', diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 2b532cc0e0..6b1920c0d4 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -18,7 +18,7 @@ from calibre.utils.zipfile import ZipFile from calibre import (extract, walk, isbytestring, filesystem_encoding, get_types_map) from calibre.constants import __version__ -from polyglot.builtins import unicode_type, string_or_bytes +from polyglot.builtins import unicode_type, string_or_bytes, map DEBUG_README=u''' This debug directory contains snapshots of the e-book as it passes through the @@ -1172,7 +1172,7 @@ OptionRecommendation(name='search_replace', fkey = self.opts.dest.fkey else: try: - fkey = map(float, fkey.split(',')) + fkey = list(map(float, fkey.split(','))) except: self.log.error('Invalid font size key: %r ignoring'%fkey) fkey = self.opts.dest.fkey diff --git a/src/calibre/ebooks/docx/to_html.py b/src/calibre/ebooks/docx/to_html.py index 8141e6a4f2..782ed7cd48 100644 --- a/src/calibre/ebooks/docx/to_html.py +++ b/src/calibre/ebooks/docx/to_html.py @@ -29,7 +29,7 @@ from calibre.ebooks.docx.fields import Fields from calibre.ebooks.docx.settings import Settings from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1 -from polyglot.builtins import iteritems, itervalues, filter, getcwd +from polyglot.builtins import iteritems, itervalues, filter, getcwd, map NBSP = '\xa0' @@ -183,7 +183,7 @@ class Convert(object): indent = float(style.text_indent[:-2]) + indent style.text_indent = '%.3gpt' % indent parent.text = tabs[-1].tail or '' - map(parent.remove, tabs) + list(map(parent.remove, tabs)) self.images.rid_map = orig_rid_map diff --git a/src/calibre/ebooks/docx/writer/container.py b/src/calibre/ebooks/docx/writer/container.py index 9dd894db8b..0b11ae5521 100644 --- a/src/calibre/ebooks/docx/writer/container.py +++ b/src/calibre/ebooks/docx/writer/container.py @@ -19,7 +19,7 @@ from calibre.utils.date import utcnow from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1 from calibre.utils.zipfile import ZipFile from calibre.ebooks.pdf.render.common import PAPER_SIZES -from polyglot.builtins import iteritems +from polyglot.builtins import iteritems, map def xml2str(root, pretty_print=False, with_tail=False): diff --git a/src/calibre/ebooks/lrf/input.py b/src/calibre/ebooks/lrf/input.py index 81b2a72ef3..77d43335da 100644 --- a/src/calibre/ebooks/lrf/input.py +++ b/src/calibre/ebooks/lrf/input.py @@ -12,7 +12,7 @@ from copy import deepcopy, copy from lxml import etree from calibre import guess_type -from polyglot.builtins import as_bytes +from polyglot.builtins import as_bytes, map class Canvas(etree.XSLTExtension): diff --git a/src/calibre/ebooks/metadata/book/base.py b/src/calibre/ebooks/metadata/book/base.py index 26bec6ab96..edd7ae9557 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, unicode_type, filter +from polyglot.builtins import iteritems, unicode_type, filter, map # Special sets used to optimize the performance of getting and setting # attributes on Metadata objects diff --git a/src/calibre/ebooks/metadata/sources/ozon.py b/src/calibre/ebooks/metadata/sources/ozon.py index 1e84428b77..e597e01f4a 100644 --- a/src/calibre/ebooks/metadata/sources/ozon.py +++ b/src/calibre/ebooks/metadata/sources/ozon.py @@ -207,8 +207,9 @@ class Ozon(Source): title = type(u'')(title).upper() if title else '' if reRemoveFromTitle: title = reRemoveFromTitle.sub('', title) - authors = map(_normalizeAuthorNameWithInitials, - map(type(u'').upper, map(type(u''), authors))) if authors else None + authors = [ + _normalizeAuthorNameWithInitials(type(u'')(a).upper()) for a in authors + ] if authors else None ozon_id = identifiers.get('ozon', None) # log.debug(u'ozonid: ', ozon_id) @@ -246,7 +247,7 @@ class Ozon(Source): relevance += 1 if authors: - miauthors = map(type(u'').upper, map(type(u''), mi.authors)) if mi.authors else [] + miauthors = [type(u'')(a).upper() for a in mi.authors or ()] # log.debug('Authors %s vs miauthors %s'%(','.join(authors), ','.join(miauthors))) if (in_authors(authors, miauthors)): @@ -332,7 +333,7 @@ class Ozon(Source): author = type(u'')(entry.xpath(u'normalize-space(.//div[contains(@class, "mPerson")])')) # log.debug(u'Author: -----> %s' % author) - norm_authors = map(_normalizeAuthorNameWithInitials, map(type(u'').strip, type(u'')(author).split(u','))) + norm_authors = [_normalizeAuthorNameWithInitials(a.strip()) for a in type(u'')(author).split(u',')] mi = Metadata(title, norm_authors) ozon_id = entry.get('data-href').split('/')[-2] diff --git a/src/calibre/ebooks/metadata/sources/search_engines.py b/src/calibre/ebooks/metadata/sources/search_engines.py index 52741842ca..aba9467c4d 100644 --- a/src/calibre/ebooks/metadata/sources/search_engines.py +++ b/src/calibre/ebooks/metadata/sources/search_engines.py @@ -128,8 +128,7 @@ def wayback_url_processor(url): def ddg_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60): # https://duck.co/help/results/syntax - terms = map(ddg_term, terms) - terms = [quote_term(t) for t in terms] + terms = [quote_term(ddg_term(t)) for t in terms] if site is not None: terms.append(quote_term(('site:' + site))) q = '+'.join(terms) @@ -170,8 +169,7 @@ def bing_url_processor(url): def bing_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60): # http://vlaurie.com/computers2/Articles/bing_advanced_search.htm - terms = map(bing_term, terms) - terms = [quote_term(t) for t in terms] + terms = [quote_term(bing_term(t)) for t in terms] if site is not None: terms.append(quote_term(('site:' + site))) q = '+'.join(terms) @@ -226,8 +224,7 @@ def google_url_processor(url): def google_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60): - terms = map(google_term, terms) - terms = [quote_term(t) for t in terms] + terms = [quote_term(google_term(t)) for t in terms] if site is not None: terms.append(quote_term(('site:' + site))) q = '+'.join(terms) diff --git a/src/calibre/ebooks/mobi/reader/index.py b/src/calibre/ebooks/mobi/reader/index.py index b489dd2e6e..96ba504d5b 100644 --- a/src/calibre/ebooks/mobi/reader/index.py +++ b/src/calibre/ebooks/mobi/reader/index.py @@ -12,7 +12,7 @@ from collections import OrderedDict, namedtuple from calibre.ebooks.mobi.utils import (decint, count_set_bits, decode_string) -from polyglot.builtins import iteritems, range +from polyglot.builtins import iteritems, range, zip TagX = namedtuple('TagX', 'tag num_of_values bitmask eof') PTagX = namedtuple('PTagX', 'tag value_count value_bytes num_of_values') diff --git a/src/calibre/ebooks/mobi/reader/mobi6.py b/src/calibre/ebooks/mobi/reader/mobi6.py index 04ca535c44..bda6f97dc6 100644 --- a/src/calibre/ebooks/mobi/reader/mobi6.py +++ b/src/calibre/ebooks/mobi/reader/mobi6.py @@ -23,7 +23,7 @@ from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.mobi.reader.headers import BookHeader from calibre.utils.img import save_cover_data_to from calibre.utils.imghdr import what -from polyglot.builtins import iteritems, unicode_type, range +from polyglot.builtins import iteritems, unicode_type, range, map class TopazError(ValueError): diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py index 854c2b4395..e678cbebcd 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 unicode_type, range, as_bytes +from polyglot.builtins import unicode_type, range, as_bytes, map from tinycss.color3 import parse_color_string IMAGE_MAX_SIZE = 10 * 1024 * 1024 diff --git a/src/calibre/ebooks/oeb/parse_utils.py b/src/calibre/ebooks/oeb/parse_utils.py index 86874a93ba..ba1a64b3dd 100644 --- a/src/calibre/ebooks/oeb/parse_utils.py +++ b/src/calibre/ebooks/oeb/parse_utils.py @@ -14,7 +14,7 @@ from lxml import etree, html from calibre import xml_replace_entities, force_unicode from calibre.constants import filesystem_encoding from calibre.ebooks.chardet import xml_to_unicode, strip_encoding_declarations -from polyglot.builtins import iteritems, itervalues, unicode_type, string_or_bytes +from polyglot.builtins import iteritems, itervalues, unicode_type, string_or_bytes, map RECOVER_PARSER = etree.XMLParser(recover=True, no_network=True) XHTML_NS = 'http://www.w3.org/1999/xhtml' @@ -65,7 +65,7 @@ def merge_multiple_html_heads_and_bodies(root, log=None): for b in bodies: for x in b: body.append(x) - map(root.append, (head, body)) + tuple(map(root.append, (head, body))) if log is not None: log.warn('Merging multiple
and sections') return root diff --git a/src/calibre/ebooks/oeb/polish/container.py b/src/calibre/ebooks/oeb/polish/container.py index 2a3175632f..e1927786ab 100644 --- a/src/calibre/ebooks/oeb/polish/container.py +++ b/src/calibre/ebooks/oeb/polish/container.py @@ -14,7 +14,7 @@ import time import unicodedata import uuid from collections import defaultdict -from polyglot.builtins import iteritems, unicode_type, zip, as_bytes +from polyglot.builtins import iteritems, unicode_type, zip, as_bytes, map from io import BytesIO from itertools import count @@ -801,7 +801,7 @@ class Container(ContainerBase): # {{{ imap = {name:item_id for item_id, name in iteritems(imap)} items = [item for item, name, linear in self.spine_iter] tail, last_tail = (items[0].tail, items[-1].tail) if items else ('\n ', '\n ') - map(self.remove_from_xml, items) + tuple(map(self.remove_from_xml, items)) spine = self.opf_xpath('//opf:spine')[0] spine.text = tail for name, linear in spine_items: diff --git a/src/calibre/ebooks/oeb/polish/utils.py b/src/calibre/ebooks/oeb/polish/utils.py index af0688bddb..8eff3652d1 100644 --- a/src/calibre/ebooks/oeb/polish/utils.py +++ b/src/calibre/ebooks/oeb/polish/utils.py @@ -10,6 +10,7 @@ import re, os from bisect import bisect from calibre import guess_type as _guess_type, replace_entities +from polyglot.builtins import filter def guess_type(x): diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index 81edf67604..ebe07e16f4 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, unicode_type, string_or_bytes +from polyglot.builtins import iteritems, unicode_type, string_or_bytes, map COLLAPSE = re.compile(r'[ \t\r\n\v]+') STRIPNUM = re.compile(r'[-0-9]+$') diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index cff11f0f6f..23abb83193 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -21,7 +21,7 @@ from calibre.utils.date import is_date_undefined, as_local_time from calibre.utils.icu import sort_key from calibre.ebooks.chardet import strip_encoding_declarations from calibre.ebooks.metadata import fmt_sidx, rating_to_stars -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, map JACKET_XPATH = '//h:meta[@name="calibre-content" and @content="jacket"]' @@ -104,8 +104,8 @@ class Jacket(Base): self.log('Inserting metadata into book...') try: - tags = map(unicode_type, self.oeb.metadata.subject) - except: + tags = list(map(unicode_type, self.oeb.metadata.subject)) + except Exception: tags = [] try: diff --git a/src/calibre/ebooks/oeb/transforms/metadata.py b/src/calibre/ebooks/oeb/transforms/metadata.py index e6b03f78cd..90e1ca2e84 100644 --- a/src/calibre/ebooks/oeb/transforms/metadata.py +++ b/src/calibre/ebooks/oeb/transforms/metadata.py @@ -9,7 +9,8 @@ __docformat__ = 'restructuredtext en' import os, re from calibre.utils.date import isoformat, now from calibre import guess_type -from polyglot.builtins import iteritems, unicode_type +from polyglot.builtins import iteritems, unicode_type, filter +filter def meta_info_to_oeb_metadata(mi, m, log, override_input_metadata=False): diff --git a/src/calibre/ebooks/oeb/transforms/split.py b/src/calibre/ebooks/oeb/transforms/split.py index 7dea7e2b58..4de590465d 100644 --- a/src/calibre/ebooks/oeb/transforms/split.py +++ b/src/calibre/ebooks/oeb/transforms/split.py @@ -20,7 +20,7 @@ from calibre.ebooks.epub import rules from calibre.ebooks.oeb.base import (OEB_STYLES, XPNSMAP as NAMESPACES, urldefrag, rewrite_links, urlunquote, XHTML, urlnormalize) from calibre.ebooks.oeb.polish.split import do_split -from polyglot.builtins import iteritems, unicode_type, range +from polyglot.builtins import iteritems, unicode_type, range, map from css_selectors import Select, SelectorError XPath = functools.partial(_XPath, namespaces=NAMESPACES) diff --git a/src/calibre/ebooks/pdb/ereader/reader132.py b/src/calibre/ebooks/pdb/ereader/reader132.py index 8bf5387573..e650da2806 100644 --- a/src/calibre/ebooks/pdb/ereader/reader132.py +++ b/src/calibre/ebooks/pdb/ereader/reader132.py @@ -18,7 +18,7 @@ from calibre.ebooks import DRMError from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.pdb.ereader import EreaderError from calibre.ebooks.pdb.formatreader import FormatReader -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, range class HeaderRecord(object): @@ -99,7 +99,7 @@ class Reader132(FormatReader): assumed to be encoded as Windows-1252. The encoding is part of the eReader file spec and should always be this encoding. ''' - if number not in range(1, self.header_record.num_text_pages + 1): + if not (1 <= number <= self.header_record.num_text_pages): return '' return self.decompress_text(number) diff --git a/src/calibre/ebooks/pdb/ereader/reader202.py b/src/calibre/ebooks/pdb/ereader/reader202.py index 9d98a6d640..c3197f6cd6 100644 --- a/src/calibre/ebooks/pdb/ereader/reader202.py +++ b/src/calibre/ebooks/pdb/ereader/reader202.py @@ -14,7 +14,7 @@ from calibre import CurrentDir from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ebooks.pdb.ereader import EreaderError -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, range class HeaderRecord(object): @@ -76,7 +76,7 @@ class Reader202(FormatReader): assumed to be encoded as Windows-1252. The encoding is part of the eReader file spec and should always be this encoding. ''' - if number not in range(1, self.header_record.num_text_pages + 1): + if not (1 <= number <= self.header_record.num_text_pages): return '' return self.decompress_text(number) diff --git a/src/calibre/ebooks/pdb/haodoo/reader.py b/src/calibre/ebooks/pdb/haodoo/reader.py index cdacf7881e..1be279c882 100644 --- a/src/calibre/ebooks/pdb/haodoo/reader.py +++ b/src/calibre/ebooks/pdb/haodoo/reader.py @@ -16,6 +16,7 @@ from calibre import prepare_string_for_xml from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.txt.processor import opf_writer, HTML_TEMPLATE +from polyglot.builtins import range, map BPDB_IDENT = b'BOOKMTIT' UPDB_IDENT = b'BOOKMTIU' @@ -62,9 +63,9 @@ class LegacyHeaderRecord(object): fields = raw.lstrip().replace(b'\x1b\x1b\x1b', b'\x1b').split(b'\x1b') self.title = fix_punct(fields[0].decode('cp950', 'replace')) self.num_records = int(fields[1]) - self.chapter_titles = map( + self.chapter_titles = list(map( lambda x: fix_punct(x.decode('cp950', 'replace').rstrip(b'\x00')), - fields[2:]) + fields[2:])) class UnicodeHeaderRecord(object): @@ -74,9 +75,9 @@ class UnicodeHeaderRecord(object): b'\x1b\x00').split(b'\x1b\x00') self.title = fix_punct(fields[0].decode('utf_16_le', 'ignore')) self.num_records = int(fields[1]) - self.chapter_titles = map( + self.chapter_titles = list(map( lambda x: fix_punct(x.decode('utf_16_le', 'replace').rstrip(b'\x00')), - fields[2].split(b'\r\x00\n\x00')) + fields[2].split(b'\r\x00\n\x00'))) class Reader(FormatReader): diff --git a/src/calibre/ebooks/pdb/header.py b/src/calibre/ebooks/pdb/header.py index efd0a1c3aa..80905cdb1f 100644 --- a/src/calibre/ebooks/pdb/header.py +++ b/src/calibre/ebooks/pdb/header.py @@ -35,7 +35,7 @@ class PdbHeaderReader(object): return re.sub(b'[^-A-Za-z0-9 ]+', b'_', self.stream.read(32).replace(b'\x00', b'')) def full_section_info(self, number): - if number not in range(0, self.num_sections): + if not (0 <= number < self.num_sections): raise ValueError('Not a valid section number %i' % number) self.stream.seek(78 + number * 8) @@ -44,14 +44,14 @@ class PdbHeaderReader(object): return (offset, flags, val) def section_offset(self, number): - if number not in range(0, self.num_sections): + if not (0 <= number < self.num_sections): raise ValueError('Not a valid section number %i' % number) self.stream.seek(78 + number * 8) return struct.unpack('>LBBBB', self.stream.read(8))[0] def section_data(self, number): - if number not in range(0, self.num_sections): + if not (0 <= number < self.num_sections): raise ValueError('Not a valid section number %i' % number) start = self.section_offset(number) diff --git a/src/calibre/ebooks/pdf/reflow.py b/src/calibre/ebooks/pdf/reflow.py index 105587e3e1..0367a2fd4e 100644 --- a/src/calibre/ebooks/pdf/reflow.py +++ b/src/calibre/ebooks/pdf/reflow.py @@ -11,7 +11,7 @@ from itertools import count from lxml import etree -from polyglot.builtins import unicode_type, range +from polyglot.builtins import unicode_type, range, map class Font(object): diff --git a/src/calibre/ebooks/rtf2xml/tokenize.py b/src/calibre/ebooks/rtf2xml/tokenize.py index 4247299b41..be7d6b2b00 100755 --- a/src/calibre/ebooks/rtf2xml/tokenize.py +++ b/src/calibre/ebooks/rtf2xml/tokenize.py @@ -16,7 +16,7 @@ import os, re from calibre.ebooks.rtf2xml import copy from calibre.utils.mreplace import MReplace from calibre.ptempfile import better_mktemp -from polyglot.builtins import codepoint_to_chr, range, filter +from polyglot.builtins import codepoint_to_chr, range, filter, map from . import open_for_read, open_for_write diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index a3cb32d8e0..2b94b5fb9b 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -35,7 +35,7 @@ from calibre.utils.date import UNDEFINED_DATE from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.localization import get_lang from polyglot.builtins import (iteritems, itervalues, unicode_type, - string_or_bytes, range) + string_or_bytes, range, map) from polyglot import queue try: @@ -321,7 +321,7 @@ def default_author_link(): def available_heights(): desktop = QCoreApplication.instance().desktop() - return map(lambda x: x.height(), map(desktop.availableGeometry, range(desktop.screenCount()))) + return list(map(lambda x: x.height(), map(desktop.availableGeometry, range(desktop.screenCount())))) def available_height(): diff --git a/src/calibre/gui2/actions/annotate.py b/src/calibre/gui2/actions/annotate.py index 5be9babace..711ede7ccd 100644 --- a/src/calibre/gui2/actions/annotate.py +++ b/src/calibre/gui2/actions/annotate.py @@ -12,7 +12,7 @@ from calibre.gui2 import error_dialog from calibre.gui2.actions import InterfaceAction from calibre.devices.usbms.device import Device from calibre.gui2.dialogs.progress import ProgressDialog -from polyglot.builtins import iteritems, range +from polyglot.builtins import iteritems, range, map class Updater(QThread): # {{{ @@ -76,7 +76,7 @@ class FetchAnnotationsAction(InterfaceAction): rows = self.gui.library_view.selectionModel().selectedRows() if not rows or len(rows) < 2: rows = range(self.gui.library_view.model().rowCount(QModelIndex())) - ids = map(self.gui.library_view.model().id, rows) + ids = list(map(self.gui.library_view.model().id, rows)) return ids def get_formats(id): diff --git a/src/calibre/gui2/actions/device.py b/src/calibre/gui2/actions/device.py index ee8c4fb402..99769c5cba 100644 --- a/src/calibre/gui2/actions/device.py +++ b/src/calibre/gui2/actions/device.py @@ -12,7 +12,7 @@ from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.smartdevice import SmartdeviceDialog from calibre.utils.icu import primary_sort_key from calibre.utils.smtp import config as email_config -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, map class ShareConnMenu(QMenu): # {{{ @@ -111,7 +111,7 @@ class ShareConnMenu(QMenu): # {{{ (alias or account) + ' ' + _('(delete from library)')) self.email_to_menu.addAction(action1) self.email_to_and_delete_menu.addAction(action2) - map(self.memory.append, (action1, action2)) + tuple(map(self.memory.append, (action1, action2))) if default: ac = DeviceAction(dest, False, False, I('mail.png'), _('Email to') + ' ' +(alias or @@ -127,7 +127,7 @@ class ShareConnMenu(QMenu): # {{{ _('Select recipients') + ' ' + _('(delete from library)')) self.email_to_menu.addAction(action1) self.email_to_and_delete_menu.addAction(action2) - map(self.memory.append, (action1, action2)) + tuple(map(self.memory.append, (action1, action2))) tac1 = DeviceAction('choosemail:', False, False, I('mail.png'), _('Email to selected recipients...')) self.addAction(tac1) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 90d84e7d47..85d917c21f 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -26,7 +26,7 @@ from calibre.db.errors import NoSuchFormat from calibre.library.comments import merge_comments from calibre.ebooks.metadata.sources.prefs import msprefs from calibre.gui2.actions.show_quickview import get_quickview_action_plugin -from polyglot.builtins import iteritems, unicode_type +from polyglot.builtins import iteritems, unicode_type, map class EditMetadataAction(InterfaceAction): @@ -614,7 +614,7 @@ class EditMetadataAction(InterfaceAction): def formats_for_books(self, rows): m = self.gui.library_view.model() - return self.formats_for_ids(map(m.id, rows)) + return self.formats_for_ids(list(map(m.id, rows))) def books_to_merge(self, rows): src_ids = [] diff --git a/src/calibre/gui2/bars.py b/src/calibre/gui2/bars.py index 5abf4ce42f..f9f1eb73d3 100644 --- a/src/calibre/gui2/bars.py +++ b/src/calibre/gui2/bars.py @@ -19,7 +19,7 @@ except ImportError: from calibre.constants import isosx from calibre.gui2 import gprefs, native_menubar_defaults, config from calibre.gui2.throbber import ThrobbingButton -from polyglot.builtins import itervalues, unicode_type +from polyglot.builtins import itervalues, unicode_type, map, range class RevealBar(QWidget): # {{{ @@ -578,8 +578,7 @@ class BarsManager(QObject): QObject.__init__(self, parent) self.location_manager = location_manager - bars = [ToolBar(donate_action, location_manager, parent) for i in - range(3)] + bars = [ToolBar(donate_action, location_manager, parent) for i in range(3)] self.main_bars = tuple(bars[:2]) self.child_bars = tuple(bars[2:]) self.reveal_bar = RevealBar(parent) diff --git a/src/calibre/gui2/convert/xpath_wizard.py b/src/calibre/gui2/convert/xpath_wizard.py index 97f80e1c81..092a04e773 100644 --- a/src/calibre/gui2/convert/xpath_wizard.py +++ b/src/calibre/gui2/convert/xpath_wizard.py @@ -12,7 +12,7 @@ from PyQt5.Qt import QDialog, QWidget, Qt, QDialogButtonBox, QVBoxLayout from calibre.gui2.convert.xpath_wizard_ui import Ui_Form from calibre.gui2.convert.xexp_edit_ui import Ui_Form as Ui_Edit from calibre.utils.localization import localize_user_manual_link -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, map class WizardWidget(QWidget, Ui_Form): diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 67a835a1fc..b7d50f2c52 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -26,7 +26,7 @@ from calibre.utils.date import utcnow from calibre.utils.network import internet_connected from calibre import force_unicode from calibre.utils.localization import get_lang, canonicalize_lang -from polyglot.builtins import iteritems, unicode_type, range +from polyglot.builtins import iteritems, unicode_type, range, map def convert_day_time_schedule(val): diff --git a/src/calibre/gui2/dialogs/search.py b/src/calibre/gui2/dialogs/search.py index b764b09ad3..625750b49f 100644 --- a/src/calibre/gui2/dialogs/search.py +++ b/src/calibre/gui2/dialogs/search.py @@ -19,7 +19,7 @@ from calibre.utils.icu import sort_key from calibre.utils.config import tweaks from calibre.utils.date import now from calibre.utils.localization import localize_user_manual_link -from polyglot.builtins import unicode_type, range +from polyglot.builtins import unicode_type, range, map box_values = {} last_matchkind = CONTAINS_MATCH diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index d058e396e0..94eb87506d 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -30,7 +30,7 @@ from calibre.constants import filesystem_encoding, DEBUG, config_dir from calibre.gui2.library import DEFAULT_SORT from calibre.utils.localization import calibre_langcode_to_name from calibre.library.coloring import color_row_key -from polyglot.builtins import iteritems, itervalues, unicode_type, string_or_bytes, range +from polyglot.builtins import iteritems, itervalues, unicode_type, string_or_bytes, range, map Counts = namedtuple('Counts', 'library_total total current') @@ -407,7 +407,7 @@ class BooksModel(QAbstractTableModel): # {{{ self.beginResetModel(), self.endResetModel() def delete_books(self, indices, permanent=False): - ids = map(self.id, indices) + ids = list(map(self.id, indices)) self.delete_books_by_id(ids, permanent=permanent) return ids diff --git a/src/calibre/gui2/metadata/diff.py b/src/calibre/gui2/metadata/diff.py index 9fdc166282..2c18ec8161 100644 --- a/src/calibre/gui2/metadata/diff.py +++ b/src/calibre/gui2/metadata/diff.py @@ -9,7 +9,7 @@ __copyright__ = '2013, Kovid Goyal