Skip to content

Commit acaf29f

Browse files
committed
7th step
1 parent dbce12c commit acaf29f

File tree

8 files changed

+203
-22
lines changed

8 files changed

+203
-22
lines changed

gendiff/gen_diff.py

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,56 @@ def open_f(path_to_file) -> dict:
88
return json.load(file)
99

1010

11-
def generate_diff(file1, file2):
12-
if str(file1)[-5:] == '.json' and str(file2)[-5:] == '.json':
13-
file1 = open_f(file1)
14-
file2 = open_f(file2)
11+
def stringify(value, lvl=1):
12+
if isinstance(value, dict):
13+
result = '{\n'
14+
for el, val in value.items():
15+
result += f'{' ' * lvl}{el}: '
16+
result += stringify(val, lvl + 1) + '\n'
17+
result += ' ' * (lvl - 1) + '}'
1518
else:
16-
file1 = open_ymlf(file1)
17-
file2 = open_ymlf(file2)
18-
res = '''{
19-
'''
20-
for i in sorted(list(file1)):
21-
if i in sorted(list(file2)):
22-
if file1[i] == file2[i]:
23-
res += f' {i}: {file1[i]}\n'
24-
else:
25-
res += f''' - {i}: {file1[i]}
26-
+ {i}: {file2[i]}\n'''
19+
if value is True:
20+
result = 'true'
21+
elif value is None:
22+
result = 'null'
23+
elif value is False:
24+
result = 'false'
2725
else:
28-
res += f' - {i}: {file1[i]}\n'
29-
for i in sorted(list(file2)):
30-
if i not in sorted(list(file1)):
31-
res += f' + {i}: {file2[i]}\n'
32-
res += '}'
33-
return res
26+
result = str(value)
27+
return result
28+
29+
30+
def generate_diff(file1, file2, lvl=1):
31+
if isinstance(file1, str) and isinstance(file2, str):
32+
if str(file1)[-5:] == '.json' and str(file2)[-5:] == '.json':
33+
file1 = open_f(file1)
34+
file2 = open_f(file2)
35+
else:
36+
file1 = open_ymlf(file1)
37+
file2 = open_ymlf(file2)
38+
result = '{\n'
39+
if isinstance(file1, dict) and isinstance(file2, dict):
40+
keys1 = sorted(list(file1.keys()))
41+
keys2 = sorted(list(file2.keys()))
42+
keys12 = sorted(set(keys1 + keys2))
43+
for i in keys12:
44+
if i in keys1 and i in keys2:
45+
if isinstance(file1[i], dict) and isinstance(file2[i], dict):
46+
result += f'{' ' * lvl}{i}: '
47+
result += generate_diff(file1[i], file2[i], lvl + 1) + '\n'
48+
else:
49+
if file1[i] == file2[i]:
50+
result += f'{' ' * lvl}{i}: {file1[i]}' + '\n'
51+
else:
52+
result += (f'{' ' * (lvl - 1) + ' - '}{i}: '
53+
f'{stringify(file1[i], lvl=lvl + 1)}') + '\n'
54+
result += (f'{' ' * (lvl - 1) + ' + '}{i}: '
55+
f'{stringify(file2[i], lvl=lvl + 1)}') + '\n'
56+
if (i in keys1) and (i not in keys2):
57+
result += (f'{' ' * (lvl - 1) + ' - '}{i}: '
58+
f'{stringify(file1[i], lvl=lvl + 1)}') + '\n'
59+
if (i not in keys1) and (i in keys2):
60+
result += (f'{' ' * (lvl - 1) + ' + '}{i}: '
61+
f'{stringify(file2[i], lvl=lvl + 1)}') + '\n'
62+
result += ' ' * (lvl - 1) + '}'
63+
return result

tests/test_data/file11.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"common": {
3+
"setting1": "Value 1",
4+
"setting2": 200,
5+
"setting3": true,
6+
"setting6": {
7+
"key": "value",
8+
"doge": {
9+
"wow": ""
10+
}
11+
}
12+
},
13+
"group1": {
14+
"baz": "bas",
15+
"foo": "bar",
16+
"nest": {
17+
"key": "value"
18+
}
19+
},
20+
"group2": {
21+
"abc": 12345,
22+
"deep": {
23+
"id": 45
24+
}
25+
}
26+
}

tests/test_data/file11.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
common:
2+
setting1: Value 1
3+
setting2: 200
4+
setting3: true
5+
setting6:
6+
key: value
7+
doge:
8+
wow: ''
9+
group1:
10+
baz: bas
11+
foo: bar
12+
nest:
13+
key: value
14+
group2:
15+
abc: 12345
16+
deep:
17+
id: 45

tests/test_data/file22.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"common": {
3+
"follow": false,
4+
"setting1": "Value 1",
5+
"setting3": null,
6+
"setting4": "blah blah",
7+
"setting5": {
8+
"key5": "value5"
9+
},
10+
"setting6": {
11+
"key": "value",
12+
"ops": "vops",
13+
"doge": {
14+
"wow": "so much"
15+
}
16+
}
17+
},
18+
"group1": {
19+
"foo": "bar",
20+
"baz": "bars",
21+
"nest": "str"
22+
},
23+
"group3": {
24+
"deep": {
25+
"id": {
26+
"number": 45
27+
}
28+
},
29+
"fee": 100500
30+
}
31+
}

tests/test_data/file22.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
common:
2+
follow: false
3+
setting1: Value 1
4+
setting3: null
5+
setting4: blah blah
6+
setting5:
7+
key5: value5
8+
setting6:
9+
key: value
10+
ops: vops
11+
doge:
12+
wow: so much
13+
group1:
14+
foo: bar
15+
baz: bars
16+
nest: str
17+
group3:
18+
deep:
19+
id:
20+
number: 45
21+
fee: 100500
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
common: {
3+
+ follow: False
4+
setting1: Value 1
5+
- setting2: 200
6+
- setting3: True
7+
+ setting3: null
8+
+ setting4: blah blah
9+
+ setting5: {
10+
key5: value5
11+
}
12+
setting6: {
13+
doge: {
14+
- wow:
15+
+ wow: so much
16+
}
17+
key: value
18+
+ ops: vops
19+
}
20+
}
21+
group1: {
22+
- baz: bas
23+
+ baz: bars
24+
foo: bar
25+
- nest: {
26+
key: value
27+
}
28+
+ nest: str
29+
}
30+
- group2: {
31+
abc: 12345
32+
deep: {
33+
id: 45
34+
}
35+
}
36+
+ group3: {
37+
deep: {
38+
id: {
39+
number: 45
40+
}
41+
}
42+
fee: 100500
43+
}
44+
}

tests/test_generate_diff.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ def test_generate_diff():
1818
yam_act = generate_diff(get_test_data_path('file1.yml'),
1919
get_test_data_path('file2.yml'))
2020
assert actual == result
21-
assert yam_act == result
21+
assert yam_act == result

tests/test_generate_diff_recurs.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from gendiff.gen_diff import generate_diff
2+
from tests.test_generate_diff import get_test_data_path, read_file
3+
4+
5+
def test_generate_diff():
6+
result = read_file('result_file11_file22.txt')
7+
actual = generate_diff(get_test_data_path('file11.json'),
8+
get_test_data_path('file22.json'))
9+
yam_act = generate_diff(get_test_data_path('file11.yml'),
10+
get_test_data_path('file22.yml'))
11+
assert actual == result
12+
assert yam_act == result

0 commit comments

Comments
 (0)