onecdc 1.0.2__tar.gz → 1.2.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.
Files changed (162) hide show
  1. {onecdc-1.0.2 → onecdc-1.2.0}/.env.example +3 -2
  2. {onecdc-1.0.2 → onecdc-1.2.0}/.github/workflows/ci.yml +6 -1
  3. {onecdc-1.0.2 → onecdc-1.2.0}/CHANGELOG.md +179 -68
  4. {onecdc-1.0.2 → onecdc-1.2.0}/DESIGN.md +293 -329
  5. {onecdc-1.0.2 → onecdc-1.2.0}/Dockerfile +6 -6
  6. {onecdc-1.0.2 → onecdc-1.2.0}/PKG-INFO +144 -117
  7. onecdc-1.2.0/PLAN.md +38 -0
  8. onecdc-1.2.0/README.md +398 -0
  9. onecdc-1.2.0/README_API.md +258 -0
  10. onecdc-1.2.0/README_DB.md +381 -0
  11. onecdc-1.2.0/README_ENV.md +142 -0
  12. {onecdc-1.0.2 → onecdc-1.2.0}/assets/README.md +11 -12
  13. onecdc-1.2.0/attic/subconto_export.py +458 -0
  14. {onecdc-1.0.2 → onecdc-1.2.0}/audit/audit_0.2.1.html +5 -5
  15. {onecdc-1.0.2 → onecdc-1.2.0}/audit/audit_status_0.2.1.md +62 -61
  16. onecdc-1.2.0/config/handlers/__init__.py +16 -0
  17. {onecdc-1.0.2 → onecdc-1.2.0}/config/handlers/zakazy_klientov.py +33 -39
  18. onecdc-1.2.0/config/handlers/zakazy_klientov_clickhouse.py +170 -0
  19. {onecdc-1.0.2 → onecdc-1.2.0}/config/handlers/zakazy_klientov_grouped.py +34 -34
  20. onecdc-1.2.0/config/handlers/zakazy_klientov_grouped_clickhouse.py +200 -0
  21. onecdc-1.2.0/config/runner.py +163 -0
  22. {onecdc-1.0.2 → onecdc-1.2.0}/docker-compose.yml +11 -14
  23. {onecdc-1.0.2 → onecdc-1.2.0}/examples/full_load_once.py +5 -6
  24. onecdc-1.2.0/examples/replicate_forever.py +53 -0
  25. onecdc-1.0.2/onecdc-form-module.txt → onecdc-1.2.0/onecdc-form-module.bsl +67 -22
  26. onecdc-1.0.2/onecdc-throttle-module.txt → onecdc-1.2.0/onecdc-throttle-module.bsl +6 -4
  27. onecdc-1.2.0/onecdc.epf +0 -0
  28. {onecdc-1.0.2 → onecdc-1.2.0}/pyproject.toml +25 -16
  29. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/__main__.py +29 -32
  30. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/change_reader.py +30 -50
  31. onecdc-1.2.0/src/onecdc/common_functions.py +441 -0
  32. onecdc-1.2.0/src/onecdc/cron_runner.py +210 -0
  33. onecdc-1.2.0/src/onecdc/data_reader.py +920 -0
  34. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/db_logs.py +49 -72
  35. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/db_writer.py +32 -43
  36. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/full_load_claim.py +39 -59
  37. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/full_load_keys.py +35 -51
  38. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/handlers.py +161 -275
  39. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/lease.py +48 -77
  40. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/logging_config.py +10 -11
  41. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/metadata_reader.py +61 -87
  42. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/name_mapper.py +21 -30
  43. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/replicator.py +213 -234
  44. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/stop_signal.py +18 -22
  45. onecdc-1.2.0/src/onecdc/write_tracker.py +348 -0
  46. {onecdc-1.0.2 → onecdc-1.2.0}/tests/conftest.py +3 -3
  47. onecdc-1.2.0/tests/debug_config.py +88 -0
  48. {onecdc-1.0.2 → onecdc-1.2.0}/tests/debug_docker.sh +3 -3
  49. {onecdc-1.0.2 → onecdc-1.2.0}/tests/debug_run_forever.py +1 -1
  50. onecdc-1.2.0/tests/env_latest.sh +8 -0
  51. {onecdc-1.0.2 → onecdc-1.2.0}/tests/fake_1c.py +1 -1
  52. {onecdc-1.0.2 → onecdc-1.2.0}/tests/record_1c.py +5 -5
  53. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_cdc_run_once.py +3 -3
  54. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_cleared_attributes.py +4 -4
  55. onecdc-1.2.0/tests/test_clickhouse_handlers.py +292 -0
  56. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_composite_values.py +2 -2
  57. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_concurrent_merge.py +2 -2
  58. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_config_validation.py +7 -7
  59. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_cron_runner.py +3 -3
  60. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_debug_config.py +1 -1
  61. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_documentation.py +5 -5
  62. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_emptied_record_set.py +1 -1
  63. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_empty_table_part.py +9 -8
  64. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_entrypoint.py +27 -0
  65. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_examples.py +2 -2
  66. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_exclusivity.py +34 -3
  67. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_full_load.py +21 -21
  68. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_full_load_claim.py +6 -6
  69. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_handlers.py +16 -16
  70. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_log_retention.py +1 -1
  71. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_mark_missing.py +150 -16
  72. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_metadata_concurrency.py +2 -2
  73. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_metadata_objects.py +12 -0
  74. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_name_mapper.py +4 -4
  75. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_number_precision.py +4 -11
  76. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_object_classes.py +6 -42
  77. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_packaging.py +9 -9
  78. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_parameter_validation.py +5 -5
  79. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_register_metadata_classes.py +3 -3
  80. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_register_recorder_key.py +3 -3
  81. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_response_size_limit.py +2 -2
  82. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_response_trust.py +1 -1
  83. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_runner_template.py +32 -1
  84. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_schema_migration.py +1 -1
  85. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_secrets_in_logs.py +6 -6
  86. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_signal_delivery.py +4 -4
  87. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_snapshot_guard.py +5 -5
  88. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_sql_and_url_building.py +63 -6
  89. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_stop_behaviour.py +5 -5
  90. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_temp_schema.py +1 -1
  91. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_timestamptz_migration.py +10 -10
  92. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_type_change.py +2 -2
  93. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_unknown_types.py +3 -3
  94. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_unparseable_object.py +3 -3
  95. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_version_guard.py +7 -7
  96. onecdc-1.2.0/uv.lock +1317 -0
  97. onecdc-1.0.2/PLAN.md +0 -39
  98. onecdc-1.0.2/README.md +0 -374
  99. onecdc-1.0.2/README_API.md +0 -245
  100. onecdc-1.0.2/README_DB.md +0 -387
  101. onecdc-1.0.2/README_ENV.md +0 -132
  102. onecdc-1.0.2/config/handlers/__init__.py +0 -12
  103. onecdc-1.0.2/config/runner.py +0 -172
  104. onecdc-1.0.2/examples/replicate_forever.py +0 -56
  105. onecdc-1.0.2/onecdc.epf +0 -0
  106. onecdc-1.0.2/src/onecdc/common_functions.py +0 -447
  107. onecdc-1.0.2/src/onecdc/cron_runner.py +0 -247
  108. onecdc-1.0.2/src/onecdc/data_reader.py +0 -1401
  109. onecdc-1.0.2/src/onecdc/write_tracker.py +0 -329
  110. onecdc-1.0.2/tests/debug_config.py +0 -90
  111. onecdc-1.0.2/tests/env_latest.sh +0 -6
  112. onecdc-1.0.2/tests/test_accounting_ext_dimensions.py +0 -415
  113. onecdc-1.0.2/tests/test_json_export.py +0 -101
  114. onecdc-1.0.2/uv.lock +0 -754
  115. {onecdc-1.0.2 → onecdc-1.2.0}/.dockerignore +0 -0
  116. {onecdc-1.0.2 → onecdc-1.2.0}/.gitignore +0 -0
  117. {onecdc-1.0.2 → onecdc-1.2.0}/LICENSE +0 -0
  118. {onecdc-1.0.2 → onecdc-1.2.0}/assets/clear-all-32.png +0 -0
  119. {onecdc-1.0.2 → onecdc-1.2.0}/assets/clear-all-64.png +0 -0
  120. {onecdc-1.0.2 → onecdc-1.2.0}/assets/clear-object-32.png +0 -0
  121. {onecdc-1.0.2 → onecdc-1.2.0}/assets/clear-object-64.png +0 -0
  122. {onecdc-1.0.2 → onecdc-1.2.0}/assets/init-32.png +0 -0
  123. {onecdc-1.0.2 → onecdc-1.2.0}/assets/init-64.png +0 -0
  124. {onecdc-1.0.2 → onecdc-1.2.0}/assets/logo_dark.png +0 -0
  125. {onecdc-1.0.2 → onecdc-1.2.0}/assets/logo_light.png +0 -0
  126. {onecdc-1.0.2 → onecdc-1.2.0}/assets/make-icons.py +0 -0
  127. {onecdc-1.0.2 → onecdc-1.2.0}/assets/menu-32.png +0 -0
  128. {onecdc-1.0.2 → onecdc-1.2.0}/assets/menu-64.png +0 -0
  129. {onecdc-1.0.2 → onecdc-1.2.0}/assets/modes.png +0 -0
  130. {onecdc-1.0.2 → onecdc-1.2.0}/assets/modes.svg +0 -0
  131. {onecdc-1.0.2 → onecdc-1.2.0}/assets/odata-32.png +0 -0
  132. {onecdc-1.0.2 → onecdc-1.2.0}/assets/odata-64.png +0 -0
  133. {onecdc-1.0.2 → onecdc-1.2.0}/assets/refresh-32.png +0 -0
  134. {onecdc-1.0.2 → onecdc-1.2.0}/assets/refresh-64.png +0 -0
  135. {onecdc-1.0.2 → onecdc-1.2.0}/assets/scheme.png +0 -0
  136. {onecdc-1.0.2 → onecdc-1.2.0}/assets/scheme.svg +0 -0
  137. {onecdc-1.0.2 → onecdc-1.2.0}/assets/service-32.png +0 -0
  138. {onecdc-1.0.2 → onecdc-1.2.0}/assets/service-64.png +0 -0
  139. {onecdc-1.0.2 → onecdc-1.2.0}/assets/upload-all-32.png +0 -0
  140. {onecdc-1.0.2 → onecdc-1.2.0}/assets/upload-all-64.png +0 -0
  141. {onecdc-1.0.2 → onecdc-1.2.0}/assets/upload-object-32.png +0 -0
  142. {onecdc-1.0.2 → onecdc-1.2.0}/assets/upload-object-64.png +0 -0
  143. {onecdc-1.0.2 → onecdc-1.2.0}/doc/developer_guide_xml.pdf +0 -0
  144. {onecdc-1.0.2 → onecdc-1.2.0}/docker-entrypoint.sh +0 -0
  145. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/__init__.py +0 -0
  146. {onecdc-1.0.2 → onecdc-1.2.0}/src/onecdc/py.typed +0 -0
  147. {onecdc-1.0.2 → onecdc-1.2.0}/tests/buh_demo1.env +0 -0
  148. {onecdc-1.0.2 → onecdc-1.2.0}/tests/debug_buh.py +0 -0
  149. {onecdc-1.0.2 → onecdc-1.2.0}/tests/debug_trade.py +0 -0
  150. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/manifest.json +0 -0
  151. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/msg001_metadata.xml +0 -0
  152. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/msg002_nomenklatura.xml +0 -0
  153. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/msg003_zakaz_klienta.xml +0 -0
  154. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/msg004_kontragenti.xml +0 -0
  155. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/msg005_zakaz_klienta_2.xml +0 -0
  156. {onecdc-1.0.2 → onecdc-1.2.0}/tests/responses/trade_demo_8.5/msg006_realizatsiya.xml +0 -0
  157. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_empty_set_line_number.py +0 -0
  158. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_error_handling.py +0 -0
  159. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_logging.py +0 -0
  160. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_noise_and_tombstones.py +0 -0
  161. {onecdc-1.0.2 → onecdc-1.2.0}/tests/test_pipeline_replay.py +0 -0
  162. {onecdc-1.0.2 → onecdc-1.2.0}/tests/trade_demo1.env +0 -0
