velocity-python 0.0.162__tar.gz → 0.0.163__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 (138) hide show
  1. {velocity_python-0.0.162 → velocity_python-0.0.163}/PKG-INFO +1 -1
  2. {velocity_python-0.0.162 → velocity_python-0.0.163}/pyproject.toml +1 -1
  3. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/table.py +11 -2
  5. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/postgres/sql.py +26 -11
  6. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity_python.egg-info/PKG-INFO +1 -1
  7. {velocity_python-0.0.162 → velocity_python-0.0.163}/LICENSE +0 -0
  8. {velocity_python-0.0.162 → velocity_python-0.0.163}/README.md +0 -0
  9. {velocity_python-0.0.162 → velocity_python-0.0.163}/setup.cfg +0 -0
  10. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/__init__.py +0 -0
  11. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/invoices.py +0 -0
  12. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/orders.py +0 -0
  13. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/payments.py +0 -0
  14. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/purchase_orders.py +0 -0
  15. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/tests/__init__.py +0 -0
  16. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/tests/test_email_processing.py +0 -0
  17. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  18. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  19. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/__init__.py +0 -0
  20. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/amplify.py +0 -0
  21. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/__init__.py +0 -0
  22. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/base_handler.py +0 -0
  23. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/context.py +0 -0
  24. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/exceptions.py +0 -0
  25. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  26. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  27. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/mixins/activity_tracker.py +0 -0
  28. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/mixins/aws_session_mixin.py +0 -0
  29. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/mixins/error_handler.py +0 -0
  30. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/mixins/legacy_mixin.py +0 -0
  31. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/mixins/standard_mixin.py +0 -0
  32. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/response.py +0 -0
  33. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  34. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/tests/__init__.py +0 -0
  35. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  36. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/aws/tests/test_response.py +0 -0
  37. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/__init__.py +0 -0
  38. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/__init__.py +0 -0
  39. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/column.py +0 -0
  40. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/database.py +0 -0
  41. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/decorators.py +0 -0
  42. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/engine.py +0 -0
  43. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/result.py +0 -0
  44. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/row.py +0 -0
  45. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/sequence.py +0 -0
  46. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/core/transaction.py +0 -0
  47. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/exceptions.py +0 -0
  48. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/__init__.py +0 -0
  49. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/base/__init__.py +0 -0
  50. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/base/initializer.py +0 -0
  51. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/base/operators.py +0 -0
  52. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/base/sql.py +0 -0
  53. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/base/types.py +0 -0
  54. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/mysql/__init__.py +0 -0
  55. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/mysql/operators.py +0 -0
  56. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/mysql/reserved.py +0 -0
  57. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/mysql/sql.py +0 -0
  58. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/mysql/types.py +0 -0
  59. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/postgres/__init__.py +0 -0
  60. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/postgres/operators.py +0 -0
  61. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/postgres/reserved.py +0 -0
  62. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/postgres/types.py +0 -0
  63. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  64. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlite/operators.py +0 -0
  65. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  66. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlite/sql.py +0 -0
  67. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlite/types.py +0 -0
  68. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  69. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  70. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  71. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  72. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/sqlserver/types.py +0 -0
  73. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/servers/tablehelper.py +0 -0
  74. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/__init__.py +0 -0
  75. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/common_db_test.py +0 -0
  76. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/__init__.py +0 -0
  77. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/common.py +0 -0
  78. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_column.py +0 -0
  79. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  80. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_database.py +0 -0
  81. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  82. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  83. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  84. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_result.py +0 -0
  85. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_row.py +0 -0
  86. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  87. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  88. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  89. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  90. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  91. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_table.py +0 -0
  92. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  93. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  94. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/sql/__init__.py +0 -0
  95. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/sql/common.py +0 -0
  96. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  97. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  98. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  99. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_db_utils.py +0 -0
  100. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_postgres.py +0 -0
  101. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  102. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  103. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_result_caching.py +0 -0
  104. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  105. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  106. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  107. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  108. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_sql_builder.py +0 -0
  109. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/tests/test_tablehelper.py +0 -0
  110. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/db/utils.py +0 -0
  111. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/__init__.py +0 -0
  112. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/conv/__init__.py +0 -0
  113. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/conv/iconv.py +0 -0
  114. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/conv/oconv.py +0 -0
  115. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/db.py +0 -0
  116. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/export.py +0 -0
  117. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/format.py +0 -0
  118. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/mail.py +0 -0
  119. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/merge.py +0 -0
  120. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/__init__.py +0 -0
  121. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_db.py +0 -0
  122. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_fix.py +0 -0
  123. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_format.py +0 -0
  124. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_iconv.py +0 -0
  125. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_merge.py +0 -0
  126. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_oconv.py +0 -0
  127. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_original_error.py +0 -0
  128. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tests/test_timer.py +0 -0
  129. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/timer.py +0 -0
  130. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity/misc/tools.py +0 -0
  131. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  132. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  133. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity_python.egg-info/requires.txt +0 -0
  134. {velocity_python-0.0.162 → velocity_python-0.0.163}/src/velocity_python.egg-info/top_level.txt +0 -0
  135. {velocity_python-0.0.162 → velocity_python-0.0.163}/tests/test_decorators.py +0 -0
  136. {velocity_python-0.0.162 → velocity_python-0.0.163}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  137. {velocity_python-0.0.162 → velocity_python-0.0.163}/tests/test_table_alter.py +0 -0
  138. {velocity_python-0.0.162 → velocity_python-0.0.163}/tests/test_where_clause_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.162
