pyUSPTO 0.5.3__tar.gz → 0.5.5__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 (172) hide show
  1. pyuspto-0.5.5/.devcontainer/devcontainer-lock.json +19 -0
  2. {pyuspto-0.5.3 → pyuspto-0.5.5}/.devcontainer/devcontainer.json +4 -1
  3. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/workflows/codeql.yml +1 -1
  4. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/workflows/publish-docs.yaml +2 -2
  5. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/workflows/publish-to-test-pypi.yml +2 -2
  6. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/workflows/python-tests.yml +5 -5
  7. {pyuspto-0.5.3 → pyuspto-0.5.5}/.gitignore +1 -0
  8. {pyuspto-0.5.3 → pyuspto-0.5.5}/CHANGELOG.md +59 -0
  9. {pyuspto-0.5.3 → pyuspto-0.5.5}/PKG-INFO +2 -2
  10. {pyuspto-0.5.3 → pyuspto-0.5.5}/README.md +1 -1
  11. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/patent_data_example.py +28 -0
  12. {pyuspto-0.5.3 → pyuspto-0.5.5}/requirements-dev.txt +14 -14
  13. {pyuspto-0.5.3 → pyuspto-0.5.5}/requirements.txt +5 -5
  14. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/__init__.py +2 -1
  15. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/patent_data.py +231 -13
  16. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/config.py +79 -50
  17. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/patent_data.py +5 -1
  18. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO.egg-info/PKG-INFO +2 -2
  19. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO.egg-info/SOURCES.txt +2 -0
  20. pyuspto-0.5.5/src/pyUSPTO.egg-info/scm_file_list.json +165 -0
  21. pyuspto-0.5.5/src/pyUSPTO.egg-info/scm_version.json +8 -0
  22. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_base.py +9 -27
  23. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_oa_citations_clients.py +5 -14
  24. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_oa_rejections_clients.py +4 -4
  25. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_patent_data_clients.py +254 -8
  26. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_petition_decision_clients.py +1 -3
  27. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_oa_actions_integration.py +4 -12
  28. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_oa_citations_integration.py +4 -12
  29. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_oa_rejections_integration.py +3 -9
  30. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_patent_data_integration.py +66 -6
  31. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_petition_decisions_integration.py +9 -9
  32. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_ptab_appeals_integration.py +6 -6
  33. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_ptab_interferences_integration.py +13 -13
  34. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_ptab_trials_integration.py +12 -12
  35. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_bulk_data_models.py +12 -4
  36. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_enriched_citation_models.py +3 -9
  37. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_oa_actions_models.py +15 -3
  38. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_oa_citations_models.py +8 -20
  39. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_oa_rejections_models.py +2 -6
  40. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/test_edge_cases.py +1 -1
  41. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/test_init.py +3 -3
  42. pyuspto-0.5.3/.devcontainer/devcontainer-lock.json +0 -14
  43. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  44. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  45. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/ISSUE_TEMPLATE/documentation-updates.yml +0 -0
  46. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  47. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  48. {pyuspto-0.5.3 → pyuspto-0.5.5}/.github/dependabot.yml +0 -0
  49. {pyuspto-0.5.3 → pyuspto-0.5.5}/.readthedocs.yaml +0 -0
  50. {pyuspto-0.5.3 → pyuspto-0.5.5}/ADVANCED.md +0 -0
  51. {pyuspto-0.5.3 → pyuspto-0.5.5}/CODE_OF_CONDUCT.md +0 -0
  52. {pyuspto-0.5.3 → pyuspto-0.5.5}/CONTRIBUTING.md +0 -0
  53. {pyuspto-0.5.3 → pyuspto-0.5.5}/LICENSE +0 -0
  54. {pyuspto-0.5.3 → pyuspto-0.5.5}/_version.pyi +0 -0
  55. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/Makefile +0 -0
  56. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/_static/.gitkeep +0 -0
  57. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/about.rst +0 -0
  58. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/advanced.rst +0 -0
  59. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/bulk_data.rst +0 -0
  60. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/enriched_citations.rst +0 -0
  61. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/index.rst +0 -0
  62. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/oa_actions.rst +0 -0
  63. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/oa_citations.rst +0 -0
  64. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/oa_rejections.rst +0 -0
  65. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/patent_data.rst +0 -0
  66. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/petition_decisions.rst +0 -0
  67. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/ptab_appeals.rst +0 -0
  68. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/ptab_interferences.rst +0 -0
  69. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/clients/ptab_trials.rst +0 -0
  70. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/config/config.rst +0 -0
  71. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/config/http_config.rst +0 -0
  72. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/config/index.rst +0 -0
  73. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/exceptions.rst +0 -0
  74. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/index.rst +0 -0
  75. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/base.rst +0 -0
  76. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/bulk_data.rst +0 -0
  77. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/enriched_citations.rst +0 -0
  78. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/index.rst +0 -0
  79. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/oa_actions.rst +0 -0
  80. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/oa_citations.rst +0 -0
  81. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/oa_rejections.rst +0 -0
  82. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/patent_data.rst +0 -0
  83. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/petition_decisions.rst +0 -0
  84. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/ptab.rst +0 -0
  85. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/models/utils.rst +0 -0
  86. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/api/warnings.rst +0 -0
  87. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/conf.py +0 -0
  88. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/configuration.rst +0 -0
  89. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/development.rst +0 -0
  90. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/bulk_data.rst +0 -0
  91. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/enriched_citations.rst +0 -0
  92. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/ifw_example.rst +0 -0
  93. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/index.rst +0 -0
  94. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/oa_actions.rst +0 -0
  95. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/oa_citations.rst +0 -0
  96. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/oa_rejections.rst +0 -0
  97. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/patent_data.rst +0 -0
  98. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/petition_decisions.rst +0 -0
  99. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/ptab_appeals.rst +0 -0
  100. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/ptab_interferences.rst +0 -0
  101. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/examples/ptab_trials.rst +0 -0
  102. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/index.rst +0 -0
  103. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/installation.rst +0 -0
  104. {pyuspto-0.5.3 → pyuspto-0.5.5}/docs/source/quickstart.rst +0 -0
  105. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/bulk_data_example.py +0 -0
  106. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/enriched_citations_example.py +0 -0
  107. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/error_handling_example.py +0 -0
  108. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/ifw_example.py +0 -0
  109. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/oa_actions_example.py +0 -0
  110. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/oa_citations_example.py +0 -0
  111. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/oa_rejections_example.py +0 -0
  112. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/petition_decisions_example.py +0 -0
  113. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/ptab_appeals_example.py +0 -0
  114. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/ptab_interferences_example.py +0 -0
  115. {pyuspto-0.5.3 → pyuspto-0.5.5}/examples/ptab_trials_example.py +0 -0
  116. {pyuspto-0.5.3 → pyuspto-0.5.5}/pyUSPTO.code-workspace +0 -0
  117. {pyuspto-0.5.3 → pyuspto-0.5.5}/pyproject.toml +0 -0
  118. {pyuspto-0.5.3 → pyuspto-0.5.5}/setup.cfg +0 -0
  119. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/__init__.py +0 -0
  120. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/base.py +0 -0
  121. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/bulk_data.py +0 -0
  122. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/enriched_citations.py +0 -0
  123. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/oa_actions.py +0 -0
  124. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/oa_citations.py +0 -0
  125. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/oa_rejections.py +0 -0
  126. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/petition_decisions.py +0 -0
  127. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/ptab_appeals.py +0 -0
  128. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/ptab_interferences.py +0 -0
  129. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/clients/ptab_trials.py +0 -0
  130. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/exceptions.py +0 -0
  131. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/http_config.py +0 -0
  132. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/__init__.py +0 -0
  133. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/base.py +0 -0
  134. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/bulk_data.py +0 -0
  135. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/enriched_citations.py +0 -0
  136. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/oa_actions.py +0 -0
  137. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/oa_citations.py +0 -0
  138. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/oa_rejections.py +0 -0
  139. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/petition_decisions.py +0 -0
  140. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/ptab.py +0 -0
  141. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/models/utils.py +0 -0
  142. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/py.typed +0 -0
  143. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/utils/__init__.py +0 -0
  144. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO/warnings.py +0 -0
  145. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO.egg-info/dependency_links.txt +0 -0
  146. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO.egg-info/requires.txt +0 -0
  147. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO.egg-info/top_level.txt +0 -0
  148. {pyuspto-0.5.3 → pyuspto-0.5.5}/src/pyUSPTO.egg-info/zip-safe +0 -0
  149. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/__init__.py +0 -0
  150. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/__init__.py +0 -0
  151. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_bulk_data_clients.py +0 -0
  152. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_enriched_citation_clients.py +0 -0
  153. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_oa_actions_clients.py +0 -0
  154. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_ptab_appeals_client.py +0 -0
  155. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_ptab_interferences_client.py +0 -0
  156. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/clients/test_ptab_trials_client.py +0 -0
  157. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/conftest.py +0 -0
  158. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/__init__.py +0 -0
  159. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/conftest.py +0 -0
  160. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_bulk_data_integration.py +0 -0
  161. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/integration/test_enriched_citations_integration.py +0 -0
  162. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/__init__.py +0 -0
  163. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_patent_data_models.py +0 -0
  164. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_petition_decision_models.py +0 -0
  165. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_ptab_models.py +0 -0
  166. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/models/test_utils.py +0 -0
  167. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/test_config.py +0 -0
  168. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/test_exceptions.py +0 -0
  169. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/test_http_config.py +0 -0
  170. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/test_version.py +0 -0
  171. {pyuspto-0.5.3 → pyuspto-0.5.5}/tests/utils/__init__.py +0 -0
  172. {pyuspto-0.5.3 → pyuspto-0.5.5}/tox.ini +0 -0
