openmodule 14.2.0rc0__tar.gz → 14.3.0__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.
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/ChangeLog +17 -6
- {openmodule-14.2.0rc0/openmodule.egg-info → openmodule-14.3.0}/PKG-INFO +1 -1
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/testing.md +17 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/utils.md +22 -1
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/access_service.py +5 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/base.py +5 -19
- openmodule-14.2.0rc0/openmodule/models/signal.py → openmodule-14.3.0/openmodule/models/signals.py +4 -4
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/rpc/client.py +11 -8
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/settings.py +9 -0
- openmodule-14.2.0rc0/openmodule/utils/signal.py → openmodule-14.3.0/openmodule/utils/signal_listener.py +8 -7
- {openmodule-14.2.0rc0 → openmodule-14.3.0/openmodule.egg-info}/PKG-INFO +1 -1
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule.egg-info/SOURCES.txt +3 -3
- openmodule-14.3.0/openmodule.egg-info/pbr.json +1 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule.egg-info/requires.txt +1 -1
- openmodule-14.2.0rc0/openmodule_test/signal.py → openmodule-14.3.0/openmodule_test/signal_simulator.py +2 -2
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/requirements.txt +1 -1
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_model.py +1 -11
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_signal.py +6 -5
- openmodule-14.2.0rc0/openmodule.egg-info/pbr.json +0 -1
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/.gitlab-ci.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/AUTHORS +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/LICENSE +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/README.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/access_service.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/anonymization.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/cleanup.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/coding_standard.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/commands.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/connection_status_listener.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/csv_export.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/database.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/README.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/access_service/openmodule/models/access_service.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/access_service/openmodule/utils/access_service.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/access_service/openmodule_test/access_service.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/access_service/tests/test_utils_access_service.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/api/openmodule/utils/api.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/api/openmodule_test/api.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/api/tests/test_utils_api.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/package_reader/openmodule/utils/package_reader.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/package_reader/openmodule_test/fake_package_creator.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/deprecated_code/package_reader/tests/test_package_reader.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/event_sending.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/getting_started.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/health.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/images/broker.drawio.png +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/known_issues.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/migrations.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/package_reader.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/rpc.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/sentry.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/settings.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/settings_provider.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/docs/translation.md +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/alert.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/config.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/connection_status.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/core.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/database/custom_types.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/database/database.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/database/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/database/migration.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/dispatcher.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/health.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/logging.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/messaging.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/alert.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/io.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/kv_store.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/presence.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/privacy.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/rpc.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/settings.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/validation.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/models/vehicle.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/rpc/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/rpc/common.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/rpc/server.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/sentry.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/threading.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/access_service.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/charset.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/cleanup.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/csv_export.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/databox.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/db_helper.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/eventlog.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/io.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/kv_store.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/matching.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/misc_functions.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/package_reader.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/presence.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/schema.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/translation.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule/utils/validation.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule.egg-info/dependency_links.txt +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule.egg-info/not-zip-safe +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule.egg-info/top_level.txt +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_commands/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_commands/setup.cfg +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_commands/setup.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_commands/translate.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/alert.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/connection_status.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/core.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/database.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/eventlistener.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/files.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/gate.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/health.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/interrupt.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/io_simulator.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/package_reader.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/presence.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/requirements.txt +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/rpc.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/sentry.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/settings.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/setup.cfg +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/setup.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/utils.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/openmodule_test/zeromq.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/setup.cfg +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/setup.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/test-requirements.txt +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/config.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/database_models_migration.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/database_models_test.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/alembic/README +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/alembic/versions/ff26e54332f9_datetime_models.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/invalid_database/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/alembic/versions/812a3e5b8517_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/alembic/versions/a7ea100a784f_key_error.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_double_column_delete_error/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/alembic/versions/812a3e5b8517_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/alembic/versions/a7ea100a784f_no_such_table_error.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_no_such_table_error/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic/versions/19789aa5361c_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic/versions/19d887929ae7_alter.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic/versions/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/alembic_migration_test_database.sqlite3 +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/migration_test_database/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/configs/config.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/configs/test_config.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/configs/test_config_1.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/standard_schemes/DEFAULT-10.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/standard_schemes/DEFAULT-20.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/standard_schemes/LEGACY-0.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/translation/locale/de/LC_MESSAGES/translation.mo +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/translation/locale/de/LC_MESSAGES/translation.po +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/translation/locale/en/LC_MESSAGES/translation.mo +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/translation/locale/en/LC_MESSAGES/translation.po +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/translation/locale/translation.pot +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/translation/translate.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/A-10.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/A-20.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/DEFAULT-10.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/DEFAULT-20.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/DEFAULT-30.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/LEGACY-0.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/TEST-10.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/TEST-20.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/TEST-30.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/resources/utils_matching/TEST-40.yml +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/sentry_main.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic/versions/7bd4fcd38fde_removed_nfc_and_pin.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic/versions/9ca98a2e5674_added_parksettings_id.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic/versions/c821971f9230_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_access_service_database/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_alembic_migrations.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_alert.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_checks.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_config.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_connection_status.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_core.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database/alembic/versions/32b8c728abbf_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_database.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_dispatcher.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_health.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_interrupt.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_io_listen.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/alembic/versions/9c5c944221f4_deprecated_kv_entry_example.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/alembic/versions/c55a69026a25_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_database/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/alembic/README +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/alembic/__init__.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/alembic/env.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/alembic/script.py.mako +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/alembic/versions/cdb3214131a9_initial.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/alembic.ini +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_kv_store_multiple_database/makemigration.sh +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_logging.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_messaging.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_mockrpcclient.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_rpc.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_schema.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_sentry.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_test_alert.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_test_gate.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_test_zeromq.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_access_service.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_charset.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_cleanup.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_csv_export.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_databox.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_eventlog.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_kv_store.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_kv_store_multiple.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_matching.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_misc_functions.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_package_reader.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_presence.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_settings.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_validation.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tests/test_utils_vehicle.py +0 -0
- {openmodule-14.2.0rc0 → openmodule-14.3.0}/tox.ini +0 -0
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
CHANGES
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
-
v14.
|
|
5
|
-
|
|
4
|
+
v14.3.0
|
|
5
|
+
-------
|
|
6
6
|
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* fixed testcase
|
|
10
|
-
* added SignalListener
|
|
7
|
+
* Om 912: SignalListener and SignalSimulator for testcases
|
|
8
|
+
* OM-1001: CostEntryData from settings models, added valid\_from and valid\_to to AccessCheckAccess and type hints for io/signals and io/inputs settings
|
|
11
9
|
|
|
12
10
|
v14.1.1
|
|
13
11
|
-------
|
|
@@ -180,6 +178,16 @@ v12.0.0
|
|
|
180
178
|
* settings model 1.0
|
|
181
179
|
* small fix in test utils
|
|
182
180
|
|
|
181
|
+
v12.0.0.rc1
|
|
182
|
+
-----------
|
|
183
|
+
|
|
184
|
+
* removed debug entries from kv store removed cost\_entries from AccessCheckAccess
|
|
185
|
+
|
|
186
|
+
v12.0.0.rc0
|
|
187
|
+
-----------
|
|
188
|
+
|
|
189
|
+
* Removed parking\_area\_id from AccessCheckAccess changed gate permission check in AccessService to new behavior
|
|
190
|
+
|
|
183
191
|
v11.1.1
|
|
184
192
|
-------
|
|
185
193
|
|
|
@@ -194,3 +202,6 @@ v11.1.0
|
|
|
194
202
|
v11.0.3
|
|
195
203
|
-------
|
|
196
204
|
|
|
205
|
+
* Fixed typo, added compute\_id as label to all metrics, convert all label values to string
|
|
206
|
+
* touch to get rid of skip ci on my commit
|
|
207
|
+
* docs update [skip ci]
|
|
@@ -267,6 +267,23 @@ presence_sim.enter(self.presence_sim.vehicle().lpr("A", "G ARIVO1"))
|
|
|
267
267
|
on_enter.wait_for_call()
|
|
268
268
|
```
|
|
269
269
|
|
|
270
|
+
### SignalSimulator
|
|
271
|
+
|
|
272
|
+
Util class for simulating signals
|
|
273
|
+
|
|
274
|
+
```python
|
|
275
|
+
signal_simulator = SignalSimulator(lambda x: core().publish(x, "signal"))
|
|
276
|
+
# add_signal registers signals for RPC callbacks but does not emit signal message
|
|
277
|
+
signal_simulator.add_signal(False, None, SignalType.open, gate="einfahrt") # generates correct signal einfahrt-open
|
|
278
|
+
signal_simulator.add_signal(True, {"a": "b"}, SignalType.custom, signal_name="custom1")
|
|
279
|
+
# (change and) emit signals message
|
|
280
|
+
signal_simulator.set_signal("einfahrt-open", True)
|
|
281
|
+
signal_simulator.set_signal("custom1", True, {"a": "c"})
|
|
282
|
+
# register signal RPCs with callbacks from signal_simulator, which will automatically answer with correct response
|
|
283
|
+
rpc_server.register_handler("signal", "trigger_signals", TriggerSignalsRequest, TriggerSignalsResponse,
|
|
284
|
+
signal_simulator.trigger_signal_callback, register_schema=False)
|
|
285
|
+
```
|
|
286
|
+
|
|
270
287
|
### MockRPCClient
|
|
271
288
|
|
|
272
289
|
This is a fake RPCClient where you can either specify callback functions for RPCs or even the responses.
|
|
@@ -15,7 +15,28 @@ presence_listener = PresenceListener(core.messages)
|
|
|
15
15
|
presence_listener.on_enter.append(some_function)
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
## Signals
|
|
19
|
+
|
|
20
|
+
Helper class for listening on signals.
|
|
21
|
+
```python
|
|
22
|
+
from openmodule.utils.signal_listener import SignalListener, FilterType
|
|
23
|
+
|
|
24
|
+
signal_listener = SignalListener(core.messages, core.rpc_client)
|
|
25
|
+
# register a listener for a signal with a filter_type specifying when the function should be called and optional tag
|
|
26
|
+
signal_listener.add_listener("gate1-open", FilterType.any_edge, some_function, tag="tag1")
|
|
27
|
+
signal_listener.add_listener("gate2-present_decision", FilterType.any_change, some_function2, tag="tag2")
|
|
28
|
+
# get the current value (and additional_data) of a signal, if unknown then RPC is called to get value
|
|
29
|
+
value = signal_listener.get_value("gate1-open")
|
|
30
|
+
value, additional_data = signal_listener.get_value_and_additional_data("gate1-open")
|
|
31
|
+
# trigger resending of signals via trigger_signals RPC for registered signals with specific tag
|
|
32
|
+
# or all registered signals if tag is None
|
|
33
|
+
signal_listener.trigger_signals(tag="tag1")
|
|
34
|
+
# remove listeners with specific tag or all if tag is None
|
|
35
|
+
signal_listener.remove_listener(tag="tag1")
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## Databox Upload
|
|
19
40
|
|
|
20
41
|
In the openmodule we have a utils function to simplify the upload with the databox service. The prerequisite is,
|
|
21
42
|
that the upload folder `/data/om_service_databox_1/upload` is mounted correctly in the compose file to the `settings.DATABOX_UPLOAD_DIR` (default: `/upload`)
|
|
@@ -65,12 +65,17 @@ class AccessCheckAccess(OpenModuleModel):
|
|
|
65
65
|
category: AccessCategory # category used for sorting and eventlog
|
|
66
66
|
used_medium: Medium # medium of the access
|
|
67
67
|
access_data: Dict # complete access data, will be used only for display and debug purposes
|
|
68
|
+
valid_from: Optional[datetime] # access is valid from this time. Only used for reservations
|
|
69
|
+
valid_to: Optional[datetime] # access is valid until this time. Only used for reservations
|
|
68
70
|
|
|
69
71
|
accepted: bool # if access service decided access can enter
|
|
70
72
|
reject_reason: Optional[AccessCheckRejectReason] # only if not accepted: reason for not accepted
|
|
71
73
|
# additional infos shown in events if reject reason is "custom". Required if reject_reason == "custom"
|
|
72
74
|
supplementary_infos: Optional[str]
|
|
73
75
|
|
|
76
|
+
_tz_valid_from = timezone_validator("valid_from")
|
|
77
|
+
_tz_valid_to = timezone_validator("valid_to")
|
|
78
|
+
|
|
74
79
|
@root_validator(skip_on_failure=True)
|
|
75
80
|
def root_validation(cls, values):
|
|
76
81
|
# if category is handauf, medium_display_name must be set
|
|
@@ -5,16 +5,17 @@ from datetime import datetime
|
|
|
5
5
|
from decimal import Decimal
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from json.encoder import ESCAPE_ASCII
|
|
8
|
-
from typing import Optional, Union
|
|
8
|
+
from typing import Optional, Union, Dict
|
|
9
9
|
|
|
10
10
|
import orjson
|
|
11
11
|
import zmq
|
|
12
12
|
from dateutil.tz import UTC
|
|
13
|
-
from pydantic import Field, BaseModel, validator
|
|
13
|
+
from pydantic import Field, BaseModel, validator
|
|
14
14
|
from pydantic.main import ROOT_KEY
|
|
15
15
|
|
|
16
16
|
from openmodule import config, sentry
|
|
17
17
|
from openmodule.config import settings
|
|
18
|
+
from settings_models.settings.common import CostEntryData as SettingsModelsCostEntryData
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
def _donotuse(v, *, default):
|
|
@@ -171,20 +172,5 @@ class Gateway(OpenModuleModel):
|
|
|
171
172
|
return f"{self.gate}/{self.direction}"
|
|
172
173
|
|
|
173
174
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
value: Optional[Union[int, str]]
|
|
177
|
-
group: Optional[str]
|
|
178
|
-
account_id: str
|
|
179
|
-
source: Optional[str] # if None, source will be set to service name on default: e.g. "service_iocontroller"
|
|
180
|
-
source_id: Optional[str]
|
|
181
|
-
idempotency_key: Optional[str]
|
|
182
|
-
|
|
183
|
-
@root_validator
|
|
184
|
-
def set_value_type(cls, values):
|
|
185
|
-
if values["entry_type"] in ["rate_change", "rate_validation", "partial_rate_change"]:
|
|
186
|
-
values["value"] = str(values["value"])
|
|
187
|
-
elif values["entry_type"] in ["static_cost", "pending_static_cost", "amount_validation", "time_validation"
|
|
188
|
-
"payment"]:
|
|
189
|
-
values["value"] = int(values["value"])
|
|
190
|
-
return values
|
|
175
|
+
# to be not breaking
|
|
176
|
+
CostEntryData = SettingsModelsCostEntryData
|
openmodule-14.2.0rc0/openmodule/models/signal.py → openmodule-14.3.0/openmodule/models/signals.py
RENAMED
|
@@ -20,10 +20,10 @@ class SignalType(str, Enum):
|
|
|
20
20
|
class SignalMessage(ZMQMessage):
|
|
21
21
|
signal: str
|
|
22
22
|
type: Union[SignalType, str] # union so we can add new types without updating all services using signals
|
|
23
|
-
gate: Optional[str]
|
|
24
|
-
parking_area_id: Optional[str]
|
|
23
|
+
gate: Optional[str] = None
|
|
24
|
+
parking_area_id: Optional[str] = None
|
|
25
25
|
value: bool
|
|
26
|
-
additional_data: Optional[Dict]
|
|
26
|
+
additional_data: Optional[Dict] = None
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class GetSignalValueRequest(OpenModuleModel):
|
|
@@ -32,7 +32,7 @@ class GetSignalValueRequest(OpenModuleModel):
|
|
|
32
32
|
|
|
33
33
|
class GetSignalValueResponse(OpenModuleModel):
|
|
34
34
|
value: bool
|
|
35
|
-
additional_data: Optional[Dict]
|
|
35
|
+
additional_data: Optional[Dict] = None
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class TriggerSignalsRequest(OpenModuleModel):
|
|
@@ -2,7 +2,7 @@ import logging
|
|
|
2
2
|
import threading
|
|
3
3
|
import time
|
|
4
4
|
import warnings
|
|
5
|
-
from typing import Dict, Optional, List, Type
|
|
5
|
+
from typing import Dict, Optional, List, Type, TypeVar
|
|
6
6
|
from uuid import uuid4
|
|
7
7
|
|
|
8
8
|
import pydantic
|
|
@@ -18,6 +18,9 @@ from openmodule.models.rpc import RPCResponse, RPCRequest, RPCErrorResult, RPCSe
|
|
|
18
18
|
from openmodule.rpc.common import channel_to_response_topic, channel_to_request_topic
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
ResponseType = TypeVar('ResponseType', bound=OpenModuleModel)
|
|
22
|
+
|
|
23
|
+
|
|
21
24
|
class RPCClient:
|
|
22
25
|
class Exception(Exception):
|
|
23
26
|
pass
|
|
@@ -54,11 +57,11 @@ class RPCClient:
|
|
|
54
57
|
self.ready = threading.Event()
|
|
55
58
|
self.cancelled = False
|
|
56
59
|
|
|
57
|
-
def done(self):
|
|
60
|
+
def done(self) -> bool:
|
|
58
61
|
return bool(self.response)
|
|
59
62
|
|
|
60
63
|
@sentry.trace(op="rpc.result")
|
|
61
|
-
def result(self, response_type: Type[
|
|
64
|
+
def result(self, response_type: Type[ResponseType], timeout=None)-> ResponseType:
|
|
62
65
|
if timeout and (timeout > self.timeout):
|
|
63
66
|
warnings.warn("You cannot extend the timeout of an RPC after sending the request. "
|
|
64
67
|
"The timeout will be limited to at most the initial timeout.", stacklevel=2)
|
|
@@ -91,8 +94,8 @@ class RPCClient:
|
|
|
91
94
|
elif error_result.status == RPCServerError.error:
|
|
92
95
|
raise RPCClient.RPCServerError(error_result.error)
|
|
93
96
|
else:
|
|
94
|
-
|
|
95
|
-
|
|
97
|
+
raise RPCClient.ServerUnknownError("RPCErrorResult successfully parsed but status not handled."
|
|
98
|
+
" Implement this!")
|
|
96
99
|
except pydantic.ValidationError as e:
|
|
97
100
|
raise RPCClient.ValidationError(e.raw_errors, e.model)
|
|
98
101
|
|
|
@@ -158,7 +161,7 @@ class RPCClient:
|
|
|
158
161
|
self.results.pop(rpc_id, None)
|
|
159
162
|
self.sent_ids = {k: v for k, v in self.sent_ids.items() if v > now}
|
|
160
163
|
|
|
161
|
-
def _call(self, channel: str, typ: str, request: Dict, timeout: float):
|
|
164
|
+
def _call(self, channel: str, typ: str, request: Dict, timeout: float) -> RPCEntry:
|
|
162
165
|
rpc_id = str(uuid4())
|
|
163
166
|
|
|
164
167
|
request = RPCRequest(rpc_id=rpc_id, name=settings.NAME, request=request, type=typ)
|
|
@@ -191,8 +194,8 @@ class RPCClient:
|
|
|
191
194
|
|
|
192
195
|
return self._call(channel, type, request, timeout)
|
|
193
196
|
|
|
194
|
-
def rpc(self, channel: str, type: str, request: [Dict, BaseModel], response_type: Type[
|
|
195
|
-
timeout: float = None) ->
|
|
197
|
+
def rpc(self, channel: str, type: str, request: [Dict, BaseModel], response_type: Type[ResponseType],
|
|
198
|
+
timeout: float = None) -> ResponseType:
|
|
196
199
|
with sentry.trace(name=f"{channel}/{type}", op="rpc"):
|
|
197
200
|
entry = self.rpc_non_blocking(channel, type, request, timeout)
|
|
198
201
|
return entry.result(response_type, timeout=timeout)
|
|
@@ -10,6 +10,7 @@ from settings_models.settings.device_keys import PairingKey, Certificate, Otp
|
|
|
10
10
|
from settings_models.settings.enforcement import EnforcementSettings
|
|
11
11
|
from settings_models.settings.gate_control import GateMode, DayMode
|
|
12
12
|
from settings_models.settings.intercom import IntercomSettings
|
|
13
|
+
from settings_models.settings.io import SignalDefinitions, InputDefinitions
|
|
13
14
|
|
|
14
15
|
from openmodule import sentry
|
|
15
16
|
from openmodule.core import core
|
|
@@ -195,6 +196,14 @@ class SettingsProvider:
|
|
|
195
196
|
def get(self, key: Literal["feature_flags"]) -> dict: # pragma: no cover
|
|
196
197
|
...
|
|
197
198
|
|
|
199
|
+
@overload
|
|
200
|
+
def get(self, key: Literal["io/signals"]) -> SignalDefinitions: # pragma: no cover
|
|
201
|
+
...
|
|
202
|
+
|
|
203
|
+
@overload
|
|
204
|
+
def get(self, key: Literal["io/inputs"]) -> InputDefinitions: # pragma: no cover
|
|
205
|
+
...
|
|
206
|
+
|
|
198
207
|
def get(self, key: str, scope: str = "", custom_type: Optional[Type[T]] = None) -> Optional[T]:
|
|
199
208
|
key_scope = join_key(key, scope)
|
|
200
209
|
with self._cache_lock:
|
|
@@ -5,7 +5,7 @@ from typing import Optional, Dict, Callable, List, Tuple
|
|
|
5
5
|
|
|
6
6
|
import zmq
|
|
7
7
|
from openmodule.dispatcher import MessageDispatcher
|
|
8
|
-
from openmodule.models.
|
|
8
|
+
from openmodule.models.signals import SignalMessage, SignalType, GetSignalValueRequest, GetSignalValueResponse, \
|
|
9
9
|
TriggerSignalsRequest, TriggerSignalsResponse
|
|
10
10
|
from openmodule.rpc import RPCClient
|
|
11
11
|
|
|
@@ -56,10 +56,10 @@ class Signal:
|
|
|
56
56
|
class Listener:
|
|
57
57
|
def __init__(self, signal_name: str, filter_type: FilterType, callback: Callable[[Signal], None],
|
|
58
58
|
tag: Optional[str]):
|
|
59
|
-
self.signal_name = signal_name
|
|
60
|
-
self.filter_type = filter_type
|
|
61
|
-
self.callback = callback
|
|
62
|
-
self.tag = tag
|
|
59
|
+
self.signal_name: str = signal_name
|
|
60
|
+
self.filter_type: FilterType = filter_type
|
|
61
|
+
self.callback: Callable[[Signal], None] = callback
|
|
62
|
+
self.tag: Optional[str] = tag
|
|
63
63
|
|
|
64
64
|
def matches(self, signal_name: str, change_type: ChangeType) -> bool:
|
|
65
65
|
return self.signal_name == signal_name and self.filter_type.matches_change(change_type)
|
|
@@ -128,6 +128,7 @@ class SignalListener:
|
|
|
128
128
|
def trigger_signals(self, tag: Optional[str] = None, timeout: float = 3.0) -> bool:
|
|
129
129
|
"""
|
|
130
130
|
:param tag: if given, only signals of listeners with given tag are triggered
|
|
131
|
+
:param timeout: timeout for trigger RPC. Default is 3.0
|
|
131
132
|
"""
|
|
132
133
|
try:
|
|
133
134
|
with self.listeners_lock:
|
|
@@ -163,12 +164,12 @@ class SignalListener:
|
|
|
163
164
|
for listener in self.listeners:
|
|
164
165
|
"""
|
|
165
166
|
Handles the registered listeners the same as the dispatcher.
|
|
166
|
-
Is copied here because all messages are needed to keep current_states up to date.
|
|
167
|
+
Is copied here because all messages are needed to keep current_states up to date.
|
|
167
168
|
"""
|
|
168
169
|
if listener.matches(message.signal, change_type):
|
|
169
170
|
try:
|
|
170
171
|
listener.callback(Signal(message, change_type))
|
|
171
172
|
except zmq.ContextTerminated:
|
|
172
173
|
raise
|
|
173
|
-
except Exception
|
|
174
|
+
except Exception:
|
|
174
175
|
self.log.exception("Error in signal callback")
|
|
@@ -74,7 +74,7 @@ openmodule/models/presence.py
|
|
|
74
74
|
openmodule/models/privacy.py
|
|
75
75
|
openmodule/models/rpc.py
|
|
76
76
|
openmodule/models/settings.py
|
|
77
|
-
openmodule/models/
|
|
77
|
+
openmodule/models/signals.py
|
|
78
78
|
openmodule/models/validation.py
|
|
79
79
|
openmodule/models/vehicle.py
|
|
80
80
|
openmodule/rpc/__init__.py
|
|
@@ -97,7 +97,7 @@ openmodule/utils/package_reader.py
|
|
|
97
97
|
openmodule/utils/presence.py
|
|
98
98
|
openmodule/utils/schema.py
|
|
99
99
|
openmodule/utils/settings.py
|
|
100
|
-
openmodule/utils/
|
|
100
|
+
openmodule/utils/signal_listener.py
|
|
101
101
|
openmodule/utils/translation.py
|
|
102
102
|
openmodule/utils/validation.py
|
|
103
103
|
openmodule_commands/__init__.py
|
|
@@ -123,7 +123,7 @@ openmodule_test/sentry.py
|
|
|
123
123
|
openmodule_test/settings.py
|
|
124
124
|
openmodule_test/setup.cfg
|
|
125
125
|
openmodule_test/setup.py
|
|
126
|
-
openmodule_test/
|
|
126
|
+
openmodule_test/signal_simulator.py
|
|
127
127
|
openmodule_test/utils.py
|
|
128
128
|
openmodule_test/zeromq.py
|
|
129
129
|
tests/__init__.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "d1f88e5", "is_release": true}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import Callable, Optional
|
|
2
2
|
|
|
3
|
-
from openmodule.models.
|
|
3
|
+
from openmodule.models.signals import SignalMessage, TriggerSignalsRequest, TriggerSignalsResponse, \
|
|
4
4
|
GetSignalValueRequest, GetSignalValueResponse, SignalType
|
|
5
5
|
from openmodule.rpc import RPCClient
|
|
6
6
|
|
|
@@ -18,7 +18,7 @@ class SignalSimulator:
|
|
|
18
18
|
signal_msg = SignalMessage(signal=signal_name, type=signal_type, gate=gate, parking_area_id=parking_area_id,
|
|
19
19
|
value=value, additional_data=additional_data)
|
|
20
20
|
elif signal_type == SignalType.parkinglot_full:
|
|
21
|
-
signal_name =
|
|
21
|
+
signal_name = signal_type.value
|
|
22
22
|
signal_msg = SignalMessage(signal=signal_name, type=signal_type,
|
|
23
23
|
value=value, additional_data=additional_data)
|
|
24
24
|
elif signal_type == SignalType.area_full:
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import json
|
|
2
|
-
|
|
3
2
|
from datetime import datetime, timedelta
|
|
4
3
|
from typing import Optional
|
|
5
4
|
from unittest import TestCase
|
|
@@ -8,8 +7,7 @@ import freezegun
|
|
|
8
7
|
import orjson
|
|
9
8
|
from pydantic import ValidationError
|
|
10
9
|
|
|
11
|
-
from openmodule import
|
|
12
|
-
from openmodule.models.base import OpenModuleModel, ZMQMessage, Gateway, timezone_validator, CostEntryData
|
|
10
|
+
from openmodule.models.base import OpenModuleModel, ZMQMessage, Gateway, timezone_validator
|
|
13
11
|
|
|
14
12
|
|
|
15
13
|
class TestModel(OpenModuleModel):
|
|
@@ -138,11 +136,3 @@ class ZMQMessageTestCase(TestCase):
|
|
|
138
136
|
|
|
139
137
|
res1.pop("timestamp")
|
|
140
138
|
self.assertDictEqual(res1, {"name": "tä\nst", "type": "tö\tst"})
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
class CostEntryDataTextCase(TestCase):
|
|
144
|
-
def test_type_parsing(self):
|
|
145
|
-
res = CostEntryData.parse_raw(b'{"entry_type": "static_cost", "value": 10, "account_id": "0"}')
|
|
146
|
-
self.assertTrue(isinstance(res.value, int))
|
|
147
|
-
res = CostEntryData.parse_raw(b'{"entry_type": "rate_change", "value": "10", "account_id": "0"}')
|
|
148
|
-
self.assertTrue(isinstance(res.value, str))
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
from
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from openmodule.models.signals import SignalMessage, SignalType, TriggerSignalsRequest, TriggerSignalsResponse
|
|
2
4
|
from openmodule.rpc import RPCClient
|
|
3
|
-
from openmodule.utils.
|
|
4
|
-
|
|
5
|
+
from openmodule.utils.signal_listener import (SignalListener, GetSignalValueRequest, GetSignalValueResponse, FilterType,
|
|
6
|
+
ChangeType, Signal)
|
|
5
7
|
from openmodule_test.core import OpenModuleCoreTestMixin
|
|
6
8
|
from openmodule_test.eventlistener import MockEvent
|
|
7
9
|
from openmodule_test.rpc import MockRPCClient
|
|
@@ -186,7 +188,7 @@ class TestSignalListener(OpenModuleCoreTestMixin):
|
|
|
186
188
|
self.assertEqual(True, signal_listener.get_value("false"))
|
|
187
189
|
|
|
188
190
|
def test_trigger(self):
|
|
189
|
-
request = None
|
|
191
|
+
request: Optional[TriggerSignalsRequest] = None
|
|
190
192
|
res = TriggerSignalsResponse(success=True)
|
|
191
193
|
def trigger(req: TriggerSignalsRequest, _) -> bool:
|
|
192
194
|
nonlocal request, res
|
|
@@ -227,4 +229,3 @@ class TestSignalListener(OpenModuleCoreTestMixin):
|
|
|
227
229
|
with self.assertLogs() as log:
|
|
228
230
|
self.assertEqual(False, signal_listener.trigger_signals())
|
|
229
231
|
self.assertIn("Error while triggering signals.", str(log.output))
|
|
230
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"git_version": "06249ea", "is_release": true}
|
|
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
|
|
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
|
|
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
|