lumera 0.40.2.dev20260830__tar.gz → 0.40.3__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.
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/PKG-INFO +1 -1
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/netsuite.py +7 -2
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/PKG-INFO +1 -1
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/pyproject.toml +1 -1
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_netsuite.py +12 -7
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/__init__.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/_live.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/_utils.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/agents.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/automations.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/email.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/exceptions.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/files.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/flags.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/function_resources.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/__init__.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/__main__.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_artifacts.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_config.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_context.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_contract.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_dependencies.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_errors.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_execution.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_jsonschema.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_registry.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_remote.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_runner.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_runtime.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/testing.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/google.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/__init__.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/bill.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/finch.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/google.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/kafka.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/salesforce.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/slack.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/snowflake.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/llm.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/pb.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/__init__.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/__main__.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_api_child.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_archive.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_builder.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_config.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_contracts.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_errors.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_function_child.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_projection.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_runtime.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_runtime_child.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_schemas.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_target.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_worker_child.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/sdk.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/storage.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/webhooks.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/SOURCES.txt +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/dependency_links.txt +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/requires.txt +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/top_level.txt +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/setup.cfg +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_agents_live.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_automations.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_flags.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_function_resources.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_bill.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_finch.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_google.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_kafka.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_salesforce.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_snowflake.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_lazy_imports.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_sdk.py +0 -0
- {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_webhooks.py +0 -0
|
@@ -95,12 +95,17 @@ def get_token(api_name: str = "netsuite") -> NetSuiteToken:
|
|
|
95
95
|
get_m2m_token = get_token
|
|
96
96
|
|
|
97
97
|
|
|
98
|
+
def _account_domain_id(account_id: str) -> str:
|
|
99
|
+
"""Convert a NetSuite account ID to its account-specific domain label."""
|
|
100
|
+
return account_id.lower().replace("_", "-")
|
|
101
|
+
|
|
102
|
+
|
|
98
103
|
def _base_url(account_id: str) -> str:
|
|
99
|
-
return f"https://{account_id
|
|
104
|
+
return f"https://{_account_domain_id(account_id)}.suitetalk.api.netsuite.com"
|
|
100
105
|
|
|
101
106
|
|
|
102
107
|
def _restlet_base_url(account_id: str) -> str:
|
|
103
|
-
return f"https://{account_id
|
|
108
|
+
return f"https://{_account_domain_id(account_id)}.restlets.api.netsuite.com"
|
|
104
109
|
|
|
105
110
|
|
|
106
111
|
def _fetch_account_id(api_name: str) -> str:
|
|
@@ -82,6 +82,11 @@ def _install(monkeypatch: pytest.MonkeyPatch, session: MockSession) -> None:
|
|
|
82
82
|
monkeypatch.setattr(netsuite, "_get_session", lambda: session)
|
|
83
83
|
|
|
84
84
|
|
|
85
|
+
def test_base_urls_normalize_sandbox_account_id() -> None:
|
|
86
|
+
assert netsuite._base_url("12345_SB1") == "https://12345-sb1.suitetalk.api.netsuite.com"
|
|
87
|
+
assert netsuite._restlet_base_url("12345_SB1") == "https://12345-sb1.restlets.api.netsuite.com"
|
|
88
|
+
|
|
89
|
+
|
|
85
90
|
def test_fetch_account_id_uses_info_endpoint_and_caches(
|
|
86
91
|
monkeypatch: pytest.MonkeyPatch,
|
|
87
92
|
) -> None:
|
|
@@ -119,7 +124,7 @@ def test_proxy_client_suiteql_routes_through_api_proxy_with_pagination(
|
|
|
119
124
|
assert first_payload["provider"] == "netsuite"
|
|
120
125
|
assert first_payload["method"] == "POST"
|
|
121
126
|
assert first_payload["url"] == (
|
|
122
|
-
"https://
|
|
127
|
+
"https://12345-sb1.suitetalk.api.netsuite.com"
|
|
123
128
|
"/services/rest/query/v1/suiteql?limit=1&offset=0"
|
|
124
129
|
)
|
|
125
130
|
assert first_payload["body"] == {"q": "SELECT id FROM account"}
|
|
@@ -139,7 +144,7 @@ def test_proxy_client_create_record_returns_id_from_location_header(
|
|
|
139
144
|
DummyResponse(
|
|
140
145
|
status_code=204,
|
|
141
146
|
headers={
|
|
142
|
-
"Location": "https://
|
|
147
|
+
"Location": "https://12345-sb1.suitetalk.api.netsuite.com"
|
|
143
148
|
"/services/rest/record/v1/journalentry/9876"
|
|
144
149
|
},
|
|
145
150
|
)
|
|
@@ -170,7 +175,7 @@ def test_proxy_client_request_builds_url_with_params(monkeypatch: pytest.MonkeyP
|
|
|
170
175
|
assert payload["api_name"] == "netsuite_prod"
|
|
171
176
|
assert payload["method"] == "GET"
|
|
172
177
|
assert payload["url"] == (
|
|
173
|
-
"https://
|
|
178
|
+
"https://12345-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/vendor?limit=5"
|
|
174
179
|
)
|
|
175
180
|
assert payload["timeout_seconds"] == 120
|
|
176
181
|
assert call["timeout"] == 125
|
|
@@ -197,7 +202,7 @@ def test_proxy_client_call_restlet_uses_restlet_host(
|
|
|
197
202
|
assert payload["api_name"] == "netsuite_prod"
|
|
198
203
|
assert payload["method"] == "POST"
|
|
199
204
|
assert payload["url"] == (
|
|
200
|
-
"https://
|
|
205
|
+
"https://12345-sb1.restlets.api.netsuite.com"
|
|
201
206
|
"/app/site/hosting/restlet.nl?script=990&deploy=1&mode=attach"
|
|
202
207
|
)
|
|
203
208
|
assert payload["body"] == {"journalEntryId": "123"}
|
|
@@ -301,7 +306,7 @@ def test_module_suiteql_preserves_direct_transport(
|
|
|
301
306
|
assert len(calls) == 2
|
|
302
307
|
first = calls[0]
|
|
303
308
|
assert first["url"] == (
|
|
304
|
-
"https://
|
|
309
|
+
"https://12345-sb1.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql"
|
|
305
310
|
)
|
|
306
311
|
assert first["params"] == {"limit": 1, "offset": 0}
|
|
307
312
|
assert first["json"] == {"q": "SELECT id FROM account"}
|
|
@@ -330,7 +335,7 @@ def test_legacy_client_preserves_direct_record_transport(
|
|
|
330
335
|
return DummyResponse(
|
|
331
336
|
status_code=204,
|
|
332
337
|
headers={
|
|
333
|
-
"Location": "https://
|
|
338
|
+
"Location": "https://12345-sb1.suitetalk.api.netsuite.com"
|
|
334
339
|
"/services/rest/record/v1/journalentry/9876"
|
|
335
340
|
},
|
|
336
341
|
)
|
|
@@ -345,7 +350,7 @@ def test_legacy_client_preserves_direct_record_transport(
|
|
|
345
350
|
assert calls == [
|
|
346
351
|
{
|
|
347
352
|
"url": (
|
|
348
|
-
"https://
|
|
353
|
+
"https://12345-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/journalentry"
|
|
349
354
|
),
|
|
350
355
|
"json": {"memo": "existing automation"},
|
|
351
356
|
"headers": {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|