Skip to content

Commit

Permalink
Merge pull request #444 from Codium-ai/tr/fallback_yaml
Browse files Browse the repository at this point in the history
Implementing Fallback Mechanisms for YAML Parsing
  • Loading branch information
mrT23 authored Nov 12, 2023
2 parents 29d4f98 + f64d5f1 commit 37e6608
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
15 changes: 15 additions & 0 deletions pr_agent/algo/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,21 @@ def load_yaml(review_text: str) -> dict:

def try_fix_yaml(review_text: str) -> dict:
review_text_lines = review_text.split('\n')

# first fallback - try to convert 'relevant line: ...' to relevant line: |-\n ...'
review_text_lines_copy = review_text_lines.copy()
for i in range(0, len(review_text_lines_copy)):
if 'relevant line:' in review_text_lines_copy[i] and not '|-' in review_text_lines_copy[i]:
review_text_lines_copy[i] = review_text_lines_copy[i].replace('relevant line: ',
'relevant line: |-\n ')
try:
data = yaml.load('\n'.join(review_text_lines_copy), Loader=yaml.SafeLoader)
get_logger().info(f"Successfully parsed AI prediction after adding |-\n to relevant line")
return data
except:
get_logger().debug(f"Failed to parse AI prediction after adding |-\n to relevant line")

# second fallback - try to remove last lines
data = {}
for i in range(1, len(review_text_lines)):
review_text_lines_tmp = '\n'.join(review_text_lines[:-i])
Expand Down
31 changes: 31 additions & 0 deletions tests/unittest/try_fix_yaml.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

# Generated by CodiumAI
from pr_agent.algo.utils import try_fix_yaml


import pytest

class TestTryFixYaml:

# The function successfully parses a valid YAML string.
def test_valid_yaml(self):
review_text = "key: value\n"
expected_output = {"key": "value"}
assert try_fix_yaml(review_text) == expected_output

# The function adds '|-' to 'relevant line:' if it is not already present and successfully parses the YAML string.
def test_add_relevant_line(self):
review_text = "relevant line: value: 3\n"
expected_output = {"relevant line": "value: 3"}
assert try_fix_yaml(review_text) == expected_output

# The function removes the last line(s) of the YAML string and successfully parses the YAML string.
def test_remove_last_line(self):
review_text = "key: value\nextra invalid line\n"
expected_output = {"key": "value"}
assert try_fix_yaml(review_text) == expected_output

# The YAML string is empty.
def test_empty_yaml_fixed(self):
review_text = ""
assert try_fix_yaml(review_text) is None

0 comments on commit 37e6608

Please sign in to comment.