diff --git a/CHANGELOG.md b/CHANGELOG.md index e6988f3..ef6dad3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to the pyUSPTO package will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [0.2.2] ### Added diff --git a/pyproject.toml b/pyproject.toml index 4782814..514f887 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ classifiers = [ "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries", "Topic :: Scientific/Engineering :: Information Analysis", @@ -34,12 +34,20 @@ dynamic = ["version"] [project.urls] GitHub = "https://github.com/DunlapCoddingPC/pyUSPTO" issues = "https://github.com/DunlapCoddingPC/pyUSPTO/issues" +Documentation = "https://pyuspto.readthedocs.io/en/latest/" + [tool.setuptools_scm] +[tool.setuptools] +zip-safe = true + [tool.setuptools.packages.find] where = ["src"] +[tool.setuptools.package-data] +pyUSPTO = ["py.typed"] + [tool.isort] multi_line_output = 3 include_trailing_comma = true diff --git a/src/pyUSPTO/clients/base.py b/src/pyUSPTO/clients/base.py index 73491f7..e89bfd0 100644 --- a/src/pyUSPTO/clients/base.py +++ b/src/pyUSPTO/clients/base.py @@ -68,11 +68,11 @@ def __init__( # Handle config if provided if config: self.config = config - self.api_key = api_key or config.api_key + self._api_key = api_key or config.api_key else: # Backward compatibility: create minimal config self.config = USPTOConfig(api_key=api_key) - self.api_key = api_key + self._api_key = api_key self.base_url = base_url.rstrip("/") @@ -91,9 +91,9 @@ def _create_session(self) -> requests.Session: session = requests.Session() # Set API key and default headers - if self.api_key: + if self._api_key: session.headers.update( - {"X-API-KEY": self.api_key, "content-type": "application/json"} + {"X-API-KEY": self._api_key, "content-type": "application/json"} ) # Apply custom headers from HTTP config @@ -444,3 +444,7 @@ def _download_file(self, url: str, file_path: str, overwrite: bool = False) -> s return self._save_response_to_file( response=response, file_path=file_path, overwrite=overwrite ) + + @property + def api_key(self) -> str: + return "********" diff --git a/src/pyUSPTO/py.typed b/src/pyUSPTO/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/tests/clients/test_base.py b/tests/clients/test_base.py index 9c86c79..ffa8e3c 100644 --- a/tests/clients/test_base.py +++ b/tests/clients/test_base.py @@ -99,14 +99,15 @@ def test_init(self) -> None: client: BaseUSPTOClient[Any] = BaseUSPTOClient( api_key="test_key", base_url="https://api.test.com" ) - assert client.api_key == "test_key" + assert client._api_key == "test_key" + assert client.api_key == "********" # API key is masked assert client.base_url == "https://api.test.com" assert "X-API-KEY" in client.session.headers assert client.session.headers["X-API-KEY"] == "test_key" # Test without API key client = BaseUSPTOClient(base_url="https://api.test.com") - assert client.api_key is None + assert client._api_key is None assert client.base_url == "https://api.test.com" assert "X-API-KEY" not in client.session.headers @@ -651,7 +652,7 @@ def test_base_client_with_config_object(self) -> None: ) # API key should come from config - assert client.api_key == "config_key" + assert client._api_key == "config_key" assert client.config is config def test_base_client_api_key_priority(self) -> None: @@ -664,7 +665,7 @@ def test_base_client_api_key_priority(self) -> None: ) # Explicit api_key should take precedence - assert client.api_key == "explicit_key" + assert client._api_key == "explicit_key" class TestContentDispositionParsing: diff --git a/tests/clients/test_bulk_data_clients.py b/tests/clients/test_bulk_data_clients.py index 2479d21..7935f89 100644 --- a/tests/clients/test_bulk_data_clients.py +++ b/tests/clients/test_bulk_data_clients.py @@ -211,7 +211,7 @@ class TestBulkDataClientInit: def test_init_with_api_key(self) -> None: """Test initialization with direct API key.""" client = BulkDataClient(api_key="test_key") - assert client.api_key == "test_key" + assert client._api_key == "test_key" assert client.base_url == "https://api.uspto.gov" assert client.config is not None assert client.config.api_key == "test_key" @@ -230,7 +230,7 @@ def test_init_with_config(self) -> None: bulk_data_base_url="https://config.api.test.com", ) client = BulkDataClient(config=config) - assert client.api_key == "config_key" + assert client._api_key == "config_key" assert client.base_url == "https://config.api.test.com" assert client.config is config @@ -241,7 +241,7 @@ def test_init_with_api_key_and_config(self) -> None: bulk_data_base_url="https://config.api.test.com", ) client = BulkDataClient(api_key="direct_key", config=config) - assert client.api_key == "direct_key" + assert client._api_key == "direct_key" assert client.base_url == "https://config.api.test.com" diff --git a/tests/clients/test_patent_data_clients.py b/tests/clients/test_patent_data_clients.py index 737b57e..29279e7 100644 --- a/tests/clients/test_patent_data_clients.py +++ b/tests/clients/test_patent_data_clients.py @@ -249,14 +249,14 @@ class TestPatentDataClientInit: def test_init_with_api_key(self, api_key_fixture: str) -> None: """Test initialization with API key.""" client = PatentDataClient(api_key=api_key_fixture) - assert client.api_key == api_key_fixture + assert client._api_key == api_key_fixture assert client.base_url == "https://api.uspto.gov" def test_init_with_custom_base_url(self, api_key_fixture: str) -> None: """Test initialization with custom base URL.""" custom_url = "https://custom.api.test.com" client = PatentDataClient(api_key=api_key_fixture, base_url=custom_url) - assert client.api_key == api_key_fixture + assert client._api_key == api_key_fixture assert client.base_url == custom_url def test_init_with_config(self) -> None: @@ -265,7 +265,7 @@ def test_init_with_config(self) -> None: config_url = "https://config.api.test.com" config = USPTOConfig(api_key=config_key, patent_data_base_url=config_url) client = PatentDataClient(config=config) - assert client.api_key == config_key + assert client._api_key == config_key assert client.base_url == config_url assert client.config is config @@ -275,7 +275,7 @@ def test_init_with_api_key_and_config(self, api_key_fixture: str) -> None: api_key="config_key", patent_data_base_url="https://config.api.test.com" ) client = PatentDataClient(api_key=api_key_fixture, config=config) - assert client.api_key == api_key_fixture + assert client._api_key == api_key_fixture assert client.base_url == "https://config.api.test.com" custom_url = "https://custom.url.com" diff --git a/tests/clients/test_petition_decision_clients.py b/tests/clients/test_petition_decision_clients.py index 9773251..5a4d338 100644 --- a/tests/clients/test_petition_decision_clients.py +++ b/tests/clients/test_petition_decision_clients.py @@ -99,7 +99,7 @@ class TestFinalPetitionDecisionsClientInit: def test_init_with_api_key(self, api_key_fixture: str) -> None: """Test initialization with API key.""" client = FinalPetitionDecisionsClient(api_key=api_key_fixture) - assert client.api_key == api_key_fixture + assert client._api_key == api_key_fixture assert client.base_url == "https://api.uspto.gov" def test_init_with_custom_base_url(self, api_key_fixture: str) -> None: @@ -108,7 +108,7 @@ def test_init_with_custom_base_url(self, api_key_fixture: str) -> None: client = FinalPetitionDecisionsClient( api_key=api_key_fixture, base_url=custom_url ) - assert client.api_key == api_key_fixture + assert client._api_key == api_key_fixture assert client.base_url == custom_url def test_init_with_config(self) -> None: @@ -117,7 +117,7 @@ def test_init_with_config(self) -> None: config_url = "https://config.api.test.com" config = USPTOConfig(api_key=config_key, petition_decisions_base_url=config_url) client = FinalPetitionDecisionsClient(config=config) - assert client.api_key == config_key + assert client._api_key == config_key assert client.base_url == config_url assert client.config is config @@ -129,7 +129,7 @@ def test_init_with_api_key_and_config(self, api_key_fixture: str) -> None: ) client = FinalPetitionDecisionsClient(api_key=api_key_fixture, config=config) # API key parameter takes precedence - assert client.api_key == api_key_fixture + assert client._api_key == api_key_fixture # But base_url comes from config assert client.base_url == "https://config.api.test.com"