diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml new file mode 100644 index 0000000..2c2e3eb --- /dev/null +++ b/.github/workflows/pythonpackage.yml @@ -0,0 +1,43 @@ +# 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 diff --git a/.gitignore b/.gitignore index f8415e3..ba41934 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ test/test-cli-output/ *.swp *.swn *.swo + +# vscode +.vscode/settings.json diff --git a/.travis.yml b/.travis.yml index b31199d..39b238e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python sudo: false cache: pip -dist: xenial +dist: bionic git: depth: 100000 addons: @@ -29,35 +29,27 @@ matrix: osx_image: xcode10.2 language: shell 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 env: TOXENV=py35 - python: 3.6 env: TOXENV=py36 - - python: 3.6-dev - env: TOXENV=py36 - python: 3.7 env: TOXENV=py37 - python: 3.7-dev env: TOXENV=py37 + - python: 3.8 + env: TOXENV=py38 - python: 3.8-dev env: TOXENV=py38 - python: nightly env: TOXENV=py38 - - python: pypy - env: TOXENV=pypy - python: pypy3 env: TOXENV=pypy3 - - python: 3.7 + - python: 3.8 env: TOXENV=docs - - python: 3.7 + - python: 3.8 env: TOXENV=flake8 allow_failures: - - python: 2.7 - - python: 3.6-dev - python: 3.7-dev - python: 3.8-dev - python: nightly @@ -86,4 +78,4 @@ deploy: tags: true repo: python-escpos/python-escpos branch: master - condition: $TRAVIS_PYTHON_VERSION = "3.7" + condition: $TRAVIS_PYTHON_VERSION = "3.8" diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..d4f4af7 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + // 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 + } + } + ] +} \ No newline at end of file diff --git a/AUTHORS b/AUTHORS index 89f10bb..07c6bce 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,8 +1,10 @@ Ahmed Tahri akeonly +Alexander Bougakov Alex Debiasio Asuki Kono belono +Brian Christoph Heuel Cody (Quantified Code Bot) csoft2k @@ -19,6 +21,7 @@ Kristi ldos Lucy Linder Manuel F Martinez +Maximilian Wagenbach Michael Billington Michael Elsdörfer mrwunderbar666 @@ -36,4 +39,5 @@ Sergio Pulgarin Stephan Sokolow Thijs Triemstra Thomas van den Berg +Yaisel Hurtado ysuolmai diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d823f07..6360a69 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,10 +1,35 @@ ********* 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..." --------------------------------------------- This release is the seventh alpha release of the new version 3.0. -Please be aware the the API is subject to change until v3.0 is +Please be aware that the API is subject to change until v3.0 is released. changes diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 4ad2108..f14bc2b 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -56,12 +56,9 @@ Apart from that the travis-log and the check by Landscape will provide you with GIT ^^^ -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 in the development-branch. - -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`. +The master-branch contains the main development of the project. A release to PyPi is marked with a tag +corresponding to the version. Issues are closed when they have been resolved by merging into the master-branch. +When you have a change to make, begin by creating a new branch from the HEAD of `python-escpos/master`. 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 diff --git a/INSTALL b/INSTALL index e800f7f..b6d6644 100644 --- a/INSTALL +++ b/INSTALL @@ -1,23 +1,10 @@ python-escpos ============= -Ensure the library is installed on ${lib_arch}/${python_ver}/site-packages/escpos +This library is available over pypi. So for most of the use-cases it should be sufficient to run -On CLi you must run: -# python setup.py build -# sudo python setup.py install +``` +pip install python-escpos --user # add --pre if you want to install pre-releases +``` -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 +For more information please read the documentation at https://python-escpos.readthedocs.io/en/latest/user/installation.html diff --git a/MANIFEST.in b/MANIFEST.in index f1666ca..d8e439a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,6 +4,7 @@ include LICENSE include INSTALL include tox.ini include capabilities-data/dist/capabilities.json +include src/escpos/capabilities.json recursive-include doc *.bat recursive-include doc *.ico recursive-include doc *.py diff --git a/README.rst b/README.rst index 3eebf6d..bd36cbe 100644 --- a/README.rst +++ b/README.rst @@ -76,6 +76,25 @@ Another example based on the Network printer class: kitchen.text("Hello World\n") kitchen.barcode('1324354657687', 'EAN13', 64, 2, '', '') 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 `_. diff --git a/capabilities-data b/capabilities-data index 8885283..3b5b35c 160000 --- a/capabilities-data +++ b/capabilities-data @@ -1 +1 @@ -Subproject commit 8885283d71a43758aa63d633fd2301df13dce9d5 +Subproject commit 3b5b35cfd35d297f9085ec16d47d1f77c3f1e768 diff --git a/doc/user/todo.rst b/doc/user/todo.rst index 8e79fde..d23dddf 100644 --- a/doc/user/todo.rst +++ b/doc/user/todo.rst @@ -2,38 +2,9 @@ TODO **** -Introduction ------------- - -python-escpos is the initial idea, from here we can start to build a -robust library to get most of the ESC/POS printers working with this -library. - -Eventually, this library must be able to cover almost all the defined -models detailed in the ESC/POS Command Specification Manual. - -Details -------- - -What things are planned to work on? - -Testing -~~~~~~~ - -* Test on many printers as possible (USB, Serial, Network) -* automate testing - -Design -~~~~~~ - -* Add all those sequences which are not common, but part of the ESC/POS - Command Specifications. - - * Port to Python 3 - * Windows compatibility (hidapi instead libusb?) - * PDF417 support - -* use something similar to the `capabilities` in escpos-php +Open points and issues of the project are tracked in the GitHub issues. +Some annotations still remain in the code and should be moved over time +into the issue tracker. Todos in the codebase ~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/user/usage.rst b/doc/user/usage.rst index 37f234a..853484f 100644 --- a/doc/user/usage.rst +++ b/doc/user/usage.rst @@ -48,14 +48,16 @@ to have and the second yields the "Output Endpoint" address. 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 -your instance. So, assuming that we have another printer where in\_ep is -on 0x81 and out\_ep=0x02, then the printer definition should look like: +your instance. So, assuming that we have another printer, CT-S2000, +manufactured by Citizen (with "Vendor ID" of 2730 and "Product ID" of 0fff) +where in\_ep is on 0x81 and out\_ep=0x02, then the printer definition should +look like: **Generic USB Printer initialization** :: - p = printer.Usb(0x1a2b,0x1a2b,0,0x81,0x02) + p = printer.Usb(0x2730, 0x0fff, 0, 0x81, 0x02) Network printer ^^^^^^^^^^^^^^^ diff --git a/readthedocs.yml b/readthedocs.yml index ecf365d..d34f875 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -3,5 +3,5 @@ formats: - epub requirements_file: doc/requirements.txt python: - version: 2 + version: 3 setup_py_install: true \ No newline at end of file diff --git a/setup.py b/setup.py index 7220055..f067fa2 100755 --- a/setup.py +++ b/setup.py @@ -66,12 +66,11 @@ setup( 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: Implementation :: CPython', - 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Office/Business :: Financial :: Point-Of-Sale', ], @@ -100,7 +99,7 @@ setup( 'nose', 'scripttest', 'mock', - 'hypothesis!=3.56.9,<4', + 'hypothesis>4', 'flake8' ], entry_points={ diff --git a/src/escpos/escpos.py b/src/escpos/escpos.py index bfab265..3fa7eee 100644 --- a/src/escpos/escpos.py +++ b/src/escpos/escpos.py @@ -106,6 +106,9 @@ class Escpos(object): * `graphics`: prints with the `GS ( L`-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 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 @@ -117,6 +120,10 @@ class Escpos(object): im = EscposImage(img_source) 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']) if im.width > max_width: diff --git a/src/escpos/printer.py b/src/escpos/printer.py index 54eb74a..327f71f 100644 --- a/src/escpos/printer.py +++ b/src/escpos/printer.py @@ -8,15 +8,12 @@ :license: MIT """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import absolute_import, division, print_function, unicode_literals -import usb.core -import usb.util import serial import socket +import usb.core +import usb.util from .escpos import Escpos from .exceptions import USBNotFoundError @@ -83,6 +80,8 @@ class Usb(Escpos): if check_driver is None or check_driver: try: self.device.detach_kernel_driver(0) + except NotImplementedError: + pass except usb.core.USBError as e: if check_driver is not None: print("Could not detatch kernel driver: {0}".format(str(e))) @@ -349,6 +348,7 @@ class Dummy(Escpos): _WIN32PRINT = False try: import win32print + _WIN32PRINT = True except ImportError: pass diff --git a/test/test_printer_file.py b/test/test_printer_file.py index 0ab23e2..304c347 100644 --- a/test/test_printer_file.py +++ b/test/test_printer_file.py @@ -28,7 +28,6 @@ else: @pytest.mark.skip("this test is broken and has to be fixed or discarded") -@settings(use_coverage=False) @given(path=text()) def test_load_file_printer(mocker, path): """test the loading of the file-printer""" @@ -40,7 +39,6 @@ def test_load_file_printer(mocker, path): @pytest.mark.skip("this test is broken and has to be fixed or discarded") -@settings(deadline=None, use_coverage=False) @given(txt=text()) def test_auto_flush(mocker, txt): """test auto_flush in file-printer""" @@ -62,7 +60,6 @@ def test_auto_flush(mocker, txt): @pytest.mark.skip("this test is broken and has to be fixed or discarded") -@settings(deadline=None, use_coverage=False) @given(txt=text()) def test_flush_on_close(mocker, txt): """test flush on close in file-printer""" diff --git a/tox.ini b/tox.ini index 9dc7a4f..53211f3 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,12 @@ [tox] -envlist = py27, py34, py35, py36, py37, docs, flake8 +envlist = py35, py36, py37, py38, docs, flake8 + +[gh-actions] +python = + 2.7: py27 + 3.6: py36 + 3.7: py37 + 3.8: py38 [testenv] deps = nose @@ -10,9 +17,9 @@ deps = nose pytest!=3.2.0,!=3.3.0 pytest-cov pytest-mock - hypothesis!=3.56.9,<4 + hypothesis>4 viivakoodi -commands = py.test --cov escpos +commands = pytest --cov escpos passenv = ESCPOS_CAPABILITIES_PICKLE_DIR ESCPOS_CAPABILITIES_FILE CI TRAVIS TRAVIS_* APPVEYOR APPVEYOR_* CODECOV_* [testenv:docs]