Skip to content

Commit 6c1de27

Browse files
committed
step8
1 parent 7e80d42 commit 6c1de27

File tree

13 files changed

+157
-31
lines changed

13 files changed

+157
-31
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,5 @@ The project uses GitHub Actions for automated testing and linting. You can see s
8383
[![asciicast](https://asciinema.org/a/Hc7xhdtxCYwpHkDT0RCYTOhJ9.svg)](https://asciinema.org/a/Hc7xhdtxCYwpHkDT0RCYTOhJ9)
8484

8585
[![asciicast](https://asciinema.org/a/W3OLlaIN5eQ1MMhkHUFwjiR6M.svg)](https://asciinema.org/a/W3OLlaIN5eQ1MMhkHUFwjiR6M)
86+
87+
[![asciicast](https://asciinema.org/a/5k2hEC3CIVQ2BDMBAM487ANPy.svg)](https://asciinema.org/a/5k2hEC3CIVQ2BDMBAM487ANPy)

actual_output.txt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
}
45+
None

build/lib/gendiff/scripts/gendiff.py

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

demo4.cast

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{"version": 2, "width": 192, "height": 29, "timestamp": 1742453624, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
2+
[1.460301, "o", "\u001b]0;nurzhan@localhost:~/Desktop/python-project-50\u0007"]
3+
[1.460846, "o", "[nurzhan@localhost python-project-50]$ "]
4+
[7.627898, "o", "gendiff --format plain gendiff/tests/file1.yaml gendiff/tests/file2.yaml"]
5+
[8.092095, "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\bjson gendiff/tests/file2.json"]
6+
[9.429866, "o", "\r\n"]
7+
[9.719749, "o", "Property 'common.follow' was added with value: false\r\nProperty 'common.setting2' was removed\r\nProperty 'common.setting3' was updated. From true to null\r\nProperty 'common.setting4' was added with value: 'blah blah'\r\nProperty 'common.setting5' was added with value: [complex value]\r\nProperty 'common.setting6.doge.wow' was updated. From '' to 'so much'\r\nProperty 'common.setting6.ops' was added with value: 'vops'\r\nProperty 'group1.baz' was updated. From 'bas' to 'bars'\r\nProperty 'group1.nest' was updated. From [complex value] to 'str'\r\nProperty 'group2' was removed\r\nProperty 'group3' was added with value: [complex value]\r\nNone\r\n"]
8+
[9.727114, "o", "\u001b]0;nurzhan@localhost:~/Desktop/python-project-50\u0007"]
9+
[9.727362, "o", "[nurzhan@localhost python-project-50]$ "]
10+
[10.327866, "o", "gendiff --format plain gendiff/tests/file1.json gendiff/tests/file2.json"]
11+
[10.711627, "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\byaml gendiff/tests/file2.yaml"]
12+
[11.409966, "o", "\r\n"]
13+
[11.564576, "o", "Property 'common.follow' was added with value: false\r\nProperty 'common.setting2' was removed\r\nProperty 'common.setting3' was updated. From true to null\r\nProperty 'common.setting4' was added with value: 'blah blah'\r\nProperty 'common.setting5' was added with value: [complex value]\r\nProperty 'common.setting6.doge.wow' was updated. From '' to 'so much'\r\nProperty 'common.setting6.ops' was added with value: 'vops'\r\nProperty 'group1.baz' was updated. From 'bas' to 'bars'\r\nProperty 'group1.nest' was updated. From [complex value] to 'str'\r\nProperty 'group2' was removed\r\nProperty 'group3' was added with value: [complex value]\r\nNone\r\n"]
14+
[11.585123, "o", "\u001b]0;nurzhan@localhost:~/Desktop/python-project-50\u0007"]
15+
[11.585181, "o", "[nurzhan@localhost python-project-50]$ "]
16+
[15.16202, "o", "exit\r\n"]

gendiff/diff_generator.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
# gendiff/diff_generator.py
12
from gendiff.read import read_file
3+
from gendiff.formaters.stylish import format_stylish
4+
from gendiff.formaters.plain import format_plain
5+
from gendiff.formaters.json import format_json
26

37

48
def build_diff(data1, data2):
@@ -13,16 +17,16 @@ def build_diff(data1, data2):
1317
elif isinstance(data1[key], dict) and isinstance(data2[key], dict):
1418
diff[key] = {
1519
"status": "nested",
16-
"children": build_diff(
17-
data1[key],
18-
data2[key])}
20+
"children": build_diff(data1[key], data2[key])
21+
}
1922
elif data1[key] == data2[key]:
2023
diff[key] = {"status": "unchanged", "value": data1[key]}
2124
else:
2225
diff[key] = {
2326
"status": "modified",
2427
"old_value": data1[key],
25-
"new_value": data2[key]}
28+
"new_value": data2[key]
29+
}
2630

2731
return diff
2832

@@ -33,8 +37,12 @@ def generate_diff(file_path1, file_path2, format_name="stylish"):
3337

3438
diff = build_diff(data1, data2)
3539

40+
# Выбор форматирования
3641
if format_name == "stylish":
37-
from gendiff.formaters.stylish import format_stylish
3842
return format_stylish(diff)
39-
40-
raise ValueError(f"Unsupported format: {format_name}")
43+
elif format_name == "plain":
44+
return format_plain(diff)
45+
elif format_name == "json":
46+
return format_json(diff)
47+
else:
48+
raise ValueError(f"Unsupported format: {format_name}")

gendiff/formaters/json.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# gendiff/formaters/json.py
2+
import json
3+
4+
5+
def format_json(diff):
6+
return json.dumps(diff, indent=4)

gendiff/formaters/plain.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
def format_plain(diff, path=""):
2+
lines = []
3+
4+
for key, value in diff.items():
5+
property_path = f"{path}.{key}" if path else key
6+
status = value["status"]
7+
8+
if status == "added":
9+
formatted_value = format_value(value["value"])
10+
lines.append(f"Property '{property_path}'"
11+
f"was added with value: {formatted_value}")
12+
elif status == "removed":
13+
lines.append(f"Property '{property_path}' was removed")
14+
elif status == "modified":
15+
old_value = format_value(value["old_value"])
16+
new_value = format_value(value["new_value"])
17+
lines.append(f"Property '{property_path}'"
18+
f" was updated. From {old_value} to {new_value}")
19+
elif status == "nested":
20+
lines.append(format_plain(value["children"], property_path))
21+
22+
return "\n".join(lines)
23+
24+
25+
def format_value(value):
26+
"""Форматирует значение для plain-вывода."""
27+
if isinstance(value, dict):
28+
return "[complex value]"
29+
if isinstance(value, bool):
30+
return "true" if value else "false"
31+
if value is None:
32+
return "null"
33+
if isinstance(value, str):
34+
return f"'{value}'"
35+
return str(value)

gendiff/formaters/stylish.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# gendiff/formaters/stylish.py
12
def format_value(value, depth):
23
indent = " " * (depth * 4)
34

gendiff/parser.py

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

@@ -15,5 +14,8 @@ def args_parser():
1514
default="stylish"
1615
)
1716
args = parser.parse_args()
18-
diff = generate_diff(args.first_file, args.second_file)
17+
18+
19+
diff = generate_diff(args.first_file, args.second_file,
20+
format_name=args.format)
1921
print(diff)

gendiff/read.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# gendiff/read.py
12
import json
23
import yaml
34
import os

0 commit comments

Comments
 (0)