@@ -0,0 +1,19 @@
1
+ {
2
+ "features": {
3
+ "ghcr.io/devcontainers/features/git:1": {
4
+ "version": "1.3.5",
5
+ "resolved": "ghcr.io/devcontainers/features/git@sha256:27905dc196c01f77d6ba8709cb82eeaf330b3b108772e2f02d1cd0d826de1251",
6
+ "integrity": "sha256:27905dc196c01f77d6ba8709cb82eeaf330b3b108772e2f02d1cd0d826de1251"
7
+ },
8
+ "ghcr.io/devcontainers/features/node:2": {
9
+ "version": "2.1.0",
10
+ "resolved": "ghcr.io/devcontainers/features/node@sha256:586c9a6f7dd40bd3ba2cd41e7f2f88dcc31fbe5d1442afcbf07ffbc66b686857",
11
+ "integrity": "sha256:586c9a6f7dd40bd3ba2cd41e7f2f88dcc31fbe5d1442afcbf07ffbc66b686857"
12
+ },
13
+ "ghcr.io/devcontainers/features/powershell:2.0.2": {
14
+ "version": "2.0.2",
15
+ "resolved": "ghcr.io/devcontainers/features/powershell@sha256:82ea3880c5706ac3963f1b5e940a7f5871835393a5472f80008148b995d58d61",
16
+ "integrity": "sha256:82ea3880c5706ac3963f1b5e940a7f5871835393a5472f80008148b995d58d61"
17
+ }
18
+ }
19
+ }
@@ -3,7 +3,10 @@
3
3
  "build": { "dockerfile": "Dockerfile" },
