Simplified code by removing support for Python 2, leaving only support for Python 3.

pull/85/head
Project Nayuki 5 years ago
parent 71c75cfeb0
commit f93ce5217e

@ -1,5 +1,5 @@
# #
# QR Code generator batch test (Python 3) # QR Code generator batch test (Python)
# #
# Runs various versions of the QR Code generator test worker as subprocesses, # Runs various versions of the QR Code generator test worker as subprocesses,
# feeds each one the same random input, and compares their output for equality. # feeds each one the same random input, and compares their output for equality.
@ -25,13 +25,10 @@
# #
import itertools, random, subprocess, sys, time import itertools, random, subprocess, sys, time
if sys.version_info.major < 3:
raise RuntimeError("Requires Python 3+")
CHILD_PROGRAMS = [ CHILD_PROGRAMS = [
["python2", "-B", "../python/qrcodegen-worker.py"], # Python 2 program ["python3", "-B", "../python/qrcodegen-worker.py"], # Python program
["python3", "-B", "../python/qrcodegen-worker.py"], # Python 3 program
["java", "-cp", "../java/src/main/java", "-ea:io.nayuki.qrcodegen...", "io/nayuki/qrcodegen/QrCodeGeneratorWorker"], # Java program ["java", "-cp", "../java/src/main/java", "-ea:io.nayuki.qrcodegen...", "io/nayuki/qrcodegen/QrCodeGeneratorWorker"], # Java program
["node", "../typescript-javascript/qrcodegen-worker.js"], # TypeScript program ["node", "../typescript-javascript/qrcodegen-worker.js"], # TypeScript program
["../c/qrcodegen-worker"], # C program ["../c/qrcodegen-worker"], # C program

@ -1,5 +1,5 @@
# #
# QR Code generator demo (Python 2, 3) # QR Code generator demo (Python)
# #
# Run this command-line program with no arguments. The program computes a bunch of demonstration # Run this command-line program with no arguments. The program computes a bunch of demonstration
# QR Codes and prints them to the console. Also, the SVG code for one QR Code is printed as a sample. # QR Codes and prints them to the console. Also, the SVG code for one QR Code is printed as a sample.
@ -24,7 +24,6 @@
# Software. # Software.
# #
from __future__ import print_function
from qrcodegen import QrCode, QrSegment from qrcodegen import QrCode, QrSegment
@ -41,7 +40,7 @@ def main():
def do_basic_demo(): def do_basic_demo():
"""Creates a single QR Code, then prints it to the console.""" """Creates a single QR Code, then prints it to the console."""
text = u"Hello, world!" # User-supplied Unicode text text = "Hello, world!" # User-supplied Unicode text
errcorlvl = QrCode.Ecc.LOW # Error correction level errcorlvl = QrCode.Ecc.LOW # Error correction level
# Make and print the QR Code symbol # Make and print the QR Code symbol
@ -62,7 +61,7 @@ def do_variety_demo():
print_qr(qr) print_qr(qr)
# Unicode text as UTF-8 # Unicode text as UTF-8
qr = QrCode.encode_text(u"\u3053\u3093\u306B\u3061\u0077\u0061\u3001\u4E16\u754C\uFF01\u0020\u03B1\u03B2\u03B3\u03B4", QrCode.Ecc.QUARTILE) qr = QrCode.encode_text("\u3053\u3093\u306B\u3061\u0077\u0061\u3001\u4E16\u754C\uFF01\u0020\u03B1\u03B2\u03B3\u03B4", QrCode.Ecc.QUARTILE)
print_qr(qr) print_qr(qr)
# Moderately large QR Code using longer text (from Lewis Carroll's Alice in Wonderland) # Moderately large QR Code using longer text (from Lewis Carroll's Alice in Wonderland)
@ -93,9 +92,9 @@ def do_segment_demo():
print_qr(qr) print_qr(qr)
# Illustration "golden" # Illustration "golden"
golden0 = u"Golden ratio \u03C6 = 1." golden0 = "Golden ratio \u03C6 = 1."
golden1 = u"6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374" golden1 = "6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374"
golden2 = u"......" golden2 = "......"
qr = QrCode.encode_text(golden0 + golden1 + golden2, QrCode.Ecc.LOW) qr = QrCode.encode_text(golden0 + golden1 + golden2, QrCode.Ecc.LOW)
print_qr(qr) print_qr(qr)
@ -107,7 +106,7 @@ def do_segment_demo():
print_qr(qr) print_qr(qr)
# Illustration "Madoka": kanji, kana, Cyrillic, full-width Latin, Greek characters # Illustration "Madoka": kanji, kana, Cyrillic, full-width Latin, Greek characters
madoka = u"\u300C\u9B54\u6CD5\u5C11\u5973\u307E\u3069\u304B\u2606\u30DE\u30AE\u30AB\u300D\u3063\u3066\u3001\u3000\u0418\u0410\u0418\u3000\uFF44\uFF45\uFF53\uFF55\u3000\u03BA\u03B1\uFF1F" madoka = "\u300C\u9B54\u6CD5\u5C11\u5973\u307E\u3069\u304B\u2606\u30DE\u30AE\u30AB\u300D\u3063\u3066\u3001\u3000\u0418\u0410\u0418\u3000\uFF44\uFF45\uFF53\uFF55\u3000\u03BA\u03B1\uFF1F"
qr = QrCode.encode_text(madoka, QrCode.Ecc.LOW) qr = QrCode.encode_text(madoka, QrCode.Ecc.LOW)
print_qr(qr) print_qr(qr)
@ -157,11 +156,11 @@ def do_mask_demo():
# Chinese text as UTF-8 # Chinese text as UTF-8
segs = QrSegment.make_segments( segs = QrSegment.make_segments(
u"\u7DAD\u57FA\u767E\u79D1\uFF08\u0057\u0069\u006B\u0069\u0070\u0065\u0064\u0069\u0061\uFF0C" "\u7DAD\u57FA\u767E\u79D1\uFF08\u0057\u0069\u006B\u0069\u0070\u0065\u0064\u0069\u0061\uFF0C"
"\u8046\u807D\u0069\u002F\u02CC\u0077\u026A\u006B\u1D7B\u02C8\u0070\u0069\u02D0\u0064\u0069" "\u8046\u807D\u0069\u002F\u02CC\u0077\u026A\u006B\u1D7B\u02C8\u0070\u0069\u02D0\u0064\u0069"
"\u002E\u0259\u002F\uFF09\u662F\u4E00\u500B\u81EA\u7531\u5167\u5BB9\u3001\u516C\u958B\u7DE8" "\u002E\u0259\u002F\uFF09\u662F\u4E00\u500B\u81EA\u7531\u5167\u5BB9\u3001\u516C\u958B\u7DE8"
"\u8F2F\u4E14\u591A\u8A9E\u8A00\u7684\u7DB2\u8DEF\u767E\u79D1\u5168\u66F8\u5354\u4F5C\u8A08" "\u8F2F\u4E14\u591A\u8A9E\u8A00\u7684\u7DB2\u8DEF\u767E\u79D1\u5168\u66F8\u5354\u4F5C\u8A08"
"\u756B") "\u756B")
print_qr(QrCode.encode_segments(segs, QrCode.Ecc.MEDIUM, mask=0)) # Force mask 0 print_qr(QrCode.encode_segments(segs, QrCode.Ecc.MEDIUM, mask=0)) # Force mask 0
print_qr(QrCode.encode_segments(segs, QrCode.Ecc.MEDIUM, mask=1)) # Force mask 1 print_qr(QrCode.encode_segments(segs, QrCode.Ecc.MEDIUM, mask=1)) # Force mask 1
print_qr(QrCode.encode_segments(segs, QrCode.Ecc.MEDIUM, mask=5)) # Force mask 5 print_qr(QrCode.encode_segments(segs, QrCode.Ecc.MEDIUM, mask=5)) # Force mask 5
@ -176,7 +175,7 @@ def print_qr(qrcode):
border = 4 border = 4
for y in range(-border, qrcode.get_size() + border): for y in range(-border, qrcode.get_size() + border):
for x in range(-border, qrcode.get_size() + border): for x in range(-border, qrcode.get_size() + border):
print(u"\u2588 "[1 if qrcode.get_module(x,y) else 0] * 2, end="") print("\u2588 "[1 if qrcode.get_module(x,y) else 0] * 2, end="")
print() print()
print() print()

@ -1,5 +1,5 @@
# #
# QR Code generator test worker (Python 2, 3) # QR Code generator test worker (Python)
# #
# This program reads data and encoding parameters from standard input and writes # This program reads data and encoding parameters from standard input and writes
# QR Code bitmaps to standard output. The I/O format is one integer per line. # QR Code bitmaps to standard output. The I/O format is one integer per line.
@ -28,11 +28,10 @@
import sys import sys
import qrcodegen import qrcodegen
py3 = sys.version_info.major >= 3
def read_int(): def read_int():
return int((input if py3 else raw_input)()) return int(input())
def main(): def main():

@ -1,5 +1,5 @@
# #
# QR Code generator library (Python 2, 3) # QR Code generator library (Python)
# #
# Copyright (c) Project Nayuki. (MIT License) # Copyright (c) Project Nayuki. (MIT License)
# https://www.nayuki.io/page/qr-code-generator-library # https://www.nayuki.io/page/qr-code-generator-library
@ -21,7 +21,7 @@
# Software. # Software.
# #
import collections, itertools, re, sys import collections, itertools, re
""" """
@ -60,7 +60,7 @@ This module "qrcodegen", public members:
# ---- QR Code symbol class ---- # ---- QR Code symbol class ----
class QrCode(object): class QrCode:
"""A QR Code symbol, which is a type of two-dimension barcode. """A QR Code symbol, which is a type of two-dimension barcode.
Invented by Denso Wave and described in the ISO/IEC 18004 standard. Invented by Denso Wave and described in the ISO/IEC 18004 standard.
Instances of this class represent an immutable square grid of black and white cells. Instances of this class represent an immutable square grid of black and white cells.
@ -678,7 +678,7 @@ class QrCode(object):
# ---- Public helper enumeration ---- # ---- Public helper enumeration ----
class Ecc(object): class Ecc:
"""The error correction level in a QR Code symbol. Immutable.""" """The error correction level in a QR Code symbol. Immutable."""
# Private constructor # Private constructor
def __init__(self, i, fb): def __init__(self, i, fb):
@ -695,7 +695,7 @@ class QrCode(object):
# ---- Data segment class ---- # ---- Data segment class ----
class QrSegment(object): class QrSegment:
"""A segment of character/binary/control data in a QR Code symbol. """A segment of character/binary/control data in a QR Code symbol.
Instances of this class are immutable. Instances of this class are immutable.
The mid-level way to create a segment is to take the payload data The mid-level way to create a segment is to take the payload data
@ -713,11 +713,8 @@ class QrSegment(object):
"""Returns a segment representing the given binary data encoded in byte mode. """Returns a segment representing the given binary data encoded in byte mode.
All input byte lists are acceptable. Any text string can be converted to All input byte lists are acceptable. Any text string can be converted to
UTF-8 bytes (s.encode("UTF-8")) and encoded as a byte mode segment.""" UTF-8 bytes (s.encode("UTF-8")) and encoded as a byte mode segment."""
py3 = sys.version_info.major >= 3 if isinstance(data, str):
if (py3 and isinstance(data, str)) or (not py3 and isinstance(data, unicode)):
raise TypeError("Byte string/list expected") raise TypeError("Byte string/list expected")
if not py3 and isinstance(data, str):
data = bytearray(data)
bb = _BitBuffer() bb = _BitBuffer()
for b in data: for b in data:
bb.append_bits(b, 8) bb.append_bits(b, 8)
@ -759,7 +756,7 @@ class QrSegment(object):
def make_segments(text): def make_segments(text):
"""Returns a new mutable list of zero or more segments to represent the given Unicode text string. """Returns a new mutable list of zero or more segments to represent the given Unicode text string.
The result may use various segment modes and switch modes to optimize the length of the bit stream.""" The result may use various segment modes and switch modes to optimize the length of the bit stream."""
if not (isinstance(text, str) or (sys.version_info.major < 3 and isinstance(text, unicode))): if not isinstance(text, str):
raise TypeError("Text string expected") raise TypeError("Text string expected")
# Select the most efficient segment encoding automatically # Select the most efficient segment encoding automatically
@ -867,7 +864,7 @@ class QrSegment(object):
# ---- Public helper enumeration ---- # ---- Public helper enumeration ----
class Mode(object): class Mode:
"""Describes how a segment's data bits are interpreted. Immutable.""" """Describes how a segment's data bits are interpreted. Immutable."""
# Private constructor # Private constructor

@ -1,5 +1,5 @@
# #
# QR Code generator Distutils script (Python 2, 3) # QR Code generator Distutils script (Python)
# #
# Copyright (c) Project Nayuki. (MIT License) # Copyright (c) Project Nayuki. (MIT License)
# https://www.nayuki.io/page/qr-code-generator-library # https://www.nayuki.io/page/qr-code-generator-library
@ -26,7 +26,7 @@ import setuptools
setuptools.setup( setuptools.setup(
name = "qrcodegen", name = "qrcodegen",
description = "High quality QR Code generator library for Python 2 and 3", description = "High quality QR Code generator library for Python",
version = "1.6.0", version = "1.6.0",
platforms = "OS Independent", platforms = "OS Independent",
license = "MIT License", license = "MIT License",
@ -42,7 +42,6 @@ setuptools.setup(
"License :: OSI Approved :: MIT License", "License :: OSI Approved :: MIT License",
"Operating System :: OS Independent", "Operating System :: OS Independent",
"Programming Language :: Python", "Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics",
"Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Libraries :: Python Modules",

Loading…
Cancel
Save