fdc-shared-kernel 0.0.6__tar.gz → 0.0.9__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.
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/PKG-INFO +73 -2
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/README.md +73 -2
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/README_pypi.md +73 -2
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/pyproject.toml +1 -1
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/PKG-INFO +73 -2
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/SOURCES.txt +3 -0
- fdc_shared_kernel-0.0.9/src/shared_kernel/auth/__init__.py +2 -0
- fdc_shared_kernel-0.0.9/src/shared_kernel/auth/jwt_helper.py +44 -0
- fdc_shared_kernel-0.0.9/src/shared_kernel/auth/token_handler.py +31 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/config/__init__.py +3 -5
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/database/__init__.py +5 -7
- fdc_shared_kernel-0.0.9/src/shared_kernel/exceptions/http_exceptions.py +60 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/messaging/nats_databus.py +8 -9
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/__init__.py +1 -1
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/aws_secret_manager.py +9 -10
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/azure_keyvault.py +4 -5
- fdc_shared_kernel-0.0.6/src/shared_kernel/exceptions/http_exceptions.py +0 -60
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/requirements.txt +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/setup.cfg +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/requires.txt +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/top_level.txt +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/configuration_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/custom_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/operational_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/security_exceptions.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/databus.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/keyvault.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/logger/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/messaging/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/models/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/config/test_config.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/logger/test_logger.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/utils/test_data_validators.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/utils/test_string_utils.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/__init__.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/data_validators_utils.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/date_format_utils.py +0 -0
- {fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/string_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fdc_shared_kernel
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.9
|
|
4
4
|
Summary: Shared library for microservice
|
|
5
5
|
Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -111,7 +111,7 @@ engine, SessionLocal = db_instance.init_db_connection()
|
|
|
111
111
|
|
|
112
112
|
### Initializing NATS Connection
|
|
113
113
|
|
|
114
|
-
Use the `NATSClient` class to initialize
|
|
114
|
+
Use the `NATSClient` class to initialize:
|
|
115
115
|
|
|
116
116
|
```
|
|
117
117
|
from shared_kernel.messaging import NATSClient
|
|
@@ -130,3 +130,74 @@ def run():
|
|
|
130
130
|
if __name__ == '__main__':
|
|
131
131
|
asyncio.run(run())
|
|
132
132
|
```
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
### Using Keyvault Manager
|
|
136
|
+
|
|
137
|
+
Use the `KeyVaultManager` class to initialize:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
from shared_kernel.security import KeyVaultManager
|
|
141
|
+
|
|
142
|
+
def run():
|
|
143
|
+
aws_vault = KeyVaultManager.create_key_vault('aws', {
|
|
144
|
+
'region_name': 'us-east-1',
|
|
145
|
+
'AWS_SERVER_PUBLIC_KEY': '<key here>',
|
|
146
|
+
'AWS_SERVER_SECRET_KEY': '<secret here>'
|
|
147
|
+
})
|
|
148
|
+
# AWS Secrets Manager operations
|
|
149
|
+
aws_vault.store_secret("fdc_api_key", "123456")
|
|
150
|
+
|
|
151
|
+
print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
|
|
152
|
+
|
|
153
|
+
print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
|
|
154
|
+
|
|
155
|
+
aws_vault.delete_secret("api_key")
|
|
156
|
+
print(aws_vault.list_secrets()) # Output: []
|
|
157
|
+
if __name__ == '__main__':
|
|
158
|
+
run()
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
### Using JWT Token handler
|
|
163
|
+
|
|
164
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
from shared_kernel.security import JWTTokenHandler
|
|
168
|
+
|
|
169
|
+
def run():
|
|
170
|
+
secret_key = 'your-secret-key'
|
|
171
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
172
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
173
|
+
|
|
174
|
+
if __name__ == '__main__':
|
|
175
|
+
run()
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Using JWTTokenHandler
|
|
179
|
+
|
|
180
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
from shared_kernel.auth import JWTTokenHandler
|
|
184
|
+
|
|
185
|
+
def run():
|
|
186
|
+
secret_key = 'your-secret-key'
|
|
187
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
188
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
189
|
+
if __name__ == '__main__':
|
|
190
|
+
run()
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
In routes
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
from shared_kernel.auth import token_required
|
|
197
|
+
|
|
198
|
+
@app.route('/')
|
|
199
|
+
@token_required
|
|
200
|
+
def user(current_user):
|
|
201
|
+
return jsonify(current_user)
|
|
202
|
+
```
|
|
203
|
+
|
|
@@ -109,7 +109,7 @@ engine, SessionLocal = db_instance.init_db_connection()
|
|
|
109
109
|
|
|
110
110
|
### Initializing NATS Connection
|
|
111
111
|
|
|
112
|
-
Use the `NATSClient` class to initialize
|
|
112
|
+
Use the `NATSClient` class to initialize:
|
|
113
113
|
|
|
114
114
|
```
|
|
115
115
|
from shared_kernel.messaging import NATSClient
|
|
@@ -127,4 +127,75 @@ def run():
|
|
|
127
127
|
|
|
128
128
|
if __name__ == '__main__':
|
|
129
129
|
asyncio.run(run())
|
|
130
|
-
```
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
### Using Keyvault Manager
|
|
134
|
+
|
|
135
|
+
Use the `KeyVaultManager` class to initialize:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
from shared_kernel.security import KeyVaultManager
|
|
139
|
+
|
|
140
|
+
def run():
|
|
141
|
+
aws_vault = KeyVaultManager.create_key_vault('aws', {
|
|
142
|
+
'region_name': 'us-east-1',
|
|
143
|
+
'AWS_SERVER_PUBLIC_KEY': '<key here>',
|
|
144
|
+
'AWS_SERVER_SECRET_KEY': '<secret here>'
|
|
145
|
+
})
|
|
146
|
+
# AWS Secrets Manager operations
|
|
147
|
+
aws_vault.store_secret("fdc_api_key", "123456")
|
|
148
|
+
|
|
149
|
+
print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
|
|
150
|
+
|
|
151
|
+
print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
|
|
152
|
+
|
|
153
|
+
aws_vault.delete_secret("api_key")
|
|
154
|
+
print(aws_vault.list_secrets()) # Output: []
|
|
155
|
+
if __name__ == '__main__':
|
|
156
|
+
run()
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
### Using JWT Token handler
|
|
161
|
+
|
|
162
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
from shared_kernel.security import JWTTokenHandler
|
|
166
|
+
|
|
167
|
+
def run():
|
|
168
|
+
secret_key = 'your-secret-key'
|
|
169
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
170
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
171
|
+
|
|
172
|
+
if __name__ == '__main__':
|
|
173
|
+
run()
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Using JWTTokenHandler
|
|
177
|
+
|
|
178
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
from shared_kernel.auth import JWTTokenHandler
|
|
182
|
+
|
|
183
|
+
def run():
|
|
184
|
+
secret_key = 'your-secret-key'
|
|
185
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
186
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
187
|
+
if __name__ == '__main__':
|
|
188
|
+
run()
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
In routes
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
from shared_kernel.auth import token_required
|
|
195
|
+
|
|
196
|
+
@app.route('/')
|
|
197
|
+
@token_required
|
|
198
|
+
def user(current_user):
|
|
199
|
+
return jsonify(current_user)
|
|
200
|
+
```
|
|
201
|
+
|
|
@@ -78,7 +78,7 @@ engine, SessionLocal = db_instance.init_db_connection()
|
|
|
78
78
|
|
|
79
79
|
### Initializing NATS Connection
|
|
80
80
|
|
|
81
|
-
Use the `NATSClient` class to initialize
|
|
81
|
+
Use the `NATSClient` class to initialize:
|
|
82
82
|
|
|
83
83
|
```
|
|
84
84
|
from shared_kernel.messaging import NATSClient
|
|
@@ -96,4 +96,75 @@ def run():
|
|
|
96
96
|
|
|
97
97
|
if __name__ == '__main__':
|
|
98
98
|
asyncio.run(run())
|
|
99
|
-
```
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
### Using Keyvault Manager
|
|
103
|
+
|
|
104
|
+
Use the `KeyVaultManager` class to initialize:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
from shared_kernel.security import KeyVaultManager
|
|
108
|
+
|
|
109
|
+
def run():
|
|
110
|
+
aws_vault = KeyVaultManager.create_key_vault('aws', {
|
|
111
|
+
'region_name': 'us-east-1',
|
|
112
|
+
'AWS_SERVER_PUBLIC_KEY': '<key here>',
|
|
113
|
+
'AWS_SERVER_SECRET_KEY': '<secret here>'
|
|
114
|
+
})
|
|
115
|
+
# AWS Secrets Manager operations
|
|
116
|
+
aws_vault.store_secret("fdc_api_key", "123456")
|
|
117
|
+
|
|
118
|
+
print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
|
|
119
|
+
|
|
120
|
+
print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
|
|
121
|
+
|
|
122
|
+
aws_vault.delete_secret("api_key")
|
|
123
|
+
print(aws_vault.list_secrets()) # Output: []
|
|
124
|
+
if __name__ == '__main__':
|
|
125
|
+
run()
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
### Using JWT Token handler
|
|
130
|
+
|
|
131
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
from shared_kernel.security import JWTTokenHandler
|
|
135
|
+
|
|
136
|
+
def run():
|
|
137
|
+
secret_key = 'your-secret-key'
|
|
138
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
139
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
140
|
+
|
|
141
|
+
if __name__ == '__main__':
|
|
142
|
+
run()
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Using JWTTokenHandler
|
|
146
|
+
|
|
147
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
from shared_kernel.auth import JWTTokenHandler
|
|
151
|
+
|
|
152
|
+
def run():
|
|
153
|
+
secret_key = 'your-secret-key'
|
|
154
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
155
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
156
|
+
if __name__ == '__main__':
|
|
157
|
+
run()
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
In routes
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
from shared_kernel.auth import token_required
|
|
164
|
+
|
|
165
|
+
@app.route('/')
|
|
166
|
+
@token_required
|
|
167
|
+
def user(current_user):
|
|
168
|
+
return jsonify(current_user)
|
|
169
|
+
```
|
|
170
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fdc_shared_kernel
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.9
|
|
4
4
|
Summary: Shared library for microservice
|
|
5
5
|
Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -111,7 +111,7 @@ engine, SessionLocal = db_instance.init_db_connection()
|
|
|
111
111
|
|
|
112
112
|
### Initializing NATS Connection
|
|
113
113
|
|
|
114
|
-
Use the `NATSClient` class to initialize
|
|
114
|
+
Use the `NATSClient` class to initialize:
|
|
115
115
|
|
|
116
116
|
```
|
|
117
117
|
from shared_kernel.messaging import NATSClient
|
|
@@ -130,3 +130,74 @@ def run():
|
|
|
130
130
|
if __name__ == '__main__':
|
|
131
131
|
asyncio.run(run())
|
|
132
132
|
```
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
### Using Keyvault Manager
|
|
136
|
+
|
|
137
|
+
Use the `KeyVaultManager` class to initialize:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
from shared_kernel.security import KeyVaultManager
|
|
141
|
+
|
|
142
|
+
def run():
|
|
143
|
+
aws_vault = KeyVaultManager.create_key_vault('aws', {
|
|
144
|
+
'region_name': 'us-east-1',
|
|
145
|
+
'AWS_SERVER_PUBLIC_KEY': '<key here>',
|
|
146
|
+
'AWS_SERVER_SECRET_KEY': '<secret here>'
|
|
147
|
+
})
|
|
148
|
+
# AWS Secrets Manager operations
|
|
149
|
+
aws_vault.store_secret("fdc_api_key", "123456")
|
|
150
|
+
|
|
151
|
+
print(aws_vault.retrieve_secret("fdc_api_key")) # Output: 123456
|
|
152
|
+
|
|
153
|
+
print(aws_vault.list_secrets()) # Output: ['fdc_api_key']
|
|
154
|
+
|
|
155
|
+
aws_vault.delete_secret("api_key")
|
|
156
|
+
print(aws_vault.list_secrets()) # Output: []
|
|
157
|
+
if __name__ == '__main__':
|
|
158
|
+
run()
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
### Using JWT Token handler
|
|
163
|
+
|
|
164
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
from shared_kernel.security import JWTTokenHandler
|
|
168
|
+
|
|
169
|
+
def run():
|
|
170
|
+
secret_key = 'your-secret-key'
|
|
171
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
172
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
173
|
+
|
|
174
|
+
if __name__ == '__main__':
|
|
175
|
+
run()
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Using JWTTokenHandler
|
|
179
|
+
|
|
180
|
+
Use the `JWTTokenHandler` class to initialize:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
from shared_kernel.auth import JWTTokenHandler
|
|
184
|
+
|
|
185
|
+
def run():
|
|
186
|
+
secret_key = 'your-secret-key'
|
|
187
|
+
token_handler = JWTTokenHandler(secret_key)
|
|
188
|
+
payload = token_handler.decode_token('your-jwt-token')
|
|
189
|
+
if __name__ == '__main__':
|
|
190
|
+
run()
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
In routes
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
from shared_kernel.auth import token_required
|
|
197
|
+
|
|
198
|
+
@app.route('/')
|
|
199
|
+
@token_required
|
|
200
|
+
def user(current_user):
|
|
201
|
+
return jsonify(current_user)
|
|
202
|
+
```
|
|
203
|
+
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/SOURCES.txt
RENAMED
|
@@ -8,6 +8,9 @@ src/fdc_shared_kernel.egg-info/dependency_links.txt
|
|
|
8
8
|
src/fdc_shared_kernel.egg-info/requires.txt
|
|
9
9
|
src/fdc_shared_kernel.egg-info/top_level.txt
|
|
10
10
|
src/shared_kernel/__init__.py
|
|
11
|
+
src/shared_kernel/auth/__init__.py
|
|
12
|
+
src/shared_kernel/auth/jwt_helper.py
|
|
13
|
+
src/shared_kernel/auth/token_handler.py
|
|
11
14
|
src/shared_kernel/config/__init__.py
|
|
12
15
|
src/shared_kernel/database/__init__.py
|
|
13
16
|
src/shared_kernel/exceptions/__init__.py
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import jwt
|
|
2
|
+
from shared_kernel.exceptions import Unauthorized
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class JWTTokenHandler:
|
|
6
|
+
_instance = None
|
|
7
|
+
|
|
8
|
+
def __new__(cls, secret_key: str = None):
|
|
9
|
+
if cls._instance is None:
|
|
10
|
+
if secret_key is None:
|
|
11
|
+
raise ValueError("Secret key must be provided for the first initialization.")
|
|
12
|
+
cls._instance = super(JWTTokenHandler, cls).__new__(cls)
|
|
13
|
+
cls._instance._initialize(secret_key)
|
|
14
|
+
return cls._instance
|
|
15
|
+
|
|
16
|
+
def _initialize(self, secret_key: str):
|
|
17
|
+
"""
|
|
18
|
+
Initialize the JWTTokenHandler with a secret key.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
secret_key (str): The secret key used for decoding and verifying JWT tokens.
|
|
22
|
+
"""
|
|
23
|
+
self.secret_key = secret_key
|
|
24
|
+
|
|
25
|
+
def decode_token(self, token: str) -> dict:
|
|
26
|
+
"""
|
|
27
|
+
Decode and verify a JWT token using the provided secret key.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
token (str): The JWT token to be decoded.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
dict: The payload of the decoded token.
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
Unauthorized: If the token is expired or invalid.
|
|
37
|
+
"""
|
|
38
|
+
try:
|
|
39
|
+
payload = jwt.decode(token, self.secret_key, algorithms=['HS256'])
|
|
40
|
+
return payload
|
|
41
|
+
except jwt.ExpiredSignatureError:
|
|
42
|
+
raise Unauthorized('Token expired')
|
|
43
|
+
except jwt.InvalidTokenError:
|
|
44
|
+
raise Unauthorized('Invalid token')
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from flask import request
|
|
2
|
+
from shared_kernel.auth import JWTTokenHandler
|
|
3
|
+
from shared_kernel.config import Config
|
|
4
|
+
from shared_kernel.exceptions import Unauthorized
|
|
5
|
+
|
|
6
|
+
config = Config()
|
|
7
|
+
token_handler = JWTTokenHandler(config.get('JWT_SECRET_KEY'))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Decorator to protect routes
|
|
11
|
+
def token_required(f):
|
|
12
|
+
def decorator(*args, **kwargs):
|
|
13
|
+
token = None
|
|
14
|
+
if 'Authorization' in request.headers:
|
|
15
|
+
token = request.headers['Authorization'].replace('Bearer ', '')
|
|
16
|
+
|
|
17
|
+
if not token:
|
|
18
|
+
raise Unauthorized('Token is missing!')
|
|
19
|
+
|
|
20
|
+
payload = token_handler.decode_token(token)
|
|
21
|
+
if 'error' in payload:
|
|
22
|
+
raise Unauthorized("Failed to parse token")
|
|
23
|
+
|
|
24
|
+
# Add user information to the request context
|
|
25
|
+
current_user = {
|
|
26
|
+
"user_id": payload['user_id'],
|
|
27
|
+
"org_id": payload['org_id']
|
|
28
|
+
}
|
|
29
|
+
return f(current_user, *args, **kwargs)
|
|
30
|
+
|
|
31
|
+
return decorator
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import logging
|
|
2
3
|
from typing import Any
|
|
3
4
|
from dotenv import load_dotenv, find_dotenv
|
|
4
5
|
from shared_kernel.exceptions import MissingConfiguration, InvalidConfiguration
|
|
5
|
-
from shared_kernel.logger import Logger
|
|
6
|
-
|
|
7
|
-
logger = Logger('SHARED_KERNEL')
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class Config:
|
|
@@ -26,12 +24,12 @@ class Config:
|
|
|
26
24
|
if env_path is None:
|
|
27
25
|
dotenv_path = find_dotenv()
|
|
28
26
|
if not dotenv_path:
|
|
29
|
-
|
|
27
|
+
logging.error(".env file not found")
|
|
30
28
|
raise InvalidConfiguration(".env file not found")
|
|
31
29
|
else:
|
|
32
30
|
dotenv_path = env_path
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
logging.info(f"Loading environment variables from {dotenv_path}")
|
|
35
33
|
load_dotenv(dotenv_path)
|
|
36
34
|
|
|
37
35
|
@staticmethod
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import logging
|
|
1
2
|
from sqlalchemy import create_engine
|
|
2
3
|
from sqlalchemy.ext.declarative import declarative_base
|
|
3
4
|
from sqlalchemy.orm import sessionmaker
|
|
4
|
-
from shared_kernel.logger import Logger
|
|
5
5
|
from typing import Tuple
|
|
6
6
|
|
|
7
7
|
|
|
@@ -15,8 +15,6 @@ class DB:
|
|
|
15
15
|
self.engine = create_engine(db_url, pool_size=20, max_overflow=100)
|
|
16
16
|
self.SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=self.engine)
|
|
17
17
|
self.Base = declarative_base()
|
|
18
|
-
self.logger = Logger(name="database")
|
|
19
|
-
self.logger.configure_logger()
|
|
20
18
|
|
|
21
19
|
def init_db_connection(self) -> Tuple[create_engine, sessionmaker]:
|
|
22
20
|
"""
|
|
@@ -24,20 +22,20 @@ class DB:
|
|
|
24
22
|
|
|
25
23
|
:return: A tuple containing the SQLAlchemy engine and session maker.
|
|
26
24
|
"""
|
|
27
|
-
|
|
25
|
+
logging.info("Database connection initialized successfully.")
|
|
28
26
|
return self.engine, self.SessionLocal
|
|
29
27
|
|
|
30
28
|
def create_tables(self):
|
|
31
29
|
"""
|
|
32
30
|
Creates all tables stored in declarative Base.
|
|
33
31
|
"""
|
|
34
|
-
|
|
32
|
+
logging.info("Creating tables...")
|
|
35
33
|
self.Base.metadata.create_all(bind=self.engine)
|
|
36
|
-
|
|
34
|
+
logging.info("Tables created successfully.")
|
|
37
35
|
|
|
38
36
|
def close_session(self):
|
|
39
37
|
"""
|
|
40
38
|
Closes the database session.
|
|
41
39
|
"""
|
|
42
40
|
self.SessionLocal.remove()
|
|
43
|
-
|
|
41
|
+
logging.info("Session closed successfully.")
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import http
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class HTTPException(Exception):
|
|
5
|
+
"""Base class for all HTTP exceptions."""
|
|
6
|
+
|
|
7
|
+
def __init__(self, message: str = "", code: int = None) -> None:
|
|
8
|
+
super().__init__(message)
|
|
9
|
+
self.code = code
|
|
10
|
+
|
|
11
|
+
def __str__(self) -> str:
|
|
12
|
+
return f"{super().__str__()}"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BadRequest(HTTPException):
|
|
16
|
+
"""Raised for HTTP 400 Bad Request errors."""
|
|
17
|
+
code = http.HTTPStatus.BAD_REQUEST.value
|
|
18
|
+
|
|
19
|
+
def __init__(self, message: str = "Bad Request", code: int = 400) -> None:
|
|
20
|
+
super().__init__(message=message, code=code or self.code)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Unauthorized(HTTPException):
|
|
24
|
+
"""Raised for HTTP 401 Unauthorized errors."""
|
|
25
|
+
code = http.HTTPStatus.UNAUTHORIZED.value
|
|
26
|
+
|
|
27
|
+
def __init__(self, message: str = "Unauthorized", code: int = 400) -> None:
|
|
28
|
+
super().__init__(message=message, code=code or self.code)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Forbidden(HTTPException):
|
|
32
|
+
"""Raised for HTTP 403 Forbidden errors."""
|
|
33
|
+
code = http.HTTPStatus.FORBIDDEN.value
|
|
34
|
+
|
|
35
|
+
def __init__(self, message: str = "Forbidden", code: int = 403) -> None:
|
|
36
|
+
super().__init__(message=message, code=code or self.code)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class NotFound(HTTPException):
|
|
40
|
+
"""Raised for HTTP 404 Not Found errors."""
|
|
41
|
+
code = http.HTTPStatus.NOT_FOUND.value
|
|
42
|
+
|
|
43
|
+
def __init__(self, message: str = "Not Found", code: int = 404) -> None:
|
|
44
|
+
super().__init__(message=message, code=code or self.code)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class Conflict(HTTPException):
|
|
48
|
+
"""Raised for HTTP 409 Conflict errors."""
|
|
49
|
+
code = http.HTTPStatus.CONFLICT.value
|
|
50
|
+
|
|
51
|
+
def __init__(self, message: str = "Conflict", code: int = 409) -> None:
|
|
52
|
+
super().__init__(message=message, code=code or self.code)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class InternalServerError(HTTPException):
|
|
56
|
+
"""Raised for HTTP 500 Internal Server Error."""
|
|
57
|
+
code = http.HTTPStatus.INTERNAL_SERVER_ERROR.value
|
|
58
|
+
|
|
59
|
+
def __init__(self, message: str = "Internal Server Error", code: int = 500) -> None:
|
|
60
|
+
super().__init__(message=message, code=code or self.code)
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/messaging/nats_databus.py
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import logging
|
|
2
3
|
from nats.aio.client import Client as NATS
|
|
3
4
|
from nats.js.api import ConsumerConfig, DeliverPolicy, StreamConfig
|
|
4
5
|
from typing import Callable, Any, List, Union
|
|
5
6
|
from shared_kernel.interfaces import DataBus
|
|
6
|
-
from shared_kernel.logger import Logger
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class NATSDataBus(DataBus):
|
|
@@ -32,7 +32,6 @@ class NATSDataBus(DataBus):
|
|
|
32
32
|
self.connected = False
|
|
33
33
|
self.js = None # JetStream context
|
|
34
34
|
self.initialized = True
|
|
35
|
-
self.logger = Logger('SHARED_KERNEL')
|
|
36
35
|
|
|
37
36
|
async def make_connection(self):
|
|
38
37
|
"""
|
|
@@ -90,12 +89,12 @@ class NATSDataBus(DataBus):
|
|
|
90
89
|
ack = await self.js.publish(
|
|
91
90
|
topic, json.dumps(event_payload).encode("utf-8")
|
|
92
91
|
)
|
|
93
|
-
|
|
92
|
+
logging.info(
|
|
94
93
|
f"Published event '{event_payload.get('event_name')}' to topic '{topic}', ack: {ack}"
|
|
95
94
|
)
|
|
96
95
|
return True
|
|
97
96
|
except Exception as e:
|
|
98
|
-
|
|
97
|
+
logging.error(
|
|
99
98
|
f"Failed to publish event '{event_payload.get('event_name')}': {str(e)}",
|
|
100
99
|
exc_info=True,
|
|
101
100
|
)
|
|
@@ -121,7 +120,7 @@ class NATSDataBus(DataBus):
|
|
|
121
120
|
)
|
|
122
121
|
return json.loads(response.data.decode("utf-8"))
|
|
123
122
|
except Exception as e:
|
|
124
|
-
|
|
123
|
+
logging.error(f"Failed to request topic '{topic}': {e}", exc_info=True)
|
|
125
124
|
raise e
|
|
126
125
|
|
|
127
126
|
async def subscribe_async_event(
|
|
@@ -144,10 +143,10 @@ class NATSDataBus(DataBus):
|
|
|
144
143
|
)
|
|
145
144
|
|
|
146
145
|
await self.js.subscribe(topic, cb=callback, config=consumer_config)
|
|
147
|
-
|
|
146
|
+
logging.info(f"Subscribed to async event on topic '{topic}'")
|
|
148
147
|
|
|
149
148
|
except Exception as e:
|
|
150
|
-
|
|
149
|
+
logging.error(
|
|
151
150
|
f"Failed to subscribe to async event on topic '{topic}': {e}",
|
|
152
151
|
exc_info=True,
|
|
153
152
|
)
|
|
@@ -163,10 +162,10 @@ class NATSDataBus(DataBus):
|
|
|
163
162
|
"""
|
|
164
163
|
try:
|
|
165
164
|
await self.nc.subscribe(topic, cb=callback)
|
|
166
|
-
|
|
165
|
+
logging.info(f"Subscribed to sync event on topic '{topic}'")
|
|
167
166
|
|
|
168
167
|
except Exception as e:
|
|
169
|
-
|
|
168
|
+
logging.error(
|
|
170
169
|
f"Failed to subscribe to sync event on topic '{topic}': {e}",
|
|
171
170
|
exc_info=True,
|
|
172
171
|
)
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/security/key_vault/__init__.py
RENAMED
|
@@ -3,7 +3,7 @@ from shared_kernel.security.key_vault.aws_secret_manager import AWSSecretsManage
|
|
|
3
3
|
from shared_kernel.security.key_vault.azure_keyvault import AzureKeyVault
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class
|
|
6
|
+
class KeyVaultManager:
|
|
7
7
|
@staticmethod
|
|
8
8
|
def create_key_vault(vault_type: str, config: dict) -> KeyVaultInterface:
|
|
9
9
|
if vault_type == 'AZURE':
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import boto3
|
|
2
|
+
import logging
|
|
2
3
|
from botocore.exceptions import ClientError
|
|
3
4
|
from shared_kernel.interfaces import KeyVaultInterface
|
|
4
|
-
from shared_kernel.logger import Logger
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class AWSSecretsManager(KeyVaultInterface):
|
|
@@ -29,8 +29,7 @@ class AWSSecretsManager(KeyVaultInterface):
|
|
|
29
29
|
aws_access_key_id=self._aws_access_key_id,
|
|
30
30
|
aws_secret_access_key=self._aws_secret_access_key,
|
|
31
31
|
region_name=self._region_name)
|
|
32
|
-
|
|
33
|
-
self.logger.info(f"Connected to AWS Secrets Manager in region: {self._region_name}")
|
|
32
|
+
logging.info(f"Connected to AWS Secrets Manager in region: {self._region_name}")
|
|
34
33
|
|
|
35
34
|
def store_secret(self, name: str, secret: str) -> None:
|
|
36
35
|
"""
|
|
@@ -45,13 +44,13 @@ class AWSSecretsManager(KeyVaultInterface):
|
|
|
45
44
|
"""
|
|
46
45
|
try:
|
|
47
46
|
self._client.create_secret(Name=name, SecretString=secret)
|
|
48
|
-
|
|
47
|
+
logging.info(f"Stored secret '{name}'")
|
|
49
48
|
except ClientError as e:
|
|
50
49
|
if e.response['Error']['Code'] == 'ResourceExistsException':
|
|
51
50
|
self._client.update_secret(SecretId=name, SecretString=secret)
|
|
52
|
-
|
|
51
|
+
logging.info(f"Updated secret '{name}'")
|
|
53
52
|
else:
|
|
54
|
-
|
|
53
|
+
logging.error(f"Failed to update secret '{name}' | Error: '{e}'")
|
|
55
54
|
raise e
|
|
56
55
|
|
|
57
56
|
def retrieve_secret(self, name: str) -> str:
|
|
@@ -71,7 +70,7 @@ class AWSSecretsManager(KeyVaultInterface):
|
|
|
71
70
|
response = self._client.get_secret_value(SecretId=name)
|
|
72
71
|
return response['SecretString']
|
|
73
72
|
except ClientError as e:
|
|
74
|
-
|
|
73
|
+
logging.error(f"Error retrieving secret '{name}': {e}")
|
|
75
74
|
return None
|
|
76
75
|
|
|
77
76
|
def delete_secret(self, name: str) -> None:
|
|
@@ -86,9 +85,9 @@ class AWSSecretsManager(KeyVaultInterface):
|
|
|
86
85
|
"""
|
|
87
86
|
try:
|
|
88
87
|
self._client.delete_secret(SecretId=name, ForceDeleteWithoutRecovery=True)
|
|
89
|
-
|
|
88
|
+
logging.info(f"Deleted secret '{name}'")
|
|
90
89
|
except ClientError as e:
|
|
91
|
-
|
|
90
|
+
logging.error(f"Error deleting secret '{name}': {e}")
|
|
92
91
|
|
|
93
92
|
def list_secrets(self) -> list:
|
|
94
93
|
"""
|
|
@@ -104,5 +103,5 @@ class AWSSecretsManager(KeyVaultInterface):
|
|
|
104
103
|
response = self._client.list_secrets()
|
|
105
104
|
return [secret['Name'] for secret in response['SecretList']]
|
|
106
105
|
except ClientError as e:
|
|
107
|
-
|
|
106
|
+
logging.error(f"Error listing secrets: {e}")
|
|
108
107
|
return []
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from azure.identity import ClientSecretCredential
|
|
2
2
|
from azure.keyvault.secrets import SecretClient
|
|
3
3
|
from shared_kernel.interfaces import KeyVaultInterface
|
|
4
|
-
|
|
4
|
+
import logging
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class AzureKeyVault(KeyVaultInterface):
|
|
@@ -38,8 +38,7 @@ class AzureKeyVault(KeyVaultInterface):
|
|
|
38
38
|
client_secret=config.get('client_secret')
|
|
39
39
|
)
|
|
40
40
|
self._client = SecretClient(vault_url=self._vault_url, credential=self._credential)
|
|
41
|
-
|
|
42
|
-
self.logger.info(f"Connected to Azure Key Vault at: {self._vault_url}")
|
|
41
|
+
logging.info(f"Connected to Azure Key Vault at: {self._vault_url}")
|
|
43
42
|
|
|
44
43
|
def store_secret(self, name: str, secret: str) -> None:
|
|
45
44
|
"""
|
|
@@ -50,7 +49,7 @@ class AzureKeyVault(KeyVaultInterface):
|
|
|
50
49
|
secret (str): The value of the secret.
|
|
51
50
|
"""
|
|
52
51
|
self._client.set_secret(name, secret)
|
|
53
|
-
|
|
52
|
+
logging.info(f"Stored secret '{name}'")
|
|
54
53
|
|
|
55
54
|
def retrieve_secret(self, name: str) -> str:
|
|
56
55
|
"""
|
|
@@ -73,7 +72,7 @@ class AzureKeyVault(KeyVaultInterface):
|
|
|
73
72
|
name (str): The name of the secret.
|
|
74
73
|
"""
|
|
75
74
|
self._client.begin_delete_secret(name)
|
|
76
|
-
|
|
75
|
+
logging.info(f"Deleted secret '{name}'")
|
|
77
76
|
|
|
78
77
|
def list_secrets(self) -> list:
|
|
79
78
|
"""
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import http
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class HTTPException(Exception):
|
|
5
|
-
"""Base class for all HTTP exceptions."""
|
|
6
|
-
|
|
7
|
-
def __init__(self, message: str = "", status_code: int = None) -> None:
|
|
8
|
-
super().__init__(message)
|
|
9
|
-
self.status_code = status_code
|
|
10
|
-
|
|
11
|
-
def __str__(self) -> str:
|
|
12
|
-
return f"{self.status_code}: {super().__str__()}"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class BadRequest(HTTPException):
|
|
16
|
-
"""Raised for HTTP 400 Bad Request errors."""
|
|
17
|
-
status_code = http.HTTPStatus.BAD_REQUEST.value
|
|
18
|
-
|
|
19
|
-
def __init__(self, message: str = "Bad Request", status_code: int = None) -> None:
|
|
20
|
-
super().__init__(message=message, status_code=status_code or self.status_code)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class Unauthorized(HTTPException):
|
|
24
|
-
"""Raised for HTTP 401 Unauthorized errors."""
|
|
25
|
-
status_code = http.HTTPStatus.UNAUTHORIZED.value
|
|
26
|
-
|
|
27
|
-
def __init__(self, message: str = "Unauthorized", status_code: int = None) -> None:
|
|
28
|
-
super().__init__(message=message, status_code=status_code or self.status_code)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
class Forbidden(HTTPException):
|
|
32
|
-
"""Raised for HTTP 403 Forbidden errors."""
|
|
33
|
-
status_code = http.HTTPStatus.FORBIDDEN.value
|
|
34
|
-
|
|
35
|
-
def __init__(self, message: str = "Forbidden", status_code: int = None) -> None:
|
|
36
|
-
super().__init__(message=message, status_code=status_code or self.status_code)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class NotFound(HTTPException):
|
|
40
|
-
"""Raised for HTTP 404 Not Found errors."""
|
|
41
|
-
status_code = http.HTTPStatus.NOT_FOUND.value
|
|
42
|
-
|
|
43
|
-
def __init__(self, message: str = "Not Found", status_code: int = None) -> None:
|
|
44
|
-
super().__init__(message=message, status_code=status_code or self.status_code)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class Conflict(HTTPException):
|
|
48
|
-
"""Raised for HTTP 409 Conflict errors."""
|
|
49
|
-
status_code = http.HTTPStatus.CONFLICT.value
|
|
50
|
-
|
|
51
|
-
def __init__(self, message: str = "Conflict", status_code: int = None) -> None:
|
|
52
|
-
super().__init__(message=message, status_code=status_code or self.status_code)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class InternalServerError(HTTPException):
|
|
56
|
-
"""Raised for HTTP 500 Internal Server Error."""
|
|
57
|
-
status_code = http.HTTPStatus.INTERNAL_SERVER_ERROR.value
|
|
58
|
-
|
|
59
|
-
def __init__(self, message: str = "Internal Server Error", status_code: int = None) -> None:
|
|
60
|
-
super().__init__(message=message, status_code=status_code or self.status_code)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/requires.txt
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/fdc_shared_kernel.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/exceptions/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/interfaces/keyvault.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/config/test_config.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/tests/logger/test_logger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/data_validators_utils.py
RENAMED
|
File without changes
|
{fdc_shared_kernel-0.0.6 → fdc_shared_kernel-0.0.9}/src/shared_kernel/utils/date_format_utils.py
RENAMED
|
File without changes
|
|
File without changes
|