geocodio-library-python 0.6.0__tar.gz → 0.7.0__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 (39) hide show
  1. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/CHANGELOG.md +7 -1
  2. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/PKG-INFO +1 -1
  3. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/pyproject.toml +1 -1
  4. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/smoke_lists.py +2 -2
  5. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/src/geocodio/_version.py +1 -1
  6. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/src/geocodio/client.py +1 -1
  7. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/src/geocodio/models.py +4 -4
  8. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/e2e/test_api.py +7 -7
  9. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_distance.py +8 -8
  10. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_errors.py +1 -1
  11. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_geocode.py +9 -9
  12. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_reverse.py +5 -5
  13. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/uv.lock +1 -1
  14. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/.github/workflows/ci.yml +0 -0
  15. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/.github/workflows/publish.yml +0 -0
  16. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/.github/workflows/test-act-event-ci.json +0 -0
  17. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/.github/workflows/test-act-event-publish.json +0 -0
  18. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/.gitignore +0 -0
  19. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/LICENSE +0 -0
  20. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/README.md +0 -0
  21. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/requirements-dev.txt +0 -0
  22. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/setup.cfg +0 -0
  23. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/smoke.py +0 -0
  24. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/src/geocodio/__init__.py +0 -0
  25. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/src/geocodio/distance.py +0 -0
  26. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/src/geocodio/exceptions.py +0 -0
  27. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/test_pypi_release.py +0 -0
  28. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/__init__.py +0 -0
  29. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/conftest.py +0 -0
  30. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/e2e/__init__.py +0 -0
  31. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/e2e/test_batch_reverse.py +0 -0
  32. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/e2e/test_distance.py +0 -0
  33. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/e2e/test_lists_api.py +0 -0
  34. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/test_workflows.py +0 -0
  35. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/__init__.py +0 -0
  36. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_client.py +0 -0
  37. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_exceptions.py +0 -0
  38. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_geocoding.py +0 -0
  39. {geocodio_library_python-0.6.0 → geocodio_library_python-0.7.0}/tests/unit/test_models.py +0 -0
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.0] - 2026-03-12
11
+
12
+ ### Changed
13
+ - Updated default API version to v1.11
14
+
10
15
  ## [0.6.0] - 2026-02-24
11
16
 
12
17
  ### Changed
@@ -64,7 +69,8 @@ When ready to release:
64
69
  5. Push tags: `git push --tags`
65
70
  6. GitHub Actions will automatically publish to PyPI
66
71
 
67
- [Unreleased]: https://github.com/Geocodio/geocodio-library-python/compare/v0.6.0...HEAD
72
+ [Unreleased]: https://github.com/Geocodio/geocodio-library-python/compare/v0.7.0...HEAD
73
+ [0.7.0]: https://github.com/Geocodio/geocodio-library-python/compare/v0.6.0...v0.7.0
68
74
  [0.6.0]: https://github.com/Geocodio/geocodio-library-python/compare/v0.5.1...v0.6.0
69
75
  [0.5.1]: https://github.com/Geocodio/geocodio-library-python/compare/v0.5.0...v0.5.1
70
76
  [0.5.0]: https://github.com/Geocodio/geocodio-library-python/compare/v0.4.0...v0.5.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geocodio-library-python
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: A Python client for the Geocodio API
5
5
  Project-URL: Homepage, https://www.geocod.io
6
6
  Project-URL: Documentation, https://www.geocod.io/docs/?python
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "geocodio-library-python"
7
- version = "0.6.0"
7
+ version = "0.7.0"
8
8
  description = "A Python client for the Geocodio API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -57,7 +57,7 @@ def main():
57
57
  logger.info("Creating a new list...")
58
58
  file_content = "Zip\n20003\n20001"
59
59
  # --- Capture request details ---
60
- logger.info("REQUEST: POST /v1.9/lists")
60
+ logger.info("REQUEST: POST /v1.11/lists")
61
61
  logger.info(f"Request params: {{'api_key': '***', 'direction': 'forward', 'format': '{{A}}'}}")
62
62
  logger.info(f"Request files: {{'file': ('smoke_test_list.csv', {repr(file_content)})}}")
