port-ocean 0.24.19__tar.gz → 0.24.21__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.
- {port_ocean-0.24.19 → port_ocean-0.24.21}/PKG-INFO +1 -1
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/mixins/integrations.py +3 -1
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/sync_raw.py +16 -15
- port_ocean-0.24.21/port_ocean/tests/clients/port/mixins/test_integrations.py +205 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/pyproject.toml +1 -1
- {port_ocean-0.24.19 → port_ocean-0.24.21}/LICENSE.md +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/README.md +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Dockerfile.Deb +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Dockerfile.alpine +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Dockerfile.base.builder +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Dockerfile.base.runner +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Dockerfile.dockerignore +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Dockerfile.local +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/Makefile +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/entry_local.sh +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/grpcio.sh +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/integrations/_infra/init.sh +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/bootstrap.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cache/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cache/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cache/disk.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cache/errors.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cache/memory.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cli.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/defaults/__init___.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/defaults/clean.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/defaults/dock.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/defaults/group.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/list_integrations.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/main.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/new.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/pull.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/sail.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/commands/version.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/cookiecutter.json +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/extensions.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/hooks/post_gen_project.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.env.example +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.gitignore +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/.gitignore +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/blueprints.json +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/resources/port-app-config.yml +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/.port/spec.yaml +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CHANGELOG.md +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/CONTRIBUTING.md +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/README.md +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/changelog/.gitignore +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/debug.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/main.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/poetry.toml +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/pyproject.toml +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/sonar-project.properties +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/{{cookiecutter.integration_slug}}/tests/test_sample.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/auth/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/auth/auth_client.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/auth/oauth_client.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/authentication.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/client.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/mixins/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/mixins/blueprints.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/mixins/entities.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/mixins/migrations.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/mixins/organization.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/retry_transport.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/types.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/clients/port/utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/config/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/config/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/config/dynamic.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/config/settings.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/consumers/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/consumers/kafka_consumer.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/context/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/context/event.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/context/metric_resource.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/context/ocean.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/context/resource.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/defaults/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/defaults/clean.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/defaults/common.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/defaults/initialize.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/factory.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/http.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/kafka.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/once.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/polling.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/event_listener/webhooks_only.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/port/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/port/applier.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/port/get_related_entities.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/port/order_by_entities_dependencies.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entity_processor/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entity_processor/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entity_processor/jq_entity_processor.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/port_app_config/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/port_app_config/api.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/port_app_config/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/port_app_config/models.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/queue/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/queue/abstract_queue.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/queue/local_queue.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/resync_state_updater/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/resync_state_updater/updater.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/webhook/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/webhook/abstract_webhook_processor.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/webhook/processor_manager.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/webhook/webhook_event.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/events.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/handler.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/live_events.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/sync.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/models.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/ocean_types.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/utils/entity_topological_sorter.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/utils/utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/debug_cli.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/api.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/clients.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/context.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/core.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/port_defaults.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/exceptions/webhook_processor.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/helpers/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/helpers/async_client.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/helpers/metric/metric.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/helpers/metric/utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/helpers/retry.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/log/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/log/handlers.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/log/logger_setup.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/log/sensetive.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/middlewares.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/ocean.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/py.typed +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/run.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/sonar-project.properties +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/cache/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/cache/test_disk_cache.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/cache/test_memory_cache.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/oauth/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/oauth/test_oauth_client.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/port/mixins/test_entities.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/port/mixins/test_organization_mixin.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/conftest.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/conftest.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/defaults/test_common.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/entities_state_applier/test_applier.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/entity_processor/test_jq_entity_processor.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/mixins/test_live_events.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/port_app_config/test_api.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/port_app_config/test_base.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/queue/test_local_queue.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/webhook/test_abstract_webhook_processor.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/webhook/test_processor_manager.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/webhook/test_webhook_event.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/test_utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/utils/test_entity_topological_sorter.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/utils/test_resolve_entities_diff.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/fake_port_api.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/fixtures.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/integration.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/ocean_app.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/port_client.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/helpers/smoke_test.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/log/test_handlers.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/test_metric.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/test_ocean.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/test_smoke.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/utils/test_async_iterators.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/utils/test_cache.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/__init__.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/async_http.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/async_iterators.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/cache.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/ipc.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/misc.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/queue_utils.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/repeat.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/signal.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/utils/time.py +0 -0
- {port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/version.py +0 -0
@@ -228,9 +228,11 @@ class IntegrationClientMixin:
|
|
228
228
|
async def put_integration_sync_metrics(self, kind_metrics: dict[str, Any]) -> None:
|
229
229
|
logger.debug("starting PUT metrics request", kind_metrics=kind_metrics)
|
230
230
|
metrics_attributes = await self.get_metrics_attributes()
|
231
|
+
event_id = quote_plus(kind_metrics["eventId"])
|
232
|
+
kind_identifier = quote_plus(kind_metrics["kindIdentifier"])
|
231
233
|
url = (
|
232
234
|
metrics_attributes["ingestUrl"]
|
233
|
-
+ f"/syncMetrics/resync/{
|
235
|
+
+ f"/syncMetrics/resync/{event_id}/kind/{kind_identifier}"
|
234
236
|
)
|
235
237
|
headers = await self.auth.headers()
|
236
238
|
response = await self.client.put(
|
@@ -617,22 +617,23 @@ class SyncRawMixin(HandlerMixin, EventsMixin):
|
|
617
617
|
logger.info(f"Process finished for {resource.kind} with index {index}")
|
618
618
|
|
619
619
|
async def process_resource(self, resource: ResourceConfig, index: int, user_agent_type: UserAgentType) -> tuple[list[Entity], list[Exception]]:
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
620
|
+
with logger.contextualize(resource_kind=resource.kind, index=index):
|
621
|
+
if ocean.app.process_execution_mode == ProcessExecutionMode.multi_process:
|
622
|
+
id = uuid.uuid4()
|
623
|
+
logger.info(f"Starting subprocess with id {id}")
|
624
|
+
file_ipc_map = {
|
625
|
+
"process_resource": FileIPC(id, "process_resource",([],[IntegrationSubProcessFailedException(f"Subprocess failed for {resource.kind} with index {index}")])),
|
626
|
+
"topological_entities": FileIPC(id, "topological_entities",[]),
|
627
|
+
}
|
628
|
+
process = ProcessWrapper(target=self.process_resource_in_subprocess, args=(file_ipc_map,resource,index,user_agent_type))
|
629
|
+
process.start()
|
630
|
+
await process.join_async()
|
631
|
+
|
632
|
+
event.entity_topological_sorter.entities.extend(file_ipc_map["topological_entities"].load())
|
633
|
+
return file_ipc_map["process_resource"].load()
|
633
634
|
|
634
|
-
|
635
|
-
|
635
|
+
else:
|
636
|
+
return await self._process_resource(resource,index,user_agent_type)
|
636
637
|
|
637
638
|
async def _process_resource(self,resource: ResourceConfig, index: int, user_agent_type: UserAgentType)-> tuple[list[Entity], list[Exception]]:
|
638
639
|
# create resource context per resource kind, so resync method could have access to the resource
|
@@ -0,0 +1,205 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from unittest.mock import MagicMock, patch, AsyncMock
|
3
|
+
|
4
|
+
import pytest
|
5
|
+
import httpx
|
6
|
+
|
7
|
+
from port_ocean.clients.port.mixins.integrations import IntegrationClientMixin
|
8
|
+
|
9
|
+
|
10
|
+
TEST_INTEGRATION_IDENTIFIER = "test-integration"
|
11
|
+
TEST_INTEGRATION_VERSION = "1.0.0"
|
12
|
+
TEST_INGEST_URL = "https://api.example.com"
|
13
|
+
|
14
|
+
BASIC_KIND_METRICS = {
|
15
|
+
"eventId": "event-123",
|
16
|
+
"kindIdentifier": "service",
|
17
|
+
"metrics": {"count": 5},
|
18
|
+
}
|
19
|
+
|
20
|
+
KIND_METRICS_WITH_SLASH = {
|
21
|
+
"eventId": "event-456",
|
22
|
+
"kindIdentifier": "kind/kind1",
|
23
|
+
"metrics": {"count": 10},
|
24
|
+
}
|
25
|
+
|
26
|
+
EVENT_METRICS_WITH_SLASH = {
|
27
|
+
"eventId": "event/123",
|
28
|
+
"kindIdentifier": "service",
|
29
|
+
"metrics": {"count": 15},
|
30
|
+
}
|
31
|
+
|
32
|
+
BOTH_METRICS_WITH_SLASH = {
|
33
|
+
"eventId": "namespace/event/123",
|
34
|
+
"kindIdentifier": "app/service/v1",
|
35
|
+
"metrics": {"count": 20},
|
36
|
+
}
|
37
|
+
|
38
|
+
COMPLEX_KIND_METRICS = {
|
39
|
+
"eventId": "complete/test/123",
|
40
|
+
"kindIdentifier": "complex/kind/identifier",
|
41
|
+
"syncStart": "2024-01-01T00:00:00Z",
|
42
|
+
"syncEnd": "2024-01-01T01:00:00Z",
|
43
|
+
"metrics": {"totalEntities": 100, "successfulEntities": 95, "failedEntities": 5},
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
@pytest.fixture
|
48
|
+
def integration_client(monkeypatch: Any) -> IntegrationClientMixin:
|
49
|
+
"""Create an IntegrationClientMixin instance with mocked dependencies."""
|
50
|
+
auth = MagicMock()
|
51
|
+
auth.headers = AsyncMock()
|
52
|
+
auth.headers.return_value = {"Authorization": "Bearer test-token"}
|
53
|
+
|
54
|
+
client = MagicMock()
|
55
|
+
client.put = AsyncMock()
|
56
|
+
client.put.return_value = MagicMock()
|
57
|
+
client.put.return_value.status_code = 200
|
58
|
+
client.put.return_value.is_error = False
|
59
|
+
|
60
|
+
integration_client = IntegrationClientMixin(
|
61
|
+
integration_identifier=TEST_INTEGRATION_IDENTIFIER,
|
62
|
+
integration_version=TEST_INTEGRATION_VERSION,
|
63
|
+
auth=auth,
|
64
|
+
client=client,
|
65
|
+
)
|
66
|
+
|
67
|
+
mock_get_metrics_attributes = AsyncMock()
|
68
|
+
mock_get_metrics_attributes.return_value = {"ingestUrl": TEST_INGEST_URL}
|
69
|
+
monkeypatch.setattr(
|
70
|
+
integration_client, "get_metrics_attributes", mock_get_metrics_attributes
|
71
|
+
)
|
72
|
+
|
73
|
+
return integration_client
|
74
|
+
|
75
|
+
|
76
|
+
async def test_put_integration_sync_metrics_basic(
|
77
|
+
integration_client: IntegrationClientMixin,
|
78
|
+
) -> None:
|
79
|
+
"""Test basic functionality of put_integration_sync_metrics."""
|
80
|
+
with patch(
|
81
|
+
"port_ocean.clients.port.mixins.integrations.handle_port_status_code"
|
82
|
+
) as mock_handle:
|
83
|
+
await integration_client.put_integration_sync_metrics(BASIC_KIND_METRICS)
|
84
|
+
|
85
|
+
integration_client.get_metrics_attributes.assert_called_once()
|
86
|
+
|
87
|
+
integration_client.auth.headers.assert_called_once()
|
88
|
+
|
89
|
+
integration_client.client.put.assert_called_once()
|
90
|
+
call_args = integration_client.client.put.call_args
|
91
|
+
|
92
|
+
expected_url = f"{TEST_INGEST_URL}/syncMetrics/resync/event-123/kind/service"
|
93
|
+
assert call_args[0][0] == expected_url
|
94
|
+
|
95
|
+
expected_headers = {"Authorization": "Bearer test-token"}
|
96
|
+
assert call_args[1]["headers"] == expected_headers
|
97
|
+
|
98
|
+
expected_json = {"syncKindMetrics": BASIC_KIND_METRICS}
|
99
|
+
assert call_args[1]["json"] == expected_json
|
100
|
+
|
101
|
+
mock_handle.assert_called_once_with(
|
102
|
+
integration_client.client.put.return_value, should_log=False
|
103
|
+
)
|
104
|
+
|
105
|
+
|
106
|
+
async def test_put_integration_sync_metrics_with_slash_in_kind_identifier(
|
107
|
+
integration_client: IntegrationClientMixin,
|
108
|
+
) -> None:
|
109
|
+
"""Test put_integration_sync_metrics with forward slash in kindIdentifier."""
|
110
|
+
with patch("port_ocean.clients.port.mixins.integrations.handle_port_status_code"):
|
111
|
+
await integration_client.put_integration_sync_metrics(KIND_METRICS_WITH_SLASH)
|
112
|
+
|
113
|
+
integration_client.client.put.assert_called_once()
|
114
|
+
call_args = integration_client.client.put.call_args
|
115
|
+
|
116
|
+
expected_url = (
|
117
|
+
f"{TEST_INGEST_URL}/syncMetrics/resync/event-456/kind/kind%2Fkind1"
|
118
|
+
)
|
119
|
+
assert call_args[0][0] == expected_url
|
120
|
+
|
121
|
+
expected_json = {"syncKindMetrics": KIND_METRICS_WITH_SLASH}
|
122
|
+
assert call_args[1]["json"] == expected_json
|
123
|
+
|
124
|
+
|
125
|
+
async def test_put_integration_sync_metrics_with_slash_in_event_id(
|
126
|
+
integration_client: IntegrationClientMixin,
|
127
|
+
) -> None:
|
128
|
+
"""Test put_integration_sync_metrics with forward slash in eventId."""
|
129
|
+
with patch("port_ocean.clients.port.mixins.integrations.handle_port_status_code"):
|
130
|
+
await integration_client.put_integration_sync_metrics(EVENT_METRICS_WITH_SLASH)
|
131
|
+
|
132
|
+
integration_client.client.put.assert_called_once()
|
133
|
+
call_args = integration_client.client.put.call_args
|
134
|
+
|
135
|
+
expected_url = f"{TEST_INGEST_URL}/syncMetrics/resync/event%2F123/kind/service"
|
136
|
+
assert call_args[0][0] == expected_url
|
137
|
+
|
138
|
+
|
139
|
+
async def test_put_integration_sync_metrics_with_slashes_in_both_fields(
|
140
|
+
integration_client: IntegrationClientMixin,
|
141
|
+
) -> None:
|
142
|
+
"""Test put_integration_sync_metrics with forward slashes in both eventId and kindIdentifier."""
|
143
|
+
with patch("port_ocean.clients.port.mixins.integrations.handle_port_status_code"):
|
144
|
+
await integration_client.put_integration_sync_metrics(BOTH_METRICS_WITH_SLASH)
|
145
|
+
|
146
|
+
integration_client.client.put.assert_called_once()
|
147
|
+
call_args = integration_client.client.put.call_args
|
148
|
+
|
149
|
+
expected_url = f"{TEST_INGEST_URL}/syncMetrics/resync/namespace%2Fevent%2F123/kind/app%2Fservice%2Fv1"
|
150
|
+
assert call_args[0][0] == expected_url
|
151
|
+
|
152
|
+
|
153
|
+
async def test_put_integration_sync_metrics_with_special_characters(
|
154
|
+
integration_client: IntegrationClientMixin,
|
155
|
+
) -> None:
|
156
|
+
"""Test put_integration_sync_metrics with various special characters that need URL encoding."""
|
157
|
+
special_metrics = {
|
158
|
+
"eventId": "event@123#test",
|
159
|
+
"kindIdentifier": "kind with spaces+symbols",
|
160
|
+
"metrics": {"count": 25},
|
161
|
+
}
|
162
|
+
|
163
|
+
with patch("port_ocean.clients.port.mixins.integrations.handle_port_status_code"):
|
164
|
+
await integration_client.put_integration_sync_metrics(special_metrics)
|
165
|
+
|
166
|
+
integration_client.client.put.assert_called_once()
|
167
|
+
call_args = integration_client.client.put.call_args
|
168
|
+
|
169
|
+
expected_url = f"{TEST_INGEST_URL}/syncMetrics/resync/event%40123%23test/kind/kind+with+spaces%2Bsymbols"
|
170
|
+
assert call_args[0][0] == expected_url
|
171
|
+
|
172
|
+
|
173
|
+
async def test_put_integration_sync_metrics_complete_flow(
|
174
|
+
integration_client: IntegrationClientMixin,
|
175
|
+
) -> None:
|
176
|
+
"""Test the complete flow of put_integration_sync_metrics method."""
|
177
|
+
with patch("port_ocean.clients.port.mixins.integrations.handle_port_status_code"):
|
178
|
+
await integration_client.put_integration_sync_metrics(COMPLEX_KIND_METRICS)
|
179
|
+
|
180
|
+
integration_client.get_metrics_attributes.assert_called_once()
|
181
|
+
integration_client.auth.headers.assert_called_once()
|
182
|
+
integration_client.client.put.assert_called_once()
|
183
|
+
|
184
|
+
call_args = integration_client.client.put.call_args
|
185
|
+
assert "complete%2Ftest%2F123" in call_args[0][0]
|
186
|
+
assert "complex%2Fkind%2Fidentifier" in call_args[0][0]
|
187
|
+
|
188
|
+
assert call_args[1]["json"]["syncKindMetrics"] == COMPLEX_KIND_METRICS
|
189
|
+
|
190
|
+
|
191
|
+
async def test_put_integration_sync_metrics_error_handling(
|
192
|
+
integration_client: IntegrationClientMixin,
|
193
|
+
monkeypatch: Any,
|
194
|
+
) -> None:
|
195
|
+
"""Test that put_integration_sync_metrics properly handles errors."""
|
196
|
+
mock_get_metrics_attributes = AsyncMock()
|
197
|
+
mock_get_metrics_attributes.side_effect = httpx.HTTPStatusError(
|
198
|
+
message="Test error", request=MagicMock(), response=MagicMock()
|
199
|
+
)
|
200
|
+
monkeypatch.setattr(
|
201
|
+
integration_client, "get_metrics_attributes", mock_get_metrics_attributes
|
202
|
+
)
|
203
|
+
|
204
|
+
with pytest.raises(httpx.HTTPStatusError):
|
205
|
+
await integration_client.put_integration_sync_metrics(BASIC_KIND_METRICS)
|
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
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/cli/cookiecutter/hooks/post_gen_project.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
|
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
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entities_state_applier/base.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/entity_processor/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/port_app_config/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/port_app_config/models.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/resync_state_updater/__init__.py
RENAMED
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/resync_state_updater/updater.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/handlers/webhook/processor_manager.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/integrations/mixins/live_events.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/core/utils/entity_topological_sorter.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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/oauth/test_oauth_client.py
RENAMED
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/clients/port/mixins/test_entities.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/mixins/test_live_events.py
RENAMED
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/mixins/test_sync_raw.py
RENAMED
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/port_app_config/test_api.py
RENAMED
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/handlers/queue/test_local_queue.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{port_ocean-0.24.19 → port_ocean-0.24.21}/port_ocean/tests/core/utils/test_resolve_entities_diff.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
|