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

3 Commits

Author SHA1 Message Date
Patrick Kanzler
a68347ee1c update mailmap-file 2019-06-30 17:43:20 +02:00
Brian 'Redbeard' Harrington
c40f2abe07 bug/doc: Fix invalid EAN-13 barcode in examples
In the various examples and python-escpos CLI there are a number of uses
of `13243546557687` as an EAN-13 example.  This EAN barcode is invalid
as the checksum should be `0` and not `7`.

```
$ python test_print.py
Traceback (most recent call last):
  File "test_print.py", line 5, in <module>
    p.barcode('13243546557687', 'EAN13', 64, 2, '', '')
  File "/home/pi/fatt-display/lib/python3.7/site-packages/escpos/escpos.py", line 433, in barcode
    bc=bc,
escpos.exceptions.BarcodeCodeError: No Barcode code was supplied (Barcode '13243546557687' not in a valid format for type 'EAN13')
```

This patch set removes `13243546557687` and replaces it with the valid
number `40063813339310`.

In researching the list of [assigned prefixes issued by
G1][g1-prefixes] there seemed to be no "officially" defined test  prefix, so
this change was made to be minimally invasive using the number from the
existing test cases.

Resolves #350

Affects #176

[g1-prefixes]: https://www.gs1.org/standards/id-keys/company-prefix
[test-code]: https://www.barcodelookup.com/4006381333931
2019-06-29 19:19:16 -07:00
Brian 'Redbeard' Harrington
fb82e5dc4a AUTHORS: Adding Brian Redbeard to AUTHORS
As per `CONTRIBUTING.rst` including a commit for Brian 'redbeard'
Harrington to AUTHORS
2019-06-29 19:19:16 -07:00
20 changed files with 67 additions and 164 deletions

View File

@@ -1,43 +0,0 @@
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Python package
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.5, 3.6, 3.7, 3.8]
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest tox tox-gh-actions
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with tox
run: |
tox
env:
ESCPOS_CAPABILITIES_FILE: /home/runner/work/python-escpos/python-escpos/capabilities-data/dist/capabilities.json

3
.gitignore vendored
View File

@@ -29,6 +29,3 @@ test/test-cli-output/
*.swp *.swp
*.swn *.swn
*.swo *.swo
# vscode
.vscode/settings.json

View File

@@ -13,3 +13,4 @@ csoft2k <csoft2k@hotmail.com>
Sergio Pulgarin <sergio.pulgarin@gmail.com> Sergio Pulgarin <sergio.pulgarin@gmail.com>
reck31 <rakesh.gunduka@gmail.com> reck31 <rakesh.gunduka@gmail.com>
Alex Debiasio <alex.debiasio@thinkin.io> <alex.debiasio@studenti.unitn.it> Alex Debiasio <alex.debiasio@thinkin.io> <alex.debiasio@studenti.unitn.it>
Brian 'Redbeard' Harrington <redbeard@dead-city.org>

View File

@@ -1,7 +1,7 @@
language: python language: python
sudo: false sudo: false
cache: pip cache: pip
dist: bionic dist: xenial
git: git:
depth: 100000 depth: 100000
addons: addons:
@@ -29,27 +29,35 @@ matrix:
osx_image: xcode10.2 osx_image: xcode10.2
language: shell language: shell
env: TOXENV=py37 ESCPOS_CAPABILITIES_FILE=/Users/travis/build/python-escpos/python-escpos/capabilities-data/dist/capabilities.json env: TOXENV=py37 ESCPOS_CAPABILITIES_FILE=/Users/travis/build/python-escpos/python-escpos/capabilities-data/dist/capabilities.json
- python: 2.7
env: TOXENV=py27
- python: 3.4
env: TOXENV=py34
- python: 3.5 - python: 3.5
env: TOXENV=py35 env: TOXENV=py35
- python: 3.6 - python: 3.6
env: TOXENV=py36 env: TOXENV=py36
- python: 3.6-dev
env: TOXENV=py36
- python: 3.7 - python: 3.7
env: TOXENV=py37 env: TOXENV=py37
- python: 3.7-dev - python: 3.7-dev
env: TOXENV=py37 env: TOXENV=py37
- python: 3.8
env: TOXENV=py38
- python: 3.8-dev - python: 3.8-dev
env: TOXENV=py38 env: TOXENV=py38
- python: nightly - python: nightly
env: TOXENV=py38 env: TOXENV=py38
- python: pypy
env: TOXENV=pypy
- python: pypy3 - python: pypy3
env: TOXENV=pypy3 env: TOXENV=pypy3
- python: 3.8 - python: 3.7
env: TOXENV=docs env: TOXENV=docs
- python: 3.8 - python: 3.7
env: TOXENV=flake8 env: TOXENV=flake8
allow_failures: allow_failures:
- python: 2.7
- python: 3.6-dev
- python: 3.7-dev - python: 3.7-dev
- python: 3.8-dev - python: 3.8-dev
- python: nightly - python: nightly
@@ -78,4 +86,4 @@ deploy:
tags: true tags: true
repo: python-escpos/python-escpos repo: python-escpos/python-escpos
branch: master branch: master
condition: $TRAVIS_PYTHON_VERSION = "3.8" condition: $TRAVIS_PYTHON_VERSION = "3.7"

