From adfef66621987bf77a2e7136640938c11e5bc800 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 19 Nov 2020 23:06:57 +0100 Subject: [PATCH 01/86] Added first structure and tests --- docs/init_template.txt | 24 ++++++++++++++++++++ docs/structure.md | 10 ++++++++ docs/todo.md | 2 ++ src/setup.py | 12 ++++++++++ src/sh_edraft/__init__.py | 24 ++++++++++++++++++++ src/sh_edraft/common/__init__.py | 0 src/sh_edraft/common/interface/__init__.py | 0 src/sh_edraft/common/interface/ipublisher.py | 24 ++++++++++++++++++++ src/sh_edraft/common/model/__init__.py | 0 src/sh_edraft/configuration/__init__.py | 0 src/sh_edraft/discord/__init__.py | 0 src/sh_edraft/logging/__init__.py | 0 src/sh_edraft/mailing/__init__.py | 0 src/sh_edraft/messenger/__init__.py | 0 src/sh_edraft/publish/__init__.py | 0 src/sh_edraft/publish/model/__init__.py | 0 src/sh_edraft/publish/model/template.py | 16 +++++++++++++ src/sh_edraft/publish/publisher.py | 22 ++++++++++++++++++ src/sh_edraft/service/__init__.py | 0 src/test.py | 10 ++++++++ 20 files changed, 144 insertions(+) create mode 100644 docs/init_template.txt create mode 100644 docs/structure.md create mode 100644 docs/todo.md create mode 100644 src/setup.py create mode 100644 src/sh_edraft/__init__.py create mode 100644 src/sh_edraft/common/__init__.py create mode 100644 src/sh_edraft/common/interface/__init__.py create mode 100644 src/sh_edraft/common/interface/ipublisher.py create mode 100644 src/sh_edraft/common/model/__init__.py create mode 100644 src/sh_edraft/configuration/__init__.py create mode 100644 src/sh_edraft/discord/__init__.py create mode 100644 src/sh_edraft/logging/__init__.py create mode 100644 src/sh_edraft/mailing/__init__.py create mode 100644 src/sh_edraft/messenger/__init__.py create mode 100644 src/sh_edraft/publish/__init__.py create mode 100644 src/sh_edraft/publish/model/__init__.py create mode 100644 src/sh_edraft/publish/model/template.py create mode 100644 src/sh_edraft/publish/publisher.py create mode 100644 src/sh_edraft/service/__init__.py create mode 100644 src/test.py diff --git a/docs/init_template.txt b/docs/init_template.txt new file mode 100644 index 00000000..920c0c2f --- /dev/null +++ b/docs/init_template.txt @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +""" +{} {} +~~~~~~~~~~~~~~~~~~~ + +{} + +:copyright: (c) {} {} +:license: {} + +""" + +__title__ = '{}' +__author__ = '{}' +__license__ = '{}' +__copyright__ = '{}' +__version__ = '{}' + +from collections import namedtuple + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') + +version_info = VersionInfo(major={}, minor={}, micro={}) diff --git a/docs/structure.md b/docs/structure.md new file mode 100644 index 00000000..71f2f0ea --- /dev/null +++ b/docs/structure.md @@ -0,0 +1,10 @@ +- sh_edraft + - common # Contains Interfaces and models for the hole library + - interface + - model + - configuration # Contains classes for app configuration by JSON, ENV vars and arguments + - discord # Contains classes for better use of discord.py + - logging # Contains classes for logging + - mailing # Contains classes for mailing + - messenger # Contains classes for sh_messenger_server client + - service # Contains classes to provide and use the services defined in this library \ No newline at end of file diff --git a/docs/todo.md b/docs/todo.md new file mode 100644 index 00000000..5d5a99b8 --- /dev/null +++ b/docs/todo.md @@ -0,0 +1,2 @@ +- create logger +- use logger in publisher \ No newline at end of file diff --git a/src/setup.py b/src/setup.py new file mode 100644 index 00000000..4f86d310 --- /dev/null +++ b/src/setup.py @@ -0,0 +1,12 @@ +import setuptools + +setuptools.setup( + name='sh_edraft', + version='2020.0.1', + packages=setuptools.find_packages(), + url='https://www.sh-edraft.de', + license='MIT', + author='Sven Heidemann', + author_email='edraft.sh@gmail.com', + description='sh-edraft python common lib' +) diff --git a/src/sh_edraft/__init__.py b/src/sh_edraft/__init__.py new file mode 100644 index 00000000..96602fbe --- /dev/null +++ b/src/sh_edraft/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft python common lib +~~~~~~~~~~~~~~~~~~~ + +Common python functions and classes for sh-edraft.de ecosystem + +:copyright: (c) 2020 edraft +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.de' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') + +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/common/__init__.py b/src/sh_edraft/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/common/interface/__init__.py b/src/sh_edraft/common/interface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/common/interface/ipublisher.py b/src/sh_edraft/common/interface/ipublisher.py new file mode 100644 index 00000000..a1df83e8 --- /dev/null +++ b/src/sh_edraft/common/interface/ipublisher.py @@ -0,0 +1,24 @@ +from abc import ABC, abstractmethod +from typing import List + +from sh_edraft.publish.model.template import Template + + +class IPublisher(ABC): + + @abstractmethod + def __init__(self, local_path: str): + pass + + @property + @abstractmethod + def local_path(self) -> str: + pass + + @abstractmethod + def create(self, templates: List[Template]): + pass + + @abstractmethod + def publish(self): + pass diff --git a/src/sh_edraft/common/model/__init__.py b/src/sh_edraft/common/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/discord/__init__.py b/src/sh_edraft/discord/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/logging/__init__.py b/src/sh_edraft/logging/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/mailing/__init__.py b/src/sh_edraft/mailing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/messenger/__init__.py b/src/sh_edraft/messenger/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/publish/__init__.py b/src/sh_edraft/publish/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/publish/model/__init__.py b/src/sh_edraft/publish/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/publish/model/template.py b/src/sh_edraft/publish/model/template.py new file mode 100644 index 00000000..7e1b1f57 --- /dev/null +++ b/src/sh_edraft/publish/model/template.py @@ -0,0 +1,16 @@ +from typing import Optional + + +class Template: + + def __init__(self, name: Optional[str] = None, path: Optional[str] = None): + self._name: Optional[str] = name + self._path: Optional[str] = path + + @property + def name(self): + return self._name + + @property + def path(self): + return self._path diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py new file mode 100644 index 00000000..ab1fd5a5 --- /dev/null +++ b/src/sh_edraft/publish/publisher.py @@ -0,0 +1,22 @@ +from typing import List + +from sh_edraft.common.interface.ipublisher import IPublisher +from sh_edraft.publish.model.template import Template + + +class Publisher(IPublisher): + + def __init__(self, local_path: str): + super().__init__(local_path) + self._local_path = local_path + self._templates: List[Template] = [] + + @property + def local_path(self) -> str: + return self._local_path + + def create(self, templates: List[Template]): + self._templates = templates + + def publish(self): + print(self._local_path, [(t.name, t.path) for t in self._templates]) diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/test.py b/src/test.py new file mode 100644 index 00000000..aed60e3b --- /dev/null +++ b/src/test.py @@ -0,0 +1,10 @@ +from sh_edraft.publish.model.template import Template +from sh_edraft.publish.publisher import Publisher + +if __name__ == '__main__': + publisher = Publisher('./') + templates = [ + Template('*', '../docs/init_template.txt') + ] + publisher.create(templates) + publisher.publish() From 96d3ccd8d2375c12cab257ef7719c40e1ba1184c Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sat, 21 Nov 2020 12:51:05 +0100 Subject: [PATCH 02/86] Improved and finished publish library --- docs/init_template.txt | 24 --- publish_templates/*_template.txt | 25 +++ src/sh_edraft/__init__.py | 13 +- src/sh_edraft/common/__init__.py | 0 src/sh_edraft/common/interface/__init__.py | 0 src/sh_edraft/common/interface/ipublisher.py | 24 --- src/sh_edraft/common/model/__init__.py | 0 src/sh_edraft/configuration/__init__.py | 25 +++ src/sh_edraft/configuration/model/__init__.py | 26 +++ .../model/configuration_model_base.py | 12 ++ src/sh_edraft/discord/__init__.py | 25 +++ src/sh_edraft/logging/__init__.py | 25 +++ src/sh_edraft/mailing/__init__.py | 25 +++ src/sh_edraft/messenger/__init__.py | 25 +++ src/sh_edraft/publish/__init__.py | 26 +++ src/sh_edraft/publish/base/__init__.py | 26 +++ src/sh_edraft/publish/base/publisher_base.py | 30 +++ src/sh_edraft/publish/model/__init__.py | 27 +++ src/sh_edraft/publish/model/template.py | 118 +++++++++- src/sh_edraft/publish/model/template_enum.py | 16 ++ src/sh_edraft/publish/publisher.py | 201 ++++++++++++++++-- src/sh_edraft/service/__init__.py | 25 +++ src/sh_edraft/source_code/__init__.py | 25 +++ src/sh_edraft/source_code/model/__init__.py | 27 +++ src/sh_edraft/source_code/model/version.py | 44 ++++ .../source_code/model/version_enum.py | 8 + src/test.py | 42 +++- 27 files changed, 787 insertions(+), 77 deletions(-) delete mode 100644 docs/init_template.txt create mode 100644 publish_templates/*_template.txt delete mode 100644 src/sh_edraft/common/__init__.py delete mode 100644 src/sh_edraft/common/interface/__init__.py delete mode 100644 src/sh_edraft/common/interface/ipublisher.py delete mode 100644 src/sh_edraft/common/model/__init__.py create mode 100644 src/sh_edraft/configuration/model/__init__.py create mode 100644 src/sh_edraft/configuration/model/configuration_model_base.py create mode 100644 src/sh_edraft/publish/base/__init__.py create mode 100644 src/sh_edraft/publish/base/publisher_base.py create mode 100644 src/sh_edraft/publish/model/template_enum.py create mode 100644 src/sh_edraft/source_code/__init__.py create mode 100644 src/sh_edraft/source_code/model/__init__.py create mode 100644 src/sh_edraft/source_code/model/version.py create mode 100644 src/sh_edraft/source_code/model/version_enum.py diff --git a/docs/init_template.txt b/docs/init_template.txt deleted file mode 100644 index 920c0c2f..00000000 --- a/docs/init_template.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -{} {} -~~~~~~~~~~~~~~~~~~~ - -{} - -:copyright: (c) {} {} -:license: {} - -""" - -__title__ = '{}' -__author__ = '{}' -__license__ = '{}' -__copyright__ = '{}' -__version__ = '{}' - -from collections import namedtuple - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') - -version_info = VersionInfo(major={}, minor={}, micro={}) diff --git a/publish_templates/*_template.txt b/publish_templates/*_template.txt new file mode 100644 index 00000000..3b24f44f --- /dev/null +++ b/publish_templates/*_template.txt @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +$Name $Description +~~~~~~~~~~~~~~~~~~~ + +$LongDescription + +:copyright: (c) $CopyrightDate $CopyrightName +:license: $LicenseName$LicenseDescription + +""" + +__title__ = '$Title' +__author__ = '$Author' +__license__ = '$LicenseName' +__copyright__ = 'Copyright (c) $CopyrightDate $CopyrightName' +__version__ = '$Version' + +from collections import namedtuple + +$Imports + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=$Major, minor=$Minor, micro=$Micro) diff --git a/src/sh_edraft/__init__.py b/src/sh_edraft/__init__.py index 96602fbe..58fb4bac 100644 --- a/src/sh_edraft/__init__.py +++ b/src/sh_edraft/__init__.py @@ -1,24 +1,25 @@ # -*- coding: utf-8 -*- """ -sh_edraft python common lib +sh_edraft common python library ~~~~~~~~~~~~~~~~~~~ -Common python functions and classes for sh-edraft.de ecosystem +Library to share common classes and models used at sh-edraft.de -:copyright: (c) 2020 edraft +:copyright: (c) 2020 sh-edraft.de :license: MIT, see LICENSE for more details. """ -__title__ = 'sh_edraft.de' +__title__ = 'sh_edraft' __author__ = 'Sven Heidemann' __license__ = 'MIT' -__copyright__ = 'Copyright 2020 sh-edraft.de' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' __version__ = '2020.12.0.1' from collections import namedtuple -VersionInfo = namedtuple('VersionInfo', 'major minor micro') + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/common/__init__.py b/src/sh_edraft/common/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/sh_edraft/common/interface/__init__.py b/src/sh_edraft/common/interface/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/sh_edraft/common/interface/ipublisher.py b/src/sh_edraft/common/interface/ipublisher.py deleted file mode 100644 index a1df83e8..00000000 --- a/src/sh_edraft/common/interface/ipublisher.py +++ /dev/null @@ -1,24 +0,0 @@ -from abc import ABC, abstractmethod -from typing import List - -from sh_edraft.publish.model.template import Template - - -class IPublisher(ABC): - - @abstractmethod - def __init__(self, local_path: str): - pass - - @property - @abstractmethod - def local_path(self) -> str: - pass - - @abstractmethod - def create(self, templates: List[Template]): - pass - - @abstractmethod - def publish(self): - pass diff --git a/src/sh_edraft/common/model/__init__.py b/src/sh_edraft/common/model/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py index e69de29b..f4d4c98a 100644 --- a/src/sh_edraft/configuration/__init__.py +++ b/src/sh_edraft/configuration/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.configuration +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.configuration' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + + + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/configuration/model/__init__.py b/src/sh_edraft/configuration/model/__init__.py new file mode 100644 index 00000000..824ece23 --- /dev/null +++ b/src/sh_edraft/configuration/model/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.configuration.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.configuration.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: +from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/configuration/model/configuration_model_base.py b/src/sh_edraft/configuration/model/configuration_model_base.py new file mode 100644 index 00000000..fe295727 --- /dev/null +++ b/src/sh_edraft/configuration/model/configuration_model_base.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod + + +class ConfigurationModelBase(ABC): + + @abstractmethod + def from_dict(self, settings: dict): + pass + + @abstractmethod + def to_dict(self) -> dict: + pass diff --git a/src/sh_edraft/discord/__init__.py b/src/sh_edraft/discord/__init__.py index e69de29b..e8957e78 100644 --- a/src/sh_edraft/discord/__init__.py +++ b/src/sh_edraft/discord/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.discord +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.discord' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + + + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/logging/__init__.py b/src/sh_edraft/logging/__init__.py index e69de29b..7ac6e90c 100644 --- a/src/sh_edraft/logging/__init__.py +++ b/src/sh_edraft/logging/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.logging +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.logging' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + + + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/mailing/__init__.py b/src/sh_edraft/mailing/__init__.py index e69de29b..45e5a87e 100644 --- a/src/sh_edraft/mailing/__init__.py +++ b/src/sh_edraft/mailing/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.mailing +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.mailing' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + + + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/messenger/__init__.py b/src/sh_edraft/messenger/__init__.py index e69de29b..2bab0145 100644 --- a/src/sh_edraft/messenger/__init__.py +++ b/src/sh_edraft/messenger/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.messenger +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.messenger' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/publish/__init__.py b/src/sh_edraft/publish/__init__.py index e69de29b..e754a8ac 100644 --- a/src/sh_edraft/publish/__init__.py +++ b/src/sh_edraft/publish/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.publish +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.publish' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: +from sh_edraft.publish.publisher import Publisher + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/publish/base/__init__.py b/src/sh_edraft/publish/base/__init__.py new file mode 100644 index 00000000..0c156e0d --- /dev/null +++ b/src/sh_edraft/publish/base/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.publish.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.publish.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: +from sh_edraft.publish.base.publisher_base import PublisherBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/publish/base/publisher_base.py b/src/sh_edraft/publish/base/publisher_base.py new file mode 100644 index 00000000..17274fdf --- /dev/null +++ b/src/sh_edraft/publish/base/publisher_base.py @@ -0,0 +1,30 @@ +from abc import ABC, abstractmethod + +from sh_edraft.publish.model.template import Template + + +class PublisherBase(ABC): + + @abstractmethod + def __init__(self, source_path: str, dist_path: str, settings: list[Template]): + self._source_path = source_path + self._dist_path = dist_path + self._settings = settings + + @property + @abstractmethod + def source_path(self) -> str: + pass + + @property + @abstractmethod + def dist_path(self): + pass + + @abstractmethod + def create(self): + pass + + @abstractmethod + def publish(self): + pass diff --git a/src/sh_edraft/publish/model/__init__.py b/src/sh_edraft/publish/model/__init__.py index e69de29b..caad810e 100644 --- a/src/sh_edraft/publish/model/__init__.py +++ b/src/sh_edraft/publish/model/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.publish.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.publish.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: +from sh_edraft.publish.model.template import Template +from sh_edraft.publish.model.template_enum import TemplateEnum + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/publish/model/template.py b/src/sh_edraft/publish/model/template.py index 7e1b1f57..d917374b 100644 --- a/src/sh_edraft/publish/model/template.py +++ b/src/sh_edraft/publish/model/template.py @@ -1,16 +1,122 @@ from typing import Optional +from sh_edraft.source_code.model.version import Version +from sh_edraft.configuration.model import ConfigurationModelBase +from sh_edraft.publish.model.template_enum import TemplateEnum -class Template: - def __init__(self, name: Optional[str] = None, path: Optional[str] = None): +class Template(ConfigurationModelBase): + + def __init__( + self, + template_path: Optional[str] = None, + name: Optional[str] = None, + description: Optional[str] = None, + long_description: Optional[str] = None, + copyright_date: Optional[str] = None, + copyright_name: Optional[str] = None, + license_name: Optional[str] = None, + license_description: Optional[str] = None, + title: Optional[str] = None, + author: Optional[str] = None, + version: Optional[dict] = None + ): + self._template_path: Optional[str] = template_path self._name: Optional[str] = name - self._path: Optional[str] = path + self._description: Optional[str] = description + self._long_description: Optional[str] = long_description + self._copyright_date: Optional[str] = copyright_date + self._copyright_name: Optional[str] = copyright_name + self._license_name: Optional[str] = license_name + self._license_description: Optional[str] = license_description + self._title: Optional[str] = title + self._author: Optional[str] = author + + self._version: Optional[Version] = Version() + self._version.from_dict(version) + + self._file_content: Optional[str] = None @property - def name(self): + def template_path(self) -> Optional[str]: + return self._template_path + + @property + def name(self) -> Optional[str]: return self._name @property - def path(self): - return self._path + def description(self) -> Optional[str]: + return self._description + + @property + def long_description(self) -> Optional[str]: + return self._long_description + + @property + def copyright_date(self) -> Optional[str]: + return self._copyright_date + + @property + def copyright_name(self) -> Optional[str]: + return self._copyright_name + + @property + def license_name(self) -> Optional[str]: + return self._license_name + + @property + def license_description(self) -> Optional[str]: + return self._license_description + + @property + def title(self) -> Optional[str]: + return self._title + + @property + def author(self) -> Optional[str]: + return self._author + + @property + def version(self) -> Optional[Version]: + return self._version + + @property + def file_content(self) -> Optional[str]: + return self._file_content + + @file_content.setter + def file_content(self, file_content: Optional[str]): + self._file_content = file_content + + def from_dict(self, settings: dict): + self._template_path = settings[TemplateEnum.TemplatePath.value] + self._name = settings[TemplateEnum.Name.value] + self._description = settings[TemplateEnum.Description.value] + self._long_description = settings[TemplateEnum.LongDescription.value] + self._copyright_date = settings[TemplateEnum.CopyrightDate.value] + self._copyright_name = settings[TemplateEnum.CopyrightName.value] + self._license_name = settings[TemplateEnum.LicenseName.value] + self._license_description = settings[TemplateEnum.LicenseDescription.value] + self._title = settings[TemplateEnum.Title.value] + self._author = settings[TemplateEnum.Author.value] + self._version.from_dict(settings[TemplateEnum.Version.value]) + + def to_dict(self) -> dict: + version: Optional[dict] = None + if self._version is not None: + version = self._version.to_dict() + + return { + TemplateEnum.TemplatePath.value: self._template_path, + TemplateEnum.Name.value: self._name, + TemplateEnum.Description.value: self._description, + TemplateEnum.LongDescription.value: self._long_description, + TemplateEnum.CopyrightDate.value: self._copyright_date, + TemplateEnum.CopyrightName.value: self._copyright_name, + TemplateEnum.LicenseName.value: self._license_name, + TemplateEnum.LicenseDescription.value: self._license_description, + TemplateEnum.Title.value: self._title, + TemplateEnum.Author.value: self._author, + TemplateEnum.Version.value: version + } diff --git a/src/sh_edraft/publish/model/template_enum.py b/src/sh_edraft/publish/model/template_enum.py new file mode 100644 index 00000000..f628c4ce --- /dev/null +++ b/src/sh_edraft/publish/model/template_enum.py @@ -0,0 +1,16 @@ +from enum import Enum + + +class TemplateEnum(Enum): + + TemplatePath = 'TemplatePath' + Name = 'Name' + Description = 'Description' + LongDescription = 'LongDescription' + CopyrightDate = 'CopyrightDate' + CopyrightName = 'CopyrightName' + LicenseName = 'LicenseName' + LicenseDescription = 'LicenseDescription' + Title = 'Title' + Author = 'Author' + Version = 'Version' diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index ab1fd5a5..75c90ce4 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -1,22 +1,199 @@ -from typing import List +import os +import shutil +from string import Template as stringTemplate -from sh_edraft.common.interface.ipublisher import IPublisher +from sh_edraft.publish.base.publisher_base import PublisherBase from sh_edraft.publish.model.template import Template -class Publisher(IPublisher): +class Publisher(PublisherBase): - def __init__(self, local_path: str): - super().__init__(local_path) - self._local_path = local_path - self._templates: List[Template] = [] + def __init__(self, source_path: str, dist_path: str, settings: list[Template]): + super().__init__(source_path, dist_path, settings) + + self._included_files: list[str] = [] + self._excluded_files: list[str] = [] + + self._template_ending = '_template.txt' @property - def local_path(self) -> str: - return self._local_path + def source_path(self) -> str: + return self._source_path - def create(self, templates: List[Template]): - self._templates = templates + @property + def dist_path(self): + return self._dist_path + + def _get_template_output(self, t: Template, name: str, imports: str) -> str: + try: + if t.file_content == '': + raise Exception(f'Template is empty: {t.template_path}') + + return stringTemplate(t.file_content).substitute( + Name=name, + Description=t.description, + LongDescription=t.long_description, + CopyrightDate=t.copyright_date, + CopyrightName=t.copyright_name, + LicenseName=t.license_name, + LicenseDescription=t.license_description, + Title=t.title if t.title is not None and t.title != '' else name, + Author=t.author, + Version=t.version.to_str(), + Major=t.version.major, + Minor=t.version.minor, + Micro=t.version.micro, + Imports=imports + ) + except Exception as e: + print(1, e) + # todo: better logging + + def _read_source_path(self): + for r, d, f in os.walk(self._source_path): + for file in f: + if file.endswith('.py') or file in self._included_files: + self._included_files.append(os.path.join(r, file)) + + def _read_templates(self): + for t in self._settings: + output_template: str = '' + if not os.path.isfile(t.template_path): + raise Exception(f'Template not found: {t.template_path}') + + with open(t.template_path) as template: + t.file_content = template.read() + template.close() + if t.file_content == '': + raise Exception(f'Template is empty: {t.template_path}') + + def _create_dist_path(self): + if os.path.isdir(self._dist_path): + try: + shutil.rmtree(self._dist_path) + print(f'Deleted {self._dist_path}') + # todo: better logging + except Exception as e: + print(e) + # todo: log error + + if not os.path.isdir(self._dist_path): + try: + os.makedirs(self._dist_path) + except Exception as e: + print(e) + # todo: log error + + def _get_template_name_from_dirs(self, file: str) -> str: + dirs = os.path.dirname(file).split('/') + for d in dirs: + if d.__contains__('.'): + dirs.remove(d) + + if len(dirs) == 0: + return os.path.basename(file) + else: + return '.'.join(dirs) + + def _write_templates(self): + for template in self._settings: + for file in self._included_files: + if os.path.basename(file) == '__init__.py' and file not in self._excluded_files: + template_name = template.name + if template.name == '*' or template.name == '': + template_name = self._get_template_name_from_dirs(file) + else: + name = self._get_template_name_from_dirs(file) + + if name.__contains__('.'): + if template.name != name.split('.')[len(name.split('.')) - 1]: + break + + else: + if template.name != name: + break + + try: + module_file_lines: list[str] = [] + module_py_lines: list[str] = [] + imports = '' + with open(file, 'r') as py_file: + module_file_lines = py_file.readlines() + py_file.close() + + if len(module_file_lines) == 0: + with open(file, 'w+') as py_file: + py_file.write(self._get_template_output(template, template_name, '# imports:')) + py_file.close() + print(f'Written to {file}') + else: + is_started = False + for line in module_file_lines: + if line.__contains__('# imports'): + is_started = True + + if (line.__contains__('from') or line.__contains__('import')) and is_started: + module_py_lines.append(line.replace('\n', '')) + + if len(module_py_lines) > 0: + imports = '\n'.join(module_py_lines) + + with open(file, 'w+') as py_file: + py_file.write(self._get_template_output(template, template_name, imports)) + py_file.close() + print(f'Written to {file}') + + except Exception as e: + print(e) + # todo: better logging + + def _copy_all_included_files(self): + dist_path = self._dist_path + if self._dist_path.endswith('/'): + dist_path = dist_path[:len(dist_path) - 1] + + for file in self._included_files: + if file not in self._excluded_files: + output_file = '' + if file.startswith('..'): + output_file = file.replace('..', '', 1) + + elif file.startswith('.'): + output_file = file.replace('.', '', 1) + + output_file = f'{dist_path}{output_file}' + output_path = os.path.dirname(output_file) + + try: + if not os.path.isdir(output_path): + os.makedirs(output_path) + except Exception as e: + print(e) + # todo: better logging + + try: + shutil.copy(file, output_file) + except Exception as e: + print(e) + # todo: better logging + + print(f'Copied {file} to {output_path}') + # todo: better logging + + def include(self, path: str): + self._included_files.append(path) + + def exclude(self, path: str): + self._excluded_files.append(path) + + def create(self): + if not self._dist_path.endswith('/'): + self._dist_path += '/' + + self._read_source_path() + self._read_templates() + self._create_dist_path() def publish(self): - print(self._local_path, [(t.name, t.path) for t in self._templates]) + self._write_templates() + self._copy_all_included_files() diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index e69de29b..070b67c3 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.service +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.service' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + + + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/source_code/__init__.py b/src/sh_edraft/source_code/__init__.py new file mode 100644 index 00000000..43c2d77d --- /dev/null +++ b/src/sh_edraft/source_code/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.source_code +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.source_code' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + + + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/source_code/model/__init__.py b/src/sh_edraft/source_code/model/__init__.py new file mode 100644 index 00000000..a37844ed --- /dev/null +++ b/src/sh_edraft/source_code/model/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.source_code.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.source_code.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: +from sh_edraft.source_code.model.version import Version +from sh_edraft.source_code.model.version_enum import VersionEnum + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/source_code/model/version.py b/src/sh_edraft/source_code/model/version.py new file mode 100644 index 00000000..c9ccfeb0 --- /dev/null +++ b/src/sh_edraft/source_code/model/version.py @@ -0,0 +1,44 @@ +from typing import Optional + +from sh_edraft.source_code.model.version_enum import VersionEnum +from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase + + +class Version(ConfigurationModelBase): + + def __init__( + self, + major: int = None, + minor: int = None, + micro: float = None + ): + self._major: Optional[int] = major + self._minor: Optional[int] = minor + self._micro: Optional[float] = micro + + @property + def major(self) -> int: + return self._major + + @property + def minor(self) -> int: + return self._minor + + @property + def micro(self) -> float: + return self._micro + + def to_str(self) -> str: + return f'{self._major}.{self._minor}.{self._micro}' + + def from_dict(self, settings: dict): + self._major = int(settings[VersionEnum.Major.value]) + self._minor = int(settings[VersionEnum.Minor.value]) + self._micro = float(settings[VersionEnum.Micro.value]) + + def to_dict(self) -> dict: + return { + VersionEnum.Major.value: self._major, + VersionEnum.Minor.value: self._minor, + VersionEnum.Micro.value: self._micro + } diff --git a/src/sh_edraft/source_code/model/version_enum.py b/src/sh_edraft/source_code/model/version_enum.py new file mode 100644 index 00000000..446b6e16 --- /dev/null +++ b/src/sh_edraft/source_code/model/version_enum.py @@ -0,0 +1,8 @@ +from enum import Enum + + +class VersionEnum(Enum): + + Major = 'major' + Minor = 'minor' + Micro = 'micro' diff --git a/src/test.py b/src/test.py index aed60e3b..6bc8e8d0 100644 --- a/src/test.py +++ b/src/test.py @@ -1,10 +1,42 @@ -from sh_edraft.publish.model.template import Template -from sh_edraft.publish.publisher import Publisher +from sh_edraft.source_code.model import Version +from sh_edraft.publish import Publisher +from sh_edraft.publish.model import Template if __name__ == '__main__': - publisher = Publisher('./') templates = [ - Template('*', '../docs/init_template.txt') + Template( + '../publish_templates/*_template.txt', + '*', + '', + '', + '2020', + 'sh-edraft.de', + 'MIT', + ', see LICENSE for more details.', + '', + 'Sven Heidemann', + Version(2020, 12, 0.1).to_dict() + ), + Template( + '../publish_templates/*_template.txt', + 'sh_edraft', + 'common python library', + 'Library to share common classes and models used at sh-edraft.de', + '2020', + 'sh-edraft.de', + 'MIT', + ', see LICENSE for more details.', + '', + 'Sven Heidemann', + Version(2020, 12, 0.1).to_dict() + ) ] - publisher.create(templates) + + publisher = Publisher('./', '../dist', templates) + + publisher.exclude('./test.py') + publisher.include('../LICENSE') + publisher.include('../README.md') + + publisher.create() publisher.publish() From b31c0dd23cfc4ae65805fec64c144460a02b519a Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 22 Nov 2020 00:10:52 +0100 Subject: [PATCH 03/86] Fixed publisher publish relative path error --- src/sh_edraft/__init__.py | 4 ++-- src/sh_edraft/publish/publisher.py | 12 ++++++++++-- src/tests/__init__.py | 25 +++++++++++++++++++++++++ src/{test.py => tests/publisher.py} | 12 ++++++------ 4 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 src/tests/__init__.py rename src/{test.py => tests/publisher.py} (76%) diff --git a/src/sh_edraft/__init__.py b/src/sh_edraft/__init__.py index 58fb4bac..d64c519d 100644 --- a/src/sh_edraft/__init__.py +++ b/src/sh_edraft/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- """ -sh_edraft common python library +sh_edraft ~~~~~~~~~~~~~~~~~~~ -Library to share common classes and models used at sh-edraft.de + :copyright: (c) 2020 sh-edraft.de :license: MIT, see LICENSE for more details. diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index 75c90ce4..f7e5dc7c 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -153,10 +153,18 @@ class Publisher(PublisherBase): dist_path = dist_path[:len(dist_path) - 1] for file in self._included_files: - if file not in self._excluded_files: + is_file_excluded = False + if file in self._excluded_files: + is_file_excluded = True + else: + for excluded in self._excluded_files: + if file.__contains__(excluded): + is_file_excluded = True + + if not is_file_excluded: output_file = '' if file.startswith('..'): - output_file = file.replace('..', '', 1) + output_file = file.replace('..', '') elif file.startswith('.'): output_file = file.replace('.', '', 1) diff --git a/src/tests/__init__.py b/src/tests/__init__.py new file mode 100644 index 00000000..ce54614e --- /dev/null +++ b/src/tests/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/test.py b/src/tests/publisher.py similarity index 76% rename from src/test.py rename to src/tests/publisher.py index 6bc8e8d0..b12719fc 100644 --- a/src/test.py +++ b/src/tests/publisher.py @@ -5,7 +5,7 @@ from sh_edraft.publish.model import Template if __name__ == '__main__': templates = [ Template( - '../publish_templates/*_template.txt', + '../../publish_templates/*_template.txt', '*', '', '', @@ -18,7 +18,7 @@ if __name__ == '__main__': Version(2020, 12, 0.1).to_dict() ), Template( - '../publish_templates/*_template.txt', + '../../publish_templates/*_template.txt', 'sh_edraft', 'common python library', 'Library to share common classes and models used at sh-edraft.de', @@ -32,11 +32,11 @@ if __name__ == '__main__': ) ] - publisher = Publisher('./', '../dist', templates) + publisher = Publisher('../', '../../dist', templates) - publisher.exclude('./test.py') - publisher.include('../LICENSE') - publisher.include('../README.md') + publisher.exclude('../tests/') + publisher.include('../../LICENSE') + publisher.include('../../README.md') publisher.create() publisher.publish() From e921338fe6e0395e5595ec7c1f466a0f68dfa6a8 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 22 Nov 2020 00:13:56 +0100 Subject: [PATCH 04/86] Fixed publisher publish template name error --- src/sh_edraft/__init__.py | 4 ++-- src/sh_edraft/publish/publisher.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sh_edraft/__init__.py b/src/sh_edraft/__init__.py index d64c519d..58fb4bac 100644 --- a/src/sh_edraft/__init__.py +++ b/src/sh_edraft/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- """ -sh_edraft +sh_edraft common python library ~~~~~~~~~~~~~~~~~~~ - +Library to share common classes and models used at sh-edraft.de :copyright: (c) 2020 sh-edraft.de :license: MIT, see LICENSE for more details. diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index f7e5dc7c..fb82617a 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -107,11 +107,11 @@ class Publisher(PublisherBase): if name.__contains__('.'): if template.name != name.split('.')[len(name.split('.')) - 1]: - break + continue else: if template.name != name: - break + continue try: module_file_lines: list[str] = [] From bcfe6f2de4468125099da6e2c3292557223fba7a Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 22 Nov 2020 14:15:39 +0100 Subject: [PATCH 05/86] Added ServiceProvider --- .../model/configuration_model_base.py | 6 +- src/sh_edraft/publish/base/publisher_base.py | 20 ++---- src/sh_edraft/publish/publisher.py | 26 +++++-- src/sh_edraft/service/__init__.py | 3 +- src/sh_edraft/service/base/__init__.py | 27 ++++++++ src/sh_edraft/service/base/provider_base.py | 30 ++++++++ src/sh_edraft/service/base/service_base.py | 13 ++++ src/sh_edraft/service/model/__init__.py | 25 +++++++ src/sh_edraft/service/model/provide_state.py | 18 +++++ src/sh_edraft/service/service_provider.py | 68 +++++++++++++++++++ 10 files changed, 210 insertions(+), 26 deletions(-) create mode 100644 src/sh_edraft/service/base/__init__.py create mode 100644 src/sh_edraft/service/base/provider_base.py create mode 100644 src/sh_edraft/service/base/service_base.py create mode 100644 src/sh_edraft/service/model/__init__.py create mode 100644 src/sh_edraft/service/model/provide_state.py create mode 100644 src/sh_edraft/service/service_provider.py diff --git a/src/sh_edraft/configuration/model/configuration_model_base.py b/src/sh_edraft/configuration/model/configuration_model_base.py index fe295727..4483a3d3 100644 --- a/src/sh_edraft/configuration/model/configuration_model_base.py +++ b/src/sh_edraft/configuration/model/configuration_model_base.py @@ -4,9 +4,7 @@ from abc import ABC, abstractmethod class ConfigurationModelBase(ABC): @abstractmethod - def from_dict(self, settings: dict): - pass + def from_dict(self, settings: dict): pass @abstractmethod - def to_dict(self) -> dict: - pass + def to_dict(self) -> dict: pass diff --git a/src/sh_edraft/publish/base/publisher_base.py b/src/sh_edraft/publish/base/publisher_base.py index 17274fdf..d8d3fdc2 100644 --- a/src/sh_edraft/publish/base/publisher_base.py +++ b/src/sh_edraft/publish/base/publisher_base.py @@ -1,30 +1,18 @@ from abc import ABC, abstractmethod -from sh_edraft.publish.model.template import Template - class PublisherBase(ABC): @abstractmethod - def __init__(self, source_path: str, dist_path: str, settings: list[Template]): - self._source_path = source_path - self._dist_path = dist_path - self._settings = settings + def __init__(self): pass @property @abstractmethod - def source_path(self) -> str: - pass + def source_path(self) -> str: pass @property @abstractmethod - def dist_path(self): - pass + def dist_path(self) -> str: pass @abstractmethod - def create(self): - pass - - @abstractmethod - def publish(self): - pass + def publish(self) -> str: pass diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index fb82617a..6241d614 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -1,15 +1,23 @@ import os import shutil from string import Template as stringTemplate +from typing import Optional from sh_edraft.publish.base.publisher_base import PublisherBase from sh_edraft.publish.model.template import Template +from sh_edraft.service.base import ServiceBase -class Publisher(PublisherBase): +class Publisher(ServiceBase, PublisherBase): - def __init__(self, source_path: str, dist_path: str, settings: list[Template]): - super().__init__(source_path, dist_path, settings) + def __init__(self): + ServiceBase.__init__(self) + PublisherBase.__init__(self) + + self._logger: Optional[None] = None + self._source_path: Optional[str] = None + self._dist_path: Optional[str] = None + self._settings: Optional[list[Template]] = None self._included_files: list[str] = [] self._excluded_files: list[str] = [] @@ -24,7 +32,8 @@ class Publisher(PublisherBase): def dist_path(self): return self._dist_path - def _get_template_output(self, t: Template, name: str, imports: str) -> str: + @staticmethod + def _get_template_output(t: Template, name: str, imports: str) -> str: try: if t.file_content == '': raise Exception(f'Template is empty: {t.template_path}') @@ -84,7 +93,8 @@ class Publisher(PublisherBase): print(e) # todo: log error - def _get_template_name_from_dirs(self, file: str) -> str: + @staticmethod + def _get_template_name_from_dirs(file: str) -> str: dirs = os.path.dirname(file).split('/') for d in dirs: if d.__contains__('.'): @@ -194,6 +204,12 @@ class Publisher(PublisherBase): def exclude(self, path: str): self._excluded_files.append(path) + def init(self, args: tuple): + self._logger = args[0] + self._source_path = args[1] + self._dist_path = args[2] + self._settings = args[3] + def create(self): if not self._dist_path.endswith('/'): self._dist_path += '/' diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index 070b67c3..50d977b6 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -19,7 +19,8 @@ __version__ = '2020.12.0.1' from collections import namedtuple - +# imports: +from sh_edraft.service.service_provider import ServiceProvider VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py new file mode 100644 index 00000000..3af2fd19 --- /dev/null +++ b/src/sh_edraft/service/base/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.service.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.service.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: +from sh_edraft.service.base.service_base import ServiceBase +from sh_edraft.service.base.provider_base import ProviderBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/service/base/provider_base.py b/src/sh_edraft/service/base/provider_base.py new file mode 100644 index 00000000..55451908 --- /dev/null +++ b/src/sh_edraft/service/base/provider_base.py @@ -0,0 +1,30 @@ +from abc import ABC, abstractmethod +from collections import Callable +from typing import Type + +from sh_edraft.service.base.service_base import ServiceBase +from sh_edraft.service.model.provide_state import ProvideState + + +class ProviderBase(ABC): + + @abstractmethod + def __init__(self): + self._transient_services: list[ProvideState] = [] + self._scoped_services: list[ProvideState] = [] + self._singleton_services: list[ServiceBase] = [] + + @abstractmethod + def add_transient(self, service: Type[ServiceBase], *args): pass + + @abstractmethod + def add_scoped(self, service: Type[ServiceBase], *args): pass + + @abstractmethod + def add_singleton(self, service: Type[ServiceBase], *args): pass + + @abstractmethod + def get_service(self, instance_type: type) -> Callable[ServiceBase]: pass + + @abstractmethod + def remove_service(self, instance_type: type): pass diff --git a/src/sh_edraft/service/base/service_base.py b/src/sh_edraft/service/base/service_base.py new file mode 100644 index 00000000..2e4a4934 --- /dev/null +++ b/src/sh_edraft/service/base/service_base.py @@ -0,0 +1,13 @@ +from abc import ABC, abstractmethod + + +class ServiceBase(ABC): + + @abstractmethod + def __init__(self): pass + + @abstractmethod + def init(self, args: tuple): pass + + @abstractmethod + def create(self): pass diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py new file mode 100644 index 00000000..f48cec28 --- /dev/null +++ b/src/sh_edraft/service/model/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.service.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.service.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/service/model/provide_state.py b/src/sh_edraft/service/model/provide_state.py new file mode 100644 index 00000000..619e0ed5 --- /dev/null +++ b/src/sh_edraft/service/model/provide_state.py @@ -0,0 +1,18 @@ +from typing import Type + +from sh_edraft.service.base import ServiceBase + + +class ProvideState: + + def __init__(self, service: Type[ServiceBase] = None, args: tuple = None): + self._service: Type[ServiceBase] = service + self._args: tuple = args + + @property + def service(self): + return self._service + + @property + def args(self) -> tuple: + return self._args diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py new file mode 100644 index 00000000..b827f83d --- /dev/null +++ b/src/sh_edraft/service/service_provider.py @@ -0,0 +1,68 @@ +from collections import Callable +from typing import Type + +from termcolor import colored + +from sh_edraft.service.base.provider_base import ProviderBase +from sh_edraft.service.base.service_base import ServiceBase +from sh_edraft.service.model.provide_state import ProvideState + + +class ServiceProvider(ProviderBase): + + def __init__(self): + ProviderBase.__init__(self) + + def create(self): + pass + + @staticmethod + def _create_instance(service: type[ServiceBase], args: tuple) -> ServiceBase: + instance = service() + try: + instance.init(args) + return instance + except Exception as e: + print(colored(f'Argument error\n{e}', 'red')) + + def add_transient(self, service: Type[ServiceBase], *args): + self._transient_services.append(ProvideState(service, args)) + + def add_scoped(self, service: Type[ServiceBase], *args): + self._transient_services.append(ProvideState(service, args)) + + def add_singleton(self, service: Type[ServiceBase], *args): + for known_service in self._singleton_services: + if type(known_service) == type(service): + raise Exception(f'Service from type {type(service)} already exists') + + self._singleton_services.append(self._create_instance(service, args)) + + def get_service(self, instance_type: type) -> Callable[ServiceBase]: + for state in self._transient_services: + if state.service == instance_type: + return self._create_instance(state.service, state.args) + + for state in self._scoped_services: + if type(state.service) == instance_type: + return self._create_instance(state.service, state.args) + + for service in self._singleton_services: + if type(service) == instance_type: + return service + + def remove_service(self, instance_type: type): + for state in self._transient_services: + if state.service == instance_type: + self._transient_services.remove(state) + return + + for state in self._scoped_services: + if type(state.service) == instance_type: + self._scoped_services.remove(state) + return + + for service in self._singleton_services: + if type(service) == instance_type: + self._singleton_services.remove(service) + return From c8a7954adb29a6a36491bf10714adb7b39d9ab39 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 22 Nov 2020 14:16:08 +0100 Subject: [PATCH 06/86] Added Tester to create all tests --- src/tests/publisher.py | 84 ++++++++++++++++++++--------------- src/tests/service_provider.py | 23 ++++++++++ src/tests/test.py | 67 ++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 35 deletions(-) create mode 100644 src/tests/service_provider.py create mode 100644 src/tests/test.py diff --git a/src/tests/publisher.py b/src/tests/publisher.py index b12719fc..43d350c4 100644 --- a/src/tests/publisher.py +++ b/src/tests/publisher.py @@ -1,42 +1,56 @@ +import os + +from sh_edraft.service import ServiceProvider from sh_edraft.source_code.model import Version from sh_edraft.publish import Publisher from sh_edraft.publish.model import Template -if __name__ == '__main__': - templates = [ - Template( - '../../publish_templates/*_template.txt', - '*', - '', - '', - '2020', - 'sh-edraft.de', - 'MIT', - ', see LICENSE for more details.', - '', - 'Sven Heidemann', - Version(2020, 12, 0.1).to_dict() - ), - Template( - '../../publish_templates/*_template.txt', - 'sh_edraft', - 'common python library', - 'Library to share common classes and models used at sh-edraft.de', - '2020', - 'sh-edraft.de', - 'MIT', - ', see LICENSE for more details.', - '', - 'Sven Heidemann', - Version(2020, 12, 0.1).to_dict() - ) - ] - publisher = Publisher('../', '../../dist', templates) +class PublisherTest: - publisher.exclude('../tests/') - publisher.include('../../LICENSE') - publisher.include('../../README.md') + @staticmethod + def start(services: ServiceProvider): + templates = [ + Template( + '../../publish_templates/*_template.txt', + '*', + '', + '', + '2020', + 'sh-edraft.de', + 'MIT', + ', see LICENSE for more details.', + '', + 'Sven Heidemann', + Version(2020, 12, 0.1).to_dict() + ), + Template( + '../../publish_templates/*_template.txt', + 'sh_edraft', + 'common python library', + 'Library to share common classes and models used at sh-edraft.de', + '2020', + 'sh-edraft.de', + 'MIT', + ', see LICENSE for more details.', + '', + 'Sven Heidemann', + Version(2020, 12, 0.1).to_dict() + ) + ] - publisher.create() - publisher.publish() + source = '../' + dist = '../../dist' + + services.add_singleton(Publisher, None, source, dist, templates) + publisher: Publisher = services.get_service(Publisher) + + publisher.exclude('../tests/') + publisher.include('../../LICENSE') + publisher.include('../../README.md') + + publisher.create() + publisher.publish() + + if not os.path.isdir(dist): + raise Exception(f'{__name__}: Dist path was not created') diff --git a/src/tests/service_provider.py b/src/tests/service_provider.py new file mode 100644 index 00000000..06317e85 --- /dev/null +++ b/src/tests/service_provider.py @@ -0,0 +1,23 @@ +from sh_edraft.publish import Publisher +from sh_edraft.service import ServiceProvider + + +class ServiceProviderTest: + + @staticmethod + def start() -> ServiceProvider: + provider = ServiceProvider() + provider.create() + + provider.add_transient(Publisher, None, '../', '../../dist', []) + + publisher: Publisher = provider.get_service(Publisher) + + if publisher.source_path != '../' or publisher.dist_path != '../../dist': + raise Exception(f'{__name__}: Invalid value in {Publisher.__name__}') + + provider.remove_service(Publisher) + if provider.get_service(Publisher) is not None: + raise Exception(f'{__name__}: Service {Publisher.__name__} was not removed') + + return provider diff --git a/src/tests/test.py b/src/tests/test.py new file mode 100644 index 00000000..91b9bb4f --- /dev/null +++ b/src/tests/test.py @@ -0,0 +1,67 @@ +import os +import sys +from typing import Optional + +from termcolor import colored + +from sh_edraft.service import ServiceProvider +from tests.publisher import PublisherTest +from tests.service_provider import ServiceProviderTest + + +class Test: + + def __init__(self): + self._services: Optional[ServiceProvider] = None + + self._tests = [ + ServiceProviderTest, + PublisherTest + ] + + self._error: bool = False + + @staticmethod + def block_print(): + sys.stdout = open(os.devnull, 'w') + + @staticmethod + def enable_print(): + sys.stdout = sys.__stdout__ + + def success(self, message: str): + self.enable_print() + print(colored(message, 'green')) + self.block_print() + + def failed(self, message: str): + self.enable_print() + print(colored(message, 'red')) + self.block_print() + + def create(self): pass + + def start(self): + self.block_print() + + if not self._error: + try: + self._services = ServiceProviderTest.start() + self.success(f'{ServiceProviderTest.__name__} test succeeded.') + except Exception as e: + self._error = True + self.failed(f'{ServiceProviderTest.__name__} test failed!\n{e}') + + if not self._error: + try: + PublisherTest.start(self._services) + self.success(f'{PublisherTest.__name__} test succeeded.') + except Exception as e: + self._error = True + self.failed(f'{PublisherTest.__name__} test failed!\n{e}') + + +if __name__ == '__main__': + test = Test() + test.create() + test.start() From be62b173d382129dd5eb395f3c886116b935efda Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 22 Nov 2020 20:17:57 +0100 Subject: [PATCH 07/86] Added logger and improved service provider --- src/sh_edraft/configuration/__init__.py | 3 +- .../configuration/application_host.py | 35 ++++ .../model/configuration_model_base.py | 3 - src/sh_edraft/logging/base/__init__.py | 25 +++ src/sh_edraft/logging/base/logger_base.py | 31 ++++ src/sh_edraft/logging/logger.py | 171 ++++++++++++++++++ src/sh_edraft/logging/model/__init__.py | 25 +++ src/sh_edraft/logging/model/log_level.py | 12 ++ src/sh_edraft/logging/model/log_settings.py | 60 ++++++ .../logging/model/log_settings_name.py | 10 + src/sh_edraft/publish/base/publisher_base.py | 9 +- src/sh_edraft/publish/publisher.py | 6 +- src/sh_edraft/service/base/__init__.py | 2 +- ...vider_base.py => service_provider_base.py} | 7 +- src/sh_edraft/service/service_provider.py | 25 +-- src/sh_edraft/time/__init__.py | 25 +++ src/sh_edraft/time/model/__init__.py | 25 +++ .../time/model/time_format_settings.py | 59 ++++++ .../time/model/time_format_settings_names.py | 10 + src/sh_edraft/utils/__init__.py | 25 +++ src/sh_edraft/utils/console.py | 11 ++ src/tests/logger.py | 50 +++++ src/tests/publisher.py | 7 +- src/tests/service_provider.py | 16 +- src/tests/{test.py => tester.py} | 45 +++-- 25 files changed, 643 insertions(+), 54 deletions(-) create mode 100644 src/sh_edraft/configuration/application_host.py create mode 100644 src/sh_edraft/logging/base/__init__.py create mode 100644 src/sh_edraft/logging/base/logger_base.py create mode 100644 src/sh_edraft/logging/logger.py create mode 100644 src/sh_edraft/logging/model/__init__.py create mode 100644 src/sh_edraft/logging/model/log_level.py create mode 100644 src/sh_edraft/logging/model/log_settings.py create mode 100644 src/sh_edraft/logging/model/log_settings_name.py rename src/sh_edraft/service/base/{provider_base.py => service_provider_base.py} (79%) create mode 100644 src/sh_edraft/time/__init__.py create mode 100644 src/sh_edraft/time/model/__init__.py create mode 100644 src/sh_edraft/time/model/time_format_settings.py create mode 100644 src/sh_edraft/time/model/time_format_settings_names.py create mode 100644 src/sh_edraft/utils/__init__.py create mode 100644 src/sh_edraft/utils/console.py create mode 100644 src/tests/logger.py rename src/tests/{test.py => tester.py} (56%) diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py index f4d4c98a..e08dcd42 100644 --- a/src/sh_edraft/configuration/__init__.py +++ b/src/sh_edraft/configuration/__init__.py @@ -19,7 +19,8 @@ __version__ = '2020.12.0.1' from collections import namedtuple - +# imports: +from sh_edraft.configuration.application_host import ApplicationHost VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/configuration/application_host.py b/src/sh_edraft/configuration/application_host.py new file mode 100644 index 00000000..770d9b81 --- /dev/null +++ b/src/sh_edraft/configuration/application_host.py @@ -0,0 +1,35 @@ +from datetime import datetime + +from sh_edraft.service import ServiceProvider + + +class ApplicationHost: + + def __init__(self): + self._services = ServiceProvider() + self._end_time: datetime = datetime.now() + self._start_time: datetime = datetime.now() + + @property + def services(self): + return self._services + + @property + def end_time(self) -> datetime: + return self._end_time + + @end_time.setter + def end_time(self, end_time: datetime) -> None: + self._end_time = end_time + + @property + def start_time(self) -> datetime: + return self._start_time + + @start_time.setter + def start_time(self, start_time: datetime) -> None: + self._start_time = start_time + + @property + def date_time_now(self) -> datetime: + return datetime.now() diff --git a/src/sh_edraft/configuration/model/configuration_model_base.py b/src/sh_edraft/configuration/model/configuration_model_base.py index 4483a3d3..06b65ba5 100644 --- a/src/sh_edraft/configuration/model/configuration_model_base.py +++ b/src/sh_edraft/configuration/model/configuration_model_base.py @@ -5,6 +5,3 @@ class ConfigurationModelBase(ABC): @abstractmethod def from_dict(self, settings: dict): pass - - @abstractmethod - def to_dict(self) -> dict: pass diff --git a/src/sh_edraft/logging/base/__init__.py b/src/sh_edraft/logging/base/__init__.py new file mode 100644 index 00000000..662b7253 --- /dev/null +++ b/src/sh_edraft/logging/base/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.logging.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.logging.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/logging/base/logger_base.py b/src/sh_edraft/logging/base/logger_base.py new file mode 100644 index 00000000..d9579484 --- /dev/null +++ b/src/sh_edraft/logging/base/logger_base.py @@ -0,0 +1,31 @@ +from abc import abstractmethod + +from sh_edraft.service.base import ServiceBase + + +class LoggerBase(ServiceBase): + + @abstractmethod + def __init__(self): + ServiceBase.__init__(self) + + @abstractmethod + def header(self, string: str): pass + + @abstractmethod + def trace(self, name: str, message: str): pass + + @abstractmethod + def debug(self, name: str, message: str): pass + + @abstractmethod + def info(self, name: str, message: str): pass + + @abstractmethod + def warn(self, name: str, message: str): pass + + @abstractmethod + def error(self, name: str, message: str, ex: Exception = None): pass + + @abstractmethod + def fatal(self, name: str, message: str, ex: Exception = None): pass diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py new file mode 100644 index 00000000..b616b8b0 --- /dev/null +++ b/src/sh_edraft/logging/logger.py @@ -0,0 +1,171 @@ +import datetime +import os +import traceback +from string import Template +from typing import Optional + +from termcolor import colored + +from sh_edraft.configuration.application_host import ApplicationHost +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.logging.model.log_level import LoggingLevel +from sh_edraft.logging.model.log_settings import LoggingSettings +from sh_edraft.time.model.time_format_settings import TimeFormatSettings +from sh_edraft.utils.console import Console + + +class Logger(LoggerBase): + + def __init__(self): + LoggerBase.__init__(self) + + self._log_settings: Optional[LoggingSettings] = None + self._time_format_settings: Optional[TimeFormatSettings] = None + self._app_host: Optional[ApplicationHost] = None + + self._log: Optional[str] = None + self._path: Optional[str] = None + self._level: Optional[LoggingLevel] = None + self._console: Optional[LoggingLevel] = None + + def init(self, args: tuple): + self._log_settings = args[0] + self._time_format_settings = args[1] + self._app_host = args[2] + + self._log = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + self._path = self._log_settings.path + self._level = self._log_settings.level + self._console = self._log_settings.console + + def _get_datetime_now(self) -> str: + try: + return datetime.datetime.now().strftime(self._time_format_settings.date_time_format) + except Exception as e: + self.error(__name__, 'Cannot get time', ex=e) + + def _get_date(self) -> str: + try: + return datetime.datetime.now().strftime(self._time_format_settings.date_format) + except Exception as e: + self.error(__name__, 'Cannot get date', ex=e) + + def create(self) -> None: + """ path """ + try: + # check if log file path exists + if not os.path.exists(self._path): + os.mkdir(self._path) + except Exception as e: + self.fatal(__name__, 'Cannot create log dir', ex=e) + + """ create new log file """ + try: + # open log file, create if not exists + path = f'{self._path}{self._log}' + f = open(path, "w+") + Console.write_line(f'[{__name__}]: Using log file: {path}') + f.close() + except Exception as e: + self.fatal(__name__, 'Cannot open log file', ex=e) + + def _append_log(self, string): + try: + # open log file and append always + with open(self._path + self._log, "a+", encoding="utf-8") as f: + f.write(string + '\n') + f.close() + except Exception as e: + self.error(__name__, f'Cannot append log file, message: {string}', ex=e) + + def _get_string(self, name: str, level: LoggingLevel, message: str) -> str: + log_level = level.name + return f'<{self._get_datetime_now()}> [ {log_level} ] [ {name} ]: {message}' + + def header(self, string: str): + # append log and print message + self._append_log(string) + Console.write_line(string, 'white') + + def trace(self, name: str, message: str): + output = self._get_string(name, LoggingLevel.TRACE, message) + + # check if message can be written to log + if self._level.value >= LoggingLevel.TRACE.value: + self._append_log(output) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.TRACE.value: + Console.write_line(output, 'green') + + def debug(self, name: str, message: str): + output = self._get_string(name, LoggingLevel.DEBUG, message) + + # check if message can be written to log + if self._level.value >= LoggingLevel.DEBUG.value: + self._append_log(output) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.DEBUG.value: + Console.write_line(output, 'green') + + def info(self, name: str, message: str): + output = self._get_string(name, LoggingLevel.INFO, message) + + # check if message can be written to log + if self._level.value >= LoggingLevel.INFO.value: + self._append_log(output) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.INFO.value: + Console.write_line(output, 'green') + + def warn(self, name: str, message: str): + output = self._get_string(name, LoggingLevel.WARN, message) + + # check if message can be written to log + if self._level.value >= LoggingLevel.WARN.value: + self._append_log(output) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.WARN.value: + Console.write_line(output, 'yellow') + + def error(self, name: str, message: str, ex: Exception = None): + output = '' + if ex is not None: + tb = traceback.format_exc() + self.error(name, message) + output = self._get_string(name, LoggingLevel.ERROR, f'{ex} -> {tb}') + else: + output = self._get_string(name, LoggingLevel.ERROR, message) + + # check if message can be written to log + if self._level.value >= LoggingLevel.ERROR.value: + self._append_log(output) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.ERROR.value: + Console.write_line(output, 'red') + + def fatal(self, name: str, message: str, ex: Exception = None): + output = '' + if ex is not None: + tb = traceback.format_exc() + self.error(name, message) + output = self._get_string(name, LoggingLevel.ERROR, f'{ex} -> {tb}') + else: + output = self._get_string(name, LoggingLevel.ERROR, message) + + # check if message can be written to log + if self._level.value >= LoggingLevel.FATAL.value: + self._append_log(output) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.FATAL.value: + Console.write_line(output, 'red') + + exit() diff --git a/src/sh_edraft/logging/model/__init__.py b/src/sh_edraft/logging/model/__init__.py new file mode 100644 index 00000000..e9d22762 --- /dev/null +++ b/src/sh_edraft/logging/model/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.logging.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.logging.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/logging/model/log_level.py b/src/sh_edraft/logging/model/log_level.py new file mode 100644 index 00000000..ceb7b4c7 --- /dev/null +++ b/src/sh_edraft/logging/model/log_level.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class LoggingLevel(Enum): + + OFF = 0 # Nothing + FATAL = 1 # Error that cause exit + ERROR = 2 # Non fatal error + WARN = 3 # Error that can later be fatal + INFO = 4 # Normal information's + DEBUG = 5 # Detailed app state + TRACE = 6 # Detailed app information's diff --git a/src/sh_edraft/logging/model/log_settings.py b/src/sh_edraft/logging/model/log_settings.py new file mode 100644 index 00000000..1de23396 --- /dev/null +++ b/src/sh_edraft/logging/model/log_settings.py @@ -0,0 +1,60 @@ +import traceback +from typing import Optional + +from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.logging.model.log_settings_name import LogSettingsName +from sh_edraft.utils.console import Console +from sh_edraft.logging.model.log_level import LoggingLevel + + +class LoggingSettings(ConfigurationModelBase): + + def __init__(self): + ConfigurationModelBase.__init__(self) + + self._path: Optional[str] = None + self._filename: Optional[str] = None + self._console: Optional[LoggingLevel] = None + self._level: Optional[LoggingLevel] = None + + @property + def path(self) -> str: + return self._path + + @path.setter + def path(self, path: str) -> None: + self._path = path + + @property + def filename(self) -> str: + return self._filename + + @filename.setter + def filename(self, filename: str) -> None: + self._filename = filename + + @property + def console(self) -> LoggingLevel: + return self._console + + @console.setter + def console(self, console: LoggingLevel) -> None: + self._console = console + + @property + def level(self) -> LoggingLevel: + return self._level + + @level.setter + def level(self, level: LoggingLevel) -> None: + self._level = level + + def from_dict(self, settings: dict): + try: + self._path = settings[LogSettingsName.path.value] + self._filename = settings[LogSettingsName.filename.value] + self._console = LoggingLevel[settings[LogSettingsName.console_level.value]] + self._level = LoggingLevel[settings[LogSettingsName.file_level.value]] + except Exception as e: + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {LogSettingsName.log.value} settings', 'red') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') diff --git a/src/sh_edraft/logging/model/log_settings_name.py b/src/sh_edraft/logging/model/log_settings_name.py new file mode 100644 index 00000000..3bd90037 --- /dev/null +++ b/src/sh_edraft/logging/model/log_settings_name.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class LogSettingsName(Enum): + + log = 'Log' + path = 'Path' + filename = 'Filename' + console_level = 'ConsoleLogLevel' + file_level = 'FileLogLevel' diff --git a/src/sh_edraft/publish/base/publisher_base.py b/src/sh_edraft/publish/base/publisher_base.py index d8d3fdc2..51c3d086 100644 --- a/src/sh_edraft/publish/base/publisher_base.py +++ b/src/sh_edraft/publish/base/publisher_base.py @@ -1,10 +1,13 @@ -from abc import ABC, abstractmethod +from abc import abstractmethod + +from sh_edraft.service.base import ServiceBase -class PublisherBase(ABC): +class PublisherBase(ServiceBase): @abstractmethod - def __init__(self): pass + def __init__(self): + ServiceBase.__init__(self) @property @abstractmethod diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index 6241d614..e776d906 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -5,14 +5,12 @@ from typing import Optional from sh_edraft.publish.base.publisher_base import PublisherBase from sh_edraft.publish.model.template import Template -from sh_edraft.service.base import ServiceBase -class Publisher(ServiceBase, PublisherBase): +class Publisher(PublisherBase): def __init__(self): - ServiceBase.__init__(self) - PublisherBase.__init__(self) + super().__init__() self._logger: Optional[None] = None self._source_path: Optional[str] = None diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index 3af2fd19..80cbcb9b 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -21,7 +21,7 @@ from collections import namedtuple # imports: from sh_edraft.service.base.service_base import ServiceBase -from sh_edraft.service.base.provider_base import ProviderBase +from sh_edraft.service.base.service_provider_base import ServiceProviderBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/service/base/provider_base.py b/src/sh_edraft/service/base/service_provider_base.py similarity index 79% rename from src/sh_edraft/service/base/provider_base.py rename to src/sh_edraft/service/base/service_provider_base.py index 55451908..ee1f319a 100644 --- a/src/sh_edraft/service/base/provider_base.py +++ b/src/sh_edraft/service/base/service_provider_base.py @@ -1,4 +1,4 @@ -from abc import ABC, abstractmethod +from abc import abstractmethod from collections import Callable from typing import Type @@ -6,10 +6,11 @@ from sh_edraft.service.base.service_base import ServiceBase from sh_edraft.service.model.provide_state import ProvideState -class ProviderBase(ABC): +class ServiceProviderBase(ServiceBase): @abstractmethod def __init__(self): + ServiceBase.__init__(self) self._transient_services: list[ProvideState] = [] self._scoped_services: list[ProvideState] = [] self._singleton_services: list[ServiceBase] = [] @@ -24,7 +25,7 @@ class ProviderBase(ABC): def add_singleton(self, service: Type[ServiceBase], *args): pass @abstractmethod - def get_service(self, instance_type: type) -> Callable[ServiceBase]: pass + def get_service(self, instance_type: Type[ServiceBase]) -> Callable[ServiceBase]: pass @abstractmethod def remove_service(self, instance_type: type): pass diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index b827f83d..fdc93c36 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -3,18 +3,19 @@ from typing import Type from termcolor import colored -from sh_edraft.service.base.provider_base import ProviderBase +from sh_edraft.service.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase from sh_edraft.service.model.provide_state import ProvideState -class ServiceProvider(ProviderBase): +class ServiceProvider(ServiceProviderBase): def __init__(self): - ProviderBase.__init__(self) + super().__init__() - def create(self): - pass + def init(self, args: tuple): pass + + def create(self): pass @staticmethod def _create_instance(service: type[ServiceBase], args: tuple) -> ServiceBase: @@ -38,31 +39,31 @@ class ServiceProvider(ProviderBase): self._singleton_services.append(self._create_instance(service, args)) - def get_service(self, instance_type: type) -> Callable[ServiceBase]: + def get_service(self, instance_type: Type[ServiceBase]) -> Callable[ServiceBase]: for state in self._transient_services: - if state.service == instance_type: + if isinstance(state.service, type(instance_type)): return self._create_instance(state.service, state.args) for state in self._scoped_services: - if type(state.service) == instance_type: + if isinstance(state.service, type(instance_type)): return self._create_instance(state.service, state.args) for service in self._singleton_services: - if type(service) == instance_type: + if isinstance(service, instance_type): return service def remove_service(self, instance_type: type): for state in self._transient_services: - if state.service == instance_type: + if isinstance(state.service, type(instance_type)): self._transient_services.remove(state) return for state in self._scoped_services: - if type(state.service) == instance_type: + if isinstance(state.service, type(instance_type)): self._scoped_services.remove(state) return for service in self._singleton_services: - if type(service) == instance_type: + if isinstance(service, instance_type): self._singleton_services.remove(service) return diff --git a/src/sh_edraft/time/__init__.py b/src/sh_edraft/time/__init__.py new file mode 100644 index 00000000..28f6ff53 --- /dev/null +++ b/src/sh_edraft/time/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.time +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.time' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/time/model/__init__.py b/src/sh_edraft/time/model/__init__.py new file mode 100644 index 00000000..3950ec94 --- /dev/null +++ b/src/sh_edraft/time/model/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.time.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.time.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/time/model/time_format_settings.py b/src/sh_edraft/time/model/time_format_settings.py new file mode 100644 index 00000000..9c6b33ce --- /dev/null +++ b/src/sh_edraft/time/model/time_format_settings.py @@ -0,0 +1,59 @@ +import traceback +from typing import Optional + +from sh_edraft.configuration.model import ConfigurationModelBase +from sh_edraft.time.model.time_format_settings_names import TimeFormatSettingsNames +from sh_edraft.utils.console import Console + + +class TimeFormatSettings(ConfigurationModelBase): + + def __init__(self): + self._date_format: Optional[str] = None + self._time_format: Optional[str] = None + self._date_time_format: Optional[str] = None + self._date_time_log_format: Optional[str] = None + self._os_name: Optional[str] = None + self._hostname: Optional[str] = None + + @property + def date_format(self) -> str: + return self._date_format + + @date_format.setter + def date_format(self, date_format: str) -> None: + self._date_format = date_format + + @property + def time_format(self) -> str: + return self._time_format + + @time_format.setter + def time_format(self, time_format: str): + self._time_format = time_format + + @property + def date_time_format(self) -> str: + return self._date_time_format + + @date_time_format.setter + def date_time_format(self, date_time_format: str) -> None: + self._date_time_format = date_time_format + + @property + def date_time_log_format(self): + return self._date_time_log_format + + @date_time_log_format.setter + def date_time_log_format(self, date_time_now_format: str) -> None: + self._date_time_log_format = date_time_now_format + + def from_dict(self, settings: dict): + try: + self._date_format = settings[TimeFormatSettingsNames.date_format.value] + self._time_format = settings[TimeFormatSettingsNames.time_format.value] + self._date_time_format = settings[TimeFormatSettingsNames.date_time_format.value] + self._date_time_log_format = settings[TimeFormatSettingsNames.date_time_log_format.value] + except Exception as e: + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {TimeFormatSettingsNames.formats.value} settings') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') diff --git a/src/sh_edraft/time/model/time_format_settings_names.py b/src/sh_edraft/time/model/time_format_settings_names.py new file mode 100644 index 00000000..4afc21cd --- /dev/null +++ b/src/sh_edraft/time/model/time_format_settings_names.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class TimeFormatSettingsNames(Enum): + + formats = 'TimeFormats' + date_format = 'DateFormat' + time_format = 'TimeFormat' + date_time_format = 'DateTimeFormat' + date_time_log_format = 'DateTimeLogFormat' diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py new file mode 100644 index 00000000..f6849df3 --- /dev/null +++ b/src/sh_edraft/utils/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.utils +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.utils' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.0.1' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=0.1) diff --git a/src/sh_edraft/utils/console.py b/src/sh_edraft/utils/console.py new file mode 100644 index 00000000..1d014a9c --- /dev/null +++ b/src/sh_edraft/utils/console.py @@ -0,0 +1,11 @@ +from termcolor import colored + + +class Console: + + @staticmethod + def write_line(string: str, color: str = None): + if color is not None: + print(colored(string, color)) + else: + print(string) diff --git a/src/tests/logger.py b/src/tests/logger.py new file mode 100644 index 00000000..47b5e3ab --- /dev/null +++ b/src/tests/logger.py @@ -0,0 +1,50 @@ +import os +from string import Template + +from sh_edraft.configuration import ApplicationHost +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.logging.logger import Logger +from sh_edraft.logging.model.log_settings import LoggingSettings +from sh_edraft.time.model.time_format_settings import TimeFormatSettings + + +class LoggerTest: + + @staticmethod + def start(app_host: ApplicationHost): + services = app_host.services + + log_settings = LoggingSettings() + log_settings.from_dict({ + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }) + + time_format_settings = TimeFormatSettings() + time_format_settings.from_dict({ + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }) + + services.add_singleton(Logger, log_settings, time_format_settings, app_host) + logger: Logger = services.get_service(LoggerBase) + + if logger is None: + raise Exception(f'{__name__}: Service is None') + + logger.create() + logger.info(__name__, 'test') + + if not os.path.isdir(log_settings.path): + raise Exception(f'{__name__}: Log path was not created') + + log_file = Template(log_settings.filename).substitute( + date_time_now=app_host.date_time_now.strftime(time_format_settings.date_time_format), + start_time=app_host.start_time.strftime(time_format_settings.date_time_log_format) + ) + if not os.path.isfile(log_settings.path + log_file): + raise Exception(f'{__name__}: Log file was not created') diff --git a/src/tests/publisher.py b/src/tests/publisher.py index 43d350c4..3e100328 100644 --- a/src/tests/publisher.py +++ b/src/tests/publisher.py @@ -1,6 +1,7 @@ import os -from sh_edraft.service import ServiceProvider +from sh_edraft.publish.base import PublisherBase +from sh_edraft.service.base import ServiceProviderBase from sh_edraft.source_code.model import Version from sh_edraft.publish import Publisher from sh_edraft.publish.model import Template @@ -9,7 +10,7 @@ from sh_edraft.publish.model import Template class PublisherTest: @staticmethod - def start(services: ServiceProvider): + def start(services: ServiceProviderBase): templates = [ Template( '../../publish_templates/*_template.txt', @@ -43,7 +44,7 @@ class PublisherTest: dist = '../../dist' services.add_singleton(Publisher, None, source, dist, templates) - publisher: Publisher = services.get_service(Publisher) + publisher: Publisher = services.get_service(PublisherBase) publisher.exclude('../tests/') publisher.include('../../LICENSE') diff --git a/src/tests/service_provider.py b/src/tests/service_provider.py index 06317e85..d5808d05 100644 --- a/src/tests/service_provider.py +++ b/src/tests/service_provider.py @@ -1,23 +1,21 @@ from sh_edraft.publish import Publisher -from sh_edraft.service import ServiceProvider +from sh_edraft.publish.base import PublisherBase +from sh_edraft.service.base import ServiceProviderBase class ServiceProviderTest: @staticmethod - def start() -> ServiceProvider: - provider = ServiceProvider() + def start(provider: ServiceProviderBase): provider.create() provider.add_transient(Publisher, None, '../', '../../dist', []) - publisher: Publisher = provider.get_service(Publisher) + publisher: Publisher = provider.get_service(PublisherBase) - if publisher.source_path != '../' or publisher.dist_path != '../../dist': + if publisher is None or publisher.source_path != '../' or publisher.dist_path != '../../dist': raise Exception(f'{__name__}: Invalid value in {Publisher.__name__}') - provider.remove_service(Publisher) - if provider.get_service(Publisher) is not None: + provider.remove_service(PublisherBase) + if provider.get_service(PublisherBase) is not None: raise Exception(f'{__name__}: Service {Publisher.__name__} was not removed') - - return provider diff --git a/src/tests/test.py b/src/tests/tester.py similarity index 56% rename from src/tests/test.py rename to src/tests/tester.py index 91b9bb4f..64fa121e 100644 --- a/src/tests/test.py +++ b/src/tests/tester.py @@ -1,28 +1,27 @@ import os import sys +import traceback from typing import Optional from termcolor import colored +from sh_edraft.configuration import ApplicationHost from sh_edraft.service import ServiceProvider +from tests.logger import LoggerTest from tests.publisher import PublisherTest from tests.service_provider import ServiceProviderTest -class Test: +class Tester: def __init__(self): + self._app_host = ApplicationHost() self._services: Optional[ServiceProvider] = None - self._tests = [ - ServiceProviderTest, - PublisherTest - ] - self._error: bool = False @staticmethod - def block_print(): + def disable_print(): sys.stdout = open(os.devnull, 'w') @staticmethod @@ -32,36 +31,52 @@ class Test: def success(self, message: str): self.enable_print() print(colored(message, 'green')) - self.block_print() + self.disable_print() def failed(self, message: str): self.enable_print() print(colored(message, 'red')) - self.block_print() + self.disable_print() + + def exception(self): + self.enable_print() + print(colored(traceback.format_exc(), 'red')) + self.disable_print() def create(self): pass def start(self): - self.block_print() + self.disable_print() if not self._error: try: - self._services = ServiceProviderTest.start() + ServiceProviderTest.start(self._app_host.services) self.success(f'{ServiceProviderTest.__name__} test succeeded.') except Exception as e: self._error = True self.failed(f'{ServiceProviderTest.__name__} test failed!\n{e}') + self.exception() if not self._error: try: - PublisherTest.start(self._services) + LoggerTest.start(self._app_host) + self.success(f'{LoggerTest.__name__} test succeeded.') + except Exception as e: + self._error = True + self.failed(f'{LoggerTest.__name__} test failed!\n{e}') + self.exception() + + if not self._error: + try: + PublisherTest.start(self._app_host.services) self.success(f'{PublisherTest.__name__} test succeeded.') except Exception as e: self._error = True self.failed(f'{PublisherTest.__name__} test failed!\n{e}') + self.exception() if __name__ == '__main__': - test = Test() - test.create() - test.start() + tester = Tester() + tester.create() + tester.start() From 413800f2c35fe934d6047ceb9f386361b240fb21 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 22 Nov 2020 20:56:31 +0100 Subject: [PATCH 08/86] Improved logging and updated modules --- src/sh_edraft/__init__.py | 6 +- src/sh_edraft/configuration/__init__.py | 6 +- src/sh_edraft/configuration/model/__init__.py | 6 +- src/sh_edraft/discord/__init__.py | 4 +- src/sh_edraft/logging/__init__.py | 7 +- src/sh_edraft/logging/base/__init__.py | 5 +- src/sh_edraft/logging/logger.py | 2 - src/sh_edraft/logging/model/__init__.py | 6 +- src/sh_edraft/mailing/__init__.py | 4 +- src/sh_edraft/messenger/__init__.py | 4 +- src/sh_edraft/publish/__init__.py | 6 +- src/sh_edraft/publish/base/__init__.py | 6 +- src/sh_edraft/publish/model/__init__.py | 8 +- src/sh_edraft/publish/publisher.py | 120 +++++++++++------- src/sh_edraft/service/__init__.py | 6 +- src/sh_edraft/service/base/__init__.py | 8 +- src/sh_edraft/service/model/__init__.py | 5 +- src/sh_edraft/source_code/__init__.py | 4 +- src/sh_edraft/source_code/model/__init__.py | 8 +- src/sh_edraft/source_code/model/version.py | 4 +- src/sh_edraft/time/__init__.py | 4 +- src/sh_edraft/time/model/__init__.py | 6 +- src/sh_edraft/utils/__init__.py | 5 +- src/tests/__init__.py | 4 +- src/tests/publisher.py | 8 +- src/tests/service_provider.py | 13 +- src/tests/tester.py | 23 ++-- 27 files changed, 158 insertions(+), 130 deletions(-) diff --git a/src/sh_edraft/__init__.py b/src/sh_edraft/__init__.py index 58fb4bac..775e3790 100644 --- a/src/sh_edraft/__init__.py +++ b/src/sh_edraft/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple - +# imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py index e08dcd42..12f35645 100644 --- a/src/sh_edraft/configuration/__init__.py +++ b/src/sh_edraft/configuration/__init__.py @@ -15,12 +15,12 @@ __title__ = 'sh_edraft.configuration' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.configuration.application_host import ApplicationHost +from .application_host import ApplicationHost VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/configuration/model/__init__.py b/src/sh_edraft/configuration/model/__init__.py index 824ece23..e5226338 100644 --- a/src/sh_edraft/configuration/model/__init__.py +++ b/src/sh_edraft/configuration/model/__init__.py @@ -15,12 +15,12 @@ __title__ = 'sh_edraft.configuration.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from .configuration_model_base import ConfigurationModelBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/discord/__init__.py b/src/sh_edraft/discord/__init__.py index e8957e78..e1ab9453 100644 --- a/src/sh_edraft/discord/__init__.py +++ b/src/sh_edraft/discord/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.discord' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/logging/__init__.py b/src/sh_edraft/logging/__init__.py index 7ac6e90c..a70129f6 100644 --- a/src/sh_edraft/logging/__init__.py +++ b/src/sh_edraft/logging/__init__.py @@ -15,11 +15,12 @@ __title__ = 'sh_edraft.logging' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple - +# imports: +from .logger import Logger VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/logging/base/__init__.py b/src/sh_edraft/logging/base/__init__.py index 662b7253..209ee125 100644 --- a/src/sh_edraft/logging/base/__init__.py +++ b/src/sh_edraft/logging/base/__init__.py @@ -15,11 +15,12 @@ __title__ = 'sh_edraft.logging.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: +from .logger_base import LoggerBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index b616b8b0..132369d8 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -4,8 +4,6 @@ import traceback from string import Template from typing import Optional -from termcolor import colored - from sh_edraft.configuration.application_host import ApplicationHost from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model.log_level import LoggingLevel diff --git a/src/sh_edraft/logging/model/__init__.py b/src/sh_edraft/logging/model/__init__.py index e9d22762..6b232b0c 100644 --- a/src/sh_edraft/logging/model/__init__.py +++ b/src/sh_edraft/logging/model/__init__.py @@ -15,11 +15,13 @@ __title__ = 'sh_edraft.logging.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: +from .log_level import LoggingLevel +from .log_settings import LoggingSettings VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/mailing/__init__.py b/src/sh_edraft/mailing/__init__.py index 45e5a87e..5f2d9f23 100644 --- a/src/sh_edraft/mailing/__init__.py +++ b/src/sh_edraft/mailing/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.mailing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/messenger/__init__.py b/src/sh_edraft/messenger/__init__.py index 2bab0145..8d501a96 100644 --- a/src/sh_edraft/messenger/__init__.py +++ b/src/sh_edraft/messenger/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.messenger' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/publish/__init__.py b/src/sh_edraft/publish/__init__.py index e754a8ac..7b162462 100644 --- a/src/sh_edraft/publish/__init__.py +++ b/src/sh_edraft/publish/__init__.py @@ -15,12 +15,12 @@ __title__ = 'sh_edraft.publish' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.publish.publisher import Publisher +from .publisher import Publisher VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/publish/base/__init__.py b/src/sh_edraft/publish/base/__init__.py index 0c156e0d..a7e178d1 100644 --- a/src/sh_edraft/publish/base/__init__.py +++ b/src/sh_edraft/publish/base/__init__.py @@ -15,12 +15,12 @@ __title__ = 'sh_edraft.publish.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.publish.base.publisher_base import PublisherBase +from .publisher_base import PublisherBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/publish/model/__init__.py b/src/sh_edraft/publish/model/__init__.py index caad810e..dbc1c3b5 100644 --- a/src/sh_edraft/publish/model/__init__.py +++ b/src/sh_edraft/publish/model/__init__.py @@ -15,13 +15,13 @@ __title__ = 'sh_edraft.publish.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.publish.model.template import Template -from sh_edraft.publish.model.template_enum import TemplateEnum +from .template import Template +from .template_enum import TemplateEnum VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index e776d906..7fae4fff 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -3,6 +3,7 @@ import shutil from string import Template as stringTemplate from typing import Optional +from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publish.base.publisher_base import PublisherBase from sh_edraft.publish.model.template import Template @@ -12,7 +13,7 @@ class Publisher(PublisherBase): def __init__(self): super().__init__() - self._logger: Optional[None] = None + self._logger: Optional[LoggerBase] = None self._source_path: Optional[str] = None self._dist_path: Optional[str] = None self._settings: Optional[list[Template]] = None @@ -30,12 +31,13 @@ class Publisher(PublisherBase): def dist_path(self): return self._dist_path - @staticmethod - def _get_template_output(t: Template, name: str, imports: str) -> str: + def _get_template_output(self, t: Template, name: str, imports: str) -> str: + self._logger.trace(__name__, f'Started {__name__}._get_template_output') try: if t.file_content == '': raise Exception(f'Template is empty: {t.template_path}') + self._logger.trace(__name__, f'Stopped {__name__}._get_template_output') return stringTemplate(t.file_content).substitute( Name=name, Description=t.description, @@ -53,16 +55,20 @@ class Publisher(PublisherBase): Imports=imports ) except Exception as e: - print(1, e) - # todo: better logging + self._logger.fatal(__name__, f'Cannot read Template: {t.template_path}', e) + self._logger.trace(__name__, f'Stopped {__name__}._get_template_output') def _read_source_path(self): + self._logger.trace(__name__, f'Started {__name__}._read_source_path') for r, d, f in os.walk(self._source_path): for file in f: if file.endswith('.py') or file in self._included_files: self._included_files.append(os.path.join(r, file)) + self._logger.trace(__name__, f'Stopped {__name__}._read_source_path') + def _read_templates(self): + self._logger.trace(__name__, f'Started {__name__}._read_templates') for t in self._settings: output_template: str = '' if not os.path.isfile(t.template_path): @@ -74,22 +80,26 @@ class Publisher(PublisherBase): if t.file_content == '': raise Exception(f'Template is empty: {t.template_path}') + self._logger.trace(__name__, f'Stopped {__name__}._read_templates') + def _create_dist_path(self): + self._logger.trace(__name__, f'Started {__name__}._create_dist_path') if os.path.isdir(self._dist_path): try: shutil.rmtree(self._dist_path) - print(f'Deleted {self._dist_path}') - # todo: better logging + self._logger.info(__name__, f'Deleted {self._dist_path}') except Exception as e: - print(e) - # todo: log error + self._logger.fatal(__name__, f'Cannot delete old dist directory', e) if not os.path.isdir(self._dist_path): try: os.makedirs(self._dist_path) + self._logger.debug(__name__, f'Created directories: {self._dist_path}') + self._logger.info(__name__, f'Created dist directory') except Exception as e: - print(e) - # todo: log error + self._logger.fatal(__name__, f'Cannot create dist directory', e) + + self._logger.trace(__name__, f'Stopped {__name__}._create_dist_path') @staticmethod def _get_template_name_from_dirs(file: str) -> str: @@ -104,6 +114,7 @@ class Publisher(PublisherBase): return '.'.join(dirs) def _write_templates(self): + self._logger.trace(__name__, f'Started {__name__}._write_templates') for template in self._settings: for file in self._included_files: if os.path.basename(file) == '__init__.py' and file not in self._excluded_files: @@ -133,7 +144,7 @@ class Publisher(PublisherBase): with open(file, 'w+') as py_file: py_file.write(self._get_template_output(template, template_name, '# imports:')) py_file.close() - print(f'Written to {file}') + self._logger.debug(__name__, f'Written to {file}') else: is_started = False for line in module_file_lines: @@ -149,73 +160,86 @@ class Publisher(PublisherBase): with open(file, 'w+') as py_file: py_file.write(self._get_template_output(template, template_name, imports)) py_file.close() - print(f'Written to {file}') + self._logger.debug(__name__, f'Written to {file}') except Exception as e: - print(e) - # todo: better logging + self._logger.error(__name__, f'Cannot write to file: {file}', e) + + self._logger.info(__name__, f'Written to all included modules') + self._logger.trace(__name__, f'Stopped {__name__}._write_templates') def _copy_all_included_files(self): + self._logger.trace(__name__, f'Started {__name__}._copy_all_included_files') dist_path = self._dist_path if self._dist_path.endswith('/'): dist_path = dist_path[:len(dist_path) - 1] - for file in self._included_files: - is_file_excluded = False - if file in self._excluded_files: - is_file_excluded = True - else: - for excluded in self._excluded_files: - if file.__contains__(excluded): - is_file_excluded = True + for file in self._included_files: + is_file_excluded = False + if file in self._excluded_files: + is_file_excluded = True + else: + for excluded in self._excluded_files: + if file.__contains__(excluded): + is_file_excluded = True - if not is_file_excluded: - output_file = '' - if file.startswith('..'): - output_file = file.replace('..', '') + if not is_file_excluded: + output_file = '' - elif file.startswith('.'): - output_file = file.replace('.', '', 1) + if file.startswith('..'): + output_file = file.replace('..', '') + elif file.startswith('.'): + output_file = file.replace('.', '', 1) - output_file = f'{dist_path}{output_file}' - output_path = os.path.dirname(output_file) + output_file = f'{dist_path}{output_file}' + output_path = os.path.dirname(output_file) - try: - if not os.path.isdir(output_path): - os.makedirs(output_path) - except Exception as e: - print(e) - # todo: better logging + try: + if not os.path.isdir(output_path): + os.makedirs(output_path) + except Exception as e: + self._logger.error(__name__, f'Cannot create directories: {output_path}', e) - try: - shutil.copy(file, output_file) - except Exception as e: - print(e) - # todo: better logging + try: + shutil.copy(file, output_file) + except Exception as e: + self._logger.error(__name__, f'Cannot copy file: {file} to {output_path}', e) - print(f'Copied {file} to {output_path}') - # todo: better logging + self._logger.debug(__name__, f'Copied {file} to {output_path}') + + self._logger.info(__name__, f'Copied all included files') + self._logger.trace(__name__, f'Stopped {__name__}._copy_all_included_files') def include(self, path: str): + self._logger.trace(__name__, f'Started {__name__}.include') self._included_files.append(path) + self._logger.trace(__name__, f'Stopped {__name__}.include') def exclude(self, path: str): + self._logger.trace(__name__, f'Started {__name__}.exclude') self._excluded_files.append(path) + self._logger.trace(__name__, f'Stopped {__name__}.exclude') def init(self, args: tuple): - self._logger = args[0] - self._source_path = args[1] - self._dist_path = args[2] - self._settings = args[3] + self._logger: LoggerBase = args[0] + self._source_path: str = args[1] + self._dist_path: str = args[2] + self._settings: list[Template] = args[3] + + self._logger.header(f'{__name__}:') def create(self): + self._logger.trace(__name__, f'Started {__name__}.create') if not self._dist_path.endswith('/'): self._dist_path += '/' self._read_source_path() self._read_templates() self._create_dist_path() + self._logger.trace(__name__, f'Stopped {__name__}.create') def publish(self): + self._logger.trace(__name__, f'Started {__name__}.publish') self._write_templates() self._copy_all_included_files() + self._logger.trace(__name__, f'Stopped {__name__}.publish') diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index 50d977b6..dbc93593 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -15,12 +15,12 @@ __title__ = 'sh_edraft.service' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.service.service_provider import ServiceProvider +from .service_provider import ServiceProvider VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index 80cbcb9b..e2c43c24 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -15,13 +15,13 @@ __title__ = 'sh_edraft.service.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.service.base.service_base import ServiceBase -from sh_edraft.service.base.service_provider_base import ServiceProviderBase +from .service_base import ServiceBase +from .service_provider_base import ServiceProviderBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py index f48cec28..9a4effc3 100644 --- a/src/sh_edraft/service/model/__init__.py +++ b/src/sh_edraft/service/model/__init__.py @@ -15,11 +15,12 @@ __title__ = 'sh_edraft.service.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: +from .provide_state import ProvideState VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/source_code/__init__.py b/src/sh_edraft/source_code/__init__.py index 43c2d77d..1df505f4 100644 --- a/src/sh_edraft/source_code/__init__.py +++ b/src/sh_edraft/source_code/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.source_code' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/source_code/model/__init__.py b/src/sh_edraft/source_code/model/__init__.py index a37844ed..5e7c6981 100644 --- a/src/sh_edraft/source_code/model/__init__.py +++ b/src/sh_edraft/source_code/model/__init__.py @@ -15,13 +15,13 @@ __title__ = 'sh_edraft.source_code.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: -from sh_edraft.source_code.model.version import Version -from sh_edraft.source_code.model.version_enum import VersionEnum +from .version import Version +from .version_enum import VersionEnum VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/source_code/model/version.py b/src/sh_edraft/source_code/model/version.py index c9ccfeb0..a7ba870e 100644 --- a/src/sh_edraft/source_code/model/version.py +++ b/src/sh_edraft/source_code/model/version.py @@ -14,7 +14,7 @@ class Version(ConfigurationModelBase): ): self._major: Optional[int] = major self._minor: Optional[int] = minor - self._micro: Optional[float] = micro + self._micro: Optional[int] = micro @property def major(self) -> int: @@ -34,7 +34,7 @@ class Version(ConfigurationModelBase): def from_dict(self, settings: dict): self._major = int(settings[VersionEnum.Major.value]) self._minor = int(settings[VersionEnum.Minor.value]) - self._micro = float(settings[VersionEnum.Micro.value]) + self._micro = int(settings[VersionEnum.Micro.value]) def to_dict(self) -> dict: return { diff --git a/src/sh_edraft/time/__init__.py b/src/sh_edraft/time/__init__.py index 28f6ff53..8b6e4c87 100644 --- a/src/sh_edraft/time/__init__.py +++ b/src/sh_edraft/time/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.time' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/time/model/__init__.py b/src/sh_edraft/time/model/__init__.py index 3950ec94..e786e832 100644 --- a/src/sh_edraft/time/model/__init__.py +++ b/src/sh_edraft/time/model/__init__.py @@ -15,11 +15,13 @@ __title__ = 'sh_edraft.time.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: +from .time_format_settings import TimeFormatSettings +from .time_format_settings_names import TimeFormatSettingsNames VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py index f6849df3..4130c05d 100644 --- a/src/sh_edraft/utils/__init__.py +++ b/src/sh_edraft/utils/__init__.py @@ -15,11 +15,12 @@ __title__ = 'sh_edraft.utils' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: +from .console import Console VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/tests/__init__.py b/src/tests/__init__.py index ce54614e..6d9d25af 100644 --- a/src/tests/__init__.py +++ b/src/tests/__init__.py @@ -15,11 +15,11 @@ __title__ = 'tests' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.0.1' +__version__ = '2020.12.5' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=0.1) +version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/tests/publisher.py b/src/tests/publisher.py index 3e100328..73923471 100644 --- a/src/tests/publisher.py +++ b/src/tests/publisher.py @@ -1,5 +1,6 @@ import os +from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publish.base import PublisherBase from sh_edraft.service.base import ServiceProviderBase from sh_edraft.source_code.model import Version @@ -11,6 +12,7 @@ class PublisherTest: @staticmethod def start(services: ServiceProviderBase): + version = Version(2020, 12, 5).to_dict() templates = [ Template( '../../publish_templates/*_template.txt', @@ -23,7 +25,7 @@ class PublisherTest: ', see LICENSE for more details.', '', 'Sven Heidemann', - Version(2020, 12, 0.1).to_dict() + version ), Template( '../../publish_templates/*_template.txt', @@ -36,14 +38,14 @@ class PublisherTest: ', see LICENSE for more details.', '', 'Sven Heidemann', - Version(2020, 12, 0.1).to_dict() + version ) ] source = '../' dist = '../../dist' - services.add_singleton(Publisher, None, source, dist, templates) + services.add_transient(Publisher, services.get_service(LoggerBase), source, dist, templates) publisher: Publisher = services.get_service(PublisherBase) publisher.exclude('../tests/') diff --git a/src/tests/service_provider.py b/src/tests/service_provider.py index d5808d05..676cc604 100644 --- a/src/tests/service_provider.py +++ b/src/tests/service_provider.py @@ -1,3 +1,4 @@ +from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publish import Publisher from sh_edraft.publish.base import PublisherBase from sh_edraft.service.base import ServiceProviderBase @@ -6,16 +7,14 @@ from sh_edraft.service.base import ServiceProviderBase class ServiceProviderTest: @staticmethod - def start(provider: ServiceProviderBase): - provider.create() + def start(services: ServiceProviderBase): + services.add_transient(Publisher, services.get_service(LoggerBase), '../', '../../dist', []) - provider.add_transient(Publisher, None, '../', '../../dist', []) - - publisher: Publisher = provider.get_service(PublisherBase) + publisher: Publisher = services.get_service(PublisherBase) if publisher is None or publisher.source_path != '../' or publisher.dist_path != '../../dist': raise Exception(f'{__name__}: Invalid value in {Publisher.__name__}') - provider.remove_service(PublisherBase) - if provider.get_service(PublisherBase) is not None: + services.remove_service(PublisherBase) + if services.get_service(PublisherBase) is not None: raise Exception(f'{__name__}: Service {Publisher.__name__} was not removed') diff --git a/src/tests/tester.py b/src/tests/tester.py index 64fa121e..e4eb313e 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,12 +1,10 @@ import os import sys import traceback -from typing import Optional from termcolor import colored from sh_edraft.configuration import ApplicationHost -from sh_edraft.service import ServiceProvider from tests.logger import LoggerTest from tests.publisher import PublisherTest from tests.service_provider import ServiceProviderTest @@ -16,7 +14,6 @@ class Tester: def __init__(self): self._app_host = ApplicationHost() - self._services: Optional[ServiceProvider] = None self._error: bool = False @@ -46,7 +43,14 @@ class Tester: def create(self): pass def start(self): - self.disable_print() + if not self._error: + try: + LoggerTest.start(self._app_host) + self.success(f'{LoggerTest.__name__} test succeeded.') + except Exception as e: + self._error = True + self.failed(f'{LoggerTest.__name__} test failed!\n{e}') + self.exception() if not self._error: try: @@ -57,15 +61,6 @@ class Tester: self.failed(f'{ServiceProviderTest.__name__} test failed!\n{e}') self.exception() - if not self._error: - try: - LoggerTest.start(self._app_host) - self.success(f'{LoggerTest.__name__} test succeeded.') - except Exception as e: - self._error = True - self.failed(f'{LoggerTest.__name__} test failed!\n{e}') - self.exception() - if not self._error: try: PublisherTest.start(self._app_host.services) @@ -79,4 +74,6 @@ class Tester: if __name__ == '__main__': tester = Tester() tester.create() + tester.disable_print() tester.start() + tester.enable_print() From c7dff4a212abcfb91b9c55b7cb6d3462d3ad04fc Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Mon, 23 Nov 2020 22:22:17 +0100 Subject: [PATCH 09/86] Added testing for service provider with unittests. Also fixed small bugs, found while testing. --- src/sh_edraft/logging/base/logger_base.py | 10 +- src/sh_edraft/logging/logger.py | 7 - src/sh_edraft/publish/base/publisher_base.py | 13 +- src/sh_edraft/publish/publisher.py | 6 - src/sh_edraft/service/service_provider.py | 2 +- src/tests/service_provider.py | 20 --- src/tests/service_provider/__init__.py | 0 .../service_provider_create.py | 13 ++ .../service_provider_services.py | 130 ++++++++++++++++++ src/tests/tester.py | 77 ++--------- 10 files changed, 178 insertions(+), 100 deletions(-) delete mode 100644 src/tests/service_provider.py create mode 100644 src/tests/service_provider/__init__.py create mode 100644 src/tests/service_provider/service_provider_create.py create mode 100644 src/tests/service_provider/service_provider_services.py diff --git a/src/sh_edraft/logging/base/logger_base.py b/src/sh_edraft/logging/base/logger_base.py index d9579484..b4030be0 100644 --- a/src/sh_edraft/logging/base/logger_base.py +++ b/src/sh_edraft/logging/base/logger_base.py @@ -1,6 +1,10 @@ from abc import abstractmethod +from typing import Optional -from sh_edraft.service.base import ServiceBase +from sh_edraft.configuration.application_host import ApplicationHost +from sh_edraft.logging.model.log_settings import LoggingSettings +from sh_edraft.service.base.service_base import ServiceBase +from sh_edraft.time.model.time_format_settings import TimeFormatSettings class LoggerBase(ServiceBase): @@ -9,6 +13,10 @@ class LoggerBase(ServiceBase): def __init__(self): ServiceBase.__init__(self) + self._log_settings: Optional[LoggingSettings] = None + self._time_format_settings: Optional[TimeFormatSettings] = None + self._app_host: Optional[ApplicationHost] = None + @abstractmethod def header(self, string: str): pass diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 132369d8..689ca901 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -4,11 +4,8 @@ import traceback from string import Template from typing import Optional -from sh_edraft.configuration.application_host import ApplicationHost from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model.log_level import LoggingLevel -from sh_edraft.logging.model.log_settings import LoggingSettings -from sh_edraft.time.model.time_format_settings import TimeFormatSettings from sh_edraft.utils.console import Console @@ -17,10 +14,6 @@ class Logger(LoggerBase): def __init__(self): LoggerBase.__init__(self) - self._log_settings: Optional[LoggingSettings] = None - self._time_format_settings: Optional[TimeFormatSettings] = None - self._app_host: Optional[ApplicationHost] = None - self._log: Optional[str] = None self._path: Optional[str] = None self._level: Optional[LoggingLevel] = None diff --git a/src/sh_edraft/publish/base/publisher_base.py b/src/sh_edraft/publish/base/publisher_base.py index 51c3d086..2a2bea92 100644 --- a/src/sh_edraft/publish/base/publisher_base.py +++ b/src/sh_edraft/publish/base/publisher_base.py @@ -1,6 +1,9 @@ from abc import abstractmethod +from typing import Optional -from sh_edraft.service.base import ServiceBase +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.publish.model.template import Template +from sh_edraft.service.base.service_base import ServiceBase class PublisherBase(ServiceBase): @@ -9,6 +12,14 @@ class PublisherBase(ServiceBase): def __init__(self): ServiceBase.__init__(self) + self._logger: Optional[LoggerBase] = None + self._source_path: Optional[str] = None + self._dist_path: Optional[str] = None + self._settings: Optional[list[Template]] = None + + self._included_files: list[str] = [] + self._excluded_files: list[str] = [] + @property @abstractmethod def source_path(self) -> str: pass diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publish/publisher.py index 7fae4fff..1b371ed6 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -1,7 +1,6 @@ import os import shutil from string import Template as stringTemplate -from typing import Optional from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publish.base.publisher_base import PublisherBase @@ -13,11 +12,6 @@ class Publisher(PublisherBase): def __init__(self): super().__init__() - self._logger: Optional[LoggerBase] = None - self._source_path: Optional[str] = None - self._dist_path: Optional[str] = None - self._settings: Optional[list[Template]] = None - self._included_files: list[str] = [] self._excluded_files: list[str] = [] diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index fdc93c36..60627d42 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -30,7 +30,7 @@ class ServiceProvider(ServiceProviderBase): self._transient_services.append(ProvideState(service, args)) def add_scoped(self, service: Type[ServiceBase], *args): - self._transient_services.append(ProvideState(service, args)) + self._scoped_services.append(ProvideState(service, args)) def add_singleton(self, service: Type[ServiceBase], *args): for known_service in self._singleton_services: diff --git a/src/tests/service_provider.py b/src/tests/service_provider.py deleted file mode 100644 index 676cc604..00000000 --- a/src/tests/service_provider.py +++ /dev/null @@ -1,20 +0,0 @@ -from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publish import Publisher -from sh_edraft.publish.base import PublisherBase -from sh_edraft.service.base import ServiceProviderBase - - -class ServiceProviderTest: - - @staticmethod - def start(services: ServiceProviderBase): - services.add_transient(Publisher, services.get_service(LoggerBase), '../', '../../dist', []) - - publisher: Publisher = services.get_service(PublisherBase) - - if publisher is None or publisher.source_path != '../' or publisher.dist_path != '../../dist': - raise Exception(f'{__name__}: Invalid value in {Publisher.__name__}') - - services.remove_service(PublisherBase) - if services.get_service(PublisherBase) is not None: - raise Exception(f'{__name__}: Service {Publisher.__name__} was not removed') diff --git a/src/tests/service_provider/__init__.py b/src/tests/service_provider/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/service_provider/service_provider_create.py b/src/tests/service_provider/service_provider_create.py new file mode 100644 index 00000000..870b5d14 --- /dev/null +++ b/src/tests/service_provider/service_provider_create.py @@ -0,0 +1,13 @@ +import unittest + +from sh_edraft.service import ServiceProvider + + +class ServiceProviderCreate(unittest.TestCase): + + def test_create(self): + provider = ServiceProvider() + self.assertIsNotNone(provider) + provider.init(()) + provider.create() + self.assertIsNotNone(provider) diff --git a/src/tests/service_provider/service_provider_services.py b/src/tests/service_provider/service_provider_services.py new file mode 100644 index 00000000..5e65a2ea --- /dev/null +++ b/src/tests/service_provider/service_provider_services.py @@ -0,0 +1,130 @@ +import os +import unittest +from string import Template + +from sh_edraft.configuration import ApplicationHost +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.logging.model import LoggingSettings +from sh_edraft.publish import Publisher +from sh_edraft.publish.base import PublisherBase +from sh_edraft.service.base import ServiceBase +from sh_edraft.time.model import TimeFormatSettings + + +class ServiceProviderServices(unittest.TestCase): + + def setUp(self): + self._app_host = ApplicationHost() + self._services = self._app_host.services + self._services.init(()) + self._services.create() + + self._log_settings = LoggingSettings() + self._log_settings.from_dict({ + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }) + + self._time_format_settings = TimeFormatSettings() + self._time_format_settings.from_dict({ + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }) + + def _check_general_requirements(self): + self.assertIsNotNone(self._services) + + def _check_logger_requirements(self): + self.assertIsNotNone(self._log_settings) + self.assertIsNotNone(self._time_format_settings) + + def test_add_singleton(self): + print(f'{__name__}.test_add_singleton:') + self._check_general_requirements() + self._check_logger_requirements() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self.assertGreater(len(self._services._singleton_services), 0) + + found = False + for service in self._services._singleton_services: + if isinstance(service, Logger) and isinstance(service, LoggerBase) and isinstance(service, ServiceBase): + if not found: + found = True + + self.assertTrue(found) + + def test_get_singleton(self): + print(f'{__name__}.test_get_singleton:') + self._check_general_requirements() + self._check_logger_requirements() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + logger: Logger = self._services.get_service(LoggerBase) + self.assertIsNotNone(logger) + self.assertTrue(isinstance(logger, Logger)) + self.assertTrue(isinstance(logger, LoggerBase)) + self.assertTrue(isinstance(logger, ServiceBase)) + + self.assertEqual(logger._log_settings, self._log_settings) + self.assertEqual(logger._time_format_settings, self._time_format_settings) + self.assertEqual(logger._app_host, self._app_host) + + def test_add_scoped(self): + print(f'{__name__}.test_add_scoped:') + self._check_general_requirements() + self._check_logger_requirements() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_scoped(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + self.assertGreater(len(self._services._scoped_services), 0) + + def test_get_scoped(self): + print(f'{__name__}.test_get_scoped:') + self._check_general_requirements() + self._check_logger_requirements() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_scoped(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + publisher: Publisher = self._services.get_service(PublisherBase) + self.assertIsNotNone(publisher) + self.assertTrue(isinstance(publisher, Publisher)) + self.assertTrue(isinstance(publisher, PublisherBase)) + self.assertTrue(isinstance(publisher, ServiceBase)) + + self.assertTrue(isinstance(publisher._logger, Logger)) + self.assertTrue(isinstance(publisher._logger, LoggerBase)) + self.assertTrue(isinstance(publisher._logger, ServiceBase)) + + def test_add_transient(self): + print(f'{__name__}.test_add_transient:') + self._check_general_requirements() + self._check_logger_requirements() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_transient(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + self.assertGreater(len(self._services._transient_services), 0) + + self.assertTrue(bool(isinstance(service, ServiceBase) for service in self._services._transient_services)) + + def test_get_transient(self): + print(f'{__name__}.test_get_transient:') + self._check_general_requirements() + self._check_logger_requirements() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_transient(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + publisher: Publisher = self._services.get_service(PublisherBase) + self.assertIsNotNone(publisher) + self.assertTrue(isinstance(publisher, Publisher)) + self.assertTrue(isinstance(publisher, PublisherBase)) + self.assertTrue(isinstance(publisher, ServiceBase)) + + self.assertTrue(isinstance(publisher._logger, Logger)) + self.assertTrue(isinstance(publisher._logger, LoggerBase)) + self.assertTrue(isinstance(publisher._logger, ServiceBase)) diff --git a/src/tests/tester.py b/src/tests/tester.py index e4eb313e..234ad59a 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,79 +1,28 @@ -import os -import sys -import traceback +import unittest -from termcolor import colored - -from sh_edraft.configuration import ApplicationHost -from tests.logger import LoggerTest -from tests.publisher import PublisherTest -from tests.service_provider import ServiceProviderTest +from tests.service_provider.service_provider_create import ServiceProviderCreate +from tests.service_provider.service_provider_services import ServiceProviderServices class Tester: def __init__(self): - self._app_host = ApplicationHost() + self._suite = unittest.TestSuite() - self._error: bool = False - - @staticmethod - def disable_print(): - sys.stdout = open(os.devnull, 'w') - - @staticmethod - def enable_print(): - sys.stdout = sys.__stdout__ - - def success(self, message: str): - self.enable_print() - print(colored(message, 'green')) - self.disable_print() - - def failed(self, message: str): - self.enable_print() - print(colored(message, 'red')) - self.disable_print() - - def exception(self): - self.enable_print() - print(colored(traceback.format_exc(), 'red')) - self.disable_print() - - def create(self): pass + def create(self): + self._suite.addTest(ServiceProviderCreate('test_create')) + self._suite.addTest(ServiceProviderServices('test_add_singleton')) + self._suite.addTest(ServiceProviderServices('test_get_singleton')) + self._suite.addTest(ServiceProviderServices('test_add_scoped')) + self._suite.addTest(ServiceProviderServices('test_get_scoped')) + self._suite.addTest(ServiceProviderServices('test_add_transient')) + self._suite.addTest(ServiceProviderServices('test_get_transient')) def start(self): - if not self._error: - try: - LoggerTest.start(self._app_host) - self.success(f'{LoggerTest.__name__} test succeeded.') - except Exception as e: - self._error = True - self.failed(f'{LoggerTest.__name__} test failed!\n{e}') - self.exception() - - if not self._error: - try: - ServiceProviderTest.start(self._app_host.services) - self.success(f'{ServiceProviderTest.__name__} test succeeded.') - except Exception as e: - self._error = True - self.failed(f'{ServiceProviderTest.__name__} test failed!\n{e}') - self.exception() - - if not self._error: - try: - PublisherTest.start(self._app_host.services) - self.success(f'{PublisherTest.__name__} test succeeded.') - except Exception as e: - self._error = True - self.failed(f'{PublisherTest.__name__} test failed!\n{e}') - self.exception() + unittest.main() if __name__ == '__main__': tester = Tester() tester.create() - tester.disable_print() tester.start() - tester.enable_print() From 09a3fb166f643848bd24dbeda28c1a191294fb21 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Mon, 23 Nov 2020 22:47:37 +0100 Subject: [PATCH 10/86] Added first unittests for logging --- .../{service_provider => logging}/__init__.py | 0 src/tests/logging/logger.py | 100 ++++++++++++++++++ .../service_provider_create.py | 13 --- src/tests/service_providing/__init__.py | 0 .../service_provider.py} | 12 ++- src/tests/tester.py | 26 +++-- 6 files changed, 126 insertions(+), 25 deletions(-) rename src/tests/{service_provider => logging}/__init__.py (100%) create mode 100644 src/tests/logging/logger.py delete mode 100644 src/tests/service_provider/service_provider_create.py create mode 100644 src/tests/service_providing/__init__.py rename src/tests/{service_provider/service_provider_services.py => service_providing/service_provider.py} (95%) diff --git a/src/tests/service_provider/__init__.py b/src/tests/logging/__init__.py similarity index 100% rename from src/tests/service_provider/__init__.py rename to src/tests/logging/__init__.py diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py new file mode 100644 index 00000000..c7332093 --- /dev/null +++ b/src/tests/logging/logger.py @@ -0,0 +1,100 @@ +import os +import unittest +from datetime import datetime +from string import Template + +from sh_edraft.configuration import ApplicationHost +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.logging.model import LoggingSettings +from sh_edraft.time.model import TimeFormatSettings + + +class LoggerTest(unittest.TestCase): + + def setUp(self): + self._app_host = ApplicationHost() + self._services = self._app_host.services + self._services.init(()) + self._services.create() + + self._log_settings = LoggingSettings() + self._log_settings.from_dict({ + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }) + + self._time_format_settings = TimeFormatSettings() + self._time_format_settings.from_dict({ + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }) + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + + def _check_general_requirements(self): + self.assertIsNotNone(self._services) + self.assertIsNotNone(self._log_settings) + self.assertIsNotNone(self._time_format_settings) + + def test_create(self): + print(f'{__name__}.test_create:') + logger: Logger = self._services.get_service(LoggerBase) + self.assertIsNotNone(logger) + + logger.create() + self.assertTrue(os.path.isdir(self._log_settings.path)) + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + self.assertTrue(os.path.isfile(self._log_settings.path + log_file)) + + def test_header(self): + print(f'{__name__}.test_header:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.header('HeaderTest:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertEqual(log_content[len(log_content) - 1], 'HeaderTest:\n') + + def test_trace(self): + print(f'{__name__}.test_trace:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.trace(__name__, f'{__name__}.test_trace:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ TRACE ] [ {__name__} ]: {__name__}.test_trace:\n')) diff --git a/src/tests/service_provider/service_provider_create.py b/src/tests/service_provider/service_provider_create.py deleted file mode 100644 index 870b5d14..00000000 --- a/src/tests/service_provider/service_provider_create.py +++ /dev/null @@ -1,13 +0,0 @@ -import unittest - -from sh_edraft.service import ServiceProvider - - -class ServiceProviderCreate(unittest.TestCase): - - def test_create(self): - provider = ServiceProvider() - self.assertIsNotNone(provider) - provider.init(()) - provider.create() - self.assertIsNotNone(provider) diff --git a/src/tests/service_providing/__init__.py b/src/tests/service_providing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/service_provider/service_provider_services.py b/src/tests/service_providing/service_provider.py similarity index 95% rename from src/tests/service_provider/service_provider_services.py rename to src/tests/service_providing/service_provider.py index 5e65a2ea..ed590490 100644 --- a/src/tests/service_provider/service_provider_services.py +++ b/src/tests/service_providing/service_provider.py @@ -1,6 +1,4 @@ -import os import unittest -from string import Template from sh_edraft.configuration import ApplicationHost from sh_edraft.logging import Logger @@ -8,11 +6,12 @@ from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.publish import Publisher from sh_edraft.publish.base import PublisherBase +from sh_edraft.service import ServiceProvider from sh_edraft.service.base import ServiceBase from sh_edraft.time.model import TimeFormatSettings -class ServiceProviderServices(unittest.TestCase): +class ServiceProviderTest(unittest.TestCase): def setUp(self): self._app_host = ApplicationHost() @@ -43,6 +42,13 @@ class ServiceProviderServices(unittest.TestCase): self.assertIsNotNone(self._log_settings) self.assertIsNotNone(self._time_format_settings) + def test_create(self): + provider = ServiceProvider() + self.assertIsNotNone(provider) + provider.init(()) + provider.create() + self.assertIsNotNone(provider) + def test_add_singleton(self): print(f'{__name__}.test_add_singleton:') self._check_general_requirements() diff --git a/src/tests/tester.py b/src/tests/tester.py index 234ad59a..534572db 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,7 +1,7 @@ import unittest -from tests.service_provider.service_provider_create import ServiceProviderCreate -from tests.service_provider.service_provider_services import ServiceProviderServices +from tests.logging.logger import LoggerTest +from tests.service_providing.service_provider import ServiceProviderTest class Tester: @@ -10,13 +10,21 @@ class Tester: self._suite = unittest.TestSuite() def create(self): - self._suite.addTest(ServiceProviderCreate('test_create')) - self._suite.addTest(ServiceProviderServices('test_add_singleton')) - self._suite.addTest(ServiceProviderServices('test_get_singleton')) - self._suite.addTest(ServiceProviderServices('test_add_scoped')) - self._suite.addTest(ServiceProviderServices('test_get_scoped')) - self._suite.addTest(ServiceProviderServices('test_add_transient')) - self._suite.addTest(ServiceProviderServices('test_get_transient')) + # providing + self._suite.addTest(ServiceProviderTest('test_create')) + self._suite.addTest(ServiceProviderTest('test_add_singleton')) + self._suite.addTest(ServiceProviderTest('test_get_singleton')) + self._suite.addTest(ServiceProviderTest('test_add_scoped')) + self._suite.addTest(ServiceProviderTest('test_get_scoped')) + self._suite.addTest(ServiceProviderTest('test_add_transient')) + self._suite.addTest(ServiceProviderTest('test_get_transient')) + + # logging + self._suite.addTest(LoggerTest('test_create')) + self._suite.addTest(LoggerTest('test_header')) + self._suite.addTest(LoggerTest('test_trace')) + + # publishing def start(self): unittest.main() From 45154950ee4d33b4d963eb2f118af7a072a7f4b2 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 24 Nov 2020 19:01:28 +0100 Subject: [PATCH 11/86] Added unittests for logging levels --- src/tests/logging/logger.py | 116 ++++++++++++++++++++++++++++++++++++ src/tests/tester.py | 9 ++- 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index c7332093..f5b6a7a9 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -1,4 +1,5 @@ import os +import shutil import unittest from datetime import datetime from string import Template @@ -36,6 +37,10 @@ class LoggerTest(unittest.TestCase): self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + def tearDown(self): + if os.path.isdir(self._log_settings.path): + shutil.rmtree(self._log_settings.path) + def _check_general_requirements(self): self.assertIsNotNone(self._services) self.assertIsNotNone(self._log_settings) @@ -98,3 +103,114 @@ class LoggerTest(unittest.TestCase): self.assertGreater(len(log_content), 0) self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ TRACE ] [ {__name__} ]: {__name__}.test_trace:\n')) + + def test_debug(self): + print(f'{__name__}.test_debug:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.debug(__name__, f'{__name__}.test_debug:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ DEBUG ] [ {__name__} ]: {__name__}.test_debug:\n')) + + def test_info(self): + print(f'{__name__}.test_info:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.info(__name__, f'{__name__}.test_info:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ INFO ] [ {__name__} ]: {__name__}.test_info:\n')) + + def test_warn(self): + print(f'{__name__}.test_warn:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.warn(__name__, f'{__name__}.test_warn:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ WARN ] [ {__name__} ]: {__name__}.test_warn:\n')) + + def test_error(self): + print(f'{__name__}.test_error:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.error(__name__, f'{__name__}.test_error:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ ERROR ] [ {__name__} ]: {__name__}.test_error:\n')) + + def test_fatal(self): + print(f'{__name__}.test_fatal:') + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + with self.assertRaises(SystemExit): + logger.fatal(__name__, f'{__name__}.test_fatal:') + + log_file = Template(self._log_settings.filename).substitute( + date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + ) + log_content = [] + + try: + with open(self._log_settings.path + log_file, "r") as log: + log_content = log.readlines() + log.close() + except Exception as e: + print('Cannot open log file', e) + + self.assertGreater(len(log_content), 0) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ ERROR ] [ {__name__} ]: {__name__}.test_fatal:\n')) diff --git a/src/tests/tester.py b/src/tests/tester.py index 534572db..1d851ac5 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -23,11 +23,18 @@ class Tester: self._suite.addTest(LoggerTest('test_create')) self._suite.addTest(LoggerTest('test_header')) self._suite.addTest(LoggerTest('test_trace')) + self._suite.addTest(LoggerTest('test_debug')) + self._suite.addTest(LoggerTest('test_info')) + self._suite.addTest(LoggerTest('test_warn')) + self._suite.addTest(LoggerTest('test_error')) + self._suite.addTest(LoggerTest('test_fatal')) # publishing def start(self): - unittest.main() + runner = unittest.TextTestRunner() + runner.run(self._suite) + # unittest.main() if __name__ == '__main__': From cd9d4d3c3d7ab7e4afeedd9bd5c8519742bddac5 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 24 Nov 2020 19:53:24 +0100 Subject: [PATCH 12/86] Added first publisher tests, fixed small bugs --- .../{messenger => messaging}/__init__.py | 4 +- .../{publish => publishing}/__init__.py | 4 +- .../{publish => publishing}/base/__init__.py | 4 +- .../base/publisher_base.py | 2 +- .../{publish => publishing}/model/__init__.py | 4 +- .../{publish => publishing}/model/template.py | 2 +- .../model/template_enum.py | 0 .../{publish => publishing}/publisher.py | 8 +- src/tests/logger.py | 50 ----------- src/tests/publisher.py | 6 +- src/tests/publishing/__init__.py | 0 src/tests/publishing/publisher.py | 90 +++++++++++++++++++ .../service_providing/service_provider.py | 14 +-- src/tests/tester.py | 2 + 14 files changed, 118 insertions(+), 72 deletions(-) rename src/sh_edraft/{messenger => messaging}/__init__.py (88%) rename src/sh_edraft/{publish => publishing}/__init__.py (89%) rename src/sh_edraft/{publish => publishing}/base/__init__.py (87%) rename src/sh_edraft/{publish => publishing}/base/publisher_base.py (93%) rename src/sh_edraft/{publish => publishing}/model/__init__.py (88%) rename src/sh_edraft/{publish => publishing}/model/template.py (98%) rename src/sh_edraft/{publish => publishing}/model/template_enum.py (100%) rename src/sh_edraft/{publish => publishing}/publisher.py (96%) delete mode 100644 src/tests/logger.py create mode 100644 src/tests/publishing/__init__.py create mode 100644 src/tests/publishing/publisher.py diff --git a/src/sh_edraft/messenger/__init__.py b/src/sh_edraft/messaging/__init__.py similarity index 88% rename from src/sh_edraft/messenger/__init__.py rename to src/sh_edraft/messaging/__init__.py index 8d501a96..db61154c 100644 --- a/src/sh_edraft/messenger/__init__.py +++ b/src/sh_edraft/messaging/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.messenger +sh_edraft.messaging ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.messenger """ -__title__ = 'sh_edraft.messenger' +__title__ = 'sh_edraft.messaging' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/publish/__init__.py b/src/sh_edraft/publishing/__init__.py similarity index 89% rename from src/sh_edraft/publish/__init__.py rename to src/sh_edraft/publishing/__init__.py index 7b162462..3147018a 100644 --- a/src/sh_edraft/publish/__init__.py +++ b/src/sh_edraft/publishing/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publish +sh_edraft.publishing ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.publish """ -__title__ = 'sh_edraft.publish' +__title__ = 'sh_edraft.publishing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/publish/base/__init__.py b/src/sh_edraft/publishing/base/__init__.py similarity index 87% rename from src/sh_edraft/publish/base/__init__.py rename to src/sh_edraft/publishing/base/__init__.py index a7e178d1..041cfa8f 100644 --- a/src/sh_edraft/publish/base/__init__.py +++ b/src/sh_edraft/publishing/base/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publish.base +sh_edraft.publishing.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.publish.base """ -__title__ = 'sh_edraft.publish.base' +__title__ = 'sh_edraft.publishing.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/publish/base/publisher_base.py b/src/sh_edraft/publishing/base/publisher_base.py similarity index 93% rename from src/sh_edraft/publish/base/publisher_base.py rename to src/sh_edraft/publishing/base/publisher_base.py index 2a2bea92..0bc6a369 100644 --- a/src/sh_edraft/publish/base/publisher_base.py +++ b/src/sh_edraft/publishing/base/publisher_base.py @@ -2,7 +2,7 @@ from abc import abstractmethod from typing import Optional from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publish.model.template import Template +from sh_edraft.publishing.model.template import Template from sh_edraft.service.base.service_base import ServiceBase diff --git a/src/sh_edraft/publish/model/__init__.py b/src/sh_edraft/publishing/model/__init__.py similarity index 88% rename from src/sh_edraft/publish/model/__init__.py rename to src/sh_edraft/publishing/model/__init__.py index dbc1c3b5..b18feff0 100644 --- a/src/sh_edraft/publish/model/__init__.py +++ b/src/sh_edraft/publishing/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publish.model +sh_edraft.publishing.model ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.publish.model """ -__title__ = 'sh_edraft.publish.model' +__title__ = 'sh_edraft.publishing.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/publish/model/template.py b/src/sh_edraft/publishing/model/template.py similarity index 98% rename from src/sh_edraft/publish/model/template.py rename to src/sh_edraft/publishing/model/template.py index d917374b..05a37f31 100644 --- a/src/sh_edraft/publish/model/template.py +++ b/src/sh_edraft/publishing/model/template.py @@ -2,7 +2,7 @@ from typing import Optional from sh_edraft.source_code.model.version import Version from sh_edraft.configuration.model import ConfigurationModelBase -from sh_edraft.publish.model.template_enum import TemplateEnum +from sh_edraft.publishing.model.template_enum import TemplateEnum class Template(ConfigurationModelBase): diff --git a/src/sh_edraft/publish/model/template_enum.py b/src/sh_edraft/publishing/model/template_enum.py similarity index 100% rename from src/sh_edraft/publish/model/template_enum.py rename to src/sh_edraft/publishing/model/template_enum.py diff --git a/src/sh_edraft/publish/publisher.py b/src/sh_edraft/publishing/publisher.py similarity index 96% rename from src/sh_edraft/publish/publisher.py rename to src/sh_edraft/publishing/publisher.py index 1b371ed6..43cf8d53 100644 --- a/src/sh_edraft/publish/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -3,8 +3,8 @@ import shutil from string import Template as stringTemplate from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publish.base.publisher_base import PublisherBase -from sh_edraft.publish.model.template import Template +from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.publishing.model.template import Template class Publisher(PublisherBase): @@ -66,13 +66,13 @@ class Publisher(PublisherBase): for t in self._settings: output_template: str = '' if not os.path.isfile(t.template_path): - raise Exception(f'Template not found: {t.template_path}') + self._logger.fatal(__name__, f'Template not found: {t.template_path}') with open(t.template_path) as template: t.file_content = template.read() template.close() if t.file_content == '': - raise Exception(f'Template is empty: {t.template_path}') + self._logger.fatal(__name__, f'Template is empty: {t.template_path}') self._logger.trace(__name__, f'Stopped {__name__}._read_templates') diff --git a/src/tests/logger.py b/src/tests/logger.py deleted file mode 100644 index 47b5e3ab..00000000 --- a/src/tests/logger.py +++ /dev/null @@ -1,50 +0,0 @@ -import os -from string import Template - -from sh_edraft.configuration import ApplicationHost -from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.logging.logger import Logger -from sh_edraft.logging.model.log_settings import LoggingSettings -from sh_edraft.time.model.time_format_settings import TimeFormatSettings - - -class LoggerTest: - - @staticmethod - def start(app_host: ApplicationHost): - services = app_host.services - - log_settings = LoggingSettings() - log_settings.from_dict({ - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "TRACE", - "FileLogLevel": "TRACE" - }) - - time_format_settings = TimeFormatSettings() - time_format_settings.from_dict({ - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }) - - services.add_singleton(Logger, log_settings, time_format_settings, app_host) - logger: Logger = services.get_service(LoggerBase) - - if logger is None: - raise Exception(f'{__name__}: Service is None') - - logger.create() - logger.info(__name__, 'test') - - if not os.path.isdir(log_settings.path): - raise Exception(f'{__name__}: Log path was not created') - - log_file = Template(log_settings.filename).substitute( - date_time_now=app_host.date_time_now.strftime(time_format_settings.date_time_format), - start_time=app_host.start_time.strftime(time_format_settings.date_time_log_format) - ) - if not os.path.isfile(log_settings.path + log_file): - raise Exception(f'{__name__}: Log file was not created') diff --git a/src/tests/publisher.py b/src/tests/publisher.py index 73923471..086299ce 100644 --- a/src/tests/publisher.py +++ b/src/tests/publisher.py @@ -1,11 +1,11 @@ import os from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publish.base import PublisherBase +from sh_edraft.publishing.base import PublisherBase from sh_edraft.service.base import ServiceProviderBase from sh_edraft.source_code.model import Version -from sh_edraft.publish import Publisher -from sh_edraft.publish.model import Template +from sh_edraft.publishing import Publisher +from sh_edraft.publishing.model import Template class PublisherTest: diff --git a/src/tests/publishing/__init__.py b/src/tests/publishing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py new file mode 100644 index 00000000..bf77749c --- /dev/null +++ b/src/tests/publishing/publisher.py @@ -0,0 +1,90 @@ +import os +import shutil +import unittest + +from sh_edraft.configuration import ApplicationHost +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.logging.model import LoggingSettings +from sh_edraft.publishing import Publisher +from sh_edraft.publishing.base import PublisherBase +from sh_edraft.publishing.model import Template +from sh_edraft.source_code.model import Version +from sh_edraft.time.model import TimeFormatSettings + + +class PublisherTest(unittest.TestCase): + + def _config(self): + self._log_settings = LoggingSettings() + self._log_settings.from_dict({ + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }) + + self._time_format_settings = TimeFormatSettings() + self._time_format_settings.from_dict({ + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }) + + self._version = Version(2020, 12, 5).to_dict() + self._templates = [ + Template( + '../../publish_templates/*_template.txt', + '*', + '', + '', + '2020', + 'sh-edraft.de', + 'MIT', + ', see LICENSE for more details.', + '', + 'Sven Heidemann', + self._version + ), + Template( + '../../publish_templates/*_template.txt', + 'sh_edraft', + 'common python library', + 'Library to share common classes and models used at sh-edraft.de', + '2020', + 'sh-edraft.de', + 'MIT', + ', see LICENSE for more details.', + '', + 'Sven Heidemann', + self._version + ) + ] + + self._source = '../' + self._dist = '../../dist' + + def setUp(self): + self._config() + + self._app_host = ApplicationHost() + self._services = self._app_host.services + self._services.init(()) + self._services.create() + + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + + def tearDown(self): + if os.path.isdir(self._log_settings.path): + shutil.rmtree(self._log_settings.path) + + def test_create(self): + self._services.add_transient(Publisher, self._services.get_service(LoggerBase), self._source, self._dist, self._templates) + publisher: Publisher = self._services.get_service(PublisherBase) + self.assertIsNotNone(publisher) + + publisher.create() + self.assertTrue(os.path.isdir(self._dist)) diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py index ed590490..255b77ce 100644 --- a/src/tests/service_providing/service_provider.py +++ b/src/tests/service_providing/service_provider.py @@ -4,8 +4,8 @@ from sh_edraft.configuration import ApplicationHost from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings -from sh_edraft.publish import Publisher -from sh_edraft.publish.base import PublisherBase +from sh_edraft.publishing import Publisher +from sh_edraft.publishing.base import PublisherBase from sh_edraft.service import ServiceProvider from sh_edraft.service.base import ServiceBase from sh_edraft.time.model import TimeFormatSettings @@ -42,6 +42,11 @@ class ServiceProviderTest(unittest.TestCase): self.assertIsNotNone(self._log_settings) self.assertIsNotNone(self._time_format_settings) + def _add_logger(self): + self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + def test_create(self): provider = ServiceProvider() self.assertIsNotNone(provider) @@ -88,14 +93,13 @@ class ServiceProviderTest(unittest.TestCase): self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) self._services.add_scoped(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) - self.assertGreater(len(self._services._scoped_services), 0) def test_get_scoped(self): print(f'{__name__}.test_get_scoped:') self._check_general_requirements() self._check_logger_requirements() + self._add_logger() - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) self._services.add_scoped(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) publisher: Publisher = self._services.get_service(PublisherBase) self.assertIsNotNone(publisher) @@ -111,8 +115,8 @@ class ServiceProviderTest(unittest.TestCase): print(f'{__name__}.test_add_transient:') self._check_general_requirements() self._check_logger_requirements() + self._add_logger() - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) self._services.add_transient(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) self.assertGreater(len(self._services._transient_services), 0) diff --git a/src/tests/tester.py b/src/tests/tester.py index 1d851ac5..dfb11e49 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,6 +1,7 @@ import unittest from tests.logging.logger import LoggerTest +from tests.publishing.publisher import PublisherTest from tests.service_providing.service_provider import ServiceProviderTest @@ -30,6 +31,7 @@ class Tester: self._suite.addTest(LoggerTest('test_fatal')) # publishing + self._suite.addTest(PublisherTest('test_create')) def start(self): runner = unittest.TextTestRunner() From b501fef27d7d80074a43908f3caa0fc2421df394 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 25 Nov 2020 21:41:45 +0100 Subject: [PATCH 13/86] Improved testing and service providing --- .../configuration/application_host.py | 6 +- src/sh_edraft/configuration/configuration.py | 27 ++++++ .../model/application_host_base.py | 8 ++ .../configuration/model/configuration_base.py | 23 +++++ src/sh_edraft/logging/base/logger_base.py | 12 ++- src/sh_edraft/logging/logger.py | 21 ++--- src/sh_edraft/logging/model/__init__.py | 4 +- .../model/{log_level.py => logging_level.py} | 0 .../{log_settings.py => logging_settings.py} | 4 +- ...tings_name.py => logging_settings_name.py} | 0 .../publishing/base/publisher_base.py | 20 ++--- .../model/publish_settings_model.py | 83 ++++++++++++++++++ .../publishing/model/publish_settings_name.py | 12 +++ src/sh_edraft/publishing/publisher.py | 66 ++++++-------- src/sh_edraft/service/base/service_base.py | 3 - .../service/base/service_provider_base.py | 18 ++-- src/sh_edraft/service/service_provider.py | 85 +++++++++++-------- src/tests/logging/logger.py | 21 ++--- src/tests/publishing/publisher.py | 31 ++++--- .../service_providing/service_provider.py | 65 +++++++++----- 20 files changed, 340 insertions(+), 169 deletions(-) create mode 100644 src/sh_edraft/configuration/configuration.py create mode 100644 src/sh_edraft/configuration/model/application_host_base.py create mode 100644 src/sh_edraft/configuration/model/configuration_base.py rename src/sh_edraft/logging/model/{log_level.py => logging_level.py} (100%) rename src/sh_edraft/logging/model/{log_settings.py => logging_settings.py} (92%) rename src/sh_edraft/logging/model/{log_settings_name.py => logging_settings_name.py} (100%) create mode 100644 src/sh_edraft/publishing/model/publish_settings_model.py create mode 100644 src/sh_edraft/publishing/model/publish_settings_name.py diff --git a/src/sh_edraft/configuration/application_host.py b/src/sh_edraft/configuration/application_host.py index 770d9b81..8885ff1e 100644 --- a/src/sh_edraft/configuration/application_host.py +++ b/src/sh_edraft/configuration/application_host.py @@ -1,11 +1,13 @@ from datetime import datetime -from sh_edraft.service import ServiceProvider +from sh_edraft.configuration.model.application_host_base import ApplicationHostBase +from sh_edraft.service.service_provider import ServiceProvider -class ApplicationHost: +class ApplicationHost(ApplicationHostBase): def __init__(self): + ApplicationHostBase.__init__(self) self._services = ServiceProvider() self._end_time: datetime = datetime.now() self._start_time: datetime = datetime.now() diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py new file mode 100644 index 00000000..373ab8be --- /dev/null +++ b/src/sh_edraft/configuration/configuration.py @@ -0,0 +1,27 @@ +from collections import Callable + +from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.configuration.model.configuration_base import ConfigurationBase + + +class Configuration(ConfigurationBase): + + def __init__(self): + super().__init__() + + @property + def config(self): + return self._config + + def create(self): pass + + def add_config_by_type(self, key_type: type, value: object): + self._config[key_type] = value + + def get_config_by_type(self, search_type: type) -> Callable[ConfigurationModelBase]: + if search_type not in self._config: + raise Exception(f'Config model by type {search_type} not found') + + for config_model in self._config: + if config_model == search_type: + return self._config[config_model] diff --git a/src/sh_edraft/configuration/model/application_host_base.py b/src/sh_edraft/configuration/model/application_host_base.py new file mode 100644 index 00000000..8b3bc682 --- /dev/null +++ b/src/sh_edraft/configuration/model/application_host_base.py @@ -0,0 +1,8 @@ +from abc import ABC, abstractmethod +from datetime import datetime + + +class ApplicationHostBase(ABC): + + @abstractmethod + def __init__(self): pass diff --git a/src/sh_edraft/configuration/model/configuration_base.py b/src/sh_edraft/configuration/model/configuration_base.py new file mode 100644 index 00000000..ecfc21c1 --- /dev/null +++ b/src/sh_edraft/configuration/model/configuration_base.py @@ -0,0 +1,23 @@ +from abc import abstractmethod +from collections import Callable + +from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.service.base.service_base import ServiceBase + + +class ConfigurationBase(ServiceBase): + + @abstractmethod + def __init__(self): + ServiceBase.__init__(self) + self._config: dict[type, object] = {} + + @property + @abstractmethod + def config(self): pass + + @abstractmethod + def add_config_by_type(self, key_type: type, value: object): pass + + @abstractmethod + def get_config_by_type(self, search_type: ConfigurationModelBase) -> Callable[ConfigurationModelBase]: pass diff --git a/src/sh_edraft/logging/base/logger_base.py b/src/sh_edraft/logging/base/logger_base.py index b4030be0..7c178e16 100644 --- a/src/sh_edraft/logging/base/logger_base.py +++ b/src/sh_edraft/logging/base/logger_base.py @@ -1,8 +1,7 @@ from abc import abstractmethod -from typing import Optional -from sh_edraft.configuration.application_host import ApplicationHost -from sh_edraft.logging.model.log_settings import LoggingSettings +from sh_edraft.configuration import ApplicationHost +from sh_edraft.logging.model.logging_settings import LoggingSettings from sh_edraft.service.base.service_base import ServiceBase from sh_edraft.time.model.time_format_settings import TimeFormatSettings @@ -10,12 +9,11 @@ from sh_edraft.time.model.time_format_settings import TimeFormatSettings class LoggerBase(ServiceBase): @abstractmethod - def __init__(self): + def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings): ServiceBase.__init__(self) - self._log_settings: Optional[LoggingSettings] = None - self._time_format_settings: Optional[TimeFormatSettings] = None - self._app_host: Optional[ApplicationHost] = None + self._log_settings: LoggingSettings = logging_settings + self._time_format_settings: TimeFormatSettings = time_format @abstractmethod def header(self, string: str): pass diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 689ca901..2c0e5f60 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -1,28 +1,23 @@ import datetime import os import traceback +from collections import Callable from string import Template -from typing import Optional +from sh_edraft.configuration import ApplicationHost from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.logging.model.log_level import LoggingLevel +from sh_edraft.logging.model import LoggingSettings +from sh_edraft.logging.model.logging_level import LoggingLevel +from sh_edraft.time.model import TimeFormatSettings from sh_edraft.utils.console import Console class Logger(LoggerBase): - def __init__(self): - LoggerBase.__init__(self) + def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings, app_host: ApplicationHost): + LoggerBase.__init__(self, logging_settings, time_format) - self._log: Optional[str] = None - self._path: Optional[str] = None - self._level: Optional[LoggingLevel] = None - self._console: Optional[LoggingLevel] = None - - def init(self, args: tuple): - self._log_settings = args[0] - self._time_format_settings = args[1] - self._app_host = args[2] + self._app_host: ApplicationHost = app_host self._log = Template(self._log_settings.filename).substitute( date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), diff --git a/src/sh_edraft/logging/model/__init__.py b/src/sh_edraft/logging/model/__init__.py index 6b232b0c..06f98905 100644 --- a/src/sh_edraft/logging/model/__init__.py +++ b/src/sh_edraft/logging/model/__init__.py @@ -20,8 +20,8 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: -from .log_level import LoggingLevel -from .log_settings import LoggingSettings +from .logging_level import LoggingLevel +from .logging_settings import LoggingSettings VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/logging/model/log_level.py b/src/sh_edraft/logging/model/logging_level.py similarity index 100% rename from src/sh_edraft/logging/model/log_level.py rename to src/sh_edraft/logging/model/logging_level.py diff --git a/src/sh_edraft/logging/model/log_settings.py b/src/sh_edraft/logging/model/logging_settings.py similarity index 92% rename from src/sh_edraft/logging/model/log_settings.py rename to src/sh_edraft/logging/model/logging_settings.py index 1de23396..70d23645 100644 --- a/src/sh_edraft/logging/model/log_settings.py +++ b/src/sh_edraft/logging/model/logging_settings.py @@ -2,9 +2,9 @@ import traceback from typing import Optional from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase -from sh_edraft.logging.model.log_settings_name import LogSettingsName +from sh_edraft.logging.model.logging_settings_name import LogSettingsName from sh_edraft.utils.console import Console -from sh_edraft.logging.model.log_level import LoggingLevel +from sh_edraft.logging.model.logging_level import LoggingLevel class LoggingSettings(ConfigurationModelBase): diff --git a/src/sh_edraft/logging/model/log_settings_name.py b/src/sh_edraft/logging/model/logging_settings_name.py similarity index 100% rename from src/sh_edraft/logging/model/log_settings_name.py rename to src/sh_edraft/logging/model/logging_settings_name.py diff --git a/src/sh_edraft/publishing/base/publisher_base.py b/src/sh_edraft/publishing/base/publisher_base.py index 0bc6a369..f2038018 100644 --- a/src/sh_edraft/publishing/base/publisher_base.py +++ b/src/sh_edraft/publishing/base/publisher_base.py @@ -1,24 +1,18 @@ from abc import abstractmethod -from typing import Optional from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.model.template import Template +from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel from sh_edraft.service.base.service_base import ServiceBase class PublisherBase(ServiceBase): @abstractmethod - def __init__(self): + def __init__(self, logger: LoggerBase, publish_settings: PublishSettingsModel): ServiceBase.__init__(self) - self._logger: Optional[LoggerBase] = None - self._source_path: Optional[str] = None - self._dist_path: Optional[str] = None - self._settings: Optional[list[Template]] = None - - self._included_files: list[str] = [] - self._excluded_files: list[str] = [] + self._logger: LoggerBase = logger + self._publish_settings: PublishSettingsModel = publish_settings @property @abstractmethod @@ -28,5 +22,11 @@ class PublisherBase(ServiceBase): @abstractmethod def dist_path(self) -> str: pass + @abstractmethod + def include(self, path: str): pass + + @abstractmethod + def exclude(self, path: str): pass + @abstractmethod def publish(self) -> str: pass diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py new file mode 100644 index 00000000..8c2ae8ee --- /dev/null +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -0,0 +1,83 @@ +import traceback +from typing import Optional + +from sh_edraft.configuration.model import ConfigurationModelBase +from sh_edraft.publishing.model import Template +from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName +from sh_edraft.utils import Console + + +class PublishSettingsModel(ConfigurationModelBase): + + def __init__(self): + ConfigurationModelBase.__init__(self) + + self._source_path: Optional[str] = None + self._dist_path: Optional[str] = None + self._templates: Optional[list[Template]] = None + + self._included_files: Optional[list[str]] = None + self._excluded_files: Optional[list[str]] = None + + self._template_ending: Optional[str] = None + + @property + def source_path(self) -> str: + return self._source_path + + @source_path.setter + def source_path(self, source_path: str): + self._source_path = source_path + + @property + def dist_path(self) -> str: + return self._dist_path + + @dist_path.setter + def dist_path(self, dist_path: str): + self._dist_path = dist_path + + @property + def templates(self) -> list[Template]: + return self._templates + + @templates.setter + def templates(self, templates: list[Template]): + self._templates = templates + + @property + def included_files(self) -> list[str]: + return self._included_files + + @included_files.setter + def included_files(self, included_files: list[str]): + self._included_files = included_files + + @property + def excluded_files(self) -> list[str]: + return self._excluded_files + + @excluded_files.setter + def excluded_files(self, excluded_files: list[str]): + self._excluded_files = excluded_files + + @property + def template_ending(self) -> str: + return self._template_ending + + @template_ending.setter + def template_ending(self, template_ending: str): + self._template_ending = template_ending + + def from_dict(self, settings: dict): + try: + self._source_path = settings[PublishSettingsName.source_path.value] + self._dist_path = settings[PublishSettingsName.dist_path.value] + self._templates = settings[PublishSettingsName.templates.value] + self._included_files = settings[PublishSettingsName.included_files.value] + self._excluded_files = settings[PublishSettingsName.excluded_files.value] + self._template_ending = settings[PublishSettingsName.template_ending.value] + except Exception as e: + Console.write_line( + f'[ ERROR ] [ {__name__} ]: Reading error in {PublishSettingsName.publish.value} settings', 'red') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') diff --git a/src/sh_edraft/publishing/model/publish_settings_name.py b/src/sh_edraft/publishing/model/publish_settings_name.py new file mode 100644 index 00000000..80033c68 --- /dev/null +++ b/src/sh_edraft/publishing/model/publish_settings_name.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class PublishSettingsName(Enum): + + publish = 'Publish' + source_path = 'SourcePath' + dist_path = 'DistPath' + templates = 'Templates' + included_files = 'IncludedFiles' + excluded_files = 'ExcludedFiles' + template_ending = 'TemplateEnding' diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 43cf8d53..6fcc54a0 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -4,26 +4,22 @@ from string import Template as stringTemplate from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel from sh_edraft.publishing.model.template import Template class Publisher(PublisherBase): - def __init__(self): - super().__init__() - - self._included_files: list[str] = [] - self._excluded_files: list[str] = [] - - self._template_ending = '_template.txt' + def __init__(self, logger: LoggerBase, publish_settings: PublishSettingsModel): + super().__init__(logger, publish_settings) @property def source_path(self) -> str: - return self._source_path + return self._publish_settings.source_path @property def dist_path(self): - return self._dist_path + return self._publish_settings.dist_path def _get_template_output(self, t: Template, name: str, imports: str) -> str: self._logger.trace(__name__, f'Started {__name__}._get_template_output') @@ -54,16 +50,16 @@ class Publisher(PublisherBase): def _read_source_path(self): self._logger.trace(__name__, f'Started {__name__}._read_source_path') - for r, d, f in os.walk(self._source_path): + for r, d, f in os.walk(self._publish_settings.source_path): for file in f: - if file.endswith('.py') or file in self._included_files: - self._included_files.append(os.path.join(r, file)) + if file.endswith('.py') or file in self._publish_settings.included_files: + self._publish_settings.included_files.append(os.path.join(r, file)) self._logger.trace(__name__, f'Stopped {__name__}._read_source_path') def _read_templates(self): self._logger.trace(__name__, f'Started {__name__}._read_templates') - for t in self._settings: + for t in self._publish_settings.templates: output_template: str = '' if not os.path.isfile(t.template_path): self._logger.fatal(__name__, f'Template not found: {t.template_path}') @@ -78,17 +74,17 @@ class Publisher(PublisherBase): def _create_dist_path(self): self._logger.trace(__name__, f'Started {__name__}._create_dist_path') - if os.path.isdir(self._dist_path): + if os.path.isdir(self._publish_settings.dist_path): try: - shutil.rmtree(self._dist_path) - self._logger.info(__name__, f'Deleted {self._dist_path}') + shutil.rmtree(self._publish_settings.dist_path) + self._logger.info(__name__, f'Deleted {self._publish_settings.dist_path}') except Exception as e: self._logger.fatal(__name__, f'Cannot delete old dist directory', e) - if not os.path.isdir(self._dist_path): + if not os.path.isdir(self._publish_settings.dist_path): try: - os.makedirs(self._dist_path) - self._logger.debug(__name__, f'Created directories: {self._dist_path}') + os.makedirs(self._publish_settings.dist_path) + self._logger.debug(__name__, f'Created directories: {self._publish_settings.dist_path}') self._logger.info(__name__, f'Created dist directory') except Exception as e: self._logger.fatal(__name__, f'Cannot create dist directory', e) @@ -109,9 +105,9 @@ class Publisher(PublisherBase): def _write_templates(self): self._logger.trace(__name__, f'Started {__name__}._write_templates') - for template in self._settings: - for file in self._included_files: - if os.path.basename(file) == '__init__.py' and file not in self._excluded_files: + for template in self._publish_settings.templates: + for file in self._publish_settings.included_files: + if os.path.basename(file) == '__init__.py' and file not in self._publish_settings.excluded_files: template_name = template.name if template.name == '*' or template.name == '': template_name = self._get_template_name_from_dirs(file) @@ -164,16 +160,16 @@ class Publisher(PublisherBase): def _copy_all_included_files(self): self._logger.trace(__name__, f'Started {__name__}._copy_all_included_files') - dist_path = self._dist_path - if self._dist_path.endswith('/'): + dist_path = self._publish_settings.dist_path + if self._publish_settings.dist_path.endswith('/'): dist_path = dist_path[:len(dist_path) - 1] - for file in self._included_files: + for file in self._publish_settings.included_files: is_file_excluded = False - if file in self._excluded_files: + if file in self._publish_settings.excluded_files: is_file_excluded = True else: - for excluded in self._excluded_files: + for excluded in self._publish_settings.excluded_files: if file.__contains__(excluded): is_file_excluded = True @@ -206,26 +202,18 @@ class Publisher(PublisherBase): def include(self, path: str): self._logger.trace(__name__, f'Started {__name__}.include') - self._included_files.append(path) + self._publish_settings.included_files.append(path) self._logger.trace(__name__, f'Stopped {__name__}.include') def exclude(self, path: str): self._logger.trace(__name__, f'Started {__name__}.exclude') - self._excluded_files.append(path) + self._publish_settings.excluded_files.append(path) self._logger.trace(__name__, f'Stopped {__name__}.exclude') - def init(self, args: tuple): - self._logger: LoggerBase = args[0] - self._source_path: str = args[1] - self._dist_path: str = args[2] - self._settings: list[Template] = args[3] - - self._logger.header(f'{__name__}:') - def create(self): self._logger.trace(__name__, f'Started {__name__}.create') - if not self._dist_path.endswith('/'): - self._dist_path += '/' + if not self._publish_settings.dist_path.endswith('/'): + self._publish_settings.dist_path += '/' self._read_source_path() self._read_templates() diff --git a/src/sh_edraft/service/base/service_base.py b/src/sh_edraft/service/base/service_base.py index 2e4a4934..e135c2a9 100644 --- a/src/sh_edraft/service/base/service_base.py +++ b/src/sh_edraft/service/base/service_base.py @@ -6,8 +6,5 @@ class ServiceBase(ABC): @abstractmethod def __init__(self): pass - @abstractmethod - def init(self, args: tuple): pass - @abstractmethod def create(self): pass diff --git a/src/sh_edraft/service/base/service_provider_base.py b/src/sh_edraft/service/base/service_provider_base.py index ee1f319a..9deb0918 100644 --- a/src/sh_edraft/service/base/service_provider_base.py +++ b/src/sh_edraft/service/base/service_provider_base.py @@ -3,7 +3,6 @@ from collections import Callable from typing import Type from sh_edraft.service.base.service_base import ServiceBase -from sh_edraft.service.model.provide_state import ProvideState class ServiceProviderBase(ServiceBase): @@ -11,18 +10,23 @@ class ServiceProviderBase(ServiceBase): @abstractmethod def __init__(self): ServiceBase.__init__(self) - self._transient_services: list[ProvideState] = [] - self._scoped_services: list[ProvideState] = [] - self._singleton_services: list[ServiceBase] = [] + + self._transient_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} + self._scoped_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} + self._singleton_services: dict[Type[ServiceBase], ServiceBase] = {} + + @property + @abstractmethod + def config(self): pass @abstractmethod - def add_transient(self, service: Type[ServiceBase], *args): pass + def add_transient(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): pass @abstractmethod - def add_scoped(self, service: Type[ServiceBase], *args): pass + def add_scoped(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): pass @abstractmethod - def add_singleton(self, service: Type[ServiceBase], *args): pass + def add_singleton(self, service_type: Type[ServiceBase], service: ServiceBase): pass @abstractmethod def get_service(self, instance_type: Type[ServiceBase]) -> Callable[ServiceBase]: pass diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index 60627d42..bd4c02a0 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -1,8 +1,10 @@ from collections import Callable +from inspect import signature, Parameter from typing import Type -from termcolor import colored - +from sh_edraft.configuration.configuration import Configuration +from sh_edraft.configuration.model.application_host_base import ApplicationHostBase +from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase from sh_edraft.service.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase from sh_edraft.service.model.provide_state import ProvideState @@ -12,58 +14,71 @@ class ServiceProvider(ServiceProviderBase): def __init__(self): super().__init__() + self._config = Configuration() - def init(self, args: tuple): pass + @property + def config(self): + return self._config def create(self): pass - @staticmethod - def _create_instance(service: type[ServiceBase], args: tuple) -> ServiceBase: - instance = service() - try: - instance.init(args) - return instance - except Exception as e: - print(colored(f'Argument error\n{e}', 'red')) + def _create_instance(self, service: Callable[ServiceBase]) -> ServiceBase: + sig = signature(service.__init__) + params = [] + for param in sig.parameters.items(): + parameter = param[1] + if parameter.name != 'self' and parameter.annotation != Parameter.empty: + if issubclass(parameter.annotation, ServiceBase): + params.append(self.get_service(parameter.annotation)) - def add_transient(self, service: Type[ServiceBase], *args): - self._transient_services.append(ProvideState(service, args)) + elif issubclass(parameter.annotation, ConfigurationModelBase) or issubclass(parameter.annotation, ApplicationHostBase): + params.append(self._config.get_config_by_type(parameter.annotation)) - def add_scoped(self, service: Type[ServiceBase], *args): - self._scoped_services.append(ProvideState(service, args)) + return service(*params) + # try: + # instance.init(args) + # return instance + # except Exception as e: + # print(colored(f'Argument error\n{e}', 'red')) - def add_singleton(self, service: Type[ServiceBase], *args): + def add_transient(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): + self._transient_services[service_type] = service + + def add_scoped(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): + self._scoped_services[service_type] = service + + def add_singleton(self, service_type: Type[ServiceBase], service: ServiceBase): for known_service in self._singleton_services: - if type(known_service) == type(service): - raise Exception(f'Service from type {type(service)} already exists') + if type(known_service) == type(service_type): + raise Exception(f'Service with type {type(service_type)} already exists') - self._singleton_services.append(self._create_instance(service, args)) + self._singleton_services[service_type] = self._create_instance(service) def get_service(self, instance_type: Type[ServiceBase]) -> Callable[ServiceBase]: - for state in self._transient_services: - if isinstance(state.service, type(instance_type)): - return self._create_instance(state.service, state.args) + for service in self._transient_services: + if service == instance_type and isinstance(self._transient_services[service], type(instance_type)): + return self._create_instance(self._transient_services[service]) - for state in self._scoped_services: - if isinstance(state.service, type(instance_type)): - return self._create_instance(state.service, state.args) + for service in self._scoped_services: + if service == instance_type and isinstance(self._scoped_services[service], type(instance_type)): + return self._create_instance(self._scoped_services[service]) for service in self._singleton_services: - if isinstance(service, instance_type): - return service + if service == instance_type and isinstance(self._singleton_services[service], instance_type): + return self._singleton_services[service] - def remove_service(self, instance_type: type): - for state in self._transient_services: - if isinstance(state.service, type(instance_type)): - self._transient_services.remove(state) + def remove_service(self, instance_type: Type[ServiceBase]): + for service in self._transient_services: + if isinstance(service, type(instance_type)): + del self._transient_services[service] return - for state in self._scoped_services: - if isinstance(state.service, type(instance_type)): - self._scoped_services.remove(state) + for service in self._scoped_services: + if isinstance(service, type(instance_type)): + del self._scoped_services[service] return for service in self._singleton_services: if isinstance(service, instance_type): - self._singleton_services.remove(service) + del self._singleton_services[service] return diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index f5b6a7a9..75173742 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -16,7 +16,6 @@ class LoggerTest(unittest.TestCase): def setUp(self): self._app_host = ApplicationHost() self._services = self._app_host.services - self._services.init(()) self._services.create() self._log_settings = LoggingSettings() @@ -35,8 +34,6 @@ class LoggerTest(unittest.TestCase): "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" }) - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) - def tearDown(self): if os.path.isdir(self._log_settings.path): shutil.rmtree(self._log_settings.path) @@ -48,9 +45,7 @@ class LoggerTest(unittest.TestCase): def test_create(self): print(f'{__name__}.test_create:') - logger: Logger = self._services.get_service(LoggerBase) - self.assertIsNotNone(logger) - + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() self.assertTrue(os.path.isdir(self._log_settings.path)) @@ -62,7 +57,7 @@ class LoggerTest(unittest.TestCase): def test_header(self): print(f'{__name__}.test_header:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() logger.header('HeaderTest:') @@ -84,7 +79,7 @@ class LoggerTest(unittest.TestCase): def test_trace(self): print(f'{__name__}.test_trace:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() logger.trace(__name__, f'{__name__}.test_trace:') @@ -106,7 +101,7 @@ class LoggerTest(unittest.TestCase): def test_debug(self): print(f'{__name__}.test_debug:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() logger.debug(__name__, f'{__name__}.test_debug:') @@ -128,7 +123,7 @@ class LoggerTest(unittest.TestCase): def test_info(self): print(f'{__name__}.test_info:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() logger.info(__name__, f'{__name__}.test_info:') @@ -150,7 +145,7 @@ class LoggerTest(unittest.TestCase): def test_warn(self): print(f'{__name__}.test_warn:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() logger.warn(__name__, f'{__name__}.test_warn:') @@ -172,7 +167,7 @@ class LoggerTest(unittest.TestCase): def test_error(self): print(f'{__name__}.test_error:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() logger.error(__name__, f'{__name__}.test_error:') @@ -194,7 +189,7 @@ class LoggerTest(unittest.TestCase): def test_fatal(self): print(f'{__name__}.test_fatal:') - logger: Logger = self._services.get_service(LoggerBase) + logger = Logger(self._log_settings, self._time_format_settings, self._app_host) logger.create() with self.assertRaises(SystemExit): logger.fatal(__name__, f'{__name__}.test_fatal:') diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index bf77749c..d0f5f1f4 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -9,6 +9,7 @@ from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher from sh_edraft.publishing.base import PublisherBase from sh_edraft.publishing.model import Template +from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel from sh_edraft.source_code.model import Version from sh_edraft.time.model import TimeFormatSettings @@ -33,7 +34,7 @@ class PublisherTest(unittest.TestCase): }) self._version = Version(2020, 12, 5).to_dict() - self._templates = [ + templates = [ Template( '../../publish_templates/*_template.txt', '*', @@ -62,29 +63,33 @@ class PublisherTest(unittest.TestCase): ) ] - self._source = '../' - self._dist = '../../dist' + self._source_path = '../' + self._dist_path = '../../dist' + + self._publish_settings_model = PublishSettingsModel() + self._publish_settings_model.from_dict({ + "SourcePath": self._source_path, + "DistPath": self._dist_path, + "Templates": templates, + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt", + }) def setUp(self): self._config() self._app_host = ApplicationHost() - self._services = self._app_host.services - self._services.init(()) - self._services.create() - - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) - logger: Logger = self._services.get_service(LoggerBase) - logger.create() + self._logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + self._logger.create() def tearDown(self): if os.path.isdir(self._log_settings.path): shutil.rmtree(self._log_settings.path) def test_create(self): - self._services.add_transient(Publisher, self._services.get_service(LoggerBase), self._source, self._dist, self._templates) - publisher: Publisher = self._services.get_service(PublisherBase) + publisher: Publisher = Publisher(self._logger, self._publish_settings_model) self.assertIsNotNone(publisher) publisher.create() - self.assertTrue(os.path.isdir(self._dist)) + self.assertTrue(os.path.isdir(self._dist_path)) diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py index 255b77ce..19a39349 100644 --- a/src/tests/service_providing/service_provider.py +++ b/src/tests/service_providing/service_provider.py @@ -1,11 +1,13 @@ import unittest from sh_edraft.configuration import ApplicationHost +from sh_edraft.configuration.model.application_host_base import ApplicationHostBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher from sh_edraft.publishing.base import PublisherBase +from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel from sh_edraft.service import ServiceProvider from sh_edraft.service.base import ServiceBase from sh_edraft.time.model import TimeFormatSettings @@ -16,7 +18,6 @@ class ServiceProviderTest(unittest.TestCase): def setUp(self): self._app_host = ApplicationHost() self._services = self._app_host.services - self._services.init(()) self._services.create() self._log_settings = LoggingSettings() @@ -26,6 +27,7 @@ class ServiceProviderTest(unittest.TestCase): "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" }) + self._services.config.add_config_by_type(LoggingSettings, self._log_settings) self._time_format_settings = TimeFormatSettings() self._time_format_settings.from_dict({ @@ -34,48 +36,69 @@ class ServiceProviderTest(unittest.TestCase): "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" }) + self._services.config.add_config_by_type(TimeFormatSettings, self._time_format_settings) + self._services.config.add_config_by_type(ApplicationHost, self._app_host) + + self._publish_settings_model = PublishSettingsModel() + self._publish_settings_model.from_dict({ + "SourcePath": "../", + "DistPath": "../../dist", + "Templates": [], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt", + }) + self._services.config.add_config_by_type(PublishSettingsModel, self._publish_settings_model) def _check_general_requirements(self): self.assertIsNotNone(self._services) - def _check_logger_requirements(self): - self.assertIsNotNone(self._log_settings) - self.assertIsNotNone(self._time_format_settings) - def _add_logger(self): - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_singleton(LoggerBase, Logger) logger: Logger = self._services.get_service(LoggerBase) logger.create() def test_create(self): + print(f'{__name__}.test_create:') provider = ServiceProvider() self.assertIsNotNone(provider) - provider.init(()) provider.create() self.assertIsNotNone(provider) def test_add_singleton(self): print(f'{__name__}.test_add_singleton:') self._check_general_requirements() - self._check_logger_requirements() - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_singleton(LoggerBase, Logger) self.assertGreater(len(self._services._singleton_services), 0) found = False - for service in self._services._singleton_services: - if isinstance(service, Logger) and isinstance(service, LoggerBase) and isinstance(service, ServiceBase): + for service_type in self._services._singleton_services: + service = self._services._singleton_services[service_type] + if service_type == LoggerBase and ( + isinstance(service, Logger) and isinstance(service, LoggerBase) and isinstance(service, ServiceBase) + ): if not found: found = True self.assertTrue(found) + found = False + for service_type in self._services._singleton_services: + service = self._services._singleton_services[service_type] + if service_type == PublisherBase and ( + isinstance(service, Publisher) and isinstance(service, PublisherBase) and isinstance(service, ServiceBase) + ): + if not found: + found = True + + self.assertFalse(found) + def test_get_singleton(self): print(f'{__name__}.test_get_singleton:') self._check_general_requirements() - self._check_logger_requirements() - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) + self._services.add_singleton(LoggerBase, Logger) logger: Logger = self._services.get_service(LoggerBase) self.assertIsNotNone(logger) self.assertTrue(isinstance(logger, Logger)) @@ -89,18 +112,16 @@ class ServiceProviderTest(unittest.TestCase): def test_add_scoped(self): print(f'{__name__}.test_add_scoped:') self._check_general_requirements() - self._check_logger_requirements() + self._add_logger() - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) - self._services.add_scoped(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + self._services.add_scoped(PublisherBase, Publisher) def test_get_scoped(self): print(f'{__name__}.test_get_scoped:') self._check_general_requirements() - self._check_logger_requirements() self._add_logger() - self._services.add_scoped(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + self._services.add_scoped(PublisherBase, Publisher) publisher: Publisher = self._services.get_service(PublisherBase) self.assertIsNotNone(publisher) self.assertTrue(isinstance(publisher, Publisher)) @@ -114,10 +135,9 @@ class ServiceProviderTest(unittest.TestCase): def test_add_transient(self): print(f'{__name__}.test_add_transient:') self._check_general_requirements() - self._check_logger_requirements() self._add_logger() - self._services.add_transient(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + self._services.add_transient(PublisherBase, Publisher) self.assertGreater(len(self._services._transient_services), 0) self.assertTrue(bool(isinstance(service, ServiceBase) for service in self._services._transient_services)) @@ -125,10 +145,9 @@ class ServiceProviderTest(unittest.TestCase): def test_get_transient(self): print(f'{__name__}.test_get_transient:') self._check_general_requirements() - self._check_logger_requirements() + self._add_logger() - self._services.add_singleton(Logger, self._log_settings, self._time_format_settings, self._app_host) - self._services.add_transient(Publisher, self._services.get_service(LoggerBase), '../', '../../dist', []) + self._services.add_transient(PublisherBase, Publisher) publisher: Publisher = self._services.get_service(PublisherBase) self.assertIsNotNone(publisher) self.assertTrue(isinstance(publisher, Publisher)) From 25f0aeedab8d044dd5e83414b33df1dfcb9a9259 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 10:35:40 +0100 Subject: [PATCH 14/86] =?UTF-8?q?=E2=80=9Epublish=5Ftemplates/all=5Ftempla?= =?UTF-8?q?te.txt=E2=80=9C=20=C3=A4ndern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish_templates/{*_template.txt => all_template.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename publish_templates/{*_template.txt => all_template.txt} (100%) diff --git a/publish_templates/*_template.txt b/publish_templates/all_template.txt similarity index 100% rename from publish_templates/*_template.txt rename to publish_templates/all_template.txt From ff2a7d9693cf700db7fdd685243e9ca328911dcc Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 10:36:49 +0100 Subject: [PATCH 15/86] Bugfixes --- src/sh_edraft/publishing/publisher.py | 2 +- src/tests/publishing/publisher.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 6fcc54a0..1e7f55e6 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -109,7 +109,7 @@ class Publisher(PublisherBase): for file in self._publish_settings.included_files: if os.path.basename(file) == '__init__.py' and file not in self._publish_settings.excluded_files: template_name = template.name - if template.name == '*' or template.name == '': + if template.name == 'all' or template.name == '': template_name = self._get_template_name_from_dirs(file) else: name = self._get_template_name_from_dirs(file) diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index d0f5f1f4..427fa686 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -36,8 +36,8 @@ class PublisherTest(unittest.TestCase): self._version = Version(2020, 12, 5).to_dict() templates = [ Template( - '../../publish_templates/*_template.txt', - '*', + '../../publish_templates/all_template.txt', + 'all', '', '', '2020', @@ -49,7 +49,7 @@ class PublisherTest(unittest.TestCase): self._version ), Template( - '../../publish_templates/*_template.txt', + '../../publish_templates/all_template.txt', 'sh_edraft', 'common python library', 'Library to share common classes and models used at sh-edraft.de', From f2f797aaa38a56cf56441b3e7c081599e2d7d255 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 10:45:02 +0100 Subject: [PATCH 16/86] Improved project structure --- .../{source_code => coding}/__init__.py | 4 ++-- .../{source_code => coding}/model/__init__.py | 4 ++-- .../{source_code => coding}/model/version.py | 4 ++-- .../model/version_enum.py | 0 src/sh_edraft/configuration/__init__.py | 1 - .../configuration/{model => base}/__init__.py | 4 ++-- .../{model => base}/configuration_base.py | 4 ++-- .../configuration_model_base.py | 0 src/sh_edraft/configuration/configuration.py | 4 ++-- .../model/application_host_base.py | 8 ------- src/sh_edraft/hosting/__init__.py | 3 +++ .../application_host.py | 8 +++---- src/sh_edraft/hosting/base/__init__.py | 2 ++ .../hosting/base/application_host_base.py | 22 +++++++++++++++++++ src/sh_edraft/hosting/model/__init__.py | 0 src/sh_edraft/logging/base/logger_base.py | 2 +- src/sh_edraft/logging/logger.py | 2 +- src/sh_edraft/logging/model/__init__.py | 4 ++-- .../logging/model/logging_settings.py | 2 +- src/sh_edraft/publishing/model/__init__.py | 4 ++-- .../model/publish_settings_model.py | 2 +- src/sh_edraft/publishing/model/template.py | 4 ++-- src/sh_edraft/service/model/__init__.py | 4 ++-- src/sh_edraft/service/service_provider.py | 5 ++--- src/sh_edraft/time/model/__init__.py | 4 ++-- .../time/model/time_format_settings.py | 2 +- src/tests/logging/logger.py | 3 +-- src/tests/publisher.py | 2 +- src/tests/publishing/publisher.py | 4 ++-- .../service_providing/service_provider.py | 3 +-- 30 files changed, 65 insertions(+), 50 deletions(-) rename src/sh_edraft/{source_code => coding}/__init__.py (87%) rename src/sh_edraft/{source_code => coding}/model/__init__.py (87%) rename src/sh_edraft/{source_code => coding}/model/version.py (87%) rename src/sh_edraft/{source_code => coding}/model/version_enum.py (100%) rename src/sh_edraft/configuration/{model => base}/__init__.py (86%) rename src/sh_edraft/configuration/{model => base}/configuration_base.py (79%) rename src/sh_edraft/configuration/{model => base}/configuration_model_base.py (100%) delete mode 100644 src/sh_edraft/configuration/model/application_host_base.py create mode 100644 src/sh_edraft/hosting/__init__.py rename src/sh_edraft/{configuration => hosting}/application_host.py (80%) create mode 100644 src/sh_edraft/hosting/base/__init__.py create mode 100644 src/sh_edraft/hosting/base/application_host_base.py create mode 100644 src/sh_edraft/hosting/model/__init__.py diff --git a/src/sh_edraft/source_code/__init__.py b/src/sh_edraft/coding/__init__.py similarity index 87% rename from src/sh_edraft/source_code/__init__.py rename to src/sh_edraft/coding/__init__.py index 1df505f4..375dc28f 100644 --- a/src/sh_edraft/source_code/__init__.py +++ b/src/sh_edraft/coding/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.source_code +sh_edraft.coding ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.source_code """ -__title__ = 'sh_edraft.source_code' +__title__ = 'sh_edraft.coding' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/source_code/model/__init__.py b/src/sh_edraft/coding/model/__init__.py similarity index 87% rename from src/sh_edraft/source_code/model/__init__.py rename to src/sh_edraft/coding/model/__init__.py index 5e7c6981..32344b00 100644 --- a/src/sh_edraft/source_code/model/__init__.py +++ b/src/sh_edraft/coding/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.source_code.model +sh_edraft.coding.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.source_code.model """ -__title__ = 'sh_edraft.source_code.model' +__title__ = 'sh_edraft.coding.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/source_code/model/version.py b/src/sh_edraft/coding/model/version.py similarity index 87% rename from src/sh_edraft/source_code/model/version.py rename to src/sh_edraft/coding/model/version.py index a7ba870e..26e4f9c0 100644 --- a/src/sh_edraft/source_code/model/version.py +++ b/src/sh_edraft/coding/model/version.py @@ -1,7 +1,7 @@ from typing import Optional -from sh_edraft.source_code.model.version_enum import VersionEnum -from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.coding.model.version_enum import VersionEnum +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase class Version(ConfigurationModelBase): diff --git a/src/sh_edraft/source_code/model/version_enum.py b/src/sh_edraft/coding/model/version_enum.py similarity index 100% rename from src/sh_edraft/source_code/model/version_enum.py rename to src/sh_edraft/coding/model/version_enum.py diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py index 12f35645..10389a5b 100644 --- a/src/sh_edraft/configuration/__init__.py +++ b/src/sh_edraft/configuration/__init__.py @@ -20,7 +20,6 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: -from .application_host import ApplicationHost VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/configuration/model/__init__.py b/src/sh_edraft/configuration/base/__init__.py similarity index 86% rename from src/sh_edraft/configuration/model/__init__.py rename to src/sh_edraft/configuration/base/__init__.py index e5226338..b6b73bcd 100644 --- a/src/sh_edraft/configuration/model/__init__.py +++ b/src/sh_edraft/configuration/base/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.configuration.model +sh_edraft.configuration.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.configuration.model """ -__title__ = 'sh_edraft.configuration.model' +__title__ = 'sh_edraft.configuration.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/configuration/model/configuration_base.py b/src/sh_edraft/configuration/base/configuration_base.py similarity index 79% rename from src/sh_edraft/configuration/model/configuration_base.py rename to src/sh_edraft/configuration/base/configuration_base.py index ecfc21c1..4db03091 100644 --- a/src/sh_edraft/configuration/model/configuration_base.py +++ b/src/sh_edraft/configuration/base/configuration_base.py @@ -1,7 +1,7 @@ from abc import abstractmethod from collections import Callable -from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.service.base.service_base import ServiceBase @@ -14,7 +14,7 @@ class ConfigurationBase(ServiceBase): @property @abstractmethod - def config(self): pass + def config(self) -> dict[type, object]: pass @abstractmethod def add_config_by_type(self, key_type: type, value: object): pass diff --git a/src/sh_edraft/configuration/model/configuration_model_base.py b/src/sh_edraft/configuration/base/configuration_model_base.py similarity index 100% rename from src/sh_edraft/configuration/model/configuration_model_base.py rename to src/sh_edraft/configuration/base/configuration_model_base.py diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index 373ab8be..67140807 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -1,7 +1,7 @@ from collections import Callable -from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase -from sh_edraft.configuration.model.configuration_base import ConfigurationBase +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase +from sh_edraft.configuration.base.configuration_base import ConfigurationBase class Configuration(ConfigurationBase): diff --git a/src/sh_edraft/configuration/model/application_host_base.py b/src/sh_edraft/configuration/model/application_host_base.py deleted file mode 100644 index 8b3bc682..00000000 --- a/src/sh_edraft/configuration/model/application_host_base.py +++ /dev/null @@ -1,8 +0,0 @@ -from abc import ABC, abstractmethod -from datetime import datetime - - -class ApplicationHostBase(ABC): - - @abstractmethod - def __init__(self): pass diff --git a/src/sh_edraft/hosting/__init__.py b/src/sh_edraft/hosting/__init__.py new file mode 100644 index 00000000..ceeb2b0e --- /dev/null +++ b/src/sh_edraft/hosting/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .application_host import ApplicationHost diff --git a/src/sh_edraft/configuration/application_host.py b/src/sh_edraft/hosting/application_host.py similarity index 80% rename from src/sh_edraft/configuration/application_host.py rename to src/sh_edraft/hosting/application_host.py index 8885ff1e..f9b8fbf9 100644 --- a/src/sh_edraft/configuration/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,6 +1,6 @@ from datetime import datetime -from sh_edraft.configuration.model.application_host_base import ApplicationHostBase +from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.service.service_provider import ServiceProvider @@ -9,8 +9,8 @@ class ApplicationHost(ApplicationHostBase): def __init__(self): ApplicationHostBase.__init__(self) self._services = ServiceProvider() - self._end_time: datetime = datetime.now() self._start_time: datetime = datetime.now() + self._end_time: datetime = datetime.now() @property def services(self): @@ -21,7 +21,7 @@ class ApplicationHost(ApplicationHostBase): return self._end_time @end_time.setter - def end_time(self, end_time: datetime) -> None: + def end_time(self, end_time: datetime): self._end_time = end_time @property @@ -29,7 +29,7 @@ class ApplicationHost(ApplicationHostBase): return self._start_time @start_time.setter - def start_time(self, start_time: datetime) -> None: + def start_time(self, start_time: datetime): self._start_time = start_time @property diff --git a/src/sh_edraft/hosting/base/__init__.py b/src/sh_edraft/hosting/base/__init__.py new file mode 100644 index 00000000..96c21b77 --- /dev/null +++ b/src/sh_edraft/hosting/base/__init__.py @@ -0,0 +1,2 @@ +# imports: +from .application_host_base import ApplicationHostBase diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py new file mode 100644 index 00000000..20dbd9a5 --- /dev/null +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -0,0 +1,22 @@ +from abc import ABC, abstractmethod +from datetime import datetime + + +class ApplicationHostBase(ABC): + + @abstractmethod + def __init__(self): pass + + @property + @abstractmethod + def start_time(self) -> datetime: pass + + @start_time.setter + def start_time(self, start_time: datetime): pass + + @property + @abstractmethod + def end_time(self): pass + + @end_time.setter + def end_time(self, end_time: datetime): pass diff --git a/src/sh_edraft/hosting/model/__init__.py b/src/sh_edraft/hosting/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/logging/base/logger_base.py b/src/sh_edraft/logging/base/logger_base.py index 7c178e16..47949898 100644 --- a/src/sh_edraft/logging/base/logger_base.py +++ b/src/sh_edraft/logging/base/logger_base.py @@ -1,6 +1,6 @@ from abc import abstractmethod -from sh_edraft.configuration import ApplicationHost +from sh_edraft.hosting.application_host import ApplicationHost from sh_edraft.logging.model.logging_settings import LoggingSettings from sh_edraft.service.base.service_base import ServiceBase from sh_edraft.time.model.time_format_settings import TimeFormatSettings diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 2c0e5f60..f7a0a361 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -4,7 +4,7 @@ import traceback from collections import Callable from string import Template -from sh_edraft.configuration import ApplicationHost +from sh_edraft.hosting.application_host import ApplicationHost from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.logging.model.logging_level import LoggingLevel diff --git a/src/sh_edraft/logging/model/__init__.py b/src/sh_edraft/logging/model/__init__.py index 06f98905..6712752d 100644 --- a/src/sh_edraft/logging/model/__init__.py +++ b/src/sh_edraft/logging/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.logging.model +sh_edraft.logging.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.logging.model """ -__title__ = 'sh_edraft.logging.model' +__title__ = 'sh_edraft.logging.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/logging/model/logging_settings.py b/src/sh_edraft/logging/model/logging_settings.py index 70d23645..c5d1d77e 100644 --- a/src/sh_edraft/logging/model/logging_settings.py +++ b/src/sh_edraft/logging/model/logging_settings.py @@ -1,7 +1,7 @@ import traceback from typing import Optional -from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.logging.model.logging_settings_name import LogSettingsName from sh_edraft.utils.console import Console from sh_edraft.logging.model.logging_level import LoggingLevel diff --git a/src/sh_edraft/publishing/model/__init__.py b/src/sh_edraft/publishing/model/__init__.py index b18feff0..91e2bd18 100644 --- a/src/sh_edraft/publishing/model/__init__.py +++ b/src/sh_edraft/publishing/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publishing.model +sh_edraft.publishing.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.publishing.model """ -__title__ = 'sh_edraft.publishing.model' +__title__ = 'sh_edraft.publishing.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index 8c2ae8ee..898d01d9 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -1,7 +1,7 @@ import traceback from typing import Optional -from sh_edraft.configuration.model import ConfigurationModelBase +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.publishing.model import Template from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName from sh_edraft.utils import Console diff --git a/src/sh_edraft/publishing/model/template.py b/src/sh_edraft/publishing/model/template.py index 05a37f31..922a5df5 100644 --- a/src/sh_edraft/publishing/model/template.py +++ b/src/sh_edraft/publishing/model/template.py @@ -1,7 +1,7 @@ from typing import Optional -from sh_edraft.source_code.model.version import Version -from sh_edraft.configuration.model import ConfigurationModelBase +from sh_edraft.coding.model.version import Version +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.publishing.model.template_enum import TemplateEnum diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py index 9a4effc3..96c24ada 100644 --- a/src/sh_edraft/service/model/__init__.py +++ b/src/sh_edraft/service/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.service.model +sh_edraft.service.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.service.model """ -__title__ = 'sh_edraft.service.model' +__title__ = 'sh_edraft.service.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index bd4c02a0..66cb567e 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -3,11 +3,10 @@ from inspect import signature, Parameter from typing import Type from sh_edraft.configuration.configuration import Configuration -from sh_edraft.configuration.model.application_host_base import ApplicationHostBase -from sh_edraft.configuration.model.configuration_model_base import ConfigurationModelBase +from sh_edraft.hosting.base.application_host_base import ApplicationHostBase +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.service.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase -from sh_edraft.service.model.provide_state import ProvideState class ServiceProvider(ServiceProviderBase): diff --git a/src/sh_edraft/time/model/__init__.py b/src/sh_edraft/time/model/__init__.py index e786e832..6686c3d3 100644 --- a/src/sh_edraft/time/model/__init__.py +++ b/src/sh_edraft/time/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.time.model +sh_edraft.time.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.time.model """ -__title__ = 'sh_edraft.time.model' +__title__ = 'sh_edraft.time.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/time/model/time_format_settings.py b/src/sh_edraft/time/model/time_format_settings.py index 9c6b33ce..f092e27b 100644 --- a/src/sh_edraft/time/model/time_format_settings.py +++ b/src/sh_edraft/time/model/time_format_settings.py @@ -1,7 +1,7 @@ import traceback from typing import Optional -from sh_edraft.configuration.model import ConfigurationModelBase +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.time.model.time_format_settings_names import TimeFormatSettingsNames from sh_edraft.utils.console import Console diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index 75173742..37ea1346 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -4,9 +4,8 @@ import unittest from datetime import datetime from string import Template -from sh_edraft.configuration import ApplicationHost +from sh_edraft.hosting import ApplicationHost from sh_edraft.logging import Logger -from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.time.model import TimeFormatSettings diff --git a/src/tests/publisher.py b/src/tests/publisher.py index 086299ce..847d76b4 100644 --- a/src/tests/publisher.py +++ b/src/tests/publisher.py @@ -3,7 +3,7 @@ import os from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publishing.base import PublisherBase from sh_edraft.service.base import ServiceProviderBase -from sh_edraft.source_code.model import Version +from sh_edraft.coding.model import Version from sh_edraft.publishing import Publisher from sh_edraft.publishing.model import Template diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index 427fa686..ff64d0ae 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -2,7 +2,7 @@ import os import shutil import unittest -from sh_edraft.configuration import ApplicationHost +from sh_edraft.hosting import ApplicationHost from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings @@ -10,7 +10,7 @@ from sh_edraft.publishing import Publisher from sh_edraft.publishing.base import PublisherBase from sh_edraft.publishing.model import Template from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel -from sh_edraft.source_code.model import Version +from sh_edraft.coding.model import Version from sh_edraft.time.model import TimeFormatSettings diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py index 19a39349..1c136976 100644 --- a/src/tests/service_providing/service_provider.py +++ b/src/tests/service_providing/service_provider.py @@ -1,7 +1,6 @@ import unittest -from sh_edraft.configuration import ApplicationHost -from sh_edraft.configuration.model.application_host_base import ApplicationHostBase +from sh_edraft.hosting import ApplicationHost from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings From ead0eae5f0085884ce5d7b9dc3e34406e4860c50 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 11:20:21 +0100 Subject: [PATCH 17/86] Improved hosting --- .../configuration/base/configuration_base.py | 1 - src/sh_edraft/configuration/configuration.py | 2 ++ src/sh_edraft/hosting/__init__.py | 1 + src/sh_edraft/hosting/application_host.py | 18 ++++++++++--- src/sh_edraft/hosting/base/__init__.py | 1 + .../hosting/base/application_host_base.py | 16 ++++++++++++ .../hosting/base/environment_base.py | 25 +++++++++++++++++++ src/sh_edraft/hosting/hosting_environment.py | 20 +++++++++++++++ src/sh_edraft/hosting/model/__init__.py | 2 ++ .../hosting/model/environment_name.py | 9 +++++++ src/sh_edraft/logging/base/logger_base.py | 8 +----- src/sh_edraft/logging/logger.py | 11 ++++---- .../publishing/base/publisher_base.py | 7 +----- src/sh_edraft/publishing/model/__init__.py | 2 ++ src/sh_edraft/publishing/publisher.py | 5 +++- src/sh_edraft/service/service_provider.py | 10 +++++--- src/tests/logging/logger.py | 6 ++--- src/tests/publishing/publisher.py | 9 +++---- .../service_providing/service_provider.py | 8 +++--- 19 files changed, 124 insertions(+), 37 deletions(-) create mode 100644 src/sh_edraft/hosting/base/environment_base.py create mode 100644 src/sh_edraft/hosting/hosting_environment.py create mode 100644 src/sh_edraft/hosting/model/environment_name.py diff --git a/src/sh_edraft/configuration/base/configuration_base.py b/src/sh_edraft/configuration/base/configuration_base.py index 4db03091..03d74dd6 100644 --- a/src/sh_edraft/configuration/base/configuration_base.py +++ b/src/sh_edraft/configuration/base/configuration_base.py @@ -10,7 +10,6 @@ class ConfigurationBase(ServiceBase): @abstractmethod def __init__(self): ServiceBase.__init__(self) - self._config: dict[type, object] = {} @property @abstractmethod diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index 67140807..b3743aff 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -9,6 +9,8 @@ class Configuration(ConfigurationBase): def __init__(self): super().__init__() + self._config: dict[type, object] = {} + @property def config(self): return self._config diff --git a/src/sh_edraft/hosting/__init__.py b/src/sh_edraft/hosting/__init__.py index ceeb2b0e..2a8b8615 100644 --- a/src/sh_edraft/hosting/__init__.py +++ b/src/sh_edraft/hosting/__init__.py @@ -1,3 +1,4 @@ # imports: from .application_host import ApplicationHost +from .hosting_environment import HostingEnvironment diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index f9b8fbf9..0316a2f2 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,17 +1,29 @@ from datetime import datetime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase +from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.service.service_provider import ServiceProvider class ApplicationHost(ApplicationHostBase): - - def __init__(self): + + def __init__(self, name: str, env: EnvironmentBase): ApplicationHostBase.__init__(self) - self._services = ServiceProvider() + self._name: str = name + self._environment: EnvironmentBase = env + + self._services = ServiceProvider(self) self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() + @property + def name(self) -> str: + return self._name + + @property + def environment(self) -> EnvironmentBase: + return self._environment + @property def services(self): return self._services diff --git a/src/sh_edraft/hosting/base/__init__.py b/src/sh_edraft/hosting/base/__init__.py index 96c21b77..cc2f2b01 100644 --- a/src/sh_edraft/hosting/base/__init__.py +++ b/src/sh_edraft/hosting/base/__init__.py @@ -1,2 +1,3 @@ # imports: from .application_host_base import ApplicationHostBase +from .environment_base import EnvironmentBase diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 20dbd9a5..3e735665 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -1,17 +1,28 @@ from abc import ABC, abstractmethod from datetime import datetime +from sh_edraft.hosting.base.environment_base import EnvironmentBase + class ApplicationHostBase(ABC): @abstractmethod def __init__(self): pass + + @property + @abstractmethod + def name(self) -> str: pass + + @property + @abstractmethod + def environment(self) -> EnvironmentBase: pass @property @abstractmethod def start_time(self) -> datetime: pass @start_time.setter + @abstractmethod def start_time(self, start_time: datetime): pass @property @@ -19,4 +30,9 @@ class ApplicationHostBase(ABC): def end_time(self): pass @end_time.setter + @abstractmethod def end_time(self, end_time: datetime): pass + + @property + @abstractmethod + def date_time_now(self) -> datetime: pass diff --git a/src/sh_edraft/hosting/base/environment_base.py b/src/sh_edraft/hosting/base/environment_base.py new file mode 100644 index 00000000..99cfaa18 --- /dev/null +++ b/src/sh_edraft/hosting/base/environment_base.py @@ -0,0 +1,25 @@ +from abc import ABC, abstractmethod + +from sh_edraft.hosting.model.environment_name import EnvironmentName + + +class EnvironmentBase(ABC): + + @abstractmethod + def __init__(self): pass + + @property + @abstractmethod + def name(self) -> EnvironmentName: pass + + @name.setter + @abstractmethod + def name(self, name: EnvironmentName): pass + + @property + @abstractmethod + def content_root_path(self) -> str: pass + + @content_root_path.setter + @abstractmethod + def content_root_path(self, content_root_path: str): pass diff --git a/src/sh_edraft/hosting/hosting_environment.py b/src/sh_edraft/hosting/hosting_environment.py new file mode 100644 index 00000000..c771cf81 --- /dev/null +++ b/src/sh_edraft/hosting/hosting_environment.py @@ -0,0 +1,20 @@ +from sh_edraft.hosting.base.environment_base import EnvironmentBase +from sh_edraft.hosting.model.environment_name import EnvironmentName + + +class HostingEnvironment(EnvironmentBase): + + def __init__(self, name: EnvironmentName, crp: str): + EnvironmentBase.__init__(self) + + self._name = name + self._content_root_path = crp + + @property + def name(self) -> EnvironmentName: + return self._name + + @property + def content_root_path(self) -> str: + return self._content_root_path + diff --git a/src/sh_edraft/hosting/model/__init__.py b/src/sh_edraft/hosting/model/__init__.py index e69de29b..b8692da2 100644 --- a/src/sh_edraft/hosting/model/__init__.py +++ b/src/sh_edraft/hosting/model/__init__.py @@ -0,0 +1,2 @@ +# imports: +from .environment_name import EnvironmentName \ No newline at end of file diff --git a/src/sh_edraft/hosting/model/environment_name.py b/src/sh_edraft/hosting/model/environment_name.py new file mode 100644 index 00000000..18abcbb5 --- /dev/null +++ b/src/sh_edraft/hosting/model/environment_name.py @@ -0,0 +1,9 @@ +from enum import Enum + + +class EnvironmentName(Enum): + + production = 'production' + staging = 'staging' + testing = 'testing' + development = 'development' diff --git a/src/sh_edraft/logging/base/logger_base.py b/src/sh_edraft/logging/base/logger_base.py index 47949898..2dc5de50 100644 --- a/src/sh_edraft/logging/base/logger_base.py +++ b/src/sh_edraft/logging/base/logger_base.py @@ -1,20 +1,14 @@ from abc import abstractmethod -from sh_edraft.hosting.application_host import ApplicationHost -from sh_edraft.logging.model.logging_settings import LoggingSettings from sh_edraft.service.base.service_base import ServiceBase -from sh_edraft.time.model.time_format_settings import TimeFormatSettings class LoggerBase(ServiceBase): @abstractmethod - def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings): + def __init__(self): ServiceBase.__init__(self) - self._log_settings: LoggingSettings = logging_settings - self._time_format_settings: TimeFormatSettings = time_format - @abstractmethod def header(self, string: str): pass diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index f7a0a361..6305725a 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -1,10 +1,9 @@ import datetime import os import traceback -from collections import Callable from string import Template -from sh_edraft.hosting.application_host import ApplicationHost +from sh_edraft.hosting.base import ApplicationHostBase from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.logging.model.logging_level import LoggingLevel @@ -14,10 +13,12 @@ from sh_edraft.utils.console import Console class Logger(LoggerBase): - def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings, app_host: ApplicationHost): - LoggerBase.__init__(self, logging_settings, time_format) + def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings, app_host: ApplicationHostBase): + LoggerBase.__init__(self) - self._app_host: ApplicationHost = app_host + self._log_settings: LoggingSettings = logging_settings + self._time_format_settings: TimeFormatSettings = time_format + self._app_host = app_host self._log = Template(self._log_settings.filename).substitute( date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), diff --git a/src/sh_edraft/publishing/base/publisher_base.py b/src/sh_edraft/publishing/base/publisher_base.py index f2038018..f3f899ca 100644 --- a/src/sh_edraft/publishing/base/publisher_base.py +++ b/src/sh_edraft/publishing/base/publisher_base.py @@ -1,19 +1,14 @@ from abc import abstractmethod -from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel from sh_edraft.service.base.service_base import ServiceBase class PublisherBase(ServiceBase): @abstractmethod - def __init__(self, logger: LoggerBase, publish_settings: PublishSettingsModel): + def __init__(self): ServiceBase.__init__(self) - self._logger: LoggerBase = logger - self._publish_settings: PublishSettingsModel = publish_settings - @property @abstractmethod def source_path(self) -> str: pass diff --git a/src/sh_edraft/publishing/model/__init__.py b/src/sh_edraft/publishing/model/__init__.py index 91e2bd18..4017b71c 100644 --- a/src/sh_edraft/publishing/model/__init__.py +++ b/src/sh_edraft/publishing/model/__init__.py @@ -22,6 +22,8 @@ from collections import namedtuple # imports: from .template import Template from .template_enum import TemplateEnum +from .publish_settings_model import PublishSettingsModel +from .publish_settings_name import PublishSettingsName VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 1e7f55e6..573c11f5 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -11,7 +11,10 @@ from sh_edraft.publishing.model.template import Template class Publisher(PublisherBase): def __init__(self, logger: LoggerBase, publish_settings: PublishSettingsModel): - super().__init__(logger, publish_settings) + PublisherBase.__init__(self) + + self._logger: LoggerBase = logger + self._publish_settings: PublishSettingsModel = publish_settings @property def source_path(self) -> str: diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index 66cb567e..2467ec46 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -11,8 +11,9 @@ from sh_edraft.service.base.service_base import ServiceBase class ServiceProvider(ServiceProviderBase): - def __init__(self): + def __init__(self, app_host: ApplicationHostBase): super().__init__() + self._app_host: ApplicationHostBase = app_host self._config = Configuration() @property @@ -27,10 +28,13 @@ class ServiceProvider(ServiceProviderBase): for param in sig.parameters.items(): parameter = param[1] if parameter.name != 'self' and parameter.annotation != Parameter.empty: - if issubclass(parameter.annotation, ServiceBase): + if issubclass(parameter.annotation, ApplicationHostBase): + params.append(self._app_host) + + elif issubclass(parameter.annotation, ServiceBase): params.append(self.get_service(parameter.annotation)) - elif issubclass(parameter.annotation, ConfigurationModelBase) or issubclass(parameter.annotation, ApplicationHostBase): + elif issubclass(parameter.annotation, ConfigurationModelBase): params.append(self._config.get_config_by_type(parameter.annotation)) return service(*params) diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index 37ea1346..d7222426 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -1,10 +1,10 @@ import os import shutil import unittest -from datetime import datetime from string import Template -from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting import ApplicationHost, HostingEnvironment +from sh_edraft.hosting.model import EnvironmentName from sh_edraft.logging import Logger from sh_edraft.logging.model import LoggingSettings from sh_edraft.time.model import TimeFormatSettings @@ -13,7 +13,7 @@ from sh_edraft.time.model import TimeFormatSettings class LoggerTest(unittest.TestCase): def setUp(self): - self._app_host = ApplicationHost() + self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) self._services = self._app_host.services self._services.create() diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index ff64d0ae..cb721a41 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -2,14 +2,13 @@ import os import shutil import unittest -from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting import ApplicationHost, HostingEnvironment +from sh_edraft.hosting.model import EnvironmentName from sh_edraft.logging import Logger -from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher -from sh_edraft.publishing.base import PublisherBase from sh_edraft.publishing.model import Template -from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel +from sh_edraft.publishing.model import PublishSettingsModel from sh_edraft.coding.model import Version from sh_edraft.time.model import TimeFormatSettings @@ -79,7 +78,7 @@ class PublisherTest(unittest.TestCase): def setUp(self): self._config() - self._app_host = ApplicationHost() + self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) self._logger = Logger(self._log_settings, self._time_format_settings, self._app_host) self._logger.create() diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py index 1c136976..a6626763 100644 --- a/src/tests/service_providing/service_provider.py +++ b/src/tests/service_providing/service_provider.py @@ -1,12 +1,14 @@ import unittest from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting import HostingEnvironment +from sh_edraft.hosting.model import EnvironmentName from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher from sh_edraft.publishing.base import PublisherBase -from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel +from sh_edraft.publishing.model import PublishSettingsModel from sh_edraft.service import ServiceProvider from sh_edraft.service.base import ServiceBase from sh_edraft.time.model import TimeFormatSettings @@ -15,7 +17,7 @@ from sh_edraft.time.model import TimeFormatSettings class ServiceProviderTest(unittest.TestCase): def setUp(self): - self._app_host = ApplicationHost() + self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) self._services = self._app_host.services self._services.create() @@ -59,7 +61,7 @@ class ServiceProviderTest(unittest.TestCase): def test_create(self): print(f'{__name__}.test_create:') - provider = ServiceProvider() + provider = ServiceProvider(self._app_host) self.assertIsNotNone(provider) provider.create() self.assertIsNotNone(provider) From c815e75282bba8b7164b43de0247bc4003f7840d Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 11:21:57 +0100 Subject: [PATCH 18/86] Improved tests --- src/tests/logging/logger.py | 3 -- src/tests/publisher.py | 59 ------------------------------------- 2 files changed, 62 deletions(-) delete mode 100644 src/tests/publisher.py diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index d7222426..e41a1491 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -14,8 +14,6 @@ class LoggerTest(unittest.TestCase): def setUp(self): self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) - self._services = self._app_host.services - self._services.create() self._log_settings = LoggingSettings() self._log_settings.from_dict({ @@ -38,7 +36,6 @@ class LoggerTest(unittest.TestCase): shutil.rmtree(self._log_settings.path) def _check_general_requirements(self): - self.assertIsNotNone(self._services) self.assertIsNotNone(self._log_settings) self.assertIsNotNone(self._time_format_settings) diff --git a/src/tests/publisher.py b/src/tests/publisher.py deleted file mode 100644 index 847d76b4..00000000 --- a/src/tests/publisher.py +++ /dev/null @@ -1,59 +0,0 @@ -import os - -from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.base import PublisherBase -from sh_edraft.service.base import ServiceProviderBase -from sh_edraft.coding.model import Version -from sh_edraft.publishing import Publisher -from sh_edraft.publishing.model import Template - - -class PublisherTest: - - @staticmethod - def start(services: ServiceProviderBase): - version = Version(2020, 12, 5).to_dict() - templates = [ - Template( - '../../publish_templates/*_template.txt', - '*', - '', - '', - '2020', - 'sh-edraft.de', - 'MIT', - ', see LICENSE for more details.', - '', - 'Sven Heidemann', - version - ), - Template( - '../../publish_templates/*_template.txt', - 'sh_edraft', - 'common python library', - 'Library to share common classes and models used at sh-edraft.de', - '2020', - 'sh-edraft.de', - 'MIT', - ', see LICENSE for more details.', - '', - 'Sven Heidemann', - version - ) - ] - - source = '../' - dist = '../../dist' - - services.add_transient(Publisher, services.get_service(LoggerBase), source, dist, templates) - publisher: Publisher = services.get_service(PublisherBase) - - publisher.exclude('../tests/') - publisher.include('../../LICENSE') - publisher.include('../../README.md') - - publisher.create() - publisher.publish() - - if not os.path.isdir(dist): - raise Exception(f'{__name__}: Dist path was not created') From 1c753aaaea7b1277e7bb5ceef57314bb17a2afb3 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 11:55:55 +0100 Subject: [PATCH 19/86] Added logic to create application --- src/sh_edraft/configuration/__init__.py | 1 + src/sh_edraft/configuration/base/__init__.py | 1 + src/sh_edraft/hosting/application_host.py | 15 ++++++---- .../hosting/base/application_base.py | 16 ++++++++++ src/sh_edraft/hosting/hosting_environment.py | 9 +++--- .../service/base/service_provider_base.py | 4 --- src/sh_edraft/service/service_provider.py | 4 +++ src/tests_dev/__init__.py | 0 src/tests_dev/main.py | 30 +++++++++++++++++++ 9 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 src/sh_edraft/hosting/base/application_base.py create mode 100644 src/tests_dev/__init__.py create mode 100644 src/tests_dev/main.py diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py index 10389a5b..0aaef2f3 100644 --- a/src/sh_edraft/configuration/__init__.py +++ b/src/sh_edraft/configuration/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: +from .configuration import Configuration VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/configuration/base/__init__.py b/src/sh_edraft/configuration/base/__init__.py index b6b73bcd..a9585439 100644 --- a/src/sh_edraft/configuration/base/__init__.py +++ b/src/sh_edraft/configuration/base/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: +from .configuration_base import ConfigurationBase from .configuration_model_base import ConfigurationModelBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index 0316a2f2..f0f611f2 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,17 +1,20 @@ from datetime import datetime +from sh_edraft.hosting.hosting_environment import HostingEnvironment from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.hosting.base.environment_base import EnvironmentBase +from sh_edraft.service.base import ServiceProviderBase from sh_edraft.service.service_provider import ServiceProvider class ApplicationHost(ApplicationHostBase): - def __init__(self, name: str, env: EnvironmentBase): + def __init__(self, name: str, args: list[str]): ApplicationHostBase.__init__(self) self._name: str = name - self._environment: EnvironmentBase = env + self._environment = HostingEnvironment() + self._args: list[str] = args self._services = ServiceProvider(self) self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() @@ -24,10 +27,6 @@ class ApplicationHost(ApplicationHostBase): def environment(self) -> EnvironmentBase: return self._environment - @property - def services(self): - return self._services - @property def end_time(self) -> datetime: return self._end_time @@ -47,3 +46,7 @@ class ApplicationHost(ApplicationHostBase): @property def date_time_now(self) -> datetime: return datetime.now() + + @property + def services(self) -> ServiceProviderBase: + return self._services diff --git a/src/sh_edraft/hosting/base/application_base.py b/src/sh_edraft/hosting/base/application_base.py new file mode 100644 index 00000000..96997c6b --- /dev/null +++ b/src/sh_edraft/hosting/base/application_base.py @@ -0,0 +1,16 @@ +from abc import ABC, abstractmethod + + +class ApplicationBase(ABC): + + @abstractmethod + def __init__(self): pass + + @abstractmethod + def create_configuration(self): pass + + @abstractmethod + def create_services(self): pass + + @abstractmethod + def main(self): pass diff --git a/src/sh_edraft/hosting/hosting_environment.py b/src/sh_edraft/hosting/hosting_environment.py index c771cf81..763ef5cc 100644 --- a/src/sh_edraft/hosting/hosting_environment.py +++ b/src/sh_edraft/hosting/hosting_environment.py @@ -1,14 +1,16 @@ +from typing import Optional + from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.hosting.model.environment_name import EnvironmentName class HostingEnvironment(EnvironmentBase): - def __init__(self, name: EnvironmentName, crp: str): + def __init__(self, name: EnvironmentName = None, crp: str = None): EnvironmentBase.__init__(self) - self._name = name - self._content_root_path = crp + self._name: Optional[EnvironmentName] = name + self._content_root_path: Optional[str] = crp @property def name(self) -> EnvironmentName: @@ -17,4 +19,3 @@ class HostingEnvironment(EnvironmentBase): @property def content_root_path(self) -> str: return self._content_root_path - diff --git a/src/sh_edraft/service/base/service_provider_base.py b/src/sh_edraft/service/base/service_provider_base.py index 9deb0918..fe5e0f91 100644 --- a/src/sh_edraft/service/base/service_provider_base.py +++ b/src/sh_edraft/service/base/service_provider_base.py @@ -11,10 +11,6 @@ class ServiceProviderBase(ServiceBase): def __init__(self): ServiceBase.__init__(self) - self._transient_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} - self._scoped_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} - self._singleton_services: dict[Type[ServiceBase], ServiceBase] = {} - @property @abstractmethod def config(self): pass diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index 2467ec46..5c5b0819 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -16,6 +16,10 @@ class ServiceProvider(ServiceProviderBase): self._app_host: ApplicationHostBase = app_host self._config = Configuration() + self._transient_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} + self._scoped_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} + self._singleton_services: dict[Type[ServiceBase], ServiceBase] = {} + @property def config(self): return self._config diff --git a/src/tests_dev/__init__.py b/src/tests_dev/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests_dev/main.py b/src/tests_dev/main.py new file mode 100644 index 00000000..1b9c7cd1 --- /dev/null +++ b/src/tests_dev/main.py @@ -0,0 +1,30 @@ +import sys + +from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting.base.application_base import ApplicationBase + + +class Program(ApplicationBase): + + def __init__(self): + ApplicationBase.__init__(self) + + self._app_host = ApplicationHost('CPL_DEV_Test', sys.argv) + self._config = self._app_host.services.config + self._services = self._app_host.services + + def create_configuration(self): + self._config.create() + + def create_services(self): + self._services.create() + + def main(self): + print('RUN') + + +if __name__ == '__main__': + program = Program() + program.create_configuration() + program.create_services() + program.main() From 1e0d7d60a5022ab6c1c30d6e17617af0020e6604 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 17:14:18 +0100 Subject: [PATCH 20/86] Bugfixes --- src/sh_edraft/hosting/application_host.py | 5 +++-- src/sh_edraft/hosting/hosting_environment.py | 10 +++++++++- src/tests_dev/main.py | 4 +--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index f0f611f2..e9a4ecc4 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,3 +1,4 @@ +import sys from datetime import datetime from sh_edraft.hosting.hosting_environment import HostingEnvironment @@ -9,12 +10,12 @@ from sh_edraft.service.service_provider import ServiceProvider class ApplicationHost(ApplicationHostBase): - def __init__(self, name: str, args: list[str]): + def __init__(self, name: str): ApplicationHostBase.__init__(self) self._name: str = name self._environment = HostingEnvironment() - self._args: list[str] = args + self._args: list[str] = sys.argv self._services = ServiceProvider(self) self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() diff --git a/src/sh_edraft/hosting/hosting_environment.py b/src/sh_edraft/hosting/hosting_environment.py index 763ef5cc..91c011d0 100644 --- a/src/sh_edraft/hosting/hosting_environment.py +++ b/src/sh_edraft/hosting/hosting_environment.py @@ -6,7 +6,7 @@ from sh_edraft.hosting.model.environment_name import EnvironmentName class HostingEnvironment(EnvironmentBase): - def __init__(self, name: EnvironmentName = None, crp: str = None): + def __init__(self, name: EnvironmentName = None, crp: str = './'): EnvironmentBase.__init__(self) self._name: Optional[EnvironmentName] = name @@ -16,6 +16,14 @@ class HostingEnvironment(EnvironmentBase): def name(self) -> EnvironmentName: return self._name + @name.setter + def name(self, name: EnvironmentName): + self._name = name + @property def content_root_path(self) -> str: return self._content_root_path + + @content_root_path.setter + def content_root_path(self, content_root_path: str): + self._content_root_path = content_root_path diff --git a/src/tests_dev/main.py b/src/tests_dev/main.py index 1b9c7cd1..6516be08 100644 --- a/src/tests_dev/main.py +++ b/src/tests_dev/main.py @@ -1,5 +1,3 @@ -import sys - from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base.application_base import ApplicationBase @@ -9,7 +7,7 @@ class Program(ApplicationBase): def __init__(self): ApplicationBase.__init__(self) - self._app_host = ApplicationHost('CPL_DEV_Test', sys.argv) + self._app_host = ApplicationHost('CPL_DEV_Test') self._config = self._app_host.services.config self._services = self._app_host.services From cd7c12bba43710049b0681d15323a0ad2023ab14 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 17:57:51 +0100 Subject: [PATCH 21/86] Improved dev test --- src/tests_dev/main.py | 23 +---------------------- src/tests_dev/program.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 src/tests_dev/program.py diff --git a/src/tests_dev/main.py b/src/tests_dev/main.py index 6516be08..02718764 100644 --- a/src/tests_dev/main.py +++ b/src/tests_dev/main.py @@ -1,25 +1,4 @@ -from sh_edraft.hosting import ApplicationHost -from sh_edraft.hosting.base.application_base import ApplicationBase - - -class Program(ApplicationBase): - - def __init__(self): - ApplicationBase.__init__(self) - - self._app_host = ApplicationHost('CPL_DEV_Test') - self._config = self._app_host.services.config - self._services = self._app_host.services - - def create_configuration(self): - self._config.create() - - def create_services(self): - self._services.create() - - def main(self): - print('RUN') - +from tests_dev.program import Program if __name__ == '__main__': program = Program() diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py new file mode 100644 index 00000000..59f95aa8 --- /dev/null +++ b/src/tests_dev/program.py @@ -0,0 +1,21 @@ +from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting.base.application_base import ApplicationBase + + +class Program(ApplicationBase): + + def __init__(self): + ApplicationBase.__init__(self) + + self._app_host = ApplicationHost('CPL_DEV_Test') + self._config = self._app_host.services.config + self._services = self._app_host.services + + def create_configuration(self): + self._config.create() + + def create_services(self): + self._services.create() + + def main(self): + print('RUN') From c6d1dce577011f223a69a7e2c0e661b8033aa3d6 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 18:58:08 +0100 Subject: [PATCH 22/86] Improved service providing and app hosting --- .../configuration/base/configuration_base.py | 14 ++++--- src/sh_edraft/hosting/application_host.py | 41 ++++++------------- src/sh_edraft/hosting/application_runtime.py | 38 +++++++++++++++++ src/sh_edraft/hosting/base/__init__.py | 1 + .../hosting/base/application_base.py | 3 ++ .../hosting/base/application_host_base.py | 23 +++-------- .../hosting/base/application_runtime_base.py | 34 +++++++++++++++ .../service/base/service_provider_base.py | 4 -- src/sh_edraft/service/service_provider.py | 25 ++++------- src/tests_dev/main.py | 1 + src/tests_dev/program.py | 13 +++--- 11 files changed, 118 insertions(+), 79 deletions(-) create mode 100644 src/sh_edraft/hosting/application_runtime.py create mode 100644 src/sh_edraft/hosting/base/application_runtime_base.py diff --git a/src/sh_edraft/configuration/base/configuration_base.py b/src/sh_edraft/configuration/base/configuration_base.py index 03d74dd6..06c8bfe8 100644 --- a/src/sh_edraft/configuration/base/configuration_base.py +++ b/src/sh_edraft/configuration/base/configuration_base.py @@ -1,15 +1,14 @@ -from abc import abstractmethod +from abc import abstractmethod, ABC from collections import Callable +from typing import Type from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase -from sh_edraft.service.base.service_base import ServiceBase -class ConfigurationBase(ServiceBase): +class ConfigurationBase(ABC): @abstractmethod - def __init__(self): - ServiceBase.__init__(self) + def __init__(self): pass @property @abstractmethod @@ -19,4 +18,7 @@ class ConfigurationBase(ServiceBase): def add_config_by_type(self, key_type: type, value: object): pass @abstractmethod - def get_config_by_type(self, search_type: ConfigurationModelBase) -> Callable[ConfigurationModelBase]: pass + def get_config_by_type(self, search_type: Type[ConfigurationModelBase]) -> Callable[ConfigurationModelBase]: pass + + @abstractmethod + def create(self): pass diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index e9a4ecc4..edfa6613 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,11 +1,12 @@ import sys from datetime import datetime -from sh_edraft.hosting.hosting_environment import HostingEnvironment +from sh_edraft.configuration.configuration import Configuration +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase -from sh_edraft.hosting.base.environment_base import EnvironmentBase -from sh_edraft.service.base import ServiceProviderBase from sh_edraft.service.service_provider import ServiceProvider +from sh_edraft.service.base.service_provider_base import ServiceProviderBase class ApplicationHost(ApplicationHostBase): @@ -13,41 +14,25 @@ class ApplicationHost(ApplicationHostBase): def __init__(self, name: str): ApplicationHostBase.__init__(self) self._name: str = name - self._environment = HostingEnvironment() - self._args: list[str] = sys.argv - self._services = ServiceProvider(self) + + self._config = Configuration() + self._app_runtime = ApplicationRuntime(self._config) + self._services = ServiceProvider(self._app_runtime) + self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() @property def name(self) -> str: return self._name - - @property - def environment(self) -> EnvironmentBase: - return self._environment @property - def end_time(self) -> datetime: - return self._end_time + def configuration(self) -> ConfigurationBase: + return self._config - @end_time.setter - def end_time(self, end_time: datetime): - self._end_time = end_time - - @property - def start_time(self) -> datetime: - return self._start_time - - @start_time.setter - def start_time(self, start_time: datetime): - self._start_time = start_time - - @property - def date_time_now(self) -> datetime: - return datetime.now() - @property def services(self) -> ServiceProviderBase: return self._services + + def create(self): pass diff --git a/src/sh_edraft/hosting/application_runtime.py b/src/sh_edraft/hosting/application_runtime.py new file mode 100644 index 00000000..e94ca901 --- /dev/null +++ b/src/sh_edraft/hosting/application_runtime.py @@ -0,0 +1,38 @@ +from datetime import datetime + +from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase + + +class ApplicationRuntime(ApplicationRuntimeBase): + + def __init__(self, config: ConfigurationBase): + ApplicationRuntimeBase.__init__(self) + + self._configuration = config + self._start_time: datetime = datetime.now() + self._end_time: datetime = datetime.now() + + @property + def configuration(self) -> ConfigurationBase: + return self._configuration + + @property + def start_time(self) -> datetime: + return self._start_time + + @start_time.setter + def start_time(self, start_time: datetime): + self._start_time = start_time + + @property + def end_time(self) -> datetime: + return self._end_time + + @end_time.setter + def end_time(self, end_time: datetime): + self._end_time = end_time + + @property + def date_time_now(self) -> datetime: + return datetime.now() diff --git a/src/sh_edraft/hosting/base/__init__.py b/src/sh_edraft/hosting/base/__init__.py index cc2f2b01..2bafd17e 100644 --- a/src/sh_edraft/hosting/base/__init__.py +++ b/src/sh_edraft/hosting/base/__init__.py @@ -1,3 +1,4 @@ # imports: from .application_host_base import ApplicationHostBase from .environment_base import EnvironmentBase +from .application_base import ApplicationBase diff --git a/src/sh_edraft/hosting/base/application_base.py b/src/sh_edraft/hosting/base/application_base.py index 96997c6b..00f72997 100644 --- a/src/sh_edraft/hosting/base/application_base.py +++ b/src/sh_edraft/hosting/base/application_base.py @@ -6,6 +6,9 @@ class ApplicationBase(ABC): @abstractmethod def __init__(self): pass + @abstractmethod + def create_application_host(self): pass + @abstractmethod def create_configuration(self): pass diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 3e735665..0ed3b6e4 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod -from datetime import datetime -from sh_edraft.hosting.base.environment_base import EnvironmentBase +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.service.base.service_provider_base import ServiceProviderBase class ApplicationHostBase(ABC): @@ -12,27 +12,14 @@ class ApplicationHostBase(ABC): @property @abstractmethod def name(self) -> str: pass - - @property - @abstractmethod - def environment(self) -> EnvironmentBase: pass @property @abstractmethod - def start_time(self) -> datetime: pass - - @start_time.setter - @abstractmethod - def start_time(self, start_time: datetime): pass + def configuration(self) -> ConfigurationBase: pass @property @abstractmethod - def end_time(self): pass + def services(self) -> ServiceProviderBase: pass - @end_time.setter @abstractmethod - def end_time(self, end_time: datetime): pass - - @property - @abstractmethod - def date_time_now(self) -> datetime: pass + def create(self): pass diff --git a/src/sh_edraft/hosting/base/application_runtime_base.py b/src/sh_edraft/hosting/base/application_runtime_base.py new file mode 100644 index 00000000..c7d364d6 --- /dev/null +++ b/src/sh_edraft/hosting/base/application_runtime_base.py @@ -0,0 +1,34 @@ +from abc import ABC, abstractmethod +from datetime import datetime + +from sh_edraft.configuration.base import ConfigurationBase + + +class ApplicationRuntimeBase(ABC): + + @abstractmethod + def __init__(self): pass + + @property + @abstractmethod + def configuration(self) -> ConfigurationBase: pass + + @property + @abstractmethod + def start_time(self) -> datetime: pass + + @start_time.setter + @abstractmethod + def start_time(self, start_time: datetime): pass + + @property + @abstractmethod + def end_time(self): pass + + @end_time.setter + @abstractmethod + def end_time(self, end_time: datetime): pass + + @property + @abstractmethod + def date_time_now(self) -> datetime: pass diff --git a/src/sh_edraft/service/base/service_provider_base.py b/src/sh_edraft/service/base/service_provider_base.py index fe5e0f91..d9dfa000 100644 --- a/src/sh_edraft/service/base/service_provider_base.py +++ b/src/sh_edraft/service/base/service_provider_base.py @@ -11,10 +11,6 @@ class ServiceProviderBase(ServiceBase): def __init__(self): ServiceBase.__init__(self) - @property - @abstractmethod - def config(self): pass - @abstractmethod def add_transient(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): pass diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index 5c5b0819..36548cfe 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -2,28 +2,22 @@ from collections import Callable from inspect import signature, Parameter from typing import Type -from sh_edraft.configuration.configuration import Configuration -from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase +from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.service.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase class ServiceProvider(ServiceProviderBase): - def __init__(self, app_host: ApplicationHostBase): - super().__init__() - self._app_host: ApplicationHostBase = app_host - self._config = Configuration() + def __init__(self, app_runtime: ApplicationRuntimeBase): + ServiceProviderBase.__init__(self) + self._app_runtime: ApplicationRuntimeBase = app_runtime self._transient_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} self._scoped_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} self._singleton_services: dict[Type[ServiceBase], ServiceBase] = {} - @property - def config(self): - return self._config - def create(self): pass def _create_instance(self, service: Callable[ServiceBase]) -> ServiceBase: @@ -32,21 +26,16 @@ class ServiceProvider(ServiceProviderBase): for param in sig.parameters.items(): parameter = param[1] if parameter.name != 'self' and parameter.annotation != Parameter.empty: - if issubclass(parameter.annotation, ApplicationHostBase): - params.append(self._app_host) + if issubclass(parameter.annotation, ApplicationRuntimeBase): + params.append(self._app_runtime) elif issubclass(parameter.annotation, ServiceBase): params.append(self.get_service(parameter.annotation)) elif issubclass(parameter.annotation, ConfigurationModelBase): - params.append(self._config.get_config_by_type(parameter.annotation)) + params.append(self._app_runtime.configuration.get_config_by_type(parameter.annotation)) return service(*params) - # try: - # instance.init(args) - # return instance - # except Exception as e: - # print(colored(f'Argument error\n{e}', 'red')) def add_transient(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): self._transient_services[service_type] = service diff --git a/src/tests_dev/main.py b/src/tests_dev/main.py index 02718764..cfb45c60 100644 --- a/src/tests_dev/main.py +++ b/src/tests_dev/main.py @@ -2,6 +2,7 @@ from tests_dev.program import Program if __name__ == '__main__': program = Program() + program.create_application_host() program.create_configuration() program.create_services() program.main() diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 59f95aa8..69d2796b 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,5 +1,7 @@ +from typing import Optional + from sh_edraft.hosting import ApplicationHost -from sh_edraft.hosting.base.application_base import ApplicationBase +from sh_edraft.hosting.base import ApplicationBase class Program(ApplicationBase): @@ -7,15 +9,16 @@ class Program(ApplicationBase): def __init__(self): ApplicationBase.__init__(self) + self._app_host: Optional[ApplicationHost] = None + + def create_application_host(self): self._app_host = ApplicationHost('CPL_DEV_Test') - self._config = self._app_host.services.config - self._services = self._app_host.services def create_configuration(self): - self._config.create() + self._app_host.configuration.create() def create_services(self): - self._services.create() + self._app_host.services.create() def main(self): print('RUN') From 7d4efe7bdaf6f2b42443504d8e4f05a5e593095d Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 26 Nov 2020 19:17:05 +0100 Subject: [PATCH 23/86] Improved service providing and app hosting --- src/sh_edraft/hosting/application_host.py | 9 +++- src/sh_edraft/hosting/application_runtime.py | 14 +++++-- .../hosting/base/application_host_base.py | 5 +++ .../hosting/base/application_runtime_base.py | 7 +++- src/sh_edraft/hosting/hosting_environment.py | 2 +- src/sh_edraft/logging/logger.py | 34 +++++++++++---- .../service/base/service_provider_base.py | 2 +- src/sh_edraft/service/service_provider.py | 2 +- src/tests_dev/program.py | 41 ++++++++++++++++++- 9 files changed, 97 insertions(+), 19 deletions(-) diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index edfa6613..f1342626 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -3,6 +3,8 @@ from datetime import datetime from sh_edraft.configuration.configuration import Configuration from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.base.environment_base import EnvironmentBase +from sh_edraft.hosting.hosting_environment import HostingEnvironment from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.service.service_provider import ServiceProvider @@ -17,7 +19,8 @@ class ApplicationHost(ApplicationHostBase): self._args: list[str] = sys.argv self._config = Configuration() - self._app_runtime = ApplicationRuntime(self._config) + self._environment = HostingEnvironment() + self._app_runtime = ApplicationRuntime(self._config, self._environment) self._services = ServiceProvider(self._app_runtime) self._start_time: datetime = datetime.now() @@ -27,6 +30,10 @@ class ApplicationHost(ApplicationHostBase): def name(self) -> str: return self._name + @property + def environment(self) -> EnvironmentBase: + return self._environment + @property def configuration(self) -> ConfigurationBase: return self._config diff --git a/src/sh_edraft/hosting/application_runtime.py b/src/sh_edraft/hosting/application_runtime.py index e94ca901..3252ecbe 100644 --- a/src/sh_edraft/hosting/application_runtime.py +++ b/src/sh_edraft/hosting/application_runtime.py @@ -1,21 +1,27 @@ from datetime import datetime -from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase class ApplicationRuntime(ApplicationRuntimeBase): - def __init__(self, config: ConfigurationBase): + def __init__(self, config: ConfigurationBase, runtime: EnvironmentBase): ApplicationRuntimeBase.__init__(self) - self._configuration = config + self._app_runtime = runtime + self._app_configuration = config self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() + + @property + def environment(self) -> EnvironmentBase: + return self._app_runtime @property def configuration(self) -> ConfigurationBase: - return self._configuration + return self._app_configuration @property def start_time(self) -> datetime: diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 0ed3b6e4..4e6c88e5 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.service.base.service_provider_base import ServiceProviderBase @@ -13,6 +14,10 @@ class ApplicationHostBase(ABC): @abstractmethod def name(self) -> str: pass + @property + @abstractmethod + def environment(self) -> EnvironmentBase: pass + @property @abstractmethod def configuration(self) -> ConfigurationBase: pass diff --git a/src/sh_edraft/hosting/base/application_runtime_base.py b/src/sh_edraft/hosting/base/application_runtime_base.py index c7d364d6..8d5ec5cc 100644 --- a/src/sh_edraft/hosting/base/application_runtime_base.py +++ b/src/sh_edraft/hosting/base/application_runtime_base.py @@ -1,7 +1,8 @@ from abc import ABC, abstractmethod from datetime import datetime -from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.base.environment_base import EnvironmentBase class ApplicationRuntimeBase(ABC): @@ -9,6 +10,10 @@ class ApplicationRuntimeBase(ABC): @abstractmethod def __init__(self): pass + @property + @abstractmethod + def environment(self) -> EnvironmentBase: pass + @property @abstractmethod def configuration(self) -> ConfigurationBase: pass diff --git a/src/sh_edraft/hosting/hosting_environment.py b/src/sh_edraft/hosting/hosting_environment.py index 91c011d0..e1ecc15b 100644 --- a/src/sh_edraft/hosting/hosting_environment.py +++ b/src/sh_edraft/hosting/hosting_environment.py @@ -6,7 +6,7 @@ from sh_edraft.hosting.model.environment_name import EnvironmentName class HostingEnvironment(EnvironmentBase): - def __init__(self, name: EnvironmentName = None, crp: str = './'): + def __init__(self, name: EnvironmentName = EnvironmentName.production, crp: str = './'): EnvironmentBase.__init__(self) self._name: Optional[EnvironmentName] = name diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 6305725a..51137ce0 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -3,7 +3,7 @@ import os import traceback from string import Template -from sh_edraft.hosting.base import ApplicationHostBase +from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model import LoggingSettings from sh_edraft.logging.model.logging_level import LoggingLevel @@ -13,16 +13,16 @@ from sh_edraft.utils.console import Console class Logger(LoggerBase): - def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings, app_host: ApplicationHostBase): + def __init__(self, logging_settings: LoggingSettings, time_format: TimeFormatSettings, app_runtime: ApplicationRuntimeBase): LoggerBase.__init__(self) + self._app_runtime = app_runtime self._log_settings: LoggingSettings = logging_settings self._time_format_settings: TimeFormatSettings = time_format - self._app_host = app_host self._log = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) self._path = self._log_settings.path self._level = self._log_settings.level @@ -47,7 +47,7 @@ class Logger(LoggerBase): if not os.path.exists(self._path): os.mkdir(self._path) except Exception as e: - self.fatal(__name__, 'Cannot create log dir', ex=e) + self._fatal_console(__name__, 'Cannot create log dir', ex=e) """ create new log file """ try: @@ -57,16 +57,19 @@ class Logger(LoggerBase): Console.write_line(f'[{__name__}]: Using log file: {path}') f.close() except Exception as e: - self.fatal(__name__, 'Cannot open log file', ex=e) + self._fatal_console(__name__, 'Cannot open log file', ex=e) def _append_log(self, string): try: # open log file and append always + if not os.path.isdir(self._path): + self._fatal_console(__name__, 'Log directory not found') + with open(self._path + self._log, "a+", encoding="utf-8") as f: f.write(string + '\n') f.close() except Exception as e: - self.error(__name__, f'Cannot append log file, message: {string}', ex=e) + self._fatal_console(__name__, f'Cannot append log file, message: {string}', ex=e) def _get_string(self, name: str, level: LoggingLevel, message: str) -> str: log_level = level.name @@ -156,3 +159,18 @@ class Logger(LoggerBase): Console.write_line(output, 'red') exit() + + def _fatal_console(self, name: str, message: str, ex: Exception = None): + output = '' + if ex is not None: + tb = traceback.format_exc() + self.error(name, message) + output = self._get_string(name, LoggingLevel.ERROR, f'{ex} -> {tb}') + else: + output = self._get_string(name, LoggingLevel.ERROR, message) + + # check if message can be shown in console + if self._console.value >= LoggingLevel.FATAL.value: + Console.write_line(output, 'red') + + exit() diff --git a/src/sh_edraft/service/base/service_provider_base.py b/src/sh_edraft/service/base/service_provider_base.py index d9dfa000..58d3a64f 100644 --- a/src/sh_edraft/service/base/service_provider_base.py +++ b/src/sh_edraft/service/base/service_provider_base.py @@ -18,7 +18,7 @@ class ServiceProviderBase(ServiceBase): def add_scoped(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): pass @abstractmethod - def add_singleton(self, service_type: Type[ServiceBase], service: ServiceBase): pass + def add_singleton(self, service_type: Type[ServiceBase], service: Callable[ServiceBase]): pass @abstractmethod def get_service(self, instance_type: Type[ServiceBase]) -> Callable[ServiceBase]: pass diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index 36548cfe..40173ea0 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -43,7 +43,7 @@ class ServiceProvider(ServiceProviderBase): def add_scoped(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): self._scoped_services[service_type] = service - def add_singleton(self, service_type: Type[ServiceBase], service: ServiceBase): + def add_singleton(self, service_type: Type[ServiceBase], service: Callable[ServiceBase]): for known_service in self._singleton_services: if type(known_service) == type(service_type): raise Exception(f'Service with type {type(service_type)} already exists') diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 69d2796b..5c8a6356 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,7 +1,14 @@ from typing import Optional +from sh_edraft.configuration.base import ConfigurationBase from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase +from sh_edraft.hosting.model import EnvironmentName +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.logging.model import LoggingSettings +from sh_edraft.service.base import ServiceProviderBase +from sh_edraft.time.model import TimeFormatSettings class Program(ApplicationBase): @@ -11,14 +18,44 @@ class Program(ApplicationBase): self._app_host: Optional[ApplicationHost] = None + self._services: Optional[ServiceProviderBase] = None + self._configuration: Optional[ConfigurationBase] = None + def create_application_host(self): self._app_host = ApplicationHost('CPL_DEV_Test') + self._services = self._app_host.services + self._configuration = self._app_host.configuration + + self._app_host.environment.name = EnvironmentName.development def create_configuration(self): - self._app_host.configuration.create() + self._configuration.create() + + log_settings = LoggingSettings() + log_settings.from_dict({ + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }) + + time_format_settings = TimeFormatSettings() + time_format_settings.from_dict({ + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }) + + self._configuration.add_config_by_type(LoggingSettings, log_settings) + self._configuration.add_config_by_type(TimeFormatSettings, time_format_settings) def create_services(self): - self._app_host.services.create() + self._services.create() + self._services.add_singleton(LoggerBase, Logger) + logger: Logger = self._services.get_service(LoggerBase) + logger.create() + logger.header(self._app_host.name) def main(self): print('RUN') From e76b293f605989bd07c0103521908569824aaddb Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 27 Nov 2020 11:24:47 +0100 Subject: [PATCH 24/86] Bugfixes in unittests --- .../configuration/base/configuration_base.py | 4 -- src/sh_edraft/configuration/configuration.py | 4 -- src/sh_edraft/hosting/application_host.py | 9 ++- .../hosting/base/application_host_base.py | 7 ++- src/tests/logging/logger.py | 60 ++++++++++--------- src/tests/publishing/publisher.py | 11 ++-- .../service_providing/service_provider.py | 22 +++---- 7 files changed, 65 insertions(+), 52 deletions(-) diff --git a/src/sh_edraft/configuration/base/configuration_base.py b/src/sh_edraft/configuration/base/configuration_base.py index 06c8bfe8..40c68555 100644 --- a/src/sh_edraft/configuration/base/configuration_base.py +++ b/src/sh_edraft/configuration/base/configuration_base.py @@ -10,10 +10,6 @@ class ConfigurationBase(ABC): @abstractmethod def __init__(self): pass - @property - @abstractmethod - def config(self) -> dict[type, object]: pass - @abstractmethod def add_config_by_type(self, key_type: type, value: object): pass diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index b3743aff..39e1767d 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -11,10 +11,6 @@ class Configuration(ConfigurationBase): self._config: dict[type, object] = {} - @property - def config(self): - return self._config - def create(self): pass def add_config_by_type(self, key_type: type, value: object): diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index f1342626..09eafb99 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -3,6 +3,7 @@ from datetime import datetime from sh_edraft.configuration.configuration import Configuration from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.hosting.hosting_environment import HostingEnvironment from sh_edraft.hosting.application_runtime import ApplicationRuntime @@ -30,13 +31,17 @@ class ApplicationHost(ApplicationHostBase): def name(self) -> str: return self._name + @property + def configuration(self) -> ConfigurationBase: + return self._config + @property def environment(self) -> EnvironmentBase: return self._environment @property - def configuration(self) -> ConfigurationBase: - return self._config + def application_runtime(self) -> ApplicationRuntimeBase: + return self._app_runtime @property def services(self) -> ServiceProviderBase: diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 4e6c88e5..117ec546 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.service.base.service_provider_base import ServiceProviderBase @@ -14,13 +15,17 @@ class ApplicationHostBase(ABC): @abstractmethod def name(self) -> str: pass + @property + @abstractmethod + def configuration(self) -> ConfigurationBase: pass + @property @abstractmethod def environment(self) -> EnvironmentBase: pass @property @abstractmethod - def configuration(self) -> ConfigurationBase: pass + def application_runtime(self) -> ApplicationRuntimeBase: pass @property @abstractmethod diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index e41a1491..1fb3d3a7 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -2,18 +2,24 @@ import os import shutil import unittest from string import Template +from typing import cast -from sh_edraft.hosting import ApplicationHost, HostingEnvironment -from sh_edraft.hosting.model import EnvironmentName +from sh_edraft.hosting import ApplicationHost from sh_edraft.logging import Logger from sh_edraft.logging.model import LoggingSettings +from sh_edraft.service import ServiceProvider from sh_edraft.time.model import TimeFormatSettings class LoggerTest(unittest.TestCase): def setUp(self): - self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) + app_host = ApplicationHost('CPL_Test') + self._app_runtime = app_host.application_runtime + self._config = app_host.configuration + self._config.create() + self._services: ServiceProvider = cast(ServiceProvider, app_host.services) + self._services.create() self._log_settings = LoggingSettings() self._log_settings.from_dict({ @@ -41,25 +47,25 @@ class LoggerTest(unittest.TestCase): def test_create(self): print(f'{__name__}.test_create:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() self.assertTrue(os.path.isdir(self._log_settings.path)) log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) self.assertTrue(os.path.isfile(self._log_settings.path + log_file)) def test_header(self): print(f'{__name__}.test_header:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() logger.header('HeaderTest:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] @@ -75,13 +81,13 @@ class LoggerTest(unittest.TestCase): def test_trace(self): print(f'{__name__}.test_trace:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() logger.trace(__name__, f'{__name__}.test_trace:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] @@ -97,13 +103,13 @@ class LoggerTest(unittest.TestCase): def test_debug(self): print(f'{__name__}.test_debug:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() logger.debug(__name__, f'{__name__}.test_debug:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] @@ -119,13 +125,13 @@ class LoggerTest(unittest.TestCase): def test_info(self): print(f'{__name__}.test_info:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() logger.info(__name__, f'{__name__}.test_info:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] @@ -141,13 +147,13 @@ class LoggerTest(unittest.TestCase): def test_warn(self): print(f'{__name__}.test_warn:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() logger.warn(__name__, f'{__name__}.test_warn:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] @@ -163,13 +169,13 @@ class LoggerTest(unittest.TestCase): def test_error(self): print(f'{__name__}.test_error:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() logger.error(__name__, f'{__name__}.test_error:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] @@ -185,14 +191,14 @@ class LoggerTest(unittest.TestCase): def test_fatal(self): print(f'{__name__}.test_fatal:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) logger.create() with self.assertRaises(SystemExit): logger.fatal(__name__, f'{__name__}.test_fatal:') log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_host.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_host.start_time.strftime(self._time_format_settings.date_time_log_format) + date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), + start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) ) log_content = [] diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index cb721a41..a9e91254 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -15,7 +15,7 @@ from sh_edraft.time.model import TimeFormatSettings class PublisherTest(unittest.TestCase): - def _config(self): + def _configure(self): self._log_settings = LoggingSettings() self._log_settings.from_dict({ "Path": "logs/", @@ -76,10 +76,12 @@ class PublisherTest(unittest.TestCase): }) def setUp(self): - self._config() + self._configure() - self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) - self._logger = Logger(self._log_settings, self._time_format_settings, self._app_host) + app_host = ApplicationHost('CPL_Test') + self._app_runtime = app_host.application_runtime + + self._logger = Logger(self._log_settings, self._time_format_settings, app_host.application_runtime) self._logger.create() def tearDown(self): @@ -92,3 +94,4 @@ class PublisherTest(unittest.TestCase): publisher.create() self.assertTrue(os.path.isdir(self._dist_path)) + self.assertEqual(publisher._publish_settings, self._publish_settings_model) diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py index a6626763..6efbcfbb 100644 --- a/src/tests/service_providing/service_provider.py +++ b/src/tests/service_providing/service_provider.py @@ -1,8 +1,8 @@ import unittest +from collections import Callable +from typing import Type, cast from sh_edraft.hosting import ApplicationHost -from sh_edraft.hosting import HostingEnvironment -from sh_edraft.hosting.model import EnvironmentName from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.logging.model import LoggingSettings @@ -17,8 +17,10 @@ from sh_edraft.time.model import TimeFormatSettings class ServiceProviderTest(unittest.TestCase): def setUp(self): - self._app_host = ApplicationHost('CPL_Test', HostingEnvironment(EnvironmentName.testing, './')) - self._services = self._app_host.services + self._app_host = ApplicationHost('CPL_Test') + self._config = self._app_host.configuration + self._config.create() + self._services: ServiceProvider = cast(ServiceProvider, self._app_host.services) self._services.create() self._log_settings = LoggingSettings() @@ -28,7 +30,7 @@ class ServiceProviderTest(unittest.TestCase): "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" }) - self._services.config.add_config_by_type(LoggingSettings, self._log_settings) + self._config.add_config_by_type(LoggingSettings, self._log_settings) self._time_format_settings = TimeFormatSettings() self._time_format_settings.from_dict({ @@ -37,8 +39,8 @@ class ServiceProviderTest(unittest.TestCase): "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" }) - self._services.config.add_config_by_type(TimeFormatSettings, self._time_format_settings) - self._services.config.add_config_by_type(ApplicationHost, self._app_host) + self._config.add_config_by_type(TimeFormatSettings, self._time_format_settings) + self._config.add_config_by_type(ApplicationHost, self._app_host) self._publish_settings_model = PublishSettingsModel() self._publish_settings_model.from_dict({ @@ -49,7 +51,7 @@ class ServiceProviderTest(unittest.TestCase): "ExcludedFiles": [], "TemplateEnding": "_template.txt", }) - self._services.config.add_config_by_type(PublishSettingsModel, self._publish_settings_model) + self._config.add_config_by_type(PublishSettingsModel, self._publish_settings_model) def _check_general_requirements(self): self.assertIsNotNone(self._services) @@ -61,7 +63,7 @@ class ServiceProviderTest(unittest.TestCase): def test_create(self): print(f'{__name__}.test_create:') - provider = ServiceProvider(self._app_host) + provider = ServiceProvider(self._app_host.application_runtime) self.assertIsNotNone(provider) provider.create() self.assertIsNotNone(provider) @@ -108,7 +110,7 @@ class ServiceProviderTest(unittest.TestCase): self.assertEqual(logger._log_settings, self._log_settings) self.assertEqual(logger._time_format_settings, self._time_format_settings) - self.assertEqual(logger._app_host, self._app_host) + self.assertEqual(logger._app_runtime, self._app_host.application_runtime) def test_add_scoped(self): print(f'{__name__}.test_add_scoped:') From 0df6d469ab94131663b69a9a85d41fea82dc22c6 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 27 Nov 2020 18:12:09 +0100 Subject: [PATCH 25/86] Bugfixes in logger --- src/sh_edraft/logging/logger.py | 4 ++-- src/tests/logging/logger.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 51137ce0..01b58937 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -146,9 +146,9 @@ class Logger(LoggerBase): if ex is not None: tb = traceback.format_exc() self.error(name, message) - output = self._get_string(name, LoggingLevel.ERROR, f'{ex} -> {tb}') + output = self._get_string(name, LoggingLevel.FATAL, f'{ex} -> {tb}') else: - output = self._get_string(name, LoggingLevel.ERROR, message) + output = self._get_string(name, LoggingLevel.FATAL, message) # check if message can be written to log if self._level.value >= LoggingLevel.FATAL.value: diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index 1fb3d3a7..8187ec85 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -210,4 +210,4 @@ class LoggerTest(unittest.TestCase): print('Cannot open log file', e) self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ ERROR ] [ {__name__} ]: {__name__}.test_fatal:\n')) + self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ FATAL ] [ {__name__} ]: {__name__}.test_fatal:\n')) From ff577b121efbab3f45549bd8c54400984cbd457a Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 27 Nov 2020 18:18:07 +0100 Subject: [PATCH 26/86] Bugfixes in app runtime --- src/sh_edraft/hosting/application_runtime.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sh_edraft/hosting/application_runtime.py b/src/sh_edraft/hosting/application_runtime.py index 3252ecbe..e4ce40c1 100644 --- a/src/sh_edraft/hosting/application_runtime.py +++ b/src/sh_edraft/hosting/application_runtime.py @@ -7,22 +7,22 @@ from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBa class ApplicationRuntime(ApplicationRuntimeBase): - def __init__(self, config: ConfigurationBase, runtime: EnvironmentBase): + def __init__(self, config: ConfigurationBase, environment: EnvironmentBase): ApplicationRuntimeBase.__init__(self) - self._app_runtime = runtime + self._environment = environment self._app_configuration = config self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() @property def environment(self) -> EnvironmentBase: - return self._app_runtime - + return self._environment + @property def configuration(self) -> ConfigurationBase: return self._app_configuration - + @property def start_time(self) -> datetime: return self._start_time From 44ffb4e5741ee9352161d5df4fde9b9d21e53f4e Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sat, 28 Nov 2020 15:13:54 +0100 Subject: [PATCH 27/86] Added logic to load config from json & improved hosting and service providing --- .../configuration/base/configuration_base.py | 18 +++- .../base/configuration_model_base.py | 3 + src/sh_edraft/configuration/configuration.py | 100 ++++++++++++++++-- src/sh_edraft/configuration/model/__init__.py | 3 + .../model/configuration_variable_name.py | 12 +++ src/sh_edraft/environment/__init__.py | 3 + src/sh_edraft/environment/base/__init__.py | 3 + .../environment/base/environment_base.py | 45 ++++++++ .../environment/hosting_environment.py | 52 +++++++++ src/sh_edraft/environment/model/__init__.py | 3 + .../model/environment_name.py | 0 src/sh_edraft/hosting/__init__.py | 2 +- src/sh_edraft/hosting/application_host.py | 18 +--- src/sh_edraft/hosting/application_runtime.py | 8 +- src/sh_edraft/hosting/base/__init__.py | 4 +- .../hosting/base/application_host_base.py | 9 -- .../hosting/base/application_runtime_base.py | 5 - .../hosting/base/environment_base.py | 25 ----- src/sh_edraft/hosting/hosting_environment.py | 29 ----- src/sh_edraft/hosting/model/__init__.py | 1 - src/sh_edraft/logging/model/__init__.py | 1 + .../logging/model/logging_settings.py | 13 ++- .../logging/model/logging_settings_name.py | 3 +- src/sh_edraft/service/service_provider.py | 2 +- .../time/model/time_format_settings.py | 3 +- .../time/model/time_format_settings_names.py | 1 - src/tests_dev/appsettings.development.json | 8 ++ src/tests_dev/appsettings.json | 15 +++ src/tests_dev/program.py | 37 ++----- 29 files changed, 285 insertions(+), 141 deletions(-) create mode 100644 src/sh_edraft/configuration/model/__init__.py create mode 100644 src/sh_edraft/configuration/model/configuration_variable_name.py create mode 100644 src/sh_edraft/environment/__init__.py create mode 100644 src/sh_edraft/environment/base/__init__.py create mode 100644 src/sh_edraft/environment/base/environment_base.py create mode 100644 src/sh_edraft/environment/hosting_environment.py create mode 100644 src/sh_edraft/environment/model/__init__.py rename src/sh_edraft/{hosting => environment}/model/environment_name.py (100%) delete mode 100644 src/sh_edraft/hosting/base/environment_base.py delete mode 100644 src/sh_edraft/hosting/hosting_environment.py create mode 100644 src/tests_dev/appsettings.development.json create mode 100644 src/tests_dev/appsettings.json diff --git a/src/sh_edraft/configuration/base/configuration_base.py b/src/sh_edraft/configuration/base/configuration_base.py index 40c68555..bf44a8c1 100644 --- a/src/sh_edraft/configuration/base/configuration_base.py +++ b/src/sh_edraft/configuration/base/configuration_base.py @@ -3,6 +3,7 @@ from collections import Callable from typing import Type from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase +from sh_edraft.environment.base.environment_base import EnvironmentBase class ConfigurationBase(ABC): @@ -10,11 +11,24 @@ class ConfigurationBase(ABC): @abstractmethod def __init__(self): pass + @property @abstractmethod - def add_config_by_type(self, key_type: type, value: object): pass + def environment(self) -> EnvironmentBase: pass @abstractmethod - def get_config_by_type(self, search_type: Type[ConfigurationModelBase]) -> Callable[ConfigurationModelBase]: pass + def add_environment_variables(self, prefix: str): pass + + @abstractmethod + def add_argument_variables(self): pass + + @abstractmethod + def add_json_file(self, name: str, optional: bool = None): pass + + @abstractmethod + def add_configuration(self, key_type: type, value: object): pass + + @abstractmethod + def get_configuration(self, search_type: Type[ConfigurationModelBase]) -> Callable[ConfigurationModelBase]: pass @abstractmethod def create(self): pass diff --git a/src/sh_edraft/configuration/base/configuration_model_base.py b/src/sh_edraft/configuration/base/configuration_model_base.py index 06b65ba5..9772a648 100644 --- a/src/sh_edraft/configuration/base/configuration_model_base.py +++ b/src/sh_edraft/configuration/base/configuration_model_base.py @@ -3,5 +3,8 @@ from abc import ABC, abstractmethod class ConfigurationModelBase(ABC): + @abstractmethod + def __init__(self): pass + @abstractmethod def from_dict(self, settings: dict): pass diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index 39e1767d..8c02be21 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -1,25 +1,113 @@ -from collections import Callable +import json +import os +import sys from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.configuration.model.configuration_variable_name import ConfigurationVariableName +from sh_edraft.environment.base.environment_base import EnvironmentBase +from sh_edraft.environment.hosting_environment import HostingEnvironment +from sh_edraft.utils import Console class Configuration(ConfigurationBase): def __init__(self): - super().__init__() + ConfigurationBase.__init__(self) - self._config: dict[type, object] = {} + self._hosting_environment = HostingEnvironment() + self._config: dict[type, ConfigurationModelBase] = {} - def create(self): pass + @property + def environment(self) -> EnvironmentBase: + return self._hosting_environment - def add_config_by_type(self, key_type: type, value: object): + @staticmethod + def _print_info(name: str, message: str): + Console.write_line(f'[{name}] {message}', 'green') + + @staticmethod + def _print_warn(name: str, message: str): + Console.write_line(f'[{name}] {message}', 'yellow') + + @staticmethod + def _print_error(name: str, message: str): + Console.write_line(f'[{name}] {message}', 'red') + + def _set_variable(self, name: str, value: str): + if name == ConfigurationVariableName.environment.value: + self._hosting_environment.environment_name = value + + elif name == ConfigurationVariableName.name.value: + self._hosting_environment.application_name = value + + elif name == ConfigurationVariableName.customer.value: + self._hosting_environment.customer = value + + def add_environment_variables(self, prefix: str): + for variable in ConfigurationVariableName.to_list(): + var_name = f'{prefix}{variable}' + if var_name in [key.upper() for key in os.environ.keys()]: + self._set_variable(variable, os.environ[var_name]) + + def add_argument_variables(self): + for arg in sys.argv[1:]: + try: + argument = arg.split('--')[1].split('=')[0].upper() + value = arg.split('=')[1] + + if argument not in ConfigurationVariableName.to_list(): + raise Exception(f'Invalid argument name: {argument}') + + self._set_variable(argument, value) + except Exception as e: + self._print_error(__name__, f'Invalid argument: {arg} -> {e}') + exit() + + def add_json_file(self, name: str, optional: bool = None): + if self._hosting_environment.content_root_path.endswith('/') and not name.startswith('/'): + file_path = f'{self._hosting_environment.content_root_path}{name}' + else: + file_path = f'{self._hosting_environment.content_root_path}/{name}' + + if not os.path.isfile(file_path): + if not optional: + self._print_error(__name__, f'File not found: {file_path}') + exit() + + self._print_warn(__name__, f'Not Loaded config file: {file_path}') + return None + + config_from_file = self._load_json_file(file_path) + for sub in ConfigurationModelBase.__subclasses__(): + for key, value in config_from_file.items(): + if sub.__name__ == key: + configuration = sub() + configuration.from_dict(value) + self.add_configuration(sub, configuration) + + def _load_json_file(self, file: str) -> dict: + try: + # open config file, create if not exists + with open(file, encoding='utf-8') as cfg: + # load json + json_cfg = json.load(cfg) + self._print_info(__name__, f'Loaded config file: {file}') + return json_cfg + except Exception as e: + self._print_error(__name__, f'Cannot load config file: {file}! -> {e}') + return {} + + def add_configuration(self, key_type: type, value: object): self._config[key_type] = value - def get_config_by_type(self, search_type: type) -> Callable[ConfigurationModelBase]: + def get_configuration(self, search_type: type) -> ConfigurationModelBase: if search_type not in self._config: raise Exception(f'Config model by type {search_type} not found') for config_model in self._config: if config_model == search_type: return self._config[config_model] + + def create(self): + pass diff --git a/src/sh_edraft/configuration/model/__init__.py b/src/sh_edraft/configuration/model/__init__.py new file mode 100644 index 00000000..a3c9f248 --- /dev/null +++ b/src/sh_edraft/configuration/model/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .configuration_variable_name import ConfigurationVariableName diff --git a/src/sh_edraft/configuration/model/configuration_variable_name.py b/src/sh_edraft/configuration/model/configuration_variable_name.py new file mode 100644 index 00000000..c89deb88 --- /dev/null +++ b/src/sh_edraft/configuration/model/configuration_variable_name.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class ConfigurationVariableName(Enum): + + environment = 'ENVIRONMENT' + name = 'NAME' + customer = 'CUSTOMER' + + @staticmethod + def to_list(): + return [var.value for var in ConfigurationVariableName] diff --git a/src/sh_edraft/environment/__init__.py b/src/sh_edraft/environment/__init__.py new file mode 100644 index 00000000..28c021f3 --- /dev/null +++ b/src/sh_edraft/environment/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .hosting_environment import HostingEnvironment diff --git a/src/sh_edraft/environment/base/__init__.py b/src/sh_edraft/environment/base/__init__.py new file mode 100644 index 00000000..fec6499d --- /dev/null +++ b/src/sh_edraft/environment/base/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .environment_base import EnvironmentBase diff --git a/src/sh_edraft/environment/base/environment_base.py b/src/sh_edraft/environment/base/environment_base.py new file mode 100644 index 00000000..9d78d598 --- /dev/null +++ b/src/sh_edraft/environment/base/environment_base.py @@ -0,0 +1,45 @@ +from abc import ABC, abstractmethod + +from sh_edraft.environment.model.environment_name import EnvironmentName + + +class EnvironmentBase(ABC): + + @abstractmethod + def __init__(self): pass + + @property + @abstractmethod + def environment_name(self) -> EnvironmentName: pass + + @environment_name.setter + @abstractmethod + def environment_name(self, environment_name: EnvironmentName): pass + + @property + @abstractmethod + def application_name(self) -> str: pass + + @application_name.setter + @abstractmethod + def application_name(self, application_name: str): pass + + @property + @abstractmethod + def customer(self) -> str: pass + + @customer.setter + @abstractmethod + def customer(self, customer: str): pass + + @property + @abstractmethod + def content_root_path(self) -> str: pass + + @content_root_path.setter + @abstractmethod + def content_root_path(self, content_root_path: str): pass + + @property + @abstractmethod + def host_name(self) -> str: pass diff --git a/src/sh_edraft/environment/hosting_environment.py b/src/sh_edraft/environment/hosting_environment.py new file mode 100644 index 00000000..3840a3d2 --- /dev/null +++ b/src/sh_edraft/environment/hosting_environment.py @@ -0,0 +1,52 @@ +from socket import gethostname +from typing import Optional + +from sh_edraft.environment.base.environment_base import EnvironmentBase +from sh_edraft.environment.model.environment_name import EnvironmentName + + +class HostingEnvironment(EnvironmentBase): + + def __init__(self, name: EnvironmentName = EnvironmentName.production, crp: str = './'): + EnvironmentBase.__init__(self) + + self._environment_name: Optional[EnvironmentName] = name + self._app_name: Optional[str] = None + self._customer: Optional[str] = None + self._content_root_path: Optional[str] = crp + + @property + def environment_name(self) -> EnvironmentName: + return self._environment_name + + @environment_name.setter + def environment_name(self, environment_name: EnvironmentName): + self._environment_name = environment_name + + @property + def application_name(self) -> str: + return self._app_name if self._app_name is not None else '' + + @application_name.setter + def application_name(self, application_name: str): + self._app_name = application_name + + @property + def customer(self) -> str: + return self._customer if self._customer is not None else '' + + @customer.setter + def customer(self, customer: str): + self._customer = customer + + @property + def content_root_path(self) -> str: + return self._content_root_path + + @content_root_path.setter + def content_root_path(self, content_root_path: str): + self._content_root_path = content_root_path + + @property + def host_name(self): + return gethostname() diff --git a/src/sh_edraft/environment/model/__init__.py b/src/sh_edraft/environment/model/__init__.py new file mode 100644 index 00000000..3204981f --- /dev/null +++ b/src/sh_edraft/environment/model/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .environment_name import EnvironmentName diff --git a/src/sh_edraft/hosting/model/environment_name.py b/src/sh_edraft/environment/model/environment_name.py similarity index 100% rename from src/sh_edraft/hosting/model/environment_name.py rename to src/sh_edraft/environment/model/environment_name.py diff --git a/src/sh_edraft/hosting/__init__.py b/src/sh_edraft/hosting/__init__.py index 2a8b8615..ec999843 100644 --- a/src/sh_edraft/hosting/__init__.py +++ b/src/sh_edraft/hosting/__init__.py @@ -1,4 +1,4 @@ # imports: from .application_host import ApplicationHost -from .hosting_environment import HostingEnvironment +from .application_runtime import ApplicationRuntime diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index 09eafb99..1960b419 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -4,8 +4,6 @@ from datetime import datetime from sh_edraft.configuration.configuration import Configuration from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase -from sh_edraft.hosting.base.environment_base import EnvironmentBase -from sh_edraft.hosting.hosting_environment import HostingEnvironment from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.service.service_provider import ServiceProvider @@ -14,31 +12,19 @@ from sh_edraft.service.base.service_provider_base import ServiceProviderBase class ApplicationHost(ApplicationHostBase): - def __init__(self, name: str): + def __init__(self): ApplicationHostBase.__init__(self) - self._name: str = name - self._args: list[str] = sys.argv - self._config = Configuration() - self._environment = HostingEnvironment() - self._app_runtime = ApplicationRuntime(self._config, self._environment) + self._app_runtime = ApplicationRuntime(self._config) self._services = ServiceProvider(self._app_runtime) self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() - @property - def name(self) -> str: - return self._name - @property def configuration(self) -> ConfigurationBase: return self._config - @property - def environment(self) -> EnvironmentBase: - return self._environment - @property def application_runtime(self) -> ApplicationRuntimeBase: return self._app_runtime diff --git a/src/sh_edraft/hosting/application_runtime.py b/src/sh_edraft/hosting/application_runtime.py index e4ce40c1..5e903bb5 100644 --- a/src/sh_edraft/hosting/application_runtime.py +++ b/src/sh_edraft/hosting/application_runtime.py @@ -1,24 +1,18 @@ from datetime import datetime from sh_edraft.configuration.base.configuration_base import ConfigurationBase -from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase class ApplicationRuntime(ApplicationRuntimeBase): - def __init__(self, config: ConfigurationBase, environment: EnvironmentBase): + def __init__(self, config: ConfigurationBase): ApplicationRuntimeBase.__init__(self) - self._environment = environment self._app_configuration = config self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() - @property - def environment(self) -> EnvironmentBase: - return self._environment - @property def configuration(self) -> ConfigurationBase: return self._app_configuration diff --git a/src/sh_edraft/hosting/base/__init__.py b/src/sh_edraft/hosting/base/__init__.py index 2bafd17e..dfb25a31 100644 --- a/src/sh_edraft/hosting/base/__init__.py +++ b/src/sh_edraft/hosting/base/__init__.py @@ -1,4 +1,4 @@ # imports: -from .application_host_base import ApplicationHostBase -from .environment_base import EnvironmentBase from .application_base import ApplicationBase +from .application_host_base import ApplicationHostBase +from .application_runtime_base import ApplicationRuntimeBase diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 117ec546..4ee8c0f5 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -2,7 +2,6 @@ from abc import ABC, abstractmethod from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase -from sh_edraft.hosting.base.environment_base import EnvironmentBase from sh_edraft.service.base.service_provider_base import ServiceProviderBase @@ -10,19 +9,11 @@ class ApplicationHostBase(ABC): @abstractmethod def __init__(self): pass - - @property - @abstractmethod - def name(self) -> str: pass @property @abstractmethod def configuration(self) -> ConfigurationBase: pass - @property - @abstractmethod - def environment(self) -> EnvironmentBase: pass - @property @abstractmethod def application_runtime(self) -> ApplicationRuntimeBase: pass diff --git a/src/sh_edraft/hosting/base/application_runtime_base.py b/src/sh_edraft/hosting/base/application_runtime_base.py index 8d5ec5cc..fd644270 100644 --- a/src/sh_edraft/hosting/base/application_runtime_base.py +++ b/src/sh_edraft/hosting/base/application_runtime_base.py @@ -2,7 +2,6 @@ from abc import ABC, abstractmethod from datetime import datetime from sh_edraft.configuration.base.configuration_base import ConfigurationBase -from sh_edraft.hosting.base.environment_base import EnvironmentBase class ApplicationRuntimeBase(ABC): @@ -10,10 +9,6 @@ class ApplicationRuntimeBase(ABC): @abstractmethod def __init__(self): pass - @property - @abstractmethod - def environment(self) -> EnvironmentBase: pass - @property @abstractmethod def configuration(self) -> ConfigurationBase: pass diff --git a/src/sh_edraft/hosting/base/environment_base.py b/src/sh_edraft/hosting/base/environment_base.py deleted file mode 100644 index 99cfaa18..00000000 --- a/src/sh_edraft/hosting/base/environment_base.py +++ /dev/null @@ -1,25 +0,0 @@ -from abc import ABC, abstractmethod - -from sh_edraft.hosting.model.environment_name import EnvironmentName - - -class EnvironmentBase(ABC): - - @abstractmethod - def __init__(self): pass - - @property - @abstractmethod - def name(self) -> EnvironmentName: pass - - @name.setter - @abstractmethod - def name(self, name: EnvironmentName): pass - - @property - @abstractmethod - def content_root_path(self) -> str: pass - - @content_root_path.setter - @abstractmethod - def content_root_path(self, content_root_path: str): pass diff --git a/src/sh_edraft/hosting/hosting_environment.py b/src/sh_edraft/hosting/hosting_environment.py deleted file mode 100644 index e1ecc15b..00000000 --- a/src/sh_edraft/hosting/hosting_environment.py +++ /dev/null @@ -1,29 +0,0 @@ -from typing import Optional - -from sh_edraft.hosting.base.environment_base import EnvironmentBase -from sh_edraft.hosting.model.environment_name import EnvironmentName - - -class HostingEnvironment(EnvironmentBase): - - def __init__(self, name: EnvironmentName = EnvironmentName.production, crp: str = './'): - EnvironmentBase.__init__(self) - - self._name: Optional[EnvironmentName] = name - self._content_root_path: Optional[str] = crp - - @property - def name(self) -> EnvironmentName: - return self._name - - @name.setter - def name(self, name: EnvironmentName): - self._name = name - - @property - def content_root_path(self) -> str: - return self._content_root_path - - @content_root_path.setter - def content_root_path(self, content_root_path: str): - self._content_root_path = content_root_path diff --git a/src/sh_edraft/hosting/model/__init__.py b/src/sh_edraft/hosting/model/__init__.py index b8692da2..52f86f25 100644 --- a/src/sh_edraft/hosting/model/__init__.py +++ b/src/sh_edraft/hosting/model/__init__.py @@ -1,2 +1 @@ # imports: -from .environment_name import EnvironmentName \ No newline at end of file diff --git a/src/sh_edraft/logging/model/__init__.py b/src/sh_edraft/logging/model/__init__.py index 6712752d..8c8ce494 100644 --- a/src/sh_edraft/logging/model/__init__.py +++ b/src/sh_edraft/logging/model/__init__.py @@ -22,6 +22,7 @@ from collections import namedtuple # imports: from .logging_level import LoggingLevel from .logging_settings import LoggingSettings +from .logging_settings_name import LoggingSettingsName VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/logging/model/logging_settings.py b/src/sh_edraft/logging/model/logging_settings.py index c5d1d77e..47889dea 100644 --- a/src/sh_edraft/logging/model/logging_settings.py +++ b/src/sh_edraft/logging/model/logging_settings.py @@ -2,7 +2,7 @@ import traceback from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase -from sh_edraft.logging.model.logging_settings_name import LogSettingsName +from sh_edraft.logging.model.logging_settings_name import LoggingSettingsName from sh_edraft.utils.console import Console from sh_edraft.logging.model.logging_level import LoggingLevel @@ -11,7 +11,6 @@ class LoggingSettings(ConfigurationModelBase): def __init__(self): ConfigurationModelBase.__init__(self) - self._path: Optional[str] = None self._filename: Optional[str] = None self._console: Optional[LoggingLevel] = None @@ -51,10 +50,10 @@ class LoggingSettings(ConfigurationModelBase): def from_dict(self, settings: dict): try: - self._path = settings[LogSettingsName.path.value] - self._filename = settings[LogSettingsName.filename.value] - self._console = LoggingLevel[settings[LogSettingsName.console_level.value]] - self._level = LoggingLevel[settings[LogSettingsName.file_level.value]] + self._path = settings[LoggingSettingsName.path.value] + self._filename = settings[LoggingSettingsName.filename.value] + self._console = LoggingLevel[settings[LoggingSettingsName.console_level.value]] + self._level = LoggingLevel[settings[LoggingSettingsName.file_level.value]] except Exception as e: - Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {LogSettingsName.log.value} settings', 'red') + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings', 'red') Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') diff --git a/src/sh_edraft/logging/model/logging_settings_name.py b/src/sh_edraft/logging/model/logging_settings_name.py index 3bd90037..323e5735 100644 --- a/src/sh_edraft/logging/model/logging_settings_name.py +++ b/src/sh_edraft/logging/model/logging_settings_name.py @@ -1,9 +1,8 @@ from enum import Enum -class LogSettingsName(Enum): +class LoggingSettingsName(Enum): - log = 'Log' path = 'Path' filename = 'Filename' console_level = 'ConsoleLogLevel' diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/service_provider.py index 40173ea0..4207b0f5 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/service_provider.py @@ -33,7 +33,7 @@ class ServiceProvider(ServiceProviderBase): params.append(self.get_service(parameter.annotation)) elif issubclass(parameter.annotation, ConfigurationModelBase): - params.append(self._app_runtime.configuration.get_config_by_type(parameter.annotation)) + params.append(self._app_runtime.configuration.get_configuration(parameter.annotation)) return service(*params) diff --git a/src/sh_edraft/time/model/time_format_settings.py b/src/sh_edraft/time/model/time_format_settings.py index f092e27b..64508ef2 100644 --- a/src/sh_edraft/time/model/time_format_settings.py +++ b/src/sh_edraft/time/model/time_format_settings.py @@ -9,6 +9,7 @@ from sh_edraft.utils.console import Console class TimeFormatSettings(ConfigurationModelBase): def __init__(self): + ConfigurationModelBase.__init__(self) self._date_format: Optional[str] = None self._time_format: Optional[str] = None self._date_time_format: Optional[str] = None @@ -55,5 +56,5 @@ class TimeFormatSettings(ConfigurationModelBase): self._date_time_format = settings[TimeFormatSettingsNames.date_time_format.value] self._date_time_log_format = settings[TimeFormatSettingsNames.date_time_log_format.value] except Exception as e: - Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {TimeFormatSettingsNames.formats.value} settings') + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings') Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') diff --git a/src/sh_edraft/time/model/time_format_settings_names.py b/src/sh_edraft/time/model/time_format_settings_names.py index 4afc21cd..3858de10 100644 --- a/src/sh_edraft/time/model/time_format_settings_names.py +++ b/src/sh_edraft/time/model/time_format_settings_names.py @@ -3,7 +3,6 @@ from enum import Enum class TimeFormatSettingsNames(Enum): - formats = 'TimeFormats' date_format = 'DateFormat' time_format = 'TimeFormat' date_time_format = 'DateTimeFormat' diff --git a/src/tests_dev/appsettings.development.json b/src/tests_dev/appsettings.development.json new file mode 100644 index 00000000..62ec6c61 --- /dev/null +++ b/src/tests_dev/appsettings.development.json @@ -0,0 +1,8 @@ +{ + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + } +} \ No newline at end of file diff --git a/src/tests_dev/appsettings.json b/src/tests_dev/appsettings.json new file mode 100644 index 00000000..fd8ddf6c --- /dev/null +++ b/src/tests_dev/appsettings.json @@ -0,0 +1,15 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "ERROR", + "FileLogLevel": "WARN" + } +} \ No newline at end of file diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 5c8a6356..7d4e7494 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -3,12 +3,9 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase -from sh_edraft.hosting.model import EnvironmentName from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase -from sh_edraft.logging.model import LoggingSettings from sh_edraft.service.base import ServiceProviderBase -from sh_edraft.time.model import TimeFormatSettings class Program(ApplicationBase): @@ -22,40 +19,28 @@ class Program(ApplicationBase): self._configuration: Optional[ConfigurationBase] = None def create_application_host(self): - self._app_host = ApplicationHost('CPL_DEV_Test') + self._app_host = ApplicationHost() self._services = self._app_host.services self._configuration = self._app_host.configuration - self._app_host.environment.name = EnvironmentName.development - def create_configuration(self): self._configuration.create() - - log_settings = LoggingSettings() - log_settings.from_dict({ - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "TRACE", - "FileLogLevel": "TRACE" - }) - - time_format_settings = TimeFormatSettings() - time_format_settings.from_dict({ - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }) - - self._configuration.add_config_by_type(LoggingSettings, log_settings) - self._configuration.add_config_by_type(TimeFormatSettings, time_format_settings) + self._configuration.add_environment_variables('PYTHON_') + self._configuration.add_environment_variables('CPL_') + self._configuration.add_argument_variables() + self._configuration.add_json_file(f'appsettings.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) def create_services(self): self._services.create() self._services.add_singleton(LoggerBase, Logger) logger: Logger = self._services.get_service(LoggerBase) logger.create() - logger.header(self._app_host.name) + logger.header(f'{self._configuration.environment.application_name}:') + logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') def main(self): print('RUN') From b14446272abdd7b9bfe7ff5913f143fa3173a48a Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 29 Nov 2020 11:32:35 +0100 Subject: [PATCH 28/86] Improved configuration and testing --- src/sh_edraft/configuration/configuration.py | 2 +- src/sh_edraft/publishing/model/__init__.py | 2 +- .../model/publish_settings_model.py | 2 +- src/sh_edraft/publishing/publisher.py | 6 +-- src/tests/appsettings.development.json | 8 +++ src/tests/appsettings.json | 15 ++++++ src/tests/appsettings.testing.json | 17 ++++++ src/tests/publishing/publisher.py | 4 +- .../service_providing/service_provider.py | 54 +++++-------------- src/tests/tester.py | 22 ++++---- 10 files changed, 73 insertions(+), 59 deletions(-) create mode 100644 src/tests/appsettings.development.json create mode 100644 src/tests/appsettings.json create mode 100644 src/tests/appsettings.testing.json diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index 8c02be21..0b311d6e 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -98,7 +98,7 @@ class Configuration(ConfigurationBase): self._print_error(__name__, f'Cannot load config file: {file}! -> {e}') return {} - def add_configuration(self, key_type: type, value: object): + def add_configuration(self, key_type: type, value: ConfigurationModelBase): self._config[key_type] = value def get_configuration(self, search_type: type) -> ConfigurationModelBase: diff --git a/src/sh_edraft/publishing/model/__init__.py b/src/sh_edraft/publishing/model/__init__.py index 4017b71c..98f26949 100644 --- a/src/sh_edraft/publishing/model/__init__.py +++ b/src/sh_edraft/publishing/model/__init__.py @@ -22,7 +22,7 @@ from collections import namedtuple # imports: from .template import Template from .template_enum import TemplateEnum -from .publish_settings_model import PublishSettingsModel +from .publish_settings_model import PublishSettings from .publish_settings_name import PublishSettingsName VersionInfo = namedtuple('VersionInfo', 'major minor micro') diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index 898d01d9..3886262d 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -7,7 +7,7 @@ from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName from sh_edraft.utils import Console -class PublishSettingsModel(ConfigurationModelBase): +class PublishSettings(ConfigurationModelBase): def __init__(self): ConfigurationModelBase.__init__(self) diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 573c11f5..2e922f36 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -4,17 +4,17 @@ from string import Template as stringTemplate from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publishing.base.publisher_base import PublisherBase -from sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel +from sh_edraft.publishing.model.publish_settings_model import PublishSettings from sh_edraft.publishing.model.template import Template class Publisher(PublisherBase): - def __init__(self, logger: LoggerBase, publish_settings: PublishSettingsModel): + def __init__(self, logger: LoggerBase, publish_settings: PublishSettings): PublisherBase.__init__(self) self._logger: LoggerBase = logger - self._publish_settings: PublishSettingsModel = publish_settings + self._publish_settings: PublishSettings = publish_settings @property def source_path(self) -> str: diff --git a/src/tests/appsettings.development.json b/src/tests/appsettings.development.json new file mode 100644 index 00000000..62ec6c61 --- /dev/null +++ b/src/tests/appsettings.development.json @@ -0,0 +1,8 @@ +{ + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + } +} \ No newline at end of file diff --git a/src/tests/appsettings.json b/src/tests/appsettings.json new file mode 100644 index 00000000..fd8ddf6c --- /dev/null +++ b/src/tests/appsettings.json @@ -0,0 +1,15 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "ERROR", + "FileLogLevel": "WARN" + } +} \ No newline at end of file diff --git a/src/tests/appsettings.testing.json b/src/tests/appsettings.testing.json new file mode 100644 index 00000000..3b586a2c --- /dev/null +++ b/src/tests/appsettings.testing.json @@ -0,0 +1,17 @@ +{ + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }, + + "PublishSettings": { + "SourcePath": "../", + "DistPath": "../../dist", + "Templates": [], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt" + } +} \ No newline at end of file diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index a9e91254..47bc67b2 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -8,7 +8,7 @@ from sh_edraft.logging import Logger from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher from sh_edraft.publishing.model import Template -from sh_edraft.publishing.model import PublishSettingsModel +from sh_edraft.publishing.model import PublishSettings from sh_edraft.coding.model import Version from sh_edraft.time.model import TimeFormatSettings @@ -65,7 +65,7 @@ class PublisherTest(unittest.TestCase): self._source_path = '../' self._dist_path = '../../dist' - self._publish_settings_model = PublishSettingsModel() + self._publish_settings_model = PublishSettings() self._publish_settings_model.from_dict({ "SourcePath": self._source_path, "DistPath": self._dist_path, diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py index 6efbcfbb..4ddc5734 100644 --- a/src/tests/service_providing/service_provider.py +++ b/src/tests/service_providing/service_provider.py @@ -1,58 +1,30 @@ import unittest -from collections import Callable -from typing import Type, cast +from typing import cast from sh_edraft.hosting import ApplicationHost from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase -from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher from sh_edraft.publishing.base import PublisherBase -from sh_edraft.publishing.model import PublishSettingsModel from sh_edraft.service import ServiceProvider from sh_edraft.service.base import ServiceBase -from sh_edraft.time.model import TimeFormatSettings class ServiceProviderTest(unittest.TestCase): def setUp(self): - self._app_host = ApplicationHost('CPL_Test') + self._app_host = ApplicationHost() self._config = self._app_host.configuration self._config.create() + self._config.add_environment_variables('PYTHON_') + self._config.add_environment_variables('CPL_') + self._config.add_argument_variables() + self._config.add_json_file(f'appsettings.json') + self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') + self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json', optional=True) self._services: ServiceProvider = cast(ServiceProvider, self._app_host.services) self._services.create() - self._log_settings = LoggingSettings() - self._log_settings.from_dict({ - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "TRACE", - "FileLogLevel": "TRACE" - }) - self._config.add_config_by_type(LoggingSettings, self._log_settings) - - self._time_format_settings = TimeFormatSettings() - self._time_format_settings.from_dict({ - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }) - self._config.add_config_by_type(TimeFormatSettings, self._time_format_settings) - self._config.add_config_by_type(ApplicationHost, self._app_host) - - self._publish_settings_model = PublishSettingsModel() - self._publish_settings_model.from_dict({ - "SourcePath": "../", - "DistPath": "../../dist", - "Templates": [], - "IncludedFiles": [], - "ExcludedFiles": [], - "TemplateEnding": "_template.txt", - }) - self._config.add_config_by_type(PublishSettingsModel, self._publish_settings_model) - def _check_general_requirements(self): self.assertIsNotNone(self._services) @@ -79,7 +51,9 @@ class ServiceProviderTest(unittest.TestCase): for service_type in self._services._singleton_services: service = self._services._singleton_services[service_type] if service_type == LoggerBase and ( - isinstance(service, Logger) and isinstance(service, LoggerBase) and isinstance(service, ServiceBase) + isinstance(service, Logger) and + isinstance(service, LoggerBase) and + isinstance(service, ServiceBase) ): if not found: found = True @@ -90,7 +64,9 @@ class ServiceProviderTest(unittest.TestCase): for service_type in self._services._singleton_services: service = self._services._singleton_services[service_type] if service_type == PublisherBase and ( - isinstance(service, Publisher) and isinstance(service, PublisherBase) and isinstance(service, ServiceBase) + isinstance(service, Publisher) and + isinstance(service, PublisherBase) and + isinstance(service, ServiceBase) ): if not found: found = True @@ -108,8 +84,6 @@ class ServiceProviderTest(unittest.TestCase): self.assertTrue(isinstance(logger, LoggerBase)) self.assertTrue(isinstance(logger, ServiceBase)) - self.assertEqual(logger._log_settings, self._log_settings) - self.assertEqual(logger._time_format_settings, self._time_format_settings) self.assertEqual(logger._app_runtime, self._app_host.application_runtime) def test_add_scoped(self): diff --git a/src/tests/tester.py b/src/tests/tester.py index dfb11e49..f5326d02 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,7 +1,7 @@ import unittest -from tests.logging.logger import LoggerTest -from tests.publishing.publisher import PublisherTest +# from tests.logging.logger import LoggerTest +# from tests.publishing.publisher import PublisherTest from tests.service_providing.service_provider import ServiceProviderTest @@ -21,17 +21,17 @@ class Tester: self._suite.addTest(ServiceProviderTest('test_get_transient')) # logging - self._suite.addTest(LoggerTest('test_create')) - self._suite.addTest(LoggerTest('test_header')) - self._suite.addTest(LoggerTest('test_trace')) - self._suite.addTest(LoggerTest('test_debug')) - self._suite.addTest(LoggerTest('test_info')) - self._suite.addTest(LoggerTest('test_warn')) - self._suite.addTest(LoggerTest('test_error')) - self._suite.addTest(LoggerTest('test_fatal')) + # self._suite.addTest(LoggerTest('test_create')) + # self._suite.addTest(LoggerTest('test_header')) + # self._suite.addTest(LoggerTest('test_trace')) + # self._suite.addTest(LoggerTest('test_debug')) + # self._suite.addTest(LoggerTest('test_info')) + # self._suite.addTest(LoggerTest('test_warn')) + # self._suite.addTest(LoggerTest('test_error')) + # self._suite.addTest(LoggerTest('test_fatal')) # publishing - self._suite.addTest(PublisherTest('test_create')) + # self._suite.addTest(PublisherTest('test_create')) def start(self): runner = unittest.TextTestRunner() From fea84418d3db97da0ccc3ea8b79be49ba6952bde Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 29 Nov 2020 16:38:58 +0100 Subject: [PATCH 29/86] Fixed testing errors --- src/tests/logging/logger.py | 31 ++++++++++--------------- src/tests/publishing/publisher.py | 38 +++++++++++++------------------ src/tests/tester.py | 22 +++++++++--------- 3 files changed, 39 insertions(+), 52 deletions(-) diff --git a/src/tests/logging/logger.py b/src/tests/logging/logger.py index 8187ec85..4a17331e 100644 --- a/src/tests/logging/logger.py +++ b/src/tests/logging/logger.py @@ -14,28 +14,21 @@ from sh_edraft.time.model import TimeFormatSettings class LoggerTest(unittest.TestCase): def setUp(self): - app_host = ApplicationHost('CPL_Test') - self._app_runtime = app_host.application_runtime - self._config = app_host.configuration + self._app_host = ApplicationHost() + self._config = self._app_host.configuration self._config.create() - self._services: ServiceProvider = cast(ServiceProvider, app_host.services) + self._config.add_environment_variables('PYTHON_') + self._config.add_environment_variables('CPL_') + self._config.add_argument_variables() + self._config.add_json_file(f'appsettings.json') + self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') + self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json', optional=True) + self._services: ServiceProvider = cast(ServiceProvider, self._app_host.services) self._services.create() - self._log_settings = LoggingSettings() - self._log_settings.from_dict({ - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "TRACE", - "FileLogLevel": "TRACE" - }) - - self._time_format_settings = TimeFormatSettings() - self._time_format_settings.from_dict({ - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }) + self._app_runtime = self._app_host.application_runtime + self._log_settings: LoggingSettings = self._config.get_configuration(LoggingSettings) + self._time_format_settings: TimeFormatSettings = self._config.get_configuration(TimeFormatSettings) def tearDown(self): if os.path.isdir(self._log_settings.path): diff --git a/src/tests/publishing/publisher.py b/src/tests/publishing/publisher.py index 47bc67b2..4e87c8c1 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/publishing/publisher.py @@ -2,8 +2,7 @@ import os import shutil import unittest -from sh_edraft.hosting import ApplicationHost, HostingEnvironment -from sh_edraft.hosting.model import EnvironmentName +from sh_edraft.hosting import ApplicationHost from sh_edraft.logging import Logger from sh_edraft.logging.model import LoggingSettings from sh_edraft.publishing import Publisher @@ -16,22 +15,6 @@ from sh_edraft.time.model import TimeFormatSettings class PublisherTest(unittest.TestCase): def _configure(self): - self._log_settings = LoggingSettings() - self._log_settings.from_dict({ - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "TRACE", - "FileLogLevel": "TRACE" - }) - - self._time_format_settings = TimeFormatSettings() - self._time_format_settings.from_dict({ - "DateFormat": "%Y-%m-%d", - "TimeFormat": "%H:%M:%S", - "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", - "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" - }) - self._version = Version(2020, 12, 5).to_dict() templates = [ Template( @@ -76,12 +59,23 @@ class PublisherTest(unittest.TestCase): }) def setUp(self): + self._app_host = ApplicationHost() + self._config = self._app_host.configuration + self._config.create() + self._config.add_environment_variables('PYTHON_') + self._config.add_environment_variables('CPL_') + self._config.add_argument_variables() + self._config.add_json_file(f'appsettings.json') + self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') + self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json', optional=True) + + self._app_runtime = self._app_host.application_runtime + self._configure() - app_host = ApplicationHost('CPL_Test') - self._app_runtime = app_host.application_runtime - - self._logger = Logger(self._log_settings, self._time_format_settings, app_host.application_runtime) + self._log_settings: LoggingSettings = self._config.get_configuration(LoggingSettings) + self._time_format_settings: TimeFormatSettings = self._config.get_configuration(TimeFormatSettings) + self._logger = Logger(self._log_settings, self._time_format_settings, self._app_host.application_runtime) self._logger.create() def tearDown(self): diff --git a/src/tests/tester.py b/src/tests/tester.py index f5326d02..dfb11e49 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,7 +1,7 @@ import unittest -# from tests.logging.logger import LoggerTest -# from tests.publishing.publisher import PublisherTest +from tests.logging.logger import LoggerTest +from tests.publishing.publisher import PublisherTest from tests.service_providing.service_provider import ServiceProviderTest @@ -21,17 +21,17 @@ class Tester: self._suite.addTest(ServiceProviderTest('test_get_transient')) # logging - # self._suite.addTest(LoggerTest('test_create')) - # self._suite.addTest(LoggerTest('test_header')) - # self._suite.addTest(LoggerTest('test_trace')) - # self._suite.addTest(LoggerTest('test_debug')) - # self._suite.addTest(LoggerTest('test_info')) - # self._suite.addTest(LoggerTest('test_warn')) - # self._suite.addTest(LoggerTest('test_error')) - # self._suite.addTest(LoggerTest('test_fatal')) + self._suite.addTest(LoggerTest('test_create')) + self._suite.addTest(LoggerTest('test_header')) + self._suite.addTest(LoggerTest('test_trace')) + self._suite.addTest(LoggerTest('test_debug')) + self._suite.addTest(LoggerTest('test_info')) + self._suite.addTest(LoggerTest('test_warn')) + self._suite.addTest(LoggerTest('test_error')) + self._suite.addTest(LoggerTest('test_fatal')) # publishing - # self._suite.addTest(PublisherTest('test_create')) + self._suite.addTest(PublisherTest('test_create')) def start(self): runner = unittest.TextTestRunner() From 16516b7fe635f96b42547eb6bb66cbc3357aee0a Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 29 Nov 2020 17:29:16 +0100 Subject: [PATCH 30/86] Improved testing --- src/sh_edraft/configuration/configuration.py | 3 +- .../environment/base/environment_base.py | 6 +- .../environment/hosting_environment.py | 8 +- src/sh_edraft/hosting/application_host.py | 1 - src/sh_edraft/service/__init__.py | 4 +- src/sh_edraft/service/base/__init__.py | 4 +- src/sh_edraft/service/model/__init__.py | 4 +- src/tests/appsettings.edrafts-pc.json | 8 ++ .../{logging => configuration}/__init__.py | 0 src/tests/configuration/config.py | 93 +++++++++++++++++++ src/tests/{publishing => hosting}/__init__.py | 0 src/tests/hosting/app_host.py | 33 +++++++ src/tests/services/__init__.py | 0 src/tests/services/logging/__init__.py | 0 src/tests/{ => services}/logging/logger.py | 0 src/tests/services/publishing/__init__.py | 0 .../{ => services}/publishing/publisher.py | 1 + src/tests/tester.py | 18 +++- src/tests_dev/program.py | 17 ++-- 19 files changed, 173 insertions(+), 27 deletions(-) create mode 100644 src/tests/appsettings.edrafts-pc.json rename src/tests/{logging => configuration}/__init__.py (100%) create mode 100644 src/tests/configuration/config.py rename src/tests/{publishing => hosting}/__init__.py (100%) create mode 100644 src/tests/hosting/app_host.py create mode 100644 src/tests/services/__init__.py create mode 100644 src/tests/services/logging/__init__.py rename src/tests/{ => services}/logging/logger.py (100%) create mode 100644 src/tests/services/publishing/__init__.py rename src/tests/{ => services}/publishing/publisher.py (98%) diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index 0b311d6e..dc0ef33f 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -7,6 +7,7 @@ from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.configuration.model.configuration_variable_name import ConfigurationVariableName from sh_edraft.environment.base.environment_base import EnvironmentBase from sh_edraft.environment.hosting_environment import HostingEnvironment +from sh_edraft.environment.model import EnvironmentName from sh_edraft.utils import Console @@ -36,7 +37,7 @@ class Configuration(ConfigurationBase): def _set_variable(self, name: str, value: str): if name == ConfigurationVariableName.environment.value: - self._hosting_environment.environment_name = value + self._hosting_environment.environment_name = EnvironmentName(value) elif name == ConfigurationVariableName.name.value: self._hosting_environment.application_name = value diff --git a/src/sh_edraft/environment/base/environment_base.py b/src/sh_edraft/environment/base/environment_base.py index 9d78d598..f5dc9266 100644 --- a/src/sh_edraft/environment/base/environment_base.py +++ b/src/sh_edraft/environment/base/environment_base.py @@ -1,7 +1,5 @@ from abc import ABC, abstractmethod -from sh_edraft.environment.model.environment_name import EnvironmentName - class EnvironmentBase(ABC): @@ -10,11 +8,11 @@ class EnvironmentBase(ABC): @property @abstractmethod - def environment_name(self) -> EnvironmentName: pass + def environment_name(self) -> str: pass @environment_name.setter @abstractmethod - def environment_name(self, environment_name: EnvironmentName): pass + def environment_name(self, environment_name: str): pass @property @abstractmethod diff --git a/src/sh_edraft/environment/hosting_environment.py b/src/sh_edraft/environment/hosting_environment.py index 3840a3d2..2f2021ff 100644 --- a/src/sh_edraft/environment/hosting_environment.py +++ b/src/sh_edraft/environment/hosting_environment.py @@ -16,12 +16,12 @@ class HostingEnvironment(EnvironmentBase): self._content_root_path: Optional[str] = crp @property - def environment_name(self) -> EnvironmentName: - return self._environment_name + def environment_name(self) -> str: + return str(self._environment_name.value) @environment_name.setter - def environment_name(self, environment_name: EnvironmentName): - self._environment_name = environment_name + def environment_name(self, environment_name: str): + self._environment_name = EnvironmentName(environment_name) @property def application_name(self) -> str: diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index 1960b419..e5e6b362 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,4 +1,3 @@ -import sys from datetime import datetime from sh_edraft.configuration.configuration import Configuration diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index dbc93593..52003f0b 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.service +sh_edraft.services ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.service """ -__title__ = 'sh_edraft.service' +__title__ = 'sh_edraft.services' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index e2c43c24..6ce7f45b 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.service.base +sh_edraft.services.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.service.base """ -__title__ = 'sh_edraft.service.base' +__title__ = 'sh_edraft.services.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py index 96c24ada..b95fe3c2 100644 --- a/src/sh_edraft/service/model/__init__.py +++ b/src/sh_edraft/service/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.service.base +sh_edraft.services.base ~~~~~~~~~~~~~~~~~~~ @@ -11,7 +11,7 @@ sh_edraft.service.base """ -__title__ = 'sh_edraft.service.base' +__title__ = 'sh_edraft.services.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' diff --git a/src/tests/appsettings.edrafts-pc.json b/src/tests/appsettings.edrafts-pc.json new file mode 100644 index 00000000..62ec6c61 --- /dev/null +++ b/src/tests/appsettings.edrafts-pc.json @@ -0,0 +1,8 @@ +{ + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + } +} \ No newline at end of file diff --git a/src/tests/logging/__init__.py b/src/tests/configuration/__init__.py similarity index 100% rename from src/tests/logging/__init__.py rename to src/tests/configuration/__init__.py diff --git a/src/tests/configuration/config.py b/src/tests/configuration/config.py new file mode 100644 index 00000000..27218978 --- /dev/null +++ b/src/tests/configuration/config.py @@ -0,0 +1,93 @@ +import os +import unittest +from typing import cast + +from sh_edraft.configuration import Configuration +from sh_edraft.environment.model import EnvironmentName +from sh_edraft.hosting import ApplicationHost +from sh_edraft.logging.model import LoggingSettings, LoggingLevel +from sh_edraft.publishing.model import PublishSettings +from sh_edraft.time.model import TimeFormatSettings + + +class ConfigTest(unittest.TestCase): + + def setUp(self): + self._app_host = ApplicationHost() + self._config = cast(Configuration, self._app_host.configuration) + + def test_create(self): + print(f'{__name__}.test_create:') + self.assertIsNotNone(self._config) + self._config.create() + self.assertIsNotNone(self._config) + + self.assertEqual(len(self._config._config), 0) + self.assertIsNotNone(self._app_host.application_runtime) + + def test_env_vars(self): + print(f'{__name__}.test_env_vars:') + self._config.add_environment_variables('PYTHON_') + self._config.add_environment_variables('CPL_') + + def test_arguments(self): + print(f'{__name__}.test_arguments:') + self._config.add_argument_variables() + self.assertEqual(self._config.environment.environment_name, EnvironmentName.testing.value) + + def test_appsettings(self): + print(f'{__name__}.test_appsettings:') + self._config.add_json_file(f'appsettings.json') + + time_formats: TimeFormatSettings = cast(TimeFormatSettings, self._config.get_configuration(TimeFormatSettings)) + self.assertIsNotNone(time_formats) + self.assertEqual(time_formats.date_format, '%Y-%m-%d') + self.assertEqual(time_formats.time_format, '%H:%M:%S') + self.assertEqual(time_formats.date_time_format, '%Y-%m-%d %H:%M:%S.%f') + self.assertEqual(time_formats.date_time_log_format, '%Y-%m-%d_%H-%M-%S') + + logging = cast(LoggingSettings, self._config.get_configuration(LoggingSettings)) + self.assertIsNotNone(logging) + self.assertEqual(logging.path, 'logs/') + self.assertEqual(logging.filename, 'log_$start_time.log') + self.assertEqual(logging.console.value, LoggingLevel.ERROR.value) + self.assertEqual(logging.level.value, LoggingLevel.WARN.value) + + with self.assertRaises(Exception): + publish: PublishSettings = cast(PublishSettings, self._config.get_configuration(PublishSettings)) + + def test_appsettings_environment(self): + print(f'{__name__}.test_appsettings_environment:') + self._config.add_argument_variables() + self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') + + logging = cast(LoggingSettings, self._config.get_configuration(LoggingSettings)) + self.assertIsNotNone(logging) + self.assertEqual(logging.path, 'logs/') + self.assertEqual(logging.filename, 'log_$start_time.log') + self.assertEqual(logging.console.value, LoggingLevel.TRACE.value) + self.assertEqual(logging.level.value, LoggingLevel.TRACE.value) + + publish: PublishSettings = cast(PublishSettings, self._config.get_configuration(PublishSettings)) + self.assertIsNotNone(publish) + self.assertEqual(publish.source_path, '../') + self.assertEqual(publish.dist_path, '../../dist') + self.assertEqual(publish.templates, []) + self.assertEqual(publish.included_files, []) + self.assertEqual(publish.excluded_files, []) + self.assertEqual(publish.template_ending, '_template.txt') + + def test_appsettings_host(self): + print(f'{__name__}.test_appsettings_host:') + self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json') + + def test_appsettings_customer(self): + print(f'{__name__}.test_appsettings_customer:') + file_name = f'appsettings.{self._config.environment.customer}.json' + with self.assertRaises(SystemExit): + if os.path.isfile(f'{self._config.environment.content_root_path}/{file_name}'): + os.remove(f'{self._config.environment.content_root_path}/{file_name}') + + self._config.add_json_file(file_name) + + self._config.add_json_file(file_name, optional=True) diff --git a/src/tests/publishing/__init__.py b/src/tests/hosting/__init__.py similarity index 100% rename from src/tests/publishing/__init__.py rename to src/tests/hosting/__init__.py diff --git a/src/tests/hosting/app_host.py b/src/tests/hosting/app_host.py new file mode 100644 index 00000000..ec940481 --- /dev/null +++ b/src/tests/hosting/app_host.py @@ -0,0 +1,33 @@ +import unittest +import datetime + +from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting.base import ApplicationRuntimeBase +from sh_edraft.service.base import ServiceProviderBase + + +class AppHostTest(unittest.TestCase): + + def setUp(self): + pass + + def test_create(self): + print(f'{__name__}.test_create:') + app_host = ApplicationHost() + self.assertIsNotNone(app_host) + app_host.create() + + self.assertIsNotNone(app_host.configuration) + self.assertTrue(isinstance(app_host.configuration, ConfigurationBase)) + + self.assertIsNotNone(app_host.application_runtime) + self.assertTrue(isinstance(app_host.application_runtime, ApplicationRuntimeBase)) + + self.assertIsNotNone(app_host.services) + self.assertTrue(isinstance(app_host.services, ServiceProviderBase)) + + self.assertIsNotNone(app_host._start_time) + self.assertTrue(isinstance(app_host._start_time, datetime.datetime)) + self.assertIsNotNone(app_host._end_time) + self.assertTrue(isinstance(app_host._end_time, datetime.datetime)) diff --git a/src/tests/services/__init__.py b/src/tests/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/services/logging/__init__.py b/src/tests/services/logging/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/logging/logger.py b/src/tests/services/logging/logger.py similarity index 100% rename from src/tests/logging/logger.py rename to src/tests/services/logging/logger.py diff --git a/src/tests/services/publishing/__init__.py b/src/tests/services/publishing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/publishing/publisher.py b/src/tests/services/publishing/publisher.py similarity index 98% rename from src/tests/publishing/publisher.py rename to src/tests/services/publishing/publisher.py index 4e87c8c1..afb17eaa 100644 --- a/src/tests/publishing/publisher.py +++ b/src/tests/services/publishing/publisher.py @@ -83,6 +83,7 @@ class PublisherTest(unittest.TestCase): shutil.rmtree(self._log_settings.path) def test_create(self): + print(f'{__name__}.test_create:') publisher: Publisher = Publisher(self._logger, self._publish_settings_model) self.assertIsNotNone(publisher) diff --git a/src/tests/tester.py b/src/tests/tester.py index dfb11e49..d7b17030 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,7 +1,9 @@ import unittest -from tests.logging.logger import LoggerTest -from tests.publishing.publisher import PublisherTest +from tests.configuration.config import ConfigTest +from tests.hosting.app_host import AppHostTest +from tests.services.logging.logger import LoggerTest +from tests.services.publishing.publisher import PublisherTest from tests.service_providing.service_provider import ServiceProviderTest @@ -11,6 +13,18 @@ class Tester: self._suite = unittest.TestSuite() def create(self): + # hosting app host + self._suite.addTest(AppHostTest('test_create')) + + # configuration + self._suite.addTest(ConfigTest('test_create')) + self._suite.addTest(ConfigTest('test_env_vars')) + self._suite.addTest(ConfigTest('test_arguments')) + self._suite.addTest(ConfigTest('test_appsettings')) + self._suite.addTest(ConfigTest('test_appsettings_environment')) + self._suite.addTest(ConfigTest('test_appsettings_host')) + self._suite.addTest(ConfigTest('test_appsettings_customer')) + # providing self._suite.addTest(ServiceProviderTest('test_create')) self._suite.addTest(ServiceProviderTest('test_add_singleton')) diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 7d4e7494..2ee1b09b 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -14,14 +14,14 @@ class Program(ApplicationBase): ApplicationBase.__init__(self) self._app_host: Optional[ApplicationHost] = None - self._services: Optional[ServiceProviderBase] = None self._configuration: Optional[ConfigurationBase] = None + self._logger: Optional[LoggerBase] = None def create_application_host(self): self._app_host = ApplicationHost() - self._services = self._app_host.services self._configuration = self._app_host.configuration + self._services = self._app_host.services def create_configuration(self): self._configuration.create() @@ -35,12 +35,11 @@ class Program(ApplicationBase): def create_services(self): self._services.create() self._services.add_singleton(LoggerBase, Logger) - logger: Logger = self._services.get_service(LoggerBase) - logger.create() - logger.header(f'{self._configuration.environment.application_name}:') - logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') - logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') - logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') + self._logger = self._services.get_service(LoggerBase) + self._logger.create() def main(self): - print('RUN') + self._logger.header(f'{self._configuration.environment.application_name}:') + self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') From 78dcbdcbaaba319cc59ab93c28b7855e37090563 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 29 Nov 2020 21:36:16 +0100 Subject: [PATCH 31/86] Improved structure and added basics for database module --- src/sh_edraft/coding/model/version.py | 2 + src/sh_edraft/configuration/configuration.py | 4 +- src/sh_edraft/database/__init__.py | 3 + src/sh_edraft/database/base/__init__.py | 3 + .../database/base/database_connection_base.py | 10 +++ src/sh_edraft/database/database_connection.py | 35 ++++++++ src/sh_edraft/database/model/__init__.py | 0 .../database/model/database_settings.py | 80 +++++++++++++++++++ .../database/model/database_settings_name.py | 10 +++ src/sh_edraft/hosting/application_host.py | 4 +- .../hosting/base/application_host_base.py | 2 +- src/sh_edraft/logging/logger.py | 4 +- .../model/publish_settings_model.py | 4 +- src/sh_edraft/publishing/model/template.py | 1 + src/sh_edraft/service/__init__.py | 1 - src/sh_edraft/service/base/__init__.py | 1 - src/sh_edraft/service/model/__init__.py | 1 - src/sh_edraft/service/providing/__init__.py | 3 + .../service/providing/base/__init__.py | 3 + .../base/service_provider_base.py | 0 .../service/providing/model/__init__.py | 3 + .../{ => providing}/model/provide_state.py | 2 +- .../{ => providing}/service_provider.py | 6 +- src/sh_edraft/utils/__init__.py | 1 + src/sh_edraft/utils/credential_manager.py | 17 ++++ src/tests_dev/appsettings.development.json | 6 ++ src/tests_dev/program.py | 15 +++- 27 files changed, 202 insertions(+), 19 deletions(-) create mode 100644 src/sh_edraft/database/__init__.py create mode 100644 src/sh_edraft/database/base/__init__.py create mode 100644 src/sh_edraft/database/base/database_connection_base.py create mode 100644 src/sh_edraft/database/database_connection.py create mode 100644 src/sh_edraft/database/model/__init__.py create mode 100644 src/sh_edraft/database/model/database_settings.py create mode 100644 src/sh_edraft/database/model/database_settings_name.py create mode 100644 src/sh_edraft/service/providing/__init__.py create mode 100644 src/sh_edraft/service/providing/base/__init__.py rename src/sh_edraft/service/{ => providing}/base/service_provider_base.py (100%) create mode 100644 src/sh_edraft/service/providing/model/__init__.py rename src/sh_edraft/service/{ => providing}/model/provide_state.py (85%) rename src/sh_edraft/service/{ => providing}/service_provider.py (93%) create mode 100644 src/sh_edraft/utils/credential_manager.py diff --git a/src/sh_edraft/coding/model/version.py b/src/sh_edraft/coding/model/version.py index 26e4f9c0..be2d5a3d 100644 --- a/src/sh_edraft/coding/model/version.py +++ b/src/sh_edraft/coding/model/version.py @@ -12,6 +12,8 @@ class Version(ConfigurationModelBase): minor: int = None, micro: float = None ): + ConfigurationModelBase.__init__(self) + self._major: Optional[int] = major self._minor: Optional[int] = minor self._micro: Optional[int] = micro diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index dc0ef33f..f32148f0 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -7,8 +7,8 @@ from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.configuration.model.configuration_variable_name import ConfigurationVariableName from sh_edraft.environment.base.environment_base import EnvironmentBase from sh_edraft.environment.hosting_environment import HostingEnvironment -from sh_edraft.environment.model import EnvironmentName -from sh_edraft.utils import Console +from sh_edraft.environment.model.environment_name import EnvironmentName +from sh_edraft.utils.console import Console class Configuration(ConfigurationBase): diff --git a/src/sh_edraft/database/__init__.py b/src/sh_edraft/database/__init__.py new file mode 100644 index 00000000..eae4c82d --- /dev/null +++ b/src/sh_edraft/database/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .database_connection import DatabaseConnection diff --git a/src/sh_edraft/database/base/__init__.py b/src/sh_edraft/database/base/__init__.py new file mode 100644 index 00000000..876327c9 --- /dev/null +++ b/src/sh_edraft/database/base/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .database_connection_base import DatabaseConnectionBase diff --git a/src/sh_edraft/database/base/database_connection_base.py b/src/sh_edraft/database/base/database_connection_base.py new file mode 100644 index 00000000..9307c9b1 --- /dev/null +++ b/src/sh_edraft/database/base/database_connection_base.py @@ -0,0 +1,10 @@ +from abc import abstractmethod + +from sh_edraft.service.base.service_base import ServiceBase + + +class DatabaseConnectionBase(ServiceBase): + + @abstractmethod + def __init__(self): + ServiceBase.__init__(self) diff --git a/src/sh_edraft/database/database_connection.py b/src/sh_edraft/database/database_connection.py new file mode 100644 index 00000000..799f714b --- /dev/null +++ b/src/sh_edraft/database/database_connection.py @@ -0,0 +1,35 @@ +from typing import Optional + +from sqlalchemy import engine, create_engine +from sqlalchemy.orm import session, sessionmaker + +from sh_edraft.database.base.database_connection_base import DatabaseConnectionBase +from sh_edraft.database.model.database_settings import DatabaseSettings + + +class DatabaseConnection(DatabaseConnectionBase): + + def __init__(self, database_settings: DatabaseSettings): + DatabaseConnectionBase.__init__(self) + + self._db_settings = database_settings + + self._engine: Optional[engine] = None + self._session: Optional[session] = None + self._credentials: Optional[str] = None + + def create(self): + self._engine = create_engine(self._db_settings.decrypted_connection_string) + + if self._db_settings.encoding is not None: + self._engine.encoding = self._db_settings.encoding + + if self._db_settings.case_sensitive is not None: + self._engine.case_sensitive = self._db_settings.case_sensitive + + if self._db_settings.echo is not None: + self._engine.echo = self._db_settings.echo + + db_session = sessionmaker(bind=self._engine) + self._session = db_session() + diff --git a/src/sh_edraft/database/model/__init__.py b/src/sh_edraft/database/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/database/model/database_settings.py b/src/sh_edraft/database/model/database_settings.py new file mode 100644 index 00000000..8c2def60 --- /dev/null +++ b/src/sh_edraft/database/model/database_settings.py @@ -0,0 +1,80 @@ +import traceback +from typing import Optional + +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase +from sh_edraft.database.model.database_settings_name import DatabaseSettingsName +from sh_edraft.utils.credential_manager import CredentialManager +from sh_edraft.utils.console import Console + + +class DatabaseSettings(ConfigurationModelBase): + + def __init__(self): + ConfigurationModelBase.__init__(self) + + self._connection_string: Optional[str] = None + self._credentials: Optional[str] = None + self._encoding: Optional[str] = None + self._case_sensitive: Optional[bool] = None + self._echo: Optional[bool] = None + + @property + def connection_string(self) -> str: + return self._connection_string + + @connection_string.setter + def connection_string(self, connection_string: str): + self._connection_string = connection_string + + @property + def decrypted_connection_string(self) -> str: + return CredentialManager.build_string(self._connection_string, self._credentials) + + @property + def credentials(self) -> str: + return self._credentials + + @credentials.setter + def credentials(self, credentials: str): + self._credentials = credentials + + @property + def encoding(self) -> str: + return self._encoding + + @encoding.setter + def encoding(self, encoding: str) -> None: + self._encoding = encoding + + @property + def case_sensitive(self) -> bool: + return self._case_sensitive + + @case_sensitive.setter + def case_sensitive(self, case_sensitive: bool) -> None: + self._case_sensitive = case_sensitive + + @property + def echo(self) -> bool: + return self._echo + + @echo.setter + def echo(self, echo: bool) -> None: + self._echo = echo + + def from_dict(self, settings: dict): + try: + self._connection_string = settings[DatabaseSettingsName.connection_string.value] + self._credentials = settings[DatabaseSettingsName.credentials.value] + + if DatabaseSettingsName.encoding.value in settings: + self._encoding = settings[DatabaseSettingsName.encoding.value] + + if DatabaseSettingsName.case_sensitive.value in settings: + self._case_sensitive = bool(settings[DatabaseSettingsName.case_sensitive.value]) + + if DatabaseSettingsName.echo.value in settings: + self._echo = bool(settings[DatabaseSettingsName.echo.value]) + except Exception as e: + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings', 'red') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') diff --git a/src/sh_edraft/database/model/database_settings_name.py b/src/sh_edraft/database/model/database_settings_name.py new file mode 100644 index 00000000..57ece941 --- /dev/null +++ b/src/sh_edraft/database/model/database_settings_name.py @@ -0,0 +1,10 @@ +from enum import Enum + + +class DatabaseSettingsName(Enum): + + connection_string = 'ConnectionString' + credentials = 'Credentials' + encoding = 'Encoding' + case_sensitive = 'CaseSensitive' + echo = 'Echo' diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index e5e6b362..d86283d0 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -5,8 +5,8 @@ from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase -from sh_edraft.service.service_provider import ServiceProvider -from sh_edraft.service.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.providing.service_provider import ServiceProvider +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase class ApplicationHost(ApplicationHostBase): diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 4ee8c0f5..fb816ccb 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase -from sh_edraft.service.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase class ApplicationHostBase(ABC): diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 01b58937..f2159ad2 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -5,9 +5,9 @@ from string import Template from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.logging.model import LoggingSettings +from sh_edraft.logging.model.logging_settings import LoggingSettings from sh_edraft.logging.model.logging_level import LoggingLevel -from sh_edraft.time.model import TimeFormatSettings +from sh_edraft.time.model.time_format_settings import TimeFormatSettings from sh_edraft.utils.console import Console diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index 3886262d..a743692a 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -2,9 +2,9 @@ import traceback from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase -from sh_edraft.publishing.model import Template +from sh_edraft.publishing.model.template import Template from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName -from sh_edraft.utils import Console +from sh_edraft.utils.console import Console class PublishSettings(ConfigurationModelBase): diff --git a/src/sh_edraft/publishing/model/template.py b/src/sh_edraft/publishing/model/template.py index 922a5df5..91ba29e3 100644 --- a/src/sh_edraft/publishing/model/template.py +++ b/src/sh_edraft/publishing/model/template.py @@ -21,6 +21,7 @@ class Template(ConfigurationModelBase): author: Optional[str] = None, version: Optional[dict] = None ): + ConfigurationModelBase.__init__(self) self._template_path: Optional[str] = template_path self._name: Optional[str] = name self._description: Optional[str] = description diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index 52003f0b..abfc6044 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -20,7 +20,6 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: -from .service_provider import ServiceProvider VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index 6ce7f45b..d3d865d7 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -21,7 +21,6 @@ from collections import namedtuple # imports: from .service_base import ServiceBase -from .service_provider_base import ServiceProviderBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py index b95fe3c2..05760565 100644 --- a/src/sh_edraft/service/model/__init__.py +++ b/src/sh_edraft/service/model/__init__.py @@ -20,7 +20,6 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: -from .provide_state import ProvideState VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/providing/__init__.py b/src/sh_edraft/service/providing/__init__.py new file mode 100644 index 00000000..b8bf2077 --- /dev/null +++ b/src/sh_edraft/service/providing/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .service_provider import ServiceProviderBase diff --git a/src/sh_edraft/service/providing/base/__init__.py b/src/sh_edraft/service/providing/base/__init__.py new file mode 100644 index 00000000..4b5ed5b7 --- /dev/null +++ b/src/sh_edraft/service/providing/base/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .service_provider_base import ServiceProviderBase diff --git a/src/sh_edraft/service/base/service_provider_base.py b/src/sh_edraft/service/providing/base/service_provider_base.py similarity index 100% rename from src/sh_edraft/service/base/service_provider_base.py rename to src/sh_edraft/service/providing/base/service_provider_base.py diff --git a/src/sh_edraft/service/providing/model/__init__.py b/src/sh_edraft/service/providing/model/__init__.py new file mode 100644 index 00000000..7c4dd264 --- /dev/null +++ b/src/sh_edraft/service/providing/model/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .provide_state import ProvideState diff --git a/src/sh_edraft/service/model/provide_state.py b/src/sh_edraft/service/providing/model/provide_state.py similarity index 85% rename from src/sh_edraft/service/model/provide_state.py rename to src/sh_edraft/service/providing/model/provide_state.py index 619e0ed5..52d0af05 100644 --- a/src/sh_edraft/service/model/provide_state.py +++ b/src/sh_edraft/service/providing/model/provide_state.py @@ -1,6 +1,6 @@ from typing import Type -from sh_edraft.service.base import ServiceBase +from sh_edraft.service.base.service_base import ServiceBase class ProvideState: diff --git a/src/sh_edraft/service/service_provider.py b/src/sh_edraft/service/providing/service_provider.py similarity index 93% rename from src/sh_edraft/service/service_provider.py rename to src/sh_edraft/service/providing/service_provider.py index 4207b0f5..205f8359 100644 --- a/src/sh_edraft/service/service_provider.py +++ b/src/sh_edraft/service/providing/service_provider.py @@ -4,7 +4,7 @@ from typing import Type from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase -from sh_edraft.service.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase @@ -45,8 +45,8 @@ class ServiceProvider(ServiceProviderBase): def add_singleton(self, service_type: Type[ServiceBase], service: Callable[ServiceBase]): for known_service in self._singleton_services: - if type(known_service) == type(service_type): - raise Exception(f'Service with type {type(service_type)} already exists') + if type(known_service) == service_type: + raise Exception(f'Service with type {service_type} already exists') self._singleton_services[service_type] = self._create_instance(service) diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py index 4130c05d..10d2e9e5 100644 --- a/src/sh_edraft/utils/__init__.py +++ b/src/sh_edraft/utils/__init__.py @@ -21,6 +21,7 @@ from collections import namedtuple # imports: from .console import Console +from .credential_manager import CredentialManager VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/utils/credential_manager.py b/src/sh_edraft/utils/credential_manager.py new file mode 100644 index 00000000..7f9977d1 --- /dev/null +++ b/src/sh_edraft/utils/credential_manager.py @@ -0,0 +1,17 @@ +import base64 + + +class CredentialManager: + + @staticmethod + def encrypt(string: str) -> str: + return base64.b64encode(string.encode('utf-8')).decode('utf-8') + + @staticmethod + def decrypt(string: str) -> str: + return base64.b64decode(string).decode('utf-8') + + @staticmethod + def build_string(string: str, credentials: str): + return string.replace('$credentials', CredentialManager.decrypt(credentials)) + diff --git a/src/tests_dev/appsettings.development.json b/src/tests_dev/appsettings.development.json index 62ec6c61..aa370960 100644 --- a/src/tests_dev/appsettings.development.json +++ b/src/tests_dev/appsettings.development.json @@ -4,5 +4,11 @@ "Filename": "log_$start_time.log", "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" + }, + + "DatabaseSettings": { + "ConnectionString": "mysql+mysqlconnector://sh_messenger_server:$credentials@localhost/sh_messenger_server", + "Credentials": "ZkM1U1dyU0hXM3oyI3BfXg==", + "Encoding": "utf8mb4" } } \ No newline at end of file diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 2ee1b09b..e17733be 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,11 +1,13 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.database import DatabaseConnection +from sh_edraft.database.base import DatabaseConnectionBase from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase -from sh_edraft.service.base import ServiceProviderBase +from sh_edraft.service.providing.base import ServiceProviderBase class Program(ApplicationBase): @@ -17,6 +19,7 @@ class Program(ApplicationBase): self._services: Optional[ServiceProviderBase] = None self._configuration: Optional[ConfigurationBase] = None self._logger: Optional[LoggerBase] = None + self._db_connection: Optional[DatabaseConnectionBase] = None def create_application_host(self): self._app_host = ApplicationHost() @@ -30,13 +33,19 @@ class Program(ApplicationBase): self._configuration.add_argument_variables() self._configuration.add_json_file(f'appsettings.json') self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') - self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) + self._configuration.add_json_file( + f'appsettings.{self._configuration.environment.host_name}.json', + optional=True + ) def create_services(self): self._services.create() self._services.add_singleton(LoggerBase, Logger) - self._logger = self._services.get_service(LoggerBase) + self._services.add_singleton(DatabaseConnectionBase, DatabaseConnection) + self._logger: Logger = self._services.get_service(LoggerBase) self._logger.create() + self._db_connection: DatabaseConnection = self._services.get_service(DatabaseConnectionBase) + self._db_connection.create() def main(self): self._logger.header(f'{self._configuration.environment.application_name}:') From 8551a0b7b736cb408204a6549eb2f5d668b03106 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 29 Nov 2020 21:48:17 +0100 Subject: [PATCH 32/86] Improved database connection --- src/sh_edraft/database/database_connection.py | 26 ++++++++++++------- src/sh_edraft/logging/logger.py | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/sh_edraft/database/database_connection.py b/src/sh_edraft/database/database_connection.py index 799f714b..31db403a 100644 --- a/src/sh_edraft/database/database_connection.py +++ b/src/sh_edraft/database/database_connection.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import session, sessionmaker from sh_edraft.database.base.database_connection_base import DatabaseConnectionBase from sh_edraft.database.model.database_settings import DatabaseSettings +from sh_edraft.utils.console import Console class DatabaseConnection(DatabaseConnectionBase): @@ -19,17 +20,24 @@ class DatabaseConnection(DatabaseConnectionBase): self._credentials: Optional[str] = None def create(self): - self._engine = create_engine(self._db_settings.decrypted_connection_string) + try: + self._engine = create_engine(self._db_settings.decrypted_connection_string) - if self._db_settings.encoding is not None: - self._engine.encoding = self._db_settings.encoding + if self._db_settings.encoding is not None: + self._engine.encoding = self._db_settings.encoding - if self._db_settings.case_sensitive is not None: - self._engine.case_sensitive = self._db_settings.case_sensitive + if self._db_settings.case_sensitive is not None: + self._engine.case_sensitive = self._db_settings.case_sensitive - if self._db_settings.echo is not None: - self._engine.echo = self._db_settings.echo + if self._db_settings.echo is not None: + self._engine.echo = self._db_settings.echo - db_session = sessionmaker(bind=self._engine) - self._session = db_session() + self._engine.connect() + + db_session = sessionmaker(bind=self._engine) + self._session = db_session() + Console.write_line(f'[{__name__}] Connected to database', 'green') + except Exception as e: + Console.write_line(f'[{__name__}] Database connection failed -> {e}', 'red') + exit() diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index f2159ad2..dbc54740 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -54,7 +54,7 @@ class Logger(LoggerBase): # open log file, create if not exists path = f'{self._path}{self._log}' f = open(path, "w+") - Console.write_line(f'[{__name__}]: Using log file: {path}') + Console.write_line(f'[{__name__}]: Using log file: {path}', 'green') f.close() except Exception as e: self._fatal_console(__name__, 'Cannot open log file', ex=e) From 6977b9ae05d6b7a8eca8aa7d88c35c5de5bc7817 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 6 Dec 2020 21:14:57 +0100 Subject: [PATCH 33/86] Improved database module structure --- src/sh_edraft/hosting/application_host.py | 4 ++-- .../hosting/base/application_host_base.py | 2 +- src/sh_edraft/logging/logger.py | 2 +- src/sh_edraft/service/__init__.py | 1 + src/sh_edraft/service/base/__init__.py | 1 + src/sh_edraft/service/model/__init__.py | 1 + src/sh_edraft/utils/__init__.py | 1 - src/tests_dev/appsettings.development.json | 6 ------ src/tests_dev/program.py | 15 +++------------ 9 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index d86283d0..e5e6b362 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -5,8 +5,8 @@ from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase -from sh_edraft.service.providing.service_provider import ServiceProvider -from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.service_provider import ServiceProvider +from sh_edraft.service.base.service_provider_base import ServiceProviderBase class ApplicationHost(ApplicationHostBase): diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index fb816ccb..4ee8c0f5 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase -from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.base.service_provider_base import ServiceProviderBase class ApplicationHostBase(ABC): diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index dbc54740..f2159ad2 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -54,7 +54,7 @@ class Logger(LoggerBase): # open log file, create if not exists path = f'{self._path}{self._log}' f = open(path, "w+") - Console.write_line(f'[{__name__}]: Using log file: {path}', 'green') + Console.write_line(f'[{__name__}]: Using log file: {path}') f.close() except Exception as e: self._fatal_console(__name__, 'Cannot open log file', ex=e) diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index abfc6044..52003f0b 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: +from .service_provider import ServiceProvider VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index d3d865d7..6ce7f45b 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -21,6 +21,7 @@ from collections import namedtuple # imports: from .service_base import ServiceBase +from .service_provider_base import ServiceProviderBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py index 05760565..b95fe3c2 100644 --- a/src/sh_edraft/service/model/__init__.py +++ b/src/sh_edraft/service/model/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: +from .provide_state import ProvideState VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py index 10d2e9e5..4130c05d 100644 --- a/src/sh_edraft/utils/__init__.py +++ b/src/sh_edraft/utils/__init__.py @@ -21,7 +21,6 @@ from collections import namedtuple # imports: from .console import Console -from .credential_manager import CredentialManager VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/tests_dev/appsettings.development.json b/src/tests_dev/appsettings.development.json index aa370960..62ec6c61 100644 --- a/src/tests_dev/appsettings.development.json +++ b/src/tests_dev/appsettings.development.json @@ -4,11 +4,5 @@ "Filename": "log_$start_time.log", "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" - }, - - "DatabaseSettings": { - "ConnectionString": "mysql+mysqlconnector://sh_messenger_server:$credentials@localhost/sh_messenger_server", - "Credentials": "ZkM1U1dyU0hXM3oyI3BfXg==", - "Encoding": "utf8mb4" } } \ No newline at end of file diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index e17733be..2ee1b09b 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,13 +1,11 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase -from sh_edraft.database import DatabaseConnection -from sh_edraft.database.base import DatabaseConnectionBase from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase -from sh_edraft.service.providing.base import ServiceProviderBase +from sh_edraft.service.base import ServiceProviderBase class Program(ApplicationBase): @@ -19,7 +17,6 @@ class Program(ApplicationBase): self._services: Optional[ServiceProviderBase] = None self._configuration: Optional[ConfigurationBase] = None self._logger: Optional[LoggerBase] = None - self._db_connection: Optional[DatabaseConnectionBase] = None def create_application_host(self): self._app_host = ApplicationHost() @@ -33,19 +30,13 @@ class Program(ApplicationBase): self._configuration.add_argument_variables() self._configuration.add_json_file(f'appsettings.json') self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') - self._configuration.add_json_file( - f'appsettings.{self._configuration.environment.host_name}.json', - optional=True - ) + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) def create_services(self): self._services.create() self._services.add_singleton(LoggerBase, Logger) - self._services.add_singleton(DatabaseConnectionBase, DatabaseConnection) - self._logger: Logger = self._services.get_service(LoggerBase) + self._logger = self._services.get_service(LoggerBase) self._logger.create() - self._db_connection: DatabaseConnection = self._services.get_service(DatabaseConnectionBase) - self._db_connection.create() def main(self): self._logger.header(f'{self._configuration.environment.application_name}:') From d2dc57bc76b925b706e2a79fa51fcc721c2a4d8d Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 10 Dec 2020 18:11:05 +0100 Subject: [PATCH 34/86] Improved database module structure --- src/sh_edraft/database/__init__.py | 2 -- src/sh_edraft/database/connection/__init__.py | 3 +++ .../database/{ => connection}/base/__init__.py | 0 .../base/database_connection_base.py | 3 +++ .../{ => connection}/database_connection.py | 10 +++++++--- src/sh_edraft/database/model/__init__.py | 4 ++++ .../database/model/database_settings.py | 5 ----- src/sh_edraft/hosting/application_host.py | 11 +++++++++-- .../hosting/base/application_host_base.py | 2 +- src/sh_edraft/logging/logger.py | 2 ++ src/sh_edraft/service/__init__.py | 1 - src/sh_edraft/service/base/__init__.py | 1 - src/sh_edraft/service/providing/__init__.py | 1 + src/tests_dev/appsettings.development.json | 5 +++++ src/tests_dev/program.py | 16 ++++++++++++---- 15 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 src/sh_edraft/database/connection/__init__.py rename src/sh_edraft/database/{ => connection}/base/__init__.py (100%) rename src/sh_edraft/database/{ => connection}/base/database_connection_base.py (74%) rename src/sh_edraft/database/{ => connection}/database_connection.py (83%) diff --git a/src/sh_edraft/database/__init__.py b/src/sh_edraft/database/__init__.py index eae4c82d..8b137891 100644 --- a/src/sh_edraft/database/__init__.py +++ b/src/sh_edraft/database/__init__.py @@ -1,3 +1 @@ -# imports: -from .database_connection import DatabaseConnection diff --git a/src/sh_edraft/database/connection/__init__.py b/src/sh_edraft/database/connection/__init__.py new file mode 100644 index 00000000..eae4c82d --- /dev/null +++ b/src/sh_edraft/database/connection/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .database_connection import DatabaseConnection diff --git a/src/sh_edraft/database/base/__init__.py b/src/sh_edraft/database/connection/base/__init__.py similarity index 100% rename from src/sh_edraft/database/base/__init__.py rename to src/sh_edraft/database/connection/base/__init__.py diff --git a/src/sh_edraft/database/base/database_connection_base.py b/src/sh_edraft/database/connection/base/database_connection_base.py similarity index 74% rename from src/sh_edraft/database/base/database_connection_base.py rename to src/sh_edraft/database/connection/base/database_connection_base.py index 9307c9b1..f97859bc 100644 --- a/src/sh_edraft/database/base/database_connection_base.py +++ b/src/sh_edraft/database/connection/base/database_connection_base.py @@ -8,3 +8,6 @@ class DatabaseConnectionBase(ServiceBase): @abstractmethod def __init__(self): ServiceBase.__init__(self) + + @abstractmethod + def use_mysql(self, connection_string: str): pass diff --git a/src/sh_edraft/database/database_connection.py b/src/sh_edraft/database/connection/database_connection.py similarity index 83% rename from src/sh_edraft/database/database_connection.py rename to src/sh_edraft/database/connection/database_connection.py index 31db403a..7d02c382 100644 --- a/src/sh_edraft/database/database_connection.py +++ b/src/sh_edraft/database/connection/database_connection.py @@ -3,7 +3,7 @@ from typing import Optional from sqlalchemy import engine, create_engine from sqlalchemy.orm import session, sessionmaker -from sh_edraft.database.base.database_connection_base import DatabaseConnectionBase +from sh_edraft.database.connection.base.database_connection_base import DatabaseConnectionBase from sh_edraft.database.model.database_settings import DatabaseSettings from sh_edraft.utils.console import Console @@ -19,9 +19,13 @@ class DatabaseConnection(DatabaseConnectionBase): self._session: Optional[session] = None self._credentials: Optional[str] = None - def create(self): + self.create() + + def create(self): pass + + def use_mysql(self, connection_string: str): try: - self._engine = create_engine(self._db_settings.decrypted_connection_string) + self._engine = create_engine(connection_string) if self._db_settings.encoding is not None: self._engine.encoding = self._db_settings.encoding diff --git a/src/sh_edraft/database/model/__init__.py b/src/sh_edraft/database/model/__init__.py index e69de29b..c13a207e 100644 --- a/src/sh_edraft/database/model/__init__.py +++ b/src/sh_edraft/database/model/__init__.py @@ -0,0 +1,4 @@ +# imports: + +from .database_settings import DatabaseSettings +from .database_settings_name import DatabaseSettingsName diff --git a/src/sh_edraft/database/model/database_settings.py b/src/sh_edraft/database/model/database_settings.py index 8c2def60..a8df384d 100644 --- a/src/sh_edraft/database/model/database_settings.py +++ b/src/sh_edraft/database/model/database_settings.py @@ -3,7 +3,6 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.database.model.database_settings_name import DatabaseSettingsName -from sh_edraft.utils.credential_manager import CredentialManager from sh_edraft.utils.console import Console @@ -26,10 +25,6 @@ class DatabaseSettings(ConfigurationModelBase): def connection_string(self, connection_string: str): self._connection_string = connection_string - @property - def decrypted_connection_string(self) -> str: - return CredentialManager.build_string(self._connection_string, self._credentials) - @property def credentials(self) -> str: return self._credentials diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index e5e6b362..fa4b2182 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -5,18 +5,25 @@ from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase -from sh_edraft.service.service_provider import ServiceProvider -from sh_edraft.service.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.providing.service_provider import ServiceProvider +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase class ApplicationHost(ApplicationHostBase): def __init__(self): ApplicationHostBase.__init__(self) + + # Init self._config = Configuration() self._app_runtime = ApplicationRuntime(self._config) self._services = ServiceProvider(self._app_runtime) + # Create + self._config.create() + self._services.create() + + # Set vars self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() diff --git a/src/sh_edraft/hosting/base/application_host_base.py b/src/sh_edraft/hosting/base/application_host_base.py index 4ee8c0f5..fb816ccb 100644 --- a/src/sh_edraft/hosting/base/application_host_base.py +++ b/src/sh_edraft/hosting/base/application_host_base.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from sh_edraft.configuration.base.configuration_base import ConfigurationBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase -from sh_edraft.service.base.service_provider_base import ServiceProviderBase +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase class ApplicationHostBase(ABC): diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index f2159ad2..a043b21b 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -28,6 +28,8 @@ class Logger(LoggerBase): self._level = self._log_settings.level self._console = self._log_settings.console + self.create() + def _get_datetime_now(self) -> str: try: return datetime.datetime.now().strftime(self._time_format_settings.date_time_format) diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index 52003f0b..abfc6044 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -20,7 +20,6 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: -from .service_provider import ServiceProvider VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index 6ce7f45b..d3d865d7 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -21,7 +21,6 @@ from collections import namedtuple # imports: from .service_base import ServiceBase -from .service_provider_base import ServiceProviderBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/sh_edraft/service/providing/__init__.py b/src/sh_edraft/service/providing/__init__.py index b8bf2077..7817c7f3 100644 --- a/src/sh_edraft/service/providing/__init__.py +++ b/src/sh_edraft/service/providing/__init__.py @@ -1,3 +1,4 @@ # imports: +from .service_provider import ServiceProvider from .service_provider import ServiceProviderBase diff --git a/src/tests_dev/appsettings.development.json b/src/tests_dev/appsettings.development.json index 62ec6c61..3a54f3cc 100644 --- a/src/tests_dev/appsettings.development.json +++ b/src/tests_dev/appsettings.development.json @@ -4,5 +4,10 @@ "Filename": "log_$start_time.log", "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" + }, + "DatabaseSettings": { + "ConnectionString": "mysql+mysqlconnector://sh_cpl:$credentials@localhost/sh_cpl", + "Credentials": "MHZhc0Y2bjhKc1VUMWV0Qw==", + "Encoding": "utf8mb4" } } \ No newline at end of file diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 2ee1b09b..d780d0c7 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,11 +1,15 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.database.connection import DatabaseConnection +from sh_edraft.database.connection.base import DatabaseConnectionBase +from sh_edraft.database.model import DatabaseSettings from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase -from sh_edraft.service.base import ServiceProviderBase +from sh_edraft.service.providing.base import ServiceProviderBase +from sh_edraft.utils.credential_manager import CredentialManager class Program(ApplicationBase): @@ -24,7 +28,6 @@ class Program(ApplicationBase): self._services = self._app_host.services def create_configuration(self): - self._configuration.create() self._configuration.add_environment_variables('PYTHON_') self._configuration.add_environment_variables('CPL_') self._configuration.add_argument_variables() @@ -33,10 +36,15 @@ class Program(ApplicationBase): self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) def create_services(self): - self._services.create() + # Create and connect to database + db_settings: DatabaseSettings = self._configuration.get_configuration(DatabaseSettings) + self._services.add_singleton(DatabaseConnectionBase, DatabaseConnection) + db: DatabaseConnectionBase = self._services.get_service(DatabaseConnectionBase) + db.use_mysql(CredentialManager.build_string(db_settings.connection_string, db_settings.credentials)) + + # Add and create logger self._services.add_singleton(LoggerBase, Logger) self._logger = self._services.get_service(LoggerBase) - self._logger.create() def main(self): self._logger.header(f'{self._configuration.environment.application_name}:') From ee60be98808333f192d39eb45616e728fb2485b8 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 11 Dec 2020 19:42:09 +0100 Subject: [PATCH 35/86] Changed DatabaseConnection --- src/sh_edraft/database/__init__.py | 2 +- .../connection/base/database_connection_base.py | 13 ++++++++++++- .../database/connection/database_connection.py | 10 +++++++++- src/tests_dev/program.py | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/sh_edraft/database/__init__.py b/src/sh_edraft/database/__init__.py index 8b137891..52f86f25 100644 --- a/src/sh_edraft/database/__init__.py +++ b/src/sh_edraft/database/__init__.py @@ -1 +1 @@ - +# imports: diff --git a/src/sh_edraft/database/connection/base/database_connection_base.py b/src/sh_edraft/database/connection/base/database_connection_base.py index f97859bc..c530f593 100644 --- a/src/sh_edraft/database/connection/base/database_connection_base.py +++ b/src/sh_edraft/database/connection/base/database_connection_base.py @@ -1,5 +1,8 @@ from abc import abstractmethod +from sqlalchemy import engine +from sqlalchemy.orm import session + from sh_edraft.service.base.service_base import ServiceBase @@ -9,5 +12,13 @@ class DatabaseConnectionBase(ServiceBase): def __init__(self): ServiceBase.__init__(self) + @property @abstractmethod - def use_mysql(self, connection_string: str): pass + def engine(self) -> engine: pass + + @property + @abstractmethod + def session(self) -> session: pass + + @abstractmethod + def connect(self, connection_string: str): pass diff --git a/src/sh_edraft/database/connection/database_connection.py b/src/sh_edraft/database/connection/database_connection.py index 7d02c382..2c274ccf 100644 --- a/src/sh_edraft/database/connection/database_connection.py +++ b/src/sh_edraft/database/connection/database_connection.py @@ -21,9 +21,17 @@ class DatabaseConnection(DatabaseConnectionBase): self.create() + @property + def engine(self) -> engine: + return self._engine + + @property + def session(self) -> session: + return self._session + def create(self): pass - def use_mysql(self, connection_string: str): + def connect(self, connection_string: str): try: self._engine = create_engine(connection_string) diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index d780d0c7..94796c55 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -40,7 +40,7 @@ class Program(ApplicationBase): db_settings: DatabaseSettings = self._configuration.get_configuration(DatabaseSettings) self._services.add_singleton(DatabaseConnectionBase, DatabaseConnection) db: DatabaseConnectionBase = self._services.get_service(DatabaseConnectionBase) - db.use_mysql(CredentialManager.build_string(db_settings.connection_string, db_settings.credentials)) + db.connect(CredentialManager.build_string(db_settings.connection_string, db_settings.credentials)) # Add and create logger self._services.add_singleton(LoggerBase, Logger) From 03ba1d1847dec44ec9fa1131901f4c76df9962c0 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 11 Dec 2020 21:48:46 +0100 Subject: [PATCH 36/86] Added first version of database and orm --- .../base/database_connection_base.py | 9 ++-- .../connection/database_connection.py | 4 -- src/sh_edraft/database/context/__init__.py | 3 ++ .../database/context/base/__init__.py | 3 ++ .../context/base/database_context_base.py | 27 +++++++++++ .../database/context/database_context.py | 45 +++++++++++++++++++ src/sh_edraft/database/model/__init__.py | 1 + src/sh_edraft/database/model/dbmodel.py | 3 ++ .../providing/base/service_provider_base.py | 14 ++++-- .../service/providing/service_provider.py | 13 +++++- src/sh_edraft/utils/__init__.py | 1 + src/tests_dev/db/__init__.py | 0 src/tests_dev/db/city.py | 14 ++++++ src/tests_dev/db/user.py | 18 ++++++++ src/tests_dev/db/user_repo.py | 23 ++++++++++ src/tests_dev/db/user_repo_base.py | 10 +++++ src/tests_dev/program.py | 15 ++++--- 17 files changed, 183 insertions(+), 20 deletions(-) create mode 100644 src/sh_edraft/database/context/__init__.py create mode 100644 src/sh_edraft/database/context/base/__init__.py create mode 100644 src/sh_edraft/database/context/base/database_context_base.py create mode 100644 src/sh_edraft/database/context/database_context.py create mode 100644 src/sh_edraft/database/model/dbmodel.py create mode 100644 src/tests_dev/db/__init__.py create mode 100644 src/tests_dev/db/city.py create mode 100644 src/tests_dev/db/user.py create mode 100644 src/tests_dev/db/user_repo.py create mode 100644 src/tests_dev/db/user_repo_base.py diff --git a/src/sh_edraft/database/connection/base/database_connection_base.py b/src/sh_edraft/database/connection/base/database_connection_base.py index c530f593..8a3e28ec 100644 --- a/src/sh_edraft/database/connection/base/database_connection_base.py +++ b/src/sh_edraft/database/connection/base/database_connection_base.py @@ -1,16 +1,13 @@ -from abc import abstractmethod +from abc import abstractmethod, ABC from sqlalchemy import engine from sqlalchemy.orm import session -from sh_edraft.service.base.service_base import ServiceBase - -class DatabaseConnectionBase(ServiceBase): +class DatabaseConnectionBase(ABC): @abstractmethod - def __init__(self): - ServiceBase.__init__(self) + def __init__(self): pass @property @abstractmethod diff --git a/src/sh_edraft/database/connection/database_connection.py b/src/sh_edraft/database/connection/database_connection.py index 2c274ccf..eac20341 100644 --- a/src/sh_edraft/database/connection/database_connection.py +++ b/src/sh_edraft/database/connection/database_connection.py @@ -19,8 +19,6 @@ class DatabaseConnection(DatabaseConnectionBase): self._session: Optional[session] = None self._credentials: Optional[str] = None - self.create() - @property def engine(self) -> engine: return self._engine @@ -29,8 +27,6 @@ class DatabaseConnection(DatabaseConnectionBase): def session(self) -> session: return self._session - def create(self): pass - def connect(self, connection_string: str): try: self._engine = create_engine(connection_string) diff --git a/src/sh_edraft/database/context/__init__.py b/src/sh_edraft/database/context/__init__.py new file mode 100644 index 00000000..0e46ede4 --- /dev/null +++ b/src/sh_edraft/database/context/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .database_context import DatabaseContext diff --git a/src/sh_edraft/database/context/base/__init__.py b/src/sh_edraft/database/context/base/__init__.py new file mode 100644 index 00000000..ad5b61fb --- /dev/null +++ b/src/sh_edraft/database/context/base/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .database_context_base import DatabaseContextBase diff --git a/src/sh_edraft/database/context/base/database_context_base.py b/src/sh_edraft/database/context/base/database_context_base.py new file mode 100644 index 00000000..a18b6efe --- /dev/null +++ b/src/sh_edraft/database/context/base/database_context_base.py @@ -0,0 +1,27 @@ +from abc import abstractmethod + +from sqlalchemy import engine +from sqlalchemy.orm import session + +from sh_edraft.service.base.service_base import ServiceBase + + +class DatabaseContextBase(ServiceBase): + + @abstractmethod + def __init__(self): + ServiceBase.__init__(self) + + @property + @abstractmethod + def engine(self) -> engine: pass + + @property + @abstractmethod + def session(self) -> session: pass + + @abstractmethod + def connect(self, connection_string: str): pass + + @abstractmethod + def _create_tables(self): pass diff --git a/src/sh_edraft/database/context/database_context.py b/src/sh_edraft/database/context/database_context.py new file mode 100644 index 00000000..a9fd1b7e --- /dev/null +++ b/src/sh_edraft/database/context/database_context.py @@ -0,0 +1,45 @@ +from sqlalchemy import engine, Table +from sqlalchemy.orm import session + +from sh_edraft.database.connection.database_connection import DatabaseConnection +from sh_edraft.database.connection.base.database_connection_base import DatabaseConnectionBase +from sh_edraft.database.context.base.database_context_base import DatabaseContextBase +from sh_edraft.database.model.dbmodel import DBModel +from sh_edraft.database.model.database_settings import DatabaseSettings +from sh_edraft.utils.console import Console + + +class DatabaseContext(DatabaseContextBase): + + def __init__(self, database_settings: DatabaseSettings): + DatabaseContextBase.__init__(self) + + self._db: DatabaseConnectionBase = DatabaseConnection(database_settings) + self._tables: list[Table] = [] + + @property + def engine(self) -> engine: + return self._db.engine + + @property + def session(self) -> session: + return self._db.session + + def create(self): + pass + + def connect(self, connection_string: str): + self._db.connect(connection_string) + self._create_tables() + + def _create_tables(self): + try: + for subclass in DBModel.__subclasses__(): + self._tables.append(subclass.__table__) + + DBModel.metadata.drop_all(self._db.engine, self._tables) + DBModel.metadata.create_all(self._db.engine, self._tables, checkfirst=True) + Console.write_line(f'[{__name__}] Created tables', 'green') + except Exception as e: + Console.write_line(f'[{__name__}] Creating tables failed -> {e}', 'red') + exit() diff --git a/src/sh_edraft/database/model/__init__.py b/src/sh_edraft/database/model/__init__.py index c13a207e..b51f2dca 100644 --- a/src/sh_edraft/database/model/__init__.py +++ b/src/sh_edraft/database/model/__init__.py @@ -2,3 +2,4 @@ from .database_settings import DatabaseSettings from .database_settings_name import DatabaseSettingsName +from .dbmodel import DBModel diff --git a/src/sh_edraft/database/model/dbmodel.py b/src/sh_edraft/database/model/dbmodel.py new file mode 100644 index 00000000..145da02b --- /dev/null +++ b/src/sh_edraft/database/model/dbmodel.py @@ -0,0 +1,3 @@ +from sqlalchemy.ext.declarative import declarative_base + +DBModel: declarative_base = declarative_base() diff --git a/src/sh_edraft/service/providing/base/service_provider_base.py b/src/sh_edraft/service/providing/base/service_provider_base.py index 58d3a64f..28c986f0 100644 --- a/src/sh_edraft/service/providing/base/service_provider_base.py +++ b/src/sh_edraft/service/providing/base/service_provider_base.py @@ -1,15 +1,21 @@ -from abc import abstractmethod +from abc import abstractmethod, ABC from collections import Callable from typing import Type +from sh_edraft.database.context.base.database_context_base import DatabaseContextBase from sh_edraft.service.base.service_base import ServiceBase -class ServiceProviderBase(ServiceBase): +class ServiceProviderBase(ABC): @abstractmethod - def __init__(self): - ServiceBase.__init__(self) + def __init__(self): pass + + @abstractmethod + def add_db_context(self, db_context: Type[DatabaseContextBase]): pass + + @abstractmethod + def get_db_context(self) -> Callable[DatabaseContextBase]: pass @abstractmethod def add_transient(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): pass diff --git a/src/sh_edraft/service/providing/service_provider.py b/src/sh_edraft/service/providing/service_provider.py index 205f8359..b4defc4b 100644 --- a/src/sh_edraft/service/providing/service_provider.py +++ b/src/sh_edraft/service/providing/service_provider.py @@ -1,8 +1,9 @@ from collections import Callable from inspect import signature, Parameter -from typing import Type +from typing import Type, Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase +from sh_edraft.database.context.base.database_context_base import DatabaseContextBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase @@ -13,6 +14,7 @@ class ServiceProvider(ServiceProviderBase): def __init__(self, app_runtime: ApplicationRuntimeBase): ServiceProviderBase.__init__(self) self._app_runtime: ApplicationRuntimeBase = app_runtime + self._database_context: Optional[DatabaseContextBase] = None self._transient_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} self._scoped_services: dict[Type[ServiceBase], Type[ServiceBase]] = {} @@ -29,6 +31,9 @@ class ServiceProvider(ServiceProviderBase): if issubclass(parameter.annotation, ApplicationRuntimeBase): params.append(self._app_runtime) + elif issubclass(parameter.annotation, DatabaseContextBase): + params.append(self._database_context) + elif issubclass(parameter.annotation, ServiceBase): params.append(self.get_service(parameter.annotation)) @@ -37,6 +42,12 @@ class ServiceProvider(ServiceProviderBase): return service(*params) + def add_db_context(self, db_context: Type[DatabaseContextBase]): + self._database_context = self._create_instance(db_context) + + def get_db_context(self) -> Callable[DatabaseContextBase]: + return self._database_context + def add_transient(self, service_type: Type[ServiceBase], service: Type[ServiceBase]): self._transient_services[service_type] = service diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py index 4130c05d..10d2e9e5 100644 --- a/src/sh_edraft/utils/__init__.py +++ b/src/sh_edraft/utils/__init__.py @@ -21,6 +21,7 @@ from collections import namedtuple # imports: from .console import Console +from .credential_manager import CredentialManager VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=5) diff --git a/src/tests_dev/db/__init__.py b/src/tests_dev/db/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests_dev/db/city.py b/src/tests_dev/db/city.py new file mode 100644 index 00000000..baf07ded --- /dev/null +++ b/src/tests_dev/db/city.py @@ -0,0 +1,14 @@ +from sqlalchemy import Column, Integer, String + +from sh_edraft.database.model import DBModel + + +class City(DBModel): + __tablename__ = 'Cities' + Id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) + Name = Column(String(64), nullable=False) + ZIP = Column(String(5), nullable=False) + + def __init__(self, name: str, zip_code: str): + self.Name = name + self.ZIP = zip_code diff --git a/src/tests_dev/db/user.py b/src/tests_dev/db/user.py new file mode 100644 index 00000000..e840df86 --- /dev/null +++ b/src/tests_dev/db/user.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship + +from sh_edraft.database.model import DBModel +from tests_dev.db.city import City as CityModel + + +class User(DBModel): + __tablename__ = 'Users' + Id = Column(Integer, primary_key=True, nullable=False, autoincrement=True) + Name = Column(String(64), nullable=False) + City_Id = Column(Integer, ForeignKey('Cities.Id'), nullable=False) + City = relationship("City") + + def __init__(self, name: str, city: CityModel): + self.Name = name + self.City_Id = city.Id + self.City = city diff --git a/src/tests_dev/db/user_repo.py b/src/tests_dev/db/user_repo.py new file mode 100644 index 00000000..a1b3cffc --- /dev/null +++ b/src/tests_dev/db/user_repo.py @@ -0,0 +1,23 @@ +from sh_edraft.database.context.base import DatabaseContextBase +from tests_dev.db.city import City +from tests_dev.db.user import User +from tests_dev.db.user_repo_base import UserRepoBase + + +class UserRepo(UserRepoBase): + + def __init__(self, db_context: DatabaseContextBase): + UserRepoBase.__init__(self) + + self._session = db_context.session + self._user_query = db_context.session.query(User) + + def create(self): pass + + def add_test_user(self): + city = City('Haren', '49733') + city2 = City('Meppen', '49716') + self._session.add(city2) + user = User('TestUser', city) + self._session.add(user) + self._session.commit() diff --git a/src/tests_dev/db/user_repo_base.py b/src/tests_dev/db/user_repo_base.py new file mode 100644 index 00000000..c48be0b2 --- /dev/null +++ b/src/tests_dev/db/user_repo_base.py @@ -0,0 +1,10 @@ +from abc import abstractmethod + +from sh_edraft.service.base import ServiceBase + + +class UserRepoBase(ServiceBase): + + @abstractmethod + def __init__(self): + ServiceBase.__init__(self) diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 94796c55..baf29064 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,15 +1,17 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase -from sh_edraft.database.connection import DatabaseConnection -from sh_edraft.database.connection.base import DatabaseConnectionBase +from sh_edraft.database.context import DatabaseContext from sh_edraft.database.model import DatabaseSettings from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.service.providing.base import ServiceProviderBase -from sh_edraft.utils.credential_manager import CredentialManager +from sh_edraft.utils import CredentialManager + +from tests_dev.db.user_repo import UserRepo +from tests_dev.db.user_repo_base import UserRepoBase class Program(ApplicationBase): @@ -38,10 +40,12 @@ class Program(ApplicationBase): def create_services(self): # Create and connect to database db_settings: DatabaseSettings = self._configuration.get_configuration(DatabaseSettings) - self._services.add_singleton(DatabaseConnectionBase, DatabaseConnection) - db: DatabaseConnectionBase = self._services.get_service(DatabaseConnectionBase) + self._services.add_db_context(DatabaseContext) + db: DatabaseContext = self._services.get_db_context() db.connect(CredentialManager.build_string(db_settings.connection_string, db_settings.credentials)) + self._services.add_scoped(UserRepoBase, UserRepo) + # Add and create logger self._services.add_singleton(LoggerBase, Logger) self._logger = self._services.get_service(LoggerBase) @@ -51,3 +55,4 @@ class Program(ApplicationBase): self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') + self._services.get_service(UserRepoBase).add_test_user() From 96625845605a653f49028438474d3789347878e7 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Mon, 14 Dec 2020 19:51:25 +0100 Subject: [PATCH 37/86] Improved session reference --- .../database/connection/base/database_connection_base.py | 4 ++-- src/sh_edraft/database/connection/database_connection.py | 6 +++--- .../database/context/base/database_context_base.py | 4 ++-- src/sh_edraft/database/context/database_context.py | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sh_edraft/database/connection/base/database_connection_base.py b/src/sh_edraft/database/connection/base/database_connection_base.py index 8a3e28ec..9bc31427 100644 --- a/src/sh_edraft/database/connection/base/database_connection_base.py +++ b/src/sh_edraft/database/connection/base/database_connection_base.py @@ -1,7 +1,7 @@ from abc import abstractmethod, ABC from sqlalchemy import engine -from sqlalchemy.orm import session +from sqlalchemy.orm import Session class DatabaseConnectionBase(ABC): @@ -15,7 +15,7 @@ class DatabaseConnectionBase(ABC): @property @abstractmethod - def session(self) -> session: pass + def session(self) -> Session: pass @abstractmethod def connect(self, connection_string: str): pass diff --git a/src/sh_edraft/database/connection/database_connection.py b/src/sh_edraft/database/connection/database_connection.py index eac20341..9c50ae79 100644 --- a/src/sh_edraft/database/connection/database_connection.py +++ b/src/sh_edraft/database/connection/database_connection.py @@ -1,7 +1,7 @@ from typing import Optional from sqlalchemy import engine, create_engine -from sqlalchemy.orm import session, sessionmaker +from sqlalchemy.orm import Session, sessionmaker from sh_edraft.database.connection.base.database_connection_base import DatabaseConnectionBase from sh_edraft.database.model.database_settings import DatabaseSettings @@ -16,7 +16,7 @@ class DatabaseConnection(DatabaseConnectionBase): self._db_settings = database_settings self._engine: Optional[engine] = None - self._session: Optional[session] = None + self._session: Optional[Session] = None self._credentials: Optional[str] = None @property @@ -24,7 +24,7 @@ class DatabaseConnection(DatabaseConnectionBase): return self._engine @property - def session(self) -> session: + def session(self) -> Session: return self._session def connect(self, connection_string: str): diff --git a/src/sh_edraft/database/context/base/database_context_base.py b/src/sh_edraft/database/context/base/database_context_base.py index a18b6efe..b8294e64 100644 --- a/src/sh_edraft/database/context/base/database_context_base.py +++ b/src/sh_edraft/database/context/base/database_context_base.py @@ -1,7 +1,7 @@ from abc import abstractmethod from sqlalchemy import engine -from sqlalchemy.orm import session +from sqlalchemy.orm import Session from sh_edraft.service.base.service_base import ServiceBase @@ -18,7 +18,7 @@ class DatabaseContextBase(ServiceBase): @property @abstractmethod - def session(self) -> session: pass + def session(self) -> Session: pass @abstractmethod def connect(self, connection_string: str): pass diff --git a/src/sh_edraft/database/context/database_context.py b/src/sh_edraft/database/context/database_context.py index a9fd1b7e..07ba3719 100644 --- a/src/sh_edraft/database/context/database_context.py +++ b/src/sh_edraft/database/context/database_context.py @@ -1,5 +1,5 @@ from sqlalchemy import engine, Table -from sqlalchemy.orm import session +from sqlalchemy.orm import Session from sh_edraft.database.connection.database_connection import DatabaseConnection from sh_edraft.database.connection.base.database_connection_base import DatabaseConnectionBase @@ -22,7 +22,7 @@ class DatabaseContext(DatabaseContextBase): return self._db.engine @property - def session(self) -> session: + def session(self) -> Session: return self._db.session def create(self): From 096b50f9f1a79fb010d0b878fec7f883ba5809df Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Mon, 14 Dec 2020 21:10:26 +0100 Subject: [PATCH 38/86] Added console module --- src/sh_edraft/configuration/configuration.py | 15 +++- .../connection/database_connection.py | 11 ++- .../database/context/database_context.py | 11 ++- .../database/model/database_settings.py | 9 ++- src/sh_edraft/logging/logger.py | 35 ++++++--- .../logging/model/logging_settings.py | 9 ++- .../model/publish_settings_model.py | 9 ++- .../time/model/time_format_settings.py | 7 +- src/sh_edraft/utils/console.py | 11 --- src/sh_edraft/utils/console/__init__.py | 3 + src/sh_edraft/utils/console/console.py | 76 +++++++++++++++++++ src/sh_edraft/utils/console/model/__init__.py | 4 + .../utils/console/model/background_color.py | 14 ++++ .../utils/console/model/foreground_color.py | 14 ++++ 14 files changed, 187 insertions(+), 41 deletions(-) delete mode 100644 src/sh_edraft/utils/console.py create mode 100644 src/sh_edraft/utils/console/__init__.py create mode 100644 src/sh_edraft/utils/console/console.py create mode 100644 src/sh_edraft/utils/console/model/__init__.py create mode 100644 src/sh_edraft/utils/console/model/background_color.py create mode 100644 src/sh_edraft/utils/console/model/foreground_color.py diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index f32148f0..6bc844d4 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -8,7 +8,8 @@ from sh_edraft.configuration.model.configuration_variable_name import Configurat from sh_edraft.environment.base.environment_base import EnvironmentBase from sh_edraft.environment.hosting_environment import HostingEnvironment from sh_edraft.environment.model.environment_name import EnvironmentName -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class Configuration(ConfigurationBase): @@ -25,15 +26,21 @@ class Configuration(ConfigurationBase): @staticmethod def _print_info(name: str, message: str): - Console.write_line(f'[{name}] {message}', 'green') + Console.set_foreground_color(ForegroundColor.green) + Console.write_line(f'[{name}] {message}') + Console.set_foreground_color(ForegroundColor.default) @staticmethod def _print_warn(name: str, message: str): - Console.write_line(f'[{name}] {message}', 'yellow') + Console.set_foreground_color(ForegroundColor.yellow) + Console.write_line(f'[{name}] {message}') + Console.set_foreground_color(ForegroundColor.default) @staticmethod def _print_error(name: str, message: str): - Console.write_line(f'[{name}] {message}', 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(f'[{name}] {message}') + Console.set_foreground_color(ForegroundColor.default) def _set_variable(self, name: str, value: str): if name == ConfigurationVariableName.environment.value: diff --git a/src/sh_edraft/database/connection/database_connection.py b/src/sh_edraft/database/connection/database_connection.py index 9c50ae79..5878f2c0 100644 --- a/src/sh_edraft/database/connection/database_connection.py +++ b/src/sh_edraft/database/connection/database_connection.py @@ -5,7 +5,8 @@ from sqlalchemy.orm import Session, sessionmaker from sh_edraft.database.connection.base.database_connection_base import DatabaseConnectionBase from sh_edraft.database.model.database_settings import DatabaseSettings -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class DatabaseConnection(DatabaseConnectionBase): @@ -44,8 +45,12 @@ class DatabaseConnection(DatabaseConnectionBase): db_session = sessionmaker(bind=self._engine) self._session = db_session() - Console.write_line(f'[{__name__}] Connected to database', 'green') + Console.set_foreground_color(ForegroundColor.green) + Console.write_line(f'[{__name__}] Connected to database') + Console.set_foreground_color(ForegroundColor.default) except Exception as e: - Console.write_line(f'[{__name__}] Database connection failed -> {e}', 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(f'[{__name__}] Database connection failed -> {e}') + Console.set_foreground_color(ForegroundColor.default) exit() diff --git a/src/sh_edraft/database/context/database_context.py b/src/sh_edraft/database/context/database_context.py index 07ba3719..0a3790ad 100644 --- a/src/sh_edraft/database/context/database_context.py +++ b/src/sh_edraft/database/context/database_context.py @@ -6,7 +6,8 @@ from sh_edraft.database.connection.base.database_connection_base import Database from sh_edraft.database.context.base.database_context_base import DatabaseContextBase from sh_edraft.database.model.dbmodel import DBModel from sh_edraft.database.model.database_settings import DatabaseSettings -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class DatabaseContext(DatabaseContextBase): @@ -39,7 +40,11 @@ class DatabaseContext(DatabaseContextBase): DBModel.metadata.drop_all(self._db.engine, self._tables) DBModel.metadata.create_all(self._db.engine, self._tables, checkfirst=True) - Console.write_line(f'[{__name__}] Created tables', 'green') + Console.set_foreground_color(ForegroundColor.green) + Console.write_line(f'[{__name__}] Created tables') + Console.set_foreground_color(ForegroundColor.default) except Exception as e: - Console.write_line(f'[{__name__}] Creating tables failed -> {e}', 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(f'[{__name__}] Creating tables failed -> {e}') + Console.set_foreground_color(ForegroundColor.default) exit() diff --git a/src/sh_edraft/database/model/database_settings.py b/src/sh_edraft/database/model/database_settings.py index a8df384d..da3dc590 100644 --- a/src/sh_edraft/database/model/database_settings.py +++ b/src/sh_edraft/database/model/database_settings.py @@ -3,7 +3,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.database.model.database_settings_name import DatabaseSettingsName -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class DatabaseSettings(ConfigurationModelBase): @@ -71,5 +72,7 @@ class DatabaseSettings(ConfigurationModelBase): if DatabaseSettingsName.echo.value in settings: self._echo = bool(settings[DatabaseSettingsName.echo.value]) except Exception as e: - Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings', 'red') - Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') + Console.set_foreground_color(ForegroundColor.default) diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index a043b21b..21e91c01 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -8,7 +8,8 @@ from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model.logging_settings import LoggingSettings from sh_edraft.logging.model.logging_level import LoggingLevel from sh_edraft.time.model.time_format_settings import TimeFormatSettings -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class Logger(LoggerBase): @@ -80,7 +81,9 @@ class Logger(LoggerBase): def header(self, string: str): # append log and print message self._append_log(string) - Console.write_line(string, 'white') + Console.set_foreground_color(ForegroundColor.default) + Console.write_line(string) + Console.set_foreground_color(ForegroundColor.default) def trace(self, name: str, message: str): output = self._get_string(name, LoggingLevel.TRACE, message) @@ -91,7 +94,9 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.TRACE.value: - Console.write_line(output, 'green') + Console.set_foreground_color(ForegroundColor.green) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) def debug(self, name: str, message: str): output = self._get_string(name, LoggingLevel.DEBUG, message) @@ -102,7 +107,9 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.DEBUG.value: - Console.write_line(output, 'green') + Console.set_foreground_color(ForegroundColor.green) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) def info(self, name: str, message: str): output = self._get_string(name, LoggingLevel.INFO, message) @@ -113,7 +120,9 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.INFO.value: - Console.write_line(output, 'green') + Console.set_foreground_color(ForegroundColor.green) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) def warn(self, name: str, message: str): output = self._get_string(name, LoggingLevel.WARN, message) @@ -124,7 +133,9 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.WARN.value: - Console.write_line(output, 'yellow') + Console.set_foreground_color(ForegroundColor.yellow) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) def error(self, name: str, message: str, ex: Exception = None): output = '' @@ -141,7 +152,9 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.ERROR.value: - Console.write_line(output, 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) def fatal(self, name: str, message: str, ex: Exception = None): output = '' @@ -158,7 +171,9 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.FATAL.value: - Console.write_line(output, 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) exit() @@ -173,6 +188,8 @@ class Logger(LoggerBase): # check if message can be shown in console if self._console.value >= LoggingLevel.FATAL.value: - Console.write_line(output, 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(output) + Console.set_foreground_color(ForegroundColor.default) exit() diff --git a/src/sh_edraft/logging/model/logging_settings.py b/src/sh_edraft/logging/model/logging_settings.py index 47889dea..b884f944 100644 --- a/src/sh_edraft/logging/model/logging_settings.py +++ b/src/sh_edraft/logging/model/logging_settings.py @@ -3,8 +3,9 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.logging.model.logging_settings_name import LoggingSettingsName -from sh_edraft.utils.console import Console from sh_edraft.logging.model.logging_level import LoggingLevel +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class LoggingSettings(ConfigurationModelBase): @@ -55,5 +56,7 @@ class LoggingSettings(ConfigurationModelBase): self._console = LoggingLevel[settings[LoggingSettingsName.console_level.value]] self._level = LoggingLevel[settings[LoggingSettingsName.file_level.value]] except Exception as e: - Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings', 'red') - Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') + Console.set_foreground_color(ForegroundColor.default) diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index a743692a..3b9ed148 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -4,7 +4,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.publishing.model.template import Template from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class PublishSettings(ConfigurationModelBase): @@ -78,6 +79,8 @@ class PublishSettings(ConfigurationModelBase): self._excluded_files = settings[PublishSettingsName.excluded_files.value] self._template_ending = settings[PublishSettingsName.template_ending.value] except Exception as e: + Console.set_foreground_color(ForegroundColor.red) Console.write_line( - f'[ ERROR ] [ {__name__} ]: Reading error in {PublishSettingsName.publish.value} settings', 'red') - Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') + f'[ ERROR ] [ {__name__} ]: Reading error in {PublishSettingsName.publish.value} settings') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') + Console.set_foreground_color(ForegroundColor.default) diff --git a/src/sh_edraft/time/model/time_format_settings.py b/src/sh_edraft/time/model/time_format_settings.py index 64508ef2..55366710 100644 --- a/src/sh_edraft/time/model/time_format_settings.py +++ b/src/sh_edraft/time/model/time_format_settings.py @@ -3,7 +3,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.time.model.time_format_settings_names import TimeFormatSettingsNames -from sh_edraft.utils.console import Console +from sh_edraft.utils.console.console import Console +from sh_edraft.utils.console.model.foreground_color import ForegroundColor class TimeFormatSettings(ConfigurationModelBase): @@ -56,5 +57,7 @@ class TimeFormatSettings(ConfigurationModelBase): self._date_time_format = settings[TimeFormatSettingsNames.date_time_format.value] self._date_time_log_format = settings[TimeFormatSettingsNames.date_time_log_format.value] except Exception as e: + Console.set_foreground_color(ForegroundColor.red) Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings') - Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}', 'red') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') + Console.set_foreground_color(ForegroundColor.default) diff --git a/src/sh_edraft/utils/console.py b/src/sh_edraft/utils/console.py deleted file mode 100644 index 1d014a9c..00000000 --- a/src/sh_edraft/utils/console.py +++ /dev/null @@ -1,11 +0,0 @@ -from termcolor import colored - - -class Console: - - @staticmethod - def write_line(string: str, color: str = None): - if color is not None: - print(colored(string, color)) - else: - print(string) diff --git a/src/sh_edraft/utils/console/__init__.py b/src/sh_edraft/utils/console/__init__.py new file mode 100644 index 00000000..161a350e --- /dev/null +++ b/src/sh_edraft/utils/console/__init__.py @@ -0,0 +1,3 @@ +# imports: + +from .console import Console diff --git a/src/sh_edraft/utils/console/console.py b/src/sh_edraft/utils/console/console.py new file mode 100644 index 00000000..f4b13254 --- /dev/null +++ b/src/sh_edraft/utils/console/console.py @@ -0,0 +1,76 @@ +import os +import subprocess +from typing import Union +from termcolor import colored + +from sh_edraft.utils.console.model.background_color import BackgroundColor +from sh_edraft.utils.console.model.foreground_color import ForegroundColor + + +class Console: + _background_color: BackgroundColor = BackgroundColor.default + _foreground_color: ForegroundColor = ForegroundColor.default + + @property + def background_color(self) -> BackgroundColor: + return self._background_color + + @property + def foreground_color(self) -> ForegroundColor: + return self._foreground_color + + @classmethod + def set_background_color(cls, color: Union[BackgroundColor, str]): + if type(color) is str: + cls._background_color = BackgroundColor[color] + else: + cls._background_color = color + + @classmethod + def set_foreground_color(cls, color: Union[ForegroundColor, str]): + if type(color) is str: + cls._foreground_color = ForegroundColor[color] + else: + cls._foreground_color = color + + # useful methods + @staticmethod + def clear(): + os.system('cls' if os.name == 'nt' else 'clear') + + @staticmethod + def new(): + if os.name == 'nt': + os.system("start /wait cmd") + else: + p = subprocess.Popen(args=["gnome-terminal"]) + p.communicate() + + @staticmethod + def read(output: str = None) -> str: + user_input = input(output if output else '') + return user_input[0] + + @staticmethod + def read_line(output: str = None) -> str: + return input(output if output else '') + + @classmethod + def reset(cls): + cls._background_color = BackgroundColor.default + cls._foreground_color = ForegroundColor.default + + @classmethod + def write(cls, string: str): + if cls._foreground_color == ForegroundColor.default: + print(colored(string), end='') + else: + print(colored(string, cls._foreground_color.value), end='') + + @classmethod + def write_line(cls, *args): + string = ' '.join(map(str, args)) + if cls._foreground_color == ForegroundColor.default: + print(colored(string)) + else: + print(colored(string, cls._foreground_color.value)) diff --git a/src/sh_edraft/utils/console/model/__init__.py b/src/sh_edraft/utils/console/model/__init__.py new file mode 100644 index 00000000..c5051d39 --- /dev/null +++ b/src/sh_edraft/utils/console/model/__init__.py @@ -0,0 +1,4 @@ +# imports: + +from .background_color import BackgroundColor +from .foreground_color import ForegroundColor diff --git a/src/sh_edraft/utils/console/model/background_color.py b/src/sh_edraft/utils/console/model/background_color.py new file mode 100644 index 00000000..a50f49c8 --- /dev/null +++ b/src/sh_edraft/utils/console/model/background_color.py @@ -0,0 +1,14 @@ +from enum import Enum + + +class BackgroundColor(Enum): + + default = 'default' + grey = 'grey' + red = 'red' + green = 'green' + yellow = 'yellow' + blue = 'blue' + magenta = 'magenta' + cyan = 'cyan' + white = 'white' diff --git a/src/sh_edraft/utils/console/model/foreground_color.py b/src/sh_edraft/utils/console/model/foreground_color.py new file mode 100644 index 00000000..463d4ae7 --- /dev/null +++ b/src/sh_edraft/utils/console/model/foreground_color.py @@ -0,0 +1,14 @@ +from enum import Enum + + +class ForegroundColor(Enum): + + default = 'default' + grey = 'grey' + red = 'red' + green = 'green' + yellow = 'yellow' + blue = 'blue' + magenta = 'magenta' + cyan = 'cyan' + white = 'white' From 7473b8deaba3378993156fde542a588d71d3b922 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 14:03:31 +0100 Subject: [PATCH 39/86] Improved console --- src/sh_edraft/hosting/application_host.py | 4 + src/sh_edraft/utils/console/console.py | 101 ++++++++++++++---- .../utils/console/model/background_color.py | 18 ++-- src/tests_dev/program.py | 18 +++- 4 files changed, 108 insertions(+), 33 deletions(-) diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index fa4b2182..339916c6 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -1,3 +1,4 @@ +import atexit from datetime import datetime from sh_edraft.configuration.configuration import Configuration @@ -7,6 +8,7 @@ from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.service.providing.service_provider import ServiceProvider from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase +from sh_edraft.utils.console import Console class ApplicationHost(ApplicationHostBase): @@ -27,6 +29,8 @@ class ApplicationHost(ApplicationHostBase): self._start_time: datetime = datetime.now() self._end_time: datetime = datetime.now() + atexit.register(Console.close) + @property def configuration(self) -> ConfigurationBase: return self._config diff --git a/src/sh_edraft/utils/console/console.py b/src/sh_edraft/utils/console/console.py index f4b13254..deb7bc50 100644 --- a/src/sh_edraft/utils/console/console.py +++ b/src/sh_edraft/utils/console/console.py @@ -1,6 +1,8 @@ +import contextlib +import io import os -import subprocess -from typing import Union +import sys +from typing import Union, Optional from termcolor import colored from sh_edraft.utils.console.model.background_color import BackgroundColor @@ -10,14 +12,26 @@ from sh_edraft.utils.console.model.foreground_color import ForegroundColor class Console: _background_color: BackgroundColor = BackgroundColor.default _foreground_color: ForegroundColor = ForegroundColor.default + _x: Optional[int] = None + _y: Optional[int] = None - @property - def background_color(self) -> BackgroundColor: - return self._background_color + """ + Properties + """ + @classmethod @property - def foreground_color(self) -> ForegroundColor: - return self._foreground_color + def background_color(cls) -> str: + return str(cls._background_color.value) + + @classmethod + @property + def foreground_color(cls) -> str: + return str(cls._foreground_color.value) + + """ + Settings + """ @classmethod def set_background_color(cls, color: Union[BackgroundColor, str]): @@ -33,18 +47,54 @@ class Console: else: cls._foreground_color = color - # useful methods + @classmethod + def reset_cursor_position(cls): + cls._x = None + cls._y = None + + @classmethod + def set_cursor_position(cls, x: int, y: int): + cls._x = x + cls._y = y + + """ + Useful protected methods + """ + + @classmethod + def _output(cls, string: str, x: int = None, y: int = None, end='\n'): + args = [] + colored_args = [] + + if x is not None and y is not None: + args.append(f'\033[{x};{y}H') + elif cls._x is not None and cls._y is not None: + args.append(f'\033[{cls._x};{cls._y}H') + + colored_args.append(string) + if cls._foreground_color != ForegroundColor.default and cls._background_color == BackgroundColor.default: + colored_args.append(cls._foreground_color.value) + elif cls._foreground_color == ForegroundColor.default and cls._background_color != BackgroundColor.default: + colored_args.append(cls._background_color.value) + elif cls._foreground_color != ForegroundColor.default and cls._background_color != BackgroundColor.default: + colored_args.append(cls._foreground_color.value) + colored_args.append(cls._background_color.value) + + args.append(colored(*colored_args)) + print(*args, end=end) + + """ + Useful public methods + """ + @staticmethod def clear(): os.system('cls' if os.name == 'nt' else 'clear') @staticmethod - def new(): - if os.name == 'nt': - os.system("start /wait cmd") - else: - p = subprocess.Popen(args=["gnome-terminal"]) - p.communicate() + def close(): + Console.read_line('\nPress any key to continue...') + exit() @staticmethod def read(output: str = None) -> str: @@ -61,16 +111,21 @@ class Console: cls._foreground_color = ForegroundColor.default @classmethod - def write(cls, string: str): - if cls._foreground_color == ForegroundColor.default: - print(colored(string), end='') - else: - print(colored(string, cls._foreground_color.value), end='') + def write(cls, *args): + string = ' '.join(map(str, args)) + cls._output(string, end='') + + @classmethod + def write_at(cls, x: int, y: int, *args): + string = ' '.join(map(str, args)) + cls._output(string, x, y) @classmethod def write_line(cls, *args): string = ' '.join(map(str, args)) - if cls._foreground_color == ForegroundColor.default: - print(colored(string)) - else: - print(colored(string, cls._foreground_color.value)) + cls._output(string) + + @classmethod + def write_line_at(cls, x: int, y: int, *args): + string = ' '.join(map(str, args)) + cls._output(string, x, y) diff --git a/src/sh_edraft/utils/console/model/background_color.py b/src/sh_edraft/utils/console/model/background_color.py index a50f49c8..f4947e30 100644 --- a/src/sh_edraft/utils/console/model/background_color.py +++ b/src/sh_edraft/utils/console/model/background_color.py @@ -3,12 +3,12 @@ from enum import Enum class BackgroundColor(Enum): - default = 'default' - grey = 'grey' - red = 'red' - green = 'green' - yellow = 'yellow' - blue = 'blue' - magenta = 'magenta' - cyan = 'cyan' - white = 'white' + default = 'on_default' + grey = 'on_grey' + red = 'on_red' + green = 'on_green' + yellow = 'on_yellow' + blue = 'on_blue' + magenta = 'on_magenta' + cyan = 'on_cyan' + white = 'on_white' diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index baf29064..c9d1574a 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -8,7 +8,7 @@ from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.service.providing.base import ServiceProviderBase -from sh_edraft.utils import CredentialManager +from sh_edraft.utils import CredentialManager, Console from tests_dev.db.user_repo import UserRepo from tests_dev.db.user_repo_base import UserRepoBase @@ -56,3 +56,19 @@ class Program(ApplicationBase): self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') self._services.get_service(UserRepoBase).add_test_user() + + Console.clear() + Console.write_line('Hello', 'World') + # name = Console.read_line('Name: ') + # Console.write_line('Hello', name) + Console.set_foreground_color('red') + Console.set_background_color('green') + Console.set_cursor_position(5, 5) + Console.write_line('Error') + Console.write_line_at(10, 10, 'Error') + Console.reset_cursor_position() + Console.set_foreground_color('green') + Console.set_background_color('default') + Console.write('Test') + Console.write_line('1') + Console.write_line(Console.foreground_color) From 78c4b6ef0967d5d510a11f464cf162b01fc963c7 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 16:53:15 +0100 Subject: [PATCH 40/86] Improved console --- src/sh_edraft/configuration/configuration.py | 4 +- src/sh_edraft/{utils => }/console/__init__.py | 0 src/sh_edraft/{utils => }/console/console.py | 38 +++++++++++-------- .../{utils => }/console/model/__init__.py | 0 .../console/model/background_color.py | 0 .../console/model/foreground_color.py | 0 .../connection/database_connection.py | 4 +- .../database/context/database_context.py | 4 +- .../database/model/database_settings.py | 4 +- src/sh_edraft/hosting/application_host.py | 2 +- src/sh_edraft/logging/logger.py | 4 +- .../logging/model/logging_settings.py | 4 +- .../model/publish_settings_model.py | 4 +- .../time/model/time_format_settings.py | 4 +- src/sh_edraft/utils/__init__.py | 1 - src/tests_dev/program.py | 12 ++++-- 16 files changed, 47 insertions(+), 38 deletions(-) rename src/sh_edraft/{utils => }/console/__init__.py (100%) rename src/sh_edraft/{utils => }/console/console.py (81%) rename src/sh_edraft/{utils => }/console/model/__init__.py (100%) rename src/sh_edraft/{utils => }/console/model/background_color.py (100%) rename src/sh_edraft/{utils => }/console/model/foreground_color.py (100%) diff --git a/src/sh_edraft/configuration/configuration.py b/src/sh_edraft/configuration/configuration.py index 6bc844d4..f4007ada 100644 --- a/src/sh_edraft/configuration/configuration.py +++ b/src/sh_edraft/configuration/configuration.py @@ -8,8 +8,8 @@ from sh_edraft.configuration.model.configuration_variable_name import Configurat from sh_edraft.environment.base.environment_base import EnvironmentBase from sh_edraft.environment.hosting_environment import HostingEnvironment from sh_edraft.environment.model.environment_name import EnvironmentName -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model import ForegroundColor class Configuration(ConfigurationBase): diff --git a/src/sh_edraft/utils/console/__init__.py b/src/sh_edraft/console/__init__.py similarity index 100% rename from src/sh_edraft/utils/console/__init__.py rename to src/sh_edraft/console/__init__.py diff --git a/src/sh_edraft/utils/console/console.py b/src/sh_edraft/console/console.py similarity index 81% rename from src/sh_edraft/utils/console/console.py rename to src/sh_edraft/console/console.py index deb7bc50..fb4612d9 100644 --- a/src/sh_edraft/utils/console/console.py +++ b/src/sh_edraft/console/console.py @@ -1,12 +1,9 @@ -import contextlib -import io import os -import sys from typing import Union, Optional from termcolor import colored -from sh_edraft.utils.console.model.background_color import BackgroundColor -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.model.background_color import BackgroundColor +from sh_edraft.console.model.foreground_color import ForegroundColor class Console: @@ -93,17 +90,24 @@ class Console: @staticmethod def close(): - Console.read_line('\nPress any key to continue...') + Console.reset() + Console.write('\n\n\nPress any key to continue...') + Console.read_line() exit() - @staticmethod - def read(output: str = None) -> str: - user_input = input(output if output else '') - return user_input[0] + @classmethod + def read(cls, output: str = None) -> str: + if output is not None: + cls.write(output) - @staticmethod - def read_line(output: str = None) -> str: - return input(output if output else '') + return input()[0] + + @classmethod + def read_line(cls, output: str = None) -> str: + if output is not None: + cls.write(output) + + return input() @classmethod def reset(cls): @@ -118,14 +122,16 @@ class Console: @classmethod def write_at(cls, x: int, y: int, *args): string = ' '.join(map(str, args)) - cls._output(string, x, y) + cls._output(string, x, y, end='') @classmethod def write_line(cls, *args): string = ' '.join(map(str, args)) - cls._output(string) + cls._output('') + cls._output(string, end='') @classmethod def write_line_at(cls, x: int, y: int, *args): string = ' '.join(map(str, args)) - cls._output(string, x, y) + cls._output('', end='') + cls._output(string, x, y, end='') diff --git a/src/sh_edraft/utils/console/model/__init__.py b/src/sh_edraft/console/model/__init__.py similarity index 100% rename from src/sh_edraft/utils/console/model/__init__.py rename to src/sh_edraft/console/model/__init__.py diff --git a/src/sh_edraft/utils/console/model/background_color.py b/src/sh_edraft/console/model/background_color.py similarity index 100% rename from src/sh_edraft/utils/console/model/background_color.py rename to src/sh_edraft/console/model/background_color.py diff --git a/src/sh_edraft/utils/console/model/foreground_color.py b/src/sh_edraft/console/model/foreground_color.py similarity index 100% rename from src/sh_edraft/utils/console/model/foreground_color.py rename to src/sh_edraft/console/model/foreground_color.py diff --git a/src/sh_edraft/database/connection/database_connection.py b/src/sh_edraft/database/connection/database_connection.py index 5878f2c0..b3397113 100644 --- a/src/sh_edraft/database/connection/database_connection.py +++ b/src/sh_edraft/database/connection/database_connection.py @@ -5,8 +5,8 @@ from sqlalchemy.orm import Session, sessionmaker from sh_edraft.database.connection.base.database_connection_base import DatabaseConnectionBase from sh_edraft.database.model.database_settings import DatabaseSettings -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class DatabaseConnection(DatabaseConnectionBase): diff --git a/src/sh_edraft/database/context/database_context.py b/src/sh_edraft/database/context/database_context.py index 0a3790ad..436ed53e 100644 --- a/src/sh_edraft/database/context/database_context.py +++ b/src/sh_edraft/database/context/database_context.py @@ -6,8 +6,8 @@ from sh_edraft.database.connection.base.database_connection_base import Database from sh_edraft.database.context.base.database_context_base import DatabaseContextBase from sh_edraft.database.model.dbmodel import DBModel from sh_edraft.database.model.database_settings import DatabaseSettings -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class DatabaseContext(DatabaseContextBase): diff --git a/src/sh_edraft/database/model/database_settings.py b/src/sh_edraft/database/model/database_settings.py index da3dc590..aed39e5f 100644 --- a/src/sh_edraft/database/model/database_settings.py +++ b/src/sh_edraft/database/model/database_settings.py @@ -3,8 +3,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.database.model.database_settings_name import DatabaseSettingsName -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class DatabaseSettings(ConfigurationModelBase): diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index 339916c6..9709c2c1 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -8,7 +8,7 @@ from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.service.providing.service_provider import ServiceProvider from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase -from sh_edraft.utils.console import Console +from sh_edraft.console import Console class ApplicationHost(ApplicationHostBase): diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index 21e91c01..ec96469e 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -8,8 +8,8 @@ from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.logging.model.logging_settings import LoggingSettings from sh_edraft.logging.model.logging_level import LoggingLevel from sh_edraft.time.model.time_format_settings import TimeFormatSettings -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class Logger(LoggerBase): diff --git a/src/sh_edraft/logging/model/logging_settings.py b/src/sh_edraft/logging/model/logging_settings.py index b884f944..563369cc 100644 --- a/src/sh_edraft/logging/model/logging_settings.py +++ b/src/sh_edraft/logging/model/logging_settings.py @@ -4,8 +4,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.logging.model.logging_settings_name import LoggingSettingsName from sh_edraft.logging.model.logging_level import LoggingLevel -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class LoggingSettings(ConfigurationModelBase): diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index 3b9ed148..4111d7fc 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -4,8 +4,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.publishing.model.template import Template from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class PublishSettings(ConfigurationModelBase): diff --git a/src/sh_edraft/time/model/time_format_settings.py b/src/sh_edraft/time/model/time_format_settings.py index 55366710..664192a4 100644 --- a/src/sh_edraft/time/model/time_format_settings.py +++ b/src/sh_edraft/time/model/time_format_settings.py @@ -3,8 +3,8 @@ from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.time.model.time_format_settings_names import TimeFormatSettingsNames -from sh_edraft.utils.console.console import Console -from sh_edraft.utils.console.model.foreground_color import ForegroundColor +from sh_edraft.console.console import Console +from sh_edraft.console.model.foreground_color import ForegroundColor class TimeFormatSettings(ConfigurationModelBase): diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py index 10d2e9e5..db025911 100644 --- a/src/sh_edraft/utils/__init__.py +++ b/src/sh_edraft/utils/__init__.py @@ -20,7 +20,6 @@ __version__ = '2020.12.5' from collections import namedtuple # imports: -from .console import Console from .credential_manager import CredentialManager VersionInfo = namedtuple('VersionInfo', 'major minor micro') diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index c9d1574a..391a44ef 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,6 +1,7 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.console import Console from sh_edraft.database.context import DatabaseContext from sh_edraft.database.model import DatabaseSettings from sh_edraft.hosting import ApplicationHost @@ -8,7 +9,7 @@ from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase from sh_edraft.service.providing.base import ServiceProviderBase -from sh_edraft.utils import CredentialManager, Console +from sh_edraft.utils import CredentialManager from tests_dev.db.user_repo import UserRepo from tests_dev.db.user_repo_base import UserRepoBase @@ -65,10 +66,13 @@ class Program(ApplicationBase): Console.set_background_color('green') Console.set_cursor_position(5, 5) Console.write_line('Error') - Console.write_line_at(10, 10, 'Error') + Console.write_line_at(10, 5, 'Error') + Console.write_at(15, 5, 'Error') Console.reset_cursor_position() Console.set_foreground_color('green') Console.set_background_color('default') - Console.write('Test') - Console.write_line('1') + Console.write_line('Test') + Console.write('1') + # Console.write('x: ') + # Console.read_line('Test> ') Console.write_line(Console.foreground_color) From b6cbafbd0dddf4a686c73a647fc0461f0eee2b69 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 16:54:15 +0100 Subject: [PATCH 41/86] Improved ApplicationHost --- src/sh_edraft/hosting/application_host.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sh_edraft/hosting/application_host.py b/src/sh_edraft/hosting/application_host.py index 9709c2c1..1c5ed011 100644 --- a/src/sh_edraft/hosting/application_host.py +++ b/src/sh_edraft/hosting/application_host.py @@ -8,7 +8,7 @@ from sh_edraft.hosting.application_runtime import ApplicationRuntime from sh_edraft.hosting.base.application_host_base import ApplicationHostBase from sh_edraft.service.providing.service_provider import ServiceProvider from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase -from sh_edraft.console import Console +from sh_edraft.console.console import Console class ApplicationHost(ApplicationHostBase): From 6f82bd8b357ab44d4fbb65312444d57fba1647b0 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 17:09:04 +0100 Subject: [PATCH 42/86] Improved publisher --- .../model/publish_settings_model.py | 2 +- src/tests_dev/appsettings.development.json | 1 + src/tests_dev/appsettings.edrafts-pc.json | 57 +++++++++++++++++ src/tests_dev/publisher.py | 62 +++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/tests_dev/appsettings.edrafts-pc.json create mode 100644 src/tests_dev/publisher.py diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index 4111d7fc..9412be5b 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -74,7 +74,7 @@ class PublishSettings(ConfigurationModelBase): try: self._source_path = settings[PublishSettingsName.source_path.value] self._dist_path = settings[PublishSettingsName.dist_path.value] - self._templates = settings[PublishSettingsName.templates.value] + self._templates = Template().from_dict(settings[PublishSettingsName.templates.value]) self._included_files = settings[PublishSettingsName.included_files.value] self._excluded_files = settings[PublishSettingsName.excluded_files.value] self._template_ending = settings[PublishSettingsName.template_ending.value] diff --git a/src/tests_dev/appsettings.development.json b/src/tests_dev/appsettings.development.json index 3a54f3cc..d134912e 100644 --- a/src/tests_dev/appsettings.development.json +++ b/src/tests_dev/appsettings.development.json @@ -5,6 +5,7 @@ "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" }, + "DatabaseSettings": { "ConnectionString": "mysql+mysqlconnector://sh_cpl:$credentials@localhost/sh_cpl", "Credentials": "MHZhc0Y2bjhKc1VUMWV0Qw==", diff --git a/src/tests_dev/appsettings.edrafts-pc.json b/src/tests_dev/appsettings.edrafts-pc.json new file mode 100644 index 00000000..e73add9f --- /dev/null +++ b/src/tests_dev/appsettings.edrafts-pc.json @@ -0,0 +1,57 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }, + "PublisherSettings": { + "SourcePath": "../", + "DistPath": "../../dist", + "Templates": [ + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "all", + "Description": "", + "LongDescription": "", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "major": 2020, + "minor": 12, + "micro": 9 + } + }, + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "sh_edraft", + "Description": "common python library", + "LongDescription": "Library to share common classes and models used at sh-edraft.de", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "major": 2020, + "minor": 12, + "micro": 9 + } + } + ], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt" + } +} \ No newline at end of file diff --git a/src/tests_dev/publisher.py b/src/tests_dev/publisher.py new file mode 100644 index 00000000..842e1d86 --- /dev/null +++ b/src/tests_dev/publisher.py @@ -0,0 +1,62 @@ +from typing import Optional + +from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting.base import ApplicationBase +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.publishing import Publisher +from sh_edraft.publishing.base import PublisherBase +from sh_edraft.service.providing.base import ServiceProviderBase + + +class Program(ApplicationBase): + + def __init__(self): + ApplicationBase.__init__(self) + + self._app_host: Optional[ApplicationHost] = None + self._services: Optional[ServiceProviderBase] = None + self._configuration: Optional[ConfigurationBase] = None + self._logger: Optional[LoggerBase] = None + self._publisher: Optional[PublisherBase] = None + + def create_application_host(self): + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + def create_configuration(self): + self._configuration.add_environment_variables('PYTHON_') + self._configuration.add_environment_variables('CPL_') + self._configuration.add_argument_variables() + self._configuration.add_json_file(f'appsettings.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) + + def create_services(self): + # Add and create logger + self._services.add_singleton(LoggerBase, Logger) + self._logger = self._services.get_service(LoggerBase) + + # Add and create publisher + self._services.add_singleton(PublisherBase, Publisher) + self._publisher: Publisher = self._services.get_service(PublisherBase) + + def main(self): + self._logger.header(f'{self._configuration.environment.application_name}:') + self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') + #self._publisher.exclude() + #self._publisher.include() + # self._publisher.create() + print(self._publisher) + + +if __name__ == '__main__': + program = Program() + program.create_application_host() + program.create_configuration() + program.create_services() + program.main() From 7ee2eff483a6bc515d483282bb5f899be998f725 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 17:27:52 +0100 Subject: [PATCH 43/86] Improved publisher --- src/sh_edraft/coding/model/version_enum.py | 6 +++--- src/sh_edraft/console/console.py | 12 ++++++++++++ .../publishing/model/publish_settings_model.py | 12 ++++++++---- src/sh_edraft/publishing/model/template.py | 5 ++--- src/tests/services/publishing/publisher.py | 2 +- src/tests_dev/appsettings.edrafts-pc.json | 14 +++++++------- src/tests_dev/publisher.py | 11 ++++++++--- 7 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/sh_edraft/coding/model/version_enum.py b/src/sh_edraft/coding/model/version_enum.py index 446b6e16..8c294c1e 100644 --- a/src/sh_edraft/coding/model/version_enum.py +++ b/src/sh_edraft/coding/model/version_enum.py @@ -3,6 +3,6 @@ from enum import Enum class VersionEnum(Enum): - Major = 'major' - Minor = 'minor' - Micro = 'micro' + Major = 'Major' + Minor = 'Minor' + Micro = 'Micro' diff --git a/src/sh_edraft/console/console.py b/src/sh_edraft/console/console.py index fb4612d9..2418cf8a 100644 --- a/src/sh_edraft/console/console.py +++ b/src/sh_edraft/console/console.py @@ -11,6 +11,7 @@ class Console: _foreground_color: ForegroundColor = ForegroundColor.default _x: Optional[int] = None _y: Optional[int] = None + _disabled: bool = False """ Properties @@ -60,6 +61,9 @@ class Console: @classmethod def _output(cls, string: str, x: int = None, y: int = None, end='\n'): + if cls._disabled: + return + args = [] colored_args = [] @@ -95,6 +99,14 @@ class Console: Console.read_line() exit() + @classmethod + def disable(cls): + cls._disabled = True + + @classmethod + def enable(cls): + cls._disabled = False + @classmethod def read(cls, output: str = None) -> str: if output is not None: diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publishing/model/publish_settings_model.py index 9412be5b..17b6b83c 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publishing/model/publish_settings_model.py @@ -15,10 +15,10 @@ class PublishSettings(ConfigurationModelBase): self._source_path: Optional[str] = None self._dist_path: Optional[str] = None - self._templates: Optional[list[Template]] = None + self._templates: list[Template] = [] - self._included_files: Optional[list[str]] = None - self._excluded_files: Optional[list[str]] = None + self._included_files: list[str] = [] + self._excluded_files: list[str] = [] self._template_ending: Optional[str] = None @@ -74,7 +74,11 @@ class PublishSettings(ConfigurationModelBase): try: self._source_path = settings[PublishSettingsName.source_path.value] self._dist_path = settings[PublishSettingsName.dist_path.value] - self._templates = Template().from_dict(settings[PublishSettingsName.templates.value]) + for template in settings[PublishSettingsName.templates.value]: + temp = Template() + temp.from_dict(template) + self._templates.append(temp) + self._included_files = settings[PublishSettingsName.included_files.value] self._excluded_files = settings[PublishSettingsName.excluded_files.value] self._template_ending = settings[PublishSettingsName.template_ending.value] diff --git a/src/sh_edraft/publishing/model/template.py b/src/sh_edraft/publishing/model/template.py index 91ba29e3..cea0f09c 100644 --- a/src/sh_edraft/publishing/model/template.py +++ b/src/sh_edraft/publishing/model/template.py @@ -19,7 +19,7 @@ class Template(ConfigurationModelBase): license_description: Optional[str] = None, title: Optional[str] = None, author: Optional[str] = None, - version: Optional[dict] = None + version: Optional[Version] = Version() ): ConfigurationModelBase.__init__(self) self._template_path: Optional[str] = template_path @@ -33,8 +33,7 @@ class Template(ConfigurationModelBase): self._title: Optional[str] = title self._author: Optional[str] = author - self._version: Optional[Version] = Version() - self._version.from_dict(version) + self._version: Optional[Version] = version self._file_content: Optional[str] = None diff --git a/src/tests/services/publishing/publisher.py b/src/tests/services/publishing/publisher.py index afb17eaa..9b75d13a 100644 --- a/src/tests/services/publishing/publisher.py +++ b/src/tests/services/publishing/publisher.py @@ -15,7 +15,7 @@ from sh_edraft.time.model import TimeFormatSettings class PublisherTest(unittest.TestCase): def _configure(self): - self._version = Version(2020, 12, 5).to_dict() + self._version = Version(2020, 12, 5) templates = [ Template( '../../publish_templates/all_template.txt', diff --git a/src/tests_dev/appsettings.edrafts-pc.json b/src/tests_dev/appsettings.edrafts-pc.json index e73add9f..3fb75c62 100644 --- a/src/tests_dev/appsettings.edrafts-pc.json +++ b/src/tests_dev/appsettings.edrafts-pc.json @@ -11,7 +11,7 @@ "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" }, - "PublisherSettings": { + "PublishSettings": { "SourcePath": "../", "DistPath": "../../dist", "Templates": [ @@ -27,9 +27,9 @@ "Title": "", "Author": "Sven Heidemann", "Version": { - "major": 2020, - "minor": 12, - "micro": 9 + "Major": 2020, + "Minor": 12, + "Micro": 9 } }, { @@ -44,9 +44,9 @@ "Title": "", "Author": "Sven Heidemann", "Version": { - "major": 2020, - "minor": 12, - "micro": 9 + "Major": 2020, + "Minor": 12, + "Micro": 9 } } ], diff --git a/src/tests_dev/publisher.py b/src/tests_dev/publisher.py index 842e1d86..78b8ddf4 100644 --- a/src/tests_dev/publisher.py +++ b/src/tests_dev/publisher.py @@ -1,6 +1,7 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.console import Console from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger @@ -20,6 +21,7 @@ class Program(ApplicationBase): self._configuration: Optional[ConfigurationBase] = None self._logger: Optional[LoggerBase] = None self._publisher: Optional[PublisherBase] = None + # Console.disable() def create_application_host(self): self._app_host = ApplicationHost() @@ -36,6 +38,7 @@ class Program(ApplicationBase): def create_services(self): # Add and create logger + Console.enable() self._services.add_singleton(LoggerBase, Logger) self._logger = self._services.get_service(LoggerBase) @@ -48,10 +51,12 @@ class Program(ApplicationBase): self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') - #self._publisher.exclude() - #self._publisher.include() + self._publisher.exclude('../tests') + self._publisher.exclude('../tests_dev') + # self._publisher.include() # self._publisher.create() - print(self._publisher) + self._publisher.create() + self._publisher.publish() if __name__ == '__main__': From e9722271fb158148b59a9ca17818acb51ea2d09d Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 17:29:32 +0100 Subject: [PATCH 44/86] Published for 2020.12.9 --- src/sh_edraft/__init__.py | 4 +-- src/sh_edraft/coding/__init__.py | 6 ++--- src/sh_edraft/coding/model/__init__.py | 8 +++--- src/sh_edraft/configuration/__init__.py | 4 +-- src/sh_edraft/configuration/base/__init__.py | 6 ++--- src/sh_edraft/configuration/model/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/console/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/console/model/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/database/__init__.py | 24 ++++++++++++++++++ src/sh_edraft/database/connection/__init__.py | 25 ++++++++++++++++++- .../database/connection/base/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/database/context/__init__.py | 25 ++++++++++++++++++- .../database/context/base/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/database/model/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/discord/__init__.py | 4 +-- src/sh_edraft/environment/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/environment/base/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/environment/model/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/hosting/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/hosting/base/__init__.py | 24 ++++++++++++++++++ src/sh_edraft/hosting/model/__init__.py | 24 ++++++++++++++++++ src/sh_edraft/logging/__init__.py | 4 +-- src/sh_edraft/logging/base/__init__.py | 4 +-- src/sh_edraft/logging/model/__init__.py | 8 +++--- src/sh_edraft/mailing/__init__.py | 4 +-- src/sh_edraft/messaging/__init__.py | 6 ++--- src/sh_edraft/publishing/__init__.py | 6 ++--- src/sh_edraft/publishing/base/__init__.py | 6 ++--- src/sh_edraft/publishing/model/__init__.py | 8 +++--- src/sh_edraft/service/__init__.py | 8 +++--- src/sh_edraft/service/base/__init__.py | 8 +++--- src/sh_edraft/service/model/__init__.py | 8 +++--- src/sh_edraft/service/providing/__init__.py | 25 ++++++++++++++++++- .../service/providing/base/__init__.py | 25 ++++++++++++++++++- .../service/providing/model/__init__.py | 25 ++++++++++++++++++- src/sh_edraft/time/__init__.py | 4 +-- src/sh_edraft/time/model/__init__.py | 8 +++--- src/sh_edraft/utils/__init__.py | 4 +-- src/tests/__init__.py | 4 +-- src/tests/configuration/__init__.py | 25 +++++++++++++++++++ src/tests/hosting/__init__.py | 25 +++++++++++++++++++ src/tests/service_providing/__init__.py | 25 +++++++++++++++++++ src/tests/services/__init__.py | 25 +++++++++++++++++++ src/tests/services/logging/__init__.py | 25 +++++++++++++++++++ src/tests/services/publishing/__init__.py | 25 +++++++++++++++++++ src/tests_dev/__init__.py | 25 +++++++++++++++++++ src/tests_dev/db/__init__.py | 25 +++++++++++++++++++ src/tests_dev/publisher.py | 4 --- 48 files changed, 693 insertions(+), 80 deletions(-) diff --git a/src/sh_edraft/__init__.py b/src/sh_edraft/__init__.py index 775e3790..a74b7597 100644 --- a/src/sh_edraft/__init__.py +++ b/src/sh_edraft/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/coding/__init__.py b/src/sh_edraft/coding/__init__.py index 375dc28f..74fd8f6b 100644 --- a/src/sh_edraft/coding/__init__.py +++ b/src/sh_edraft/coding/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.coding +sh_edraft.coding ~~~~~~~~~~~~~~~~~~~ @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.coding' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/coding/model/__init__.py b/src/sh_edraft/coding/model/__init__.py index 32344b00..ccdd0f5a 100644 --- a/src/sh_edraft/coding/model/__init__.py +++ b/src/sh_edraft/coding/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.coding.base +sh_edraft.coding.model ~~~~~~~~~~~~~~~~~~~ @@ -11,11 +11,11 @@ sh_edraft.coding.base """ -__title__ = 'sh_edraft.coding.base' +__title__ = 'sh_edraft.coding.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -24,4 +24,4 @@ from .version import Version from .version_enum import VersionEnum VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/configuration/__init__.py b/src/sh_edraft/configuration/__init__.py index 0aaef2f3..21979d7f 100644 --- a/src/sh_edraft/configuration/__init__.py +++ b/src/sh_edraft/configuration/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.configuration' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .configuration import Configuration VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/configuration/base/__init__.py b/src/sh_edraft/configuration/base/__init__.py index a9585439..28444895 100644 --- a/src/sh_edraft/configuration/base/__init__.py +++ b/src/sh_edraft/configuration/base/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.configuration.base +sh_edraft.configuration.base ~~~~~~~~~~~~~~~~~~~ @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.configuration.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -24,4 +24,4 @@ from .configuration_base import ConfigurationBase from .configuration_model_base import ConfigurationModelBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/configuration/model/__init__.py b/src/sh_edraft/configuration/model/__init__.py index a3c9f248..ae7cc417 100644 --- a/src/sh_edraft/configuration/model/__init__.py +++ b/src/sh_edraft/configuration/model/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.configuration.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.configuration.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .configuration_variable_name import ConfigurationVariableName + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/console/__init__.py b/src/sh_edraft/console/__init__.py index 161a350e..632019e8 100644 --- a/src/sh_edraft/console/__init__.py +++ b/src/sh_edraft/console/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.console +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.console' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .console import Console + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/console/model/__init__.py b/src/sh_edraft/console/model/__init__.py index c5051d39..3df50dae 100644 --- a/src/sh_edraft/console/model/__init__.py +++ b/src/sh_edraft/console/model/__init__.py @@ -1,4 +1,27 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.console.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.console.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .background_color import BackgroundColor from .foreground_color import ForegroundColor + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/database/__init__.py b/src/sh_edraft/database/__init__.py index 52f86f25..7bb526a4 100644 --- a/src/sh_edraft/database/__init__.py +++ b/src/sh_edraft/database/__init__.py @@ -1 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.database +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.database' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + # imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/database/connection/__init__.py b/src/sh_edraft/database/connection/__init__.py index eae4c82d..5f3406df 100644 --- a/src/sh_edraft/database/connection/__init__.py +++ b/src/sh_edraft/database/connection/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.database.connection +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.database.connection' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .database_connection import DatabaseConnection + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/database/connection/base/__init__.py b/src/sh_edraft/database/connection/base/__init__.py index 876327c9..492da1d6 100644 --- a/src/sh_edraft/database/connection/base/__init__.py +++ b/src/sh_edraft/database/connection/base/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.database.connection.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.database.connection.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .database_connection_base import DatabaseConnectionBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/database/context/__init__.py b/src/sh_edraft/database/context/__init__.py index 0e46ede4..1f5bc196 100644 --- a/src/sh_edraft/database/context/__init__.py +++ b/src/sh_edraft/database/context/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.database.context +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.database.context' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .database_context import DatabaseContext + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/database/context/base/__init__.py b/src/sh_edraft/database/context/base/__init__.py index ad5b61fb..63d9bb64 100644 --- a/src/sh_edraft/database/context/base/__init__.py +++ b/src/sh_edraft/database/context/base/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.database.context.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.database.context.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .database_context_base import DatabaseContextBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/database/model/__init__.py b/src/sh_edraft/database/model/__init__.py index b51f2dca..de87e001 100644 --- a/src/sh_edraft/database/model/__init__.py +++ b/src/sh_edraft/database/model/__init__.py @@ -1,5 +1,28 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.database.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.database.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .database_settings import DatabaseSettings from .database_settings_name import DatabaseSettingsName from .dbmodel import DBModel + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/discord/__init__.py b/src/sh_edraft/discord/__init__.py index e1ab9453..6e3c9e4c 100644 --- a/src/sh_edraft/discord/__init__.py +++ b/src/sh_edraft/discord/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.discord' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/environment/__init__.py b/src/sh_edraft/environment/__init__.py index 28c021f3..ac993870 100644 --- a/src/sh_edraft/environment/__init__.py +++ b/src/sh_edraft/environment/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.environment +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.environment' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .hosting_environment import HostingEnvironment + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/environment/base/__init__.py b/src/sh_edraft/environment/base/__init__.py index fec6499d..36b8b351 100644 --- a/src/sh_edraft/environment/base/__init__.py +++ b/src/sh_edraft/environment/base/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.environment.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.environment.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .environment_base import EnvironmentBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/environment/model/__init__.py b/src/sh_edraft/environment/model/__init__.py index 3204981f..59266f74 100644 --- a/src/sh_edraft/environment/model/__init__.py +++ b/src/sh_edraft/environment/model/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.environment.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.environment.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .environment_name import EnvironmentName + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/hosting/__init__.py b/src/sh_edraft/hosting/__init__.py index ec999843..d650f7e0 100644 --- a/src/sh_edraft/hosting/__init__.py +++ b/src/sh_edraft/hosting/__init__.py @@ -1,4 +1,27 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.hosting +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.hosting' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .application_host import ApplicationHost from .application_runtime import ApplicationRuntime + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/hosting/base/__init__.py b/src/sh_edraft/hosting/base/__init__.py index dfb25a31..47f46211 100644 --- a/src/sh_edraft/hosting/base/__init__.py +++ b/src/sh_edraft/hosting/base/__init__.py @@ -1,4 +1,28 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.hosting.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.hosting.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + # imports: from .application_base import ApplicationBase from .application_host_base import ApplicationHostBase from .application_runtime_base import ApplicationRuntimeBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/hosting/model/__init__.py b/src/sh_edraft/hosting/model/__init__.py index 52f86f25..2ff0878e 100644 --- a/src/sh_edraft/hosting/model/__init__.py +++ b/src/sh_edraft/hosting/model/__init__.py @@ -1 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.hosting.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.hosting.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + # imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/logging/__init__.py b/src/sh_edraft/logging/__init__.py index a70129f6..80fdec21 100644 --- a/src/sh_edraft/logging/__init__.py +++ b/src/sh_edraft/logging/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.logging' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .logger import Logger VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/logging/base/__init__.py b/src/sh_edraft/logging/base/__init__.py index 209ee125..83da99e0 100644 --- a/src/sh_edraft/logging/base/__init__.py +++ b/src/sh_edraft/logging/base/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.logging.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .logger_base import LoggerBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/logging/model/__init__.py b/src/sh_edraft/logging/model/__init__.py index 8c8ce494..e7bcd608 100644 --- a/src/sh_edraft/logging/model/__init__.py +++ b/src/sh_edraft/logging/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.logging.base +sh_edraft.logging.model ~~~~~~~~~~~~~~~~~~~ @@ -11,11 +11,11 @@ sh_edraft.logging.base """ -__title__ = 'sh_edraft.logging.base' +__title__ = 'sh_edraft.logging.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -25,4 +25,4 @@ from .logging_settings import LoggingSettings from .logging_settings_name import LoggingSettingsName VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/mailing/__init__.py b/src/sh_edraft/mailing/__init__.py index 5f2d9f23..4d478fe1 100644 --- a/src/sh_edraft/mailing/__init__.py +++ b/src/sh_edraft/mailing/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.mailing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/messaging/__init__.py b/src/sh_edraft/messaging/__init__.py index db61154c..873d0fe5 100644 --- a/src/sh_edraft/messaging/__init__.py +++ b/src/sh_edraft/messaging/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.messaging +sh_edraft.messaging ~~~~~~~~~~~~~~~~~~~ @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.messaging' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/publishing/__init__.py b/src/sh_edraft/publishing/__init__.py index 3147018a..f6aee612 100644 --- a/src/sh_edraft/publishing/__init__.py +++ b/src/sh_edraft/publishing/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publishing +sh_edraft.publishing ~~~~~~~~~~~~~~~~~~~ @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.publishing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .publisher import Publisher VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/publishing/base/__init__.py b/src/sh_edraft/publishing/base/__init__.py index 041cfa8f..d57eaf3d 100644 --- a/src/sh_edraft/publishing/base/__init__.py +++ b/src/sh_edraft/publishing/base/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publishing.base +sh_edraft.publishing.base ~~~~~~~~~~~~~~~~~~~ @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.publishing.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .publisher_base import PublisherBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/publishing/model/__init__.py b/src/sh_edraft/publishing/model/__init__.py index 98f26949..8b4b4a63 100644 --- a/src/sh_edraft/publishing/model/__init__.py +++ b/src/sh_edraft/publishing/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.publishing.base +sh_edraft.publishing.model ~~~~~~~~~~~~~~~~~~~ @@ -11,11 +11,11 @@ sh_edraft.publishing.base """ -__title__ = 'sh_edraft.publishing.base' +__title__ = 'sh_edraft.publishing.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -26,4 +26,4 @@ from .publish_settings_model import PublishSettings from .publish_settings_name import PublishSettingsName VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/service/__init__.py b/src/sh_edraft/service/__init__.py index abfc6044..7d487f52 100644 --- a/src/sh_edraft/service/__init__.py +++ b/src/sh_edraft/service/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.services +sh_edraft.service ~~~~~~~~~~~~~~~~~~~ @@ -11,15 +11,15 @@ sh_edraft.services """ -__title__ = 'sh_edraft.services' +__title__ = 'sh_edraft.service' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/service/base/__init__.py b/src/sh_edraft/service/base/__init__.py index d3d865d7..73148fb0 100644 --- a/src/sh_edraft/service/base/__init__.py +++ b/src/sh_edraft/service/base/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.services.base +sh_edraft.service.base ~~~~~~~~~~~~~~~~~~~ @@ -11,11 +11,11 @@ sh_edraft.services.base """ -__title__ = 'sh_edraft.services.base' +__title__ = 'sh_edraft.service.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .service_base import ServiceBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py index b95fe3c2..e268c5ed 100644 --- a/src/sh_edraft/service/model/__init__.py +++ b/src/sh_edraft/service/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.services.base +sh_edraft.service.model ~~~~~~~~~~~~~~~~~~~ @@ -11,11 +11,11 @@ sh_edraft.services.base """ -__title__ = 'sh_edraft.services.base' +__title__ = 'sh_edraft.service.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .provide_state import ProvideState VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/service/providing/__init__.py b/src/sh_edraft/service/providing/__init__.py index 7817c7f3..d4a3f100 100644 --- a/src/sh_edraft/service/providing/__init__.py +++ b/src/sh_edraft/service/providing/__init__.py @@ -1,4 +1,27 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.service.providing +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.service.providing' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + # imports: from .service_provider import ServiceProvider - from .service_provider import ServiceProviderBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/service/providing/base/__init__.py b/src/sh_edraft/service/providing/base/__init__.py index 4b5ed5b7..740e8631 100644 --- a/src/sh_edraft/service/providing/base/__init__.py +++ b/src/sh_edraft/service/providing/base/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.service.providing.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.service.providing.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .service_provider_base import ServiceProviderBase + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/service/providing/model/__init__.py b/src/sh_edraft/service/providing/model/__init__.py index 7c4dd264..779edb8d 100644 --- a/src/sh_edraft/service/providing/model/__init__.py +++ b/src/sh_edraft/service/providing/model/__init__.py @@ -1,3 +1,26 @@ -# imports: +# -*- coding: utf-8 -*- +""" +sh_edraft.service.providing.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.service.providing.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: from .provide_state import ProvideState + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/time/__init__.py b/src/sh_edraft/time/__init__.py index 8b6e4c87..d8460af8 100644 --- a/src/sh_edraft/time/__init__.py +++ b/src/sh_edraft/time/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.time' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/time/model/__init__.py b/src/sh_edraft/time/model/__init__.py index 6686c3d3..1056120c 100644 --- a/src/sh_edraft/time/model/__init__.py +++ b/src/sh_edraft/time/model/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -sh_edraft.time.base +sh_edraft.time.model ~~~~~~~~~~~~~~~~~~~ @@ -11,11 +11,11 @@ sh_edraft.time.base """ -__title__ = 'sh_edraft.time.base' +__title__ = 'sh_edraft.time.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -24,4 +24,4 @@ from .time_format_settings import TimeFormatSettings from .time_format_settings_names import TimeFormatSettingsNames VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/utils/__init__.py b/src/sh_edraft/utils/__init__.py index db025911..ab011b6e 100644 --- a/src/sh_edraft/utils/__init__.py +++ b/src/sh_edraft/utils/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.utils' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .credential_manager import CredentialManager VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/__init__.py b/src/tests/__init__.py index 6d9d25af..924bb32a 100644 --- a/src/tests/__init__.py +++ b/src/tests/__init__.py @@ -15,11 +15,11 @@ __title__ = 'tests' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.5' +__version__ = '2020.12.9' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=5) +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/configuration/__init__.py b/src/tests/configuration/__init__.py index e69de29b..2c43c7cd 100644 --- a/src/tests/configuration/__init__.py +++ b/src/tests/configuration/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests.configuration +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests.configuration' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/hosting/__init__.py b/src/tests/hosting/__init__.py index e69de29b..dd9b9446 100644 --- a/src/tests/hosting/__init__.py +++ b/src/tests/hosting/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests.hosting +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests.hosting' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/service_providing/__init__.py b/src/tests/service_providing/__init__.py index e69de29b..97f8de34 100644 --- a/src/tests/service_providing/__init__.py +++ b/src/tests/service_providing/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests.service_providing +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests.service_providing' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/services/__init__.py b/src/tests/services/__init__.py index e69de29b..ad20eee4 100644 --- a/src/tests/services/__init__.py +++ b/src/tests/services/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests.services +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests.services' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/services/logging/__init__.py b/src/tests/services/logging/__init__.py index e69de29b..37ae0e14 100644 --- a/src/tests/services/logging/__init__.py +++ b/src/tests/services/logging/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests.services.logging +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests.services.logging' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/services/publishing/__init__.py b/src/tests/services/publishing/__init__.py index e69de29b..dbe20dd2 100644 --- a/src/tests/services/publishing/__init__.py +++ b/src/tests/services/publishing/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests.services.publishing +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests.services.publishing' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests_dev/__init__.py b/src/tests_dev/__init__.py index e69de29b..caf789c0 100644 --- a/src/tests_dev/__init__.py +++ b/src/tests_dev/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests_dev +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests_dev' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests_dev/db/__init__.py b/src/tests_dev/db/__init__.py index e69de29b..44b89a68 100644 --- a/src/tests_dev/db/__init__.py +++ b/src/tests_dev/db/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +tests_dev.db +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'tests_dev.db' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests_dev/publisher.py b/src/tests_dev/publisher.py index 78b8ddf4..f07de2f0 100644 --- a/src/tests_dev/publisher.py +++ b/src/tests_dev/publisher.py @@ -21,7 +21,6 @@ class Program(ApplicationBase): self._configuration: Optional[ConfigurationBase] = None self._logger: Optional[LoggerBase] = None self._publisher: Optional[PublisherBase] = None - # Console.disable() def create_application_host(self): self._app_host = ApplicationHost() @@ -38,7 +37,6 @@ class Program(ApplicationBase): def create_services(self): # Add and create logger - Console.enable() self._services.add_singleton(LoggerBase, Logger) self._logger = self._services.get_service(LoggerBase) @@ -53,8 +51,6 @@ class Program(ApplicationBase): self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') self._publisher.exclude('../tests') self._publisher.exclude('../tests_dev') - # self._publisher.include() - # self._publisher.create() self._publisher.create() self._publisher.publish() From aa90adfd48c05a481ca45efa1e94f16947357c47 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 20:08:43 +0100 Subject: [PATCH 45/86] Publish improvements for pip install --- docs/cli.md | 6 ++++++ docs/install.md | 0 src/setup.py | 17 +++++++++++++++-- src/sh_edraft/cli/__init__.py | 25 +++++++++++++++++++++++++ src/sh_edraft/cli/cpl_cli.py | 8 ++++++++ src/tests_dev/publisher.py | 4 +++- 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 docs/cli.md create mode 100644 docs/install.md create mode 100644 src/sh_edraft/cli/__init__.py create mode 100644 src/sh_edraft/cli/cpl_cli.py diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 00000000..1ec439a0 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,6 @@ +prefix: cpl +commands: + new: + app + class + model \ No newline at end of file diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 00000000..e69de29b diff --git a/src/setup.py b/src/setup.py index 4f86d310..b413a815 100644 --- a/src/setup.py +++ b/src/setup.py @@ -3,10 +3,23 @@ import setuptools setuptools.setup( name='sh_edraft', version='2020.0.1', - packages=setuptools.find_packages(), + packages=setuptools.find_packages(exclude=["tests*"]), url='https://www.sh-edraft.de', license='MIT', author='Sven Heidemann', author_email='edraft.sh@gmail.com', - description='sh-edraft python common lib' + description='sh-edraft python common lib', + python_requires='>=3.8', + install_requires=[ + 'discord.py', + 'flask', + 'mysql-connector', + 'SQLAlchemy', + 'termcolor' + ], + entry_points={ + 'console_scripts': [ + 'cpl = sh_edraft.cli.cpl_cli:main' + ] + } ) diff --git a/src/sh_edraft/cli/__init__.py b/src/sh_edraft/cli/__init__.py new file mode 100644 index 00000000..89b6ae33 --- /dev/null +++ b/src/sh_edraft/cli/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli.py b/src/sh_edraft/cli/cpl_cli.py new file mode 100644 index 00000000..7d8e25e4 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli.py @@ -0,0 +1,8 @@ +class CPLCli: + def main(self): + print('Hello world') + + +def main(): + cli = CPLCli() + cli.main() diff --git a/src/tests_dev/publisher.py b/src/tests_dev/publisher.py index f07de2f0..f9eea080 100644 --- a/src/tests_dev/publisher.py +++ b/src/tests_dev/publisher.py @@ -1,7 +1,6 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase -from sh_edraft.console import Console from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger @@ -51,6 +50,9 @@ class Program(ApplicationBase): self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') self._publisher.exclude('../tests') self._publisher.exclude('../tests_dev') + self._publisher.include('../../LICENSE') + self._publisher.include('../../README.MD') + self._publisher.include('../../requirements.txt') self._publisher.create() self._publisher.publish() From d76bf4564503a689aabf51150c03f755ec0bfeb9 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 20:11:41 +0100 Subject: [PATCH 46/86] Improved setup.py --- docs/install.md | 2 ++ src/setup.py | 2 +- src/sh_edraft/cli/cpl_cli.py | 9 +++------ 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/install.md b/docs/install.md index e69de29b..1691ccfe 100644 --- a/docs/install.md +++ b/docs/install.md @@ -0,0 +1,2 @@ +python setup.py install # for install +python setup.py sdist bdist # for build \ No newline at end of file diff --git a/src/setup.py b/src/setup.py index b413a815..5f656653 100644 --- a/src/setup.py +++ b/src/setup.py @@ -19,7 +19,7 @@ setuptools.setup( ], entry_points={ 'console_scripts': [ - 'cpl = sh_edraft.cli.cpl_cli:main' + 'cpl = sh_edraft.cli.cpl_cli:CPLCli.main' ] } ) diff --git a/src/sh_edraft/cli/cpl_cli.py b/src/sh_edraft/cli/cpl_cli.py index 7d8e25e4..11bfe8e2 100644 --- a/src/sh_edraft/cli/cpl_cli.py +++ b/src/sh_edraft/cli/cpl_cli.py @@ -1,8 +1,5 @@ class CPLCli: - def main(self): + + @staticmethod + def main(): print('Hello world') - - -def main(): - cli = CPLCli() - cli.main() From 8c531ebd113331bed5bc4a75296736ad655fa31c Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 22:16:24 +0100 Subject: [PATCH 47/86] Added first cli commands --- docs/cli.md | 5 +- src/setup.py | 2 +- src/sh_edraft/cli/cpl_cli.py | 5 -- src/sh_edraft/cli/cpl_cli/__init__.py | 0 src/sh_edraft/cli/cpl_cli/cli.py | 33 +++++++ src/sh_edraft/cli/cpl_cli/cli_commands.py | 87 +++++++++++++++++++ .../cli/cpl_cli/templates/app/__init__.txt | 1 + .../cli/cpl_cli/templates/app/main.txt | 8 ++ .../cli/cpl_cli/templates/app/program.txt | 43 +++++++++ .../cli/cpl_cli/templates/base/base.txt | 10 +++ .../cli/cpl_cli/templates/class/class.txt | 4 + .../cpl_cli/templates/configmodel/model.txt | 20 +++++ .../cli/cpl_cli/templates/enum/enum.txt | 6 ++ .../cli/cpl_cli/templates/module/__init__.py | 0 .../cli/cpl_cli/templates/service/service.txt | 6 ++ 15 files changed, 223 insertions(+), 7 deletions(-) delete mode 100644 src/sh_edraft/cli/cpl_cli.py create mode 100644 src/sh_edraft/cli/cpl_cli/__init__.py create mode 100644 src/sh_edraft/cli/cpl_cli/cli.py create mode 100644 src/sh_edraft/cli/cpl_cli/cli_commands.py create mode 100644 src/sh_edraft/cli/cpl_cli/templates/app/__init__.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/app/main.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/app/program.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/base/base.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/class/class.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/configmodel/model.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/enum/enum.txt create mode 100644 src/sh_edraft/cli/cpl_cli/templates/module/__init__.py create mode 100644 src/sh_edraft/cli/cpl_cli/templates/service/service.txt diff --git a/docs/cli.md b/docs/cli.md index 1ec439a0..f2f2291e 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -2,5 +2,8 @@ prefix: cpl commands: new: app + base class - model \ No newline at end of file + configmodel + enum + service \ No newline at end of file diff --git a/src/setup.py b/src/setup.py index 5f656653..b99cc603 100644 --- a/src/setup.py +++ b/src/setup.py @@ -19,7 +19,7 @@ setuptools.setup( ], entry_points={ 'console_scripts': [ - 'cpl = sh_edraft.cli.cpl_cli:CPLCli.main' + 'cpl = sh_edraft.cli.cpl_cli.cli:main' ] } ) diff --git a/src/sh_edraft/cli/cpl_cli.py b/src/sh_edraft/cli/cpl_cli.py deleted file mode 100644 index 11bfe8e2..00000000 --- a/src/sh_edraft/cli/cpl_cli.py +++ /dev/null @@ -1,5 +0,0 @@ -class CPLCli: - - @staticmethod - def main(): - print('Hello world') diff --git a/src/sh_edraft/cli/cpl_cli/__init__.py b/src/sh_edraft/cli/cpl_cli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py new file mode 100644 index 00000000..49974db2 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -0,0 +1,33 @@ +import sys + +from sh_edraft.cli.cpl_cli.cli_commands import CLICommands + + +class CLI: + + def __init__(self): + self._commands: dict = {} + + def setup(self): + self._commands[CLICommands.new.__name__] = CLICommands.new + + def main(self): + args = sys.argv[1:] + + try: + cmd = self._commands[args[0]] + cmd(args[1:]) + except KeyError: + CLICommands.unexpected_command(args[0]) + except Exception as e: + print(e) + + +def main(): + cli = CLI() + cli.setup() + cli.main() + + +if __name__ == '__main__': + main() diff --git a/src/sh_edraft/cli/cpl_cli/cli_commands.py b/src/sh_edraft/cli/cpl_cli/cli_commands.py new file mode 100644 index 00000000..53986d34 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/cli_commands.py @@ -0,0 +1,87 @@ +import os + + +class CLICommands: + + @classmethod + def new(cls, args: list[str]): + if not os.path.isdir(f'./templates/{args[0]}'): + cls.unexpected_command(args[0]) + + sub_args = args[1:] + + if len(sub_args) != 1: + cls.unexpected_argument(sub_args[1]) + + full_path = sub_args[0] + name = os.path.basename(full_path) + path = os.path.dirname(full_path) + + if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']: + if not os.path.isdir(path): + os.makedirs(path) + else: + if not os.path.isdir(full_path): + os.makedirs(full_path) + + for r, d, f in os.walk(f'./templates/{args[0]}'): + for file in f: + template_content = '' + with open(f'{r}/{file}') as template: + template_content = template.read() + template.close() + + file = file.replace('txt', 'py') + if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']: + suffix = None + + if args[0] == 'base': + suffix = 'base' + + elif args[0] == 'configmodel': + suffix = 'settings' + + elif args[0] == 'service': + suffix = 'service' + + if suffix is not None: + file_path = f'{path}/{name}_{suffix}.py' + else: + file_path = f'{path}/{name}.py' + else: + file_path = f'{full_path}/{file}' + + with open(file_path, 'w+') as pyfile: + if name[0].islower(): + name = f'{name[0].upper()}{name[1:]}' + + if args[0] == 'configmodel': + template_content = template_content.replace('$Name', f'{name}Settings') + pyfile.write(template_content) + + elif args[0] == 'service': + template_content = template_content.replace('$Name', f'{name}Service') + template_content = template_content.replace('$Base', f'{name}Base') + pyfile.write(template_content) + + else: + template_content = template_content.replace('$Name', name) + pyfile.write(template_content) + + pyfile.close() + + @staticmethod + def help(): + print('Commands:') + + @classmethod + def unexpected_command(cls, command: str): + print(f'Unexpected command {command}') + cls.help() + exit() + + @classmethod + def unexpected_argument(cls, argument: str): + print(f'Unexpected argument {argument}') + cls.help() + exit() diff --git a/src/sh_edraft/cli/cpl_cli/templates/app/__init__.txt b/src/sh_edraft/cli/cpl_cli/templates/app/__init__.txt new file mode 100644 index 00000000..2e12875a --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/app/__init__.txt @@ -0,0 +1 @@ +# imports: \ No newline at end of file diff --git a/src/sh_edraft/cli/cpl_cli/templates/app/main.txt b/src/sh_edraft/cli/cpl_cli/templates/app/main.txt new file mode 100644 index 00000000..081d79dd --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/app/main.txt @@ -0,0 +1,8 @@ +from program import Program + +if __name__ == '__main__': + program = Program() + program.create_application_host() + program.create_configuration() + program.create_services() + program.main() diff --git a/src/sh_edraft/cli/cpl_cli/templates/app/program.txt b/src/sh_edraft/cli/cpl_cli/templates/app/program.txt new file mode 100644 index 00000000..890c6b73 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/app/program.txt @@ -0,0 +1,43 @@ +from typing import Optional + +from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.hosting import ApplicationHost +from sh_edraft.hosting.base import ApplicationBase +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.service.providing.base import ServiceProviderBase + + +class Program(ApplicationBase): + + def __init__(self): + ApplicationBase.__init__(self) + + self._app_host: Optional[ApplicationHost] = None + self._services: Optional[ServiceProviderBase] = None + self._configuration: Optional[ConfigurationBase] = None + self._logger: Optional[LoggerBase] = None + + def create_application_host(self): + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + def create_configuration(self): + self._configuration.add_environment_variables('PYTHON_') + self._configuration.add_environment_variables('CPL_') + self._configuration.add_argument_variables() + self._configuration.add_json_file(f'appsettings.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json', optional=True) + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) + + def create_services(self): + # Add and create logger + self._services.add_singleton(LoggerBase, Logger) + self._logger = self._services.get_service(LoggerBase) + + def main(self): + self._logger.header(f'{self._configuration.environment.application_name}:') + self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') diff --git a/src/sh_edraft/cli/cpl_cli/templates/base/base.txt b/src/sh_edraft/cli/cpl_cli/templates/base/base.txt new file mode 100644 index 00000000..1940e8ab --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/base/base.txt @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + + +class $Name(ABC): + + @abstractmethod + def __init__(self): pass + + @abstractmethod + def create(self): pass diff --git a/src/sh_edraft/cli/cpl_cli/templates/class/class.txt b/src/sh_edraft/cli/cpl_cli/templates/class/class.txt new file mode 100644 index 00000000..d22b7581 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/class/class.txt @@ -0,0 +1,4 @@ +class $Name: + + def __init__(self): + pass diff --git a/src/sh_edraft/cli/cpl_cli/templates/configmodel/model.txt b/src/sh_edraft/cli/cpl_cli/templates/configmodel/model.txt new file mode 100644 index 00000000..ca37a816 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/configmodel/model.txt @@ -0,0 +1,20 @@ +import traceback + +from sh_edraft.configuration.base import ConfigurationModelBase +from sh_edraft.console import Console +from sh_edraft.console.model import ForegroundColor + + +class $Name(ConfigurationModelBase): + + def __init__(self): + ConfigurationModelBase.__init__(self) + + def from_dict(self, settings: dict): + try: + pass + except Exception as e: + Console.set_foreground_color(ForegroundColor.red) + Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings') + Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') + Console.set_foreground_color(ForegroundColor.default) diff --git a/src/sh_edraft/cli/cpl_cli/templates/enum/enum.txt b/src/sh_edraft/cli/cpl_cli/templates/enum/enum.txt new file mode 100644 index 00000000..a7aef900 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/enum/enum.txt @@ -0,0 +1,6 @@ +from enum import Enum + + +class $Name(Enum): + + pass diff --git a/src/sh_edraft/cli/cpl_cli/templates/module/__init__.py b/src/sh_edraft/cli/cpl_cli/templates/module/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/cli/cpl_cli/templates/service/service.txt b/src/sh_edraft/cli/cpl_cli/templates/service/service.txt new file mode 100644 index 00000000..d2add199 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/templates/service/service.txt @@ -0,0 +1,6 @@ +class $Name($Base): + + def __init__(self): + TestBase.__init__(self) + + self.create() From 97b4f516a88f323f998d634247b6058a5da2dd68 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 15 Dec 2020 23:10:31 +0100 Subject: [PATCH 48/86] Bugfixes and improved setup logic --- docs/install.md | 4 ++-- requirements.txt | 26 +++++++++++++++++++++++ src/MANIFEST.in | 2 ++ src/setup.py | 1 + src/sh_edraft/cli/cpl_cli/cli.py | 1 + src/sh_edraft/cli/cpl_cli/cli_commands.py | 13 ++++++++---- 6 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 requirements.txt create mode 100644 src/MANIFEST.in diff --git a/docs/install.md b/docs/install.md index 1691ccfe..54c105b4 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,2 +1,2 @@ -python setup.py install # for install -python setup.py sdist bdist # for build \ No newline at end of file +python setup.py install # for install +python setup.py sdist bdist_wheel # for build \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..742e4085 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,26 @@ +aiohttp==3.6.3 +async-timeout==3.0.1 +attrs==20.3.0 +certifi==2020.11.8 +chardet==3.0.4 +click==7.1.2 +dateutils==0.6.12 +discord==1.0.1 +discord.py==1.5.1 +Flask==1.1.2 +idna==2.10 +itsdangerous==1.1.0 +Jinja2==2.11.2 +keyboard==0.13.5 +MarkupSafe==1.1.1 +multidict==4.7.6 +mysql-connector==2.2.9 +overloading==0.5.0 +python-dateutil==2.8.1 +pytz==2020.4 +six==1.15.0 +SQLAlchemy==1.3.20 +termcolor==1.1.0 +urllib3==1.26.2 +Werkzeug==1.0.1 +yarl==1.5.1 diff --git a/src/MANIFEST.in b/src/MANIFEST.in new file mode 100644 index 00000000..cb32f474 --- /dev/null +++ b/src/MANIFEST.in @@ -0,0 +1,2 @@ +include ../ README +recursive-include sh_edraft *.txt \ No newline at end of file diff --git a/src/setup.py b/src/setup.py index b99cc603..71cc0e2b 100644 --- a/src/setup.py +++ b/src/setup.py @@ -8,6 +8,7 @@ setuptools.setup( license='MIT', author='Sven Heidemann', author_email='edraft.sh@gmail.com', + include_package_data=True, description='sh-edraft python common lib', python_requires='>=3.8', install_requires=[ diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index 49974db2..a8ff912b 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -10,6 +10,7 @@ class CLI: def setup(self): self._commands[CLICommands.new.__name__] = CLICommands.new + self._commands[CLICommands.help.__name__] = CLICommands.help def main(self): args = sys.argv[1:] diff --git a/src/sh_edraft/cli/cpl_cli/cli_commands.py b/src/sh_edraft/cli/cpl_cli/cli_commands.py index 53986d34..cd0b6c21 100644 --- a/src/sh_edraft/cli/cpl_cli/cli_commands.py +++ b/src/sh_edraft/cli/cpl_cli/cli_commands.py @@ -5,7 +5,8 @@ class CLICommands: @classmethod def new(cls, args: list[str]): - if not os.path.isdir(f'./templates/{args[0]}'): + rel_path = os.path.dirname(__file__) + if not os.path.isdir(f'{rel_path}/templates/{args[0]}'): cls.unexpected_command(args[0]) sub_args = args[1:] @@ -13,7 +14,11 @@ class CLICommands: if len(sub_args) != 1: cls.unexpected_argument(sub_args[1]) - full_path = sub_args[0] + if not (sub_args[0].startswith('.') or sub_args[0].startswith('/')): + full_path = f'./{sub_args[0]}' + else: + full_path = sub_args[0] + name = os.path.basename(full_path) path = os.path.dirname(full_path) @@ -24,7 +29,7 @@ class CLICommands: if not os.path.isdir(full_path): os.makedirs(full_path) - for r, d, f in os.walk(f'./templates/{args[0]}'): + for r, d, f in os.walk(f'{rel_path}/templates/{args[0]}'): for file in f: template_content = '' with open(f'{r}/{file}') as template: @@ -71,7 +76,7 @@ class CLICommands: pyfile.close() @staticmethod - def help(): + def help(*args): print('Commands:') @classmethod From 88362006ef5ce18aada110c1892098cb7eaf8191 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 13:38:08 +0100 Subject: [PATCH 49/86] Improved cli --- src/sh_edraft/cli/command/__init__.py | 0 src/sh_edraft/cli/command/base/__init__.py | 0 .../cli/command/base/command_base.py | 10 +++ src/sh_edraft/cli/cpl_cli/cli.py | 19 ++--- src/sh_edraft/cli/cpl_cli/cli_commands.py | 6 +- .../cli/cpl_cli/commands/__init__.py | 0 src/sh_edraft/cli/cpl_cli/commands/help.py | 10 +++ src/sh_edraft/cli/cpl_cli/commands/new.py | 84 +++++++++++++++++++ src/sh_edraft/cli/interpreter/__init__.py | 0 src/sh_edraft/cli/interpreter/interpreter.py | 28 +++++++ 10 files changed, 146 insertions(+), 11 deletions(-) create mode 100644 src/sh_edraft/cli/command/__init__.py create mode 100644 src/sh_edraft/cli/command/base/__init__.py create mode 100644 src/sh_edraft/cli/command/base/command_base.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/__init__.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/help.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/new.py create mode 100644 src/sh_edraft/cli/interpreter/__init__.py create mode 100644 src/sh_edraft/cli/interpreter/interpreter.py diff --git a/src/sh_edraft/cli/command/__init__.py b/src/sh_edraft/cli/command/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/cli/command/base/__init__.py b/src/sh_edraft/cli/command/base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/cli/command/base/command_base.py b/src/sh_edraft/cli/command/base/command_base.py new file mode 100644 index 00000000..bc63204b --- /dev/null +++ b/src/sh_edraft/cli/command/base/command_base.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + + +class CommandBase(ABC): + + @abstractmethod + def __init__(self): pass + + @abstractmethod + def run(self, args: list[str]): pass diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index a8ff912b..b5d24415 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -1,25 +1,24 @@ import sys -from sh_edraft.cli.cpl_cli.cli_commands import CLICommands +from sh_edraft.cli.cpl_cli.commands.help import Help +from sh_edraft.cli.cpl_cli.commands.new import New +from sh_edraft.cli.interpreter.interpreter import Interpreter class CLI: def __init__(self): - self._commands: dict = {} + self._interpreter = Interpreter() def setup(self): - self._commands[CLICommands.new.__name__] = CLICommands.new - self._commands[CLICommands.help.__name__] = CLICommands.help + self._interpreter.add_command(New()) + self._interpreter.add_command(Help()) def main(self): - args = sys.argv[1:] - + print('CPL CLI:') + string = ' '.join(sys.argv[1:]) try: - cmd = self._commands[args[0]] - cmd(args[1:]) - except KeyError: - CLICommands.unexpected_command(args[0]) + self._interpreter.interpret(string) except Exception as e: print(e) diff --git a/src/sh_edraft/cli/cpl_cli/cli_commands.py b/src/sh_edraft/cli/cpl_cli/cli_commands.py index cd0b6c21..1d8d6765 100644 --- a/src/sh_edraft/cli/cpl_cli/cli_commands.py +++ b/src/sh_edraft/cli/cpl_cli/cli_commands.py @@ -60,7 +60,11 @@ class CLICommands: if name[0].islower(): name = f'{name[0].upper()}{name[1:]}' - if args[0] == 'configmodel': + if args[0] == 'base': + template_content = template_content.replace('$Name', f'{name}Base') + pyfile.write(template_content) + + elif args[0] == 'configmodel': template_content = template_content.replace('$Name', f'{name}Settings') pyfile.write(template_content) diff --git a/src/sh_edraft/cli/cpl_cli/commands/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/cli/cpl_cli/commands/help.py b/src/sh_edraft/cli/cpl_cli/commands/help.py new file mode 100644 index 00000000..3a723f14 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/help.py @@ -0,0 +1,10 @@ +from sh_edraft.cli.command.base.command_base import CommandBase + + +class Help(CommandBase): + + def __init__(self): + CommandBase.__init__(self) + + def run(self, args: list[str]): + print('Commands:') diff --git a/src/sh_edraft/cli/cpl_cli/commands/new.py b/src/sh_edraft/cli/cpl_cli/commands/new.py new file mode 100644 index 00000000..697d43c9 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/new.py @@ -0,0 +1,84 @@ +import os + +from sh_edraft.cli.command.base.command_base import CommandBase + + +class New(CommandBase): + + def __init__(self): + CommandBase.__init__(self) + + def run(self, args: list[str]): + rel_path = f'{os.path.dirname(__file__)}/../' + if not os.path.isdir(f'{rel_path}/templates/{args[0]}'): + print(f'Unexpected argument {args[0]}') + + sub_args = args[1:] + + if len(sub_args) != 1: + print(f'Unexpected argument {sub_args[1]}') + + if not (sub_args[0].startswith('.') or sub_args[0].startswith('/')): + full_path = f'./{sub_args[0]}' + else: + full_path = sub_args[0] + + name = os.path.basename(full_path) + path = os.path.dirname(full_path) + + if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']: + if not os.path.isdir(path): + os.makedirs(path) + else: + if not os.path.isdir(full_path): + os.makedirs(full_path) + + for r, d, f in os.walk(f'{rel_path}/templates/{args[0]}'): + for file in f: + template_content = '' + with open(f'{r}/{file}') as template: + template_content = template.read() + template.close() + + file = file.replace('txt', 'py') + if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']: + suffix = None + + if args[0] == 'base': + suffix = 'base' + + elif args[0] == 'configmodel': + suffix = 'settings' + + elif args[0] == 'service': + suffix = 'service' + + if suffix is not None: + file_path = f'{path}/{name}_{suffix}.py' + else: + file_path = f'{path}/{name}.py' + else: + file_path = f'{full_path}/{file}' + + with open(file_path, 'w+') as pyfile: + if name[0].islower(): + name = f'{name[0].upper()}{name[1:]}' + + if args[0] == 'base': + template_content = template_content.replace('$Name', f'{name}Base') + pyfile.write(template_content) + + elif args[0] == 'configmodel': + template_content = template_content.replace('$Name', f'{name}Settings') + pyfile.write(template_content) + + elif args[0] == 'service': + template_content = template_content.replace('$Name', f'{name}Service') + template_content = template_content.replace('$Base', f'{name}Base') + pyfile.write(template_content) + + else: + template_content = template_content.replace('$Name', name) + pyfile.write(template_content) + + pyfile.close() diff --git a/src/sh_edraft/cli/interpreter/__init__.py b/src/sh_edraft/cli/interpreter/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/cli/interpreter/interpreter.py b/src/sh_edraft/cli/interpreter/interpreter.py new file mode 100644 index 00000000..7ee549ed --- /dev/null +++ b/src/sh_edraft/cli/interpreter/interpreter.py @@ -0,0 +1,28 @@ +from sh_edraft.cli.command.base.command_base import CommandBase + + +class Interpreter: + + def __init__(self): + self._commands: list[CommandBase] = [] + + def add_command(self, command: CommandBase): + self._commands.append(command) + + def remove_command(self, command: CommandBase): + self._commands.remove(command) + + def interpret(self, input_string: str): + input_list = input_string.split(' ') + commands = [type(cmd).__name__.lower() for cmd in self._commands] + command = input_list[0] + args = input_list[1:] + print(command) + if command in commands: + cmd = next((cmd for cmd in self._commands if type(cmd).__name__.lower() == command), None) + if cmd is not None: + cmd.run(args) + else: + print(f'Unexpected command {command}') + else: + print(f'Unexpected command {command}') From 5fb20035d8f079a4f87dba4741c7feeaa9119f2b Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 14:35:43 +0100 Subject: [PATCH 50/86] Added version command to cli --- .../cli/command/base/command_base.py | 2 ++ src/sh_edraft/cli/cpl_cli/cli.py | 8 +++-- src/sh_edraft/cli/cpl_cli/commands/help.py | 3 +- src/sh_edraft/cli/cpl_cli/commands/new.py | 13 +++++-- src/sh_edraft/cli/cpl_cli/commands/version.py | 30 ++++++++++++++++ src/sh_edraft/cli/interpreter/interpreter.py | 8 ++--- src/sh_edraft/console/console.py | 34 +++++++++++++++++-- 7 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/sh_edraft/cli/cpl_cli/commands/version.py diff --git a/src/sh_edraft/cli/command/base/command_base.py b/src/sh_edraft/cli/command/base/command_base.py index bc63204b..89bb476a 100644 --- a/src/sh_edraft/cli/command/base/command_base.py +++ b/src/sh_edraft/cli/command/base/command_base.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod +from sh_edraft.console.console import Console + class CommandBase(ABC): diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index b5d24415..d74f807b 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -1,8 +1,11 @@ import sys +import traceback from sh_edraft.cli.cpl_cli.commands.help import Help from sh_edraft.cli.cpl_cli.commands.new import New +from sh_edraft.cli.cpl_cli.commands.version import Version from sh_edraft.cli.interpreter.interpreter import Interpreter +from sh_edraft.console.console import Console class CLI: @@ -13,14 +16,15 @@ class CLI: def setup(self): self._interpreter.add_command(New()) self._interpreter.add_command(Help()) + self._interpreter.add_command(Version()) def main(self): - print('CPL CLI:') string = ' '.join(sys.argv[1:]) try: self._interpreter.interpret(string) except Exception as e: - print(e) + tb = traceback.format_exc() + Console.error(str(e), tb) def main(): diff --git a/src/sh_edraft/cli/cpl_cli/commands/help.py b/src/sh_edraft/cli/cpl_cli/commands/help.py index 3a723f14..21885eb1 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/help.py +++ b/src/sh_edraft/cli/cpl_cli/commands/help.py @@ -1,4 +1,5 @@ from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.console.console import Console class Help(CommandBase): @@ -7,4 +8,4 @@ class Help(CommandBase): CommandBase.__init__(self) def run(self, args: list[str]): - print('Commands:') + Console.write_line('Available Commands:') diff --git a/src/sh_edraft/cli/cpl_cli/commands/new.py b/src/sh_edraft/cli/cpl_cli/commands/new.py index 697d43c9..c9d63353 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/new.py +++ b/src/sh_edraft/cli/cpl_cli/commands/new.py @@ -1,6 +1,7 @@ import os from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.console.console import Console class New(CommandBase): @@ -10,13 +11,21 @@ class New(CommandBase): def run(self, args: list[str]): rel_path = f'{os.path.dirname(__file__)}/../' + if len(args) == 0: + Console.error(f'Expected arguments {args}') + return + + elif len(args) != 2: + Console.error(f'Invalid arguments {args}') + return + if not os.path.isdir(f'{rel_path}/templates/{args[0]}'): - print(f'Unexpected argument {args[0]}') + Console.error(f'Unexpected argument {args[0]}') sub_args = args[1:] if len(sub_args) != 1: - print(f'Unexpected argument {sub_args[1]}') + Console.error(f'Unexpected argument {sub_args[1]}') if not (sub_args[0].startswith('.') or sub_args[0].startswith('/')): full_path = f'./{sub_args[0]}' diff --git a/src/sh_edraft/cli/cpl_cli/commands/version.py b/src/sh_edraft/cli/cpl_cli/commands/version.py new file mode 100644 index 00000000..0f7a4a47 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/version.py @@ -0,0 +1,30 @@ +import pkgutil +import sys +import platform + +import sh_edraft +from sh_edraft import cli +from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.console.console import Console + + +class Version(CommandBase): + + def __init__(self): + CommandBase.__init__(self) + + def run(self, args: list[str]): + Console.set_foreground_color('yellow') + Console.banner('CPL CLI') + Console.set_foreground_color('default') + Console.write_line(f'Common Python Library CLI: {cli.__version__}') + Console.write_line(f'Python: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}') + Console.write_line(f'OS: {platform.system()} {platform.processor()}') + + Console.write_line('\nCPL:') + packages = [] + for importer, modname, is_pkg in pkgutil.iter_modules(sh_edraft.__path__): + module = importer.find_module(modname).load_module(modname) + packages.append([f'{modname}:', module.__version__]) + + Console.table(['Name', 'Version'], packages) diff --git a/src/sh_edraft/cli/interpreter/interpreter.py b/src/sh_edraft/cli/interpreter/interpreter.py index 7ee549ed..5a7f38d8 100644 --- a/src/sh_edraft/cli/interpreter/interpreter.py +++ b/src/sh_edraft/cli/interpreter/interpreter.py @@ -1,4 +1,5 @@ from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.console.console import Console class Interpreter: @@ -16,13 +17,12 @@ class Interpreter: input_list = input_string.split(' ') commands = [type(cmd).__name__.lower() for cmd in self._commands] command = input_list[0] - args = input_list[1:] - print(command) + args = input_list[1:] if len(input_list) > 2 else [] if command in commands: cmd = next((cmd for cmd in self._commands if type(cmd).__name__.lower() == command), None) if cmd is not None: cmd.run(args) else: - print(f'Unexpected command {command}') + Console.error(f'Unexpected command {command}') else: - print(f'Unexpected command {command}') + Console.error(f'Unexpected command {command}') diff --git a/src/sh_edraft/console/console.py b/src/sh_edraft/console/console.py index 2418cf8a..b2b722da 100644 --- a/src/sh_edraft/console/console.py +++ b/src/sh_edraft/console/console.py @@ -1,5 +1,8 @@ import os from typing import Union, Optional + +import pyfiglet +from tabulate import tabulate from termcolor import colored from sh_edraft.console.model.background_color import BackgroundColor @@ -7,6 +10,8 @@ from sh_edraft.console.model.foreground_color import ForegroundColor class Console: + _is_first_write = True + _background_color: BackgroundColor = BackgroundColor.default _foreground_color: ForegroundColor = ForegroundColor.default _x: Optional[int] = None @@ -64,6 +69,9 @@ class Console: if cls._disabled: return + if cls._is_first_write: + cls._is_first_write = False + args = [] colored_args = [] @@ -88,6 +96,11 @@ class Console: Useful public methods """ + @classmethod + def banner(cls, string: str): + ascii_banner = pyfiglet.figlet_format(string) + cls.write_line(ascii_banner) + @staticmethod def clear(): os.system('cls' if os.name == 'nt' else 'clear') @@ -103,6 +116,15 @@ class Console: def disable(cls): cls._disabled = True + @classmethod + def error(cls, string: str, tb: str = None): + cls.set_foreground_color('red') + if tb is not None: + cls.write_line(f'{string} -> {tb}') + else: + cls.write_line(string) + cls.set_foreground_color('default') + @classmethod def enable(cls): cls._disabled = False @@ -126,6 +148,12 @@ class Console: cls._background_color = BackgroundColor.default cls._foreground_color = ForegroundColor.default + @classmethod + def table(cls, header: list[str], values: list[list[str]]): + table = tabulate(values, headers=header) + + Console.write_line(table) + @classmethod def write(cls, *args): string = ' '.join(map(str, args)) @@ -139,11 +167,13 @@ class Console: @classmethod def write_line(cls, *args): string = ' '.join(map(str, args)) - cls._output('') + if not cls._is_first_write: + cls._output('') cls._output(string, end='') @classmethod def write_line_at(cls, x: int, y: int, *args): string = ' '.join(map(str, args)) - cls._output('', end='') + if not cls._is_first_write: + cls._output('', end='') cls._output(string, x, y, end='') From acfe158470661db43375c87cde5f2096cc3a1d0c Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 15:09:12 +0100 Subject: [PATCH 51/86] Improved version command & improved help command --- src/sh_edraft/cli/cpl_cli/commands/help.py | 10 ++++++++++ src/sh_edraft/cli/cpl_cli/commands/version.py | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/sh_edraft/cli/cpl_cli/commands/help.py b/src/sh_edraft/cli/cpl_cli/commands/help.py index 21885eb1..7999bdb0 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/help.py +++ b/src/sh_edraft/cli/cpl_cli/commands/help.py @@ -9,3 +9,13 @@ class Help(CommandBase): def run(self, args: list[str]): Console.write_line('Available Commands:') + commands = [ + ['help', 'Lists available commands and their short descriptions.'], + ['new', 'Creates a new file or package.'], + ['version', 'Outputs CPL CLI version.'] + ] + for name, description in commands: + Console.set_foreground_color('blue') + Console.write(f'\n\t{name} ') + Console.set_foreground_color('default') + Console.write(f'{description}') diff --git a/src/sh_edraft/cli/cpl_cli/commands/version.py b/src/sh_edraft/cli/cpl_cli/commands/version.py index 0f7a4a47..e514101f 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/version.py +++ b/src/sh_edraft/cli/cpl_cli/commands/version.py @@ -2,6 +2,8 @@ import pkgutil import sys import platform +import pkg_resources + import sh_edraft from sh_edraft import cli from sh_edraft.cli.command.base.command_base import CommandBase @@ -25,6 +27,14 @@ class Version(CommandBase): packages = [] for importer, modname, is_pkg in pkgutil.iter_modules(sh_edraft.__path__): module = importer.find_module(modname).load_module(modname) - packages.append([f'{modname}:', module.__version__]) + packages.append([f'{modname}', module.__version__]) + + Console.table(['Name', 'Version'], packages) + + Console.write_line('\nPython Packages:') + packages = [] + deps = dict(tuple(str(ws).split()) for ws in pkg_resources.working_set) + for p in deps: + packages.append([p, deps[p]]) Console.table(['Name', 'Version'], packages) From bbd0a0f4c4d61f732091d0431f378b82e0476985 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 15:13:18 +0100 Subject: [PATCH 52/86] Improved cli error handling --- src/sh_edraft/cli/cpl_cli/cli.py | 1 + src/sh_edraft/cli/cpl_cli/commands/new.py | 4 ++++ src/sh_edraft/cli/interpreter/interpreter.py | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index d74f807b..ae63de86 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -25,6 +25,7 @@ class CLI: except Exception as e: tb = traceback.format_exc() Console.error(str(e), tb) + Console.error('Run \'cpl help\'') def main(): diff --git a/src/sh_edraft/cli/cpl_cli/commands/new.py b/src/sh_edraft/cli/cpl_cli/commands/new.py index c9d63353..90ebb690 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/new.py +++ b/src/sh_edraft/cli/cpl_cli/commands/new.py @@ -13,19 +13,23 @@ class New(CommandBase): rel_path = f'{os.path.dirname(__file__)}/../' if len(args) == 0: Console.error(f'Expected arguments {args}') + Console.error('Run \'cpl help\'') return elif len(args) != 2: Console.error(f'Invalid arguments {args}') + Console.error('Run \'cpl help\'') return if not os.path.isdir(f'{rel_path}/templates/{args[0]}'): Console.error(f'Unexpected argument {args[0]}') + Console.error('Run \'cpl help\'') sub_args = args[1:] if len(sub_args) != 1: Console.error(f'Unexpected argument {sub_args[1]}') + Console.error('Run \'cpl help\'') if not (sub_args[0].startswith('.') or sub_args[0].startswith('/')): full_path = f'./{sub_args[0]}' diff --git a/src/sh_edraft/cli/interpreter/interpreter.py b/src/sh_edraft/cli/interpreter/interpreter.py index 5a7f38d8..577989d8 100644 --- a/src/sh_edraft/cli/interpreter/interpreter.py +++ b/src/sh_edraft/cli/interpreter/interpreter.py @@ -24,5 +24,7 @@ class Interpreter: cmd.run(args) else: Console.error(f'Unexpected command {command}') + Console.error('Run \'cpl help\'') else: Console.error(f'Unexpected command {command}') + Console.error('Run \'cpl help\'') From e9c20061d183be520af8f0e1d09b24e61c039d84 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 15:13:46 +0100 Subject: [PATCH 53/86] Removed module template --- src/sh_edraft/cli/cpl_cli/templates/module/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/sh_edraft/cli/cpl_cli/templates/module/__init__.py diff --git a/src/sh_edraft/cli/cpl_cli/templates/module/__init__.py b/src/sh_edraft/cli/cpl_cli/templates/module/__init__.py deleted file mode 100644 index e69de29b..00000000 From 3374ffe8dbfa36c9db1d5b8dd9f21e6a32363385 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 16:47:31 +0100 Subject: [PATCH 54/86] Added build command to cli --- .../cli/command/base/command_base.py | 9 +- src/sh_edraft/cli/cpl_cli/cli.py | 38 +++++++- src/sh_edraft/cli/cpl_cli/cli_commands.py | 96 ------------------- src/sh_edraft/cli/cpl_cli/commands/build.py | 26 +++++ src/sh_edraft/cli/cpl_cli/commands/help.py | 7 +- src/sh_edraft/cli/cpl_cli/commands/version.py | 2 + src/sh_edraft/cli/cpl_cli/project.json | 22 +++++ src/sh_edraft/cli/interpreter/interpreter.py | 16 ++-- 8 files changed, 104 insertions(+), 112 deletions(-) delete mode 100644 src/sh_edraft/cli/cpl_cli/cli_commands.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/build.py create mode 100644 src/sh_edraft/cli/cpl_cli/project.json diff --git a/src/sh_edraft/cli/command/base/command_base.py b/src/sh_edraft/cli/command/base/command_base.py index 89bb476a..76319ba7 100644 --- a/src/sh_edraft/cli/command/base/command_base.py +++ b/src/sh_edraft/cli/command/base/command_base.py @@ -1,12 +1,15 @@ from abc import ABC, abstractmethod -from sh_edraft.console.console import Console - class CommandBase(ABC): @abstractmethod - def __init__(self): pass + def __init__(self): + self._aliases: list[str] = [] + + @property + def aliases(self): + return self._aliases @abstractmethod def run(self, args: list[str]): pass diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index ae63de86..798829f7 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -1,21 +1,52 @@ import sys import traceback +from typing import Optional +from sh_edraft.cli.cpl_cli.commands.build import Build from sh_edraft.cli.cpl_cli.commands.help import Help from sh_edraft.cli.cpl_cli.commands.new import New from sh_edraft.cli.cpl_cli.commands.version import Version from sh_edraft.cli.interpreter.interpreter import Interpreter +from sh_edraft.configuration.base import ConfigurationBase from sh_edraft.console.console import Console +from sh_edraft.hosting.application_host import ApplicationHost +from sh_edraft.hosting.base.application_base import ApplicationBase +from sh_edraft.logging.logger import Logger +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.publishing.publisher import Publisher +from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.service.providing.service_provider import ServiceProviderBase -class CLI: +class CLI(ApplicationBase): def __init__(self): + ApplicationBase.__init__(self) + + self._app_host: Optional[ApplicationHost] = None + self._services: Optional[ServiceProviderBase] = None + self._configuration: Optional[ConfigurationBase] = None + self._logger: Optional[LoggerBase] = None + self._interpreter = Interpreter() + def create_application_host(self): + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + def create_configuration(self): + self._configuration.add_json_file(f'project.json') + + def create_services(self): + self._services.add_singleton(LoggerBase, Logger) + self._logger = self._services.get_service(LoggerBase) + self._services.add_singleton(PublisherBase, Publisher) + def setup(self): - self._interpreter.add_command(New()) + self._interpreter.add_command(Build(self._services, self._configuration)) self._interpreter.add_command(Help()) + self._interpreter.add_command(New()) self._interpreter.add_command(Version()) def main(self): @@ -30,6 +61,9 @@ class CLI: def main(): cli = CLI() + cli.create_application_host() + cli.create_configuration() + cli.create_services() cli.setup() cli.main() diff --git a/src/sh_edraft/cli/cpl_cli/cli_commands.py b/src/sh_edraft/cli/cpl_cli/cli_commands.py deleted file mode 100644 index 1d8d6765..00000000 --- a/src/sh_edraft/cli/cpl_cli/cli_commands.py +++ /dev/null @@ -1,96 +0,0 @@ -import os - - -class CLICommands: - - @classmethod - def new(cls, args: list[str]): - rel_path = os.path.dirname(__file__) - if not os.path.isdir(f'{rel_path}/templates/{args[0]}'): - cls.unexpected_command(args[0]) - - sub_args = args[1:] - - if len(sub_args) != 1: - cls.unexpected_argument(sub_args[1]) - - if not (sub_args[0].startswith('.') or sub_args[0].startswith('/')): - full_path = f'./{sub_args[0]}' - else: - full_path = sub_args[0] - - name = os.path.basename(full_path) - path = os.path.dirname(full_path) - - if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']: - if not os.path.isdir(path): - os.makedirs(path) - else: - if not os.path.isdir(full_path): - os.makedirs(full_path) - - for r, d, f in os.walk(f'{rel_path}/templates/{args[0]}'): - for file in f: - template_content = '' - with open(f'{r}/{file}') as template: - template_content = template.read() - template.close() - - file = file.replace('txt', 'py') - if args[0] in ['base', 'class', 'configmodel', 'enum', 'service']: - suffix = None - - if args[0] == 'base': - suffix = 'base' - - elif args[0] == 'configmodel': - suffix = 'settings' - - elif args[0] == 'service': - suffix = 'service' - - if suffix is not None: - file_path = f'{path}/{name}_{suffix}.py' - else: - file_path = f'{path}/{name}.py' - else: - file_path = f'{full_path}/{file}' - - with open(file_path, 'w+') as pyfile: - if name[0].islower(): - name = f'{name[0].upper()}{name[1:]}' - - if args[0] == 'base': - template_content = template_content.replace('$Name', f'{name}Base') - pyfile.write(template_content) - - elif args[0] == 'configmodel': - template_content = template_content.replace('$Name', f'{name}Settings') - pyfile.write(template_content) - - elif args[0] == 'service': - template_content = template_content.replace('$Name', f'{name}Service') - template_content = template_content.replace('$Base', f'{name}Base') - pyfile.write(template_content) - - else: - template_content = template_content.replace('$Name', name) - pyfile.write(template_content) - - pyfile.close() - - @staticmethod - def help(*args): - print('Commands:') - - @classmethod - def unexpected_command(cls, command: str): - print(f'Unexpected command {command}') - cls.help() - exit() - - @classmethod - def unexpected_argument(cls, argument: str): - print(f'Unexpected argument {argument}') - cls.help() - exit() diff --git a/src/sh_edraft/cli/cpl_cli/commands/build.py b/src/sh_edraft/cli/cpl_cli/commands/build.py new file mode 100644 index 00000000..15653d15 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/build.py @@ -0,0 +1,26 @@ +from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.console.console import Console +from sh_edraft.publishing.publisher import Publisher +from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.service.providing.service_provider import ServiceProviderBase + + +class Build(CommandBase): + + def __init__(self, services: ServiceProviderBase, config: ConfigurationBase): + CommandBase.__init__(self) + self._services = services + self._config = config + + self._aliases.append('-b') + self._aliases.append('-B') + self._publisher: Publisher = self._services.get_service(PublisherBase) + + def run(self, args: list[str]): + if len(args) > 0: + Console.error(f'Invalid arguments {args}') + Console.error('Run \'cpl help\'') + + self._publisher.create() + self._publisher.publish() diff --git a/src/sh_edraft/cli/cpl_cli/commands/help.py b/src/sh_edraft/cli/cpl_cli/commands/help.py index 7999bdb0..b9212479 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/help.py +++ b/src/sh_edraft/cli/cpl_cli/commands/help.py @@ -6,13 +6,16 @@ class Help(CommandBase): def __init__(self): CommandBase.__init__(self) + self._aliases.append('-h') + self._aliases.append('-H') def run(self, args: list[str]): Console.write_line('Available Commands:') commands = [ - ['help', 'Lists available commands and their short descriptions.'], + ['build (-b|-B)', 'Prepares files for publishing into an output directory named dist/ at the given output path.Must be executed from within a workspace directory.'], + ['help (-h|-H)', 'Lists available commands and their short descriptions.'], ['new', 'Creates a new file or package.'], - ['version', 'Outputs CPL CLI version.'] + ['version (-v|-V)', 'Outputs CPL CLI version.'] ] for name, description in commands: Console.set_foreground_color('blue') diff --git a/src/sh_edraft/cli/cpl_cli/commands/version.py b/src/sh_edraft/cli/cpl_cli/commands/version.py index e514101f..61c95211 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/version.py +++ b/src/sh_edraft/cli/cpl_cli/commands/version.py @@ -14,6 +14,8 @@ class Version(CommandBase): def __init__(self): CommandBase.__init__(self) + self._aliases.append('-v') + self._aliases.append('-V') def run(self, args: list[str]): Console.set_foreground_color('yellow') diff --git a/src/sh_edraft/cli/cpl_cli/project.json b/src/sh_edraft/cli/cpl_cli/project.json new file mode 100644 index 00000000..5d15af9e --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/project.json @@ -0,0 +1,22 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "INFO", + "FileLogLevel": "TRACE" + }, + "PublishSettings": { + "SourcePath": "../", + "DistPath": "../../../../dist", + "Templates": [], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt" + } +} diff --git a/src/sh_edraft/cli/interpreter/interpreter.py b/src/sh_edraft/cli/interpreter/interpreter.py index 577989d8..e1cf07ea 100644 --- a/src/sh_edraft/cli/interpreter/interpreter.py +++ b/src/sh_edraft/cli/interpreter/interpreter.py @@ -15,16 +15,14 @@ class Interpreter: def interpret(self, input_string: str): input_list = input_string.split(' ') - commands = [type(cmd).__name__.lower() for cmd in self._commands] command = input_list[0] - args = input_list[1:] if len(input_list) > 2 else [] - if command in commands: - cmd = next((cmd for cmd in self._commands if type(cmd).__name__.lower() == command), None) - if cmd is not None: - cmd.run(args) - else: - Console.error(f'Unexpected command {command}') - Console.error('Run \'cpl help\'') + args = input_list[1:] if len(input_list) > 1 else [] + + cmd = next( + (cmd for cmd in self._commands if type(cmd).__name__.lower() == command or command in cmd.aliases), + None) + if cmd is not None: + cmd.run(args) else: Console.error(f'Unexpected command {command}') Console.error('Run \'cpl help\'') From 9e3c631ac4c42972fa5432cfcb30f3ad8a1056dc Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 17:37:43 +0100 Subject: [PATCH 55/86] Improved publish process --- src/build.json | 65 +++++++++++++++++++ src/sh_edraft/cli/command/__init__.py | 25 +++++++ src/sh_edraft/cli/command/base/__init__.py | 25 +++++++ src/sh_edraft/cli/cpl_cli/__init__.py | 25 +++++++ src/sh_edraft/cli/cpl_cli/cli.py | 37 +---------- .../cli/cpl_cli/commands/__init__.py | 25 +++++++ src/sh_edraft/cli/cpl_cli/commands/build.py | 26 -------- .../app/build.json} | 8 +-- src/sh_edraft/cli/interpreter/__init__.py | 25 +++++++ src/sh_edraft/logging/logger.py | 2 +- src/sh_edraft/publishing/publisher.py | 31 +++++++-- 11 files changed, 225 insertions(+), 69 deletions(-) create mode 100644 src/build.json delete mode 100644 src/sh_edraft/cli/cpl_cli/commands/build.py rename src/sh_edraft/cli/cpl_cli/{project.json => templates/app/build.json} (79%) diff --git a/src/build.json b/src/build.json new file mode 100644 index 00000000..da1551cc --- /dev/null +++ b/src/build.json @@ -0,0 +1,65 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + "LoggingSettings": { + "Path": "../build/logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "INFO", + "FileLogLevel": "TRACE" + }, + "PublishSettings": { + "SourcePath": "./", + "DistPath": "../build/dist", + "Templates": [ + { + "TemplatePath": "../publish_templates/all_template.txt", + "Name": "all", + "Description": "", + "LongDescription": "", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + }, + { + "TemplatePath": "../publish_templates/all_template.txt", + "Name": "sh_edraft", + "Description": "common python library", + "LongDescription": "Library to share common classes and models used at sh-edraft.de", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + } + ], + "IncludedFiles": [ + "../LICENSE", + "../README.md", + "../requirements.txt", + "sh_edraft/cli/cpl_cli/templates" + ], + "ExcludedFiles": [ + "./tests", + "./tests_dev" + ], + "TemplateEnding": "_template.txt" + } +} diff --git a/src/sh_edraft/cli/command/__init__.py b/src/sh_edraft/cli/command/__init__.py index e69de29b..336d4a17 100644 --- a/src/sh_edraft/cli/command/__init__.py +++ b/src/sh_edraft/cli/command/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.command +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.command' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/command/base/__init__.py b/src/sh_edraft/cli/command/base/__init__.py index e69de29b..83d30e3e 100644 --- a/src/sh_edraft/cli/command/base/__init__.py +++ b/src/sh_edraft/cli/command/base/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.command.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.command.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/__init__.py b/src/sh_edraft/cli/cpl_cli/__init__.py index e69de29b..1c8b1737 100644 --- a/src/sh_edraft/cli/cpl_cli/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.cpl_cli +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.cpl_cli' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index 798829f7..a1eb8a70 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -2,49 +2,21 @@ import sys import traceback from typing import Optional -from sh_edraft.cli.cpl_cli.commands.build import Build +from sh_edraft.cli.cpl_cli.commands.build.build import Build from sh_edraft.cli.cpl_cli.commands.help import Help from sh_edraft.cli.cpl_cli.commands.new import New from sh_edraft.cli.cpl_cli.commands.version import Version from sh_edraft.cli.interpreter.interpreter import Interpreter -from sh_edraft.configuration.base import ConfigurationBase from sh_edraft.console.console import Console -from sh_edraft.hosting.application_host import ApplicationHost -from sh_edraft.hosting.base.application_base import ApplicationBase -from sh_edraft.logging.logger import Logger -from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.publisher import Publisher -from sh_edraft.publishing.base.publisher_base import PublisherBase -from sh_edraft.service.providing.service_provider import ServiceProviderBase -class CLI(ApplicationBase): +class CLI: def __init__(self): - ApplicationBase.__init__(self) - - self._app_host: Optional[ApplicationHost] = None - self._services: Optional[ServiceProviderBase] = None - self._configuration: Optional[ConfigurationBase] = None - self._logger: Optional[LoggerBase] = None - self._interpreter = Interpreter() - def create_application_host(self): - self._app_host = ApplicationHost() - self._configuration = self._app_host.configuration - self._services = self._app_host.services - - def create_configuration(self): - self._configuration.add_json_file(f'project.json') - - def create_services(self): - self._services.add_singleton(LoggerBase, Logger) - self._logger = self._services.get_service(LoggerBase) - self._services.add_singleton(PublisherBase, Publisher) - def setup(self): - self._interpreter.add_command(Build(self._services, self._configuration)) + self._interpreter.add_command(Build()) self._interpreter.add_command(Help()) self._interpreter.add_command(New()) self._interpreter.add_command(Version()) @@ -61,9 +33,6 @@ class CLI(ApplicationBase): def main(): cli = CLI() - cli.create_application_host() - cli.create_configuration() - cli.create_services() cli.setup() cli.main() diff --git a/src/sh_edraft/cli/cpl_cli/commands/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/__init__.py index e69de29b..8f0a8760 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/commands/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.cpl_cli.commands +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.cpl_cli.commands' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/commands/build.py b/src/sh_edraft/cli/cpl_cli/commands/build.py deleted file mode 100644 index 15653d15..00000000 --- a/src/sh_edraft/cli/cpl_cli/commands/build.py +++ /dev/null @@ -1,26 +0,0 @@ -from sh_edraft.cli.command.base.command_base import CommandBase -from sh_edraft.configuration.base.configuration_base import ConfigurationBase -from sh_edraft.console.console import Console -from sh_edraft.publishing.publisher import Publisher -from sh_edraft.publishing.base.publisher_base import PublisherBase -from sh_edraft.service.providing.service_provider import ServiceProviderBase - - -class Build(CommandBase): - - def __init__(self, services: ServiceProviderBase, config: ConfigurationBase): - CommandBase.__init__(self) - self._services = services - self._config = config - - self._aliases.append('-b') - self._aliases.append('-B') - self._publisher: Publisher = self._services.get_service(PublisherBase) - - def run(self, args: list[str]): - if len(args) > 0: - Console.error(f'Invalid arguments {args}') - Console.error('Run \'cpl help\'') - - self._publisher.create() - self._publisher.publish() diff --git a/src/sh_edraft/cli/cpl_cli/project.json b/src/sh_edraft/cli/cpl_cli/templates/app/build.json similarity index 79% rename from src/sh_edraft/cli/cpl_cli/project.json rename to src/sh_edraft/cli/cpl_cli/templates/app/build.json index 5d15af9e..c6ea10bc 100644 --- a/src/sh_edraft/cli/cpl_cli/project.json +++ b/src/sh_edraft/cli/cpl_cli/templates/app/build.json @@ -6,14 +6,14 @@ "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" }, "LoggingSettings": { - "Path": "logs/", + "Path": "build/logs/", "Filename": "log_$start_time.log", "ConsoleLogLevel": "INFO", - "FileLogLevel": "TRACE" + "FileLogLevel": "INFO" }, "PublishSettings": { - "SourcePath": "../", - "DistPath": "../../../../dist", + "SourcePath": "./", + "DistPath": "build/dist", "Templates": [], "IncludedFiles": [], "ExcludedFiles": [], diff --git a/src/sh_edraft/cli/interpreter/__init__.py b/src/sh_edraft/cli/interpreter/__init__.py index e69de29b..fdf21dc1 100644 --- a/src/sh_edraft/cli/interpreter/__init__.py +++ b/src/sh_edraft/cli/interpreter/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.interpreter +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.interpreter' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/logging/logger.py b/src/sh_edraft/logging/logger.py index ec96469e..6668132e 100644 --- a/src/sh_edraft/logging/logger.py +++ b/src/sh_edraft/logging/logger.py @@ -48,7 +48,7 @@ class Logger(LoggerBase): try: # check if log file path exists if not os.path.exists(self._path): - os.mkdir(self._path) + os.makedirs(self._path) except Exception as e: self._fatal_console(__name__, 'Cannot create log dir', ex=e) diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 2e922f36..d426ee5f 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -16,6 +16,8 @@ class Publisher(PublisherBase): self._logger: LoggerBase = logger self._publish_settings: PublishSettings = publish_settings + self._included_files: list[str] = [] + @property def source_path(self) -> str: return self._publish_settings.source_path @@ -53,10 +55,31 @@ class Publisher(PublisherBase): def _read_source_path(self): self._logger.trace(__name__, f'Started {__name__}._read_source_path') + included_files = self._publish_settings.included_files + for included in included_files: + if os.path.isdir(included): + self._publish_settings.included_files.remove(included) + + for r, d, f in os.walk(included): + for file in f: + file_path = os.path.join(self._publish_settings.source_path, r, file) + if os.path.isfile(file_path): + self._included_files.append(file_path) + else: + self._logger.fatal(__name__, f'File not found: {file}') + for r, d, f in os.walk(self._publish_settings.source_path): for file in f: - if file.endswith('.py') or file in self._publish_settings.included_files: - self._publish_settings.included_files.append(os.path.join(r, file)) + is_file_excluded = False + if os.path.join(r, file) in self._publish_settings.excluded_files: + is_file_excluded = True + else: + for excluded in self._publish_settings.excluded_files: + if os.path.join(r, file).__contains__(excluded): + is_file_excluded = True + + if not is_file_excluded and file.endswith('.py') or file in self._publish_settings.included_files: + self._included_files.append(os.path.join(r, file)) self._logger.trace(__name__, f'Stopped {__name__}._read_source_path') @@ -109,7 +132,7 @@ class Publisher(PublisherBase): def _write_templates(self): self._logger.trace(__name__, f'Started {__name__}._write_templates') for template in self._publish_settings.templates: - for file in self._publish_settings.included_files: + for file in self._included_files: if os.path.basename(file) == '__init__.py' and file not in self._publish_settings.excluded_files: template_name = template.name if template.name == 'all' or template.name == '': @@ -167,7 +190,7 @@ class Publisher(PublisherBase): if self._publish_settings.dist_path.endswith('/'): dist_path = dist_path[:len(dist_path) - 1] - for file in self._publish_settings.included_files: + for file in self._included_files: is_file_excluded = False if file in self._publish_settings.excluded_files: is_file_excluded = True From 09eb3a41d68109a4e7c1b80ab8a9955f57beadea Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 17:54:29 +0100 Subject: [PATCH 56/86] Improved publish process --- src/build.json | 1 + src/sh_edraft/publishing/publisher.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/build.json b/src/build.json index da1551cc..d2ca1def 100644 --- a/src/build.json +++ b/src/build.json @@ -51,6 +51,7 @@ } ], "IncludedFiles": [ + "./MANIFEST.in", "../LICENSE", "../README.md", "../requirements.txt", diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index d426ee5f..7bb9fa87 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -68,6 +68,11 @@ class Publisher(PublisherBase): else: self._logger.fatal(__name__, f'File not found: {file}') + elif os.path.isfile(included): + self._included_files.append(os.path.join(self._publish_settings.source_path, included)) + else: + self._logger.fatal(__name__, f'File not found: {included}') + for r, d, f in os.walk(self._publish_settings.source_path): for file in f: is_file_excluded = False @@ -207,7 +212,11 @@ class Publisher(PublisherBase): elif file.startswith('.'): output_file = file.replace('.', '', 1) - output_file = f'{dist_path}{output_file}' + if output_file.__contains__('..'): + output_file = os.path.join(dist_path, os.path.basename(file)) + else: + output_file = f'{dist_path}{output_file}' + output_path = os.path.dirname(output_file) try: From a6122536a634fd2493b76cdb047cf59825540f22 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:14:11 +0100 Subject: [PATCH 57/86] Added publish command to cli --- src/sh_edraft/cli/cpl_cli/cli.py | 3 +- .../cli/cpl_cli/commands/publish/__init__.py | 25 ++++++++++ .../cli/cpl_cli/commands/publish/app.py | 48 +++++++++++++++++++ .../cli/cpl_cli/commands/publish/publish.py | 23 +++++++++ .../publishing/base/publisher_base.py | 5 +- src/sh_edraft/publishing/publisher.py | 15 +++++- src/tests_dev/publisher.py | 2 +- 7 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/publish/app.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/publish/publish.py diff --git a/src/sh_edraft/cli/cpl_cli/cli.py b/src/sh_edraft/cli/cpl_cli/cli.py index a1eb8a70..f0728d13 100644 --- a/src/sh_edraft/cli/cpl_cli/cli.py +++ b/src/sh_edraft/cli/cpl_cli/cli.py @@ -1,10 +1,10 @@ import sys import traceback -from typing import Optional from sh_edraft.cli.cpl_cli.commands.build.build import Build from sh_edraft.cli.cpl_cli.commands.help import Help from sh_edraft.cli.cpl_cli.commands.new import New +from sh_edraft.cli.cpl_cli.commands.publish.publish import Publish from sh_edraft.cli.cpl_cli.commands.version import Version from sh_edraft.cli.interpreter.interpreter import Interpreter from sh_edraft.console.console import Console @@ -19,6 +19,7 @@ class CLI: self._interpreter.add_command(Build()) self._interpreter.add_command(Help()) self._interpreter.add_command(New()) + self._interpreter.add_command(Publish()) self._interpreter.add_command(Version()) def main(self): diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py new file mode 100644 index 00000000..3963f7a7 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.cpl_cli.commands.publish +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.cpl_cli.commands.publish' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.9' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/app.py b/src/sh_edraft/cli/cpl_cli/commands/publish/app.py new file mode 100644 index 00000000..c7ce661a --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/app.py @@ -0,0 +1,48 @@ +from typing import Optional + +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.application_host import ApplicationHost +from sh_edraft.hosting.base.application_base import ApplicationBase +from sh_edraft.logging.logger import Logger +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.publishing.publisher import Publisher +from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase + + +class PublishApp(ApplicationBase): + + def __init__(self): + ApplicationBase.__init__(self) + + self._app_host: Optional[ApplicationHost] = None + self._services: Optional[ServiceProviderBase] = None + self._configuration: Optional[ConfigurationBase] = None + self._logger: Optional[LoggerBase] = None + self._publisher: Optional[PublisherBase] = None + + def create_application_host(self): + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + def create_configuration(self): + self._configuration.add_json_file(f'build.json') + + def create_services(self): + # Add and create logger + self._services.add_singleton(LoggerBase, Logger) + self._logger = self._services.get_service(LoggerBase) + + # Add and create publisher + self._services.add_singleton(PublisherBase, Publisher) + self._publisher: Publisher = self._services.get_service(PublisherBase) + + def main(self): + self._logger.header(f'{self._configuration.environment.application_name}:') + self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') + self._publisher.create() + self._publisher.build() + self._publisher.publish() diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py b/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py new file mode 100644 index 00000000..f21c331e --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py @@ -0,0 +1,23 @@ +from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.cli.cpl_cli.commands.publish.app import PublishApp +from sh_edraft.console.console import Console + + +class Publish(CommandBase): + + def __init__(self): + CommandBase.__init__(self) + self._app = PublishApp() + + self._aliases.append('-b') + self._aliases.append('-B') + + def run(self, args: list[str]): + if len(args) > 0: + Console.error(f'Invalid arguments {args}') + Console.error('Run \'cpl help\'') + + self._app.create_application_host() + self._app.create_configuration() + self._app.create_services() + self._app.main() diff --git a/src/sh_edraft/publishing/base/publisher_base.py b/src/sh_edraft/publishing/base/publisher_base.py index f3f899ca..092dec3d 100644 --- a/src/sh_edraft/publishing/base/publisher_base.py +++ b/src/sh_edraft/publishing/base/publisher_base.py @@ -24,4 +24,7 @@ class PublisherBase(ServiceBase): def exclude(self, path: str): pass @abstractmethod - def publish(self) -> str: pass + def build(self): pass + + @abstractmethod + def publish(self): pass diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 7bb9fa87..9a9a1518 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -2,6 +2,8 @@ import os import shutil from string import Template as stringTemplate +from setuptools import sandbox + from sh_edraft.logging.base.logger_base import LoggerBase from sh_edraft.publishing.base.publisher_base import PublisherBase from sh_edraft.publishing.model.publish_settings_model import PublishSettings @@ -255,8 +257,17 @@ class Publisher(PublisherBase): self._create_dist_path() self._logger.trace(__name__, f'Stopped {__name__}.create') - def publish(self): - self._logger.trace(__name__, f'Started {__name__}.publish') + def build(self): + self._logger.trace(__name__, f'Started {__name__}.build') self._write_templates() self._copy_all_included_files() + self._logger.trace(__name__, f'Stopped {__name__}.build') + + def publish(self): + self._logger.trace(__name__, f'Started {__name__}.publish') + setup_py = os.path.join(self._publish_settings.dist_path, 'setup.py') + if not os.path.isfile(setup_py): + self._logger.fatal(__name__, f'setup.py not found in {self._publish_settings.dist_path}') + + sandbox.run_setup(os.path.abspath(setup_py), ['sdist', 'bdist_wheel']) self._logger.trace(__name__, f'Stopped {__name__}.publish') diff --git a/src/tests_dev/publisher.py b/src/tests_dev/publisher.py index f9eea080..06b75735 100644 --- a/src/tests_dev/publisher.py +++ b/src/tests_dev/publisher.py @@ -54,7 +54,7 @@ class Program(ApplicationBase): self._publisher.include('../../README.MD') self._publisher.include('../../requirements.txt') self._publisher.create() - self._publisher.publish() + self._publisher.build() if __name__ == '__main__': From 39ccc8430e41ac111f894eb05e3aeb0e25d6d492 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:16:26 +0100 Subject: [PATCH 58/86] Added imports to cli module --- src/sh_edraft/cli/command/base/__init__.py | 1 + src/sh_edraft/cli/cpl_cli/__init__.py | 1 + src/sh_edraft/cli/cpl_cli/commands/__init__.py | 3 +++ src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py | 2 ++ src/sh_edraft/cli/interpreter/__init__.py | 1 + 5 files changed, 8 insertions(+) diff --git a/src/sh_edraft/cli/command/base/__init__.py b/src/sh_edraft/cli/command/base/__init__.py index 83d30e3e..13a5ebca 100644 --- a/src/sh_edraft/cli/command/base/__init__.py +++ b/src/sh_edraft/cli/command/base/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.9' from collections import namedtuple # imports: +from .command_base import CommandBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/__init__.py b/src/sh_edraft/cli/cpl_cli/__init__.py index 1c8b1737..9130756c 100644 --- a/src/sh_edraft/cli/cpl_cli/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.9' from collections import namedtuple # imports: +from .cli import CLI VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/commands/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/__init__.py index 8f0a8760..27f75a8b 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/commands/__init__.py @@ -20,6 +20,9 @@ __version__ = '2020.12.9' from collections import namedtuple # imports: +from .version import Version +from .help import Help +from .new import New VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py index 3963f7a7..f4af0e65 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py @@ -20,6 +20,8 @@ __version__ = '2020.12.9' from collections import namedtuple # imports: +from .app import PublishApp +from .publish import Publish VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/sh_edraft/cli/interpreter/__init__.py b/src/sh_edraft/cli/interpreter/__init__.py index fdf21dc1..ccd63b96 100644 --- a/src/sh_edraft/cli/interpreter/__init__.py +++ b/src/sh_edraft/cli/interpreter/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.9' from collections import namedtuple # imports: +from .interpreter import Interpreter VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=9) From 4f03e5ae99dea354121a130c779f2a00e90157dd Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:17:47 +0100 Subject: [PATCH 59/86] Improved help command --- src/sh_edraft/cli/cpl_cli/commands/help.py | 3 ++- src/sh_edraft/cli/cpl_cli/commands/publish/publish.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sh_edraft/cli/cpl_cli/commands/help.py b/src/sh_edraft/cli/cpl_cli/commands/help.py index b9212479..3983cb59 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/help.py +++ b/src/sh_edraft/cli/cpl_cli/commands/help.py @@ -12,9 +12,10 @@ class Help(CommandBase): def run(self, args: list[str]): Console.write_line('Available Commands:') commands = [ - ['build (-b|-B)', 'Prepares files for publishing into an output directory named dist/ at the given output path.Must be executed from within a workspace directory.'], + ['build (-b|-B)', 'Prepares files for publishing into an output directory named dist/ at the given output path. Must be executed from within a workspace directory.'], ['help (-h|-H)', 'Lists available commands and their short descriptions.'], ['new', 'Creates a new file or package.'], + ['publish (-p|-P)', 'Prepares files for publishing into an output directory named dist/ at the given output path and executes setup.py. Must be executed from within a workspace directory.'], ['version (-v|-V)', 'Outputs CPL CLI version.'] ] for name, description in commands: diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py b/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py index f21c331e..7e72ae3a 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/publish.py @@ -9,8 +9,8 @@ class Publish(CommandBase): CommandBase.__init__(self) self._app = PublishApp() - self._aliases.append('-b') - self._aliases.append('-B') + self._aliases.append('-p') + self._aliases.append('-P') def run(self, args: list[str]): if len(args) > 0: From fcb57bd2ccc55762fd21c5f1c0d8104dcc9e73e3 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:20:39 +0100 Subject: [PATCH 60/86] Changed deps --- requirements.txt | 3 +++ src/setup.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 742e4085..afb24683 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,3 +24,6 @@ termcolor==1.1.0 urllib3==1.26.2 Werkzeug==1.0.1 yarl==1.5.1 +setuptools~=49.2.1 +pyfiglet~=0.8.post1 +tabulate~=0.8.7 \ No newline at end of file diff --git a/src/setup.py b/src/setup.py index 71cc0e2b..748df92d 100644 --- a/src/setup.py +++ b/src/setup.py @@ -16,7 +16,9 @@ setuptools.setup( 'flask', 'mysql-connector', 'SQLAlchemy', - 'termcolor' + 'termcolor', + 'pyfiglet', + 'tabulate' ], entry_points={ 'console_scripts': [ From c015780a8dafdbcdc543eb5ca285ba7cd323f740 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:23:34 +0100 Subject: [PATCH 61/86] Bugfixes --- src/sh_edraft/cli/cpl_cli/commands/version.py | 2 +- src/sh_edraft/console/console.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sh_edraft/cli/cpl_cli/commands/version.py b/src/sh_edraft/cli/cpl_cli/commands/version.py index 61c95211..737a69c7 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/version.py +++ b/src/sh_edraft/cli/cpl_cli/commands/version.py @@ -25,7 +25,7 @@ class Version(CommandBase): Console.write_line(f'Python: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}') Console.write_line(f'OS: {platform.system()} {platform.processor()}') - Console.write_line('\nCPL:') + Console.write_line('CPL:') packages = [] for importer, modname, is_pkg in pkgutil.iter_modules(sh_edraft.__path__): module = importer.find_module(modname).load_module(modname) diff --git a/src/sh_edraft/console/console.py b/src/sh_edraft/console/console.py index b2b722da..c454eb81 100644 --- a/src/sh_edraft/console/console.py +++ b/src/sh_edraft/console/console.py @@ -153,6 +153,7 @@ class Console: table = tabulate(values, headers=header) Console.write_line(table) + Console.write('\n') @classmethod def write(cls, *args): From 299c63da07133e3ee221ecbdd4e1201241ba0cb1 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:25:02 +0100 Subject: [PATCH 62/86] Bugfixes --- src/sh_edraft/cli/cpl_cli/commands/help.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sh_edraft/cli/cpl_cli/commands/help.py b/src/sh_edraft/cli/cpl_cli/commands/help.py index 3983cb59..6ea89066 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/help.py +++ b/src/sh_edraft/cli/cpl_cli/commands/help.py @@ -23,3 +23,5 @@ class Help(CommandBase): Console.write(f'\n\t{name} ') Console.set_foreground_color('default') Console.write(f'{description}') + + Console.write('\n') From d49aa30cb75d85610f4004a7119eec2e2b5619c5 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Wed, 16 Dec 2020 18:26:52 +0100 Subject: [PATCH 63/86] Removed publisher.py --- src/tests_dev/publisher.py | 65 -------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 src/tests_dev/publisher.py diff --git a/src/tests_dev/publisher.py b/src/tests_dev/publisher.py deleted file mode 100644 index 06b75735..00000000 --- a/src/tests_dev/publisher.py +++ /dev/null @@ -1,65 +0,0 @@ -from typing import Optional - -from sh_edraft.configuration.base import ConfigurationBase -from sh_edraft.hosting import ApplicationHost -from sh_edraft.hosting.base import ApplicationBase -from sh_edraft.logging import Logger -from sh_edraft.logging.base import LoggerBase -from sh_edraft.publishing import Publisher -from sh_edraft.publishing.base import PublisherBase -from sh_edraft.service.providing.base import ServiceProviderBase - - -class Program(ApplicationBase): - - def __init__(self): - ApplicationBase.__init__(self) - - self._app_host: Optional[ApplicationHost] = None - self._services: Optional[ServiceProviderBase] = None - self._configuration: Optional[ConfigurationBase] = None - self._logger: Optional[LoggerBase] = None - self._publisher: Optional[PublisherBase] = None - - def create_application_host(self): - self._app_host = ApplicationHost() - self._configuration = self._app_host.configuration - self._services = self._app_host.services - - def create_configuration(self): - self._configuration.add_environment_variables('PYTHON_') - self._configuration.add_environment_variables('CPL_') - self._configuration.add_argument_variables() - self._configuration.add_json_file(f'appsettings.json') - self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') - self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) - - def create_services(self): - # Add and create logger - self._services.add_singleton(LoggerBase, Logger) - self._logger = self._services.get_service(LoggerBase) - - # Add and create publisher - self._services.add_singleton(PublisherBase, Publisher) - self._publisher: Publisher = self._services.get_service(PublisherBase) - - def main(self): - self._logger.header(f'{self._configuration.environment.application_name}:') - self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') - self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') - self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') - self._publisher.exclude('../tests') - self._publisher.exclude('../tests_dev') - self._publisher.include('../../LICENSE') - self._publisher.include('../../README.MD') - self._publisher.include('../../requirements.txt') - self._publisher.create() - self._publisher.build() - - -if __name__ == '__main__': - program = Program() - program.create_application_host() - program.create_configuration() - program.create_services() - program.main() From ceec896718e74bbc3913637dd04dacdfac0f0410 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sat, 19 Dec 2020 14:17:50 +0100 Subject: [PATCH 64/86] Improved error handling --- src/sh_edraft/cli/interpreter/interpreter.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/sh_edraft/cli/interpreter/interpreter.py b/src/sh_edraft/cli/interpreter/interpreter.py index e1cf07ea..d3e580e4 100644 --- a/src/sh_edraft/cli/interpreter/interpreter.py +++ b/src/sh_edraft/cli/interpreter/interpreter.py @@ -16,6 +16,11 @@ class Interpreter: def interpret(self, input_string: str): input_list = input_string.split(' ') command = input_list[0] + if command is None or command == '': + Console.error(f'Expected command') + Console.error('Run \'cpl help\'') + return + args = input_list[1:] if len(input_list) > 1 else [] cmd = next( From e2715066a44684b392acc69629dec69936ebaaec Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 20 Dec 2020 14:49:28 +0100 Subject: [PATCH 65/86] Improved service providing --- src/sh_edraft/service/providing/service_provider.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sh_edraft/service/providing/service_provider.py b/src/sh_edraft/service/providing/service_provider.py index b4defc4b..6cec42a4 100644 --- a/src/sh_edraft/service/providing/service_provider.py +++ b/src/sh_edraft/service/providing/service_provider.py @@ -4,6 +4,7 @@ from typing import Type, Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase from sh_edraft.database.context.base.database_context_base import DatabaseContextBase +from sh_edraft.environment.base import EnvironmentBase from sh_edraft.hosting.base.application_runtime_base import ApplicationRuntimeBase from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase from sh_edraft.service.base.service_base import ServiceBase @@ -31,6 +32,9 @@ class ServiceProvider(ServiceProviderBase): if issubclass(parameter.annotation, ApplicationRuntimeBase): params.append(self._app_runtime) + elif issubclass(parameter.annotation, EnvironmentBase): + params.append(self._app_runtime.configuration.environment) + elif issubclass(parameter.annotation, DatabaseContextBase): params.append(self._database_context) From edd79dca9acc2716ba906c8ae49e1dc1af3a8e1f Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 20 Dec 2020 14:49:43 +0100 Subject: [PATCH 66/86] Added email client --- src/setup.py | 3 +- src/sh_edraft/mailing/base/__init__.py | 0 .../mailing/base/email_client_base.py | 17 ++++ src/sh_edraft/mailing/email_client.py | 71 +++++++++++++++ src/sh_edraft/mailing/model/__init__.py | 0 src/sh_edraft/mailing/model/email.py | 86 +++++++++++++++++++ .../mailing/model/email_client_settings.py | 59 +++++++++++++ .../model/email_client_settings_name.py | 9 ++ src/tests_dev/appsettings.edrafts-pc.json | 6 ++ src/tests_dev/program.py | 36 ++++---- 10 files changed, 266 insertions(+), 21 deletions(-) create mode 100644 src/sh_edraft/mailing/base/__init__.py create mode 100644 src/sh_edraft/mailing/base/email_client_base.py create mode 100644 src/sh_edraft/mailing/email_client.py create mode 100644 src/sh_edraft/mailing/model/__init__.py create mode 100644 src/sh_edraft/mailing/model/email.py create mode 100644 src/sh_edraft/mailing/model/email_client_settings.py create mode 100644 src/sh_edraft/mailing/model/email_client_settings_name.py diff --git a/src/setup.py b/src/setup.py index 748df92d..a2e40b12 100644 --- a/src/setup.py +++ b/src/setup.py @@ -18,7 +18,8 @@ setuptools.setup( 'SQLAlchemy', 'termcolor', 'pyfiglet', - 'tabulate' + 'tabulate', + 'smtplib' ], entry_points={ 'console_scripts': [ diff --git a/src/sh_edraft/mailing/base/__init__.py b/src/sh_edraft/mailing/base/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/mailing/base/email_client_base.py b/src/sh_edraft/mailing/base/email_client_base.py new file mode 100644 index 00000000..bbb98879 --- /dev/null +++ b/src/sh_edraft/mailing/base/email_client_base.py @@ -0,0 +1,17 @@ +from abc import abstractmethod + +from sh_edraft.mailing.model.email import EMail +from sh_edraft.service.base.service_base import ServiceBase + + +class EMailClientBase(ServiceBase): + + @abstractmethod + def __init__(self): + ServiceBase.__init__(self) + + @abstractmethod + def connect(self): pass + + @abstractmethod + def send_mail(self, email: EMail): pass diff --git a/src/sh_edraft/mailing/email_client.py b/src/sh_edraft/mailing/email_client.py new file mode 100644 index 00000000..cc6296ee --- /dev/null +++ b/src/sh_edraft/mailing/email_client.py @@ -0,0 +1,71 @@ +import ssl +from smtplib import SMTP +from typing import Optional + +from sh_edraft.environment.base.environment_base import EnvironmentBase +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.mailing.base.email_client_base import EMailClientBase +from sh_edraft.mailing.model.email import EMail +from sh_edraft.mailing.model.email_client_settings import EMailClientSettings +from sh_edraft.service.base.service_base import ServiceBase +from sh_edraft.utils.credential_manager import CredentialManager + + +class EMailClient(EMailClientBase): + + def __init__(self, environment: EnvironmentBase, logger: LoggerBase, mail_settings: EMailClientSettings): + ServiceBase.__init__(self) + + self._environment = environment + self._mail_settings = mail_settings + self._logger = logger + + self._server: Optional[SMTP] = None + + self.create() + + def create(self): + self._logger.trace(__name__, f'Started {__name__}.create') + self.connect() + self._logger.trace(__name__, f'Stopped {__name__}.create') + + def connect(self): + self._logger.trace(__name__, f'Started {__name__}.connect') + try: + self._logger.debug(__name__, f'Try to connect to {self._mail_settings.host}:{self._mail_settings.port}') + self._server = SMTP(self._mail_settings.host, self._mail_settings.port) + self._logger.info(__name__, f'Connected to {self._mail_settings.host}:{self._mail_settings.port}') + + self._logger.debug(__name__, 'Try to start tls') + self._server.starttls(context=ssl.create_default_context()) + self._logger.info(__name__, 'Started tls') + except Exception as e: + self._logger.error(__name__, 'Cannot connect to mail server', e) + + self._logger.trace(__name__, f'Stopped {__name__}.connect') + + def login(self): + self._logger.trace(__name__, f'Started {__name__}.login') + try: + self._logger.debug(__name__, f'Try to login {self._mail_settings.user_name}@{self._mail_settings.host}:{self._mail_settings.port}') + self._server.login(self._mail_settings.user_name, CredentialManager.decrypt(self._mail_settings.credentials)) + self._logger.info(__name__, f'Logged on as {self._mail_settings.user_name} to {self._mail_settings.host}:{self._mail_settings.port}') + except Exception as e: + self._logger.error(__name__, 'Cannot login to mail server', e) + + self._logger.trace(__name__, f'Stopped {__name__}.login') + + def send_mail(self, email: EMail): + self._logger.trace(__name__, f'Started {__name__}.send_mail') + try: + self.login() + email.body += f'\n\nDies ist eine automatische E-Mail.' \ + f'\nGesendet von {self._environment.application_name}-{self._environment.environment_name}@{self._environment.host_name} für ' \ + f'{self._environment.customer}.' + + self._logger.debug(__name__, f'Try to send email to {email.receiver_list}') + self._server.sendmail(self._mail_settings.user_name, email.receiver_list, email.get_content(self._mail_settings.user_name)) + self._logger.info(__name__, f'Sent email to {email.receiver_list}') + except Exception as e: + self._logger.error(__name__, f'Cannot send mail to {email.receiver_list}', e) + self._logger.trace(__name__, f'Stopped {__name__}.send_mail') diff --git a/src/sh_edraft/mailing/model/__init__.py b/src/sh_edraft/mailing/model/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/sh_edraft/mailing/model/email.py b/src/sh_edraft/mailing/model/email.py new file mode 100644 index 00000000..de49639d --- /dev/null +++ b/src/sh_edraft/mailing/model/email.py @@ -0,0 +1,86 @@ +import re + + +class EMail: + + def __init__(self, header: list[str] = None, subject: str = None, body: str = None, transceiver: str = None, receiver: list[str] = None): + self._header: list[str] = header + + self._subject: str = subject + self._body: str = body + + self._transceiver: str = transceiver + self._receiver: list[str] = receiver + + @property + def header(self) -> str: + return '\r\n'.join(self._header) + + @property + def header_list(self) -> list[str]: + return self._header + + @header.setter + def header(self, header: list[str]): + self._header = header + + @property + def subject(self) -> str: + return self._subject + + @subject.setter + def subject(self, subject: str): + self._subject = subject + + @property + def body(self) -> str: + return self._body + + @body.setter + def body(self, body: str): + self._body = body + + @property + def transceiver(self) -> str: + return self._transceiver + + @transceiver.setter + def transceiver(self, transceiver: str): + if self.check_mail(transceiver): + self._transceiver = transceiver + else: + raise Exception(f'Invalid email: {transceiver}') + + @property + def receiver(self) -> str: + return ','.join(self._receiver) + + @property + def receiver_list(self) -> list[str]: + return self._receiver + + @receiver.setter + def receiver(self, receiver: list[str]): + self._receiver = receiver + + @staticmethod + def check_mail(address: str) -> bool: + return bool(re.search('^\\w+([.-]?\\w+)*@\\w+([.-]?\\w+)*(.\\w{2,3})+$', address)) + + def add_header(self, header: str): + if self._header is None: + self._header = [] + + self._header.append(header) + + def add_receiver(self, receiver: str): + if self._receiver is None: + self._receiver = [] + + if self.check_mail(receiver): + self._receiver.append(receiver) + else: + raise Exception(f'Invalid email: {receiver}') + + def get_content(self, transceiver: str): + return str(f'From: {transceiver}\r\nTo: {self.receiver}\r\n{self.header}\r\nSubject: {self.subject}\r\n{self.body}').encode('utf-8') diff --git a/src/sh_edraft/mailing/model/email_client_settings.py b/src/sh_edraft/mailing/model/email_client_settings.py new file mode 100644 index 00000000..d9755919 --- /dev/null +++ b/src/sh_edraft/mailing/model/email_client_settings.py @@ -0,0 +1,59 @@ +import traceback + +from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase +from sh_edraft.console.console import Console +from sh_edraft.mailing.model.email_client_settings_name import EMailClientSettingsName + + +class EMailClientSettings(ConfigurationModelBase): + + def __init__(self): + ConfigurationModelBase.__init__(self) + + self._host: str = '' + self._port: int = 0 + self._user_name: str = '' + self._credentials: str = '' + + @property + def host(self) -> str: + return self._host + + @host.setter + def host(self, host: str) -> None: + self._host = host + + @property + def port(self) -> int: + return self._port + + @port.setter + def port(self, port: int) -> None: + self._port = port + + @property + def user_name(self) -> str: + return self._user_name + + @user_name.setter + def user_name(self, user_name: str) -> None: + self._user_name = user_name + + @property + def credentials(self) -> str: + return self._credentials + + @credentials.setter + def credentials(self, credentials: str) -> None: + self._credentials = credentials + + def from_dict(self, settings: dict): + try: + self._host = settings[EMailClientSettingsName.host.value] + self._port = settings[EMailClientSettingsName.port.value] + self._user_name = settings[EMailClientSettingsName.user_name.value] + self._credentials = settings[EMailClientSettingsName.credentials.value] + except Exception as e: + Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings') + Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') + diff --git a/src/sh_edraft/mailing/model/email_client_settings_name.py b/src/sh_edraft/mailing/model/email_client_settings_name.py new file mode 100644 index 00000000..665c64b6 --- /dev/null +++ b/src/sh_edraft/mailing/model/email_client_settings_name.py @@ -0,0 +1,9 @@ +from enum import Enum + + +class EMailClientSettingsName(Enum): + + host = 'Host' + port = 'Port' + user_name = 'UserName' + credentials = 'Credentials' diff --git a/src/tests_dev/appsettings.edrafts-pc.json b/src/tests_dev/appsettings.edrafts-pc.json index 3fb75c62..0b2e194a 100644 --- a/src/tests_dev/appsettings.edrafts-pc.json +++ b/src/tests_dev/appsettings.edrafts-pc.json @@ -11,6 +11,12 @@ "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" }, + "EMailClientSettings": { + "Host": "mail.sh-edraft.de", + "Port": "587", + "UserName": "dev-srv@sh-edraft.de", + "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" + }, "PublishSettings": { "SourcePath": "../", "DistPath": "../../dist", diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 391a44ef..d957bc49 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,13 +1,15 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase -from sh_edraft.console import Console from sh_edraft.database.context import DatabaseContext from sh_edraft.database.model import DatabaseSettings from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase +from sh_edraft.mailing.base.email_client_base import EMailClientBase +from sh_edraft.mailing.email_client import EMailClient +from sh_edraft.mailing.model.email import EMail from sh_edraft.service.providing.base import ServiceProviderBase from sh_edraft.utils import CredentialManager @@ -24,6 +26,7 @@ class Program(ApplicationBase): self._services: Optional[ServiceProviderBase] = None self._configuration: Optional[ConfigurationBase] = None self._logger: Optional[LoggerBase] = None + self._mailer: Optional[EMailClientBase] = None def create_application_host(self): self._app_host = ApplicationHost() @@ -51,28 +54,21 @@ class Program(ApplicationBase): self._services.add_singleton(LoggerBase, Logger) self._logger = self._services.get_service(LoggerBase) + self._services.add_singleton(EMailClientBase, EMailClient) + self._mailer = self._services.get_service(EMailClientBase) + def main(self): self._logger.header(f'{self._configuration.environment.application_name}:') self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') self._services.get_service(UserRepoBase).add_test_user() - - Console.clear() - Console.write_line('Hello', 'World') - # name = Console.read_line('Name: ') - # Console.write_line('Hello', name) - Console.set_foreground_color('red') - Console.set_background_color('green') - Console.set_cursor_position(5, 5) - Console.write_line('Error') - Console.write_line_at(10, 5, 'Error') - Console.write_at(15, 5, 'Error') - Console.reset_cursor_position() - Console.set_foreground_color('green') - Console.set_background_color('default') - Console.write_line('Test') - Console.write('1') - # Console.write('x: ') - # Console.read_line('Test> ') - Console.write_line(Console.foreground_color) + mail = EMail() + mail.add_header('Mime-Version: 1.0') + mail.add_header('Content-Type: text/plain; charset=utf-8') + mail.add_header('Content-Transfer-Encoding: quoted-printable') + mail.add_receiver('edraft.sh@gmail.com') + mail.add_receiver('edraft@sh-edraft.de') + mail.subject = f'Test - {self._configuration.environment.host_name}' + mail.body = 'Dies ist ein Test :D' + self._mailer.send_mail(mail) From b402b2d0045c9f5ddcd96191d01e994b7b12843e Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 20 Dec 2020 15:20:22 +0100 Subject: [PATCH 67/86] Published --- src/build.json | 4 +-- src/sh_edraft/cli/__init__.py | 4 +-- src/sh_edraft/cli/command/__init__.py | 4 +-- src/sh_edraft/cli/command/base/__init__.py | 4 +-- src/sh_edraft/cli/cpl_cli/__init__.py | 4 +-- .../cli/cpl_cli/commands/__init__.py | 4 +-- .../cli/cpl_cli/commands/publish/__init__.py | 4 +-- src/sh_edraft/cli/interpreter/__init__.py | 4 +-- src/sh_edraft/mailing/__init__.py | 4 +-- src/sh_edraft/mailing/base/__init__.py | 25 +++++++++++++++++++ src/sh_edraft/mailing/model/__init__.py | 25 +++++++++++++++++++ src/sh_edraft/publishing/__init__.py | 4 +-- src/sh_edraft/publishing/base/__init__.py | 4 +-- src/sh_edraft/publishing/model/__init__.py | 4 +-- src/sh_edraft/service/providing/__init__.py | 4 +-- 15 files changed, 76 insertions(+), 26 deletions(-) diff --git a/src/build.json b/src/build.json index d2ca1def..68883b77 100644 --- a/src/build.json +++ b/src/build.json @@ -29,7 +29,7 @@ "Version": { "Major": 2020, "Minor": 12, - "Micro": 9 + "Micro": 10 } }, { @@ -46,7 +46,7 @@ "Version": { "Major": 2020, "Minor": 12, - "Micro": 9 + "Micro": 10 } } ], diff --git a/src/sh_edraft/cli/__init__.py b/src/sh_edraft/cli/__init__.py index 89b6ae33..d604c174 100644 --- a/src/sh_edraft/cli/__init__.py +++ b/src/sh_edraft/cli/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.cli' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/cli/command/__init__.py b/src/sh_edraft/cli/command/__init__.py index 336d4a17..5d5abc0b 100644 --- a/src/sh_edraft/cli/command/__init__.py +++ b/src/sh_edraft/cli/command/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.cli.command' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/cli/command/base/__init__.py b/src/sh_edraft/cli/command/base/__init__.py index 13a5ebca..bf79046d 100644 --- a/src/sh_edraft/cli/command/base/__init__.py +++ b/src/sh_edraft/cli/command/base/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.cli.command.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .command_base import CommandBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/cli/cpl_cli/__init__.py b/src/sh_edraft/cli/cpl_cli/__init__.py index 9130756c..d2709a11 100644 --- a/src/sh_edraft/cli/cpl_cli/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.cli.cpl_cli' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .cli import CLI VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/cli/cpl_cli/commands/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/__init__.py index 27f75a8b..a1d5ec40 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/commands/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.cli.cpl_cli.commands' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -25,4 +25,4 @@ from .help import Help from .new import New VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py index f4af0e65..d367c84a 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.cli.cpl_cli.commands.publish' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -24,4 +24,4 @@ from .app import PublishApp from .publish import Publish VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/cli/interpreter/__init__.py b/src/sh_edraft/cli/interpreter/__init__.py index ccd63b96..7f342630 100644 --- a/src/sh_edraft/cli/interpreter/__init__.py +++ b/src/sh_edraft/cli/interpreter/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.cli.interpreter' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .interpreter import Interpreter VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/mailing/__init__.py b/src/sh_edraft/mailing/__init__.py index 4d478fe1..00cf499a 100644 --- a/src/sh_edraft/mailing/__init__.py +++ b/src/sh_edraft/mailing/__init__.py @@ -15,11 +15,11 @@ __title__ = 'sh_edraft.mailing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/mailing/base/__init__.py b/src/sh_edraft/mailing/base/__init__.py index e69de29b..2a47b22b 100644 --- a/src/sh_edraft/mailing/base/__init__.py +++ b/src/sh_edraft/mailing/base/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.mailing.base +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.mailing.base' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.10' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/mailing/model/__init__.py b/src/sh_edraft/mailing/model/__init__.py index e69de29b..d82af892 100644 --- a/src/sh_edraft/mailing/model/__init__.py +++ b/src/sh_edraft/mailing/model/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.mailing.model +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.mailing.model' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.10' + +from collections import namedtuple + +# imports: + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/publishing/__init__.py b/src/sh_edraft/publishing/__init__.py index f6aee612..62c88c4e 100644 --- a/src/sh_edraft/publishing/__init__.py +++ b/src/sh_edraft/publishing/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.publishing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .publisher import Publisher VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/publishing/base/__init__.py b/src/sh_edraft/publishing/base/__init__.py index d57eaf3d..a462ce7c 100644 --- a/src/sh_edraft/publishing/base/__init__.py +++ b/src/sh_edraft/publishing/base/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.publishing.base' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple from .publisher_base import PublisherBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/publishing/model/__init__.py b/src/sh_edraft/publishing/model/__init__.py index 8b4b4a63..54283917 100644 --- a/src/sh_edraft/publishing/model/__init__.py +++ b/src/sh_edraft/publishing/model/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.publishing.model' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -26,4 +26,4 @@ from .publish_settings_model import PublishSettings from .publish_settings_name import PublishSettingsName VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/service/providing/__init__.py b/src/sh_edraft/service/providing/__init__.py index d4a3f100..a532dc9d 100644 --- a/src/sh_edraft/service/providing/__init__.py +++ b/src/sh_edraft/service/providing/__init__.py @@ -15,7 +15,7 @@ __title__ = 'sh_edraft.service.providing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' +__version__ = '2020.12.10' from collections import namedtuple @@ -24,4 +24,4 @@ from .service_provider import ServiceProvider from .service_provider import ServiceProviderBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) +version_info = VersionInfo(major=2020, minor=12, micro=10) From 3bbf98b9b458faaf4ca8c48e2b0c172fd3ee168b Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 20 Dec 2020 15:20:32 +0100 Subject: [PATCH 68/86] Improved publisher --- src/sh_edraft/publishing/publisher.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publishing/publisher.py index 9a9a1518..4a8bf1cd 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publishing/publisher.py @@ -64,14 +64,20 @@ class Publisher(PublisherBase): for r, d, f in os.walk(included): for file in f: + rel_path = os.path.relpath(r) + if not rel_path.startswith('.'): + rel_path = f'./{rel_path}' + file_path = os.path.join(self._publish_settings.source_path, r, file) if os.path.isfile(file_path): self._included_files.append(file_path) + elif os.path.isfile(os.path.join(rel_path, file)): + self._included_files.append(os.path.join(rel_path, file)) else: self._logger.fatal(__name__, f'File not found: {file}') elif os.path.isfile(included): - self._included_files.append(os.path.join(self._publish_settings.source_path, included)) + self._included_files.append(included) else: self._logger.fatal(__name__, f'File not found: {included}') From 19f0ee719cdbadb7626b1fc180e7b0eaeb9e8ebd Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 20 Dec 2020 15:24:49 +0100 Subject: [PATCH 69/86] Added imports --- src/sh_edraft/mailing/__init__.py | 3 ++- src/sh_edraft/mailing/base/__init__.py | 1 + src/sh_edraft/mailing/model/__init__.py | 3 +++ src/tests_dev/program.py | 6 +++--- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/sh_edraft/mailing/__init__.py b/src/sh_edraft/mailing/__init__.py index 00cf499a..db3f827b 100644 --- a/src/sh_edraft/mailing/__init__.py +++ b/src/sh_edraft/mailing/__init__.py @@ -19,7 +19,8 @@ __version__ = '2020.12.10' from collections import namedtuple - +# imports: +from .email_client import EMailClient VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/mailing/base/__init__.py b/src/sh_edraft/mailing/base/__init__.py index 2a47b22b..587aab2c 100644 --- a/src/sh_edraft/mailing/base/__init__.py +++ b/src/sh_edraft/mailing/base/__init__.py @@ -20,6 +20,7 @@ __version__ = '2020.12.10' from collections import namedtuple # imports: +from .email_client_base import EMailClientBase VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/sh_edraft/mailing/model/__init__.py b/src/sh_edraft/mailing/model/__init__.py index d82af892..ee1b8eb3 100644 --- a/src/sh_edraft/mailing/model/__init__.py +++ b/src/sh_edraft/mailing/model/__init__.py @@ -20,6 +20,9 @@ __version__ = '2020.12.10' from collections import namedtuple # imports: +from .email import EMail +from .email_client_settings_name import EMailClientSettingsName +from .email_client_settings import EMailClientSettings VersionInfo = namedtuple('VersionInfo', 'major minor micro') version_info = VersionInfo(major=2020, minor=12, micro=10) diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index d957bc49..4ecaa466 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -7,9 +7,9 @@ from sh_edraft.hosting import ApplicationHost from sh_edraft.hosting.base import ApplicationBase from sh_edraft.logging import Logger from sh_edraft.logging.base import LoggerBase -from sh_edraft.mailing.base.email_client_base import EMailClientBase -from sh_edraft.mailing.email_client import EMailClient -from sh_edraft.mailing.model.email import EMail +from sh_edraft.mailing.base import EMailClientBase +from sh_edraft.mailing import EMailClient +from sh_edraft.mailing.model import EMail from sh_edraft.service.providing.base import ServiceProviderBase from sh_edraft.utils import CredentialManager From c30f0e09add996b9d1b2ca0a9a37deae3a22921e Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 24 Dec 2020 13:31:36 +0100 Subject: [PATCH 70/86] Removed build form gitignore, added build command --- .gitignore | 1 - .../cli/cpl_cli/commands/build/app.py | 47 +++++++++++++++++++ .../cli/cpl_cli/commands/build/build.py | 23 +++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/sh_edraft/cli/cpl_cli/commands/build/app.py create mode 100644 src/sh_edraft/cli/cpl_cli/commands/build/build.py diff --git a/.gitignore b/.gitignore index 13d1490a..309949bc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ __pycache__/ # Distribution / packaging .Python -build/ develop-eggs/ dist/ downloads/ diff --git a/src/sh_edraft/cli/cpl_cli/commands/build/app.py b/src/sh_edraft/cli/cpl_cli/commands/build/app.py new file mode 100644 index 00000000..84577e8c --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/build/app.py @@ -0,0 +1,47 @@ +from typing import Optional + +from sh_edraft.configuration.base.configuration_base import ConfigurationBase +from sh_edraft.hosting.application_host import ApplicationHost +from sh_edraft.hosting.base.application_base import ApplicationBase +from sh_edraft.logging.logger import Logger +from sh_edraft.logging.base.logger_base import LoggerBase +from sh_edraft.publishing.publisher import Publisher +from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase + + +class BuildApp(ApplicationBase): + + def __init__(self): + ApplicationBase.__init__(self) + + self._app_host: Optional[ApplicationHost] = None + self._services: Optional[ServiceProviderBase] = None + self._configuration: Optional[ConfigurationBase] = None + self._logger: Optional[LoggerBase] = None + self._publisher: Optional[PublisherBase] = None + + def create_application_host(self): + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + def create_configuration(self): + self._configuration.add_json_file(f'build.json') + + def create_services(self): + # Add and create logger + self._services.add_singleton(LoggerBase, Logger) + self._logger = self._services.get_service(LoggerBase) + + # Add and create publisher + self._services.add_singleton(PublisherBase, Publisher) + self._publisher: Publisher = self._services.get_service(PublisherBase) + + def main(self): + self._logger.header(f'{self._configuration.environment.application_name}:') + self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') + self._publisher.create() + self._publisher.build() diff --git a/src/sh_edraft/cli/cpl_cli/commands/build/build.py b/src/sh_edraft/cli/cpl_cli/commands/build/build.py new file mode 100644 index 00000000..f22eb436 --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/build/build.py @@ -0,0 +1,23 @@ +from sh_edraft.cli.command.base.command_base import CommandBase +from sh_edraft.cli.cpl_cli.commands.build.app import BuildApp +from sh_edraft.console.console import Console + + +class Build(CommandBase): + + def __init__(self): + CommandBase.__init__(self) + self._app = BuildApp() + + self._aliases.append('-b') + self._aliases.append('-B') + + def run(self, args: list[str]): + if len(args) > 0: + Console.error(f'Invalid arguments {args}') + Console.error('Run \'cpl help\'') + + self._app.create_application_host() + self._app.create_configuration() + self._app.create_services() + self._app.main() From a5e3a7c0c973a33ccc7a71ee17207990b96a0332 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 24 Dec 2020 13:32:32 +0100 Subject: [PATCH 71/86] Added init file for build command package --- .../cli/cpl_cli/commands/build/__init__.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/sh_edraft/cli/cpl_cli/commands/build/__init__.py diff --git a/src/sh_edraft/cli/cpl_cli/commands/build/__init__.py b/src/sh_edraft/cli/cpl_cli/commands/build/__init__.py new file mode 100644 index 00000000..6a057cac --- /dev/null +++ b/src/sh_edraft/cli/cpl_cli/commands/build/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +""" +sh_edraft.cli.cpl_cli.commands.build +~~~~~~~~~~~~~~~~~~~ + + + +:copyright: (c) 2020 sh-edraft.de +:license: MIT, see LICENSE for more details. + +""" + +__title__ = 'sh_edraft.cli.cpl_cli.commands.build' +__author__ = 'Sven Heidemann' +__license__ = 'MIT' +__copyright__ = 'Copyright (c) 2020 sh-edraft.de' +__version__ = '2020.12.10' + +from collections import namedtuple + +# imports: +from .app import BuildApp +from .build import Build + +VersionInfo = namedtuple('VersionInfo', 'major minor micro') +version_info = VersionInfo(major=2020, minor=12, micro=10) From a9eedb6f573afaccb79a518aba6e58db2821dcc5 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 24 Dec 2020 16:09:57 +0100 Subject: [PATCH 72/86] Added pycharm files to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 309949bc..eb80cef2 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST +.idea/ # PyInstaller # Usually these files are written by a python script from a template From c6bbbb1dedda7ed54863ed2f64281f35c32d8d6a Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Thu, 24 Dec 2020 16:17:41 +0100 Subject: [PATCH 73/86] Added more development tests --- src/tests_dev/appsettings.edrafts-lapi.json | 63 +++++++++++++++++++++ src/tests_dev/program.py | 26 +++++++-- 2 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 src/tests_dev/appsettings.edrafts-lapi.json diff --git a/src/tests_dev/appsettings.edrafts-lapi.json b/src/tests_dev/appsettings.edrafts-lapi.json new file mode 100644 index 00000000..0b2e194a --- /dev/null +++ b/src/tests_dev/appsettings.edrafts-lapi.json @@ -0,0 +1,63 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }, + "EMailClientSettings": { + "Host": "mail.sh-edraft.de", + "Port": "587", + "UserName": "dev-srv@sh-edraft.de", + "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" + }, + "PublishSettings": { + "SourcePath": "../", + "DistPath": "../../dist", + "Templates": [ + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "all", + "Description": "", + "LongDescription": "", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + }, + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "sh_edraft", + "Description": "common python library", + "LongDescription": "Library to share common classes and models used at sh-edraft.de", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + } + ], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt" + } +} \ No newline at end of file diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index 4ecaa466..fec9b31e 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -1,6 +1,7 @@ from typing import Optional from sh_edraft.configuration.base import ConfigurationBase +from sh_edraft.console import Console from sh_edraft.database.context import DatabaseContext from sh_edraft.database.model import DatabaseSettings from sh_edraft.hosting import ApplicationHost @@ -57,12 +58,7 @@ class Program(ApplicationBase): self._services.add_singleton(EMailClientBase, EMailClient) self._mailer = self._services.get_service(EMailClientBase) - def main(self): - self._logger.header(f'{self._configuration.environment.application_name}:') - self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') - self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') - self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') - self._services.get_service(UserRepoBase).add_test_user() + def test_send_mail(self): mail = EMail() mail.add_header('Mime-Version: 1.0') mail.add_header('Content-Type: text/plain; charset=utf-8') @@ -72,3 +68,21 @@ class Program(ApplicationBase): mail.subject = f'Test - {self._configuration.environment.host_name}' mail.body = 'Dies ist ein Test :D' self._mailer.send_mail(mail) + + def test_console(self): + self._logger.debug(__name__, 'Started console test') + Console.write_line('Hello World') + Console.write('\nName: ') + Console.write_line('Hello', Console.read_line()) + Console + Console.clear() + Console.write_at(5, 5, 'at 5, 5') + Console.write_at(10, 10, 'at 10, 10') + + def main(self): + self._logger.header(f'{self._configuration.environment.application_name}:') + self._logger.debug(__name__, f'Host: {self._configuration.environment.host_name}') + self._logger.debug(__name__, f'Environment: {self._configuration.environment.environment_name}') + self._logger.debug(__name__, f'Customer: {self._configuration.environment.customer}') + self._services.get_service(UserRepoBase).add_test_user() + self.test_console() From d284cec2a291110136758bc449feb913db9e59f6 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 12:12:25 +0100 Subject: [PATCH 74/86] Added new tester and CredentialManager TestCase --- src/tests/appsettings.development.json | 8 - src/tests/appsettings.edrafts-lapi.json | 63 ++++++ src/tests/appsettings.edrafts-pc.json | 55 +++++ src/tests/appsettings.testing.json | 11 +- src/tests/build.json | 59 +++++ src/tests/cases/__init__.py | 0 src/tests/cases/utils/__init__.py | 0 src/tests/cases/utils/credential_manager.py | 37 ++++ src/tests/configuration/__init__.py | 25 --- src/tests/configuration/config.py | 93 -------- src/tests/hosting/__init__.py | 25 --- src/tests/hosting/app_host.py | 33 --- src/tests/service_providing/__init__.py | 25 --- .../service_providing/service_provider.py | 136 ------------ src/tests/services/__init__.py | 25 --- src/tests/services/logging/__init__.py | 25 --- src/tests/services/logging/logger.py | 206 ------------------ src/tests/services/publishing/__init__.py | 25 --- src/tests/services/publishing/publisher.py | 92 -------- src/tests/tester.py | 43 +--- 20 files changed, 222 insertions(+), 764 deletions(-) delete mode 100644 src/tests/appsettings.development.json create mode 100644 src/tests/appsettings.edrafts-lapi.json create mode 100644 src/tests/build.json create mode 100644 src/tests/cases/__init__.py create mode 100644 src/tests/cases/utils/__init__.py create mode 100644 src/tests/cases/utils/credential_manager.py delete mode 100644 src/tests/configuration/__init__.py delete mode 100644 src/tests/configuration/config.py delete mode 100644 src/tests/hosting/__init__.py delete mode 100644 src/tests/hosting/app_host.py delete mode 100644 src/tests/service_providing/__init__.py delete mode 100644 src/tests/service_providing/service_provider.py delete mode 100644 src/tests/services/__init__.py delete mode 100644 src/tests/services/logging/__init__.py delete mode 100644 src/tests/services/logging/logger.py delete mode 100644 src/tests/services/publishing/__init__.py delete mode 100644 src/tests/services/publishing/publisher.py diff --git a/src/tests/appsettings.development.json b/src/tests/appsettings.development.json deleted file mode 100644 index 62ec6c61..00000000 --- a/src/tests/appsettings.development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "LoggingSettings": { - "Path": "logs/", - "Filename": "log_$start_time.log", - "ConsoleLogLevel": "TRACE", - "FileLogLevel": "TRACE" - } -} \ No newline at end of file diff --git a/src/tests/appsettings.edrafts-lapi.json b/src/tests/appsettings.edrafts-lapi.json new file mode 100644 index 00000000..0b2e194a --- /dev/null +++ b/src/tests/appsettings.edrafts-lapi.json @@ -0,0 +1,63 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + "LoggingSettings": { + "Path": "logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "TRACE", + "FileLogLevel": "TRACE" + }, + "EMailClientSettings": { + "Host": "mail.sh-edraft.de", + "Port": "587", + "UserName": "dev-srv@sh-edraft.de", + "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" + }, + "PublishSettings": { + "SourcePath": "../", + "DistPath": "../../dist", + "Templates": [ + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "all", + "Description": "", + "LongDescription": "", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + }, + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "sh_edraft", + "Description": "common python library", + "LongDescription": "Library to share common classes and models used at sh-edraft.de", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + } + ], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt" + } +} \ No newline at end of file diff --git a/src/tests/appsettings.edrafts-pc.json b/src/tests/appsettings.edrafts-pc.json index 62ec6c61..0b2e194a 100644 --- a/src/tests/appsettings.edrafts-pc.json +++ b/src/tests/appsettings.edrafts-pc.json @@ -1,8 +1,63 @@ { + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, "LoggingSettings": { "Path": "logs/", "Filename": "log_$start_time.log", "ConsoleLogLevel": "TRACE", "FileLogLevel": "TRACE" + }, + "EMailClientSettings": { + "Host": "mail.sh-edraft.de", + "Port": "587", + "UserName": "dev-srv@sh-edraft.de", + "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" + }, + "PublishSettings": { + "SourcePath": "../", + "DistPath": "../../dist", + "Templates": [ + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "all", + "Description": "", + "LongDescription": "", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + }, + { + "TemplatePath": "../../publish_templates/all_template.txt", + "Name": "sh_edraft", + "Description": "common python library", + "LongDescription": "Library to share common classes and models used at sh-edraft.de", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 9 + } + } + ], + "IncludedFiles": [], + "ExcludedFiles": [], + "TemplateEnding": "_template.txt" } } \ No newline at end of file diff --git a/src/tests/appsettings.testing.json b/src/tests/appsettings.testing.json index 3b586a2c..d134912e 100644 --- a/src/tests/appsettings.testing.json +++ b/src/tests/appsettings.testing.json @@ -6,12 +6,9 @@ "FileLogLevel": "TRACE" }, - "PublishSettings": { - "SourcePath": "../", - "DistPath": "../../dist", - "Templates": [], - "IncludedFiles": [], - "ExcludedFiles": [], - "TemplateEnding": "_template.txt" + "DatabaseSettings": { + "ConnectionString": "mysql+mysqlconnector://sh_cpl:$credentials@localhost/sh_cpl", + "Credentials": "MHZhc0Y2bjhKc1VUMWV0Qw==", + "Encoding": "utf8mb4" } } \ No newline at end of file diff --git a/src/tests/build.json b/src/tests/build.json new file mode 100644 index 00000000..dd013a2c --- /dev/null +++ b/src/tests/build.json @@ -0,0 +1,59 @@ +{ + "TimeFormatSettings": { + "DateFormat": "%Y-%m-%d", + "TimeFormat": "%H:%M:%S", + "DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f", + "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" + }, + "LoggingSettings": { + "Path": "../build/logs/", + "Filename": "log_$start_time.log", + "ConsoleLogLevel": "INFO", + "FileLogLevel": "TRACE" + }, + "PublishSettings": { + "SourcePath": "./", + "DistPath": "../build/dist", + "Templates": [ + { + "TemplatePath": "../publish_templates/all_template.txt", + "Name": "all", + "Description": "", + "LongDescription": "", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 10 + } + }, + { + "TemplatePath": "../publish_templates/all_template.txt", + "Name": "sh_edraft", + "Description": "common python library", + "LongDescription": "Library to share common classes and models used at sh-edraft.de", + "CopyrightDate": "2020", + "CopyrightName": "sh-edraft.de", + "LicenseName": "MIT", + "LicenseDescription": ", see LICENSE for more details.", + "Title": "", + "Author": "Sven Heidemann", + "Version": { + "Major": 2020, + "Minor": 12, + "Micro": 10 + } + } + ], + "IncludedFiles": [ + ], + "ExcludedFiles": [ + ], + "TemplateEnding": "_template.txt" + } +} diff --git a/src/tests/cases/__init__.py b/src/tests/cases/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/cases/utils/__init__.py b/src/tests/cases/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/cases/utils/credential_manager.py b/src/tests/cases/utils/credential_manager.py new file mode 100644 index 00000000..204f1283 --- /dev/null +++ b/src/tests/cases/utils/credential_manager.py @@ -0,0 +1,37 @@ +import base64 +import unittest + +from sh_edraft.utils import CredentialManager + + +class CredentialManagerTest(unittest.TestCase): + + def setUp(self): pass + + def test_encode(self): + test_string = 'Hello World' + expected_test_result = base64.b64encode(test_string.encode('utf-8')).decode('utf-8') + + test_result = CredentialManager.encrypt(test_string) + + self.assertIsNotNone(test_result) + self.assertEqual(expected_test_result, test_result) + + def test_decode(self): + test_string = 'SGVsbG8gV29ybGQ=' + expected_test_result = base64.b64decode(test_string).decode('utf-8') + + test_result = CredentialManager.decrypt(test_string) + + self.assertIsNotNone(test_result) + self.assertEqual(expected_test_result, test_result) + + def test_build_string(self): + test_string = 'String is $credentials' + test_credentials = 'SGVsbG8gV29ybGQ=' + expected_test_result = test_string.replace('$credentials', base64.b64decode(test_credentials).decode('utf-8')) + + test_result = CredentialManager.build_string(test_string, test_credentials) + + self.assertIsNotNone(test_result) + self.assertEqual(expected_test_result, test_result) diff --git a/src/tests/configuration/__init__.py b/src/tests/configuration/__init__.py deleted file mode 100644 index 2c43c7cd..00000000 --- a/src/tests/configuration/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -tests.configuration -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'tests.configuration' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/configuration/config.py b/src/tests/configuration/config.py deleted file mode 100644 index 27218978..00000000 --- a/src/tests/configuration/config.py +++ /dev/null @@ -1,93 +0,0 @@ -import os -import unittest -from typing import cast - -from sh_edraft.configuration import Configuration -from sh_edraft.environment.model import EnvironmentName -from sh_edraft.hosting import ApplicationHost -from sh_edraft.logging.model import LoggingSettings, LoggingLevel -from sh_edraft.publishing.model import PublishSettings -from sh_edraft.time.model import TimeFormatSettings - - -class ConfigTest(unittest.TestCase): - - def setUp(self): - self._app_host = ApplicationHost() - self._config = cast(Configuration, self._app_host.configuration) - - def test_create(self): - print(f'{__name__}.test_create:') - self.assertIsNotNone(self._config) - self._config.create() - self.assertIsNotNone(self._config) - - self.assertEqual(len(self._config._config), 0) - self.assertIsNotNone(self._app_host.application_runtime) - - def test_env_vars(self): - print(f'{__name__}.test_env_vars:') - self._config.add_environment_variables('PYTHON_') - self._config.add_environment_variables('CPL_') - - def test_arguments(self): - print(f'{__name__}.test_arguments:') - self._config.add_argument_variables() - self.assertEqual(self._config.environment.environment_name, EnvironmentName.testing.value) - - def test_appsettings(self): - print(f'{__name__}.test_appsettings:') - self._config.add_json_file(f'appsettings.json') - - time_formats: TimeFormatSettings = cast(TimeFormatSettings, self._config.get_configuration(TimeFormatSettings)) - self.assertIsNotNone(time_formats) - self.assertEqual(time_formats.date_format, '%Y-%m-%d') - self.assertEqual(time_formats.time_format, '%H:%M:%S') - self.assertEqual(time_formats.date_time_format, '%Y-%m-%d %H:%M:%S.%f') - self.assertEqual(time_formats.date_time_log_format, '%Y-%m-%d_%H-%M-%S') - - logging = cast(LoggingSettings, self._config.get_configuration(LoggingSettings)) - self.assertIsNotNone(logging) - self.assertEqual(logging.path, 'logs/') - self.assertEqual(logging.filename, 'log_$start_time.log') - self.assertEqual(logging.console.value, LoggingLevel.ERROR.value) - self.assertEqual(logging.level.value, LoggingLevel.WARN.value) - - with self.assertRaises(Exception): - publish: PublishSettings = cast(PublishSettings, self._config.get_configuration(PublishSettings)) - - def test_appsettings_environment(self): - print(f'{__name__}.test_appsettings_environment:') - self._config.add_argument_variables() - self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') - - logging = cast(LoggingSettings, self._config.get_configuration(LoggingSettings)) - self.assertIsNotNone(logging) - self.assertEqual(logging.path, 'logs/') - self.assertEqual(logging.filename, 'log_$start_time.log') - self.assertEqual(logging.console.value, LoggingLevel.TRACE.value) - self.assertEqual(logging.level.value, LoggingLevel.TRACE.value) - - publish: PublishSettings = cast(PublishSettings, self._config.get_configuration(PublishSettings)) - self.assertIsNotNone(publish) - self.assertEqual(publish.source_path, '../') - self.assertEqual(publish.dist_path, '../../dist') - self.assertEqual(publish.templates, []) - self.assertEqual(publish.included_files, []) - self.assertEqual(publish.excluded_files, []) - self.assertEqual(publish.template_ending, '_template.txt') - - def test_appsettings_host(self): - print(f'{__name__}.test_appsettings_host:') - self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json') - - def test_appsettings_customer(self): - print(f'{__name__}.test_appsettings_customer:') - file_name = f'appsettings.{self._config.environment.customer}.json' - with self.assertRaises(SystemExit): - if os.path.isfile(f'{self._config.environment.content_root_path}/{file_name}'): - os.remove(f'{self._config.environment.content_root_path}/{file_name}') - - self._config.add_json_file(file_name) - - self._config.add_json_file(file_name, optional=True) diff --git a/src/tests/hosting/__init__.py b/src/tests/hosting/__init__.py deleted file mode 100644 index dd9b9446..00000000 --- a/src/tests/hosting/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -tests.hosting -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'tests.hosting' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/hosting/app_host.py b/src/tests/hosting/app_host.py deleted file mode 100644 index ec940481..00000000 --- a/src/tests/hosting/app_host.py +++ /dev/null @@ -1,33 +0,0 @@ -import unittest -import datetime - -from sh_edraft.configuration.base import ConfigurationBase -from sh_edraft.hosting import ApplicationHost -from sh_edraft.hosting.base import ApplicationRuntimeBase -from sh_edraft.service.base import ServiceProviderBase - - -class AppHostTest(unittest.TestCase): - - def setUp(self): - pass - - def test_create(self): - print(f'{__name__}.test_create:') - app_host = ApplicationHost() - self.assertIsNotNone(app_host) - app_host.create() - - self.assertIsNotNone(app_host.configuration) - self.assertTrue(isinstance(app_host.configuration, ConfigurationBase)) - - self.assertIsNotNone(app_host.application_runtime) - self.assertTrue(isinstance(app_host.application_runtime, ApplicationRuntimeBase)) - - self.assertIsNotNone(app_host.services) - self.assertTrue(isinstance(app_host.services, ServiceProviderBase)) - - self.assertIsNotNone(app_host._start_time) - self.assertTrue(isinstance(app_host._start_time, datetime.datetime)) - self.assertIsNotNone(app_host._end_time) - self.assertTrue(isinstance(app_host._end_time, datetime.datetime)) diff --git a/src/tests/service_providing/__init__.py b/src/tests/service_providing/__init__.py deleted file mode 100644 index 97f8de34..00000000 --- a/src/tests/service_providing/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -tests.service_providing -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'tests.service_providing' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/service_providing/service_provider.py b/src/tests/service_providing/service_provider.py deleted file mode 100644 index 4ddc5734..00000000 --- a/src/tests/service_providing/service_provider.py +++ /dev/null @@ -1,136 +0,0 @@ -import unittest -from typing import cast - -from sh_edraft.hosting import ApplicationHost -from sh_edraft.logging import Logger -from sh_edraft.logging.base import LoggerBase -from sh_edraft.publishing import Publisher -from sh_edraft.publishing.base import PublisherBase -from sh_edraft.service import ServiceProvider -from sh_edraft.service.base import ServiceBase - - -class ServiceProviderTest(unittest.TestCase): - - def setUp(self): - self._app_host = ApplicationHost() - self._config = self._app_host.configuration - self._config.create() - self._config.add_environment_variables('PYTHON_') - self._config.add_environment_variables('CPL_') - self._config.add_argument_variables() - self._config.add_json_file(f'appsettings.json') - self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') - self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json', optional=True) - self._services: ServiceProvider = cast(ServiceProvider, self._app_host.services) - self._services.create() - - def _check_general_requirements(self): - self.assertIsNotNone(self._services) - - def _add_logger(self): - self._services.add_singleton(LoggerBase, Logger) - logger: Logger = self._services.get_service(LoggerBase) - logger.create() - - def test_create(self): - print(f'{__name__}.test_create:') - provider = ServiceProvider(self._app_host.application_runtime) - self.assertIsNotNone(provider) - provider.create() - self.assertIsNotNone(provider) - - def test_add_singleton(self): - print(f'{__name__}.test_add_singleton:') - self._check_general_requirements() - - self._services.add_singleton(LoggerBase, Logger) - self.assertGreater(len(self._services._singleton_services), 0) - - found = False - for service_type in self._services._singleton_services: - service = self._services._singleton_services[service_type] - if service_type == LoggerBase and ( - isinstance(service, Logger) and - isinstance(service, LoggerBase) and - isinstance(service, ServiceBase) - ): - if not found: - found = True - - self.assertTrue(found) - - found = False - for service_type in self._services._singleton_services: - service = self._services._singleton_services[service_type] - if service_type == PublisherBase and ( - isinstance(service, Publisher) and - isinstance(service, PublisherBase) and - isinstance(service, ServiceBase) - ): - if not found: - found = True - - self.assertFalse(found) - - def test_get_singleton(self): - print(f'{__name__}.test_get_singleton:') - self._check_general_requirements() - - self._services.add_singleton(LoggerBase, Logger) - logger: Logger = self._services.get_service(LoggerBase) - self.assertIsNotNone(logger) - self.assertTrue(isinstance(logger, Logger)) - self.assertTrue(isinstance(logger, LoggerBase)) - self.assertTrue(isinstance(logger, ServiceBase)) - - self.assertEqual(logger._app_runtime, self._app_host.application_runtime) - - def test_add_scoped(self): - print(f'{__name__}.test_add_scoped:') - self._check_general_requirements() - self._add_logger() - - self._services.add_scoped(PublisherBase, Publisher) - - def test_get_scoped(self): - print(f'{__name__}.test_get_scoped:') - self._check_general_requirements() - self._add_logger() - - self._services.add_scoped(PublisherBase, Publisher) - publisher: Publisher = self._services.get_service(PublisherBase) - self.assertIsNotNone(publisher) - self.assertTrue(isinstance(publisher, Publisher)) - self.assertTrue(isinstance(publisher, PublisherBase)) - self.assertTrue(isinstance(publisher, ServiceBase)) - - self.assertTrue(isinstance(publisher._logger, Logger)) - self.assertTrue(isinstance(publisher._logger, LoggerBase)) - self.assertTrue(isinstance(publisher._logger, ServiceBase)) - - def test_add_transient(self): - print(f'{__name__}.test_add_transient:') - self._check_general_requirements() - self._add_logger() - - self._services.add_transient(PublisherBase, Publisher) - self.assertGreater(len(self._services._transient_services), 0) - - self.assertTrue(bool(isinstance(service, ServiceBase) for service in self._services._transient_services)) - - def test_get_transient(self): - print(f'{__name__}.test_get_transient:') - self._check_general_requirements() - self._add_logger() - - self._services.add_transient(PublisherBase, Publisher) - publisher: Publisher = self._services.get_service(PublisherBase) - self.assertIsNotNone(publisher) - self.assertTrue(isinstance(publisher, Publisher)) - self.assertTrue(isinstance(publisher, PublisherBase)) - self.assertTrue(isinstance(publisher, ServiceBase)) - - self.assertTrue(isinstance(publisher._logger, Logger)) - self.assertTrue(isinstance(publisher._logger, LoggerBase)) - self.assertTrue(isinstance(publisher._logger, ServiceBase)) diff --git a/src/tests/services/__init__.py b/src/tests/services/__init__.py deleted file mode 100644 index ad20eee4..00000000 --- a/src/tests/services/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -tests.services -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'tests.services' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/services/logging/__init__.py b/src/tests/services/logging/__init__.py deleted file mode 100644 index 37ae0e14..00000000 --- a/src/tests/services/logging/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -tests.services.logging -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'tests.services.logging' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/services/logging/logger.py b/src/tests/services/logging/logger.py deleted file mode 100644 index 4a17331e..00000000 --- a/src/tests/services/logging/logger.py +++ /dev/null @@ -1,206 +0,0 @@ -import os -import shutil -import unittest -from string import Template -from typing import cast - -from sh_edraft.hosting import ApplicationHost -from sh_edraft.logging import Logger -from sh_edraft.logging.model import LoggingSettings -from sh_edraft.service import ServiceProvider -from sh_edraft.time.model import TimeFormatSettings - - -class LoggerTest(unittest.TestCase): - - def setUp(self): - self._app_host = ApplicationHost() - self._config = self._app_host.configuration - self._config.create() - self._config.add_environment_variables('PYTHON_') - self._config.add_environment_variables('CPL_') - self._config.add_argument_variables() - self._config.add_json_file(f'appsettings.json') - self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') - self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json', optional=True) - self._services: ServiceProvider = cast(ServiceProvider, self._app_host.services) - self._services.create() - - self._app_runtime = self._app_host.application_runtime - self._log_settings: LoggingSettings = self._config.get_configuration(LoggingSettings) - self._time_format_settings: TimeFormatSettings = self._config.get_configuration(TimeFormatSettings) - - def tearDown(self): - if os.path.isdir(self._log_settings.path): - shutil.rmtree(self._log_settings.path) - - def _check_general_requirements(self): - self.assertIsNotNone(self._log_settings) - self.assertIsNotNone(self._time_format_settings) - - def test_create(self): - print(f'{__name__}.test_create:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - self.assertTrue(os.path.isdir(self._log_settings.path)) - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - self.assertTrue(os.path.isfile(self._log_settings.path + log_file)) - - def test_header(self): - print(f'{__name__}.test_header:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - logger.header('HeaderTest:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertEqual(log_content[len(log_content) - 1], 'HeaderTest:\n') - - def test_trace(self): - print(f'{__name__}.test_trace:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - logger.trace(__name__, f'{__name__}.test_trace:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ TRACE ] [ {__name__} ]: {__name__}.test_trace:\n')) - - def test_debug(self): - print(f'{__name__}.test_debug:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - logger.debug(__name__, f'{__name__}.test_debug:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ DEBUG ] [ {__name__} ]: {__name__}.test_debug:\n')) - - def test_info(self): - print(f'{__name__}.test_info:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - logger.info(__name__, f'{__name__}.test_info:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ INFO ] [ {__name__} ]: {__name__}.test_info:\n')) - - def test_warn(self): - print(f'{__name__}.test_warn:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - logger.warn(__name__, f'{__name__}.test_warn:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ WARN ] [ {__name__} ]: {__name__}.test_warn:\n')) - - def test_error(self): - print(f'{__name__}.test_error:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - logger.error(__name__, f'{__name__}.test_error:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ ERROR ] [ {__name__} ]: {__name__}.test_error:\n')) - - def test_fatal(self): - print(f'{__name__}.test_fatal:') - logger = Logger(self._log_settings, self._time_format_settings, self._app_runtime) - logger.create() - with self.assertRaises(SystemExit): - logger.fatal(__name__, f'{__name__}.test_fatal:') - - log_file = Template(self._log_settings.filename).substitute( - date_time_now=self._app_runtime.date_time_now.strftime(self._time_format_settings.date_time_format), - start_time=self._app_runtime.start_time.strftime(self._time_format_settings.date_time_log_format) - ) - log_content = [] - - try: - with open(self._log_settings.path + log_file, "r") as log: - log_content = log.readlines() - log.close() - except Exception as e: - print('Cannot open log file', e) - - self.assertGreater(len(log_content), 0) - self.assertTrue(log_content[len(log_content) - 1].endswith(f'[ FATAL ] [ {__name__} ]: {__name__}.test_fatal:\n')) diff --git a/src/tests/services/publishing/__init__.py b/src/tests/services/publishing/__init__.py deleted file mode 100644 index dbe20dd2..00000000 --- a/src/tests/services/publishing/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -tests.services.publishing -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'tests.services.publishing' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) diff --git a/src/tests/services/publishing/publisher.py b/src/tests/services/publishing/publisher.py deleted file mode 100644 index 9b75d13a..00000000 --- a/src/tests/services/publishing/publisher.py +++ /dev/null @@ -1,92 +0,0 @@ -import os -import shutil -import unittest - -from sh_edraft.hosting import ApplicationHost -from sh_edraft.logging import Logger -from sh_edraft.logging.model import LoggingSettings -from sh_edraft.publishing import Publisher -from sh_edraft.publishing.model import Template -from sh_edraft.publishing.model import PublishSettings -from sh_edraft.coding.model import Version -from sh_edraft.time.model import TimeFormatSettings - - -class PublisherTest(unittest.TestCase): - - def _configure(self): - self._version = Version(2020, 12, 5) - templates = [ - Template( - '../../publish_templates/all_template.txt', - 'all', - '', - '', - '2020', - 'sh-edraft.de', - 'MIT', - ', see LICENSE for more details.', - '', - 'Sven Heidemann', - self._version - ), - Template( - '../../publish_templates/all_template.txt', - 'sh_edraft', - 'common python library', - 'Library to share common classes and models used at sh-edraft.de', - '2020', - 'sh-edraft.de', - 'MIT', - ', see LICENSE for more details.', - '', - 'Sven Heidemann', - self._version - ) - ] - - self._source_path = '../' - self._dist_path = '../../dist' - - self._publish_settings_model = PublishSettings() - self._publish_settings_model.from_dict({ - "SourcePath": self._source_path, - "DistPath": self._dist_path, - "Templates": templates, - "IncludedFiles": [], - "ExcludedFiles": [], - "TemplateEnding": "_template.txt", - }) - - def setUp(self): - self._app_host = ApplicationHost() - self._config = self._app_host.configuration - self._config.create() - self._config.add_environment_variables('PYTHON_') - self._config.add_environment_variables('CPL_') - self._config.add_argument_variables() - self._config.add_json_file(f'appsettings.json') - self._config.add_json_file(f'appsettings.{self._config.environment.environment_name}.json') - self._config.add_json_file(f'appsettings.{self._config.environment.host_name}.json', optional=True) - - self._app_runtime = self._app_host.application_runtime - - self._configure() - - self._log_settings: LoggingSettings = self._config.get_configuration(LoggingSettings) - self._time_format_settings: TimeFormatSettings = self._config.get_configuration(TimeFormatSettings) - self._logger = Logger(self._log_settings, self._time_format_settings, self._app_host.application_runtime) - self._logger.create() - - def tearDown(self): - if os.path.isdir(self._log_settings.path): - shutil.rmtree(self._log_settings.path) - - def test_create(self): - print(f'{__name__}.test_create:') - publisher: Publisher = Publisher(self._logger, self._publish_settings_model) - self.assertIsNotNone(publisher) - - publisher.create() - self.assertTrue(os.path.isdir(self._dist_path)) - self.assertEqual(publisher._publish_settings, self._publish_settings_model) diff --git a/src/tests/tester.py b/src/tests/tester.py index d7b17030..4500b9dc 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,10 +1,6 @@ import unittest -from tests.configuration.config import ConfigTest -from tests.hosting.app_host import AppHostTest -from tests.services.logging.logger import LoggerTest -from tests.services.publishing.publisher import PublisherTest -from tests.service_providing.service_provider import ServiceProviderTest +from tests.cases.utils.credential_manager import CredentialManagerTest class Tester: @@ -13,44 +9,13 @@ class Tester: self._suite = unittest.TestSuite() def create(self): - # hosting app host - self._suite.addTest(AppHostTest('test_create')) - - # configuration - self._suite.addTest(ConfigTest('test_create')) - self._suite.addTest(ConfigTest('test_env_vars')) - self._suite.addTest(ConfigTest('test_arguments')) - self._suite.addTest(ConfigTest('test_appsettings')) - self._suite.addTest(ConfigTest('test_appsettings_environment')) - self._suite.addTest(ConfigTest('test_appsettings_host')) - self._suite.addTest(ConfigTest('test_appsettings_customer')) - - # providing - self._suite.addTest(ServiceProviderTest('test_create')) - self._suite.addTest(ServiceProviderTest('test_add_singleton')) - self._suite.addTest(ServiceProviderTest('test_get_singleton')) - self._suite.addTest(ServiceProviderTest('test_add_scoped')) - self._suite.addTest(ServiceProviderTest('test_get_scoped')) - self._suite.addTest(ServiceProviderTest('test_add_transient')) - self._suite.addTest(ServiceProviderTest('test_get_transient')) - - # logging - self._suite.addTest(LoggerTest('test_create')) - self._suite.addTest(LoggerTest('test_header')) - self._suite.addTest(LoggerTest('test_trace')) - self._suite.addTest(LoggerTest('test_debug')) - self._suite.addTest(LoggerTest('test_info')) - self._suite.addTest(LoggerTest('test_warn')) - self._suite.addTest(LoggerTest('test_error')) - self._suite.addTest(LoggerTest('test_fatal')) - - # publishing - self._suite.addTest(PublisherTest('test_create')) + self._suite.addTest(CredentialManagerTest(CredentialManagerTest.test_encode.__name__)) + self._suite.addTest(CredentialManagerTest(CredentialManagerTest.test_decode.__name__)) + self._suite.addTest(CredentialManagerTest(CredentialManagerTest.test_build_string.__name__)) def start(self): runner = unittest.TextTestRunner() runner.run(self._suite) - # unittest.main() if __name__ == '__main__': From 9c87dbd0319f890c76d9355f0f796285c40fb368 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 12:36:38 +0100 Subject: [PATCH 75/86] Bugfix --- src/sh_edraft/time/model/time_format_settings.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sh_edraft/time/model/time_format_settings.py b/src/sh_edraft/time/model/time_format_settings.py index 664192a4..e4be7511 100644 --- a/src/sh_edraft/time/model/time_format_settings.py +++ b/src/sh_edraft/time/model/time_format_settings.py @@ -15,8 +15,6 @@ class TimeFormatSettings(ConfigurationModelBase): self._time_format: Optional[str] = None self._date_time_format: Optional[str] = None self._date_time_log_format: Optional[str] = None - self._os_name: Optional[str] = None - self._hostname: Optional[str] = None @property def date_format(self) -> str: From b03ef602765d0985486f6b4ebb90fd0d0deaa2d0 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 12:37:14 +0100 Subject: [PATCH 76/86] Added TimeFormatSettings Test --- src/tests/cases/time/__init__.py | 0 src/tests/cases/time/time_format_settings.py | 26 ++++++++++++++++++++ src/tests/tester.py | 14 ++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/tests/cases/time/__init__.py create mode 100644 src/tests/cases/time/time_format_settings.py diff --git a/src/tests/cases/time/__init__.py b/src/tests/cases/time/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/cases/time/time_format_settings.py b/src/tests/cases/time/time_format_settings.py new file mode 100644 index 00000000..9bc5347a --- /dev/null +++ b/src/tests/cases/time/time_format_settings.py @@ -0,0 +1,26 @@ +import unittest + +from sh_edraft.time.model import TimeFormatSettingsNames, TimeFormatSettings + + +class TimeFormatSettingsTest(unittest.TestCase): + + def setUp(self): pass + + def test_from_dict(self): + test_dict = { + TimeFormatSettingsNames.date_format.value: '%H:%M:%S', + TimeFormatSettingsNames.time_format.value: '%Y-%m-%d', + TimeFormatSettingsNames.date_time_format.value: '%Y-%m-%d %H:%M:%S.%f', + TimeFormatSettingsNames.date_time_log_format.value: '%Y-%m-%d_%H-%M-%S' + } + + settings = TimeFormatSettings() + settings.from_dict(test_dict) + + self.assertIsNotNone(settings) + + self.assertEqual(test_dict[TimeFormatSettingsNames.date_format.value], settings.date_format) + self.assertEqual(test_dict[TimeFormatSettingsNames.time_format.value], settings.time_format) + self.assertEqual(test_dict[TimeFormatSettingsNames.date_time_format.value], settings.date_time_format) + self.assertEqual(test_dict[TimeFormatSettingsNames.date_time_log_format.value], settings.date_time_log_format) diff --git a/src/tests/tester.py b/src/tests/tester.py index 4500b9dc..8f8ab5c0 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,5 +1,6 @@ import unittest +from tests.cases.time.time_format_settings import TimeFormatSettingsTest from tests.cases.utils.credential_manager import CredentialManagerTest @@ -7,13 +8,20 @@ class Tester: def __init__(self): self._suite = unittest.TestSuite() + self._cases = [] + + def _build_cases(self): + for case in self._cases: + case_functions = [method_name for method_name in dir(case) if callable(getattr(case, method_name)) and method_name.startswith('test_')] + for function in case_functions: + self._suite.addTest(case(function)) def create(self): - self._suite.addTest(CredentialManagerTest(CredentialManagerTest.test_encode.__name__)) - self._suite.addTest(CredentialManagerTest(CredentialManagerTest.test_decode.__name__)) - self._suite.addTest(CredentialManagerTest(CredentialManagerTest.test_build_string.__name__)) + self._cases.append(CredentialManagerTest) + self._cases.append(TimeFormatSettingsTest) def start(self): + self._build_cases() runner = unittest.TextTestRunner() runner.run(self._suite) From 9180575b85843b11da144cb06b8f9ad296e64f20 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 13:10:01 +0100 Subject: [PATCH 77/86] Bugfixes --- .gitignore | 4 ++++ src/sh_edraft/service/model/__init__.py | 26 ------------------------- 2 files changed, 4 insertions(+), 26 deletions(-) delete mode 100644 src/sh_edraft/service/model/__init__.py diff --git a/.gitignore b/.gitignore index eb80cef2..4f1f0383 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,7 @@ dmypy.json # Pyre type checker .pyre/ +# IDE +.idea/ +.vscode/ + diff --git a/src/sh_edraft/service/model/__init__.py b/src/sh_edraft/service/model/__init__.py deleted file mode 100644 index e268c5ed..00000000 --- a/src/sh_edraft/service/model/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -sh_edraft.service.model -~~~~~~~~~~~~~~~~~~~ - - - -:copyright: (c) 2020 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'sh_edraft.service.model' -__author__ = 'Sven Heidemann' -__license__ = 'MIT' -__copyright__ = 'Copyright (c) 2020 sh-edraft.de' -__version__ = '2020.12.9' - -from collections import namedtuple - -# imports: -from .provide_state import ProvideState - -VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major=2020, minor=12, micro=9) From 08a4023a7dba451cee7906bbaa7c3d110598a0dd Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 14:06:48 +0100 Subject: [PATCH 78/86] Bugfixes --- src/tests_dev/program.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tests_dev/program.py b/src/tests_dev/program.py index fec9b31e..e08eadbe 100644 --- a/src/tests_dev/program.py +++ b/src/tests_dev/program.py @@ -74,7 +74,6 @@ class Program(ApplicationBase): Console.write_line('Hello World') Console.write('\nName: ') Console.write_line('Hello', Console.read_line()) - Console Console.clear() Console.write_at(5, 5, 'at 5, 5') Console.write_at(10, 10, 'at 10, 10') From 5db2a3f66988c4ad1f5aba399825239b807d2eee Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 14:53:50 +0100 Subject: [PATCH 79/86] Bugfixes --- src/sh_edraft/service/providing/service_provider.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sh_edraft/service/providing/service_provider.py b/src/sh_edraft/service/providing/service_provider.py index 6cec42a4..2ba39e4c 100644 --- a/src/sh_edraft/service/providing/service_provider.py +++ b/src/sh_edraft/service/providing/service_provider.py @@ -80,16 +80,16 @@ class ServiceProvider(ServiceProviderBase): def remove_service(self, instance_type: Type[ServiceBase]): for service in self._transient_services: - if isinstance(service, type(instance_type)): + if service == instance_type and isinstance(self._transient_services[service], type(instance_type)): del self._transient_services[service] return for service in self._scoped_services: - if isinstance(service, type(instance_type)): + if service == instance_type and isinstance(self._scoped_services[service], type(instance_type)): del self._scoped_services[service] return for service in self._singleton_services: - if isinstance(service, instance_type): + if service == instance_type and isinstance(self._singleton_services[service], instance_type): del self._singleton_services[service] return From 305f4b34def3f71388adf1eecb0a59743b494576 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 14:54:03 +0100 Subject: [PATCH 80/86] Added service provider Test --- src/tests/cases/service/__init__.py | 0 src/tests/cases/service/provider_test.py | 78 ++++++++++++++++++++++++ src/tests/tester.py | 5 +- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/tests/cases/service/__init__.py create mode 100644 src/tests/cases/service/provider_test.py diff --git a/src/tests/cases/service/__init__.py b/src/tests/cases/service/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/cases/service/provider_test.py b/src/tests/cases/service/provider_test.py new file mode 100644 index 00000000..b158a483 --- /dev/null +++ b/src/tests/cases/service/provider_test.py @@ -0,0 +1,78 @@ +import unittest + +from sh_edraft.console import Console +from sh_edraft.database.context import DatabaseContext +from sh_edraft.hosting import ApplicationHost +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase + + +class ProviderTest(unittest.TestCase): + + def setUp(self): + Console.disable() + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + self._configuration.add_argument_variables() + self._configuration.add_json_file(f'appsettings.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') + self._configuration.add_json_file(f'appsettings.{self._configuration.environment.host_name}.json', optional=True) + + def test_get_db_context(self): + self._services.add_db_context(DatabaseContext) + db: DatabaseContext = self._services.get_db_context() + + self.assertIsNotNone(db) + + def test_get_service_singleton(self): + self._services.add_singleton(LoggerBase, Logger) + logger = self._services.get_service(LoggerBase) + + self.assertIsNotNone(logger) + + def test_get_service_scoped(self): + self._services.add_scoped(LoggerBase, Logger) + logger = self._services.get_service(LoggerBase) + + self.assertIsNotNone(logger) + + def test_get_service_transient(self): + self._services.add_transient(LoggerBase, Logger) + logger = self._services.get_service(LoggerBase) + + self.assertIsNotNone(logger) + + def test_remove_service_singleton(self): + self._services.add_singleton(LoggerBase, Logger) + logger = self._services.get_service(LoggerBase) + + self.assertIsNotNone(logger) + + self._services.remove_service(LoggerBase) + logger = self._services.get_service(LoggerBase) + + self.assertIsNone(logger) + + def test_remove_service_scoped(self): + self._services.add_scoped(LoggerBase, Logger) + logger = self._services.get_service(LoggerBase) + + self.assertIsNotNone(logger) + + self._services.remove_service(LoggerBase) + logger = self._services.get_service(LoggerBase) + + self.assertIsNone(logger) + + def test_remove_service_transient(self): + self._services.add_transient(LoggerBase, Logger) + logger = self._services.get_service(LoggerBase) + + self.assertIsNotNone(logger) + + self._services.remove_service(LoggerBase) + logger = self._services.get_service(LoggerBase) + + self.assertIsNone(logger) diff --git a/src/tests/tester.py b/src/tests/tester.py index 8f8ab5c0..98c1c68b 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -1,5 +1,7 @@ import unittest +from typing import Type +from tests.cases.service.provider_test import ProviderTest from tests.cases.time.time_format_settings import TimeFormatSettingsTest from tests.cases.utils.credential_manager import CredentialManagerTest @@ -8,7 +10,7 @@ class Tester: def __init__(self): self._suite = unittest.TestSuite() - self._cases = [] + self._cases: list[Type[unittest.TestCase]] = [] def _build_cases(self): for case in self._cases: @@ -17,6 +19,7 @@ class Tester: self._suite.addTest(case(function)) def create(self): + self._cases.append(ProviderTest) self._cases.append(CredentialManagerTest) self._cases.append(TimeFormatSettingsTest) From eec9bca49863b9d3c59c33b9748464cb3f7185b1 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Fri, 25 Dec 2020 19:32:55 +0100 Subject: [PATCH 81/86] Improved tests --- src/tests/cases/service/provider_test.py | 1 + .../{time_format_settings.py => time_format_settings_test.py} | 0 .../{credential_manager.py => credential_manager_test.py} | 0 src/tests/tester.py | 4 ++-- 4 files changed, 3 insertions(+), 2 deletions(-) rename src/tests/cases/time/{time_format_settings.py => time_format_settings_test.py} (100%) rename src/tests/cases/utils/{credential_manager.py => credential_manager_test.py} (100%) diff --git a/src/tests/cases/service/provider_test.py b/src/tests/cases/service/provider_test.py index b158a483..96fef8eb 100644 --- a/src/tests/cases/service/provider_test.py +++ b/src/tests/cases/service/provider_test.py @@ -15,6 +15,7 @@ class ProviderTest(unittest.TestCase): self._configuration = self._app_host.configuration self._services = self._app_host.services + self._configuration.add_environment_variables('CPL_') self._configuration.add_argument_variables() self._configuration.add_json_file(f'appsettings.json') self._configuration.add_json_file(f'appsettings.{self._configuration.environment.environment_name}.json') diff --git a/src/tests/cases/time/time_format_settings.py b/src/tests/cases/time/time_format_settings_test.py similarity index 100% rename from src/tests/cases/time/time_format_settings.py rename to src/tests/cases/time/time_format_settings_test.py diff --git a/src/tests/cases/utils/credential_manager.py b/src/tests/cases/utils/credential_manager_test.py similarity index 100% rename from src/tests/cases/utils/credential_manager.py rename to src/tests/cases/utils/credential_manager_test.py diff --git a/src/tests/tester.py b/src/tests/tester.py index 98c1c68b..bc66330a 100644 --- a/src/tests/tester.py +++ b/src/tests/tester.py @@ -2,8 +2,8 @@ import unittest from typing import Type from tests.cases.service.provider_test import ProviderTest -from tests.cases.time.time_format_settings import TimeFormatSettingsTest -from tests.cases.utils.credential_manager import CredentialManagerTest +from tests.cases.time.time_format_settings_test import TimeFormatSettingsTest +from tests.cases.utils.credential_manager_test import CredentialManagerTest class Tester: From 542dccda103413d756ba73de286b2303341fb345 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sat, 26 Dec 2020 13:35:31 +0100 Subject: [PATCH 82/86] Bugfixes and improved tests --- .gitignore | 1 - src/sh_edraft/console/console.py | 39 +++++++++++++++---- src/tests/cases/utils/__init__.py | 0 src/tests/{cases => service_test}/__init__.py | 0 .../service => service_test}/provider_test.py | 0 src/tests/tester.py | 35 ----------------- .../{cases/service => time_test}/__init__.py | 0 .../time_format_settings_test.py | 0 .../{cases/time => utils_test}/__init__.py | 0 .../credential_manager_test.py | 0 10 files changed, 32 insertions(+), 43 deletions(-) delete mode 100644 src/tests/cases/utils/__init__.py rename src/tests/{cases => service_test}/__init__.py (100%) rename src/tests/{cases/service => service_test}/provider_test.py (100%) delete mode 100644 src/tests/tester.py rename src/tests/{cases/service => time_test}/__init__.py (100%) rename src/tests/{cases/time => time_test}/time_format_settings_test.py (100%) rename src/tests/{cases/time => utils_test}/__init__.py (100%) rename src/tests/{cases/utils => utils_test}/credential_manager_test.py (100%) diff --git a/.gitignore b/.gitignore index 4f1f0383..5c23e124 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,6 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST -.idea/ # PyInstaller # Usually these files are written by a python script from a template diff --git a/src/sh_edraft/console/console.py b/src/sh_edraft/console/console.py index c454eb81..14964866 100644 --- a/src/sh_edraft/console/console.py +++ b/src/sh_edraft/console/console.py @@ -45,6 +45,7 @@ class Console: @classmethod def set_foreground_color(cls, color: Union[ForegroundColor, str]): + if type(color) is str: cls._foreground_color = ForegroundColor[color] else: @@ -66,9 +67,6 @@ class Console: @classmethod def _output(cls, string: str, x: int = None, y: int = None, end='\n'): - if cls._disabled: - return - if cls._is_first_write: cls._is_first_write = False @@ -98,15 +96,21 @@ class Console: @classmethod def banner(cls, string: str): + if cls._disabled: + return + ascii_banner = pyfiglet.figlet_format(string) cls.write_line(ascii_banner) - @staticmethod - def clear(): + @classmethod + def clear(cls): os.system('cls' if os.name == 'nt' else 'clear') - @staticmethod - def close(): + @classmethod + def close(cls): + if cls._disabled: + return + Console.reset() Console.write('\n\n\nPress any key to continue...') Console.read_line() @@ -118,6 +122,9 @@ class Console: @classmethod def error(cls, string: str, tb: str = None): + if cls._disabled: + return + cls.set_foreground_color('red') if tb is not None: cls.write_line(f'{string} -> {tb}') @@ -138,6 +145,9 @@ class Console: @classmethod def read_line(cls, output: str = None) -> str: + if cls._disabled: + return '' + if output is not None: cls.write(output) @@ -150,6 +160,9 @@ class Console: @classmethod def table(cls, header: list[str], values: list[list[str]]): + if cls._disabled: + return + table = tabulate(values, headers=header) Console.write_line(table) @@ -157,16 +170,25 @@ class Console: @classmethod def write(cls, *args): + if cls._disabled: + return + string = ' '.join(map(str, args)) cls._output(string, end='') @classmethod def write_at(cls, x: int, y: int, *args): + if cls._disabled: + return + string = ' '.join(map(str, args)) cls._output(string, x, y, end='') @classmethod def write_line(cls, *args): + if cls._disabled: + return + string = ' '.join(map(str, args)) if not cls._is_first_write: cls._output('') @@ -174,6 +196,9 @@ class Console: @classmethod def write_line_at(cls, x: int, y: int, *args): + if cls._disabled: + return + string = ' '.join(map(str, args)) if not cls._is_first_write: cls._output('', end='') diff --git a/src/tests/cases/utils/__init__.py b/src/tests/cases/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/tests/cases/__init__.py b/src/tests/service_test/__init__.py similarity index 100% rename from src/tests/cases/__init__.py rename to src/tests/service_test/__init__.py diff --git a/src/tests/cases/service/provider_test.py b/src/tests/service_test/provider_test.py similarity index 100% rename from src/tests/cases/service/provider_test.py rename to src/tests/service_test/provider_test.py diff --git a/src/tests/tester.py b/src/tests/tester.py deleted file mode 100644 index bc66330a..00000000 --- a/src/tests/tester.py +++ /dev/null @@ -1,35 +0,0 @@ -import unittest -from typing import Type - -from tests.cases.service.provider_test import ProviderTest -from tests.cases.time.time_format_settings_test import TimeFormatSettingsTest -from tests.cases.utils.credential_manager_test import CredentialManagerTest - - -class Tester: - - def __init__(self): - self._suite = unittest.TestSuite() - self._cases: list[Type[unittest.TestCase]] = [] - - def _build_cases(self): - for case in self._cases: - case_functions = [method_name for method_name in dir(case) if callable(getattr(case, method_name)) and method_name.startswith('test_')] - for function in case_functions: - self._suite.addTest(case(function)) - - def create(self): - self._cases.append(ProviderTest) - self._cases.append(CredentialManagerTest) - self._cases.append(TimeFormatSettingsTest) - - def start(self): - self._build_cases() - runner = unittest.TextTestRunner() - runner.run(self._suite) - - -if __name__ == '__main__': - tester = Tester() - tester.create() - tester.start() diff --git a/src/tests/cases/service/__init__.py b/src/tests/time_test/__init__.py similarity index 100% rename from src/tests/cases/service/__init__.py rename to src/tests/time_test/__init__.py diff --git a/src/tests/cases/time/time_format_settings_test.py b/src/tests/time_test/time_format_settings_test.py similarity index 100% rename from src/tests/cases/time/time_format_settings_test.py rename to src/tests/time_test/time_format_settings_test.py diff --git a/src/tests/cases/time/__init__.py b/src/tests/utils_test/__init__.py similarity index 100% rename from src/tests/cases/time/__init__.py rename to src/tests/utils_test/__init__.py diff --git a/src/tests/cases/utils/credential_manager_test.py b/src/tests/utils_test/credential_manager_test.py similarity index 100% rename from src/tests/cases/utils/credential_manager_test.py rename to src/tests/utils_test/credential_manager_test.py From 36eee0969d7a14cc5572261db244e7c9d4f8cbef Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sat, 26 Dec 2020 13:36:54 +0100 Subject: [PATCH 83/86] Added pycharm project files --- .gitignore | 1 - .idea/dictionaries/sven.xml | 3 + .idea/inspectionProfiles/Project_Default.xml | 17 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/sh_common_py_lib.iml | 19 + .../shelved.patch | 61 ++ ..._26_11_2020_10_36__Default_Changelist_.xml | 4 + .idea/vcs.xml | 6 + .idea/workspace.xml | 840 ++++++++++++++++++ 11 files changed, 971 insertions(+), 1 deletion(-) create mode 100644 .idea/dictionaries/sven.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/sh_common_py_lib.iml create mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36_[Default_Changelist]/shelved.patch create mode 100644 .idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36__Default_Changelist_.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml diff --git a/.gitignore b/.gitignore index 5c23e124..a2f9a4d3 100644 --- a/.gitignore +++ b/.gitignore @@ -129,6 +129,5 @@ dmypy.json .pyre/ # IDE -.idea/ .vscode/ diff --git a/.idea/dictionaries/sven.xml b/.idea/dictionaries/sven.xml new file mode 100644 index 00000000..6b8908ae --- /dev/null +++ b/.idea/dictionaries/sven.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..f9ea47c4 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..74c32a17 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..3430c667 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/sh_common_py_lib.iml b/.idea/sh_common_py_lib.iml new file mode 100644 index 00000000..ea803c41 --- /dev/null +++ b/.idea/sh_common_py_lib.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36_[Default_Changelist]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36_[Default_Changelist]/shelved.patch new file mode 100644 index 00000000..bb3b0e06 --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36_[Default_Changelist]/shelved.patch @@ -0,0 +1,61 @@ +Index: src/tests/publishing/publisher.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>import os\r\nimport shutil\r\nimport unittest\r\n\r\nfrom sh_edraft.configuration import ApplicationHost\r\nfrom sh_edraft.logging import Logger\r\nfrom sh_edraft.logging.base import LoggerBase\r\nfrom sh_edraft.logging.model import LoggingSettings\r\nfrom sh_edraft.publishing import Publisher\r\nfrom sh_edraft.publishing.base import PublisherBase\r\nfrom sh_edraft.publishing.model import Template\r\nfrom sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel\r\nfrom sh_edraft.source_code.model import Version\r\nfrom sh_edraft.time.model import TimeFormatSettings\r\n\r\n\r\nclass PublisherTest(unittest.TestCase):\r\n\r\n def _config(self):\r\n self._log_settings = LoggingSettings()\r\n self._log_settings.from_dict({\r\n \"Path\": \"logs/\",\r\n \"Filename\": \"log_$start_time.log\",\r\n \"ConsoleLogLevel\": \"TRACE\",\r\n \"FileLogLevel\": \"TRACE\"\r\n })\r\n\r\n self._time_format_settings = TimeFormatSettings()\r\n self._time_format_settings.from_dict({\r\n \"DateFormat\": \"%Y-%m-%d\",\r\n \"TimeFormat\": \"%H:%M:%S\",\r\n \"DateTimeFormat\": \"%Y-%m-%d %H:%M:%S.%f\",\r\n \"DateTimeLogFormat\": \"%Y-%m-%d_%H-%M-%S\"\r\n })\r\n\r\n self._version = Version(2020, 12, 5).to_dict()\r\n templates = [\r\n Template(\r\n '../../publish_templates/*_template.txt',\r\n '*',\r\n '',\r\n '',\r\n '2020',\r\n 'sh-edraft.de',\r\n 'MIT',\r\n ', see LICENSE for more details.',\r\n '',\r\n 'Sven Heidemann',\r\n self._version\r\n ),\r\n Template(\r\n '../../publish_templates/*_template.txt',\r\n 'sh_edraft',\r\n 'common python library',\r\n 'Library to share common classes and models used at sh-edraft.de',\r\n '2020',\r\n 'sh-edraft.de',\r\n 'MIT',\r\n ', see LICENSE for more details.',\r\n '',\r\n 'Sven Heidemann',\r\n self._version\r\n )\r\n ]\r\n\r\n self._source_path = '../'\r\n self._dist_path = '../../dist'\r\n\r\n self._publish_settings_model = PublishSettingsModel()\r\n self._publish_settings_model.from_dict({\r\n \"SourcePath\": self._source_path,\r\n \"DistPath\": self._dist_path,\r\n \"Templates\": templates,\r\n \"IncludedFiles\": [],\r\n \"ExcludedFiles\": [],\r\n \"TemplateEnding\": \"_template.txt\",\r\n })\r\n\r\n def setUp(self):\r\n self._config()\r\n\r\n self._app_host = ApplicationHost()\r\n self._logger = Logger(self._log_settings, self._time_format_settings, self._app_host)\r\n self._logger.create()\r\n\r\n def tearDown(self):\r\n if os.path.isdir(self._log_settings.path):\r\n shutil.rmtree(self._log_settings.path)\r\n\r\n def test_create(self):\r\n publisher: Publisher = Publisher(self._logger, self._publish_settings_model)\r\n self.assertIsNotNone(publisher)\r\n\r\n publisher.create()\r\n self.assertTrue(os.path.isdir(self._dist_path))\r\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- src/tests/publishing/publisher.py (revision 9dbad20e9714ffa1546bb2d1b2f8b5ea8e854369) ++++ src/tests/publishing/publisher.py (date 1606383223452) +@@ -36,8 +36,8 @@ + self._version = Version(2020, 12, 5).to_dict() + templates = [ + Template( +- '../../publish_templates/*_template.txt', +- '*', ++ '../../publish_templates/all_template.txt', ++ 'all', + '', + '', + '2020', +@@ -49,7 +49,7 @@ + self._version + ), + Template( +- '../../publish_templates/*_template.txt', ++ '../../publish_templates/all_template.txt', + 'sh_edraft', + 'common python library', + 'Library to share common classes and models used at sh-edraft.de', +Index: src/sh_edraft/publishing/publisher.py +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+>import os\r\nimport shutil\r\nfrom string import Template as stringTemplate\r\n\r\nfrom sh_edraft.logging.base.logger_base import LoggerBase\r\nfrom sh_edraft.publishing.base.publisher_base import PublisherBase\r\nfrom sh_edraft.publishing.model.publish_settings_model import PublishSettingsModel\r\nfrom sh_edraft.publishing.model.template import Template\r\n\r\n\r\nclass Publisher(PublisherBase):\r\n\r\n def __init__(self, logger: LoggerBase, publish_settings: PublishSettingsModel):\r\n super().__init__(logger, publish_settings)\r\n\r\n @property\r\n def source_path(self) -> str:\r\n return self._publish_settings.source_path\r\n\r\n @property\r\n def dist_path(self):\r\n return self._publish_settings.dist_path\r\n\r\n def _get_template_output(self, t: Template, name: str, imports: str) -> str:\r\n self._logger.trace(__name__, f'Started {__name__}._get_template_output')\r\n try:\r\n if t.file_content == '':\r\n raise Exception(f'Template is empty: {t.template_path}')\r\n\r\n self._logger.trace(__name__, f'Stopped {__name__}._get_template_output')\r\n return stringTemplate(t.file_content).substitute(\r\n Name=name,\r\n Description=t.description,\r\n LongDescription=t.long_description,\r\n CopyrightDate=t.copyright_date,\r\n CopyrightName=t.copyright_name,\r\n LicenseName=t.license_name,\r\n LicenseDescription=t.license_description,\r\n Title=t.title if t.title is not None and t.title != '' else name,\r\n Author=t.author,\r\n Version=t.version.to_str(),\r\n Major=t.version.major,\r\n Minor=t.version.minor,\r\n Micro=t.version.micro,\r\n Imports=imports\r\n )\r\n except Exception as e:\r\n self._logger.fatal(__name__, f'Cannot read Template: {t.template_path}', e)\r\n self._logger.trace(__name__, f'Stopped {__name__}._get_template_output')\r\n\r\n def _read_source_path(self):\r\n self._logger.trace(__name__, f'Started {__name__}._read_source_path')\r\n for r, d, f in os.walk(self._publish_settings.source_path):\r\n for file in f:\r\n if file.endswith('.py') or file in self._publish_settings.included_files:\r\n self._publish_settings.included_files.append(os.path.join(r, file))\r\n\r\n self._logger.trace(__name__, f'Stopped {__name__}._read_source_path')\r\n\r\n def _read_templates(self):\r\n self._logger.trace(__name__, f'Started {__name__}._read_templates')\r\n for t in self._publish_settings.templates:\r\n output_template: str = ''\r\n if not os.path.isfile(t.template_path):\r\n self._logger.fatal(__name__, f'Template not found: {t.template_path}')\r\n\r\n with open(t.template_path) as template:\r\n t.file_content = template.read()\r\n template.close()\r\n if t.file_content == '':\r\n self._logger.fatal(__name__, f'Template is empty: {t.template_path}')\r\n\r\n self._logger.trace(__name__, f'Stopped {__name__}._read_templates')\r\n\r\n def _create_dist_path(self):\r\n self._logger.trace(__name__, f'Started {__name__}._create_dist_path')\r\n if os.path.isdir(self._publish_settings.dist_path):\r\n try:\r\n shutil.rmtree(self._publish_settings.dist_path)\r\n self._logger.info(__name__, f'Deleted {self._publish_settings.dist_path}')\r\n except Exception as e:\r\n self._logger.fatal(__name__, f'Cannot delete old dist directory', e)\r\n\r\n if not os.path.isdir(self._publish_settings.dist_path):\r\n try:\r\n os.makedirs(self._publish_settings.dist_path)\r\n self._logger.debug(__name__, f'Created directories: {self._publish_settings.dist_path}')\r\n self._logger.info(__name__, f'Created dist directory')\r\n except Exception as e:\r\n self._logger.fatal(__name__, f'Cannot create dist directory', e)\r\n\r\n self._logger.trace(__name__, f'Stopped {__name__}._create_dist_path')\r\n\r\n @staticmethod\r\n def _get_template_name_from_dirs(file: str) -> str:\r\n dirs = os.path.dirname(file).split('/')\r\n for d in dirs:\r\n if d.__contains__('.'):\r\n dirs.remove(d)\r\n\r\n if len(dirs) == 0:\r\n return os.path.basename(file)\r\n else:\r\n return '.'.join(dirs)\r\n\r\n def _write_templates(self):\r\n self._logger.trace(__name__, f'Started {__name__}._write_templates')\r\n for template in self._publish_settings.templates:\r\n for file in self._publish_settings.included_files:\r\n if os.path.basename(file) == '__init__.py' and file not in self._publish_settings.excluded_files:\r\n template_name = template.name\r\n if template.name == '*' or template.name == '':\r\n template_name = self._get_template_name_from_dirs(file)\r\n else:\r\n name = self._get_template_name_from_dirs(file)\r\n\r\n if name.__contains__('.'):\r\n if template.name != name.split('.')[len(name.split('.')) - 1]:\r\n continue\r\n\r\n else:\r\n if template.name != name:\r\n continue\r\n\r\n try:\r\n module_file_lines: list[str] = []\r\n module_py_lines: list[str] = []\r\n imports = ''\r\n with open(file, 'r') as py_file:\r\n module_file_lines = py_file.readlines()\r\n py_file.close()\r\n\r\n if len(module_file_lines) == 0:\r\n with open(file, 'w+') as py_file:\r\n py_file.write(self._get_template_output(template, template_name, '# imports:'))\r\n py_file.close()\r\n self._logger.debug(__name__, f'Written to {file}')\r\n else:\r\n is_started = False\r\n for line in module_file_lines:\r\n if line.__contains__('# imports'):\r\n is_started = True\r\n\r\n if (line.__contains__('from') or line.__contains__('import')) and is_started:\r\n module_py_lines.append(line.replace('\\n', ''))\r\n\r\n if len(module_py_lines) > 0:\r\n imports = '\\n'.join(module_py_lines)\r\n\r\n with open(file, 'w+') as py_file:\r\n py_file.write(self._get_template_output(template, template_name, imports))\r\n py_file.close()\r\n self._logger.debug(__name__, f'Written to {file}')\r\n\r\n except Exception as e:\r\n self._logger.error(__name__, f'Cannot write to file: {file}', e)\r\n\r\n self._logger.info(__name__, f'Written to all included modules')\r\n self._logger.trace(__name__, f'Stopped {__name__}._write_templates')\r\n\r\n def _copy_all_included_files(self):\r\n self._logger.trace(__name__, f'Started {__name__}._copy_all_included_files')\r\n dist_path = self._publish_settings.dist_path\r\n if self._publish_settings.dist_path.endswith('/'):\r\n dist_path = dist_path[:len(dist_path) - 1]\r\n\r\n for file in self._publish_settings.included_files:\r\n is_file_excluded = False\r\n if file in self._publish_settings.excluded_files:\r\n is_file_excluded = True\r\n else:\r\n for excluded in self._publish_settings.excluded_files:\r\n if file.__contains__(excluded):\r\n is_file_excluded = True\r\n\r\n if not is_file_excluded:\r\n output_file = ''\r\n\r\n if file.startswith('..'):\r\n output_file = file.replace('..', '')\r\n elif file.startswith('.'):\r\n output_file = file.replace('.', '', 1)\r\n\r\n output_file = f'{dist_path}{output_file}'\r\n output_path = os.path.dirname(output_file)\r\n\r\n try:\r\n if not os.path.isdir(output_path):\r\n os.makedirs(output_path)\r\n except Exception as e:\r\n self._logger.error(__name__, f'Cannot create directories: {output_path}', e)\r\n\r\n try:\r\n shutil.copy(file, output_file)\r\n except Exception as e:\r\n self._logger.error(__name__, f'Cannot copy file: {file} to {output_path}', e)\r\n\r\n self._logger.debug(__name__, f'Copied {file} to {output_path}')\r\n\r\n self._logger.info(__name__, f'Copied all included files')\r\n self._logger.trace(__name__, f'Stopped {__name__}._copy_all_included_files')\r\n\r\n def include(self, path: str):\r\n self._logger.trace(__name__, f'Started {__name__}.include')\r\n self._publish_settings.included_files.append(path)\r\n self._logger.trace(__name__, f'Stopped {__name__}.include')\r\n\r\n def exclude(self, path: str):\r\n self._logger.trace(__name__, f'Started {__name__}.exclude')\r\n self._publish_settings.excluded_files.append(path)\r\n self._logger.trace(__name__, f'Stopped {__name__}.exclude')\r\n\r\n def create(self):\r\n self._logger.trace(__name__, f'Started {__name__}.create')\r\n if not self._publish_settings.dist_path.endswith('/'):\r\n self._publish_settings.dist_path += '/'\r\n\r\n self._read_source_path()\r\n self._read_templates()\r\n self._create_dist_path()\r\n self._logger.trace(__name__, f'Stopped {__name__}.create')\r\n\r\n def publish(self):\r\n self._logger.trace(__name__, f'Started {__name__}.publish')\r\n self._write_templates()\r\n self._copy_all_included_files()\r\n self._logger.trace(__name__, f'Stopped {__name__}.publish')\r\n +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +--- src/sh_edraft/publishing/publisher.py (revision 9dbad20e9714ffa1546bb2d1b2f8b5ea8e854369) ++++ src/sh_edraft/publishing/publisher.py (date 1606383234093) +@@ -109,7 +109,7 @@ + for file in self._publish_settings.included_files: + if os.path.basename(file) == '__init__.py' and file not in self._publish_settings.excluded_files: + template_name = template.name +- if template.name == '*' or template.name == '': ++ if template.name == 'all' or template.name == '': + template_name = self._get_template_name_from_dirs(file) + else: + name = self._get_template_name_from_dirs(file) +Index: publish_templates/*_template.txt +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP +<+># -*- coding: utf-8 -*-\r\n\r\n\"\"\"\r\n$Name $Description\r\n~~~~~~~~~~~~~~~~~~~\r\n\r\n$LongDescription\r\n\r\n:copyright: (c) $CopyrightDate $CopyrightName\r\n:license: $LicenseName$LicenseDescription\r\n\r\n\"\"\"\r\n\r\n__title__ = '$Title'\r\n__author__ = '$Author'\r\n__license__ = '$LicenseName'\r\n__copyright__ = 'Copyright (c) $CopyrightDate $CopyrightName'\r\n__version__ = '$Version'\r\n\r\nfrom collections import namedtuple\r\n\r\n$Imports\r\n\r\nVersionInfo = namedtuple('VersionInfo', 'major minor micro')\r\nversion_info = VersionInfo(major=$Major, minor=$Minor, micro=$Micro)\r\n +=================================================================== +--- publish_templates/*_template.txt (revision 9dbad20e9714ffa1546bb2d1b2f8b5ea8e854369) ++++ publish_templates/all_template.txt (date 1606383191684) +@@ -22,4 +22,4 @@ + $Imports + + VersionInfo = namedtuple('VersionInfo', 'major minor micro') +-version_info = VersionInfo(major=$Major, minor=$Minor, micro=$Micro) ++version_info = VersionInfo(major=$Major, minor=$Minor, micro=$Micro) +\ No newline at end of file diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36__Default_Changelist_.xml new file mode 100644 index 00000000..49edc74a --- /dev/null +++ b/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36__Default_Changelist_.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..11a408c6 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,840 @@ + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/sh_edraft/cli/cpl_cli/commands/build/app.py b/src/sh_edraft/cli/cpl_cli/commands/build/app.py index 84577e8c..4c0b9833 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/build/app.py +++ b/src/sh_edraft/cli/cpl_cli/commands/build/app.py @@ -5,8 +5,8 @@ from sh_edraft.hosting.application_host import ApplicationHost from sh_edraft.hosting.base.application_base import ApplicationBase from sh_edraft.logging.logger import Logger from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.publisher import Publisher -from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.publish.publisher import Publisher +from sh_edraft.publish.base.publisher_base import PublisherBase from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase diff --git a/src/sh_edraft/cli/cpl_cli/commands/publish/app.py b/src/sh_edraft/cli/cpl_cli/commands/publish/app.py index c7ce661a..2a0f6cec 100644 --- a/src/sh_edraft/cli/cpl_cli/commands/publish/app.py +++ b/src/sh_edraft/cli/cpl_cli/commands/publish/app.py @@ -5,8 +5,8 @@ from sh_edraft.hosting.application_host import ApplicationHost from sh_edraft.hosting.base.application_base import ApplicationBase from sh_edraft.logging.logger import Logger from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.publisher import Publisher -from sh_edraft.publishing.base.publisher_base import PublisherBase +from sh_edraft.publish.publisher import Publisher +from sh_edraft.publish.base.publisher_base import PublisherBase from sh_edraft.service.providing.base.service_provider_base import ServiceProviderBase diff --git a/src/sh_edraft/publishing/base/publisher_base.py b/src/sh_edraft/publish/base/publisher_base.py similarity index 100% rename from src/sh_edraft/publishing/base/publisher_base.py rename to src/sh_edraft/publish/base/publisher_base.py diff --git a/src/sh_edraft/publishing/model/publish_settings_model.py b/src/sh_edraft/publish/model/publish_settings_model.py similarity index 95% rename from src/sh_edraft/publishing/model/publish_settings_model.py rename to src/sh_edraft/publish/model/publish_settings_model.py index 17b6b83c..3a1f8ce5 100644 --- a/src/sh_edraft/publishing/model/publish_settings_model.py +++ b/src/sh_edraft/publish/model/publish_settings_model.py @@ -2,8 +2,8 @@ import traceback from typing import Optional from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase -from sh_edraft.publishing.model.template import Template -from sh_edraft.publishing.model.publish_settings_name import PublishSettingsName +from sh_edraft.publish.model.template import Template +from sh_edraft.publish.model.publish_settings_name import PublishSettingsName from sh_edraft.console.console import Console from sh_edraft.console.model.foreground_color import ForegroundColor diff --git a/src/sh_edraft/publishing/model/publish_settings_name.py b/src/sh_edraft/publish/model/publish_settings_name.py similarity index 100% rename from src/sh_edraft/publishing/model/publish_settings_name.py rename to src/sh_edraft/publish/model/publish_settings_name.py diff --git a/src/sh_edraft/publishing/model/template.py b/src/sh_edraft/publish/model/template.py similarity index 98% rename from src/sh_edraft/publishing/model/template.py rename to src/sh_edraft/publish/model/template.py index cea0f09c..b98a4738 100644 --- a/src/sh_edraft/publishing/model/template.py +++ b/src/sh_edraft/publish/model/template.py @@ -2,7 +2,7 @@ from typing import Optional from sh_edraft.coding.model.version import Version from sh_edraft.configuration.base.configuration_model_base import ConfigurationModelBase -from sh_edraft.publishing.model.template_enum import TemplateEnum +from sh_edraft.publish.model.template_enum import TemplateEnum class Template(ConfigurationModelBase): diff --git a/src/sh_edraft/publishing/model/template_enum.py b/src/sh_edraft/publish/model/template_enum.py similarity index 100% rename from src/sh_edraft/publishing/model/template_enum.py rename to src/sh_edraft/publish/model/template_enum.py diff --git a/src/sh_edraft/publishing/publisher.py b/src/sh_edraft/publish/publisher.py similarity index 97% rename from src/sh_edraft/publishing/publisher.py rename to src/sh_edraft/publish/publisher.py index 4a8bf1cd..2ddd2b15 100644 --- a/src/sh_edraft/publishing/publisher.py +++ b/src/sh_edraft/publish/publisher.py @@ -5,9 +5,9 @@ from string import Template as stringTemplate from setuptools import sandbox from sh_edraft.logging.base.logger_base import LoggerBase -from sh_edraft.publishing.base.publisher_base import PublisherBase -from sh_edraft.publishing.model.publish_settings_model import PublishSettings -from sh_edraft.publishing.model.template import Template +from sh_edraft.publish.base.publisher_base import PublisherBase +from sh_edraft.publish.model.publish_settings_model import PublishSettings +from sh_edraft.publish.model.template import Template class Publisher(PublisherBase): @@ -229,7 +229,7 @@ class Publisher(PublisherBase): try: if not os.path.isdir(output_path): - os.makedirs(output_path) + os.makedirs(output_path, exist_ok=True) except Exception as e: self._logger.error(__name__, f'Cannot create directories: {output_path}', e) diff --git a/src/tests/appsettings.edrafts-lapi.json b/src/tests/appsettings.edrafts-lapi.json index 0b2e194a..9af6f6c0 100644 --- a/src/tests/appsettings.edrafts-lapi.json +++ b/src/tests/appsettings.edrafts-lapi.json @@ -16,48 +16,5 @@ "Port": "587", "UserName": "dev-srv@sh-edraft.de", "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" - }, - "PublishSettings": { - "SourcePath": "../", - "DistPath": "../../dist", - "Templates": [ - { - "TemplatePath": "../../publish_templates/all_template.txt", - "Name": "all", - "Description": "", - "LongDescription": "", - "CopyrightDate": "2020", - "CopyrightName": "sh-edraft.de", - "LicenseName": "MIT", - "LicenseDescription": ", see LICENSE for more details.", - "Title": "", - "Author": "Sven Heidemann", - "Version": { - "Major": 2020, - "Minor": 12, - "Micro": 9 - } - }, - { - "TemplatePath": "../../publish_templates/all_template.txt", - "Name": "sh_edraft", - "Description": "common python library", - "LongDescription": "Library to share common classes and models used at sh-edraft.de", - "CopyrightDate": "2020", - "CopyrightName": "sh-edraft.de", - "LicenseName": "MIT", - "LicenseDescription": ", see LICENSE for more details.", - "Title": "", - "Author": "Sven Heidemann", - "Version": { - "Major": 2020, - "Minor": 12, - "Micro": 9 - } - } - ], - "IncludedFiles": [], - "ExcludedFiles": [], - "TemplateEnding": "_template.txt" } } \ No newline at end of file diff --git a/src/tests/appsettings.edrafts-pc.json b/src/tests/appsettings.edrafts-pc.json index 0b2e194a..9af6f6c0 100644 --- a/src/tests/appsettings.edrafts-pc.json +++ b/src/tests/appsettings.edrafts-pc.json @@ -16,48 +16,5 @@ "Port": "587", "UserName": "dev-srv@sh-edraft.de", "Credentials": "RmBOQX1eNFYiYjgsSid3fV1nelc2WA==" - }, - "PublishSettings": { - "SourcePath": "../", - "DistPath": "../../dist", - "Templates": [ - { - "TemplatePath": "../../publish_templates/all_template.txt", - "Name": "all", - "Description": "", - "LongDescription": "", - "CopyrightDate": "2020", - "CopyrightName": "sh-edraft.de", - "LicenseName": "MIT", - "LicenseDescription": ", see LICENSE for more details.", - "Title": "", - "Author": "Sven Heidemann", - "Version": { - "Major": 2020, - "Minor": 12, - "Micro": 9 - } - }, - { - "TemplatePath": "../../publish_templates/all_template.txt", - "Name": "sh_edraft", - "Description": "common python library", - "LongDescription": "Library to share common classes and models used at sh-edraft.de", - "CopyrightDate": "2020", - "CopyrightName": "sh-edraft.de", - "LicenseName": "MIT", - "LicenseDescription": ", see LICENSE for more details.", - "Title": "", - "Author": "Sven Heidemann", - "Version": { - "Major": 2020, - "Minor": 12, - "Micro": 9 - } - } - ], - "IncludedFiles": [], - "ExcludedFiles": [], - "TemplateEnding": "_template.txt" } } \ No newline at end of file diff --git a/src/tests/build.json b/src/tests/build.json index dd013a2c..3921c95f 100644 --- a/src/tests/build.json +++ b/src/tests/build.json @@ -6,17 +6,17 @@ "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" }, "LoggingSettings": { - "Path": "../build/logs/", + "Path": "../../build_test/logs/", "Filename": "log_$start_time.log", "ConsoleLogLevel": "INFO", "FileLogLevel": "TRACE" }, "PublishSettings": { "SourcePath": "./", - "DistPath": "../build/dist", + "DistPath": "../../build_test/dist", "Templates": [ { - "TemplatePath": "../publish_templates/all_template.txt", + "TemplatePath": "../../publish_templates/all_template.txt", "Name": "all", "Description": "", "LongDescription": "", @@ -33,7 +33,7 @@ } }, { - "TemplatePath": "../publish_templates/all_template.txt", + "TemplatePath": "../../publish_templates/all_template.txt", "Name": "sh_edraft", "Description": "common python library", "LongDescription": "Library to share common classes and models used at sh-edraft.de", diff --git a/src/tests/publish_test/__init__.py b/src/tests/publish_test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tests/publish_test/publisher_test.py b/src/tests/publish_test/publisher_test.py new file mode 100644 index 00000000..06f95519 --- /dev/null +++ b/src/tests/publish_test/publisher_test.py @@ -0,0 +1,52 @@ +import os +import unittest + +from sh_edraft.console import Console +from sh_edraft.hosting import ApplicationHost +from sh_edraft.logging import Logger +from sh_edraft.logging.base import LoggerBase +from sh_edraft.publish import Publisher +from sh_edraft.publish.base import PublisherBase +from sh_edraft.publish.model import PublishSettings + + +class PublisherTest(unittest.TestCase): + + def setUp(self): + Console.disable() + self._app_host = ApplicationHost() + self._configuration = self._app_host.configuration + self._services = self._app_host.services + + self._configuration.add_environment_variables('CPL_') + self._configuration.add_argument_variables() + self._configuration.add_json_file(f'build.json') + + self._services.add_singleton(LoggerBase, Logger) + self._services.add_singleton(PublisherBase, Publisher) + self._publisher: Publisher = self._services.get_service(PublisherBase) + + def test_include(self): + value = './test.py' + self._publisher.include(value) + self.assertTrue(value in self._publisher._publish_settings.included_files) + + def test_exclude(self): + value = './test.py' + self._publisher.exclude(value) + self.assertTrue(value in self._publisher._publish_settings.excluded_files) + + def test_create(self): + self._publisher.create() + self.assertTrue(os.path.isdir(self._configuration.get_configuration(PublishSettings).dist_path)) + + def test_build(self): + self._publisher.create() + self._publisher.build() + self.assertTrue(os.path.isdir(self._configuration.get_configuration(PublishSettings).dist_path)) + + def test_publish(self): + self._publisher.create() + self._publisher.build() + self._publisher.publish() + self.assertTrue(os.path.isdir(self._configuration.get_configuration(PublishSettings).dist_path)) diff --git a/src/tests/setup.py b/src/tests/setup.py new file mode 100644 index 00000000..b9da5bf5 --- /dev/null +++ b/src/tests/setup.py @@ -0,0 +1,24 @@ +import setuptools + +setuptools.setup( + name='sh_edraft_unittests', + version='2020.0.1', + packages=setuptools.find_packages(exclude=["tests*"]), + url='https://www.sh-edraft.de', + license='MIT', + author='Sven Heidemann', + author_email='edraft.sh@gmail.com', + include_package_data=True, + description='sh-edraft python common lib unittest', + python_requires='>=3.8', + install_requires=[ + 'discord.py', + 'flask', + 'mysql-connector', + 'SQLAlchemy', + 'termcolor', + 'pyfiglet', + 'tabulate', + 'smtplib' + ] +)