cardog 2.2.0__tar.gz → 2.4.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 (85) hide show
  1. {cardog-2.2.0 → cardog-2.4.0}/CHANGELOG.md +58 -5
  2. {cardog-2.2.0 → cardog-2.4.0}/PKG-INFO +2 -2
  3. {cardog-2.2.0 → cardog-2.4.0}/README.md +1 -1
  4. {cardog-2.2.0 → cardog-2.4.0}/openapi/openapi.v2.json +849 -419
  5. {cardog-2.2.0 → cardog-2.4.0}/pyproject.toml +1 -1
  6. {cardog-2.2.0 → cardog-2.4.0}/scripts/generate.py +41 -1
  7. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/__init__.py +3 -0
  8. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/_async_client.py +12 -1
  9. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/_base_client.py +38 -0
  10. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/_client.py +12 -1
  11. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/_constants.py +1 -1
  12. cardog-2.4.0/src/cardog/_versioning.py +63 -0
  13. cardog-2.4.0/src/cardog/v2/_api_version.py +15 -0
  14. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/recalls.py +4 -4
  15. cardog-2.4.0/src/cardog/v2/specs.py +71 -0
  16. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/types.py +68 -41
  17. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/vin.py +2 -2
  18. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/test_v2_urls.py +4 -2
  19. cardog-2.4.0/tests/v2/test_v2_version.py +122 -0
  20. cardog-2.2.0/src/cardog/v2/specs.py +0 -71
  21. {cardog-2.2.0 → cardog-2.4.0}/.gitignore +0 -0
  22. {cardog-2.2.0 → cardog-2.4.0}/Makefile +0 -0
  23. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/_credits.py +0 -0
  24. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/_exceptions.py +0 -0
  25. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/py.typed +0 -0
  26. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/__init__.py +0 -0
  27. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/charging.py +0 -0
  28. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/complaints.py +0 -0
  29. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/efficiency.py +0 -0
  30. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/fuel.py +0 -0
  31. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/history.py +0 -0
  32. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/listings.py +0 -0
  33. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/locations.py +0 -0
  34. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/market.py +0 -0
  35. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/recalls.py +0 -0
  36. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/research.py +0 -0
  37. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/safety.py +0 -0
  38. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/resources/vin.py +0 -0
  39. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/__init__.py +0 -0
  40. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/charging.py +0 -0
  41. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/common.py +0 -0
  42. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/complaints.py +0 -0
  43. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/efficiency.py +0 -0
  44. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/fuel.py +0 -0
  45. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/history.py +0 -0
  46. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/listings.py +0 -0
  47. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/locations.py +0 -0
  48. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/market.py +0 -0
  49. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/recalls.py +0 -0
  50. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/research.py +0 -0
  51. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/safety.py +0 -0
  52. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/types/vin.py +0 -0
  53. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/__init__.py +0 -0
  54. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/_support.py +0 -0
  55. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/charging.py +0 -0
  56. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/entities.py +0 -0
  57. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/feedback.py +0 -0
  58. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/feeds.py +0 -0
  59. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/instruments.py +0 -0
  60. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/listings.py +0 -0
  61. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/platform.py +0 -0
  62. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/quotes.py +0 -0
  63. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/safety.py +0 -0
  64. {cardog-2.2.0 → cardog-2.4.0}/src/cardog/v2/tape.py +0 -0
  65. {cardog-2.2.0 → cardog-2.4.0}/tests/__init__.py +0 -0
  66. {cardog-2.2.0 → cardog-2.4.0}/tests/conftest.py +0 -0
  67. {cardog-2.2.0 → cardog-2.4.0}/tests/test_client.py +0 -0
  68. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_async.py +0 -0
  69. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_charging.py +0 -0
  70. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_complaints.py +0 -0
  71. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_efficiency.py +0 -0
  72. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_fuel.py +0 -0
  73. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_listings.py +0 -0
  74. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_locations.py +0 -0
  75. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_market.py +0 -0
  76. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_recalls.py +0 -0
  77. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_research.py +0 -0
  78. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_safety.py +0 -0
  79. {cardog-2.2.0 → cardog-2.4.0}/tests/test_contracts_vin.py +0 -0
  80. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/__init__.py +0 -0
  81. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/spec_fixtures.py +0 -0
  82. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/test_v2_async.py +0 -0
  83. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/test_v2_credits.py +0 -0
  84. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/test_v2_errors.py +0 -0
  85. {cardog-2.2.0 → cardog-2.4.0}/tests/v2/test_v2_live_smoke.py +0 -0
@@ -2,11 +2,64 @@
2
2
 
3
3
  All notable changes to the Cardog Python SDK will be documented in this file.
4
4
 
