ApiLogicServer 14.3.11__py3-none-any.whl → 14.3.14__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 (39) hide show
  1. api_logic_server_cli/api_logic_server.py +3 -1
  2. api_logic_server_cli/api_logic_server_info.yaml +3 -3
  3. api_logic_server_cli/cli.py +1 -1
  4. api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc +0 -0
  5. api_logic_server_cli/genai/genai.py +8 -276
  6. api_logic_server_cli/genai/genai_fatal_excp.py +5 -0
  7. api_logic_server_cli/genai/genai_svcs.py +14 -2
  8. api_logic_server_cli/genai/genai_utils.py +1 -1
  9. api_logic_server_cli/prototypes/base/api/expose_api_models.py +1 -1
  10. api_logic_server_cli/prototypes/base/api/system/expression_parser.py +1 -1
  11. api_logic_server_cli/prototypes/base/api_logic_server_run.py +2 -2
  12. api_logic_server_cli/prototypes/base/devops/docker-image/env.list +15 -0
  13. api_logic_server_cli/prototypes/base/devops/docker-standard-image/docker-compose-standard-image.yml +28 -0
  14. api_logic_server_cli/prototypes/base/devops/docker-standard-image/env.list +55 -0
  15. api_logic_server_cli/prototypes/base/devops/readme-devops.md +13 -1
  16. api_logic_server_cli/prototypes/base/docs/logic/readme.md +6 -2
  17. api_logic_server_cli/prototypes/base/logic/readme_declare_logic.md +8 -0
  18. api_logic_server_cli/prototypes/base/security/declare_security.py +2 -0
  19. api_logic_server_cli/prototypes/genai_demo/logic/declare_logic.py +3 -3
  20. api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace +2 -3
  21. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt +1 -1
  22. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_formal.prompt +0 -2
  23. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt +0 -2
  24. api_logic_server_cli/prototypes/manager/system/genai/webg_local/.DS_Store +0 -0
  25. api_logic_server_cli/prototypes/manager/system/genai/webg_local/run_web_genai.sh +10 -0
  26. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/.DS_Store +0 -0
  27. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/by-ulid/.DS_Store +0 -0
  28. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/public/.DS_Store +0 -0
  29. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/wgadmin/.DS_Store +0 -0
  30. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-temp/.DS_Store +0 -0
  31. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg_config/.DS_Store +0 -0
  32. api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg_config/web_genai.txt +8 -0
  33. api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py +2 -2
  34. {ApiLogicServer-14.3.11.dist-info → apilogicserver-14.3.14.dist-info}/METADATA +1 -1
  35. {ApiLogicServer-14.3.11.dist-info → apilogicserver-14.3.14.dist-info}/RECORD +39 -27
  36. {ApiLogicServer-14.3.11.dist-info → apilogicserver-14.3.14.dist-info}/WHEEL +1 -1
  37. {ApiLogicServer-14.3.11.dist-info → apilogicserver-14.3.14.dist-info}/LICENSE +0 -0
  38. {ApiLogicServer-14.3.11.dist-info → apilogicserver-14.3.14.dist-info}/entry_points.txt +0 -0
  39. {ApiLogicServer-14.3.11.dist-info → apilogicserver-14.3.14.dist-info}/top_level.txt +0 -0
@@ -12,9 +12,11 @@ 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.11"
15
+ __version__ = "14.03.14"
16
16
  recent_changes = \
17
17
  f'\n\nRecent Changes:\n' +\
18
+ "\t02/26/2024 - 14.03.14: [85: reserved words], genai_demo fixes \n"\
19
+ "\t02/16/2024 - 14.03.12: Docker w/ std container, mgr assistant for local WebG \n"\
18
20
  "\t02/13/2024 - 14.03.11: fixes [78: Keycloak, 79: boolean defaulting, 80: Send If missing attribute] \n"\
19
21
  "\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"\
20
22
  "\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"\
@@ -1,3 +1,3 @@
1
- last_created_date: February 05, 2025 18:22:21
2
- last_created_project_name: trk
3
- last_created_version: 14.03.07
1
+ last_created_date: February 17, 2025 13:08:45
2
+ last_created_project_name: ../../../servers/ucf
3
+ last_created_version: 14.03.12
@@ -595,7 +595,7 @@ def tutorial(ctx, create):
595
595
  default=f'_genai_default',
596
596
  help="Project location")
597
597
  @click.option('--tables',
598
- default=4,
598
+ default=12,
599
599
  help="Number of tables")