4
4
  "features": {
5
5
  "ghcr.io/devcontainers/features/git:1": {},
6
- "ghcr.io/devcontainers/features/node:2": {}
6
+ "ghcr.io/devcontainers/features/node:2": {},
7
+ "ghcr.io/devcontainers/features/powershell:2.0.2": {
8
+ "version": "latest"
9
+ }
7
10
  },
8
11
  "mounts": [
9
12
  "source=pyuspto-claude-home,target=/home/vscode/.claude,type=volume"
@@ -55,7 +55,7 @@ jobs:
55
55
  # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
56
56
  steps:
57
57
  - name: Checkout repository
58
- uses: actions/checkout@v6
58
+ uses: actions/checkout@v7
59
59
 
60
60
  # Add any setup steps before running the `github/codeql-action/init` action.
61
61
  # This includes steps like installing compilers or runtimes (`actions/setup-node`
@@ -15,9 +15,9 @@ jobs:
15
15
  name: Build documentation
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
- - uses: actions/checkout@v6
18
+ - uses: actions/checkout@v7
19
19
  - name: Set up Python
20
- uses: actions/setup-python@v6
20
+ uses: actions/setup-python@v7
21
21
  with:
22
22
  python-version: "3.14"
23
23
  - name: Install dependencies
@@ -16,11 +16,11 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
 
18
18
  steps:
19
- - uses: actions/checkout@v6
19
+ - uses: actions/checkout@v7
20
20
  with:
21
21
  persist-credentials: false
22
22
  - name: Set up Python
23
- uses: actions/setup-python@v6
23
+ uses: actions/setup-python@v7
24
24
  with:
25
25
  python-version: "3.x"
26
26
  - name: Install pypa/build
@@ -14,10 +14,10 @@ jobs:
14
14
  python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
15
15
 
16
16
  steps:
17
- - uses: actions/checkout@v6
17
+ - uses: actions/checkout@v7
18
18
 
19
19
  - name: Set up Python ${{ matrix.python-version }}
20
- uses: actions/setup-python@v6
20
+ uses: actions/setup-python@v7
21
21
  with:
22
22
  python-version: ${{ matrix.python-version }}
23
23
 
@@ -32,7 +32,7 @@ jobs:
32
32
  pytest tests/ --cov=src/pyUSPTO
33
33
 
34
34
  - name: Upload coverage report
35
- uses: codecov/codecov-action@v6
35
+ uses: codecov/codecov-action@v7
36
36
  with:
37
37
  fail_ci_if_error: false
38
38
 
@@ -40,10 +40,10 @@ jobs:
40
40
  runs-on: ubuntu-latest
41
41
 
42
42
  steps:
43
- - uses: actions/checkout@v6
43
+ - uses: actions/checkout@v7
44
44
 
45
45
  - name: Set up Python
46
- uses: actions/setup-python@v6
46
+ uses: actions/setup-python@v7
47
47
  with:
48
48
  python-version: "3.14"
49
49
 
@@ -23,3 +23,4 @@ run_integration_tests.py
23
23
  CLAUDE.md
24
24
  docs/build/
25
25
  .devcontainer/Dockerfile
26
+ .claude/skills/
@@ -5,6 +5,65 @@ All notable changes to the pyUSPTO package will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.5] - 2026-07-22
9
+
10
+ ### Added
11
+
12
+ - `PatentDataClient.get_firm_portfolio(customer_numbers, ...)` — helper that searches a law firm's portfolio across one or more USPTO Customer Numbers. Builds a single Lucene `OR` query, applies a named field preset by default, and returns a `PatentDataResponse`. Pairs with `get_application_metadata` / `get_application_by_number` for per-application drill-down.
13
+ - `FIELD_PRESETS` constant (exported from `pyUSPTO`) — three named field sets for `get_firm_portfolio`'s `fields` argument: `"minimal"` (8 firm-internal identifiers), `"portfolio"` (16 fields for status + deadline derivation, default), and `"full_meta"` (uses the API's `applicationMetaData` shorthand for the entire 27-key metadata object, ~7.5× payload reduction vs. the un-fielded default).
14
+ - Multi-value `customer_number_q` and `status_code_q` on `search_applications` and `get_search_results` — accept a single value or a list; lists are OR-joined as `field:(a OR b)`.
15
+ - New `status_date_from_q` / `status_date_to_q` on `search_applications` and `get_search_results` — date-range filters against `applicationMetaData.applicationStatusDate`, mirroring the existing `filing_date` and `grant_date` range params. Useful for bounding the deadline-coming-due horizon.
16
+
17
+ ## [0.5.4] - 2026-05-27
18
+
19
+ ### Changed
20
+
21
+ - **Breaking**: `sanitize_application_number` now emits the standardized 15-character PCT format (`PCT` + 2-char country + 4-digit year + 6-digit zero-padded serial, e.g. `PCTUS2024012345`) per USPTO ODP Release 3.6 (2026-04-10). Previously emitted a non-standard 12-character form (e.g. `PCTUS2412345`). Affects every endpoint that takes a PCT application number, including `get_pct`, `get_application_by_number`, and `get_IFW_metadata(PCT_app_number=...)`. 2-digit year inputs are expanded via a sliding window (YY≥78 → 19YY, else 20YY). Legacy 12-character PCT strings are no longer accepted as input.
22
+ - `USPTOConfig` now applies user > env > default precedence uniformly across all fields. Previously only `api_key` fell back to its environment variable; base URLs and `HTTPConfig` ignored env in the constructor. Env reading is consolidated in an internal `_env_values()` helper shared by `__init__` and `from_env`.
23
+
24
+ ### Deprecated
25
+
26
+ - `Address.country_or_state_code` — USPTO ODP Release 3.6 removed `countryOrStateCode` from the Patent Assignment API response; the location data now lives in `geographicRegionCode` (already exposed as `Address.geographic_region_code`). The attribute remains for backward compatibility and will be `None` for responses from updated endpoints.
27
+
28
+ ### Fixed
29
+
30
+ - `USPTO_API_KEY=""` was stored as `""` instead of `None`, breaking `is None` checks. Empty-string constructor arguments are now treated as no-value and fall back to env.
31
+
32
+ ## [0.5.3] - 2026-05-13
33
+
34
+ ### Changed
35
+
36
+ - Maintenance release: dependency updates only (including urllib3 v2.7.0 security update); no library code changes.
37
+
38
+ ## [0.5.2] - 2026-04-16
39
+
40
+ ### Added
41
+
42
+ - `PatentDataClient.stream_document(document, format)` — returns a streaming `requests.Response` the caller consumes via `iter_content()` or `iter_lines()`. Accepts the same `format` argument (`DocumentMimeType` enum or MIME string) as `download_document` and raises the same `FormatNotAvailableError` on an unavailable format. The returned response is the caller's responsibility — use as a context manager or call `.close()` when finished.
43
+ - Streaming download example in `examples/patent_data_example.py`
44
+ - Bulk Data product identifier reference table in the documentation
45
+
46
+ ### Changed
47
+
48
+ - `stream_document` and `download_document` now share format resolution through an internal `_resolve_document_format` helper, so both methods raise identical errors for missing formats or missing download URLs. No changes to existing `download_document` behavior.
49
+
50
+ ## [0.5.1] - 2026-03-30
51
+
52
+ ### Added
53
+
54
+ - `OAActionsClient` — Office Action Text Retrieval API (v1): full-text office action documents including body text and structured section data (§101/102/103/112 rejections, citations, etc.)
55
+ - `OARejectionsClient` — Office Action Rejections API (v2): rejection-level records with rejection type indicators (`hasRej101/102/103/112/DP`), claim arrays, and examiner classification metadata
56
+ - `OACitationsClient` — Office Action Citations API: enriched citation records from office actions including cited document identifiers, legal section codes, and examiner-cited indicators
57
+ - Config and environment variable support for the three new base URLs (`USPTO_OA_ACTIONS_BASE_URL`, `USPTO_OA_REJECTIONS_BASE_URL`, `USPTO_OA_CITATIONS_BASE_URL`)
58
+
59
+ ## [0.5.0] - 2026-03-27
60
+
61
+ ### Added
62
+
63
+ - `EnrichedCitationsClient` for the USPTO Enriched Cited Reference Metadata API (v3) — citation data extracted from patent office actions using AI/NLP, including citation category codes (X/Y/A/etc.), passage locations in the prior art, rejected claims, and examiner vs. applicant citation indicators
64
+ - Client methods: `search_citations()` (POST-based search with convenience parameters), `paginate_citations()` (auto-paginating iterator), and `get_fields()`
65
+ - Models: `EnrichedCitation` (21 fields), `EnrichedCitationResponse`, `EnrichedCitationFieldsResponse`
66
+
8
67
  ## [0.4.5] - 2026-03-11
