ipulse-shared-core-ftredge 6.3.1__tar.gz → 6.6.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.
Potentially problematic release.
This version of ipulse-shared-core-ftredge might be problematic. Click here for more details.
- {ipulse_shared_core_ftredge-6.3.1/src/ipulse_shared_core_ftredge.egg-info → ipulse_shared_core_ftredge-6.6.1}/PKG-INFO +2 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/setup.py +2 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/__init__.py +1 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/dependencies/auth_router.py +8 -8
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/base_api_response.py +1 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/base_data_model.py +1 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/services/fastapiservicemon.py +13 -11
- ipulse_shared_core_ftredge-6.6.1/src/ipulse_shared_core_ftredge/utils/__init__.py +1 -0
- ipulse_shared_core_ftredge-6.6.1/src/ipulse_shared_core_ftredge/utils/json_encoder.py +13 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1/src/ipulse_shared_core_ftredge.egg-info}/PKG-INFO +2 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge.egg-info/SOURCES.txt +3 -1
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge.egg-info/requires.txt +1 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/LICENCE +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/README.md +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/pyproject.toml +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/setup.cfg +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/dependencies/__init__.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/dependencies/authorization_api.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/dependencies/database.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/dependencies/token_validation.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/__init__.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/organization_profile.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/resource_catalog_item.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/subscription.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/user_auth.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/user_profile.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/user_profile_update.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/models/user_status.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/services/__init__.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/services/base_exceptions.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/services/base_firestore_service.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge/services/servicemon.py +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge.egg-info/dependency_links.txt +0 -0
- {ipulse_shared_core_ftredge-6.3.1 → ipulse_shared_core_ftredge-6.6.1}/src/ipulse_shared_core_ftredge.egg-info/top_level.txt +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: ipulse_shared_core_ftredge
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.6.1
|
|
4
4
|
Summary: Shared Core models and Logger util for the Pulse platform project. Using AI for financial advisory and investment management.
|
|
5
5
|
Home-page: https://github.com/TheFutureEdge/ipulse_shared_core
|
|
6
6
|
Author: Russlan Ramdowar
|
|
7
7
|
License-File: LICENCE
|
|
8
8
|
Requires-Dist: pydantic[email]~=2.5
|
|
9
9
|
Requires-Dist: python-dateutil~=2.8
|
|
10
|
+
Requires-Dist: fastapi~=0.115.8
|
|
10
11
|
Requires-Dist: pytest~=7.1
|
|
11
12
|
Requires-Dist: ipulse_shared_base_ftredge>=5.2.1
|
|
12
13
|
Dynamic: author
|
|
@@ -3,13 +3,14 @@ from setuptools import setup, find_packages
|
|
|
3
3
|
|
|
4
4
|
setup(
|
|
5
5
|
name='ipulse_shared_core_ftredge',
|
|
6
|
-
version='6.
|
|
6
|
+
version='6.6.1',
|
|
7
7
|
package_dir={'': 'src'}, # Specify the source directory
|
|
8
8
|
packages=find_packages(where='src'), # Look for packages in 'src'
|
|
9
9
|
install_requires=[
|
|
10
10
|
# List your dependencies here
|
|
11
11
|
'pydantic[email]~=2.5',
|
|
12
12
|
'python-dateutil~=2.8',
|
|
13
|
+
'fastapi~=0.115.8',
|
|
13
14
|
'pytest~=7.1',
|
|
14
15
|
'ipulse_shared_base_ftredge>=5.2.1',
|
|
15
16
|
],
|
|
@@ -10,12 +10,12 @@ def create_protected_router(
|
|
|
10
10
|
) -> APIRouter:
|
|
11
11
|
"""
|
|
12
12
|
Creates an APIRouter with authentication enabled by default.
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
Args:
|
|
15
15
|
prefix: Router prefix
|
|
16
16
|
tags: OpenAPI tags
|
|
17
17
|
public_paths: List of paths that should be public (no auth required)
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
Example:
|
|
20
20
|
router = create_protected_router(
|
|
21
21
|
prefix="/api/v1",
|
|
@@ -25,10 +25,10 @@ def create_protected_router(
|
|
|
25
25
|
"""
|
|
26
26
|
public_paths = public_paths or []
|
|
27
27
|
router = APIRouter(prefix=prefix, tags=tags)
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
# Store the original route registration method
|
|
30
30
|
original_add_api_route = router.add_api_route
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
def add_api_route_with_auth(
|
|
33
33
|
path: str,
|
|
34
34
|
endpoint: Callable,
|
|
@@ -40,10 +40,10 @@ def create_protected_router(
|
|
|
40
40
|
if path not in public_paths:
|
|
41
41
|
dependencies = dependencies or []
|
|
42
42
|
# Fix: Check if verify_firebase_token is already in dependencies
|
|
43
|
-
if not any(getattr(dep.dependency, '__name__', None) == 'verify_firebase_token'
|
|
43
|
+
if not any(getattr(dep.dependency, '__name__', None) == 'verify_firebase_token'
|
|
44
44
|
for dep in dependencies):
|
|
45
45
|
dependencies.append(Depends(verify_firebase_token))
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
return original_add_api_route(
|
|
48
48
|
path,
|
|
49
49
|
endpoint,
|
|
@@ -51,8 +51,8 @@ def create_protected_router(
|
|
|
51
51
|
dependencies=dependencies,
|
|
52
52
|
**kwargs
|
|
53
53
|
)
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
# Replace the route registration method with our custom one
|
|
56
56
|
router.add_api_route = add_api_route_with_auth # type: ignore
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
return router
|
|
@@ -2,7 +2,7 @@ from typing import Generic, TypeVar, Optional, Any, Dict, List
|
|
|
2
2
|
from pydantic import BaseModel, ConfigDict
|
|
3
3
|
import datetime as dt
|
|
4
4
|
from fastapi.responses import JSONResponse
|
|
5
|
-
from ipulse_shared_core_ftredge.utils
|
|
5
|
+
from ipulse_shared_core_ftredge.utils import CustomJSONEncoder
|
|
6
6
|
import json
|
|
7
7
|
|
|
8
8
|
|
|
@@ -41,7 +41,7 @@ class FastAPIServiceMon(Servicemon):
|
|
|
41
41
|
return await call_next(request)
|
|
42
42
|
|
|
43
43
|
# Initialize ServiceMon
|
|
44
|
-
|
|
44
|
+
servicemon = Servicemon(
|
|
45
45
|
logger=logger,
|
|
46
46
|
base_context=f"API: {path}\nMethod: {method}",
|
|
47
47
|
service_name=f"API_{method}_{path.replace('/', '_')}"
|
|
@@ -50,11 +50,11 @@ class FastAPIServiceMon(Servicemon):
|
|
|
50
50
|
# Start monitoring
|
|
51
51
|
client_ip = request.client.host if request.client else "unknown"
|
|
52
52
|
user_agent = request.headers.get("user-agent", "unknown")
|
|
53
|
-
|
|
53
|
+
servicemon.start(f"API Request {method} {path}")
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
# Add request info
|
|
57
|
-
|
|
57
|
+
servicemon.log(
|
|
58
58
|
level=LogLevel.INFO,
|
|
59
59
|
description=f"Request received for {method} {path}. Client IP: {client_ip}. User Agent: {user_agent}",
|
|
60
60
|
resource=DataResource.API_INTERNAL,
|
|
@@ -65,7 +65,7 @@ class FastAPIServiceMon(Servicemon):
|
|
|
65
65
|
# Process the request and catch any errors
|
|
66
66
|
try:
|
|
67
67
|
# Store ServiceMon in request state for handlers to access
|
|
68
|
-
request.state.svcmon =
|
|
68
|
+
request.state.svcmon = servicemon
|
|
69
69
|
|
|
70
70
|
# Process request
|
|
71
71
|
start_time = time.time()
|
|
@@ -86,7 +86,7 @@ class FastAPIServiceMon(Servicemon):
|
|
|
86
86
|
else LogLevel.INFO
|
|
87
87
|
)
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
servicemon.log(
|
|
90
90
|
level=log_level,
|
|
91
91
|
description=f"Response sent: {status_code} in {process_time}ms for {method} {path}",
|
|
92
92
|
resource=DataResource.API_INTERNAL,
|
|
@@ -96,18 +96,20 @@ class FastAPIServiceMon(Servicemon):
|
|
|
96
96
|
)
|
|
97
97
|
|
|
98
98
|
# Finalize monitoring
|
|
99
|
-
|
|
99
|
+
servicemon.end(status=progress_status)
|
|
100
100
|
return response
|
|
101
101
|
|
|
102
102
|
except Exception as exc:
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
# Log error and re-raise
|
|
104
|
+
servicemon.log(
|
|
105
|
+
level=LogLevel.ERROR,
|
|
106
|
+
description=f"Error processing request: {exc}",
|
|
105
107
|
resource=DataResource.API_INTERNAL,
|
|
106
108
|
action=Action.EXECUTE,
|
|
107
|
-
progress_status=ProgressStatus.FAILED
|
|
108
|
-
e=exc
|
|
109
|
+
progress_status=ProgressStatus.FAILED
|
|
109
110
|
)
|
|
110
|
-
|
|
111
|
+
|
|
112
|
+
servicemon.end(status=ProgressStatus.FAILED)
|
|
111
113
|
raise
|
|
112
114
|
|
|
113
115
|
return ServiceMonMiddleware
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .json_encoder import CustomJSONEncoder
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from google.cloud.firestore_v1._helpers import DatetimeWithNanoseconds
|
|
4
|
+
from google.api_core import datetime_helpers
|
|
5
|
+
|
|
6
|
+
class CustomJSONEncoder(json.JSONEncoder):
|
|
7
|
+
"""Custom JSON encoder that handles Firestore datetime types."""
|
|
8
|
+
def default(self, obj):
|
|
9
|
+
if isinstance(obj, (datetime, DatetimeWithNanoseconds)):
|
|
10
|
+
return obj.isoformat()
|
|
11
|
+
if isinstance(obj, datetime_helpers.DatetimeWithNanoseconds):
|
|
12
|
+
return obj.isoformat()
|
|
13
|
+
return super().default(obj)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: ipulse_shared_core_ftredge
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.6.1
|
|
4
4
|
Summary: Shared Core models and Logger util for the Pulse platform project. Using AI for financial advisory and investment management.
|
|
5
5
|
Home-page: https://github.com/TheFutureEdge/ipulse_shared_core
|
|
6
6
|
Author: Russlan Ramdowar
|
|
7
7
|
License-File: LICENCE
|
|
8
8
|
Requires-Dist: pydantic[email]~=2.5
|
|
9
9
|
Requires-Dist: python-dateutil~=2.8
|
|
10
|
+
Requires-Dist: fastapi~=0.115.8
|
|
10
11
|
Requires-Dist: pytest~=7.1
|
|
11
12
|
Requires-Dist: ipulse_shared_base_ftredge>=5.2.1
|
|
12
13
|
Dynamic: author
|
|
@@ -27,4 +27,6 @@ src/ipulse_shared_core_ftredge/services/__init__.py
|
|
|
27
27
|
src/ipulse_shared_core_ftredge/services/base_exceptions.py
|
|
28
28
|
src/ipulse_shared_core_ftredge/services/base_firestore_service.py
|
|
29
29
|
src/ipulse_shared_core_ftredge/services/fastapiservicemon.py
|
|
30
|
-
src/ipulse_shared_core_ftredge/services/servicemon.py
|
|
30
|
+
src/ipulse_shared_core_ftredge/services/servicemon.py
|
|
31
|
+
src/ipulse_shared_core_ftredge/utils/__init__.py
|
|
32
|
+
src/ipulse_shared_core_ftredge/utils/json_encoder.py
|
|
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
|