jaaql-middleware-python 4.23.1__tar.gz → 4.23.2__tar.gz

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 (75) hide show
  1. {jaaql-middleware-python-4.23.1/jaaql_middleware_python.egg-info → jaaql-middleware-python-4.23.2}/PKG-INFO +1 -1
  2. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/constants.py +1 -1
  3. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/exceptions/jaaql_interpretable_handled_errors.py +1 -1
  4. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/interpreter/interpret_jaaql.py +29 -10
  5. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/exception_queries.py +1 -1
  6. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/generated_queries.py +1 -1
  7. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/01.install_domains.generated.sql +1 -1
  8. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2/jaaql_middleware_python.egg-info}/PKG-INFO +1 -1
  9. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/LICENSE.txt +0 -0
  10. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/README.md +0 -0
  11. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/__init__.py +0 -0
  12. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/config/__init__.py +0 -0
  13. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/config/config-docker.ini +0 -0
  14. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/config/config-test.ini +0 -0
  15. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/config/config.ini +0 -0
  16. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/config_constants.py +0 -0
  17. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/db/__init__.py +0 -0
  18. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/db/db_interface.py +0 -0
  19. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/db/db_pg_interface.py +0 -0
  20. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/db/db_utils.py +0 -0
  21. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/db/db_utils_no_circ.py +0 -0
  22. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/documentation/__init__.py +0 -0
  23. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/documentation/documentation_internal.py +0 -0
  24. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/documentation/documentation_public.py +0 -0
  25. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/documentation/documentation_shared.py +0 -0
  26. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/email/__init__.py +0 -0
  27. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/email/email_manager.py +0 -0
  28. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/email/email_manager_service.py +0 -0
  29. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/email/patch_ems.py +0 -0
  30. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/exceptions/__init__.py +0 -0
  31. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/exceptions/custom_http_status.py +0 -0
  32. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/exceptions/http_status_exception.py +0 -0
  33. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/exceptions/not_yet_implement_exception.py +0 -0
  34. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/generated_constants.py +0 -0
  35. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/interpreter/__init__.py +0 -0
  36. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/jaaql.py +0 -0
  37. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/migrations/__init__.py +0 -0
  38. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/migrations/migration_history.sql +0 -0
  39. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/migrations/migrations.py +0 -0
  40. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/__init__.py +0 -0
  41. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/base_controller.py +0 -0
  42. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/base_model.py +0 -0
  43. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/controller.py +0 -0
  44. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/controller_interface.py +0 -0
  45. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/handmade_queries.py +0 -0
  46. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/model.py +0 -0
  47. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/model_interface.py +0 -0
  48. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/mvc/response.py +0 -0
  49. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/openapi/__init__.py +0 -0
  50. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/openapi/swagger_documentation.py +0 -0
  51. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/patch.py +0 -0
  52. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/02.install_super_user.exceptions.sql +0 -0
  53. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/03.install_super_user.handwritten.sql +0 -0
  54. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/04.install_jaaql_data_structures.generated.sql +0 -0
  55. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/05.install_jaaql.exceptions.sql +0 -0
  56. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/06.install_jaaql.handwritten.sql +0 -0
  57. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/scripts/swagger_template.html +0 -0
  58. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/services/__init__.py +0 -0
  59. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/services/cached_canned_query_service.py +0 -0
  60. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/services/migrations_manager_service.py +0 -0
  61. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/services/patch_mms.py +0 -0
  62. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/services/patch_shared_var_service.py +0 -0
  63. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/services/shared_var_service.py +0 -0
  64. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/utilities/__init__.py +0 -0
  65. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/utilities/crypt_utils.py +0 -0
  66. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/utilities/options.py +0 -0
  67. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/utilities/utils.py +0 -0
  68. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/utilities/utils_no_project_imports.py +0 -0
  69. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql/utilities/vault.py +0 -0
  70. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql_middleware_python.egg-info/SOURCES.txt +0 -0
  71. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql_middleware_python.egg-info/dependency_links.txt +0 -0
  72. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql_middleware_python.egg-info/requires.txt +0 -0
  73. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/jaaql_middleware_python.egg-info/top_level.txt +0 -0
  74. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/setup.cfg +0 -0
  75. {jaaql-middleware-python-4.23.1 → jaaql-middleware-python-4.23.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaaql-middleware-python
3
- Version: 4.23.1
3
+ Version: 4.23.2
4
4
  Summary: The jaaql package, allowing for rapid development and deployment of RESTful HTTP applications
5
5
  Home-page: https://github.com/JAAQL/JAAQL-middleware-python
6
6
  Author: Software Quality Measurement and Improvement bv
@@ -179,5 +179,5 @@ ROLE__postgres = "postgres"
179
179
 
180
180
  PROTOCOL__postgres = "postgresql://"
181
181
 
182
- VERSION = "4.23.1"
182
+ VERSION = "4.23.2"
183
183
 
@@ -147,7 +147,7 @@ class SingletonRequested(JaaqlInterpretableHandledError):
147
147
  error_code=1011,
148
148
  http_response_code=422,
149
149
  table_name=None,
150
- message="A singleton was requested for this set but either 0 or 1 row was returned",
150
+ message="A singleton was requested for this set but either 0 or many rows were returned",
151
151
  column_name=None,
152
152
  _set=_set,
153
153
  index=None,
@@ -11,7 +11,8 @@ from jaaql.db.db_interface import DBInterface, ECHO__none
11
11
  from psycopg.errors import OperationalError, Error
12
12
  from jaaql.constants import KEY__position, KEY__file, KEY__application, KEY__error, KEY__error_row_number, KEY__error_query, \
13
13
  KEY__error_set, KEY__error_index, SQLStateJaaql, KEY__restrictions, REGEX__dmbs_object_name
14
- from jaaql.exceptions.jaaql_interpretable_handled_errors import DatabaseOperationalError, HandledProcedureError, UnhandledQueryError, UnhandledProcedureError
14
+ from jaaql.exceptions.jaaql_interpretable_handled_errors import DatabaseOperationalError, HandledProcedureError, UnhandledQueryError, UnhandledProcedureError, \
15
+ SingletonRequested
15
16
  from typing import Union
16
17
 
17
18
 
@@ -295,23 +296,27 @@ class InterpretJAAQL:
295
296
  pass
296
297
  raise ex
297
298
 
299
+ skipped_singletons = []
300
+
298
301
  for cur_query, cur_parameters, cur_row_idx, cur_state in zip(to_exec, replacement_parameters, range(len(to_exec)), states):
299
302
  exc_query = cur_query
300
303
  exc_state = cur_state
301
304
  exc_row_idx = cur_row_idx
302
305
  exc_parameters = cur_parameters
303
306
  exc_row_number = cur_parameters.get(KEY__row_number)
304
- last_query, found_parameter_dictionary = self.pre_prepare_statement(cur_query, cur_parameters, for_prepare=do_prepare_only is not False and do_prepare_only is not None)
307
+ last_query, found_parameter_dictionary = self.pre_prepare_statement(
308
+ cur_query, cur_parameters, for_prepare=do_prepare_only is not False and do_prepare_only is not None,
309
+ skipped_singletons=skipped_singletons)
305
310
 
306
311
  enc_parameter_dictionary = {}
307
312
 
308
313
  encrypt_parameters = {key: val for key, val in cur_parameters.items() if key not in found_parameter_dictionary}
309
314
 
310
315
  if len(encrypt_parameters) != 0:
311
- last_query, enc_parameter_dictionary = self.pre_prepare_statement(last_query, encrypt_parameters,
312
- match_regex=REGEX_enc_query_argument,
313
- encryption_key=encryption_key,
314
- for_prepare=do_prepare_only is not False and do_prepare_only is not None)
316
+ last_query, enc_parameter_dictionary = self.pre_prepare_statement(
317
+ last_query, encrypt_parameters, match_regex=REGEX_enc_query_argument,
318
+ encryption_key=encryption_key, for_prepare=do_prepare_only is not False and do_prepare_only is not None,
319
+ skipped_singletons=skipped_singletons)
315
320
 
316
321
  last_query = self.encrypt_literals(last_query, encryption_key)
317
322
  found_params = {**found_parameter_dictionary, **enc_parameter_dictionary}
@@ -328,12 +333,17 @@ class InterpretJAAQL:
328
333
  ["NULL" for _ in found_params.keys()]) + arg_close
