parseapi 1.8.0__tar.gz → 1.9.1__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 (33) hide show
  1. {parseapi-1.8.0 → parseapi-1.9.1}/CHANGELOG.md +10 -0
  2. {parseapi-1.8.0 → parseapi-1.9.1}/PKG-INFO +71 -4
  3. {parseapi-1.8.0 → parseapi-1.9.1}/README.md +70 -3
  4. {parseapi-1.8.0 → parseapi-1.9.1}/api/public.json +713 -93
  5. {parseapi-1.8.0 → parseapi-1.9.1}/pyproject.toml +1 -1
  6. {parseapi-1.8.0 → parseapi-1.9.1}/src/parseapi/__init__.py +1 -1
  7. {parseapi-1.8.0 → parseapi-1.9.1}/src/parseapi/_client.py +168 -10
  8. parseapi-1.9.1/tests/fixtures/emoji-artwork.json +184 -0
  9. parseapi-1.9.1/tests/fixtures/emoji-catalog.json +95 -0
  10. parseapi-1.9.1/tests/test_company_directory.py +160 -0
  11. parseapi-1.9.1/tests/test_emoji.py +101 -0
  12. parseapi-1.9.1/tests/typing_company_directory.py +32 -0
  13. {parseapi-1.8.0 → parseapi-1.9.1}/.github/workflows/publish.yml +0 -0
  14. {parseapi-1.8.0 → parseapi-1.9.1}/.github/workflows/test.yml +0 -0
  15. {parseapi-1.8.0 → parseapi-1.9.1}/.gitignore +0 -0
  16. {parseapi-1.8.0 → parseapi-1.9.1}/LICENSE +0 -0
  17. {parseapi-1.8.0 → parseapi-1.9.1}/scripts/public_api.py +0 -0
  18. {parseapi-1.8.0 → parseapi-1.9.1}/smoke/smoke.py +0 -0
  19. {parseapi-1.8.0 → parseapi-1.9.1}/src/parseapi/py.typed +0 -0
  20. {parseapi-1.8.0 → parseapi-1.9.1}/tests/bank-fixtures.json +0 -0
  21. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_bank.py +0 -0
  22. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_card_dx.py +0 -0
  23. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_client.py +0 -0
  24. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_email_enrichment.py +0 -0
  25. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_language.py +0 -0
  26. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_name_formatting.py +0 -0
  27. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_postal_localities.py +0 -0
  28. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_public_api.py +0 -0
  29. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_stack.py +0 -0
  30. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_tariff.py +0 -0
  31. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_time_complete.py +0 -0
  32. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_time_gaps.py +0 -0
  33. {parseapi-1.8.0 → parseapi-1.9.1}/tests/test_version.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.1 — 2026-10-12
4
+
5
+ - Add Emoji search/browse, categories, catalog, metadata, parsing and conversion; keep existing lookup calls and response decoding compatible.
6
+ - Support optional SVG/PNG artwork and translated names. Preserve API 2.0.0 selection, plans and existing non-Emoji behavior.
7
+
8
+ ## 1.9.0 — 2026-09-29
9
+
10
+ - Add Company stable-ID lookup, candidate search and coverage for the current public-company cohort.
11
+ - Preserve existing Company calls and all published compatibility methods.
12
+
3
13
  ## 1.8.0 — 2026-09-25
4
14
 
5
15
  - Add Bank diagnostics, POST requests, requirements and explicit US ACH helpers; Card Core and optional Deep; Provider; Industry; and Vehicle.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parseapi
3
- Version: 1.8.0
3
+ Version: 1.9.1
4
4
  Summary: Official ParseAPI client for Python. One key, minimal JSON, fast.
5
5
  Project-URL: Homepage, https://parseapi.com
6
6
  Project-URL: Documentation, https://parseapi.com/docs
