From dc274d8c1c789dde1c2e629e6c3bb4eb0ca5d071 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 16 Mar 2019 12:17:14 +0530 Subject: [PATCH] Use ABC to test for numbers type This is important as long does not exist on py3 and anyway using an ABC is more robust. Also fix a few uses of long() for py3. --- src/calibre/customize/conversion.py | 4 ++-- src/calibre/db/__init__.py | 5 +++-- src/calibre/db/tables.py | 3 ++- src/calibre/db/tests/legacy.py | 4 ++-- src/calibre/db/view.py | 4 ++-- src/calibre/devices/prst1/driver.py | 4 ++-- src/calibre/ebooks/__init__.py | 4 ++-- src/calibre/ebooks/conversion/cli.py | 6 +++--- src/calibre/ebooks/covers.py | 6 +++--- src/calibre/ebooks/css_transform_rules.py | 4 ++-- src/calibre/ebooks/docx/block_styles.py | 5 +++-- src/calibre/ebooks/docx/writer/styles.py | 7 ++++--- src/calibre/ebooks/epub/cfi/tests.py | 4 ++-- src/calibre/ebooks/lit/mssha1.py | 12 ++++++------ src/calibre/ebooks/lit/writer.py | 3 ++- src/calibre/ebooks/lrf/html/table.py | 6 +++--- src/calibre/ebooks/metadata/mobi.py | 6 +++--- src/calibre/ebooks/metadata/topaz.py | 6 +++--- src/calibre/ebooks/mobi/debug/headers.py | 4 ++-- src/calibre/ebooks/mobi/mobiml.py | 7 ++++--- src/calibre/ebooks/mobi/writer2/indexer.py | 7 ++++--- src/calibre/ebooks/mobi/writer8/header.py | 7 ++----- src/calibre/ebooks/oeb/iterator/bookmarks.py | 4 ++-- src/calibre/ebooks/oeb/normalize_css.py | 3 ++- src/calibre/ebooks/oeb/stylizer.py | 10 +++++----- src/calibre/ebooks/oeb/transforms/flatcss.py | 6 +++--- src/calibre/ebooks/oeb/transforms/page_margin.py | 3 ++- src/calibre/ebooks/pdb/header.py | 4 ++-- src/calibre/ebooks/pdf/reflow.py | 6 +++--- src/calibre/ebooks/pdf/render/common.py | 4 ++-- src/calibre/ebooks/pdf/render/from_html.py | 4 ++-- src/calibre/ebooks/pdf/render/serialize.py | 6 +++--- src/calibre/ebooks/txt/processor.py | 4 ++-- src/calibre/gui2/actions/save_to_disk.py | 4 ++-- src/calibre/gui2/dialogs/metadata_bulk.py | 4 ++-- src/calibre/gui2/library/models.py | 6 +++--- src/calibre/gui2/lrf_renderer/text.py | 8 ++++---- src/calibre/gui2/metadata/config.py | 4 ++-- src/calibre/gui2/preferences/device_user_defined.py | 3 ++- src/calibre/gui2/preferences/server.py | 5 +++-- src/calibre/gui2/progress_indicator/__init__.py | 3 ++- .../tweak_book/editor/syntax/pygments_highlighter.py | 3 ++- src/calibre/gui2/tweak_book/preferences.py | 5 +++-- src/calibre/gui2/viewer/position.py | 4 ++-- src/calibre/library/catalogs/bibtex.py | 4 ++-- src/calibre/library/custom_columns.py | 4 ++-- src/calibre/library/database2.py | 4 ++-- src/calibre/srv/opts.py | 6 +++--- src/calibre/srv/routes.py | 2 +- src/calibre/srv/tests/web_sockets.py | 8 ++++---- src/calibre/utils/Zeroconf.py | 3 ++- src/calibre/utils/chm/chm.py | 3 ++- src/calibre/utils/config_base.py | 6 +++--- src/calibre/utils/formatter.py | 4 ++-- src/calibre/utils/formatter_functions.py | 4 ++-- src/calibre/utils/rss_gen.py | 8 ++++---- src/calibre/utils/winreg/dde.py | 6 +++++- src/calibre/utils/winreg/lib.py | 4 ++-- src/polyglot/builtins.py | 2 ++ 59 files changed, 154 insertions(+), 135 deletions(-) diff --git a/src/calibre/customize/conversion.py b/src/calibre/customize/conversion.py index 14fb114cfb..c760d3c8dc 100644 --- a/src/calibre/customize/conversion.py +++ b/src/calibre/customize/conversion.py @@ -2,7 +2,7 @@ ''' Defines the plugin system for conversions. ''' -import re, os, shutil +import re, os, shutil, numbers from calibre import CurrentDir from calibre.customize import Plugin @@ -80,7 +80,7 @@ class OptionRecommendation(object): self.option.choices: raise ValueError('OpRec: %s: Recommended value not in choices'% self.option.name) - if not (isinstance(self.recommended_value, (int, float, str, unicode_type)) or self.recommended_value is None): + if not (isinstance(self.recommended_value, (numbers.Number, bytes, unicode_type)) or self.recommended_value is None): raise ValueError('OpRec: %s:'%self.option.name + repr( self.recommended_value) + ' is not a string or a number') diff --git a/src/calibre/db/__init__.py b/src/calibre/db/__init__.py index 277ffbdd76..87144e4890 100644 --- a/src/calibre/db/__init__.py +++ b/src/calibre/db/__init__.py @@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en' SPOOL_SIZE = 30*1024*1024 +import numbers from polyglot.builtins import range @@ -16,7 +17,7 @@ def _get_next_series_num_for_list(series_indices, unwrap=True): from calibre.utils.config_base import tweaks from math import ceil, floor if not series_indices: - if isinstance(tweaks['series_index_auto_increment'], (int, float)): + if isinstance(tweaks['series_index_auto_increment'], numbers.Number): return float(tweaks['series_index_auto_increment']) return 1.0 if unwrap: @@ -38,7 +39,7 @@ def _get_next_series_num_for_list(series_indices, unwrap=True): if i not in series_indices: return i return series_indices[-1] + 1 - if isinstance(tweaks['series_index_auto_increment'], (int, float)): + if isinstance(tweaks['series_index_auto_increment'], numbers.Number): return float(tweaks['series_index_auto_increment']) return 1.0 diff --git a/src/calibre/db/tables.py b/src/calibre/db/tables.py index c165edc961..1dfd722ff0 100644 --- a/src/calibre/db/tables.py +++ b/src/calibre/db/tables.py @@ -7,6 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import numbers from datetime import datetime, timedelta from collections import defaultdict @@ -24,7 +25,7 @@ def c_parse(val): except (AttributeError, TypeError): # If a value like 2001 is stored in the column, apsw will return it as # an int - if isinstance(val, (int, float)): + if isinstance(val, numbers.Number): return datetime(int(val), 1, 3, tzinfo=utc_tz) if val is None: return UNDEFINED_DATE diff --git a/src/calibre/db/tests/legacy.py b/src/calibre/db/tests/legacy.py index 7282b7fc47..919f817b00 100644 --- a/src/calibre/db/tests/legacy.py +++ b/src/calibre/db/tests/legacy.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import inspect, time +import inspect, time, numbers from io import BytesIO from repr import repr from functools import partial @@ -109,7 +109,7 @@ class LegacyTest(BaseTest): def get_values(db): ans = {} for label, loc in db.FIELD_MAP.iteritems(): - if isinstance(label, int): + if isinstance(label, numbers.Integral): label = '#'+db.custom_column_num_map[label]['label'] label = type('')(label) ans[label] = tuple(db.get_property(i, index_is_id=True, loc=loc) diff --git a/src/calibre/db/view.py b/src/calibre/db/view.py index 87663a980d..d4811434c0 100644 --- a/src/calibre/db/view.py +++ b/src/calibre/db/view.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import weakref, operator +import weakref, operator, numbers from functools import partial from itertools import izip, imap from polyglot.builtins import map, unicode_type, range @@ -98,7 +98,7 @@ class View(object): 'marked': self.get_marked, 'series_sort':self.get_series_sort, }.get(col, self._get) - if isinstance(col, int): + if isinstance(col, numbers.Integral): label = self.cache.backend.custom_column_num_map[col]['label'] label = (self.cache.backend.field_metadata.custom_field_prefix + label) if label.endswith('_index'): diff --git a/src/calibre/devices/prst1/driver.py b/src/calibre/devices/prst1/driver.py index 3dbb353713..5b6995b88f 100644 --- a/src/calibre/devices/prst1/driver.py +++ b/src/calibre/devices/prst1/driver.py @@ -24,7 +24,7 @@ from calibre.devices.usbms.books import CollectionsBookList from calibre.devices.usbms.books import BookList from calibre.ebooks.metadata import authors_to_sort_string, authors_to_string from calibre.constants import islinux -from polyglot.builtins import unicode_type +from polyglot.builtins import unicode_type, long_type DBPATH = 'Sony_Reader/database/books.db' THUMBPATH = 'Sony_Reader/database/cache/books/%s/thumbnail/main_thumbnail.jpg' @@ -330,7 +330,7 @@ class PRST1(USBMS): cursor.execute(query) row = cursor.fetchone() - return long(row[0]) + return long_type(row[0]) def get_database_min_id(self, source_id): sequence_min = 0 diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index 874aa90bbd..7d90f7c2a5 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -7,7 +7,7 @@ Code for the conversion of ebook formats and the reading of metadata from various formats. ''' -import traceback, os, re +import traceback, os, re, numbers from calibre import CurrentDir, prints from polyglot.builtins import unicode_type @@ -233,7 +233,7 @@ UNIT_RE = re.compile(r'^(-*[0-9]*[.]?[0-9]*)\s*(%|em|ex|en|px|mm|cm|in|pt|pc|rem def unit_convert(value, base, font, dpi, body_font_size=12): ' Return value in pts' - if isinstance(value, (int, long, float)): + if isinstance(value, numbers.Number): return value try: return float(value) * 72.0 / dpi diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index f39e2e006a..a1394b592b 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' Command line interface to conversion sub-system ''' -import sys, os +import sys, os, numbers from optparse import OptionGroup, Option from collections import OrderedDict @@ -91,9 +91,9 @@ def option_recommendation_to_cli_option(add_option, rec): attrs['action'] = 'store_false' if rec.recommended_value else \ 'store_true' else: - if isinstance(rec.recommended_value, int): + if isinstance(rec.recommended_value, numbers.Integral): attrs['type'] = 'int' - if isinstance(rec.recommended_value, float): + if isinstance(rec.recommended_value, numbers.Real): attrs['type'] = 'float' if opt.long_switch == 'verbose': diff --git a/src/calibre/ebooks/covers.py b/src/calibre/ebooks/covers.py index 4362983afd..035ca9ad39 100644 --- a/src/calibre/ebooks/covers.py +++ b/src/calibre/ebooks/covers.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import re, random, unicodedata +import re, random, unicodedata, numbers from collections import namedtuple from contextlib import contextmanager from math import ceil, sqrt, cos, sin, atan2 @@ -167,7 +167,7 @@ class Block(object): @property def height(self): - return int(ceil(sum(l if isinstance(l, (int, float)) else l.boundingRect().height() for l in self.layouts))) + return int(ceil(sum(l if isinstance(l, numbers.Number) else l.boundingRect().height() for l in self.layouts))) @dynamic_property def position(self): @@ -181,7 +181,7 @@ class Block(object): self.layouts[0].setPosition(QPointF(x, y)) y += self.layouts[0].boundingRect().height() for l in self.layouts[1:]: - if isinstance(l, (int, float)): + if isinstance(l, numbers.Number): y += l else: l.setPosition(QPointF(x, y)) diff --git a/src/calibre/ebooks/css_transform_rules.py b/src/calibre/ebooks/css_transform_rules.py index ceed5d0cd4..58fc483047 100644 --- a/src/calibre/ebooks/css_transform_rules.py +++ b/src/calibre/ebooks/css_transform_rules.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) from functools import partial from collections import OrderedDict -import operator +import operator, numbers from css_parser.css import Property, CSSRule @@ -123,7 +123,7 @@ def unit_convert(value, unit, dpi=96.0, body_font_size=12): def parse_css_length_or_number(raw, default_unit=None): - if isinstance(raw, (int, long, float)): + if isinstance(raw, numbers.Number): return raw, default_unit try: return float(raw), default_unit diff --git a/src/calibre/ebooks/docx/block_styles.py b/src/calibre/ebooks/docx/block_styles.py index bbe0fe4f0c..480738fa06 100644 --- a/src/calibre/ebooks/docx/block_styles.py +++ b/src/calibre/ebooks/docx/block_styles.py @@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' +import numbers from collections import OrderedDict @@ -126,7 +127,7 @@ def border_to_css(edge, style, css): bs = getattr(style, 'border_%s_style' % edge) bc = getattr(style, 'border_%s_color' % edge) bw = getattr(style, 'border_%s_width' % edge) - if isinstance(bw, (float, int, long)): + if isinstance(bw, numbers.Number): # WebKit needs at least 1pt to render borders and 3pt to render double borders bw = max(bw, (3 if bs == 'double' else 1)) if bs is not inherit and bs is not None: @@ -134,7 +135,7 @@ def border_to_css(edge, style, css): if bc is not inherit and bc is not None: css['border-%s-color' % edge] = bc if bw is not inherit and bw is not None: - if isinstance(bw, (int, float, long)): + if isinstance(bw, numbers.Number): bw = '%.3gpt' % bw css['border-%s-width' % edge] = bw diff --git a/src/calibre/ebooks/docx/writer/styles.py b/src/calibre/ebooks/docx/writer/styles.py index e57b558a30..fd8e4cabc9 100644 --- a/src/calibre/ebooks/docx/writer/styles.py +++ b/src/calibre/ebooks/docx/writer/styles.py @@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' +import numbers from collections import Counter, defaultdict from operator import attrgetter @@ -232,7 +233,7 @@ class TextStyle(DOCXStyle): except (ValueError, TypeError, AttributeError): self.spacing = None va = css.first_vertical_align - if isinstance(va, (int, float)): + if isinstance(va, numbers.Number): self.vertical_align = str(int(va * 2)) else: val = { @@ -254,7 +255,7 @@ class TextStyle(DOCXStyle): elif self.padding != padding: self.padding = ignore val = css['border-%s-width' % edge] - if not isinstance(val, (float, int, long)): + if not isinstance(val, numbers.Number): val = {'thin':0.2, 'medium':1, 'thick':2}.get(val, 0) val = min(96, max(2, int(val * 8))) if self.border_width is None: @@ -467,7 +468,7 @@ def read_css_block_borders(self, css, store_css_style=False): setattr(self, 'margin_' + edge, 0) # for e.g.: margin: auto setattr(self, 'css_margin_' + edge, css._style.get('margin-' + edge, '')) val = css['border-%s-width' % edge] - if not isinstance(val, (float, int, long)): + if not isinstance(val, numbers.Number): val = {'thin':0.2, 'medium':1, 'thick':2}.get(val, 0) val = min(96, max(2, int(val * 8))) setattr(self, 'border_%s_width' % edge, val) diff --git a/src/calibre/ebooks/epub/cfi/tests.py b/src/calibre/ebooks/epub/cfi/tests.py index a47074b54d..626660bd30 100644 --- a/src/calibre/ebooks/epub/cfi/tests.py +++ b/src/calibre/ebooks/epub/cfi/tests.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import unittest +import unittest, numbers from polyglot.builtins import map from calibre.ebooks.epub.cfi.parse import parser, cfi_sort_key, decode_cfi @@ -29,7 +29,7 @@ class Tests(unittest.TestCase): p = parser() def step(x): - if isinstance(x, int): + if isinstance(x, numbers.Integral): return {'num': x} return {'num':x[0], 'id':x[1]} diff --git a/src/calibre/ebooks/lit/mssha1.py b/src/calibre/ebooks/lit/mssha1.py index 48d145ca4e..6e1e68ffbd 100644 --- a/src/calibre/ebooks/lit/mssha1.py +++ b/src/calibre/ebooks/lit/mssha1.py @@ -9,7 +9,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' import struct, copy -from polyglot.builtins import range +from polyglot.builtins import range, long_type # ====================================================================== # Bit-Manipulation helpers @@ -62,10 +62,10 @@ def _bytelist2longBigEndian(list): j = 0 i = 0 while i < imax: - b0 = long(ord(list[j])) << 24 - b1 = long(ord(list[j+1])) << 16 - b2 = long(ord(list[j+2])) << 8 - b3 = long(ord(list[j+3])) + b0 = long_type(ord(list[j])) << 24 + b1 = long_type(ord(list[j+1])) << 16 + b2 = long_type(ord(list[j+2])) << 8 + b3 = long_type(ord(list[j+3])) hl[i] = b0 | b1 | b2 | b3 i = i+1 j = j+4 @@ -204,7 +204,7 @@ class mssha1(object): to the hashed string. """ - leninBuf = long(len(inBuf)) + leninBuf = long_type(len(inBuf)) # Compute number of bytes mod 64. index = (self.count[1] >> 3) & 0x3F diff --git a/src/calibre/ebooks/lit/writer.py b/src/calibre/ebooks/lit/writer.py index c1610b6e50..35fe053902 100644 --- a/src/calibre/ebooks/lit/writer.py +++ b/src/calibre/ebooks/lit/writer.py @@ -16,6 +16,7 @@ import re import copy import uuid import functools +import numbers from urlparse import urldefrag from urllib import unquote as urlunquote from lxml import etree @@ -162,7 +163,7 @@ class ReBinary(object): def write(self, *values): for value in values: - if isinstance(value, (int, long)): + if isinstance(value, numbers.Integral): try: value = codepoint_to_chr(value) except OverflowError: diff --git a/src/calibre/ebooks/lrf/html/table.py b/src/calibre/ebooks/lrf/html/table.py index cc62744954..d849e19443 100644 --- a/src/calibre/ebooks/lrf/html/table.py +++ b/src/calibre/ebooks/lrf/html/table.py @@ -1,7 +1,7 @@ from __future__ import print_function __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import math, sys, re +import math, sys, re, numbers from calibre.ebooks.lrf.fonts import get_font from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Text, CR, Span, \ @@ -137,7 +137,7 @@ class Cell(object): mwidth = 0 for token, attrs in tokens(tb): font = default_font - if isinstance(token, int): # Handle para and line breaks + if isinstance(token, numbers.Integral): # Handle para and line breaks continue if isinstance(token, Plot): return self.pts_to_pixels(token.xsize) @@ -178,7 +178,7 @@ class Cell(object): ls = self.pts_to_pixels(attrs.get('baselineskip', ts['baselineskip']))+\ self.pts_to_pixels(attrs.get('linespace', ts['linespace'])) ws = self.pts_to_pixels(attrs.get('wordspace', ts['wordspace'])) - if isinstance(token, int): # Handle para and line breaks + if isinstance(token, numbers.Integral): # Handle para and line breaks if top != bottom: # Previous element not a line break top = bottom else: diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py index b4ddb8da48..5303a3423d 100644 --- a/src/calibre/ebooks/metadata/mobi.py +++ b/src/calibre/ebooks/metadata/mobi.py @@ -10,7 +10,7 @@ __copyright__ = '2009, Kovid Goyal kovid@kovidgoyal.net and ' \ 'Marshall T. Vandegrift ' __docformat__ = 'restructuredtext en' -import os +import os, numbers from struct import pack, unpack from cStringIO import StringIO @@ -47,7 +47,7 @@ class StreamSlicer(object): def __getitem__(self, key): stream = self._stream base = self.start - if isinstance(key, (int, long)): + if isinstance(key, numbers.Integral): stream.seek(base + key) return stream.read(1) if isinstance(key, slice): @@ -67,7 +67,7 @@ class StreamSlicer(object): def __setitem__(self, key, value): stream = self._stream base = self.start - if isinstance(key, (int, long)): + if isinstance(key, numbers.Integral): if len(value) != 1: raise ValueError("key and value lengths must match") stream.seek(base + key) diff --git a/src/calibre/ebooks/metadata/topaz.py b/src/calibre/ebooks/metadata/topaz.py index 38ccce1fbe..f2c39a3464 100644 --- a/src/calibre/ebooks/metadata/topaz.py +++ b/src/calibre/ebooks/metadata/topaz.py @@ -5,7 +5,7 @@ __copyright__ = '2010, Greg Riker ' __docformat__ = 'restructuredtext en' ''' Read/write metadata from Amazon's topaz format ''' -import StringIO, sys +import StringIO, sys, numbers from struct import pack from calibre.ebooks.metadata import MetaInformation @@ -29,7 +29,7 @@ class StreamSlicer(object): def __getitem__(self, key): stream = self._stream base = self.start - if isinstance(key, (int, long)): + if isinstance(key, numbers.Integral): stream.seek(base + key) return stream.read(1) if isinstance(key, slice): @@ -49,7 +49,7 @@ class StreamSlicer(object): def __setitem__(self, key, value): stream = self._stream base = self.start - if isinstance(key, (int, long)): + if isinstance(key, numbers.Integral): if len(value) != 1: raise ValueError("key and value lengths must match") stream.seek(base + key) diff --git a/src/calibre/ebooks/mobi/debug/headers.py b/src/calibre/ebooks/mobi/debug/headers.py index dbf5d97a70..97923ab579 100644 --- a/src/calibre/ebooks/mobi/debug/headers.py +++ b/src/calibre/ebooks/mobi/debug/headers.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import struct, datetime, os +import struct, datetime, os, numbers from calibre.utils.date import utc_tz from calibre.ebooks.mobi.reader.headers import NULL_INDEX @@ -598,7 +598,7 @@ class TextRecord(object): # {{{ self.trailing_data['raw_bytes'] = raw_trailing_bytes for typ, val in self.trailing_data.iteritems(): - if isinstance(typ, int): + if isinstance(typ, numbers.Integral): print ('Record %d has unknown trailing data of type: %d : %r'% (idx, typ, val)) diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py index effa29c7a0..51bff9c57a 100644 --- a/src/calibre/ebooks/mobi/mobiml.py +++ b/src/calibre/ebooks/mobi/mobiml.py @@ -9,6 +9,7 @@ __copyright__ = '2008, Marshall T. Vandegrift ' import copy import re +import numbers from lxml import etree from calibre.ebooks.oeb.base import namespace, barename from calibre.ebooks.oeb.base import XHTML, XHTML_NS, urlnormalize @@ -45,7 +46,7 @@ COLLAPSE = re.compile(r'[ \t\r\n\v]+') def asfloat(value): - if not isinstance(value, (int, long, float)): + if not isinstance(value, numbers.Number): return 0.0 return float(value) @@ -531,9 +532,9 @@ class MobiMLizer(object): valign = style['vertical-align'] not_baseline = valign in ('super', 'sub', 'text-top', 'text-bottom', 'top', 'bottom') or ( - isinstance(valign, (float, int)) and abs(valign) != 0) + isinstance(valign, numbers.Number) and abs(valign) != 0) issup = valign in ('super', 'text-top', 'top') or ( - isinstance(valign, (float, int)) and valign > 0) + isinstance(valign, numbers.Number) and valign > 0) vtag = 'sup' if issup else 'sub' if not_baseline and not ignore_valign and tag not in NOT_VTAGS and not isblock: nroot = etree.Element(XHTML('html'), nsmap=MOBI_NSMAP) diff --git a/src/calibre/ebooks/mobi/writer2/indexer.py b/src/calibre/ebooks/mobi/writer2/indexer.py index 7ce7ab7270..0353cf61b0 100644 --- a/src/calibre/ebooks/mobi/writer2/indexer.py +++ b/src/calibre/ebooks/mobi/writer2/indexer.py @@ -8,6 +8,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import numbers from struct import pack from cStringIO import StringIO from collections import OrderedDict, defaultdict @@ -166,7 +167,7 @@ class IndexEntry(object): @property def bytestring(self): buf = StringIO() - if isinstance(self.index, int): + if isinstance(self.index, numbers.Integral): buf.write(encode_number_as_hex(self.index)) else: raw = bytearray(self.index.encode('ascii')) @@ -188,7 +189,7 @@ class IndexEntry(object): for tag in self.tag_nums: attr = self.attr_for_tag(tag) val = getattr(self, attr) - if isinstance(val, int): + if isinstance(val, numbers.Integral): val = [val] for x in val: buf.write(encint(x)) @@ -602,7 +603,7 @@ class Indexer(object): # {{{ # The index of the last entry in the NCX idx = indices[-1].index - if isinstance(idx, int): + if isinstance(idx, numbers.Integral): idx = encode_number_as_hex(idx) else: idx = idx.encode('ascii') diff --git a/src/calibre/ebooks/mobi/writer8/header.py b/src/calibre/ebooks/mobi/writer8/header.py index 069a36c11b..ad77196517 100644 --- a/src/calibre/ebooks/mobi/writer8/header.py +++ b/src/calibre/ebooks/mobi/writer8/header.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import random +import random, numbers from io import BytesIO from collections import OrderedDict from struct import pack @@ -67,7 +67,7 @@ class Header(OrderedDict): positions[name] = buf.tell() if val is None: raise ValueError('Dynamic field %r not set'%name) - if isinstance(val, (int, long)): + if isinstance(val, numbers.Integral): fmt = b'H' if name in self.SHORT_FIELDS else b'I' val = pack(b'>'+fmt, val) buf.write(val) @@ -83,6 +83,3 @@ class Header(OrderedDict): def format_value(self, name, val): return val - - - diff --git a/src/calibre/ebooks/oeb/iterator/bookmarks.py b/src/calibre/ebooks/oeb/iterator/bookmarks.py index 841d409ccb..1677fc3625 100644 --- a/src/calibre/ebooks/oeb/iterator/bookmarks.py +++ b/src/calibre/ebooks/oeb/iterator/bookmarks.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os +import os, numbers from io import BytesIO from calibre.utils.zipfile import safe_replace @@ -59,7 +59,7 @@ class BookmarksMixin(object): rec = u'%s^%d#%s'%(bm['title'], bm['spine'], bm['pos']) else: pos = bm['pos'] - if isinstance(pos, (int, float)): + if isinstance(pos, numbers.Number): pos = unicode_type(pos) else: pos = pos.replace(u'^', BM_LEGACY_ESC) diff --git a/src/calibre/ebooks/oeb/normalize_css.py b/src/calibre/ebooks/oeb/normalize_css.py index a3bb7a0ad3..02c377974c 100644 --- a/src/calibre/ebooks/oeb/normalize_css.py +++ b/src/calibre/ebooks/oeb/normalize_css.py @@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' +import numbers from polyglot.builtins import zip, string_or_bytes from functools import wraps @@ -392,7 +393,7 @@ def test_normalization(return_tests=False): # {{{ tuple('0 0 0 0'.split()) : '0', }.iteritems(): for prefix in ('margin', 'padding'): - css = {'%s-%s' % (prefix, x) : str(y)+'pt' if isinstance(y, (int, float)) else y for x, y in zip(('left', 'top', 'right', 'bottom'), s)} + css = {'%s-%s' % (prefix, x) : str(y)+'pt' if isinstance(y, numbers.Number) else y for x, y in zip(('left', 'top', 'right', 'bottom'), s)} css = '; '.join(('%s:%s' % (k, v) for k, v in css.iteritems())) style = parseStyle(css) condense_rule(style) diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index 0b4b825657..3c6d71c1ae 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -8,7 +8,7 @@ from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -import os, re, logging, copy, unicodedata +import os, re, logging, copy, unicodedata, numbers from weakref import WeakKeyDictionary from xml.dom import SyntaxErr as CSSSyntaxError from css_parser.css import (CSSStyleRule, CSSPageRule, CSSFontFaceRule, @@ -527,7 +527,7 @@ class Style(object): result = size else: result = self._unit_convert(value, base=base, font=base) - if not isinstance(result, (int, float, long)): + if not isinstance(result, numbers.Number): return base if result < 0: result = normalize_fontsize("smaller", base) @@ -562,20 +562,20 @@ class Style(object): ans = self._unit_convert(str(img_size) + 'px', base=base) else: x = self._unit_convert(x, base=base) - if isinstance(x, (float, int, long)): + if isinstance(x, numbers.Number): ans = x if ans is None: x = self._element.get(attr) if x is not None: x = self._unit_convert(x + 'px', base=base) - if isinstance(x, (float, int, long)): + if isinstance(x, numbers.Number): ans = x if ans is None: ans = self._unit_convert(str(img_size) + 'px', base=base) maa = self._style.get('max-' + attr) if maa is not None: x = self._unit_convert(maa, base=base) - if isinstance(x, (int, float, long)) and (ans is None or x < ans): + if isinstance(x, numbers.Number) and (ans is None or x < ans): ans = x return ans diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index dd64a3a2ef..14826539fe 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -6,7 +6,7 @@ from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -import re, operator, math +import re, operator, math, numbers from collections import defaultdict from xml.dom import SyntaxErr @@ -28,7 +28,7 @@ STRIPNUM = re.compile(r'[-0-9]+$') def asfloat(value, default): - if not isinstance(value, (int, long, float)): + if not isinstance(value, numbers.Number): value = default return float(value) @@ -378,7 +378,7 @@ class CSSFlattener(object): except: font_size = self.sbase if self.sbase is not None else \ self.context.source.fbase - if tag == 'body' and isinstance(font_size, (int, float)): + if tag == 'body' and isinstance(font_size, numbers.Number): stylizer.body_font_size = font_size if 'align' in node.attrib: if tag != 'img': diff --git a/src/calibre/ebooks/oeb/transforms/page_margin.py b/src/calibre/ebooks/oeb/transforms/page_margin.py index 264f86d68d..f56c97c155 100644 --- a/src/calibre/ebooks/oeb/transforms/page_margin.py +++ b/src/calibre/ebooks/oeb/transforms/page_margin.py @@ -7,6 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import numbers from collections import Counter from calibre.ebooks.oeb.base import barename, XPath @@ -89,7 +90,7 @@ class RemoveFakeMargins(object): pass else: if ((hasattr(ti, 'startswith') and ti.startswith('-')) or - isinstance(ti, (int, float)) and ti < 0): + isinstance(ti, numbers.Number) and ti < 0): raise NegativeTextIndent() return style.marginLeft, style.marginRight, style return '', '', None diff --git a/src/calibre/ebooks/pdb/header.py b/src/calibre/ebooks/pdb/header.py index fe9c6fc130..6e954843e1 100644 --- a/src/calibre/ebooks/pdb/header.py +++ b/src/calibre/ebooks/pdb/header.py @@ -10,6 +10,7 @@ __docformat__ = 'restructuredtext en' import re import struct import time +from polyglot.builtins import long_type class PdbHeaderReader(object): @@ -82,7 +83,6 @@ class PdbHeaderBuilder(object): offset = 78 + (8 * nrecords) + 2 for id, record in enumerate(section_lengths): - out_stream.write(struct.pack('>LBBBB', long(offset), 0, 0, 0, 0)) + out_stream.write(struct.pack('>LBBBB', long_type(offset), 0, 0, 0, 0)) offset += record out_stream.write('\x00\x00') - diff --git a/src/calibre/ebooks/pdf/reflow.py b/src/calibre/ebooks/pdf/reflow.py index e3f47e4eef..bc9dd27c9e 100644 --- a/src/calibre/ebooks/pdf/reflow.py +++ b/src/calibre/ebooks/pdf/reflow.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os +import sys, os, numbers from lxml import etree @@ -222,7 +222,7 @@ class Box(list): def to_html(self): ans = ['<%s>'%self.tag] for elem in self: - if isinstance(elem, int): + if isinstance(elem, numbers.Integral): ans.append(''%elem) else: ans.append(elem.to_html()+' ') @@ -242,7 +242,7 @@ class ImageBox(Box): if len(self) > 0: ans.append('
') for elem in self: - if isinstance(elem, int): + if isinstance(elem, numbers.Integral): ans.append('
'%elem) else: ans.append(elem.to_html()+' ') diff --git a/src/calibre/ebooks/pdf/render/common.py b/src/calibre/ebooks/pdf/render/common.py index 6b8200fa68..25313a8bc4 100644 --- a/src/calibre/ebooks/pdf/render/common.py +++ b/src/calibre/ebooks/pdf/render/common.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import codecs, zlib +import codecs, zlib, numbers from io import BytesIO from datetime import datetime from binascii import hexlify @@ -69,7 +69,7 @@ def serialize(o, stream): elif isinstance(o, bool): # Must check bool before int as bools are subclasses of int stream.write_raw(b'true' if o else b'false') - elif isinstance(o, (int, long)): + elif isinstance(o, numbers.Integral): stream.write_raw(str(o).encode('ascii') if ispy3 else bytes(o)) elif hasattr(o, 'pdf_serialize'): o.pdf_serialize(stream) diff --git a/src/calibre/ebooks/pdf/render/from_html.py b/src/calibre/ebooks/pdf/render/from_html.py index 1365c22d72..0325a8db63 100644 --- a/src/calibre/ebooks/pdf/render/from_html.py +++ b/src/calibre/ebooks/pdf/render/from_html.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import json, os +import json, os, numbers from polyglot.builtins import map from math import floor from collections import defaultdict @@ -418,7 +418,7 @@ class PDFWriter(QObject): except Exception: doc_margins = None if doc_margins and isinstance(doc_margins, dict): - doc_margins = {k:float(v) for k, v in doc_margins.iteritems() if isinstance(v, (float, int)) and k in {'right', 'top', 'left', 'bottom'}} + doc_margins = {k:float(v) for k, v in doc_margins.iteritems() if isinstance(v, numbers.Number) and k in {'right', 'top', 'left', 'bottom'}} if doc_margins: margin_top = margin_bottom = 0 page_margins = self.convert_page_margins(doc_margins) diff --git a/src/calibre/ebooks/pdf/render/serialize.py b/src/calibre/ebooks/pdf/render/serialize.py index 5c80ed03b8..ed910bc618 100644 --- a/src/calibre/ebooks/pdf/render/serialize.py +++ b/src/calibre/ebooks/pdf/render/serialize.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import hashlib +import hashlib, numbers from polyglot.builtins import map from PyQt5.Qt import QBuffer, QByteArray, QImage, Qt, QColor, qRgba, QPainter @@ -56,7 +56,7 @@ class IndirectObjects(object): def __getitem__(self, o): try: - return self._map[id(self._list[o] if isinstance(o, int) else o)] + return self._map[id(self._list[o] if isinstance(o, numbers.Integral) else o)] except (KeyError, IndexError): raise KeyError('The object %r was not found'%o) @@ -355,7 +355,7 @@ class PDFStream(object): self.current_page.write_line() for x in op: self.current_page.write( - (fmtnum(x) if isinstance(x, (int, long, float)) else x) + ' ') + (fmtnum(x) if isinstance(x, numbers.Number) else x) + ' ') def draw_path(self, path, stroke=True, fill=False, fill_rule='winding'): if not path.ops: diff --git a/src/calibre/ebooks/txt/processor.py b/src/calibre/ebooks/txt/processor.py index e2b272c54b..2e061e94f7 100644 --- a/src/calibre/ebooks/txt/processor.py +++ b/src/calibre/ebooks/txt/processor.py @@ -15,7 +15,7 @@ from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.ebooks.conversion.preprocess import DocAnalysis from calibre.utils.cleantext import clean_ascii_chars -from polyglot.builtins import unicode_type, map, range +from polyglot.builtins import unicode_type, map, range, long_type HTML_TEMPLATE = u'%s \n%s\n' @@ -64,7 +64,7 @@ def split_txt(txt, epub_split_size_kb=0): txt = txt.encode('utf-8') length_byte = len(txt) # Calculating the average chunk value for easy splitting as EPUB (+2 as a safe margin) - chunk_size = long(length_byte / (int(length_byte / (epub_split_size_kb * 1024)) + 2)) + chunk_size = long_type(length_byte / (int(length_byte / (epub_split_size_kb * 1024)) + 2)) # if there are chunks with a superior size then go and break parts = txt.split(b'\n\n') lengths = tuple(map(len, parts)) diff --git a/src/calibre/gui2/actions/save_to_disk.py b/src/calibre/gui2/actions/save_to_disk.py index 6e183872f8..6e1943ec16 100644 --- a/src/calibre/gui2/actions/save_to_disk.py +++ b/src/calibre/gui2/actions/save_to_disk.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os +import os, numbers from functools import partial from polyglot.builtins import map @@ -121,7 +121,7 @@ class SaveToDiskAction(InterfaceAction): Dispatcher(self.books_saved), paths, path) def save_library_format_by_ids(self, book_ids, fmt, single_dir=True): - if isinstance(book_ids, int): + if isinstance(book_ids, numbers.Integral): book_ids = [book_ids] rows = list(self.gui.library_view.ids_to_rows(book_ids).itervalues()) rows = [self.gui.library_view.model().index(r, 0) for r in rows] diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index 0c87c31b11..612c0148a1 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -3,7 +3,7 @@ # License: GPLv3 Copyright: 2008, Kovid Goyal from __future__ import print_function -import re +import re, numbers from collections import defaultdict, namedtuple from io import BytesIO from threading import Thread @@ -773,7 +773,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): val = mi.format_field(field)[1] else: val = mi.get(field, None) - if isinstance(val, (int, float, bool)): + if isinstance(val, (numbers.Number, bool)): val = str(val) elif fm['is_csp']: # convert the csp dict into a list diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 9f5a37d84f..f203a3de30 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import functools, re, os, traceback, errno, time +import functools, re, os, traceback, errno, time, numbers from collections import defaultdict, namedtuple from itertools import groupby @@ -580,7 +580,7 @@ class BooksModel(QAbstractTableModel): # {{{ return data def get_book_info(self, index): - if isinstance(index, int): + if isinstance(index, numbers.Integral): index = self.index(index, 0) # If index is not valid returns None data = self.current_changed(index, None, False) @@ -1649,7 +1649,7 @@ class DeviceBooksModel(BooksModel): # {{{ return (authors_to_string(au)) elif cname == 'size': size = self.db[self.map[row]].size - if not isinstance(size, (float, int)): + if not isinstance(size, numbers.Number): size = 0 return (human_readable(size)) elif cname == 'timestamp': diff --git a/src/calibre/gui2/lrf_renderer/text.py b/src/calibre/gui2/lrf_renderer/text.py index 3467a09e68..d86a5e92b2 100644 --- a/src/calibre/gui2/lrf_renderer/text.py +++ b/src/calibre/gui2/lrf_renderer/text.py @@ -1,7 +1,7 @@ from __future__ import print_function __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import sys, collections, operator, copy, re +import sys, collections, operator, copy, re, numbers from PyQt5.Qt import ( Qt, QRectF, QFont, QColor, QPixmap, QGraphicsPixmapItem, QGraphicsItem, @@ -451,7 +451,7 @@ class Line(QGraphicsItem): if self.length_in_space > 0: frac = 1 + float(delta)/self.length_in_space for i in range(len(self.tokens)): - if isinstance(self.tokens[i], (int, float)): + if isinstance(self.tokens[i], numbers.Number): self.tokens[i] *= frac self.current_width = self.line_length @@ -495,7 +495,7 @@ class Line(QGraphicsItem): painter.restore() painter.save() for tok in self.tokens: - if isinstance(tok, (int, float)): + if isinstance(tok, numbers.Number): x += tok elif isinstance(tok, Word): painter.setFont(tok.font) @@ -559,7 +559,7 @@ class Line(QGraphicsItem): def __unicode__(self): s = u'' for tok in self.tokens: - if isinstance(tok, (int, float)): + if isinstance(tok, numbers.Number): s += ' ' elif isinstance(tok, Word): s += unicode_type(tok.string) diff --git a/src/calibre/gui2/metadata/config.py b/src/calibre/gui2/metadata/config.py index 2667d4a966..1f5ae83243 100644 --- a/src/calibre/gui2/metadata/config.py +++ b/src/calibre/gui2/metadata/config.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import textwrap +import textwrap, numbers from PyQt5.Qt import (QWidget, QGridLayout, QGroupBox, QListView, Qt, QSpinBox, QDoubleSpinBox, QCheckBox, QLineEdit, QComboBox, QLabel) @@ -90,7 +90,7 @@ class ConfigWidget(QWidget): def create_widgets(self, opt): val = self.plugin.prefs[opt.name] if opt.type == 'number': - c = QSpinBox if isinstance(opt.default, int) else QDoubleSpinBox + c = QSpinBox if isinstance(opt.default, numbers.Integral) else QDoubleSpinBox widget = c(self) widget.setValue(val) elif opt.type == 'string': diff --git a/src/calibre/gui2/preferences/device_user_defined.py b/src/calibre/gui2/preferences/device_user_defined.py index eb7b7886bf..ae963f61c1 100644 --- a/src/calibre/gui2/preferences/device_user_defined.py +++ b/src/calibre/gui2/preferences/device_user_defined.py @@ -7,6 +7,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' +import numbers from PyQt5.Qt import QDialog, QVBoxLayout, QPlainTextEdit, QTimer, \ QDialogButtonBox, QPushButton, QApplication, QIcon, QMessageBox @@ -63,7 +64,7 @@ class UserDefinedDevice(QDialog): res = '' if len(new_devices) == 1: def fmtid(x): - if isinstance(x, (int, long)): + if isinstance(x, numbers.Integral): x = hex(x) if not x.startswith('0x'): x = '0x' + x diff --git a/src/calibre/gui2/preferences/server.py b/src/calibre/gui2/preferences/server.py index 338a2b0d4d..3a565cb441 100644 --- a/src/calibre/gui2/preferences/server.py +++ b/src/calibre/gui2/preferences/server.py @@ -4,6 +4,7 @@ import errno import json +import numbers import os import sys import textwrap @@ -267,9 +268,9 @@ class AdvancedTab(QWidget): w = Choices elif isinstance(opt.default, bool): w = Bool - elif isinstance(opt.default, (int, long)): + elif isinstance(opt.default, numbers.Integral): w = Int - elif isinstance(opt.default, float): + elif isinstance(opt.default, numbers.Real): w = Float else: w = Text diff --git a/src/calibre/gui2/progress_indicator/__init__.py b/src/calibre/gui2/progress_indicator/__init__.py index 7444d1b158..951feea2c8 100644 --- a/src/calibre/gui2/progress_indicator/__init__.py +++ b/src/calibre/gui2/progress_indicator/__init__.py @@ -5,6 +5,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) +import numbers from PyQt5.Qt import ( Qt, QWidget, QSizePolicy, QSize, QRect, QConicalGradient, QPen, QBrush, QPainter, QTimer, QVBoxLayout, QLabel, QStackedWidget, QDialog, QStackedLayout @@ -93,7 +94,7 @@ class ProgressSpinner(QWidget): return self._size_hint def setSizeHint(self, val): - if isinstance(val, int): + if isinstance(val, numbers.Integral): val = QSize(val, val) self._size_hint = val self.update() diff --git a/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py b/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py index db3c67aa07..b866150b80 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py @@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' +import numbers from functools import partial from PyQt5.Qt import QTextBlockUserData @@ -48,7 +49,7 @@ def create_lexer(base_class): statestack.append(statestack[-1]) else: statestack.append(state) - elif isinstance(new_state, int): + elif isinstance(new_state, numbers.Integral): # pop del statestack[new_state:] elif new_state == '#push': diff --git a/src/calibre/gui2/tweak_book/preferences.py b/src/calibre/gui2/tweak_book/preferences.py index ac16fa8ea1..9ee6fe3cc5 100644 --- a/src/calibre/gui2/tweak_book/preferences.py +++ b/src/calibre/gui2/tweak_book/preferences.py @@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' +import numbers from operator import attrgetter, methodcaller from collections import namedtuple from polyglot.builtins import map, unicode_type, range @@ -50,8 +51,8 @@ class BasicSettings(QWidget): # {{{ getter = getter or methodcaller('isChecked') setter = setter or (lambda x, v: x.setChecked(v)) widget.toggled.connect(self.emit_changed) - elif isinstance(defval, (int, float)): - widget = (QSpinBox if isinstance(defval, int) else QDoubleSpinBox)(self) + elif isinstance(defval, numbers.Number): + widget = (QSpinBox if isinstance(defval, numbers.Integral) else QDoubleSpinBox)(self) getter = getter or methodcaller('value') setter = setter or (lambda x, v:x.setValue(v)) widget.valueChanged.connect(self.emit_changed) diff --git a/src/calibre/gui2/viewer/position.py b/src/calibre/gui2/viewer/position.py index 8e02683805..76bed35f27 100644 --- a/src/calibre/gui2/viewer/position.py +++ b/src/calibre/gui2/viewer/position.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import json, time +import json, time, numbers from PyQt5.Qt import QApplication, QEventLoop @@ -83,7 +83,7 @@ class PagePosition(object): self._cpos = None def to_pos(self, pos): - if isinstance(pos, (int, float)): + if isinstance(pos, numbers.Number): self.document.scroll_fraction = pos else: self.scroll_to_cfi(pos) diff --git a/src/calibre/library/catalogs/bibtex.py b/src/calibre/library/catalogs/bibtex.py index f22bcc8d5a..4a6e8a4e27 100644 --- a/src/calibre/library/catalogs/bibtex.py +++ b/src/calibre/library/catalogs/bibtex.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, codecs, os +import re, codecs, os, numbers from collections import namedtuple from types import StringType, UnicodeType @@ -143,7 +143,7 @@ class BIBTEX(CatalogPlugin): for field in fields: if field.startswith('#'): item = db.get_field(entry['id'],field,index_is_id=True) - if isinstance(item, (bool, float, int)): + if isinstance(item, (bool, numbers.Number)): item = repr(item) elif field == 'title_sort': item = entry['sort'] diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index ca14b24330..56e53ee91b 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import json, re +import json, re, numbers from functools import partial from calibre import prints, force_unicode @@ -346,7 +346,7 @@ class CustomColumns(object): series_id = self.conn.get('SELECT id from %s WHERE value=?'%table, (series,), all=False) if series_id is None: - if isinstance(tweaks['series_index_auto_increment'], (int, float)): + if isinstance(tweaks['series_index_auto_increment'], numbers.Number): return float(tweaks['series_index_auto_increment']) return 1.0 series_indices = self.conn.get(''' diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 59bf0e746c..fea0d5e5fc 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' The database used to store ebook metadata ''' import os, sys, shutil, cStringIO, glob, time, functools, traceback, re, \ - json, uuid, hashlib, copy, types + json, uuid, hashlib, copy, types, numbers from collections import defaultdict, namedtuple import threading, random from itertools import repeat @@ -2224,7 +2224,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): series_id = self.conn.get('SELECT id from series WHERE name=?', (series,), all=False) if series_id is None: - if isinstance(tweaks['series_index_auto_increment'], (int, float)): + if isinstance(tweaks['series_index_auto_increment'], numbers.Number): return float(tweaks['series_index_auto_increment']) return 1.0 series_indices = self.conn.get( diff --git a/src/calibre/srv/opts.py b/src/calibre/srv/opts.py index 7c5b3e9e8e..1216b06c6f 100644 --- a/src/calibre/srv/opts.py +++ b/src/calibre/srv/opts.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import errno, os +import errno, os, numbers from itertools import izip_longest from collections import namedtuple, OrderedDict from operator import attrgetter @@ -248,7 +248,7 @@ def opts_to_parser(usage): else: name = '--' + opt.name.replace('_', '-') otype = 'string' - if isinstance(opt.default, (int, long, float)): + if isinstance(opt.default, numbers.Number): otype = type(opt.default).__name__ add_option(name, type=otype) @@ -278,7 +278,7 @@ def parse_config_file(path=DEFAULT_CONFIG): val = rest if isinstance(opt.default, bool): val = val.lower() in ('true', 'yes', 'y') - elif isinstance(opt.default, (int, long, float)): + elif isinstance(opt.default, numbers.Number): try: val = type(opt.default)(rest) except Exception: diff --git a/src/calibre/srv/routes.py b/src/calibre/srv/routes.py index ab81b054bb..d2dad34078 100644 --- a/src/calibre/srv/routes.py +++ b/src/calibre/srv/routes.py @@ -141,7 +141,7 @@ class Route(object): if '{' in default or '}' in default: raise route_error('The characters {} are not allowed in default values') default = self.defaults[name] = eval(default) - if isinstance(default, (int, long, float)): + if isinstance(default, numbers.Number): self.type_checkers[name] = type(default) if is_sponge and not isinstance(default, type('')): raise route_error('Soak up path component must have a default value of string type') diff --git a/src/calibre/srv/tests/web_sockets.py b/src/calibre/srv/tests/web_sockets.py index bc16e86a55..c456d532ff 100644 --- a/src/calibre/srv/tests/web_sockets.py +++ b/src/calibre/srv/tests/web_sockets.py @@ -4,7 +4,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) -import socket, os, struct, errno +import socket, os, struct, errno, numbers from base64 import standard_b64encode from collections import deque, namedtuple from functools import partial @@ -16,7 +16,7 @@ from calibre.srv.web_socket import ( PING, PONG, PROTOCOL_ERROR, CONTINUATION, INCONSISTENT_DATA, CONTROL_CODES) from calibre.utils.monotonic import monotonic from calibre.utils.socket_inheritance import set_socket_inherit -from polyglot.builtins import range +from polyglot.builtins import range, unicode_type HANDSHAKE_STR = '''\ GET / HTTP/1.1\r @@ -183,11 +183,11 @@ class WebSocketTest(BaseTest): expected_messages, expected_controls = [], [] for ex in expected: - if isinstance(ex, type('')): + if isinstance(ex, unicode_type): ex = TEXT, ex elif isinstance(ex, bytes): ex = BINARY, ex - elif isinstance(ex, int): + elif isinstance(ex, numbers.Integral): ex = ex, b'' if ex[0] in CONTROL_CODES: expected_controls.append(ex) diff --git a/src/calibre/utils/Zeroconf.py b/src/calibre/utils/Zeroconf.py index 2d0c760279..c93231e731 100755 --- a/src/calibre/utils/Zeroconf.py +++ b/src/calibre/utils/Zeroconf.py @@ -87,6 +87,7 @@ import socket import threading import select import traceback +import numbers __all__ = ["Zeroconf", "ServiceInfo", "ServiceBrowser"] @@ -1138,7 +1139,7 @@ class ServiceInfo(object): suffix = '' elif isinstance(value, str): suffix = value - elif isinstance(value, int): + elif isinstance(value, numbers.Integral): suffix = value and 'true' or 'false' else: suffix = '' diff --git a/src/calibre/utils/chm/chm.py b/src/calibre/utils/chm/chm.py index 6c36d54ef7..eb0594879c 100644 --- a/src/calibre/utils/chm/chm.py +++ b/src/calibre/utils/chm/chm.py @@ -31,6 +31,7 @@ import struct import sys from calibre.constants import plugins +from polyglot.builtins import long_type chmlib, chmlib_err = plugins['chmlib'] if chmlib_err: @@ -401,7 +402,7 @@ class CHMFile: if start == -1: st = 0 else: - st = long(start) + st = long_type(start) return chmlib.chm_retrieve_object(self.file, ui, st, len) else: return (0, '') diff --git a/src/calibre/utils/config_base.py b/src/calibre/utils/config_base.py index 4362e741cc..a2ba0c793a 100644 --- a/src/calibre/utils/config_base.py +++ b/src/calibre/utils/config_base.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, re, cPickle, traceback +import os, re, cPickle, traceback, numbers from functools import partial from collections import defaultdict from copy import deepcopy @@ -37,7 +37,7 @@ class Option(object): if self.type is None and action is None and choices is None: if isinstance(default, float): self.type = 'float' - elif isinstance(default, int) and not isinstance(default, bool): + elif isinstance(default, numbers.Integral) and not isinstance(default, bool): self.type = 'int' self.choices = choices @@ -234,7 +234,7 @@ class OptionSet(object): def serialize_opt(self, val): if val is val is True or val is False or val is None or \ - isinstance(val, (int, float, long, bytes, unicode_type)): + isinstance(val, (numbers.Number, bytes, unicode_type)): return repr(val) pickle = cPickle.dumps(val, -1) return 'cPickle.loads(%s)'%repr(pickle) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 7644470377..5581d1eb16 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -8,7 +8,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, string, traceback +import re, string, traceback, numbers from calibre import prints from calibre.constants import DEBUG @@ -271,7 +271,7 @@ class TemplateFormatter(string.Formatter): def format_field(self, val, fmt): # ensure we are dealing with a string. - if isinstance(val, (int, float)): + if isinstance(val, numbers.Number): if val: val = unicode_type(val) else: diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index e8a54c6f4f..305db5bcc4 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -12,7 +12,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import inspect, re, traceback +import inspect, re, traceback, numbers from math import trunc from calibre import human_readable @@ -136,7 +136,7 @@ class FormatterFunction(object): return ret if isinstance(ret, list): return ','.join(ret) - if isinstance(ret, (int, float, bool)): + if isinstance(ret, (numbers.Number, bool)): return unicode_type(ret) diff --git a/src/calibre/utils/rss_gen.py b/src/calibre/utils/rss_gen.py index f4419234f7..407c39240b 100644 --- a/src/calibre/utils/rss_gen.py +++ b/src/calibre/utils/rss_gen.py @@ -6,7 +6,7 @@ __author__ = "Andrew Dalke " _generator_name = __name__ + "-" + ".".join(map(str, __version__)) -import datetime +import datetime, numbers from polyglot.builtins import string_or_bytes # Could make this the base class; will need to add 'publish' @@ -166,12 +166,12 @@ class Image: _element(handler, "link", self.link) width = self.width - if isinstance(width, int): + if isinstance(width, numbers.Integral): width = IntElement("width", width) _opt_element(handler, "width", width) height = self.height - if isinstance(height, int): + if isinstance(height, numbers.Integral): height = IntElement("height", height) _opt_element(handler, "height", height) @@ -385,7 +385,7 @@ class RSS2(WriteXmlMixin): self.cloud.publish(handler) ttl = self.ttl - if isinstance(self.ttl, int): + if isinstance(self.ttl, numbers.Integral): ttl = IntElement("ttl", ttl) _opt_element(handler, "tt", ttl) diff --git a/src/calibre/utils/winreg/dde.py b/src/calibre/utils/winreg/dde.py index 54a99c059d..3ec48e0f28 100644 --- a/src/calibre/utils/winreg/dde.py +++ b/src/calibre/utils/winreg/dde.py @@ -6,6 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' +import numbers from ctypes import POINTER, WINFUNCTYPE, c_void_p, c_ulong, c_char_p, windll, byref from ctypes.wintypes import BOOL, DWORD, LPCWSTR, UINT @@ -87,10 +88,11 @@ def dde_error(instance): def default_errcheck(result, func, args): - if (isinstance(result, (int, long)) and result == 0) or (getattr(result, 'value', False) is None): + if (isinstance(result, numbers.Integral) and result == 0) or (getattr(result, 'value', False) is None): dde_error(args[0]) return args + null = object() @@ -111,6 +113,7 @@ def cwrap(name, restype, *args, **kw): func.errcheck=kw.get('errcheck', default_errcheck) return func + GetLastError = cwrap('DdeGetLastError', UINT, a('instance', DWORD), errcheck=no_errcheck) Initialize = cwrap('DdeInitializeW', UINT, a('instance_p', LPDWORD), a('callback', DDECALLBACK), a('command', DWORD), @@ -147,5 +150,6 @@ def send_dde_command(service, topic, command): Disconnect(conversation) Uninitialize(instance) + if __name__ == '__main__': send_dde_command('WinWord', 'System', '[REM_DDE_Direct][FileOpen("C:/cygwin64/home/kovid/demo.docx")]') diff --git a/src/calibre/utils/winreg/lib.py b/src/calibre/utils/winreg/lib.py index 3393bc09f3..741f470deb 100644 --- a/src/calibre/utils/winreg/lib.py +++ b/src/calibre/utils/winreg/lib.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import ctypes, ctypes.wintypes as types, _winreg as winreg, struct, datetime +import ctypes, ctypes.wintypes as types, _winreg as winreg, struct, datetime, numbers import winerror, win32con # Binding to C library {{{ @@ -112,7 +112,7 @@ def convert_to_registry_data(value, has_expansions=False): if isinstance(value, (list, tuple)): buf = ctypes.create_unicode_buffer('\0'.join(map(type(''), value)) + '\0\0') return buf, winreg.REG_MULTI_SZ, len(buf) * 2 - if isinstance(value, (int, long)): + if isinstance(value, numbers.Integral): try: raw, dtype = struct.pack(str('L'), value), winreg.REG_DWORD except struct.error: diff --git a/src/polyglot/builtins.py b/src/polyglot/builtins.py index 5209ef698a..96c226b182 100644 --- a/src/polyglot/builtins.py +++ b/src/polyglot/builtins.py @@ -30,6 +30,7 @@ if is_py3: codepoint_to_chr = chr unicode_type = str string_or_bytes = str, bytes + long_type = int def iteritems(d): return iter(d.items()) @@ -59,6 +60,7 @@ else: codepoint_to_chr = unichr unicode_type = unicode string_or_bytes = unicode, bytes + long_type = long def iteritems(d): return d.iteritems()