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.
Files changed (77) hide show
  1. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/PKG-INFO +1 -1
  2. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/netsuite.py +7 -2
  3. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/PKG-INFO +1 -1
  4. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/pyproject.toml +1 -1
  5. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_netsuite.py +12 -7
  6. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/__init__.py +0 -0
  7. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/_live.py +0 -0
  8. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/_utils.py +0 -0
  9. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/agents.py +0 -0
  10. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/automations.py +0 -0
  11. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/email.py +0 -0
  12. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/exceptions.py +0 -0
  13. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/files.py +0 -0
  14. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/flags.py +0 -0
  15. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/function_resources.py +0 -0
  16. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/__init__.py +0 -0
  17. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/__main__.py +0 -0
  18. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_artifacts.py +0 -0
  19. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_config.py +0 -0
  20. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_context.py +0 -0
  21. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_contract.py +0 -0
  22. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_dependencies.py +0 -0
  23. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_errors.py +0 -0
  24. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_execution.py +0 -0
  25. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_jsonschema.py +0 -0
  26. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_registry.py +0 -0
  27. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_remote.py +0 -0
  28. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_runner.py +0 -0
  29. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/_runtime.py +0 -0
  30. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/functions/testing.py +0 -0
  31. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/google.py +0 -0
  32. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/__init__.py +0 -0
  33. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/bill.py +0 -0
  34. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/finch.py +0 -0
  35. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/google.py +0 -0
  36. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/kafka.py +0 -0
  37. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/salesforce.py +0 -0
  38. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/slack.py +0 -0
  39. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/integrations/snowflake.py +0 -0
  40. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/llm.py +0 -0
  41. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/pb.py +0 -0
  42. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/__init__.py +0 -0
  43. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/__main__.py +0 -0
  44. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_api_child.py +0 -0
  45. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_archive.py +0 -0
  46. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_builder.py +0 -0
  47. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_config.py +0 -0
  48. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_contracts.py +0 -0
  49. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_errors.py +0 -0
  50. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_function_child.py +0 -0
  51. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_projection.py +0 -0
  52. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_runtime.py +0 -0
  53. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_runtime_child.py +0 -0
  54. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_schemas.py +0 -0
  55. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_target.py +0 -0
  56. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/releases/_worker_child.py +0 -0
  57. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/sdk.py +0 -0
  58. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/storage.py +0 -0
  59. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera/webhooks.py +0 -0
  60. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/SOURCES.txt +0 -0
  61. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/dependency_links.txt +0 -0
  62. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/requires.txt +0 -0
  63. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/lumera.egg-info/top_level.txt +0 -0
  64. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/setup.cfg +0 -0
  65. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_agents_live.py +0 -0
  66. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_automations.py +0 -0
  67. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_flags.py +0 -0
  68. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_function_resources.py +0 -0
  69. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_bill.py +0 -0
  70. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_finch.py +0 -0
  71. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_google.py +0 -0
  72. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_kafka.py +0 -0
  73. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_salesforce.py +0 -0
  74. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_integrations_snowflake.py +0 -0
  75. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_lazy_imports.py +0 -0
  76. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_sdk.py +0 -0
  77. {lumera-0.40.2.dev20260830 → lumera-0.40.3}/tests/test_webhooks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lumera
3
- Version: 0.40.2.dev20260830
3
+ Version: 0.40.3
4
4
  Summary: SDK for building on Lumera platform
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: requests
@@ -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.lower()}.suitetalk.api.netsuite.com"
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.lower()}.restlets.api.netsuite.com"
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lumera
3
- Version: 0.40.2.dev20260830
3
+ Version: 0.40.3
4
4
  Summary: SDK for building on Lumera platform
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: requests
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lumera"
3
- version = "0.40.2.dev20260830"
3
+ version = "0.40.3"
4
4
  description = "SDK for building on Lumera platform"
5
5
  requires-python = ">=3.11"
6
6
  dependencies = [
@@ -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://12345_sb1.suitetalk.api.netsuite.com"
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://12345_sb1.suitetalk.api.netsuite.com"
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://12345_sb1.suitetalk.api.netsuite.com/services/rest/record/v1/vendor?limit=5"
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://12345_sb1.restlets.api.netsuite.com"
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://12345_sb1.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql"
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://12345_sb1.suitetalk.api.netsuite.com"
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://12345_sb1.suitetalk.api.netsuite.com/services/rest/record/v1/journalentry"
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