modernize and cleanup documentation (#542)

* disable system packages on rtd

* install pycups on rtd

* enable cups binding in documentation

* document CupsPrinter

* fix formatting

* revise methods and installation

* revise user/printers

* revise raspi section

* further revise
This commit is contained in:
Patrick Kanzler 2023-08-10 01:38:47 +02:00 committed by GitHub
parent 4c2dcdfac6
commit 2b62c8e28d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 174 additions and 103 deletions

View File

@ -25,4 +25,4 @@ python:
- requirements: doc/requirements.txt - requirements: doc/requirements.txt
- method: pip - method: pip
path: . path: .
system_packages: true system_packages: false

View File

@ -1,23 +1,32 @@
Contributing Contributing
============ ============
This project is open to any kind of contribution. You can help with improving the documentation, adding fixes to the :Last Reviewed: 2023-08-10
code, providing test cases in code or as a description or just spreading the word. Please feel free to create an
issue or pull request.
In order to reduce the amount of work for everyone please try to adhere to good practice.
The pull requests and issues will be prefilled with templates. Please fill in your information where applicable. This project is open to any kind of contribution.
You can help with improving the documentation, adding fixes to the
code, providing test cases in code or as a description or just
spreading the word.
Please feel free to create an issue or pull request.
In order to reduce the amount of work for everyone please try
to adhere to good practice.
This project uses `semantic versioning <https://semver.org/>`_ and tries to adhere to the proposed rules as The pull requests and issues will be prefilled with templates.
well as possible. Please fill in your information where applicable.
This project uses `semantic versioning <https://semver.org/>`_
and tries to adhere to the proposed rules as well as possible.
Author-list Author-list
----------- -----------
This project keeps a list of authors. This can be auto-generated by calling `./doc/generate-authors.sh`. This project keeps a list of authors.
When contributing the first time, please include a commit with the output of this script in place. This can be auto-generated by calling `./doc/generate-authors.sh`.
When contributing the first time, please include a commit with
the output of this script in place.
When you change your username or mail-address, please also update the `.mailmap` and the authors-list. When you change your username or mail-address, please also
update the `.mailmap` and the authors-list.
You can find a good documentation on the mapping-feature in the You can find a good documentation on the mapping-feature in the
`documentation of git-shortlog <https://git-scm.com/docs/git-shortlog#_mapping_authors>`_. `documentation of git-shortlog <https://git-scm.com/docs/git-shortlog#_mapping_authors>`_.
@ -33,31 +42,42 @@ Please format your contributions with black, otherwise they will be rejected.
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 the main development of the project.
corresponding to the version. Issues are closed when they have been resolved by merging into the master-branch. A release to PyPi is marked with a tag corresponding to the version.
When you have a change to make, begin by creating a new branch from the HEAD of `python-escpos/master`. 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 Please try to group your commits into logical units.
git feature called an 'interactive rebase' before making a pull request. A small, self-contained change-set is If you need to tidy up your branch, you can make use of a
easier to review, and improves the chance of your code being merged. git feature called an 'interactive rebase' before making a pull request.
Please also make sure that before creating your PR, your branch is rebased on a recent commit or you merged a recent A small, self-contained change-set is easier to review, and
commit into your branch. This way you can ensure that your PR is without merge conflicts. improves the chance of your code being merged.
Please also make sure that before creating your PR, your branch
is rebased on a recent commit or you merged a recent
commit into your branch.
This way you can ensure that your PR is without merge conflicts.
Docstrings Docstrings
^^^^^^^^^^ ^^^^^^^^^^
This project tries to have a good documentation. This project tries to have a good documentation.
Please add a docstring to every method and class. Have a look at existing methods and classes for the style. Please add a docstring to every method and class.
Have a look at existing methods and classes for the style.
We use basically standard rst-docstrings for Sphinx. We use basically standard rst-docstrings for Sphinx.
Test Test
^^^^ ^^^^
Try to write tests whenever possible. Our goal for the future is 100% coverage. Try to write tests whenever possible.
You can copy the structure from other testcases. Please remember to adapt the docstrings. Our goal for the future is 100% coverage.
You can copy the structure from other testcases.
Please remember to adapt the docstrings.
Further reading Further reading
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
For further best practices and hints on contributing please see the For further best practices and hints on contributing please see the
`contribution-guide <https://www.contribution-guide.org/>`_. Should there be any contradictions between this guide `contribution-guide <https://www.contribution-guide.org/>`_.
Should there be any contradictions between this guide
and the linked one, please stick to this text. and the linked one, please stick to this text.
Aside from that feel free to create an issue or write an email if anything is unclear. Aside from that feel free to create an issue or write an email if anything is unclear.

View File

@ -1,6 +1,8 @@
Release process Release process
=============== ===============
:Last Reviewed: 2023-08-10
* Update authors file * Update authors file
* Update changelog * Update changelog
* Set annotated tag for release and push to public github * Set annotated tag for release and push to public github

View File

@ -1,6 +1,8 @@
TODO TODO
==== ====
:Last Reviewed: 2023-08-10
Open points and issues of the project are tracked in the GitHub issues. 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 Some annotations still remain in the code and should be moved over time
into the issue tracker. into the issue tracker.

View File

@ -1,6 +1,11 @@
Available Encodings Available Encodings
------------------- -------------------
:Last Reviewed: 2023-07-29 :Last Reviewed: 2023-08-10
If you find any issues with the described encodings,
please open an issue in the
`ESC/POS printer database <https://github.com/receipt-print-hq/escpos-printer-db>`_.
The data shown here is directly taken from there.
.. datatemplate:json:: ../../capabilities-data/dist/capabilities.json .. datatemplate:json:: ../../capabilities-data/dist/capabilities.json
:template: capabilities-template-encoding.jinja :template: capabilities-template-encoding.jinja

View File

@ -2,7 +2,7 @@
Available Profiles Available Profiles
------------------ ------------------
:Last Reviewed: 2023-07-29 :Last Reviewed: 2023-08-10
The following list describes which printer profiles are The following list describes which printer profiles are
available in this release. available in this release.
@ -12,6 +12,7 @@ that this printer actually can be controlled by this library.
If you find any issues with the described capabilities, If you find any issues with the described capabilities,
please open an issue in the please open an issue in the
`ESC/POS printer database <https://github.com/receipt-print-hq/escpos-printer-db>`_. `ESC/POS printer database <https://github.com/receipt-print-hq/escpos-printer-db>`_.
The data shown here is directly taken from there.
.. datatemplate:json:: ../../capabilities-data/dist/capabilities.json .. datatemplate:json:: ../../capabilities-data/dist/capabilities.json
:template: capabilities-template.jinja :template: capabilities-template.jinja

View File

@ -2,7 +2,7 @@
Capabilities Capabilities
------------ ------------
:Last Reviewed: 2023-07-29 :Last Reviewed: 2023-08-10
Since the used command set often differs between printers, Since the used command set often differs between printers,
a model for supporting different printers is implemented. a model for supporting different printers is implemented.

View File

@ -11,3 +11,4 @@ python-barcode>=0.11.0,<1
importlib-metadata importlib-metadata
importlib_resources importlib_resources
sphinxcontrib.datatemplates sphinxcontrib.datatemplates
pycups

View File

@ -1,19 +1,29 @@
Printing Barcodes Printing Barcodes
----------------- -----------------
:Last Reviewed: 2023-05-16 :Last Reviewed: 2023-08-10
Many printers implement barcode printing natively. Many printers implement barcode printing natively.
This hardware renderered barcodes are fast but the supported formats are limited by the printer itself and different between models. This hardware renderered barcodes are fast but the supported
However, almost all printers support printing images, so barcode renderization can be performed externally by software and then sent to the printer as an image. formats are limited by the printer itself and different between models.
As a drawback, this operation is much slower and the user needs to know and choose the image implementation method supported by the printer's commandset. However, almost all printers support printing images, so barcode
rendering can be performed externally by software and then sent
to the printer as an image.
As a drawback, this operation is much slower and the user needs
to know and choose the image implementation method supported by
the printer's commandset.
barcode-method barcode-method
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
Since version 3.0, the ``barcode`` method unifies the previous ``barcode`` (hardware) and ``soft_barcode`` (software) methods. Since version 3.0, the ``barcode`` method unifies the previous
It is able to choose automatically the best printer implementation for barcode printing based on the capabilities of the printer and the type of barcode desired. ``barcode`` (hardware) and ``soft_barcode`` (software) methods.
To achieve this, it relies on the information contained in the escpos-printer-db profiles. It is able to choose automatically the best printer implementation
The chosen profile needs to match the capabilities of the printer as closely as possible. for barcode printing based on the capabilities of the printer
and the type of barcode desired.
To achieve this, it relies on the information contained in the
escpos-printer-db profiles.
The chosen profile needs to match the capabilities of the printer
as closely as possible.
.. py:currentmodule:: escpos.escpos .. py:currentmodule:: escpos.escpos
@ -33,4 +43,5 @@ For alphanumeric CODE128 you have to preface your payload with `{B`.
# print CODE128 012ABCDabcd # print CODE128 012ABCDabcd
p.barcode("{B012ABCDabcd", "CODE128", function_type="B") p.barcode("{B012ABCDabcd", "CODE128", function_type="B")
A very good description on CODE128 is also on `Wikipedia <https://en.wikipedia.org/wiki/Code_128>`_. A very good description on CODE128 is also on
`Wikipedia <https://en.wikipedia.org/wiki/Code_128>`_.

View File

@ -1,24 +1,31 @@
.. _user_installation:
Installation Installation
============ ============
:Last Reviewed: 2016-07-23 :Last Reviewed: 2023-08-10
Installation with PIP Installation with PIP
--------------------- ---------------------
Installation should be rather straight-forward. python-escpos is on PyPi, so you can simply enter: Installation should be rather straight-forward. python-escpos is on PyPi,
so you can simply enter:
:: ::
pip install python-escpos pip install python-escpos
This should install all necessary dependencies. Apart from that python-escpos should also be This should install all necessary dependencies. Apart from that
available as a Debian package. If you want to always benefit from the newest stable releases you should probably python-escpos is for some versions also available as a Debian package.
install from PyPi. If you want to always benefit from the newest stable releases you should
always install from PyPi.
If you use the ``--pre`` parameter for ``pip``, you will get the latest
pre-release.
Setup udev for USB-Printers Setup udev for USB-Printers
--------------------------- ---------------------------
1. Get the *Product ID* and *Vendor ID* from the lsusb command 1. Get the *Product ID* and *Vendor ID* from the lsusb command
``# lsusb Bus 002 Device 001: ID 1a2b:1a2b Device name`` ``# lsusb Bus 002 Device 001: ID 1a2b:1a2b Device name``.
(Or whichever way your system supplies to get the PID and VID.)
2. Create a udev rule to let users belonging to *dialout* group use the 2. Create a udev rule to let users belonging to *dialout* group use the
printer. You can create the file printer. You can create the file

View File

@ -1,12 +1,12 @@
Methods Methods
======= =======
:Last Reviewed: 2017-01-25 :Last Reviewed: 2023-08-10
Escpos class Escpos class
------------ ------------
The core part of this libraries API is the Escpos class. The core part of the API of this library is the Escpos class.
You use it by instantiating a :doc:`printer <printers>` which is a child of Escpos. You use it by instantiating a :doc:`printer <printers>` which is a child of Escpos.
The following methods are available: The following methods are available:

View File

@ -1,15 +1,18 @@
Printers Printers
======== ========
:Last Reviewed: 2022-11-25 :Last Reviewed: 2023-08-10
As of now there are 7 different type of printer implementations. As of now there are 8 different types of printer implementations.
USB USB
--- ---
The USB-class uses pyusb and libusb to communicate with USB-based The USB-class uses pyusb and libusb to communicate with USB-based
printers. Note that this driver is not suited for USB-to-Serial-adapters printers.
and similiar devices, but only for those implementing native USB.
.. note::
This driver is not suited for USB-to-Serial-adapters
and similiar devices, but only for those implementing native USB.
.. autoclass:: escpos.printer.Usb .. autoclass:: escpos.printer.Usb
:members: :members:
@ -44,20 +47,24 @@ This driver is based on the socket class.
Troubleshooting Troubleshooting
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
Problems with a network-attached printer can have numerous causes. Make sure that your device has a proper IP address. Problems with a network-attached printer can have numerous causes.
Often you can check the IP address by triggering the self-test of the device. As a next step try to send text Make sure that your device has a proper IP address.
manually to the device. You could use for example: 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 echo "OK\n" | nc IPADDRESS 9100
# the port number is often 9100 # the port number is often 9100
As a last resort try to reset the interface of the printer. This should be described in its manual. As a last resort try to reset the interface of the printer.
This should be described in its manual.
File File
---- ----
This printer "prints" just into a file-handle. Especially on \*nix-systems this comes very handy. This printer "prints" just into a file-handle.
Especially on \*nix-systems this comes very handy.
.. autoclass:: escpos.printer.File .. autoclass:: escpos.printer.File
:members: :members:
@ -67,8 +74,8 @@ This printer "prints" just into a file-handle. Especially on \*nix-systems this
Dummy Dummy
----- -----
The Dummy-printer is mainly for testing- and debugging-purposes. It stores The Dummy-printer is mainly for testing- and debugging-purposes.
all of the "output" as raw ESC/POS in a string and returns that. It stores all of the "output" as raw ESC/POS in a string and returns that.
.. autoclass:: escpos.printer.Dummy .. autoclass:: escpos.printer.Dummy
:members: :members:
@ -82,7 +89,10 @@ Supports both local and remote CUPS printers and servers.
The printer must be properly configured in CUPS administration. The printer must be properly configured in CUPS administration.
The connector generates a print job that is added to the CUPS queue. The connector generates a print job that is added to the CUPS queue.
.. todo:: fix import in documentation .. autoclass:: escpos.printer.CupsPrinter
:members:
:member-order: bysource
:noindex:
LP LP
---- ----
@ -91,10 +101,19 @@ Supports local and remote CUPS printers.
The printer must be properly configured in CUPS administration. The printer must be properly configured in CUPS administration.
The connector spawns a new sub-process where the command lp is executed. The connector spawns a new sub-process where the command lp is executed.
No dependencies required, but somehow the print queue will affect some print job such as barcode. No dependencies required, but somehow the print queue will affect some
print job such as barcode.
.. autoclass:: escpos.printer.LP .. autoclass:: escpos.printer.LP
:members: :members:
:special-members: :special-members:
:member-order: bysource :member-order: bysource
:noindex: :noindex:
Win32Raw
--------
This driver uses a native WIN32 interface of Windows in order to print.
Please refer to the code for documentation as this driver is currently
not included in the documentation build.
.. todo:: Include Win32Raw in documentation build

View File

@ -1,41 +1,26 @@
Raspberry Pi Raspberry Pi
============ ============
:Last Reviewed: 2017-01-05 :Last Reviewed: 2023-08-10
This instructions were tested on Raspbian Jessie. .. warning:: You should **never** directly connect an printer with RS232-interface
(serial port) directly to a Raspberry PI or similar interface
.. warning:: You should **never** directly connect an printer with RS232-interface (serial port) directly to (e.g. those simple USB-sticks without encasing).
a Raspberry PI or similar interface (e.g. those simple USB-sticks without encasing). Those interfaces are Those interfaces are based on 5V- or 3,3V-logic
based on 5V- or 3,3V-logic (the latter in the case of Raspberry PI). Classical RS232 uses 12V-logic and would (the latter in the case of Raspberry PI).
**thus destroy your interface**. Connect both systems with an appropriate *level shifter*. Classical RS232 uses 12V-logic and would **thus destroy your interface**.
Connect both systems with an appropriate *level shifter*.
Dependencies
------------
First, install the packages available on Raspbian.
::
sudo apt-get install python3 python3-setuptools python3-pip libjpeg8-dev
Installation Installation
------------ ------------
You can install by using pip3. The installation should be performed as described in :ref:`user_installation`.
::
sudo pip3 install --upgrade pip
sudo pip3 install python-escpos
Run Run
--- ---
You need sudo and python3 to run your program. You can run this software as on any other Linux system.
:: Attach your printer and test it with the example code in the project's set of examples.
You can find that in the
sudo python3 your-program.py `project-repository <https://github.com/python-escpos/python-escpos>`__.
Now you can attach your printer and and test it with the example code in the project's set of examples.
You can find that in the `project-repository <https://github.com/python-escpos/python-escpos>`__.
For more details on this check the :doc:`installation-manual <installation>`. For more details on this check the :doc:`installation-manual <installation>`.

View File

@ -1,7 +1,7 @@
Usage Usage
===== =====
:Last Reviewed: 2017-06-10 :Last Reviewed: 2023-08-10
Define your printer Define your printer
------------------- -------------------

View File

@ -45,6 +45,8 @@ HW_RESET = ESC + b"\x3f\x0a\x00" # Reset printer hardware
_CASH_DRAWER = ( _CASH_DRAWER = (
lambda m, t1="", t2="": ESC + b"p" + m + six.int2byte(t1) + six.int2byte(t2) lambda m, t1="", t2="": ESC + b"p" + m + six.int2byte(t1) + six.int2byte(t2)
) )
#: decimal cash drawer kick sequence
CD_KICK_DEC_SEQUENCE = ( CD_KICK_DEC_SEQUENCE = (
lambda esc, p, m, t1=50, t2=50: six.int2byte(esc) lambda esc, p, m, t1=50, t2=50: six.int2byte(esc)
+ six.int2byte(p) + six.int2byte(p)
@ -52,8 +54,10 @@ CD_KICK_DEC_SEQUENCE = (
+ six.int2byte(t1) + six.int2byte(t1)
+ six.int2byte(t2) + six.int2byte(t2)
) )
CD_KICK_2 = _CASH_DRAWER(b"\x00", 50, 50) # Sends a pulse to pin 2 [] #: Sends a pulse to pin 2 []
CD_KICK_5 = _CASH_DRAWER(b"\x01", 50, 50) # Sends a pulse to pin 5 [] CD_KICK_2 = _CASH_DRAWER(b"\x00", 50, 50)
#: Sends a pulse to pin 5 []
CD_KICK_5 = _CASH_DRAWER(b"\x01", 50, 50)
# Paper Cutter # Paper Cutter
_CUT_PAPER = lambda m: GS + b"V" + m _CUT_PAPER = lambda m: GS + b"V" + m

View File

@ -1021,8 +1021,11 @@ class Escpos(object):
def cashdraw(self, pin): def cashdraw(self, pin):
"""Send pulse to kick the cash drawer """Send pulse to kick the cash drawer
Kick cash drawer on pin 2 or pin 5 according to default parameter. Kick cash drawer on pin 2 (:py:const:`~escpos.constants.CD_KICK_2`)
For non default parameter send a decimal sequence i.e. [27,112,48] or [27,112,0,25,255] or pin 5 (:py:const:`~escpos.constants.CD_KICK_5`)
according to the default parameters.
For non default parameters send a decimal sequence i.e.
[27,112,48] or [27,112,0,25,255].
:param pin: pin number, 2 or 5 or list of decimals :param pin: pin number, 2 or 5 or list of decimals
:raises: :py:exc:`~escpos.exceptions.CashDrawerError` :raises: :py:exc:`~escpos.exceptions.CashDrawerError`
@ -1094,7 +1097,7 @@ class Escpos(object):
def print_and_feed(self, n=1): def print_and_feed(self, n=1):
"""Print data in print buffer and feed *n* lines """Print data in print buffer and feed *n* lines
if n not in range (0, 255) then ValueError will be raised If n not in range (0, 255) then a ValueError will be raised.
:param n: number of n to feed. 0 <= n <= 255. default: 1 :param n: number of n to feed. 0 <= n <= 255. default: 1
:raises ValueError: if not 0 <= n <= 255 :raises ValueError: if not 0 <= n <= 255
@ -1144,17 +1147,24 @@ class Escpos(object):
def panel_buttons(self, enable=True): def panel_buttons(self, enable=True):
"""Controls the panel buttons on the printer (e.g. FEED) """Controls the panel buttons on the printer (e.g. FEED)
When enable is set to False the panel buttons on the printer will be disabled. Calling the method with When enable is set to False the panel buttons on the printer
enable=True or without argument will enable the panel buttons. will be disabled.
Calling the method with `enable=True` or without argument
will enable the panel buttons.
If panel buttons are enabled, the function of the panel button, such as feeding, will be executed upon pressing If panel buttons are enabled, the function of the panel button,
the button. If the panel buttons are disabled, pressing them will not have any effect. such as feeding, will be executed upon pressing the button.
If the panel buttons are disabled, pressing them will not have
any effect.
This command is effective until the printer is initialized, reset or power-cycled. The default is enabled panel This command is effective until the printer is initialized,
buttons. resetted or power-cycled.
The default is enabled panel buttons.
Some panel buttons will always work, especially when printer is opened. See for more information the manual Some panel buttons will always work, especially when the
of your printer and the escpos-command-reference. printer is opened.
See for more information the manual of your printer and
the escpos-command-reference.
:param enable: controls the panel buttons :param enable: controls the panel buttons
:rtype: None :rtype: None
@ -1166,7 +1176,8 @@ class Escpos(object):
def query_status(self, mode): 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. :param mode: Integer that sets the status mode queried to the printer.
- RT_STATUS_ONLINE: Printer status. - RT_STATUS_ONLINE: Printer status.

View File

@ -440,9 +440,11 @@ if _CUPSPRINT:
"""Simple CUPS printer connector. """Simple CUPS printer connector.
.. note:: .. note::
Requires _pycups_ which in turn needs the cups development library package:
- Ubuntu/Debian: _libcups2-dev_ Requires ``pycups`` which in turn needs the cups development library package:
- OpenSuse/Fedora: _cups-devel_ - Ubuntu/Debian: ``libcups2-dev``
- OpenSuse/Fedora: ``cups-devel``
""" """
def __init__(self, printer_name=None, *args, **kwargs): def __init__(self, printer_name=None, *args, **kwargs):

View File

@ -34,6 +34,7 @@ deps = sphinx>=3.0.0
sphinxcontrib-spelling>=7.2.0 sphinxcontrib-spelling>=7.2.0
sphinxcontrib.datatemplates sphinxcontrib.datatemplates
sphinx_rtd_theme sphinx_rtd_theme
pycups
commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
[testenv:flake8] [testenv:flake8]