boarddata 6.6.1__tar.gz → 6.6.2__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 (66) hide show
  1. {boarddata-6.6.1 → boarddata-6.6.2}/PKG-INFO +1 -1
  2. {boarddata-6.6.1 → boarddata-6.6.2}/__init__.py +1 -1
  3. boarddata-6.6.2/_committees.py +16 -0
  4. {boarddata-6.6.1 → boarddata-6.6.2}/boarddata.egg-info/PKG-INFO +1 -1
  5. {boarddata-6.6.1 → boarddata-6.6.2}/boarddata.egg-info/SOURCES.txt +4 -0
  6. {boarddata-6.6.1 → boarddata-6.6.2}/client.py +2 -0
  7. {boarddata-6.6.1 → boarddata-6.6.2}/pyproject.toml +1 -1
  8. boarddata-6.6.2/tests/test_committees.py +32 -0
  9. boarddata-6.6.2/types/committees.py +27 -0
  10. {boarddata-6.6.1 → boarddata-6.6.2}/CLAUDE.md +0 -0
  11. {boarddata-6.6.1 → boarddata-6.6.2}/README.md +0 -0
  12. {boarddata-6.6.1 → boarddata-6.6.2}/_assemblies.py +0 -0
  13. {boarddata-6.6.1 → boarddata-6.6.2}/_auditors.py +0 -0
  14. {boarddata-6.6.1 → boarddata-6.6.2}/_base.py +0 -0
  15. {boarddata-6.6.1 → boarddata-6.6.2}/_comex.py +0 -0
  16. {boarddata-6.6.1 → boarddata-6.6.2}/_companies.py +0 -0
  17. {boarddata-6.6.1 → boarddata-6.6.2}/_criteria.py +0 -0
  18. {boarddata-6.6.1 → boarddata-6.6.2}/_directors.py +0 -0
  19. {boarddata-6.6.1 → boarddata-6.6.2}/_documents.py +0 -0
  20. {boarddata-6.6.1 → boarddata-6.6.2}/_esg.py +0 -0
  21. {boarddata-6.6.1 → boarddata-6.6.2}/_indexes.py +0 -0
  22. {boarddata-6.6.1 → boarddata-6.6.2}/_persons.py +0 -0
  23. {boarddata-6.6.1 → boarddata-6.6.2}/_risks.py +0 -0
  24. {boarddata-6.6.1 → boarddata-6.6.2}/_sentinel.py +0 -0
  25. {boarddata-6.6.1 → boarddata-6.6.2}/_utilities.py +0 -0
  26. {boarddata-6.6.1 → boarddata-6.6.2}/boarddata.egg-info/dependency_links.txt +0 -0
  27. {boarddata-6.6.1 → boarddata-6.6.2}/boarddata.egg-info/requires.txt +0 -0
  28. {boarddata-6.6.1 → boarddata-6.6.2}/boarddata.egg-info/top_level.txt +0 -0
  29. {boarddata-6.6.1 → boarddata-6.6.2}/cache.py +0 -0
  30. {boarddata-6.6.1 → boarddata-6.6.2}/errors.py +0 -0
  31. {boarddata-6.6.1 → boarddata-6.6.2}/py.typed +0 -0
  32. {boarddata-6.6.1 → boarddata-6.6.2}/setup.cfg +0 -0
  33. {boarddata-6.6.1 → boarddata-6.6.2}/tests/__init__.py +0 -0
  34. {boarddata-6.6.1 → boarddata-6.6.2}/tests/conftest.py +0 -0
  35. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_assemblies.py +0 -0
  36. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_auditors.py +0 -0
  37. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_base.py +0 -0
  38. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_build_payload.py +0 -0
  39. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_cache.py +0 -0
  40. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_comex.py +0 -0
  41. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_companies.py +0 -0
  42. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_config.py +0 -0
  43. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_criteria.py +0 -0
  44. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_directors.py +0 -0
  45. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_documents.py +0 -0
  46. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_esg.py +0 -0
  47. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_exports.py +0 -0
  48. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_indexes.py +0 -0
  49. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_persons.py +0 -0
  50. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_risks.py +0 -0
  51. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_sentinel.py +0 -0
  52. {boarddata-6.6.1 → boarddata-6.6.2}/tests/test_utilities.py +0 -0
  53. {boarddata-6.6.1 → boarddata-6.6.2}/types/__init__.py +0 -0
  54. {boarddata-6.6.1 → boarddata-6.6.2}/types/assemblies.py +0 -0
  55. {boarddata-6.6.1 → boarddata-6.6.2}/types/auditors.py +0 -0
  56. {boarddata-6.6.1 → boarddata-6.6.2}/types/comex.py +0 -0
  57. {boarddata-6.6.1 → boarddata-6.6.2}/types/companies.py +0 -0
  58. {boarddata-6.6.1 → boarddata-6.6.2}/types/core.py +0 -0
  59. {boarddata-6.6.1 → boarddata-6.6.2}/types/criteria.py +0 -0
  60. {boarddata-6.6.1 → boarddata-6.6.2}/types/directors.py +0 -0
  61. {boarddata-6.6.1 → boarddata-6.6.2}/types/documents.py +0 -0
  62. {boarddata-6.6.1 → boarddata-6.6.2}/types/esg.py +0 -0
  63. {boarddata-6.6.1 → boarddata-6.6.2}/types/indexes.py +0 -0
  64. {boarddata-6.6.1 → boarddata-6.6.2}/types/persons.py +0 -0
  65. {boarddata-6.6.1 → boarddata-6.6.2}/types/risks.py +0 -0
  66. {boarddata-6.6.1 → boarddata-6.6.2}/types/sentinel.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boarddata
