velocity-python 0.0.152__tar.gz → 0.0.154__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 (136) hide show
  1. {velocity_python-0.0.152 → velocity_python-0.0.154}/PKG-INFO +1 -1
  2. {velocity_python-0.0.152 → velocity_python-0.0.154}/pyproject.toml +1 -1
  3. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/table.py +68 -33
  5. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/transaction.py +15 -3
  6. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity_python.egg-info/PKG-INFO +1 -1
  7. {velocity_python-0.0.152 → velocity_python-0.0.154}/LICENSE +0 -0
  8. {velocity_python-0.0.152 → velocity_python-0.0.154}/README.md +0 -0
  9. {velocity_python-0.0.152 → velocity_python-0.0.154}/setup.cfg +0 -0
  10. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/__init__.py +0 -0
  11. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/invoices.py +0 -0
  12. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/orders.py +0 -0
  13. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/payments.py +0 -0
  14. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/purchase_orders.py +0 -0
  15. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/tests/__init__.py +0 -0
  16. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/tests/test_email_processing.py +0 -0
  17. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  18. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  19. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/__init__.py +0 -0
  20. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/amplify.py +0 -0
  21. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/__init__.py +0 -0
  22. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/base_handler.py +0 -0
  23. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/context.py +0 -0
  24. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/exceptions.py +0 -0
  25. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  26. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  27. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/mixins/activity_tracker.py +0 -0
  28. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/mixins/aws_session_mixin.py +0 -0
  29. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/mixins/error_handler.py +0 -0
  30. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/mixins/legacy_mixin.py +0 -0
  31. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/mixins/standard_mixin.py +0 -0
  32. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/response.py +0 -0
  33. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  34. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/tests/__init__.py +0 -0
  35. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  36. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/aws/tests/test_response.py +0 -0
  37. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/__init__.py +0 -0
  38. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/__init__.py +0 -0
  39. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/column.py +0 -0
  40. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/database.py +0 -0
  41. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/decorators.py +0 -0
  42. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/engine.py +0 -0
  43. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/result.py +0 -0
  44. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/row.py +0 -0
  45. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/core/sequence.py +0 -0
  46. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/exceptions.py +0 -0
  47. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/__init__.py +0 -0
  48. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/base/__init__.py +0 -0
  49. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/base/initializer.py +0 -0
  50. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/base/operators.py +0 -0
  51. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/base/sql.py +0 -0
  52. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/base/types.py +0 -0
  53. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/mysql/__init__.py +0 -0
  54. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/mysql/operators.py +0 -0
  55. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/mysql/reserved.py +0 -0
  56. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/mysql/sql.py +0 -0
  57. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/mysql/types.py +0 -0
  58. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/postgres/__init__.py +0 -0
  59. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/postgres/operators.py +0 -0
  60. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/postgres/reserved.py +0 -0
  61. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/postgres/sql.py +0 -0
  62. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/postgres/types.py +0 -0
  63. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  64. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlite/operators.py +0 -0
  65. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  66. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlite/sql.py +0 -0
  67. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlite/types.py +0 -0
  68. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  69. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  70. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  71. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  72. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/sqlserver/types.py +0 -0
  73. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/servers/tablehelper.py +0 -0
  74. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/__init__.py +0 -0
  75. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/common_db_test.py +0 -0
  76. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/__init__.py +0 -0
  77. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/common.py +0 -0
  78. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_column.py +0 -0
  79. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  80. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_database.py +0 -0
  81. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  82. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  83. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  84. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_result.py +0 -0
  85. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_row.py +0 -0
  86. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  87. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  88. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  89. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  90. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  91. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_table.py +0 -0
  92. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  93. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  94. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/sql/__init__.py +0 -0
  95. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/sql/common.py +0 -0
  96. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  97. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  98. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  99. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_db_utils.py +0 -0
  100. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_postgres.py +0 -0
  101. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  102. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  103. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_result_caching.py +0 -0
  104. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  105. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  106. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  107. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  108. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_sql_builder.py +0 -0
  109. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/tests/test_tablehelper.py +0 -0
  110. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/db/utils.py +0 -0
  111. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/__init__.py +0 -0
  112. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/conv/__init__.py +0 -0
  113. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/conv/iconv.py +0 -0
  114. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/conv/oconv.py +0 -0
  115. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/db.py +0 -0
  116. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/export.py +0 -0
  117. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/format.py +0 -0
  118. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/mail.py +0 -0
  119. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/merge.py +0 -0
  120. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/__init__.py +0 -0
  121. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_db.py +0 -0
  122. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_fix.py +0 -0
  123. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_format.py +0 -0
  124. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_iconv.py +0 -0
  125. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_merge.py +0 -0
  126. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_oconv.py +0 -0
  127. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_original_error.py +0 -0
  128. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tests/test_timer.py +0 -0
  129. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/timer.py +0 -0
  130. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity/misc/tools.py +0 -0
  131. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  132. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  133. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity_python.egg-info/requires.txt +0 -0
  134. {velocity_python-0.0.152 → velocity_python-0.0.154}/src/velocity_python.egg-info/top_level.txt +0 -0
  135. {velocity_python-0.0.152 → velocity_python-0.0.154}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  136. {velocity_python-0.0.152 → velocity_python-0.0.154}/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.152
