From 450acde00ee526678384ebaa5ab618bd935ddab1 Mon Sep 17 00:00:00 2001 From: CodeMash Date: Tue, 13 Oct 2026 00:45:39 +0300 Subject: [PATCH 1/2] chore(types): regenerate hub references from gateway audit/marketplace 4ea6b84e2 x python update on references/hub_dtos.py against the campaign Community Hub (private stack). references/api_dtos.py is unchanged on purpose. New: the marketplace install-form, validation-step, function-run and function-call types, MarketplaceAvailability, MarketplaceFormKind, SecretValueFormat. Gone from the gateway: MarketplaceTokenMappingDto, MarketplaceTokenResolverKind, MarketplaceSecretValueFormat. Co-Authored-By: Claude Opus 5.5 --- references/hub_dtos.py | 176 +++++++++++++++++++++++++++++++++-------- 1 file changed, 143 insertions(+), 33 deletions(-) diff --git a/references/hub_dtos.py b/references/hub_dtos.py index 4e683c7..101a46a 100644 --- a/references/hub_dtos.py +++ b/references/hub_dtos.py @@ -1,5 +1,5 @@ """ Options: -Date: 2026-10-12 16:28:57 +Date: 2026-10-12 21:43:18 Version: 10.20 Tip: To override a DTO option, remove "#" prefix before updating BaseUrl: http://localhost:5001 @@ -128,6 +128,16 @@ class TokenMappingResolverType(str, Enum): EMAIL_FOOTERS = 'EmailFooters' OLD = 'Old' NEW = 'New' + REQUEST_INPUT = 'RequestInput' + INTEGRATION_CONFIG = 'IntegrationConfig' + INTEGRATION_SECRET = 'IntegrationSecret' + + +class SecretValueFormat(str, Enum): + RAW = 'Raw' + BEARER = 'Bearer' + BASIC = 'Basic' + PREFIXED = 'Prefixed' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -136,6 +146,8 @@ class TokenMappingDto: key: Optional[str] = None value: Optional[str] = None resolver: Optional[TokenMappingResolverType] = None + secret_keys: Optional[List[str]] = None + secret_format: Optional[SecretValueFormat] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -1565,6 +1577,7 @@ class TriggerActionSseDto(TriggerActionDto): class TriggerActionMarketplaceDto(TriggerActionDto): function_id: Optional[str] = None payload: Optional[Dict[str, str]] = None + run_as_user_id: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -2573,6 +2586,7 @@ class SchedulerTaskType(str, Enum): SMS_CAMPAIGN = 'SmsCampaign' CODE_FUNCTIONAL_CALL = 'CodeFunctionalCall' WEBHOOK_CALL = 'WebhookCall' + MARKETPLACE_FUNCTION_CALL = 'MarketplaceFunctionCall' @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -2774,6 +2788,17 @@ class MarketplaceCategory(str, Enum): CALENDAR = 'Calendar' +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class MarketplaceValidationStepResultDto: + key: Optional[str] = None + label: Optional[str] = None + required_for_functions: bool = False + succeeded: bool = False + skipped: bool = False + message: Optional[str] = None + + @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class MarketplaceIntegrationDto(IntegrationDto): @@ -2783,33 +2808,17 @@ class MarketplaceIntegrationDto(IntegrationDto): category: Optional[MarketplaceCategory] = None description: Optional[str] = None config: Optional[IReadOnlyDictionary[str, str]] = None - - -class MarketplaceTokenResolverKind(str, Enum): - STATIC = 'Static' - REQUEST = 'Request' - PROJECT = 'Project' - INITIATOR = 'Initiator' - CUSTOM = 'Custom' - INTEGRATION_CONFIG = 'IntegrationConfig' - INTEGRATION_SECRET = 'IntegrationSecret' - - -class MarketplaceSecretValueFormat(str, Enum): - RAW = 'Raw' - BEARER = 'Bearer' - BASIC = 'Basic' - PREFIXED = 'Prefixed' + last_validation_steps: Optional[List[MarketplaceValidationStepResultDto]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass -class MarketplaceTokenMappingDto: - token: Optional[str] = None - resolver: Optional[MarketplaceTokenResolverKind] = None - value: Optional[str] = None - secret_keys: Optional[List[str]] = None - format: Optional[MarketplaceSecretValueFormat] = None +class MarketplaceFunctionParameterDto: + name: Optional[str] = None + type: Optional[str] = None + description: Optional[str] = None + is_required: bool = False + default_value: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -2822,7 +2831,15 @@ class MarketplaceFunctionDto(IHasViewId): description: Optional[str] = None is_enabled: bool = False request_template: Optional[str] = None - mapped_tokens: List[MarketplaceTokenMappingDto] = field(default_factory=list) + arguments: Dict[str, str] = field(default_factory=dict) + inputs: List[MarketplaceFunctionParameterDto] = field(default_factory=list) + mapped_tokens: List[TokenMappingDto] = field(default_factory=list) + + +class MarketplaceAvailability(str, Enum): + DEVELOPMENT = 'Development' + STAGING = 'Staging' + PRODUCTION = 'Production' class MarketplaceFieldType(str, Enum): @@ -2852,12 +2869,10 @@ class MarketplaceFieldDefinitionDto: @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass -class MarketplaceFunctionParameterDto: - name: Optional[str] = None - type: Optional[str] = None - description: Optional[str] = None - is_required: bool = False - default_value: Optional[str] = None +class MarketplaceInstallFormDto: + data_schema: Optional[str] = None + ui_schema: Optional[str] = None + secret_keys: List[str] = field(default_factory=list) class MarketplaceParameterLocation(str, Enum): @@ -2889,6 +2904,25 @@ class MarketplaceHttpRequestSpecDto: content_type: Optional[str] = None +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class MarketplaceValidationStepDto: + key: Optional[str] = None + label: Optional[str] = None + description: Optional[str] = None + required_for_functions: bool = False + probe: Optional[MarketplaceHttpRequestSpecDto] = None + + +class MarketplaceFormKind(str, Enum): + GENERIC = 'Generic' + DATABASE_QUERY = 'DatabaseQuery' + DATABASE_WRITE = 'DatabaseWrite' + MESSAGE = 'Message' + PROMPT = 'Prompt' + WEB = 'Web' + + @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class MarketplaceFunctionDefinitionDto: @@ -2897,11 +2931,13 @@ class MarketplaceFunctionDefinitionDto: display_name: Optional[str] = None description: Optional[str] = None group: Optional[str] = None + form_kind: Optional[MarketplaceFormKind] = None + inputs: Optional[IReadOnlyList[MarketplaceFunctionParameterDto]] = None parameters: Optional[IReadOnlyList[MarketplaceFunctionParameterDto]] = None request_schema: Optional[str] = None request_template: Optional[str] = None request: Optional[MarketplaceHttpRequestSpecDto] = None - default_token_mappings: List[MarketplaceTokenMappingDto] = field(default_factory=list) + default_token_mappings: List[TokenMappingDto] = field(default_factory=list) @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -2916,11 +2952,15 @@ class MarketplaceListingDto(IHasViewId): description: Optional[str] = None icon_url: Optional[str] = None documentation_url: Optional[str] = None + video_url: Optional[str] = None + availability: Optional[MarketplaceAvailability] = None is_official: bool = False tags: Optional[IReadOnlyList[str]] = None spec_version: int = 0 config_fields: Optional[IReadOnlyList[MarketplaceFieldDefinitionDto]] = None secret_fields: Optional[IReadOnlyList[MarketplaceFieldDefinitionDto]] = None + install_form: Optional[MarketplaceInstallFormDto] = None + validation_steps: Optional[IReadOnlyList[MarketplaceValidationStepDto]] = None functions: Optional[IReadOnlyList[MarketplaceFunctionDefinitionDto]] = None @@ -3424,6 +3464,15 @@ class ScheduledTaskInfoDto: fired_at: datetime.datetime = datetime.datetime(1, 1, 1) +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class MarketplaceFunctionCallDto: + function_id: Optional[str] = None + function_key: Optional[str] = None + integration_id: Optional[str] = None + payload: Dict[str, Object] = field(default_factory=dict) + + @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CodeFunctionDataDto: @@ -3434,6 +3483,7 @@ class CodeFunctionDataDto: ai: Optional[AiUsageEventDto] = None task: Optional[ScheduledTaskInfoDto] = None payload: Optional[Dict[str, Object]] = None + marketplace: Optional[MarketplaceFunctionCallDto] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -3472,6 +3522,14 @@ class CodeFunctionSchedulerTaskRequest(SchedulerTaskRequest): mapped_tokens: Optional[List[TokenMappingDto]] = None +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class MarketplaceFunctionSchedulerTaskRequest(SchedulerTaskRequest): + type: Optional[SchedulerTaskType] = None + function_id: Optional[str] = None + payload: Optional[Dict[str, str]] = None + + class ICultureBasedRequest: culture_code: Optional[str] = None @@ -4949,6 +5007,8 @@ class InstallationLicenseStatusDto: host_kind: Optional[str] = None is_trial_license: bool = False license_expire_utc: Optional[datetime.datetime] = None + last_heartbeat_outcome: Optional[str] = None + last_heartbeat_error: Optional[str] = None message: Optional[str] = None @@ -5864,6 +5924,8 @@ class MarketplaceListingProjection(IHasViewId): is_official: bool = False tags: Optional[IReadOnlyList[str]] = None function_count: int = 0 + availability: Optional[MarketplaceAvailability] = None + video_url: Optional[str] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -5894,6 +5956,21 @@ class MarketplaceFunctionProjection(IHasViewId): mapping_count: int = 0 +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class MarketplaceFunctionRunDto: + fired_at: datetime.datetime = datetime.datetime(1, 1, 1) + event: Optional[str] = None + source: Optional[str] = None + function_id: Optional[str] = None + run_as_user_id: Optional[str] = None + succeeded: bool = False + duration_ms: Optional[int] = None + error: Optional[str] = None + vendor_request_id: Optional[str] = None + input: Optional[str] = None + + @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class CodeIntegrationListProjection(IntegrationListProjection): @@ -7985,6 +8062,7 @@ class RevealMarketplaceIntegrationSecretsResponse(ResponseBase): @dataclass class TestMarketplaceIntegrationResponse(ResponseBase): items: Optional[IReadOnlyList[IntegrationTestResultItemDto]] = None + steps: Optional[IReadOnlyList[MarketplaceValidationStepResultDto]] = None @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @@ -8011,6 +8089,12 @@ class GetMarketplaceFunctionCatalogResponse(ResponseBase): functions: Optional[IReadOnlyList[MarketplaceFunctionDefinitionDto]] = None +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class GetMarketplaceFunctionRunsResponse(ResponseBase): + runs: List[MarketplaceFunctionRunDto] = field(default_factory=list) + + @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass class InvokeMarketplaceFunctionResponse(ResponseBase): @@ -9360,6 +9444,7 @@ class InternalsTypeGen: typegen_281__fake_code_integration_dto: Optional[FakeCodeIntegrationDto] = None typegen_282__fake_code_integration_request: Optional[FakeCodeIntegrationRequest] = None typegen_283__code_function_scheduler_task_request: Optional[CodeFunctionSchedulerTaskRequest] = None + typegen_284__marketplace_function_scheduler_task_request: Optional[MarketplaceFunctionSchedulerTaskRequest] = None # @Route("/{version}/echo", "GET") @@ -15258,7 +15343,7 @@ class SetMarketplaceIntegrationTokenMappingsRequest(CodeMashRequestBase, IReturn """ - token_mappings: List[MarketplaceTokenMappingDto] = field(default_factory=list) + token_mappings: List[TokenMappingDto] = field(default_factory=list) # @Route("/{version}/code/marketplace/integrations/{IntegrationViewId}/catalog", "GET") @@ -15272,6 +15357,31 @@ class GetMarketplaceFunctionCatalog(CodeMashRequestBase, IReturn[GetMarketplaceF """ +# @Route("/{version}/code/marketplace/functions/runs", "GET") +@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) +@dataclass +class GetMarketplaceFunctionRuns(CodeMashRequestBase, IReturn[GetMarketplaceFunctionRunsResponse]): + # @ApiMember(Description="The trigger whose marketplace function runs to list (trg_…). One of triggerId / taskId.") + trigger_id: Optional[str] = None + """ + The trigger whose marketplace function runs to list (trg_…). One of triggerId / taskId. + """ + + + # @ApiMember(Description="The scheduler task whose marketplace function runs to list (tsk_…). One of triggerId / taskId.") + task_id: Optional[str] = None + """ + The scheduler task whose marketplace function runs to list (tsk_…). One of triggerId / taskId. + """ + + + # @ApiMember(DataType="integer", Description="How many runs, newest first: 1-50. Default 20.") + limit: Optional[int] = None + """ + How many runs, newest first: 1-50. Default 20. + """ + + # @Route("/{version}/code/functions", "GET") @dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE) @dataclass From 65ba9455873494117627ac3164adaf7f499d6343 Mon Sep 17 00:00:00 2001 From: CodeMash Date: Tue, 13 Oct 2026 00:45:39 +0300 Subject: [PATCH 2/2] feat(marketplace): the 23 marketplace routes on hub.code, sync and async MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hub.code (and AsyncNorbix) now carries every route of Code.Marketplace.md §14: listings, listing, listing function tokens, integrations CRUD, enable / disable, secrets replace / reveal, token mappings, test, catalog, functions CRUD, enable / disable, function tokens, invoke and get_marketplace_function_runs (GET /{version}/code/marketplace/functions/runs). tests/hub/test_code.py asserts verb, resolved path, query and body per method for both clients; docs/hub/code.md has the Marketplace table. Breaking: the binding methods (get_marketplace_bindings, save_marketplace_function_binding, get_marketplace_binding, delete_marketplace_function_binding, enable/disable_marketplace_function_binding, invoke_marketplace_function_binding, get_marketplace_binding_tokens) are removed: the gateway has no /bindings routes any more; use the *_marketplace_function methods. get_marketplace_function_catalog now calls GET .../catalog; the .../functions list is get_marketplace_functions. Co-Authored-By: Claude Opus 5.5 --- docs/hub/code.md | 42 +++- src/norbix_python/hub/code.py | 372 ++++++++++++++++++++++++---------- tests/hub/test_code.py | 248 +++++++++-------------- 3 files changed, 398 insertions(+), 264 deletions(-) diff --git a/docs/hub/code.md b/docs/hub/code.md index 8e026d1..e24df63 100644 --- a/docs/hub/code.md +++ b/docs/hub/code.md @@ -27,9 +27,45 @@ Integration ids look like `int_…`. | `disable_code_integration` | `PUT` | `/{version}/code/integrations/{Id}/disable` | `project` | path: `id` | | `delete_code_integration` | `DELETE` | `/{version}/code/integrations/{Id}` | `project` | path: `id` | -The 17 `*_marketplace_*` methods of the module are from an earlier -generation of the gateway contract (the `…/bindings` routes); the marketplace -is documented when its own campaign step lands. +## Marketplace + +The 23 routes of the gateway contract `Code.Marketplace.md` §14: the catalog +of listings, the installed connections (integration ids look like `int_…`), +their secrets and token mappings, and the functions added on a connection +(`func_…`). Every method, its verb, path, query and body are asserted in +`tests/hub/test_code.py`, for the sync and the async client. + +| Method | Verb | Path | Scope | Parameters go in | +| --- | --- | --- | --- | --- | +| `get_marketplace_listings` | `GET` | `/{version}/code/marketplace/listings` | `project` | query: `categories`, `transports`, `search`, `officialOnly`, `tags` | +| `get_marketplace_listing_function_tokens` | `GET` | `/{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens` | `project` | path: `listing_view_id`, `function_key` | +| `get_marketplace_integrations` | `GET` | `/{version}/code/marketplace/integrations` | `project` | — | +| `get_marketplace_integration` | `GET` | `/{version}/code/marketplace/integrations/{IntegrationViewId}` | `project` | path: `integration_view_id` | +| `save_marketplace_integration` | `POST` | `/{version}/code/marketplace/integrations` | `project` | JSON body: `integration`, `secrets` | +| `delete_marketplace_integration` | `DELETE` | `/{version}/code/marketplace/integrations/{IntegrationViewId}` | `project` | path: `integration_view_id` | +| `enable_marketplace_integration` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/enable` | `project` | path: `integration_view_id` | +| `disable_marketplace_integration` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/disable` | `project` | path: `integration_view_id` | +| `get_marketplace_functions` | `GET` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions` | `project` | path: `integration_view_id` | +| `get_marketplace_function` | `GET` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}` | `project` | path: `integration_view_id`, `function_view_id` | +| `save_marketplace_function` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions` | `project` | path: `integration_view_id`; JSON body: `function` | +| `delete_marketplace_function` | `DELETE` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}` | `project` | path: `integration_view_id`, `function_view_id` | +| `enable_marketplace_function` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/enable` | `project` | path: `integration_view_id`, `function_view_id` | +| `disable_marketplace_function` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/disable` | `project` | path: `integration_view_id`, `function_view_id` | +| `get_marketplace_function_tokens` | `GET` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/tokens` | `project` | path: `integration_view_id`, `function_view_id` | +| `invoke_marketplace_function` | `POST` | `/{version}/code/marketplace/functions/{FunctionViewId}/invoke` | `project` | path: `function_view_id`; JSON body: `payload` | +| `get_marketplace_listing` | `GET` | `/{version}/code/marketplace/listings/{ListingViewId}` | `project` | path: `listing_view_id` | +| `test_marketplace_integration` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/test` | `project` | path: `integration_view_id` | +| `replace_marketplace_integration_secrets` | `PUT` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/secrets` | `project` | path: `integration_view_id`; JSON body: `secrets` | +| `reveal_marketplace_integration_secrets` | `POST` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/secrets/reveal` | `project` | path: `integration_view_id` | +| `set_marketplace_integration_token_mappings` | `PUT` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/token-mappings` | `project` | path: `integration_view_id`; JSON body: `tokenMappings` | +| `get_marketplace_function_catalog` | `GET` | `/{version}/code/marketplace/integrations/{IntegrationViewId}/catalog` | `project` | path: `integration_view_id` | +| `get_marketplace_function_runs` | `GET` | `/{version}/code/marketplace/functions/runs` | `project` | query: exactly one of `triggerId` / `taskId`, `limit` (1–50, default 20); newest first | + +```python +listings = norbix.hub.code.get_marketplace_listings(search="slack") +runs = norbix.hub.code.get_marketplace_function_runs(triggerId="trg_…", limit=5) +result = norbix.hub.code.invoke_marketplace_function("func_…", payload={"text": "Order shipped"}) +``` ## Cloud functions diff --git a/src/norbix_python/hub/code.py b/src/norbix_python/hub/code.py index ea6d205..2248bd4 100644 --- a/src/norbix_python/hub/code.py +++ b/src/norbix_python/hub/code.py @@ -139,6 +139,32 @@ def get_code_integration(self, id: str, *, timeout: float | None = None, bearer_ bearer_token=bearer_token, ) + def get_marketplace_listings(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/listings""" + return self._transport.send( + target="hub", + path="/{version}/code/marketplace/listings", + method="GET", + path_params={}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + def get_marketplace_listing_function_tokens(self, listing_view_id: str, function_key: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens""" + return self._transport.send( + target="hub", + path="/{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens", + method="GET", + path_params={"ListingViewId": listing_view_id, "FunctionKey": function_key}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + def get_marketplace_integrations(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: """GET /{version}/code/marketplace/integrations""" return self._transport.send( @@ -152,6 +178,19 @@ def get_marketplace_integrations(self, *, timeout: float | None = None, bearer_t bearer_token=bearer_token, ) + def get_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}""" + return self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}", + method="GET", + path_params={"IntegrationViewId": integration_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + def save_marketplace_integration(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: """POST /{version}/code/marketplace/integrations""" return self._transport.send( @@ -178,12 +217,25 @@ def delete_marketplace_integration(self, integration_view_id: str, *, timeout: f bearer_token=bearer_token, ) - def get_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}""" + def enable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/enable""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}", - method="GET", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/enable", + method="POST", + path_params={"IntegrationViewId": integration_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + def disable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/disable""" + return self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/disable", + method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, scope="project", @@ -191,11 +243,11 @@ def get_marketplace_integration(self, integration_view_id: str, *, timeout: floa bearer_token=bearer_token, ) - def get_marketplace_bindings(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings""" + def get_marketplace_functions(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions", method="GET", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -204,11 +256,24 @@ def get_marketplace_bindings(self, integration_view_id: str, *, timeout: float | bearer_token=bearer_token, ) - def save_marketplace_function_binding(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings""" + def get_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}", + method="GET", + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + def save_marketplace_function(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/functions""" + return self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions", method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -217,89 +282,89 @@ def save_marketplace_function_binding(self, integration_view_id: str, *, timeout bearer_token=bearer_token, ) - def delete_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """DELETE /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}""" + def delete_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """DELETE /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}", method="DELETE", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def get_marketplace_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}""" + def enable_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/enable""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}", - method="GET", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/enable", + method="POST", + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def disable_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/disable""" + def disable_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/disable""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/disable", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/disable", method="POST", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def enable_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/enable""" + def get_marketplace_function_tokens(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/tokens""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/enable", - method="POST", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/tokens", + method="GET", + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def invoke_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/invoke""" + def invoke_marketplace_function(self, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/functions/{FunctionViewId}/invoke""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/invoke", + path="/{version}/code/marketplace/functions/{FunctionViewId}/invoke", method="POST", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def get_marketplace_binding_tokens(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/tokens""" + def get_marketplace_listing(self, listing_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/listings/{ListingViewId}""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/tokens", + path="/{version}/code/marketplace/listings/{ListingViewId}", method="GET", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"ListingViewId": listing_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def disable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/disable""" + def test_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/test""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/disable", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/test", method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -308,11 +373,24 @@ def disable_marketplace_integration(self, integration_view_id: str, *, timeout: bearer_token=bearer_token, ) - def enable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/enable""" + def replace_marketplace_integration_secrets(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """PUT /{version}/code/marketplace/integrations/{IntegrationViewId}/secrets""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/enable", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/secrets", + method="PUT", + path_params={"IntegrationViewId": integration_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + def reveal_marketplace_integration_secrets(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/secrets/reveal""" + return self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/secrets/reveal", method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -321,12 +399,12 @@ def enable_marketplace_integration(self, integration_view_id: str, *, timeout: f bearer_token=bearer_token, ) - def get_marketplace_function_catalog(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions""" + def set_marketplace_integration_token_mappings(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """PUT /{version}/code/marketplace/integrations/{IntegrationViewId}/token-mappings""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions", - method="GET", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/token-mappings", + method="PUT", path_params={"IntegrationViewId": integration_view_id}, request=request, scope="project", @@ -334,26 +412,26 @@ def get_marketplace_function_catalog(self, integration_view_id: str, *, timeout: bearer_token=bearer_token, ) - def get_marketplace_listings(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/listings""" + def get_marketplace_function_catalog(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/catalog""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/listings", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/catalog", method="GET", - path_params={}, + path_params={"IntegrationViewId": integration_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - def get_marketplace_listing_function_tokens(self, listing_view_id: str, function_key: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens""" + def get_marketplace_function_runs(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/functions/runs""" return self._transport.send( target="hub", - path="/{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens", + path="/{version}/code/marketplace/functions/runs", method="GET", - path_params={"ListingViewId": listing_view_id, "FunctionKey": function_key}, + path_params={}, request=request, scope="project", timeout=timeout, @@ -560,6 +638,32 @@ async def get_code_integration(self, id: str, *, timeout: float | None = None, b bearer_token=bearer_token, ) + async def get_marketplace_listings(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/listings""" + return await self._transport.send( + target="hub", + path="/{version}/code/marketplace/listings", + method="GET", + path_params={}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + async def get_marketplace_listing_function_tokens(self, listing_view_id: str, function_key: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens""" + return await self._transport.send( + target="hub", + path="/{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens", + method="GET", + path_params={"ListingViewId": listing_view_id, "FunctionKey": function_key}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + async def get_marketplace_integrations(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: """GET /{version}/code/marketplace/integrations""" return await self._transport.send( @@ -573,6 +677,19 @@ async def get_marketplace_integrations(self, *, timeout: float | None = None, be bearer_token=bearer_token, ) + async def get_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}""" + return await self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}", + method="GET", + path_params={"IntegrationViewId": integration_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + async def save_marketplace_integration(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: """POST /{version}/code/marketplace/integrations""" return await self._transport.send( @@ -599,12 +716,25 @@ async def delete_marketplace_integration(self, integration_view_id: str, *, time bearer_token=bearer_token, ) - async def get_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}""" + async def enable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/enable""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}", - method="GET", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/enable", + method="POST", + path_params={"IntegrationViewId": integration_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + async def disable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/disable""" + return await self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/disable", + method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, scope="project", @@ -612,11 +742,11 @@ async def get_marketplace_integration(self, integration_view_id: str, *, timeout bearer_token=bearer_token, ) - async def get_marketplace_bindings(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings""" + async def get_marketplace_functions(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions", method="GET", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -625,11 +755,24 @@ async def get_marketplace_bindings(self, integration_view_id: str, *, timeout: f bearer_token=bearer_token, ) - async def save_marketplace_function_binding(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings""" + async def get_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}", + method="GET", + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + async def save_marketplace_function(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/functions""" + return await self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions", method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -638,89 +781,89 @@ async def save_marketplace_function_binding(self, integration_view_id: str, *, t bearer_token=bearer_token, ) - async def delete_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """DELETE /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}""" + async def delete_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """DELETE /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}", method="DELETE", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def get_marketplace_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}""" + async def enable_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/enable""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}", - method="GET", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/enable", + method="POST", + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def disable_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/disable""" + async def disable_marketplace_function(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/disable""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/disable", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/disable", method="POST", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def enable_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/enable""" + async def get_marketplace_function_tokens(self, integration_view_id: str, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/tokens""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/enable", - method="POST", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions/{FunctionViewId}/tokens", + method="GET", + path_params={"IntegrationViewId": integration_view_id, "FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def invoke_marketplace_function_binding(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/invoke""" + async def invoke_marketplace_function(self, function_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/functions/{FunctionViewId}/invoke""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/invoke", + path="/{version}/code/marketplace/functions/{FunctionViewId}/invoke", method="POST", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"FunctionViewId": function_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def get_marketplace_binding_tokens(self, integration_view_id: str, binding_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/tokens""" + async def get_marketplace_listing(self, listing_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/listings/{ListingViewId}""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/bindings/{BindingViewId}/tokens", + path="/{version}/code/marketplace/listings/{ListingViewId}", method="GET", - path_params={"IntegrationViewId": integration_view_id, "BindingViewId": binding_view_id}, + path_params={"ListingViewId": listing_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def disable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/disable""" + async def test_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/test""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/disable", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/test", method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -729,11 +872,24 @@ async def disable_marketplace_integration(self, integration_view_id: str, *, tim bearer_token=bearer_token, ) - async def enable_marketplace_integration(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/enable""" + async def replace_marketplace_integration_secrets(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """PUT /{version}/code/marketplace/integrations/{IntegrationViewId}/secrets""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/enable", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/secrets", + method="PUT", + path_params={"IntegrationViewId": integration_view_id}, + request=request, + scope="project", + timeout=timeout, + bearer_token=bearer_token, + ) + + async def reveal_marketplace_integration_secrets(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """POST /{version}/code/marketplace/integrations/{IntegrationViewId}/secrets/reveal""" + return await self._transport.send( + target="hub", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/secrets/reveal", method="POST", path_params={"IntegrationViewId": integration_view_id}, request=request, @@ -742,12 +898,12 @@ async def enable_marketplace_integration(self, integration_view_id: str, *, time bearer_token=bearer_token, ) - async def get_marketplace_function_catalog(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/functions""" + async def set_marketplace_integration_token_mappings(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """PUT /{version}/code/marketplace/integrations/{IntegrationViewId}/token-mappings""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/integrations/{IntegrationViewId}/functions", - method="GET", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/token-mappings", + method="PUT", path_params={"IntegrationViewId": integration_view_id}, request=request, scope="project", @@ -755,26 +911,26 @@ async def get_marketplace_function_catalog(self, integration_view_id: str, *, ti bearer_token=bearer_token, ) - async def get_marketplace_listings(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/listings""" + async def get_marketplace_function_catalog(self, integration_view_id: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/integrations/{IntegrationViewId}/catalog""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/listings", + path="/{version}/code/marketplace/integrations/{IntegrationViewId}/catalog", method="GET", - path_params={}, + path_params={"IntegrationViewId": integration_view_id}, request=request, scope="project", timeout=timeout, bearer_token=bearer_token, ) - async def get_marketplace_listing_function_tokens(self, listing_view_id: str, function_key: str, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: - """GET /{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens""" + async def get_marketplace_function_runs(self, *, timeout: float | None = None, bearer_token: str | None = None, **request: Any) -> Any: + """GET /{version}/code/marketplace/functions/runs""" return await self._transport.send( target="hub", - path="/{version}/code/marketplace/listings/{ListingViewId}/functions/{FunctionKey}/tokens", + path="/{version}/code/marketplace/functions/runs", method="GET", - path_params={"ListingViewId": listing_view_id, "FunctionKey": function_key}, + path_params={}, request=request, scope="project", timeout=timeout, diff --git a/tests/hub/test_code.py b/tests/hub/test_code.py index 48f39ca..b238a72 100644 --- a/tests/hub/test_code.py +++ b/tests/hub/test_code.py @@ -27,23 +27,6 @@ def test_hub_code_module_surface() -> None: assert callable(module.disable_code_integration) assert callable(module.enable_code_integration) assert callable(module.get_code_integration) - assert callable(module.get_marketplace_integrations) - assert callable(module.save_marketplace_integration) - assert callable(module.delete_marketplace_integration) - assert callable(module.get_marketplace_integration) - assert callable(module.get_marketplace_bindings) - assert callable(module.save_marketplace_function_binding) - assert callable(module.delete_marketplace_function_binding) - assert callable(module.get_marketplace_binding) - assert callable(module.disable_marketplace_function_binding) - assert callable(module.enable_marketplace_function_binding) - assert callable(module.invoke_marketplace_function_binding) - assert callable(module.get_marketplace_binding_tokens) - assert callable(module.disable_marketplace_integration) - assert callable(module.enable_marketplace_integration) - assert callable(module.get_marketplace_function_catalog) - assert callable(module.get_marketplace_listings) - assert callable(module.get_marketplace_listing_function_tokens) # cloud functions (gateway audit/code, Code.Functions.md §3.3, §3.4, §5.1) assert callable(module.get_code_functions) assert callable(module.get_code_function_qualifiers) @@ -132,142 +115,6 @@ def test_hub_code_get_code_integration_request_shape() -> None: assert transport.last_request['url'].startswith('https://') -def test_hub_code_get_marketplace_integrations_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_integrations() - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_save_marketplace_integration_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.save_marketplace_integration() - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_delete_marketplace_integration_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.delete_marketplace_integration(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'DELETE' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_integration_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_integration(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_bindings_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_bindings(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_save_marketplace_function_binding_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.save_marketplace_function_binding(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_delete_marketplace_function_binding_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.delete_marketplace_function_binding(integration_view_id="stub-integration_view_id", binding_view_id="stub-binding_view_id") - assert transport.last_request['method'] == 'DELETE' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_binding_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_binding(integration_view_id="stub-integration_view_id", binding_view_id="stub-binding_view_id") - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_disable_marketplace_function_binding_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.disable_marketplace_function_binding(integration_view_id="stub-integration_view_id", binding_view_id="stub-binding_view_id") - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_enable_marketplace_function_binding_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.enable_marketplace_function_binding(integration_view_id="stub-integration_view_id", binding_view_id="stub-binding_view_id") - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_invoke_marketplace_function_binding_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.invoke_marketplace_function_binding(integration_view_id="stub-integration_view_id", binding_view_id="stub-binding_view_id") - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_binding_tokens_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_binding_tokens(integration_view_id="stub-integration_view_id", binding_view_id="stub-binding_view_id") - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_disable_marketplace_integration_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.disable_marketplace_integration(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_enable_marketplace_integration_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.enable_marketplace_integration(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'POST' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_function_catalog_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_function_catalog(integration_view_id="stub-integration_view_id") - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_listings_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_listings() - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - -def test_hub_code_get_marketplace_listing_function_tokens_request_shape() -> None: - client, transport = make_client(account_id=None) - client.hub.code.get_marketplace_listing_function_tokens(listing_view_id="stub-listing_view_id", function_key="stub-function_key") - assert transport.last_request['method'] == 'GET' - assert transport.last_request is not None - assert transport.last_request['url'].startswith('https://') - - # --- cloud functions --------------------------------------------------------- # # The five routes of Code.Functions.md: the verb, the resolved path, and where @@ -414,3 +261,98 @@ def test_invoke_code_function_sends_the_function_ref_in_the_body() -> None: assert transport.last_request is not None sent = json.loads(transport.last_request["body"]) assert sent == {"functionRef": FUNCTION_REF, "invocationType": "Async"} + + +# --- marketplace ------------------------------------------------------------- +# +# The 23 routes of Code.Marketplace.md §14: the verb, the resolved path (version +# and ids filled in) and where each parameter goes — GET / DELETE in the query +# string, POST / PUT in the JSON body. Sync and async against a capture +# transport, never a gateway. + +# name, verb, expected path, expected query (None: none), expected body (None: none), call +MARKETPLACE_CASES: list[FunctionCase] = [ + ("get_marketplace_listings", "GET", "/v3/code/marketplace/listings", {'search': ['slack']}, None, lambda m: m.get_marketplace_listings(search='slack')), + ("get_marketplace_listing_function_tokens", "GET", "/v3/code/marketplace/listings/ml_slack_v1/functions/slack.post-message/tokens", None, None, lambda m: m.get_marketplace_listing_function_tokens("ml_slack_v1", "slack.post-message")), + ("get_marketplace_integrations", "GET", "/v3/code/marketplace/integrations", None, None, lambda m: m.get_marketplace_integrations()), + ("get_marketplace_integration", "GET", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb", None, None, lambda m: m.get_marketplace_integration("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("save_marketplace_integration", "POST", "/v3/code/marketplace/integrations", None, {'integration': {'listingViewId': 'ml_slack_v1', 'config': {'workspace': 'acme'}}, 'secrets': {'botToken': 'xoxb-test'}}, lambda m: m.save_marketplace_integration(integration={'listingViewId': 'ml_slack_v1', 'config': {'workspace': 'acme'}}, secrets={'botToken': 'xoxb-test'})), + ("delete_marketplace_integration", "DELETE", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb", None, None, lambda m: m.delete_marketplace_integration("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("enable_marketplace_integration", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/enable", None, None, lambda m: m.enable_marketplace_integration("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("disable_marketplace_integration", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/disable", None, None, lambda m: m.disable_marketplace_integration("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("get_marketplace_functions", "GET", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions", None, None, lambda m: m.get_marketplace_functions("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("get_marketplace_function", "GET", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions/func_4hT2b9QkLm3XcT1yRfGh7a", None, None, lambda m: m.get_marketplace_function("int_6Qp1dW2kRm8NsT4vYc0Hb", "func_4hT2b9QkLm3XcT1yRfGh7a")), + ("save_marketplace_function", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions", None, {'function': {'functionKey': 'slack.post-message', 'displayName': 'Post order', 'arguments': {'channel': '#orders'}}}, lambda m: m.save_marketplace_function("int_6Qp1dW2kRm8NsT4vYc0Hb", function={'functionKey': 'slack.post-message', 'displayName': 'Post order', 'arguments': {'channel': '#orders'}})), + ("delete_marketplace_function", "DELETE", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions/func_4hT2b9QkLm3XcT1yRfGh7a", None, None, lambda m: m.delete_marketplace_function("int_6Qp1dW2kRm8NsT4vYc0Hb", "func_4hT2b9QkLm3XcT1yRfGh7a")), + ("enable_marketplace_function", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions/func_4hT2b9QkLm3XcT1yRfGh7a/enable", None, None, lambda m: m.enable_marketplace_function("int_6Qp1dW2kRm8NsT4vYc0Hb", "func_4hT2b9QkLm3XcT1yRfGh7a")), + ("disable_marketplace_function", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions/func_4hT2b9QkLm3XcT1yRfGh7a/disable", None, None, lambda m: m.disable_marketplace_function("int_6Qp1dW2kRm8NsT4vYc0Hb", "func_4hT2b9QkLm3XcT1yRfGh7a")), + ("get_marketplace_function_tokens", "GET", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/functions/func_4hT2b9QkLm3XcT1yRfGh7a/tokens", None, None, lambda m: m.get_marketplace_function_tokens("int_6Qp1dW2kRm8NsT4vYc0Hb", "func_4hT2b9QkLm3XcT1yRfGh7a")), + ("invoke_marketplace_function", "POST", "/v3/code/marketplace/functions/func_4hT2b9QkLm3XcT1yRfGh7a/invoke", None, {'payload': {'text': 'Order 6ac54a59 shipped'}}, lambda m: m.invoke_marketplace_function("func_4hT2b9QkLm3XcT1yRfGh7a", payload={'text': 'Order 6ac54a59 shipped'})), + ("get_marketplace_listing", "GET", "/v3/code/marketplace/listings/ml_slack_v1", None, None, lambda m: m.get_marketplace_listing("ml_slack_v1")), + ("test_marketplace_integration", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/test", None, None, lambda m: m.test_marketplace_integration("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("replace_marketplace_integration_secrets", "PUT", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/secrets", None, {'secrets': {'botToken': 'xoxb-new'}}, lambda m: m.replace_marketplace_integration_secrets("int_6Qp1dW2kRm8NsT4vYc0Hb", secrets={'botToken': 'xoxb-new'})), + ("reveal_marketplace_integration_secrets", "POST", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/secrets/reveal", None, None, lambda m: m.reveal_marketplace_integration_secrets("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("set_marketplace_integration_token_mappings", "PUT", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/token-mappings", None, {'tokenMappings': [{'key': 'channel', 'value': '#orders', 'resolver': 'Custom'}]}, lambda m: m.set_marketplace_integration_token_mappings("int_6Qp1dW2kRm8NsT4vYc0Hb", tokenMappings=[{'key': 'channel', 'value': '#orders', 'resolver': 'Custom'}])), + ("get_marketplace_function_catalog", "GET", "/v3/code/marketplace/integrations/int_6Qp1dW2kRm8NsT4vYc0Hb/catalog", None, None, lambda m: m.get_marketplace_function_catalog("int_6Qp1dW2kRm8NsT4vYc0Hb")), + ("get_marketplace_function_runs", "GET", "/v3/code/marketplace/functions/runs", {'triggerId': ['trg_1p4R3gTobGZpD6fXvHT4rd'], 'limit': ['5']}, None, lambda m: m.get_marketplace_function_runs(triggerId='trg_1p4R3gTobGZpD6fXvHT4rd', limit=5)), +] + + +@pytest.mark.parametrize(("name", "verb", "path", "query", "body", "call"), MARKETPLACE_CASES, ids=[c[0] for c in MARKETPLACE_CASES]) +def test_marketplace_request_shape( + name: str, + verb: str, + path: str, + query: dict[str, list[str]] | None, + body: dict[str, Any] | None, + call: Callable[[Any], Any], +) -> None: + client, transport = make_client() + call(client.hub.code) + assert transport.last_request is not None + _assert_function_request( + name, + transport.last_request["method"], + transport.last_request["url"], + transport.last_request["body"], + verb, + path, + query, + body, + ) + assert transport.last_request["headers"]["authorization"] == "Bearer test-token" + + +def test_async_marketplace_endpoints_hit_the_same_routes() -> None: + seen: list[httpx.Request] = [] + + def handler(request: httpx.Request) -> httpx.Response: + seen.append(request) + return httpx.Response(200, json={}) + + async def run() -> None: + client = AsyncNorbix( + project_id="test-project", + bearer_token="test-token", + http_client=httpx.AsyncClient(transport=httpx.MockTransport(handler)), + ) + try: + for _, _, _, _, _, call in MARKETPLACE_CASES: + await call(client.hub.code) + finally: + await client.aclose() + + asyncio.run(run()) + + assert len(seen) == len(MARKETPLACE_CASES) + for request, (name, verb, path, query, body, _) in zip(seen, MARKETPLACE_CASES, strict=True): + _assert_function_request(name, request.method, str(request.url), request.content.decode("utf-8"), verb, path, query, body) + + +def test_marketplace_surface_size() -> None: + """23 marketplace routes in the gateway (Code.Marketplace.md §14). A new one changes this count.""" + assert len(MARKETPLACE_CASES) == 23 + assert len({case[0] for case in MARKETPLACE_CASES}) == 23 + client, _ = make_client() + for name, *_ in MARKETPLACE_CASES: + assert callable(getattr(client.hub.code, name)), name