py3: port uses of builtin functions that were changed to return iterators

This commit is contained in:
Kovid Goyal 2019-05-23 06:57:33 +05:30
parent b8832d5a31
commit 50af7ba51f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
77 changed files with 191 additions and 125 deletions

View File

@ -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()

View File

@ -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)))

View File

@ -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

View File

@ -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 = [

View File

@ -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

View File

@ -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 {{{

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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):
'''

View File

@ -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):
'''

View File

@ -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

View File

@ -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):

View File

@ -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',

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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

View File

@ -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]

View File

@ -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)

View File

@ -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')

View File

@ -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):

View File

@ -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

View File

@ -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 <head> and <body> sections')
return root

View File

@ -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:

View File

@ -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):

View File

@ -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]+$')

View File

@ -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:

View File

@ -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):

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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):

View File

@ -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)

View File

@ -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):

View File

@ -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

View File

@ -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():

View File

@ -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):

View File

@ -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)

View File

@ -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 = []

View File

@ -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)

View File

@ -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):

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -9,7 +9,7 @@ __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
import os, weakref
from collections import OrderedDict, namedtuple
from functools import partial
from polyglot.builtins import iteritems, itervalues, zip, unicode_type, range
from polyglot.builtins import iteritems, itervalues, zip, unicode_type, range, map
from PyQt5.Qt import (
QDialog, QWidget, QGridLayout, QLabel, QToolButton, QIcon,
@ -692,7 +692,7 @@ if __name__ == '__main__':
ids = sorted(db.all_ids(), reverse=True)
ids = tuple(zip(ids[0::2], ids[1::2]))
gm = partial(db.get_metadata, index_is_id=True, get_cover=True, cover_as_data=True)
get_metadata = lambda x:map(gm, ids[x])
get_metadata = lambda x:list(map(gm, ids[x]))
d = CompareMany(list(range(len(ids))), get_metadata, db.field_metadata, db=db)
if d.exec_() == d.Accepted:
for changed, mi in itervalues(d.accepted):

View File

@ -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 unicode_type
from polyglot.builtins import unicode_type, range
class OutputFormatSetting(Setting):

View File

@ -14,7 +14,7 @@ from calibre.gui2.preferences import ConfigWidgetBase, test_widget
from calibre.gui2.preferences.columns_ui import Ui_Form
from calibre.gui2.preferences.create_custom_column import CreateCustomColumn
from calibre.gui2 import error_dialog, question_dialog, ALL_COLUMNS
from polyglot.builtins import unicode_type
from polyglot.builtins import unicode_type, range, map
class ConfigWidget(ConfigWidgetBase, Ui_Form):

View File

@ -16,7 +16,7 @@ from PyQt5.Qt import (
)
from calibre.gui2 import error_dialog
from polyglot.builtins import iteritems, unicode_type
from polyglot.builtins import iteritems, unicode_type, range, map
class CreateCustomColumn(QDialog):

View File

@ -36,7 +36,7 @@ from calibre.gui2.preferences.coloring import EditRules
from calibre.gui2.library.alternate_views import auto_height, CM_TO_INCH
from calibre.gui2.widgets2 import Dialog
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 BusyCursor(object):

View File

@ -20,7 +20,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm
from calibre.gui2.dialogs.saved_search_editor import SavedSearchEditor
from calibre.gui2.dialogs.search import SearchDialog
from calibre.utils.icu import primary_sort_key
from polyglot.builtins import unicode_type, string_or_bytes
from polyglot.builtins import unicode_type, string_or_bytes, map, range
QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction'

View File

@ -13,7 +13,7 @@ from PyQt5.Qt import (QDialog, QDialogButtonBox)
from calibre.gui2.store.config.chooser.adv_search_builder_ui import Ui_Dialog
from calibre.library.caches import CONTAINS_MATCH, EQUALS_MATCH
from calibre.utils.localization import localize_user_manual_link
from polyglot.builtins import unicode_type
from polyglot.builtins import unicode_type, map
class AdvSearchBuilderDialog(QDialog, Ui_Dialog):

View File

@ -78,9 +78,9 @@ class AdvSearchBuilderDialog(QDialog, Ui_Dialog):
self.mc = '='
else:
self.mc = '~'
all, any, phrase, none = map(lambda x: unicode_type(x.text()),
(self.all, self.any, self.phrase, self.none))
all, any, none = map(self.tokens, (all, any, none))
all, any, phrase, none = list(map(lambda x: unicode_type(x.text()),
(self.all, self.any, self.phrase, self.none)))
all, any, none = list(map(self.tokens, (all, any, none)))
phrase = phrase.strip()
all = ' and '.join(all)
any = ' or '.join(any)

View File

@ -67,9 +67,9 @@ class AdvSearchBuilderDialog(QDialog, Ui_Dialog):
self.mc = '='
else:
self.mc = '~'
all, any, phrase, none = map(lambda x: type(u'')(x.text()),
(self.all, self.any, self.phrase, self.none))
all, any, none = map(self.tokens, (all, any, none))
all, any, phrase, none = list(map(lambda x: type(u'')(x.text()),
(self.all, self.any, self.phrase, self.none)))
all, any, none = list(map(self.tokens, (all, any, none)))
phrase = phrase.strip()
all = ' and '.join(all)
any = ' or '.join(any)

View File

@ -69,7 +69,7 @@ from calibre.utils.config import JSONConfig
from calibre.utils.icu import numeric_sort_key
from calibre.utils.imghdr import identify
from calibre.utils.tdir_in_cache import tdir_in_cache
from polyglot.builtins import iteritems, itervalues, string_or_bytes
from polyglot.builtins import iteritems, itervalues, string_or_bytes, map
from polyglot.urllib import urlparse
_diff_dialogs = []
@ -378,7 +378,7 @@ class Boss(QObject):
if ef:
if isinstance(ef, type('')):
ef = [ef]
map(self.gui.file_list.request_edit, ef)
tuple(map(self.gui.file_list.request_edit, ef))
else:
if tprefs['restore_book_state']:
self.restore_book_edit_state()

View File

@ -22,7 +22,7 @@ from calibre.gui2.tweak_book import tprefs
from calibre.gui2.tweak_book.widgets import Dialog, BusyCursor
from calibre.utils.icu import safe_chr as chr
from calibre.utils.unicode_names import character_name_from_code, points_for_word
from polyglot.builtins import unicode_type, range
from polyglot.builtins import unicode_type, range, map
ROOT = QModelIndex()
@ -529,7 +529,7 @@ class CharModel(QAbstractListModel):
def dropMimeData(self, md, action, row, column, parent):
if action != Qt.MoveAction or not md.hasFormat('application/calibre_charcode_indices') or row < 0 or column != 0:
return False
indices = map(int, bytes(md.data('application/calibre_charcode_indices')).decode('ascii').split(','))
indices = list(map(int, bytes(md.data('application/calibre_charcode_indices')).decode('ascii').split(',')))
codes = [self.chars[x] for x in indices]
for x in indices:
self.chars[x] = None

View File

@ -24,7 +24,7 @@ from calibre.gui2.tweak_book.widgets import Dialog
from calibre.gui2.widgets2 import HistoryLineEdit2
from calibre.utils.filenames import samefile
from calibre.utils.icu import numeric_sort_key
from polyglot.builtins import iteritems, unicode_type
from polyglot.builtins import iteritems, unicode_type, map
class BusyWidget(QWidget): # {{{

View File

@ -12,7 +12,7 @@ from math import ceil
from functools import partial
from collections import namedtuple, OrderedDict
from difflib import SequenceMatcher
from polyglot.builtins import iteritems, unicode_type, zip, range, as_bytes
from polyglot.builtins import iteritems, unicode_type, zip, range, as_bytes, map
import regex
from PyQt5.Qt import (

View File

@ -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, unicode_type, range
from polyglot.builtins import iteritems, unicode_type, range, map
underline_styles = {'single', 'dash', 'dot', 'dash_dot', 'dash_dot_dot', 'wave', 'spell'}

View File

@ -38,7 +38,7 @@ from calibre.gui2.tweak_book import (
from calibre.gui2.tweak_book.editor import syntax_from_mime
from calibre.gui2.tweak_book.templates import template_for
from calibre.utils.icu import numeric_sort_key
from polyglot.builtins import iteritems, itervalues, unicode_type, range, filter
from polyglot.builtins import iteritems, itervalues, unicode_type, range, filter, map
from polyglot.binary import as_hex_unicode
try:
@ -990,7 +990,7 @@ class MergeDialog(QDialog): # {{{
buttons = self.buttons = [QRadioButton(n) for n in names]
buttons[0].setChecked(True)
map(w.l.addWidget, buttons)
tuple(map(w.l.addWidget, buttons))
sa.setWidget(w)
self.resize(self.sizeHint() + QSize(150, 20))

View File

@ -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, unicode_type, range, error_message, filter
from polyglot.builtins import iteritems, unicode_type, range, error_message, filter, map
# The search panel {{{

View File

@ -27,10 +27,11 @@ from calibre.gui2.widgets2 import Dialog as BaseDialog, HistoryComboBox
from calibre.utils.icu import primary_sort_key, sort_key, primary_contains, numeric_sort_key
from calibre.utils.matcher import get_char, Matcher
from calibre.gui2.complete2 import EditWithComplete
from polyglot.builtins import iteritems, unicode_type, zip, getcwd
from polyglot.builtins import iteritems, unicode_type, zip, getcwd, filter as ignore_me
ROOT = QModelIndex()
PARAGRAPH_SEPARATOR = '\u2029'
ignore_me
class BusyCursor(object):

View File

@ -13,7 +13,7 @@ from PyQt5.Qt import (
QContextMenuEvent, QDialog, QDialogButtonBox, QLabel, QVBoxLayout)
from calibre.constants import iswindows
from polyglot.builtins import itervalues
from polyglot.builtins import itervalues, map
touch_supported = False
if iswindows and sys.getwindowsversion()[:2] >= (6, 2): # At least windows 7

View File

@ -25,7 +25,7 @@ from calibre.utils.localization import localize_user_manual_link
from calibre.utils.config import dynamic, prefs
from calibre.gui2 import choose_dir, error_dialog
from polyglot.builtins import iteritems, unicode_type
from polyglot.builtins import iteritems, unicode_type, map
if iswindows:
winutil = plugins['winutil'][0]

View File

@ -42,7 +42,7 @@ from calibre.utils.icu import capitalize, collation_order, sort_key
from calibre.utils.img import scale_image
from calibre.utils.localization import get_lang, lang_as_iso639_1
from calibre.utils.zipfile import ZipFile
from polyglot.builtins import unicode_type, iteritems
from polyglot.builtins import unicode_type, iteritems, map, zip
NBSP = u'\u00a0'
@ -602,7 +602,7 @@ class CatalogBuilder(object):
for rule in self.prefix_rules:
# Literal comparison for Tags field
if rule['field'].lower() == 'tags' or rule['field'] == _('Tags'):
if rule['pattern'].lower() in map(unicode_type.lower, record['tags']):
if rule['pattern'].lower() in tuple(map(unicode_type.lower, record['tags'])):
if self.DEBUG and self.opts.verbose:
self.opts.log.info(" %s '%s' by %s (%s: Tags includes '%s')" %
(rule['prefix'], record['title'],

View File

@ -12,7 +12,7 @@ from calibre.ebooks.metadata import MetaInformation
from calibre.ebooks.metadata import string_to_authors
from calibre.utils.serialize import pickle_loads, pickle_dumps
from calibre import isbytestring
from polyglot.builtins import unicode_type, filter
from polyglot.builtins import unicode_type, filter, map
class Concatenate(object):
@ -868,7 +868,7 @@ ALTER TABLE books ADD COLUMN isbn TEXT DEFAULT "" COLLATE NOCASE;
self.conn.commit()
def refresh_ids(self, ids):
indices = map(self.index, ids)
indices = list(map(self.index, ids))
for id, idx in zip(ids, indices):
row = self.conn.get('SELECT * from meta WHERE id=?', (id,), all=False)
self.data[idx] = row

View File

@ -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, unicode_type, string_or_bytes
from polyglot.builtins import iteritems, unicode_type, string_or_bytes, map
copyfile = os.link if hasattr(os, 'link') else shutil.copyfile
SPOOL_SIZE = 30*1024*1024

View File

@ -7,7 +7,7 @@ __license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
from functools import partial
from polyglot.builtins import iteritems, itervalues, unicode_type, zip, string_or_bytes
from polyglot.builtins import iteritems, itervalues, unicode_type, zip, string_or_bytes, map
from itertools import cycle
from calibre import force_unicode

View File

@ -22,7 +22,7 @@ from calibre.srv.render_book import RENDER_VERSION
from calibre.srv.routes import endpoint, json
from calibre.srv.utils import get_db, get_library_data
from calibre.utils.serialize import json_dumps
from polyglot.builtins import as_unicode
from polyglot.builtins import as_unicode, map
cache_lock = RLock()
queued_jobs = {}

View File

@ -17,7 +17,7 @@ from calibre.ptempfile import TemporaryDirectory
from calibre.srv.errors import HTTPForbidden
from calibre.srv.tests.base import BaseTest, TestServer
from calibre.srv.routes import endpoint, Router
from polyglot.builtins import iteritems, itervalues
from polyglot.builtins import iteritems, itervalues, map
from polyglot import http_client
from polyglot.http_cookie import CookieJar
from polyglot.urllib import (build_opener, HTTPBasicAuthHandler,

View File

@ -18,7 +18,7 @@ from calibre.srv.tests.base import BaseTest, TestServer
from calibre.ptempfile import TemporaryDirectory
from calibre.utils.certgen import create_server_cert
from calibre.utils.monotonic import monotonic
from polyglot.builtins import range, unicode_type
from polyglot.builtins import range, unicode_type, map
from polyglot import http_client
is_ci = os.environ.get('CI', '').lower() == 'true'

View File

@ -25,7 +25,7 @@
#
from __future__ import absolute_import
from polyglot.builtins import itervalues
from polyglot.builtins import itervalues, zip
__all__ = ('BusName', 'Object', 'PropertiesInterface', 'method', 'dbus_property', 'signal')
__docformat__ = 'restructuredtext'

View File

@ -15,7 +15,7 @@ from functools import partial
from calibre.utils.icu import safe_chr, ord_string
from calibre.utils.fonts.sfnt.container import Sfnt
from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs
from polyglot.builtins import unicode_type, range, iteritems, itervalues
from polyglot.builtins import unicode_type, range, iteritems, itervalues, map
# TrueType outlines {{{
@ -265,7 +265,7 @@ def main(args):
raise SystemExit(1)
if opts.codes:
parts = tuple(map(conv_code, parts))
map(not_single, parts)
tuple(map(not_single, parts))
ranges.add(tuple(parts))
else:
if opts.codes:

View File

@ -22,7 +22,7 @@ from calibre.utils.filenames import atomic_rename
from calibre.utils.terminal import ANSIStream
from duktape import Context, JSError, to_python
from lzma.xz import compress, decompress
from polyglot.builtins import itervalues, range, exec_path, raw_input, error_message, filter, getcwd
from polyglot.builtins import itervalues, range, exec_path, raw_input, error_message, filter, getcwd, zip
from polyglot.queue import Empty, Queue
COMPILER_PATH = 'rapydscript/compiler.js.xz'

View File

@ -11,7 +11,7 @@ from tempfile import SpooledTemporaryFile
from calibre import sanitize_file_name
from calibre.constants import filesystem_encoding
from calibre.ebooks.chardet import detect
from polyglot.builtins import unicode_type, string_or_bytes, getcwd
from polyglot.builtins import unicode_type, string_or_bytes, getcwd, map
try:
import zlib # We may need its compression method
@ -1061,7 +1061,7 @@ class ZipFile:
# or the MSB of the file time depending on the header type
# and is used to check the correctness of the password.
bytes = zef_file.read(12)
h = map(zd, bytes[0:12])
h = list(map(zd, bytes[0:12]))
if zinfo.flag_bits & 0x8:
# compare against the file type from extended local headers
check_byte = (zinfo._raw_time >> 8) & 0xff

View File

@ -12,7 +12,7 @@ from calibre.utils.logging import default_log
from calibre import entity_to_unicode, strftime, force_unicode
from calibre.utils.date import dt_factory, utcnow, local_tz
from calibre.utils.cleantext import clean_ascii_chars, clean_xml_chars
from polyglot.builtins import unicode_type, string_or_bytes
from polyglot.builtins import unicode_type, string_or_bytes, map
class Article(object):
@ -296,7 +296,7 @@ class FeedCollection(list):
return None
print('#feeds', len(self))
print(map(len, self))
print(list(map(len, self)))
for f in self:
dups = []
for a in f:
@ -311,7 +311,7 @@ class FeedCollection(list):
self.duplicates = duplicates
print(len(duplicates))
print(map(len, self))
print(list(map(len, self)))
# raise
def find_article(self, article):