329
334
  found_params = {}
330
335
 
336
+ cur_assert = query_obj.get(KEY_assert)
337
+
331
338
  if query_key in skip_as_restricted:
332
339
  res = {
333
340
  "columns": [],
334
341
  "rows": [],
335
342
  "type_codes": []
336
343
  }
344
+ if cur_assert == ASSERT_one:
345
+ skipped_singletons.append(query_key)
346
+
337
347
  else:
338
348
  res = self.db_interface.execute_query_fetching_results(conn, last_query, found_params, wait_hook=wait_hook,
339
349
  requires_dba_check=check_required and canned_query_service is not None)
@@ -358,12 +368,16 @@ class InterpretJAAQL:
358
368
  else:
359
369
  ret = res
360
370
 
361
- cur_assert = query_obj.get(KEY_assert)
362
371
  if cur_assert != ASSERT_none and query_key not in skip_as_restricted:
363
372
  if cur_assert == ASSERT_zero and len(res["rows"]) != ASSERT_zero:
364
373
  raise HttpStatusException(ERR_assert_expecting % (str(ASSERT_zero), len(res["rows"])), HTTPStatus.BAD_REQUEST)
365
374
  elif cur_assert == ASSERT_one and len(res["rows"]) != ASSERT_one:
366
- raise HttpStatusException(ERR_assert_expecting % (str(ASSERT_one), len(res["rows"])), HTTPStatus.BAD_REQUEST)
375
+ raise SingletonRequested(exc_query_key, descriptor={
376
+ "row_count": len(res["rows"]),
377
+ "columns": res["rows"],
378
+ "rows": res["columns"],
379
+ "type_codes": res["type_codes"]
380
+ })
367
381
  elif cur_assert == ASSERT_one_plus and len(res["rows"]) < ASSERT_one_plus_minimum_allowed:
