Skip to content

Commit

Permalink
new step controller
Browse files Browse the repository at this point in the history
  • Loading branch information
Manuel83 committed Jan 17, 2021
1 parent 8ced607 commit 05e08d0
Show file tree
Hide file tree
Showing 26 changed files with 1,050 additions and 126 deletions.
114 changes: 114 additions & 0 deletions .vscode/.ropeproject/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# The default ``config.py``
# flake8: noqa


def set_prefs(prefs):
"""This function is called before opening the project"""

# Specify which files and folders to ignore in the project.
# Changes to ignored resources are not added to the history and
# VCSs. Also they are not returned in `Project.get_files()`.
# Note that ``?`` and ``*`` match all characters but slashes.
# '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'
# 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'
# '.svn': matches 'pkg/.svn' and all of its children
# 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'
# 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'
prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject',
'.hg', '.svn', '_svn', '.git', '.tox']

# Specifies which files should be considered python files. It is
# useful when you have scripts inside your project. Only files
# ending with ``.py`` are considered to be python files by
# default.
# prefs['python_files'] = ['*.py']

# Custom source folders: By default rope searches the project
# for finding source folders (folders that should be searched
# for finding modules). You can add paths to that list. Note
# that rope guesses project source folders correctly most of the
# time; use this if you have any problems.
# The folders should be relative to project root and use '/' for
# separating folders regardless of the platform rope is running on.
# 'src/my_source_folder' for instance.
# prefs.add('source_folders', 'src')

# You can extend python path for looking up modules
# prefs.add('python_path', '~/python/')

# Should rope save object information or not.
prefs['save_objectdb'] = True
prefs['compress_objectdb'] = False

# If `True`, rope analyzes each module when it is being saved.
prefs['automatic_soa'] = True
# The depth of calls to follow in static object analysis
prefs['soa_followed_calls'] = 0

# If `False` when running modules or unit tests "dynamic object
# analysis" is turned off. This makes them much faster.
prefs['perform_doa'] = True

# Rope can check the validity of its object DB when running.
prefs['validate_objectdb'] = True

# How many undos to hold?
prefs['max_history_items'] = 32

# Shows whether to save history across sessions.
prefs['save_history'] = True
prefs['compress_history'] = False

# Set the number spaces used for indenting. According to
# :PEP:`8`, it is best to use 4 spaces. Since most of rope's
# unit-tests use 4 spaces it is more reliable, too.
prefs['indent_size'] = 4

# Builtin and c-extension modules that are allowed to be imported
# and inspected by rope.
prefs['extension_modules'] = []

# Add all standard c-extensions to extension_modules list.
prefs['import_dynload_stdmods'] = True

# If `True` modules with syntax errors are considered to be empty.
# The default value is `False`; When `False` syntax errors raise
# `rope.base.exceptions.ModuleSyntaxError` exception.
prefs['ignore_syntax_errors'] = False

# If `True`, rope ignores unresolvable imports. Otherwise, they
# appear in the importing namespace.
prefs['ignore_bad_imports'] = False

# If `True`, rope will insert new module imports as
# `from <package> import <module>` by default.
prefs['prefer_module_from_imports'] = False

# If `True`, rope will transform a comma list of imports into
# multiple separate import statements when organizing
# imports.
prefs['split_imports'] = False

# If `True`, rope will remove all top-level import statements and
# reinsert them at the top of the module when making changes.
prefs['pull_imports_to_top'] = True

# If `True`, rope will sort imports alphabetically by module name instead
# of alphabetically by import statement, with from imports after normal
# imports.
prefs['sort_imports_alphabetically'] = False

# Location of implementation of
# rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general
# case, you don't have to change this value, unless you're an rope expert.
# Change this value to inject you own implementations of interfaces
# listed in module rope.base.oi.type_hinting.providers.interfaces
# For example, you can add you own providers for Django Models, or disable
# the search type-hinting in a class hierarchy, etc.
prefs['type_hinting_factory'] = (
'rope.base.oi.type_hinting.factory.default_type_hinting_factory')