@@ -1,8 +1,9 @@
1
1
  # Значения для docker compose: скопируйте в .env рядом (он в .gitignore) и заполните.
2
2
  # cp .env.example .env
3
3
  #
4
- # Тот же файл читает и сам compose, и `uv run --env-file .env …`. Лабораторные стенды для отладки
5
- # описаны отдельно — tests/<контур>.env, они лежат в репозитории (см. tests/debug_config.py).
4
+ # Docker Compose подставляет отсюда только значения, указанные в compose-файле как ${ИМЯ};
5
+ # остальные настройки в примере docker-compose.yml заданы явно. `uv run --env-file .env …`
6
+ # передаёт весь файл в окружение. Тестовые стенды описаны отдельно: tests/debug_config.py.
6
7
 
7
8
  # --- обязательные ---
8
9
  ONECDC_ODATA_URL=http://server/base/odata/standard.odata
@@ -39,7 +39,7 @@ jobs:
39
39
  # бы каждый раз из «последних» версий.
40
40
  - run: uv sync --extra dev --locked
41
41
  # Тесты, которым нужна живая 1С, помечены integration и отсеиваются addopts из pyproject.
42
- # Postgres нужен всем остальным — его и поднимает services выше.
42
+ # PostgreSQL для тестов с фикстурой db запускается в services выше.
43
43
  - run: uv run pytest -q
44
44
  env:
45
45
  ONECDC_TEST_DB_URL: postgresql+psycopg2://postgres:postgres@localhost:5432/onecdc
@@ -51,3 +51,8 @@ jobs:
51
51
  #
52
52
  # Маска обязательна: в dist/ копятся артефакты прошлых версий, и публикация без неё спотыкается
53
53
  # об уже выложенное.
54
+ #
55
+ # Не `twine upload` из PATH. Системный twine бывает старым (5.0.0 с pkginfo 1.9.6 знает метаданные
56
+ # до 2.2), а hatchling собирает с Metadata-Version 2.5 — и такой twine падает с «Metadata is
57
+ # missing required fields: Name, Version», хотя оба поля на месте. Ловушка срабатывала дважды.
58
+ # Нужен twine — берите его отдельным окружением: `uvx twine upload dist/onecdc-<версия>*`.