76def cmp_component_db(ref, chk, verbose=True):
77 """ compare 2 dicts of components
78 dicts are of the form:
79 { 'comp_type' : <name of component>,
80 'cxx_type' : <C++ type of the component>,
81 'props' : { 'property-name' : 'property-value', }
82 }
83 """
84 common_keys = []
85 ref_keys =
set(ref.keys())
86 chk_keys =
set(chk.keys())
87
88 common_keys = ref_keys & chk_keys
89 ref_only_keys = ref_keys - chk_keys
90 chk_only_keys = chk_keys - ref_keys
91
92 print ("::: components in both files: [%5s]" % (len(common_keys),))
93 print ("::: components in ref only: [%5s]" % (len(ref_only_keys),))
94 if len(ref_only_keys)>0:
95 dump_seq(ref_only_keys)
96 print ("="*80)
97 print ("::: components in chk only: [%5s]" % (len(chk_only_keys),))
98 if len(chk_only_keys)>0:
99 dump_seq(chk_only_keys)
100 print ("="*80)
101
102 diff = []
103 for comp_name in common_keys:
104 comp_ref = ref[comp_name]
105 comp_chk = chk[comp_name]
106
107 ref_props = sorted([(k,v) for k,v in comp_ref['props'].iteritems()])
108 chk_props = sorted([(k,v) for k,v in comp_chk['props'].iteritems()])
109 if ref_props != chk_props:
110 diff.append((comp_name, ref_props, chk_props,
111 dict_diff(ref=comp_ref['props'],
112 chk=comp_chk['props'])))
113 pass
114
115 print ("::: components with different properties: [%5s]" % (len(diff),))
116 for name, ref_props, chk_props, diff_props in diff:
117 print ("::: - component: [%s]" % (name,))
118 for prop_name, prop_value in diff_props.iteritems():
119 ref_value = prop_value[0]
120 chk_value = prop_value[1]
121 if isinstance(ref_value, list):
122 ref_value = sorted(ref_value)
123 if isinstance(chk_value, list):
124 chk_value = sorted(chk_value)
125
126 if isinstance(ref_value, list) and isinstance(chk_value, list):
127 dref_value =
set(ref_value) -
set(chk_value)
128 dchk_value =
set(chk_value) -
set(ref_value)
129 ref_value = sorted(list(dref_value))
130 chk_value = sorted(list(dchk_value))
131 print ("-%s: %r" %(prop_name, ref_value,))
132 print ("+%s: %r" %(prop_name, chk_value,))
133
134
135 if (len(ref_only_keys) > 0 or
136 len(chk_only_keys) > 0 or
137 len(diff) > 0):
138 return 1
139 return 0
140