getresponse 0.1.2__tar.gz → 0.1.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 (70) hide show
  1. {getresponse-0.1.2 → getresponse-0.1.3}/PKG-INFO +1 -1
  2. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/_core.py +6 -1
  3. {getresponse-0.1.2 → getresponse-0.1.3}/pyproject.toml +1 -1
  4. getresponse-0.1.3/tests/test_query_building.py +51 -0
  5. getresponse-0.1.2/tests/test_query_building.py +0 -27
  6. {getresponse-0.1.2 → getresponse-0.1.3}/.gitignore +0 -0
  7. {getresponse-0.1.2 → getresponse-0.1.3}/README.md +0 -0
  8. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/__init__.py +0 -0
  9. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/_compat.py +0 -0
  10. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/_ratelimit.py +0 -0
  11. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/_resource_groups.py +0 -0
  12. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/client.py +0 -0
  13. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/models.py +0 -0
  14. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/py.typed +0 -0
  15. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/__init__.py +0 -0
  16. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/ab_tests.py +0 -0
  17. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/ab_tests_subject.py +0 -0
  18. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/accounts.py +0 -0
  19. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/addresses.py +0 -0
  20. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/autoresponders.py +0 -0
  21. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/campaigns_lists.py +0 -0
  22. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/carts.py +0 -0
  23. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/categories.py +0 -0
  24. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/click_tracks.py +0 -0
  25. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/contacts.py +0 -0
  26. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/custom_events.py +0 -0
  27. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/custom_fields.py +0 -0
  28. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/custom_reports.py +0 -0
  29. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/ecommerce.py +0 -0
  30. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/file_library.py +0 -0
  31. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/form_and_popup.py +0 -0
  32. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/forms.py +0 -0
  33. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/forms_and_popups.py +0 -0
  34. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/from_fields.py +0 -0
  35. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/gdpr_fields.py +0 -0
  36. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/imports.py +0 -0
  37. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/landing_page.py +0 -0
  38. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/landing_pages.py +0 -0
  39. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/legacy_forms.py +0 -0
  40. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/legacy_landing_pages.py +0 -0
  41. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/meta_fields.py +0 -0
  42. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/multimedia.py +0 -0
  43. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/newsletters.py +0 -0
  44. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/orders.py +0 -0
  45. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/predefined_fields.py +0 -0
  46. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/product_variants.py +0 -0
  47. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/products.py +0 -0
  48. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/rss_newsletters.py +0 -0
  49. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/search_contacts.py +0 -0
  50. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/shops.py +0 -0
  51. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/sms.py +0 -0
  52. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/sms_automation_messages.py +0 -0
  53. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/sms_messages.py +0 -0
  54. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/subscription_confirmations.py +0 -0
  55. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/suppressions.py +0 -0
  56. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/tags.py +0 -0
  57. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/taxes.py +0 -0
  58. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/tracking.py +0 -0
  59. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/transactional_emails.py +0 -0
  60. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/transactional_emails_templates.py +0 -0
  61. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/webinars.py +0 -0
  62. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/website.py +0 -0
  63. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/websites.py +0 -0
  64. {getresponse-0.1.2 → getresponse-0.1.3}/getresponse/resources/workflows.py +0 -0
  65. {getresponse-0.1.2 → getresponse-0.1.3}/tests/conftest.py +0 -0
  66. {getresponse-0.1.2 → getresponse-0.1.3}/tests/test_auth.py +0 -0
  67. {getresponse-0.1.2 → getresponse-0.1.3}/tests/test_errors.py +0 -0
  68. {getresponse-0.1.2 → getresponse-0.1.3}/tests/test_models.py +0 -0
  69. {getresponse-0.1.2 → getresponse-0.1.3}/tests/test_pagination.py +0 -0
  70. {getresponse-0.1.2 → getresponse-0.1.3}/tests/test_ratelimit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: getresponse
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Async, fully-typed Python client for the GetResponse v3 API.
5
5
  Project-URL: Repository, https://github.com/sistemitre/get-response
6
6
  Project-URL: Issues, https://github.com/sistemitre/get-response/issues
@@ -148,7 +148,12 @@ def _encode_query(query: dict[str, Any] | None) -> dict[str, Any] | None:
148
148
  if isinstance(value, Enum):
