brynq-sdk-bob 2.6.5__tar.gz → 2.6.7__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.
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/PKG-INFO +1 -1
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/people.py +29 -1
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/people.py +2 -1
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/setup.py +1 -1
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/__init__.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/bank.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/company.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/custom_tables.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/documents.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/employment.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/named_lists.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/payments.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/payroll_history.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/salaries.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/__init__.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/bank.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/employment.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/named_lists.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/payments.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/salary.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/timeoff.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/schemas/work.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/timeoff.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob/work.py +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob.egg-info/requires.txt +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
- {brynq_sdk_bob-2.6.5 → brynq_sdk_bob-2.6.7}/setup.cfg +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pandas as pd
|
|
2
|
+
import re
|
|
2
3
|
from typing import Optional
|
|
3
4
|
from brynq_sdk_functions import Functions
|
|
4
5
|
from brynq_sdk_functions import BrynQPanderaDataFrameModel
|
|
@@ -21,6 +22,7 @@ class People:
|
|
|
21
22
|
self.schema = PeopleSchema
|
|
22
23
|
|
|
23
24
|
|
|
25
|
+
|
|
24
26
|
# Build API fields using column metadata if present (api_field), otherwise use the column (alias) name
|
|
25
27
|
def __build_api_fields(self, schema_model: BrynQPanderaDataFrameModel) -> list[str]:
|
|
26
28
|
schema = schema_model.to_schema()
|
|
@@ -44,7 +46,7 @@ class People:
|
|
|
44
46
|
timeout=self.bob.timeout)
|
|
45
47
|
resp.raise_for_status()
|
|
46
48
|
df = pd.json_normalize(resp.json()['employees'])
|
|
47
|
-
|
|
49
|
+
|
|
48
50
|
|
|
49
51
|
# Normalize separators in incoming data: convert '/' to '.' to match schema aliases
|
|
50
52
|
df.columns = df.columns.str.replace('/', '.', regex=False)
|
|
@@ -72,6 +74,32 @@ class People:
|
|
|
72
74
|
valid_people = df
|
|
73
75
|
invalid_people_custom = pd.DataFrame()
|
|
74
76
|
|
|
77
|
+
|
|
75
78
|
valid_people, invalid_people = Functions.validate_data(df=valid_people, schema=PeopleSchema, debug=True)
|
|
76
79
|
|
|
80
|
+
# For columns ending with .value.value, use fillna to fill the corresponding base column since that's not done automatically
|
|
81
|
+
def _normalize_key(key: str) -> str:
|
|
82
|
+
# Build mapping from custom schema alias (API path) to the real column name used after validation
|
|
83
|
+
key = key.lstrip('.')
|
|
84
|
+
key = key.replace('/', '.')
|
|
85
|
+
key = key.replace('.', '_')
|
|
86
|
+
key = re.sub(r'(?<!^)([A-Z])', r'_\1', key).lower()
|
|
87
|
+
return key
|
|
88
|
+
|
|
89
|
+
alias_to_real: dict = {}
|
|
90
|
+
if schema_custom_fields is not None:
|
|
91
|
+
alias_map = getattr(schema_custom_fields, "_alias_map", {}) # real_name -> alias
|
|
92
|
+
alias_to_real = {_normalize_key(alias): real for real, alias in alias_map.items()}
|
|
93
|
+
|
|
94
|
+
for col in valid_people.columns:
|
|
95
|
+
if col.endswith('value.value'):
|
|
96
|
+
# Compute the base alias (remove suffix), normalise, and resolve to real column name via custom schema
|
|
97
|
+
base_alias = col[:-12]
|
|
98
|
+
target_key = _normalize_key(base_alias)
|
|
99
|
+
target_col = alias_to_real.get(target_key, target_key)
|
|
100
|
+
if target_col in valid_people.columns:
|
|
101
|
+
valid_people[target_col] = valid_people[target_col].fillna(valid_people[col])
|
|
102
|
+
|
|
103
|
+
# Remove columns that contain '.value' or '_get'
|
|
104
|
+
valid_people = valid_people.loc[:, ~valid_people.columns.str.contains(r'\.value|_get')]
|
|
77
105
|
return valid_people, pd.concat([invalid_people, invalid_people_custom])
|
|
@@ -221,8 +221,9 @@ class PeopleSchema(BrynQPanderaDataFrameModel):
|
|
|
221
221
|
|
|
222
222
|
# Salary information
|
|
223
223
|
payroll_salary_monthly_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base salary (monthly_", alias="payroll.salary.monthlyPayment")
|
|
224
|
+
payroll_salary_yearly_get: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly), used for getting nested json", alias="payroll.salary.yearlyPayment")
|
|
224
225
|
payroll_salary_yearly_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly)", alias="payroll.salary.yearlyPayment.value")
|
|
225
|
-
payroll_salary_yearly_payment_currency: Optional[Series[
|
|
226
|
+
payroll_salary_yearly_payment_currency: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly)", alias="payroll.salary.yearlyPayment.currency")
|
|
226
227
|
payroll_salary_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base Salary", alias="payroll.salary.payment")
|
|
227
228
|
|
|
228
229
|
# Emergency contact
|
|
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
|