Merge branch 'release/0.0.1'

Ein allererstes "Release". Ab jetzt wird auch konsequent versioniert.
This commit is contained in:
Juergen Edelbluth 2018-08-19 11:07:26 +02:00
commit fdcdd5817b
9 changed files with 107 additions and 11 deletions

2
.gitignore vendored
View File

@ -166,3 +166,5 @@ fabric.properties
[Ss]cripts
pyvenv.cfg
pip-selfcheck.json
.pytest_cache/

15
.travis.yml Normal file
View File

@ -0,0 +1,15 @@
language: python
python:
- 3.5
- 3.6
- 3.7-dev
cache: pip
install:
pip install -r src/requirements-test.txt
script:
- cd src
- py.test --cov --cov-report term-missing --cov-config .coveragerc test/

View File

@ -1,3 +1,8 @@
| Branch | Build Status |
|---------|----------------------------------------------------------------------------------------------------------------------------------------------|
| master | [![Build Status master](https://travis-ci.org/juergen-rocks/raumklima.svg?branch=master)](https://travis-ci.org/juergen-rocks/raumklima) |
| develop | [![Build Status develop](https://travis-ci.org/juergen-rocks/raumklima.svg?branch=develop)](https://travis-ci.org/juergen-rocks/raumklima) |
# ELV Raumklimastation RS 500 unter Linux auslesen
Der Elektronikversender [ELV](https://www.elv.de/) bietet unter der Artikelnummer [68-12 87 19](https://www.elv.de/elv-raumklimastation-rs500-inkl-5-sensoren-messwertespeicher-und-pc-auswertesoftware.html) eine Raumklimastation mit 5 Sensoren an, die sich über einen USB-Anschluss am PC auswerten lassen soll. Dazu liegt die proprietäre Windows-Software "EasyTemp" bei. Eine Unterstützung für Linux wird nicht angeboten.

7
src/.coveragerc Normal file
View File

@ -0,0 +1,7 @@
[run]
omit =
test/*
*/venv/*
*/pyvenv/*
*/JetBrains/*
*/virtualenv/*

View File

@ -0,0 +1,2 @@
pytest>=3.7.2,<3.8
pytest-cov>=2.5.1,<2.6

View File

@ -1,7 +1,7 @@
import configparser
from os import getenv
from os.path import join, exists, isfile
from pathlib import Path
import os.path
import pathlib
class ConfigProvider(object):
@ -9,7 +9,8 @@ class ConfigProvider(object):
def __init__(self, file: str):
self.__config = configparser.ConfigParser()
self.__config.optionxform = str
self.__config.read(file)
with open(file, 'r') as fp:
self.__config.read_file(fp)
def get_config(self) -> configparser.ConfigParser:
return self.__config
@ -17,19 +18,19 @@ class ConfigProvider(object):
def discover_config_file_by_name(filename: str, script_dir: str=None, env_var: str='RS500_CONFIG_PATH') -> str:
if script_dir is not None:
candidate = join(script_dir, filename)
if exists(candidate) and isfile(candidate):
candidate = os.path.join(script_dir, filename)
if os.path.exists(candidate) and os.path.isfile(candidate):
return candidate
if env_var is not None:
env_var_value = getenv(env_var, None)
if env_var_value is not None:
candidate = join(env_var_value, filename)
if exists(candidate) and isfile(candidate):
candidate = os.path.join(env_var_value, filename)
if os.path.exists(candidate) and os.path.isfile(candidate):
return candidate
candidate = join(str(Path.home().absolute()), '.rs500', filename)
if exists(candidate) and isfile(candidate):
candidate = os.path.join(str(pathlib.Path.home().absolute()), '.rs500', filename)
if os.path.exists(candidate) and os.path.isfile(candidate):
return candidate
candidate = join('/etc', filename)
if exists(candidate) and isfile(candidate):
candidate = os.path.join('/etc', filename)
if os.path.exists(candidate) and os.path.isfile(candidate):
return candidate
raise FileNotFoundError('Unable to find configuration file "{}"'.format(filename))

0
src/test/__init__.py Normal file
View File

View File

@ -0,0 +1,18 @@
from os.path import join, dirname, exists
import pytest
from rs500common.configuration import ConfigProvider
def test_config_provider_smoke_error():
with pytest.raises(FileNotFoundError):
ConfigProvider('/does/not/exist.ini')
def test_config_provider_on_existing_file():
file = join(dirname(__file__), '..', 'check_rs500.ini')
assert exists(file)
cf = ConfigProvider(file)
keys = cf.get_config().keys()
assert len(keys) > 0

View File

@ -0,0 +1,46 @@
import os.path
import pathlib
import pytest
from _pytest.monkeypatch import MonkeyPatch
from rs500common.configuration import discover_config_file_by_name
def test_discovery_file_in_folder(monkeypatch: MonkeyPatch):
with monkeypatch.context() as m:
m.setattr('os.path.isfile', lambda path: True)
m.setattr('os.path.exists', lambda path: True)
result = discover_config_file_by_name('test.ini', '/foo/bar')
assert result == os.path.join('/foo/bar', 'test.ini')
def test_discovery_via_env_var(monkeypatch: MonkeyPatch):
with monkeypatch.context() as m:
m.setenv('RS500_CONFIG_PATH', '/rs500_config_path/here/we/are')
m.setattr('os.path.isfile', lambda path: True)
m.setattr('os.path.exists', lambda path: True)
result = discover_config_file_by_name('test.ini', script_dir=None)
assert result == os.path.join('/rs500_config_path/here/we/are', 'test.ini')
def test_discovery_via_user_home(monkeypatch: MonkeyPatch):
with monkeypatch.context() as m:
m.setattr('os.path.isfile', lambda path: True)
m.setattr('os.path.exists', lambda path: True)
monkeypatch.setattr(pathlib.Path, 'absolute', lambda x: '/user/home/path/test')
result = discover_config_file_by_name('test.ini', script_dir=None)
assert result == os.path.join('/user/home/path/test', '.rs500', 'test.ini')
def test_discovery_in_etc(monkeypatch: MonkeyPatch):
with monkeypatch.context() as m:
m.setattr('os.path.isfile', lambda path: path.startswith('/etc'))
m.setattr('os.path.exists', lambda path: path.startswith('/etc'))
result = discover_config_file_by_name('test.ini')
assert result == os.path.join('/etc', 'test.ini')
def test_no_hit():
with pytest.raises(FileNotFoundError):
discover_config_file_by_name('does-not-exist.nothing', 'bla-blubb')