63
63
  new_list_response = client.create_list(
@@ -66,7 +66,7 @@ def main():
66
66
  format_="{{A}}"
67
67
  )
68
68
  # --- Capture response details ---
69
- logger.info("RESPONSE: POST /v1.9/lists")
69
+ logger.info("RESPONSE: POST /v1.11/lists")
70
70
  print_headers_and_body("Response", {
71
71
  "id": new_list_response.id,
72
72
  "file": new_list_response.file,
@@ -1,3 +1,3 @@
1
1
  """Version information for geocodio package."""
2
2
 
3
- __version__ = "0.6.0"
3
+ __version__ = "0.7.0"
@@ -43,7 +43,7 @@ from geocodio.exceptions import InvalidRequestError, AuthenticationError, Geocod
43
43
 
44
44
 
45
45
  class Geocodio:
46
- BASE_PATH = "/v1.10" # keep in sync with Geocodio's current version
46
+ BASE_PATH = "/v1.11" # keep in sync with Geocodio's current version
47
47
  DEFAULT_SINGLE_TIMEOUT = 5.0
48
48
  DEFAULT_BATCH_TIMEOUT = 1800.0 # 30 minutes
49
49
  LIST_API_TIMEOUT = 60.0
@@ -82,8 +82,8 @@ class Timezone(ApiModelMixin):
82
82
  @dataclass(slots=True, frozen=True)
83
83
  class CongressionalDistrict(ApiModelMixin):
84
84
  name: str
85
- district_number: int
86
- congress_number: str
85
+ district_number: Any = None
86
+ congress_number: Optional[str] = None
87
87
  ocd_id: Optional[str] = None
88
88
  extras: Dict[str, Any] = field(default_factory=dict, repr=False)
89
89
 
@@ -95,8 +95,8 @@ class StateLegislativeDistrict(ApiModelMixin):
95
95
  """
96
96
 
97
97
  name: str
98
- district_number: int
99
- chamber: str # 'house' or 'senate'
98
+ district_number: Any = None
99
+ chamber: Optional[str] = None # 'house' or 'senate'
100
100
  ocd_id: Optional[str] = None
101
101
  proportion: Optional[float] = None # Proportion of overlap with the address
102
102
  extras: Dict[str, Any] = field(default_factory=dict, repr=False)
@@ -111,7 +111,7 @@ def test_integration_with_fields(client):
111
111
  if fields.congressional_districts:
112
112
  cd = fields.congressional_districts[0]
113
113
  assert cd.name is not None
114
- assert isinstance(cd.district_number, int)
114
+ assert cd.district_number is not None
115
115
  assert cd.congress_number is not None
116
116
 
117
117
  if fields.census2020:
@@ -205,23 +205,23 @@ def test_integration_with_state_legislative_districts(client):
205
205
  if fields.state_legislative_districts:
206
206
  district = fields.state_legislative_districts[0]
207
207
  assert district.name is not None
208
- assert isinstance(district.district_number, int)
208
+ assert district.district_number is not None
209
209
  assert district.chamber in ["house", "senate"]
210
210
  if district.ocd_id:
211
211
  assert isinstance(district.ocd_id, str)
212
212
  if district.proportion:
213
- assert isinstance(district.proportion, float)
213
+ assert isinstance(district.proportion, (int, float))
214
214
 
215
215
  # Check upcoming state legislative districts
216
216
  if fields.state_legislative_districts_next:
217
217
  district = fields.state_legislative_districts_next[0]
218
218
  assert district.name is not None
219
- assert isinstance(district.district_number, int)
219
+ assert district.district_number is not None
220
220
  assert district.chamber in ["house", "senate"]
221
221
  if district.ocd_id:
222
222
  assert isinstance(district.ocd_id, str)
223
223
  if district.proportion:
224
- assert isinstance(district.proportion, float)
224
+ assert isinstance(district.proportion, (int, float))
225
225
 
226
226
 
227
227
  def test_integration_with_school_districts(client):
@@ -249,7 +249,7 @@ def test_integration_with_school_districts(client):
249
249
  district = fields.school_districts[0]
250
250
  assert district.name is not None
251
251
  if district.district_number:
252
- assert isinstance(district.district_number, str)
252
+ assert district.district_number is not None
253
253
  if district.lea_id:
254
254
  assert isinstance(district.lea_id, str)
255
255
  if district.nces_id:
@@ -676,7 +676,7 @@ def test_integration_with_congressional_district_variants(client):
676
676
  if fields.congressional_districts:
677
677
  for district in fields.congressional_districts:
678
678
  assert district.name is not None
679
- assert isinstance(district.district_number, int)
679
+ assert district.district_number is not None
680
680
  assert district.congress_number is not None
681
681
  if district.ocd_id:
682
682
  assert isinstance(district.ocd_id, str)
@@ -213,7 +213,7 @@ class TestDistance:
213
213
  """Test basic distance calculation."""
214
214
  def response_callback(request):
215
215
  assert request.method == "GET"
216
- assert "/v1.10/distance" in str(request.url)
216
+ assert "/v1.11/distance" in str(request.url)
217
217
  return httpx.Response(200, json=sample_distance_response())
218
218
 
219
219
  httpx_mock.add_callback(callback=response_callback)
@@ -464,7 +464,7 @@ def sample_job_status_response():
464
464
  "name": "My Job",
465
465
  "status": "COMPLETED",
466
466
  "progress": 100,
467
- "download_url": "https://api.geocod.io/v1.10/distance-jobs/123/download",
467
+ "download_url": "https://api.geocod.io/v1.11/distance-jobs/123/download",
468
468
  "total_calculations": 4,
469
469
  "calculations_completed": 4,
470
470
  "origins_count": 2,
@@ -502,7 +502,7 @@ def sample_jobs_list_response():
502
502
  "current_page": 1,
503
503
  "from": 1,
504
504
  "to": 2,
505
- "path": "/v1.10/distance-jobs",
505
+ "path": "/v1.11/distance-jobs",
506
506
  "per_page": 10
507
507
  }
508
508
 
@@ -656,7 +656,7 @@ class TestGeocodeWithDistance:
656
656
  """Test geocode with destination parameter."""
657
657
  def response_callback(request):
658
658
  url_str = str(request.url)
659
- assert "/v1.10/geocode" in url_str
659
+ assert "/v1.11/geocode" in url_str
660
660
  assert "destinations%5B%5D" in url_str or "destinations[]" in url_str.replace("%5B", "[").replace("%5D", "]")
661
661
  return httpx.Response(200, json=sample_geocode_with_distance_response())
662
662
 
@@ -673,7 +673,7 @@ class TestGeocodeWithDistance:
673
673
  """Test geocode with distance mode parameter."""
674
674
  def response_callback(request):
675
675
  url_str = str(request.url)
676
- assert "/v1.10/geocode" in url_str
676
+ assert "/v1.11/geocode" in url_str
677
677
  assert "distance_mode=driving" in url_str
678
678
  return httpx.Response(200, json=sample_geocode_with_distance_response())
679
679
 
@@ -689,7 +689,7 @@ class TestGeocodeWithDistance:
689
689
  """Test geocode with distance units parameter."""
690
690
  def response_callback(request):
691
691
  url_str = str(request.url)
692
- assert "/v1.10/geocode" in url_str
692
+ assert "/v1.11/geocode" in url_str
693
693
  assert "distance_units=km" in url_str
694
694
  return httpx.Response(200, json=sample_geocode_with_distance_response())
695
695
 
@@ -714,7 +714,7 @@ class TestReverseWithDistance:
714
714
  """Test reverse geocode with destination parameter."""
715
715
  def response_callback(request):
716
716
  url_str = str(request.url)
717
- assert "/v1.10/reverse" in url_str
717
+ assert "/v1.11/reverse" in url_str
718
718
  assert "destinations%5B%5D" in url_str or "destinations[]" in url_str.replace("%5B", "[").replace("%5D", "]")
719
719
  return httpx.Response(200, json=sample_geocode_with_distance_response())
720
720
 
@@ -731,7 +731,7 @@ class TestReverseWithDistance:
731
731
  """Test reverse geocode with distance mode parameter."""
732
732
  def response_callback(request):
733
733
  url_str = str(request.url)
734
- assert "/v1.10/reverse" in url_str
734
+ assert "/v1.11/reverse" in url_str
735
735
  assert "distance_mode=straightline" in url_str
736
736
  return httpx.Response(200, json=sample_geocode_with_distance_response())
737
737
 
@@ -9,7 +9,7 @@ def _add_err(httpx_mock, status_code):
9
9
  # this should actually make the request and see and error response
10
10
  # but we are mocking it here for testing purposes
11
11
  httpx_mock.add_response(
12
- url=httpx.URL("https://api.test/v1.10/geocode", params={"q": "bad input"}),
12
+ url=httpx.URL("https://api.test/v1.11/geocode", params={"q": "bad input"}),
13
13
  match_headers={"Authorization": "Bearer TEST_KEY"},
14
14
  json={"error": "boom"},
15
15
  status_code=status_code,
@@ -57,7 +57,7 @@ def test_geocode_single(client, httpx_mock):
57
57
 
58
58
  httpx_mock.add_callback(
59
59
  callback=response_callback,
60
- url=httpx.URL("https://api.test/v1.10/geocode", params={"q": "1109 N Highland St, Arlington, VA"}),
60
+ url=httpx.URL("https://api.test/v1.11/geocode", params={"q": "1109 N Highland St, Arlington, VA"}),
61
61
  match_headers={"Authorization": "Bearer TEST_KEY"},
62
62
  )
63
63
 
@@ -140,7 +140,7 @@ def test_geocode_batch(client, httpx_mock):
140
140
 
141
141
  httpx_mock.add_callback(
142
142
  callback=batch_response_callback,
143
- url=httpx.URL("https://api.test/v1.10/geocode"),
143
+ url=httpx.URL("https://api.test/v1.11/geocode"),
144
144
  match_headers={"Authorization": "Bearer TEST_KEY"},
145
145
  )
146
146
 
@@ -172,7 +172,7 @@ def test_geocode_structured_address(client, httpx_mock):
172
172
 
173
173
  httpx_mock.add_callback(
174
174
  callback=response_callback,
175
- url=httpx.URL("https://api.test/v1.10/geocode", params={
175
+ url=httpx.URL("https://api.test/v1.11/geocode", params={
176
176
  "street": "1109 N Highland St",
177
177
  "city": "Arlington",
178
178
  "state": "VA"
@@ -229,7 +229,7 @@ def test_geocode_with_fields(client, httpx_mock):
229
229
 
230
230
  httpx_mock.add_callback(
231
231
  callback=response_callback,
232
- url=httpx.URL("https://api.test/v1.10/geocode", params={
232
+ url=httpx.URL("https://api.test/v1.11/geocode", params={
233
233
  "q": "1109 Highland St, Arlington, VA",
234
234
  "fields": "timezone,cd"
235
235
  }),
@@ -292,7 +292,7 @@ def test_geocode_with_limit(client, httpx_mock):
292
292
 
293
293
  httpx_mock.add_callback(
294
294
  callback=response_callback,
295
- url=httpx.URL("https://api.test/v1.10/geocode", params={
295
+ url=httpx.URL("https://api.test/v1.11/geocode", params={
296
296
  "q": "1109 Highland St, Arlington, VA",
297
297
  "limit": "2"
298
298
  }),
@@ -371,7 +371,7 @@ def test_geocode_batch_with_nested_response(client, httpx_mock):
371
371
 
372
372
  httpx_mock.add_callback(
373
373
  callback=batch_response_callback,
374
- url=httpx.URL("https://api.test/v1.10/geocode"),
374
+ url=httpx.URL("https://api.test/v1.11/geocode"),
375
375
  match_headers={"Authorization": "Bearer TEST_KEY"},
376
376
  )
377
377
 
@@ -478,7 +478,7 @@ def test_geocode_batch_with_fields(client, httpx_mock):
478
478
 
479
479
  httpx_mock.add_callback(
480
480
  callback=batch_response_callback,
481
- url=httpx.URL("https://api.test/v1.10/geocode", params={"fields": "timezone,cd"}),
481
+ url=httpx.URL("https://api.test/v1.11/geocode", params={"fields": "timezone,cd"}),
482
482
  match_headers={"Authorization": "Bearer TEST_KEY"},
483
483
  )
484
484
 
@@ -558,7 +558,7 @@ def test_geocode_with_census_fields(client, httpx_mock):
558
558
 
559
559
  httpx_mock.add_callback(
560
560
  callback=response_callback,
561
- url=httpx.URL("https://api.test/v1.10/geocode", params={
561
+ url=httpx.URL("https://api.test/v1.11/geocode", params={
562
562
  "street": "1640 Main St",
563
563
  "city": "Sheldon",
564
564
  "state": "VT",
@@ -671,7 +671,7 @@ def test_geocode_with_stateleg_fields(client, httpx_mock):
671
671
 
672
672
  httpx_mock.add_callback(
673
673
  callback=response_callback,
674
- url=httpx.URL("https://api.test/v1.10/geocode", params={
674
+ url=httpx.URL("https://api.test/v1.11/geocode", params={
675
675
  "q": "600 Santa Ray Ave, Oakland CA 94610",
676
676
  "fields": "stateleg"
677
677
  }),
@@ -32,7 +32,7 @@ def test_reverse_single_coordinate(client, httpx_mock):
32
32
 
33
33
  httpx_mock.add_callback(
34
34
  callback=response_callback,
35
- url=httpx.URL("https://api.test/v1.10/reverse", params={"q": "38.886672,-77.094735"}),
35
+ url=httpx.URL("https://api.test/v1.11/reverse", params={"q": "38.886672,-77.094735"}),
36
36
  match_headers={"Authorization": "Bearer TEST_KEY"},
37
37
  )
38
38
 
@@ -110,7 +110,7 @@ def test_reverse_batch_coordinates(client, httpx_mock):
110
110
 
111
111
  httpx_mock.add_callback(
112
112
  callback=batch_response_callback,
113
- url=httpx.URL("https://api.test/v1.10/reverse"),
113
+ url=httpx.URL("https://api.test/v1.11/reverse"),
114
114
  match_headers={"Authorization": "Bearer TEST_KEY"},
115
115
  )
116
116
 
@@ -162,7 +162,7 @@ def test_reverse_with_fields(client, httpx_mock):
162
162
 
163
163
  httpx_mock.add_callback(
164
164
  callback=response_callback,
165
- url=httpx.URL("https://api.test/v1.10/reverse", params={
165
+ url=httpx.URL("https://api.test/v1.11/reverse", params={
166
166
  "q": "38.886672,-77.094735",
167
167
  "fields": "timezone,cd"
168
168
  }),
@@ -225,7 +225,7 @@ def test_reverse_with_limit(client, httpx_mock):
225
225
 
226
226
  httpx_mock.add_callback(
227
227
  callback=response_callback,
228
- url=httpx.URL("https://api.test/v1.10/reverse", params={
228
+ url=httpx.URL("https://api.test/v1.11/reverse", params={
229
229
  "q": "38.886672,-77.094735",
230
230
  "limit": "2"
231
231
  }),
@@ -244,7 +244,7 @@ def test_reverse_with_limit(client, httpx_mock):
244
244
  def test_reverse_invalid_coordinate(client, httpx_mock):
245
245
  # Arrange: stub the API call with error response
246
246
  httpx_mock.add_response(
247
- url=httpx.URL("https://api.test/v1.10/reverse", params={
247
+ url=httpx.URL("https://api.test/v1.11/reverse", params={
248
248
  "q": "invalid,coordinate"
249
249
  }),
250
250
  match_headers={"Authorization": "Bearer TEST_KEY"},
@@ -149,7 +149,7 @@ wheels = [
149
149
 
150
150
  [[package]]
151
151
  name = "geocodio-library-python"
152
- version = "0.6.0"
152
+ version = "0.7.0"
153
153
  source = { editable = "." }
154
154
  dependencies = [
155
155
  { name = "httpx" },