@@ -36,7 +36,7 @@ Get a key at [parseapi.com](https://parseapi.com). The client also reads `PARSEA
36
36
 
37
37
  ## API versions
38
38
 
39
- Version 1.7.0 explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
39
+ This SDK explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
40
40
 
41
41
  Upgrade the dependency in staging, review the [release notes](https://parseapi.com/docs/releases), and test the application before deploying the same code and dependency version to production. Commit your dependency lockfile so the tested package travels with your deployment. Future major SDK upgrades can select a newer API contract.
42
42
 
@@ -66,6 +66,36 @@ Results are plain data. Pass a returned code or coordinate to another operation
66
66
 
67
67
  Use `parse.postal("28202", country="US", deep=True)` for US ZIP tax references. `deep.tax` names the levy and `deep.tax_rate` is a percentage, so `7.9` means 7.9%. The state, county, city and special components explain that combined rate. An exact address can differ. Country and state lookups provide their own geographic reference rates, which should not be added to the ZIP rate. `None` means unknown and `0` means known zero. Country `deep.tax_id_format` and `deep.tax_id_regex` describe registration-number format only. Use `vat` for a metered registration check with `deep` explicitly enabled.
68
68
 
69
+ ## Company directory
70
+
71
+ Find candidates, then fetch the profile you selected.
72
+
73
+ ```python
74
+ candidates = parse.company.search(query="GitLab", country="US", limit=5)
75
+ selected_id = "co_caczn6wf36hj" # Explicitly chosen after reviewing candidates.
76
+ profile = parse.company.id(selected_id, deep=True)
77
+ if candidates["next"] is not None:
78
+ next_page = parse.company.search(
79
+ query="GitLab", country="US", limit=5, cursor=candidates["next"]
80
+ )
81
+ coverage = parse.company.coverage()
82
+ ```
83
+
84
+ Use at most one selector: `query` for a name, `domain`, `ticker`, or `identifier`; country or exact industry filters also allow discovery without a selector. The API validates selectors and filters. Use `country` to scope candidates, `exchange` with a ticker, and `authority` with an identifier. Search returns `companies` and an opaque `next` cursor. Review candidate identity and match details before choosing a stable Company ID. Pass `next` as `cursor` with the same selector, filters and limit to continue that result set.
85
+
86
+ Directory profiles are plain JSON data. `deep` belongs to each company in search results and adds legal/reference detail plus nullable `description`, `logo`, `founded`, and the `social_profiles`, `phone_numbers`, `email_addresses`, `domains` and `sources` collections. A logo is a reported URL. `founded` has `value` and `precision`, distinct from incorporation. Sources identify the website, filing or business register, supported fields and observation/update timestamps. Employee observations retain count, measurement date, organization scope and approximation; null means unknown. Missing, null, empty and unknown fields retain their response values. An empty search is a successful result. Invalid inputs and unknown IDs raise the existing API error.
87
+
88
+ Company directory social profiles contain `platform`, `url` and `handle`; unknown metadata stays null. Phone and email records use `type` for the source-reported purpose. Earlier response fields remain readable by the client.
89
+
90
+ The recipe requests one candidate page, one explicitly chosen profile and directory coverage, plus a second page when a cursor is returned. Each operation uses the existing retry settings. The number-validation call remains unchanged. `lang` applies to national company-number lookup, while directory calls use the source labels.
91
+
92
+ `AsyncParseAPI` exposes the same `company`, `company.id`, `company.search` and `company.coverage` calls with `await`.
93
+
94
+ Discovery example: `parse.company.search(country="US", industry="0700", industry_type="sic")`
95
+
96
+ Supply `industry` and `industry_type` together. The supported namespace is `sic`, with an exact four-digit string such as `0700`; leading zeros are meaningful. Country-only discovery is also supported. Filters intersect and may narrow an existing selector. Country matches the profile country, not a headquarters or operating-presence claim. Unknown values do not match a requested filter. Filter-only candidates use `match.field: "filters"` and `match.value: null`; reuse the same filters and limit with a returned cursor. Counts describe this directory edition, not complete country coverage.
97
+
98
+
69
99
  ## Calls
70
100
 
71
101
  One method per endpoint, named after the route.
@@ -89,6 +119,11 @@ parse.postal.distance("28202", "10001", country="US")
89
119
  parse.address("1600 Pennsylvania Ave NW, Washington DC", country="US")
90
120
  parse.address.search("1600 Pennsylvania", country="US", postal="20500")
91
121
  parse.company("51 824 753 556", country="AU")
122
+ parse.company.id("co_caczn6wf36hj", deep=True)
123
+ parse.company.search(domain="about.gitlab.com")
124
+ parse.company.search(ticker="GTLB", exchange="Nasdaq")
125
+ parse.company.search(identifier="0001653482", authority="sec")
126
+ parse.company.coverage()
92
127
  parse.city("charlotte", country="US")
93
128
  parse.city.id("city_mb8mbqrkz8zb")
94
129
  parse.city.search("char", country="US", limit=10)
@@ -166,7 +201,7 @@ Choose display names for one request:
166
201
  parse.country("DE", lang="fr")
167
202
  ```
168
203
 
169
- `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, Company and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
204
+ `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, national Company number lookup and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
170
205
 
171
206
  The next call keeps its usual default unless it also supplies `lang`. Existing `deep` rules still apply. Date `format` and measurement `locale` remain explicit input-parsing controls.
172
207
 
@@ -389,7 +424,7 @@ before dispatch, accepted input is forwarded unchanged. Never send a full card n
389
424
 
390
425
  ## Optional detail
391
426
 
392
- The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Industry and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep`; only the source has `deep.next_dst`.
427
+ The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Company directory, Industry and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep` or each `targets` item; only the source has `deep.next_dst`.
393
428
 
394
429
  ```python
395
430
  basic = parse.time("America/New_York")
@@ -413,3 +448,35 @@ Successful checks may be reused for up to 24 hours. `pretty` optionally formats
413
448
  Stack defaults to a 35-second transport timeout so a first scan has time to finish. Other lookups retain their 10-second default. An explicit client timeout takes precedence.
414
449
 
415
450
  Vehicle lookups use `vin` as the input and response field. Existing VIN methods remain available for compatibility.
451
+
452
+ ## Emoji catalog additions
453
+
454
+ Resolve Unicode emoji or a named shortcode, search or browse a bounded catalog,
455
+ parse emoji positions in text, and convert between Unicode and a selected shortcode source.
456
+ The ordinary lookup remains four fields:
457
+
458
+ ```http
459
+ GET /emoji/rocket
460
+ ```
461
+
462
+ ```json
463
+ {"emoji":"🚀","name":"Rocket","shortcodes":[":rocket:","rocket"],"category":"Travel & Places"}
464
+ ```
465
+
466
+ Use `deep=true` for Unicode facts, keywords, tone families and available artwork.
467
+ Artwork is keyed by style: `deep.artwork.openmoji.svg` is the SVG URL, and
468
+ `deep.artwork.openmoji.png["72"]` is the 72×72 PNG URL (use your language’s map
469
+ access syntax). The same shape applies to `noto` and `twemoji`. Missing styles
470
+ and formats are omitted. URLs pin immutable artwork editions and retain their bytes.
471
+ Core values stay unchanged. Text parsing returns `emojis` with UTF-16 `positions`;
472
+ conversion returns `text` and unresolved tokens with positions and reasons.
473
+
474
+ The compact JSON catalog contains offline identity, qualification-form and
475
+ shortcode indexes. Request `profile=full` when artwork is needed and `lang` when
476
+ localized names and keywords are needed. `/emoji/metadata` carries dataset
477
+ coverage and shared source notices once. Artwork supports Google Noto, Twemoji
478
+ and OpenMoji, with real SVG/PNG availability and immutable first-party URLs.
479
+ A device's emoji font remains the ordinary display.
480
+
481
+ These additions are a local release candidate until the matching SDK and
482
+ backend are published. Existing lookup and search contracts are preserved.
@@ -17,7 +17,7 @@ Get a key at [parseapi.com](https://parseapi.com). The client also reads `PARSEA
17
17
 
18
18
  ## API versions
19
19
 
20
- Version 1.7.0 explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
20
+ This SDK explicitly selects the API contract supported by this SDK. It sends `Parse-Version: 2.0.0` on every lookup so responses match the API contract supported by the package. Your key and the team's saved default stay the same.
21
21
 
22
22
  Upgrade the dependency in staging, review the [release notes](https://parseapi.com/docs/releases), and test the application before deploying the same code and dependency version to production. Commit your dependency lockfile so the tested package travels with your deployment. Future major SDK upgrades can select a newer API contract.
23
23
 
@@ -47,6 +47,36 @@ Results are plain data. Pass a returned code or coordinate to another operation
47
47
 
48
48
  Use `parse.postal("28202", country="US", deep=True)` for US ZIP tax references. `deep.tax` names the levy and `deep.tax_rate` is a percentage, so `7.9` means 7.9%. The state, county, city and special components explain that combined rate. An exact address can differ. Country and state lookups provide their own geographic reference rates, which should not be added to the ZIP rate. `None` means unknown and `0` means known zero. Country `deep.tax_id_format` and `deep.tax_id_regex` describe registration-number format only. Use `vat` for a metered registration check with `deep` explicitly enabled.
49
49
 
50
+ ## Company directory
51
+
52
+ Find candidates, then fetch the profile you selected.
53
+
54
+ ```python
55
+ candidates = parse.company.search(query="GitLab", country="US", limit=5)
56
+ selected_id = "co_caczn6wf36hj" # Explicitly chosen after reviewing candidates.
57
+ profile = parse.company.id(selected_id, deep=True)
58
+ if candidates["next"] is not None:
59
+ next_page = parse.company.search(
60
+ query="GitLab", country="US", limit=5, cursor=candidates["next"]
61
+ )
62
+ coverage = parse.company.coverage()
63
+ ```
64
+
65
+ Use at most one selector: `query` for a name, `domain`, `ticker`, or `identifier`; country or exact industry filters also allow discovery without a selector. The API validates selectors and filters. Use `country` to scope candidates, `exchange` with a ticker, and `authority` with an identifier. Search returns `companies` and an opaque `next` cursor. Review candidate identity and match details before choosing a stable Company ID. Pass `next` as `cursor` with the same selector, filters and limit to continue that result set.
66
+
67
+ Directory profiles are plain JSON data. `deep` belongs to each company in search results and adds legal/reference detail plus nullable `description`, `logo`, `founded`, and the `social_profiles`, `phone_numbers`, `email_addresses`, `domains` and `sources` collections. A logo is a reported URL. `founded` has `value` and `precision`, distinct from incorporation. Sources identify the website, filing or business register, supported fields and observation/update timestamps. Employee observations retain count, measurement date, organization scope and approximation; null means unknown. Missing, null, empty and unknown fields retain their response values. An empty search is a successful result. Invalid inputs and unknown IDs raise the existing API error.
68
+
69
+ Company directory social profiles contain `platform`, `url` and `handle`; unknown metadata stays null. Phone and email records use `type` for the source-reported purpose. Earlier response fields remain readable by the client.
70
+
71
+ The recipe requests one candidate page, one explicitly chosen profile and directory coverage, plus a second page when a cursor is returned. Each operation uses the existing retry settings. The number-validation call remains unchanged. `lang` applies to national company-number lookup, while directory calls use the source labels.
72
+
73
+ `AsyncParseAPI` exposes the same `company`, `company.id`, `company.search` and `company.coverage` calls with `await`.
74
+
75
+ Discovery example: `parse.company.search(country="US", industry="0700", industry_type="sic")`
76
+
77
+ Supply `industry` and `industry_type` together. The supported namespace is `sic`, with an exact four-digit string such as `0700`; leading zeros are meaningful. Country-only discovery is also supported. Filters intersect and may narrow an existing selector. Country matches the profile country, not a headquarters or operating-presence claim. Unknown values do not match a requested filter. Filter-only candidates use `match.field: "filters"` and `match.value: null`; reuse the same filters and limit with a returned cursor. Counts describe this directory edition, not complete country coverage.
78
+
79
+
50
80
  ## Calls
51
81
 
52
82
  One method per endpoint, named after the route.
@@ -70,6 +100,11 @@ parse.postal.distance("28202", "10001", country="US")
70
100
  parse.address("1600 Pennsylvania Ave NW, Washington DC", country="US")
71
101
  parse.address.search("1600 Pennsylvania", country="US", postal="20500")
72
102
  parse.company("51 824 753 556", country="AU")
103
+ parse.company.id("co_caczn6wf36hj", deep=True)
104
+ parse.company.search(domain="about.gitlab.com")
105
+ parse.company.search(ticker="GTLB", exchange="Nasdaq")
106
+ parse.company.search(identifier="0001653482", authority="sec")
107
+ parse.company.coverage()
73
108
  parse.city("charlotte", country="US")
74
109
  parse.city.id("city_mb8mbqrkz8zb")
75
110
  parse.city.search("char", country="US", limit=10)
@@ -147,7 +182,7 @@ Choose display names for one request:
147
182
  parse.country("DE", lang="fr")
148
183
  ```
149
184
 
150
- `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, Company and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
185
+ `lang` is optional on geography lookups and their lists/searches, Currency lookup, Language, Date, Time/Timezone, Emoji lookup/search, and unit discovery. IP, ASN, national Company number lookup and NPI also accept it for their geographic labels. Codes, native names, quantities and response structure retain their meanings. Source coverage determines which labels are translated; unavailable labels use the API's documented fallback.
151
186
 
152
187
  The next call keeps its usual default unless it also supplies `lang`. Existing `deep` rules still apply. Date `format` and measurement `locale` remain explicit input-parsing controls.
153
188
 
@@ -370,7 +405,7 @@ before dispatch, accepted input is forwarded unchanged. Never send a full card n
370
405
 
371
406
  ## Optional detail
372
407
 
373
- The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Industry and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep`; only the source has `deep.next_dst`.
408
+ The default response answers the common task. Ask for `deep` when you need more detail about that same result. Core fields stay equal. City, Company directory, Industry and Emoji searches put detail inside each result. Postal nearby and distance put metropolitan detail beside the entity it describes. Time conversion keeps target detail in `to.deep` or each `targets` item; only the source has `deep.next_dst`.
374
409
 
375
410
  ```python
376
411
  basic = parse.time("America/New_York")
@@ -394,3 +429,35 @@ Successful checks may be reused for up to 24 hours. `pretty` optionally formats
394
429
  Stack defaults to a 35-second transport timeout so a first scan has time to finish. Other lookups retain their 10-second default. An explicit client timeout takes precedence.
395
430
 
396
431
  Vehicle lookups use `vin` as the input and response field. Existing VIN methods remain available for compatibility.
432
+
433
+ ## Emoji catalog additions
434
+
435
+ Resolve Unicode emoji or a named shortcode, search or browse a bounded catalog,
436
+ parse emoji positions in text, and convert between Unicode and a selected shortcode source.
437
+ The ordinary lookup remains four fields:
438
+
439
+ ```http
440
+ GET /emoji/rocket
441
+ ```
442
+
443
+ ```json
444
+ {"emoji":"🚀","name":"Rocket","shortcodes":[":rocket:","rocket"],"category":"Travel & Places"}
445
+ ```
446
+
447
+ Use `deep=true` for Unicode facts, keywords, tone families and available artwork.
448
+ Artwork is keyed by style: `deep.artwork.openmoji.svg` is the SVG URL, and
449
+ `deep.artwork.openmoji.png["72"]` is the 72×72 PNG URL (use your language’s map
450
+ access syntax). The same shape applies to `noto` and `twemoji`. Missing styles
451
+ and formats are omitted. URLs pin immutable artwork editions and retain their bytes.
452
+ Core values stay unchanged. Text parsing returns `emojis` with UTF-16 `positions`;
453
+ conversion returns `text` and unresolved tokens with positions and reasons.
454
+
455
+ The compact JSON catalog contains offline identity, qualification-form and
456
+ shortcode indexes. Request `profile=full` when artwork is needed and `lang` when
457
+ localized names and keywords are needed. `/emoji/metadata` carries dataset
458
+ coverage and shared source notices once. Artwork supports Google Noto, Twemoji
459
+ and OpenMoji, with real SVG/PNG availability and immutable first-party URLs.
460
+ A device's emoji font remains the ordinary display.
461
+
462
+ These additions are a local release candidate until the matching SDK and
463
+ backend are published. Existing lookup and search contracts are preserved.