diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index a7eb764..36ed5e6 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -17,6 +17,10 @@ I have:
**Printer:** Manufacturer Model XVI
+
**python-escpos version:** 0.0.0
+ **python version:** 0.0
+
**operating system:**
diff --git a/.gitignore b/.gitignore
index 8c4de97..247392d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@ temp
build/
dist/
.coverage
+src/escpos/version.py
# testing temporary directories
test/test-cli-output/
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index b7be3cd..a8d0d63 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,21 @@
Changelog
*********
+2016-07-23 - Version 2.1.0 - "But Who's Counting?"
+--------------------------------------------------
+
+changes
+^^^^^^^
+- packaging: configured the coverage-analysis codecov.io
+- GitHub: improved issues-template
+- documentation: add troubleshooting tip to network-interface
+- the module, cli and documentation is now aware of the version of python-escpos
+- the cli does now support basic tabcompletion
+
+contributors
+^^^^^^^^^^^^
+- Patrick Kanzler
+
2016-06-24 - Version 2.0.0 - "Attitude Adjuster"
------------------------------------------------
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 0000000..50302f9
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,5 @@
+coverage:
+ range: "60...100"
+
+comment: off
+
diff --git a/doc/conf.py b/doc/conf.py
index 0c9568a..2cbe0cf 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -15,7 +15,10 @@
import sys
import os
on_rtd = os.getenv('READTHEDOCS') == 'True'
-from setuptools_scm import get_version
+if on_rtd:
+ import escpos
+else:
+ from setuptools_scm import get_version
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -70,10 +73,14 @@ copyright = u'2016, Manuel F Martinez and others'
# |version| and |release|, also used in various other places throughout the
# built documents.
#
+if on_rtd:
+ # The full version, including alpha/beta/rc tags.
+ release = escpos.__version__
+else:
+ # locally setuptools_scm should work
+ release = get_version(root=root)
# The short X.Y version.
-version = get_version(root=root)
-# The full version, including alpha/beta/rc tags.
-release = version
+version = '.'.join(release.split('.')[:2]) # The short X.Y version.
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/index.rst b/doc/index.rst
index 2b30b31..8e876a0 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -12,7 +12,6 @@ Content
:maxdepth: 1
:caption: User Documentation
- user/dependencies
user/installation
user/methods
user/printers
diff --git a/doc/user/dependencies.rst b/doc/user/dependencies.rst
deleted file mode 100644
index cc2963d..0000000
--- a/doc/user/dependencies.rst
+++ /dev/null
@@ -1,57 +0,0 @@
-************
-Dependencies
-************
-
-Fedora
-------
-
-Fortunately everything is on Fedora repositories.
-
-::
-
- # yum install python-imaging pyserial pyusb python-qrcode
-
-Ubuntu
-------
-
-Ultimately, this instructions also apply to Raspbian, in case you are
-interested to install python-escpos on your Raspberry with Raspbian.
-
-Install the packages available on distro repositories.
-
-::
-
- # apt-get install python-imaging pyserial
-
-The packages which are not available at Ubuntu repositories need to be
-installed manually.
-
-pyusb
-^^^^^
-This is the python binding to libusb-1.0
-
-* Get the latest tarball from `sourceforge `__
-* Build and install it
-
-::
-
- # tar zxvf pyusb-1.*.tar.gz
- # cd pyusb-1.*
- # python setup.py build
- # sudo python setup.py install
-
-python-qrcode
-^^^^^^^^^^^^^
-
-This is the python module to generate QR Codes
-
-* Checkout the latest code from `github `__
-* Build and install it
-
-::
-
- # git clone https://github.com/lincolnloop/python-qrcode
- # cd python-qrcode
- # python setup.py build
- # sudo python setup.py install
-
diff --git a/doc/user/installation.rst b/doc/user/installation.rst
index be08c8a..4c826b6 100644
--- a/doc/user/installation.rst
+++ b/doc/user/installation.rst
@@ -2,16 +2,26 @@
Installation
************
-System preparation
-------------------
+:Last Reviewed: 2016-07-23
-1. Install the required
- `dependencies `__
+Installation with PIP
+---------------------
+Installation should be rather straight-forward. python-escpos is on PyPi, so you can simply enter:
-2. Get the *Product ID* and *Vendor ID* from the lsusb command
+ ::
+
+ 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.
+
+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``
-3. 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
``/etc/udev/rules.d/99-escpos.rules`` and add the following:
``SUBSYSTEM=="usb", ATTRS{idVendor}=="1a2b", ATTRS{idProduct}=="1a2b", MODE="0664", GROUP="dialout"``
@@ -20,21 +30,19 @@ System preparation
"dialout" group, or use another group you already belongs instead
"dialout" and set it in the ``GROUP`` parameter in the above rule.
-4. Restart udev ``# sudo service udev restart`` In some new systems it
+3. Restart udev ``# sudo service udev restart`` In some new systems it
is done with ``# sudo udevadm control --reload``
-Install
--------
+Enabling tab-completion in CLI
+------------------------------
+python-escpos has a CLI with tab-completion. This is realised with ``argcomplete``.
+In order for this to work you have to enable tab-completion, which is described in
+the `manual of argcomplete `__.
-* Clone python-escpos from github
-* Change directory to python-escpos and install the package
+If you only want to enable it for python-escpos, or global activation does not work, try this:
- ::
+ ::
- # cd python-escpos
- # python setup.py build
- # sudo python setup.py install
-
-* Enjoy !!!
+ eval "$(register-python-argcomplete python-escpos)"
diff --git a/doc/user/printers.rst b/doc/user/printers.rst
index c1f5495..cdf3c0f 100644
--- a/doc/user/printers.rst
+++ b/doc/user/printers.rst
@@ -35,6 +35,17 @@ Based on socket
* ``host`` is an alphanumeric host name, could be either DNS host name or IP address.
* ``port`` to write to (default = 9100)
+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:
+
+::
+ 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.
+
File("file\_name")
^^^^^^^^^^^^^^^^^^
diff --git a/setup.py b/setup.py
index 7ca8222..7a3895b 100755
--- a/setup.py
+++ b/setup.py
@@ -45,9 +45,24 @@ class Tox(test_command):
errno = tox.cmdline(args=args)
sys.exit(errno)
+
+setuptools_scm_template = """\
+# coding: utf-8
+# file generated by setuptools_scm
+# don't change, don't track in version control
+from __future__ import unicode_literals
+
+version = '{version}'
+
+"""
+
+
setup(
name='python-escpos',
- use_scm_version=True,
+ use_scm_version={
+ 'write_to': 'src/escpos/version.py',
+ 'write_to_template': setuptools_scm_template,
+ },
url='https://github.com/python-escpos/python-escpos',
download_url='https://github.com/python-escpos/python-escpos/archive/master.zip',
description='Python library to manipulate ESC/POS Printers',
@@ -95,6 +110,8 @@ setup(
'six',
'appdirs',
'pyyaml',
+ 'argparse',
+ 'argcomplete',
],
setup_requires=[
'setuptools_scm',
diff --git a/src/escpos/__init__.py b/src/escpos/__init__.py
index 0459ce8..3fbc808 100644
--- a/src/escpos/__init__.py
+++ b/src/escpos/__init__.py
@@ -1 +1,19 @@
+# -*- coding: utf-8 -*-
+"""
+python-escpos enables you to manipulate escpos-printers
+"""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
__all__ = ["constants", "escpos", "exceptions", "printer"]
+
+try:
+ from .version import version as __version__ # noqa
+except ImportError: # pragma: no cover
+ raise ImportError(
+ 'Failed to find (autogenerated) version.py. '
+ 'This might be because you are installing from GitHub\'s tarballs, '
+ 'use the PyPI ones.'
+ )
diff --git a/src/escpos/cli.py b/src/escpos/cli.py
index e2e8a83..3e3311d 100644
--- a/src/escpos/cli.py
+++ b/src/escpos/cli.py
@@ -1,4 +1,5 @@
#!/usr/bin/env python
+# PYTHON_ARGCOMPLETE_OK
""" CLI
This module acts as a command line interface for python-escpos. It mirrors
@@ -14,9 +15,15 @@ from __future__ import print_function
from __future__ import unicode_literals
import argparse
+try:
+ import argcomplete
+except ImportError:
+ # this CLI works nevertheless without argcomplete
+ pass # noqa
import sys
import six
from . import config
+from . import version
# Must be defined before it's used in DEMO_FUNCTIONS
@@ -448,14 +455,17 @@ def main():
# Allow config file location to be passed
parser.add_argument(
'-c', '--config',
- help='Altnerate path to the configuration file',
+ help='Alternate path to the configuration file',
)
# Everything interesting runs off of a subparser so we can use the format
# cli [subparser] -args
command_subparsers = parser.add_subparsers(
title='ESCPOS Command',
+ dest='parser',
)
+ # fix inconsistencies in the behaviour of some versions of argparse
+ command_subparsers.required = False # force 'required' testing
# Build the ESCPOS command arguments
for command in ESCPOS_COMMANDS:
@@ -491,6 +501,14 @@ def main():
action='store_true',
)
+ parser_command_version = command_subparsers.add_parser('version',
+ help='Print the version of python-escpos')
+ parser_command_version.set_defaults(version=True)
+
+ # hook in argcomplete
+ if 'argcomplete' in globals():
+ argcomplete.autocomplete(parser)
+
# Get only arguments actually passed
args_dict = vars(parser.parse_args())
if not args_dict:
@@ -498,6 +516,12 @@ def main():
sys.exit()
command_arguments = dict([k, v] for k, v in six.iteritems(args_dict) if v is not None)
+ # If version should be printed, do this, then exit
+ print_version = command_arguments.pop('version', None)
+ if print_version:
+ print(version.version)
+ sys.exit()
+
# If there was a config path passed, grab it
config_path = command_arguments.pop('config', None)
@@ -511,6 +535,9 @@ def main():
target_command = command_arguments.pop('func')
+ # remove helper-argument 'parser' from dict
+ command_arguments.pop('parser', None)
+
if hasattr(printer, target_command):
# print command with args
getattr(printer, target_command)(**command_arguments)
diff --git a/test/test_cli.py b/test/test_cli.py
index 03beb2d..b9aebc3 100644
--- a/test/test_cli.py
+++ b/test/test_cli.py
@@ -11,6 +11,7 @@ import os
import sys
from scripttest import TestFileEnvironment
from nose.tools import assert_equals
+import escpos
TEST_DIR = os.path.abspath('test/test-cli-output')
@@ -29,7 +30,7 @@ printer:
)
-class TestCLI:
+class TestCLI():
""" Contains setups, teardowns, and tests for CLI
"""
@@ -60,8 +61,7 @@ class TestCLI:
)
self.default_args = (
- sys.executable,
- '-mescpos.cli',
+ 'python-escpos',
'-c',
CONFIGFILE,
)
@@ -79,10 +79,16 @@ class TestCLI:
def test_cli_help(self):
""" Test getting help from cli """
- result = self.env.run(sys.executable, '-mescpos.cli', '-h')
+ result = self.env.run('python-escpos', '-h')
assert not result.stderr
assert 'usage' in result.stdout
+ def test_cli_version(self):
+ """ Test the version string """
+ result = self.env.run('python-escpos', 'version')
+ assert not result.stderr
+ assert_equals(escpos.__version__, result.stdout.strip())
+
def test_cli_text(self):
""" Make sure text returns what we sent it """
test_text = 'this is some text'