Skip to content

Commit

Permalink
Merge pull request python-escpos#298 from python-escpos/development
Browse files Browse the repository at this point in the history
release v3.0a4
  • Loading branch information
patkan authored May 15, 2018
2 parents d1e7052 + 854759d commit 0051c87
Show file tree
Hide file tree
Showing 17 changed files with 141 additions and 64 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ dist/
.coverage
src/escpos/version.py
.hypothesis
.pytest_cache/

# testing temporary directories
test/test-cli-output/
Expand Down
1 change: 1 addition & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[submodule "capabilities-data"]
path = capabilities-data
url = https://github.com/receipt-print-hq/escpos-printer-db.git
branch = master
2 changes: 2 additions & 0 deletions .mailmap
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ Cody (Quantified Code Bot) <[email protected]> Cody <[email protected]
Renato Lorenzi <[email protected]> Renato.Lorenzi <[email protected]>
Ahmed Tahri <[email protected]> TAHRI Ahmed <[email protected]>
Michael Elsdörfer <[email protected]> Michael Elsdörfer <[email protected]>
Juanmi Taboada <[email protected]> Juanmi Taboada <[email protected]>
csoft2k <[email protected]>
Sergio Pulgarin <[email protected]>
reck31 <[email protected]>
10 changes: 7 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ addons:
apt:
packages:
- graphviz
env:
global:
- ESCPOS_CAPABILITIES_FILE=/home/travis/build/python-escpos/python-escpos/capabilities-data/dist/capabilities.json
matrix:
include:
- python: 2.7
env: TOXENV=py27
- python: 3.3
env: TOXENV=py33
- python: 3.4
env: TOXENV=py34
- python: 3.5
Expand All @@ -21,6 +22,8 @@ matrix:
env: TOXENV=py36
- python: 3.6-dev
env: TOXENV=py36
- python: 3.7-dev
env: TOXENV=py37
- python: nightly
env: TOXENV=py37
- python: pypy
Expand All @@ -35,6 +38,7 @@ matrix:
env: TOXENV=flake8
allow_failures:
- python: 3.6-dev
- python: 3.7-dev
- python: nightly
- python: pypy3
before_install:
Expand All @@ -59,4 +63,4 @@ deploy:
tags: true
repo: python-escpos/python-escpos
branch: master
condition: $TRAVIS_PYTHON_VERSION = "3.5"
condition: $TRAVIS_PYTHON_VERSION = "3.6"
3 changes: 3 additions & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Dean Rispin
Dmytro Katyukha
Hark
Joel Lehtonen
kennedy
Kristi
ldos
Lucy Linder
Expand All @@ -19,7 +20,9 @@ Michael Elsdörfer
mrwunderbar666
Nathan Bookham
Patrick Kanzler
primax79
Qian Linfeng
reck31
Renato Lorenzi
Romain Porte
Sam Cheng
Expand Down
24 changes: 24 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,30 @@
*********
Changelog
*********
2018-05-15 - Version 3.0a4 - "Kakistocrat"
------------------------------------------
This release is the fifth alpha release of the new version 3.0. Please
be aware that the API will still change until v3.0 is released.

