From b3145fad01f8628cb959b7d02e3caf1e5b8100c9 Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 12 Oct 2017 07:29:45 +0200 Subject: [PATCH 01/17] - Added RotatingFileHandler to log configuration. - switched most occurrences of "print" to "logger" --- config/logger.yaml | 19 ++++++++++++++ modules/action/__init__.py | 6 ++++- modules/base_plugins/actor.py | 25 ++++++++++++------ modules/base_plugins/sensor.py | 14 ++++++---- modules/base_plugins/steps.py | 13 +++++++--- modules/core/baseapi.py | 8 ++++-- modules/core/basetypes.py | 24 ++++++++++------- modules/core/core.py | 47 +++++++++++++++++++--------------- modules/fermenter/__init__.py | 7 +++-- modules/recipe_import/kbh.py | 6 ++++- 10 files changed, 117 insertions(+), 52 deletions(-) create mode 100644 config/logger.yaml diff --git a/config/logger.yaml b/config/logger.yaml new file mode 100644 index 0000000..adbd2e5 --- /dev/null +++ b/config/logger.yaml @@ -0,0 +1,19 @@ +version: 1 +formatters: + simple: + format: '%(asctime)s - %(levelname)-8s - %(name)s - %(message)s' +handlers: + console: + class: logging.StreamHandler + level: DEBUG + formatter: simple + stream: ext://sys.stdout + file: + class : logging.handlers.RotatingFileHandler + formatter: simple + filename: ./logs/app.log + maxBytes: 10000000 + backupCount: 3 +root: + level: DEBUG + handlers: [console, file] \ No newline at end of file diff --git a/modules/action/__init__.py b/modules/action/__init__.py index 715fdaa..55dd3ca 100644 --- a/modules/action/__init__.py +++ b/modules/action/__init__.py @@ -1,8 +1,12 @@ import json +import logging from flask_classy import FlaskView, route from modules.core.core import cbpi + class ActionView(FlaskView): + def __init__(self): + self.logger = logging.getLogger(__name__) @route('/', methods=['POST']) def action(self, action): @@ -15,7 +19,7 @@ class ActionView(FlaskView): 200: description: action invoked """ - print self.cbpi.cache["actions"] + self.logger.info(self.cbpi.cache["actions"]) self.cbpi.cache["actions"][action]["function"](self.cbpi) return ('',204) diff --git a/modules/base_plugins/actor.py b/modules/base_plugins/actor.py index c599de9..59f72f6 100644 --- a/modules/base_plugins/actor.py +++ b/modules/base_plugins/actor.py @@ -1,14 +1,17 @@ +import logging from modules.core.baseapi import Buzzer from modules.core.basetypes import Actor, KettleController, FermenterController from modules.core.core import cbpi + @cbpi.addon.actor.type("Dummy Actor") class Dummy(Actor): - + def __init__(self): + self.logger = logging.getLogger(__name__) @cbpi.addon.actor.action("WOHOO") def myaction(self): - print "HALLO!!!" + self.logger.debug("HALLO!!!") def on(self, power=100): ''' @@ -16,35 +19,41 @@ class Dummy(Actor): :param power: int value between 0 - 100 :return: ''' - print "ON" + self.logger.info("ON") def off(self): - print "OFF" + self.logger.info("OFF") @cbpi.addon.kettle.controller() class MyController(KettleController): + def __init__(self): + self.logger = logging.getLogger(__name__) def run(self): while self.is_running(): - print "HALLO" + self.logger.debug("HALLO") self.sleep(1) @cbpi.addon.fermenter.controller() class MyController2(FermenterController): - + def __init__(self): + self.logger = logging.getLogger(__name__) def run(self): while self.is_running(): - print "HALLO" + self.logger.debug("HALLO") self.sleep(1) @cbpi.addon.core.initializer(order=200) def init(cbpi): class MyBuzzer(Buzzer): + def __init__(self): + self.logger = logging.getLogger(__name__) + def beep(self): - print "BEEEEEEP" + self.logger.info("BEEEEEEP") cbpi.buzzer = MyBuzzer() diff --git a/modules/base_plugins/sensor.py b/modules/base_plugins/sensor.py index ded8ed5..1d5f24d 100644 --- a/modules/base_plugins/sensor.py +++ b/modules/base_plugins/sensor.py @@ -3,10 +3,12 @@ import os from os.path import join -from modules.core.basetypes import Actor, Sensor +from modules.core.basetypes import Sensor from modules.core.core import cbpi from modules.core.proptypes import Property -import random + +import logging + print "INit SENSOR" @cbpi.addon.sensor.type("Dummy Sensor") class Dummy(Sensor): @@ -14,8 +16,10 @@ class Dummy(Sensor): text = Property.Text(label="Text", required=True, description="This is a parameter", configurable=True) p = Property.Select(label="hallo",options=[1,2,3]) - def init(self): + def __init__(self): + self.logger = logging.getLogger(__name__) + def init(self): if self.api.get_config_parameter("unit","C") == "C": self.unit = "°C" else: @@ -23,8 +27,8 @@ class Dummy(Sensor): @cbpi.addon.sensor.action("WOHOO") def myaction(self): - print self.text - print "SENSOR ACTION HALLO!!!" + self.logger.info(self.text) + self.logger.debug("SENSOR ACTION HALLO!!!") def execute(self): while True: diff --git a/modules/base_plugins/steps.py b/modules/base_plugins/steps.py index bb4d404..409429e 100644 --- a/modules/base_plugins/steps.py +++ b/modules/base_plugins/steps.py @@ -1,3 +1,5 @@ +import logging + from modules.core.basetypes import Step from modules.core.core import cbpi from modules.core.proptypes import Property @@ -6,20 +8,23 @@ from modules.core.proptypes import Property @cbpi.addon.step.type("Dummy Step") class Dummy(Step): + def __init__(self): + self.logger = logging.getLogger(__name__) + @cbpi.addon.step.action("WOHOO") def myaction(self): self.stop_timer() self.start_timer(10) - print "HALLO" + self.logger.debug("HALLO") text = Property.Text(label="Text", configurable=True, description="WOHOOO") time = Property.Text(label="Text", configurable=True, description="WOHOOO") def execute(self): - #print self.text + self.logger.debug(self.text) pass def reset(self): - print "RESET STEP!!!" - self.stop_timer() \ No newline at end of file + self.logger.info("RESET STEP!!!") + self.stop_timer() diff --git a/modules/core/baseapi.py b/modules/core/baseapi.py index 9dbffad..38eaa7a 100755 --- a/modules/core/baseapi.py +++ b/modules/core/baseapi.py @@ -1,3 +1,5 @@ +import logging + from proptypes import * class BaseAPI(object): @@ -148,6 +150,8 @@ class CoreAPI(BaseAPI): key = "core" def __init__(self, cbpi): + self.logger = logging.getLogger(__name__) + self.cbpi = cbpi self.cbpi.cache["actions"] = {} self.cbpi.cache["init"] = [] @@ -160,7 +164,7 @@ class CoreAPI(BaseAPI): self.cbpi.cache["init"] = sorted(self.cbpi.cache["init"], key=lambda k: k['order']) for value in self.cbpi.cache.get("init"): - print value + self.logger.debug(value) value["function"](self.cbpi) def job(interval, method): @@ -168,7 +172,7 @@ class CoreAPI(BaseAPI): try: method(self.cbpi) except Exception as e: - print e + self.logger.debug(e) self.cbpi._socketio.sleep(interval) for value in self.cbpi.cache.get("background"): diff --git a/modules/core/basetypes.py b/modules/core/basetypes.py index 4f80b1f..999d221 100755 --- a/modules/core/basetypes.py +++ b/modules/core/basetypes.py @@ -1,3 +1,5 @@ +import logging + from modules.core.proptypes import Property import time @@ -13,6 +15,8 @@ class Base(object): self.__dirty = False class Actor(Base): + def __init__(self): + self.logger = logging.getLogger(__name__) @classmethod def init_global(cls): @@ -26,15 +30,15 @@ class Actor(Base): pass def on(self, power=100): - print "SWITCH ON" + self.logger.info("SWITCH ON") pass def off(self): - print "SWITCH OFF" + self.logger.info("SWITCH OFF") pass def power(self, power): - print "SET POWER", power + self.logger.info("SET POWER TO [%s]", power) pass def state(self): @@ -42,6 +46,8 @@ class Actor(Base): class Sensor(Base): + def __init__(self): + self.logger = logging.getLogger(__name__) unit = "" @@ -65,7 +71,7 @@ class Sensor(Base): self.cbpi.ws_emit("SENSOR_UPDATE", self.cbpi.cache["sensors"][self.id]) def execute(self): - print "EXECUTE" + self.logger.info("EXECUTE") pass @@ -229,7 +235,6 @@ class Timer(object): class Step(Base, Timer): - @classmethod def init_global(cls): pass @@ -251,12 +256,13 @@ class Step(Base, Timer): pass def execute(self): - print "-------------" - print "Step Info" - print "Kettle ID: %s" % self.kettle_id - print "ID: %s" % self.id + self.logger.info("-------------") + self.logger.info("Step Info") + self.logger.info("Kettle ID: %s" % self.kettle_id) + self.logger.info("ID: %s" % self.id) def __init__(self, *args, **kwds): + self.logger = logging.getLogger(__name__) for a in kwds: super(Step, self).__setattr__(a, kwds.get(a)) diff --git a/modules/core/core.py b/modules/core/core.py index 861826c..48fa71a 100755 --- a/modules/core/core.py +++ b/modules/core/core.py @@ -1,8 +1,10 @@ import json import logging +import logging.config import os import sqlite3 import uuid +import yaml from datetime import datetime from functools import wraps, update_wrapper from importlib import import_module @@ -62,6 +64,8 @@ class ActorCore(object): key = "actor_types" def __init__(self, cbpi): + self.logger = logging.getLogger(__name__) + self.cbpi = cbpi self.cbpi.cache["actors"] = {} self.cbpi.cache[self.key] = {} @@ -72,7 +76,7 @@ class ActorCore(object): def init_one(self, id): try: - print "INIT ONE ACTOR", id + self.logger.info("INIT ONE ACTOR [%s]", id) actor = self.cbpi.cache["actors"][id] clazz = self.cbpi.cache[self.key].get(actor.type)["class"] cfg = actor.config.copy() @@ -82,8 +86,7 @@ class ActorCore(object): actor.power = 100 self.cbpi.emit("INIT_ACTOR", id=id) except Exception as e: - print e - self.cbpi._app.logger.error(e) + self.logger.error(e) def stop_one(self, id): self.cbpi.cache["actors"][id]["instance"].stop() @@ -99,7 +102,7 @@ class ActorCore(object): self.cbpi.emit("SWITCH_ACTOR_ON", id=id, power=power) return True except Exception as e: - print e + self.logger.error(e) return False def off(self, id): @@ -111,7 +114,7 @@ class ActorCore(object): self.cbpi.emit("SWITCH_ACTOR_OFF", id=id) return True except Exception as e: - print e + self.logger.error(e) return False def toggle(self, id): @@ -129,7 +132,7 @@ class ActorCore(object): self.cbpi.emit("SWITCH_ACTOR_POWER_CHANGE", id=id, power=power) return True except Exception as e: - print e + self.logger.error(e) return False def action(self, id, method): @@ -147,14 +150,16 @@ class ActorCore(object): job = self.cbpi._socketio.start_background_task(target=toggle, id=id, seconds=seconds) def get_state(self, actor_id): - print actor_id - print self.cbpi + self.logger.debug(actor_id) + self.logger.debug(self.cbpi) class SensorCore(object): key = "sensor_types" def __init__(self, cbpi): + self.logger = logging.getLogger(__name__) + self.cbpi = cbpi self.cbpi.cache["sensors"] = {} self.cbpi.cache["sensor_instances"] = {} @@ -172,7 +177,7 @@ class SensorCore(object): cfg.update(dict(cbpi=self.cbpi, id=id)) self.cbpi.cache["sensors"][id].instance = clazz(**cfg) self.cbpi.cache["sensors"][id].instance.init() - print self.cbpi.cache["sensors"][id].instance + self.logger.debug(self.cbpi.cache["sensors"][id].instance) self.cbpi.emit("INIT_SENSOR", id=id) def job(obj): @@ -182,11 +187,10 @@ class SensorCore(object): self.cbpi.emit("INIT_SENSOR", id=id) except Exception as e: - print "ERROR" - self.cbpi._app.logger.error(e) + self.logger.error(e) def stop_one(self, id): - print "OBJ", self.cbpi.cache["sensors"][id] + self.logger.info("OBJ [%s]", self.cbpi.cache["sensors"][id]) self.cbpi.cache["sensors"][id].instance.stop() self.cbpi.emit("STOP_SENSOR", id=id) @@ -197,8 +201,8 @@ class SensorCore(object): return None def get_state(self, actor_id): - print actor_id - print self.cbpi + self.logger.info("Get state actor id [%s]", actor_id) + self.logger.debug(self.cbpi) def write_log(self, id, value, prefix="sensor"): filename = "./logs/%s_%s.log" % (prefix, str(id)) @@ -277,8 +281,11 @@ class CraftBeerPI(object): eventbus = {} def __init__(self): - FORMAT = '%(asctime)-15s - %(levelname)s - %(message)s' - logging.basicConfig(filename='./logs/app.log', level=logging.INFO, format=FORMAT) + #FORMAT = '%(asctime)-15s - %(levelname)s - %(message)s' + #logging.basicConfig(filename='./logs/app.log', level=logging.INFO, format=FORMAT) + logging.config.dictConfig(yaml.load(open('./config/logger.yaml', 'r'))) + self.logger = logging.getLogger(__name__) + self.cache["messages"] = [] self.cache["version"] = "3.1" self.modules = {} @@ -324,7 +331,7 @@ class CraftBeerPI(object): self._socketio.emit(key, data, namespace='/brew') def __init_db(self, ): - print "INIT DB" + self.logger.info("INIT DB") with self._app.app_context(): db = self.get_db() try: @@ -332,7 +339,7 @@ class CraftBeerPI(object): db.cursor().executescript(f.read()) db.commit() except Exception as e: - print e + self.logger.error(e) pass def nocache(self, view): @@ -383,13 +390,13 @@ class CraftBeerPI(object): def loadPlugins(self): for filename in os.listdir("./modules/plugins"): - print filename + self.logger.info("Loading plugin [%s]", filename) if os.path.isdir("./modules/plugins/" + filename) is False: continue try: self.modules[filename] = import_module("modules.plugins.%s" % (filename)) except Exception as e: - print e + self.logger.error(e) self.notify("Failed to load plugin %s " % filename, str(e), type="danger", timeout=None) diff --git a/modules/fermenter/__init__.py b/modules/fermenter/__init__.py index b6ce4c9..d11b842 100644 --- a/modules/fermenter/__init__.py +++ b/modules/fermenter/__init__.py @@ -1,3 +1,4 @@ +import logging import time from flask import request from flask_classy import route @@ -12,6 +13,8 @@ class FermenterView(BaseView): model = Fermenter cache_key = "fermenter" + def __init__(self): + self.logger = logging.getLogger(__name__) def _post_post_callback(self, m): m.state = False @@ -159,7 +162,7 @@ class FermenterView(BaseView): def toggle(self, id): fermenter = cbpi.cache.get(self.cache_key)[id] try: - print fermenter.state + self.logger.info("Fermenter [%s] is in state [%s]",fermenter.id, fermenter.state) if fermenter.state is False: # Start controller if fermenter.logic is not None: @@ -185,7 +188,7 @@ class FermenterView(BaseView): cbpi.emit("FERMENTER_CONTROLLER_STOPPED", id=id) except Exception as e: - print e + self.logger.error(e) cbpi.notify("Toogle Fementer Controller failed", "Pleae check the %s configuration" % fermenter.name, type="danger", timeout=None) return ('', 500) diff --git a/modules/recipe_import/kbh.py b/modules/recipe_import/kbh.py index 8cdfd4b..e43b57f 100644 --- a/modules/recipe_import/kbh.py +++ b/modules/recipe_import/kbh.py @@ -1,3 +1,5 @@ +import logging + from flask import json, request from flask_classy import FlaskView, route from git import Repo, Git @@ -11,6 +13,8 @@ from modules.step import Step, StepView class KBH(FlaskView): + def __init__(self): + self.logger = logging.getLogger(__name__) @route('/', methods=['GET']) def get(self): @@ -39,7 +43,7 @@ class KBH(FlaskView): result.append({"id": row[0], "name": row[1], "brewed": row[2]}) return json.dumps(result) except Exception as e: - print e + self.logger.error(e) self.api.notify(headline="Failed to load KHB database", message="ERROR", type="danger") return ('', 500) finally: From 52bb994997adc3b6efeb23ba2fc10e081cd53ca4 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 13 Oct 2017 06:19:06 +0200 Subject: [PATCH 02/17] replaced the remaining print statements with calls to logger --- modules/base_plugins/sensor.py | 7 +++++-- modules/core/baseapi.py | 2 +- modules/core/basetypes.py | 21 ++++++++++--------- modules/core/db_migrate.py | 6 +++--- .../example_plugins/WebViewJquery/__init__.py | 6 +++++- .../WebViewReactJs/__init__.py | 5 ++++- modules/login/__init__.py | 9 ++++---- modules/ui/__init__.py | 7 +++++-- 8 files changed, 39 insertions(+), 24 deletions(-) diff --git a/modules/base_plugins/sensor.py b/modules/base_plugins/sensor.py index 1d5f24d..2c11924 100644 --- a/modules/base_plugins/sensor.py +++ b/modules/base_plugins/sensor.py @@ -9,7 +9,7 @@ from modules.core.proptypes import Property import logging -print "INit SENSOR" + @cbpi.addon.sensor.type("Dummy Sensor") class Dummy(Sensor): @@ -18,6 +18,7 @@ class Dummy(Sensor): def __init__(self): self.logger = logging.getLogger(__name__) + self.logger.info("INIT SENSOR") def init(self): if self.api.get_config_parameter("unit","C") == "C": @@ -40,7 +41,9 @@ class Dummy(Sensor): @cbpi.addon.core.action(key="clear", label="Clear all Logs") def woohoo(cbpi): - print "COOL" + logger = logging.getLogger(__name__) + logger.info("COOL") + dir = "./logs" test = os.listdir(dir) diff --git a/modules/core/baseapi.py b/modules/core/baseapi.py index 38eaa7a..6433eca 100755 --- a/modules/core/baseapi.py +++ b/modules/core/baseapi.py @@ -224,5 +224,5 @@ class CoreAPI(BaseAPI): class Buzzer(object): - def beep(): + def beep(self): pass \ No newline at end of file diff --git a/modules/core/basetypes.py b/modules/core/basetypes.py index 999d221..2e83eaf 100755 --- a/modules/core/basetypes.py +++ b/modules/core/basetypes.py @@ -14,13 +14,13 @@ class Base(object): self.value = None self.__dirty = False + class Actor(Base): - def __init__(self): - self.logger = logging.getLogger(__name__) + __logger = logging.getLogger(__name__) @classmethod def init_global(cls): - print "GLOBAL INIT ACTOR" + cls.__logger.info("GLOBAL INIT ACTOR") pass def init(self): @@ -30,15 +30,15 @@ class Actor(Base): pass def on(self, power=100): - self.logger.info("SWITCH ON") + self._logger.info("SWITCH ON") pass def off(self): - self.logger.info("SWITCH OFF") + self._logger.info("SWITCH OFF") pass def power(self, power): - self.logger.info("SET POWER TO [%s]", power) + self._logger.info("SET POWER TO [%s]", power) pass def state(self): @@ -46,8 +46,7 @@ class Actor(Base): class Sensor(Base): - def __init__(self): - self.logger = logging.getLogger(__name__) + __logger = logging.getLogger(__name__) unit = "" @@ -71,7 +70,7 @@ class Sensor(Base): self.cbpi.ws_emit("SENSOR_UPDATE", self.cbpi.cache["sensors"][self.id]) def execute(self): - self.logger.info("EXECUTE") + self.__logger.info("EXECUTE") pass @@ -81,9 +80,11 @@ class ControllerBase(object): __dirty = False __running = False + __logger = logging.getLogger(__name__) + @staticmethod def init_global(): - print "GLOBAL CONTROLLER INIT" + ControllerBase.__logger.info("GLOBAL CONTROLLER INIT") def notify(self, headline, message, type="success", timeout=5000): self.api.notify(headline, message, type, timeout) diff --git a/modules/core/db_migrate.py b/modules/core/db_migrate.py index 21d38e4..096166d 100644 --- a/modules/core/db_migrate.py +++ b/modules/core/db_migrate.py @@ -19,8 +19,8 @@ def execute_file(curernt_version, data): conn.commit() except sqlite3.OperationalError as err: - print "EXCEPT" - print err + cbpi._app.logger.info("EXCEPT") + cbpi._app.logger.error(err) @cbpi.addon.core.initializer(order=-9999) def init(cbpi): @@ -37,7 +37,7 @@ def init(cbpi): pass result = [] for filename in os.listdir("./update"): - print filename + cbpi._app.logger.info(filename) if filename.endswith(".sql"): d = {"version": int(filename[:filename.index('_')]), "file": filename} result.append(d) diff --git a/modules/example_plugins/WebViewJquery/__init__.py b/modules/example_plugins/WebViewJquery/__init__.py index db896a9..aa29e7c 100644 --- a/modules/example_plugins/WebViewJquery/__init__.py +++ b/modules/example_plugins/WebViewJquery/__init__.py @@ -5,15 +5,19 @@ from flask_swagger import swagger from flask import json from flask import Blueprint +import logging + @addon.core.initializer(order=22) def web(cbpi): + logger = logging.getLogger(__name__) + s = Blueprint('web_view', __name__, template_folder='templates', static_folder='static') @s.route('/', methods=["GET"]) def index(): return s.send_static_file("index.html") - print "REGISTER" + logger.info("REGISTER") cbpi.addon.core.add_menu_link("JQuery View", "/web_view") cbpi._app.register_blueprint(s, url_prefix='/web_view') diff --git a/modules/example_plugins/WebViewReactJs/__init__.py b/modules/example_plugins/WebViewReactJs/__init__.py index 0c22b7e..8f6c607 100644 --- a/modules/example_plugins/WebViewReactJs/__init__.py +++ b/modules/example_plugins/WebViewReactJs/__init__.py @@ -5,8 +5,11 @@ from flask_swagger import swagger from flask import json from flask import Blueprint +import logging + @addon.core.initializer(order=22) def web(cbpi): + logger = logging.getLogger(__name__) s = Blueprint('webviewreact', __name__, template_folder='templates', static_folder='static') @@ -14,6 +17,6 @@ def web(cbpi): def index(): return s.send_static_file("index.html") - print "REGISTER" + logger.info("REGISTER") cbpi.addon.core.add_menu_link("ReactJS View", "/webviewreact") cbpi._app.register_blueprint(s, url_prefix='/webviewreact') diff --git a/modules/login/__init__.py b/modules/login/__init__.py index a7bc38b..a41e9d7 100644 --- a/modules/login/__init__.py +++ b/modules/login/__init__.py @@ -3,12 +3,14 @@ from flask import request from modules.core.core import cbpi, addon +import logging + class User(flask_login.UserMixin): pass @addon.core.initializer(order=0) def log(cbpi): - + logger = logging.getLogger(__name__) cbpi._login_manager = flask_login.LoginManager() cbpi._login_manager.init_app(cbpi._app) @@ -37,9 +39,8 @@ def log(cbpi): @cbpi._login_manager.user_loader def user_loader(user): - - print cbpi.get_config_parameter("password_security", "NO") - print user + logger.debug(cbpi.get_config_parameter("password_security", "NO")) + logger.debug(user) if cbpi.get_config_parameter("password_security", "NO") == "YES": if user != "craftbeerpi": diff --git a/modules/ui/__init__.py b/modules/ui/__init__.py index 975bf07..09b9189 100755 --- a/modules/ui/__init__.py +++ b/modules/ui/__init__.py @@ -2,7 +2,10 @@ from flask import Blueprint,render_template from modules.core.core import cbpi +import logging + react = Blueprint('ui', __name__, template_folder='templates', static_folder='static') +__logger = logging.getLogger(__name__) @cbpi.addon.core.initializer(order=10) def init(cbpi): @@ -11,13 +14,13 @@ def init(cbpi): @react.route('/', methods=["GET"]) def index(): - #return react.send_static_file("index.html") + # return react.send_static_file("index.html") js_files = [] for key, value in cbpi.cache["js"].iteritems(): js_files.append(value) - print js_files + __logger.info(js_files) return render_template('index.html', js_files=js_files) From ec335ecadffa718e65e5748b86817603348e648b Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 18 Oct 2017 06:36:38 +0200 Subject: [PATCH 03/17] fixed bug where logger stopped logging, because of calling cbpi.run() twice --- modules/core/basetypes.py | 1 + modules/core/core.py | 12 +++++++----- run.py | 6 ------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/modules/core/basetypes.py b/modules/core/basetypes.py index 2e83eaf..75dc319 100755 --- a/modules/core/basetypes.py +++ b/modules/core/basetypes.py @@ -65,6 +65,7 @@ class Sensor(Base): def update_value(self, value): self.value = value + self.__logger.info("Updated value for sensor [%s] with value [%s].", self.id, value) self.cbpi.sensor.write_log(self.id, value) self.cbpi.emit("SENSOR_UPDATE", id=self.id, value=value) self.cbpi.ws_emit("SENSOR_UPDATE", self.cbpi.cache["sensors"][self.id]) diff --git a/modules/core/core.py b/modules/core/core.py index 48fa71a..685d653 100755 --- a/modules/core/core.py +++ b/modules/core/core.py @@ -205,9 +205,11 @@ class SensorCore(object): self.logger.debug(self.cbpi) def write_log(self, id, value, prefix="sensor"): + self.logger.info("Write Log") filename = "./logs/%s_%s.log" % (prefix, str(id)) formatted_time = strftime("%Y-%m-%d %H:%M:%S", localtime()) msg = str(formatted_time) + "," + str(value) + "\n" + self.logger.info("Write to log [%s]", msg) with open(filename, "a") as file: file.write(msg) @@ -246,7 +248,7 @@ class BrewingCore(object): # Start controller if kettle.logic is not None: cfg = kettle.config.copy() - cfg.update(dict(api=cbpi, kettle_id=kettle.id, heater=kettle.heater, sensor=kettle.sensor)) + cfg.update(dict(api=self.cbpi, kettle_id=kettle.id, heater=kettle.heater, sensor=kettle.sensor)) instance = self.get_controller(kettle.logic).get("class")(**cfg) instance.init() kettle.instance = instance @@ -256,13 +258,13 @@ class BrewingCore(object): t = self.cbpi._socketio.start_background_task(target=run, instance=instance) kettle.state = not kettle.state - self.cbpi.ws_emit("UPDATE_KETTLE", cbpi.cache.get("kettle").get(id)) + self.cbpi.ws_emit("UPDATE_KETTLE", self.cbpi.cache.get("kettle").get(id)) self.cbpi.emit("KETTLE_CONTROLLER_STARTED", id=id) else: # Stop controller kettle.instance.stop() kettle.state = not kettle.state - self.cbpi.ws_emit("UPDATE_KETTLE", cbpi.cache.get("kettle").get(id)) + self.cbpi.ws_emit("UPDATE_KETTLE", self.cbpi.cache.get("kettle").get(id)) self.cbpi.emit("KETTLE_CONTROLLER_STOPPED", id=id) @@ -285,6 +287,7 @@ class CraftBeerPI(object): #logging.basicConfig(filename='./logs/app.log', level=logging.INFO, format=FORMAT) logging.config.dictConfig(yaml.load(open('./config/logger.yaml', 'r'))) self.logger = logging.getLogger(__name__) + self.logger.info("Logger got initialized.") self.cache["messages"] = [] self.cache["version"] = "3.1" @@ -399,6 +402,5 @@ class CraftBeerPI(object): self.logger.error(e) self.notify("Failed to load plugin %s " % filename, str(e), type="danger", timeout=None) - cbpi = CraftBeerPI() -addon = cbpi.addon +addon = cbpi.addon \ No newline at end of file diff --git a/run.py b/run.py index 8a6a549..659fb35 100755 --- a/run.py +++ b/run.py @@ -1,12 +1,6 @@ #!/usr/bin/env python from modules.core.core import * - -cbpi = CraftBeerPI() - -addon = cbpi.addon - - from modules.core.db_migrate import * from modules.buzzer import * from modules.config import * From 35e94b111db3e185e83ad37837010ed17c7c4968 Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 18 Oct 2017 06:51:29 +0200 Subject: [PATCH 04/17] tidied up some log statements --- modules/core/core.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/core/core.py b/modules/core/core.py index ee9fdd7..5e5e78f 100755 --- a/modules/core/core.py +++ b/modules/core/core.py @@ -203,11 +203,9 @@ class SensorCore(object): pass def write_log(self, id, value, prefix="sensor"): - self.logger.info("Write Log") filename = "./logs/%s_%s.log" % (prefix, str(id)) formatted_time = strftime("%Y-%m-%d %H:%M:%S", localtime()) msg = str(formatted_time) + "," + str(value) + "\n" - self.logger.info("Write to log [%s]", msg) with open(filename, "a") as file: file.write(msg) @@ -314,7 +312,7 @@ class CraftBeerPI(object): port = int(cbpi.get_config_parameter('port', '5000')) except ValueError: port = 5000 - print port + self.logger.info("port [%s]", port) self._socketio.run(self._app, host='0.0.0.0', port=port) def beep(self): From 4443eafd723ab32672154cf1feafc284e0221cf8 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Oct 2017 12:10:15 +0200 Subject: [PATCH 05/17] JST: added codebeatignore file --- update/5_kairosdb_config.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 update/5_kairosdb_config.sql diff --git a/update/5_kairosdb_config.sql b/update/5_kairosdb_config.sql new file mode 100644 index 0000000..e69de29 From a6607669c0ce372cfd2943889e181797ad90c404 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Oct 2017 20:26:10 +0200 Subject: [PATCH 06/17] Added igonore file for codebeat analysis --- .codebeatignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .codebeatignore diff --git a/.codebeatignore b/.codebeatignore new file mode 100644 index 0000000..c28e2d4 --- /dev/null +++ b/.codebeatignore @@ -0,0 +1 @@ +modules/ui/static/** \ No newline at end of file From 0af3d280ebbca64649c5ddbcc131f95a5b5c421a Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Oct 2017 20:37:34 +0200 Subject: [PATCH 07/17] Added Better Code Hub badge to readme file --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 84730e1..6a880dc 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![BCH compliance](https://bettercodehub.com/edge/badge/isarvalley/craftbeerpi3?branch=core_refactoring)](https://bettercodehub.com/) + # CraftBeerPi V3.0 This is CraftBeerPi version 3.0. It's currently in beta status. From 7e3d590012b18b0b1c84e65e7690ed8fbf007081 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 22 Oct 2017 20:49:04 +0200 Subject: [PATCH 08/17] Added codebeat and codacy badge to readme file --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6a880dc..b403dbd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +[![codebeat badge](https://codebeat.co/badges/72fa1981-c82a-488f-9a53-9e21ed9de4cc)](https://codebeat.co/projects/github-com-isarvalley-craftbeerpi3-core_refactoring) + +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/0a970c7873f84953bd772c36d5ffc05c)](https://www.codacy.com/app/isar_valley/craftbeerpi3?utm_source=github.com&utm_medium=referral&utm_content=isarvalley/craftbeerpi3&utm_campaign=Badge_Grade) + [![BCH compliance](https://bettercodehub.com/edge/badge/isarvalley/craftbeerpi3?branch=core_refactoring)](https://bettercodehub.com/) # CraftBeerPi V3.0 From 1752b631bb4cd435db8d20dd67d70a829f33495a Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 23 Oct 2017 06:50:45 +0200 Subject: [PATCH 09/17] Added TravisCI configuration --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b107e9d --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: python \ No newline at end of file From 13ce3334c404cac1e95c9ac58e35635ca972a813 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 23 Oct 2017 07:04:27 +0200 Subject: [PATCH 10/17] Added Python version to TravisCI configuration --- .travis.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b107e9d..c76360f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,6 @@ -language: python \ No newline at end of file +language: python +python: + - "2.7" +# command to install dependencies +install: + - pip install -r requirements.txt \ No newline at end of file From 73e07264341767fc363999ece5885a75f04c3b36 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 24 Oct 2017 07:24:36 +0200 Subject: [PATCH 11/17] Added sample test case --- .travis.yml | 4 +++- modules/core/core.py | 8 +++++++- modules/logs/__init__.py | 4 +++- tests/logs/test_log_view.py | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 tests/logs/test_log_view.py diff --git a/.travis.yml b/.travis.yml index c76360f..70ff5ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,6 @@ python: - "2.7" # command to install dependencies install: - - pip install -r requirements.txt \ No newline at end of file + - pip install -r requirements.txt + +script: make test \ No newline at end of file diff --git a/modules/core/core.py b/modules/core/core.py index 5e5e78f..34af8ca 100755 --- a/modules/core/core.py +++ b/modules/core/core.py @@ -10,6 +10,7 @@ from functools import wraps, update_wrapper from importlib import import_module from time import localtime, strftime import time +import os.path from flask import Flask, redirect, json, g, make_response from flask_socketio import SocketIO @@ -275,11 +276,16 @@ class FermentationCore(object): class CraftBeerPI(object): + + _logger_configuration_file = './config/logger.yaml' + cache = {} eventbus = {} def __init__(self): - logging.config.dictConfig(yaml.load(open('./config/logger.yaml', 'r'))) + if os.path.isfile(self._logger_configuration_file): + logging.config.dictConfig(yaml.load(open(self._logger_configuration_file, 'r'))) + self.logger = logging.getLogger(__name__) self.logger.info("Logger got initialized.") diff --git a/modules/logs/__init__.py b/modules/logs/__init__.py index d3dfc4e..0193261 100755 --- a/modules/logs/__init__.py +++ b/modules/logs/__init__.py @@ -7,6 +7,8 @@ from modules.core.core import cbpi class LogView(FlaskView): + _log_directory = "./logs" + @route('/', methods=['GET']) def get_all_logfiles(self): """ @@ -19,7 +21,7 @@ class LogView(FlaskView): description: List of all log files """ result = [] - for filename in os.listdir("./logs"): + for filename in os.listdir(self._log_directory): if filename.endswith(".log"): result.append(filename) return json.dumps(result) diff --git a/tests/logs/test_log_view.py b/tests/logs/test_log_view.py new file mode 100644 index 0000000..6e0c46e --- /dev/null +++ b/tests/logs/test_log_view.py @@ -0,0 +1,19 @@ +import unittest + +from modules.logs import LogView + + +class TestLogView(unittest.TestCase): + + def test_get_all_logfiles(self): + LogView._log_directory = "../../logs" + + log_view = LogView() + logfiles = log_view.get_all_logfiles() + + print(logfiles) + self.assertTrue(len(logfiles) > 0) + + +if __name__ == '__main__': + unittest.main() From cb11cab1d081e81a18d04f2053f1a73c3e698015 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 24 Oct 2017 07:31:11 +0200 Subject: [PATCH 12/17] Added sample test case --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 70ff5ff..19fc223 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,4 @@ python: install: - pip install -r requirements.txt -script: make test \ No newline at end of file +script: py.test \ No newline at end of file From 4d59b9dc0745ee0554c0b1479263aea656508fcb Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 25 Oct 2017 07:24:29 +0200 Subject: [PATCH 13/17] changed travis configuration to get py.test to work --- .travis.yml | 7 ++++++- tests/logs/test_log_view.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 19fc223..9dbb61d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,13 @@ language: python python: - "2.7" + +before_install: + - pip install pytest pytest-cov + # command to install dependencies install: - pip install -r requirements.txt -script: py.test \ No newline at end of file +script: + - py.test \ No newline at end of file diff --git a/tests/logs/test_log_view.py b/tests/logs/test_log_view.py index 6e0c46e..94ade0f 100644 --- a/tests/logs/test_log_view.py +++ b/tests/logs/test_log_view.py @@ -6,7 +6,7 @@ from modules.logs import LogView class TestLogView(unittest.TestCase): def test_get_all_logfiles(self): - LogView._log_directory = "../../logs" + LogView._log_directory = "./logs" log_view = LogView() logfiles = log_view.get_all_logfiles() From 476be946e0ce58ffe3b049f9f8bd7138ee2b0ca8 Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 25 Oct 2017 07:47:57 +0200 Subject: [PATCH 14/17] changed travis configuration to get py.test to work --- .travis.yml | 2 +- tests/__init__.py | 0 tests/logs/__init__.py | 0 tests/logs/test_log_view.py | 10 +++------- 4 files changed, 4 insertions(+), 8 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/logs/__init__.py diff --git a/.travis.yml b/.travis.yml index 9dbb61d..0aeab50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python python: - "2.7" - + before_install: - pip install pytest pytest-cov diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/logs/__init__.py b/tests/logs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/logs/test_log_view.py b/tests/logs/test_log_view.py index 94ade0f..d43a636 100644 --- a/tests/logs/test_log_view.py +++ b/tests/logs/test_log_view.py @@ -1,19 +1,15 @@ -import unittest from modules.logs import LogView -class TestLogView(unittest.TestCase): +class TestLogView(object): def test_get_all_logfiles(self): + LogView._log_directory = "./logs" log_view = LogView() logfiles = log_view.get_all_logfiles() print(logfiles) - self.assertTrue(len(logfiles) > 0) - - -if __name__ == '__main__': - unittest.main() + assert (len(logfiles) == 2) From 82d685d13ca560d5cd05811641eb4990c9417f64 Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 25 Oct 2017 20:47:01 +0200 Subject: [PATCH 15/17] changed travis configuration to get py.test to work --- tests/logs/test_log_view.py | 12 +++++------- tests/testlib/__init__.py | 0 tests/testlib/utils.py | 13 +++++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 tests/testlib/__init__.py create mode 100644 tests/testlib/utils.py diff --git a/tests/logs/test_log_view.py b/tests/logs/test_log_view.py index d43a636..7e67920 100644 --- a/tests/logs/test_log_view.py +++ b/tests/logs/test_log_view.py @@ -1,15 +1,13 @@ - from modules.logs import LogView +from tests.testlib import utils class TestLogView(object): def test_get_all_logfiles(self): + LogView._log_directory = utils.get_base_path() + "/logs" - LogView._log_directory = "./logs" - - log_view = LogView() - logfiles = log_view.get_all_logfiles() + logfiles = LogView().get_all_logfiles() - print(logfiles) - assert (len(logfiles) == 2) + # if no log file is found then two square brackets "[]" are returned and string length is 2 + assert (len(logfiles) > 2) diff --git a/tests/testlib/__init__.py b/tests/testlib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/testlib/utils.py b/tests/testlib/utils.py new file mode 100644 index 0000000..c35922f --- /dev/null +++ b/tests/testlib/utils.py @@ -0,0 +1,13 @@ +import os + + +def get_base_path(): + marker_file = "run.py" + + current_path = os.getcwd() + + while current_path != 0: + if marker_file in os.listdir(current_path): + return current_path + + current_path = os.path.dirname(os.path.normpath(current_path)) From 8c570be899b89873f48b13f6a4207134b0d50bcc Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 25 Oct 2017 21:05:47 +0200 Subject: [PATCH 16/17] removed special requirements for py.test from travis configuration --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0aeab50..eba4a1d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,8 @@ language: python python: - "2.7" -before_install: - - pip install pytest pytest-cov +#before_install: +# - pip install pytest pytest-cov # command to install dependencies install: From 933096624e52b138717b88de611425e6b021d31e Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 25 Oct 2017 21:10:34 +0200 Subject: [PATCH 17/17] added travis build status to readme file --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b403dbd..6a679b9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/isarvalley/craftbeerpi3.svg?branch=core_refactoring)](https://travis-ci.org/isarvalley/craftbeerpi3) + [![codebeat badge](https://codebeat.co/badges/72fa1981-c82a-488f-9a53-9e21ed9de4cc)](https://codebeat.co/projects/github-com-isarvalley-craftbeerpi3-core_refactoring) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/0a970c7873f84953bd772c36d5ffc05c)](https://www.codacy.com/app/isar_valley/craftbeerpi3?utm_source=github.com&utm_medium=referral&utm_content=isarvalley/craftbeerpi3&utm_campaign=Badge_Grade)