3
+ Version: 0.0.154
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.152"
7
+ version = "0.0.154"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.152"
1
+ __version__ = version = "0.0.154"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -321,51 +321,88 @@ class Table:
321
321
  sys_id = self.tx.execute(sql, vals).scalar()
322
322
  return self.row(sys_id, lock=lock)
323
323
 
324
+ def _normalize_lookup_where(self, where):
325
+ if where is None:
326
+ raise Exception("None is not allowed as a primary key.")
327
+ if isinstance(where, Row):
328
+ return dict(where.pk)
329
+ if isinstance(where, int):
330
+ return {"sys_id": where}
331
+ if not isinstance(where, Mapping):
332
+ raise TypeError(
333
+ "Lookup criteria must be an int, Row, or mapping of column -> value."
334
+ )
335
+ return dict(where)
336
+
337
+ def _select_sys_ids(
338
+ self,
339
+ where,
340
+ *,
341
+ lock=None,
342
+ orderby=None,
343
+ skip_locked=None,
344
+ limit=2,
345
+ ):
346
+ select_kwargs = {
347
+ "where": where,
348
+ "lock": lock,
349
+ "orderby": orderby,
350
+ "skip_locked": skip_locked,
351
+ }
352
+ if limit is not None:
353
+ select_kwargs["qty"] = limit
354
+ return self.select("sys_id", **select_kwargs).all()
355
+
356
+ def _clean_where_for_insert(self, where):
357
+ clean = {}
358
+ for key, val in where.items():
359
+ if not isinstance(key, str):
360
+ continue
361
+ if set("<>!=%").intersection(key):
362
+ continue
363
+ clean.setdefault(key, val)
364
+ return clean
365
+
324
366
  def get(self, where, lock=None, use_where=False):
325
367
  """
326
368
  Gets or creates a row matching `where`. If multiple rows match, raises DuplicateRowsFoundError.
327
369
  If none match, a new row is created with the non-operator aspects of `where`.
328
370
  """
329
- if where is None:
330
- raise Exception("None is not allowed as a primary key.")
331
- if isinstance(where, int):
332
- where = {"sys_id": where}
333
- result = self.select("sys_id", where=where, lock=lock).all()
371
+ lookup = self._normalize_lookup_where(where)
372
+ result = self._select_sys_ids(lookup, lock=lock, limit=2)
334
373
  if len(result) > 1:
335
- sql = self.select("sys_id", sql_only=True, where=where, lock=lock)
374
+ sql = self.select("sys_id", sql_only=True, where=lookup, lock=lock)
336
375
  raise exceptions.DuplicateRowsFoundError(
337
376
  f"More than one entry found. {sql}"
338
377
  )
339
378
  if not result:
340
- new_data = where.copy()
341
- for k in list(new_data.keys()):
342
- if set("<>!=%").intersection(k):
343
- new_data.pop(k)
379
+ new_data = self._clean_where_for_insert(lookup)
344
380
  return self.new(new_data, lock=lock)
345
381
  if use_where:
