Compare commits

...

922 Commits

Author SHA1 Message Date
b6cf5962aa Merge pull request 'Removed tools & docs' (#197) from dev_cleanup into master
Reviewed-on: #197
2025-10-08 21:30:47 +02:00
d3084041a9 Removed tools & docs 2025-10-08 21:30:01 +02:00
c1e65bf0dc Set correct version 2024-07-25 17:56:25 +02:00
688381b106 Merge pull request 'py12' (#177) from py12 into master
Reviewed-on: sh-edraft.de/sh_cpl#177
2024-07-25 17:55:07 +02:00
c3e3367264 Removed bundle project 2024-07-25 17:54:24 +02:00
c3d51e29fc Set version 2024-07-25 17:34:24 +02:00
cae2e6d92e Hopefully fixed db errors 2024-01-13 14:26:36 +01:00
347418bdc5 Added ssl_disabled option 2023-12-06 17:56:13 +01:00
153fc8922e Fixed dc collection 2023-10-13 15:20:26 +02:00
cdbfaeb013 Merge pull request 'Updated deps' (#176) from 2023.10 into master
Reviewed-on: sh-edraft.de/sh_cpl#176
2023-10-13 15:01:06 +02:00
4062a6ebe4 Updated deps 2023-10-13 14:57:46 +02:00
46ef6b3938 Merge pull request '2023.10' (#175) from 2023.10 into master
Reviewed-on: sh-edraft.de/sh_cpl#175
2023-10-13 14:48:39 +02:00
c1b9c0fb4a Added R as return type 2023-10-12 21:20:36 +02:00
8ede2998fe Fixed configuration typing 2023-10-12 21:14:49 +02:00
41f974fe6e Fixed cpl-discord deps 2023-10-12 21:06:10 +02:00
e7af5ce322 Fixed cpl-query typing 2023-10-12 21:05:38 +02:00
7881294554 Fixed types 2023-10-12 20:55:24 +02:00
b3fd122fcd Build cpl-discord new version 2023-10-12 20:42:24 +02:00
1dd48899d7 Improved cpl-discords service loading for commands and events 2023-10-12 20:41:34 +02:00
f357e97ce5 Build and formatted new version 2023-10-12 20:16:16 +02:00
2d8ecd424a Switched mysql package 2023-10-12 20:11:14 +02:00
affbbc822d Removed handled vars from values in JP 2023-07-19 11:34:19 +02:00
43ea732c5f Fixed config loading 2023-07-19 11:28:33 +02:00
708918464f Improved config loading 2023-07-19 11:16:04 +02:00
ed2377c288 Updated discord.py 2023-06-13 16:22:54 +02:00
b819eb439c Fixed translaiton settings 2023-06-13 16:14:38 +02:00
b3ed7101fc Fixed update command 2023-06-13 15:56:46 +02:00
a3504af376 Fixed update command 2023-06-13 15:47:44 +02:00
81c2f1cba9 Fixed discord service config loading 2023-06-13 15:38:04 +02:00
bea5b22251 Fixed db settings default port 2023-06-13 15:08:04 +02:00
e04d0beb68 Fixed circular import from query package 2023-06-13 13:27:37 +02:00
08ba097aaa Merge pull request '#173' (#174) from #173 into master
Reviewed-on: sh-edraft.de/sh_cpl#174
2023-06-12 20:48:34 +02:00
ea968d94e4 Build app 2023-06-12 20:47:14 +02:00
8e12c72b07 Fixed cpl update dev deps bug #170 2023-06-12 20:47:13 +02:00
8dee4d8f70 Fixed config type 2023-04-15 11:47:31 +02:00
315b8e631a Merge pull request '2023.4' (#168) from 2023.4 into master
Reviewed-on: sh-edraft.de/sh_cpl#168
2023-04-12 13:57:50 +02:00
cbb1860f25 Fixed internal settings 2023-04-12 13:47:38 +02:00
9839bcaa14 Removed unused imports 2023-04-12 13:34:43 +02:00
da54337221 Fixed ProjectSettings 2023-04-12 13:31:59 +02:00
a6a1e764d1 Updated deps 2023-04-12 13:30:13 +02:00
eb6aa08c10 Updated deps 2023-04-12 12:57:58 +02:00
14a190a67f Merge pull request '#166' (#167) from #166 into 2023.4
Reviewed-on: sh-edraft.de/sh_cpl#167
Closes #166
2023-04-11 14:49:21 +02:00
cf5ae89884 Fixed start test 2023-04-11 14:26:17 +02:00
558dfb8ced Deactivated test output 2023-04-11 12:51:49 +02:00
2ec8fc22b3 Improved generic type hints 2023-04-11 12:50:05 +02:00
c94700495b Merge pull request '#157' (#165) from #157 into 2023.4
Reviewed-on: sh-edraft.de/sh_cpl#165
Closes #157
2023-04-11 11:48:48 +02:00
69a3bc5e31 Fixed cwd handling 2023-04-10 15:10:39 +02:00
d189f49418 Improved service_provider_tests 2023-04-10 14:53:59 +02:00
60fb416b67 Added service_provider_tests 2023-04-10 14:47:25 +02:00
792429d19d Added console argument tests 2023-04-10 13:35:11 +02:00
106975015e Improved config tests 2023-04-09 12:51:57 +02:00
1117735f2e Added configuration tests & improved json parsing by converting into target types 2023-04-09 12:31:31 +02:00
0378f8944a Added AppEnv tests 2023-04-09 12:05:05 +02:00
75fde0f444 Added pipe tests 2023-04-07 14:52:17 +02:00
04f610c799 Removed obsolete pipes 2023-04-07 14:41:11 +02:00
3178b59147 Added JSONProcessorTestCase 2023-04-07 14:40:03 +02:00
9c7008e179 Improved core test suite 2023-04-07 14:08:06 +02:00
7ff7dbc56b Added core test suite 2023-04-07 14:04:39 +02:00
823d524a81 Added core.utils.string tests & fixed some functions 2023-04-07 14:03:45 +02:00
1b60debba7 Fixed cli schematics & added tests 2023-04-07 13:42:20 +02:00
3fc713cc8d Merge pull request '#154' (#164) from #154 into 2023.4
Reviewed-on: sh-edraft.de/sh_cpl#164
Closes #154
2023-04-05 22:30:38 +02:00
bb26c7e94d Updated docs 2023-04-05 22:01:15 +02:00
52404cf5d3 Updated docs 2023-04-05 21:59:58 +02:00
32223bcfc2 Updated docs 2023-04-05 21:43:21 +02:00
4e2bdb2b59 Fixed translation settings 2023-04-05 18:17:57 +02:00
d72514205c Updated PipSettings 2023-04-05 18:13:29 +02:00
9b4afdbe18 Updated TranslationSettings & formatted code 2023-04-05 18:12:31 +02:00
6751541269 Updated DiscordBotSettings 2023-04-05 18:11:16 +02:00
fe9918af16 Updated discord deps 2023-04-05 18:10:33 +02:00
d2c56f1a3f Fixed some broken references 2023-04-05 18:07:31 +02:00
8624549aa6 Fixed some broken references 2023-04-05 18:03:13 +02:00
9a6ce704b7 Removed from_dict from build and project settings 2023-04-05 16:30:02 +02:00
9af2a1962d Improved internal settings 2023-04-04 23:19:59 +02:00
a8d4a7a362 Added JSONProcessor to utils & Added JSONProcessor as settings parser 2023-04-04 22:52:13 +02:00
943f5ad50b Improved service scope 2023-04-04 21:45:32 +02:00
4cd8fea07a Merge pull request 'Added more version operator support' (#163) from #160 into 2023.4
Reviewed-on: sh-edraft.de/sh_cpl#163
Closes #160
2023-04-04 21:36:54 +02:00
82b3a22ac8 Added more version operator support 2023-04-04 21:36:24 +02:00
2c6367a408 Improved cpl query 2023-04-04 21:05:53 +02:00
af94a0c52d Formatted code 2023-04-04 15:56:37 +02:00
9c374f6bb2 Merge pull request '#161' (#162) from #161 into 2023.4
Reviewed-on: sh-edraft.de/sh_cpl#162
Closes #161
2023-04-04 14:52:30 +02:00
d0a19458c5 Formatted code 2023-04-04 14:50:19 +02:00
5d6e7677de Improved typing in query 2023-04-04 14:42:43 +02:00
01309e3124 Cleaned code 2023-04-04 13:58:37 +02:00
083e1ce4a1 Fixed OrderedQueryable imports 2023-04-04 13:55:50 +02:00
8c012e5902 Set Self type 2023-04-04 13:33:45 +02:00
5e6d17cc86 Updated some stuff 2023-04-04 13:30:10 +02:00
c4a71de83f Formatted code 2023-04-04 13:30:00 +02:00
01bc746092 Merge branch 'master' into 2023.4
# Conflicts:
#	src/cpl_cli/.cpl/__init__.py
#	src/cpl_cli/__init__.py
#	src/cpl_cli/_templates/__init__.py
#	src/cpl_cli/_templates/build/__init__.py
#	src/cpl_cli/_templates/publish/__init__.py
#	src/cpl_cli/abc/__init__.py
#	src/cpl_cli/command/__init__.py
#	src/cpl_cli/configuration/__init__.py
#	src/cpl_cli/cpl-cli.json
#	src/cpl_cli/helper/__init__.py
#	src/cpl_cli/live_server/__init__.py
#	src/cpl_cli/migrations/__init__.py
#	src/cpl_cli/migrations/base/__init__.py
#	src/cpl_cli/migrations/service/__init__.py
#	src/cpl_cli/publish/__init__.py
#	src/cpl_cli/source_creator/__init__.py
#	src/cpl_cli/validators/__init__.py
#	src/cpl_core/__init__.py
#	src/cpl_core/application/__init__.py
#	src/cpl_core/configuration/__init__.py
#	src/cpl_core/console/__init__.py
#	src/cpl_core/cpl-core.json
#	src/cpl_core/database/__init__.py
#	src/cpl_core/database/connection/__init__.py
#	src/cpl_core/database/context/__init__.py
#	src/cpl_core/dependency_injection/__init__.py
#	src/cpl_core/dependency_injection/service_provider.py
#	src/cpl_core/dependency_injection/service_provider_abc.py
#	src/cpl_core/environment/__init__.py
#	src/cpl_core/logging/__init__.py
#	src/cpl_core/mailing/__init__.py
#	src/cpl_core/pipes/__init__.py
#	src/cpl_core/time/__init__.py
#	src/cpl_core/utils/__init__.py
#	src/cpl_discord/.cpl/__init__.py
#	src/cpl_discord/.cpl/schematic_discord_event.py
#	src/cpl_discord/__init__.py
#	src/cpl_discord/application/__init__.py
#	src/cpl_discord/command/__init__.py
#	src/cpl_discord/configuration/__init__.py
#	src/cpl_discord/container/__init__.py
#	src/cpl_discord/cpl-discord.json
#	src/cpl_discord/events/__init__.py
#	src/cpl_discord/helper/__init__.py
#	src/cpl_discord/service/__init__.py
#	src/cpl_discord/service/discord_bot_service.py
#	src/cpl_discord/service/discord_bot_service_abc.py
#	src/cpl_discord/service/discord_service.py
#	src/cpl_query/__init__.py
#	src/cpl_query/base/__init__.py
#	src/cpl_query/base/queryable_abc.py
#	src/cpl_query/cpl-query.json
#	src/cpl_query/enumerable/__init__.py
#	src/cpl_query/extension/__init__.py
#	src/cpl_query/iterable/__init__.py
2023-04-04 13:29:45 +02:00
87d023ef7f Merge pull request 'Updated docs' (#159) from #150 into 2023.4
Reviewed-on: sh-edraft.de/sh_cpl#159
Closes #150
2023-04-04 13:16:38 +02:00
119052f9a2 Updated docs 2023-04-04 13:16:19 +02:00
43710717c9 Fixed cpl-discord deps 2023-03-11 01:33:56 +01:00
7bf5e25c5e Fixed typing 2023-03-06 19:03:35 +01:00
faa030df96 Fixed typing 2023-03-06 19:03:01 +01:00
b2efe285a9 Added line counter 2023-02-20 15:59:33 +01:00
9e28dce5ce Updated docs 2023-02-20 15:55:20 +01:00
8179508248 Added scheduled event support for cpl-discord 2023-02-13 16:58:46 +01:00
2c3664c1b9 Fixed schematic schematic 2023-01-15 10:01:19 +01:00
269f083662 Fixed static inject args order 2023-01-15 02:34:09 +01:00
8b40c65661 Fixed discord event schematic 2023-01-12 13:49:15 +01:00
7be3cf38dc Fixed cpl-cli deps 2023-01-12 09:05:36 +01:00
b18a7297a7 Build fix version 2023-01-12 08:58:05 +01:00
7f46fbe87a Added *args and **kwargs support to discord bot and DI 2023-01-12 08:57:01 +01:00
e0ca7c2ae6 Build fixed version 2023-01-07 15:03:21 +01:00
6389a940bc Fixed static di injection 2023-01-07 15:00:38 +01:00
48d0daabf5 Updated copyright 2022-12-25 12:05:02 +01:00
8fc3c04720 Updated deps 2022-12-25 12:02:47 +01:00
351f953fdb Merge pull request '2022.12' (#133) from 2022.12 into master
Reviewed-on: sh-edraft.de/sh_cpl#133
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2022-12-25 11:58:34 +01:00
e1560dfab5 Merge pull request '2022.12.1' (#158) from 2022.12.1 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#158
2022-12-25 11:29:56 +01:00
c9bc6a026a Build release 2022.12.1 2022-12-25 11:26:51 +01:00
83f0e8bd42 Set version 2022-12-25 11:25:53 +01:00
7af83b49a5 Merge pull request 'Added multiple instance handling (#152)' (#156) from #152 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#156
Closes #152
2022-12-23 17:29:15 +01:00
59263ece6e Added multiple instance handling #152 2022-12-23 17:28:38 +01:00
a507ed9f46 Fixed publish all script 2022-12-23 16:45:14 +01:00
6b451142e2 Merge pull request 'Static dependency injection (#148)' (#155) from #148 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#155
Closes #148
2022-12-23 16:36:21 +01:00
12beea05a7 Merge branch '2022.12' into #148 2022-12-23 16:35:24 +01:00
713fa5243c Fixed publisher service 2022-12-23 16:09:28 +01:00
d600852bec Added logic to support global service provider #148 2022-12-22 18:52:17 +01:00
c09f2f8e83 Fixed scoped #148 2022-12-20 14:50:35 +01:00
2fb515195c Improved query performance test 2022-12-20 14:34:55 +01:00
889f51f5c5 Fixed python path in settings 2022-12-20 14:29:43 +01:00
742ba8314a Merge pull request 'cpl n l -> keine Fragen... (#144)' (#149) from #144 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#149
Closes #144
2022-12-19 08:39:30 +01:00
b95d90a191 Fixed python path in project settings #144 2022-12-19 08:36:40 +01:00
46fa49a102 Updated project type library logic & fixed tests #144 2022-12-18 14:27:41 +01:00
d5e89d6e2a Fixed cpl cli build #144 2022-12-18 12:03:41 +01:00
086fc75fec Build cpl query 2022-12-12 20:59:43 +01:00
05c33990bb Performance improvements 2022-12-12 20:59:04 +01:00
cbae40ef4d Fixed skip function 2022-12-11 10:44:23 +01:00
002ba6b4e0 Added split function 2022-12-11 09:16:38 +01:00
85f75b4677 Fixed group by 2022-12-11 08:58:55 +01:00
95d8df5bea Merge pull request 'Added new schematics & fixed run command #145' (#147) from #145 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#147
Closes #145
2022-12-10 21:44:17 +01:00
ac1cd9bdde Added new schematics & fixed run command #145 2022-12-10 21:43:46 +01:00
2d9bb79af7 Merge pull request 'cli discord unterstützung (#143)' (#146) from #143 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#146
Closes #143
2022-12-09 15:07:27 +01:00
120c9e6800 Fixed tests #143 2022-12-08 16:08:48 +01:00
6f3099a8db Updated packages & improved docs #143 2022-12-08 15:29:48 +01:00
e46711dc54 Added unittests #143 2022-12-08 14:23:46 +01:00
59920c59e0 Added cpl g & n discord support #143 2022-12-08 12:14:58 +01:00
604bb8f55c Updated discord test app #143 2022-12-08 11:02:54 +01:00
2f8dc63cdc Added discord command & event to cpl g schematics #143 2022-12-08 10:36:23 +01:00
4fbb3ec838 Updated readme 2022-12-07 20:12:07 +01:00
6818fe9a5c Improved cpl new appsettings template 2022-12-07 20:06:54 +01:00
3854fa5aa6 Merge pull request 'cpl n <project-type> name (#139)' (#140) from #139 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#140
Closes #139
2022-12-07 16:16:14 +01:00
1ca459e67a Removed skip test case #139 2022-12-07 15:48:37 +01:00
fe8ffb2839 Removed comments #139 2022-12-07 15:46:58 +01:00
42fb88c35d Removed old new command #139 2022-12-07 15:45:15 +01:00
db7a0786a9 Merge branch '2022.12' into #139 2022-12-07 15:41:56 +01:00
f9f2612356 Merge pull request 'configuration.add_configuration(value: any) type fix (#141)' (#142) from #141 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#142
Closes #141
2022-12-07 15:41:18 +01:00
df81bb599f Merge branch '2022.12' into #141 2022-12-07 13:07:38 +01:00
6d2492c1cf Added generic typing to configuration #141 2022-12-07 13:06:50 +01:00
e244535557 Improved cpl n custom templating #139 2022-12-06 17:42:55 +01:00
5f10603fe5 [WIP] Improved cpl new templating #139 2022-12-05 23:08:52 +01:00
6b8491eea2 Merge pull request 'cpl g <schematic> customizable (#137)' (#138) from #137 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#138
Closes #137
2022-12-05 20:34:45 +01:00
b63bf41294 Fixed cpl help #137 2022-12-05 20:24:15 +01:00
f6cc3a7ddf Removed cpl g arguments #137 2022-12-05 20:00:32 +01:00
d1c93abe2c Improved cpl g templating & added custom templating #137 2022-12-05 19:57:33 +01:00
d6e3b37f7f Fixed recursion in cpl 2022-12-05 14:37:25 +01:00
9840779af4 build new cpl version 2022-12-05 14:30:33 +01:00
b893ec1fcf Merge pull request 'Removed old file #134' (#136) from #134 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#136
2022-12-05 14:16:55 +01:00
d5e5bfe69d Removed old file #134 2022-12-05 14:15:01 +01:00
4afe5c4581 Fixed cpl query for now #134 2022-12-05 14:12:20 +01:00
e054ac364e Updated docs 2022-12-04 00:50:24 +01:00
68e01afb5b Release 2022.12.0 2022-12-04 00:12:40 +01:00
2e0a8bb1ff Minor fixes to cpl query 2022-12-04 00:08:16 +01:00
b02aebef35 Improved set-version tool & set version 2022-12-03 23:42:23 +01:00
099a51ed93 Merge pull request 'Fixed invalid output after console spinner #122' (#132) from #122 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#132
Closes #122
2022-12-03 23:31:20 +01:00
e4aedb354b Fixed invalid output after console spinner #122 2022-12-03 23:30:54 +01:00
301768b842 Merge pull request 'cpl start & run - Bessere Einbindung mit den Build-Tools #124' (#131) from #124 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#131
Closes #124
2022-12-03 23:25:11 +01:00
856960d799 Added logic to run build code to cpl start #124 2022-12-02 19:38:03 +01:00
d0877a4ea6 Added logic to run build code to cpl run #124 2022-12-02 18:41:58 +01:00
3c20ab296a Added --dev flag to cpl run & start #124 2022-12-02 17:48:35 +01:00
4dc7ee3314 Merge pull request 'cpl query Enumerable quatsch #129' (#130) from #129 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#130
Closes #129
2022-12-01 23:43:01 +01:00
05bd5e8593 Improved query performance test #129 2022-12-01 23:41:06 +01:00
2fe3912a07 Fixed version test #129 2022-12-01 23:34:00 +01:00
2840628443 Improved tests #129 2022-12-01 23:23:48 +01:00
f0f79e7e3b Refactored cpl-query Iterable & Enumerable #129 2022-12-01 21:09:39 +01:00
e8ae635c88 Improved tests #129 2022-12-01 17:00:17 +01:00
d8f7e03815 Added group by & refactored Iterable #129 2022-12-01 16:27:29 +01:00
ba1b5e49ae Merge pull request 'Added logic to change base path for cpl n #120' (#128) from #120 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#128
Closes #120
2022-12-01 14:00:46 +01:00
703a2c91b5 Added logic to change base path for cpl n #120 2022-12-01 13:55:55 +01:00
4a54bb62de Merge pull request 'cpl g in project directory #93' (#127) from #93 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#127
Closes #93
2022-12-01 12:26:01 +01:00
9e84c8359b Removed empty PythonPath #93 2022-12-01 12:25:36 +01:00
5139876d90 Merge branch '#93' of https://git.sh-edraft.de/sh-edraft.de/sh_cpl into #93 2022-12-01 12:22:20 +01:00
6aef49de40 Repaired build & publish #93 2022-12-01 12:22:14 +01:00
186b336bf3 Repaired build & publish #93 2022-12-01 12:22:14 +01:00
1bbec27d1a Fixed cpl g path problems & package names #93 2022-12-01 12:21:57 +01:00
f0a8d69e22 Merge branch '2022.12' of https://git.sh-edraft.de/sh-edraft.de/sh_cpl into 2022.12 2022-12-01 12:21:17 +01:00
8bd237206c Fixed logging #123 2022-12-01 12:20:32 +01:00
6bf7c3a2bc Reverted #125 fix 2022-12-01 12:19:49 +01:00
2e8be741cc Repaired build & publish #93 2022-12-01 12:17:26 +01:00
abd0352750 Repaired build & publish #93 2022-11-30 19:05:11 +01:00
25d91b85f3 Merge branch '2022.12' into #93 2022-11-30 18:06:49 +01:00
f08eb42105 Merge pull request 'Logging Farben #123' (#126) from #123 into 2022.12
Reviewed-on: sh-edraft.de/sh_cpl#126
Closes #123
2022-11-30 18:06:12 +01:00
f450102c93 Fixed cpl g path problems & package names #93 2022-11-30 18:04:40 +01:00
db28645e98 Fixed logging #123 2022-11-30 15:17:08 +01:00
23efb776e7 Call pre & post scripts with args of base command & Build cpl-core@2022.7.0.post9 2022-11-18 09:17:56 +01:00
7f621b282f Build cpl-core@2022.7.0.post8 2022-11-18 08:37:16 +01:00
5dc7fce1e7 Call pre & post scripts with args of base command 2022-11-18 08:36:21 +01:00
879f59b0d5 Fixed #125 2022-10-21 22:34:47 +02:00
511622820a Fixed translation loading 2022-10-19 17:38:21 +02:00
0914f969e5 Resolved deps conflicts 2022-10-18 20:58:19 +02:00
c611045290 Removed german string 'this is a automatic...' in mail client 2022-10-18 20:44:08 +02:00
89ac9e90d6 Fixed take & skip 2022-10-15 13:17:08 +02:00
ae2a98b3bc Fixed unicode problems with windoof 2022-10-12 20:29:18 +02:00
bd242baa0a Removed exit from console warn in logger | WTF im so fckng sorry 2022-10-06 16:47:29 +02:00
8e4caeb2a8 Removed exit from console warn in logger | WTF im so fckng sorry 2022-10-06 16:46:44 +02:00
3b55b3d5a5 Fixed _append_log & create logic in logger_service 2022-10-06 16:45:20 +02:00
cc3b1afaa1 Fixed _append_log & create logic in logger_service 2022-10-06 16:24:01 +02:00
a22b6fdbdb Fixed typo | sry x2 :/ 2022-10-03 17:39:43 +02:00
e3041c4b5b Fixed typo | sry :/ 2022-10-03 17:36:31 +02:00
8ad6d50a04 Added reaction raw events 2022-10-03 17:32:12 +02:00
4db000f6d7 Added protected log and path getter to logger in cpl-core 2022-10-02 23:15:07 +02:00
3821624c3b Removed content from on_message log in cpl-discord 2022-10-02 13:01:09 +02:00
60a722b4ec Improved app builder to return self in use_startup 2022-10-02 02:43:10 +02:00
65132aa107 Improved app builder to return self in use_extension 2022-10-02 02:39:03 +02:00
48eac124a5 Fixed settings handling in cpl-discord 2022-10-01 22:38:01 +02:00
be23b18d33 Merge pull request 'Release 2022.10' (#112) from 2022.10 into master
Reviewed-on: sh-edraft.de/sh_cpl#112
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2022-09-30 15:48:19 +02:00
748cc66946 Removed print 2022-09-30 15:47:54 +02:00
304b2e4255 Set new version & build projects 2022-09-30 15:39:41 +02:00
9fa183f143 Merge pull request '2022.10.11 - Added migrations to update command #114' (#117) from 2022.10.11-#114 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#117
Closes 117
2022-09-30 14:10:50 +02:00
82df528395 Merge pull request '2022.10.12 - Fixed cpl g existing __init__.py overwrite #116' (#118) from 2022.10.12-#116 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#118
Closes #118
2022-09-30 14:07:07 +02:00
49e3bddc91 Fixed cpl g existing __init__.py overwrite #116 2022-09-19 23:10:10 +02:00
c52bf961e1 Added migrations to update command #114 2022-09-19 23:00:09 +02:00
df3f9f0306 Merge pull request 'Fixed update & install commands #113' (#115) from 2022.10.10-#113 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#115
Closes #113
2022-09-19 21:48:56 +02:00
ef2d73aadc Fixed update & install commands #113 2022-09-19 21:09:41 +02:00
1ed721cccb Updated packages (Build RC2) 2022-09-18 11:37:50 +02:00
a724216563 Added dockerfile to test 2022-09-18 11:27:26 +02:00
2bcf4d7a97 Re-build correct version 2022-09-18 11:09:38 +02:00
2dfa2dd68f Improved project file structure 2022-09-18 10:59:29 +02:00
e94ed0b7f0 Build rc1 2022-09-17 13:03:37 +02:00
c7e2f8609c Merge pull request '2022.10.3 - Removed duplicated schematic name in generate command #92' (#111) from 2022.10.3 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#111
Closes #92
2022-09-17 12:12:52 +02:00
9d2321cc9c Merge branch '2022.10' into 2022.10.3 2022-09-17 12:12:40 +02:00
61d9912950 Removed duplicated schematic name in generate command #92 2022-09-17 12:09:05 +02:00
f23d32a92a Merge pull request '2022.10.4 - Removed async from startup functions (#94)' (#110) from 2022.10.4 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#110
Closes #94
2022-09-17 11:59:38 +02:00
dc489cbf7a Removed async from startup functions 2022-09-17 11:58:43 +02:00
41d24aae99 Merge pull request '2022.10.6 - Added error message when logging configuration not exists (#95)' (#109) from 2022.10.6 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#109
Closes #95
2022-09-17 11:40:46 +02:00
6b50bba139 Merge branch '2022.10' into 2022.10.6 2022-09-17 11:40:30 +02:00
139422fd32 Added error message when logging configuration not exists 2022-09-17 11:39:19 +02:00
409e11df42 Merge pull request '2022.10.5 Improved version command & fixed unittests (#97)' (#107) from 2022.10.5 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#107
Closes #97
2022-09-16 10:43:17 +02:00
f3a11f9791 Improved version command & fixed unittests 2022-09-15 19:16:52 +02:00
8dcc5b4011 Merge pull request '2022.10.9 - Enumerable & List (#105)' (#106) from 2022.10.9 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#106
Closes #105
2022-09-15 18:21:25 +02:00
d0f65834f1 Added performance test case 2022-09-15 18:14:40 +02:00
47ed0a705d Improved query 2022-09-15 17:00:22 +02:00
ae3192b63c Removed SequenceABC 2022-09-15 12:48:05 +02:00
bb461f5fba Improved query 2022-09-15 00:30:44 +02:00
52069b7bb3 Improved Sequences 2022-09-14 23:01:52 +02:00
f0ed0bd2e1 Added sequence converters 2022-09-14 13:23:23 +02:00
e868a120f0 Build cpl-query 2022-09-13 19:38:16 +02:00
70652aeb4c Changed structure of cpl-query 2022-09-13 19:33:26 +02:00
28adcc4e49 Implemented enumerable 2022-09-13 12:07:04 +02:00
affbb1ee7b Merge pull request '2022.10.8 - Moved query functions to static query class (#102)' (#104) from 2022.10.8 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#104
Closes #102
2022-09-12 22:55:14 +02:00
d8a4210c9b Moved query functions to static query class 2022-09-12 22:53:52 +02:00
b16d555e33 Merge pull request '2022.10.2 - Code refactoring' (#103) from 2022.10.2 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#103
2022-09-12 22:31:04 +02:00
4380142ccd Merge branch '2022.10' into 2022.10.2 2022-09-12 22:30:41 +02:00
91f2d6cb21 Code refactoring 2022-09-12 22:29:46 +02:00
249b071ee9 Merge pull request '2022.10.2' (#101) from 2022.10.2 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#101
2022-09-12 22:29:22 +02:00
53fe437100 Added more data containers 2022-09-12 22:18:54 +02:00
fc63f3616e Added tests for select & select many 2022-09-12 18:07:37 +02:00
a528511732 Added tests for select & select many 2022-09-12 17:58:48 +02:00
dbe1d37046 Build version 2022-09-11 22:02:10 +02:00
988965ed52 Improved cpl-query & added first types from discord 2022-09-11 21:57:27 +02:00
3c5ca594d5 Merge pull request '2022.10.1' (#100) from 2022.10.1 into 2022.10
Reviewed-on: sh-edraft.de/sh_cpl#100
2022-09-11 19:30:39 +02:00
452b30c899 Build version 2022-09-11 19:30:19 +02:00
85c5b26fdf Added slash command support 2022-09-11 10:21:28 +02:00
92ed684866 First migrations 2022-09-10 10:27:31 +02:00
88e83db330 Improved scope handling 2022-07-31 13:32:02 +02:00
55609fc691 Renamed sh_cpl to cpl in docs 2022-07-31 11:33:45 +02:00
e0d89f967f Improved docs 2022-07-31 11:30:05 +02:00
b2ce8a6924 Added on_error to event types enum 2022-07-19 21:42:45 +02:00
71efbd1b42 Fixed database connection handling by reconnecting 2022-07-19 07:37:03 +02:00
e36939a108 Fixed database port handling 2022-07-18 12:15:28 +02:00
721461fc1b Deployed cpl-discord==2022.7.0.post2 2022-07-17 16:11:33 +02:00
72ee59b2b4 Deployed cpl-core==2022.7.0.post3 2022-07-17 15:52:53 +02:00
95159da0fc Fixed pynput imports 2022-07-17 15:52:17 +02:00
330d702347 Fixed base class of translation service 2022-07-17 15:49:50 +02:00
cbf669d3bd Fixed base class of translation service 2022-07-16 22:06:38 +02:00
7498fe3255 Fixed settings error 2022-07-16 19:37:40 +02:00
880998e8ca Published cpl-discord.post1 2022-07-16 19:23:00 +02:00
ecc9657eaa Merge pull request '2022.7 - cpl-discord' (#96) from 2022.7 into master
Reviewed-on: sh-edraft.de/sh_cpl#96
Closes #91
2022-07-16 16:16:49 +02:00
125f65cf1b Published cpl-discord 2022-07-16 16:15:52 +02:00
1cd9c7d669 Fixed set-version 2022-07-16 16:07:39 +02:00
5165f31066 Build cpl-discord 2022-07-16 15:53:02 +02:00
10d33e5d1d Added logic to handle commands 2022-07-16 15:45:34 +02:00
fb35e8b8b2 Added logic to create a bot 2022-07-16 14:53:54 +02:00
4402bcce73 Added test project 2022-07-16 12:22:10 +02:00
8839b26f00 Added event bases 2022-07-16 12:21:59 +02:00
a79358725c Added cpl-discord project 2022-07-16 12:12:52 +02:00
2ab1576230 Fixed async init error & Fixed pip install 2022-07-14 16:29:08 +02:00
c0be380f69 Removed vscode files 2022-07-14 15:22:10 +02:00
c0ae0c8389 Merge pull request '2022.7 - cpl-translation' (#90) from 2022.7 into master
Reviewed-on: sh-edraft.de/sh_cpl#90
Closes #89
Closes #63
Closes #62
2022-07-10 18:10:30 +02:00
4a766e8284 Release 2022.7 2022-07-10 18:08:44 +02:00
2772ea8df2 Added translation unittests 2022-07-10 17:56:38 +02:00
a604f0e821 Build package 2022-07-10 17:23:50 +02:00
6995b25518 Injected add_translation function from translation package 2022-07-10 17:17:45 +02:00
e4f843829f Added logic to load translations and to translate texts 2022-06-29 20:03:13 +02:00
39b6ca790c Added test project 2022-06-29 19:05:12 +02:00
4c8d7a8031 Added translation project 2022-06-29 19:04:01 +02:00
6d75bc433e Merge pull request '2022.6' (#88) from 2022.6 into master
Reviewed-on: sh-edraft.de/sh_cpl#88
2022-06-29 17:50:06 +02:00
8bb7fbd1c4 Merge remote-tracking branch 'origin/2022.6' into 2022.6 2022-06-29 17:47:04 +02:00
ad03e655e9 Build Release 2022.6.0 2022-06-29 17:46:59 +02:00
61d3974a47 Build Release 2022.6.0 2022-06-29 17:46:01 +02:00
3d852c87e2 Improved docs 2022-06-29 17:44:10 +02:00
0e46528f32 Merge pull request '2022.6.8 - Dokumentation' (#87) from 2022.6.8 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#87
Closes #56
2022-06-29 17:42:33 +02:00
bb8fa1f6a8 Improved readme 2022-06-29 17:40:05 +02:00
9fdaa810c0 Build 2022.6.0rc2 2022-06-27 21:48:15 +02:00
4083ac0c14 Build docs and added tutorial files 2022-06-27 21:42:34 +02:00
b9e0b7ccd0 Build 2022.6.0.rc1 2022-06-27 20:55:44 +02:00
4b9e428abb Updated tools 2022-06-27 20:52:27 +02:00
63ad13e09a Improved version handling of set-version 2022-06-27 20:46:01 +02:00
cc06a308a1 Merge pull request '2022.6.10 - Dev dependencies' (#86) from 2022.6.10 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#86
Closes #71
2022-06-27 20:18:24 +02:00
e9fdd20181 Updated unittests 2022-06-27 20:16:37 +02:00
8692686cb5 Added dev-deps support to new command 2022-06-27 20:07:52 +02:00
db29ad36fe Added dev-deps support to cpl install without package 2022-06-27 20:05:34 +02:00
0710b25317 Added dev-dependencies to uninstall command 2022-06-27 20:04:19 +02:00
cbd2964f42 Added dev-dependencies to install command 2022-06-27 20:02:01 +02:00
f51118f13c Merge pull request '2022.6.2 - Venv support' (#85) from 2022.6.2 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#85
Closes #51
2022-06-27 11:52:17 +02:00
323e363b42 Improved venv support to all related commands 2022-06-27 11:50:22 +02:00
e8a4fe6142 Added venv support to install command 2022-06-27 10:52:26 +02:00
587d9b359c Merge pull request '2022.6.17 - Unittests' (#84) from 2022.6.17 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#84
2022-06-27 10:03:54 +02:00
c2632253ac Added tests for update command 2022-06-27 09:10:21 +02:00
45be77dd10 Added tests for version command 2022-06-26 19:51:18 +02:00
78ffbcc33d Readded all test cases 2022-06-26 01:07:10 +02:00
d83d1a244e Fixed for start command [WIP] output is needed 2022-06-26 01:05:45 +02:00
fa002a50ac Fixed for start command 2022-06-26 00:41:25 +02:00
32507afae9 Added tests for start command 2022-06-26 00:39:16 +02:00
6de3bbdaf4 Added tests for run command 2022-06-26 00:15:05 +02:00
6e50d0cb22 Added tests for publish command 2022-06-23 23:47:29 +02:00
9e978f3ece Fixed tests for un/install commands 2022-06-23 23:39:41 +02:00
32478926c8 Added tests for build command 2022-06-23 21:49:44 +02:00
2925788d01 Added tests for uninstall command 2022-06-21 09:24:56 +02:00
c0789cf4f7 Added tests for install command 2022-06-21 08:56:26 +02:00
89d591ce0a Added project reference handling in cpl remove 2022-06-04 00:36:31 +02:00
77c560b40c Improved cpl remove test 2022-06-03 23:46:03 +02:00
dad4913bcd Added cpl remove test 2022-06-03 23:44:26 +02:00
9b56650d4b Added cpl add test 2022-06-03 23:35:07 +02:00
9fca2018e5 Build dev10 2022-05-27 18:57:12 +02:00
e5dd890931 Improved unittest for cpl new & Fixed subdirectory handling with cpl new 2022-05-27 18:57:00 +02:00
beadbf8e91 Improved set-version to ignore skipped deps 2022-05-27 18:26:32 +02:00
ff5f9b833d Improved unittest for cpl new 2022-05-27 18:07:12 +02:00
162f06001a Build dev8 & improved cpl new unittests 2022-05-26 23:27:32 +02:00
348fad24c7 Build dev8 & improved set-version change handling 2022-05-26 23:27:20 +02:00
f9748cdb76 Improved gitignore 2022-05-26 23:03:18 +02:00
56380763a9 Improved unittests 2022-05-26 23:01:50 +02:00
3a1630b687 Added force option to set-version 2022-05-26 23:01:23 +02:00
a593f34cde Build dev7 2022-05-26 23:00:55 +02:00
49cce5fa1a Extended cpl new options 2022-05-26 22:52:03 +02:00
df7bd06629 Fixed additional argument & flag bug 2022-05-26 22:51:29 +02:00
e0da77fd4b Added new test condition for cpl new 2022-05-26 22:24:19 +02:00
833dd83008 Improved unittests & added tests for cpl new 2022-05-26 22:21:16 +02:00
ce0ad4013f [WIP] Improved unittest 2022-05-26 21:42:43 +02:00
698f80adfe Build dev6 2022-05-26 21:42:28 +02:00
d0b0f4bfcb Fixed set-version 2022-05-26 21:41:42 +02:00
d23ea86ccf Added logic to answer questions of new command dialog by flag arguments 2022-05-26 21:18:57 +02:00
15d938b172 Fixed handing of unregistered console arguments 2022-05-26 21:01:41 +02:00
6c1d7a3b29 Removed prints from CLITestSuite 2022-05-26 16:29:07 +02:00
c28f551682 Added skip message to set-version 2022-05-26 16:26:55 +02:00
def92c78c8 Added logic to change version only for projects with changes 2022-05-26 16:25:15 +02:00
ddff9dec11 Fixed install command 2022-05-26 16:08:37 +02:00
9e0e85d646 Fixed install command 2022-05-26 16:06:56 +02:00
b05ca7e980 Set dev version 2022-05-26 16:03:14 +02:00
8f8a9f7dd7 Moved query unittests 2022-05-26 15:53:23 +02:00
df32978a31 Moved unittests 2022-05-26 15:49:52 +02:00
79b51cf8c5 Build dev4 & added unittest support to console 2022-05-26 15:41:47 +02:00
a72dd0dc2e Improved tests 2022-05-26 15:29:49 +02:00
d937c4c0e6 Added tests for generate command 2022-05-26 14:47:36 +02:00
46cceb0910 Registered CLI test cases 2022-05-26 13:59:46 +02:00
e74e39c189 Added CLI command test cases 2022-05-26 13:49:31 +02:00
c2706c7737 Added unittest projects 2022-05-26 13:37:15 +02:00
d0e66d24bd Added logic to generate test cases 2022-05-26 13:17:58 +02:00
c1a1849ad2 Added logic to create new unittest project 2022-05-26 13:12:35 +02:00
0675105731 Merge pull request '2022.6.16 - Build-Tools' (#83) from 2022.6.16 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#83
Closes #82
2022-05-26 12:13:45 +02:00
7ee0b951a8 Rebuild & improved workspace scripts 2022-05-25 19:59:38 +02:00
d8168f024c Added logic to write PipPath & build dev2 2022-05-25 19:53:05 +02:00
2654dc7c69 Merge remote-tracking branch 'origin/2022.6.16' into 2022.6.16 2022-05-25 19:38:56 +02:00
4224960837 First dev build 2022-05-25 19:38:49 +02:00
907c3a8fff First dev build 2022-05-25 19:38:38 +02:00
28505479ba Added new project 2022-05-25 19:30:11 +02:00
84d3abce3f Merge pull request '2022.6.15 - set-version' (#81) from 2022.6.15 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#81
Closes #80
2022-05-25 19:10:35 +02:00
9050dffc53 Renamed projects && build dev6 2022-05-25 19:07:29 +02:00
e0f69c9bdf Fixed old naming of cpl_core 2022-05-25 18:56:08 +02:00
bbd0a60f98 Added functionality to set dependencies for all projects in workspace 2022-05-25 18:54:21 +02:00
e23f4187fe Added logic to add internal pipes in ServiceCollection 2022-05-25 18:42:47 +02:00
15f200df3a Added version pipe 2022-05-25 18:40:01 +02:00
a1a3ad6fb5 Build dev4 2022-05-25 17:09:31 +02:00
d6677d53a3 Added empty lines to generate output 2022-05-25 17:08:03 +02:00
07e43b50d1 Fixed generate pipe argument 2022-05-25 17:07:22 +02:00
ac83555b24 Added logic to handle cpl deps 2022-05-25 17:04:18 +02:00
1ab358059c Added more pre-build scripts 2022-05-25 16:57:21 +02:00
5bf83c0d77 Build dev2 2022-05-25 16:56:24 +02:00
03ac00c6e3 Bugfixes for set-version & CustomScriptService 2022-05-25 16:51:52 +02:00
0122d8fc78 Merge remote-tracking branch 'origin/2022.6.15' into 2022.6.15 2022-05-25 16:43:52 +02:00
a66ce96dbf Added set-version logic && Fixed CustomScriptService to handle arguments 2022-05-25 16:43:43 +02:00
6da8e30446 Added set-version logic && Fixed CustomScriptService to handle arguments 2022-05-25 16:43:28 +02:00
539ed13be4 Bugfixes for run service 2022-05-25 16:06:44 +02:00
036a553f64 Dev build 2022.6.15.dev1 2022-05-25 15:12:36 +02:00
976a14584b Dev build 2022.6.15.dev1 2022-05-25 15:12:30 +02:00
ed69f52927 Fixed generate service 2022-05-25 15:11:42 +02:00
98847495e6 Merge pull request '2022.6.14 - Pre & Post build scripts' (#79) from 2022.6.14 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#79
Closes #77
2022-05-25 14:15:24 +02:00
40f132da33 Added workspace scripts 2022-05-25 14:14:26 +02:00
5feb44595a Fixed cpl run command 2022-05-25 14:00:38 +02:00
48c6941f1a Added run command & tools/set-version project 2022-05-25 13:43:16 +02:00
a8756d493a Fixed error with RemoveService 2022-05-25 13:19:12 +02:00
9f4077a073 Improved configuration 2022-05-25 13:11:41 +02:00
3e7a3d75c5 Merge pull request 'cpl@2022.6.13 - cpl run command' (#78) from 2022.6.13 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#78
Closes #76
2022-05-25 08:42:41 +02:00
477d2d87d3 Added run command 2022-05-25 08:41:35 +02:00
7a65dbe39b Readded logic to handle pre and post scripts from workspace 2022-05-24 22:28:38 +02:00
f83755ac77 Removed console output & build new dev version 2022-05-24 20:20:42 +02:00
a590cfd066 Bugfixes for start service 2022-05-24 20:12:59 +02:00
f317035342 Bugfixes for test application & added validators to cli 2022-05-24 19:20:55 +02:00
8900bdd446 Removed invalid import && build for rc1 2022-05-24 18:20:31 +02:00
35ecf158a2 Fixed loading by base_type 2022-05-24 18:13:39 +02:00
353c1d30ec Merge pull request '2022.6.9 - Singleton initialisierung' (#75) from 2022.6.9 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#75
Closes #70
2022-05-24 17:52:13 +02:00
1c94fb5bd1 Added logic to load singletons when requested not when registered 2022-05-24 17:51:17 +02:00
cf305aeebb Merge pull request '2022.6.12 - Alle Umgebungsvariablen' (#74) from 2022.6.12 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#74
Closes #73
2022-05-24 17:39:20 +02:00
90e97433e0 Added logic to load all environment variables by prefix 2022-05-24 17:37:31 +02:00
125a85a0af Merge pull request '2022.6.7 - Pipes' (#69) from 2022.6.7 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#69
Closes #60
2022-05-22 20:28:46 +02:00
cfb8838c73 Added default pipes 2022-05-22 20:27:58 +02:00
824d491ebc Dev build projects 2022-05-22 18:49:31 +02:00
d694c408c0 Added CLI logic to generate pipes 2022-05-22 18:48:33 +02:00
d1bb266d49 Added Pipes 2022-05-22 18:43:10 +02:00
419fcc3d29 Merge pull request '2022.6.5 - CLI Erweiterung' (#68) from 2022.6.5 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#68
Closes #54
2022-05-22 18:34:44 +02:00
24ab6a51c1 Refactored executable arguments 2022-05-22 18:33:07 +02:00
dec4a45d98 Added logic to add CLI commands from external packages 2022-05-22 18:32:34 +02:00
d11c56db03 Merge pull request 'cpl@2022.6.3 - Verbesserung der Parameter' (#67) from 2022.6.3 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#67
2022-05-22 17:38:21 +02:00
fc23315cc7 Build version 2022.6.3 2022-05-22 17:35:38 +02:00
1f503fe20d Build new version 2022-05-20 10:37:43 +02:00
4564f7ac0e Improved output & imports 2022-05-20 10:35:47 +02:00
7b823e1141 Added validator generation 2022-05-20 10:34:09 +02:00
dac3d9c6bb Added validators (closes #59) 2022-05-20 10:27:55 +02:00
ccca904cb8 Smaller output fixes 2022-05-20 09:17:51 +02:00
c66a81c0ec Dev build & migrated custom scripts 2022-05-20 09:12:28 +02:00
fb810e2943 Dev build & migrated custom scripts & add logic to prevent next executable 2022-05-20 09:10:29 +02:00
5cc663dedc Migrated generate command 2022-05-20 08:50:50 +02:00
593372699b BUild dev version 2022-05-20 08:44:32 +02:00
1899cb5b86 Added scripts to workspace 2022-05-19 20:49:48 +02:00
0a285f2d28 Improved help command 2022-05-19 20:23:21 +02:00
94c82e6701 Improved help command 2022-05-19 20:21:46 +02:00
0d37c86061 Removed console output 2022-05-19 20:05:22 +02:00
6c8e9ccd89 Migrated StartService to new argument parsing 2022-05-19 20:04:29 +02:00
e7cf545502 Migrated NewService to new argument parsing 2022-05-19 19:52:36 +02:00
44182eec86 Fixed value handling for variable arguments 2022-05-19 19:41:02 +02:00
0f5b1b7586 Improved argument handling 2022-05-19 19:37:32 +02:00
4fe073580a Migrated first commands to new argument parser 2022-05-19 18:12:47 +02:00
2fed654c16 Improved argument handling 2022-05-19 18:09:25 +02:00
8ebd4864d3 Improved & added commands 2022-05-19 08:25:32 +02:00
a495532a4d Removed console debug outputs 2022-05-18 22:29:44 +02:00
d87ce72f07 Improved argument parsing 2022-05-18 22:26:11 +02:00
50201346e2 Added functions to define console arguments 2022-05-18 18:21:05 +02:00
773b154371 Improved service collection 2022-05-18 18:20:25 +02:00
5b59d1d384 Merge pull request '2022.6.4' (#58) from 2022.6.4 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#58
2022-04-30 18:33:54 +02:00
dcd8583183 Build packages 2022-04-30 17:44:15 +02:00
97e52b39c0 Added logic to handle StartupExtension classes 2022-04-30 17:43:34 +02:00
581013b61a Merge pull request '2022.6.1' (#57) from 2022.6.1 into 2022.6
Reviewed-on: sh-edraft.de/sh_cpl#57
2022-04-30 17:16:49 +02:00
fd68d25a1d Updated to python3.10 2022-04-30 17:15:26 +02:00
588f93f7b1 Updated packages 2022-04-30 16:41:52 +02:00
96f402dcdd Updated packages 2022-04-30 16:33:30 +02:00
c1b7fca8d5 Moved from pyfiglet to art 2022-01-19 22:06:59 +01:00
2e4e7ccc57 Fixed minor issues with console & updated packages 2022-01-19 15:06:26 +01:00
ada3d133df Changed exit() to sys.exit() 2022-01-19 12:44:23 +01:00
61e7b9d684 Fixed cpl new command 2022-01-15 23:28:22 +01:00
24172c658c Fixed cpl new command 2022-01-15 22:16:17 +01:00
62ac976b99 Fixed where query typing 2022-01-15 11:11:14 +01:00
1f445a99b2 Fixed typing in count function of cpl_query 2022-01-08 18:09:03 +01:00
025286052b Fixed typing in service collection abc 2022-01-08 17:58:22 +01:00
32a856f8e8 Published new version 2021-12-07 16:07:21 +01:00
21f50f3b24 Fixed table_abc 2021-12-07 16:06:20 +01:00
ce77d41246 Build new docs 2021-12-02 08:20:38 +01:00
dec137220c Improved TableABC 2021-11-30 17:48:08 +01:00
01c7e155c3 Fixed typo 2021-11-30 15:24:01 +01:00
dcbcb67ce8 Fixed db connection 2021-11-30 15:01:28 +01:00
d57fd10718 Fixed add_db_context function 2021-11-30 14:14:34 +01:00
2b91db5d81 Removed unsued parameter 2021-11-30 14:05:52 +01:00
dffa3de1ec Merge pull request '2021.11' (#50) from 2021.11 into master
Reviewed-on: sh-edraft.de/sh_cpl#50
2021-11-30 12:03:03 +01:00
403837901b Added logic to simulate uninstall command 2021-11-30 11:55:11 +01:00
0de725c907 Added logic to simulate install command 2021-11-30 11:51:45 +01:00
e811e08c52 Changed version of cli 2021-11-30 11:22:02 +01:00
6518ae7516 Changed version of query 2021-11-30 11:21:19 +01:00
95b5f99f1f Changed core version 2021-11-30 11:20:15 +01:00
de22e79b71 Removed console from db connection 2021-11-30 11:15:41 +01:00
127c67e566 Improved imports 2021-11-30 11:14:40 +01:00
3523dbd5c5 Improved typing 2021-11-30 11:12:13 +01:00
b526a07e19 Added demo for SQL Support 2021-11-30 11:10:36 +01:00
d9f10edbb7 [WIP] Added native mysql support 2021-11-29 20:55:43 +01:00
7616cd4c69 Changed version 2021-11-29 17:49:10 +01:00
afe75f6848 Fixed custom scripts 2021-11-29 17:47:44 +01:00
c0e2db8281 Build new CLI version 2021-11-29 09:30:46 +01:00
3727af11c4 Minor bugfixes with custom scripts 2021-11-29 09:30:10 +01:00
450295cfcf Build new version 2021-11-29 09:22:33 +01:00
457bce8aa9 Minor bugfixes 2021-11-29 09:21:55 +01:00
0f81497ea3 Changed version 2021-11-24 17:48:39 +01:00
fa7ee800e1 Fixed cpl start reading full path 2021-11-24 17:48:19 +01:00
56b7452e55 Changed version 2021-11-23 19:02:15 +01:00
9d73566453 Fixed custom command handling 2021-11-23 19:01:00 +01:00
28ba0c174a Changed version 2021-11-22 20:54:07 +01:00
5d0444bcc0 Fixed type problems with ordered List 2021-11-22 20:52:10 +01:00
40876005d5 Changed vs code settings 2021-11-22 20:49:39 +01:00
ac6d941822 Improved gitignore 2021-11-19 09:16:11 +01:00
113b365a47 Removed outdating line 2021-11-15 01:16:37 +01:00
2f785536e1 Improved path handling for new projects 2021-11-15 01:03:50 +01:00
9ab4013b4b Fixed async handling for new command 2021-11-15 00:20:39 +01:00
b3b04f03ce Merge pull request '2021.10.2' (#48) from 2021.10.2 into master
Reviewed-on: sh-edraft.de/sh_cpl#48
Closed #47
2021-11-14 12:56:41 +01:00
57040f85f0 Changed versions 2021-11-14 12:53:09 +01:00
589ef4fd4c Added logic to generate new projects with async 2021-11-14 12:32:11 +01:00
4b829cc484 Added logic to handle async applicationBase 2021-11-14 12:16:50 +01:00
98e343a108 Added logic to handle scoped services 2021-11-14 11:56:42 +01:00
7749d5a789 Moved tests to src & added add scoped logic 2021-11-14 10:04:32 +01:00
c3b48bfa41 Changed version 2021-11-14 09:55:27 +01:00
470e7ab2f4 Changed versions to new scheme 2021-11-14 09:52:07 +01:00
4ceea36926 Changed version 2021-11-02 18:42:13 +01:00
b3f8174663 Added cpl_query to docs 2021-11-02 18:41:30 +01:00
58dccea28b Improved docs 2021-11-02 17:45:45 +01:00
ca086e01d7 Improved docs 2021-11-02 17:30:10 +01:00
c5b1a95661 Moved implementations to extensions 2021-11-02 17:28:36 +01:00
d7881774a8 Improved docs by adding cpl_query.exceptions 2021-11-02 17:23:42 +01:00
6eec92243e Improved docs 2021-11-01 21:17:56 +01:00
124b236182 Improved docs 2021-11-01 20:43:25 +01:00
2dc96cdf3d Improved workspace 2021-11-01 18:49:22 +01:00
6f7923debc Moved tests 2021-11-01 18:47:23 +01:00
90d148b4a5 Added launch settings 2021-11-01 18:42:12 +01:00
73e2c5ec10 Added vs code 2021-11-01 18:24:41 +01:00
f31522dcd9 Changed version 2021-10-27 14:25:33 +02:00
a83607fd81 Fixed subclass support for Iterable 2021-10-27 14:24:43 +02:00
707df3f27d Fixed command handling 2021-10-26 23:23:56 +02:00
0f43e57831 Removed console.write_line 2021-10-26 13:09:44 +02:00
c08ab33060 Changed deps 2021-10-26 13:06:14 +02:00
ee2abd98b3 Changed version 2021-10-26 13:00:27 +02:00
e39661a42a Fixed command handling 2021-10-26 13:00:16 +02:00
9518d19580 Fixed invalid lines in startup template 2021-10-08 08:22:36 +02:00
adf95faaf8 Improved typo 2021-10-08 08:16:46 +02:00
2f92e9909d Improved env 2021-10-04 10:21:50 +02:00
b18f2c4bcd Removed debug changes 2021-10-04 09:59:20 +02:00
784ba049ad Fixed new library problems 2021-10-04 09:56:33 +02:00
4d6d19d2e5 Fixed new command problems 2021-10-04 09:56:08 +02:00
6fa47f19af Merge pull request '2021.10' (#41) from 2021.10 into master
Reviewed-on: sh-edraft.de/sh_cpl#41
2021-10-04 09:32:41 +02:00
fb2872422e Added upload script 2021-10-04 09:30:27 +02:00
8460c0fa33 Published 2021.10 2021-10-04 09:23:08 +02:00
18f95341f4 Merge pull request '2021.10.6' (#39) from 2021.10.6 into 2021.10 | closed #38
Reviewed-on: sh-edraft.de/sh_cpl#39
2021-10-03 11:26:48 +02:00
a8011267d9 Improved version command 2021-10-03 11:23:17 +02:00
f8ebb4f1d7 Improved imports in test app 2021-10-03 11:02:08 +02:00
3903f85368 Added logic to handle extensions before running the app 2021-10-02 10:57:54 +02:00
05a9bdbf4a Improved docstrings 2021-08-07 11:29:00 +02:00
2809a9cd82 Improved imports 2021-08-07 11:24:17 +02:00
1c6794dc40 Renamed cpl to cpl_core & added config and services as arguments to startup 2021-08-07 11:21:30 +02:00
cac80657df Renamed cpl to cpl_core 2021-08-05 14:21:42 +02:00
11241d8f99 Renamed project 2021-08-05 14:17:38 +02:00
308e5c9b0c Merge pull request '2021.10.4' (#37) from 2021.10.4 into 2021.10
Reviewed-on: sh-edraft.de/sh_cpl#37
Closed #32
2021-08-05 14:04:45 +02:00
c12ff4f9e3 Added logic to migrate attributes from workspace and project settings 2021-08-05 14:02:00 +02:00
091c89df2c Changed version of CLI 2021-08-05 13:37:40 +02:00
63a67be0ee Improved new command 2021-08-05 13:27:08 +02:00
c68224b31a Improved deps of cpl_query 2021-08-02 14:48:46 +02:00
9f219757c3 Merge pull request '2021.10.3' (#35) from 2021.10.3 into 2021.10
Reviewed-on: sh-edraft.de/sh_cpl#35
2021-08-02 14:36:45 +02:00
e09a4402b3 Published sh_cpl-query to version 2021.10.0rc1 2021-08-02 14:36:00 +02:00
6867eb0e65 Improved scripts 2021-08-02 14:14:50 +02:00
ffaa5c4a2b Refactoring 2021-08-02 14:09:42 +02:00
b9499108d8 Build cpl_query 2021-08-02 14:03:51 +02:00
37175b7227 Added queries sum, skip & take 2021-07-27 13:57:42 +02:00
2b5831c5fe Improved numbered queries 2021-07-27 13:00:06 +02:00
62c8b9c68d Added reverse query 2021-07-27 12:54:49 +02:00
a080119c44 Improved unittests 2021-07-27 12:48:22 +02:00
a26c6f1bd9 Improved avg, max and min queries type handling 2021-07-27 12:42:33 +02:00
daac14e099 Improved avg query 2021-07-27 12:35:14 +02:00
d4b5c32a21 Added min and max queries 2021-07-27 11:57:42 +02:00
c115afd736 Moved last queries 2021-07-27 11:47:13 +02:00
e7863a92e0 Added last query 2021-07-27 11:43:45 +02:00
82a9e3a23a Improved index out of range exception 2021-07-27 11:40:24 +02:00
a3a0a150a8 Added element at query 2021-07-27 11:29:52 +02:00
6951a19670 Renamed files 2021-07-27 11:22:29 +02:00
669133d491 Added distinct query 2021-07-27 11:20:35 +02:00
c60598b3f6 Added count query 2021-07-27 11:01:43 +02:00
45733b30ef Improved error handling 2021-07-27 10:59:24 +02:00
f8bd86692e Added contains query 2021-07-27 10:55:23 +02:00
5e5d86cf94 Added better exceptions 2021-07-27 09:41:51 +02:00
e0b7728719 Added avg query 2021-07-27 09:26:30 +02:00
0f85d4b9bc Refactoring & added all query 2021-07-27 09:15:19 +02:00
a3fff9c7d7 Build package 2021-07-26 15:55:08 +02:00
8dcf3a6768 Refactoring 2021-07-26 15:52:27 +02:00
94949394de Improved list to handle typing 2021-07-26 15:48:42 +02:00
b7be439381 Changed func type from str to Callable 2021-07-26 15:32:28 +02:00
0cae3428b9 Added order by functions 2021-07-26 15:21:57 +02:00
cc7755bafc Improved cli project builders 2021-07-25 19:18:06 +02:00
4e78b9c12b Added different queries & unittests 2021-07-25 19:15:02 +02:00
5c80cf2222 Added CPL Query 2021-07-25 12:24:58 +02:00
d02548e1a8 Merge pull request '2021.10.2' (#33) from 2021.10.2 into 2021.10
Reviewed-on: sh-edraft.de/sh_cpl#33
2021-07-25 12:05:12 +02:00
51efe973e8 Improved logic to handle pre and post scripts 2021-07-25 12:00:12 +02:00
0bb272d89b Added logic to handle pre and post scripts 2021-07-25 11:42:46 +02:00
59f6843ea9 Changed version 2021-07-24 17:25:06 +02:00
be6838f97b Added logic to handle custom scripts from workspaces 2021-07-24 17:24:01 +02:00
d5b2d3605b CPL Release 2021.4.0.post2 2021-05-23 12:41:59 +02:00
7a48917fb4 CLI Release 2021.4.0.post3 2021-05-22 15:10:50 +02:00
59832742b6 CLI Release 2021.4.0.post2 2021-05-22 12:55:17 +02:00
f9f04901c0 Bugfixes 2021-05-22 12:53:04 +02:00
593ffbb068 Updated cli project file 2021-05-19 09:03:31 +02:00
3d35f2ac63 Merge pull request '2021.4.post1' (#31) from 2021.4.post1 into master
Reviewed-on: sh-edraft.de/sh_cpl#31
2021-05-19 09:00:39 +02:00
5bfba581cb Release 2021.4.0.post1 2021-05-19 08:35:02 +02:00
8fb570468c More bugfixes & added generated test projects 2021-05-19 08:28:59 +02:00
128fda60b0 Release 2021.4.1.rc2 2021-05-19 08:19:21 +02:00
ab539c15dd Fixed source creation bug 2021-05-19 08:03:04 +02:00
b931ba6e17 Fixed source creation bug 2021-05-19 08:01:02 +02:00
f611aa73db Publish 2021.4.post1.rc1 2021-05-17 19:43:09 +02:00
69f697e36f Merge pull request '2021.4.4' (#30) from 2021.4.4 into 2021.4.post1
Reviewed-on: sh-edraft.de/sh_cpl#30
2021-05-17 18:34:58 +02:00
654fb69295 Added cli docs 2021-05-17 18:32:09 +02:00
850d44a105 Added docs to cpl.utils 2021-05-17 18:07:08 +02:00
8d4597705d Build docs 2021-05-17 17:55:20 +02:00
fa5655414a Added docs for cpl.mailing 2021-05-17 17:54:57 +02:00
6fc4cebbfe Added docs for cpl.logging 2021-05-17 17:45:22 +02:00
89f3c5833f Added docs for cpl.time 2021-05-17 17:30:26 +02:00
adf9a33e83 Added docs for cpl.environment 2021-05-17 17:28:52 +02:00
4adf6bc834 Added docs for cpl.dependency_injection 2021-05-17 17:22:41 +02:00
9026f021ed Improved docs for cpl.database 2021-05-17 17:13:36 +02:00
e562c31033 Added docs for cpl.database 2021-05-17 17:05:43 +02:00
7b90b5af57 Added docs for cpl.console 2021-05-16 17:42:09 +02:00
cda1fabd4f Added docs for cpl.configuration 2021-05-16 16:57:59 +02:00
4209055d62 Improved documentation for cpl.application 2021-04-14 22:20:18 +02:00
ed1a4eb88c Added cpl_cli docs & moved cpl_cli/templates -> cpl_cli/_templates 2021-04-14 10:58:47 +02:00
478f1ad0ff Added first sphinx generated doc 2021-04-14 10:45:39 +02:00
80eb1da0e1 Merge pull request '2021.4.7' (#29) from 2021.4.7 into 2021.4.post1
Reviewed-on: sh-edraft.de/sh_cpl#29
2021-04-13 15:47:24 +02:00
ae39d43ea9 Added useful deployment scripts & closed #22 2021-04-13 15:43:05 +02:00
602c48bc06 Bugfixes for help command handling 2021-04-13 15:27:19 +02:00
d34d501520 Bugfixes for help command 2021-04-12 20:22:28 +02:00
8f3ee53915 Fixed typos 2021-04-12 20:05:55 +02:00
7eca382cb3 Added help messages to cli commands 2021-04-12 20:02:45 +02:00
f8f5d46491 Added help message to generate command 2021-04-12 19:44:29 +02:00
696c62292b Added logic to cli to use --help option for help command 2021-04-12 19:43:55 +02:00
d94b25d9d8 Improved configuration console argument handling 2021-04-12 19:43:30 +02:00
93829027af Added help message to all cli commands 2021-04-11 16:36:59 +02:00
cce4b6b191 Merge pull request '2021.4.6' (#25) from 2021.4.6 into 2021.4.post1
Reviewed-on: sh-edraft.de/sh_cpl#25
2021-04-11 15:54:37 +02:00
0876f06282 Improved cpl-project related files & closed #20 2021-04-11 15:50:13 +02:00
c970412a66 Fixed relative path handling in add command 2021-04-11 15:42:34 +02:00
6af9328e14 Added cli command add 2021-04-11 15:36:04 +02:00
5987b71c80 Improved configuration to allow multiple arguments 2021-04-11 15:09:11 +02:00
79fdc0c60b Improved configuration to allow multiple arguments 2021-04-11 15:00:54 +02:00
cfb6a84799 Fixed console argument handling 2021-04-11 14:44:46 +02:00
faa7e701fd Fixed workspace loading error for update command 2021-04-11 14:21:59 +02:00
d5b8286f68 Fixed workspace loading error for update command 2021-04-11 13:23:02 +02:00
a3d5737eaf Fixed workspace loading error for update command 2021-04-11 13:20:32 +02:00
314bb1b722 Fixed workspace loading error for update command 2021-04-11 13:15:19 +02:00
1c353bbcdf Improved cli workspace handling 2021-04-11 13:00:26 +02:00
036b9dcc2d Added more functions to string 2021-04-11 13:00:05 +02:00
0fec5719bc Added remove to help command 2021-04-11 12:34:02 +02:00
3572081e43 Added remove command 2021-04-11 12:33:05 +02:00
8cf7f494b3 Improved configuration 2021-04-11 12:18:36 +02:00
b1165e169a Improved console argument value handling in configuration 2021-04-11 11:42:48 +02:00
284ebe1b11 Added logic to cpl cli to change cwd only when wanted 2021-04-11 11:12:39 +02:00
d51659db3e Improved cli build and publish to use project references 2021-04-11 11:01:57 +02:00
3aa3a874c9 Improved default cwd in ApplicationEnvironment 2021-04-11 10:04:55 +02:00
113d3199b1 Improved main.py templates for new command to handle local imports 2021-04-10 12:04:47 +02:00
5712a9ad67 Improved file creation new command 2021-04-10 11:50:35 +02:00
1f8d420749 Improved workspace handling in new command 2021-04-10 11:46:36 +02:00
9065ef901c Improved new command to handle existing projects better 2021-04-10 11:24:39 +02:00
b2c5d304f8 Improved path and name handling in new command 2021-04-10 11:14:37 +02:00
70ae7dd9e6 Fixed workspace creation error 2021-04-10 11:06:58 +02:00
94b122d677 Removed unused import 2021-04-10 11:05:31 +02:00
f6fc5d09e7 Improved path and name handling in new command 2021-04-10 11:01:56 +02:00
2b5c75cc67 Improved workspace handling to new command for console type 2021-04-09 22:41:04 +02:00
167f813bcf Removed dev outputs 2021-04-09 22:26:55 +02:00
7b9765e5b1 Improved readme 2021-04-09 22:16:43 +02:00
7ad01d4bdd Improved new command to use workspace when found 2021-04-09 22:09:55 +02:00
d19c47e571 Added cpl-env to gitignore 2021-04-09 20:52:50 +02:00
4bfc647b91 Improved live dev server to use venv 2021-04-09 20:42:15 +02:00
98117ed7ad Moved templates/[..]/src to templates/[..]/source to prevent 'src' exclusion 2021-04-09 20:26:31 +02:00
cc9b25356c Improved workspace and venv handling for uninstall and install command 2021-04-09 20:07:38 +02:00
a95d6e7f8a Improved configuration to handle absolute paths in add_json_file 2021-04-08 21:40:50 +02:00
fe5c41ac09 Added workspace handling to update command 2021-04-08 21:18:29 +02:00
b672174960 Added workspace handling to uninstall command 2021-04-08 21:14:38 +02:00
a8691ced5b Added workspace handling to install command 2021-04-08 21:12:00 +02:00
fc53f90ecd Added workspace handling for new command 2021-04-08 20:58:55 +02:00
0f836b5c7d Published after file move 2021-04-08 20:28:34 +02:00
34ed7123d1 Improved workspace handling in publish and build command 2021-04-08 20:28:19 +02:00
5f668e17c9 Improved workspace handling in start command 2021-04-08 19:30:00 +02:00
806888bf49 Removed content_root_path 2021-04-08 17:50:54 +02:00
e8756a09ca Improved general test project file 2021-04-08 16:46:46 +02:00
e38988be1b Changed project files of general test project 2021-04-07 22:11:22 +02:00
4009c93353 Added workspace handling to live dev server 2021-04-07 22:00:56 +02:00
3ba5c10fad Publish CLI 2021.4 2021-04-07 19:19:20 +02:00
2552f1d43c Added workspace handling to publish command 2021-04-07 19:18:55 +02:00
5be2e83798 Improved configuration 2021-04-07 18:57:00 +02:00
d4919e027c Removed console output 2021-04-07 18:37:57 +02:00
7ef238b64d Added workspace handling to build command 2021-04-07 18:36:08 +02:00
703d20f43f Improved version handling 2021-04-07 18:35:14 +02:00
d9bd7911ef Improved start command to use workspace 2021-04-07 18:19:55 +02:00
6a5c832288 Added new file structure 2021-04-07 18:19:34 +02:00
dc849c4f71 Improved application environment 2021-04-07 18:06:07 +02:00
76a6ba11fb Publish 2021.4.post1 for local dev 2021-04-07 17:01:39 +02:00
305a19730f Merge pull request 'Fixed #21 - Added logic to automatically add 'src' to path in generate command' (#24) from 2021.4.5 into 2021.4.post1
Reviewed-on: sh-edraft.de/sh_cpl#24
2021-04-07 16:59:24 +02:00
de15e81703 Fixed #21 - Added logic to automatically add 'src' to path in generate command 2021-04-07 16:55:44 +02:00
b91544a0da Edited LICENSE 2021-04-01 11:09:50 +02:00
caca34168e Merge pull request '2021.4' (#19) from 2021.4 into master
Reviewed-on: sh-edraft.de/sh_common_py_lib#19
2021-04-01 10:13:32 +02:00
18b8ac589d Publish 2021.4.0 2021-04-01 10:04:13 +02:00
d85e628784 Improved readme 2021-03-31 15:51:14 +02:00
1e150cf10c Improved readme 2021-03-31 15:49:52 +02:00
9b0f0b7559 Improved readme 2021-03-31 15:49:00 +02:00
cc118b5030 Merge pull request '2021.04.03 - Readme' (#18) from 2021.04.03 into 2021.4
Reviewed-on: sh-edraft.de/sh_common_py_lib#18
2021-03-31 15:42:40 +02:00
3e7ff78861 Merge branch '2021.4' into 2021.04.03 2021-03-31 15:40:18 +02:00
448d538d21 Updated reame 2021-03-31 15:38:26 +02:00
d368161eb3 Publish 2021.4.0rc7 2021-03-31 12:11:55 +02:00
eef8488ca2 Bugfixes for new lib 2021-03-31 12:11:19 +02:00
b22d04b145 Publish 2021.4.0rc6 2021-03-31 12:03:15 +02:00
6579e54c2b Improved windows support 2021-03-31 12:02:51 +02:00
88c0153ca2 Improved windows support for publisher 2021-03-31 11:55:46 +02:00
f28c6ab309 Removed prints 2021-03-31 11:51:20 +02:00
976041f812 Publish 2021.4.0rc5 2021-03-31 11:48:26 +02:00
7693dd462f Bugfixes for publisher windows support 2021-03-31 11:47:47 +02:00
df5e61cf98 Bugfixes for publisher windows support 2021-03-31 11:47:28 +02:00
df87d08be3 Bugfix for live server windows support 2021-03-31 11:41:16 +02:00
33cb35e26f Publish 2021.4.0rc4.post1 2021-03-31 11:25:07 +02:00
18b2cd8f2f Publish 2021.4.0rc4 2021-03-31 11:01:08 +02:00
7ab2a881e8 Bugfixes 2021-03-31 10:47:14 +02:00
960de880ee Bugfixes 2021-03-31 10:44:54 +02:00
c0d8904782 Bugfixes for the command new 2021-03-31 10:19:54 +02:00
b6d508526a Bugfixes for the command new 2021-03-31 09:46:41 +02:00
31307485f0 Bugfixes in new command template 2021-03-31 09:13:04 +02:00
612c3583f1 Removed ununsed files 2021-03-30 21:02:36 +02:00
6cdd3376f1 Publish 2021.4.0rc3 2021-03-30 21:01:10 +02:00
b947789779 Bugfixes 2021-03-30 20:59:09 +02:00
0da83935fc Bugfixes 2021-03-30 12:44:31 +02:00
3428c70b69 Bugfixes 2021-03-30 11:54:44 +02:00
3d511ff727 Bugfixes 2021-03-30 11:53:07 +02:00
cf2f293290 Publish 2021.4.0rc2 2021-03-30 11:03:16 +02:00
c39601a35d Improved publisher 2021-03-30 11:02:58 +02:00
5f36e0a43e Improved publisher 2021-03-30 10:43:39 +02:00
31fe1c5cd7 Improved service collection 2021-03-30 10:29:50 +02:00
0cdecd893a Improved database context 2021-03-30 10:06:07 +02:00
260fe06be8 Improved new command 2021-03-30 09:54:04 +02:00
8ddfd35a82 Improved generate command 2021-03-30 09:47:47 +02:00
099bae3d7c Removed usage of ServiceABC 2021-03-30 09:27:45 +02:00
9758e1fae2 Improved update command 2021-03-29 16:16:27 +02:00
211143d6ab Package update 2021-03-29 16:06:54 +02:00
70b49a098a Publish 2021.4.0rc1 2021-03-29 15:59:05 +02:00
e2544f90fe Merge pull request '2021.4.2' (#12) from 2021.4.2 into 2021.4
Reviewed-on: sh-edraft.de/sh_common_py_lib#12
2021-03-29 15:48:58 +02:00
c223524d1b Removed direct import 2021-03-29 15:47:41 +02:00
1789e2671a Publish 2021.4.2 2021-03-29 15:26:45 +02:00
d0812bcf5c Added database table test 2021-03-29 14:29:17 +02:00
4d5368e5fc Bugfixes & improved database context handling 2021-03-29 14:18:58 +02:00
f3be927440 Removed service abc 2021-03-29 13:29:26 +02:00
d0e3e1792f Added db context handling 2021-03-29 13:25:25 +02:00
31793fb290 Added db context handling 2021-03-29 13:25:15 +02:00
41ddc86961 Bugfixes 2021-03-29 12:16:12 +02:00
30ef74dd18 Added generated simple di test app 2021-03-29 11:48:25 +02:00
bc69476bb2 Improved new project templates & publish 2021.4.2.dev1 2021-03-29 11:47:49 +02:00
05b9fd801b Bugfixes 2021-03-29 09:21:58 +02:00
7af7f866c1 Removed application runtime | Code refactoring p.2 2021-03-29 08:56:18 +02:00
069e44bee6 Code refactoring p.1 2021-03-27 08:41:33 +01:00
3c0dd00a99 Bugfixes 2021-03-26 13:16:40 +01:00
afb91c8f1f Improved service provider 2021-03-23 21:42:08 +01:00
ca51f88d2b Improved service provider 2021-03-23 21:39:29 +01:00
a683b70c5f [WIP] Improved service collection 2021-03-23 20:23:30 +01:00
c650e87443 [WIP] Added first changes for the DI 2021-03-23 20:21:24 +01:00
36dfedf918 Bugfixes cpl cli output 2021-03-23 17:31:24 +01:00
252f2b55fe Bugfixes in templates 2021-03-23 17:29:13 +01:00
99091a2540 Publish for 2021.4.2 2021-03-21 20:22:04 +01:00
c3fdb7a049 Changed version 2021-03-21 20:05:51 +01:00
5ba02688a6 Merge pull request '2021.04.01' (#11) from 2021.04.01 into 2021.04
Reviewed-on: sh-edraft.de/sh_common_py_lib#11
2021-03-21 20:04:23 +01:00
d189d32d96 Bugfixes & publish 2021.4.1.post15 2021-03-21 20:01:50 +01:00
59e111e593 Bugfixes 2021-03-19 14:36:32 +01:00
bfa029f207 Bugfixes 2021-03-19 14:20:57 +01:00
e2e763a424 Removed application host 2021-03-19 14:15:53 +01:00
132d2805ee Removed unused imports 2021-03-17 11:00:45 +01:00
b800152268 Test package update 2021-03-17 09:13:59 +01:00
e49ec43fc4 Bugfixes & Publish 2021.4.1.post13 2021-03-17 09:12:10 +01:00
63599a9ade Publish 2021.4.1.post12 2021-03-17 09:06:07 +01:00
a2313ac952 Improved python executable handling 2021-03-17 08:55:23 +01:00
a1cd939aa1 Bugfixes in install command 2021-03-17 08:37:50 +01:00
f69500418e Bugfixes in install command 2021-03-17 08:12:56 +01:00
5669807628 Bugfixes in install command 2021-03-17 07:59:12 +01:00
59fc139cfc Bugfixes in install command 2021-03-16 23:05:28 +01:00
b48754e5db Bugfixes in install command 2021-03-16 23:01:57 +01:00
1a61f2cd7c Bugfixes in install command 2021-03-16 23:00:22 +01:00
02831c71c9 Bugfixes in install command 2021-03-16 22:58:00 +01:00
3764f2d5bd Bugfixes in install command 2021-03-16 22:55:00 +01:00
a12a54f671 Bugfixes in install command 2021-03-16 22:46:04 +01:00
f35f5167f0 Bugfixes in install command 2021-03-16 22:39:18 +01:00
dbb0a4a2df Bugfixes in live development server 2021-03-16 22:29:30 +01:00
bc99763329 Command handling config bugfix 2021-03-16 22:09:42 +01:00
ecd3e77a38 Command handling config bugfix 2021-03-16 22:06:37 +01:00
8ef1416b35 Bugfixes for windows support 2021-03-16 21:50:16 +01:00
Sven Heidemann
dffa1ac703 Bugfixes for windows support 2021-03-16 21:37:12 +01:00
d7becdd9bc Added fixed paths imports 2021-03-16 19:04:30 +01:00
23a6207f54 Spinner bugfix 2021-03-16 18:55:58 +01:00
2769afc1e4 Bugfixes for cli 2021-03-16 18:28:41 +01:00
08836c1045 Bugfixes for cli 2021-03-16 18:28:31 +01:00
121b9b84a0 Console spinner bugfixes for linux terminal 2021-03-15 20:33:20 +01:00
26ec121079 Console select menu bugfixes for linux terminal 2021-03-15 20:06:34 +01:00
fdb9769fd2 Bugfixes 2021-03-15 18:50:53 +01:00
6742023919 Bugfixes 2021-03-15 18:47:08 +01:00
d61da17ebd Publish 2021.4.1.post5 2021-03-15 18:37:21 +01:00
57bae9f291 Console bugfixes 2021-03-15 18:36:59 +01:00
6596364027 Publish 2021.4.1.post4 2021-03-15 18:29:04 +01:00
85cd9fbcbc Smaller improvements 2021-03-15 18:28:33 +01:00
3e59f01add Bugfixes with live development server 2021-03-15 18:25:53 +01:00
bdb0548bc8 Removed docs 2021-03-14 17:04:18 +01:00
c1fe8c611c Added comments to application 2021-03-14 16:57:20 +01:00
3f56247aa7 Added comments to configuration 2021-03-14 16:46:21 +01:00
84680c0c44 Added comments to console 2021-03-14 16:40:01 +01:00
094a3c2aa9 Improved comments of database 2021-03-14 16:28:23 +01:00
51cec3062d Added comments to database 2021-03-14 16:27:06 +01:00
268d56c348 Added comments to dependency_injection 2021-03-14 16:25:11 +01:00
d1f1627214 Improved comments of environment 2021-03-14 16:20:29 +01:00
a604fca5cc Improved comments of mailing 2021-03-14 16:18:11 +01:00
c3e9803cd6 Improved comments of logging 2021-03-14 16:18:04 +01:00
9e7c6a695f Improved comments of logging 2021-03-14 16:16:08 +01:00
f75699f4ed Added comments to logging 2021-03-14 16:13:07 +01:00
40fb4fb3f9 Added comments to mailing 2021-03-14 16:08:52 +01:00
ac1b4b1a2a Added comments 2021-03-14 16:06:23 +01:00
cbf333564c Added comments 2021-03-14 16:01:15 +01:00
d5d8c3f413 Improved help command 2021-03-14 15:26:08 +01:00
a9f3f75a79 Improved help command 2021-03-14 15:15:07 +01:00
b52930daa5 Bugfixes and publish 2021.4.1post1 2021-03-14 15:11:36 +01:00
4390fea084 Bugfixes 2021-03-14 14:59:17 +01:00
c41e3c0d78 Bugfixes 2021-03-14 14:47:53 +01:00
7ffd553709 Bugfixes 2021-03-14 13:22:10 +01:00
5c012ab4a0 Publish version 2021.4.1post1 2021-03-14 12:11:02 +01:00
340906c3f4 Bugfixes 2021-03-14 12:07:40 +01:00
47256ab00d Bugfixes 2021-03-14 12:07:24 +01:00
072f58a2e9 Bugfixes 2021-03-14 12:05:57 +01:00
02b4f78baf Bugfixes 2021-03-14 11:54:03 +01:00
49f85acb6c Bugfixes 2021-03-14 11:33:29 +01:00
5008594c27 Bugfixes 2021-03-14 11:27:01 +01:00
d0af34ea25 Bugfixes 2021-03-14 11:15:43 +01:00
da582a8d88 Added uninstall command 2021-03-14 10:58:59 +01:00
fc12d1803d Improved update command 2021-03-14 10:33:57 +01:00
e7796e0371 Improved install command 2021-03-14 10:31:45 +01:00
6094b11068 Added install package command 2021-03-13 22:53:28 +01:00
a169c31ed5 Bugfixes 2021-03-13 22:32:11 +01:00
0522467b76 Bugfixes 2021-03-13 22:03:24 +01:00
534982b18d Added update command 2021-03-13 21:39:59 +01:00
2778ac0b4d Bugfixes 2021-03-13 21:36:04 +01:00
1ba698d12a Bugfixes 2021-03-13 15:59:08 +01:00
8d49d6491c Bugfixes 2021-03-13 14:25:08 +01:00
787d285329 Improved live dev server 2021-03-13 11:15:15 +01:00
dcbd13de1e Added live development server 2021-03-13 11:05:17 +01:00
4af18b6c70 Implemented live development server 2021-03-12 22:53:02 +01:00
86089a037c Improved console spinner 2021-03-12 20:43:08 +01:00
3d001ade0a Bugfixes 2021-03-12 20:37:31 +01:00
6a1e7d4063 Formatting 2021-03-12 18:07:10 +01:00
15b1a82cce Added select menu to console 2021-03-12 18:06:05 +01:00
9663e542f1 Improved spinner 2021-03-12 16:16:31 +01:00
f36d8c3e9f Improved test structure 2021-03-12 16:13:17 +01:00
db21d88721 Packaging 2021-03-12 16:10:43 +01:00
2580d4b6cf Renamed by internal conventions 2021-03-12 16:06:30 +01:00
b3b65f3dd2 Added thread schematic 2021-03-12 16:01:44 +01:00
ac63751583 Renamed by internal convention 2021-03-12 15:58:30 +01:00
8a95c03038 Bugfixes 2021-03-12 15:44:55 +01:00
650f632c17 Bugfixes 2021-03-12 15:35:54 +01:00
570e9b0215 Changed naming convention name.schematic.py to name_schematic.py 2021-03-12 15:35:34 +01:00
c9b612d552 Added all schematics to command generate 2021-03-12 15:32:37 +01:00
2ad97d5021 Bugfixes 2021-03-11 09:43:45 +01:00
82ffdfe278 Added generate abc command 2021-03-10 22:29:42 +01:00
0ff9920e9e Added string class to utils 2021-03-10 22:11:05 +01:00
0b6b205819 Bugfixes 2021-03-10 21:42:59 +01:00
db34f62fde Bugfixes 2021-03-10 21:41:40 +01:00
973fd39f44 Improved colors 2021-03-10 20:55:33 +01:00
d6278a3f4e Improved colors 2021-03-10 20:53:08 +01:00
ae4709b0d4 Improved spinner 2021-03-10 20:34:00 +01:00
b377710931 Improved new console command 2021-03-10 17:04:53 +01:00
d9d2003087 Improved console 2021-03-10 17:04:28 +01:00
9a713129dc Improved console argument handling 2021-03-10 16:22:38 +01:00
c672f53d3f Improved console argument handling 2021-03-10 15:00:50 +01:00
0e6b0a657b Improved commands 2021-03-10 14:29:35 +01:00
4e24662d90 Bugfixes 2021-03-10 14:16:03 +01:00
1bff2ea168 Refactoring 2021-03-10 14:07:52 +01:00
6e33f0bcae Improved application 2021-03-10 11:30:25 +01:00
9a149ec341 Improved new console command 2021-03-10 11:28:04 +01:00
064237904a Improved console 2021-03-10 10:49:40 +01:00
221017ae7e Improved console 2021-03-10 09:04:53 +01:00
59206dbc32 Improved spinner 2021-03-10 08:17:52 +01:00
f4ca76d844 Improved template handling 2021-03-10 08:09:56 +01:00
31515d2c3a Fixed help command & edited project structure doc 2021-03-09 22:31:54 +01:00
314049f22b Added command new console 2021-03-09 22:29:14 +01:00
87c6899949 Improved publishing 2021-03-09 22:26:54 +01:00
e8afff0e48 Improved publishing 2021-03-09 21:07:47 +01:00
11399d7ea7 Removed print 2021-03-09 18:30:05 +01:00
35752b2ae0 Removed print 2021-03-09 18:29:59 +01:00
ff0830c128 Bugfixes in configuration console argument handling 2021-03-09 18:27:16 +01:00
c574a44a26 Bugfixes in configuration console argument handling 2021-03-09 18:27:09 +01:00
b178e884f6 Bugfixes 2021-03-09 14:35:45 +01:00
1097477a10 Removed .idea 2021-03-08 22:33:24 +01:00
88142ead23 Revert "Readded workspace"
This reverts commit 243e48e8
2021-03-08 22:32:56 +01:00
243e48e8a9 Readded workspace 2021-03-08 22:32:11 +01:00
22858c8d2c Removed workspace 2021-03-08 22:31:20 +01:00
3740996db3 Bugfixes 2021-03-08 22:29:28 +01:00
82ea419088 Added imports 2021-03-08 22:19:36 +01:00
2ffb101442 Bugfixes 2021-03-08 22:14:37 +01:00
8f46e82905 Improved gitignore 2021-03-08 22:02:59 +01:00
e8538d751b Added modules imports 2021-03-08 22:02:16 +01:00
964a44a393 Bugfixes 2021-03-08 21:52:11 +01:00
1bbbb2d8e1 Changed configuration to upper case 2021-03-08 20:49:26 +01:00
f931ccb7dd Changed copyright date 2021-03-08 20:40:54 +01:00
3e33a8a773 Bugfixes in build process 2021-03-08 20:32:09 +01:00
2d7496dd6e Bugfixes in build process 2021-03-08 20:29:54 +01:00
f9826e28a5 Added publish logic 2021-03-08 20:29:08 +01:00
5f1b56f30b Added argument handling to spinner 2021-03-05 17:14:19 +01:00
562bb81379 Fixed output when console is spinning 2021-03-05 17:09:12 +01:00
0a630f9316 Bugfix 2021-03-05 16:53:26 +01:00
49f461037a Bugfix 2021-03-05 16:43:59 +01:00
9a0d36ca86 Improved publisher 2021-03-05 16:31:27 +01:00
1dfae27d88 Improved spinner 2021-03-05 16:27:38 +01:00
570ede237e Added spinner 2021-03-05 15:55:14 +01:00
236597848a Improved workspace 2021-03-04 23:26:35 +01:00
d3e1d3c368 Readded workspace.xml 2021-03-04 23:24:48 +01:00
b7f628979e Ran build command 2021-03-04 21:57:30 +01:00
83d0451591 Added build command 2021-03-04 21:57:18 +01:00
700bf9c937 Improved command handling 2021-03-04 19:06:53 +01:00
2c43e55f77 Improved command handling 2021-03-04 19:06:37 +01:00
69211cc9e8 Improved dependency injection 2021-03-04 19:06:16 +01:00
6452226b50 Improved configuration 2021-03-04 18:12:51 +01:00
01ef965180 Improved service providing 2021-03-04 17:55:15 +01:00
956a107d38 Improved commands 2021-03-04 17:36:02 +01:00
266f9945f4 Improved ServiceProvider 2021-03-04 17:29:04 +01:00
3b6121c9cf Removed workspace from git 2021-03-04 07:19:28 +01:00
ce1f057f71 Improved command handler 2021-03-04 07:18:36 +01:00
226123a81f Improved application 2021-03-04 07:15:48 +01:00
aa4931fd18 Improved application 2021-03-04 07:09:08 +01:00
164c639d29 Added cpl.json 2021-03-04 06:55:37 +01:00
960607a60d Improved application host 2021-03-04 06:53:38 +01:00
2c2c1ede21 Smaller bugfixes 2021-03-04 06:42:40 +01:00
8872d1bfe7 Improved cli 2021-03-03 19:48:55 +01:00
d5975ea7ba Improved help command 2021-03-03 19:47:55 +01:00
2174cf3701 Added version and help cli command 2021-03-03 19:37:35 +01:00
7a2f4584b0 Improved application 2021-03-03 19:37:18 +01:00
7223651322 Improved gitignore 2021-03-03 18:38:34 +01:00
9581283d7d Added cli application 2021-03-03 18:37:54 +01:00
b32f846fcf Improved configuration 2021-03-03 18:37:39 +01:00
ed0b761502 Removed old sources 2021-03-03 10:51:33 +01:00
68c136a16f Refactored code 2021-03-03 10:47:52 +01:00
662 changed files with 20161 additions and 5791 deletions

11
.gitignore vendored
View File

@@ -37,7 +37,7 @@ MANIFEST
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
# Unit model / coverage reports
htmlcov/
.tox/
.nox/
@@ -106,10 +106,14 @@ celerybeat.pid
.venv
env/
venv/
venv_*/
ENV/
env.bak/
venv.bak/
# Custom Environments
cpl-env/
# Spyder project settings
.spyderproject
.spyproject
@@ -129,5 +133,8 @@ dmypy.json
.pyre/
# IDE
.vscode/
.idea/
PythonImportHelper-v2-Completion.json
# cpl unittest stuff
unittests/test_*_playground

View File

@@ -1,3 +0,0 @@
<component name="ProjectDictionaryState">
<dictionary name="sven" />
</component>

View File

@@ -1,17 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="termcolor" />
<item index="1" class="java.lang.String" itemvalue="discord" />
<item index="2" class="java.lang.String" itemvalue="mysql-connector" />
<item index="3" class="java.lang.String" itemvalue="flask" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>

View File

@@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated
View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectPlainTextFileTypeManager">
<file url="file://$PROJECT_DIR$/publish_templates/all_template.txt" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/sh_common_py_lib.iml" filepath="$PROJECT_DIR$/.idea/sh_common_py_lib.iml" />
</modules>
</component>
</project>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/dist" />
<excludeFolder url="file://$MODULE_DIR$/src/tests/logs" />
<excludeFolder url="file://$MODULE_DIR$/src/tests_dev/logs" />
<excludeFolder url="file://$MODULE_DIR$/src/sh_edraft.egg-info" />
<excludeFolder url="file://$MODULE_DIR$/src/dist" />
<excludeFolder url="file://$MODULE_DIR$/src/build" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/src/tests/old" />
<excludeFolder url="file://$MODULE_DIR$/.vscode" />
<excludeFolder url="file://$MODULE_DIR$/build_test" />
</content>
<orderEntry type="jdk" jdkName="Python 3.9" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +0,0 @@
<changelist name="Uncommitted_changes_before_Update_at_26_11_2020_10_36_[Default_Changelist]" date="1606383362450" recycled="false" toDelete="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_26_11_2020_10_36_[Default_Changelist]/shelved.patch" />
<option name="DESCRIPTION" value="Uncommitted changes before Update at 26.11.2020 10:36 [Default Changelist]" />
</changelist>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

868
.idea/workspace.xml generated
View File

@@ -1,868 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="BranchesTreeState">
<expand>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
</path>
</expand>
<select />
</component>
<component name="ChangeListManager">
<list default="true" id="7e2256bc-a6b8-4880-83a6-8b0e3372d0a4" name="Default Changelist" comment="Removed unused packages">
<change afterPath="$PROJECT_DIR$/src/tests/publish_test/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/tests/publish_test/publisher_test.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/tests/setup.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/sh_common_py_lib.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/sh_common_py_lib.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/build/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/build/app.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/publish/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/publish/app.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/base/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/base/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/base/publisher_base.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/base/publisher_base.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/model/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/model/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/model/publish_settings_model.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/model/publish_settings_model.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/model/publish_settings_name.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/model/publish_settings_name.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/model/template.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/model/template.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/model/template_enum.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/model/template_enum.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/sh_edraft/publishing/publisher.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/sh_edraft/publish/publisher.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/appsettings.edrafts-lapi.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/appsettings.edrafts-lapi.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/appsettings.edrafts-pc.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/appsettings.edrafts-pc.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/build.json" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/build.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/service_test/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/service_test/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/time_test/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/time_test/__init__.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/tests/utils_test/__init__.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/tests/utils_test/__init__.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
<option value="Python Unit Test" />
</list>
</option>
</component>
<component name="Git.Pull.Settings">
<option name="BRANCH" value="2020.12.6" />
</component>
<component name="Git.Rebase.Settings">
<option name="NEW_BASE" value="2020.12" />
</component>
<component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="2020.12" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
<option name="RESET_MODE" value="HARD" />
<option name="UPDATE_TYPE" value="REBASE" />
</component>
<component name="ProjectId" id="1kYeNqJzjIXigSYYCzg4D16FL1E" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/tests" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/tests" />
<recent name="$PROJECT_DIR$/src/tests_dev" />
<recent name="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/database" />
<recent name="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/publish" />
<recent name="$PROJECT_DIR$/src" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/tests" />
<recent name="$PROJECT_DIR$/src/tests/publish_test" />
<recent name="$PROJECT_DIR$/src/tests/old" />
<recent name="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/commands/build" />
<recent name="$PROJECT_DIR$/src" />
</key>
</component>
<component name="RunManager" selected="Python tests.Unittests">
<configuration name="cli build" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="build test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli database migration" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/tests_dev" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="db mig add InitialMigration" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli database update" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/tests_dev" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="database update" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli help" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="help" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli new app" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="new app ./Test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli new base" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="new app ./Test/Test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli new class" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="new class ./Test/Test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli new configmodel" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="new configmodel ./Test/Test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli new enum" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="new enum ./Test/Test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli new service" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="new service ./Test/Test" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli publish" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="publish" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli version" type="PythonConfigurationType" factoryName="Python">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="version" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="cli" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/sh_edraft/cli/cpl_cli/cli.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="main" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="CPL_NAME" value="CPL_Dev_Test" />
<env name="PYTHON_ENVIRONMENT" value="development" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/tests_dev" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/tests_dev/main.py" />
<option name="PARAMETERS" value="--customer=sh-edraft.de" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="true" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="Unittests" type="tests" factoryName="Unittests" temporary="true" nameIsGenerated="true">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="CPL_ENVIRONMENT" value="testing" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="_new_pattern" value="&quot;&quot;" />
<option name="_new_additionalArguments" value="&quot;discover -s $PROJECT_DIR$/src/tests -p \u0027*_test.py\u0027&quot;" />
<option name="_new_target" value="&quot;&quot;" />
<option name="_new_targetType" value="&quot;CUSTOM&quot;" />
<method v="2" />
</configuration>
<configuration name="Unittests" type="tests" factoryName="Unittests" temporary="true" nameIsGenerated="true">
<module name="sh_common_py_lib" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="CPL_ENVIRONMENT" value="testing" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="_new_pattern" value="&quot;&quot;" />
<option name="_new_additionalArguments" value="&quot;discover -s $PROJECT_DIR$/src/tests -p \u0027*_test.py\u0027&quot;" />
<option name="_new_target" value="&quot;&quot;" />
<option name="_new_targetType" value="&quot;CUSTOM&quot;" />
<method v="2" />
</configuration>
<list>
<item itemvalue="Python.cli build" />
<item itemvalue="Python.cli database migration" />
<item itemvalue="Python.cli database update" />
<item itemvalue="Python.cli help" />
<item itemvalue="Python.cli new app" />
<item itemvalue="Python.cli new base" />
<item itemvalue="Python.cli new class" />
<item itemvalue="Python.cli new configmodel" />
<item itemvalue="Python.cli new enum" />
<item itemvalue="Python.cli new service" />
<item itemvalue="Python.cli publish" />
<item itemvalue="Python.cli version" />
<item itemvalue="Python.cli" />
<item itemvalue="Python.main" />
<item itemvalue="Python tests.Unittests" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python tests.Unittests" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="7e2256bc-a6b8-4880-83a6-8b0e3372d0a4" name="Default Changelist" comment="" />
<created>1605881914521</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1605881914521</updated>
</task>
<task id="LOCAL-00031" summary="Improved database module structure">
<created>1607285697331</created>
<option name="number" value="00031" />
<option name="presentableId" value="LOCAL-00031" />
<option name="project" value="LOCAL" />
<updated>1607285697331</updated>
</task>
<task id="LOCAL-00032" summary="Improved database module structure">
<created>1607620265254</created>
<option name="number" value="00032" />
<option name="presentableId" value="LOCAL-00032" />
<option name="project" value="LOCAL" />
<updated>1607620265254</updated>
</task>
<task id="LOCAL-00033" summary="Changed DatabaseConnection">
<created>1607712129507</created>
<option name="number" value="00033" />
<option name="presentableId" value="LOCAL-00033" />
<option name="project" value="LOCAL" />
<updated>1607712129507</updated>
</task>
<task id="LOCAL-00034" summary="Improved session reference">
<created>1607971885250</created>
<option name="number" value="00034" />
<option name="presentableId" value="LOCAL-00034" />
<option name="project" value="LOCAL" />
<updated>1607971885250</updated>
</task>
<task id="LOCAL-00035" summary="Added console module">
<created>1607976456889</created>
<option name="number" value="00035" />
<option name="presentableId" value="LOCAL-00035" />
<option name="project" value="LOCAL" />
<updated>1607976456889</updated>
</task>
<task id="LOCAL-00036" summary="Added console module">
<created>1607976626173</created>
<option name="number" value="00036" />
<option name="presentableId" value="LOCAL-00036" />
<option name="project" value="LOCAL" />
<updated>1607976626173</updated>
</task>
<task id="LOCAL-00037" summary="Improved console">
<created>1608037411172</created>
<option name="number" value="00037" />
<option name="presentableId" value="LOCAL-00037" />
<option name="project" value="LOCAL" />
<updated>1608037411172</updated>
</task>
<task id="LOCAL-00038" summary="Improved console">
<created>1608047595029</created>
<option name="number" value="00038" />
<option name="presentableId" value="LOCAL-00038" />
<option name="project" value="LOCAL" />
<updated>1608047595029</updated>
</task>
<task id="LOCAL-00039" summary="Improved ApplicationHost">
<created>1608047655667</created>
<option name="number" value="00039" />
<option name="presentableId" value="LOCAL-00039" />
<option name="project" value="LOCAL" />
<updated>1608047655667</updated>
</task>
<task id="LOCAL-00040" summary="Improved publisher">
<created>1608048544558</created>
<option name="number" value="00040" />
<option name="presentableId" value="LOCAL-00040" />
<option name="project" value="LOCAL" />
<updated>1608048544558</updated>
</task>
<task id="LOCAL-00041" summary="Improved publisher">
<created>1608049672925</created>
<option name="number" value="00041" />
<option name="presentableId" value="LOCAL-00041" />
<option name="project" value="LOCAL" />
<updated>1608049672925</updated>
</task>
<task id="LOCAL-00042" summary="Published for 2020.12.9">
<created>1608049772153</created>
<option name="number" value="00042" />
<option name="presentableId" value="LOCAL-00042" />
<option name="project" value="LOCAL" />
<updated>1608049772153</updated>
</task>
<task id="LOCAL-00043" summary="Publish improvements for pip install">
<created>1608059323858</created>
<option name="number" value="00043" />
<option name="presentableId" value="LOCAL-00043" />
<option name="project" value="LOCAL" />
<updated>1608059323858</updated>
</task>
<task id="LOCAL-00044" summary="Improved setup.py">
<created>1608059501153</created>
<option name="number" value="00044" />
<option name="presentableId" value="LOCAL-00044" />
<option name="project" value="LOCAL" />
<updated>1608059501153</updated>
</task>
<task id="LOCAL-00045" summary="Added first cli commands">
<created>1608066984496</created>
<option name="number" value="00045" />
<option name="presentableId" value="LOCAL-00045" />
<option name="project" value="LOCAL" />
<updated>1608066984496</updated>
</task>
<task id="LOCAL-00046" summary="Bugfixes and improved setup logic">
<created>1608070231599</created>
<option name="number" value="00046" />
<option name="presentableId" value="LOCAL-00046" />
<option name="project" value="LOCAL" />
<updated>1608070231599</updated>
</task>
<task id="LOCAL-00047" summary="Improved cli">
<created>1608122289003</created>
<option name="number" value="00047" />
<option name="presentableId" value="LOCAL-00047" />
<option name="project" value="LOCAL" />
<updated>1608122289003</updated>
</task>
<task id="LOCAL-00048" summary="Added version command to cli">
<created>1608125743068</created>
<option name="number" value="00048" />
<option name="presentableId" value="LOCAL-00048" />
<option name="project" value="LOCAL" />
<updated>1608125743068</updated>
</task>
<task id="LOCAL-00049" summary="Improved version command &amp; improved help command">
<created>1608127752645</created>
<option name="number" value="00049" />
<option name="presentableId" value="LOCAL-00049" />
<option name="project" value="LOCAL" />
<updated>1608127752645</updated>
</task>
<task id="LOCAL-00050" summary="Improved cli error handling">
<created>1608127998033</created>
<option name="number" value="00050" />
<option name="presentableId" value="LOCAL-00050" />
<option name="project" value="LOCAL" />
<updated>1608127998034</updated>
</task>
<task id="LOCAL-00051" summary="Removed module template">
<created>1608128026922</created>
<option name="number" value="00051" />
<option name="presentableId" value="LOCAL-00051" />
<option name="project" value="LOCAL" />
<updated>1608128026922</updated>
</task>
<task id="LOCAL-00052" summary="Added build command to cli">
<created>1608133651981</created>
<option name="number" value="00052" />
<option name="presentableId" value="LOCAL-00052" />
<option name="project" value="LOCAL" />
<updated>1608133651982</updated>
</task>
<task id="LOCAL-00053" summary="Improved publish process">
<created>1608136663213</created>
<option name="number" value="00053" />
<option name="presentableId" value="LOCAL-00053" />
<option name="project" value="LOCAL" />
<updated>1608136663213</updated>
</task>
<task id="LOCAL-00054" summary="Improved publish process">
<created>1608137669182</created>
<option name="number" value="00054" />
<option name="presentableId" value="LOCAL-00054" />
<option name="project" value="LOCAL" />
<updated>1608137669182</updated>
</task>
<task id="LOCAL-00055" summary="Added publish command to cli">
<created>1608138851088</created>
<option name="number" value="00055" />
<option name="presentableId" value="LOCAL-00055" />
<option name="project" value="LOCAL" />
<updated>1608138851088</updated>
</task>
<task id="LOCAL-00056" summary="Added imports to cli module">
<created>1608138986801</created>
<option name="number" value="00056" />
<option name="presentableId" value="LOCAL-00056" />
<option name="project" value="LOCAL" />
<updated>1608138986801</updated>
</task>
<task id="LOCAL-00057" summary="Improved help command">
<created>1608139067953</created>
<option name="number" value="00057" />
<option name="presentableId" value="LOCAL-00057" />
<option name="project" value="LOCAL" />
<updated>1608139067953</updated>
</task>
<task id="LOCAL-00058" summary="Changed deps">
<created>1608139239527</created>
<option name="number" value="00058" />
<option name="presentableId" value="LOCAL-00058" />
<option name="project" value="LOCAL" />
<updated>1608139239527</updated>
</task>
<task id="LOCAL-00059" summary="Bugfixes">
<created>1608139414722</created>
<option name="number" value="00059" />
<option name="presentableId" value="LOCAL-00059" />
<option name="project" value="LOCAL" />
<updated>1608139414722</updated>
</task>
<task id="LOCAL-00060" summary="Bugfixes">
<created>1608139502304</created>
<option name="number" value="00060" />
<option name="presentableId" value="LOCAL-00060" />
<option name="project" value="LOCAL" />
<updated>1608139502304</updated>
</task>
<task id="LOCAL-00061" summary="Removed publisher.py">
<created>1608139612476</created>
<option name="number" value="00061" />
<option name="presentableId" value="LOCAL-00061" />
<option name="project" value="LOCAL" />
<updated>1608139612476</updated>
</task>
<task id="LOCAL-00062" summary="Added first steps of database command">
<created>1608383809354</created>
<option name="number" value="00062" />
<option name="presentableId" value="LOCAL-00062" />
<option name="project" value="LOCAL" />
<updated>1608383809355</updated>
</task>
<task id="LOCAL-00063" summary="Improved error handling">
<created>1608383870849</created>
<option name="number" value="00063" />
<option name="presentableId" value="LOCAL-00063" />
<option name="project" value="LOCAL" />
<updated>1608383870849</updated>
</task>
<task id="LOCAL-00064" summary="Improved service providing">
<created>1608472168532</created>
<option name="number" value="00064" />
<option name="presentableId" value="LOCAL-00064" />
<option name="project" value="LOCAL" />
<updated>1608472168532</updated>
</task>
<task id="LOCAL-00065" summary="Added email client">
<created>1608472183294</created>
<option name="number" value="00065" />
<option name="presentableId" value="LOCAL-00065" />
<option name="project" value="LOCAL" />
<updated>1608472183294</updated>
</task>
<task id="LOCAL-00066" summary="Published">
<created>1608474022759</created>
<option name="number" value="00066" />
<option name="presentableId" value="LOCAL-00066" />
<option name="project" value="LOCAL" />
<updated>1608474022759</updated>
</task>
<task id="LOCAL-00067" summary="Improved publisher">
<created>1608474032244</created>
<option name="number" value="00067" />
<option name="presentableId" value="LOCAL-00067" />
<option name="project" value="LOCAL" />
<updated>1608474032244</updated>
</task>
<task id="LOCAL-00068" summary="Added imports">
<created>1608474289859</created>
<option name="number" value="00068" />
<option name="presentableId" value="LOCAL-00068" />
<option name="project" value="LOCAL" />
<updated>1608474289859</updated>
</task>
<task id="LOCAL-00069" summary="Removed build form gitignore, added build command">
<created>1608813096023</created>
<option name="number" value="00069" />
<option name="presentableId" value="LOCAL-00069" />
<option name="project" value="LOCAL" />
<updated>1608813096023</updated>
</task>
<task id="LOCAL-00070" summary="Added init file for build command package">
<created>1608813152266</created>
<option name="number" value="00070" />
<option name="presentableId" value="LOCAL-00070" />
<option name="project" value="LOCAL" />
<updated>1608813152266</updated>
</task>
<task id="LOCAL-00071" summary="Added pycharm files to gitignore">
<created>1608822597300</created>
<option name="number" value="00071" />
<option name="presentableId" value="LOCAL-00071" />
<option name="project" value="LOCAL" />
<updated>1608822597311</updated>
</task>
<task id="LOCAL-00072" summary="Added more development tests">
<created>1608823061488</created>
<option name="number" value="00072" />
<option name="presentableId" value="LOCAL-00072" />
<option name="project" value="LOCAL" />
<updated>1608823061489</updated>
</task>
<task id="LOCAL-00073" summary="Added new tester and CredentialManager TestCase">
<created>1608894745271</created>
<option name="number" value="00073" />
<option name="presentableId" value="LOCAL-00073" />
<option name="project" value="LOCAL" />
<updated>1608894745274</updated>
</task>
<task id="LOCAL-00074" summary="Bugfix">
<created>1608896199033</created>
<option name="number" value="00074" />
<option name="presentableId" value="LOCAL-00074" />
<option name="project" value="LOCAL" />
<updated>1608896199034</updated>
</task>
<task id="LOCAL-00075" summary="Added TimeFormatSettings Test">
<created>1608896235005</created>
<option name="number" value="00075" />
<option name="presentableId" value="LOCAL-00075" />
<option name="project" value="LOCAL" />
<updated>1608896235006</updated>
</task>
<task id="LOCAL-00076" summary="Bugfixes">
<created>1608901608928</created>
<option name="number" value="00076" />
<option name="presentableId" value="LOCAL-00076" />
<option name="project" value="LOCAL" />
<updated>1608901608930</updated>
</task>
<task id="LOCAL-00077" summary="Improved tests">
<created>1608921175852</created>
<option name="number" value="00077" />
<option name="presentableId" value="LOCAL-00077" />
<option name="project" value="LOCAL" />
<updated>1608921175853</updated>
</task>
<task id="LOCAL-00078" summary="Bugfixes and improved tests">
<created>1608986131753</created>
<option name="number" value="00078" />
<option name="presentableId" value="LOCAL-00078" />
<option name="project" value="LOCAL" />
<updated>1608986131755</updated>
</task>
<task id="LOCAL-00079" summary="Removed unused packages">
<created>1611431001647</created>
<option name="number" value="00079" />
<option name="presentableId" value="LOCAL-00079" />
<option name="project" value="LOCAL" />
<updated>1611431001649</updated>
</task>
<option name="localTasksCounter" value="80" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
<option name="oldMeFiltersMigrated" value="true" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="Added build command to cli" />
<MESSAGE value="Improved publish process" />
<MESSAGE value="Added publish command to cli" />
<MESSAGE value="Added imports to cli module" />
<MESSAGE value="Improved help command" />
<MESSAGE value="Changed deps" />
<MESSAGE value="Removed publisher.py" />
<MESSAGE value="Added first steps of database command" />
<MESSAGE value="Improved error handling" />
<MESSAGE value="Improved service providing" />
<MESSAGE value="Added email client" />
<MESSAGE value="Published" />
<MESSAGE value="Improved publisher" />
<MESSAGE value="Added imports" />
<MESSAGE value="Removed build form gitignore, added build command" />
<MESSAGE value="Added init file for build command package" />
<MESSAGE value="Added pycharm files to gitignore" />
<MESSAGE value="Added more development tests" />
<MESSAGE value="Added new tester and CredentialManager TestCase" />
<MESSAGE value="Bugfix" />
<MESSAGE value="Added TimeFormatSettings Test" />
<MESSAGE value="Bugfixes" />
<MESSAGE value="Improved tests" />
<MESSAGE value="Bugfixes and improved tests" />
<MESSAGE value="Removed unused packages" />
<option name="LAST_COMMIT_MESSAGE" value="Removed unused packages" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/src/tests/publish_test/publisher_test.py</url>
<line>50</line>
<option name="timeStamp" value="3" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>
</project>

View File

@@ -1,4 +1,4 @@
MIT License Copyright (c) <year> <copyright holders>
MIT License Copyright (c) 2020 - 2023 sh-edraft.de
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

153
README.md
View File

@@ -1,2 +1,153 @@
# sh_common_py_lib
<h1 align="center">CPL - Common python library</h1>
<!-- Summary -->
<p align="center">
<!-- <img src="" alt="cpl-logo" width="120px" height="120px"/> -->
<br>
<i>
CPL is a development platform for python server applications
<br>using Python.</i>
<br>
</p>
## Table of Contents
<!-- TABLE OF CONTENTS -->
<ol>
<li><a href="#Features">Features</a></li>
<li>
<a href="#getting-started">Getting Started</a>
<ul>
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#installation">Installation</a></li>
</ul>
</li>
<li><a href="#roadmap">Roadmap</a></li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#license">License</a></li>
<li><a href="#contact">Contact</a></li>
</ol>
## Features
<!-- FEATURE OVERVIEW -->
- Expandle
- Application base
- Standardized application classes
- Application object builder
- Application extension classes
- Startup classes
- Startup extension classes
- Configuration
- Configure via object mapped JSON
- Console argument handling
- Console class for in and output
- Banner
- Spinner
- Options (menu)
- Table
- Write
- Write_at
- Write_line
- Write_line_at
- Dependency injection
- Service lifetimes: singleton, scoped and transient
- Providing of application environment
- Environment (development, staging, testing, production)
- Appname
- Customer
- Hostname
- Runtime directory
- Working directory
- Logging
- Standardized logger
- Log-level (FATAL, ERROR, WARN, INFO, DEBUG & TRACE)
- Mail handling
- Send mails
- Pipe classes
- Convert input
- Utils
- Credential manager
- Encryption via BASE64
- PIP wrapper class based on subprocess
- Run pip commands
- String converter to different variants
- to_lower_case
- to_camel_case
- ...
<!-- GETTING STARTED -->
## Getting Started
[Get started with CPL][quickstart].
### Prerequisites
- Install [python] which includes [Pip installs packages][pip]
### Installation
Install the CPL package
```sh
pip install cpl-core --extra-index-url https://pip.sh-edraft.de
```
Install the CPL CLI
```sh
pip install cpl-cli --extra-index-url https://pip.sh-edraft.de
```
Create workspace:
```sh
cpl new <console|library|unittest> <PROJECT NAME>
```
Run the application:
```sh
cd <PROJECT NAME>
cpl start
```
<!-- ROADMAP -->
## Roadmap
See the [open issues](https://git.sh-edraft.de/sh-edraft.de/sh_cpl/issues) for a list of proposed features (and known issues).
<!-- CONTRIBUTING -->
## Contributing
### Contributing Guidelines
Read through our [contributing guidelines][contributing] to learn about our submission process, coding rules and more.
### Want to Help?
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for [contributing][contributing].
<!-- LICENSE -->
## License
Distributed under the MIT License. See [LICENSE] for more information.
<!-- CONTACT -->
## Contact
Sven Heidemann - sven.heidemann@sh-edraft.de
Project link: [https://git.sh-edraft.de/sh-edraft.de/sh_common_py_lib](https://git.sh-edraft.de/sh-edraft.de/sh_cpl)
<!-- External LINKS -->
[pip_url]: https://pip.sh-edraft.de
[python]: https://www.python.org/
[pip]: https://pypi.org/project/pip/
<!-- Internal LINKS -->
[project]: https://git.sh-edraft.de/sh-edraft.de/sh_cpl
[quickstart]: https://git.sh-edraft.de/sh-edraft.de/sh_cpl/wiki/quickstart
[contributing]: https://git.sh-edraft.de/sh-edraft.de/sh_cpl/wiki/contributing
[license]: LICENSE

151
cpl-workspace.json Normal file
View File

@@ -0,0 +1,151 @@
{
"WorkspaceSettings": {
"DefaultProject": "cpl-core",
"Projects": {
"cpl-cli": "src/cpl_cli/cpl-cli.json",
"cpl-core": "src/cpl_core/cpl-core.json",
"cpl-discord": "src/cpl_discord/cpl-discord.json",
"cpl-query": "src/cpl_query/cpl-query.json",
"cpl-translation": "src/cpl_translation/cpl-translation.json",
"set-version": "tools/set_version/set-version.json",
"set-pip-urls": "tools/set_pip_urls/set-pip-urls.json",
"unittests": "unittests/unittests/unittests.json",
"unittests_cli": "unittests/unittests_cli/unittests_cli.json",
"unittests_core": "unittests/unittests_core/unittests_core.json",
"unittests_query": "unittests/unittests_query/unittests_query.json",
"unittests_shared": "unittests/unittests_shared/unittests_shared.json",
"unittests_translation": "unittests/unittests_translation/unittests_translation.json"
},
"Scripts": {
"hello-world": "echo 'Hello World'",
"format": "echo 'Formatting:'; black ./",
"sv": "cpl set-version",
"set-version": "cpl run set-version --dev $ARGS; echo '';",
"spu": "cpl set-pip-urls",
"set-pip-urls": "cpl run set-pip-urls --dev $ARGS; echo '';",
"docs-build": "cpl format; echo 'Build Documentation'; cpl db-core; cpl db-discord; cpl db-query; cpl db-translation; cd docs/; make clean; make html;",
"db-core": "cd docs/; sphinx-apidoc -o source/ ../src/cpl_core; cd ../",
"db-discord": "cd docs/; sphinx-apidoc -o source/ ../src/cpl_discord; cd ../",
"db-query": "cd docs/; sphinx-apidoc -o source/ ../src/cpl_query; cd ../",
"db-translation": "cd docs/; sphinx-apidoc -o source/ ../src/cpl_translation; cd ../",
"db": "cpl docs-build",
"docs-open": "xdg-open $PWD/docs/build/html/index.html &",
"do": "cpl docs-open",
"test": "cpl run unittests",
"pre-build-all": "cpl sv $ARGS; cpl spu $ARGS;",
"build-all": "cpl build-cli; cpl build-core; cpl build-discord; cpl build-query; cpl build-translation; cpl build-set-pip-urls; cpl build-set-version",
"ba": "cpl build-all $ARGS",
"build-cli": "echo 'Build cpl-cli'; cd ./src/cpl_cli; cpl build; cd ../../;",
"build-core": "echo 'Build cpl-core'; cd ./src/cpl_core; cpl build; cd ../../;",
"build-discord": "echo 'Build cpl-discord'; cd ./src/cpl_discord; cpl build; cd ../../;",
"build-query": "echo 'Build cpl-query'; cd ./src/cpl_query; cpl build; cd ../../;",
"build-translation": "echo 'Build cpl-translation'; cd ./src/cpl_translation; cpl build; cd ../../;",
"build-set-pip-urls": "echo 'Build set-pip-urls'; cd ./tools/set_pip_urls; cpl build; cd ../../;",
"build-set-version": "echo 'Build set-version'; cd ./tools/set_version; cpl build; cd ../../;",
"pre-publish-all": "cpl sv $ARGS; cpl spu $ARGS;",
"publish-all": "cpl publish-cli; cpl publish-core; cpl publish-discord; cpl publish-query; cpl publish-translation;",
"pa": "cpl publish-all $ARGS",
"publish-cli": "echo 'Publish cpl-cli'; cd ./src/cpl_cli; cpl publish; cd ../../;",
"publish-core": "echo 'Publish cpl-core'; cd ./src/cpl_core; cpl publish; cd ../../;",
"publish-discord": "echo 'Publish cpl-discord'; cd ./src/cpl_discord; cpl publish; cd ../../;",
"publish-query": "echo 'Publish cpl-query'; cd ./src/cpl_query; cpl publish; cd ../../;",
"publish-translation": "echo 'Publish cpl-translation'; cd ./src/cpl_translation; cpl publish; cd ../../;",
"upload-prod-cli": "echo 'PROD Upload cpl-cli'; cpl upl-prod-cli;",
"upl-prod-cli": "twine upload -r pip.sh-edraft.de dist/cpl-cli/publish/setup/*",
"upload-prod-core": "echo 'PROD Upload cpl-core'; cpl upl-prod-core;",
"upl-prod-core": "twine upload -r pip.sh-edraft.de dist/cpl-core/publish/setup/*",
"upload-prod-discord": "echo 'PROD Upload cpl-discord'; cpl upl-prod-discord;",
"upl-prod-discord": "twine upload -r pip.sh-edraft.de dist/cpl-discord/publish/setup/*",
"upload-prod-query": "echo 'PROD Upload cpl-query'; cpl upl-prod-query;",
"upl-prod-query": "twine upload -r pip.sh-edraft.de dist/cpl-query/publish/setup/*",
"upload-prod-translation": "echo 'PROD Upload cpl-translation'; cpl upl-prod-translation;",
"upl-prod-translation": "twine upload -r pip.sh-edraft.de dist/cpl-translation/publish/setup/*",
"upload-exp-cli": "echo 'EXP Upload cpl-cli'; cpl upl-exp-cli;",
"upl-exp-cli": "twine upload -r pip-exp.sh-edraft.de dist/cpl-cli/publish/setup/*",
"upload-exp-core": "echo 'EXP Upload cpl-core'; cpl upl-exp-core;",
"upl-exp-core": "twine upload -r pip-exp.sh-edraft.de dist/cpl-core/publish/setup/*",
"upload-exp-discord": "echo 'EXP Upload cpl-discord'; cpl upl-exp-discord;",
"upl-exp-discord": "twine upload -r pip-exp.sh-edraft.de dist/cpl-discord/publish/setup/*",
"upload-exp-query": "echo 'EXP Upload cpl-query'; cpl upl-exp-query;",
"upl-exp-query": "twine upload -r pip-exp.sh-edraft.de dist/cpl-query/publish/setup/*",
"upload-exp-translation": "echo 'EXP Upload cpl-translation'; cpl upl-exp-translation;",
"upl-exp-translation": "twine upload -r pip-exp.sh-edraft.de dist/cpl-translation/publish/setup/*",
"upload-dev-cli": "echo 'DEV Upload cpl-cli'; cpl upl-dev-cli;",
"upl-dev-cli": "twine upload -r pip-dev.sh-edraft.de dist/cpl-cli/publish/setup/*",
"upload-dev-core": "echo 'DEV Upload cpl-core'; cpl upl-dev-core;",
"upl-dev-core": "twine upload -r pip-dev.sh-edraft.de dist/cpl-core/publish/setup/*",
"upload-dev-discord": "echo 'DEV Upload cpl-discord'; cpl upl-dev-discord;",
"upl-dev-discord": "twine upload -r pip-dev.sh-edraft.de dist/cpl-discord/publish/setup/*",
"upload-dev-query": "echo 'DEV Upload cpl-query'; cpl upl-dev-query;",
"upl-dev-query": "twine upload -r pip-dev.sh-edraft.de dist/cpl-query/publish/setup/*",
"upload-dev-translation": "echo 'DEV Upload cpl-translation'; cpl upl-dev-translation;",
"upl-dev-translation": "twine upload -r pip-dev.sh-edraft.de dist/cpl-translation/publish/setup/*",
"pre-deploy-prod": "cpl sv $ARGS; cpl spu --environment=production;",
"deploy-prod": "cpl deploy-prod-cli; cpl deploy-prod-core; cpl deploy-prod-discord; cpl deploy-prod-query; cpl deploy-prod-translation;",
"dp": "cpl deploy-prod $ARGS",
"deploy-prod-cli": "cpl publish-cli; cpl upload-prod-cli",
"deploy-prod-core": "cpl publish-core; cpl upload-prod-core",
"deploy-prod-query": "cpl publish-query; cpl upload-prod-query",
"deploy-prod-discord": "cpl publish-discord; cpl upload-prod-discord",
"deploy-prod-translation": "cpl publish-translation; cpl upload-prod-translation",
"pre-deploy-exp": "cpl sv $ARGS; cpl spu --environment=staging;",
"deploy-exp": "cpl deploy-exp-cli; cpl deploy-exp-core; cpl deploy-exp-discord; cpl deploy-exp-query; cpl deploy-exp-translation;",
"de": "cpl deploy-exp $ARGS",
"deploy-exp-cli": "cpl publish-cli; cpl upload-exp-cli",
"deploy-exp-core": "cpl publish-core; cpl upload-exp-core",
"deploy-exp-discord": "cpl publish-discord; cpl upload-exp-discord",
"deploy-exp-query": "cpl publish-query; cpl upload-exp-query",
"deploy-exp-translation": "cpl publish-translation; cpl upload-exp-translation",
"pre-deploy-dev": "cpl sv $ARGS; cpl spu --environment=development;",
"deploy-dev": "cpl deploy-dev-cli; cpl deploy-dev-core; cpl deploy-dev-discord; cpl deploy-dev-query; cpl deploy-dev-translation;",
"dd": "cpl deploy-dev $ARGS",
"deploy-dev-cli": "cpl publish-cli; cpl upload-dev-cli",
"deploy-dev-core": "cpl publish-core; cpl upload-dev-core",
"deploy-dev-discord": "cpl publish-discord; cpl upload-dev-discord",
"deploy-dev-query": "cpl publish-query; cpl upload-dev-query",
"deploy-dev-translation": "cpl publish-query; cpl upload-dev-translation",
"dev-install": "cpl di-core; cpl di-cli; cpl di-query; cpl di-translation;",
"di": "cpl dev-install",
"di-core": "pip install cpl-core --pre --upgrade --extra-index-url https://pip-dev.sh-edraft.de",
"di-cli": "pip install cpl-cli --pre --upgrade --extra-index-url https://pip-dev.sh-edraft.de",
"di-discord": "pip install cpl-discord --pre --upgrade --extra-index-url https://pip-dev.sh-edraft.de",
"di-query": "pip install cpl-query --pre --upgrade --extra-index-url https://pip-dev.sh-edraft.de",
"di-translation": "pip install cpl-translation --pre --upgrade --extra-index-url https://pip-dev.sh-edraft.de",
"prod-install": "cpl pi-core; cpl pi-cli; cpl pi-query; cpl pi-translation;",
"pi": "cpl prod-install",
"pi-core": "pip install cpl-core --pre --upgrade --extra-index-url https://pip.sh-edraft.de",
"pi-cli": "pip install cpl-cli --pre --upgrade --extra-index-url https://pip.sh-edraft.de",
"pi-discord": "pip install cpl-discord --pre --upgrade --extra-index-url https://pip.sh-edraft.de",
"pi-query": "pip install cpl-query --pre --upgrade --extra-index-url https://pip.sh-edraft.de",
"pi-translation": "pip install cpl-translation --pre --upgrade --extra-index-url https://pip.sh-edraft.de"
}
}
}

View File

@@ -1,9 +0,0 @@
prefix: cpl
commands:
new:
app
base
class
configmodel
enum
service

View File

@@ -1,2 +0,0 @@
python setup.py install # for install
python setup.py sdist bdist_wheel # for build

View File

@@ -1,10 +0,0 @@
- sh_edraft
- common # Contains Interfaces and models for the hole library
- interface
- model
- configuration # Contains classes for app configuration by JSON, ENV vars and arguments
- discord # Contains classes for better use of discord.py
- logging # Contains classes for logging
- mailing # Contains classes for mailing
- messenger # Contains classes for sh_messenger_server client
- service # Contains classes to provide and use the services defined in this library

View File

@@ -1,2 +0,0 @@
- create logger
- use logger in publisher

View File

@@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
"""
$Name $Description
~~~~~~~~~~~~~~~~~~~
$LongDescription
:copyright: (c) $CopyrightDate $CopyrightName
:license: $LicenseName$LicenseDescription
"""
__title__ = '$Title'
__author__ = '$Author'
__license__ = '$LicenseName'
__copyright__ = 'Copyright (c) $CopyrightDate $CopyrightName'
__version__ = '$Version'
from collections import namedtuple
$Imports
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
version_info = VersionInfo(major=$Major, minor=$Minor, micro=$Micro)

2
pyproject.toml Normal file
View File

@@ -0,0 +1,2 @@
[tool.black]
line-length = 120

View File

@@ -1,29 +0,0 @@
aiohttp==3.6.3
async-timeout==3.0.1
attrs==20.3.0
certifi==2020.11.8
chardet==3.0.4
click==7.1.2
dateutils==0.6.12
discord==1.0.1
discord.py==1.5.1
Flask==1.1.2
idna==2.10
itsdangerous==1.1.0
Jinja2==2.11.2
keyboard==0.13.5
MarkupSafe==1.1.1
multidict==4.7.6
mysql-connector==2.2.9
overloading==0.5.0
python-dateutil==2.8.1
pytz==2020.4
six==1.15.0
SQLAlchemy==1.3.20
termcolor==1.1.0
urllib3==1.26.2
Werkzeug==1.0.1
yarl==1.5.1
setuptools~=49.2.1
pyfiglet~=0.8.post1
tabulate~=0.8.7

View File

@@ -1,2 +0,0 @@
include ../ README
recursive-include sh_edraft *.txt

View File

@@ -1,66 +0,0 @@
{
"TimeFormatSettings": {
"DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
},
"LoggingSettings": {
"Path": "../build/logs/",
"Filename": "log_$start_time.log",
"ConsoleLogLevel": "INFO",
"FileLogLevel": "TRACE"
},
"PublishSettings": {
"SourcePath": "./",
"DistPath": "../build/dist",
"Templates": [
{
"TemplatePath": "../publish_templates/all_template.txt",
"Name": "all",
"Description": "",
"LongDescription": "",
"CopyrightDate": "2020",
"CopyrightName": "sh-edraft.de",
"LicenseName": "MIT",
"LicenseDescription": ", see LICENSE for more details.",
"Title": "",
"Author": "Sven Heidemann",
"Version": {
"Major": 2020,
"Minor": 12,
"Micro": 10
}
},
{
"TemplatePath": "../publish_templates/all_template.txt",
"Name": "sh_edraft",
"Description": "common python library",
"LongDescription": "Library to share common classes and models used at sh-edraft.de",
"CopyrightDate": "2020",
"CopyrightName": "sh-edraft.de",
"LicenseName": "MIT",
"LicenseDescription": ", see LICENSE for more details.",
"Title": "",
"Author": "Sven Heidemann",
"Version": {
"Major": 2020,
"Minor": 12,
"Micro": 10
}
}
],
"IncludedFiles": [
"./MANIFEST.in",
"../LICENSE",
"../README.md",
"../requirements.txt",
"sh_edraft/cli/cpl_cli/templates"
],
"ExcludedFiles": [
"./tests",
"./tests_dev"
],
"TemplateEnding": "_template.txt"
}
}

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,69 @@
from cpl_cli.abc.project_type_abc import ProjectTypeABC
from cpl_cli.configuration import WorkspaceSettings
from cpl_core.utils import String
class Console(ProjectTypeABC):
def __init__(
self,
base_path: str,
project_name: str,
workspace: WorkspaceSettings,
use_application_api: bool,
use_startup: bool,
use_service_providing: bool,
use_async: bool,
project_file_data: dict,
):
from project_file import ProjectFile
from project_file_appsettings import ProjectFileAppsettings
from project_file_code_application import ProjectFileApplication
from project_file_code_main import ProjectFileMain
from project_file_code_startup import ProjectFileStartup
from project_file_readme import ProjectFileReadme
from project_file_license import ProjectFileLicense
from schematic_init import Init
ProjectTypeABC.__init__(
self,
base_path,
project_name,
workspace,
use_application_api,
use_startup,
use_service_providing,
use_async,
project_file_data,
)
project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/'
self.add_template(ProjectFile(project_name.split("/")[-1], project_path, project_file_data))
if workspace is None:
self.add_template(ProjectFileLicense(""))
self.add_template(ProjectFileReadme(""))
self.add_template(Init("", "init", f"{base_path}tests/"))
self.add_template(Init("", "init", project_path))
self.add_template(ProjectFileAppsettings(project_path))
if use_application_api:
self.add_template(
ProjectFileApplication(project_path, use_application_api, use_startup, use_service_providing, use_async)
)
if use_startup:
self.add_template(
ProjectFileStartup(project_path, use_application_api, use_startup, use_service_providing, use_async)
)
self.add_template(
ProjectFileMain(
project_name.split("/")[-1],
project_path,
use_application_api,
use_startup,
use_service_providing,
use_async,
)
)

View File

@@ -0,0 +1,13 @@
import json
from cpl_cli.abc.file_template_abc import FileTemplateABC
class ProjectFile(FileTemplateABC):
def __init__(self, name: str, path: str, code: dict):
FileTemplateABC.__init__(self, "", path, "{}")
self._name = f"{name}.json"
self._code = code
def get_code(self) -> str:
return json.dumps(self._code, indent=2)

View File

@@ -0,0 +1,29 @@
import textwrap
from cpl_cli.abc.file_template_abc import FileTemplateABC
class ProjectFileAppsettings(FileTemplateABC):
def __init__(self, path: str):
FileTemplateABC.__init__(self, "", path, "{}")
self._name = "appsettings.json"
def get_code(self) -> str:
return textwrap.dedent(
"""\
{
"TimeFormatSettings": {
"DateFormat": "%Y-%m-%d",
"TimeFormat": "%H:%M:%S",
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
},
"LoggingSettings": {
"Path": "logs/",
"Filename": "log_$start_time.log",
"ConsoleLogLevel": "ERROR",
"FileLogLevel": "WARN"
}
}
"""
)

View File

@@ -0,0 +1,56 @@
from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC
class ProjectFileApplication(CodeFileTemplateABC):
def __init__(
self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool
):
CodeFileTemplateABC.__init__(
self, "application", path, "", use_application_api, use_startup, use_service_providing, use_async
)
def get_code(self) -> str:
import textwrap
if self._use_async:
return textwrap.dedent(
"""\
from cpl_core.application import ApplicationABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.console import Console
from cpl_core.dependency_injection import ServiceProviderABC
class Application(ApplicationABC):
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
ApplicationABC.__init__(self, config, services)
async def configure(self):
pass
async def main(self):
Console.write_line('Hello World')
"""
)
return textwrap.dedent(
"""\
from cpl_core.application import ApplicationABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.console import Console
from cpl_core.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')
"""
)

View File

@@ -0,0 +1,107 @@
from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC
from cpl_core.utils import String
class ProjectFileMain(CodeFileTemplateABC):
def __init__(
self,
name: str,
path: str,
use_application_api: bool,
use_startup: bool,
use_service_providing: bool,
use_async: bool,
):
CodeFileTemplateABC.__init__(
self, "main", path, "", use_application_api, use_startup, use_service_providing, use_async
)
import textwrap
import_pkg = f"{String.convert_to_snake_case(name)}."
self._main_with_application_host_and_startup = textwrap.dedent(
f"""\
{"import asyncio" if self._use_async else ''}
from cpl_core.application import ApplicationBuilder
from {import_pkg}application import Application
from {import_pkg}startup import Startup
{self._async()}def main():
app_builder = ApplicationBuilder(Application)
app_builder.use_startup(Startup)
{"app: Application = await app_builder.build_async()" if self._use_async else ""}
{"await app.run_async()" if self._use_async else "app_builder.build().run()"}
if __name__ == '__main__':
{"asyncio.run(main())" if self._use_async else "main()"}
"""
)
self._main_with_application_base = textwrap.dedent(
f"""\
{"import asyncio" if self._use_async else ''}
from cpl_core.application import ApplicationBuilder
from {import_pkg}application import Application
{self._async()}def main():
app_builder = ApplicationBuilder(Application)
{"app: Application = await app_builder.build_async()" if self._use_async else ""}
{"await app.run_async()" if self._use_async else "app_builder.build().run()"}
if __name__ == '__main__':
{"asyncio.run(main())" if self._use_async else "main()"}
"""
)
self._main_with_dependency_injection = textwrap.dedent(
f"""\
{"import asyncio" if self._use_async else ''}
from cpl_core.application import ApplicationBuilder
{self._async()}def configure_configuration() -> ConfigurationABC:
config = Configuration()
return config
{self._async()}def configure_services(config: ConfigurationABC) -> ServiceProviderABC:
services = ServiceCollection(config)
return services.build_service_provider()
{self._async()}def main():
config = {self._async()}configure_configuration()
provider = {self._async()}configure_services(config)
Console.write_line('Hello World')
if __name__ == '__main__':
{"asyncio.run(main())" if self._use_async else "main()"}
"""
)
def _async(self) -> str:
if self._use_async:
return "async "
return ""
def get_code(self) -> str:
if self._use_application_api and self._use_startup:
return self._main_with_application_host_and_startup
if self._use_application_api:
return self._main_with_application_base
if self._use_service_providing:
return self._main_with_dependency_injection
return self._main_with_application_base

View File

@@ -0,0 +1,34 @@
from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC
class ProjectFileStartup(CodeFileTemplateABC):
def __init__(
self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool
):
CodeFileTemplateABC.__init__(
self, "startup", path, "", use_application_api, use_startup, use_service_providing, use_async
)
def get_code(self) -> str:
import textwrap
return textwrap.dedent(
"""\
from cpl_core.application import StartupABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC
from cpl_core.environment import ApplicationEnvironment
class Startup(StartupABC):
def __init__(self):
StartupABC.__init__(self)
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC:
return configuration
def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC:
return services.build_service_provider()
"""
)

View File

@@ -0,0 +1,66 @@
from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC
class ProjectFileTestApplication(CodeFileTemplateABC):
def __init__(
self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool
):
CodeFileTemplateABC.__init__(
self, "application", path, "", use_application_api, use_startup, use_service_providing, use_async
)
def get_code(self) -> str:
import textwrap
if self._use_async:
return textwrap.dedent(
"""\
import unittest
from unittest import TestSuite
from cpl_core.application import ApplicationABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from unittests.test_case import TestCase
class Application(ApplicationABC):
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
ApplicationABC.__init__(self, config, services)
self._suite: TestSuite = unittest.TestSuite()
async def configure(self):
self._suite.addTest(TestCase('test_equal'))
async def main(self):
runner = unittest.TextTestRunner()
runner.run(self._suite)
"""
)
return textwrap.dedent(
"""\
import unittest
from unittest import TestSuite
from cpl_core.application import ApplicationABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from unittests.test_case import TestCase
class Application(ApplicationABC):
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
ApplicationABC.__init__(self, config, services)
self._suite: TestSuite = unittest.TestSuite()
def configure(self):
self._suite.addTest(TestCase('test_equal'))
def main(self):
runner = unittest.TextTestRunner()
runner.run(self._suite)
"""
)

View File

@@ -0,0 +1,44 @@
from cpl_cli.abc.code_file_template_abc import CodeFileTemplateABC
class ProjectFileTestCase(CodeFileTemplateABC):
def __init__(
self, path: str, use_application_api: bool, use_startup: bool, use_service_providing: bool, use_async: bool
):
CodeFileTemplateABC.__init__(
self, "test_case", path, "", use_application_api, use_startup, use_service_providing, use_async
)
def get_code(self) -> str:
import textwrap
if self._use_async:
return textwrap.dedent(
"""\
import unittest
class TestCase(unittest.TestCase):
async def setUp(self) -> None:
pass
async def test_equal(self):
self.assertEqual(True, True)
"""
)
return textwrap.dedent(
"""\
import unittest
class TestCase(unittest.TestCase):
def setUp(self) -> None:
pass
def test_equal(self):
self.assertEqual(True, True)
"""
)

View File

@@ -0,0 +1,10 @@
from cpl_cli.abc.file_template_abc import FileTemplateABC
class ProjectFileLicense(FileTemplateABC):
def __init__(self, path: str):
FileTemplateABC.__init__(self, "", path, "")
self._name = "LICENSE"
def get_code(self) -> str:
return self._code

View File

@@ -0,0 +1,10 @@
from cpl_cli.abc.file_template_abc import FileTemplateABC
class ProjectFileReadme(FileTemplateABC):
def __init__(self, path: str):
FileTemplateABC.__init__(self, "", path, "")
self._name = "README.md"
def get_code(self) -> str:
return self._code

View File

@@ -0,0 +1,46 @@
import os
from cpl_cli.abc.project_type_abc import ProjectTypeABC
from cpl_cli.configuration import WorkspaceSettings
from cpl_core.utils import String
class Library(ProjectTypeABC):
def __init__(
self,
base_path: str,
project_name: str,
workspace: WorkspaceSettings,
use_application_api: bool,
use_startup: bool,
use_service_providing: bool,
use_async: bool,
project_file_data: dict,
):
from project_file import ProjectFile
from project_file_readme import ProjectFileReadme
from project_file_license import ProjectFileLicense
from schematic_init import Init
from schematic_class import Class
ProjectTypeABC.__init__(
self,
base_path,
project_name,
workspace,
use_application_api,
use_startup,
use_service_providing,
use_async,
project_file_data,
)
project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/'
self.add_template(ProjectFile(project_name.split("/")[-1], project_path, project_file_data))
if workspace is None:
self.add_template(ProjectFileLicense(""))
self.add_template(ProjectFileReadme(""))
self.add_template(Init("", "init", project_path))
self.add_template(Class("Class1", "class", project_path))

View File

@@ -0,0 +1,64 @@
import os
from cpl_cli.abc.project_type_abc import ProjectTypeABC
from cpl_cli.configuration import WorkspaceSettings
from cpl_core.utils import String
class Unittest(ProjectTypeABC):
def __init__(
self,
base_path: str,
project_name: str,
workspace: WorkspaceSettings,
use_application_api: bool,
use_startup: bool,
use_service_providing: bool,
use_async: bool,
project_file_data: dict,
):
from project_file import ProjectFile
from project_file_code_application import ProjectFileApplication
from project_file_code_main import ProjectFileMain
from project_file_code_test_case import ProjectFileTestCase
from project_file_readme import ProjectFileReadme
from project_file_license import ProjectFileLicense
from schematic_init import Init
ProjectTypeABC.__init__(
self,
base_path,
project_name,
workspace,
use_application_api,
use_startup,
use_service_providing,
use_async,
project_file_data,
)
project_path = f'{base_path}{String.convert_to_snake_case(project_name.split("/")[-1])}/'
self.add_template(ProjectFile(project_name.split("/")[-1], project_path, project_file_data))
if workspace is None:
self.add_template(ProjectFileLicense(""))
self.add_template(ProjectFileReadme(""))
self.add_template(Init("", "init", f"{base_path}tests/"))
self.add_template(Init("", "init", project_path))
self.add_template(
ProjectFileApplication(project_path, use_application_api, use_startup, use_service_providing, use_async)
)
self.add_template(
ProjectFileMain(
project_name.split("/")[-1],
project_path,
use_application_api,
use_startup,
use_service_providing,
use_async,
)
)
self.add_template(
ProjectFileTestCase(project_path, use_application_api, use_startup, use_service_providing, use_async)
)

View File

@@ -0,0 +1,27 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_core.utils import String
class ABC(GenerateSchematicABC):
def __init__(self, name: str, schematic: str, path: str):
GenerateSchematicABC.__init__(self, name, schematic, path)
self._class_name = name
if name != "":
self._class_name = f'{String.first_to_upper(name.replace(schematic, ""))}ABC'
def get_code(self) -> str:
code = """\
from abc import ABC, abstractmethod
class $Name(ABC):
@abstractmethod
def __init__(self): pass
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "abc", ["a", "A"])

View File

@@ -0,0 +1,34 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Application(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
from cpl_core.application import ApplicationABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.console import Console
from cpl_core.dependency_injection import ServiceProviderABC
class $Name(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')
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "application", ["app", "APP"])

View File

@@ -0,0 +1,31 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_core.utils import String
class ApplicationExtension(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
from cpl_core.application import ApplicationExtensionABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
class $Name(ApplicationExtensionABC):
def __init__(self):
ApplicationExtensionABC.__init__(self)
def run(self, config: ConfigurationABC, services: ServiceProviderABC):
pass
"""
x = self.build_code_str(code, Name=String.convert_to_camel_case(self._class_name))
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "application-extension", ["appex", "APPEX"])

View File

@@ -0,0 +1,23 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_core.utils import String
class Class(GenerateSchematicABC):
def __init__(self, name: str, schematic: str, path: str):
GenerateSchematicABC.__init__(self, name, schematic, path)
self._name = f"{String.convert_to_snake_case(name)}.py"
self._class_name = f"{String.first_to_upper(name)}"
def get_code(self) -> str:
code = """\
class $Name:
def __init__(self):
pass
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "class", ["c", "C"])

View File

@@ -0,0 +1,35 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class ConfigModel(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class $Name(ConfigurationModelABC):
def __init__(self, atr: str = None):
ConfigurationModelABC.__init__(self)
self._atr = atr
@property
def atr(self) -> str:
return self._atr
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "settings", ["st", "ST"])

View File

@@ -0,0 +1,25 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Enum(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(
"""\
from enum import Enum
class $Name(Enum):
atr = 0
"""
)
return self.build_code_str(code, Name=self._class_name)
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "enum", ["e", "E"])

View File

@@ -0,0 +1,20 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Init(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
self._name = f"__init__.py"
def get_code(self) -> str:
code = """\
# imports
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "init", [])

View File

@@ -0,0 +1,27 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Pipe(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
from cpl_core.pipes.pipe_abc import PipeABC
class $Name(PipeABC):
def __init__(self): pass
def transform(self, value: any, *args):
return value
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "pipe", ["p", "P"])

View File

@@ -0,0 +1,46 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_core.utils import String
class Schematic(GenerateSchematicABC):
def __init__(self, name: str, path: str, schematic: str):
GenerateSchematicABC.__init__(self, name, path, schematic)
self._name = f"schematic_{String.convert_to_snake_case(name)}.py"
self._path = ".cpl/"
self._class_name = String.convert_to_camel_case(name)
def get_code(self) -> str:
code = """\
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class $Name(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(\"\"\"\\
from enum import Enum
class $Name(Enum):
atr = 0
\"\"\")
return self.build_code_str(code, Name=self._class_name)
@classmethod
def register(cls):
GenerateSchematicABC.register(
cls,
'$NameLower',
[]
)
"""
return self.build_code_str(code, Name=self._class_name, NameLower=self._class_name.lower())
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "schematic", ["scheme", "SCHEME"])

View File

@@ -0,0 +1,22 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Service(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
class $Name:
def __init__(self):
pass
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "service", ["s", "S"])

View File

@@ -0,0 +1,34 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Startup(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
from cpl_core.application import StartupABC
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC
from cpl_core.environment import ApplicationEnvironment
class $Name(StartupABC):
def __init__(self):
StartupABC.__init__(self)
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC:
return configuration
def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC:
return services.build_service_provider()
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "startup", ["stup", "STUP"])

View File

@@ -0,0 +1,35 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_core.utils import String
class StartupExtension(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
from cpl_core.application.startup_extension_abc import StartupExtensionABC
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.dependency_injection.service_collection_abc import ServiceCollectionABC
from cpl_core.environment.application_environment_abc import ApplicationEnvironmentABC
class $Name(StartupExtensionABC):
def __init__(self):
pass
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
pass
"""
x = self.build_code_str(code, Name=String.convert_to_camel_case(self._class_name))
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "startup-extension", ["stupex", "STUPEX"])

View File

@@ -0,0 +1,28 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_core.utils import String
class TestCase(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
import unittest
class $Name(unittest.TestCase):
def setUp(self):
pass
def test_equal(self):
pass
"""
return self.build_code_str(code, Name=String.convert_to_camel_case(self._class_name))
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "test-case", ["tc", "TC"])

View File

@@ -0,0 +1,28 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Thread(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
import threading
class $Name(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self) -> None:
pass
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "thread", ["t", "T"])

View File

@@ -0,0 +1,28 @@
import textwrap
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Validator(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
code = """\
from cpl_core.configuration.validator_abc import ValidatorABC
class $Name(ValidatorABC):
def __init__(self):
ValidatorABC.__init__(self)
def validate(self) -> bool:
return True
"""
x = self.build_code_str(code, Name=self._class_name)
return x
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "validator", ["v", "V"])

31
src/cpl_cli/__init__.py Normal file
View File

@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
from .cli import CLI
from .command_abc import CommandABC
from .error import Error
from .main import main
from .startup import Startup
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli._templates"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli._templates.build"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,38 @@
import textwrap
class InitTemplate:
@staticmethod
def get_init_py() -> str:
string = textwrap.dedent(
"""\
# -*- coding: utf-8 -*-
\"\"\"
$Name $Description
~~~~~~~~~~~~~~~~~~~
$LongDescription
:copyright: (c) $CopyrightDate $CopyrightName
:license: $LicenseDescription
\"\"\"
__title__ = "$Title"
__author__ = "$Author"
__license__ = "$LicenseName"
__copyright__ = "Copyright (c) $CopyrightDate $CopyrightName"
__version__ = "$Version"
from collections import namedtuple
$Imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="$Major", minor="$Minor", micro="$Micro")
"""
)
return string

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli._templates.publish"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,33 @@
import textwrap
class SetupTemplate:
@staticmethod
def get_setup_py() -> str:
string = textwrap.dedent(
"""\
\"\"\"
This file is generated by CPL CLI
\"\"\"
import setuptools
setuptools.setup(
name='$Name',
version='$Version',
packages=$Packages,
url='$URL',
license='$LicenseName',
author='$Author',
author_email='$AuthorMail',
include_package_data=$IncludePackageData,
description='$Description',
python_requires='$PyRequires',
install_requires=$Dependencies,
entry_points=$EntryPoints,
package_data=$PackageData
)
"""
)
return string

View File

@@ -0,0 +1,22 @@
from abc import ABC, abstractmethod
class TemplateFileABC(ABC):
@abstractmethod
def __init__(self):
pass
@property
@abstractmethod
def name(self) -> str:
pass
@property
@abstractmethod
def path(self) -> str:
pass
@property
@abstractmethod
def value(self) -> str:
pass

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli.abc"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,23 @@
from abc import ABC, abstractmethod
from cpl_cli.abc.file_template_abc import FileTemplateABC
from cpl_core.utils import String
class CodeFileTemplateABC(FileTemplateABC):
@abstractmethod
def __init__(
self,
name: str,
path: str,
code: str,
use_application_api: bool,
use_startup: bool,
use_service_providing: bool,
use_async: bool,
):
FileTemplateABC.__init__(self, name, path, code)
self._use_application_api = use_application_api
self._use_startup = use_startup
self._use_service_providing = use_service_providing
self._use_async = use_async

View File

@@ -0,0 +1,34 @@
from abc import ABC, abstractmethod
from cpl_core.utils import String
class FileTemplateABC(ABC):
@abstractmethod
def __init__(self, name: str, path: str, code: str):
self._name = f"{String.convert_to_snake_case(name)}.py"
self._path = path
self._code = code
def __repr__(self):
return f"<{type(self).__name__} {self._path}{self._name}>"
@property
def name(self) -> str:
return self._name
@property
def path(self) -> str:
return self._path
@path.setter
def path(self, value: str):
self._path = value
@property
def value(self) -> str:
return self.get_code()
@abstractmethod
def get_code(self) -> str:
pass

View File

@@ -0,0 +1,40 @@
import textwrap
from abc import abstractmethod
from string import Template
from cpl_cli.abc.file_template_abc import FileTemplateABC
from cpl_cli.configuration.schematic_collection import SchematicCollection
from cpl_core.utils import String
class GenerateSchematicABC(FileTemplateABC):
def __init__(self, name: str, schematic: str, path: str):
FileTemplateABC.__init__(self, name, path, "")
self._name = f"{String.convert_to_snake_case(name)}_{schematic}.py"
if schematic in name.lower():
self._name = f"{String.convert_to_snake_case(name)}.py"
self._class_name = name
if name != "":
self._class_name = f"{String.first_to_upper(name)}{String.first_to_upper(schematic)}"
if schematic in name.lower():
self._class_name = f"{String.first_to_upper(name)}"
@property
def class_name(self) -> str:
return self._class_name
@abstractmethod
def get_code(self) -> str:
pass
@classmethod
def build_code_str(cls, code: str, **kwargs) -> str:
text = textwrap.dedent(code)
return Template(text).substitute(**kwargs)
@classmethod
@abstractmethod
def register(cls, *args):
SchematicCollection.register(*args)

View File

@@ -0,0 +1,36 @@
from abc import ABC, abstractmethod
from typing import Optional
from cpl_cli.abc.file_template_abc import FileTemplateABC
from cpl_cli.configuration import WorkspaceSettings
class ProjectTypeABC(ABC):
@abstractmethod
def __init__(
self,
base_path: str,
project_name: str,
workspace: Optional[WorkspaceSettings],
use_application_api: bool,
use_startup: bool,
use_service_providing: bool,
use_async: bool,
project_file_data: dict,
):
self._templates: list[FileTemplateABC] = []
self._base_path = base_path
self._project_name = project_name
self._workspace = workspace
self._use_application_api = use_application_api
self._use_startup = use_startup
self._use_service_providing = use_service_providing
self._use_async = use_async
self._project_file_data = project_file_data
@property
def templates(self) -> list[FileTemplateABC]:
return self._templates
def add_template(self, t: FileTemplateABC):
self._templates.append(t)

View File

@@ -0,0 +1,5 @@
{
"CLI": {
"PipPath": "https://pip.sh-edraft.de"
}
}

46
src/cpl_cli/cli.py Normal file
View File

@@ -0,0 +1,46 @@
import sys
import traceback
from cpl_cli.error import Error
from cpl_core.application.application_abc import ApplicationABC
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.dependency_injection.service_provider_abc import ServiceProviderABC
class CLI(ApplicationABC):
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
"""
CPL CLI
"""
ApplicationABC.__init__(self, config, services)
self._options: list[str] = []
def configure(self):
pass
def main(self):
"""
Entry point of the CPL CLI
:return:
"""
try:
result = self._configuration.parse_console_arguments(self._services)
if result:
Console.write_line()
return
if len(self._configuration.additional_arguments) == 0:
Error.error("Expected command")
return
unexpected_arguments = ", ".join(self._configuration.additional_arguments)
Error.error(f"Unexpected argument(s): {unexpected_arguments}")
Console.write_line()
except KeyboardInterrupt:
Console.write_line()
sys.exit()
except Exception as e:
Console.error(str(e), traceback.format_exc())
sys.exit()

View File

@@ -0,0 +1,14 @@
from typing import Optional
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
class CLISettings(ConfigurationModelABC):
def __init__(self, pip_path: str = None):
ConfigurationModelABC.__init__(self)
self._pip_path: Optional[str] = pip_path
@property
def pip_path(self) -> str:
return self._pip_path

View File

@@ -0,0 +1,5 @@
from enum import Enum
class CLISettingsNameEnum(Enum):
pip_path = "PipPath"

View File

@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli.command"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
from .build_service import BuildService
from .generate_service import GenerateService
from .help_service import HelpService
from .new_service import NewService
from .publish_service import PublishService
from .version_service import VersionService
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,138 @@
import json
import os
import textwrap
from typing import Optional
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration.build_settings import BuildSettings
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.configuration.settings_helper import SettingsHelper
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
class AddService(CommandABC):
def __init__(self, config: ConfigurationABC, workspace: WorkspaceSettings):
"""
Service for CLI command add
"""
CommandABC.__init__(self)
self._config = config
self._workspace = workspace
self._is_simulation = False
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Adds a project reference to given project.
Usage: cpl add <source-project> <target-project>
Arguments:
source-project: Name of the project to which the reference has to be
target-project: Name of the project to be referenced
"""
)
def _edit_project_file(self, source: str, project_settings: ProjectSettings, build_settings: BuildSettings):
if self._is_simulation:
return
with open(source, "w") as file:
file.write(
json.dumps(
{
ProjectSettings.__name__: SettingsHelper.get_project_settings_dict(project_settings),
BuildSettings.__name__: SettingsHelper.get_build_settings_dict(build_settings),
},
indent=2,
)
)
file.close()
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if "simulate" in args:
args.remove("simulate")
Console.write_line("Running in simulation mode:")
self._is_simulation = True
if len(args) == 0:
Console.error("Expected source and target project")
return
elif len(args) == 1:
Console.error("Expected target project")
return
elif len(args) > 2:
Console.error(f'Unexpected argument(s): {", ".join(args[2:])}')
return
# file names
source = args[0]
target = args[1]
# validation flags
is_invalid_source = False
is_invalid_target = source == target
if not is_invalid_target:
if self._workspace is None:
is_invalid_source = not os.path.isfile(source)
is_invalid_target = not os.path.isfile(target)
else:
if source not in self._workspace.projects:
is_invalid_source = True
else:
source = self._workspace.projects[source]
if target not in self._workspace.projects:
is_invalid_target = True
else:
target = self._workspace.projects[target]
# load project-name.json
self._config.add_json_file(source, optional=True, output=False)
project_settings: Optional[ProjectSettings] = self._config.get_configuration(ProjectSettings)
build_settings: Optional[BuildSettings] = self._config.get_configuration(BuildSettings)
if project_settings is None or build_settings is None:
is_invalid_source = True
if is_invalid_source:
Console.error(f"Invalid source: {source}")
return
if is_invalid_target or source == target or not os.path.isfile(target):
Console.error(f"Invalid target: {target}")
return
if self._workspace is None:
target = f"../{target}"
else:
target = target.replace("src", "..")
if target in build_settings.project_references:
Console.error(f"Project reference already exists.")
return
build_settings.project_references.append(target)
Console.spinner(
f"Editing {source}",
self._edit_project_file,
source,
project_settings,
build_settings,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)

View File

@@ -0,0 +1,32 @@
import textwrap
from cpl_cli.command_abc import CommandABC
from cpl_cli.publish.publisher_abc import PublisherABC
class BuildService(CommandABC):
def __init__(self, publisher: PublisherABC):
"""
Service for the CLI command build
:param publisher:
"""
CommandABC.__init__(self)
self._publisher = publisher
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Copies an python app into an output directory named build/ at the given output path. Must be executed within a CPL workspace or project directory
Usage: cpl build
"""
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
self._publisher.build()

View File

@@ -0,0 +1,49 @@
import os
import subprocess
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.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, env: ApplicationEnvironmentABC, ws: WorkspaceSettings):
"""
Service for CLI scripts
"""
CommandABC.__init__(self)
self._config = config
self._env = env
self._workspace = ws
@property
def help_message(self) -> str:
return ""
def execute(self, args: list[str]):
cmd = self._config.get_configuration("ACTIVE_EXECUTABLE")
wd = self._config.get_configuration("PATH_WORKSPACE")
if wd is not None:
self._env.set_working_directory(wd)
for script in self._workspace.scripts:
if script != cmd:
continue
command = ""
external_args = self._config.get_configuration("ARGS")
if external_args is not None:
command += f'ARGS="{external_args}";'
command += self._workspace.scripts[script]
env_vars = os.environ
env_vars["CPL_ARGS"] = " ".join(args)
try:
subprocess.run(command, shell=True if os.name == "posix" else None)
except Exception as e:
Console.error(str(e))

View File

@@ -0,0 +1,223 @@
import importlib
import os
import sys
import textwrap
import traceback
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration import WorkspaceSettings
from cpl_cli.configuration.schematic_collection import SchematicCollection
from cpl_cli.helper.dependencies import Dependencies
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.utils.string import String
class GenerateService(CommandABC):
def __init__(
self,
configuration: ConfigurationABC,
workspace: WorkspaceSettings,
):
"""
Service for the CLI command generate
:param configuration:
"""
CommandABC.__init__(self)
self._config = configuration
self._workspace = workspace
self._config = configuration
self._env = self._config.environment
self._schematics = {}
self._schematic_classes = set()
for package_name, version in Dependencies.get_cpl_packages():
if package_name == "cpl-cli":
continue
package = importlib.import_module(String.convert_to_snake_case(package_name))
self._read_custom_schematics_from_path(os.path.dirname(package.__file__))
self._read_custom_schematics_from_path(self._env.working_directory)
self._read_custom_schematics_from_path(self._env.runtime_directory)
if len(self._schematic_classes) == 0:
Console.error(f"No schematics found in template directory: .cpl")
sys.exit()
known_schematics = []
for schematic in self._schematic_classes:
known_schematics.append(schematic.__name__)
schematic.register()
self._schematics = SchematicCollection.get_schematics()
@property
def help_message(self) -> str:
schematics = []
for schematic in self._schematics:
aliases = "|".join(self._schematics[schematic]["Aliases"])
schematic_str = schematic
if len(aliases) > 0:
schematic_str = f"{schematic} ({aliases})"
schematics.append(schematic_str)
help_msg = textwrap.dedent(
"""\
Generate a file based on schematic.
Usage: cpl generate <schematic> <name>
Arguments:
schematic: The schematic to generate.
name: The name of the generated file
Schematics:"""
)
for schematic in schematics:
help_msg += f"\n {schematic}"
return help_msg
def _read_custom_schematics_from_path(self, path: str):
if not os.path.exists(os.path.join(path, ".cpl")):
return
sys.path.insert(0, os.path.join(path, ".cpl"))
for r, d, f in os.walk(os.path.join(path, ".cpl")):
for file in f:
if not file.startswith("schematic_") or not file.endswith(".py"):
continue
try:
exec(open(os.path.join(r, file), "r").read())
self._schematic_classes.update(GenerateSchematicABC.__subclasses__())
except Exception as e:
Console.error(str(e), traceback.format_exc())
sys.exit(-1)
@staticmethod
def _create_file(file_path: str, value: str):
"""
Creates the given file with content
:param file_path:
:param value:
:return:
"""
with open(file_path, "w") as template:
template.write(value)
template.close()
def _create_init_files(
self, file_path: str, template: GenerateSchematicABC, class_name: str, schematic: str, rel_path: str
):
if not os.path.isdir(os.path.dirname(file_path)):
os.makedirs(os.path.dirname(file_path))
directory = ""
for subdir in template.path.split("/"):
directory = os.path.join(directory, subdir)
if subdir == "src":
continue
file = self._schematics["init"]["Template"](class_name, "init", rel_path)
if os.path.exists(os.path.join(os.path.abspath(directory), file.name)):
continue
Console.spinner(
f"Creating {os.path.abspath(directory)}/{file.name}",
self._create_file,
os.path.join(os.path.abspath(directory), file.name),
file.get_code(),
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
def _generate(self, schematic: str, name: str, template: type):
"""
Generates files by given schematic, name and template
:param schematic:
:param name:
:param template:
:return:
"""
class_name = name
rel_path = ""
if "/" in name:
parts = name.split("/")
rel_path = "/".join(parts[:-1])
class_name = parts[len(parts) - 1]
if self._workspace is not None and parts[0] in self._workspace.projects:
rel_path = os.path.join(os.path.dirname(self._workspace.projects[parts[0]]), *parts[1:-1])
template = template(class_name, String.convert_to_snake_case(schematic), rel_path)
file_path = os.path.join(self._env.working_directory, template.path, template.name)
self._create_init_files(file_path, template, class_name, schematic, rel_path)
if os.path.isfile(file_path):
Console.error(f"{String.first_to_upper(schematic)} already exists!\n")
sys.exit()
message = f"Creating {self._env.working_directory}/{template.path}/{template.name}"
if template.path == "":
message = f"Creating {self._env.working_directory}/{template.name}"
Console.spinner(
message,
self._create_file,
file_path,
template.get_code(),
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
def _get_schematic_by_alias(self, schematic: str) -> str:
for key in self._schematics:
if schematic in self._schematics[key]["Aliases"]:
return key
return schematic
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
schematic = None
value = None
for s in self._schematics:
value = self._config.get_configuration(s)
if value is not None:
schematic = s
break
if (
schematic is None
and len(args) >= 1
and (args[0] in self._schematics or self._get_schematic_by_alias(args[0]) != args[0])
):
schematic = self._get_schematic_by_alias(args[0])
self._config.add_configuration(schematic, args[1])
value = args[1]
if schematic is None:
Console.error(f"Schematic not found")
Console.write_line(self.help_message)
sys.exit()
name = value
if name is None:
name = Console.read(f"Name for the {args[0]}: ")
if schematic in self._schematics:
s = self._schematics[schematic]
self._generate(schematic, name, s["Template"])
else:
self._help("Usage: cpl generate <schematic> [options]")
Console.write_line()
sys.exit()

View File

@@ -0,0 +1,67 @@
import sys
import textwrap
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.dependency_injection.service_provider_abc import ServiceProviderABC
from cpl_cli.command_abc import CommandABC
class HelpService(CommandABC):
def __init__(self, services: ServiceProviderABC):
"""
Service for CLI command help
"""
CommandABC.__init__(self)
self._services = services
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Lists available command and their short descriptions.
Usage: cpl help
"""
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if len(args) > 0:
Console.error(f'Unexpected argument(s): {", ".join(args)}')
sys.exit()
Console.write_line("Available Commands:")
commands = [
["add (a|a)", "Adds a project reference to given project."],
[
"build (b|B)",
"Prepares files for publish into an output directory named dist/ at the given output path. Must be executed from within a workspace directory.",
],
["generate (g|G)", "Generate a new file."],
["help (h|H)", "Lists available command and their short descriptions."],
[
"install (i|I)",
"With argument installs packages to project, without argument installs project dependencies.",
],
["new (n|N)", "Creates new CPL project."],
[
"publish (p|P)",
"Prepares files for publish into an output directory named dist/ at the given output path and executes setup.py. Must be executed from within a library workspace directory.",
],
["remove (r|R)", "Removes a project from workspace."],
["start (s|S)", "Starts CPL project, restarting on file changes."],
["uninstall (ui|UI)", "Uninstalls packages from project."],
["update (u|u)", "Update CPL and project dependencies."],
["version (v|V)", "Outputs CPL CLI version."],
]
for name, description in commands:
Console.set_foreground_color(ForegroundColorEnum.blue)
Console.write(f"\n\t{name} ")
Console.set_foreground_color(ForegroundColorEnum.default)
Console.write(f"{description}")
Console.write_line("\nRun 'cpl <command> --help' for command specific information's\n")

View File

@@ -0,0 +1,281 @@
import json
import os
import subprocess
import textwrap
import time
from packaging import version
from cpl_cli.cli_settings import CLISettings
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration.build_settings import BuildSettings
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.configuration.settings_helper import SettingsHelper
from cpl_cli.configuration.venv_helper_service import VenvHelper
from cpl_cli.error import Error
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.environment.application_environment_abc import ApplicationEnvironmentABC
from cpl_core.utils.pip import Pip
class InstallService(CommandABC):
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
build_settings: BuildSettings,
project_settings: ProjectSettings,
cli_settings: CLISettings,
):
"""
Service for the CLI command install
:param config:
:param env:
:param build_settings:
:param project_settings:
:param cli_settings:
"""
CommandABC.__init__(self)
self._config = config
self._env = env
self._build_settings = build_settings
self._project_settings = project_settings
self._cli_settings = cli_settings
self._is_simulation = False
self._is_virtual = False
self._is_dev = False
self._project_file = f"{self._project_settings.name}.json"
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Installs given package via pip
Usage: cpl install <package>
Arguments:
package The package to install
"""
)
def _wait(self, t: int, *args, source: str = None, stdout=None, stderr=None):
time.sleep(t)
def _install_project(self):
"""
Installs dependencies of CPl project
:return:
"""
if self._project_settings is None or self._build_settings is None:
Error.error("The command requires to be run in an CPL project, but a project could not be found.")
return
if self._project_settings.dependencies is None:
Error.error(f"Found invalid dependencies in {self._project_file}.")
return
for dependency in self._project_settings.dependencies:
Console.spinner(
f"Installing: {dependency}",
Pip.install if not self._is_virtual else self._wait,
dependency if not self._is_virtual else 2,
"--upgrade",
source=self._cli_settings.pip_path,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
local_package = Pip.get_package(dependency)
if local_package is None:
Error.warn(f"Installation of package {dependency} failed!")
return
for dependency in self._project_settings.dev_dependencies:
Console.spinner(
f"Installing dev: {dependency}",
Pip.install if not self._is_virtual else self._wait,
dependency if not self._is_virtual else 2,
"--upgrade",
source=self._cli_settings.pip_path,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
local_package = Pip.get_package(dependency)
if local_package is None:
Error.warn(f"Installation of package {dependency} failed!")
return
if not self._is_virtual:
Pip.reset_executable()
def _install_package(self, package: str):
"""
Installs given package
:param package:
:return:
"""
is_already_in_project = False
if self._project_settings is None or self._build_settings is None:
Error.error("The command requires to be run in an CPL project, but a project could not be found.")
return
if self._project_settings.dependencies is None:
Error.error(f"Found invalid dependencies in {self._project_file}.")
return
package_version = ""
name = package
if "==" in package:
name = package.split("==")[0]
package_version = package.split("==")[1]
elif ">=" in package:
name = package.split(">=")[0]
package_version = package.split(">=")[1]
elif "<=" in package:
name = package.split("<=")[0]
package_version = package.split("<=")[1]
to_remove_list = []
deps = self._project_settings.dependencies
if self._is_dev:
deps = self._project_settings.dev_dependencies
for dependency in deps:
dependency_version = ""
if "==" in dependency:
dependency_version = dependency.split("==")[1]
elif "<=" in dependency:
dependency_version = dependency.split("<=")[1]
elif ">=" in dependency:
dependency_version = dependency.split(">=")[1]
if name in dependency:
if package_version != "" and version.parse(package_version) != version.parse(dependency_version):
to_remove_list.append(dependency)
break
else:
is_already_in_project = True
for to_remove in to_remove_list:
if self._is_dev:
self._project_settings.dev_dependencies.remove(to_remove)
else:
self._project_settings.dependencies.remove(to_remove)
local_package = Pip.get_package(package)
if local_package is not None and local_package in self._project_settings.dependencies:
Error.warn(f"Package {local_package} is already installed.")
return
elif is_already_in_project:
Error.warn(f"Package {package} is already installed.")
return
Console.spinner(
f"Installing: {package}" if not self._is_dev else f"Installing dev: {package}",
Pip.install if not self._is_virtual else self._wait,
package if not self._is_virtual else 2,
source=self._cli_settings.pip_path,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
if self._is_virtual:
new_package = name
else:
new_package = Pip.get_package(name)
if (
new_package is None
or "==" in package
and version.parse(package.split("==")[1]) != version.parse(new_package.split("==")[1])
or "<=" in package
and version.parse(package.split("<=")[1]) != version.parse(new_package.split("<=")[1])
or ">=" in package
and version.parse(package.split(">=")[1]) != version.parse(new_package.split(">=")[1])
):
Console.error(f"Installation of package {package} failed")
return
if not is_already_in_project:
new_name = package
if "==" in new_package or ">=" in new_package or "<=" in new_package:
new_name = new_package
elif "==" in name or ">=" in name or "<=" in name:
new_name = name
if "/" in new_name:
new_name = new_name.split("/")[0]
if "\r" in new_name:
new_name = new_name.replace("\r", "")
if self._is_dev:
self._project_settings.dev_dependencies.append(new_name)
else:
self._project_settings.dependencies.append(new_name)
if not self._is_simulation:
config = {
ProjectSettings.__name__: SettingsHelper.get_project_settings_dict(self._project_settings),
BuildSettings.__name__: SettingsHelper.get_build_settings_dict(self._build_settings),
}
with open(os.path.join(self._env.working_directory, self._project_file), "w") as project_file:
project_file.write(json.dumps(config, indent=2))
project_file.close()
Pip.reset_executable()
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if "dev" in args:
self._is_dev = True
args.remove("dev")
if "virtual" in args:
self._is_virtual = True
args.remove("virtual")
Console.write_line("Running in virtual mode:")
if "simulate" in args:
self._is_simulation = True
args.remove("simulate")
Console.write_line("Running in simulation mode:")
if "cpl-prod" in args:
args.remove("cpl-prod")
self._cli_settings.from_dict({"PipPath": "https://pip.sh-edraft.de"})
if "cpl-exp" in args:
args.remove("cpl-exp")
self._cli_settings.from_dict({"PipPath": "https://pip-exp.sh-edraft.de"})
if "cpl-dev" in args:
args.remove("cpl-dev")
self._cli_settings.from_dict({"PipPath": "https://pip-dev.sh-edraft.de"})
VenvHelper.init_venv(self._is_virtual, self._env, self._project_settings.python_executable)
if len(args) == 0:
self._install_project()
else:
self._install_package(args[0])
if not self._is_virtual:
Pip.reset_executable()

View File

@@ -0,0 +1,362 @@
import importlib
import os
import sys
import textwrap
import traceback
from typing import Optional
from packaging import version
import cpl_cli
import cpl_core
from cpl_cli.abc.project_type_abc import ProjectTypeABC
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration import VersionSettings
from cpl_cli.configuration.build_settings import BuildSettings
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.configuration.project_type_enum import ProjectTypeEnum
from cpl_cli.configuration.settings_helper import SettingsHelper
from cpl_cli.configuration.venv_helper_service import VenvHelper
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
from cpl_cli.helper.dependencies import Dependencies
from cpl_cli.source_creator.template_builder import TemplateBuilder
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.utils.string import String
class NewService(CommandABC):
def __init__(self, configuration: ConfigurationABC):
"""
Service for the CLI command new
:param configuration:
"""
CommandABC.__init__(self)
self._config = configuration
self._env = self._config.environment
self._workspace: WorkspaceSettings = self._config.get_configuration(WorkspaceSettings)
self._project_dict = {}
self._build_dict = {}
self._project_name = ""
self._python_executable = ""
self._project_type_classes = set()
self._name: str = ""
self._rel_path: str = ""
self._project_type: ProjectTypeEnum = ProjectTypeEnum.console
self._use_nothing: bool = False
self._use_application_api: bool = False
self._use_startup: bool = False
self._use_service_providing: bool = False
self._use_async: bool = False
self._use_venv: bool = False
self._use_base: bool = False
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Generates a workspace and initial project or add a project to workspace.
Usage: cpl new <type> <name>
Arguments:
type The project type of the initial project
name Name of the workspace or the project
Types:
console (c|C)
library (l|L)
unittest (ut|UT)
"""
)
def _create_project_settings(self):
self._project_name = os.path.basename(self._name)
self._python_executable = ProjectSettings(
python_path={sys.platform: "../../venv/" if self._use_venv else ""}
).python_executable
self._rel_path = os.path.dirname(self._name)
self._project_dict = SettingsHelper.get_project_settings_dict(
ProjectSettings(
os.path.basename(self._name),
VersionSettings("0", "0", "0"),
"",
"",
"",
"",
"",
"",
"",
"",
"",
[f"cpl-core>={version.parse(cpl_core.__version__)}"],
[f"cpl-cli>={version.parse(cpl_cli.__version__)}"],
f'>={sys.version.split(" ")[0]}',
{sys.platform: "../../venv/" if self._use_venv else ""},
None,
[],
)
)
def _create_build_settings(self, project_type: str):
self._build_dict = SettingsHelper.get_build_settings_dict(
BuildSettings(
ProjectTypeEnum[project_type],
"",
"../../dist",
f"{String.convert_to_snake_case(self._project_name)}.main",
self._project_name,
False,
[],
["*/__pycache__", "*/logs", "*/tests"],
{},
[],
)
)
def _create_project_json(self):
"""
Creates cpl.json content
:return:
"""
self._project_json = {ProjectSettings.__name__: self._project_dict, BuildSettings.__name__: self._build_dict}
def _get_project_path(self) -> Optional[str]:
"""
Gets project path
:return:
"""
if self._workspace is None:
project_path = os.path.join(self._env.working_directory, self._rel_path, self._project_name)
else:
base = "" if self._use_base else "src"
project_path = os.path.join(
self._env.working_directory, base, self._rel_path, String.convert_to_snake_case(self._project_name)
)
if os.path.isdir(project_path) and len(os.listdir(project_path)) > 0:
Console.write_line(project_path)
Console.error("Project path is not empty\n")
return None
return project_path
def _get_project_information(self, project_type: str):
"""
Gets project information's from user
:return:
"""
is_unittest = project_type == "unittest"
is_library = project_type == "library"
if is_library:
return
if (
self._use_application_api
or self._use_startup
or self._use_service_providing
or self._use_async
or self._use_nothing
):
Console.set_foreground_color(ForegroundColorEnum.default)
Console.write_line("Skipping question due to given flags")
return
if not is_unittest and not is_library:
self._use_application_api = Console.read("Do you want to use application base? (y/n) ").lower() == "y"
if not is_unittest and self._use_application_api:
self._use_startup = Console.read("Do you want to use startup? (y/n) ").lower() == "y"
if not is_unittest and not self._use_application_api:
self._use_service_providing = Console.read("Do you want to use service providing? (y/n) ").lower() == "y"
if not self._use_async:
self._use_async = Console.read("Do you want to use async? (y/n) ").lower() == "y"
Console.set_foreground_color(ForegroundColorEnum.default)
def _create_venv(self):
project = self._project_name
if self._workspace is not None:
project = self._workspace.default_project
if self._env.working_directory.endswith(project):
project = ""
if self._workspace is None and self._use_base:
project = f"{self._rel_path}/{project}"
VenvHelper.init_venv(
False,
self._env,
self._python_executable,
explicit_path=os.path.join(
self._env.working_directory, project, self._python_executable.replace("../", "")
),
)
def _read_custom_project_types_from_path(self, path: str):
if not os.path.exists(os.path.join(path, ".cpl")):
return
sys.path.insert(0, os.path.join(path, ".cpl"))
for r, d, f in os.walk(os.path.join(path, ".cpl")):
for file in f:
if file.startswith("project_file_") or not file.startswith("project_") or not file.endswith(".py"):
continue
try:
exec(open(os.path.join(r, file), "r").read())
self._project_type_classes.update(ProjectTypeABC.__subclasses__())
except Exception as e:
Console.error(str(e), traceback.format_exc())
sys.exit(-1)
def _create_project(self, project_type: str):
for package_name in Dependencies.get_cpl_packages():
if package_name == "cpl-cli":
continue
package = importlib.import_module(String.convert_to_snake_case(package_name[0]))
self._read_custom_project_types_from_path(os.path.dirname(package.__file__))
self._read_custom_project_types_from_path(self._env.working_directory)
self._read_custom_project_types_from_path(self._env.runtime_directory)
if len(self._project_type_classes) == 0:
Console.error(f"No project types found in template directory: .cpl")
sys.exit()
project_class = None
known_project_types = []
for p in self._project_type_classes:
known_project_types.append(p.__name__)
if p.__name__.lower() != project_type and p.__name__.lower()[0] != project_type[0]:
continue
project_class = p
if project_class is None:
Console.error(f"Project type {project_type} not found in template directory: .cpl/")
sys.exit()
project_type = String.convert_to_snake_case(project_class.__name__)
self._create_project_settings()
self._create_build_settings(project_type)
self._create_project_json()
path = self._get_project_path()
if path is None:
return
self._get_project_information(project_type)
project_name = self._project_name
if self._rel_path != "":
project_name = f"{self._rel_path}/{project_name}"
base = "src/"
split_project_name = project_name.split("/")
if self._use_base and len(split_project_name) > 0:
base = f"{split_project_name[0]}/"
project = project_class(
base if self._workspace is not None else "src/",
project_name,
self._workspace,
self._use_application_api,
self._use_startup,
self._use_service_providing,
self._use_async,
self._project_json,
)
if self._workspace is None:
TemplateBuilder.create_workspace(
f"{project_name}/cpl-workspace.json",
project_name.split("/")[-1],
{
project_name: f'{base if self._workspace is not None else "src/"}{String.convert_to_snake_case(project_name)}/{project_name}.json'
},
{},
)
else:
self._workspace.projects[
project_name
] = f'{base if self._workspace is not None else "src/"}{String.convert_to_snake_case(project_name)}/{project_name}.json'
TemplateBuilder.create_workspace(
"cpl-workspace.json", self._workspace.default_project, self._workspace.projects, self._workspace.scripts
)
for template in project.templates:
rel_base = "/".join(project_name.split("/")[:-1])
template_path_base = template.path.split("/")[0]
if not self._use_base and rel_base != "" and template_path_base != "" and template_path_base != rel_base:
template.path = template.path.replace(f"{template_path_base}/", f"{template_path_base}/{rel_base}/")
if template.name.endswith(f'{project_name.split("/")[-1]}.json'):
pass
file_path = os.path.join(project_name if self._workspace is None else "", template.path, template.name)
Console.spinner(
f"Creating {file_path}",
TemplateBuilder.build,
file_path,
template,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
if self._use_venv:
self._create_venv()
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if "nothing" in args:
self._use_nothing = True
self._use_async = False
self._use_application_api = False
self._use_startup = False
self._use_service_providing = False
if "async" in args:
args.remove("async")
if "application-base" in args:
args.remove("application-base")
if "startup" in args:
args.remove("startup")
if "service-providing" in args:
args.remove("service-providing")
if "async" in args:
self._use_async = True
args.remove("async")
if "application-base" in args:
self._use_application_api = True
args.remove("application-base")
if "startup" in args:
self._use_startup = True
args.remove("startup")
if "service-providing" in args:
self._use_service_providing = True
args.remove("service-providing")
if "venv" in args:
self._use_venv = True
args.remove("venv")
if "base" in args:
self._use_base = True
args.remove("base")
if len(args) <= 1:
Console.error(f"Project type not found")
Console.write_line(self.help_message)
return
self._name = args[1]
self._create_project(args[0])

View File

@@ -0,0 +1,32 @@
import textwrap
from cpl_cli.command_abc import CommandABC
from cpl_cli.publish.publisher_abc import PublisherABC
class PublishService(CommandABC):
def __init__(self, publisher: PublisherABC):
"""
Service for the CLI command publish
:param publisher:
"""
CommandABC.__init__(self)
self._publisher = publisher
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Prepares files for publish into an output directory named dist/ at the given output path and executes setup.py.
Usage: cpl publish
"""
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
self._publisher.publish()

View File

@@ -0,0 +1,172 @@
import os
import shutil
import json
import textwrap
from cpl_cli.configuration.settings_helper import SettingsHelper
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.environment.application_environment_abc import ApplicationEnvironmentABC
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration import (
WorkspaceSettings,
WorkspaceSettingsNameEnum,
BuildSettingsNameEnum,
ProjectSettings,
BuildSettings,
)
class RemoveService(CommandABC):
def __init__(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
"""
Service for CLI command remove
:param config:
:param env:
"""
CommandABC.__init__(self)
self._config = config
self._env = env
self._workspace: WorkspaceSettings = self._config.get_configuration(WorkspaceSettings)
self._is_simulation = False
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Removes a project from workspace.
Usage: cpl remove <project>
Arguments:
project The name of the project to delete
"""
)
def _create_file(self, file_name: str, content: dict):
if self._is_simulation:
return
if not os.path.isabs(file_name):
file_name = os.path.abspath(file_name)
path = os.path.dirname(file_name)
if not os.path.isdir(path):
os.makedirs(path)
with open(file_name, "w") as project_json:
project_json.write(json.dumps(content, indent=2))
project_json.close()
def _remove_sources(self, path: str):
if self._is_simulation:
return
shutil.rmtree(path)
def _create_workspace(self, path: str):
ws_dict = {
WorkspaceSettings.__name__: {
WorkspaceSettingsNameEnum.default_project.value: self._workspace.default_project,
WorkspaceSettingsNameEnum.projects.value: self._workspace.projects,
WorkspaceSettingsNameEnum.scripts.value: self._workspace.scripts,
}
}
self._create_file(path, ws_dict)
def _get_project_settings(self, project: str) -> dict:
with open(os.path.join(os.getcwd(), self._workspace.projects[project]), "r", encoding="utf-8") as cfg:
# load json
project_json = json.load(cfg)
cfg.close()
return project_json
def _write_project_settings(self, project: str, project_settings: dict, build_settings: dict):
with open(os.path.join(os.getcwd(), self._workspace.projects[project]), "w", encoding="utf-8") as file:
file.write(
json.dumps(
{ProjectSettings.__name__: project_settings, BuildSettings.__name__: build_settings}, indent=2
)
)
file.close()
def _find_deps_in_projects(self, project_name: str, rel_path: str):
for project in self._workspace.projects:
if project == project_name:
continue
project_settings = self._get_project_settings(project)
if (
BuildSettings.__name__ not in project_settings
or BuildSettingsNameEnum.project_references.value not in project_settings[BuildSettings.__name__]
):
continue
ref_to_delete = ""
for ref in project_settings[BuildSettings.__name__][BuildSettingsNameEnum.project_references.value]:
if os.path.basename(ref) == f"{project_name}.json":
ref_to_delete = ref
if (
ref_to_delete
not in project_settings[BuildSettings.__name__][BuildSettingsNameEnum.project_references.value]
):
continue
project_settings[BuildSettings.__name__][BuildSettingsNameEnum.project_references.value].remove(
ref_to_delete
)
Console.spinner(
f"Removing {project_name} from {project}",
self._write_project_settings,
project,
project_settings[ProjectSettings.__name__],
project_settings[BuildSettings.__name__],
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if "simulate" in args:
args.remove("simulate")
Console.write_line("Running in simulation mode:")
self._is_simulation = True
project_name = args[0]
if project_name not in self._workspace.projects:
Console.error(f"Project {project_name} not found in workspace.")
return
if project_name == self._workspace.default_project:
Console.error(f"Project {project_name} is the default project.")
return
src_path = os.path.dirname(self._workspace.projects[project_name])
Console.spinner(
f"Removing {src_path}",
self._remove_sources,
os.path.abspath(src_path),
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
self._find_deps_in_projects(project_name, src_path)
del self._workspace.projects[project_name]
path = "cpl-workspace.json"
Console.spinner(
f"Changing {path}",
self._create_workspace,
path,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)

View File

@@ -0,0 +1,125 @@
import os
import sys
import textwrap
from cpl_cli.error import Error
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration.workspace_settings import WorkspaceSettings
from cpl_cli.configuration.build_settings import BuildSettings
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.live_server.start_executable import StartExecutable
from cpl_cli.publish.publisher_service import PublisherService
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.dependency_injection.service_provider_abc import ServiceProviderABC
from cpl_core.environment.application_environment_abc import ApplicationEnvironmentABC
from cpl_core.utils.string import String
class RunService(CommandABC):
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
services: ServiceProviderABC,
project_settings: ProjectSettings,
build_settings: BuildSettings,
workspace: WorkspaceSettings,
publisher: PublisherService,
):
"""
Service for the CLI command start
:param config:
:param env:
:param services:
:param project_settings:
:param build_settings:
:param workspace:
"""
CommandABC.__init__(self)
self._config = config
self._env = env
self._services = services
self._project_settings = project_settings
self._build_settings = build_settings
self._workspace = workspace
self._publisher = publisher
self._src_dir = os.path.join(self._env.working_directory, self._build_settings.source_path)
self._is_dev = False
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Starts your application.
Usage: cpl run
"""
)
def _set_project_by_args(self, name: str):
if self._workspace is None:
Error.error("The command requires to be run in an CPL workspace, but a workspace could not be found.")
sys.exit()
if name not in self._workspace.projects:
Error.error(f"Project {name} not found in workspace")
sys.exit()
project_path = self._workspace.projects[name]
self._config.add_configuration(ProjectSettings, None)
self._config.add_configuration(BuildSettings, None)
working_directory = self._config.get_configuration("PATH_WORKSPACE")
if working_directory is not None:
self._env.set_working_directory(working_directory)
json_file = os.path.join(self._env.working_directory, project_path)
self._config.add_json_file(json_file, optional=True, output=False)
self._project_settings: ProjectSettings = self._config.get_configuration(ProjectSettings)
self._build_settings: BuildSettings = self._config.get_configuration(BuildSettings)
if self._project_settings is None or self._build_settings is None:
Error.error(f"Project {name} not found")
sys.exit()
self._src_dir = os.path.dirname(json_file)
def _build(self):
if self._is_dev:
return
self._env.set_working_directory(self._src_dir)
self._publisher.build()
self._env.set_working_directory(self._src_dir)
self._src_dir = os.path.abspath(
os.path.join(
self._src_dir,
self._build_settings.output_path,
self._project_settings.name,
"build",
String.convert_to_snake_case(self._project_settings.name),
)
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if "dev" in args:
self._is_dev = True
args.remove("dev")
if len(args) >= 1:
self._set_project_by_args(args[0])
args.remove(args[0])
self._build()
start_service = StartExecutable(self._env, self._build_settings)
start_service.run(args, self._project_settings.python_executable, self._src_dir, output=False)
Console.write_line()

View File

@@ -0,0 +1,32 @@
import textwrap
from cpl_cli.command_abc import CommandABC
from cpl_cli.live_server.live_server_service import LiveServerService
class StartService(CommandABC):
def __init__(self, live_server: LiveServerService):
"""
Service for the CLI command start
:param live_server:
"""
CommandABC.__init__(self)
self._live_server = live_server
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Starts your application, restarting on file changes.
Usage: cpl start
"""
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
self._live_server.start(args)

View File

@@ -0,0 +1,140 @@
import json
import os
import subprocess
import textwrap
import time
from cpl_cli.configuration.venv_helper_service import VenvHelper
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.environment.application_environment_abc import ApplicationEnvironmentABC
from cpl_core.utils.pip import Pip
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration.build_settings import BuildSettings
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.configuration.settings_helper import SettingsHelper
class UninstallService(CommandABC):
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
build_settings: BuildSettings,
project_settings: ProjectSettings,
):
"""
Service for the CLI command uninstall
:param config:
:param env:
:param build_settings:
:param project_settings:
"""
CommandABC.__init__(self)
self._config = config
self._env = env
self._build_settings = build_settings
self._project_settings = project_settings
self._is_simulating = False
self._is_virtual = False
self._is_dev = False
self._project_file = f"{self._project_settings.name}.json"
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Uninstalls given package via pip
Usage: cpl uninstall <package>
Arguments:
package The package to uninstall
"""
)
def _wait(self, t: int, *args, source: str = None, stdout=None, stderr=None):
time.sleep(t)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if len(args) == 0:
Console.error(f"Expected package")
Console.error(f"Usage: cpl uninstall <package>")
return
if "dev" in args:
self._is_dev = True
args.remove("dev")
if "--virtual" in args:
self._is_virtual = True
args.remove("--virtual")
Console.write_line("Running in virtual mode:")
if "--simulate" in args:
self._is_virtual = True
args.remove("--simulate")
Console.write_line("Running in simulation mode:")
VenvHelper.init_venv(self._is_virtual, self._env, self._project_settings.python_executable)
package = args[0]
is_in_dependencies = False
if not self._is_virtual:
pip_package = Pip.get_package(package)
else:
pip_package = package
deps = self._project_settings.dependencies
if self._is_dev:
deps = self._project_settings.dev_dependencies
for dependency in deps:
if package in dependency:
is_in_dependencies = True
package = dependency
if not is_in_dependencies and pip_package is None:
Console.error(f"Package {package} not found")
return
elif not is_in_dependencies and pip_package is not None:
package = pip_package
Console.spinner(
f"Uninstalling: {package}" if not self._is_dev else f"Uninstalling dev: {package}",
Pip.uninstall if not self._is_virtual else self._wait,
package if not self._is_virtual else 2,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
deps = self._project_settings.dependencies
if self._is_dev:
deps = self._project_settings.dev_dependencies
if package in deps:
deps.remove(package)
if not self._is_simulating:
config = {
ProjectSettings.__name__: SettingsHelper.get_project_settings_dict(self._project_settings),
BuildSettings.__name__: SettingsHelper.get_build_settings_dict(self._build_settings),
}
with open(os.path.join(self._env.working_directory, self._project_file), "w") as project_file:
project_file.write(json.dumps(config, indent=2))
project_file.close()
Console.write_line(f"Removed {package}")
if not self._is_virtual:
Pip.reset_executable()

View File

@@ -0,0 +1,228 @@
import json
import os
import subprocess
import textwrap
from cpl_cli.configuration.venv_helper_service import VenvHelper
from cpl_cli.migrations.base.migration_service_abc import MigrationServiceABC
from cpl_core.configuration.configuration_abc import ConfigurationABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.environment.application_environment_abc import ApplicationEnvironmentABC
from cpl_core.utils.pip import Pip
from cpl_cli.cli_settings import CLISettings
from cpl_cli.command_abc import CommandABC
from cpl_cli.configuration import BuildSettings
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.configuration.settings_helper import SettingsHelper
class UpdateService(CommandABC):
def __init__(
self,
config: ConfigurationABC,
env: ApplicationEnvironmentABC,
build_settings: BuildSettings,
project_settings: ProjectSettings,
cli_settings: CLISettings,
migrations: MigrationServiceABC,
):
"""
Service for the CLI command update
:param config:
:param env:
:param build_settings:
:param project_settings:
:param cli_settings:
"""
CommandABC.__init__(self)
self._config = config
self._env = env
self._build_settings = build_settings
self._project_settings = project_settings
self._cli_settings = cli_settings
self._migrations = migrations
self._is_simulation = False
self._project_file = f"{self._project_settings.name}.json"
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Updates the CPL and project dependencies.
Usage: cpl update
"""
)
def _collect_project_dependencies(self) -> list[tuple]:
"""
Collects project dependencies
:return:
"""
dependencies = []
for package in [*self._project_settings.dependencies, *self._project_settings.dev_dependencies]:
name = package
if "==" in package:
name = package.split("==")[0]
elif ">=" in package:
name = package.split(">=")[0]
elif "<=" in package:
name = package.split("<=")[0]
dependencies.append((package, name))
return dependencies
def _update_project_dependencies(self, dependencies):
"""
Updates project dependencies
:return:
"""
for package, name in dependencies:
Pip.install(
name,
"--upgrade",
"--upgrade-strategy",
"eager",
source=self._cli_settings.pip_path,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
new_package = Pip.get_package(name)
if new_package is None:
Console.error(f"Update for package {package} failed")
continue
self._project_json_update_dependency(package, new_package)
def _check_project_dependencies(self):
"""
Checks project dependencies for updates
:return:
"""
dependencies = Console.spinner(
"Collecting installed dependencies",
self._collect_project_dependencies,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
Console.spinner(
"Updating installed dependencies",
self._update_project_dependencies,
dependencies,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
if "cpl-cli" in [y for x, y in dependencies]:
import cpl_cli
Console.spinner(
"Running migrations",
self._migrations.migrate_from,
cpl_cli.__version__,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
Console.write_line(f"Found {len(self._project_settings.dependencies)} dependencies.")
@staticmethod
def _check_outdated():
"""
Checks for outdated packages in project
:return:
"""
table_str: bytes = Console.spinner(
"Analyzing for available package updates",
Pip.get_outdated,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
table = str(table_str, "utf-8").split("\n")
if len(table) > 1 and table[0] != "":
Console.write_line("\tAvailable updates for packages:")
for row in table:
Console.write_line(f"\t{row}")
Console.set_foreground_color(ForegroundColorEnum.yellow)
Console.write_line(f"\tUpdate with {Pip.get_executable()} -m pip install --upgrade <package>")
Console.set_foreground_color(ForegroundColorEnum.default)
def _save_formatted_package_name_to_deps_collection(self, deps: [str], old_package: str, new_package: str):
if old_package not in deps:
return
initial_package = new_package
if "/" in new_package:
new_package = new_package.split("/")[0]
if "\r" in new_package:
new_package = new_package.replace("\r", "")
if new_package == old_package:
return
index = deps.index(old_package)
deps[index] = new_package
def _project_json_update_dependency(self, old_package: str, new_package: str):
"""
Writes new package version to project.json
:param old_package:
:param new_package:
:return:
"""
if self._is_simulation:
return
self._save_formatted_package_name_to_deps_collection(
self._project_settings.dependencies, old_package, new_package
)
self._save_formatted_package_name_to_deps_collection(
self._project_settings.dev_dependencies, old_package, new_package
)
config = {
ProjectSettings.__name__: SettingsHelper.get_project_settings_dict(self._project_settings),
BuildSettings.__name__: SettingsHelper.get_build_settings_dict(self._build_settings),
}
with open(os.path.join(self._env.working_directory, self._project_file), "w") as project:
project.write(json.dumps(config, indent=2))
project.close()
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
if "simulate" in args:
args.remove("simulate")
Console.write_line("Running in simulation mode:")
self._is_simulation = True
if "cpl-prod" in args:
args.remove("cpl-prod")
self._cli_settings.from_dict({"PipPath": "https://pip.sh-edraft.de"})
if "cpl-exp" in args:
args.remove("cpl-exp")
self._cli_settings.from_dict({"PipPath": "https://pip-exp.sh-edraft.de"})
if "cpl-dev" in args:
args.remove("cpl-dev")
self._cli_settings.from_dict({"PipPath": "https://pip-dev.sh-edraft.de"})
VenvHelper.init_venv(False, self._env, self._project_settings.python_executable)
self._check_project_dependencies()
self._check_outdated()
Pip.reset_executable()

View File

@@ -0,0 +1,49 @@
import pkgutil
import sys
import platform
import pkg_resources
import textwrap
import cpl_cli
from cpl_cli.helper.dependencies import Dependencies
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_cli.command_abc import CommandABC
class VersionService(CommandABC):
def __init__(self):
"""
Service for the CLI command version
"""
CommandABC.__init__(self)
@property
def help_message(self) -> str:
return textwrap.dedent(
"""\
Lists the version of CPL, CPL CLI and all installed packages from pip.
Usage: cpl version
"""
)
def execute(self, args: list[str]):
"""
Entry point of command
:param args:
:return:
"""
Console.set_foreground_color(ForegroundColorEnum.yellow)
Console.banner("CPL CLI")
Console.set_foreground_color(ForegroundColorEnum.default)
if "__version__" in dir(cpl_cli):
Console.write_line(f"Common Python library CLI: ")
Console.write(cpl_cli.__version__)
Console.write_line(f"Python: ")
Console.write(f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")
Console.write_line(f"OS: {platform.system()} {platform.processor()}")
Console.write_line("\nCPL packages:")
Console.table(["Name", "Version"], Dependencies.get_cpl_packages())
Console.write_line("\nPython packages:")
Console.table(["Name", "Version"], Dependencies.get_packages())

View File

@@ -0,0 +1,26 @@
from abc import abstractmethod, ABC
from cpl_core.configuration.argument_executable_abc import ArgumentExecutableABC
from cpl_core.console import Console
class CommandABC(ArgumentExecutableABC):
@abstractmethod
def __init__(self):
ABC.__init__(self)
@property
@abstractmethod
def help_message(self) -> str:
pass
@abstractmethod
def execute(self, args: list[str]):
pass
def run(self, args: list[str]):
if "help" in args:
Console.write_line(self.help_message)
return
self.execute(args)

View File

@@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli.configuration"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
from .build_settings import BuildSettings
from .build_settings_name_enum import BuildSettingsNameEnum
from .project_settings import ProjectSettings
from .project_settings_name_enum import ProjectSettingsNameEnum
from .version_settings import VersionSettings
from .version_settings_name_enum import VersionSettingsNameEnum
from .workspace_settings import WorkspaceSettings
from .workspace_settings_name_enum import WorkspaceSettingsNameEnum
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,95 @@
import sys
import traceback
from typing import Optional
from cpl_cli.configuration.build_settings_name_enum import BuildSettingsNameEnum
from cpl_cli.configuration.project_type_enum import ProjectTypeEnum
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console.console import Console
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
class BuildSettings(ConfigurationModelABC):
def __init__(
self,
project_type: ProjectTypeEnum = None,
source_path: str = None,
output_path: str = None,
main: str = None,
entry_point: str = None,
include_package_data: bool = None,
included: list = None,
excluded: list = None,
package_data: dict = None,
project_references: list = None,
):
ConfigurationModelABC.__init__(self)
self._project_type: Optional[ProjectTypeEnum] = project_type
self._source_path: Optional[str] = source_path
self._output_path: Optional[str] = output_path
self._main: Optional[str] = main
self._entry_point: Optional[str] = entry_point
self._include_package_data: Optional[bool] = include_package_data
self._included: Optional[list[str]] = included
self._excluded: Optional[list[str]] = excluded
self._package_data: Optional[dict[str, list[str]]] = package_data
self._project_references: Optional[list[str]] = [] if project_references is None else project_references
if sys.platform == "win32":
self._source_path = str(self._source_path).replace("/", "\\")
self._output_path = str(self._output_path).replace("/", "\\")
# windows paths for excluded files
excluded = []
for ex in self._excluded:
excluded.append(str(ex).replace("/", "\\"))
self._excluded = excluded
# windows paths for included files
included = []
for inc in self._included:
included.append(str(inc).replace("/", "\\"))
self._included = included
@property
def project_type(self):
return self._project_type
@property
def source_path(self) -> str:
return self._source_path
@property
def output_path(self) -> str:
return self._output_path
@property
def main(self) -> str:
return self._main
@property
def entry_point(self) -> str:
return self._entry_point
@property
def include_package_data(self) -> bool:
return self._include_package_data
@property
def included(self) -> list[str]:
return self._included
@property
def excluded(self) -> list[str]:
return self._excluded
@property
def package_data(self) -> dict[str, list[str]]:
return self._package_data
@property
def project_references(self) -> list[str]:
return self._project_references

View File

@@ -0,0 +1,14 @@
from enum import Enum
class BuildSettingsNameEnum(Enum):
project_type = "ProjectType"
source_path = "SourcePath"
output_path = "OutputPath"
main = "Main"
entry_point = "EntryPoint"
include_package_data = "IncludePackageData"
included = "Included"
excluded = "Excluded"
package_data = "PackageData"
project_references = "ProjectReferences"

View File

@@ -0,0 +1,132 @@
import os
import sys
from typing import Optional
from cpl_cli.configuration.project_settings_name_enum import ProjectSettingsNameEnum
from cpl_cli.configuration.version_settings import VersionSettings
from cpl_cli.error import Error
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
class ProjectSettings(ConfigurationModelABC):
def __init__(
self,
name: str = None,
version: VersionSettings = None,
author: str = None,
author_email: str = None,
description: str = None,
long_description: str = None,
url: str = None,
copyright_date: str = None,
copyright_name: str = None,
license_name: str = None,
license_description: str = None,
dependencies: list = None,
dev_dependencies: list = None,
python_version: str = None,
python_path: dict = None,
python_executable: str = None,
classifiers: list = None,
):
ConfigurationModelABC.__init__(self)
self._name: Optional[str] = name
self._version: Optional[VersionSettings] = version
self._author: Optional[str] = author
self._author_email: Optional[str] = author_email
self._description: Optional[str] = description
self._long_description: Optional[str] = long_description
self._url: Optional[str] = url
self._copyright_date: Optional[str] = copyright_date
self._copyright_name: Optional[str] = copyright_name
self._license_name: Optional[str] = license_name
self._license_description: Optional[str] = license_description
self._dependencies: Optional[list[str]] = [] if dependencies is None else dependencies
self._dev_dependencies: Optional[list[str]] = [] if dev_dependencies is None else dev_dependencies
self._python_version: Optional[str] = python_version
self._python_path: Optional[str] = python_path
self._python_executable: Optional[str] = python_executable
self._classifiers: Optional[list[str]] = [] if classifiers is None else classifiers
if python_path is not None and sys.platform in python_path:
path = f"{python_path[sys.platform]}"
if path == "" or path is None:
Error.warn(f"{ProjectSettingsNameEnum.python_path.value} not set")
path = sys.executable
else:
if not path.endswith("bin/python"):
path = os.path.join(path, "bin/python")
else:
path = sys.executable
self._python_executable = path
@property
def name(self):
return self._name
@property
def version(self) -> VersionSettings:
return self._version
@property
def author(self) -> str:
return self._author
@property
def author_email(self) -> str:
return self._author_email
@property
def description(self) -> str:
return self._description
@property
def long_description(self) -> str:
return self._long_description
@property
def url(self) -> str:
return self._url
@property
def copyright_date(self) -> str:
return self._copyright_date
@property
def copyright_name(self) -> str:
return self._copyright_name
@property
def license_name(self) -> str:
return self._license_name
@property
def license_description(self) -> str:
return self._license_description
@property
def dependencies(self) -> list[str]:
return self._dependencies
@property
def dev_dependencies(self) -> list[str]:
return self._dev_dependencies
@property
def python_version(self) -> str:
return self._python_version
@property
def python_path(self) -> str:
return self._python_path
@property
def python_executable(self) -> str:
return self._python_executable
@property
def classifiers(self) -> list[str]:
return self._classifiers

View File

@@ -0,0 +1,20 @@
from enum import Enum
class ProjectSettingsNameEnum(Enum):
name = "Name"
version = "Version"
author = "Author"
author_email = "AuthorEmail"
description = "Description"
long_description = "LongDescription"
url = "URL"
copyright_date = "CopyrightDate"
copyright_name = "CopyrightName"
license_name = "LicenseName"
license_description = "LicenseDescription"
dependencies = "Dependencies"
dev_dependencies = "DevDependencies"
python_version = "PythonVersion"
python_path = "PythonPath"
classifiers = "Classifiers"

View File

@@ -0,0 +1,8 @@
from enum import Enum
class ProjectTypeEnum(Enum):
console = "console"
library = "library"
unittest = "unittest"
discord_bot = "discord-bot"

View File

@@ -0,0 +1,13 @@
from cpl_core.utils import String
class SchematicCollection:
_schematics: dict = {}
@classmethod
def register(cls, template: type, schematic: str, aliases: list[str]):
cls._schematics[schematic] = {"Template": template, "Aliases": aliases}
@classmethod
def get_schematics(cls) -> dict:
return cls._schematics

View File

@@ -0,0 +1,47 @@
from cpl_cli.configuration.version_settings_name_enum import VersionSettingsNameEnum
from cpl_cli.configuration.build_settings import BuildSettings
from cpl_cli.configuration.build_settings_name_enum import BuildSettingsNameEnum
from cpl_cli.configuration.project_settings import ProjectSettings
from cpl_cli.configuration.project_settings_name_enum import ProjectSettingsNameEnum
class SettingsHelper:
@staticmethod
def get_project_settings_dict(project: ProjectSettings) -> dict:
return {
ProjectSettingsNameEnum.name.value: project.name,
ProjectSettingsNameEnum.version.value: {
VersionSettingsNameEnum.major.value: project.version.major,
VersionSettingsNameEnum.minor.value: project.version.minor,
VersionSettingsNameEnum.micro.value: project.version.micro,
},
ProjectSettingsNameEnum.author.value: project.author,
ProjectSettingsNameEnum.author_email.value: project.author_email,
ProjectSettingsNameEnum.description.value: project.description,
ProjectSettingsNameEnum.long_description.value: project.long_description,
ProjectSettingsNameEnum.url.value: project.url,
ProjectSettingsNameEnum.copyright_date.value: project.copyright_date,
ProjectSettingsNameEnum.copyright_name.value: project.copyright_name,
ProjectSettingsNameEnum.license_name.value: project.license_name,
ProjectSettingsNameEnum.license_description.value: project.license_description,
ProjectSettingsNameEnum.dependencies.value: project.dependencies,
ProjectSettingsNameEnum.dev_dependencies.value: project.dev_dependencies,
ProjectSettingsNameEnum.python_version.value: project.python_version,
ProjectSettingsNameEnum.python_path.value: project.python_path,
ProjectSettingsNameEnum.classifiers.value: project.classifiers,
}
@staticmethod
def get_build_settings_dict(build: BuildSettings) -> dict:
return {
BuildSettingsNameEnum.project_type.value: build.project_type.value,
BuildSettingsNameEnum.source_path.value: build.source_path,
BuildSettingsNameEnum.output_path.value: build.output_path,
BuildSettingsNameEnum.main.value: build.main,
BuildSettingsNameEnum.entry_point.value: build.entry_point,
BuildSettingsNameEnum.include_package_data.value: build.include_package_data,
BuildSettingsNameEnum.included.value: build.included,
BuildSettingsNameEnum.excluded.value: build.excluded,
BuildSettingsNameEnum.package_data.value: build.package_data,
BuildSettingsNameEnum.project_references.value: build.project_references,
}

View File

@@ -0,0 +1,42 @@
import os
import subprocess
import sys
from cpl_cli.configuration import ProjectSettings
from cpl_core.environment import ApplicationEnvironmentABC
from cpl_core.utils import Pip
from cpl_core.console import Console, ForegroundColorEnum
class VenvHelper:
@staticmethod
def init_venv(is_virtual: bool, env: ApplicationEnvironmentABC, python_executable: str, explicit_path=None):
if is_virtual:
return
venv_path = os.path.abspath(os.path.join(env.working_directory, python_executable, "../../"))
if explicit_path is not None:
venv_path = os.path.abspath(explicit_path)
if not os.path.exists(venv_path):
Console.spinner(
f"Creating venv: {venv_path}",
VenvHelper.create_venv,
venv_path,
text_foreground_color=ForegroundColorEnum.green,
spinner_foreground_color=ForegroundColorEnum.cyan,
)
Pip.set_executable(python_executable)
@staticmethod
def create_venv(path):
subprocess.run(
[sys.executable, "-m", "venv", os.path.abspath(os.path.join(path, "../../"))],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
stdin=subprocess.DEVNULL,
)

View File

@@ -0,0 +1,42 @@
from typing import Optional
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_cli.configuration.version_settings_name_enum import VersionSettingsNameEnum
class VersionSettings(ConfigurationModelABC):
def __init__(self, major: str = None, minor: str = None, micro: str = None):
ConfigurationModelABC.__init__(self)
self._major: Optional[str] = major
self._minor: Optional[str] = minor
self._micro: Optional[str] = micro if micro != "" else None
@property
def major(self) -> str:
return self._major
@property
def minor(self) -> str:
return self._minor
@property
def micro(self) -> str:
return self._micro
def to_str(self) -> str:
if self._micro is None:
return f"{self._major}.{self._minor}"
else:
return f"{self._major}.{self._minor}.{self._micro}"
def to_dict(self) -> dict:
version = {
VersionSettingsNameEnum.major.value: self._major,
VersionSettingsNameEnum.minor.value: self._minor,
}
if self._micro is not None:
version[VersionSettingsNameEnum.micro.value] = self._micro
return version

View File

@@ -0,0 +1,7 @@
from enum import Enum
class VersionSettingsNameEnum(Enum):
major = "Major"
minor = "Minor"
micro = "Micro"

View File

@@ -0,0 +1,32 @@
import traceback
from typing import Optional
from cpl_cli.configuration.workspace_settings_name_enum import WorkspaceSettingsNameEnum
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class WorkspaceSettings(ConfigurationModelABC):
def __init__(
self,
default_project: str = None,
projects: dict = None,
scripts: dict = None,
):
ConfigurationModelABC.__init__(self)
self._default_project: Optional[str] = default_project
self._projects: dict[str, str] = {} if projects is None else projects
self._scripts: dict[str, str] = {} if scripts is None else scripts
@property
def default_project(self) -> str:
return self._default_project
@property
def projects(self) -> dict[str, str]:
return self._projects
@property
def scripts(self):
return self._scripts

View File

@@ -0,0 +1,7 @@
from enum import Enum
class WorkspaceSettingsNameEnum(Enum):
default_project = "DefaultProject"
projects = "Projects"
scripts = "Scripts"

51
src/cpl_cli/cpl-cli.json Normal file
View File

@@ -0,0 +1,51 @@
{
"ProjectSettings": {
"Name": "cpl-cli",
"Version": {
"Major": "2024",
"Minor": "7",
"Micro": "0"
},
"Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de",
"Description": "CPL CLI",
"LongDescription": "CPL Command Line Interface",
"URL": "https://www.sh-edraft.de",
"CopyrightDate": "2020 - 2024",
"CopyrightName": "sh-edraft.de",
"LicenseName": "MIT",
"LicenseDescription": "MIT, see LICENSE for more details.",
"Dependencies": [
"cpl-core>=2024.6.2024.07.0"
],
"DevDependencies": [],
"PythonVersion": ">=3.12",
"PythonPath": {
"linux": "../../venv"
},
"Classifiers": []
},
"BuildSettings": {
"ProjectType": "console",
"SourcePath": "",
"OutputPath": "../../dist",
"Main": "cpl_cli.main",
"EntryPoint": "cpl",
"IncludePackageData": true,
"Included": [
"*/_templates"
],
"Excluded": [
"*/__pycache__",
"*/logs",
"*/tests"
],
"PackageData": {
"cpl_cli": [
"*.json",
".cpl/*.py"
]
},
"ProjectReferences": []
}
}

15
src/cpl_cli/error.py Normal file
View File

@@ -0,0 +1,15 @@
from cpl_core.console.foreground_color_enum import ForegroundColorEnum
from cpl_core.console.console import Console
class Error:
@staticmethod
def error(message: str):
Console.error(message)
Console.error("Run 'cpl help'\n")
@staticmethod
def warn(message: str):
Console.set_foreground_color(ForegroundColorEnum.yellow)
Console.write_line(message, "\n")
Console.set_foreground_color(ForegroundColorEnum.default)

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
"""
cpl-cli CPL CLI
~~~~~~~~~~~~~~~~~~~
CPL Command Line Interface
:copyright: (c) 2020 - 2024 sh-edraft.de
:license: MIT, see LICENSE for more details.
"""
__title__ = "cpl_cli.helper"
__author__ = "Sven Heidemann"
__license__ = "MIT"
__copyright__ = "Copyright (c) 2020 - 2024 sh-edraft.de"
__version__ = "2024.10.0"
from collections import namedtuple
# imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="2024", minor="10", micro="0")

View File

@@ -0,0 +1,22 @@
import pkg_resources
class Dependencies:
_packages = []
_cpl_packages = []
_dependencies = dict(tuple(str(ws).split()) for ws in pkg_resources.working_set)
for p in _dependencies:
if str(p).startswith("cpl-"):
_cpl_packages.append([p, _dependencies[p]])
continue
_packages.append([p, _dependencies[p]])
@classmethod
def get_cpl_packages(cls) -> list[list]:
return cls._cpl_packages
@classmethod
def get_packages(cls) -> list[list]:
return cls._packages

Some files were not shown because too many files have changed in this diff Show More