changes
^^^^^^^
- raise exception when TypeError occurs in cashdraw (#268)
- Feature/clear content in dummy printer (#271)
- fix is_online() (#282)
- improve documentation
- Modified submodule to always pull from master branch (#283)
- parameter for implementation of nonnative qrcode (#289)
- improve platform independence (#296)

contributors
^^^^^^^^^^^^
- Christoph Heuel
- Patrick Kanzler
- kennedy
- primax79
- reck31
- Thijs Triemstra

2017-10-08 - Version 3.0a3 - "Just Testing"
-------------------------------------------
This release is the fourth alpha release of the new version 3.0. Please
Expand Down
34 changes: 2 additions & 32 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import os
import sys
from setuptools import find_packages, setup
from setuptools.command.test import test as test_command


base_dir = os.path.dirname(__file__)
Expand All @@ -19,33 +18,6 @@ def read(fname):
return open(os.path.join(os.path.dirname(__file__), fname)).read()


class Tox(test_command):
"""proxy class that enables tox to be run with setup.py test"""
user_options = [('tox-args=', 'a', "Arguments to pass to tox")]

def initialize_options(self):
"""initialize the user-options"""
test_command.initialize_options(self)
self.tox_args = None

def finalize_options(self):
"""finalize user-options"""
test_command.finalize_options(self)
self.test_args = []
self.test_suite = True

def run_tests(self):
"""run tox and pass on user-options"""
# import here, cause outside the eggs aren't loaded
import tox
import shlex
args = self.tox_args
if args:
args = shlex.split(self.tox_args)
errno = tox.cmdline(args=args)
sys.exit(errno)


setuptools_scm_template = """\
# coding: utf-8
# file generated by setuptools_scm
Expand Down Expand Up @@ -96,7 +68,6 @@ def run_tests(self):
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
Expand Down Expand Up @@ -125,16 +96,15 @@ def run_tests(self):
tests_require=[
'jaconv',
'tox',
'pytest!=3.2.0',
'pytest!=3.2.0,!=3.3.0',
'pytest-cov',
'pytest-mock',
'nose',
'scripttest',
'mock',
'hypothesis',
'hypothesis!=3.56.9',
'flake8'
],
cmdclass={'test': Tox},
entry_points={
'console_scripts': [
'python-escpos = escpos.cli:main'
Expand Down
11 changes: 6 additions & 5 deletions src/escpos/capabilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
import six
import yaml

from tempfile import gettempdir
import platform

logging.basicConfig()
logger = logging.getLogger(__name__)


pickle_dir = environ.get('ESCPOS_CAPABILITIES_PICKLE_DIR', '/tmp/')
pickle_path = path.join(pickle_dir, 'capabilities.pickle')
pickle_dir = environ.get('ESCPOS_CAPABILITIES_PICKLE_DIR', gettempdir())
pickle_path = path.join(pickle_dir, '{v}.capabilities.pickle'.format(v=platform.python_version()))
capabilities_path = environ.get(
'ESCPOS_CAPABILITIES_FILE',
path.join(path.dirname(__file__), 'capabilities.json'))
Expand Down Expand Up @@ -47,7 +48,7 @@


class NotSupported(Exception):
"""Raised if a requested feature is not suppored by the
"""Raised if a requested feature is not supported by the
printer profile.
"""
pass
Expand Down Expand Up @@ -90,7 +91,7 @@ def supports(self, feature):
return self.features.get(feature)

def get_code_pages(self):
"""Return the support code pages as a {name: index} dict.
"""Return the support code pages as a ``{name: index}`` dict.
"""
return {v: k for k, v in self.codePages.items()}

Expand Down
55 changes: 35 additions & 20 deletions src/escpos/escpos.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import barcode
from barcode.writer import ImageWriter

import os

from .constants import ESC, GS, NUL, QR_ECLEVEL_L, QR_ECLEVEL_M, QR_ECLEVEL_H, QR_ECLEVEL_Q
from .constants import QR_MODEL_1, QR_MODEL_2, QR_MICRO, BARCODE_TYPES, BARCODE_HEIGHT, BARCODE_WIDTH
from .constants import BARCODE_FONT_A, BARCODE_FONT_B, BARCODE_FORMATS
Expand Down Expand Up @@ -180,7 +182,7 @@ def _image_send_graphics_data(self, m, fn, data):
self._raw(GS + b'(L' + header + m + fn + data)

def qr(self, content, ec=QR_ECLEVEL_L, size=3, model=QR_MODEL_2,
native=False, center=False):
native=False, center=False, impl="bitImageRaster"):
""" Print QR Code for the provided string
:param content: The content of the code. Numeric data will be more efficiently compacted.
Expand Down Expand Up @@ -222,7 +224,7 @@ def qr(self, content, ec=QR_ECLEVEL_L, size=3, model=QR_MODEL_2,

# Convert the RGB image in printable image
self.text('\n')
self.image(im, center=center)
self.image(im, center=center, impl=impl)
self.text('\n')
self.text('\n')
return
Expand Down Expand Up @@ -487,11 +489,12 @@ def soft_barcode(self, barcode_type, data, impl='bitImageColumn',
barcode_class = barcode.get_barcode_class(barcode_type)
my_code = barcode_class(data, writer=image_writer)

my_code.write("/dev/null", {
'module_height': module_height,
'module_width': module_width,
'text_distance': text_distance
})
with open(os.devnull, "wb") as nullfile:
my_code.write(nullfile, {
'module_height': module_height,
'module_width': module_width,
'text_distance': text_distance
})

# Retrieve the Pillow image and print it
image = my_code.writer._image
Expand Down Expand Up @@ -697,8 +700,8 @@ def cashdraw(self, pin):
else:
try:
self._raw(CD_KICK_DEC_SEQUENCE(*pin))
except:
raise CashDrawerError()
except TypeError as err:
raise CashDrawerError(err)

def linedisplay_select(self, select_display=False):
""" Selects the line display or the printer
Expand Down Expand Up @@ -728,6 +731,7 @@ def linedisplay(self, text):
You should connect a line display to your printer. You can do this by daisy-chaining
the display between your computer and printer.
:param text: Text to display
"""
self.linedisplay_select(select_display=True)
Expand Down Expand Up @@ -827,30 +831,41 @@ def panel_buttons(self, enable=True):
self._raw(PANEL_BUTTON_OFF)

def query_status(self, mode):
""" Queries the printer for its status, and returns an array of integers containing it.
"""
Queries the printer for its status, and returns an array of integers containing it.
:param mode: Integer that sets the status mode queried to the printer.
RT_STATUS_ONLINE: Printer status.
RT_STATUS_PAPER: Paper sensor.
:rtype: array(integer)"""
- RT_STATUS_ONLINE: Printer status.
- RT_STATUS_PAPER: Paper sensor.
:rtype: array(integer)
"""
self._raw(mode)
time.sleep(1)
status = self._read()
return status

def is_online(self):
""" Queries the printer its online status.
When online, returns True; False otherwise.
:rtype: bool: True if online, False if offline."""
"""
Queries the online status of the printer.
:returns: When online, returns ``True``; ``False`` otherwise.
:rtype: bool
"""
status = self.query_status(RT_STATUS_ONLINE)
if len(status) == 0:
return False
return not (status & RT_MASK_ONLINE)
return not (status[0] & RT_MASK_ONLINE)

def paper_status(self):
""" Queries the printer its paper status.
"""
Queries the paper status of the printer.
Returns 2 if there is plenty of paper, 1 if the paper has arrived to
the near-end sensor and 0 if there is no paper.
:rtype: int: 2: Paper is adequate. 1: Paper ending. 0: No paper."""
:returns: 2: Paper is adequate. 1: Paper ending. 0: No paper.
:rtype: int
"""
status = self.query_status(RT_STATUS_PAPER)
if len(status) == 0:
return 2
Expand All @@ -866,7 +881,7 @@ class EscposIO(object):
"""ESC/POS Printer IO object
Allows the class to be used together with the `with`-statement. You have to define a printer instance
and assign it to the EsposIO-class.
and assign it to the EscposIO class.
This example explains the usage:
.. code-block:: Python
Expand Down
8 changes: 8 additions & 0 deletions src/escpos/printer.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,5 +312,13 @@ def output(self):
""" Get the data that was sent to this printer """
return b''.join(self._output_list)

def clear(self):
""" Clear the buffer of the printer
This method can be called if you send the contents to a physical printer
and want to use the Dummy printer for new output.
"""
del self._output_list[:]

def close(self):
pass
19 changes: 19 additions & 0 deletions test/test_function_cashdraw.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/python
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import escpos.printer as printer
from escpos.exceptions import CashDrawerError
import pytest


def test_raise_CashDrawerError():
"""should raise an error if the sequence is invalid.
"""
instance = printer.Dummy()
with pytest.raises(CashDrawerError):
# call with sequence that is too long
instance.cashdraw([1,1,1,1,1,1])

8 changes: 8 additions & 0 deletions test/test_function_dummy_clear.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from nose.tools import assert_raises
from escpos.printer import Dummy

def test_printer_dummy_clear():
printer = Dummy()
printer.text("Hello")
printer.clear()
assert(printer.output == b'')
3 changes: 2 additions & 1 deletion test/test_function_qr_native.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ def test_invalid_model():
instance.qr("1234", native=True, model="Hello")


@pytest.mark.skip("this test has to be debugged")
def test_image():
"""Test QR as image"""
instance = printer.Dummy()
Expand Down Expand Up @@ -109,4 +110,4 @@ def instance():

def test_center_not_implementer(instance):
with pytest.raises(NotImplementedError):
instance.qr("test", center=True, native=True)
instance.qr("test", center=True, native=True)
Loading

0 comments on commit 0051c87

Please sign in to comment.