def project_opened(project):
"""This function is called after opening the project"""
# Do whatever you like here!
Binary file added .vscode/.ropeproject/objectdb
Binary file not shown.
4 changes: 3 additions & 1 deletion cbpi/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@
"on_startup",
"request_mapping",
"action",
"parameters",
"background_task",
"CBPiKettleLogic",
"CBPiSimpleStep",
"CBPiException",
"KettleException",
"SensorException",
"ActorException",
"CBPiSensor"]
"CBPiSensor",
"CBPiStep"]

from cbpi.api.actor import *
from cbpi.api.sensor import *
Expand Down
9 changes: 8 additions & 1 deletion cbpi/api/decorator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from voluptuous import Schema

__all__ = ["request_mapping", "on_startup", "on_event", "action", "background_task"]
__all__ = ["request_mapping", "on_startup", "on_event", "action", "background_task", "parameters"]

from aiohttp_auth import auth

Expand Down Expand Up @@ -73,6 +73,13 @@ def real_decorator(func):

return real_decorator

def parameters(parameter):
def real_decorator(func):
func.cbpi_p = True
func.cbpi_parameters = parameter
return func
return real_decorator

def background_task(name, interval):
def real_decorator(func):
func.background_task = True
Expand Down
2 changes: 0 additions & 2 deletions cbpi/api/property.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ class Number(PropertyType):
'''
def __init__(self, label, configurable=False, default_value=None, unit="", description=""):
'''
Test
:param label:
:param configurable:
Expand Down
54 changes: 54 additions & 0 deletions cbpi/api/step.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,61 @@
import asyncio
import logging
from abc import abstractmethod, ABCMeta
import logging

class CBPiStep(metaclass=ABCMeta):
def __init__(self, cbpi, id, name, props) :
self.cbpi = cbpi
self.props = {"wohoo": 0, "count": 5, **props}
self.id = id
self.name = name
self.status = 0
self.running = False
self.stop_reason = None
self.pause = False
self.task = None
self._exception_count = 0
self._max_exceptions = 2
self.state_msg = "No state"

def get_state(self):
return self.state_msg

def stop(self):
self.stop_reason = "STOP"
self.running = False

def start(self):
self.running = True
self.stop_reason = None

def next(self):
self.stop_reason = "NEXT"
self.running = False

async def reset(self):
pass

async def update(self, props):
await self.cbpi.step2.update_props(self.id, props)

async def run(self):
while self.running:
try:
await self.execute()
except:
self._exception_count += 1
logging.error("Step has thrown exception")
if self._exception_count >= self._max_exceptions:
self.stop_reason = "MAX_EXCEPTIONS"
return (self.id, self.stop_reason)
await asyncio.sleep(1)

return (self.id, self.stop_reason)

@abstractmethod
async def execute(self):
pass

class CBPiSimpleStep(metaclass=ABCMeta):

Expand Down
20 changes: 12 additions & 8 deletions cbpi/controller/dashboard_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import json
from cbpi.controller.crud_controller import CRUDController
from cbpi.database.model import DashboardModel, DashboardContentModel

import os

class DashboardController(CRUDController):

Expand All @@ -20,20 +20,24 @@ def get_state(self):
return dict(items=self.cache)

async def get_content(self, dashboard_id):
with open('./config/dashboard/cbpi_dashboard_%s.json' % dashboard_id) as json_file:
data = json.load(json_file)
return data
try:
with open('./config/dashboard/cbpi_dashboard_%s.json' % dashboard_id) as json_file:
data = json.load(json_file)
return data
except:
return {}


async def add_content(self, dashboard_id, data):
with open('./config/dashboard/cbpi_dashboard_%s.json' % dashboard_id, 'w') as outfile:
json.dump(data, outfile, indent=4, sort_keys=True)
print(data)

return {"status": "OK"}

async def delete_content(self, content_id):
await DashboardContentModel.delete(content_id)
async def delete_content(self, dashboard_id):
if os.path.exists('./config/dashboard/cbpi_dashboard_%s.json' % dashboard_id):
os.remove('./config/dashboard/cbpi_dashboard_%s.json' % dashboard_id)



async def delete_dashboard(self, dashboard_id):
await DashboardContentModel.delete_by_dashboard_id(dashboard_id)
Expand Down
Loading

0 comments on commit 05e08d0

Please sign in to comment.