Skip to content

Commit 8348ff5

Browse files
committed
step6
1 parent de0fd39 commit 8348ff5

File tree

10 files changed

+151
-25
lines changed

10 files changed

+151
-25
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ coverage.xml
88
hello.py
99
demo.cast
1010
.python-version
11+

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,6 @@ make lint
7878

7979
The project uses GitHub Actions for automated testing and linting. You can see status of the last commit at the top of this README
8080

81-
[![asciicast](https://asciinema.org/a/Pe196IZV1YWZEZojjxIbKHeU8.svg)](https://asciinema.org/a/Pe196IZV1YWZEZojjxIbKHeU8)
81+
[![asciicast](https://asciinema.org/a/Pe196IZV1YWZEZojjxIbKHeU8.svg)](https://asciinema.org/a/Pe196IZV1YWZEZojjxIbKHeU8)
82+
83+
[![asciicast](https://asciinema.org/a/Hc7xhdtxCYwpHkDT0RCYTOhJ9.svg)](https://asciinema.org/a/Hc7xhdtxCYwpHkDT0RCYTOhJ9)

demo1.cast

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
{"version": 2, "width": 192, "height": 25, "timestamp": 1741772235, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
2+
[5.154937, "o", "\u001b]0;nurzhan@localhost:~/Desktop/python-project-50\u0007"]
3+
[5.253998, "o", "[nurzhan@localhost python-project-50]$ "]
4+
[6.974335, "o", "exit"]
5+
[7.351945, "o", "\b\b\b\bgendiff file1.yaml file2.yaml"]
6+
[7.734498, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\u001b[17Pmake install"]
7+
[8.152504, "o", "\b\b\b\b\b\b\b\b\b\b\b\bgendiff file1.yaml file2.yaml"]
8+
[10.968943, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bjson file2.json"]
9+
[12.569944, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\byaml file2.yaml"]
10+
[13.128872, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bjson file2.json"]
11+
[13.561457, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\u001b[12Pcd gendiff/tests/"]
12+
[14.201499, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\u001b[5Pmake install"]
13+
[14.58986, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\u001b[7Pcd .."]
14+
[15.048388, "o", "\b\b\b\b\bmake install"]
15+
[15.274075, "o", "\b\b\b\b\b\b\b\b\b\b\b\bcd gendiff/tests/"]
16+
[15.440589, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bgendiff file1.json file2.json"]
17+
[15.607306, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\byaml file2.yaml"]
18+
[15.791387, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bjson file2.json"]
19+
[15.941811, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\byaml file2.yaml"]
20+
[16.107662, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\u001b[17Pmake install"]
21+
[16.651472, "o", "\b\b\b\b\b\b\b\b\b\b\b\bgendiff file1.yaml file2.yaml"]
22+
[17.334376, "o", "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bexit\u001b[K"]
23+
[18.765604, "o", "\b\b\b\b\u001b[K"]
24+
[19.218266, "o", "\u0007"]
25+
[21.188901, "o", "g"]
26+
[21.325231, "o", "e"]
27+
[21.665806, "o", "n"]
28+
[22.259676, "o", "d"]
29+
[22.460159, "o", "i"]
30+
[23.605346, "o", "f"]
31+
[23.776764, "o", "f"]
32+
[24.526324, "o", " "]
33+
[27.125751, "o", "g"]
34+
[27.244438, "o", "e"]
35+
[27.69534, "o", "n"]
36+
[28.938199, "o", "d"]
37+
[29.215914, "o", "i"]
38+
[29.636739, "o", "ff/"]
39+
[31.220963, "o", "t"]
40+
[31.47333, "o", "ests/"]
41+
[33.159301, "o", "f"]
42+
[33.346874, "o", "i"]
43+
[33.588171, "o", "\u0007"]
44+
[34.32262, "o", "l"]
45+
[34.589704, "o", "e"]
46+
[35.808605, "o", "1"]
47+
[36.217002, "o", "."]
48+
[37.10768, "o", "y"]
49+
[37.481422, "o", "a"]
50+
[37.798883, "o", "m"]
51+
[38.190763, "o", "l"]
52+
[39.043041, "o", " "]
53+
[40.447225, "o", "g"]
54+
[40.728559, "o", "e"]
55+
[41.102637, "o", "n"]
56+
[41.339934, "o", "\u0007"]
57+
[45.146011, "o", "d"]
58+
[45.992691, "o", "i"]
59+
[46.39531, "o", "f"]
60+
[46.534912, "o", "f"]
61+
[47.886703, "o", "/"]
62+
[48.496094, "o", "t"]
63+
[48.602386, "o", "e"]
64+
[49.029299, "o", "s"]
65+
[49.219879, "o", "t"]
66+
[50.097242, "o", "s"]
67+
[51.213026, "o", "/"]
68+
[53.568671, "o", "f"]
69+
[53.81422, "o", "i"]
70+
[54.076531, "o", "l"]
71+
[54.322691, "o", "e"]
72+
[55.133976, "o", "2"]
73+
[55.597233, "o", "."]
74+
[56.328123, "o", "y"]
75+
[56.690659, "o", "a"]
76+
[56.930933, "o", "m"]
77+
[57.429605, "o", "l"]
78+
[58.196241, "o", "\r\n"]
79+
[58.748945, "o", "{\r\n - follow: False\r\n host: hexlet.io\r\n - proxy: 123.124.53.22\r\n - timeout: 50\r\n + timeout: 20\r\n + verbose: True\r\n}\r\n"]
80+
[58.793448, "o", "\u001b]0;nurzhan@localhost:~/Desktop/python-project-50\u0007"]
81+
[58.795027, "o", "[nurzhan@localhost python-project-50]$ "]
82+
[66.567091, "o", "exit\r\n"]

gendiff/diff_generator.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from gendiff.read import read_file
22

33

4+
def format_diff(key, value, status):
5+
symbols = {'added': '+', 'removed': '-', 'unchanged': ' '}
6+
return f" {symbols[status]} {key}: {value}"
7+
8+
49
def generate_diff(file_path1, file_path2):
510
data1 = read_file(file_path1)
611
data2 = read_file(file_path2)
@@ -9,14 +14,14 @@ def generate_diff(file_path1, file_path2):
914
diff = []
1015

1116
for key in keys:
12-
if key not in data1: # Если ключ есть только во втором файле
13-
diff.append(f" + {key}: {data2[key]}")
14-
elif key not in data2: # Если ключ есть только в первом файле
15-
diff.append(f" - {key}: {data1[key]}")
16-
elif data1[key] == data2[key]: # Если значения равны
17-
diff.append(f" {key}: {data1[key]}")
18-
else: # Если значения отличаются
19-
diff.append(f" - {key}: {data1[key]}")
20-
diff.append(f" + {key}: {data2[key]}")
17+
if key not in data1:
18+
diff.append(format_diff(key, data2[key], 'added'))
19+
elif key not in data2:
20+
diff.append(format_diff(key, data1[key], 'removed'))
21+
elif data1[key] == data2[key]:
22+
diff.append(format_diff(key, data1[key], 'unchanged'))
23+
else:
24+
diff.append(format_diff(key, data1[key], 'removed'))
25+
diff.append(format_diff(key, data2[key], 'added'))
2126

2227
return "{\n" + "\n".join(diff) + "\n}"

gendiff/parser.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# gendiff/parser.py
2-
32
import argparse
43
from gendiff.diff_generator import generate_diff
54

@@ -8,11 +7,11 @@ def args_parser():
87
parser = argparse.ArgumentParser(
98
description="Compares two configuration files and shows a difference."
109
)
11-
parser.add_argument("first_file", help="path to the first file")
12-
parser.add_argument("second_file", help="path to the second file")
10+
parser.add_argument("first_file", help="Path to the first file")
11+
parser.add_argument("second_file", help="Path to the second file")
1312
parser.add_argument(
1413
"-f", "--format",
15-
help="set format of output",
14+
help="Set output format (supported: stylish, plain, json)",
1615
default="stylish"
1716
)
1817
args = parser.parse_args()

gendiff/read.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
1-
# gendiff/read.py
2-
31
import json
2+
import yaml
3+
import os
44

55

66
def read_file(file_path):
7-
with open(file_path, 'r') as file:
8-
return json.load(file)
7+
8+
if not os.path.exists(file_path):
9+
raise FileNotFoundError(f"Ошибка: файл не найден: {file_path}")
10+
11+
extension = os.path.splitext(file_path)[1].lower()
12+
13+
parsers = {
14+
'.json': json.load,
15+
'.yaml': yaml.safe_load,
16+
'.yml': yaml.safe_load
17+
}
18+
19+
if extension not in parsers:
20+
raise ValueError(f"Ошибка: неподдерживаемый формат файла {extension}")
21+
22+
try:
23+
with open(file_path, 'r', encoding='utf-8') as file:
24+
return parsers[extension](file) or {}
25+
except json.JSONDecodeError as e:
26+
raise ValueError(f"Ошибка в JSON-файле {file_path}: {e}")
27+
except yaml.YAMLError as e:
28+
raise ValueError(f"Ошибка в YAML-файле {file_path}: {e}")

gendiff/scripts/gendiff.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# gendiff/scripts/gendiff.py
12
from gendiff.parser import args_parser
23

34

gendiff/tests/diff_generator_test.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
1+
import pytest
12
from gendiff.diff_generator import generate_diff
23

34

45
def normalize_indentation(text):
56
return "\n".join(line.strip() for line in text.strip().splitlines())
67

78

8-
def test_generate_diff():
9-
file1 = "gendiff/tests/file1.json"
10-
file2 = "gendiff/tests/file2.json"
11-
12-
expected_result = """{
9+
@pytest.mark.parametrize("file1, file2, expected_result", [
10+
("gendiff/tests/file1.json", "gendiff/tests/file2.json", """{
1311
- follow: False
1412
host: hexlet.io
1513
- proxy: 123.124.53.22
1614
- timeout: 50
1715
+ timeout: 20
1816
+ verbose: True
19-
}"""
20-
17+
}"""),
18+
("gendiff/tests/file1.yaml", "gendiff/tests/file2.yaml", """{
19+
- follow: False
20+
host: hexlet.io
21+
- proxy: 123.124.53.22
22+
- timeout: 50
23+
+ timeout: 20
24+
+ verbose: True
25+
}"""),
26+
])
27+
def test_generate_diff(file1, file2, expected_result):
2128
actual_result = generate_diff(file1, file2)
2229

2330
normalized_expected = normalize_indentation(expected_result)

gendiff/tests/file1.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# file1.yaml
2+
follow: false
3+
host: hexlet.io
4+
proxy: 123.124.53.22
5+
timeout: 50

gendiff/tests/file2.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# file2.yaml
2+
host: hexlet.io
3+
timeout: 20
4+
verbose: true

0 commit comments

Comments
 (0)