346
- return Row(self, where, lock=lock)
382
+ return Row(self, lookup, lock=lock)
347
383
  return Row(self, result[0]["sys_id"], lock=lock)
348
384
 
349
385
  @return_default(None)
350
- def find(self, where, lock=None, use_where=False):
386
+ def find(self, where, lock=None, use_where=False, raise_if_missing=False):
351
387
  """
352
- Finds a single row matching `where`, or returns None if none found.
353
- Raises DuplicateRowsFoundError if multiple rows match.
388
+ Finds a single row matching `where`, or returns None if none found unless
389
+ ``raise_if_missing`` is True. Raises DuplicateRowsFoundError if multiple rows match.
354
390
  """
355
- if where is None:
356
- raise Exception("None is not allowed as a primary key.")
357
- if isinstance(where, int):
358
- where = {"sys_id": where}
359
- result = self.select("sys_id", where=where, lock=lock).all()
391
+ lookup = self._normalize_lookup_where(where)
392
+ result = self._select_sys_ids(lookup, lock=lock, limit=2)
360
393
  if not result:
394
+ if raise_if_missing:
395
+ raise LookupError(
396
+ f"No rows found in `{self.name}` for criteria: {lookup!r}"
397
+ )
361
398
  return None
362
399
  if len(result) > 1:
363
- sql = self.select("sys_id", sql_only=True, where=where, lock=lock)
400
+ sql = self.select("sys_id", sql_only=True, where=lookup, lock=lock)
364
401
  raise exceptions.DuplicateRowsFoundError(
365
402
  f"More than one entry found. {sql}"
366
403
  )
367
404
  if use_where:
368
- return Row(self, where, lock=lock)
405
+ return Row(self, lookup, lock=lock)
369
406
  return Row(self, result[0]["sys_id"], lock=lock)
370
407
 
371
408
  one = find
@@ -383,23 +420,21 @@ class Table:
383
420
  """
384
421
  Finds the first matching row (by `orderby`) or creates one if `create_new=True` and none found.
385
422
  """
386
- if where is None:
387
- raise Exception("None is not allowed as a where clause.")
388
- if isinstance(where, int):
389
- where = {"sys_id": where}
390
- results = self.select(
391
- "sys_id", where=where, orderby=orderby, skip_locked=skip_locked
392
- ).all()
423
+ lookup = self._normalize_lookup_where(where)
424
+ results = self._select_sys_ids(
425
+ lookup,
426
+ lock=lock,
427
+ orderby=orderby,
428
+ skip_locked=skip_locked,
429
+ limit=1,
430
+ )
393
431
  if not results:
394
432
  if create_new:
395
- new_data = where.copy()
396
- for k in list(new_data.keys()):
397
- if set("<>!=%").intersection(k):
398
- new_data.pop(k)
433
+ new_data = self._clean_where_for_insert(lookup)
399
434
  return self.new(new_data, lock=lock)
400
435
  return None
401
436
  if use_where:
402
- return Row(self, where, lock=lock)
437
+ return Row(self, lookup, lock=lock)
403
438
  return Row(self, results[0]["sys_id"], lock=lock)
404
439
 
405
440
  def primary_keys(self):
@@ -168,9 +168,21 @@ class Transaction:
168
168
  """Shortcut to table.get() with optional ``use_where`` passthrough."""
169
169
  return self.table(tablename).get(where, lock=lock, use_where=use_where)
170
170
 
171
- def find(self, tablename, where, lock=None, use_where=False):
172
- """Shortcut to table.find() with optional ``use_where`` passthrough."""
173
- return self.table(tablename).find(where, lock=lock, use_where=use_where)
171
+ def find(
172
+ self,
173
+ tablename,
174
+ where,
175
+ lock=None,
176
+ use_where=False,
177
+ raise_if_missing=False,
178
+ ):
179
+ """Shortcut to table.find() with ``use_where``/``raise_if_missing`` passthrough."""
180
+ return self.table(tablename).find(
181
+ where,
182
+ lock=lock,
183
+ use_where=use_where,
184
+ raise_if_missing=raise_if_missing,
185
+ )
174
186
 
175
187
  def column(self, tablename, colname):
176
188
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.152
3
+ Version: 0.0.154
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