langroid 0.16.7__py3-none-any.whl → 0.17.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. langroid/agent/base.py +45 -21
  2. langroid/agent/chat_agent.py +22 -14
  3. langroid/agent/chat_document.py +22 -13
  4. langroid/agent/tool_message.py +11 -11
  5. langroid/agent/tools/file_tools.py +234 -0
  6. langroid/agent/xml_tool_message.py +178 -45
  7. langroid/utils/constants.py +2 -0
  8. langroid/utils/git_utils.py +251 -0
  9. langroid/utils/system.py +78 -0
  10. {langroid-0.16.7.dist-info → langroid-0.17.0.dist-info}/METADATA +6 -3
  11. {langroid-0.16.7.dist-info → langroid-0.17.0.dist-info}/RECORD +14 -89
  12. pyproject.toml +3 -2
  13. langroid/agent/md_tool_message_grammar.py +0 -455
  14. langroid/agent/tools/code_file_tool_parse.py +0 -150
  15. langroid/agent/tools/code_file_tool_pyparsing.py +0 -194
  16. langroid/agent/tools/code_file_tool_pyparsing2.py +0 -199
  17. langroid/agent/tools/extract_tool.py +0 -96
  18. langroid/agent/tools/formatted_model_custom.py +0 -150
  19. langroid/agent/tools/formatted_model_custom2.py +0 -168
  20. langroid/agent/tools/formatted_model_custom3.py +0 -279
  21. langroid/agent/tools/formatted_model_custom4.py +0 -395
  22. langroid/agent/tools/formatted_model_jinja.py +0 -133
  23. langroid/agent/tools/formatted_model_jinja.py-e +0 -122
  24. langroid/agent/tools/formatted_model_jinja2.py +0 -145
  25. langroid/agent/tools/formatted_model_jinja2.py-e +0 -135
  26. langroid/agent/tools/formatted_model_lark.py +0 -0
  27. langroid/agent/tools/formatted_model_lark2.py +0 -168
  28. langroid/agent/tools/formatted_model_parse.py +0 -105
  29. langroid/agent/tools/formatted_model_parse.py-e +0 -98
  30. langroid/agent/tools/formatted_model_parse2.py +0 -113
  31. langroid/agent/tools/formatted_model_parse2.py-e +0 -109
  32. langroid/agent/tools/formatted_model_parse3.py +0 -114
  33. langroid/agent/tools/formatted_model_parse3.py-e +0 -110
  34. langroid/agent/tools/formatted_model_parsimon.py +0 -194
  35. langroid/agent/tools/formatted_model_parsimon.py-e +0 -186
  36. langroid/agent/tools/formatted_model_pyparsing.py +0 -169
  37. langroid/agent/tools/formatted_model_pyparsing.py-e +0 -149
  38. langroid/agent/tools/formatted_model_pyparsing2.py +0 -159
  39. langroid/agent/tools/formatted_model_pyparsing2.py-e +0 -143
  40. langroid/agent/tools/formatted_model_pyparsing3.py +0 -133
  41. langroid/agent/tools/formatted_model_pyparsing3.py-e +0 -121
  42. langroid/agent/tools/formatted_model_pyparsing4.py +0 -213
  43. langroid/agent/tools/formatted_model_pyparsing4.py-e +0 -176
  44. langroid/agent/tools/formatted_model_pyparsing5.py +0 -173
  45. langroid/agent/tools/formatted_model_pyparsing5.py-e +0 -142
  46. langroid/agent/tools/formatted_model_regex.py +0 -246
  47. langroid/agent/tools/formatted_model_regex.py-e +0 -248
  48. langroid/agent/tools/formatted_model_regex2.py +0 -250
  49. langroid/agent/tools/formatted_model_regex2.py-e +0 -253
  50. langroid/agent/tools/formatted_model_tatsu.py +0 -172
  51. langroid/agent/tools/formatted_model_tatsu.py-e +0 -160
  52. langroid/agent/tools/formatted_model_template.py +0 -217
  53. langroid/agent/tools/formatted_model_template.py-e +0 -200
  54. langroid/agent/tools/formatted_model_xml.py +0 -178
  55. langroid/agent/tools/formatted_model_xml2.py +0 -178
  56. langroid/agent/tools/formatted_model_xml3.py +0 -132
  57. langroid/agent/tools/formatted_model_xml4.py +0 -130
  58. langroid/agent/tools/formatted_model_xml5.py +0 -130
  59. langroid/agent/tools/formatted_model_xml6.py +0 -113
  60. langroid/agent/tools/formatted_model_xml7.py +0 -117
  61. langroid/agent/tools/formatted_model_xml8.py +0 -164
  62. langroid/agent/tools/generator_tool.py +0 -20
  63. langroid/agent/tools/generic_tool.py +0 -165
  64. langroid/agent/tools/generic_tool_tatsu.py +0 -275
  65. langroid/agent/tools/grammar_based_model.py +0 -132
  66. langroid/agent/tools/grammar_based_model.py-e +0 -128
  67. langroid/agent/tools/grammar_based_model_lark.py +0 -156
  68. langroid/agent/tools/grammar_based_model_lark.py-e +0 -153
  69. langroid/agent/tools/grammar_based_model_parse.py +0 -86
  70. langroid/agent/tools/grammar_based_model_parse.py-e +0 -80
  71. langroid/agent/tools/grammar_based_model_parsimonious.py +0 -129
  72. langroid/agent/tools/grammar_based_model_parsimonious.py-e +0 -120
  73. langroid/agent/tools/grammar_based_model_pyparsing.py +0 -105
  74. langroid/agent/tools/grammar_based_model_pyparsing.py-e +0 -103
  75. langroid/agent/tools/grammar_based_model_regex.py +0 -139
  76. langroid/agent/tools/grammar_based_model_regex.py-e +0 -130
  77. langroid/agent/tools/grammar_based_model_regex2.py +0 -124
  78. langroid/agent/tools/grammar_based_model_regex2.py-e +0 -116
  79. langroid/agent/tools/grammar_based_model_tatsu.py +0 -80
  80. langroid/agent/tools/grammar_based_model_tatsu.py-e +0 -77
  81. langroid/agent/tools/lark_earley_example.py +0 -135
  82. langroid/agent/tools/lark_earley_example.py-e +0 -117
  83. langroid/agent/tools/lark_example.py +0 -72
  84. langroid/agent/tools/note_tool.py +0 -0
  85. langroid/agent/tools/parse_example.py +0 -76
  86. langroid/agent/tools/parse_example2.py +0 -87
  87. langroid/agent/tools/parse_example3.py +0 -42
  88. langroid/agent/tools/parse_test.py +0 -791
  89. langroid/agent/tools/run_python_code.py +0 -60
  90. {langroid-0.16.7.dist-info → langroid-0.17.0.dist-info}/LICENSE +0 -0
  91. {langroid-0.16.7.dist-info → langroid-0.17.0.dist-info}/WHEEL +0 -0