9
68
 
10
69
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyUSPTO
3
- Version: 0.5.3
3
+ Version: 0.5.5
4
4
  Summary: A Modern Python client for accessing the United States Patent and Trademark Office (USPTO) Open Data Portal (ODP) APIs.
5
5
  Author-email: Andrew Piechocki <apiechocki@dunlapcodding.com>
6
6
  License-Expression: MIT
@@ -201,7 +201,7 @@ if app.application_meta_data:
201
201
  wrapper = client.get_IFW_metadata(application_number="18/045,436")
202
202
  wrapper = client.get_IFW_metadata(patent_number="11,234,567")
203
203
  wrapper = client.get_IFW_metadata(publication_number="2023/0012345")
204
- wrapper = client.get_IFW_metadata(PCT_app_number="PCT/US24/12345")
204
+ wrapper = client.get_IFW_metadata(PCT_app_number="PCT/US2024/012345")
205
205
 
206
206
  # Look up USPTO status codes
207
207
  status_codes = client.get_status_codes()
@@ -134,7 +134,7 @@ if app.application_meta_data:
134
134
  wrapper = client.get_IFW_metadata(application_number="18/045,436")
135
135
  wrapper = client.get_IFW_metadata(patent_number="11,234,567")
136
136
  wrapper = client.get_IFW_metadata(publication_number="2023/0012345")
