49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
|
|
# 두 구성 요소 값 기록(comp_dump 의 출력)을 견준다. python comp_diff.py <왼쪽 파일> <오른쪽 파일> [--only-common]
|
||
|
|
# · 같은 열쇠(오브젝트 | 구성 요소 | 속성)의 값이 다르면 적고, 한쪽에만 있는 구성 요소는 이름만 적는다
|
||
|
|
import sys, io, collections
|
||
|
|
|
||
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
||
|
|
|
||
|
|
|
||
|
|
def load(path):
|
||
|
|
rows = collections.OrderedDict()
|
||
|
|
objects = []
|
||
|
|
for line in io.open(path, encoding='utf-8'):
|
||
|
|
line = line.rstrip('\n')
|
||
|
|
if line.startswith('## '):
|
||
|
|
objects.append(line[3:])
|
||
|
|
continue
|
||
|
|
parts = line.split(' | ', 2)
|
||
|
|
if len(parts) < 3 or ' = ' not in parts[2]:
|
||
|
|
continue
|
||
|
|
prop, value = parts[2].split(' = ', 1)
|
||
|
|
rows[(parts[0], parts[1], prop)] = value
|
||
|
|
return rows, objects
|
||
|
|
|
||
|
|
|
||
|
|
left, left_objects = load(sys.argv[1])
|
||
|
|
right, right_objects = load(sys.argv[2])
|
||
|
|
left_comps = set((k[0], k[1]) for k in left)
|
||
|
|
right_comps = set((k[0], k[1]) for k in right)
|
||
|
|
|
||
|
|
print('== 왼쪽에만 있는 구성 요소')
|
||
|
|
for c in sorted(left_comps - right_comps):
|
||
|
|
print(' ', c[0], '|', c[1])
|
||
|
|
print('== 오른쪽에만 있는 구성 요소')
|
||
|
|
for c in sorted(right_comps - left_comps):
|
||
|
|
print(' ', c[0], '|', c[1])
|
||
|
|
print('== 값이 다른 속성(왼쪽 → 오른쪽)')
|
||
|
|
count = 0
|
||
|
|
for k, v in left.items():
|
||
|
|
if k in right and right[k] != v:
|
||
|
|
print(' ', k[0], '|', k[1], '|', k[2], ':', v, '→', right[k])
|
||
|
|
count += 1
|
||
|
|
print('다른 값', count)
|
||
|
|
print('== 한쪽에만 있는 속성(같은 구성 요소 안)')
|
||
|
|
for k in left:
|
||
|
|
if k not in right and (k[0], k[1]) in right_comps:
|
||
|
|
print(' 왼쪽만', k[0], '|', k[1], '|', k[2], '=', left[k])
|
||
|
|
for k in right:
|
||
|
|
if k not in left and (k[0], k[1]) in left_comps:
|
||
|
|
print(' 오른쪽만', k[0], '|', k[1], '|', k[2], '=', right[k])
|