149
149
  encoded[key] = value.value
150
150
  elif isinstance(value, datetime):
151
- encoded[key] = value.isoformat()
151
+ # GetResponse expects Y-m-d\TH:i:sO (PHP date format): no sub-second precision,
152
+ # and the UTC offset without a colon (+0000, not +00:00) -- isoformat() produces
153
+ # neither. strftime's %z already omits the colon and %S excludes microseconds;
154
+ # a naive datetime (no tzinfo) formats with %z as an empty string, unchanged from
155
+ # isoformat()'s behavior for that case.
156
+ encoded[key] = value.strftime("%Y-%m-%dT%H:%M:%S%z")
152
157
  elif isinstance(value, bool):
153
158
  encoded[key] = "true" if value else "false"
154
159
  else:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "getresponse"
7
- version = "0.1.2"
7
+ version = "0.1.3"
8
8
  description = "Async, fully-typed Python client for the GetResponse v3 API."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,51 @@
1
+ """Bracket-notation query parameter building."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime, timedelta, timezone
6
+
7
+ import httpx
8
+
9
+ from getresponse import GetResponseClient
10
+
11
+
12
+ async def test_datetime_query_params_use_getresponse_date_format() -> None:
13
+ # GetResponse expects Y-m-d\TH:i:sO (PHP format): no sub-second precision, and the UTC
14
+ # offset without a colon (+0000, not Python's default +00:00).
15
+ captured: dict[str, httpx.URL] = {}
16
+
17
+ def handler(request: httpx.Request) -> httpx.Response:
18
+ captured["url"] = request.url
19
+ return httpx.Response(200, json=[])
20
+
21
+ async with GetResponseClient(api_key="k", transport=httpx.MockTransport(handler)) as c:
22
+ await c.contacts.get_contact_list(
23
+ query_created_on_from=datetime(2024, 1, 15, 10, 30, 0, 123456, tzinfo=timezone.utc),
24
+ query_created_on_to=datetime(
25
+ 2024, 1, 16, 10, 30, 0, tzinfo=timezone(timedelta(hours=5, minutes=30))
26
+ ),
27
+ )
28
+
29
+ params = captured["url"].params
30
+ assert params["query[createdOn][from]"] == "2024-01-15T10:30:00+0000"
31
+ assert params["query[createdOn][to]"] == "2024-01-16T10:30:00+0530"
32
+
33
+
34
+ async def test_query_params_use_bracket_notation_and_skip_none() -> None:
35
+ captured: dict[str, httpx.URL] = {}
36
+
37
+ def handler(request: httpx.Request) -> httpx.Response:
38
+ captured["url"] = request.url
39
+ return httpx.Response(200, json=[])
40
+
41
+ async with GetResponseClient(api_key="k", transport=httpx.MockTransport(handler)) as c:
42
+ await c.contacts.get_contact_list(
43
+ query_email="a@b.com", sort_name="asc", page=2, per_page=50
44
+ )
45
+
46
+ params = captured["url"].params
47
+ assert params["query[email]"] == "a@b.com"
48
+ assert params["sort[name]"] == "asc"
49
+ assert params["page"] == "2"
50
+ assert params["perPage"] == "50"
51
+ assert "query[name]" not in params
@@ -1,27 +0,0 @@
1
- """Bracket-notation query parameter building."""
2
-
3
- from __future__ import annotations
4
-
5
- import httpx
6
-
7
- from getresponse import GetResponseClient
8
-
9
-
10
- async def test_query_params_use_bracket_notation_and_skip_none() -> None:
11
- captured: dict[str, httpx.URL] = {}
12
-
13
- def handler(request: httpx.Request) -> httpx.Response:
14
- captured["url"] = request.url
15
- return httpx.Response(200, json=[])
16
-
17
- async with GetResponseClient(api_key="k", transport=httpx.MockTransport(handler)) as c:
18
- await c.contacts.get_contact_list(
19
- query_email="a@b.com", sort_name="asc", page=2, per_page=50
20
- )
21
-
22
- params = captured["url"].params
23
- assert params["query[email]"] == "a@b.com"
24
- assert params["sort[name]"] == "asc"
25
- assert params["page"] == "2"
26
- assert params["perPage"] == "50"
27
- assert "query[name]" not in params
File without changes
File without changes