pax_global_header00006660000000000000000000000064137523056120014516gustar00rootroot0000000000000052 comment=0f96e22de0bd44b10f0b017960188a40b20efe9b tiagocoutinho-connio-c5462b1/000077500000000000000000000000001375230561200162055ustar00rootroot00000000000000tiagocoutinho-connio-c5462b1/.gitignore000066400000000000000000000022241375230561200201750ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # dotenv .env # virtualenv .venv venv/ ENV/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ tiagocoutinho-connio-c5462b1/README.md000066400000000000000000000034151375230561200174670ustar00rootroot00000000000000# connio ![Pypi version][pypi] A python concurrency agnostic communication library. Pass a URL to the single point API function `connio.connection_for_url()` and it will return a communication object with a common generic API. Helpful when dealing with instrumentation which work over serial line or TCP (and in future USB) with simple REQ-REP communication protocols (example: [SCPI](https://en.m.wikipedia.org/wiki/Standard_Commands_for_Programmable_Instruments)). The request for a communication object is forwarded to the corresponding [serialio][serialio] or [sockio][sockio] libraries depending on the URL you give. Written in asyncio with support for different concurrency models: * asyncio * classic blocking API * future based API * python 2 compatible blocking API (for those pour souls stuck with python 2) ## Installation From within your favorite python environment: ```console pip install connio ``` ## Usage ```python import asyncio from connio import connection_for_url async def main(): # A local async serial line sl = connection_for_url("serial:///dev/ttyS0", parity="E") print(await sl.write_readline(b"*IDN?\n")) # An async serial line over telnet server sl = connection_for_url("rfc2217://moxa.acme.org:7890", parity="E") print(await sl.write_readline(b"*IDN?\n")) # An async TCP connection tcp = connection_for_url("tcp://gepace.acme.org:5025") print(await tcp.write_readline(b"*IDN?\n")) # An sync TCP connection tcp = connection_for_url("tcp://gepace.acme.org:5025", concurrency="sync") print(tcp.write_readline(b"*IDN?\n")) asyncio.run(main()) ``` [pypi]: https://img.shields.io/pypi/pyversions/connio.svg [serialio]: https://github.com/tiagocoutinho/serialio [sockio]: https://github.com/tiagocoutinho/sockio tiagocoutinho-connio-c5462b1/connio/000077500000000000000000000000001375230561200174725ustar00rootroot00000000000000tiagocoutinho-connio-c5462b1/connio/__init__.py000066400000000000000000000011421375230561200216010ustar00rootroot00000000000000__version__ = "0.2.0" import urllib.parse SERIAL_SCHEMES = {'serial', 'serial-tcp', 'serial-tango', 'rfc2217'} SOCKET_SCHEMES = {'tcp'} def connection_for_url(url, *args, **kwargs): url_result = urllib.parse.urlparse(url) scheme = url_result.scheme if scheme in SERIAL_SCHEMES: from serialio import serial_for_url return serial_for_url(url, *args, **kwargs) elif scheme in SOCKET_SCHEMES: from sockio import socket_for_url return socket_for_url(url, *args, **kwargs) else: raise ValueError("unsupported scheme {!r} for {}".format(scheme, url)) tiagocoutinho-connio-c5462b1/setup.cfg000066400000000000000000000010611375230561200200240ustar00rootroot00000000000000[bumpversion] current_version = 0.2.0 commit = True tag = True [bumpversion:file:setup.py] search = version="{current_version}" replace = version="{new_version}" [bumpversion:file:connio/__init__.py] search = __version__ = "{current_version}" replace = __version__ = "{new_version}" [bdist_wheel] universal = 1 [flake8] max-line-length = 88 extend-ignore = E203 exclude = docs [aliases] test = pytest [tool:pytest] collect_ignore = ['setup.py'] addopts = --cov-config=.coveragerc --cov connio --cov-report html --cov-report term --durations=2 --verbose tiagocoutinho-connio-c5462b1/setup.py000066400000000000000000000023571375230561200177260ustar00rootroot00000000000000# -*- coding: utf-8 -*- """The setup script.""" import sys from setuptools import setup, find_packages with open("README.md") as f: description = f.read() setup( name="connio", author="Jose Tiago Macara Coutinho", author_email="coutinhotiago@gmail.com", classifiers=[ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", ], description="Concurrency agnostic socket API", license="GPLv3+", long_description=description, long_description_content_type="text/markdown", keywords="socket, tcp, ser2net, serial, rs232, rfc2217, asyncio", packages=find_packages(), install_requires=["serialio>=2.2", "sockio>=0.11"], url="https://tiagocoutinho.github.io/connio/", project_urls={ "Documentation": "https://tiagocoutinho.github.io/connio/", "Source": "https://github.com/tiagocoutinho/connio/", }, version="0.2.0", python_requires=">=3.5", zip_safe=True, )