@@ -53,22 +53,30 @@ def valid_assembled_df():
5353 "order_revenue" : [12.34 , 56.78 ],
5454 "product_id" : ["prod1" , "prod2" ],
5555 "order_status" : ["delivered" , "delivered" ],
56- "order_purchase_timestamp" : pd .to_datetime ([
57- "2023-01-02 09:00:00" ,
58- "2023-01-10 14:00:00" ,
59- ]),
60- "order_approved_at" : pd .to_datetime ([
61- "2023-01-03 09:00:00" ,
62- "2023-01-11 14:00:00" ,
63- ]),
64- "order_delivered_timestamp" : pd .to_datetime ([
65- "2023-01-06 09:00:00" ,
66- "2023-01-16 14:00:00" ,
67- ]),
68- "order_estimated_delivery_date" : pd .to_datetime ([
69- "2023-01-05" ,
70- "2023-01-15" ,
71- ]),
56+ "order_purchase_timestamp" : pd .to_datetime (
57+ [
58+ "2023-01-02 09:00:00" ,
59+ "2023-01-10 14:00:00" ,
60+ ]
61+ ),
62+ "order_approved_at" : pd .to_datetime (
63+ [
64+ "2023-01-03 09:00:00" ,
65+ "2023-01-11 14:00:00" ,
66+ ]
67+ ),
68+ "order_delivered_timestamp" : pd .to_datetime (
69+ [
70+ "2023-01-06 09:00:00" ,
71+ "2023-01-16 14:00:00" ,
72+ ]
73+ ),
74+ "order_estimated_delivery_date" : pd .to_datetime (
75+ [
76+ "2023-01-05" ,
77+ "2023-01-15" ,
78+ ]
79+ ),
7280 "lead_time_days" : [3 , 5 ],
7381 "approval_lag_days" : [1 , 1 ],
7482 "delivery_delay_days" : [1 , 1 ],
@@ -77,14 +85,16 @@ def valid_assembled_df():
7785 "order_year_week" : ["2023-W01" , "2023-W01" ],
7886 "run_id" : ["20230101T120000" , "20230101T120000" ],
7987 }
80- ).astype ({
81- "order_status" : "category" ,
82- "lead_time_days" : "int16" ,
83- "approval_lag_days" : "int16" ,
84- "delivery_delay_days" : "int16" ,
85- "order_year" : "int16" ,
86- "order_revenue" : "float32" ,
87- })
88+ ).astype (
89+ {
90+ "order_status" : "category" ,
91+ "lead_time_days" : "int16" ,
92+ "approval_lag_days" : "int16" ,
93+ "delivery_delay_days" : "int16" ,
94+ "order_year" : "int16" ,
95+ "order_revenue" : "float32" ,
96+ }
97+ )
8898
8999
90100# =============================================================================
@@ -116,8 +126,10 @@ def test_log_info_appends_only_to_info(empty_report):
116126def test_seller_semantic_model_grain_preserved_success (tmp_path , valid_assembled_df ):
117127 run_context = RunContext .create (base = tmp_path , run_id = "20230101T120000" )
118128 seller_semantic = build_seller_semantic (valid_assembled_df , run_context )
119-
120- expected_fact_len = valid_assembled_df [["seller_id" , "order_year_week" ]].drop_duplicates ().shape [0 ]
129+
130+ expected_fact_len = (
131+ valid_assembled_df [["seller_id" , "order_year_week" ]].drop_duplicates ().shape [0 ]
132+ )
121133 assert len (seller_semantic ["seller_weekly_fact" ]) == expected_fact_len
122134
123135 expected_dim_len = valid_assembled_df ["seller_id" ].nunique ()
@@ -149,14 +161,20 @@ def test_build_semantic_layer_success(
149161 run_context .initialize_directories ()
150162
151163 # Setup Assembled layer
152- valid_assembled_df .to_parquet (run_context .assembled_path / "assembled_events_2023_01_01.parquet" )
153- valid_customers_df .to_parquet (run_context .assembled_path / "df_customers_2023_01_01.parquet" )
154- valid_products_df .to_parquet (run_context .assembled_path / "df_products_2023_01_01.parquet" )
164+ valid_assembled_df .to_parquet (
165+ run_context .assembled_path / "assembled_events_2023_01_01.parquet"
166+ )
167+ valid_customers_df .to_parquet (
168+ run_context .assembled_path / "df_customers_2023_01_01.parquet"
169+ )
170+ valid_products_df .to_parquet (
171+ run_context .assembled_path / "df_products_2023_01_01.parquet"
172+ )
155173
156174 report = build_semantic_layer (run_context )
157175
158176 assert report ["status" ] == "success"
159-
177+
160178 for module_name , module_config in SEMANTIC_MODULES .items ():
161179 for table_name in module_config ["tables" ]:
162180 outputs_path = (
@@ -175,14 +193,18 @@ def test_build_semantic_layer_fails_on_multiple_ids(tmp_path, valid_assembled_df
175193 broken_assembled = valid_assembled_df .copy ()
176194 broken_assembled .loc [1 , "run_id" ] = "another_run"
177195
178- broken_assembled .to_parquet (run_context .assembled_path / "assembled_events_2023_01_01.parquet" )
196+ broken_assembled .to_parquet (
197+ run_context .assembled_path / "assembled_events_2023_01_01.parquet"
198+ )
179199
180200 report = build_semantic_layer (run_context )
181201
182202 assert report ["status" ] == "failed"
183203 assert report ["modules" ]["seller_semantic" ]["build_stage" ]["status" ] == "failed"
184- assert any ("Multiple run_ids detected" in error
185- for error in report ["modules" ]["seller_semantic" ]["build_stage" ]["errors" ])
204+ assert any (
205+ "Multiple run_ids detected" in error
206+ for error in report ["modules" ]["seller_semantic" ]["build_stage" ]["errors" ]
207+ )
186208
187209
188210def test_build_semantic_layer_fails_on_missing_columns (tmp_path , valid_assembled_df ):
@@ -191,9 +213,13 @@ def test_build_semantic_layer_fails_on_missing_columns(tmp_path, valid_assembled
191213 run_context .initialize_directories ()
192214
193215 broken_assembled = valid_assembled_df .copy ()
194- broken_assembled .drop (columns = "order_revenue" , inplace = True ) # Used in seller_weekly_fact
216+ broken_assembled .drop (
217+ columns = "order_revenue" , inplace = True
218+ ) # Used in seller_weekly_fact
195219
196- broken_assembled .to_parquet (run_context .assembled_path / "assembled_events_2023_01_01.parquet" )
220+ broken_assembled .to_parquet (
221+ run_context .assembled_path / "assembled_events_2023_01_01.parquet"
222+ )
197223
198224 report = build_semantic_layer (run_context )
199225
@@ -210,11 +236,15 @@ def test_build_semantic_layer_fails_on_missing_or_empty_df(tmp_path):
210236 run_context .initialize_directories ()
211237
212238 empty_df = pd .DataFrame ()
213- empty_df .to_parquet (run_context .assembled_path / "assembled_events_2023_01_01.parquet" )
239+ empty_df .to_parquet (
240+ run_context .assembled_path / "assembled_events_2023_01_01.parquet"
241+ )
214242
215243 report = build_semantic_layer (run_context )
216244
217245 assert report ["status" ] == "failed"
218246 # load_single_delta itself succeeds even if DF is empty
219- assert any ("missing or empty" in error
220- for error in report ["steps" ]["load_tables" ]["errors" ])
247+ assert any (
248+ "missing or empty" in error
249+ for error in report ["steps" ]["load_tables" ]["errors" ]
250+ )
0 commit comments