bw-essentials-core 0.1.3__tar.gz → 0.1.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.

Potentially problematic release.


This version of bw-essentials-core might be problematic. Click here for more details.

Files changed (34) hide show
  1. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/PKG-INFO +1 -1
  2. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/constants/services.py +2 -0
  3. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/api_client.py +1 -1
  4. bw_essentials_core-0.1.5/bw_essentials/services/portfolio_catalogue.py +104 -0
  5. bw_essentials_core-0.1.5/bw_essentials/services/portfolio_content.py +69 -0
  6. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials_core.egg-info/PKG-INFO +1 -1
  7. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials_core.egg-info/SOURCES.txt +2 -0
  8. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/setup.py +1 -1
  9. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/README.md +0 -0
  10. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/__init__.py +0 -0
  11. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/constants/__init__.py +0 -0
  12. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/data_loch/__init__.py +0 -0
  13. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/data_loch/data_loch.py +0 -0
  14. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/email_client/__init__.py +0 -0
  15. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/email_client/email_client.py +0 -0
  16. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/notifications/__init__.py +0 -0
  17. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/notifications/teams_notification_schemas.py +0 -0
  18. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/notifications/teams_notifications.py +0 -0
  19. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/s3_utils/__init__.py +0 -0
  20. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/s3_utils/s3_utils.py +0 -0
  21. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/__init__.py +0 -0
  22. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/broker.py +0 -0
  23. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/market_pricer.py +0 -0
  24. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/master_data.py +0 -0
  25. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/model_portfolio_reporting.py +0 -0
  26. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/notification.py +0 -0
  27. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/trade_placement.py +0 -0
  28. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/user_app.py +0 -0
  29. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/user_portfolio.py +0 -0
  30. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials/services/user_portfolio_reporting.py +0 -0
  31. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials_core.egg-info/dependency_links.txt +0 -0
  32. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials_core.egg-info/requires.txt +0 -0
  33. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/bw_essentials_core.egg-info/top_level.txt +0 -0
  34. {bw_essentials_core-0.1.3 → bw_essentials_core-0.1.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bw-essentials-core
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: Reusable utilities for S3, email, Data Loch, Microsoft Teams Notifications and more.
5
5
  Author: InvestorAI
6
6
  Author-email: support+tech@investorai.in
@@ -18,3 +18,5 @@ class Services(Enum):
18
18
  PAYMENT = 'Payment'
19
19
  MODEL_PORTFOLIO = "Model_Portfolio"
20
20
  PROMETHEUS_USER_APP = "Prometheus_User_App"
21
+ PORTFOLIO_CATALOGUE = "Portfolio_Catalogue"
22
+ PORTFOLIO_CONTENT = "Portfolio_Content"
@@ -88,7 +88,7 @@ class ApiClient:
88
88
  tenant_id (str): The tenant identifier to include in the headers.
89
89
  """
90
90
  logger.info(f"Setting tenant ID: {tenant_id}")
91
- self._update_headers({"tenant_id": tenant_id})
91
+ self._update_headers({"X-Tenant-ID": tenant_id})
92
92
  logger.info(f"Updated headers: {self.headers}")
93
93
 
94
94
  def set_headers(self, headers: dict) -> None:
@@ -0,0 +1,104 @@
1
+ """portfolio_catalogue.py
2
+
3
+ Client wrapper for interacting with the Portfolio-Catalogue Service API.
4
+
5
+ This module exposes `PortfolioCatalogue`, a thin abstraction over the
6
+ shared :class:`bw_essentials.services.api_client.ApiClient` that collates
7
+ all URL templates and common logic required to communicate with the
8
+ Portfolio-Catalogue micro-service responsible for portfolio construction
9
+ and rebalancing operations.
10
+
11
+ Features
12
+ --------
13
+ - Centralised mapping of service endpoints.
14
+ - Uniform request/response logging using the shared API client helper.
15
+ - Simple, type-hinted public interface that hides low-level HTTP calls.
16
+
17
+ Example
18
+ -------
19
+ >>> from bw_essentials.services.portfolio_catalogue import PortfolioCatalogue
20
+ >>> client = PortfolioCatalogue(service_user="system")
21
+ >>> data = {
22
+ "portfolioId": "BASKE_e3f7fc",
23
+ "startDate": "2025-07-01",
24
+ "endDate": "2025-07-10",
25
+ "status": "active",
26
+ "createdBy": "KP",
27
+ "constituents": [
28
+ {
29
+ "symbol": "EROSMEDIA",
30
+ "weight": 0.5,
31
+ "isin": "INE416L01017",
32
+ "status": "active",
33
+ "rationale": "Hello"
34
+ },
35
+ {
36
+ "symbol": "IDEA",
37
+ "weight": 0.5,
38
+ "isin": "INE669E01016",
39
+ "status": "active",
40
+ "rationale": "Hello"
41
+ }
42
+ ]
43
+ }
44
+ >>> response = client.create_rebalance(json=data)
45
+ >>> print(response)
46
+ """
47
+
48
+ import logging
49
+ from typing import Optional, Dict, Any
50
+
51
+ from bw_essentials.constants.services import Services
52
+ from bw_essentials.services.api_client import ApiClient
53
+
54
+ logger = logging.getLogger(__name__)
55
+
56
+
57
+ class PortfolioCatalogue(ApiClient):
58
+ """High-level client for the Portfolio-Catalogue Service.
59
+
60
+ This class bundles together the logic for generating fully-qualified
61
+ endpoint URLs and executing authenticated HTTP requests for
62
+ portfolio rebalancing workflows.
63
+
64
+ Attributes
65
+ ----------
66
+ base_url : str
67
+ Resolved base URL for the Portfolio-Catalogue service obtained
68
+ from configuration or environment variables.
69
+ name : str
70
+ Canonical service identifier used for logging and telemetry.
71
+ urls : dict[str, str]
72
+ Mapping of human-readable keys to relative endpoint paths.
73
+ """
74
+
75
+ def __init__(self, service_user: str):
76
+ super().__init__(user=service_user)
77
+ self.base_url = self.get_base_url(Services.PORTFOLIO_CATALOGUE.value)
78
+ self.name = Services.PORTFOLIO_CATALOGUE.value
79
+ self.urls = {
80
+ "rebalance": "rebalance",
81
+ }
82
+
83
+ def create_rebalance(self, json: Dict[str, Any]) -> Optional[Dict[str, Any]]:
84
+ """Submit a rebalance request.
85
+
86
+ Parameters
87
+ ----------
88
+ json : dict
89
+ Request payload describing the rebalance parameters and
90
+ portfolio metadata.
91
+
92
+ Returns
93
+ -------
94
+ dict
95
+ Parsed JSON response returned by the service.
96
+ """
97
+ logger.info("In - create_rebalance %s", json)
98
+ data = self._post(
99
+ url=self.base_url,
100
+ endpoint=self.urls["rebalance"],
101
+ json=json,
102
+ )
103
+ logger.info("%s", data)
104
+ return data
@@ -0,0 +1,69 @@
1
+ """portfolio_content.py
2
+
3
+ Client wrapper for the Portfolio-Content Service API.
4
+
5
+ This module exposes :class:`PortfolioContent`, a light-weight abstraction
6
+ around :class:`bw_essentials.services.api_client.ApiClient` that
7
+ centralises endpoint definitions and adds structured logging when
8
+ querying portfolio content (e.g. constituent list, metadata).
9
+
10
+ Example
11
+ -------
12
+ >>> from bw_essentials.services.portfolio_content import PortfolioContent
13
+ >>> client = PortfolioContent(service_user="system")
14
+ >>> details = client.get_portfolio_details("BASKE_e3f7fc")
15
+ >>> print(details)
16
+ """
17
+
18
+ import logging
19
+ from typing import Optional, Dict, Any
20
+
21
+ from bw_essentials.constants.services import Services
22
+ from bw_essentials.services.api_client import ApiClient
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class PortfolioContent(ApiClient):
28
+ """High-level client for the Portfolio-Content Service.
29
+
30
+ Attributes
31
+ ----------
32
+ base_url : str
33
+ Resolved base URL of the Portfolio-Content micro-service.
34
+ name : str
35
+ Canonical service identifier for logging/telemetry.
36
+ urls : dict[str, str]
37
+ Mapping of friendly names to relative endpoint paths.
38
+ """
39
+
40
+ def __init__(self, service_user: str):
41
+ super().__init__(user=service_user)
42
+ self.base_url = self.get_base_url(Services.PORTFOLIO_CONTENT.value)
43
+ self.name = Services.PORTFOLIO_CONTENT.value
44
+ self.urls = {
45
+ "portfolio": "portfolio",
46
+ }
47
+
48
+ def get_portfolio_details(self, portfolio_id: str) -> Optional[Dict[str, Any]]:
49
+ """Retrieve full details of a portfolio.
50
+
51
+ Parameters
52
+ ----------
53
+ portfolio_id : str
54
+ Unique identifier of the portfolio whose details should be
55
+ fetched.
56
+
57
+ Returns
58
+ -------
59
+ Optional[dict]
60
+ Parsed JSON response if the request succeeds, otherwise
61
+ ``None``.
62
+ """
63
+ logger.info("In - get_portfolio_details %s", portfolio_id)
64
+ data = self._get(
65
+ url=self.base_url,
66
+ endpoint=f"{self.urls['portfolio']}/{portfolio_id}"
67
+ )
68
+ logger.info("%s", data)
69
+ return data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bw-essentials-core
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: Reusable utilities for S3, email, Data Loch, Microsoft Teams Notifications and more.
5
5
  Author: InvestorAI
6
6
  Author-email: support+tech@investorai.in
@@ -19,6 +19,8 @@ bw_essentials/services/market_pricer.py
19
19
  bw_essentials/services/master_data.py
20
20
  bw_essentials/services/model_portfolio_reporting.py
21
21
  bw_essentials/services/notification.py
22
+ bw_essentials/services/portfolio_catalogue.py
23
+ bw_essentials/services/portfolio_content.py
22
24
  bw_essentials/services/trade_placement.py
23
25
  bw_essentials/services/user_app.py
24
26
  bw_essentials/services/user_portfolio.py
@@ -10,7 +10,7 @@ from setuptools import setup, find_packages
10
10
 
11
11
  setup(
12
12
  name="bw-essentials-core",
13
- version="0.1.3",
13
+ version="0.1.5",
14
14
  author="InvestorAI",
15
15
  author_email="support+tech@investorai.in",
16
16
  description="Reusable utilities for S3, email, Data Loch, Microsoft Teams Notifications and more.",