16
.vscode/tasks.json vendored
View File

@@ -1,16 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "test with tox",
"type": "shell",
"command": "tox",
"group": {
"kind": "test",
"isDefault": true
}
}
]
}

View File

@@ -1,10 +1,9 @@
Ahmed Tahri Ahmed Tahri
akeonly akeonly
Alexander Bougakov
Alex Debiasio Alex Debiasio
Asuki Kono Asuki Kono
belono belono
Brian Brian 'Redbeard' Harrington
Christoph Heuel Christoph Heuel
Cody (Quantified Code Bot) Cody (Quantified Code Bot)
csoft2k csoft2k
@@ -21,7 +20,6 @@ Kristi
ldos ldos
Lucy Linder Lucy Linder
Manuel F Martinez Manuel F Martinez
Maximilian Wagenbach
Michael Billington Michael Billington
Michael Elsdörfer Michael Elsdörfer
mrwunderbar666 mrwunderbar666
@@ -39,5 +37,4 @@ Sergio Pulgarin
Stephan Sokolow Stephan Sokolow
Thijs Triemstra Thijs Triemstra
Thomas van den Berg Thomas van den Berg
Yaisel Hurtado
ysuolmai ysuolmai

View File

@@ -1,35 +1,10 @@
********* *********
Changelog Changelog
********* *********
2020-05-09 - Version 3.0a7 - "No Fixed Abode"
---------------------------------------------
This release is the eight alpha release of the new version 3.0.
Please be aware that the API is subject to change until v3.0
is released.
This release also marks the point at which the project transitioned
to having only a master-branch (and not an additional development branch).
changes
^^^^^^^
- add Exception for NotImplementedError in detach_kernel_driver
- update installation information
- update and improve documentation
- add error handling to image centering flag
- update and fix tox and CI environment, preparing drop of support for Python 2
contributors
^^^^^^^^^^^^
- Alexander Bougakov
- Brian
- Yaisel Hurtado
- Maximilan Wagenbach
- Patrick Kanzler
2019-06-19 - Version 3.0a6 - "Mistake not..." 2019-06-19 - Version 3.0a6 - "Mistake not..."
--------------------------------------------- ---------------------------------------------
This release is the seventh alpha release of the new version 3.0. This release is the seventh alpha release of the new version 3.0.
Please be aware that the API is subject to change until v3.0 is Please be aware the the API is subject to change until v3.0 is
released. released.
changes changes

View File

@@ -56,9 +56,12 @@ Apart from that the travis-log and the check by Landscape will provide you with
GIT GIT
^^^ ^^^
The master-branch contains the main development of the project. A release to PyPi is marked with a tag The master-branch contains code that has been released to PyPi. A release is marked with a tag
corresponding to the version. Issues are closed when they have been resolved by merging into the master-branch. corresponding to the version. Issues are closed when they have been resolved in the development-branch.
When you have a change to make, begin by creating a new branch from the HEAD of `python-escpos/master`.
When you have a change to make, begin by creating a new branch from the HEAD of `python-escpos/development`.
Name your branch to indicate what you are trying to achieve. Good branch names might
be `improve/text-handling`, `feature/enable-color-printing`.
Please try to group your commits into logical units. If you need to tidy up your branch, you can make use of a Please try to group your commits into logical units. If you need to tidy up your branch, you can make use of a
git feature called an 'interactive rebase' before making a pull request. A small, self-contained change-set is git feature called an 'interactive rebase' before making a pull request. A small, self-contained change-set is

23
INSTALL
View File

