1
0
mirror of https://github.com/python-escpos/python-escpos synced 2025-09-13 09:09:58 +00:00

17 Commits

Author SHA1 Message Date
Patrick Kanzler
11452034a3 Merge pull request #157 from python-escpos/development
v2.1.2
2016-08-02 16:32:19 +02:00
Patrick Kanzler
d2e2ea88a6 doc write changelog for version v2.1.2 2016-08-02 16:07:05 +02:00
Patrick Kanzler
2416303805 Merge pull request #156 from python-escpos/fix/code128-printing
fix printing of CODE128
2016-08-02 15:57:52 +02:00
Patrick Kanzler
38f9835931 fix printing of CODE128
The control sequence {A or {B or {C can't be part of the qr code.
For this the user has to supply this sequence.
2016-08-02 15:39:31 +02:00
Patrick Kanzler
7c732ee615 doc fix lists 2016-08-02 04:38:04 +02:00
Patrick Kanzler
3d98eb8b9c fix file-printer did not flush
The file-printer did not automatically flush and thus behaved
differently to the other printer-classes.
Now the default behaviour is to flush after every call of _raw(). This
can be disabled by calling the file-printer with auto_flush=False.

fixes #106
2016-08-02 04:25:54 +02:00
Patrick Kanzler
619d80a867 doc add changelog-stump for post-2.1.1 release 2016-08-02 00:45:36 +02:00
Patrick Kanzler
d3f74ced5d doc update changelog for release v2.1.1 2016-08-02 00:41:10 +02:00
Patrick Kanzler
0524b0576e Merge pull request #154 from python-escpos/development
release v2.1.1
2016-08-02 00:39:06 +02:00
Patrick Kanzler
c92d4463ae update changelog 2016-08-02 00:27:08 +02:00
Patrick Kanzler
6e74748773 Merge pull request #153 from python-escpos/improve/add-hypothesis-support
Improve/add hypothesis support
2016-08-02 00:25:00 +02:00
Patrick Kanzler
a2e188cecf move pypy3 to the allowed failures and add hypothesis
pypy3 is not compatible with hypothesis, which is needed for testing
2016-08-02 00:10:39 +02:00
Patrick Kanzler
c1a6da9aaa configure codecov.io
For $reasons codecov.io stopped working. Now with my account explicitly
set as "bot" it works again.
2016-08-02 00:10:39 +02:00
Patrick Kanzler
37baf5cd34 update changelog 2016-08-01 23:59:46 +02:00
Patrick Kanzler
5c209dd557 Merge pull request #151 from Renato-Lorenzi/improve/rename-interface-to-timeout
Change the interface param to timeout
2016-08-01 23:54:35 +02:00
Renato.Lorenzi
bef1a9cccf Change the interface param to timeout 2016-08-01 09:36:48 -03:00
Patrick Kanzler
042f945a09 doc added stump for next release 2016-07-23 14:57:24 +02:00
13 changed files with 164 additions and 11 deletions

1
.gitignore vendored
View File

@@ -18,6 +18,7 @@ build/
dist/
.coverage
src/escpos/version.py
.hypothesis
# testing temporary directories
test/test-cli-output/

View File

@@ -28,6 +28,7 @@ matrix:
allow_failures:
- python: 3.5-dev
- python: nightly
- python: pypy3
before_install:
- pip install tox codecov
script:

View File

@@ -1,6 +1,31 @@
*********
Changelog
*********
2016-08-02 - Version 2.1.2 - "Death and Gravity"
------------------------------------------------
changes
^^^^^^^
- fix File-printer: flush after every call of _raw()
- fix lists in documentation
- fix CODE128: by adding the control character to the barcode-selection-sequence the barcode became unusable
contributors
^^^^^^^^^^^^
- Patrick Kanzler
2016-08-02 - Version 2.1.1 - "Contents May Differ"
--------------------------------------------------
changes
^^^^^^^
- rename variable interface in USB-class to timeout
- add support for hypothesis and move pypy3 to the allowed failures (pypy3 is not supported by hypothesis)
contributors
^^^^^^^^^^^^
- Patrick Kanzler
- Renato Lorenzi
2016-07-23 - Version 2.1.0 - "But Who's Counting?"
--------------------------------------------------

View File

@@ -1,4 +1,16 @@
codecov:
bot: patkan
coverage:
status:
project:
default: # status context
target: auto
threshold: "1%"
patch:
default:
target: auto
threshold: "1%"
range: "60...100"
comment: off

View File

@@ -18,6 +18,7 @@ Content
user/raspi
user/todo
user/usage
user/barcode
.. toctree::
:maxdepth: 1

34
doc/user/barcode.rst Normal file
View File

@@ -0,0 +1,34 @@
Printing Barcodes
-----------------
:Last Reviewed: 2016-07-31
Most ESC/POS-printers implement barcode-printing.
The barcode-commandset is implemented in the barcode-method.
For a list of compatible barcodes you should check the manual of your printer.
As a rule of thumb: even older Epson-models support most 1D-barcodes.
To be sure just try some implementations and have a look at the notices below.
barcode-method
~~~~~~~~~~~~~~
The barcode-method is rather low-level and orients itself on the implementation of ESC/POS.
In the future this class could be supplemented by a high-level class that helps the user generating the payload.
.. py:currentmodule:: escpos.escpos
.. automethod:: Escpos.barcode
:noindex:
CODE128
~~~~~~~
Code128 barcodes need a certain format.
For now the user has to make sure that the payload is correct.
For alphanumeric CODE128 you have to preface your payload with `{B`.
.. code-block:: Python
from escpos.printer import Dummy, Serial
p = Serial()
# print CODE128 012ABCDabcd
p.barcode("{B012ABCDabcd", "CODE128", function_type="B")
A very good description on CODE128 is also on `Wikipedia <https://en.wikipedia.org/wiki/Code_128>`_.

View File

@@ -88,6 +88,7 @@ set("align", "font", "type", width, height, invert, smooth, flip)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Set text properties.
* ``align`` set horizontal position for text, the possible values are:
* CENTER
@@ -106,6 +107,7 @@ cut("mode")
^^^^^^^^^^^
Cut paper.
* ``mode`` set a full or partial cut. *Default:* full
**Partial cut is not implemented in all printers.**
@@ -132,6 +134,7 @@ control("align")
^^^^^^^^^^^^^^^^
Carrier feed and tabs.
* ``align`` is a string which takes any of the following values:
* LF *for Line Feed*

View File

@@ -32,6 +32,7 @@ Network("host", port)
^^^^^^^^^^^^^^^^^^^^^
Based on socket
* ``host`` is an alphanumeric host name, could be either DNS host name or IP address.
* ``port`` to write to (default = 9100)
@@ -40,7 +41,8 @@ Problems with a network-attached printer can have numerous causes. Make sure tha
Often you can check the IP address by triggering the self-test of the device. As a next step try to send text
manually to the device. You could use for example:
::
.. ::
echo "OK\n" | nc IPADDRESS 9100
# the port number is often 9100
@@ -50,4 +52,5 @@ File("file\_name")
^^^^^^^^^^^^^^^^^^
Printcap printers
* ``file_name`` is the full path to the device file name

View File

@@ -116,7 +116,7 @@ setup(
setup_requires=[
'setuptools_scm',
],
tests_require=['tox', 'nose', 'scripttest'],
tests_require=['tox', 'nose', 'scripttest', 'mock', 'hypothesis'],
cmdclass={'test': Tox},
entry_points={
'console_scripts': [

View File

@@ -168,10 +168,7 @@ BARCODE_TYPE_B = {
'NW7': _SET_BARCODE_TYPE(71),
'CODABAR': _SET_BARCODE_TYPE(71), # Same as NW7
'CODE93': _SET_BARCODE_TYPE(72),
# These are all the same barcode, but using different charcter sets
'CODE128A': _SET_BARCODE_TYPE(73) + b'{A', # CODE128 character set A
'CODE128B': _SET_BARCODE_TYPE(73) + b'{B', # CODE128 character set B
'CODE128C': _SET_BARCODE_TYPE(73) + b'{C', # CODE128 character set C
'CODE128': _SET_BARCODE_TYPE(73),
'GS1-128': _SET_BARCODE_TYPE(74),
'GS1 DATABAR OMNIDIRECTIONAL': _SET_BARCODE_TYPE(75),
'GS1 DATABAR TRUNCATED': _SET_BARCODE_TYPE(76),

View File

@@ -34,18 +34,18 @@ class Usb(Escpos):
"""
def __init__(self, idVendor, idProduct, interface=0, in_ep=0x82, out_ep=0x01, *args, **kwargs):
def __init__(self, idVendor, idProduct, timeout=0, in_ep=0x82, out_ep=0x01, *args, **kwargs):
"""
:param idVendor: Vendor ID
:param idProduct: Product ID
:param interface: USB device interface
:param timeout: Is the time limit of the USB operation. Default without timeout.
:param in_ep: Input end point
:param out_ep: Output end point
"""
Escpos.__init__(self, *args, **kwargs)
self.idVendor = idVendor
self.idProduct = idProduct
self.interface = interface
self.timeout = timeout
self.in_ep = in_ep
self.out_ep = out_ep
self.open()
@@ -82,7 +82,7 @@ class Usb(Escpos):
:param msg: arbitrary code to be printed
:type msg: bytes
"""
self.device.write(self.out_ep, msg, self.interface)
self.device.write(self.out_ep, msg, self.timeout)
def close(self):
""" Release USB interface """
@@ -229,13 +229,15 @@ class File(Escpos):
"""
def __init__(self, devfile="/dev/usb/lp0", *args, **kwargs):
def __init__(self, devfile="/dev/usb/lp0", auto_flush=True, *args, **kwargs):
"""
:param devfile : Device file under dev filesystem
:param auto_flush: automatically call flush after every call of _raw()
"""
Escpos.__init__(self, *args, **kwargs)
self.devfile = devfile
self.auto_flush = auto_flush
self.open()
def open(self):
@@ -256,6 +258,8 @@ class File(Escpos):
:type msg: bytes
"""
self.device.write(msg)
if self.auto_flush:
self.flush()
def close(self):
""" Close system file """

70
test/test_printer_file.py Normal file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""tests for the File printer
:author: `Patrick Kanzler <patrick.kanzler@fablab.fau.de>`_
:organization: `python-escpos <https://github.com/python-escpos>`_
:copyright: Copyright (c) 2016 `python-escpos <https://github.com/python-escpos>`_
:license: GNU GPL v3
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import six
import mock
from hypothesis import given
from hypothesis.strategies import text
import escpos.printer as printer
if six.PY3:
mock_open_call = 'builtins.open'
else:
mock_open_call = '__builtin__.open'
@given(path=text())
@mock.patch(mock_open_call)
@mock.patch('escpos.escpos.Escpos.__init__')
def test_load_file_printer(mock_escpos, mock_open, path):
"""test the loading of the file-printer"""
printer.File(devfile=path)
assert mock_escpos.called
mock_open.assert_called_with(path, "wb")
@given(txt=text())
@mock.patch.object(printer.File, 'device')
@mock.patch(mock_open_call)
@mock.patch('escpos.escpos.Escpos.__init__')
def test_auto_flush(mock_escpos, mock_open, mock_device, txt):
"""test auto_flush in file-printer"""
p = printer.File(auto_flush=False)
# inject the mocked device-object
p.device = mock_device
p._raw(txt)
assert not mock_device.flush.called
mock_device.reset_mock()
p = printer.File(auto_flush=True)
# inject the mocked device-object
p.device = mock_device
p._raw(txt)
assert mock_device.flush.called
@given(txt=text())
@mock.patch.object(printer.File, 'device')
@mock.patch(mock_open_call)
def test_flush_on_close(mock_open, mock_device, txt):
"""test flush on close in file-printer"""
p = printer.File(auto_flush=False)
# inject the mocked device-object
p.device = mock_device
p._raw(txt)
assert not mock_device.flush.called
p.close()
assert mock_device.flush.called
assert mock_device.close.called

View File

@@ -5,6 +5,8 @@ envlist = py27, py34, py35, docs
deps = nose
coverage
scripttest
mock
hypothesis
commands = nosetests --with-coverage --cover-erase --cover-branches
[testenv:docs]