velocity-python 0.0.142__py3-none-any.whl → 0.0.144__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.

Potentially problematic release.


This version of velocity-python might be problematic. Click here for more details.

velocity/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.142"
1
+ __version__ = version = "0.0.144"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -18,39 +18,6 @@ TableHelper.reserved = reserved_words
18
18
  TableHelper.operators = OPERATORS
19
19
 
20
20
 
21
- def _get_table_helper(tx, table):
22
- """
23
- Utility function to create a TableHelper instance.
24
- Ensures consistent configuration across all SQL methods.
25
- """
26
- return TableHelper(tx, table)
27
-
28
-
29
- def _validate_table_name(table):
30
- """Validate table name format."""
31
- if not table or not isinstance(table, str):
32
- raise ValueError("Table name must be a non-empty string")
33
- # Add more validation as needed
34
- return table.strip()
35
-
36
-
37
- def _handle_predicate_errors(predicates, operation="WHERE"):
38
- """Process a list of predicates with error handling."""
39
- sql_parts = []
40
- vals = []
41
-
42
- for pred, val in predicates:
43
- sql_parts.append(pred)
44
- if val is None:
45
- pass
46
- elif isinstance(val, tuple):
47
- vals.extend(val)
48
- else:
49
- vals.append(val)
50
-
51
- return sql_parts, vals
52
-
53
-
54
21
  system_fields = [
55
22
  "sys_id",
56
23
  "sys_created",
@@ -143,7 +110,7 @@ class SQL(BaseSQLDialect):
143
110
  vals = []
144
111
 
145
112
  # Create table helper instance
146
- th = _get_table_helper(tx, table)
113
+ th = TableHelper(tx, table)
147
114
 
148
115
  # Handle columns and DISTINCT before aliasing
149
116
  if columns is None:
@@ -447,7 +414,7 @@ class SQL(BaseSQLDialect):
447
414
  if not isinstance(data, Mapping) or not data:
448
415
  raise ValueError("data must be a non-empty mapping of column-value pairs.")
449
416
 
450
- th = _get_table_helper(tx, table)
417
+ th = TableHelper(tx, table)
451
418
  set_clauses = []
452
419
  vals = []
453
420
 
@@ -794,21 +761,36 @@ class SQL(BaseSQLDialect):
794
761
  return sql, tuple()
795
762
 
796
763
  @classmethod
797
- def ensure_sys_modified_count(cls, name):
764
+ def ensure_sys_modified_count(cls, name, has_column=False):
798
765
  """Return SQL to backfill sys_modified_count and refresh the on_sys_modified trigger."""
799
766
  if "." in name:
800
- fqtn = TableHelper.quote(name)
767
+ schema_name, table_name = name.split(".", 1)
801
768
  else:
802
- fqtn = f"public.{TableHelper.quote(name)}"
803
- schema, _ = fqtn.split(".")
804
- trigger_name = f"on_update_row_{fqtn.replace('.', '_')}"
769
+ schema_name = cls.default_schema
770
+ table_name = name
771
+
772
+ schema_identifier = TableHelper.quote(schema_name)
773
+ table_identifier = TableHelper.quote(table_name)
774
+ fqtn = f"{schema_identifier}.{table_identifier}"
775
+
776
+ trigger_name = (
777
+ f"on_update_row_{schema_name}_{table_name}"
778
+ .replace(".", "_")
779
+ .replace('"', "")
780
+ )
781
+ trigger_identifier = TableHelper.quote(trigger_name)
805
782
  column_name = TableHelper.quote("sys_modified_count")
806
783
 
807
- sql = [
808
- f"ALTER TABLE {fqtn} ADD COLUMN {column_name} INTEGER NOT NULL DEFAULT 0;",
784
+ statements = []
785
+ if not has_column:
786
+ statements.append(
787
+ f"ALTER TABLE {fqtn} ADD COLUMN {column_name} INTEGER NOT NULL DEFAULT 0;"
788
+ )
789
+
790
+ statements.extend([
809
791
  f"UPDATE {fqtn} SET {column_name} = 0 WHERE {column_name} IS NULL;",
810
792
  f"""
811
- CREATE OR REPLACE FUNCTION {schema}.on_sys_modified()
793
+ CREATE OR REPLACE FUNCTION {schema_identifier}.on_sys_modified()
812
794
  RETURNS TRIGGER AS
813
795
  $BODY$
814
796
  BEGIN
@@ -837,15 +819,17 @@ class SQL(BaseSQLDialect):
837
819
  LANGUAGE plpgsql VOLATILE
838
820
  COST 100;
839
821
  """,
840
- f"DROP TRIGGER IF EXISTS {trigger_name} ON {fqtn};",
822
+ f"DROP TRIGGER IF EXISTS {trigger_identifier} ON {fqtn};",
841
823
  f"""
842
- CREATE TRIGGER {trigger_name}
824
+ CREATE TRIGGER {trigger_identifier}
843
825
  BEFORE INSERT OR UPDATE ON {fqtn}
844
- FOR EACH ROW EXECUTE PROCEDURE {schema}.on_sys_modified();
826
+ FOR EACH ROW EXECUTE PROCEDURE {schema_identifier}.on_sys_modified();
845
827
  """,
846
- ]
828
+ ])
847
829
 
848
- sql = sqlparse.format(" ".join(sql), reindent=True, keyword_case="upper")
830
+ sql = sqlparse.format(
831
+ " ".join(statements), reindent=True, keyword_case="upper"
832
+ )
849
833
  return sql, tuple()
850
834
 
851
835
  @classmethod
@@ -485,7 +485,7 @@ END;
485
485
  return "\n".join(statements), tuple()
486
486
 
487
487
  @classmethod
488
- def ensure_sys_modified_count(cls, name):
488
+ def ensure_sys_modified_count(cls, name, has_column=False):
489
489
  """Ensure sys_modified_count exists for SQL Server tables along with maintenance triggers."""
490
490
  if "." in name:
491
491
  schema, table_name = name.split(".", 1)
@@ -499,8 +499,13 @@ END;
499
499
  table_name_sql = table_name.replace("'", "''")
500
500
  trigger_prefix = re.sub(r"[^0-9A-Za-z_]+", "_", f"CC_SYS_MOD_{table_name}")
501
501
 
502
- statements = [
503
- f"IF COL_LENGTH(N'{object_name}', 'sys_modified_count') IS NULL BEGIN ALTER TABLE {table_identifier} ADD sys_modified_count INT NOT NULL CONSTRAINT DF_{trigger_prefix}_COUNT DEFAULT (0); END;",
502
+ statements = []
503
+ if not has_column:
504
+ statements.append(
505
+ f"IF COL_LENGTH(N'{object_name}', 'sys_modified_count') IS NULL BEGIN ALTER TABLE {table_identifier} ADD sys_modified_count INT NOT NULL CONSTRAINT DF_{trigger_prefix}_COUNT DEFAULT (0); END;"
506
+ )
507
+
508
+ statements.extend([
504
509
  f"UPDATE {table_identifier} SET sys_modified_count = 0 WHERE sys_modified_count IS NULL;",
505
510
  f"IF OBJECT_ID(N'{schema_identifier}.{trigger_prefix}_insert', N'TR') IS NOT NULL DROP TRIGGER {schema_identifier}.{trigger_prefix}_insert;",
506
511
  f"IF OBJECT_ID(N'{schema_identifier}.{trigger_prefix}_update', N'TR') IS NOT NULL DROP TRIGGER {schema_identifier}.{trigger_prefix}_update;",
@@ -539,7 +544,7 @@ BEGIN
539
544
  INNER JOIN deleted AS d ON d.sys_id = i.sys_id;
540
545
  END;
541
546
  """.strip(),
542
- ]
547
+ ])
543
548
 
544
549
  return "\n".join(statements), tuple()
545
550
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.142
3
+ Version: 0.0.144
4
4
  Summary: A rapid application development library for interfacing with data storage
5
5
  Author-email: Velocity Team <info@codeclubs.org>
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
- velocity/__init__.py,sha256=SkDlRMRyhFqq5GpLQPd_olQYdhQHS2BT3Y4ioTVxupg,147
1
+ velocity/__init__.py,sha256=Ioy0BZtv2G_FlLD37UBlDUKHraQfoj2Xa6dDuiWKnk0,147
2
2
  velocity/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  velocity/app/invoices.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  velocity/app/orders.py,sha256=fr1oTBjSFfyeMBUXRG06LV4jgwrlwYNL5mbEBleFwf0,6328
@@ -53,7 +53,7 @@ velocity/db/servers/mysql/types.py,sha256=BMQf4TpsRo1JN-yOl1nSItTO-Juu2piSTNy5o_
53
53
  velocity/db/servers/postgres/__init__.py,sha256=6YcTLXposmsrEaJgdUAM_QgD1TZDSILQrGcwWZ-dibk,2457
54
54
  velocity/db/servers/postgres/operators.py,sha256=y9k6enReeR5hJxU_lYYR2epoaw4qCxEqmYJJ5jjaVWA,1166
55
55
  velocity/db/servers/postgres/reserved.py,sha256=5tKLaqFV-HrWRj-nsrxl5KGbmeM3ukn_bPZK36XEu8M,3648
56
- velocity/db/servers/postgres/sql.py,sha256=iZxvALFr3dpJm9BX_WE97E9RdM2RDCmi4M35HwXknVA,50141
56
+ velocity/db/servers/postgres/sql.py,sha256=qUzZE45pfvB4499W1UfpqvupKP1RuQyOrRmB1oJ6sJY,49791
57
57
  velocity/db/servers/postgres/types.py,sha256=W71x8iRx-IIJkQSjb29k-KGkqp-QS6SxB0BHYXd4k8w,6955
58
58
  velocity/db/servers/sqlite/__init__.py,sha256=EIx09YN1-Vm-4CXVcEf9DBgvd8FhIN9rEqIaSRrEcIk,2293
59
59
  velocity/db/servers/sqlite/operators.py,sha256=VzZgph8RrnHkIVqqWGqnJwcafgBzc_8ZQp-M8tMl-mw,1221
@@ -63,7 +63,7 @@ velocity/db/servers/sqlite/types.py,sha256=jpCJeV25x4Iytf6D6GXgK3hVYFAAFV4WKJC-d
63
63
  velocity/db/servers/sqlserver/__init__.py,sha256=LN8OycN7W8da_ZPRYnPQ-O3Bv_xjret9qV1ZCitZlOU,2708
64
64
  velocity/db/servers/sqlserver/operators.py,sha256=xK8_doDLssS38SRs1NoAI7XTO0-gNGMDS76nTVru4kE,1104
65
65
  velocity/db/servers/sqlserver/reserved.py,sha256=Gn5n9DjxcjM-7PsIZPYigD6XLvMAYGnz1IrPuN7Dp2Y,2120
66
- velocity/db/servers/sqlserver/sql.py,sha256=sdmFFzt_Np9mVRGPkFsnWfYPD8z88V9Sp5no3-maPHM,26208
66
+ velocity/db/servers/sqlserver/sql.py,sha256=O57p267LZ6WcAhxRuLuzylqjfZvDzkRuwf8s-GgeWDo,26332
67
67
  velocity/db/servers/sqlserver/types.py,sha256=FAODYEO137m-WugpM89f9bQN9q6S2cjjUaz0a9gfE6M,3745
68
68
  velocity/db/tests/__init__.py,sha256=7-hilWb43cKnSnCeXcjFG-6LpziN5k443IpsIvuevP0,24
69
69
  velocity/db/tests/common_db_test.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -121,8 +121,8 @@ velocity/misc/tests/test_merge.py,sha256=Vm5_jY5cVczw0hZF-3TYzmxFw81heJOJB-dvhCg
121
121
  velocity/misc/tests/test_oconv.py,sha256=fy4DwWGn_v486r2d_3ACpuBD-K1oOngNq1HJCGH7X-M,4694
122
122
  velocity/misc/tests/test_original_error.py,sha256=iWSd18tckOA54LoPQOGV5j9LAz2W-3_ZOwmyZ8-4YQc,1742
123
123
  velocity/misc/tests/test_timer.py,sha256=l9nrF84kHaFofvQYKInJmfoqC01wBhsUB18lVBgXCoo,2758
124
- velocity_python-0.0.142.dist-info/licenses/LICENSE,sha256=aoN245GG8s9oRUU89KNiGTU4_4OtnNmVi4hQeChg6rM,1076
125
- velocity_python-0.0.142.dist-info/METADATA,sha256=lOnWDl2eeeGGfq1hv56p2mGXGz-LzGodk7wWdVpRoH0,34262
126
- velocity_python-0.0.142.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
127
- velocity_python-0.0.142.dist-info/top_level.txt,sha256=JW2vJPmodgdgSz7H6yoZvnxF8S3fTMIv-YJWCT1sNW0,9
128
- velocity_python-0.0.142.dist-info/RECORD,,
124
+ velocity_python-0.0.144.dist-info/licenses/LICENSE,sha256=aoN245GG8s9oRUU89KNiGTU4_4OtnNmVi4hQeChg6rM,1076
125
+ velocity_python-0.0.144.dist-info/METADATA,sha256=imAkzFidVZzVoPKOvVLgKimeWssXCWGfzB9dZH6FTD8,34262
126
+ velocity_python-0.0.144.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
127
+ velocity_python-0.0.144.dist-info/top_level.txt,sha256=JW2vJPmodgdgSz7H6yoZvnxF8S3fTMIv-YJWCT1sNW0,9
128
+ velocity_python-0.0.144.dist-info/RECORD,,