@@ -1,10 +1,23 @@
python-escpos python-escpos
============= =============
This library is available over pypi. So for most of the use-cases it should be sufficient to run Ensure the library is installed on ${lib_arch}/${python_ver}/site-packages/escpos
``` On CLi you must run:
pip install python-escpos --user # add --pre if you want to install pre-releases # python setup.py build
``` # sudo python setup.py install
For more information please read the documentation at https://python-escpos.readthedocs.io/en/latest/user/installation.html On Linux, ensure you belongs to the proper group so you can have access to the printer.
This can be done, by adding yourself to 'dialout' group, this might require to re-login
so the changes make effect.
Then, add the following rule to /etc/udev/rules.d/99-escpos.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0202", MODE="0664", GROUP="dialout"
and restar udev rules.
# sudo service udev restart
Enjoy !!!
And please, don't forget to ALWAYS add Epson.cut() at the end of your printing :)
Manuel F Martinez <manpaz@bashlinux.com>

View File

@@ -4,7 +4,6 @@ include LICENSE
include INSTALL include INSTALL
include tox.ini include tox.ini
include capabilities-data/dist/capabilities.json include capabilities-data/dist/capabilities.json
include src/escpos/capabilities.json
recursive-include doc *.bat recursive-include doc *.bat
recursive-include doc *.ico recursive-include doc *.ico
recursive-include doc *.py recursive-include doc *.py

View File

@@ -62,7 +62,7 @@ The basic usage is:
p = Usb(0x04b8, 0x0202, 0, profile="TM-T88III") p = Usb(0x04b8, 0x0202, 0, profile="TM-T88III")
p.text("Hello World\n") p.text("Hello World\n")
p.image("logo.gif") p.image("logo.gif")
p.barcode('1324354657687', 'EAN13', 64, 2, '', '') p.barcode('4006381333931', 'EAN13', 64, 2, '', '')
p.cut() p.cut()
@@ -74,27 +74,8 @@ Another example based on the Network printer class:
kitchen = Network("192.168.1.100") #Printer IP Address kitchen = Network("192.168.1.100") #Printer IP Address
kitchen.text("Hello World\n") kitchen.text("Hello World\n")
kitchen.barcode('1324354657687', 'EAN13', 64, 2, '', '') kitchen.barcode('4006381333931', 'EAN13', 64, 2, '', '')
kitchen.cut() kitchen.cut()
Another example based on the Serial printer class:
.. code:: python
from escpos.printer import Serial
""" 9600 Baud, 8N1, Flow Control Enabled """
p = Serial(devfile='/dev/tty.usbserial',
baudrate=9600,
bytesize=8,
parity='N',
stopbits=1,
timeout=1.00,
dsrdtr=True)
p.text("Hello World\n")
p.qr("You can readme from your smartphone")
p.cut()
The full project-documentation is available on `Read the Docs <https://python-escpos.readthedocs.io>`_. The full project-documentation is available on `Read the Docs <https://python-escpos.readthedocs.io>`_.

View File

@@ -48,16 +48,14 @@ to have and the second yields the "Output Endpoint" address.
By default the "Interface" number is "0" and the "Output Endpoint" By default the "Interface" number is "0" and the "Output Endpoint"
address is "0x01". If you have other values then you can define them on address is "0x01". If you have other values then you can define them on
your instance. So, assuming that we have another printer, CT-S2000, your instance. So, assuming that we have another printer where in\_ep is
manufactured by Citizen (with "Vendor ID" of 2730 and "Product ID" of 0fff) on 0x81 and out\_ep=0x02, then the printer definition should look like:
where in\_ep is on 0x81 and out\_ep=0x02, then the printer definition should
look like:
**Generic USB Printer initialization** **Generic USB Printer initialization**
:: ::
p = printer.Usb(0x2730, 0x0fff, 0, 0x81, 0x02) p = printer.Usb(0x1a2b,0x1a2b,0,0x81,0x02)
Network printer Network printer
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
@@ -121,7 +119,7 @@ on a USB interface.
# Print QR Code # Print QR Code
p.qr("You can readme from your smartphone") p.qr("You can readme from your smartphone")
# Print barcode # Print barcode
p.barcode('1324354657687','EAN13',64,2,'','') p.barcode('4006381333931','EAN13',64,2,'','')
# Cut paper # Cut paper
p.cut() p.cut()

View File

@@ -3,5 +3,5 @@ formats:
- epub - epub
requirements_file: doc/requirements.txt requirements_file: doc/requirements.txt
python: python:
version: 3 version: 2
setup_py_install: true setup_py_install: true