137
- wrapper = client.get_IFW_metadata(PCT_app_number="PCT/US24/12345")
137
+ wrapper = client.get_IFW_metadata(PCT_app_number="PCT/US2024/012345")
138
138
 
139
139
  # Look up USPTO status codes
140
140
  status_codes = client.get_status_codes()
@@ -315,3 +315,31 @@ print(
315
315
  )
316
316
  for code_obj in status_code_response.status_code_bag:
317
317
  print(f" - Code: {code_obj.code}, Description: {code_obj.description}")
318
+
319
+ print("-" * 40)
320
+ print("Example 9: Firm portfolio across multiple Customer Numbers")
321
+ print("-" * 40)
322
+
323
+ # get_firm_portfolio builds one Lucene OR query across all provided Customer
324
+ # Numbers, applies the "portfolio" field preset by default, and returns a
325
+ # PatentDataResponse. Combine with status_date_from to bound the deadline
326
+ # horizon ("show me cases whose status changed since X").
327
+ from collections import Counter
328
+
329
+ portfolio_response = client.get_firm_portfolio(
330
+ customer_numbers=[30589, 174793],
331
+ status_date_from="2025-01-01",
332
+ sort="applicationMetaData.applicationStatusDate desc",
333
+ limit=25,
334
+ )
335
+ print(f"Total matching applications across both Customer Numbers: {portfolio_response.count}")
336
+
337
+ status_counter: Counter[str] = Counter()
338
+ for wrapper in portfolio_response.patent_file_wrapper_data_bag:
339
+ meta = wrapper.application_meta_data
340
+ if meta and meta.application_status_code is not None:
341
+ status_counter[str(meta.application_status_code)] += 1
342
+
343
+ print("Status-code tally for the page:")
344
+ for code, n in status_counter.most_common():
345
+ print(f" {code}: {n}")
@@ -8,22 +8,22 @@ alabaster==1.0.0
8
8
  # via sphinx
