Compare commits
46 Commits
2021.4.0.p
...
308e5c9b0c
Author | SHA1 | Date | |
---|---|---|---|
308e5c9b0c | |||
c12ff4f9e3 | |||
091c89df2c | |||
63a67be0ee | |||
c68224b31a | |||
9f219757c3 | |||
e09a4402b3 | |||
6867eb0e65 | |||
ffaa5c4a2b | |||
b9499108d8 | |||
37175b7227 | |||
2b5831c5fe | |||
62c8b9c68d | |||
a080119c44 | |||
a26c6f1bd9 | |||
daac14e099 | |||
d4b5c32a21 | |||
c115afd736 | |||
e7863a92e0 | |||
82a9e3a23a | |||
a3a0a150a8 | |||
6951a19670 | |||
669133d491 | |||
c60598b3f6 | |||
45733b30ef | |||
f8bd86692e | |||
5e5d86cf94 | |||
e0b7728719 | |||
0f85d4b9bc | |||
a3fff9c7d7 | |||
8dcf3a6768 | |||
94949394de | |||
b7be439381 | |||
0cae3428b9 | |||
cc7755bafc | |||
4e78b9c12b | |||
5c80cf2222 | |||
d02548e1a8 | |||
51efe973e8 | |||
0bb272d89b | |||
59f6843ea9 | |||
be6838f97b | |||
d5b2d3605b | |||
7a48917fb4 | |||
59832742b6 | |||
f9f04901c0 |
@@ -3,7 +3,9 @@
|
|||||||
"DefaultProject": "cpl_cli",
|
"DefaultProject": "cpl_cli",
|
||||||
"Projects": {
|
"Projects": {
|
||||||
"cpl": "src/cpl/cpl.json",
|
"cpl": "src/cpl/cpl.json",
|
||||||
"cpl_cli": "src/cpl_cli/cpl_cli.json"
|
"cpl_cli": "src/cpl_cli/cpl_cli.json",
|
||||||
}
|
"cpl_query": "src/cpl_query/cpl_query.json"
|
||||||
|
},
|
||||||
|
"Scripts": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -7,6 +7,10 @@ upload:
|
|||||||
twine upload --repository-url https://pip.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
twine upload --repository-url https://pip.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
||||||
twine upload -r pip.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
twine upload -r pip.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
||||||
|
|
||||||
|
query:
|
||||||
|
twine upload --repository-url https://pip-dev.sh-edraft.de dist/sh_cpl-query/publish/setup/*
|
||||||
|
twine upload -r pip-dev.sh-edraft.de dist/sh_cpl-query/publish/setup/*
|
||||||
|
|
||||||
exp:
|
exp:
|
||||||
cpl:
|
cpl:
|
||||||
twine upload --repository-url https://pip-exp.sh-edraft.de dist/sh_cpl/publish/setup/*
|
twine upload --repository-url https://pip-exp.sh-edraft.de dist/sh_cpl/publish/setup/*
|
||||||
@@ -16,6 +20,10 @@ upload:
|
|||||||
twine upload --repository-url https://pip-exp.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
twine upload --repository-url https://pip-exp.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
||||||
twine upload -r pip-exp.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
twine upload -r pip-exp.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
||||||
|
|
||||||
|
query:
|
||||||
|
twine upload --repository-url https://pip-exp.sh-edraft.de dist/sh_cpl-query/publish/setup/*
|
||||||
|
twine upload -r pip-exp.sh-edraft.de dist/sh_cpl-query/publish/setup/*
|
||||||
|
|
||||||
dev:
|
dev:
|
||||||
cpl:
|
cpl:
|
||||||
twine upload --repository-url https://pip-dev.sh-edraft.de dist/sh_cpl/publish/setup/*
|
twine upload --repository-url https://pip-dev.sh-edraft.de dist/sh_cpl/publish/setup/*
|
||||||
@@ -25,15 +33,22 @@ upload:
|
|||||||
twine upload --repository-url https://pip-dev.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
twine upload --repository-url https://pip-dev.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
||||||
twine upload -r pip-dev.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
twine upload -r pip-dev.sh-edraft.de dist/sh_cpl-cli/publish/setup/*
|
||||||
|
|
||||||
|
query:
|
||||||
|
twine upload --repository-url https://pip-dev.sh-edraft.de dist/sh_cpl-query/publish/setup/*
|
||||||
|
twine upload -r pip-dev.sh-edraft.de dist/sh_cpl-query/publish/setup/*
|
||||||
|
|
||||||
install:
|
install:
|
||||||
prod:
|
prod:
|
||||||
pip install --extra-index-url https://pip.sh-edraft.de/ sh_cpl
|
pip install --extra-index-url https://pip.sh-edraft.de/ sh_cpl
|
||||||
pip install --extra-index-url https://pip.sh-edraft.de/ sh_cpl-cli
|
pip install --extra-index-url https://pip.sh-edraft.de/ sh_cpl-cli
|
||||||
|
pip install --extra-index-url https://pip.sh-edraft.de/ sh_cpl-query
|
||||||
|
|
||||||
exp:
|
exp:
|
||||||
pip install --extra-index-url https://pip-exp.sh-edraft.de/ sh_cpl
|
pip install --extra-index-url https://pip-exp.sh-edraft.de/ sh_cpl
|
||||||
pip install --extra-index-url https://pip-exp.sh-edraft.de/ sh_cpl-cli
|
pip install --extra-index-url https://pip-exp.sh-edraft.de/ sh_cpl-cli
|
||||||
|
pip install --extra-index-url https://pip-exp.sh-edraft.de/ sh_cpl-query
|
||||||
|
|
||||||
dev:
|
dev:
|
||||||
pip install --extra-index-url https://pip-dev.sh-edraft.de/ sh_cpl
|
pip install --extra-index-url https://pip-dev.sh-edraft.de/ sh_cpl
|
||||||
pip install --extra-index-url https://pip-dev.sh-edraft.de/ sh_cpl-cli
|
pip install --extra-index-url https://pip-dev.sh-edraft.de/ sh_cpl-cli
|
||||||
|
pip install --extra-index-url https://pip-dev.sh-edraft.de/ sh_cpl-query
|
||||||
|
12
scripts/build.sh
Normal file → Executable file
12
scripts/build.sh
Normal file → Executable file
@@ -2,10 +2,14 @@
|
|||||||
# activate venv
|
# activate venv
|
||||||
source /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/cpl-env/bin/activate
|
source /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/cpl-env/bin/activate
|
||||||
|
|
||||||
# CLI
|
|
||||||
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/
|
|
||||||
cpl build
|
|
||||||
|
|
||||||
# CPL
|
# CPL
|
||||||
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl
|
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl
|
||||||
|
cpl build
|
||||||
|
|
||||||
|
# CLI
|
||||||
|
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl_cli
|
||||||
|
cpl build
|
||||||
|
|
||||||
|
# CPL Query
|
||||||
|
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl_query
|
||||||
cpl build
|
cpl build
|
0
scripts/chrome.sh
Normal file → Executable file
0
scripts/chrome.sh
Normal file → Executable file
0
scripts/create_docs.sh
Normal file → Executable file
0
scripts/create_docs.sh
Normal file → Executable file
1
scripts/hello_world.py
Normal file
1
scripts/hello_world.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
print('Hello World')
|
14
scripts/publish.sh
Normal file → Executable file
14
scripts/publish.sh
Normal file → Executable file
@@ -2,10 +2,14 @@
|
|||||||
# activate venv
|
# activate venv
|
||||||
source /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/cpl-env/bin/activate
|
source /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/cpl-env/bin/activate
|
||||||
|
|
||||||
# CLI
|
|
||||||
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/
|
|
||||||
cpl publish
|
|
||||||
|
|
||||||
# CPL
|
# CPL
|
||||||
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl
|
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl
|
||||||
cpl publish
|
cpl publish
|
||||||
|
|
||||||
|
# CLI
|
||||||
|
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl_cli
|
||||||
|
cpl publish
|
||||||
|
|
||||||
|
# CPL Query
|
||||||
|
cd /home/sven/Nextcloud_Sven/Schreibtisch/git_sh-edraft_de/sh_cpl/src/cpl_query
|
||||||
|
cpl
|
@@ -15,11 +15,11 @@ __title__ = 'cpl'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.application'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -26,4 +26,4 @@ from .application_builder_abc import ApplicationBuilderABC
|
|||||||
from .startup_abc import StartupABC
|
from .startup_abc import StartupABC
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -27,4 +27,4 @@ from .configuration_variable_name_enum import ConfigurationVariableNameEnum
|
|||||||
from .console_argument import ConsoleArgument
|
from .console_argument import ConsoleArgument
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.console'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -27,4 +27,4 @@ from .foreground_color_enum import ForegroundColorEnum
|
|||||||
from .spinner_thread import SpinnerThread
|
from .spinner_thread import SpinnerThread
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "2021",
|
"Major": "2021",
|
||||||
"Minor": "4",
|
"Minor": "4",
|
||||||
"Micro": "0.post1"
|
"Micro": "0.post2"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.database'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -25,4 +25,4 @@ from .database_settings import DatabaseSettings
|
|||||||
from .database_settings_name_enum import DatabaseSettingsNameEnum
|
from .database_settings_name_enum import DatabaseSettingsNameEnum
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.database.connection'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -24,4 +24,4 @@ from .database_connection import DatabaseConnection
|
|||||||
from .database_connection_abc import DatabaseConnectionABC
|
from .database_connection_abc import DatabaseConnectionABC
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.database.context'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -24,4 +24,4 @@ from .database_context import DatabaseContext
|
|||||||
from .database_context_abc import DatabaseContextABC
|
from .database_context_abc import DatabaseContextABC
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.dependency_injection'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -28,4 +28,4 @@ from .service_provider import ServiceProvider
|
|||||||
from .service_provider_abc import ServiceProviderABC
|
from .service_provider_abc import ServiceProviderABC
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.environment'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -25,4 +25,4 @@ from .environment_name_enum import EnvironmentNameEnum
|
|||||||
from .application_environment import ApplicationEnvironment
|
from .application_environment import ApplicationEnvironment
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.logging'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -27,4 +27,4 @@ from .logging_settings import LoggingSettings
|
|||||||
from .logging_settings_name_enum import LoggingSettingsNameEnum
|
from .logging_settings_name_enum import LoggingSettingsNameEnum
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -81,7 +81,11 @@ class Logger(LoggerABC):
|
|||||||
try:
|
try:
|
||||||
# open log file, create if not exists
|
# open log file, create if not exists
|
||||||
path = f'{self._path}{self._log}'
|
path = f'{self._path}{self._log}'
|
||||||
f = open(path, "w+")
|
permission = 'a+'
|
||||||
|
if not os.path.isfile(path):
|
||||||
|
permission = 'w+'
|
||||||
|
|
||||||
|
f = open(path, permission)
|
||||||
Console.write_line(f'[{__name__}]: Using log file: {path}')
|
Console.write_line(f'[{__name__}]: Using log file: {path}')
|
||||||
f.close()
|
f.close()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.mailing'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -27,4 +27,4 @@ from .email_client_settings import EMailClientSettings
|
|||||||
from .email_client_settings_name_enum import EMailClientSettingsNameEnum
|
from .email_client_settings_name_enum import EMailClientSettingsNameEnum
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.time'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -24,4 +24,4 @@ from .time_format_settings import TimeFormatSettings
|
|||||||
from .time_format_settings_names_enum import TimeFormatSettingsNamesEnum
|
from .time_format_settings_names_enum import TimeFormatSettingsNamesEnum
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl.utils'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.4.0.post2'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -25,4 +25,4 @@ from .string import String
|
|||||||
from .pip import Pip
|
from .pip import Pip
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='4', micro='0.post2')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl_cli'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -29,4 +29,4 @@ from .main import main
|
|||||||
from .startup import Startup
|
from .startup import Startup
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.build'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.generate'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.console'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.console.source'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.console.source.name'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.console.source.tests'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.library'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.library.source'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.library.source.name'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.new.library.source.tests'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli._templates.publish'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -1,11 +1,14 @@
|
|||||||
|
import os
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from cpl.application.application_abc import ApplicationABC
|
from cpl.application.application_abc import ApplicationABC
|
||||||
|
from cpl.configuration.console_argument import ConsoleArgument
|
||||||
from cpl.configuration.configuration_abc import ConfigurationABC
|
from cpl.configuration.configuration_abc import ConfigurationABC
|
||||||
from cpl.console.console import Console
|
from cpl.console.console import Console
|
||||||
from cpl.dependency_injection import ServiceProviderABC
|
from cpl.dependency_injection import ServiceProviderABC
|
||||||
from cpl_cli.command.add_service import AddService
|
from cpl_cli.command.add_service import AddService
|
||||||
from cpl_cli.command.build_service import BuildService
|
from cpl_cli.command.build_service import BuildService
|
||||||
|
from cpl_cli.command.custom_script_service import CustomScriptService
|
||||||
from cpl_cli.command.generate_service import GenerateService
|
from cpl_cli.command.generate_service import GenerateService
|
||||||
from cpl_cli.command.install_service import InstallService
|
from cpl_cli.command.install_service import InstallService
|
||||||
from cpl_cli.command.new_service import NewService
|
from cpl_cli.command.new_service import NewService
|
||||||
@@ -16,6 +19,7 @@ from cpl_cli.command.uninstall_service import UninstallService
|
|||||||
from cpl_cli.command.update_service import UpdateService
|
from cpl_cli.command.update_service import UpdateService
|
||||||
from cpl_cli.command_handler_service import CommandHandler
|
from cpl_cli.command_handler_service import CommandHandler
|
||||||
from cpl_cli.command_model import CommandModel
|
from cpl_cli.command_model import CommandModel
|
||||||
|
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
|
||||||
from cpl_cli.error import Error
|
from cpl_cli.error import Error
|
||||||
from cpl_cli.command.help_service import HelpService
|
from cpl_cli.command.help_service import HelpService
|
||||||
from cpl_cli.command.version_service import VersionService
|
from cpl_cli.command.version_service import VersionService
|
||||||
@@ -48,6 +52,11 @@ class CLI(ApplicationABC):
|
|||||||
self._command_handler.add_command(CommandModel('update', ['u', 'U'], UpdateService, False, True, True))
|
self._command_handler.add_command(CommandModel('update', ['u', 'U'], UpdateService, False, True, True))
|
||||||
self._command_handler.add_command(CommandModel('version', ['v', 'V'], VersionService, False, False, False))
|
self._command_handler.add_command(CommandModel('version', ['v', 'V'], VersionService, False, False, False))
|
||||||
|
|
||||||
|
if os.path.isfile(os.path.join(self._environment.working_directory, 'cpl-workspace.json')):
|
||||||
|
workspace: Optional[WorkspaceSettings] = self._configuration.get_configuration(WorkspaceSettings)
|
||||||
|
for script in workspace.scripts:
|
||||||
|
self._command_handler.add_command(CommandModel(script, [], CustomScriptService, True, True, False))
|
||||||
|
|
||||||
self._command_handler.add_command(CommandModel('--help', ['-h', '-H'], HelpService, False, False, False))
|
self._command_handler.add_command(CommandModel('--help', ['-h', '-H'], HelpService, False, False, False))
|
||||||
self._options.append('--help')
|
self._options.append('--help')
|
||||||
|
|
||||||
@@ -100,6 +109,10 @@ class CLI(ApplicationABC):
|
|||||||
for arg in result_args:
|
for arg in result_args:
|
||||||
args.append(arg)
|
args.append(arg)
|
||||||
|
|
||||||
|
else:
|
||||||
|
Error.error(f'Unexpected command')
|
||||||
|
return
|
||||||
|
|
||||||
if command is None:
|
if command is None:
|
||||||
Error.error(f'Expected command')
|
Error.error(f'Expected command')
|
||||||
return
|
return
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl_cli.command'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -28,4 +28,4 @@ from .publish_service import PublishService
|
|||||||
from .version_service import VersionService
|
from .version_service import VersionService
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
39
src/cpl_cli/command/custom_script_service.py
Normal file
39
src/cpl_cli/command/custom_script_service.py
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from cpl.configuration.configuration_abc import ConfigurationABC
|
||||||
|
from cpl.console.console import Console
|
||||||
|
from cpl_cli.command_abc import CommandABC
|
||||||
|
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
|
||||||
|
|
||||||
|
|
||||||
|
class CustomScriptService(CommandABC):
|
||||||
|
|
||||||
|
def __init__(self, config: ConfigurationABC, ws: WorkspaceSettings):
|
||||||
|
"""
|
||||||
|
Service for CLI scripts
|
||||||
|
"""
|
||||||
|
CommandABC.__init__(self)
|
||||||
|
|
||||||
|
self._config = config
|
||||||
|
self._workspace = ws
|
||||||
|
|
||||||
|
@property
|
||||||
|
def help_message(self) -> str:
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def run(self, args: list[str]):
|
||||||
|
cmd = args[0] if len(args) > 0 else self._config.additional_arguments[0]
|
||||||
|
|
||||||
|
for script in self._workspace.scripts:
|
||||||
|
if script == cmd:
|
||||||
|
command = self._workspace.scripts[script]
|
||||||
|
try:
|
||||||
|
run_command = []
|
||||||
|
for word in command.split(' '):
|
||||||
|
run_command.append(word)
|
||||||
|
|
||||||
|
subprocess.run(run_command)
|
||||||
|
except Exception as e:
|
||||||
|
Console.error(str(e))
|
@@ -96,7 +96,7 @@ class NewService(CommandABC):
|
|||||||
ProjectSettingsNameEnum.license_name.value: '',
|
ProjectSettingsNameEnum.license_name.value: '',
|
||||||
ProjectSettingsNameEnum.license_description.value: '',
|
ProjectSettingsNameEnum.license_description.value: '',
|
||||||
ProjectSettingsNameEnum.dependencies.value: [
|
ProjectSettingsNameEnum.dependencies.value: [
|
||||||
f'sh_cpl=={version.parse(cpl.__version__)}'
|
f'sh_cpl>={version.parse(cpl.__version__)}'
|
||||||
],
|
],
|
||||||
ProjectSettingsNameEnum.python_version.value: f'>={sys.version.split(" ")[0]}',
|
ProjectSettingsNameEnum.python_version.value: f'>={sys.version.split(" ")[0]}',
|
||||||
ProjectSettingsNameEnum.python_path.value: {
|
ProjectSettingsNameEnum.python_path.value: {
|
||||||
|
@@ -6,6 +6,7 @@ from cpl.configuration.configuration_abc import ConfigurationABC
|
|||||||
from cpl.console.console import Console
|
from cpl.console.console import Console
|
||||||
from cpl.dependency_injection.service_provider_abc import ServiceProviderABC
|
from cpl.dependency_injection.service_provider_abc import ServiceProviderABC
|
||||||
from cpl.utils.string import String
|
from cpl.utils.string import String
|
||||||
|
from cpl_cli.command.custom_script_service import CustomScriptService
|
||||||
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
|
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
|
||||||
from cpl_cli.error import Error
|
from cpl_cli.error import Error
|
||||||
from cpl_cli.command_model import CommandModel
|
from cpl_cli.command_model import CommandModel
|
||||||
@@ -57,7 +58,6 @@ class CommandHandler(ABC):
|
|||||||
workspace: Optional[WorkspaceSettings] = None
|
workspace: Optional[WorkspaceSettings] = None
|
||||||
|
|
||||||
if os.path.isfile(os.path.join(self._env.working_directory, 'cpl-workspace.json')):
|
if os.path.isfile(os.path.join(self._env.working_directory, 'cpl-workspace.json')):
|
||||||
self._config.add_json_file('cpl-workspace.json', optional=True, output=False)
|
|
||||||
workspace = self._config.get_configuration(WorkspaceSettings)
|
workspace = self._config.get_configuration(WorkspaceSettings)
|
||||||
|
|
||||||
if command.is_project_needed:
|
if command.is_project_needed:
|
||||||
@@ -111,5 +111,27 @@ class CommandHandler(ABC):
|
|||||||
|
|
||||||
self._config.add_json_file(project_json, optional=True, output=False)
|
self._config.add_json_file(project_json, optional=True, output=False)
|
||||||
|
|
||||||
self._services.get_service(command.command).run(args)
|
# pre scripts
|
||||||
Console.write('\n')
|
Console.write('\n')
|
||||||
|
self._handle_pre_or_post_scripts(True, workspace, command)
|
||||||
|
self._services.get_service(command.command).run(args)
|
||||||
|
# post scripts
|
||||||
|
Console.write('\n\n')
|
||||||
|
self._handle_pre_or_post_scripts(False, workspace, command)
|
||||||
|
Console.write('\n')
|
||||||
|
|
||||||
|
def _handle_pre_or_post_scripts(self, pre: bool, workspace: WorkspaceSettings, command: CommandModel):
|
||||||
|
script_type = 'pre-' if pre else 'post-'
|
||||||
|
if workspace is not None and len(workspace.scripts) > 0:
|
||||||
|
for script in workspace.scripts:
|
||||||
|
if script_type in script and script.split(script_type)[1] == command.name:
|
||||||
|
script_name = script
|
||||||
|
script_cmd = workspace.scripts[script]
|
||||||
|
if script_cmd in workspace.scripts:
|
||||||
|
script_name = workspace.scripts[script]
|
||||||
|
|
||||||
|
css: CustomScriptService = self._services.get_service(CustomScriptService)
|
||||||
|
if css is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
css.run([script_name])
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl_cli.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -30,4 +30,4 @@ from .workspace_settings import WorkspaceSettings
|
|||||||
from .workspace_settings_name_enum import WorkspaceSettingsNameEnum
|
from .workspace_settings_name_enum import WorkspaceSettingsNameEnum
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -76,7 +76,11 @@ class BuildSettings(ConfigurationModelABC):
|
|||||||
self._included = settings[BuildSettingsNameEnum.included.value]
|
self._included = settings[BuildSettingsNameEnum.included.value]
|
||||||
self._excluded = settings[BuildSettingsNameEnum.excluded.value]
|
self._excluded = settings[BuildSettingsNameEnum.excluded.value]
|
||||||
self._package_data = settings[BuildSettingsNameEnum.package_data.value]
|
self._package_data = settings[BuildSettingsNameEnum.package_data.value]
|
||||||
self._project_references = settings[BuildSettingsNameEnum.project_references.value]
|
|
||||||
|
if BuildSettingsNameEnum.project_references.value in settings:
|
||||||
|
self._project_references = settings[BuildSettingsNameEnum.project_references.value]
|
||||||
|
else:
|
||||||
|
self._project_references = []
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
self._source_path = str(self._source_path).replace('/', '\\')
|
self._source_path = str(self._source_path).replace('/', '\\')
|
||||||
|
@@ -127,7 +127,11 @@ class ProjectSettings(ConfigurationModelABC):
|
|||||||
|
|
||||||
self._python_executable = path
|
self._python_executable = path
|
||||||
|
|
||||||
self._classifiers = settings[ProjectSettingsNameEnum.classifiers.value]
|
if ProjectSettingsNameEnum.classifiers.value:
|
||||||
|
self._classifiers = settings[ProjectSettingsNameEnum.classifiers.value]
|
||||||
|
else:
|
||||||
|
self._classifiers = []
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Console.set_foreground_color(ForegroundColorEnum.red)
|
Console.set_foreground_color(ForegroundColorEnum.red)
|
||||||
Console.write_line(
|
Console.write_line(
|
||||||
|
@@ -13,6 +13,7 @@ class WorkspaceSettings(ConfigurationModelABC):
|
|||||||
|
|
||||||
self._default_project: Optional[str] = None
|
self._default_project: Optional[str] = None
|
||||||
self._projects: dict[str, str] = {}
|
self._projects: dict[str, str] = {}
|
||||||
|
self._scripts: dict[str, str] = {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def default_project(self) -> str:
|
def default_project(self) -> str:
|
||||||
@@ -22,10 +23,19 @@ class WorkspaceSettings(ConfigurationModelABC):
|
|||||||
def projects(self) -> dict[str, str]:
|
def projects(self) -> dict[str, str]:
|
||||||
return self._projects
|
return self._projects
|
||||||
|
|
||||||
|
@property
|
||||||
|
def scripts(self):
|
||||||
|
return self._scripts
|
||||||
|
|
||||||
def from_dict(self, settings: dict):
|
def from_dict(self, settings: dict):
|
||||||
try:
|
try:
|
||||||
self._default_project = settings[WorkspaceSettingsNameEnum.default_project.value]
|
self._default_project = settings[WorkspaceSettingsNameEnum.default_project.value]
|
||||||
self._projects = settings[WorkspaceSettingsNameEnum.projects.value]
|
self._projects = settings[WorkspaceSettingsNameEnum.projects.value]
|
||||||
|
|
||||||
|
if WorkspaceSettingsNameEnum.scripts.value in settings:
|
||||||
|
self._scripts = settings[WorkspaceSettingsNameEnum.scripts.value]
|
||||||
|
else:
|
||||||
|
self._scripts = {}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings')
|
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings')
|
||||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
||||||
|
@@ -5,3 +5,4 @@ class WorkspaceSettingsNameEnum(Enum):
|
|||||||
|
|
||||||
default_project = 'DefaultProject'
|
default_project = 'DefaultProject'
|
||||||
projects = 'Projects'
|
projects = 'Projects'
|
||||||
|
scripts = 'Scripts'
|
||||||
|
@@ -3,8 +3,8 @@
|
|||||||
"Name": "sh_cpl-cli",
|
"Name": "sh_cpl-cli",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "2021",
|
"Major": "2021",
|
||||||
"Minor": "4",
|
"Minor": "10",
|
||||||
"Micro": "0.post1"
|
"Micro": "5"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"sh_cpl==2021.4.0.post1"
|
"sh_cpl>=2021.4.0.post1"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.8",
|
"PythonVersion": ">=3.8",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli.live_server'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -71,13 +71,14 @@ class LiveServerThread(threading.Thread):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# set cwd to src/
|
# set cwd to src/
|
||||||
self._env.set_working_directory(os.path.abspath(os.path.join(self._path, '../')))
|
self._env.set_working_directory(os.path.abspath(os.path.join(self._path)))
|
||||||
|
src_cwd = os.path.abspath(os.path.join(self._path, '../'))
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
self._env_vars['PYTHONPATH'] = f'{self._env.working_directory};' \
|
self._env_vars['PYTHONPATH'] = f'{src_cwd};' \
|
||||||
f'{os.path.join(self._env.working_directory, self._build_settings.source_path)}'
|
f'{os.path.join(self._env.working_directory, self._build_settings.source_path)}'
|
||||||
else:
|
else:
|
||||||
self._env_vars['PYTHONPATH'] = f'{self._env.working_directory}:' \
|
self._env_vars['PYTHONPATH'] = f'{src_cwd}:' \
|
||||||
f'{os.path.join(self._env.working_directory, self._build_settings.source_path)}'
|
f'{os.path.join(self._env.working_directory, self._build_settings.source_path)}'
|
||||||
|
|
||||||
Console.set_foreground_color(ForegroundColorEnum.green)
|
Console.set_foreground_color(ForegroundColorEnum.green)
|
||||||
Console.write_line('Read successfully')
|
Console.write_line('Read successfully')
|
||||||
@@ -86,6 +87,8 @@ class LiveServerThread(threading.Thread):
|
|||||||
Console.write_line(f'Started at {now.strftime("%Y-%m-%d %H:%M:%S")}\n\n')
|
Console.write_line(f'Started at {now.strftime("%Y-%m-%d %H:%M:%S")}\n\n')
|
||||||
Console.set_foreground_color(ForegroundColorEnum.default)
|
Console.set_foreground_color(ForegroundColorEnum.default)
|
||||||
|
|
||||||
os.chdir(self._env.working_directory)
|
self._command = [self._executable, self._main]
|
||||||
self._command = [self._executable, self._main, ''.join(self._args)]
|
if len(self._args) > 0:
|
||||||
|
self._command.append(''.join(self._args))
|
||||||
|
|
||||||
subprocess.run(self._command, env=self._env_vars)
|
subprocess.run(self._command, env=self._env_vars)
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'cpl_cli.publish'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
@@ -24,4 +24,4 @@ from .publisher_abc import PublisherABC
|
|||||||
from .publisher_service import PublisherService
|
from .publisher_service import PublisherService
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -333,7 +333,7 @@ class PublisherService(PublisherABC):
|
|||||||
length = len(self._build_settings.main.split('.'))
|
length = len(self._build_settings.main.split('.'))
|
||||||
main_name = self._build_settings.main.split('.')[length - 1]
|
main_name = self._build_settings.main.split('.')[length - 1]
|
||||||
|
|
||||||
sys.path.insert(0, self._source_path)
|
sys.path.insert(0, os.path.join(self._source_path, '../'))
|
||||||
main_mod = __import__(self._build_settings.main)
|
main_mod = __import__(self._build_settings.main)
|
||||||
main = getattr(main_mod, main_name)
|
main = getattr(main_mod, main_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@@ -15,11 +15,11 @@ __title__ = 'cpl_cli.source_creator'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
__version__ = '2021.4.0.post1'
|
__version__ = '2021.10.5'
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
# imports:
|
# imports:
|
||||||
|
|
||||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
version_info = VersionInfo(major='2021', minor='4', micro='0.post1')
|
version_info = VersionInfo(major='2021', minor='10', micro='5')
|
||||||
|
@@ -43,7 +43,8 @@ class ConsoleBuilder:
|
|||||||
ws_dict = {
|
ws_dict = {
|
||||||
WorkspaceSettings.__name__: {
|
WorkspaceSettings.__name__: {
|
||||||
WorkspaceSettingsNameEnum.default_project.value: project_name,
|
WorkspaceSettingsNameEnum.default_project.value: project_name,
|
||||||
WorkspaceSettingsNameEnum.projects.value: projects
|
WorkspaceSettingsNameEnum.projects.value: projects,
|
||||||
|
WorkspaceSettingsNameEnum.scripts: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -43,7 +43,8 @@ class LibraryBuilder:
|
|||||||
ws_dict = {
|
ws_dict = {
|
||||||
WorkspaceSettings.__name__: {
|
WorkspaceSettings.__name__: {
|
||||||
WorkspaceSettingsNameEnum.default_project.value: project_name,
|
WorkspaceSettingsNameEnum.default_project.value: project_name,
|
||||||
WorkspaceSettingsNameEnum.projects.value: projects
|
WorkspaceSettingsNameEnum.projects.value: projects,
|
||||||
|
WorkspaceSettingsNameEnum.scripts: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from cpl.application.startup_abc import StartupABC
|
from cpl.application.startup_abc import StartupABC
|
||||||
from cpl.configuration.console_argument import ConsoleArgument
|
from cpl.configuration.console_argument import ConsoleArgument
|
||||||
@@ -7,6 +8,7 @@ from cpl.dependency_injection.service_collection_abc import ServiceCollectionABC
|
|||||||
from cpl.dependency_injection.service_provider_abc import ServiceProviderABC
|
from cpl.dependency_injection.service_provider_abc import ServiceProviderABC
|
||||||
from cpl_cli.command.add_service import AddService
|
from cpl_cli.command.add_service import AddService
|
||||||
from cpl_cli.command.build_service import BuildService
|
from cpl_cli.command.build_service import BuildService
|
||||||
|
from cpl_cli.command.custom_script_service import CustomScriptService
|
||||||
from cpl_cli.command.generate_service import GenerateService
|
from cpl_cli.command.generate_service import GenerateService
|
||||||
from cpl_cli.command.install_service import InstallService
|
from cpl_cli.command.install_service import InstallService
|
||||||
from cpl_cli.command.new_service import NewService
|
from cpl_cli.command.new_service import NewService
|
||||||
@@ -18,6 +20,7 @@ from cpl_cli.command.update_service import UpdateService
|
|||||||
from cpl_cli.command_handler_service import CommandHandler
|
from cpl_cli.command_handler_service import CommandHandler
|
||||||
from cpl_cli.command.help_service import HelpService
|
from cpl_cli.command.help_service import HelpService
|
||||||
from cpl_cli.command.version_service import VersionService
|
from cpl_cli.command.version_service import VersionService
|
||||||
|
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
|
||||||
from cpl_cli.error import Error
|
from cpl_cli.error import Error
|
||||||
from cpl_cli.live_server.live_server_service import LiveServerService
|
from cpl_cli.live_server.live_server_service import LiveServerService
|
||||||
from cpl_cli.publish.publisher_service import PublisherService
|
from cpl_cli.publish.publisher_service import PublisherService
|
||||||
@@ -72,6 +75,13 @@ class Startup(StartupABC):
|
|||||||
|
|
||||||
self._configuration.add_console_argument(ConsoleArgument('', '--help', ['-h', '-H'], ''))
|
self._configuration.add_console_argument(ConsoleArgument('', '--help', ['-h', '-H'], ''))
|
||||||
|
|
||||||
|
if os.path.isfile(os.path.join(self._env.working_directory, 'cpl-workspace.json')):
|
||||||
|
self._configuration.add_json_file('cpl-workspace.json', optional=True, output=False)
|
||||||
|
workspace: Optional[WorkspaceSettings] = self._configuration.get_configuration(WorkspaceSettings)
|
||||||
|
for script in workspace.scripts:
|
||||||
|
self._configuration.add_console_argument(
|
||||||
|
ConsoleArgument('', script, [], ' ', is_value_token_optional=True))
|
||||||
|
|
||||||
self._configuration.add_console_arguments(error=False)
|
self._configuration.add_console_arguments(error=False)
|
||||||
|
|
||||||
return self._configuration
|
return self._configuration
|
||||||
@@ -84,6 +94,7 @@ class Startup(StartupABC):
|
|||||||
|
|
||||||
self._services.add_transient(AddService)
|
self._services.add_transient(AddService)
|
||||||
self._services.add_transient(BuildService)
|
self._services.add_transient(BuildService)
|
||||||
|
self._services.add_transient(CustomScriptService)
|
||||||
self._services.add_transient(GenerateService)
|
self._services.add_transient(GenerateService)
|
||||||
self._services.add_transient(HelpService)
|
self._services.add_transient(HelpService)
|
||||||
self._services.add_transient(InstallService)
|
self._services.add_transient(InstallService)
|
||||||
|
25
src/cpl_query/__init__.py
Normal file
25
src/cpl_query/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
sh_cpl-query sh-edraft Common Python library Query
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
sh-edraft Common Python library Python integrated Queries
|
||||||
|
|
||||||
|
:copyright: (c) 2020 - 2021 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'cpl_query'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
|
__version__ = '2021.10.0rc1'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='2021', minor='10', micro='0.rc1')
|
25
src/cpl_query/_extension/__init__.py
Normal file
25
src/cpl_query/_extension/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
sh_cpl-query sh-edraft Common Python library Query
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
sh-edraft Common Python library Python integrated Queries
|
||||||
|
|
||||||
|
:copyright: (c) 2020 - 2021 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'cpl_query._extension'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
|
__version__ = '2021.10.0rc1'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='2021', minor='10', micro='0.rc1')
|
115
src/cpl_query/_extension/iterable.py
Normal file
115
src/cpl_query/_extension/iterable.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
from typing import Optional, Callable, Union
|
||||||
|
|
||||||
|
from cpl_query.extension.ordered_iterable_abc import OrderedIterableABC
|
||||||
|
from .._query.all import all_query
|
||||||
|
from .._query.any import any_query
|
||||||
|
from .._query.avg import avg_query
|
||||||
|
from .._query.contains import contains_query
|
||||||
|
from .._query.count import count_query
|
||||||
|
from .._query.distinct import distinct_query
|
||||||
|
from .._query.element_at import element_at_query, element_at_or_default_query
|
||||||
|
from .._query.first_last import first_or_default_query, first_query, last_or_default_query, last_query
|
||||||
|
from .._query.for_each import for_each_query
|
||||||
|
from .._query.max_min import max_query, min_query
|
||||||
|
from .._query.order_by import order_by_query, order_by_descending_query
|
||||||
|
from .._query.reverse import reverse_query
|
||||||
|
from .._query.single import single_query, single_or_default_query
|
||||||
|
from .._query.skip_take import skip_query, skip_last_query, take_query, take_last_query
|
||||||
|
from .._query.sum import sum_query
|
||||||
|
from .._query.where import where_query
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
class Iterable(IterableABC):
|
||||||
|
|
||||||
|
def __init__(self, t: type = None, values: list = None):
|
||||||
|
IterableABC.__init__(self, t, values)
|
||||||
|
|
||||||
|
def any(self, func: Callable) -> bool:
|
||||||
|
return any_query(self, func)
|
||||||
|
|
||||||
|
def all(self, func: Callable) -> bool:
|
||||||
|
return all_query(self, func)
|
||||||
|
|
||||||
|
def average(self, func: Callable = None) -> Union[int, float, complex]:
|
||||||
|
return avg_query(self, func)
|
||||||
|
|
||||||
|
def contains(self, value: object) -> bool:
|
||||||
|
return contains_query(self, value)
|
||||||
|
|
||||||
|
def count(self, func: Callable = None) -> int:
|
||||||
|
return count_query(self, func)
|
||||||
|
|
||||||
|
def distinct(self, func: Callable) -> IterableABC:
|
||||||
|
return self.__to_self(distinct_query(self, func))
|
||||||
|
|
||||||
|
def element_at(self, index: int) -> any:
|
||||||
|
return element_at_query(self, index)
|
||||||
|
|
||||||
|
def element_at_or_default(self, index: int) -> Optional[any]:
|
||||||
|
return element_at_or_default_query(self, index)
|
||||||
|
|
||||||
|
def last(self) -> any:
|
||||||
|
return last_query(self)
|
||||||
|
|
||||||
|
def last_or_default(self) -> Optional[any]:
|
||||||
|
return last_or_default_query(self)
|
||||||
|
|
||||||
|
def first(self) -> any:
|
||||||
|
return first_query(self)
|
||||||
|
|
||||||
|
def first_or_default(self) -> Optional[any]:
|
||||||
|
return first_or_default_query(self)
|
||||||
|
|
||||||
|
def for_each(self, func: Callable):
|
||||||
|
for_each_query(self, func)
|
||||||
|
|
||||||
|
def max(self, func: Callable = None) -> Union[int, float, complex]:
|
||||||
|
return max_query(self, func)
|
||||||
|
|
||||||
|
def min(self, func: Callable = None) -> Union[int, float, complex]:
|
||||||
|
return min_query(self, func)
|
||||||
|
|
||||||
|
def order_by(self, func: Callable) -> OrderedIterableABC:
|
||||||
|
res = order_by_query(self, func)
|
||||||
|
from cpl_query._extension.ordered_iterable import OrderedIterable
|
||||||
|
res.__class__ = OrderedIterable
|
||||||
|
return res
|
||||||
|
|
||||||
|
def order_by_descending(self, func: Callable) -> OrderedIterableABC:
|
||||||
|
res = order_by_descending_query(self, func)
|
||||||
|
from cpl_query._extension.ordered_iterable import OrderedIterable
|
||||||
|
res.__class__ = OrderedIterable
|
||||||
|
return res
|
||||||
|
|
||||||
|
def reverse(self) -> IterableABC:
|
||||||
|
return reverse_query(self)
|
||||||
|
|
||||||
|
def single(self) -> any:
|
||||||
|
return single_query(self)
|
||||||
|
|
||||||
|
def single_or_default(self) -> Optional[any]:
|
||||||
|
return single_or_default_query(self)
|
||||||
|
|
||||||
|
def skip(self, index: int) -> IterableABC:
|
||||||
|
return self.__to_self(skip_query(self, index))
|
||||||
|
|
||||||
|
def skip_last(self, index: int) -> IterableABC:
|
||||||
|
return self.__to_self(skip_last_query(self, index))
|
||||||
|
|
||||||
|
def sum(self, func: Callable = None) -> Union[int, float, complex]:
|
||||||
|
return sum_query(self, func)
|
||||||
|
|
||||||
|
def take(self, index: int) -> IterableABC:
|
||||||
|
return self.__to_self(take_query(self, index))
|
||||||
|
|
||||||
|
def take_last(self, index: int) -> IterableABC:
|
||||||
|
return self.__to_self(take_last_query(self, index))
|
||||||
|
|
||||||
|
def where(self, func: Callable) -> IterableABC:
|
||||||
|
return self.__to_self(where_query(self, func))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def __to_self(obj: IterableABC) -> IterableABC:
|
||||||
|
obj.__class__ = Iterable
|
||||||
|
return obj
|
20
src/cpl_query/_extension/ordered_iterable.py
Normal file
20
src/cpl_query/_extension/ordered_iterable.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from .iterable import Iterable
|
||||||
|
from .._query.order_by import then_by_query, then_by_descending_query
|
||||||
|
from cpl_query.extension.ordered_iterable_abc import OrderedIterableABC
|
||||||
|
|
||||||
|
|
||||||
|
class OrderedIterable(Iterable, OrderedIterableABC):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
Iterable.__init__(self)
|
||||||
|
OrderedIterableABC.__init__(self)
|
||||||
|
|
||||||
|
def then_by(self, _func: Callable) -> OrderedIterableABC:
|
||||||
|
self._funcs.append(_func)
|
||||||
|
return then_by_query(self, lambda *args: [f(*args) for f in self._funcs])
|
||||||
|
|
||||||
|
def then_by_descending(self, _func: Callable) -> OrderedIterableABC:
|
||||||
|
self._funcs.append(_func)
|
||||||
|
return then_by_descending_query(self, lambda *args: [f(*args) for f in self._funcs])
|
2
src/cpl_query/_helper.py
Normal file
2
src/cpl_query/_helper.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
def is_number(t: type) -> bool:
|
||||||
|
return issubclass(t, int) or issubclass(t, float) or issubclass(t, complex)
|
25
src/cpl_query/_query/__init__.py
Normal file
25
src/cpl_query/_query/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
sh_cpl-query sh-edraft Common Python library Query
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
sh-edraft Common Python library Python integrated Queries
|
||||||
|
|
||||||
|
:copyright: (c) 2020 - 2021 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'cpl_query._query'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
|
__version__ = '2021.10.0rc1'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='2021', minor='10', micro='0.rc1')
|
16
src/cpl_query/_query/all.py
Normal file
16
src/cpl_query/_query/all.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query._query.where import where_query
|
||||||
|
from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def all_query(_list: IterableABC, _func: Callable) -> bool:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
result = where_query(_list, _func)
|
||||||
|
return len(result) == len(_list)
|
16
src/cpl_query/_query/any.py
Normal file
16
src/cpl_query/_query/any.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query._query.where import where_query
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def any_query(_list: IterableABC, _func: Callable) -> bool:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
result = where_query(_list, _func)
|
||||||
|
return len(result) > 0
|
27
src/cpl_query/_query/avg.py
Normal file
27
src/cpl_query/_query/avg.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
from typing import Callable, Union
|
||||||
|
|
||||||
|
from cpl_query._helper import is_number
|
||||||
|
from cpl_query.exceptions import InvalidTypeException, WrongTypeException, ExceptionArgument, ArgumentNoneException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def avg_query(_list: IterableABC, _func: Callable) -> Union[int, float, complex]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None and not is_number(_list.type):
|
||||||
|
raise InvalidTypeException()
|
||||||
|
|
||||||
|
average = 0
|
||||||
|
count = len(_list)
|
||||||
|
|
||||||
|
for element in _list:
|
||||||
|
if _func is not None:
|
||||||
|
value = _func(element)
|
||||||
|
|
||||||
|
else:
|
||||||
|
value = element
|
||||||
|
|
||||||
|
average += value
|
||||||
|
|
||||||
|
return average / count
|
12
src/cpl_query/_query/contains.py
Normal file
12
src/cpl_query/_query/contains.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def contains_query(_list: IterableABC, _value: object) -> bool:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _value is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.value)
|
||||||
|
|
||||||
|
return _value in _list
|
15
src/cpl_query/_query/count.py
Normal file
15
src/cpl_query/_query/count.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query._query.where import where_query
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def count_query(_list: IterableABC, _func: Callable = None) -> int:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
return len(_list)
|
||||||
|
|
||||||
|
return len(where_query(_list, _func))
|
24
src/cpl_query/_query/distinct.py
Normal file
24
src/cpl_query/_query/distinct.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def distinct_query(_list: IterableABC, _func: Callable) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
known_values = []
|
||||||
|
for element in _list:
|
||||||
|
value = _func(element)
|
||||||
|
if value in known_values:
|
||||||
|
continue
|
||||||
|
|
||||||
|
known_values.append(value)
|
||||||
|
result.append(element)
|
||||||
|
|
||||||
|
return result
|
25
src/cpl_query/_query/element_at.py
Normal file
25
src/cpl_query/_query/element_at.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def element_at_query(_list: IterableABC, _index: int) -> any:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _index is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
|
return _list[_index]
|
||||||
|
|
||||||
|
|
||||||
|
def element_at_or_default_query(_list: IterableABC, _index: int) -> any:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _index is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
|
try:
|
||||||
|
return _list[_index]
|
||||||
|
except IndexError:
|
||||||
|
return None
|
44
src/cpl_query/_query/first_last.py
Normal file
44
src/cpl_query/_query/first_last.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument, IndexOutOfRangeException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def first_query(_list: IterableABC) -> any:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if len(_list) == 0:
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
|
||||||
|
return _list[0]
|
||||||
|
|
||||||
|
|
||||||
|
def first_or_default_query(_list: IterableABC) -> Optional[any]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if len(_list) == 0:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return _list[0]
|
||||||
|
|
||||||
|
|
||||||
|
def last_query(_list: IterableABC) -> any:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if len(_list) == 0:
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
|
||||||
|
return _list[len(_list) - 1]
|
||||||
|
|
||||||
|
|
||||||
|
def last_or_default_query(_list: IterableABC) -> Optional[any]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if len(_list) == 0:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return _list[len(_list) - 1]
|
15
src/cpl_query/_query/for_each.py
Normal file
15
src/cpl_query/_query/for_each.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def for_each_query(_list: IterableABC, _func: Callable):
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
for element in _list:
|
||||||
|
_func(element)
|
51
src/cpl_query/_query/max_min.py
Normal file
51
src/cpl_query/_query/max_min.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
from collections import Callable
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
from cpl_query._helper import is_number
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument, InvalidTypeException, WrongTypeException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def max_query(_list: IterableABC, _func: Callable) -> Union[int, float, complex]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None and not is_number(_list.type):
|
||||||
|
raise InvalidTypeException()
|
||||||
|
|
||||||
|
max_value = 0
|
||||||
|
for element in _list:
|
||||||
|
if _func is not None:
|
||||||
|
value = _func(element)
|
||||||
|
else:
|
||||||
|
value = element
|
||||||
|
|
||||||
|
if value > max_value:
|
||||||
|
max_value = value
|
||||||
|
|
||||||
|
return max_value
|
||||||
|
|
||||||
|
|
||||||
|
def min_query(_list: IterableABC, _func: Callable) -> Union[int, float, complex]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None and not is_number(_list.type):
|
||||||
|
raise InvalidTypeException()
|
||||||
|
|
||||||
|
min_value = 0
|
||||||
|
is_first = True
|
||||||
|
for element in _list:
|
||||||
|
if _func is not None:
|
||||||
|
value = _func(element)
|
||||||
|
else:
|
||||||
|
value = element
|
||||||
|
|
||||||
|
if is_first:
|
||||||
|
min_value = value
|
||||||
|
is_first = False
|
||||||
|
|
||||||
|
if value < min_value:
|
||||||
|
min_value = value
|
||||||
|
|
||||||
|
return min_value
|
47
src/cpl_query/_query/order_by.py
Normal file
47
src/cpl_query/_query/order_by.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
from cpl_query.extension.ordered_iterable_abc import OrderedIterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def order_by_query(_list: IterableABC, _func: Callable) -> OrderedIterableABC:
|
||||||
|
result = OrderedIterableABC(_func)
|
||||||
|
_list.sort(key=_func)
|
||||||
|
result.extend(_list)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def order_by_descending_query(_list: IterableABC, _func: Callable) -> OrderedIterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
result = OrderedIterableABC(_func)
|
||||||
|
_list.sort(key=_func, reverse=True)
|
||||||
|
result.extend(_list)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def then_by_query(_list: OrderedIterableABC, _func: Callable) -> OrderedIterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
_list.sort(key=_func)
|
||||||
|
return _list
|
||||||
|
|
||||||
|
|
||||||
|
def then_by_descending_query(_list: OrderedIterableABC, _func: Callable) -> OrderedIterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
_list.sort(key=_func, reverse=True)
|
||||||
|
return _list
|
15
src/cpl_query/_query/reverse.py
Normal file
15
src/cpl_query/_query/reverse.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def reverse_query(_list: IterableABC) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
_copied_list = _list.to_list()
|
||||||
|
_copied_list.reverse()
|
||||||
|
for element in _copied_list:
|
||||||
|
result.append(element)
|
||||||
|
|
||||||
|
return result
|
28
src/cpl_query/_query/single.py
Normal file
28
src/cpl_query/_query/single.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def single_query(_list: IterableABC) -> any:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if len(_list) > 1:
|
||||||
|
raise Exception('Found more than one element')
|
||||||
|
elif len(_list) == 0:
|
||||||
|
raise Exception('Found no element')
|
||||||
|
|
||||||
|
return _list[0]
|
||||||
|
|
||||||
|
|
||||||
|
def single_or_default_query(_list: IterableABC) -> Optional[any]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if len(_list) > 1:
|
||||||
|
raise Exception('Index out of range')
|
||||||
|
elif len(_list) == 0:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return _list[0]
|
66
src/cpl_query/_query/skip_take.py
Normal file
66
src/cpl_query/_query/skip_take.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument, IndexOutOfRangeException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def skip_query(_list: IterableABC, _index: int) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _index is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
|
if _index >= len(_list):
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
result.extend(_list[_index:])
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def skip_last_query(_list: IterableABC, _index: int) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _index is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
|
index = len(_list) - _index
|
||||||
|
|
||||||
|
if index >= len(_list) or index < 0:
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
result.extend(_list[:index])
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def take_query(_list: IterableABC, _index: int) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _index is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
|
if _index >= len(_list):
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
result.extend(_list[:_index])
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def take_last_query(_list: IterableABC, _index: int) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _index is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.index)
|
||||||
|
|
||||||
|
index = len(_list) - _index
|
||||||
|
|
||||||
|
if index >= len(_list) or index < 0:
|
||||||
|
raise IndexOutOfRangeException()
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
result.extend(_list[index:])
|
||||||
|
return result
|
25
src/cpl_query/_query/sum.py
Normal file
25
src/cpl_query/_query/sum.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
from collections import Callable
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
from cpl_query._helper import is_number
|
||||||
|
from cpl_query.exceptions import ExceptionArgument, ArgumentNoneException, InvalidTypeException
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def sum_query(_list: IterableABC, _func: Callable) -> Union[int, float, complex]:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None and not is_number(_list.type):
|
||||||
|
raise InvalidTypeException()
|
||||||
|
|
||||||
|
result = 0
|
||||||
|
for element in _list:
|
||||||
|
if _func is not None:
|
||||||
|
value = _func(element)
|
||||||
|
else:
|
||||||
|
value = element
|
||||||
|
|
||||||
|
result += value
|
||||||
|
|
||||||
|
return result
|
19
src/cpl_query/_query/where.py
Normal file
19
src/cpl_query/_query/where.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query.exceptions import ArgumentNoneException, ExceptionArgument
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
def where_query(_list: IterableABC, _func: Callable) -> IterableABC:
|
||||||
|
if _list is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.list)
|
||||||
|
|
||||||
|
if _func is None:
|
||||||
|
raise ArgumentNoneException(ExceptionArgument.func)
|
||||||
|
|
||||||
|
result = IterableABC()
|
||||||
|
for element in _list:
|
||||||
|
if _func(element):
|
||||||
|
result.append(element)
|
||||||
|
|
||||||
|
return result
|
41
src/cpl_query/cpl_query.json
Normal file
41
src/cpl_query/cpl_query.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"ProjectSettings": {
|
||||||
|
"Name": "sh_cpl-query",
|
||||||
|
"Version": {
|
||||||
|
"Major": "2021",
|
||||||
|
"Minor": "10",
|
||||||
|
"Micro": "0.rc1"
|
||||||
|
},
|
||||||
|
"Author": "Sven Heidemann",
|
||||||
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
"Description": "sh-edraft Common Python library Query",
|
||||||
|
"LongDescription": "sh-edraft Common Python library Python integrated Queries",
|
||||||
|
"URL": "https://www.sh-edraft.de",
|
||||||
|
"CopyrightDate": "2020 - 2021",
|
||||||
|
"CopyrightName": "sh-edraft.de",
|
||||||
|
"LicenseName": "MIT",
|
||||||
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
|
"Dependencies": [
|
||||||
|
"sh_cpl>=2021.4.0.post1"
|
||||||
|
],
|
||||||
|
"PythonVersion": ">=3.9.2",
|
||||||
|
"PythonPath": {},
|
||||||
|
"Classifiers": []
|
||||||
|
},
|
||||||
|
"BuildSettings": {
|
||||||
|
"ProjectType": "library",
|
||||||
|
"SourcePath": "",
|
||||||
|
"OutputPath": "../../dist",
|
||||||
|
"Main": "",
|
||||||
|
"EntryPoint": "",
|
||||||
|
"IncludePackageData": true,
|
||||||
|
"Included": [],
|
||||||
|
"Excluded": [
|
||||||
|
"*/__pycache__",
|
||||||
|
"*/logs",
|
||||||
|
"*/tests"
|
||||||
|
],
|
||||||
|
"PackageData": {},
|
||||||
|
"ProjectReferences": []
|
||||||
|
}
|
||||||
|
}
|
31
src/cpl_query/exceptions.py
Normal file
31
src/cpl_query/exceptions.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
# models
|
||||||
|
class ExceptionArgument(Enum):
|
||||||
|
list = 'list'
|
||||||
|
func = 'func'
|
||||||
|
type = 'type'
|
||||||
|
value = 'value'
|
||||||
|
index = 'index'
|
||||||
|
|
||||||
|
|
||||||
|
# exceptions
|
||||||
|
class ArgumentNoneException(Exception):
|
||||||
|
|
||||||
|
def __init__(self, arg: ExceptionArgument):
|
||||||
|
Exception.__init__(self, f'argument {arg} is None')
|
||||||
|
|
||||||
|
|
||||||
|
class IndexOutOfRangeException(Exception):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
Exception.__init__(self, f'List index out of range')
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidTypeException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WrongTypeException(Exception):
|
||||||
|
pass
|
25
src/cpl_query/extension/__init__.py
Normal file
25
src/cpl_query/extension/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
sh_cpl-query sh-edraft Common Python library Query
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
sh-edraft Common Python library Python integrated Queries
|
||||||
|
|
||||||
|
:copyright: (c) 2020 - 2021 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'cpl_query.extension'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2020 - 2021 sh-edraft.de'
|
||||||
|
__version__ = '2021.10.0rc1'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='2021', minor='10', micro='0.rc1')
|
115
src/cpl_query/extension/iterable_abc.py
Normal file
115
src/cpl_query/extension/iterable_abc.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from typing import Optional, Callable, Union, Iterable
|
||||||
|
|
||||||
|
|
||||||
|
class IterableABC(ABC, list):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def __init__(self, t: type = None, values: list = None):
|
||||||
|
list.__init__(self)
|
||||||
|
|
||||||
|
if t == any:
|
||||||
|
t = None
|
||||||
|
self._type = t
|
||||||
|
|
||||||
|
if values is not None:
|
||||||
|
for value in values:
|
||||||
|
self.append(value)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def type(self) -> type:
|
||||||
|
return self._type
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def any(self, func: Callable) -> bool: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def all(self, func: Callable) -> bool: pass
|
||||||
|
|
||||||
|
def append(self, __object: object) -> None:
|
||||||
|
if self._type is not None and type(__object) != self._type and not isinstance(type(__object), self._type):
|
||||||
|
raise Exception(f'Unexpected type: {type(__object)}')
|
||||||
|
|
||||||
|
if len(self) == 0 and self._type is None:
|
||||||
|
self._type = type(__object)
|
||||||
|
|
||||||
|
super().append(__object)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def average(self, func: Callable = None) -> Union[int, float, complex]: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def contains(self, value: object) -> bool: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def count(self, func: Callable) -> int: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def distinct(self, func: Callable) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def element_at(self, index: int) -> any: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def element_at_or_default(self, index: int) -> Optional[any]: pass
|
||||||
|
|
||||||
|
def extend(self, __iterable: Iterable) -> None:
|
||||||
|
for value in __iterable:
|
||||||
|
self.append(value)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def last(self) -> any: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def last_or_default(self) -> any: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def first(self) -> any: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def first_or_default(self) -> any: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def for_each(self, func: Callable) -> Union[int, float, complex]: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def max(self, func: Callable = None) -> Union[int, float, complex]: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def min(self, func: Callable = None) -> Union[int, float, complex]: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def order_by(self, func: Callable) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def order_by_descending(self, func: Callable) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def reverse(self) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def single(self) -> any: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def single_or_default(self) -> Optional[any]: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def skip(self, index: int) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def skip_last(self, index: int) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def sum(self, func: Callable = None) -> Union[int, float, complex]: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def take(self, index: int) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def take_last(self, index: int) -> 'IterableABC': pass
|
||||||
|
|
||||||
|
def to_list(self) -> list:
|
||||||
|
return list(self)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def where(self, func: Callable) -> 'IterableABC': pass
|
7
src/cpl_query/extension/list.py
Normal file
7
src/cpl_query/extension/list.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
from .._extension.iterable import Iterable
|
||||||
|
|
||||||
|
|
||||||
|
class List(Iterable):
|
||||||
|
|
||||||
|
def __init__(self, t: type = None, values: list = None):
|
||||||
|
Iterable.__init__(self, t, values)
|
20
src/cpl_query/extension/ordered_iterable_abc.py
Normal file
20
src/cpl_query/extension/ordered_iterable_abc.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
from abc import abstractmethod
|
||||||
|
from collections import Callable
|
||||||
|
|
||||||
|
from cpl_query.extension.iterable_abc import IterableABC
|
||||||
|
|
||||||
|
|
||||||
|
class OrderedIterableABC(IterableABC):
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def __init__(self, _func: Callable = None):
|
||||||
|
IterableABC.__init__(self)
|
||||||
|
self._funcs: list[Callable] = []
|
||||||
|
if _func is not None:
|
||||||
|
self._funcs.append(_func)
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def then_by(self, func: Callable) -> 'OrderedIterableABC': pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def then_by_descending(self, func: Callable) -> 'OrderedIterableABC': pass
|
21
src/cpl_query/tests/iterable_test.py
Normal file
21
src/cpl_query/tests/iterable_test.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
from cpl_query.extension.list import List
|
||||||
|
|
||||||
|
|
||||||
|
class IterableTest(unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self) -> None:
|
||||||
|
self._list = List(int)
|
||||||
|
|
||||||
|
def _clear(self):
|
||||||
|
self._list.clear()
|
||||||
|
self.assertEqual(self._list, [])
|
||||||
|
|
||||||
|
def test_append(self):
|
||||||
|
self._list.append(1)
|
||||||
|
self._list.append(2)
|
||||||
|
self._list.append(3)
|
||||||
|
|
||||||
|
self.assertEqual(self._list, [1, 2, 3])
|
||||||
|
self.assertRaises(Exception, lambda v: self._list.append(v), '3')
|
12
src/cpl_query/tests/models.py
Normal file
12
src/cpl_query/tests/models.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
class User:
|
||||||
|
|
||||||
|
def __init__(self, name, address):
|
||||||
|
self.name = name
|
||||||
|
self.address = address
|
||||||
|
|
||||||
|
|
||||||
|
class Address:
|
||||||
|
|
||||||
|
def __init__(self, street, nr):
|
||||||
|
self.street = street
|
||||||
|
self.nr = nr
|
314
src/cpl_query/tests/query_test.py
Normal file
314
src/cpl_query/tests/query_test.py
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
import string
|
||||||
|
import unittest
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
from cpl.utils import String
|
||||||
|
from cpl_query.exceptions import InvalidTypeException, ArgumentNoneException
|
||||||
|
from cpl_query.extension.list import List
|
||||||
|
from cpl_query.tests.models import User, Address
|
||||||
|
|
||||||
|
|
||||||
|
class QueryTest(unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self) -> None:
|
||||||
|
self._tests = List(User)
|
||||||
|
self._t_user = User(
|
||||||
|
'Test user',
|
||||||
|
Address(
|
||||||
|
'teststr.',
|
||||||
|
15
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self._generate_test_data()
|
||||||
|
|
||||||
|
def _generate_test_data(self):
|
||||||
|
for i in range(0, 100):
|
||||||
|
user = User(
|
||||||
|
String.random_string(string.ascii_letters, 8).lower(),
|
||||||
|
Address(
|
||||||
|
String.random_string(string.ascii_letters, 10).lower(),
|
||||||
|
randint(1, 10)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self._tests.append(user)
|
||||||
|
|
||||||
|
self._tests.append(self._t_user)
|
||||||
|
|
||||||
|
def test_any(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 10:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.any(lambda u: u.address.nr == 10)
|
||||||
|
n_res = self._tests.any(lambda u: u.address.nr == 100)
|
||||||
|
|
||||||
|
self.assertTrue(res)
|
||||||
|
self.assertFalse(n_res)
|
||||||
|
|
||||||
|
def test_all(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 10:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.all(lambda u: u.address is not None)
|
||||||
|
n_res = self._tests.all(lambda u: u.address.nr == 100)
|
||||||
|
|
||||||
|
self.assertTrue(res)
|
||||||
|
self.assertFalse(n_res)
|
||||||
|
|
||||||
|
def test_avg(self):
|
||||||
|
avg = 0
|
||||||
|
for user in self._tests:
|
||||||
|
avg += user.address.nr
|
||||||
|
|
||||||
|
avg = avg / len(self._tests)
|
||||||
|
res = self._tests.average(lambda u: u.address.nr)
|
||||||
|
|
||||||
|
self.assertEqual(avg, res)
|
||||||
|
|
||||||
|
def invalid():
|
||||||
|
tests = List(str, ['hello', 'world'])
|
||||||
|
e_res = tests.average()
|
||||||
|
|
||||||
|
self.assertRaises(InvalidTypeException, invalid)
|
||||||
|
|
||||||
|
tests = List(int, list(range(0, 100)))
|
||||||
|
self.assertEqual(sum(tests) / len(tests), tests.average())
|
||||||
|
|
||||||
|
def wrong2():
|
||||||
|
tests2 = List(int, values=list(range(0, 100)))
|
||||||
|
e_res = tests2.average(lambda u: u.address.nr)
|
||||||
|
|
||||||
|
self.assertRaises(AttributeError, wrong2)
|
||||||
|
|
||||||
|
def test_contains(self):
|
||||||
|
self.assertTrue(self._tests.contains(self._t_user))
|
||||||
|
self.assertFalse(self._tests.contains(User("Test", None)))
|
||||||
|
|
||||||
|
def test_count(self):
|
||||||
|
self.assertEqual(len(self._tests), self._tests.count())
|
||||||
|
self.assertEqual(1, self._tests.count(lambda u: u == self._t_user))
|
||||||
|
|
||||||
|
def test_distinct(self):
|
||||||
|
res = self._tests.distinct(lambda u: u.address.nr).where(lambda u: u.address.nr == 5)
|
||||||
|
self.assertEqual(1, len(res))
|
||||||
|
|
||||||
|
def test_element_at(self):
|
||||||
|
index = randint(0, len(self._tests) - 1)
|
||||||
|
self.assertEqual(self._tests[index], self._tests.element_at(index))
|
||||||
|
|
||||||
|
def test_element_at_or_default(self):
|
||||||
|
index = randint(0, len(self._tests) - 1)
|
||||||
|
self.assertEqual(self._tests[index], self._tests.element_at_or_default(index))
|
||||||
|
self.assertIsNone(self._tests.element_at_or_default(len(self._tests)))
|
||||||
|
|
||||||
|
def test_last(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 10:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == 10)
|
||||||
|
s_res = self._tests.where(lambda u: u.address.nr == 10).last()
|
||||||
|
|
||||||
|
self.assertEqual(len(res), len(results))
|
||||||
|
self.assertEqual(res[len(res) - 1], s_res)
|
||||||
|
|
||||||
|
def test_last_or_default(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 10:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == 10)
|
||||||
|
s_res = self._tests.where(lambda u: u.address.nr == 10).last_or_default()
|
||||||
|
sn_res = self._tests.where(lambda u: u.address.nr == 11).last_or_default()
|
||||||
|
|
||||||
|
self.assertEqual(len(res), len(results))
|
||||||
|
self.assertEqual(res[len(res) - 1], s_res)
|
||||||
|
self.assertIsNone(sn_res)
|
||||||
|
|
||||||
|
def test_first(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 10:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == 10)
|
||||||
|
s_res = self._tests.where(lambda u: u.address.nr == 10).first()
|
||||||
|
|
||||||
|
self.assertEqual(len(res), len(results))
|
||||||
|
self.assertEqual(res[0], s_res)
|
||||||
|
|
||||||
|
def test_first_or_default(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 10:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == 10)
|
||||||
|
s_res = self._tests.where(lambda u: u.address.nr == 10).first_or_default()
|
||||||
|
sn_res = self._tests.where(lambda u: u.address.nr == 11).first_or_default()
|
||||||
|
|
||||||
|
self.assertEqual(len(res), len(results))
|
||||||
|
self.assertEqual(res[0], s_res)
|
||||||
|
self.assertIsNone(sn_res)
|
||||||
|
|
||||||
|
def test_for_each(self):
|
||||||
|
users = []
|
||||||
|
self._tests.for_each(lambda user: (
|
||||||
|
users.append(user)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(len(users), len(self._tests))
|
||||||
|
|
||||||
|
def test_max(self):
|
||||||
|
res = self._tests.max(lambda u: u.address.nr)
|
||||||
|
self.assertEqual(self._t_user.address.nr, res)
|
||||||
|
|
||||||
|
tests = List(values=list(range(0, 100)))
|
||||||
|
self.assertEqual(99, tests.max())
|
||||||
|
|
||||||
|
def invalid():
|
||||||
|
tests = List(str, ['hello', 'world'])
|
||||||
|
e_res = tests.average()
|
||||||
|
|
||||||
|
self.assertRaises(InvalidTypeException, invalid)
|
||||||
|
|
||||||
|
def test_min(self):
|
||||||
|
res = self._tests.min(lambda u: u.address.nr)
|
||||||
|
self.assertEqual(1, res)
|
||||||
|
|
||||||
|
tests = List(values=list(range(0, 100)))
|
||||||
|
self.assertEqual(0, tests.min())
|
||||||
|
|
||||||
|
def invalid():
|
||||||
|
tests = List(str, ['hello', 'world'])
|
||||||
|
e_res = tests.average()
|
||||||
|
|
||||||
|
self.assertRaises(InvalidTypeException, invalid)
|
||||||
|
|
||||||
|
def test_order_by(self):
|
||||||
|
res = self._tests.order_by(lambda user: user.address.street)
|
||||||
|
res2 = self._tests.order_by(lambda user: user.address.nr)
|
||||||
|
s_res = self._tests
|
||||||
|
s_res.sort(key=lambda user: user.address.street)
|
||||||
|
|
||||||
|
self.assertEqual(res, s_res)
|
||||||
|
s_res.sort(key=lambda user: user.address.nr)
|
||||||
|
self.assertEqual(res2, s_res)
|
||||||
|
|
||||||
|
self.assertEqual(self._t_user, res.where(lambda u: u.address.nr == self._t_user.address.nr).single())
|
||||||
|
|
||||||
|
def test_order_by_descending(self):
|
||||||
|
res = self._tests.order_by_descending(lambda user: user.address.street)
|
||||||
|
res2 = self._tests.order_by_descending(lambda user: user.address.nr)
|
||||||
|
s_res = self._tests
|
||||||
|
s_res.sort(key=lambda user: user.address.street, reverse=True)
|
||||||
|
|
||||||
|
self.assertEqual(res, s_res)
|
||||||
|
s_res.sort(key=lambda user: user.address.nr, reverse=True)
|
||||||
|
self.assertEqual(res2, s_res)
|
||||||
|
|
||||||
|
def test_then_by(self):
|
||||||
|
res = self._tests.order_by(lambda user: user.address.street[0]).then_by(lambda user: user.address.nr)
|
||||||
|
|
||||||
|
s_res = self._tests
|
||||||
|
s_res.sort(key=lambda user: (user.address.street[0], user.address.nr))
|
||||||
|
|
||||||
|
self.assertEqual(res, s_res)
|
||||||
|
|
||||||
|
def test_then_by_descending(self):
|
||||||
|
res = self._tests.order_by_descending(lambda user: user.address.street[0]).then_by_descending(
|
||||||
|
lambda user: user.address.nr)
|
||||||
|
|
||||||
|
s_res = self._tests
|
||||||
|
s_res.sort(key=lambda user: (user.address.street[0], user.address.nr), reverse=True)
|
||||||
|
|
||||||
|
self.assertEqual(res, s_res)
|
||||||
|
|
||||||
|
def test_reverse(self):
|
||||||
|
res = self._tests.reverse()
|
||||||
|
l_res = self._tests.to_list()
|
||||||
|
l_res.reverse()
|
||||||
|
|
||||||
|
self.assertEqual(l_res, res)
|
||||||
|
|
||||||
|
def test_single(self):
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == self._t_user.address.nr)
|
||||||
|
s_res = self._tests.where(lambda u: u.address.nr == self._t_user.address.nr).single()
|
||||||
|
|
||||||
|
self.assertEqual(len(res), 1)
|
||||||
|
self.assertEqual(self._t_user, s_res)
|
||||||
|
|
||||||
|
def test_single_or_default(self):
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == self._t_user.address.nr)
|
||||||
|
s_res = self._tests.where(lambda u: u.address.nr == self._t_user.address.nr).single_or_default()
|
||||||
|
sn_res = self._tests.where(lambda u: u.address.nr == self._t_user.address.nr + 1).single_or_default()
|
||||||
|
|
||||||
|
self.assertEqual(len(res), 1)
|
||||||
|
self.assertEqual(self._t_user, s_res)
|
||||||
|
self.assertIsNone(sn_res)
|
||||||
|
|
||||||
|
def test_skip(self):
|
||||||
|
skipped = self._tests.skip(5)
|
||||||
|
|
||||||
|
self.assertEqual(len(self._tests) - 5, len(skipped))
|
||||||
|
self.assertEqual(self._tests[5:], skipped)
|
||||||
|
|
||||||
|
def test_skip_last(self):
|
||||||
|
skipped = self._tests.skip_last(5)
|
||||||
|
|
||||||
|
self.assertEqual(len(self._tests) - 5, len(skipped))
|
||||||
|
self.assertEqual(self._tests[:-5], skipped)
|
||||||
|
self.assertEqual(self._tests[:-5][len(self._tests[:-5]) - 1], skipped.last())
|
||||||
|
|
||||||
|
def test_sum(self):
|
||||||
|
res = self._tests.sum(lambda u: u.address.nr)
|
||||||
|
|
||||||
|
s_res = 0
|
||||||
|
for user in self._tests:
|
||||||
|
s_res += user.address.nr
|
||||||
|
|
||||||
|
self.assertEqual(s_res, res)
|
||||||
|
|
||||||
|
tests = List(values=list(range(0, 100)))
|
||||||
|
self.assertEqual(0, tests.min())
|
||||||
|
|
||||||
|
def invalid():
|
||||||
|
tests2 = List(str, ['hello', 'world'])
|
||||||
|
e_res = tests2.average()
|
||||||
|
|
||||||
|
self.assertRaises(InvalidTypeException, invalid)
|
||||||
|
|
||||||
|
def test_take(self):
|
||||||
|
skipped = self._tests.take(5)
|
||||||
|
|
||||||
|
self.assertEqual(5, len(skipped))
|
||||||
|
self.assertEqual(self._tests[:5], skipped)
|
||||||
|
|
||||||
|
def test_take_last(self):
|
||||||
|
skipped = self._tests.take_last(5)
|
||||||
|
|
||||||
|
self.assertEqual(5, len(skipped))
|
||||||
|
self.assertEqual(self._tests[-5:], skipped)
|
||||||
|
self.assertEqual(self._tests[len(self._tests) - 1], skipped.last())
|
||||||
|
|
||||||
|
def test_where(self):
|
||||||
|
results = []
|
||||||
|
for user in self._tests:
|
||||||
|
if user.address.nr == 5:
|
||||||
|
results.append(user)
|
||||||
|
|
||||||
|
res = self._tests.where(lambda u: u.address.nr == 5)
|
||||||
|
self.assertEqual(len(results), len(res))
|
||||||
|
|
||||||
|
def ex():
|
||||||
|
e_res = self._tests.where(None)
|
||||||
|
|
||||||
|
self.assertRaises(ArgumentNoneException, ex)
|
25
src/cpl_query/tests/tester.py
Normal file
25
src/cpl_query/tests/tester.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
from cpl_query.tests.iterable_test import IterableTest
|
||||||
|
from cpl_query.tests.query_test import QueryTest
|
||||||
|
|
||||||
|
|
||||||
|
class Tester:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._suite = unittest.TestSuite()
|
||||||
|
|
||||||
|
def create(self):
|
||||||
|
loader = unittest.TestLoader()
|
||||||
|
self._suite.addTests(loader.loadTestsFromTestCase(QueryTest))
|
||||||
|
self._suite.addTests(loader.loadTestsFromTestCase(IterableTest))
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
runner = unittest.TextTestRunner()
|
||||||
|
runner.run(self._suite)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
tester = Tester()
|
||||||
|
tester.create()
|
||||||
|
tester.start()
|
@@ -16,7 +16,7 @@
|
|||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"sh_cpl==2021.4.dev1"
|
"sh_cpl==2021.4.0.post2"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.8",
|
"PythonVersion": ">=3.8",
|
||||||
"PythonPath": {
|
"PythonPath": {
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
"*/logs",
|
"*/logs",
|
||||||
"*/tests"
|
"*/tests"
|
||||||
],
|
],
|
||||||
"PackageData": {}
|
"PackageData": {},
|
||||||
|
"ProjectReferences": []
|
||||||
}
|
}
|
||||||
}
|
}
|
42
src/tests/generated/simple-app/cpl.json
Normal file
42
src/tests/generated/simple-app/cpl.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"ProjectSettings": {
|
||||||
|
"Name": "simple-app",
|
||||||
|
"Version": {
|
||||||
|
"Major": "0",
|
||||||
|
"Minor": "0",
|
||||||
|
"Micro": "0"
|
||||||
|
},
|
||||||
|
"Author": "",
|
||||||
|
"AuthorEmail": "",
|
||||||
|
"Description": "",
|
||||||
|
"LongDescription": "",
|
||||||
|
"URL": "",
|
||||||
|
"CopyrightDate": "",
|
||||||
|
"CopyrightName": "",
|
||||||
|
"LicenseName": "",
|
||||||
|
"LicenseDescription": "",
|
||||||
|
"Dependencies": [
|
||||||
|
"sh_cpl==2021.4.2"
|
||||||
|
],
|
||||||
|
"PythonVersion": ">=3.9.2",
|
||||||
|
"PythonPath": {
|
||||||
|
"linux": ""
|
||||||
|
},
|
||||||
|
"Classifiers": []
|
||||||
|
},
|
||||||
|
"BuildSettings": {
|
||||||
|
"ProjectType": "console",
|
||||||
|
"SourcePath": "src",
|
||||||
|
"OutputPath": "dist",
|
||||||
|
"Main": "main",
|
||||||
|
"EntryPoint": "simple-app",
|
||||||
|
"IncludePackageData": false,
|
||||||
|
"Included": [],
|
||||||
|
"Excluded": [
|
||||||
|
"*/__pycache__",
|
||||||
|
"*/logs",
|
||||||
|
"*/tests"
|
||||||
|
],
|
||||||
|
"PackageData": {}
|
||||||
|
}
|
||||||
|
}
|
16
src/tests/generated/simple-app/src/application.py
Normal file
16
src/tests/generated/simple-app/src/application.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from cpl.application import ApplicationABC
|
||||||
|
from cpl.configuration import ConfigurationABC
|
||||||
|
from cpl.console import Console
|
||||||
|
from cpl.dependency_injection import ServiceProviderABC
|
||||||
|
|
||||||
|
|
||||||
|
class Application(ApplicationABC):
|
||||||
|
|
||||||
|
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
|
||||||
|
ApplicationABC.__init__(self, config, services)
|
||||||
|
|
||||||
|
def configure(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def main(self):
|
||||||
|
Console.write_line('Hello World')
|
12
src/tests/generated/simple-app/src/main.py
Normal file
12
src/tests/generated/simple-app/src/main.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from cpl.application import ApplicationBuilder
|
||||||
|
|
||||||
|
from application import Application
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
app_builder = ApplicationBuilder(Application)
|
||||||
|
app_builder.build().run()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
42
src/tests/generated/simple-console/cpl.json
Normal file
42
src/tests/generated/simple-console/cpl.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"ProjectSettings": {
|
||||||
|
"Name": "simple-console",
|
||||||
|
"Version": {
|
||||||
|
"Major": "0",
|
||||||
|
"Minor": "0",
|
||||||
|
"Micro": "0"
|
||||||
|
},
|
||||||
|
"Author": "",
|
||||||
|
"AuthorEmail": "",
|
||||||
|
"Description": "",
|
||||||
|
"LongDescription": "",
|
||||||
|
"URL": "",
|
||||||
|
"CopyrightDate": "",
|
||||||
|
"CopyrightName": "",
|
||||||
|
"LicenseName": "",
|
||||||
|
"LicenseDescription": "",
|
||||||
|
"Dependencies": [
|
||||||
|
"sh_cpl==2021.4.2"
|
||||||
|
],
|
||||||
|
"PythonVersion": ">=3.9.2",
|
||||||
|
"PythonPath": {
|
||||||
|
"linux": ""
|
||||||
|
},
|
||||||
|
"Classifiers": []
|
||||||
|
},
|
||||||
|
"BuildSettings": {
|
||||||
|
"ProjectType": "console",
|
||||||
|
"SourcePath": "src",
|
||||||
|
"OutputPath": "dist",
|
||||||
|
"Main": "main",
|
||||||
|
"EntryPoint": "simple-console",
|
||||||
|
"IncludePackageData": false,
|
||||||
|
"Included": [],
|
||||||
|
"Excluded": [
|
||||||
|
"*/__pycache__",
|
||||||
|
"*/logs",
|
||||||
|
"*/tests"
|
||||||
|
],
|
||||||
|
"PackageData": {}
|
||||||
|
}
|
||||||
|
}
|
9
src/tests/generated/simple-console/src/main.py
Normal file
9
src/tests/generated/simple-console/src/main.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from cpl.console import Console
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
Console.write_line('Hello World')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
42
src/tests/generated/simple-di/cpl.json
Normal file
42
src/tests/generated/simple-di/cpl.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"ProjectSettings": {
|
||||||
|
"Name": "simple-di",
|
||||||
|
"Version": {
|
||||||
|
"Major": "0",
|
||||||
|
"Minor": "0",
|
||||||
|
"Micro": "0"
|
||||||
|
},
|
||||||
|
"Author": "",
|
||||||
|
"AuthorEmail": "",
|
||||||
|
"Description": "",
|
||||||
|
"LongDescription": "",
|
||||||
|
"URL": "",
|
||||||
|
"CopyrightDate": "",
|
||||||
|
"CopyrightName": "",
|
||||||
|
"LicenseName": "",
|
||||||
|
"LicenseDescription": "",
|
||||||
|
"Dependencies": [
|
||||||
|
"sh_cpl==2021.4.2.dev1"
|
||||||
|
],
|
||||||
|
"PythonVersion": ">=3.9.2",
|
||||||
|
"PythonPath": {
|
||||||
|
"linux": ""
|
||||||
|
},
|
||||||
|
"Classifiers": []
|
||||||
|
},
|
||||||
|
"BuildSettings": {
|
||||||
|
"ProjectType": "console",
|
||||||
|
"SourcePath": "src",
|
||||||
|
"OutputPath": "dist",
|
||||||
|
"Main": "main",
|
||||||
|
"EntryPoint": "simple-di",
|
||||||
|
"IncludePackageData": false,
|
||||||
|
"Included": [],
|
||||||
|
"Excluded": [
|
||||||
|
"*/__pycache__",
|
||||||
|
"*/logs",
|
||||||
|
"*/tests"
|
||||||
|
],
|
||||||
|
"PackageData": {}
|
||||||
|
}
|
||||||
|
}
|
23
src/tests/generated/simple-di/src/main.py
Normal file
23
src/tests/generated/simple-di/src/main.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
from cpl.configuration import Configuration, ConfigurationABC
|
||||||
|
from cpl.console import Console
|
||||||
|
from cpl.dependency_injection import ServiceCollection, ServiceProviderABC
|
||||||
|
|
||||||
|
|
||||||
|
def configure_configuration() -> ConfigurationABC:
|
||||||
|
config = Configuration()
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
def configure_services(config: ConfigurationABC) -> ServiceProviderABC:
|
||||||
|
services = ServiceCollection(config)
|
||||||
|
return services.build_service_provider()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
config = configure_configuration()
|
||||||
|
provider = configure_services(config)
|
||||||
|
Console.write_line('Hello World')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
0
src/tests/generated/startup-app/LICENSE
Normal file
0
src/tests/generated/startup-app/LICENSE
Normal file
0
src/tests/generated/startup-app/README.md
Normal file
0
src/tests/generated/startup-app/README.md
Normal file
42
src/tests/generated/startup-app/cpl.json
Normal file
42
src/tests/generated/startup-app/cpl.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"ProjectSettings": {
|
||||||
|
"Name": "startup-app",
|
||||||
|
"Version": {
|
||||||
|
"Major": "0",
|
||||||
|
"Minor": "0",
|
||||||
|
"Micro": "0"
|
||||||
|
},
|
||||||
|
"Author": "",
|
||||||
|
"AuthorEmail": "",
|
||||||
|
"Description": "",
|
||||||
|
"LongDescription": "",
|
||||||
|
"URL": "",
|
||||||
|
"CopyrightDate": "",
|
||||||
|
"CopyrightName": "",
|
||||||
|
"LicenseName": "",
|
||||||
|
"LicenseDescription": "",
|
||||||
|
"Dependencies": [
|
||||||
|
"sh_cpl==2021.4.2"
|
||||||
|
],
|
||||||
|
"PythonVersion": ">=3.9.2",
|
||||||
|
"PythonPath": {
|
||||||
|
"linux": ""
|
||||||
|
},
|
||||||
|
"Classifiers": []
|
||||||
|
},
|
||||||
|
"BuildSettings": {
|
||||||
|
"ProjectType": "console",
|
||||||
|
"SourcePath": "src",
|
||||||
|
"OutputPath": "dist",
|
||||||
|
"Main": "main",
|
||||||
|
"EntryPoint": "startup-app",
|
||||||
|
"IncludePackageData": false,
|
||||||
|
"Included": [],
|
||||||
|
"Excluded": [
|
||||||
|
"*/__pycache__",
|
||||||
|
"*/logs",
|
||||||
|
"*/tests"
|
||||||
|
],
|
||||||
|
"PackageData": {}
|
||||||
|
}
|
||||||
|
}
|
16
src/tests/generated/startup-app/src/application.py
Normal file
16
src/tests/generated/startup-app/src/application.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
from cpl.application import ApplicationABC
|
||||||
|
from cpl.configuration import ConfigurationABC
|
||||||
|
from cpl.console import Console
|
||||||
|
from cpl.dependency_injection import ServiceProviderABC
|
||||||
|
|
||||||
|
|
||||||
|
class Application(ApplicationABC):
|
||||||
|
|
||||||
|
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
|
||||||
|
ApplicationABC.__init__(self, config, services)
|
||||||
|
|
||||||
|
def configure(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def main(self):
|
||||||
|
Console.write_line('Hello World')
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user