ApiLogicServer 14.3.0__py3-none-any.whl → 14.3.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. {ApiLogicServer-14.3.0.dist-info → ApiLogicServer-14.3.7.dist-info}/METADATA +2 -2
  2. {ApiLogicServer-14.3.0.dist-info → ApiLogicServer-14.3.7.dist-info}/RECORD +46 -43
  3. api_logic_server_cli/api_logic_server.py +2 -1
  4. api_logic_server_cli/api_logic_server_info.yaml +3 -3
  5. api_logic_server_cli/cli.py +5 -2
  6. api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc +0 -0
  7. api_logic_server_cli/create_from_model/ont_build.py +1 -1
  8. api_logic_server_cli/genai/genai.py +4 -0
  9. api_logic_server_cli/genai/genai_svcs.py +2 -0
  10. api_logic_server_cli/manager.py +20 -16
  11. api_logic_server_cli/prototypes/base/api/system/expression_parser.py +10 -4
  12. api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py +32 -8
  13. api_logic_server_cli/prototypes/base/integration/system/RowDictMapper.py +33 -16
  14. api_logic_server_cli/prototypes/base/logic/declare_logic.py +1 -0
  15. api_logic_server_cli/prototypes/base/logic/load_verify_rules.py +2 -1
  16. api_logic_server_cli/prototypes/genai_demo/api/customize_api.py +9 -11
  17. api_logic_server_cli/prototypes/genai_demo/database/.DS_Store +0 -0
  18. api_logic_server_cli/prototypes/genai_demo/database/db.sqlite +0 -0
  19. api_logic_server_cli/prototypes/genai_demo/database/models.py +52 -42
  20. api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/OrderB2B.py +4 -6
  21. api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/__pycache__/OrderB2B.cpython-312.pyc +0 -0
  22. api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/row_dict_maps_readme.md +3 -0
  23. api_logic_server_cli/prototypes/genai_demo/logic/__pycache__/declare_logic.cpython-312.pyc +0 -0
  24. api_logic_server_cli/prototypes/genai_demo/logic/__pycache__/load_verify_rules.cpython-312.pyc +0 -0
  25. api_logic_server_cli/prototypes/genai_demo/logic/declare_logic.py +57 -69
  26. api_logic_server_cli/prototypes/genai_demo/logic/load_verify_rules.py +216 -0
  27. api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/__pycache__/__init__.cpython-312.pyc +0 -0
  28. api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/__pycache__/auto_discovery.cpython-312.pyc +0 -0
  29. api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/__pycache__/error_testing.cpython-312.pyc +0 -0
  30. api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/auto_discovery.py +52 -0
  31. api_logic_server_cli/prototypes/genai_demo/logic/readme_declare_logic.md +172 -0
  32. api_logic_server_cli/prototypes/genai_demo/security/__pycache__/declare_security.cpython-312.pyc +0 -0
  33. api_logic_server_cli/prototypes/genai_demo/ui/admin/admin.yaml +86 -53
  34. api_logic_server_cli/prototypes/manager/.vscode/launch.json +1 -1
  35. api_logic_server_cli/prototypes/manager/README.md +1 -1
  36. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt +4 -1
  37. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.response_example +15 -8
  38. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt +3 -0
  39. api_logic_server_cli/prototypes/manager/system/genai/examples/time_tracking_billing/readme.md +58 -5
  40. api_logic_server_cli/prototypes/manager/system/genai/learning_requests/logic_bank_api.prompt +15 -1
  41. api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__pycache__/codegen.cpython-312.pyc +0 -0
  42. api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py +2 -1
  43. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/__pycache__/copilot_models.cpython-312.pyc +0 -0
  44. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/__pycache__/sample_ai_models.cpython-312.pyc +0 -0
  45. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai.chatgpt +0 -16
  46. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai.sql +0 -66
  47. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai.sqlite +0 -0
  48. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai_items.sqlite +0 -0
  49. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai_models.py +0 -156
  50. api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai_models.sqlite +0 -0
  51. api_logic_server_cli/prototypes/genai_demo/logic/cocktail-napkin.jpg +0 -0
  52. {ApiLogicServer-14.3.0.dist-info → ApiLogicServer-14.3.7.dist-info}/LICENSE +0 -0
  53. {ApiLogicServer-14.3.0.dist-info → ApiLogicServer-14.3.7.dist-info}/WHEEL +0 -0
  54. {ApiLogicServer-14.3.0.dist-info → ApiLogicServer-14.3.7.dist-info}/entry_points.txt +0 -0
  55. {ApiLogicServer-14.3.0.dist-info → ApiLogicServer-14.3.7.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ApiLogicServer
3
- Version: 14.3.0
3
+ Version: 14.3.7
4
4
  Author-email: Val Huber <apilogicserver@gmail.com>
5
5
  License: BSD-3-Clause
6
6
  Project-URL: Homepage, https://apilogicserver.github.io/Docs/
@@ -47,7 +47,7 @@ Requires-Dist: Flask-Login==0.6.2
47
47
  Requires-Dist: Flask-OpenID==1.3.0
48
48
  Requires-Dist: python-dotenv==0.15.0
49
49
  Requires-Dist: email-validator==1.1.1
50
- Requires-Dist: LogicBank>=1.20.24
50
+ Requires-Dist: LogicBank>=1.20.25
51
51
  Requires-Dist: cryptography==36.0.1
52
52
  Requires-Dist: rsa
53
53
  Requires-Dist: PyMySQL==1.0.3
@@ -1,12 +1,12 @@
1
1
  api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- api_logic_server_cli/api_logic_server.py,sha256=WcjLog6JXU2s6LPz2YtnVwyPE9K1W5P9oskdOv7e1TU,113662
3
- api_logic_server_cli/api_logic_server_info.yaml,sha256=DOgXUzPsEzhd4OiHrYBS4rhnoW2QCMuHoR3IuiMm4Ak,129
4
- api_logic_server_cli/cli.py,sha256=-BcfW4QE0MnTi_ZRFZEcYy7l0A6TXjGgOnexpYfEmL4,80583
2
+ api_logic_server_cli/api_logic_server.py,sha256=AL3BHfSSZ40jzh7EcNUWynpYo0ixmtS-lJVHzVif4fs,113711
3
+ api_logic_server_cli/api_logic_server_info.yaml,sha256=JXXiH8MEgR5BYHT5fDepm1rtq6Mz7Ig5xuW2pUvzkXE,116
4
+ api_logic_server_cli/cli.py,sha256=IIz3frEJiZSi1q0HtRxLl7i-R4ABhPDqlBa7LTI6vcw,80765
5
5
  api_logic_server_cli/cli_args_base.py,sha256=lr27KkOB7_WpZwTs7LgiK8LKDIHMKQkoZCTnE99BFxw,3280
6
6
  api_logic_server_cli/cli_args_project.py,sha256=I5no_fGRV_ZsK3SuttVDAaQYI4Q5zCjx6LojGkM024w,4645
7
7
  api_logic_server_cli/extended_builder.py,sha256=EhtXGAt_RrDR2tCtgvc2U82we7fr-F6pP-e6HS6dQWQ,13867
8
8
  api_logic_server_cli/logging.yml,sha256=isWhKviFwJwYgjIUejfhUxcMli2zEbZeQbEvVhNk_4Y,1812
9
- api_logic_server_cli/manager.py,sha256=ZJ4lz_i8XUDfLks4aorYQRw7AWt70Eg75TZuLkYBbh4,9645
9
+ api_logic_server_cli/manager.py,sha256=j-nA8YYTkikp20xfJOcF7nmIe2rqJudW-bm1kN4xf4E,9966
10
10
  api_logic_server_cli/create_from_model/.DS_Store,sha256=1LosUM11cnBvrMg9HziX_s4ehi93Q0Hl93FjOayxN2g,6148
11
11
  api_logic_server_cli/create_from_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  api_logic_server_cli/create_from_model/api_expose_api_models_creator.py,sha256=V-u3Hm404doztw66YuD2A043RCFmtw5QF5tMioC_1b0,7900
@@ -15,7 +15,7 @@ api_logic_server_cli/create_from_model/create_db_from_model.py,sha256=CvXVH-DEl8
15
15
  api_logic_server_cli/create_from_model/dbml.py,sha256=IV9eG1bib10zTPFYyJNeFPveE0gNrt-NoPZCQHF74BM,8695
16
16
  api_logic_server_cli/create_from_model/meta_model.py,sha256=ERf7tSgnSJSeRMVyggkdg-lvORQZSbfK0KMpL63qSEY,5837
17
17
  api_logic_server_cli/create_from_model/model_creation_services.py,sha256=B86ljgUR98H_dCaxqiw-flrbvc05-XXtkC5It2BSezs,41479
18
- api_logic_server_cli/create_from_model/ont_build.py,sha256=GElC77oyvnmIHfOjj3e24-FYoaqkyyawkPLC4HP-nss,60069
18
+ api_logic_server_cli/create_from_model/ont_build.py,sha256=OeKY_CyaiKklDt8ZStCxfBmpe2FVZq-JOV6YnpGqM-s,60131
19
19
  api_logic_server_cli/create_from_model/ont_create.py,sha256=98J17zc-T9Bml5G_kr3zkUfgopmggae0g3wXep_DpJw,13794
20
20
  api_logic_server_cli/create_from_model/ui_admin_creator.py,sha256=j1hZuHn70c4NA7l0zXH_PbcwH79FQPgkZh1qF_6sLyU,38071
21
21
  api_logic_server_cli/create_from_model/uri_info.py,sha256=WiDw7hRcidz9hasodQ6O2ZJnUMfhHeydueQ8HXzPXlc,2395
@@ -26,7 +26,7 @@ api_logic_server_cli/create_from_model/__pycache__/create_db_from_model.cpython-
26
26
  api_logic_server_cli/create_from_model/__pycache__/dbml.cpython-312.pyc,sha256=E4oR4UFDjW7Z7SCfo-USc7vUVfwQFma1O_qldAT7L7c,8952
27
27
  api_logic_server_cli/create_from_model/__pycache__/meta_model.cpython-312.pyc,sha256=Ylu_fwSC4BHfTr4xzXCfyY6ChXu9seDx_LphGw_Tl6Y,7133
28
28
  api_logic_server_cli/create_from_model/__pycache__/model_creation_services.cpython-312.pyc,sha256=ZItAlFMbjQopl5EJ5zVKvSMweEczeky1o2uKewW-aus,36599
29
- api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc,sha256=LW1dOvaxHkHnD6IskSNcx_eppz-NKb43E006Qa2EM74,68390
29
+ api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc,sha256=TDNj_xZu8dpfTeYTPxUi-J4zyNPNifUz-YfWLmOjm_E,68547
30
30
  api_logic_server_cli/create_from_model/__pycache__/ont_create.cpython-312.pyc,sha256=M9PIKa6_15c-il2FKP-fqeCGse_tbof3mvg_ZVlPy4I,14478
31
31
  api_logic_server_cli/create_from_model/__pycache__/ui_admin_creator.cpython-312.pyc,sha256=dW3OP8i2imShiMvCVxfTu5w5t4renKVrIuATDSvDs9k,38555
32
32
  api_logic_server_cli/create_from_model/__pycache__/uri_info.cpython-312.pyc,sha256=_xZHwvPJzehSzH-ueuTKwNqNLTJfUMDwYl5ddYNTxRM,2728
@@ -471,9 +471,9 @@ api_logic_server_cli/fragments/nw_virtual_attrs.py,sha256=7hgvhnO1UcJ6OoPKCxR5bn
471
471
  api_logic_server_cli/fragments/ui_basic_web_app_runZZ.py,sha256=UllBIkKHlUE3nyDE1qtFWCA-NTE1ltYxPvVUd7lZI5U,870
472
472
  api_logic_server_cli/genai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
473
473
  api_logic_server_cli/genai/client.py,sha256=36gyz-dqxj4dJj1SGtO9NZsy9-cfnf4d7uahHimwqHk,772
474
- api_logic_server_cli/genai/genai.py,sha256=cab26UE_I4SBk92HuaNY3y_XO8aawS4yaP-PgcTKPrA,58853
474
+ api_logic_server_cli/genai/genai.py,sha256=keMPTu4n8UbHQyz7jCvB3XynZCl6XlLBryJ9UAMFcLk,59095
475
475
  api_logic_server_cli/genai/genai_logic_builder.py,sha256=VkgOG0s17sdt-ElQmfTRuMCUnQLtxtyaH8Qfr0x1TrE,23552
476
- api_logic_server_cli/genai/genai_svcs.py,sha256=dEWdHg9TVq6v5Tv2odK_b5Om9CmQKYw35rjXXrpo-ps,45908
476
+ api_logic_server_cli/genai/genai_svcs.py,sha256=1J1LyzLpcjEBLYPsdqYzqR_6HvS5A69olD4v9B9fbYE,45989
477
477
  api_logic_server_cli/genai/genai_utils.py,sha256=DKhIb0P-7Ps1a1jIXyDOlTT8DwXn4-c7LRrV83GgnC8,17128
478
478
  api_logic_server_cli/genai/json2rules.py,sha256=ykoxxgZgqllzt8Ud06S-R_3QtumxXfmF5ksYC0Hh2Sk,2645
479
479
  api_logic_server_cli/model_migrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -537,7 +537,7 @@ api_logic_server_cli/prototypes/base/api/api_discovery/ontimize_api.py,sha256=_g
537
537
  api_logic_server_cli/prototypes/base/api/api_discovery/system.py,sha256=Cv4qtnEG5s6vtk2alHmPAvwKlbtlHsd3Ugse_YKIk7Q,3345
538
538
  api_logic_server_cli/prototypes/base/api/system/api_utils.py,sha256=cCwujmQRE3gb6756GAVlypx7r30eH_-aZzo-hi3BNTU,5812
539
539
  api_logic_server_cli/prototypes/base/api/system/custom_endpoint.py,sha256=191JrBIhRM1-gjCdJhfy0VFTZtMHoGXIIXcwEGAPbeI,49786
540
- api_logic_server_cli/prototypes/base/api/system/expression_parser.py,sha256=eQrwKSf5KT-jBxogEdS9uTVW2dign8Dz07cAQbg4N_c,27796
540
+ api_logic_server_cli/prototypes/base/api/system/expression_parser.py,sha256=4kPnwihBTP-APE5xQ8_5M9lK8cd_z6z783GFY47-8eM,28008
541
541
  api_logic_server_cli/prototypes/base/api/system/gen_csv_report.py,sha256=GDAFJV3v1phmjLDE-vfvp8jgZnu2R6sTdQ6UWgdk64c,1410
542
542
  api_logic_server_cli/prototypes/base/api/system/gen_pdf_report.py,sha256=gOe5mSYbh17q94UDh_YQI4qUr7jjck7UfnTNe7CEXhA,8783
543
543
  api_logic_server_cli/prototypes/base/api/system/opt_locking/opt_locking.py,sha256=ib-hb-ZLZ7P7XbyQ08teUKM_p-5WMAmo0Cyjao2GA9o,6432
@@ -620,16 +620,16 @@ api_logic_server_cli/prototypes/base/devops/python-anywhere/python_anywhere_wsgi
620
620
  api_logic_server_cli/prototypes/base/docs/logic/readme.md,sha256=s0s5FIF0TVPfinEPdNNSUy9f2HJwGQQdJ1h3xrJm3lA,590
621
621
  api_logic_server_cli/prototypes/base/docs/logic_suggestions/readme_logic_suggestions.md,sha256=44ibQYGOy84J4zGFaChLCOf-GU9pOBrbgBbprujMtIs,184
622
622
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_consumer.py,sha256=2DOsFpYnsJ71gZzzfJweEmL-i99uCtEFU0hVwIKFGMw,1516
623
- api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py,sha256=ewAnGVASXBc6j3z28AJzw0vUhZGtwf3AhHF_vp35Lgo,3336
623
+ api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py,sha256=F1aft-9N3IdoASQWexAGWz9c1eKnPsE4u5SP2rRSfQc,4182
624
624
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_readme.md,sha256=MlwykHWM2w41KzWh4vPuTnIodR8f-BQzrWpV4P1hrsI,161
625
625
  api_logic_server_cli/prototypes/base/integration/n8n/N8N_WebHook_from_ApiLogicServer.json,sha256=s9JuoF9gLiuNZAD0dTVdnwQpORQHe0TseyPNVDe048w,10606
626
626
  api_logic_server_cli/prototypes/base/integration/n8n/n8n_producer.py,sha256=loaF5AalPS2-7OJqSDi5Dnn_GyJG6dqiHxPzmLSB8j0,4869
627
627
  api_logic_server_cli/prototypes/base/integration/n8n/n8n_readme.md,sha256=1ncnSAVI6_E3kIh8lU7xphi1xxUZI65MknK517N87wQ,2381
628
628
  api_logic_server_cli/prototypes/base/integration/row_dict_maps/row_dict_maps_readme.md,sha256=5tOPwErjkcCQONrNcaGsttEwybxCIq-5j45dkOcDh1Q,206
629
629
  api_logic_server_cli/prototypes/base/integration/system/FlaskKafka.py,sha256=_UsIUrQ022B7IzEPGRw6GgkUeWtvKHPBe2OSpFF8pEw,3203
630
- api_logic_server_cli/prototypes/base/integration/system/RowDictMapper.py,sha256=sTAUnF5N6YfWJ5gXLHqwD6ckDcQxN3Q2U_8VCwQBT4Q,18800
631
- api_logic_server_cli/prototypes/base/logic/declare_logic.py,sha256=ZmGCVv7lsAlT6d7nIy3y59cfscdWgeO0JsciOdGhSqM,3232
632
- api_logic_server_cli/prototypes/base/logic/load_verify_rules.py,sha256=TWqzJ_KWX_QvpxWQv4ujqc487W1P9ZglrciSLor_NHA,7681
630
+ api_logic_server_cli/prototypes/base/integration/system/RowDictMapper.py,sha256=DSdmeAQZZ_wUWHHiSS_6ZgeTKIuEycNlgX140l3fnSE,19986
631
+ api_logic_server_cli/prototypes/base/logic/declare_logic.py,sha256=vglpAfVRM3QONLDbWIXcZrXTSttO8vUpwLbSJ51Fmw0,3290
632
+ api_logic_server_cli/prototypes/base/logic/load_verify_rules.py,sha256=dYEb-UxqQ5N08ry22I04vtFy8JtQe2pL7Jw8gR8nGu4,7742
633
633
  api_logic_server_cli/prototypes/base/logic/readme_declare_logic.md,sha256=CFC13f9Z4rTkNiRoJTBEz3A2F_yRThOj-HrHDsSdKsw,6630
634
634
  api_logic_server_cli/prototypes/base/logic/logic_discovery/auto_discovery.py,sha256=m97W6DYi6ouTDuFCiU1rPq1UqzJuNnVePyOeLU33D1s,2645
635
635
  api_logic_server_cli/prototypes/base/logic/logic_discovery/__pycache__/__init__.cpython-312.pyc,sha256=5--1medTaKN83y-D_iv9EPiLD2uja_Q0r5ZkxX_pJM4,199
@@ -726,30 +726,33 @@ api_logic_server_cli/prototypes/fiddle/1. Learn APIs using Flask SqlAlchemy/data
726
726
  api_logic_server_cli/prototypes/fiddle/1. Learn APIs using Flask SqlAlchemy/database/logging.yml,sha256=GIRd1gxe-Em7GpKRg8wTYg-Aq71QuEeA1rD9RV7iB18,1400
727
727
  api_logic_server_cli/prototypes/fiddle/1. Learn APIs using Flask SqlAlchemy/database/models.py,sha256=eeVAXGs_PN8bmYzIao0-kbZv5Mbham49zWUmHloAMWc,11945
728
728
  api_logic_server_cli/prototypes/fiddle/1. Learn APIs using Flask SqlAlchemy/test/server_test.py,sha256=XWmMCqixRy7aP47rpNEOjv_4NxSi7z-8yYjtqkShLE8,786
729
- api_logic_server_cli/prototypes/genai_demo/api/customize_api.py,sha256=Pbqwj0FcLIOHEaiBPOpTBFGVOniAnaabB9-x0OvT4sI,7402
730
- api_logic_server_cli/prototypes/genai_demo/database/db.sqlite,sha256=Fb5yOHnS_u5QNS6wAohXup26M6at_QVknX04plwuPQM,24576
731
- api_logic_server_cli/prototypes/genai_demo/database/models.py,sha256=grVKrT2s8SYmvglJIUcSQcWsfvtXdkwWA3Eb2sGFP2U,4045
732
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai.chatgpt,sha256=QfhYG2ykF7ntd-jw3jkuwbpHjQ7e5qmvc4U184a6vNQ,571
733
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai.sql,sha256=AZaHE8J8jWRgPxypfCeVbynbmhf5hw2ojUz0PFL2UCQ,2177
734
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai.sqlite,sha256=XbMAvWKnaG5bsicsA05-0wgd0PowZs7x3t15Qh7_wP0,24576
735
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai_items.sqlite,sha256=HGz9KW-r8yVz3c52Gsffxsm9DfNK1bWKMxfN2xFgZ20,24576
736
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai_models.py,sha256=EBu8nJt9bg-QJN1GG0eP4evsJeU7hvoOU8Aby17q1no,5567
737
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/sample_ai_models.sqlite,sha256=xVXgtMoEsivbm0BrrMgsSh5t6V-3EKDRvHp0SobgmSk,20480
738
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/__pycache__/copilot_models.cpython-312.pyc,sha256=kLUaHzeceWOfGTBdTCKN1gaEcyyUkYi2DTLstnL7HGk,1266
739
- api_logic_server_cli/prototypes/genai_demo/database/chatgpt/__pycache__/sample_ai_models.cpython-312.pyc,sha256=Ss6fsPgoYUnKlUXm0QF3K2vOJGt3GAItskz8-dPRZYs,5899
740
- api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/OrderB2B.py,sha256=TXhhw54Iyp2mf629rDT8elawOc2q-VNfUaumYBaRAto,1236
729
+ api_logic_server_cli/prototypes/genai_demo/api/customize_api.py,sha256=u7XRsUaXF1C8yBtUlJU_WtvsbdwEUv9u8hRe63i5YoQ,7342
730
+ api_logic_server_cli/prototypes/genai_demo/database/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
731
+ api_logic_server_cli/prototypes/genai_demo/database/db.sqlite,sha256=zwG7ZsymnCAftk4qSeGv8N5ttJJaIoBdKq4oGsiaIoY,28672
732
+ api_logic_server_cli/prototypes/genai_demo/database/models.py,sha256=5XfE4-nn-FGvNHfIDZ3BbYiQiQScgiJ5wwPnY7Nrn5g,4303
733
+ api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/OrderB2B.py,sha256=dJrATC4f4TOnUqF-U0swIZ3Y_TV5STk18pkeRSpBf1k,1180
741
734
  api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/OrderShipping.py,sha256=4wM45eRNkDNl7vcX689VSR7BgdKvae5hD26L8XZYGfc,1197
742
- api_logic_server_cli/prototypes/genai_demo/logic/cocktail-napkin.jpg,sha256=5rNSy6wvcWSHPJQZqkf2DHs19QLWiyqMBNwxGqjstZU,133075
743
- api_logic_server_cli/prototypes/genai_demo/logic/declare_logic.py,sha256=e6_-wWp-kvTXO83qe516emgAg4mRXWzDfGZhmVmHiPc,5422
735
+ api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/row_dict_maps_readme.md,sha256=5tOPwErjkcCQONrNcaGsttEwybxCIq-5j45dkOcDh1Q,206
736
+ api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/__pycache__/OrderB2B.cpython-312.pyc,sha256=GAhE6t6Hd1OshSdpG7T10GapxWgU4lM95n7zd2jwN6Q,1955
737
+ api_logic_server_cli/prototypes/genai_demo/logic/declare_logic.py,sha256=_YUZsl6B6WHV4f9R-obOKniDtdYNCxfd5vJpLLdRXgw,4930
738
+ api_logic_server_cli/prototypes/genai_demo/logic/load_verify_rules.py,sha256=TWqzJ_KWX_QvpxWQv4ujqc487W1P9ZglrciSLor_NHA,7681
739
+ api_logic_server_cli/prototypes/genai_demo/logic/readme_declare_logic.md,sha256=CFC13f9Z4rTkNiRoJTBEz3A2F_yRThOj-HrHDsSdKsw,6630
740
+ api_logic_server_cli/prototypes/genai_demo/logic/__pycache__/declare_logic.cpython-312.pyc,sha256=heB0NPW04Ede5hY4x-lF8_Hj2TtfYSQrBSEaDOUEiuw,6990
741
+ api_logic_server_cli/prototypes/genai_demo/logic/__pycache__/load_verify_rules.cpython-312.pyc,sha256=fgiC8DnQdbIBl40QfKjDXUHtBgQcoGpUASgF7Da5rZQ,11198
742
+ api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/auto_discovery.py,sha256=m97W6DYi6ouTDuFCiU1rPq1UqzJuNnVePyOeLU33D1s,2645
743
+ api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/__pycache__/__init__.cpython-312.pyc,sha256=5--1medTaKN83y-D_iv9EPiLD2uja_Q0r5ZkxX_pJM4,199
744
+ api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/__pycache__/auto_discovery.cpython-312.pyc,sha256=khoFnahoi-hIONmyzvMoui7d6QAT1WcBtRHr1no6f_U,3252
745
+ api_logic_server_cli/prototypes/genai_demo/logic/logic_discovery/__pycache__/error_testing.cpython-312.pyc,sha256=NQKJ0pHsE53Nwmob8c03X_vkSV-MP_mj-1VFmJ3kRs0,2225
744
746
  api_logic_server_cli/prototypes/genai_demo/security/declare_security.py,sha256=L3AL1bgdqIWQxdkJZcFVDOQ0XRpmeLAKqwlAYChFWKo,2108
745
- api_logic_server_cli/prototypes/genai_demo/ui/admin/admin.yaml,sha256=9rSLJXDr5n3ILHQAU2XDjdGzql9ZyHXmwCYAmaGcH-g,2288
747
+ api_logic_server_cli/prototypes/genai_demo/security/__pycache__/declare_security.cpython-312.pyc,sha256=6D4oMs3K6SAUIOdTg2nTodmAg0HyFA1SyoJTeJYgAUs,2264
748
+ api_logic_server_cli/prototypes/genai_demo/ui/admin/admin.yaml,sha256=jTNWI3n3TLrjtpG8fTd7AawKr3x1Jhrft-ow6bvmCGM,3449
746
749
  api_logic_server_cli/prototypes/manager/.DS_Store,sha256=v0WHl9kV19fTkhSl1TOZkl0d_KnhnIhXNpgTNdFVSpY,6148
747
750
  api_logic_server_cli/prototypes/manager/.gitignore,sha256=xfAjNQHokbo6GuN1ghx-eml8tQIzwUczLC_YVzElndI,195
748
- api_logic_server_cli/prototypes/manager/README.md,sha256=q4BWHDfdbIg0fwKzRJytdbLWdpmEBqVO3VfVnOb-LRg,20669
751
+ api_logic_server_cli/prototypes/manager/README.md,sha256=d5IIHjZ5etTOykAwVofcfehBguSryBKUycp_FQE1gag,20638
749
752
  api_logic_server_cli/prototypes/manager/settings.txt,sha256=_jjL30jomIMxG21edDfrXYRT9Zfgr_0EdUWvcEUOnFQ,368
750
753
  api_logic_server_cli/prototypes/manager/.vscode/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
751
754
  api_logic_server_cli/prototypes/manager/.vscode/ApiLogicServer.code-workspace,sha256=HFycZhs0k5fXLxEZF-FBSA2S_JRDIYtVOhqb9743hH4,296
752
- api_logic_server_cli/prototypes/manager/.vscode/launch.json,sha256=BK5W-HwhFGB5dczUHRow_5iWiX7ozzcdmuVIRMVb5XQ,32515
755
+ api_logic_server_cli/prototypes/manager/.vscode/launch.json,sha256=fhXbuJvpxEaBuN868v2NcgZCyZQD-hzIbIgdF2jLgAc,32515
753
756
  api_logic_server_cli/prototypes/manager/.vscode/settings.json,sha256=wQgpFvviPbZCmsf02UgrJSGAz7g3i4chDZ_AdSIOr5Y,625
754
757
  api_logic_server_cli/prototypes/manager/system/.DS_Store,sha256=r4gY37tWmhc60MVHeHWD-ZbqQBPlXqcC7xX2NhV42AA,6148
755
758
  api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace,sha256=19Acdi2ZvX5U_IMokLiVaKkIMwsSxgbw5YjaRMpBAAI,333
@@ -1211,11 +1214,11 @@ api_logic_server_cli/prototypes/manager/system/genai/examples/emp_depts/emp_dept
1211
1214
  api_logic_server_cli/prototypes/manager/system/genai/examples/emp_depts/logic_notes.md,sha256=mrEBKE1OQxEqFoRLD1zYL-SeC5ITPcWEZKaumRDw7U4,100
1212
1215
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/.DS_Store,sha256=zQYgpeXOUqrfba9eGY89I8y4TzyXt6KeFI8mi4jUJFk,6148
1213
1216
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/create_db_models.py,sha256=QyGtjgsuYkVF5UYOn35V8ZnAdI76s-1KyM7nnGM4lPI,3588
1214
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt,sha256=G2PnoORyIZrlLybOL_EfhS3knSiFWUDCWmhsprFYZP0,653
1215
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.response_example,sha256=kfehCFZr8Af3p25P233VyuM0TSTDQwKoiReMu1tk3-U,8289
1217
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt,sha256=OwdxIKDO60meoYFLuA4b2W3727npv5g7gp6xdSoVa-A,771
1218
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.response_example,sha256=AW8V5VmeSEfGMPsTDYY77kIWqlnZ9-rpk-7OfboBiwM,8755
1216
1219
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_fixup_required.json,sha256=b7SO0wkrV7DxIkW2UxmEF07wXONMwzC4UOw1ZG2cvAw,9670
1217
1220
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_formal.prompt,sha256=V8QdPiytwb1jqWeo6fZvaoPE5OkPTJZ2KsKrvo17f7k,432
1218
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt,sha256=ZrhxctniAi17fJUaNZcx8yC1uPZw2XNtCpV4J1JPpIc,657
1221
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt,sha256=OwdxIKDO60meoYFLuA4b2W3727npv5g7gp6xdSoVa-A,771
1219
1222
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal_rules_only.prompt,sha256=rR-ZCr3knseA9ButjkZ80hxhy-Rxw5FbvVEbEXImo58,521
1220
1223
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_no_logic.prompt,sha256=IIsO4mxLpKccSoIE1dMNsQQ2efhhCpFnAcoGtbcHv50,95
1221
1224
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/__pycache__/create_db_models.cpython-312.pyc,sha256=GuOEED9cvP4Q9M73S2zAdHybuhe8W36kb1j5HRZb5YU,5578
@@ -5841,8 +5844,8 @@ api_logic_server_cli/prototypes/manager/system/genai/examples/students_classes_i
5841
5844
  api_logic_server_cli/prototypes/manager/system/genai/examples/time_tracking_billing/002_create_db_models.prompt,sha256=FnOEtrNZzX0PLcq9LvLCJyp7b4RDCO14v-Q5nmu8hVM,7008
5842
5845
  api_logic_server_cli/prototypes/manager/system/genai/examples/time_tracking_billing/003_create_db_models.response,sha256=-VGUaPaa-KR9ES2PCZpzJc3svOKuPdPXDVwP-tboXuw,27513
5843
5846
  api_logic_server_cli/prototypes/manager/system/genai/examples/time_tracking_billing/db.sqlite,sha256=hfPdf_o69yP0r1_w60hUos6VZC7tekRvGwiXsGyNzuI,32768
5844
- api_logic_server_cli/prototypes/manager/system/genai/examples/time_tracking_billing/readme.md,sha256=ILFCbHLDjYL9lABwDSqFtaA9K7_0c7AsAAZheI0SDQU,445
5845
- api_logic_server_cli/prototypes/manager/system/genai/learning_requests/logic_bank_api.prompt,sha256=IprrwD_JwpD5GvjtrS6sp5IyeKE7rGcZR4b0NAvnPWs,14335
5847
+ api_logic_server_cli/prototypes/manager/system/genai/examples/time_tracking_billing/readme.md,sha256=tbqT3IhKI9tTaTC_Wr4WbOjcWuFd22WOKjLXssm5cGs,3019
5848
+ api_logic_server_cli/prototypes/manager/system/genai/learning_requests/logic_bank_api.prompt,sha256=kIDGOhfHBPqOcMUPIEEDYfPPB-Aw9IQFAqg5d9MLIPo,15012
5846
5849
  api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
5847
5850
  api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/fixup.prompt,sha256=ZdVl-0J9oi8dS_3pDTrwdtvMSpDymbArTIlSEwcjCrM,305
5848
5851
  api_logic_server_cli/prototypes/manager/system/genai/prompt_inserts/import.prompt,sha256=nuSDA54ii9O5O920YhmA6sqaI_k3VFw3O97jgk0PCzo,493
@@ -6224,10 +6227,10 @@ api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/setup.py,sha256=ekn0wq_leWE
6224
6227
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/tox.ini,sha256=mVlmM_uI-7K4pLs-jBfu8ZOQpHwQj8fh7LogvwjXJyE,440
6225
6228
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/__pycache__/__init__.cpython-312.pyc,sha256=TCTs9PqY75qnKtNXXWS41XVG_wGzHyRQ2eA3IWNY-Ss,237
6226
6229
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6227
- api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py,sha256=Rk4Bq35-W0eshpuFDAlk7n3RK_20GpNV6XsFcsJJatk,77364
6230
+ api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py,sha256=p3MnTFVGE7vIzE2DqfWvoG43tJE9frkXjzODXA9UQeE,77486
6228
6231
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/main.py,sha256=_kSzjbpJRgQURKP391SdIjYJOzBuyADEIP0qSSu8Nv0,3252
6229
6232
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__pycache__/__init__.cpython-312.pyc,sha256=KHmbHH1vUKhS8pIGx1wyXxO6iwO9X3znNZROjYUzTnI,249
6230
- api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__pycache__/codegen.cpython-312.pyc,sha256=_3Q3gk9rUWArPCpoDbc9L-AysF6tz-CuTqKt1iMc_xs,81248
6233
+ api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__pycache__/codegen.cpython-312.pyc,sha256=4hnUU0c1-SbhvP6ElD5usSEzhc2UJCxdct0jC9iz7d0,81261
6231
6234
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/als_safrs_310/delete_log.txt,sha256=gMkXWPBkd-jEb-P7UA8WkCnV8tAccBL-IhT41Jz5TRw,16390
6232
6235
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/als_safrs_310/notes.txt,sha256=6KP8dOvdWsIGrpRmaueXbo_ZpD-6Edz-pOfTE80cScA,3991
6233
6236
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/als_safrs_310/nw-schema.txt,sha256=mxZHTNBEH2-0Sf0NbS53DmX6_BmD2a3xz1nEhatXc_A,7159
@@ -6260,9 +6263,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
6260
6263
  api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
6261
6264
  api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
6262
6265
  api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
6263
- ApiLogicServer-14.3.0.dist-info/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
6264
- ApiLogicServer-14.3.0.dist-info/METADATA,sha256=sUfPlZD-GO-Ad-yLPFIicw0QY5cOIu36laQRubgq6CA,6446
6265
- ApiLogicServer-14.3.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
6266
- ApiLogicServer-14.3.0.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
6267
- ApiLogicServer-14.3.0.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
6268
- ApiLogicServer-14.3.0.dist-info/RECORD,,
6266
+ ApiLogicServer-14.3.7.dist-info/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
6267
+ ApiLogicServer-14.3.7.dist-info/METADATA,sha256=ONKOg5Hc2ykoNZafJvCHg0J1ldjhVamsZgEPrl5ETSk,6446
6268
+ ApiLogicServer-14.3.7.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
6269
+ ApiLogicServer-14.3.7.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
6270
+ ApiLogicServer-14.3.7.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
6271
+ ApiLogicServer-14.3.7.dist-info/RECORD,,
@@ -12,9 +12,10 @@ ApiLogicServer CLI: given a database url, create [and run] customizable ApiLogic
12
12
  Called from api_logic_server_cli.py, by instantiating the ProjectRun object.
13
13
  '''
14
14
 
15
- __version__ = "14.03.00"
15
+ __version__ = "14.03.07"
16
16
  recent_changes = \
17
17
  f'\n\nRecent Changes:\n' +\
18
+ "\t02/05/2024 - 14.03.07: webg SendWhen \n"\
18
19
  "\t01/31/2024 - 14.03.00: Issue 76: exp ending in right paren, Issue 74: Multi-db fix, extended default options, if-based Nat Lang formulas \n"\
19
20
  "\t01/29/2024 - 14.02.34: save docs/response.json to fix bad rules for IS_GENAI_DEMO, LogicBank 1.20.23 (all defaults) \n"\
20
21
  "\t01/26/2024 - 14.02.31: genai_logic fail-safe, Issue 74: Multi-db fix, support models named Rule, wg logic discovery, if formula \n"\
@@ -1,3 +1,3 @@
1
- last_created_date: January 31, 2025 12:51:54
2
- last_created_project_name: imatia_product_management
3
- last_created_version: 14.02.34
1
+ last_created_date: February 04, 2025 14:41:01
2
+ last_created_project_name: genai_demo_
3
+ last_created_version: 14.03.05
@@ -216,10 +216,13 @@ def main(ctx):
216
216
  @click.option('--clean/--no-clean', "clean",
217
217
  default=False, is_flag=True,
218
218
  help="Overlay existing manager (projects retained)")
219
+ @click.option('--samples/--no-samples', "samples",
220
+ default=True, is_flag=True,
221
+ help="Create sample projects")
219
222
  @click.option('--open-manager/--no-open-manager', "open_manager",
220
223
  default=True, is_flag=True,
221
224
  help="Overlay existing manager (projects retained)")
222
- def create_start_manager(ctx, open_with, clean: click.BOOL = True,
225
+ def create_start_manager(ctx, open_with, clean: click.BOOL = True, samples: click.BOOL = True,
223
226
  volume: str = "ApiLogicServer", open_manager: click.BOOL = True):
224
227
  """
225
228
  Create and Manage API Logic Projects.
@@ -227,7 +230,7 @@ def create_start_manager(ctx, open_with, clean: click.BOOL = True,
227
230
  # print(f'start sees volume={volume}')
228
231
  from api_logic_server_cli.manager import create_manager
229
232
  create_manager(clean=clean, open_with=open_with, api_logic_server_path=get_api_logic_server_path(),
230
- volume=volume, open_manager=open_manager)
233
+ volume=volume, open_manager=open_manager, samples=samples)
231
234
 
232
235
 
233
236
  @main.command("about")
@@ -600,7 +600,7 @@ class OntBuilder(object):
600
600
  and len(tg["fks"]) == 1 \
601
601
  and not exclude:
602
602
  col_type = next((col.type for col in entity.columns if col.name == col_var["name"]), None)
603
- if col_type and col_var["type"] != col_type:
603
+ if col_type and col_var["type"].lower().split("(")[0] in ["bigint", "int","integer", "numeric","decimal"]:
604
604
  tab_name, tab_var = self.get_tab_attrs(entity=entity, parent_entity=parent_entity, fk_tab=tg)
605
605
  return self.table_cell_render.render(tab_var)
606
606
 
@@ -185,6 +185,10 @@ class GenAI(object):
185
185
  with open(genai_demo_response_path, 'r') as response_file:
186
186
  response_dict = json.load(response_file)
187
187
  log.debug(f'.. used standard genai_demo response: {genai_demo_response_path}')
188
+ genai_demo_response_path = Path('system/genai/temp/response.json')
189
+ with open(genai_demo_response_path, 'w') as response_file:
190
+ json.dump(response_dict, response_file, indent=4)
191
+
188
192
  else: # for retry from corrected response... eg system/genai/temp/chatgpt_retry.response
189
193
  self.resolved_model = "(n/a: model not used for repaired response)"
190
194
  log.debug(f'\nUsing [corrected] response from: {self.project.genai_repaired_response}')
@@ -193,6 +193,8 @@ def get_code_update_logic_file(rule_list: List[DotMap], logic_file_path: Path =
193
193
  pass
194
194
  elif 'Rule.constraint' in each_line:
195
195
  pass
196
+ elif 'Rule.after_flush_row_event' in each_line:
197
+ pass
196
198
  elif 'Rule.allocate' in each_line:
197
199
  pass
198
200
  elif 'Rule.calculate' in each_line:
@@ -11,14 +11,14 @@ from pathlib import Path
11
11
  import api_logic_server_cli.api_logic_server as PR
12
12
 
13
13
  def create_manager(clean: bool, open_with: str, api_logic_server_path: Path,
14
- volume: str = "", open_manager: bool = True):
14
+ volume: str = "", open_manager: bool = True, samples: bool = True):
15
15
  """Implements als start to create manager - called from api_logic_server_cli/cli.py
16
16
 
17
17
  create Manager at os.getcwd(), including:
18
18
 
19
19
  1. .vscode, readme
20
20
  2. System folder (GenAI sample prompts / responses, others TBD)
21
- 3. pre-created samples
21
+ 3. pre-created samples (optional)
22
22
 
23
23
  Example, from CLI in directory containing a `venv` (see https://apilogicserver.github.io/Docs/Manager/):
24
24
  als start
@@ -122,21 +122,25 @@ def create_manager(clean: bool, open_with: str, api_logic_server_path: Path,
122
122
  except: # do NOT fail
123
123
  pass # just fall back to using the pip-installed version
124
124
 
125
- if project.is_docker:
126
- log.debug(f" tutorial not created for docker\n\n")
125
+ if not samples:
126
+ shutil.rmtree(to_dir.joinpath(f'{docker_volume}system/app_model_editor'))
127
+ shutil.rmtree(to_dir.joinpath(f'{docker_volume}system/genai/examples/genai_demo/wg_dev_merge'))
127
128
  else:
128
- tutorial_project = PR.ProjectRun(command="tutorial",
129
- project_name='./samples',
130
- db_url="",
131
- execute=False,
132
- open_with="NO_AUTO_OPEN"
133
- )
134
- tutorial_project = tutorial_project.tutorial(msg="Creating:") ##, create='tutorial')
135
-
136
- samples_project = PR.ProjectRun(command= "create", project_name=f'{docker_volume}samples/nw_sample', db_url='nw+', open_with="NO_AUTO_OPEN")
137
- log.setLevel(mgr_save_level)
138
- log.disabled = False # todo why was it reset?
139
- samples_project = PR.ProjectRun(command= "create", project_name=f'{docker_volume}samples/nw_sample_nocust', db_url='nw', open_with="NO_AUTO_OPEN")
129
+ if project.is_docker:
130
+ log.debug(f" tutorial not created for docker\n\n")
131
+ else:
132
+ tutorial_project = PR.ProjectRun(command="tutorial",
133
+ project_name='./samples',
134
+ db_url="",
135
+ execute=False,
136
+ open_with="NO_AUTO_OPEN"
137
+ )
138
+ tutorial_project = tutorial_project.tutorial(msg="Creating:") ##, create='tutorial')
139
+
140
+ samples_project = PR.ProjectRun(command= "create", project_name=f'{docker_volume}samples/nw_sample', db_url='nw+', open_with="NO_AUTO_OPEN")
141
+ log.setLevel(mgr_save_level)
142
+ log.disabled = False # todo why was it reset?
143
+ samples_project = PR.ProjectRun(command= "create", project_name=f'{docker_volume}samples/nw_sample_nocust', db_url='nw', open_with="NO_AUTO_OPEN")
140
144
  log.info('')
141
145
  log.setLevel(mgr_save_level)
142
146
  log.disabled = False
@@ -153,18 +153,24 @@ def fixup_sort(clz, data):
153
153
  continue
154
154
  return sort
155
155
  def fixup_data(data, sqltypes):
156
+ new_data = None
156
157
  if data:
158
+ new_data = {}
157
159
  for key, value in data.items():
160
+ new_data[key] = value
158
161
  if sqltypes and key in sqltypes and isinstance(value, str):
159
162
  if sqltypes[key] in [-5,2,4,5,-6]: #BIGINT, TINYINT, INT, SMALLINT, INTEGER
160
- data[key] = int(value)
163
+ if new_data[key].isdigit():
164
+ new_data[key] = int(value)
165
+ else:
166
+ del new_data[key]
161
167
  elif sqltypes[key] in [6]: #DECIMAL
162
- data[key] = Decimal(value)
168
+ new_data[key] = Decimal(value)
163
169
  if sqltypes and key in sqltypes and sqltypes[key] in [91,93] and isinstance(value, int): #DATE, TIMESTAMP
164
170
  from datetime import datetime
165
171
  fmt = "%Y-%m-%d" if sqltypes[key] == 91 else "%Y-%m-%d %H:%M:%S"
166
- data[key] = datetime.fromtimestamp(value / 1000) #.strftime(fmt)
167
- return data
172
+ new_data[key] = datetime.fromtimestamp(value / 1000) #.strftime(fmt)
173
+ return new_data
168
174
 
169
175
  def _parseFilter(filter: dict, sqltypes: any):
170
176
  # {filter":{"@basic_expression":{"lop":"BALANCE","op":"<=","rop":35000}}
@@ -1,6 +1,6 @@
1
1
  """
2
2
 
3
- Version 1.1
3
+ Version 2.0
4
4
 
5
5
  Invoked at server start (api_logic_server_run.py -> config/setup.py)
6
6
 
@@ -47,8 +47,23 @@ def kafka_producer():
47
47
  producer = Producer(conf)
48
48
  logger.debug(f'\nKafka producer connected')
49
49
 
50
+ from sqlalchemy.inspection import inspect
50
51
 
51
- def send_kafka_message(kafka_topic: str, kafka_key: str, msg: str="", json_root_name: str = "",
52
+ def get_primary_key(logic_row: LogicRow):
53
+ """ Return primary key for row, if it exists
54
+
55
+ Args:
56
+ logic_row (LogicRow): The SQLAlchemy row object
57
+
58
+ Returns:
59
+ dict: A dictionary with primary key column names and their values
60
+ """
61
+ primary_key_columns = inspect(logic_row.row).mapper.primary_key
62
+ primary_key = {column.name: getattr(logic_row.row, column.name) for column in primary_key_columns}
63
+ return primary_key
64
+
65
+
66
+ def send_kafka_message(kafka_topic: str, kafka_key: str = None, msg: str="", json_root_name: str = "",
52
67
  logic_row: LogicRow = None, row_dict_mapper: RowDictMapper = None, payload: dict = None):
53
68
  """ Send Kafka message regarding logic_row, mapped by row_dict_mapper
54
69
 
@@ -80,18 +95,27 @@ def send_kafka_message(kafka_topic: str, kafka_key: str, msg: str="", json_root_
80
95
  else:
81
96
  root_name = logic_row.name
82
97
 
98
+ if kafka_key is None:
99
+ kafka_key = get_primary_key(logic_row)
100
+
101
+ log_msg = msg if msg != "" else f"Sending {root_name} to Kafka topic '{kafka_topic}'"
102
+
83
103
  json_string = jsonify({f'{root_name}': row_obj_dict}).data.decode('utf-8')
84
- log_msg = msg + ' sends:'
104
+ log_msg = log_msg
85
105
  if producer: # enabled in config/config.py?
86
106
  try:
87
107
  producer.produce(value=json_string, topic="order_shipping", key=kafka_key)
88
108
  if logic_row:
89
- logic_row.log(msg)
109
+ logic_row.log(log_msg)
90
110
  except KafkaException as ke:
91
111
  logger.error("kafka_producer#send_kafka_message error: {ke}")
92
112
  else:
93
- log_msg += " [Note: **Kafka not enabled** ]"
113
+ log_msg += " [Note: **Kafka not enabled** ]"
94
114
  if logic_row is not None:
95
- logic_row.log(f'\n\n{log_msg}\n{json_string}')
96
- else:
97
- logger.debug(f'\n\n{log_msg}\n{json_string}')
115
+ logic_row.log(f'{log_msg}')
116
+ logger.debug(f'\n\n{log_msg}\n{json_string}')
117
+
118
+
119
+ def send_row_to_kafka(row: object, old_row: object, logic_row: LogicRow, with_args: dict):
120
+ if logic_row.row.date_shipped is not None:
121
+ send_kafka_message(logic_row=logic_row, kafka_topic=with_args["topic"])
@@ -1,7 +1,7 @@
1
1
  from database import models
2
2
  from flask import request, jsonify
3
3
  import sqlalchemy as sqlalchemy
4
- from sqlalchemy import Column
4
+ from sqlalchemy import Column, inspect
5
5
  from sqlalchemy.ext.declarative import declarative_base
6
6
  from flask_sqlalchemy.model import DefaultMeta
7
7
  from sqlalchemy.ext.hybrid import hybrid_property
@@ -276,8 +276,7 @@ class RowDictMapper():
276
276
  parent_lookup_list.append(self.parent_lookups)
277
277
  for each_parent_lookup in parent_lookup_list:
278
278
  self._parent_lookup_from_child(child_row_dict = row_dict,
279
- lookup_fields = each_parent_lookup[1],
280
- parent_class = each_parent_lookup[0],
279
+ parent_lookup = each_parent_lookup,
281
280
  child_row = sql_alchemy_row,
282
281
  session = session)
283
282
 
@@ -354,27 +353,31 @@ class RowDictMapper():
354
353
 
355
354
  def _parent_lookup_from_child(self, child_row_dict: dict, child_row: object,
356
355
  session: object,
357
- parent_class: DefaultMeta,
358
- lookup_fields: list[object]):
359
- """ Used from child -- parent_lookups
356
+ parent_lookup: tuple[DefaultMeta, list[tuple[Column, str]]]):
357
+ """ Used from child -- parent_lookups (e,g, B2B Product)
360
358
 
361
359
  Args:
362
- child_row_dict (dict): _description_
363
- child_row (object): _description_
364
- session (object): _description_
365
- lookup_parent_endpoint (RowDictMapper, optional): _description_. Defaults to None.
360
+ child_row_dict (dict): the incoming payload
361
+ child_row (object): row
362
+ parent_lookup (tuple[DefaultMeta, list[tuple[Column, str]]]): parent class, list of attrs/json keys
363
+ session (object): SqlAlchemy session
364
+
365
+ Example lookup_fields (genai_demo/OrderB2B.py):
366
+ parent_lookup = ( models.Customer, [(models.Customer.name, 'Account')] )
367
+ parent_class: parent_lookups[0] Customer)
368
+ lookup_fields: parent_lookups[1] [(models.Customer.name, 'Account')]
366
369
 
367
370
  Raises:
368
- ValueError: _description_
369
- ValueError: _description_
371
+ ValueError: eg, missing parent
370
372
  """
371
-
373
+ parent_class = parent_lookup[0]
374
+ lookup_fields = parent_lookup[1]
372
375
  query = session.query(parent_class)
373
376
 
374
377
  if parent_class.__name__ in ['Product', 'Customer']:
375
378
  logging.debug(f'_parent_lookup_from_child {parent_class.__name__}' )
376
- for each_lookup_param_field in lookup_fields:
377
- attr_name = each_lookup_param_field
379
+ for each_lookup_param_field in lookup_fields: # e.g, (models.Customer.name, 'Account')
380
+ attr_name = each_lookup_param_field # <col_def> <filter-val>
378
381
  if isinstance(each_lookup_param_field, tuple):
379
382
  col_def = each_lookup_param_field[0]
380
383
  attr_name = each_lookup_param_field[1]
@@ -394,6 +397,20 @@ class RowDictMapper():
394
397
  raise ValueError('Lookup failed: missing parent', child_row, parent_class.__name__, str(child_row_dict))
395
398
 
396
399
  parent_row = parent_rows[0]
397
- setattr(child_row, parent_class.__name__, parent_row)
400
+
401
+ # find parent accessor - usually parent_class.__name__, unless fk is lower case (B2bOrders)
402
+ mapper = inspect(child_row).mapper
403
+ parent_accessor = None
404
+ for each_attribute in mapper.attrs: # find parent accessors
405
+ if isinstance(each_attribute, sqlalchemy.orm.relationships.RelationshipProperty):
406
+ if each_attribute.argument == parent_class.__name__:
407
+ if parent_accessor is None:
408
+ parent_accessor = each_attribute.key
409
+ else:
410
+ raise ValueError(f'Parent accessor not unique: {parent_accessor}') # TODO - multiple parents
411
+ if parent_accessor is None:
412
+ raise ValueError(f'Parent accessor not found: {parent_class.__name__}')
413
+
414
+ setattr(child_row, parent_accessor, parent_row)
398
415
 
399
416
  return
@@ -8,6 +8,7 @@ import database.models as models
8
8
  import api.system.opt_locking.opt_locking as opt_locking
9
9
  from security.system.authorization import Grant, Security
10
10
  from logic.load_verify_rules import load_verify_rules
11
+ import integration.kafka.kafka_producer as kafka_producer
11
12
  import logging
12
13
 
13
14
  app_logger = logging.getLogger(__name__)
@@ -26,6 +26,7 @@ declare_logic_message = "ALERT: *** No Rules Yet ***" # printed in api_logic_s
26
26
  rule_import_template = """
27
27
  from logic_bank.logic_bank import Rule
28
28
  from database.models import *
29
+ import integration.kafka.kafka_producer as kafka_producer
29
30
 
30
31
  def init_rule():
31
32
  {rule_code}
@@ -213,4 +214,4 @@ def load_verify_rules():
213
214
  app_logger.warning(f"{Fore.RED}Failed to load active exported rules: {exc}{Style.RESET_ALL}")
214
215
 
215
216
  root_logger.removeHandler(file_handler)
216
-
217
+
@@ -5,8 +5,8 @@ from flask import request, jsonify
5
5
  from safrs import jsonapi_rpc
6
6
  from database import models
7
7
  import integration.system.RowDictMapper as row_dict_mapper
8
- from integration.row_dict_maps.OrderShipping import OrderShipping
9
- from integration.row_dict_maps.OrderB2B import OrderB2B
8
+ # from integration.row_dict_maps.OrderShipping import OrderShipping
9
+ from integration.row_dict_maps.OrderB2B import OrderB2B # TODO - how to drive; B2B...
10
10
 
11
11
  # called by api_logic_server_run.py, to customize api (new end points, services).
12
12
  # separate from expose_api_models.py, to simplify merge if project recreated
@@ -140,15 +140,13 @@ class ServicesEndPoint(safrs.JABase):
140
140
  """ # yaml creates Swagger description
141
141
  args :
142
142
  order:
143
- Account: "Jane Smith"
143
+ Account: "Alice"
144
144
  Notes: "Please Rush"
145
145
  Items :
146
- - ProductName: "Widget A"
146
+ - ProductName: "Product 1"
147
147
  QuantityOrdered: 1
148
- - ProductName: "Gadget B"
148
+ - ProductName: "Product 2"
149
149
  QuantityOrdered: 2
150
- - ProductName: "Green Apples"
151
- QuantityOrdered: 3
152
150
  ---
153
151
 
154
152
  Note attribute alias, Lookup automation in OrderB2B
@@ -159,19 +157,19 @@ class ServicesEndPoint(safrs.JABase):
159
157
  $(venv) ApiLogicServer login --user=admin --password=p
160
158
  $(venv) ApiLogicServer curl "'POST' 'http://localhost:5656/api/ServicesEndPoint/OrderB2B'" --data '
161
159
  {"meta": {"args": {"order": {
162
- "Account": "Jane Smith",
160
+ "Account": "Alice",
163
161
  "Notes": "Please Rush",
164
162
  "Items": [
165
163
  {
166
- "ProductName": "Widget A",
164
+ "ProductName": "Product 1",
167
165
  "QuantityOrdered": 1
168
166
  },
169
167
  {
170
- "ProductName": "Gadget B",
168
+ "ProductName": "Product 2",
171
169
  "QuantityOrdered": 2
172
170
  },
173
171
  {
174
- "ProductName": "Gadget B",
172
+ "ProductName": "Green Apples",
175
173
  "QuantityOrdered": 2
176
174
  }
177
175
  ]