@@ -1,143 +0,0 @@
1
- from pydantic import BaseModel
2
- from abc import ABC, abstractmethod
3
- from typing import Dict, Type, TypeVar, List
4
- from pyparsing import (
5
- Word, alphanums, Suppress, SkipTo, LineEnd,
6
- QuotedString, delimitedList, Group, OneOrMore, ParseException,
7
- ParserElement, Regex, Literal, Optional, White, Dict
8
- )
9
-
10
- T = TypeVar('T', bound='FormattingModel')
11
-
12
- class FormatElement:
13
- def __init__(self, key: str, prefix: str = "", suffix: str = ""):
14
- self.key = key
15
- self.prefix = prefix
16
- self.suffix = suffix
17
-
18
- def to_parser(self) -> ParserElement:
19
- return Group(Suppress(self.prefix) + SkipTo(Suppress(self.suffix + LineEnd())).set_results_name(self.key))
20
-
21
- def to_template(self) -> str:
22
- return f"{self.prefix}{{{self.key}}}{self.suffix}\n"
23
-
24
- class FormattingModel(BaseModel, ABC):
25
- @classmethod
26
- @abstractmethod
27
- def format_elements(cls) -> List[FormatElement]:
28
- pass
29
-
30
- @classmethod
31
- @abstractmethod
32
- def start_token(cls) -> str:
33
- pass
34
-
35
- @classmethod
36
- @abstractmethod
37
- def end_token(cls) -> str:
38
- pass
39
-
40
- @classmethod
41
- def format_spec(cls) -> ParserElement:
42
- return Dict(OneOrMore([elem.to_parser() for elem in cls.format_elements()]))
43
-
44
- @classmethod
45
- def parse(cls: Type[T], text: str) -> T:
46
- content = text.strip()[len(cls.start_token()):-len(cls.end_token())].strip()
47
- try:
48
- parsed = cls.format_spec().parseString(content, parseAll=True)
49
- data = {elem.key.lower(): parsed[elem.key][0] for elem in cls.format_elements()}
50
- return cls(**data)
51
- except ParseException as e:
52
- print(f"Parsing error: {e}")
53
- raise
54
-
55
- def generate(self) -> str:
56
- template = "".join(elem.to_template() for elem in self.format_elements())
57
- for elem in self.format_elements():
58
- value = getattr(self, elem.key.lower())
59
- template = template.replace(f"{{{elem.key}}}", str(value))
60
- return f"{self.start_token()}\n{template.strip()}\n{self.end_token()}"
61
-
62
- class MyFormattedModel(FormattingModel):
63
- name: str
64
- age: int
65
- city: str
66
-
67
- @classmethod
68
- def format_elements(cls) -> List[FormatElement]:
69
- return [
70
- FormatElement("NAME", prefix="name: ", suffix=""),
71
- FormatElement("AGE", prefix="", suffix=" is the age"),
72
- FormatElement("CITY", prefix="lives in ", suffix="")
73
- ]
74
-
75
- @classmethod
76
- def start_token(cls) -> str:
77
- return "<format>"
78
-
79
- @classmethod
80
- def end_token(cls) -> str:
81
- return "</format>"
82
-
83
- class CodeFileModel(FormattingModel):
84
- language: str
85
- file_path: str
86
- code: str
87
-
88
- @classmethod
89
- def format_elements(cls) -> List[FormatElement]:
90
- return [
91
- FormatElement("MODEL", prefix="code_file_model", suffix=""),
92
- FormatElement("FILE_PATH", prefix="file_path: ", suffix=""),
93
- FormatElement("LANGUAGE", prefix="```", suffix=""),
94
- FormatElement("CODE", prefix="", suffix="```")
95
- ]
96
-
97
- @classmethod
98
- def start_token(cls) -> str:
99
- return "<format>"
100
-
101
- @classmethod
102
- def end_token(cls) -> str:
103
- return "</format>"
104
-
105
- if __name__ == "__main__":
106
- # Test MyFormattedModel
107
- model = MyFormattedModel(name="John", age=30, city="Tokyo")
108
- generated = model.generate()
109
- print("Generated MyFormattedModel string:")
110
- print(generated)
111
- print()
112
-
113
- parsed = MyFormattedModel.parse(generated)
114
- print("Parsed MyFormattedModel object:")
115
- print(parsed)
116
- print()
117
-
118
- print("MyFormattedModel Round-trip test:")
119
- assert model == parsed, "MyFormattedModel: Original != Parsed"
120
- print("Passed!")
121
- print()
122
-
123
- # Test CodeFileModel
124
- code_model = CodeFileModel(
125
- language="python",
126
- file_path="src/main.py",
127
- code="def hello():\n print(\"Hello, World!\")"
128
- )
129
- code_generated = code_model.generate()
130
- print("Generated CodeFileModel string:")
131
- print(code_generated)
132
- print()
133
-
134
- code_parsed = CodeFileModel.parse(code_generated)
135
- print("Parsed CodeFileModel object:")
136
- print(code_parsed)
137
- print()
138
-
139
- print("CodeFileModel Round-trip test:")
140
- assert code_model == code_parsed, "CodeFileModel: Original != Parsed"
141
- print("Passed!")
142
-
143
- print("\nAll tests passed successfully!")
@@ -1,133 +0,0 @@
1
- from abc import ABC, abstractmethod
2
-
3
- from pyparsing import (
4
- LineEnd,
5
- SkipTo,
6
- Suppress,
7
- Word,
8
- alphas,
9
- )
10
-
11
- from langroid.pydantic_v1 import BaseModel
12
-
13
-
14
- class FormattingModel(BaseModel, ABC):
15
- @classmethod
16
- @abstractmethod
17
- def format_spec(cls):
18
- pass
19
-
20
- @classmethod
21
- @abstractmethod
22
- def parse_spec(cls):
23
- pass
24
-
25
- @classmethod
26
- @abstractmethod
27
- def start_token(cls) -> str:
28
- pass
29
-
30
- @classmethod
31
- @abstractmethod
32
- def end_token(cls) -> str:
33
- pass
34
-
35
- @classmethod
36
- def format(cls, instance: "FormattingModel") -> str:
37
- spec = cls.format_spec()
38
- formatted = spec.format(**instance.dict())
39
- return f"{cls.start_token()}\n{formatted}\n{cls.end_token()}"
40
-
41
- @classmethod
42
- def parse(cls, formatted_string: str) -> "FormattingModel":
43
- lines = formatted_string.strip().split("\n")
44
- if lines[0] != cls.start_token() or lines[-1] != cls.end_token():
45
- raise ValueError("Invalid start or end token")
46
- content = "\n".join(lines[1:-1])
47
-
48
- spec = cls.parse_spec()
49
- parsed = spec.parseString(content, parseAll=True)
50
- return cls(**parsed.asDict())
51
-
52
-
53
- class CodeFileModel(FormattingModel):
54
- language: str
55
- file_path: str
56
- code: str
57
-
58
- @classmethod
59
- def format_spec(cls):
60
- return "code_file_model\n{file_path}\n```{language}\n{code}\n```"
61
-
62
- @classmethod
63
- def parse_spec(cls):
64
- header = Suppress("code_file_model") + LineEnd()
65
- file_path = SkipTo(LineEnd()).setResultsName("file_path")
66
- language = Suppress("```") + Word(alphas).setResultsName("language") + LineEnd()
67
- code = (
68
- SkipTo("```")
69
- .setResultsName("code")
70
- .setParseAction(lambda s, l, t: t[0].rstrip())
71
- )
72
-
73
- return header + file_path + language + code + Suppress("```")
74
-
75
- @classmethod
76
- def start_token(cls):
77
- return "<format>"
78
-
79
- @classmethod
80
- def end_token(cls):
81
- return "</format>"
82
-
83
-
84
- # Test cases
85
- if __name__ == "__main__":
86
- # Test formatting
87
- code_file = CodeFileModel(
88
- language="Python",
89
- file_path="src/main.py",
90
- code="def hello():\n print('Hello, World!')",
91
- )
92
- formatted = CodeFileModel.format(code_file)
93
- expected_format = """<format>
94
- code_file_model
95
- src/main.py
96
- ```Python
97
- def hello():
98
- print('Hello, World!')
99
- ```
100
- </format>"""
101
- assert (
102
- formatted == expected_format
103
- ), f"Formatting failed. Expected:\n{expected_format}\nGot:\n{formatted}"
104
- print("Formatting test passed.")
105
-
106
- # Test parsing
107
- parsed = CodeFileModel.parse(formatted)
108
- assert (
109
- parsed == code_file
110
- ), f"Parsing failed. Expected:\n{code_file}\nGot:\n{parsed}"
111
- print("Parsing test passed.")
112
-
113
- # Test round-trip
114
- round_trip = CodeFileModel.parse(CodeFileModel.format(code_file))
115
- assert (
116
- round_trip == code_file
117
- ), f"Round-trip failed. Expected:\n{code_file}\nGot:\n{round_trip}"
118
- print("Round-trip test passed.")
119
-
120
- # Test with different values
121
- code_file2 = CodeFileModel(
122
- language="JavaScript",
123
- file_path="src/app.js",
124
- code="function greet() {\n console.log('Hello, World!');\n}",
125
- )
126
- formatted2 = CodeFileModel.format(code_file2)
127
- parsed2 = CodeFileModel.parse(formatted2)
128
- assert (
129
- parsed2 == code_file2
130
- ), f"Parsing failed for different values. Expected:\n{code_file2}\nGot:\n{parsed2}"
131
- print("Different values test passed.")
132
-
133
- print("All tests passed successfully!")
@@ -1,121 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from pydantic import BaseModel
3
- from pyparsing import (
4
- Word, alphas, alphanums, Suppress, OneOrMore,
5
- LineEnd, SkipTo, ParseResults, Optional, Literal, White
6
- )
7
-
8
- class FormattingModel(BaseModel, ABC):
9
- @classmethod
10
- @abstractmethod
11
- def format_spec(cls):
12
- pass
13
-
14
- @classmethod
15
- @abstractmethod
16
- def parse_spec(cls):
17
- pass
18
-
19
- @classmethod
20
- @abstractmethod
21
- def start_token(cls) -> str:
22
- pass
23
-
24
- @classmethod
25
- @abstractmethod
26
- def end_token(cls) -> str:
27
- pass
28
-
29
- @classmethod
30
- def format(cls, instance: 'FormattingModel') -> str:
31
- spec = cls.format_spec()
32
- formatted = spec.format(**instance.dict())
33
- return f"{cls.start_token()}\n{formatted}\n{cls.end_token()}"
34
-
35
- @classmethod
36
- def parse(cls, formatted_string: str) -> 'FormattingModel':
37
- lines = formatted_string.strip().split('\n')
38
- if lines[0] != cls.start_token() or lines[-1] != cls.end_token():
39
- raise ValueError("Invalid start or end token")
40
- content = '\n'.join(lines[1:-1])
41
-
42
- spec = cls.parse_spec()
43
- parsed = spec.parseString(content, parseAll=True)
44
- return cls(**parsed.asDict())
45
-
46
- class CodeFileModel(FormattingModel):
47
- language: str
48
- file_path: str
49
- code: str
50
-
51
- @classmethod
52
- def format_spec(cls):
53
- return "code_file_model\n{file_path}\n```{language}\n{code}\n```"
54
-
55
- @classmethod
56
- def parse_spec(cls):
57
- header = Suppress("code_file_model") + LineEnd()
58
- file_path = SkipTo(LineEnd()).setResultsName("file_path")
59
- language = Suppress("```") + Word(alphas).setResultsName("language") + LineEnd()
60
- code = SkipTo("```").setResultsName("code").setParseAction(lambda s, l, t: t[0].rstrip())
61
-
62
- return (
63
- header +
64
- file_path +
65
- language +
66
- code +
67
- Suppress("```")
68
- )
69
-
70
- @classmethod
71
- def start_token(cls):
72
- return '<format>'
73
-
74
- @classmethod
75
- def end_token(cls):
76
- return '</format>'
77
-
78
- # Test cases
79
- if __name__ == "__main__":
80
- # Test formatting
81
- code_file = CodeFileModel(
82
- language="Python",
83
- file_path="src/main.py",
84
- code="def hello():\n print('Hello, World!')"
85
- )
86
- formatted = CodeFileModel.format(code_file)
87
- expected_format = """<format>
88
- code_file_model
89
- src/main.py
90
- ```Python
91
- def hello():
92
- print('Hello, World!')
93
- ```
94
- </format>"""
95
- assert formatted == expected_format, f"Formatting failed. Expected:\n{expected_format}\nGot:\n{formatted}"
96
- print("Formatting test passed.")
97
-
98
- # Test parsing
99
- parsed = CodeFileModel.parse(formatted)
100
- assert parsed == code_file, f"Parsing failed. Expected:\n{code_file}\nGot:\n{parsed}"
101
- print("Parsing test passed.")
102
-
103
- # Test round-trip
104
- round_trip = CodeFileModel.parse(CodeFileModel.format(code_file))
105
- assert round_trip == code_file, f"Round-trip failed. Expected:\n{code_file}\nGot:\n{round_trip}"
106
- print("Round-trip test passed.")
107
-
108
- # Test with different values
109
- code_file2 = CodeFileModel(
110
- language="JavaScript",
111
- file_path="src/app.js",
112
- code="function greet() {\n console.log('Hello, World!');\n}"
113
- )
114
- formatted2 = CodeFileModel.format(code_file2)
115
- parsed2 = CodeFileModel.parse(formatted2)
116
- assert parsed2 == code_file2, f"Parsing failed for different values. Expected:\n{code_file2}\nGot:\n{parsed2}"
117
- print("Different values test passed.")
118
-
119
- print("All tests passed successfully!")
120
-
121
-
@@ -1,213 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from typing import List, Tuple
3
-
4
- from pyparsing import (
5
- LineEnd,
6
- Literal,
7
- Optional,
8
- SkipTo,
9
- Suppress,
10
- White,
11
- )
12
-
13
- from langroid.pydantic_v1 import BaseModel
14
-
15
-
16
- class FormattingModel(BaseModel, ABC):
17
- @classmethod
18
- @abstractmethod
19
- def spec(cls) -> List[Tuple[str, str, dict]]:
20
- pass
21
-
22
- @classmethod
23
- def format_spec(cls):
24
- format_str = ""
25
- for literal, field, options in cls.spec():
26
- if field:
27
- if options.get("multiline", False):
28
- format_str += f"{{{field}}}\n"
29
- else:
30
- format_str += f"{{{field}}}"
31
- else:
32
- format_str += literal
33
- return format_str
34
-
35
- @classmethod
36
- def parse_spec(cls):
37
- parser = None
38
- for literal, field, options in cls.spec():
39
- if literal:
40
- element = Suppress(Optional(White())) + Literal(literal)
41
- else:
42
- if options.get("multiline", False):
43
- end_marker = Suppress(Optional(White())) + Literal(
44
- options.get("end_marker", "```")
45
- )
46
- element = SkipTo(end_marker).setParseAction(
47
- lambda s, l, t: t[0].strip()
48
- )
49
- else:
50
- element = SkipTo(LineEnd()).setParseAction(
51
- lambda s, l, t: t[0].strip()
52
- )
53
- if field:
54
- element = element.setResultsName(field)
55
- if "parse_action" in options:
56
- element = element.setParseAction(options["parse_action"])
57
- parser = element if parser is None else parser + element
58
- return parser
59
-
60
- @classmethod
61
- def start_token(cls) -> str:
62
- return "<format>"
63
-
64
- @classmethod
65
- def end_token(cls) -> str:
66
- return "</format>"
67
-
68
- @classmethod
69
- def format(cls, instance: "FormattingModel") -> str:
70
- spec = cls.format_spec()
71
- formatted = spec.format(**instance.dict())
72
- return f"{cls.start_token()}\n{formatted.rstrip()}\n{cls.end_token()}"
73
-
74
- @classmethod
75
- def parse(cls, formatted_string: str) -> "FormattingModel":
76
- lines = formatted_string.strip().split("\n")
77
- if lines[0] != cls.start_token() or lines[-1] != cls.end_token():
78
- raise ValueError("Invalid start or end token")
79
- content = "\n".join(lines[1:-1])
80
-
81
- spec = cls.parse_spec()
82
- parsed = spec.parseString(content, parseAll=True)
83
- return cls(**parsed.asDict())
84
-
85
-
86
- class CodeFileModel(FormattingModel):
87
- language: str
88
- file_path: str
89
- code: str
90
-
91
- @classmethod
92
- def spec(cls):
93
- return [
94
- ("code_file_model\n", "", {}),
95
- ("", "file_path", {"single_line": True}),
96
- ("\n```", "", {}),
97
- ("", "language", {"single_line": True}),
98
- ("\n", "", {}),
99
- (
100
- "",
101
- "code",
102
- {
103
- "multiline": True,
104
- "end_marker": "```",
105
- "parse_action": lambda s, l, t: t[0].rstrip(),
106
- },
107
- ),
108
- ("\n```", "", {}),
109
- ]
110
-
111
-
112
- if __name__ == "__main__":
113
- # Test formatting
114
- code_file = CodeFileModel(
115
- language="Python",
116
- file_path="src/main.py",
117
- code="def hello():\n print('Hello, World!')",
118
- )
119
- formatted = CodeFileModel.format(code_file)
120
- expected_format = """<format>
121
- code_file_model
122
- src/main.py
123
- ```Python
124
- def hello():
125
- print('Hello, World!')
126
- ```
127
- </format>"""
128
-
129
- # Compare ignoring whitespace
130
- assert "".join(formatted.split()) == "".join(
131
- expected_format.split()
132
- ), f"Formatting failed. Expected:\n{expected_format}\nGot:\n{formatted}"
133
- print("Formatting test passed.")
134
-
135
- # Test parsing
136
- parsed = CodeFileModel.parse(formatted)
137
- assert (
138
- parsed == code_file
139
- ), f"Parsing failed. Expected:\n{code_file}\nGot:\n{parsed}"
140
- print("Parsing test passed.")
141
-
142
- # Test round-trip
143
- round_trip = CodeFileModel.parse(CodeFileModel.format(code_file))
144
- assert (
145
- round_trip == code_file
146
- ), f"Round-trip failed. Expected:\n{code_file}\nGot:\n{round_trip}"
147
- print("Round-trip test passed.")
148
-
149
- # Test with different values
150
- code_file2 = CodeFileModel(
151
- language="JavaScript",
152
- file_path="src/app.js",
153
- code="function greet() {\n console.log('Hello, World!');\n}",
154
- )
155
- formatted2 = CodeFileModel.format(code_file2)
156
- parsed2 = CodeFileModel.parse(formatted2)
157
- assert (
158
- parsed2 == code_file2
159
- ), f"Parsing failed for different values. Expected:\n{code_file2}\nGot:\n{parsed2}"
160
- print("Different values test passed.")
161
-
162
- print("All tests passed successfully!")
163
-
164
- # Test cases
165
- if __name__ == "__main__":
166
- # Test formatting
167
- code_file = CodeFileModel(
168
- language="Python",
169
- file_path="src/main.py",
170
- code="def hello():\n print('Hello, World!')",
171
- )
172
- formatted = CodeFileModel.format(code_file)
173
- expected_format = """<format>
174
- code_file_model
175
- src/main.py
176
- ```Python
177
- def hello():
178
- print('Hello, World!')
179
- ```
180
- </format>"""
181
- assert (
182
- formatted == expected_format
183
- ), f"Formatting failed. Expected:\n{expected_format}\nGot:\n{formatted}"
184
- print("Formatting test passed.")
185
-
186
- # Test parsing
187
- parsed = CodeFileModel.parse(formatted)
188
- assert (
189
- parsed == code_file
190
- ), f"Parsing failed. Expected:\n{code_file}\nGot:\n{parsed}"
191
- print("Parsing test passed.")
192
-
193
- # Test round-trip
194
- round_trip = CodeFileModel.parse(CodeFileModel.format(code_file))
195
- assert (
196
- round_trip == code_file
197
- ), f"Round-trip failed. Expected:\n{code_file}\nGot:\n{round_trip}"
198
- print("Round-trip test passed.")
199
-
200
- # Test with different values
201
- code_file2 = CodeFileModel(
202
- language="JavaScript",
203
- file_path="src/app.js",
204
- code="function greet() {\n console.log('Hello, World!');\n}",
205
- )
206
- formatted2 = CodeFileModel.format(code_file2)
207
- parsed2 = CodeFileModel.parse(formatted2)
208
- assert (
209
- parsed2 == code_file2
210
- ), f"Parsing failed for different values. Expected:\n{code_file2}\nGot:\n{parsed2}"
211
- print("Different values test passed.")
212
-
213
- print("All tests passed successfully!")