3
- Version: 6.6.1
3
+ Version: 6.6.2
4
4
  Summary: Python SDK for the BoardData V2 REST API
5
5
  License: MIT
6
6
  Classifier: Development Status :: 4 - Beta
@@ -6,7 +6,7 @@ from .cache import FileTokenCache, ScalewaySecretTokenCache
6
6
  from .client import BoardDataClient
7
7
  from .errors import BoardDataError, ExportTooLargeError
8
8
 
9
- __version__ = "6.6.1"
9
+ __version__ = "6.6.2"
10
10
  __all__ = [
11
11
  "Base",
12
12
  "BoardDataClient",
@@ -0,0 +1,16 @@
1
+ """Board-committee batch methods."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .types.committees import CommitteeBatchItemPayload, CommitteeBatchResultItem
6
+
7
+
8
+ class CommitteesMixin:
9
+ def batch_create_committees(
10
+ self, items: list[CommitteeBatchItemPayload]
11
+ ) -> list[CommitteeBatchResultItem]:
12
+ """Batch upsert board committees. Each item is keyed by issuer ISIN;
13
+ the backend resolves members to existing persons and idempotently
14
+ upserts Committee + CommitteeMembership. Returns one result per item
15
+ (action: loaded / skipped_unknown_company / error)."""
16
+ return self._post("committees/batch/", items) # type: ignore[attr-defined]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boarddata
3
- Version: 6.6.1
3
+ Version: 6.6.2
4
4
  Summary: Python SDK for the BoardData V2 REST API
5
5
  License: MIT
6
6
  Classifier: Development Status :: 4 - Beta
@@ -5,6 +5,7 @@ _assemblies.py
5
5
  _auditors.py
6
6
  _base.py
7
7
  _comex.py
8
+ _committees.py
8
9
  _companies.py
9
10
  _criteria.py
10
11
  _directors.py
@@ -26,6 +27,7 @@ pyproject.toml
26
27
  ./_auditors.py
27
28
  ./_base.py
28
29
  ./_comex.py
30
+ ./_committees.py
29
31
  ./_companies.py
30
32
  ./_criteria.py
31
33
  ./_directors.py
@@ -53,6 +55,7 @@ tests/test_base.py
53
55
  tests/test_build_payload.py
54
56
  tests/test_cache.py
55
57
  tests/test_comex.py
58
+ tests/test_committees.py
56
59
  tests/test_companies.py
57
60
  tests/test_config.py
58
61
  tests/test_criteria.py
@@ -69,6 +72,7 @@ types/__init__.py
69
72
  types/assemblies.py
70
73
  types/auditors.py
71
74
  types/comex.py
75
+ types/committees.py
72
76
  types/companies.py
73
77
  types/core.py
74
78
  types/criteria.py
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  from ._assemblies import AssemblyMixin
6
6
  from ._auditors import AuditorMixin
7
7
  from ._base import Base
8
+ from ._committees import CommitteesMixin
8
9
  from ._comex import ComexMixin
9
10
  from ._companies import CompanyMixin
10
11
  from ._criteria import CriteriaMixin
@@ -26,6 +27,7 @@ class BoardDataClient(
26
27
  AuditorMixin,
27
28
  DocumentMixin,
28
29
  AssemblyMixin,
30
+ CommitteesMixin,
29
31
  ESGMixin,
30
32
  RisksMixin,
31
33
  SentinelMixin,
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "boarddata"
7
- version = "6.6.1"
7
+ version = "6.6.2"
8
8
  description = "Python SDK for the BoardData V2 REST API"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -0,0 +1,32 @@
1
+ """Tests for CommitteesMixin methods."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import MagicMock
6
+
7
+
8
+ def make_client():
9
+ from boarddata._base import Base
10
+ from boarddata._committees import CommitteesMixin
11
+
12
+ class TestClient(CommitteesMixin, Base):
13
+ pass
14
+
15
+ client = TestClient.__new__(TestClient)
16
+ client._request = MagicMock()
17
+ client._get_token = MagicMock(return_value="fake-token")
18
+ client.base_url = "https://api.example.com"
19
+ client.timeout = 30
20
+ return client
21
+
22
+
23
+ class TestBatchCreateCommittees:
24
+ def test_batch_create_committees_posts_to_endpoint(self):
25
+ c = make_client()
26
+ c._request.return_value = [{"company": "FR0000000020", "action": "loaded"}]
27
+ items = [{"company": "FR0000000020", "year": 2025, "committees": []}]
28
+ out = c.batch_create_committees(items)
29
+ args, kwargs = c._request.call_args
30
+ assert args == ("POST", "committees/batch/")
31
+ assert kwargs["json"] is items
32
+ assert out[0]["action"] == "loaded"
@@ -0,0 +1,27 @@
1
+ """Committee batch types. The nested committee/member dicts are issuer-shaped;
2
+ the authoritative schema lives in the extractor + apps/committees loader."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import sys
7
+ from typing import Any
8
+
9
+ if sys.version_info >= (3, 11):
10
+ from typing import NotRequired, TypedDict
11
+ else:
12
+ from typing_extensions import NotRequired, TypedDict
13
+
14
+
15
+ class CommitteeBatchItemPayload(TypedDict):
16
+ company: str # issuer ISIN
17
+ year: int
18
+ committees: list[dict[str, Any]]
19
+
20
+
21
+ class CommitteeBatchResultItem(TypedDict):
22
+ company: str
23
+ action: str # "loaded" | "skipped_unknown_company" | "error"
24
+ committees_loaded: NotRequired[int]
25
+ memberships_loaded: NotRequired[int]
26
+ members_unmatched: NotRequired[list[str]]
27
+ detail: NotRequired[str]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes