velocity-python 0.1.23__tar.gz → 0.1.24__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.
- {velocity_python-0.1.23/src/velocity_python.egg-info → velocity_python-0.1.24}/PKG-INFO +1 -1
- {velocity_python-0.1.23 → velocity_python-0.1.24}/pyproject.toml +1 -1
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/__init__.py +1 -1
- velocity_python-0.1.24/src/velocity/aws/ssm_config.py +94 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/__init__.py +14 -13
- {velocity_python-0.1.23 → velocity_python-0.1.24/src/velocity_python.egg-info}/PKG-INFO +1 -1
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/SOURCES.txt +1 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/LICENSE +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/README.md +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/setup.cfg +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/amplify_build.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/context_factory.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/perf.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/s3.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/async_support.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/engine.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/core/view.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/migrations.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_view_helper.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/logging.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/pdf.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/authorizenet_adapter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/charge_rules.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/entry_points.txt +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_amplify_build.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_async_support.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_batch_operations.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_concurrency_safety.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_connection_pool.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_connection_resilience.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_decorators.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_email_processing.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_iconv_money_to_cents.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_lambda_handler_auth.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_n_plus_one.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_observability.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_payment_braintree_adapter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_payment_stripe_adapter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_pdf.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_prepared_statements.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_psycopg3_upgrade.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_query_cache.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_row_batch_update.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_row_cache_staleness.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_row_dirty_tracking.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_schema_migrations.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_security_hardening.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_sqs_per_record_transactions.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_table_alter.py +0 -0
- {velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_where_clause_validation.py +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SSM-backed configuration with environment-variable fallback.
|
|
3
|
+
|
|
4
|
+
Opt-in: set ``VELOCITY_SSM_ENABLED=true`` in your Amplify environment variables
|
|
5
|
+
(pushed via ``bootstrap.py secrets``).
|
|
6
|
+
|
|
7
|
+
When enabled, ``getenv(key)`` reads from SSM at::
|
|
8
|
+
|
|
9
|
+
/{ProjectName}/{ENV}/{key}
|
|
10
|
+
|
|
11
|
+
and falls back to ``os.environ`` on a miss or any error. Results are cached
|
|
12
|
+
for the process lifetime so SSM is called at most once per key per Lambda
|
|
13
|
+
cold start.
|
|
14
|
+
|
|
15
|
+
When **not** enabled (the default), ``getenv`` is a thin wrapper around
|
|
16
|
+
``os.environ.get`` with zero extra overhead — preserving full backward
|
|
17
|
+
compatibility for projects that don't use SSM (e.g. caringcent).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import logging
|
|
23
|
+
import os
|
|
24
|
+
from typing import Optional
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
# Per-process cache: key → value (str) or sentinel _MISS.
|
|
29
|
+
_MISS = object()
|
|
30
|
+
_cache: dict[str, object] = {}
|
|
31
|
+
|
|
32
|
+
# Lazily evaluated once per process.
|
|
33
|
+
_SSM_ENABLED: bool | None = None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _is_enabled() -> bool:
|
|
37
|
+
global _SSM_ENABLED
|
|
38
|
+
if _SSM_ENABLED is None:
|
|
39
|
+
_SSM_ENABLED = os.environ.get('VELOCITY_SSM_ENABLED', '').lower() in ('1', 'true', 'yes')
|
|
40
|
+
return _SSM_ENABLED
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _ssm_prefix() -> str | None:
|
|
44
|
+
"""Return '/{ProjectName}/{ENV}' or None if either var is missing."""
|
|
45
|
+
project = os.environ.get('ProjectName')
|
|
46
|
+
env = os.environ.get('ENV')
|
|
47
|
+
if project and env:
|
|
48
|
+
return f'/{project}/{env}'
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _fetch(key: str) -> str | None:
|
|
53
|
+
"""Single SSM GetParameter call; returns value or None on any failure."""
|
|
54
|
+
prefix = _ssm_prefix()
|
|
55
|
+
if prefix is None:
|
|
56
|
+
return None
|
|
57
|
+
param_name = f'{prefix}/{key}'
|
|
58
|
+
try:
|
|
59
|
+
import boto3
|
|
60
|
+
ssm = boto3.client('ssm', region_name=os.environ.get('REGION', 'us-east-1'))
|
|
61
|
+
resp = ssm.get_parameter(Name=param_name, WithDecryption=True)
|
|
62
|
+
return resp['Parameter']['Value']
|
|
63
|
+
except Exception as exc:
|
|
64
|
+
logger.debug('SSM miss for %s: %s', param_name, exc)
|
|
65
|
+
return None
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def getenv(key: str, default: Optional[str] = None) -> Optional[str]:
|
|
69
|
+
"""
|
|
70
|
+
Read a config value, checking SSM before ``os.environ``.
|
|
71
|
+
|
|
72
|
+
SSM is only consulted when ``VELOCITY_SSM_ENABLED=true`` is set in the
|
|
73
|
+
Lambda environment *and* both ``ProjectName`` and ``ENV`` are present.
|
|
74
|
+
All other cases fall straight through to ``os.environ``.
|
|
75
|
+
|
|
76
|
+
Results are cached per process so SSM is queried at most once per key
|
|
77
|
+
per Lambda cold start.
|
|
78
|
+
"""
|
|
79
|
+
if _is_enabled():
|
|
80
|
+
if key not in _cache:
|
|
81
|
+
value = _fetch(key)
|
|
82
|
+
_cache[key] = value if value is not None else _MISS
|
|
83
|
+
cached = _cache[key]
|
|
84
|
+
if cached is not _MISS:
|
|
85
|
+
return cached # type: ignore[return-value]
|
|
86
|
+
|
|
87
|
+
return os.environ.get(key, default)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def clear_cache() -> None:
|
|
91
|
+
"""Clear the SSM cache (useful in tests)."""
|
|
92
|
+
_cache.clear()
|
|
93
|
+
global _SSM_ENABLED
|
|
94
|
+
_SSM_ENABLED = None
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from ..base.initializer import BaseInitializer
|
|
3
3
|
from velocity.db.core import engine
|
|
4
|
+
from velocity.aws.ssm_config import getenv as _getenv
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
# Default TCP keepalive settings for PostgreSQL connections.
|
|
@@ -41,14 +42,14 @@ class PostgreSQLInitializer(BaseInitializer):
|
|
|
41
42
|
|
|
42
43
|
from .sql import SQL
|
|
43
44
|
|
|
44
|
-
# Base configuration from environment
|
|
45
|
+
# Base configuration from environment / SSM
|
|
45
46
|
# psycopg v3 uses libpq param names; 'dbname' not 'database'.
|
|
46
47
|
base_config = {
|
|
47
|
-
"dbname":
|
|
48
|
-
"host":
|
|
49
|
-
"port":
|
|
50
|
-
"user":
|
|
51
|
-
"password":
|
|
48
|
+
"dbname": _getenv("DBDatabase"),
|
|
49
|
+
"host": _getenv("DBHost"),
|
|
50
|
+
"port": _getenv("DBPort"),
|
|
51
|
+
"user": _getenv("DBUser"),
|
|
52
|
+
"password": _getenv("DBPassword"),
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
# Remove None values
|
|
@@ -65,7 +66,7 @@ class PostgreSQLInitializer(BaseInitializer):
|
|
|
65
66
|
|
|
66
67
|
# SSL mode — default to "prefer" so connections upgrade when the
|
|
67
68
|
# server supports TLS but don't fail when it doesn't.
|
|
68
|
-
ssl_mode =
|
|
69
|
+
ssl_mode = _getenv("VELOCITY_SSL_MODE")
|
|
69
70
|
if ssl_mode:
|
|
70
71
|
final_config.setdefault("sslmode", ssl_mode)
|
|
71
72
|
|
|
@@ -108,11 +109,11 @@ def initialize(config=None, schema_locked=False, **kwargs):
|
|
|
108
109
|
from .sql import SQL
|
|
109
110
|
|
|
110
111
|
konfig = {
|
|
111
|
-
"dbname": os.environ["DBDatabase"],
|
|
112
|
-
"host": os.environ["DBHost"],
|
|
113
|
-
"port": os.environ["DBPort"],
|
|
114
|
-
"user": os.environ["DBUser"],
|
|
115
|
-
"password": os.environ["DBPassword"],
|
|
112
|
+
"dbname": _getenv("DBDatabase") or os.environ["DBDatabase"],
|
|
113
|
+
"host": _getenv("DBHost") or os.environ["DBHost"],
|
|
114
|
+
"port": _getenv("DBPort") or os.environ["DBPort"],
|
|
115
|
+
"user": _getenv("DBUser") or os.environ["DBUser"],
|
|
116
|
+
"password": _getenv("DBPassword") or os.environ["DBPassword"],
|
|
116
117
|
}
|
|
117
118
|
konfig.update(config or {})
|
|
118
119
|
konfig.update(kwargs)
|
|
@@ -122,7 +123,7 @@ def initialize(config=None, schema_locked=False, **kwargs):
|
|
|
122
123
|
konfig.setdefault(key, default_val)
|
|
123
124
|
|
|
124
125
|
# SSL mode.
|
|
125
|
-
ssl_mode =
|
|
126
|
+
ssl_mode = _getenv("VELOCITY_SSL_MODE")
|
|
126
127
|
if ssl_mode:
|
|
127
128
|
konfig.setdefault("sslmode", ssl_mode)
|
|
128
129
|
|
|
@@ -7,6 +7,7 @@ src/velocity/aws/__init__.py
|
|
|
7
7
|
src/velocity/aws/amplify.py
|
|
8
8
|
src/velocity/aws/amplify_build.py
|
|
9
9
|
src/velocity/aws/s3.py
|
|
10
|
+
src/velocity/aws/ssm_config.py
|
|
10
11
|
src/velocity/aws/handlers/__init__.py
|
|
11
12
|
src/velocity/aws/handlers/base_handler.py
|
|
12
13
|
src/velocity/aws/handlers/context.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/context_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/aws/handlers/mixins/web_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/base/initializer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_connections.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_row.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/postgres/test_transaction.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_cursor_rowcount_fix.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_postgres_unchanged.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_result_caching.py
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/db/tests/test_result_sql_aware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/misc/tests/test_original_error.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity/payment/authorizenet_adapter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/src/velocity_python.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.23 → velocity_python-0.1.24}/tests/test_sys_modified_count_postgres_demo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|