3
+ Version: 0.0.163
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "velocity-python"
7
- version = "0.0.162"
7
+ version = "0.0.163"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.162"
1
+ __version__ = version = "0.0.163"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -37,7 +37,12 @@ SYSTEM_COLUMN_NAMES = (
37
37
  "sys_keywords",
38
38
  )
39
39
 
40
- _SYSTEM_COLUMN_SET = {name.lower() for name in SYSTEM_COLUMN_NAMES}
40
+ # Legacy system columns retained for transitional compatibility checks.
41
+ LEGACY_SYSTEM_COLUMN_NAMES = ("description",)
42
+
43
+ _SYSTEM_COLUMN_SET = {
44
+ name.lower() for name in (*SYSTEM_COLUMN_NAMES, *LEGACY_SYSTEM_COLUMN_NAMES)
45
+ }
41
46
 
42
47
  _NULLABLE_TRUE = {"YES", "TRUE", "T", "1", "Y"}
43
48
  _NULLABLE_FALSE = {"NO", "FALSE", "F", "0", "N"}
@@ -1307,7 +1312,11 @@ class Table:
1307
1312
  """
1308
1313
  Returns detailed information about all indexes on this table.
1309
1314
  """
1310
- sql, vals = self.sql.indexes(self.name)
1315
+ sql_spec = self.sql.indexes(self.name)
1316
+ if isinstance(sql_spec, tuple):
1317
+ sql, vals = sql_spec
1318
+ else:
1319
+ sql, vals = sql_spec, tuple()
1311
1320
  if kwds.get("sql_only", False):
1312
1321
  return sql, vals
1313
1322
  return self.tx.execute(sql, vals, cursor=self.cursor())
@@ -836,6 +836,16 @@ class SQL(BaseSQLDialect):
836
836
  COST 100;
837
837
  """
838
838
 
839
+ @staticmethod
840
+ def _sys_keywords_index_name(schema_unquoted, table_unquoted):
841
+ base_index_name = f"idx_{schema_unquoted}_{table_unquoted}_sys_keywords_tsv"
842
+ base_index_name = re.sub(r"[^0-9a-zA-Z_]+", "_", base_index_name)
843
+ if len(base_index_name) > 60:
844
+ digest = hashlib.sha256(base_index_name.encode("utf-8")).hexdigest()
845
+ base_index_name = f"idx_{table_unquoted[:30]}_{digest[:8]}_sk"
846
+ base_index_name = re.sub(r"[^0-9a-zA-Z_]+", "_", base_index_name)
847
+ return base_index_name[:63]
848
+
839
849
  @classmethod
840
850
  def create_table(cls, name, columns={}, drop=False):
841
851
  if "." in name:
@@ -865,7 +875,7 @@ class SQL(BaseSQLDialect):
865
875
  sys_modified_count INTEGER NOT NULL DEFAULT 0,
866
876
  sys_dirty BOOLEAN NOT NULL DEFAULT FALSE,
867
877
  sys_table TEXT NOT NULL,
868
- sys_keywords TEXT
878
+ sys_keywords TEXT
869
879
  );
870
880
 
871
881
  SELECT SETVAL(PG_GET_SERIAL_SEQUENCE('{fqtn}', 'sys_id'),1000,TRUE);
@@ -889,6 +899,12 @@ class SQL(BaseSQLDialect):
889
899
  f"ALTER TABLE {TableHelper.quote(fqtn)} ADD COLUMN {TableHelper.quote(key)} {TYPES.get_type(val)};"
890
900
  )
891
901
 
902
+ index_name = cls._sys_keywords_index_name(schema_unquoted, table_unquoted)
903
+ index_identifier = TableHelper.quote(index_name)
904
+ sql.append(
905
+ f"CREATE INDEX {index_identifier} ON {fqtn} USING GIN (TO_TSVECTOR('simple', COALESCE(sys_keywords, '')));"
906
+ )
907
+
892
908
  sql = sqlparse.format(" ".join(sql), reindent=True, keyword_case="upper")
893
909
  return sql, tuple()
894
910
 
@@ -1035,18 +1051,17 @@ class SQL(BaseSQLDialect):
1035
1051
  )
1036
1052
 
1037
1053
  if "sys_keywords" in columns_after:
1038
- base_index_name = f"idx_{schema_unquoted}_{table_unquoted}_sys_keywords_tsv"
1039
- base_index_name = re.sub(r"[^0-9a-zA-Z_]+", "_", base_index_name)
1040
- if len(base_index_name) > 60:
1041
- digest = hashlib.sha256(base_index_name.encode("utf-8")).hexdigest()
1042
- base_index_name = f"idx_{table_unquoted[:30]}_{digest[:8]}_sk"
1043
- base_index_name = re.sub(r"[^0-9a-zA-Z_]+", "_", base_index_name)
1044
- index_name = base_index_name[:63]
1054
+ index_name = cls._sys_keywords_index_name(schema_unquoted, table_unquoted)
1045
1055
  quoted_index_name = TableHelper.quote(index_name)
1046
1056
 
1047
- target_expression = "to_tsvector('simple', coalesce(sys_keywords, ''))"
1048
- current_definition = existing_indexes.get(index_name.lower(), "").lower()
1049
- needs_rebuild = force or target_expression not in current_definition
1057
+ current_definition = existing_indexes.get(index_name.lower(), "")
1058
+ current_definition_lower = current_definition.lower()
1059
+ has_target = (
1060
+ "to_tsvector" in current_definition_lower
1061
+ and "coalesce" in current_definition_lower
1062
+ and "sys_keywords" in current_definition_lower
1063
+ )
1064
+ needs_rebuild = force or not has_target
1050
1065
 
1051
1066
  if needs_rebuild:
1052
1067
  statements.append(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.162
3
+ Version: 0.0.163
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