diff --git a/README.rst b/README.rst index d5c3d98..dc380d9 100644 --- a/README.rst +++ b/README.rst @@ -57,6 +57,17 @@ simply by adding a parameter named `sftpserver` to your test function: As can be seen from this example `sftpserver` serves content directly from python objects instead of files. +It is also possible to use the package without `pytest`: + +.. code-block:: python + + from pytest_sftpserver import sftpserver_factory + + @sftpserver_factory() + def test_sftp_fetch(sftpserver): + with sftpserver.serve_content({'a_dir': {'somefile.txt': "File content"}}): + assert get_sftp_file(sftpserver.host, sftpserver.port, "user", + "pw", "/a_dir/somefile.txt") == "File content" Installation ============ diff --git a/pytest_sftpserver/__init__.py b/pytest_sftpserver/__init__.py index c542a71..c9c78f2 100644 --- a/pytest_sftpserver/__init__.py +++ b/pytest_sftpserver/__init__.py @@ -1,5 +1,3 @@ -VERSION = (1, 3, 0) +from pytest_sftpserver.decorator import sftpserver_factory # noqa: F401 - -def get_version(): - return ".".join(str(i) for i in VERSION) +from .__version__ import VERSION, get_version # noqa: F401 diff --git a/pytest_sftpserver/__version__.py b/pytest_sftpserver/__version__.py new file mode 100644 index 0000000..c542a71 --- /dev/null +++ b/pytest_sftpserver/__version__.py @@ -0,0 +1,5 @@ +VERSION = (1, 3, 0) + + +def get_version(): + return ".".join(str(i) for i in VERSION) diff --git a/pytest_sftpserver/decorator.py b/pytest_sftpserver/decorator.py new file mode 100644 index 0000000..9594702 --- /dev/null +++ b/pytest_sftpserver/decorator.py @@ -0,0 +1,23 @@ +from functools import wraps + +from pytest_sftpserver.sftp.server import SFTPServer + + +class sftpserver_factory(object): + def __enter__(self): + self.server = SFTPServer() + self.server.start() + return self.server + + def __exit__(self, *args, **kwargs): + if self.server.is_alive(): + self.server.shutdown() + + def __call__(self, func): + @wraps(func) + def wrapper(*args, **kwargs): + with self: + kwargs["sftpserver"] = self.server + return func(*args, **kwargs) + + return wrapper diff --git a/pytest_sftpserver/plugin.py b/pytest_sftpserver/plugin.py index 6b3680a..8d45686 100644 --- a/pytest_sftpserver/plugin.py +++ b/pytest_sftpserver/plugin.py @@ -3,15 +3,10 @@ import pytest -from pytest_sftpserver.sftp.server import SFTPServer +from pytest_sftpserver.decorator import sftpserver_factory @pytest.yield_fixture(scope="session") def sftpserver(request): - server = SFTPServer() - server.start() - - yield server - - if server.is_alive(): - server.shutdown() + with sftpserver_factory() as server: + yield server diff --git a/setup.py b/setup.py index 8b08e4b..c5f3cd3 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,25 @@ +import codecs +import os +import re + from setuptools import setup, find_packages, Command +here = os.path.abspath(os.path.dirname(__file__)) + + +def read(*parts): + with codecs.open(os.path.join(here, *parts), 'r') as fp: + return fp.read() + -version = __import__('pytest_sftpserver').get_version() +def find_version(*file_paths): + version_file = read(*file_paths) + version_match = re.search( + r"^VERSION = \(([^\)]*)\)", version_file, re.M + ) + if version_match: + return '.'.join(i.strip() for i in version_match.group(1).split(',')) + raise RuntimeError('Unable to find version string.') class Test(Command): @@ -23,7 +41,7 @@ def run(self): setup( name='pytest-sftpserver', - version=version, + version=find_version('pytest_sftpserver', '__version__.py'), author='Ulrich Petri', author_email='mail@ulo.pe', license='MIT License', diff --git a/tests/test_sftp.py b/tests/test_sftp.py index 4b23f0b..41b566f 100644 --- a/tests/test_sftp.py +++ b/tests/test_sftp.py @@ -6,6 +6,7 @@ from paramiko.channel import Channel from paramiko.sftp_client import SFTPClient +from pytest_sftpserver import sftpserver_factory from pytest_sftpserver.sftp.server import SFTPServer # fmt: off @@ -188,3 +189,8 @@ def test_sftpserver_chmod_non_existing(sftpclient, sftpserver): with sftpserver.serve_content({}): with pytest.raises(IOError): sftpclient.chmod("/a", 600) + + +@sftpserver_factory() +def test_decorator(sftpserver): + assert isinstance(sftpserver, SFTPServer)