View File

@@ -66,11 +66,12 @@ setup(
'Operating System :: OS Independent', 'Operating System :: OS Independent',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy',
'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Office/Business :: Financial :: Point-Of-Sale', 'Topic :: Office/Business :: Financial :: Point-Of-Sale',
], ],
@@ -99,7 +100,7 @@ setup(
'nose', 'nose',
'scripttest', 'scripttest',
'mock', 'mock',
'hypothesis>4', 'hypothesis!=3.56.9,<4',
'flake8' 'flake8'
], ],
entry_points={ entry_points={

View File

@@ -53,7 +53,7 @@ DEMO_FUNCTIONS = {
'barcodes_a': [ 'barcodes_a': [
{'bc': 'UPC-A', 'code': '13243546576'}, {'bc': 'UPC-A', 'code': '13243546576'},
{'bc': 'UPC-E', 'code': '132435'}, {'bc': 'UPC-E', 'code': '132435'},
{'bc': 'EAN13', 'code': '1324354657687'}, {'bc': 'EAN13', 'code': '4006381333931'},
{'bc': 'EAN8', 'code': '1324354'}, {'bc': 'EAN8', 'code': '1324354'},
{'bc': 'CODE39', 'code': 'TEST'}, {'bc': 'CODE39', 'code': 'TEST'},
{'bc': 'ITF', 'code': '55867492279103'}, {'bc': 'ITF', 'code': '55867492279103'},
@@ -62,13 +62,13 @@ DEMO_FUNCTIONS = {
'barcodes_b': [ 'barcodes_b': [
{'bc': 'UPC-A', 'code': '13243546576', 'function_type': 'B'}, {'bc': 'UPC-A', 'code': '13243546576', 'function_type': 'B'},
{'bc': 'UPC-E', 'code': '132435', 'function_type': 'B'}, {'bc': 'UPC-E', 'code': '132435', 'function_type': 'B'},
{'bc': 'EAN13', 'code': '1324354657687', 'function_type': 'B'}, {'bc': 'EAN13', 'code': '4006381333931', 'function_type': 'B'},
{'bc': 'EAN8', 'code': '1324354', 'function_type': 'B'}, {'bc': 'EAN8', 'code': '1324354', 'function_type': 'B'},
{'bc': 'CODE39', 'code': 'TEST', 'function_type': 'B'}, {'bc': 'CODE39', 'code': 'TEST', 'function_type': 'B'},
{'bc': 'ITF', 'code': '55867492279103', 'function_type': 'B'}, {'bc': 'ITF', 'code': '55867492279103', 'function_type': 'B'},
{'bc': 'NW7', 'code': 'A00000000A', 'function_type': 'B'}, {'bc': 'NW7', 'code': 'A00000000A', 'function_type': 'B'},
{'bc': 'CODE93', 'code': 'A00000000A', 'function_type': 'B'}, {'bc': 'CODE93', 'code': 'A00000000A', 'function_type': 'B'},
{'bc': 'CODE93', 'code': '1324354657687', 'function_type': 'B'}, {'bc': 'CODE93', 'code': '4006381333931', 'function_type': 'B'},
{'bc': 'CODE128A', 'code': 'TEST', 'function_type': 'B'}, {'bc': 'CODE128A', 'code': 'TEST', 'function_type': 'B'},
{'bc': 'CODE128B', 'code': 'TEST', 'function_type': 'B'}, {'bc': 'CODE128B', 'code': 'TEST', 'function_type': 'B'},
{'bc': 'CODE128C', 'code': 'TEST', 'function_type': 'B'}, {'bc': 'CODE128C', 'code': 'TEST', 'function_type': 'B'},

View File

@@ -106,9 +106,6 @@ class Escpos(object):
* `graphics`: prints with the `GS ( L`-command * `graphics`: prints with the `GS ( L`-command
* `bitImageColumn`: prints with the `ESC *`-command * `bitImageColumn`: prints with the `ESC *`-command
When trying to center an image make sure you have initialized the printer with a valid profile, that
contains a media width pixel field. Otherwise the centering will have no effect.
:param img_source: PIL image or filename to load: `jpg`, `gif`, `png` or `bmp` :param img_source: PIL image or filename to load: `jpg`, `gif`, `png` or `bmp`
:param high_density_vertical: print in high density in vertical direction *default:* True :param high_density_vertical: print in high density in vertical direction *default:* True
:param high_density_horizontal: print in high density in horizontal direction *default:* True :param high_density_horizontal: print in high density in horizontal direction *default:* True
@@ -120,10 +117,6 @@ class Escpos(object):
im = EscposImage(img_source) im = EscposImage(img_source)
try: try:
if self.profile.profile_data['media']['width']['pixels'] == "Unknown":
print("The media.width.pixel field of the printer profile is not set. " +
"The center flag will have no effect.")
max_width = int(self.profile.profile_data['media']['width']['pixels']) max_width = int(self.profile.profile_data['media']['width']['pixels'])
if im.width > max_width: if im.width > max_width:

View File

@@ -8,12 +8,15 @@
:license: MIT :license: MIT
""" """
from __future__ import absolute_import, division, print_function, unicode_literals from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import serial
import socket
import usb.core import usb.core
import usb.util import usb.util
import serial
import socket
from .escpos import Escpos from .escpos import Escpos
from .exceptions import USBNotFoundError from .exceptions import USBNotFoundError
@@ -80,8 +83,6 @@ class Usb(Escpos):
if check_driver is None or check_driver: if check_driver is None or check_driver:
try: try:
self.device.detach_kernel_driver(0) self.device.detach_kernel_driver(0)
except NotImplementedError:
pass
except usb.core.USBError as e: except usb.core.USBError as e:
if check_driver is not None: if check_driver is not None:
print("Could not detatch kernel driver: {0}".format(str(e))) print("Could not detatch kernel driver: {0}".format(str(e)))
@@ -348,7 +349,6 @@ class Dummy(Escpos):
_WIN32PRINT = False _WIN32PRINT = False
try: try:
import win32print import win32print
_WIN32PRINT = True _WIN32PRINT = True
except ImportError: except ImportError:
pass pass

View File

@@ -28,6 +28,7 @@ else:
@pytest.mark.skip("this test is broken and has to be fixed or discarded") @pytest.mark.skip("this test is broken and has to be fixed or discarded")
@settings(use_coverage=False)
@given(path=text()) @given(path=text())
def test_load_file_printer(mocker, path): def test_load_file_printer(mocker, path):
"""test the loading of the file-printer""" """test the loading of the file-printer"""
@@ -39,6 +40,7 @@ def test_load_file_printer(mocker, path):
@pytest.mark.skip("this test is broken and has to be fixed or discarded") @pytest.mark.skip("this test is broken and has to be fixed or discarded")
@settings(deadline=None, use_coverage=False)
@given(txt=text()) @given(txt=text())
def test_auto_flush(mocker, txt): def test_auto_flush(mocker, txt):
"""test auto_flush in file-printer""" """test auto_flush in file-printer"""
@@ -60,6 +62,7 @@ def test_auto_flush(mocker, txt):
@pytest.mark.skip("this test is broken and has to be fixed or discarded") @pytest.mark.skip("this test is broken and has to be fixed or discarded")
@settings(deadline=None, use_coverage=False)
@given(txt=text()) @given(txt=text())
def test_flush_on_close(mocker, txt): def test_flush_on_close(mocker, txt):
"""test flush on close in file-printer""" """test flush on close in file-printer"""

13
tox.ini
View File

@@ -1,12 +1,5 @@
[tox] [tox]
envlist = py35, py36, py37, py38, docs, flake8 envlist = py27, py34, py35, py36, py37, docs, flake8
[gh-actions]
python =
2.7: py27
3.6: py36
3.7: py37
3.8: py38
[testenv] [testenv]
deps = nose deps = nose
@@ -17,9 +10,9 @@ deps = nose
pytest!=3.2.0,!=3.3.0 pytest!=3.2.0,!=3.3.0
pytest-cov pytest-cov
pytest-mock pytest-mock
hypothesis>4 hypothesis!=3.56.9,<4
viivakoodi viivakoodi
commands = pytest --cov escpos commands = py.test --cov escpos
passenv = ESCPOS_CAPABILITIES_PICKLE_DIR ESCPOS_CAPABILITIES_FILE CI TRAVIS TRAVIS_* APPVEYOR APPVEYOR_* CODECOV_* passenv = ESCPOS_CAPABILITIES_PICKLE_DIR ESCPOS_CAPABILITIES_FILE CI TRAVIS TRAVIS_* APPVEYOR APPVEYOR_* CODECOV_*
[testenv:docs] [testenv:docs]