Skip to content

Commit 7a8a319

Browse files
committed
add: fourth step, add func compare files
1 parent 93870cd commit 7a8a319

File tree

8 files changed

+211
-31
lines changed

8 files changed

+211
-31
lines changed

gendiff/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from gendiff.cli import parse_args
2-
from gendiff.diff import compare_data_from_files, main, read_file_json
1+
from .cli import parse_args
2+
from .gendiff import generate_diff, main, read_file_json
33

44
__all__ = [
55
'parse_args',
6-
'compare_data_from_files',
6+
'generate_diff',
77
'read_file_json',
88
'main',
99
]

gendiff/diff.py

Lines changed: 0 additions & 24 deletions
This file was deleted.

gendiff/gendiff.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import json
2+
3+
from .cli import parse_args
4+
5+
6+
def main() -> None:
7+
args = parse_args()
8+
print(generate_diff(args.first_file, args.second_file))
9+
10+
11+
def read_file_json(path: str):
12+
try:
13+
with open(path, mode='r', encoding='utf-8') as file:
14+
return json.load(file)
15+
except Exception as error:
16+
print("Can't read_file_json\n", error)
17+
return None
18+
19+
20+
def get_list_of_dict_with_sign(data1, data2) -> list:
21+
result = [
22+
{'key': key, 'sign': ' ', 'value': value}
23+
if (key in data2) and (value == data2[key])
24+
else {'key': key, 'sign': '-', 'value': value}
25+
for key, value in data1.items()
26+
]
27+
result.extend([
28+
{'key': key, 'sign': '+', 'value': value}
29+
for key, value in data2.items()
30+
if (key not in data1) or value != data1[key]
31+
])
32+
return result
33+
34+
35+
def sort_list(items: list):
36+
def sort_by_rule(item: dict) -> str:
37+
if item['sign'] == '+':
38+
sign = '-'
39+
elif item['sign'] == '-':
40+
sign = '+'
41+
else:
42+
sign = ' '
43+
return str([item['key'], sign])
44+
items.sort(key=sort_by_rule)
45+
return items
46+
47+
48+
def make_str_from_list(items: list) -> str:
49+
list_of_str = ['{']
50+
for item in items:
51+
sign = item['sign']
52+
53+
if isinstance(item['key'], str):
54+
key = item['key']
55+
else:
56+
key = json.dumps(item['key'])
57+
58+
if isinstance(item['value'], str):
59+
value = item['value']
60+
else:
61+
value = json.dumps(item['value'])
62+
63+
list_of_str.append(f" {sign} {key}: {value}")
64+
list_of_str.append('}')
65+
return '\n'.join(list_of_str)
66+
67+
68+
def generate_diff(path1, path2) -> str:
69+
data1 = read_file_json(path1)
70+
data2 = read_file_json(path2)
71+
result = sort_list(get_list_of_dict_with_sign(data1, data2))
72+
result = make_str_from_list(result)
73+
return result

gendiff/scripts/gendiff.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from gendiff.diff import main
1+
from ..gendiff import main
22

33
if __name__ == '__main__':
44
main()

pyproject.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ dependencies = [
1313

1414
[dependency-groups]
1515
dev = [
16+
"hexlet-code",
1617
"pytest>=8.4.2",
18+
"pytest-cov>=7.0.0",
1719
"ruff>=0.13.0",
1820
]
1921

@@ -27,3 +29,6 @@ build-backend = "hatchling.build"
2729
[tool.hatch.build.targets.wheel]
2830
packages = ["gendiff"]
2931

32+
[tool.uv.sources]
33+
hexlet-code = { workspace = true }
34+

te.py

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/test_gendiff.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from gendiff.gendiff import generate_diff, read_file_json, sort_list
2+
3+
path1 = '/home/zk/python-project-50/file1.json'
4+
data1 = {
5+
"host": "hexlet.io",
6+
"timeout": 50,
7+
"proxy": "123.234.53.22",
8+
"follow": False
9+
}
10+
11+
path2 = '/home/zk/python-project-50/file2.json'
12+
data2 = {
13+
"timeout": 20,
14+
"verbose": True,
15+
"host": "hexlet.io"
16+
}
17+
18+
19+
def test_read_file_json():
20+
assert read_file_json(path1) == data1
21+
22+
assert read_file_json(path2) == data2
23+
24+
25+
def test_sort_list():
26+
lst = [
27+
{'key': 'qwe', 'sign': '+', 'value': 3},
28+
{'key': 'abc', 'sign': ' ', 'value': 3},
29+
{'key': 'qwe', 'sign': '-', 'value': 3},
30+
]
31+
assert sort_list(lst) == [
32+
{'key': 'abc', 'sign': ' ', 'value': 3},
33+
{'key': 'qwe', 'sign': '-', 'value': 3},
34+
{'key': 'qwe', 'sign': '+', 'value': 3},
35+
]
36+
37+
38+
def test_generate_diff():
39+
right_str = ("{\n"
40+
" - follow: false\n"
41+
" host: hexlet.io\n"
42+
" - proxy: 123.234.53.22\n"
43+
" - timeout: 50\n"
44+
" + timeout: 20\n"
45+
" + verbose: true\n"
46+
"}")
47+
assert generate_diff(path1, path2) == right_str

0 commit comments

Comments
 (0)