From 6efb6949451512ee8995e3a231c0c4a9e9963dfc Mon Sep 17 00:00:00 2001 From: Tal Date: Sun, 23 Mar 2025 09:07:01 +0200 Subject: [PATCH] Generated best practices file --- best_practices.md | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 best_practices.md diff --git a/best_practices.md b/best_practices.md new file mode 100644 index 00000000..19eee22d --- /dev/null +++ b/best_practices.md @@ -0,0 +1,147 @@ + +Pattern 1: Use proper error handling with get_logger() instead of print statements for consistent logging throughout the codebase. + + +Example code before: +``` +try: + # Some code that might fail + result = process_data() +except Exception as e: + print(f"Failed to process data: {e}") +``` + +Example code after: +``` +try: + # Some code that might fail + result = process_data() +except Exception as e: + get_logger().error(f"Failed to process data", artifact={"error": str(e)}) +``` + +
Relevant past discussions: +- https://github.com/qodo-ai/pr-agent/pull/1529#discussion_r1958684550 +- https://github.com/qodo-ai/pr-agent/pull/1529#discussion_r1958686068 +- https://github.com/qodo-ai/pr-agent/pull/1529#discussion_r1964110734 +- https://github.com/qodo-ai/pr-agent/pull/1529#discussion_r1964107962 +
+ + +Pattern 2: Add defensive null/type checking for dictionary access to prevent potential runtime errors, especially when working with API responses or user inputs. + + +Example code before: +``` +if suggestion.get('score') >= threshold and suggestion.get('improved_code'): + process_suggestion(suggestion) +``` + +Example code after: +``` +if suggestion.get('score') is not None and suggestion.get('improved_code') and int(suggestion['score']) >= threshold: + process_suggestion(suggestion) +``` + +
Relevant past discussions: +- https://github.com/qodo-ai/pr-agent/pull/1391#discussion_r1879875496 +- https://github.com/qodo-ai/pr-agent/pull/1290#discussion_r1798939921 +- https://github.com/qodo-ai/pr-agent/pull/1391#discussion_r1879875489 +
+ + +Pattern 3: Add descriptive comments for complex logic or non-obvious code to improve maintainability and help future developers understand the purpose of the code. + + +Example code before: +``` +if not issue or not isinstance(issue, dict): + continue +``` + +Example code after: +``` +# Skip empty issues or non-dictionary items to ensure valid data structure +if not issue or not isinstance(issue, dict): + continue +``` + +
Relevant past discussions: +- https://github.com/qodo-ai/pr-agent/pull/1262#discussion_r1782097205 +- https://github.com/qodo-ai/pr-agent/pull/1583#discussion_r1971790979 +
+ + +Pattern 4: Wrap API calls and external service interactions with proper try-except blocks and add specific error handling for different failure scenarios. + + +Example code before: +``` +data_above_threshold = {'code_suggestions': []} +for suggestion in data['code_suggestions']: + if int(suggestion.get('score', 0)) >= threshold: + data_above_threshold['code_suggestions'].append(suggestion) +self.push_inline_code_suggestions(data_above_threshold) +``` + +Example code after: +``` +data_above_threshold = {'code_suggestions': []} +try: + for suggestion in data['code_suggestions']: + if int(suggestion.get('score', 0)) >= threshold: + data_above_threshold['code_suggestions'].append(suggestion) + if data_above_threshold['code_suggestions']: + self.push_inline_code_suggestions(data_above_threshold) +except Exception as e: + get_logger().error(f"Failed to publish suggestions, error: {e}") +``` + +
Relevant past discussions: +- https://github.com/qodo-ai/pr-agent/pull/1391#discussion_r1879870807 +- https://github.com/qodo-ai/pr-agent/pull/1263#discussion_r1782129216 +
+ + +Pattern 5: Use consistent formatting and capitalization in documentation, especially in field descriptions and configuration comments, to improve readability. + + +Example code before: +``` +class ConfigFields(BaseModel): + field_one: str = Field(description="the first field that does something") + field_two: str = Field(description="The second field for another purpose") +``` + +Example code after: +``` +class ConfigFields(BaseModel): + field_one: str = Field(description="The first field that does something") + field_two: str = Field(description="The second field for another purpose") +``` + +
Relevant past discussions: +- https://github.com/qodo-ai/pr-agent/pull/1262#discussion_r1782097204 +- https://github.com/qodo-ai/pr-agent/pull/1543#discussion_r1958093666 +
+ + +Pattern 6: Fix typos and grammatical errors in documentation, comments, and user-facing messages to maintain professionalism and clarity. + + +Example code before: +``` +# Create a webhook in GitLab. Set the URL to http[s]:///webhook, the secret token to the generated secret from step 2, andenable the triggers. +``` + +Example code after: +``` +# Create a webhook in GitLab. Set the URL to http[s]:///webhook, the secret token to the generated secret from step 2, and enable the triggers. +``` + +
Relevant past discussions: +- https://github.com/qodo-ai/pr-agent/pull/1307#discussion_r1817699788 +- https://github.com/qodo-ai/pr-agent/pull/1307#discussion_r1817699656 +- https://github.com/qodo-ai/pr-agent/pull/1517#discussion_r1942896094 +
+