33from pathlib import Path
44from shutil import copytree , rmtree
55
6- import pandas as pd
76import pytest
87from click .testing import CliRunner
98
@@ -100,17 +99,16 @@ def errors_check(cat, atr, orig, final):
10099 print (f"Attribute { atr } is missing in the original { cat } " )
101100 elif orig != final :
102101 print (f"Attribute { atr } is different in the final { cat } " )
103- # print(f"Original: {orig}")
104- # print(f"Final: {final}")
102+ print (f"Original: { orig } " )
103+ print (f"Final: { final } " )
105104 error_shortmsg = f"{ cat } : { atr } is different"
106105 return error_shortmsg
107106
108107
109108def print_return_msg (error_msg ):
110- # print(error_msg)
109+ print (error_msg )
111110 return error_msg
112111
113-
114112def compare_protocols (prot_tree_orig , prot_tree_final ):
115113 # compare the two dictionaries
116114 errors_list = []
@@ -221,57 +219,49 @@ def compare_protocols(prot_tree_orig, prot_tree_final):
221219 )
222220 )
223221 else :
224- print (
225- f"Activity { act_name } : addProperties have different elements"
226- )
227222 errors_list .append (
228- f"Activity { act_name } : addProperties have different elements"
223+ print_return_msg (
224+ f"Activity { act_name } : addProperties have different elements, orig: { act_props_orig } and final: { act_props_final } "
225+ )
229226 )
230227 else :
231228 for nm , el in act_props_final .items ():
232229 for key in ["isVis" , "valueRequired" ]:
233230 error = False
234- orig_value = getattr (act_props_orig [nm ], key )
235- final_value = getattr (el , key )
236-
237- if key == "valueRequired" :
238- # Debug print
239- print (f"\n Debug - Activity: { act_name } , Item: { nm } " )
240- print (
241- f"Original valueRequired: { orig_value } , type: { type (orig_value )} "
242- )
243- print (
244- f"Final valueRequired: { final_value } , type: { type (final_value )} "
245- )
246-
247- # Compare only True values
248- if orig_value is True :
249- if final_value is not True :
231+ orig_val = getattr (act_props_orig [nm ], key )
232+ final_val = getattr (el , key )
233+
234+ if key == "isVis" :
235+ orig_norm = normalize_condition (orig_val ) if orig_val is not None else None
236+ final_norm = normalize_condition (final_val ) if final_val is not None else None
237+
238+ # Case 1: original is True - final can be None or True
239+ if orig_norm is True :
240+ if not (final_norm is None or final_norm is True ):
250241 error = True
251- print (
252- f"Error case 1: orig=True, final={ final_value } "
253- )
254- elif final_value is True :
255- if orig_value is not True :
242+ # Case 2: original is False - final must be False
243+ elif orig_norm is False :
244+ if final_norm is not False :
256245 error = True
257- print (
258- f"Error case 2: orig={ orig_value } , final=True"
259- )
260-
261- elif key == "isVis" :
262- if orig_value is True :
263- # If original is True and final is None/missing, don't count as error
264- pass
265- elif orig_value is not None :
266- if normalize_condition (orig_value ) != normalize_condition (final_value ):
246+ # Case 3: original is something else - must match exactly
247+ elif orig_norm is not None :
248+ if orig_norm != final_norm :
267249 error = True
268- elif final_value is not None and final_value is not True :
250+ else : # handle valueRequired
251+ if (orig_val is not None ) and (
252+ normalize_condition (final_val )
253+ != normalize_condition (orig_val )
254+ ):
269255 error = True
270-
256+ elif final_val and orig_val is None :
257+ if normalize_condition (final_val ) != False :
258+ error = True
259+
271260 if error :
272261 errors_list .append (
273- print (
274- f"Activity { act_name } : addProperties { nm } have different { key } "
262+ print_return_msg (
263+ f"Activity { act_name } : addProperties { nm } have different { key } , "
264+ f"orig: { orig_val } , final: { normalize_condition (final_val )} "
275265 )
276266 )
277267 # check compute
@@ -285,9 +275,10 @@ def compare_protocols(prot_tree_orig, prot_tree_final):
285275 )
286276 )
287277 else :
288- print (f"Activity { act_name } : compute have different elements" )
289278 errors_list .append (
290- f"Activity { act_name } : compute have different elements"
279+ print_return_msg (
280+ f"Activity { act_name } : compute have different elements, orig: { act_comp_orig } , final: { act_comp_final } "
281+ )
291282 )
292283 else :
293284 for nm , el in act_comp_final .items ():
@@ -297,7 +288,7 @@ def compare_protocols(prot_tree_orig, prot_tree_final):
297288 getattr (act_comp_orig [nm ], "jsExpression" )
298289 ):
299290 errors_list .append (
300- print (
291+ print_return_msg (
301292 f"Activity { act_name } : compute { nm } have different jsExpression"
302293 )
303294 )
@@ -313,7 +304,7 @@ def compare_protocols(prot_tree_orig, prot_tree_final):
313304 else :
314305 errors_list .append (
315306 print_return_msg (
316- f"Activity { act_name } : items have different elements"
307+ f"Activity { act_name } : items have different elements, orig: { act_items_orig } , final: { act_items_final } "
317308 )
318309 )
319310 else :
@@ -334,45 +325,20 @@ def compare_protocols(prot_tree_orig, prot_tree_final):
334325 ) != normalize_condition (
335326 act_items_orig [nm ]["obj" ].question .get ("en" , "" )
336327 ):
337- # Handle cases where one might be NaN/None and the other empty string
338- orig_q = act_items_orig [nm ]["obj" ].question .get ("en" , "" )
339- final_q = el ["obj" ].question .get ("en" , "" )
340-
341- print (
342- f"\n Debug - Comparing questions for { act_name } /{ nm } :"
343- )
344- print (f"Original question: { repr (orig_q )} " )
345- print (f"Final question: { repr (final_q )} " )
346- print (
347- f"Original normalized: { repr (normalize_condition (orig_q ))} "
348- )
349- print (
350- f"Final normalized: { repr (normalize_condition (final_q ))} "
351- )
352-
353- # Convert None/NaN to empty string for comparison
354- orig_q = (
355- "" if pd .isna (orig_q ) or orig_q is None else orig_q
356- )
357- final_q = (
358- "" if pd .isna (final_q ) or final_q is None else final_q
359- )
360-
361- if normalize_condition (orig_q ) != normalize_condition (
362- final_q
328+ if "<br><br>" in normalize_condition (
329+ act_items_orig [nm ]["obj" ].question .get ("en" , "" )
363330 ):
364- if "<br><br>" in normalize_condition (orig_q ):
365- warnings_list .append (
366- print_return_msg (
367- f"Activity { act_name } : items { nm } have different question, FIX normalized function!!!"
368- )
331+ warnings_list .append (
332+ print_return_msg (
333+ f"Activity { act_name } : items { nm } have different question, FIX normalized function!!!"
369334 )
370- else :
371- errors_list . append (
372- print_return_msg (
373- f"Activity { act_name } : items { nm } have different question"
374- )
335+ )
336+ else :
337+ errors_list . append (
338+ print_return_msg (
339+ f"Activity { act_name } : items { nm } have different question"
375340 )
341+ )
376342 elif (
377343 el ["obj" ].ui .inputType
378344 != act_items_orig [nm ]["obj" ].ui .inputType
@@ -420,7 +386,7 @@ def test_rs2redcap_redcap2rs(tmpdir):
420386 "output_nimh.csv" ,
421387 ],
422388 )
423- # # print("\n results of reproschema2redcap", result1.output)
389+ print ("\n results of reproschema2redcap" , result1 .output )
424390
425391 result2 = runner .invoke (
426392 main ,
@@ -433,7 +399,7 @@ def test_rs2redcap_redcap2rs(tmpdir):
433399 ],
434400 )
435401
436- # print("\n results of redcap2reproschema", result2.output)
402+ print ("\n results of redcap2reproschema" , result2 .output )
437403
438404 protocol_schema_orig = (
439405 "nimh_minimal_orig/nimh_minimal/nimh_minimal/nimh_minimal_schema"
@@ -462,10 +428,5 @@ def test_rs2redcap_redcap2rs(tmpdir):
462428 prot_tree_orig , prot_tree_final
463429 )
464430
465- # More informative assertion
466- real_errors = [err for err in errors_list if err is not None ]
467- if real_errors :
468- print ("\n Detailed errors:" )
469- for err in real_errors :
470- print (f"- { err } " )
471- assert not real_errors , f"Found { len (real_errors )} errors"
431+ assert not errors_list , f"Errors: { errors_list } "
432+ print ("No errors, but found warnings: " , warnings_list )
0 commit comments