5
- The SDK's major version tracks the API's major version. A contract change
6
- inside API 2.x, breaking or not, is a minor bump here and names the API
7
- pre-release it tracks. 3.0.0, published to PyPI on 2026-09-28, broke that
8
- rule and is yanked: `pip install cardog` no longer resolves to it, and a
9
- pin on `==3.0.0` still installs. Everything it carried is in 2.1.0.
5
+ The SDK's version follows the API version it pins. A release that pins a
6
+ new API date is a major, so a range like `cardog>=2.4,<3` never crosses a
7
+ breaking API version; additive changes are minors and fixes are patches. The major
8
+ is never below the API's path major (`/v2` → 2). The first pin, 2.4.0, was
9
+ a minor. Before general availability a contract change inside API 2.x was
10
+ a minor bump that named the API pre-release it tracked. 3.0.0, published
11
+ to PyPI on 2026-09-28, broke that rule and is yanked: `pip install cardog`
12
+ no longer resolves to it, and a pin on `==3.0.0` still installs. Everything
13
+ it carried is in 2.1.0.
14
+
15
+ ## [2.4.0] - 2026-10-21
16
+
17
+ Pins API `2026-10-21`, the general availability of API 2.0 (CRDG-4356).
18
+ The response shapes are the ones 2.3.0 parses (2.0.0-rc.8), so nothing else
19
+ changes.
20
+
21
+ ### Changed
22
+
23
+ - `cardog.PINNED_API_VERSION` is `"2026-10-21"`, and every v2 request now
24
+ sends `Cardog-Version: 2026-10-21`. `KNOWN_API_VERSIONS` is
25
+ `("2026-10-21",)`.
26
+ - The vendored OpenAPI document reports `info.version` `2026-10-21`.
27
+ - A release that pins a new API date from here on is a major: the next
28
+ breaking API version ships as 3.0.0.
29
+
30
+ ## [2.3.0] - 2026-10-15
31
+
32
+ Tracks API 2.0.0-rc.8. Breaking on `client.v2.specs` (CRDG-4535, CRDG-4563).
33
+ The SDK also pins an
34
+ API contract version (CRDG-4353); nothing on the wire changes for that until
35
+ the API's general availability.
36
+
37
+ ### Changed
38
+
39
+ - `SpecSheet` and `SpecSheetBuild` keep their root and gain `refs`
40
+ (`SpecRefs`, the same keys as the VIN identity card).
41
+ - A value in `sections` is a `SpecValue`: `value`, `unit` on every number
42
+ (metric; `HP` and `IN` kept), and `stated` (`SpecStated`) with the
43
+ source's own number when it published another unit.
44
+ - New `markets` (`SpecMarkets`: `us` / `ca`, each a `SpecMarket` with
45
+ `currency`, `pricing.msrp` as a list of `SpecPrice` (`trim`, `style`,
46
+ `msrp`, `source`) and `colors` as lists of `SpecColor` (`name`, `rgb`,
47
+ `hex`)). Markets are never merged.
48
+ - `trim_dependent`, `trims`, `unmapped` and the per-value `source`, `region`
49
+ and `disagreement` are gone.
50
+ - 2.2.x validates the old sheet on the way in and raises against rc.8;
51
+ 2.3.0 raises against rc.7. Upgrade when rc.8 is live, not before.
52
+
53
+ ### Added
54
+
55
+ - `cardog.PINNED_API_VERSION`: generated from the vendored OpenAPI
56
+ document and sent as `Cardog-Version` on every v2 request. `None` until
57
+ general availability, so no header is sent yet.
58
+ - `api_version=` on `Cardog` and `AsyncCardog` to speak another version.
59
+ - `client.last_version`: a `LastVersion(requested, latest)` read off the
60
+ `Cardog-Version` / `Cardog-Latest-Version` response headers.
61
+ - A request pinned past its support window raises `CardogAPIError` with
62
+ `code == "version_sunset"` and the migration link in `hint`.
10
63
 
11
64
  ## [2.2.0] - 2026-09-30
12
65
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cardog
3
- Version: 2.2.0
3
+ Version: 2.4.0
4
4
  Summary: Python SDK for the Cardog API — Canadian VIN decode, vehicle specs, live listings, market quotes, and Transport Canada + NHTSA recalls.
5
5
  Project-URL: Homepage, https://cardog.app
6
6
  Project-URL: Documentation, https://cardog.app/docs
@@ -159,7 +159,7 @@ asyncio.run(main())
159
159
  |-------|---------|
160
160
  | `client.v2.entities` | `browse(domain, ...)` · `resolve(q, ...)` · `get_by_ref(ref)` |
161
161
  | `client.v2.vin` | `get_by_vin(vin)` · `batch(vins)` · `recalls(vin)` · `listings(vin)` · `instrument(vin)` |
162
- | `client.v2.specs` | `catalog()` · `sheet(ref, trim=...)` |
162
+ | `client.v2.specs` | `catalog()` · `sheet(ref, trim=...)` · `sheet_by_build(code)` |
163
163
  | `client.v2.listings` | `search(...)` · `count(...)` · `facets(...)` · `by_vin(vin)` · `by_id(id)` |
164
164
  | `client.v2.instruments` | `search(q=..., limit=...)` · `get_by_ref(ref, window=...)` |
165
165
  | `client.v2.quotes` | `get_by_ref(ref)` · `get_many(refs)` |
@@ -125,7 +125,7 @@ asyncio.run(main())
125
125
  |-------|---------|
126
126
  | `client.v2.entities` | `browse(domain, ...)` · `resolve(q, ...)` · `get_by_ref(ref)` |
127
127
  | `client.v2.vin` | `get_by_vin(vin)` · `batch(vins)` · `recalls(vin)` · `listings(vin)` · `instrument(vin)` |
128
- | `client.v2.specs` | `catalog()` · `sheet(ref, trim=...)` |
128
+ | `client.v2.specs` | `catalog()` · `sheet(ref, trim=...)` · `sheet_by_build(code)` |
129
129
  | `client.v2.listings` | `search(...)` · `count(...)` · `facets(...)` · `by_vin(vin)` · `by_id(id)` |
130
130
  | `client.v2.instruments` | `search(q=..., limit=...)` · `get_by_ref(ref, window=...)` |
131
131
  | `client.v2.quotes` | `get_by_ref(ref)` · `get_many(refs)` |