9
9
  babel==2.18.0
10
10
  # via sphinx
11
- certifi==2026.4.22
11
+ certifi==2026.6.17
12
12
  # via requests
13
- charset-normalizer==3.4.7
13
+ charset-normalizer==3.4.9
14
14
  # via requests
15
15
  colorama==0.4.6
16
16
  # via
17
17
  # pytest
18
18
  # sphinx
19
- coverage==7.14.0
19
+ coverage==7.15.2
20
20
  # via pytest-cov
21
21
  docutils==0.22.4
22
22
  # via
23
23
  # myst-parser
24
24
  # sphinx
25
25
  # sphinx-rtd-theme
26
- idna==3.15
26
+ idna==3.18
27
27
  # via requests
28
28
  imagesize==2.0.0
29
29
  # via sphinx
@@ -33,7 +33,7 @@ jinja2==3.1.6
33
33
  # via
34
34
  # myst-parser
35
35
  # sphinx
36
- librt==0.11.0
36
+ librt==0.13.0
37
37
  # via mypy
38
38
  markdown-it-py==4.2.0
39
39
  # via
@@ -45,7 +45,7 @@ mdit-py-plugins==0.6.1
45
45
  # via myst-parser
46
46
  mdurl==0.1.2
47
47
  # via markdown-it-py