600
600
  @click.option('--test-data-rows', 'test_data_rows',
601
601
  default=4,
@@ -582,10 +582,18 @@ class GenAI(object):
582
582
  Save prompts / responses to system/genai/temp/{project}/genai.response
583
583
 
584
584
  Copy system/genai/temp/create_db_models.py to system/genai/temp/{project}/create_db_models.py
585
+
586
+ delete system/genai/temp/create_db_models.sqlite (avoid table collisions)
585
587
  """
586
588
  try:
587
589
  to_dir = Path(os.getcwd())
588
590
  gen_temp_dir = Path(to_dir).joinpath(f'system/genai/temp')
591
+
592
+ # delete system/genai/temp/create_db_models.sqlite
593
+ sqlite_file_path = Path(gen_temp_dir).joinpath('create_db_models.sqlite')
594
+ if sqlite_file_path.exists():
595
+ os.remove(sqlite_file_path)
596
+
589
597
  to_dir_save_dir = Path(to_dir).joinpath(f'system/genai/temp/{self.project.project_name_last_node}')
590
598
  """ project work files saved to system/genai/temp/<project> """
591
599
  log.info(f'.. saving work files to: system/genai/temp/{self.project.project_name_last_node}')
@@ -645,282 +653,6 @@ class GenAI(object):
645
653
  pass # intentional try/catch/bury - it's just diagnostics, so don't fail
646
654
  debug_string = "good breakpoint - return to main driver, and execute create_db_models.py"
647
655
 
648
- def z_fix_and_write_model_file(self):
649
- """
650
- 1. from response, create model file / models lines
651
- 2. from response, create model file / test lines
652
- 3. ChatGPT work-arounds (decimal, indent, bogus relns, etc etc)
653
- 4. Ensure the sqlite url is correct: sqlite:///system/genai/temp/create_db_models.sqlite
654
- 5. write model file to self.project.from_model
655
-
656
- Args:
657
- response_data (str): the chatgpt response
658
-
659
- """
660
-
661
- def insert_model_lines(models, create_db_model_lines):
662
-
663
- def get_model_class_lines(model: DotMap) -> list[str]:
664
- """Get the model class from the model, with MAJOR fixes
665
-
666
- Args:
667
- model (Model): the model
668
-
669
- Returns:
670
- stlist[str]: the model class lines, fixed up
671
- """
672
-
673
- create_db_model_lines = list()
674
- create_db_model_lines.append('\n\n')
675
- class_lines = model.code.split('\n')
676
- line_num = 0
677
- indents_to_remove = 0
678
- for each_line in class_lines:
679
- line_num += 1
680
- ''' decimal issues
681
-
682
- 1. bad import: see Run: tests/test_databases/ai-created/genai_demo/genai_demo_decimal
683
- from decimal import Decimal # Decimal fix: needs to be from decimal import DECIMAL
684
-
685
- 2. Missing missing import: from SQLAlchemy import .... DECIMAL
686
-
687
- 3. Column(Decimal) -> Column(DECIMAL)
688
- see in: tests/test_databases/ai-created/budget_allocation/budget_allocations/budget_allocations_3_decimal
689
-
690
- 4. Bad syntax on test data: see Run: blt/time_cards_decimal from RESPONSE
691
- got: balance=DECIMAL('100.50')
692
- needed: balance=1000.0
693
- fixed with import in create_db_models_prefix.py
694
-
695
- 5. Bad syntax on test data cals: see api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_conversation_bad_decimal/genai_demo_03.response
696
- got: or Decimal('0.00')
697
- needed: or decimal.Decimal('0.00')
698
-
699
- 6. Bad syntax on test data cals: see api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_conversation_bad_decimal_2/genai_demo_conversation_002.response
700
- got: or DECIMAL('
701
- needed: or decimal.Decimal('0.00')
702
- '''
703
-
704
- # TODO - seeing several \\ in the response - should be \ (I think)
705
- if "= Table(" in each_line: # tests/test_databases/ai-created/time_cards/time_card_kw_arg/genai.response
706
- log.debug(f'.. fix_and_write_model_file detects table - raise excp to trigger retry')
707
- self.post_error = "ChatGPT Response contains table (not class) definitions: " + each_line
708
- if 'sqlite:///' in each_line: # must be sqlite:///system/genai/temp/create_db_models.sqlite
709
- current_url_rest = each_line.split('sqlite:///')[1]
710
- quote_type = "'"
711
- if '"' in current_url_rest:
712
- quote_type = '"' # eg, tests/test_databases/ai-created/time_cards/time_card_decimal/genai.response
713
- current_url = current_url_rest.split(quote_type)[0]
714
- proper_url = 'system/genai/temp/create_db_models.sqlite'
715
- each_line = each_line.replace(current_url, proper_url)
716
- if current_url != proper_url:
717
- log.debug(f'.. fixed sqlite url: {current_url} -> system/genai/temp/create_db_models.sqlite')
718
- if 'Decimal,' in each_line: # SQLAlchemy import
719
- each_line = each_line.replace('Decimal,', 'DECIMAL,')
720
- # other Decimal bugs: see api_logic_server_cli/prototypes/manager/system/genai/reference/errors/chatgpt_decimal.txt
721
- if ', Decimal' in each_line: # Cap'n K, at your service
722
- each_line = each_line.replace(', Decimal', ', DECIMAL')
723
- if 'rom decimal import Decimal' in each_line:
724
- each_line = each_line.replace('from decimal import Decimal', 'import decimal')
725
- if '=Decimal(' in each_line:
726
- each_line = each_line.replace('=Decimal(', '=decimal.Decimal(')
727
- if ' Decimal(' in each_line:
728
- each_line = each_line.replace(' Decimal(', ' decimal.Decimal(')
729
- if 'Column(Decimal' in each_line:
730
- each_line = each_line.replace('Column(Decimal', 'Column(DECIMAL')
731
- if "DECIMAL('" in each_line:
732
- each_line = each_line.replace("DECIMAL('", "decimal.Decimal('")
733
- if 'end_time(datetime' in each_line: # tests/test_databases/ai-created/time_cards/time_card_kw_arg/genai.response
734
- each_line = each_line.replace('end_time(datetime', 'end_time=datetime')
735
- if 'datetime.date.today' in each_line:
736
- each_line = each_line.replace('datetime.today', 'end_time=datetime')
737
- if indents_to_remove > 0:
738
- each_line = each_line[indents_to_remove:]
739
- if 'relationship(' in each_line and self.project.genai_use_relns == False:
740
- # airport4 fails with could not determine join condition between parent/child tables on relationship Airport.flights
741
- if each_line.startswith(' '):
742
- each_line = each_line.replace(' ', ' # ')
743
- else: # sometimes it puts relns outside the class (so, outdented)
744
- each_line = '# ' + each_line
745
- if 'sqlite:///system/genai/temp/model.sqlite': # fix prior version
746
- each_line = each_line.replace('sqlite:///system/genai/temp/model.sqlite',
747
- 'sqlite:///system/genai/temp/create_db_models.sqlite')
748
-
749
- # logicbank fixes
750
- if 'from logic_bank' in each_line: # we do our own imports
751
- each_line = each_line.replace('from', '# from')
752
- if 'LogicBank.activate' in each_line:
753
- each_line = each_line.replace('LogicBank.activate', '# LogicBank.activate')
754
-
755
- create_db_model_lines.append(each_line + '\n')
756
- return create_db_model_lines
757
-
758
-
759
- did_base = False
760
- for each_model in models:
761
- model_lines = get_model_class_lines(model=each_model)
762
- for each_line in model_lines:
763
- each_fixed_line = each_line.replace('sa.', '') # sometimes it puts sa. in front of Column
764
- if 'Base = declarative_base()' in each_fixed_line: # sometimes created for each class
765
- if did_base:
766
- each_fixed_line = '# ' + each_fixed_line
767
- did_base = True
768
- if 'datetime.datetime.utcnow' in each_fixed_line:
769
- each_fixed_line = each_fixed_line.replace('datetime.datetime.utcnow', 'datetime.now()')
770
- if 'Column(date' in each_fixed_line:
771
- each_fixed_line = each_fixed_line.replace('Column(dat', 'column(Date')
772
- create_db_model_lines.append(each_fixed_line)
773
-
774
- model_code = "\n".join(model_lines)
775
- if '\\n' in model_code:
776
- log.debug(f'.. fix_and_write_model_file detects \\n - attempting fix')
777
- model_code = model_code.replace('\\n', '\n')
778
- try:
779
- ast.parse(model_code)
780
- except SyntaxError as exc:
781
- log.error(f"Model Class Error: {model_code}")
782
- self.post_error = f"Model Class Error: {exc}"
783
- return create_db_model_lines
784
-
785
- def insert_test_data_lines(test_data_lines : list[str]) -> list[str]:
786
- """Insert test data lines into the model file
787
-
788
- Args:
789
- test_data_lines (list(str)):
790
- * initially header (engine =, sesssion =)
791
- * this function appends CPT test data
792
-
793
- Returns:
794
- list[str]: variable names for the test data rows (for create_all)
795
- """
796
-
797
- def fix_test_data_line(each_fixed_line: str) -> str:
798
- """Fix the test data line
799
-
800
- Args:
801
- each_fixed_line (str): the test data line
802
-
803
- Returns:
804
- str: the fixed test data line
805
- """
806
-
807
- if '=null' in each_fixed_line:
808
- each_fixed_line = each_fixed_line.replace('=None', '=date')
809
- if '=datetime' in each_fixed_line:
810
- each_fixed_line = each_fixed_line.replace('=datetime.date', '=date')
811
- if 'datetime.datetime.utcnow' in each_fixed_line:
812
- each_fixed_line = each_fixed_line.replace('datetime.datetime.utcnow', 'datetime.now()')
813
- if 'datetime.date.today' in each_fixed_line:
814
- each_fixed_line = each_fixed_line.replace('datetime.date.today', 'datetime.today')
815
- if 'engine = create_engine' in each_fixed_line: # CBT sometimes has engine = create_engine, so do we!
816
- each_fixed_line = each_fixed_line.replace('engine = create_engine', '# engine = create_engine')
817
- check_for_row_name = False
818
- if each_fixed_line.startswith('Base') or each_fixed_line.startswith('engine'):
819
- check_for_row_name = False
820
- if 'Base.metadata.create_all(engine)' in each_fixed_line:
821
- each_fixed_line = each_fixed_line.replace('Base.metadata.create_all(engine)', '# Base.metadata.create_all(engine)')
822
- return each_fixed_line
823
-
824
- row_names = list()
825
- use_test_data_rows = True # CPT test data, new format - test_data_rows (*way* less variable)
826
- if use_test_data_rows & hasattr(self.response_dict, 'test_data_rows'):
827
- test_data_rows = self.response_dict.test_data_rows
828
- log.debug(f'.... test_data_rows: {len(test_data_rows)}')
829
- for each_row in test_data_rows:
830
- each_fixed_line = fix_test_data_line(each_row.code)
831
- test_data_lines.append(each_fixed_line)
832
- row_names.append(each_row.test_data_row_variable)
833
- pass
834
- else: # CPT test data, old format - rows, plus session, engine etc (quite variable)
835
- test_data_lines_ori = self.response_dict.test_data.split('\n') # gpt response
836
- log.debug(f'.... test_data_lines...')
837
- for each_line in test_data_lines_ori:
838
- each_fixed_line = fix_test_data_line(each_line)
839
- check_for_row_name = True
840
- test_data_lines.append(each_fixed_line) # append the fixed test data line
841
- if check_for_row_name and ' = ' in each_line and '(' in each_line: # CPT test data might have: tests = []
842
- assign = each_line.split(' = ')[0]
843
- # no tokens for: Session = sessionmaker(bind=engine) or session = Session()
844
- if '.' not in assign and 'Session' not in each_line and 'session.' not in each_line:
845
- row_names.append(assign)
846
- return row_names
847
-
848
- create_db_model_lines = list()
849
- create_db_model_lines.append(f'# using resolved_model {self.resolved_model}')
850
- create_db_model_lines.extend( # imports for classes (comes from api_logic_server_cli/prototypes/manager/system/genai/create_db_models_inserts/create_db_models_imports.py)
851
- genai_svcs.get_lines_from_file(f'system/genai/create_db_models_inserts/create_db_models_imports.py'))
852
- create_db_model_lines.append("\nfrom sqlalchemy.dialects.sqlite import *\n") # specific for genai
853
-
854
- models = self.response_dict.models
855
-
856
- # Usage inside the class
857
- create_db_model_lines = insert_model_lines(models, create_db_model_lines)
858
-
859
- with open(f'{self.project.from_model}', "w") as create_db_model_file:
860
- create_db_model_file.write("".join(create_db_model_lines))
861
- create_db_model_file.write("\n\n# end of model classes\n\n")
862
-
863
- # classes done, create db and add test_data code
864
- test_data_lines = genai_svcs.get_lines_from_file(f'system/genai/create_db_models_inserts/create_db_models_create_db.py')
865
- test_data_lines.append('session.commit()')
866
-
867
- row_names = insert_test_data_lines(test_data_lines)
868
-
869
- test_data_lines.append('\n\n')
870
- row_name_list = ', '.join(row_names)
871
- add_rows = f'session.add_all([{row_name_list}])'
872
- test_data_lines.append(add_rows )
873
- test_data_lines.append('session.commit()')
874
- test_data_lines.append('# end of test data\n\n')
875
-
876
- test_data_lines_result = []
877
- for line in test_data_lines:
878
- test_data_lines_result += line.split('\n')
879
-
880
- with open(f'{self.project.from_model}', "a") as create_db_model_file:
881
- create_db_model_file.write("\ntry:\n ")
882
- create_db_model_file.write("\n ".join(test_data_lines_result))
883
- create_db_model_file.write("\nexcept Exception as exc:\n")
884
- create_db_model_file.write(" print(f'Test Data Error: {exc}')\n")
885
-
886
- log.debug(f'.. code for db creation and test data: {self.project.from_model}')
887
-
888
-
889
- def get_lines_from_fileZZ(self, file_name: str) -> list[str]:
890
- """Get lines from a file todo: migrate to svcs
891
-
892
- Args:
893
- file_name (str): the file name
894
-
895
- Returns:
896
- list[str]: the lines from the file
897
- """
898
-
899
- with open(file_name, "r") as file:
900
- lines = file.readlines()
901
- return lines
902
-
903
- def z_get_and_save_raw_response_data(self, completion: object, response_dict: dict):
904
- """
905
- Write response_dict --> system/genai/temp/chatgpt_original/retry.response
906
- """
907
-
908
- ''' TODO - is exception used instead of return_code...
909
- # Check if the request was successful
910
- if completion.status_code == 400:
911
- raise Exception("Bad ChatGPT Request: " + completion.text)
912
-
913
- if completion.status_code != 200:
914
- print("Error:", completion.status_code, completion.text) # eg, You exceeded your current quota
915
- '''
916
- with open(f'system/genai/temp/chatgpt_original.response', "w") as response_file: # save for debug
917
- json.dump(response_dict, response_file, indent=4)
918
- with open(f'system/genai/temp/chatgpt_retry.response', "w") as response_file: # repair this & retry
919
- json.dump(response_dict, response_file, indent=4)
920
- return
921
-
922
- def z_genai_cli_rule_suggesions_unused(project_name: str) -> dict:
923
- pass
924
656
 
925
657
  def genai_cli_with_retry(using: str, db_url: str, repaired_response: str, genai_version: str,
926
658
  retries: int, opt_locking: str, prompt_inserts: str, quote: bool,
@@ -0,0 +1,5 @@
1
+ class GenAIException(BaseException):
2
+ """Raise when unable to create db_models (missing Base, reserved word)"""
3
+
4
+ def __init__(self, message):
5
+ self.message = message
@@ -10,7 +10,7 @@ from pathlib import Path
10
10
  import os
11
11
  import sys
12
12
  import create_from_model.api_logic_server_utils as utils
13
-
13
+ from api_logic_server_cli.genai.genai_fatal_excp import GenAIException
14
14
  import time
15
15
  from openai import OpenAI
16
16
  import json
@@ -322,6 +322,11 @@ def model2code(model: DotMap) -> str:
322
322
  tree = ast.parse(model_code.replace('\\n', '\n'))
323
323
  except Exception as exc:
324
324
  raise exc
325
+ # check for reserved words... these can fail before sqlacodegen can fix, and might inter-relate, so quit
326
+ if model.name in ['column', 'Column', 'table', 'Table', 'session', 'Session', 'base', 'Base']:
327
+ log.error(f"Reserved word in model name: {model.name}")
328
+ raise GenAIException(f"Reserved word in model name: {model.name}")
329
+
325
330
 
326
331
  # Function to add a docstring to a class node
327
332
  def add_docstring_to_class(node, docstring):
@@ -418,7 +423,7 @@ def fix_model_lines(model: DotMap, use_relns: bool = True, post_error: str = Non
418
423
  if current_url != proper_url:
419
424
  log.debug(f'.. fixed sqlite url: {current_url} -> system/genai/temp/create_db_models.sqlite')
420
425
  if 'class ' in each_line:
421
- # yes, tempting fix... but it fails in SqlAlchemy with missing __tablename__
426
+ # yes, tempting to fix... but it fails in SqlAlchemy with missing __tablename__
422
427
  # each_line = each_line.replace(':', '(Base):') # sometimes it forgets the Base
423
428
  if 'Base' not in each_line:
424
429
  log.debug(f'.. fix_and_write_model_file detects class with no Base - raise excp to trigger retry')
@@ -469,6 +474,13 @@ def fix_and_write_model_file(response_dict: DotMap, save_dir: str, post_error:
469
474
  try: # based on model_lines
470
475
  model_code = model2code(each_model)
471
476
  log.info(f"Added description to model: {each_model.name}: {model_code}")
477
+ except GenAIException as exc:
478
+ ''' this does not work - creates a duplicate class, so let's just bail
479
+ if post_error is not None:
480
+ post_error = exc.args[0]
481
+ continue
482
+ '''
483
+ raise exc
472
484
  except Exception as exc:
473
485
  log.error(f"Failed to add description to model: {exc}")
474
486
  log.debug(f"model: {each_model}")
@@ -236,7 +236,7 @@ class GenAIUtils:
236
236
  create_fixup_files(self)
237
237
  log.info(f".. fixup complete: {self.using}/fixup")
238
238
  log.info(f".. .. next step: cd <manager> eg, cd ..")
239
- log.info(f".. .. and then, create fixed project: als genai --using=genai_demo.prompt --repaired-response={self.project.project_name}/{self.using}/fixup/response_fixup.json --project-name=fixed_project")
239
+ log.info(f".. .. and then, create fixed project: als genai --repaired-response={self.project.project_name}/{self.using}/fixup/response_fixup.json --project-name=fixed_project")
240
240
 
241
241
  def import_genai_project(self) -> None:
242
242
  """
@@ -40,7 +40,7 @@ def expose_models(api, method_decorators = []):
40
40
  """
41
41
 
42
42
  debug_inspect_list = inspect.getmembers(database.models)
43
- pass #vh
43
+ pass
44
44
  # Get all the subclasses of the Base class and expose them in the api
45
45
  for name, obj in inspect.getmembers(database.models):
46
46
  if inspect.isclass(obj) and issubclass(obj, database.models.SAFRSBaseX) and obj is not database.models.SAFRSBaseX:
@@ -154,7 +154,7 @@ def fixup_sort(clz, data):
154
154
  return sort
155
155
  def fixup_data(data, sqltypes):
156
156
  new_data = None
157
- if data:
157
+ if data and isinstance(data, dict):
158
158
  new_data = {}
159
159
  for key, value in data.items():
160
160
  new_data[key] = value
@@ -78,7 +78,7 @@ app_logger = server_setup.logging_setup()
78
78
 
79
79
  flask_app = Flask("API Logic Server", template_folder='ui/templates') # templates to load ui/admin/admin.yaml
80
80
 
81
- CORS(flask_app, resources=[{r"/api/*": {"origins": "*"}}],
81
+ CORS(flask_app, resources=[{r"/api/*": {"origins": "*"}},{r"/ontimizeweb/*": {"origins": "*"}}],
82
82
  allow_headers=["Content-Type", "Authorization", "Access-Control-Allow-Credentials"],supports_credentials=True)
83
83
 
84
84
  args = server_setup.get_args(flask_app) # creation defaults
@@ -100,7 +100,7 @@ server_setup.api_logic_server_setup(flask_app, args)
100
100
  AdminLoader.admin_events(flask_app = flask_app, args = args, validation_error = ValidationError)
101
101
 
102
102
  if __name__ == "__main__":
103
- msg = f'API Logic Project loaded (not WSGI), version {api_logic_server__version}\n'
103
+ msg = f'API Logic Project loaded (not WSGI), version: api_logic_server_version\n'
104
104
  msg += f'.. startup message: {start_up_message}\n'
105
105
  if server_setup.is_docker():
106
106
  msg += f' (running from docker container at flask_host: {args.flask_host} - may require refresh)\n'
@@ -53,3 +53,18 @@ APILOGICPROJECT_VERBOSE=True
53
53
  # APILOGICPROJECT_STOP_OK=FALSE
54
54
  # dev only - enable stop url: http://localhost:5656/stop?msg=reason
55
55
 
56
+ # APILOGICPROJECT_KAFKA_PRODUCER = '{"bootstrap.servers": "localhost:9092"}' # , "client.id": "aaa.b.c.d"}'
57
+ # APILOGICPROJECT_KAFKA_CONSUMER = '{"bootstrap.servers": "localhost:9092", "group.id": "als-default-group1"}'KAFKA_CONSUMER = None # comment out to enable Kafka consumer
58
+
59
+ # N8N Webhook Args
60
+ # see https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.webhook#path
61
+ # APILOGICPROJECT_wh_scheme = "http"
62
+ # APILOGICPROJECT_wh_server = "localhost" # or cloud.n8n.io...
63
+ # APILOGICPROJECT_wh_port = 5678
64
+ # APILOGICPROJECT_wh_endpoint = "webhook-test"
65
+ # APILOGICPROJECT_wh_path = "002fa0e8-f7aa-4e04-b4e3-e81aa29c6e69"
66
+ # APILOGICPROJECT_token = "YWRtaW46cA=="
67
+ # APILOGICPROJECT_N8N_PRODUCER = {"authorization": f"Basic {token}", "n8n_url": f'"{wh_scheme}://{wh_server}:{wh_port}/{wh_endpoint}/{wh_path}"'}
68
+ # Or enter the n8n_url directly:
69
+ # APILOGICPROJECT_N8N_PRODUCER = {"authorization": f"Basic {token}","n8n_url":"http://localhost:5678/webhook-test/002fa0e8-f7aa-4e04-b4e3-e81aa29c6e69"}
70
+ # APILOGICPROJECT_N8N_PRODUCER = None # comment out to enable N8N producer
@@ -0,0 +1,28 @@
1
+
2
+ # cd <project>
3
+ # sh ./devops/docker-standard-image/docker-compose.sh
4
+ # --> builds, runs at localhost:5656
5
+
6
+ # docker-compose -f devops/docker-standard-image/docker-compose-standard-image.yml up
7
+ # docker-compose -f devops/docker-standard-image/docker-compose-standard-image.yml down
8
+
9
+ # if you have run docker compose up (above), you must run docker compose down to run directly:
10
+ # docker run -it --rm --name api_logic_project -p 5656:5656 --env-file ./devops/docker-standard-image/env.list -v ./:/app apilogicserver/api_logic_server python3 /app/api_logic_server_run.py
11
+
12
+ services:
13
+ api-logic-server:
14
+ image: apilogicserver/api_logic_server
15
+ container_name: api_logic_project
16
+ environment:
17
+ - APILOGICPROJECT_VERBOSE=true
18
+ - SECURITY_ENABLED=true
19
+ env_file:
20
+ - ./env.list
21
+ volumes:
22
+ - ./../..:/app
23
+ ports:
24
+ - 5656:5656
25
+ command: python3 /app/api_logic_server_run.py
26
+ stdin_open: true
27
+ tty: true
28
+ restart: unless-stopped
@@ -0,0 +1,55 @@
1
+ # these values override the Config values, and the CLI arguments
2
+ # the values below are for testing - uncomment and view them on console log on server start
3
+ # #als: configure environment variables
4
+
5
+ # ip to which flask will be bound (default: 0.0.0.0)
6
+ # APILOGICPROJECT_FLASK_HOST=flask-host-e
7
+
8
+ # port (Flask) (default: 5656)
9
+ # APILOGICPROJECT_PORT=port-e
10
+
11
+ # ip clients use to access API (default: localhost)
12
+ # APILOGICPROJECT_SWAGGER_HOST=swagger-host-e
13
+
14
+ # swagger port (eg, 443 for codespaces) (default: 5656)
15
+ # APILOGICPROJECT_SWAGGER_PORT=swagger-port-e
16
+
17
+ # http or https (default: http)
18
+ # APILOGICPROJECT_HTTP_SCHEME=http-scheme-e
19
+
20
+ # APILOGICPROJECT_HTTP_SCHEME=http
21
+
22
+ # for reverse proxy cases where the entire URI must be specified
23
+ # APILOGICPROJECT_CLIENT_URI=httpe://hoste:porte
24
+
25
+ # TODO specify database uri's here, e.g:
26
+ # APILOGICPROJECT_SQLALCHEMY_DATABASE_URI=postgresql://postgres:p@postgresql-container/basic_demo
27
+ # APILOGICPROJECT_SQLALCHEMY_DATABASE_URI_AUTHENTICATION=postgresql://postgres:p@postgresql-container/authdb
28
+ # APILOGICPROJECT_SQLALCHEMY_DATABASE_URI=mysql+pymysql://root:p@mysql-container:3306/basic_demo
29
+ # APILOGICPROJECT_SQLALCHEMY_DATABASE_URI_AUTHENTICATION=mysql+pymysql://root:p@mysql-container:3306/authdb
30
+
31
+ # APILOGICPROJECT_SECURITY_ENABLED=false
32
+ # APILOGICPROJECT_KEYCLOAK_REALM=kcals
33
+ # APILOGICPROJECT_KEYCLOAK_BASE=http://localhost:8080//realms/kcals
34
+ # APILOGICPROJECT_KEYCLOAK_BASE_URL=http://localhost:8080
35
+ # APILOGICPROJECT_KEYCLOAK_CLIENT_ID=alsclient
36
+
37
+ # required if you are not running from venv or docker apilogicserver/api_logic_server
38
+ # APILOGICPROJECT_APILOGICSERVERHOME=src/ApiLogicServer-src
39
+
40
+ # whether to invoke dbinit befoce connecting...
41
+ # APILOGICSERVER_ORACLE_THICK=~/Downloads/instantclient_19_16
42
+
43
+ # enables aggregate defaulting, and defaulting for all numerics and strings
44
+ # used to initialize rows prior to logic, to avoid excessive None testing
45
+ # AGGREGATE_DEFAULTS=True
46
+ # ALL_DEFAULTS=True
47
+
48
+ APILOGICPROJECT_VERBOSE=True
49
+
50
+ # APILOGICPROJECT_LOG_CONFIG=
51
+ # name of log.yml file (eg, config/logging_prod.yml)
52
+
53
+ # APILOGICPROJECT_STOP_OK=FALSE
54
+ # dev only - enable stop url: http://localhost:5656/stop?msg=reason
55
+
@@ -1,4 +1,16 @@
1
- Use these directories to rapidly deploy your system to the cloud. This means you can provide a preview of [working software](https://apilogicserver.github.io/Docs/Working-Software-Now/) for your team:
1
+ ## Using the standard container
2
+
3
+ There are many, many ways of using docker.
4
+
5
+ 1. You can use the existing apilogicserver/api_logic_server container as shown in `devops/docker-standard-image`.
6
+
7
+ 2. Or, you can create your own container, as described in the next section.
8
+
9
+ &nbsp;
10
+
11
+ ## Creating per-project containers
12
+
13
+ Use these directories to deploy your system to the cloud. This means you can provide a preview of [working software](https://apilogicserver.github.io/Docs/Working-Software-Now/) for your team:
2
14
 
3
15
  * **Developers** can use the API to begin custom User Interface development
4
16
 
@@ -1,6 +1,9 @@
1
- ### Add Natural Languate Logic to Your Project
1
+ ### Add Natural Language Logic to Your Project
2
2
 
3
- You can add Natural Language logic files to this directory, e.g., `check_credit.prompt`.
3
+ You can add Natural Language logic files to this directory, e.g. in `genai_demo/docs/logic`:
4
+
5
+ * `valid_names.prompt`: Customer and Product Names cannot be 'x'
6
+ * `valid_currency.prompt`: Customer credit limits cannot be negative; Product prices must be positive.
4
7
 
5
8
  Then, use GenAI to create executable logic in your `logic/logic_discovery` directory, e.g.,
6
9
 
@@ -13,3 +16,4 @@ Notes:
13
16
  1. Ensure derived attributes exist in the data model (see [Database Design Changes](https://apilogicserver.github.io/Docs/Database-Changes/))
14
17
  2. Be sure to initialize such attributes in your database
15
18
  3. For more information, [click here](https://apilogicserver.github.io/Docs/WebGenAI-CLI/#add-logic-to-existing-projects)
19
+ 4. Consider renaming your logic files afterward (`valid_names.z-prompt`)so they are skipped on future runs
@@ -10,6 +10,14 @@ This describes how to use Logic; for more information, [see here](https://apilog
10
10
 
11
11
  &nbsp;
12
12
 
13
+ ## Natural Language vs. IDE
14
+
15
+ If you are using WebGenAI, you can specify rules in Natural Language. You can also augment them in the IDE using code completion. There are some important usage guidelines.
16
+
17
+ > You should generally not alter any files in the `wg_rules` directory. For more information, see [WebGenAI](https://apilogicserver.github.io/Docs/WebGenAI/), and [WebGenAI Logic](https://apilogicserver.github.io/Docs/WebGenAI-CLI.md#natural-language-logic).
18
+
19
+ &nbsp;
20
+
13
21
  ## Examples
14
22
  Examples from tutorial project:
15
23
  * Examples drawn from [tutorial project](https://github.com/ApiLogicServer/demo/blob/main/logic/declare_logic.py)
@@ -33,7 +33,9 @@ class Roles():
33
33
  read_only = "readonly"
34
34
  admin = "CS_ADMIN"
35
35
  public="public" # p1/p (no roles, but gets public)
36
+ sa="sa"
36
37
 
38
+ DefaultRolePermission(to_role=Roles.sa, can_read=True, can_update=True, can_insert=True, can_delete=True)
37
39
  DefaultRolePermission(to_role=Roles.tenant, can_read=True, can_delete=True)
38
40
  DefaultRolePermission(to_role=Roles.admin, can_read=True, can_insert=True,can_update=True, can_delete=True)
39
41
  DefaultRolePermission(to_role=Roles.manager, can_read=True, can_insert=True,can_update=True, can_delete=False)
@@ -46,13 +46,13 @@ def declare_logic():
46
46
  Rule.sum(derive=Order.amount_total, as_sum_of=Item.amount)
47
47
 
48
48
  def derive_amount(row: models.Item, old_row: models.Item, logic_row: LogicRow):
49
- amount = row.Quantity * row.UnitPrice
50
- if row.Product.CarbonNeutral == True and row.Quantity >= 10:
49
+ amount = row.quantity * row.unit_price
50
+ if row.product.carbon_neutral == True and row.quantity >= 10:
51
51
  amount = amount * Decimal(0.9) # breakpoint here
52
52
  return amount
53
53
 
54
54
  # Items.Amount = Quantity * UnitPrice with discount for CarbonNeutral products.
55
- Rule.formula(derive=models.Item.Amount,
55
+ Rule.formula(derive=models.Item.amount,
56
56
  calling=derive_amount)
57
57
 
58
58
  # Item.unit_price is copied from Product.unit_price.
@@ -9,8 +9,7 @@
9
9
  "workbench.editorAssociations": {
10
10
  "*.md": "vscode.markdown.preview.editor"
11
11
  },
12
- "workbench.colorTheme": "Arduino",
13
- "workbench.preferredHighContrastLightColorTheme": "Arduino",
14
- "workbench.preferredLightColorTheme": "Arduino"
12
+ "workbench.colorTheme": "Office Theme (Publisher)",
13
+ "workbench.preferredLightColorTheme": "Office Theme (Publisher)"
15
14
  }
16
15
  }
@@ -14,7 +14,7 @@ Use case: Check Credit
14
14
  Use case: App Integration
15
15
  1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.
16
16
 
17
- Ensure each customer has a unique name.
17
+ Ensure each customer and product has a unique name.
18
18
 
19
19
  Ensure each Item quantity is not null.
20
20
 
@@ -2,8 +2,6 @@ Create a system with customers, orders, items and products.
2
2
 
3
3
  Include a notes field for orders.
4
4
 
5
- Use LogicBank to enforce business logic.
6
-
7
5
  Use case: Check Credit
8
6
  1. Customer.balance <= credit_limit
9
7
  2. Customer.balance = Sum(Order.amount_total where date_shipped is null)
@@ -2,8 +2,6 @@ Create a system with customers, orders, items and products.
2
2
 
3
3
  Include a notes field for orders.
4
4
 
5
- Use LogicBank to enforce business logic.
6
-
7
5
  Use case: Check Credit
8
6
  1. The Customer's balance is less than the credit limit
9
7
  2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
@@ -0,0 +1,10 @@
1
+ # Run WebGenAI locally from docker container
2
+
3
+ # Before running, update ./system/genai/webg_local/webg_config/web_genai.txt
4
+ # See: https://apilogicserver.github.io/Docs/WebGenAI-CLI/#configuration
5
+
6
+ # cd <manager>
7
+ # sh system/genai/webg_local/run_web_genai.sh
8
+ # Find projects at: system/genai/webg_local/webg_projects/by-ulid
9
+
10
+ docker run -it --rm --name webgenie -p 8282:80 --env-file ./system/genai/webg_local/webg_config/web_genai.txt -v ./system/genai/webg_local/webg_temp:/tmp -v ./system/genai/webg_local/webg_projects:/opt/projects apilogicserver/web_genai
@@ -0,0 +1,8 @@
1
+ # App configuration
2
+ APILOGICPROJECT_EXTERNAL_PORT=8282
3
+ APILOGICPROJECT_PORT=5657
4
+ APILOGICSERVER_CHATGPT_APIKEY=sk-proj-< your api key >
5
+
6
+ # WebGenAI security configuration
7
+ # login password for the admin user
8
+ # ADMIN_PASSWORD=password
@@ -360,8 +360,8 @@ class ModelClass(Model):
360
360
  camel-case and singlularize, with provisions for reserved word (Date) and collisions (Dates & _Dates)
361
361
  """
362
362
  tablename = cls._convert_to_valid_identifier(tablename)
363
- if tablename in ["Dates"]: # ApiLogicServer
364
- tablename = tablename + "Classs"
363
+ if tablename in ["Dates", "dates", "Column", "column"]: # ApiLogicServer
364
+ tablename = tablename + "Cls"
365
365
  camel_case_name = ''.join(part[:1].upper() + part[1:] for part in tablename.split('_'))
366
366
  if camel_case_name in ["Dates"]:
367
367
  camel_case_name = camel_case_name + "_Classs"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ApiLogicServer
3
- Version: 14.3.11
3
+ Version: 14.3.14
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/
@@ -1,7 +1,7 @@
1
1
  api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- api_logic_server_cli/api_logic_server.py,sha256=ugtA9gONRKOxXgwLL_JSx5nSEUJg7XUsuE7LbB6JaOg,113773
3
- api_logic_server_cli/api_logic_server_info.yaml,sha256=B3p_TJirI-BMqwyD5rULFQ4sJS1nd_xkP1M6k9SXuUw,108
4
- api_logic_server_cli/cli.py,sha256=IIz3frEJiZSi1q0HtRxLl7i-R4ABhPDqlBa7LTI6vcw,80765
2
+ api_logic_server_cli/api_logic_server.py,sha256=Kz5-fZRLHGXfh3ywAX1drmihsm5k0yKEtdXiPgPxyOA,113936
3
+ api_logic_server_cli/api_logic_server_info.yaml,sha256=WU6oSE-ugtlDCfMuVqRfri9PNBgGXefZr-YQgq3MHLc,125
4
+ api_logic_server_cli/cli.py,sha256=t4jyVgA1OoO2AXbgwdQP3I_ZJS1A-ZirFl18e4VU3co,80766
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
@@ -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=TDNj_xZu8dpfTeYTPxUi-J4zyNPNifUz-YfWLmOjm_E,68547
29
+ api_logic_server_cli/create_from_model/__pycache__/ont_build.cpython-312.pyc,sha256=PtUuxzrSRLwxSvD3LG5B3W9Yb-YwqVeExtST59Skj8M,69030
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,10 +471,11 @@ 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=PMBdcKAMXbmM7mdl6QB-_60dY6QiNXP8mVwhBEA0Zfg,59523
474
+ api_logic_server_cli/genai/genai.py,sha256=ue5gElZS22d3Ro8ECw9PrPhu3o5OKUvf47gkJqDvKBc,44247
475
+ api_logic_server_cli/genai/genai_fatal_excp.py,sha256=1FmDVcXVRqmG0JMVZ7l4KqMOdpff3KGZ2LPAGtw304Q,179
475
476
  api_logic_server_cli/genai/genai_logic_builder.py,sha256=VkgOG0s17sdt-ElQmfTRuMCUnQLtxtyaH8Qfr0x1TrE,23552
476
- api_logic_server_cli/genai/genai_svcs.py,sha256=1J1LyzLpcjEBLYPsdqYzqR_6HvS5A69olD4v9B9fbYE,45989
477
- api_logic_server_cli/genai/genai_utils.py,sha256=DKhIb0P-7Ps1a1jIXyDOlTT8DwXn4-c7LRrV83GgnC8,17128
477
+ api_logic_server_cli/genai/genai_svcs.py,sha256=OEeecUl0erraodfn-P9ICzdTLyewXOVl42PZpI31QEA,46698
478
+ api_logic_server_cli/genai/genai_utils.py,sha256=DTlWTnW5_2pzX4q1VG1tWqoZPVObDHR97SVe0z8Z3rs,17102
478
479
  api_logic_server_cli/genai/json2rules.py,sha256=ykoxxgZgqllzt8Ud06S-R_3QtumxXfmF5ksYC0Hh2Sk,2645
479
480
  api_logic_server_cli/model_migrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
480
481
  api_logic_server_cli/model_migrator/gen_behave_tests.py,sha256=2EOPlY2up_kv80LCRvxOiV-PxHW_Muq6IW8p1AwFpVU,9491
@@ -508,7 +509,7 @@ api_logic_server_cli/prototypes/allocation/logic/declare_logic.py,sha256=Wqk1kpu
508
509
  api_logic_server_cli/prototypes/allocation/test/test.sh,sha256=ndw_D7IOFTEUZxbcOL5Y-spvF8pJCe8OOSroqBfjXPM,645
509
510
  api_logic_server_cli/prototypes/base/.DS_Store,sha256=xMhewDC6Svrxt7lCSkNtbYvtSyWxUMSTtAAlVdI8XJI,6148
510
511
  api_logic_server_cli/prototypes/base/.gitignore,sha256=PAO98cVvjgAL_mvXCMS_Vfk7bT2Vd1-j9a8_nB2qxqs,190
511
- api_logic_server_cli/prototypes/base/api_logic_server_run.py,sha256=Rn-XM_ttIHsOQOABvlwUOppHPy8q6atyg_IzuJtZkNQ,6532
512
+ api_logic_server_cli/prototypes/base/api_logic_server_run.py,sha256=LgPBLuITuoH2Q51m1l5mtBQFsw68FtrjLyte4P6dUCY,6568
512
513
  api_logic_server_cli/prototypes/base/readme.md,sha256=CtWAiMpRfJiA83y90RYVLQ_E1Mntya7Xd8SWcsaHWBc,11710
513
514
  api_logic_server_cli/prototypes/base/requirements.txt,sha256=we6X5fRBJVqN8SacwV7oPDtGk5IAiNbUDbUwCGHkCrc,107
514
515
  api_logic_server_cli/prototypes/base/run.ps1,sha256=lrZgw8SEntPam3ZYKVzsRo7rOKSGWqgO7qUNJ3CbP44,801
@@ -527,7 +528,7 @@ api_logic_server_cli/prototypes/base/.vscode/launch.json,sha256=5sR621KUgIhwTdxl
527
528
  api_logic_server_cli/prototypes/base/.vscode/settings.json,sha256=vS3gt0PpFbZ3fdGeiVGaE4v9PyRydjrrdGWb27w9UUo,470
528
529
  api_logic_server_cli/prototypes/base/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
529
530
  api_logic_server_cli/prototypes/base/api/customize_api.py,sha256=-_eoaIukB4v1dF1TXTOqRRyU_nLbXXEhphI43GPtdoI,2236
530
- api_logic_server_cli/prototypes/base/api/expose_api_models.py,sha256=s2H8_e0_E5S7xHvU6fMcPcrNJN4r4t7iQ98pp1fobeI,1832
531
+ api_logic_server_cli/prototypes/base/api/expose_api_models.py,sha256=17ql1DgNFnnclE8NM1GDCgm7umdI8nGbRuoR-v7bWGM,1827
531
532
  api_logic_server_cli/prototypes/base/api/json_encoder.py,sha256=3EFDSi9jdaS4jSOs5EwyltWwTy-8QEoBN2afYknpCdQ,521
532
533
  api_logic_server_cli/prototypes/base/api/readme_customize_api.md,sha256=AEeBybDsXSDr2IlqGZCo17ZModZnrflAOCx2a6gP_rE,4165
533
534
  api_logic_server_cli/prototypes/base/api/api_discovery/auto_discovery.py,sha256=y6uQ_i9t8qqmjsM69rZzzp2q3OaAbSrwlfeRIrR_sRY,1099
@@ -537,7 +538,7 @@ api_logic_server_cli/prototypes/base/api/api_discovery/ontimize_api.py,sha256=_g
537
538
  api_logic_server_cli/prototypes/base/api/api_discovery/system.py,sha256=Cv4qtnEG5s6vtk2alHmPAvwKlbtlHsd3Ugse_YKIk7Q,3345
538
539
  api_logic_server_cli/prototypes/base/api/system/api_utils.py,sha256=cCwujmQRE3gb6756GAVlypx7r30eH_-aZzo-hi3BNTU,5812
539
540
  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=4kPnwihBTP-APE5xQ8_5M9lK8cd_z6z783GFY47-8eM,28008
541
+ api_logic_server_cli/prototypes/base/api/system/expression_parser.py,sha256=PXvmRmPte2bY00GvwnTYwp819e3q8dtk95Ns5IVHVbo,28035
541
542
  api_logic_server_cli/prototypes/base/api/system/gen_csv_report.py,sha256=GDAFJV3v1phmjLDE-vfvp8jgZnu2R6sTdQ6UWgdk64c,1410
542
543
  api_logic_server_cli/prototypes/base/api/system/gen_pdf_report.py,sha256=gOe5mSYbh17q94UDh_YQI4qUr7jjck7UfnTNe7CEXhA,8783
543
544
  api_logic_server_cli/prototypes/base/api/system/opt_locking/opt_locking.py,sha256=ib-hb-ZLZ7P7XbyQ08teUKM_p-5WMAmo0Cyjao2GA9o,6432
@@ -571,7 +572,7 @@ api_logic_server_cli/prototypes/base/database/test_data/readme.md,sha256=T_uBlZt
571
572
  api_logic_server_cli/prototypes/base/database/test_data/response2code.py,sha256=PTeAXHU-r6r0EBknSGXnbkdySAAzch_3gOuRlyUyVF8,4414
572
573
  api_logic_server_cli/prototypes/base/database/test_data/test_data_preamble.py,sha256=zmGdhH-Lm_BLeTkDSAb_7jQd4OD10LivzEOisdHT_fU,2892
573
574
  api_logic_server_cli/prototypes/base/devops/.DS_Store,sha256=Cy2EHccNO2W84kaA9RvGJWq3tlZOj1YR7XYzgFTXIvg,6148
574
- api_logic_server_cli/prototypes/base/devops/readme-devops.md,sha256=BgR3H0qb4Nm6OBVG4tze0aWKpUBpNsVGylHke0QV7vA,1035
575
+ api_logic_server_cli/prototypes/base/devops/readme-devops.md,sha256=KxoCpgjKN3U8GZ48VF1yH2hF_i2kC7QViZacgP4iN8s,1340
575
576
  api_logic_server_cli/prototypes/base/devops/auth-db/authdb_mysql.Dockerfile,sha256=FIdVnGfT5DDW-OyEjARpoYr3Gm33s_gbFVrnjNU_rpg,2604
576
577
  api_logic_server_cli/prototypes/base/devops/auth-db/authdb_mysql.sql,sha256=1S-QufT8KK0IlUqzu02g-yFLmav3rPgPXukBz0sCgNw,3648
577
578
  api_logic_server_cli/prototypes/base/devops/auth-db/authdb_postgres.sql,sha256=RBYP5uT1acvn0O1n8veRVDb8m3mA3Y-ifNvA1kVY2ho,1246
@@ -592,8 +593,10 @@ api_logic_server_cli/prototypes/base/devops/docker-compose-dev-local-nginx/unuse
592
593
  api_logic_server_cli/prototypes/base/devops/docker-compose-dev-local-nginx/unused/unused-requirements-slim.txt,sha256=tbSwU7qdwcp_5ILWgEcLLeS7frnLkLif9Gyf5r3Ou-E,14
593
594
  api_logic_server_cli/prototypes/base/devops/docker-image/build_image.dockerfile,sha256=RVvOirRyqEloaZHgByW2_ux9ajL2ixRdEpc14JJHyg0,647
594
595
  api_logic_server_cli/prototypes/base/devops/docker-image/build_image.sh,sha256=3PTPAr8cwYtxMgLYExzpXHZ-fiOY4EEp_7B7qhKtdbs,2025
595
- api_logic_server_cli/prototypes/base/devops/docker-image/env.list,sha256=cSp4UlVVZdbuGOaMHcZP9a3Kws92fWSnQvDyae01Q4M,2243
596
+ api_logic_server_cli/prototypes/base/devops/docker-image/env.list,sha256=RNFOENsRVvvj-Y_QYCrtbP4N1Jmufj6OKXx4bq8B7cc,3431
596
597
  api_logic_server_cli/prototypes/base/devops/docker-image/run_image.sh,sha256=D94avWpEftzC6nIoWHtjJPmIkTQtckc69ulSIsqbGiY,1176
598
+ api_logic_server_cli/prototypes/base/devops/docker-standard-image/docker-compose-standard-image.yml,sha256=D2gHgYB16U4_ebcg7i4AZHj2AJ9j1e6kq8Ulw-cmIqM,976
599
+ api_logic_server_cli/prototypes/base/devops/docker-standard-image/env.list,sha256=NqtUvek7VKp-g5l8WVNFZTzWIHeYiAnSL53boiK8k8w,2165
597
600
  api_logic_server_cli/prototypes/base/devops/keycloak/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
598
601
  api_logic_server_cli/prototypes/base/devops/keycloak/docker-compose-dev-network.yml,sha256=19HvUXnEczbOi2dMSlVY9aqaHzeFiZ30f2gBZ9fxelE,1090
599
602
  api_logic_server_cli/prototypes/base/devops/keycloak/docker-compose-nginx.yml,sha256=iWTFHcjxWCRHtotuDsoR2w7sUNug0LOclMh5JjGwSFc,1676
@@ -617,7 +620,7 @@ api_logic_server_cli/prototypes/base/devops/keycloak/nginx/nginx.conf,sha256=nsp
617
620
  api_logic_server_cli/prototypes/base/devops/keycloak/unused/auth_provider.py,sha256=e8PoH9Ck4nrMe-QY99Lh0G02gzn2ubnMauFVEpNbeQ8,2771
618
621
  api_logic_server_cli/prototypes/base/devops/keycloak/unused/unused-docker-compose-keycloak.sh,sha256=YvYRD4ID8v7znslXKOlzu3hpN17h0O_zwGPkFYy1G20,353
619
622
  api_logic_server_cli/prototypes/base/devops/python-anywhere/python_anywhere_wsgi.py,sha256=xs3ZT1gg8C4tMzUW6OfOzV8dXHtUW5KVJdyyEbooPFs,3820
620
- api_logic_server_cli/prototypes/base/docs/logic/readme.md,sha256=s0s5FIF0TVPfinEPdNNSUy9f2HJwGQQdJ1h3xrJm3lA,590
623
+ api_logic_server_cli/prototypes/base/docs/logic/readme.md,sha256=fIQypEQ7Ny7q385AhpwndYRBFquG6P6xpM41-zrIseE,871
621
624
  api_logic_server_cli/prototypes/base/docs/logic_suggestions/readme_logic_suggestions.md,sha256=44ibQYGOy84J4zGFaChLCOf-GU9pOBrbgBbprujMtIs,184
622
625
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_consumer.py,sha256=2DOsFpYnsJ71gZzzfJweEmL-i99uCtEFU0hVwIKFGMw,1516
623
626
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py,sha256=nza_seZJhI7OSnaIXgOGmLv68NrPojt7_uvE7_2agDU,4131
@@ -630,13 +633,13 @@ api_logic_server_cli/prototypes/base/integration/system/FlaskKafka.py,sha256=_Us
630
633
  api_logic_server_cli/prototypes/base/integration/system/RowDictMapper.py,sha256=DSdmeAQZZ_wUWHHiSS_6ZgeTKIuEycNlgX140l3fnSE,19986
631
634
  api_logic_server_cli/prototypes/base/logic/declare_logic.py,sha256=vglpAfVRM3QONLDbWIXcZrXTSttO8vUpwLbSJ51Fmw0,3290
632
635
  api_logic_server_cli/prototypes/base/logic/load_verify_rules.py,sha256=dYEb-UxqQ5N08ry22I04vtFy8JtQe2pL7Jw8gR8nGu4,7742
633
- api_logic_server_cli/prototypes/base/logic/readme_declare_logic.md,sha256=CFC13f9Z4rTkNiRoJTBEz3A2F_yRThOj-HrHDsSdKsw,6630
636
+ api_logic_server_cli/prototypes/base/logic/readme_declare_logic.md,sha256=ZC1a0e_tob6UNXcoPGgYEf_BPUlwpdD-bYwtNPUeORQ,7105
634
637
  api_logic_server_cli/prototypes/base/logic/logic_discovery/auto_discovery.py,sha256=m97W6DYi6ouTDuFCiU1rPq1UqzJuNnVePyOeLU33D1s,2645
635
638
  api_logic_server_cli/prototypes/base/logic/logic_discovery/__pycache__/__init__.cpython-312.pyc,sha256=5--1medTaKN83y-D_iv9EPiLD2uja_Q0r5ZkxX_pJM4,199
636
639
  api_logic_server_cli/prototypes/base/logic/logic_discovery/__pycache__/auto_discovery.cpython-312.pyc,sha256=OHyWfpKrY0UbeSEwBnxsiIHPgpjzDSpCoyIa6ha4NVk,1579
637
640
  api_logic_server_cli/prototypes/base/logic/logic_discovery/__pycache__/error_testing.cpython-312.pyc,sha256=NQKJ0pHsE53Nwmob8c03X_vkSV-MP_mj-1VFmJ3kRs0,2225
638
641
  api_logic_server_cli/prototypes/base/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
639
- api_logic_server_cli/prototypes/base/security/declare_security.py,sha256=6EGMOOiJ4GgCboqC38-tvIFTSRnrtHSiKS7wt18kvko,1828
642
+ api_logic_server_cli/prototypes/base/security/declare_security.py,sha256=RRRvRMRR6_EsM61VbkWA-D99rNSaQTByTI06eOzRtao,1946
640
643
  api_logic_server_cli/prototypes/base/security/authentication_provider/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
641
644
  api_logic_server_cli/prototypes/base/security/authentication_provider/abstract_authentication_provider.py,sha256=RPPA48kdYiXx5zQ6epbfAEB1se8E10Ra9NxYRjIBShk,895
642
645
  api_logic_server_cli/prototypes/base/security/authentication_provider/keycloak/auth_provider.py,sha256=7z2aY7BAcy31EiGbmvGgSRLjQOooU1bM3g-bbyxdOac,10433
@@ -734,7 +737,7 @@ api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/OrderB2B.py
734
737
  api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/OrderShipping.py,sha256=4wM45eRNkDNl7vcX689VSR7BgdKvae5hD26L8XZYGfc,1197
735
738
  api_logic_server_cli/prototypes/genai_demo/integration/row_dict_maps/row_dict_maps_readme.md,sha256=5tOPwErjkcCQONrNcaGsttEwybxCIq-5j45dkOcDh1Q,206
736
739
  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
740
+ api_logic_server_cli/prototypes/genai_demo/logic/declare_logic.py,sha256=gP4_Zr2nM8qXmmrCwtSM6D2ITZkLvwanBQhIo9UNiuo,4932
738
741
  api_logic_server_cli/prototypes/genai_demo/logic/load_verify_rules.py,sha256=TWqzJ_KWX_QvpxWQv4ujqc487W1P9ZglrciSLor_NHA,7681
739
742
  api_logic_server_cli/prototypes/genai_demo/logic/readme_declare_logic.md,sha256=CFC13f9Z4rTkNiRoJTBEz3A2F_yRThOj-HrHDsSdKsw,6630
740
743
  api_logic_server_cli/prototypes/genai_demo/logic/__pycache__/declare_logic.cpython-312.pyc,sha256=heB0NPW04Ede5hY4x-lF8_Hj2TtfYSQrBSEaDOUEiuw,6990
@@ -755,7 +758,7 @@ api_logic_server_cli/prototypes/manager/.vscode/ApiLogicServer.code-workspace,sh
755
758
  api_logic_server_cli/prototypes/manager/.vscode/launch.json,sha256=UMyprDcKb7bWjhTVaTFLW1l_1WYoTCg9JMzAIt5F0Z8,32527
756
759
  api_logic_server_cli/prototypes/manager/.vscode/settings.json,sha256=wQgpFvviPbZCmsf02UgrJSGAz7g3i4chDZ_AdSIOr5Y,625
757
760
  api_logic_server_cli/prototypes/manager/system/.DS_Store,sha256=r4gY37tWmhc60MVHeHWD-ZbqQBPlXqcC7xX2NhV42AA,6148
758
- api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace,sha256=19Acdi2ZvX5U_IMokLiVaKkIMwsSxgbw5YjaRMpBAAI,333
761
+ api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace,sha256=EqvNleSV4PRL_tJIYy8gC0TKc0S2x3h3Vxba5QGyN4c,304
759
762
  api_logic_server_cli/prototypes/manager/system/style-guide.yaml,sha256=tgMp7e2IbOys7nymIM9onv65P0G2SIBJSe1qa-rRBtA,676
760
763
  api_logic_server_cli/prototypes/manager/system/app_model_editor/.gitignore,sha256=07msA6EiXJT_unwoat2B8vI6ANcIn9E-ntgIpQZj7g0,477
761
764
  api_logic_server_cli/prototypes/manager/system/app_model_editor/api_logic_server_run.py,sha256=vf9Jc2vAz5npI6pD4kLNNdFTkqK8rO4erA03-k_mkcY,6363
@@ -1214,11 +1217,11 @@ api_logic_server_cli/prototypes/manager/system/genai/examples/emp_depts/emp_dept
1214
1217
  api_logic_server_cli/prototypes/manager/system/genai/examples/emp_depts/logic_notes.md,sha256=mrEBKE1OQxEqFoRLD1zYL-SeC5ITPcWEZKaumRDw7U4,100
1215
1218
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/.DS_Store,sha256=zQYgpeXOUqrfba9eGY89I8y4TzyXt6KeFI8mi4jUJFk,6148
1216
1219
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/create_db_models.py,sha256=QyGtjgsuYkVF5UYOn35V8ZnAdI76s-1KyM7nnGM4lPI,3588
1217
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt,sha256=OwdxIKDO60meoYFLuA4b2W3727npv5g7gp6xdSoVa-A,771
1220
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.prompt,sha256=TTeQkOzxrA-HSrJtJ1FuEM9CsECZ2hiz4lDZLJQWhtw,783
1218
1221
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo.response_example,sha256=AW8V5VmeSEfGMPsTDYY77kIWqlnZ9-rpk-7OfboBiwM,8755
1219
1222
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_fixup_required.json,sha256=b7SO0wkrV7DxIkW2UxmEF07wXONMwzC4UOw1ZG2cvAw,9670
1220
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_formal.prompt,sha256=V8QdPiytwb1jqWeo6fZvaoPE5OkPTJZ2KsKrvo17f7k,432
1221
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt,sha256=OwdxIKDO60meoYFLuA4b2W3727npv5g7gp6xdSoVa-A,771
1223
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_formal.prompt,sha256=k5U0obVyjLfD2kzqiFHF6FyucTCa47BEo6gdQJp3e34,390
1224
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal.prompt,sha256=u8MO_zBIDDqcx33cnBE8zjMUvkom_hJHFOb-vHVR6NA,729
1222
1225
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_informal_rules_only.prompt,sha256=rR-ZCr3knseA9ButjkZ80hxhy-Rxw5FbvVEbEXImo58,521
1223
1226
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_no_logic.prompt,sha256=IIsO4mxLpKccSoIE1dMNsQQ2efhhCpFnAcoGtbcHv50,95
1224
1227
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/__pycache__/create_db_models.cpython-312.pyc,sha256=GuOEED9cvP4Q9M73S2zAdHybuhe8W36kb1j5HRZb5YU,5578
@@ -5888,6 +5891,15 @@ api_logic_server_cli/prototypes/manager/system/genai/temp/$notes.txt,sha256=FMmb
5888
5891
  api_logic_server_cli/prototypes/manager/system/genai/temp/chatgpt_original.response,sha256=pXPPj8lg0nJ82YGDu4Yrj9yVMUiSDptvjiudkNoB2ac,4628
5889
5892
  api_logic_server_cli/prototypes/manager/system/genai/temp/chatgpt_retry.response,sha256=pXPPj8lg0nJ82YGDu4Yrj9yVMUiSDptvjiudkNoB2ac,4628
5890
5893
  api_logic_server_cli/prototypes/manager/system/genai/temp/create_db_models.py,sha256=-OZ9PHKd0Igvt-VDV26HbkjLX8t-ozAScP-CNjNyf-4,3581
5894
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/.DS_Store,sha256=XYdFi4HKsh2uAbbSX1lGyTufnlYykTWjfRpwpcLV69Y,8196
5895
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/run_web_genai.sh,sha256=YoqH3HlgOWQjjOewpJKCD7vr6Z7AAA33B3p_wgZ5-QI,562
5896
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/.DS_Store,sha256=Bmp6az8vHo25tJ7g4hYMKYhYjcc-cNEc9CE22BUL__E,6148
5897
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/by-ulid/.DS_Store,sha256=oDv5WcRzbU9xt2tdH5TzzS8jjkCNJl1zexqxLVquXVk,6148
5898
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/public/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
5899
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-projects/wgadmin/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
5900
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg-temp/.DS_Store,sha256=CPykieh8Ma-zQAP23vf2cE3ermOFzN96bktWzPJzH_w,10244
5901
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg_config/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
5902
+ api_logic_server_cli/prototypes/manager/system/genai/webg_local/webg_config/web_genai.txt,sha256=2f9M2V8aKFrrv8idloh_bxR_ldt8tkSOcZD2PlMeqFU,232
5891
5903
  api_logic_server_cli/prototypes/manager/system/images/copilot-clean.png,sha256=R3coCCU40UIg55fqQVAoOviiX1ERcyGqrd_EYHo6Oac,597600
5892
5904
  api_logic_server_cli/prototypes/manager/system/images/copilot.png,sha256=N8WsgqwOLD3DxkmQvpnLxx7KbMirXViUgNgumg-lbIA,1175570
5893
5905
  api_logic_server_cli/prototypes/manager/system/images/genai.png,sha256=jqC_qRwR6Y3DIfWaYnLPWKn1KF1UUezEnMeRpvRwv5s,117507
@@ -6228,7 +6240,7 @@ api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/setup.py,sha256=ekn0wq_leWE
6228
6240
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/tox.ini,sha256=mVlmM_uI-7K4pLs-jBfu8ZOQpHwQj8fh7LogvwjXJyE,440
6229
6241
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/__pycache__/__init__.cpython-312.pyc,sha256=TCTs9PqY75qnKtNXXWS41XVG_wGzHyRQ2eA3IWNY-Ss,237
6230
6242
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6231
- api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py,sha256=p3MnTFVGE7vIzE2DqfWvoG43tJE9frkXjzODXA9UQeE,77486
6243
+ api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py,sha256=DpymzpfQJiW-x6E63wZ-cxfft3BsmwVOraTZA95Ks40,77512
6232
6244
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/main.py,sha256=_kSzjbpJRgQURKP391SdIjYJOzBuyADEIP0qSSu8Nv0,3252
6233
6245
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__pycache__/__init__.cpython-312.pyc,sha256=KHmbHH1vUKhS8pIGx1wyXxO6iwO9X3znNZROjYUzTnI,249
6234
6246
  api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__pycache__/codegen.cpython-312.pyc,sha256=4hnUU0c1-SbhvP6ElD5usSEzhc2UJCxdct0jC9iz7d0,81261
@@ -6264,9 +6276,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
6264
6276
  api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
6265
6277
  api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
6266
6278
  api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
6267
- ApiLogicServer-14.3.11.dist-info/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
6268
- ApiLogicServer-14.3.11.dist-info/METADATA,sha256=jjQkv_uYPcSfjC-ClPq1xjx2_vRgEK9VYrT-506rwe0,6447
6269
- ApiLogicServer-14.3.11.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
6270
- ApiLogicServer-14.3.11.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
6271
- ApiLogicServer-14.3.11.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
6272
- ApiLogicServer-14.3.11.dist-info/RECORD,,
6279
+ apilogicserver-14.3.14.dist-info/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
6280
+ apilogicserver-14.3.14.dist-info/METADATA,sha256=d4RHqiI5jboiE2yCOxqbZoHTAKDYvedMwyZlkGunnQs,6447
6281
+ apilogicserver-14.3.14.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
6282
+ apilogicserver-14.3.14.dist-info/entry_points.txt,sha256=KiLloZJ3c_RW-nIDqBtoE0WEsQTnZ3dELwHLWi23LMA,103
6283
+ apilogicserver-14.3.14.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
6284
+ apilogicserver-14.3.14.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5