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
- method: pip
path: .
system_packages: true
system_packages: false

View File

@ -1,23 +1,32 @@
Contributing
============
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.
:Last Reviewed: 2023-08-10
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
well as possible.
The pull requests and issues will be prefilled with templates.
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
-----------
This project keeps a list of authors. 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.
This project keeps a list of authors.
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
`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
^^^
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`.
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
easier to review, and 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.
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 easier to review, and
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
^^^^^^^^^^
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.
Test
^^^^
Try to write tests whenever possible. Our goal for the future is 100% coverage.
You can copy the structure from other testcases. Please remember to adapt the docstrings.
Try to write tests whenever possible.
Our goal for the future is 100% coverage.
You can copy the structure from other testcases.
Please remember to adapt the docstrings.
Further reading
^^^^^^^^^^^^^^^
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.
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
===============
:Last Reviewed: 2023-08-10
* Update authors file
* Update changelog
* Set annotated tag for release and push to public github

View File

@ -1,6 +1,8 @@
TODO
====
:Last Reviewed: 2023-08-10
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.

View File

@ -1,6 +1,11 @@
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
:template: capabilities-template-encoding.jinja

View File

@ -2,7 +2,7 @@
Available Profiles
------------------
:Last Reviewed: 2023-07-29
:Last Reviewed: 2023-08-10
The following list describes which printer profiles are
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,
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
:template: capabilities-template.jinja

View File

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

View File

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

View File

@ -1,19 +1,29 @@
Printing Barcodes
-----------------
:Last Reviewed: 2023-05-16
:Last Reviewed: 2023-08-10
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.
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.
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.
This hardware renderered barcodes are fast but the supported
formats are limited by the printer itself and different between models.
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
~~~~~~~~~~~~~~
Since version 3.0, the ``barcode`` method unifies the previous ``barcode`` (hardware) and ``soft_barcode`` (software) methods.
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.
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.
Since version 3.0, the ``barcode`` method unifies the previous
``barcode`` (hardware) and ``soft_barcode`` (software) methods.
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.
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
@ -33,4 +43,5 @@ For alphanumeric CODE128 you have to preface your payload with `{B`.
# 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>`_.
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
============
:Last Reviewed: 2016-07-23
:Last Reviewed: 2023-08-10
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
This should install all necessary dependencies. Apart from that python-escpos should also be
available as a Debian package. If you want to always benefit from the newest stable releases you should probably
install from PyPi.
This should install all necessary dependencies. Apart from that
python-escpos is for some versions also available as a Debian package.
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
---------------------------
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
printer. You can create the file

View File

@ -1,12 +1,12 @@
Methods
=======
:Last Reviewed: 2017-01-25
:Last Reviewed: 2023-08-10
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.
The following methods are available:

View File

@ -1,15 +1,18 @@
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
---
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
and similiar devices, but only for those implementing native USB.
printers.
.. 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
:members:
@ -44,20 +47,24 @@ This driver is based on the socket class.
Troubleshooting
^^^^^^^^^^^^^^^
Problems with a network-attached printer can have numerous causes. Make sure that your device has a proper IP address.
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:
Problems with a network-attached printer can have numerous causes.
Make sure that your device has a proper IP address.
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
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
----
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
:members:
@ -67,8 +74,8 @@ This printer "prints" just into a file-handle. Especially on \*nix-systems this
Dummy
-----
The Dummy-printer is mainly for testing- and debugging-purposes. It stores
all of the "output" as raw ESC/POS in a string and returns that.
The Dummy-printer is mainly for testing- and debugging-purposes.
It stores all of the "output" as raw ESC/POS in a string and returns that.
.. autoclass:: escpos.printer.Dummy
:members:
@ -82,7 +89,10 @@ Supports both local and remote CUPS printers and servers.
The printer must be properly configured in CUPS administration.
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
----
@ -91,10 +101,19 @@ Supports local and remote CUPS printers.
The printer must be properly configured in CUPS administration.
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
:members:
:special-members:
:member-order: bysource
: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
============
: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 (e.g. those simple USB-sticks without encasing). Those interfaces are
based on 5V- or 3,3V-logic (the latter in the case of Raspberry PI). 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
.. warning:: You should **never** directly connect an printer with RS232-interface
(serial port) directly to a Raspberry PI or similar interface
(e.g. those simple USB-sticks without encasing).
Those interfaces are based on 5V- or 3,3V-logic
(the latter in the case of Raspberry PI).
Classical RS232 uses 12V-logic and would **thus destroy your interface**.
Connect both systems with an appropriate *level shifter*.
Installation
------------
You can install by using pip3.
::
sudo pip3 install --upgrade pip
sudo pip3 install python-escpos
The installation should be performed as described in :ref:`user_installation`.
Run
---
You need sudo and python3 to run your program.
You can run this software as on any other Linux system.
::
sudo python3 your-program.py
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>`__.
Attach your printer 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>`.

View File

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

View File

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

View File

@ -1021,8 +1021,11 @@ class Escpos(object):
def cashdraw(self, pin):
"""Send pulse to kick the cash drawer
Kick cash drawer on pin 2 or pin 5 according to default parameter.
For non default parameter send a decimal sequence i.e. [27,112,48] or [27,112,0,25,255]
Kick cash drawer on pin 2 (:py:const:`~escpos.constants.CD_KICK_2`)
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
:raises: :py:exc:`~escpos.exceptions.CashDrawerError`
@ -1094,7 +1097,7 @@ class Escpos(object):
def print_and_feed(self, n=1):
"""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
:raises ValueError: if not 0 <= n <= 255
@ -1144,17 +1147,24 @@ class Escpos(object):
def panel_buttons(self, enable=True):
"""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
enable=True or without argument will enable the panel buttons.
When enable is set to False the panel buttons on the printer
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
the button. If the panel buttons are disabled, pressing them will not have any effect.
If panel buttons are enabled, the function of the panel button,
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
buttons.
This command is effective until the printer is initialized,
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
of your printer and the escpos-command-reference.
Some panel buttons will always work, especially when the
printer is opened.
See for more information the manual of your printer and
the escpos-command-reference.
:param enable: controls the panel buttons
:rtype: None
@ -1166,7 +1176,8 @@ class Escpos(object):
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.

View File

@ -440,9 +440,11 @@ if _CUPSPRINT:
"""Simple CUPS printer connector.
.. note::
Requires _pycups_ which in turn needs the cups development library package:
- Ubuntu/Debian: _libcups2-dev_
- OpenSuse/Fedora: _cups-devel_
Requires ``pycups`` which in turn needs the cups development library package:
- Ubuntu/Debian: ``libcups2-dev``
- OpenSuse/Fedora: ``cups-devel``
"""
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.datatemplates
sphinx_rtd_theme
pycups
commands = sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
[testenv:flake8]