48
- mypy==2.1.0
48
+ mypy==2.3.0
49
49
  # via pyuspto
50
50
  mypy-extensions==1.1.0
51
51
  # via mypy
@@ -65,7 +65,7 @@ pygments==2.20.0
65
65
  # via
66
66
  # pytest
67
67
  # sphinx
68
- pytest==9.0.3
68
+ pytest==9.1.1
69
69
  # via
70
70
  # pytest-cov
71
71
  # pytest-mock
@@ -76,16 +76,16 @@ pytest-mock==3.15.1
76
76
  # via pyuspto
77
77
  pyyaml==6.0.3
78
78
  # via myst-parser
79
- requests==2.34.0
79
+ requests==2.34.2
80
80
  # via
81
81
  # pyUSPTO (pyproject.toml)
82
82
  # pyuspto
83
83
  # sphinx
84
84
  roman-numerals==4.1.0
85
85
  # via sphinx
86
- ruff==0.15.12
86
+ ruff==0.15.22
87
87
  # via pyuspto
88
- snowballstemmer==3.0.1
88
+ snowballstemmer==3.1.1
89
89
  # via sphinx
90
90
  sphinx==9.1.0
91
91
  # via
@@ -95,7 +95,7 @@ sphinx==9.1.0
95
95
  # sphinx-copybutton
96
96
  # sphinx-rtd-theme
97
97
  # sphinxcontrib-jquery
98
- sphinx-autodoc-typehints==3.10.2
98
+ sphinx-autodoc-typehints==3.13.0
99
99
  # via pyuspto
100
100
  sphinx-copybutton==0.5.2
101
101
  # via pyuspto
@@ -115,13 +115,13 @@ sphinxcontrib-qthelp==2.0.0
115
115
  # via sphinx
116
116
  sphinxcontrib-serializinghtml==2.0.0
117
117
  # via sphinx
118
- types-requests==2.33.0.20260513
118
+ types-requests==2.33.0.20260712
119
119
  # via pyuspto
120
- typing-extensions==4.15.0
120
+ typing-extensions==4.16.0
121
121
  # via
122
122
  # mypy
123
123
  # pyuspto
124
- tzdata==2026.2
124
+ tzdata==2026.3
125
125
  # via
126
126
  # pyUSPTO (pyproject.toml)
127
127
  # pyuspto
@@ -4,15 +4,15 @@
4
4
  #
5
5
  # pip-compile --output-file=requirements.txt --strip-extras pyproject.toml
6
6
  #
7
- certifi==2026.4.22
7
+ certifi==2026.6.17
8
8
  # via requests
9
- charset-normalizer==3.4.7
9
+ charset-normalizer==3.4.9
10
10
  # via requests
11
- idna==3.15
11
+ idna==3.18
12
12
  # via requests
13
- requests==2.34.0
13
+ requests==2.34.2
14
14
  # via pyUSPTO (pyproject.toml)
15
- tzdata==2026.2
15
+ tzdata==2026.3
16
16
  # via pyUSPTO (pyproject.toml)
17
17
  urllib3==2.7.0
18
18
  # via
@@ -16,7 +16,7 @@ from pyUSPTO.clients.enriched_citations import EnrichedCitationsClient
16
16
  from pyUSPTO.clients.oa_actions import OAActionsClient
17
17
  from pyUSPTO.clients.oa_citations import OACitationsClient
18
18
  from pyUSPTO.clients.oa_rejections import OARejectionsClient
19
- from pyUSPTO.clients.patent_data import PatentDataClient
19
+ from pyUSPTO.clients.patent_data import FIELD_PRESETS, PatentDataClient
20
20
  from pyUSPTO.clients.petition_decisions import FinalPetitionDecisionsClient
21
21
  from pyUSPTO.clients.ptab_appeals import PTABAppealsClient
22
22
  from pyUSPTO.clients.ptab_interferences import PTABInterferencesClient
@@ -138,6 +138,7 @@ __all__ = [
138
138
  "FileData",
139
139
  # Patent Data API
140
140
  "PatentDataClient",
141
+ "FIELD_PRESETS",
141
142
  "ApplicationContinuityData",
142
143
  "PatentDataResponse",
143
144
  "PatentFileWrapper",