368
382
  raise HttpStatusException(ERR_assert_expecting % (str(ASSERT_one_plus_message), len(res["rows"])), HTTPStatus.BAD_REQUEST)
369
383
 
@@ -437,6 +451,7 @@ class InterpretJAAQL:
437
451
  elif is_dict_query:
438
452
  if isinstance(ex, JaaqlInterpretableHandledError):
439
453
  err = ex
454
+ err.set = exc_query_key
440
455
  else:
441
456
  new_ex = HttpStatusException(str(ex))
442
457
  if isinstance(ex, HttpStatusException):
@@ -646,7 +661,7 @@ class InterpretJAAQL:
646
661
  return new_query + query[last_end_match:]
647
662
 
648
663
  def pre_prepare_statement(self, query, parameters, match_regex: str = REGEX_query_argument, encryption_key: bytes = None,
649
- require_presence: bool = True, for_prepare: bool = False):
664
+ require_presence: bool = True, for_prepare: bool = False, skipped_singletons: list[str] = None):
650
665
  prepared = ""
651
666
  last_index = 0
652
667
  found_parameters = []
@@ -670,7 +685,11 @@ class InterpretJAAQL:
670
685
  if match_str not in found_parameters:
671
686
  if match_str not in parameters and match_str not in MARKERS:
672
687
  if require_presence:
673
- raise HttpStatusException(ERR_missing_parameter % match_str, HTTPStatus.BAD_REQUEST)
688
+ missing_str = ERR_missing_parameter % match_str
689
+ if skipped_singletons is not None and len(skipped_singletons) != 0:
690
+ missing_str += ". Is it possible the parameter exists in one of the following restricted singletons: " + ", ".join(
691
+ missing_str) + "?"
692
+ raise HttpStatusException(missing_str, HTTPStatus.BAD_REQUEST)
674
693
  else:
675
694
  continue
676
695
  elif match_str not in parameters and match_str in MARKERS:
@@ -1,5 +1,5 @@
1
1
  """
2
- This script was generated from jaaql.exceptions.fxli at 2024-04-06, 11:01:47
2
+ This script was generated from jaaql.exceptions.fxli at 2024-04-11, 22:00:39
3
3
  """
4
4
 
5
5
  from jaaql.utilities.crypt_utils import get_repeatable_salt
@@ -1,5 +1,5 @@
1
1
  """
2
- This script was generated from jaaql.fxli at 2024-04-06, 11:01:47
2
+ This script was generated from jaaql.fxli at 2024-04-11, 22:00:39
3
3
  """
4
4
 
5
5
  from jaaql.db.db_interface import DBInterface
@@ -7,7 +7,7 @@ CREATE DOMAIN encrypted__access_token AS character varying(64);
7
7
  CREATE DOMAIN encrypted__jaaql_username AS character varying(255);
8
8
  CREATE DOMAIN encrypted__hash AS character varying(512);
9
9
  CREATE DOMAIN encrypted__salted_ip AS character varying(256);
10
- CREATE DOMAIN internet_name AS character varying(63) CHECK (VALUE ~* '^[a-z0-9\-\$]*$');
10
+ CREATE DOMAIN internet_name AS character varying(63) CHECK (VALUE ~* '^[a-z0-9\-]*$');
11
11
  CREATE DOMAIN url AS character varying(256);
12
12
  CREATE DOMAIN location AS character varying(256);
13
13
  CREATE DOMAIN object_name AS character varying(63) CHECK (VALUE ~* '^[a-zA-Z_][a-zA-Z_0-9\$]*$');
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaaql-middleware-python
3
- Version: 4.23.1
3
+ Version: 4.23.2
4
4
  Summary: The jaaql package, allowing for rapid development and deployment of RESTful HTTP applications
5
5
  Home-page: https://github.com/JAAQL/JAAQL-middleware-python
6
6
  Author: Software Quality Measurement and Improvement bv