Skip to content

refactor: שלושה כללים שנכתבו פעמיים חזרו למקום אחד — CR בודד, גבול front matter, תווים נסתרים (#3419, #3427) - #3440

Closed
amirbiron wants to merge 1 commit into
mainfrom
claude/gracious-einstein-sevk8p-3419
Closed

amirbiron wants to merge 1 commit into
mainfrom
claude/gracious-einstein-sevk8p-3419

Conversation

@amirbiron

@amirbiron amirbiron commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

✨ תיאור קצר

📦 שינויים עיקריים

  • קוד (Backend)
  • בוט טלגרם
  • מסד נתונים/מיגרציות
  • תיעוד (docs/)
  • DevOps/CI/CD

פירוט נקודות (רשימת תבליטים):

  • services/line_endings.py (חדש, עלה, re בלבד): CR_WITHOUT_LF ו-find_lone_cr(text) — הפונקציה מחזירה את ההתאמה ולא bool, כי הפארסר גוזר ממנה את מספר השורה לחריגה והמנתב צריך רק לדעת שיש. mcp_server/outline.py ו-services/md_parser.py מייבאים אותה, וההגדרות המקומיות (וה-import re שנשאר בלעדיהן מיותר) הוסרו. הכיוון חד-סטרי, לפי האילוץ באישו. התקדים: webapp/size_format.py.
  • md_parser.front_matter_end(text) (ציבורית, מחוץ ל-__all__ באותו נימוק כמו ב-chore(mcp): ארבעה פריטים קטנים מסקירת #3429 — SUGG-014, SUGG-001, SUGG-004, SUGG-010 (#3433) #3439): הטוקן front_matter של mdit_py_plugins.front_matter על _MD — המופע שהכלי מריץ — נושא map = [0, end], ו-end הוא בדיוק האינדקס ש-_body_start צריך. הסקריפט קורא לה על "\n".join(lines) (ההפך המדויק של _read, שמפצל ב-split("\n")), ומוסיף את שורש הריפו ל-sys.path כדי לרוץ לבדו כמו קודם — נבדק מהשורש ומ-/tmp, וטסט הרעננות (test_ai_map_freshness) מריץ אותו בתת-תהליך.
  • הטסט שקיבע את הפער בכוונה נערך יחד עם הסגירה, כפי שה-docstring שלו דרש: test_the_front_matter_rules_still_disagree_as_measured הפך ל-test_front_matter_end_is_the_plugins_boundary_on_every_shape — אותה טבלה של שתים-עשרה צורות, עמודת אמת אחת (התוסף, על פרסר בקרה שנבנה בטסט), ושני הקוראים (front_matter_end, _body_start) נבדקים מולה — כולל חמש הצורות שהכלל הידני חלק עליהן. test_the_measured_front_matter_gap_matches_the_prose הוסר יחד עם הפער שהוא הצמיד לפרוזה, והפרוזה ב-md_parser וב-requirements/base.txt מספרת עכשיו את ההיסטוריה במקום את הפער.
  • strip_hidden_escapes(s, *, remove_variation_selectors=False) ב-src/domain/services/code_normalizer.py — ההגדרה היחידה. Cf לפי unicodedata.category, בשתי הצורות (\uXXXX, \UXXXXXXXX); Variation Selectors (U+FE00–U+FE0F, ובצורה הארוכה U+E0100–U+E01EF) הם Mn ולכן ענף נפרד שנדלק רק לפי בקשה — ברירת המחדל שומרת אותם, כמו קודם בשני הצרכנים; רצף מעבר לטווח Unicode נשאר כמות שהוא. CodeNormalizer.normalize קורא לה; _KNOWN_ESCAPE_HEX4 והמתודה _strip_hidden_escapes נמחקו.
  • utils.normalize_code: בלוק ה-known_hex4 ושתי הפונקציות הפנימיות הוחלפו בקריאה אחת. והייבוא של שכבת הדומיין הפך מאופציונלי (try/except "gradual refactor") לייבוא רגיל — המודול טהור, בלי I/O, בריפו הזה; מסלול ישן שהיה רץ בלעדיו היה עותק שני מחדש (או נפילה שקטה למסלול גרוע). מסומן כהחלטה מפורשת.
  • מה במפורש לא נגעתי בו, ולמה (ממצא לדיווח): קבוצות התווים _ZERO_WIDTH/_DIRECTIONAL ב-CodeNormalizer ו-zero_width/directional ב-utils — גם הן Cf כולן, אבל ב-utils הן נושאות סמנטיקת אפשרויות (remove_zero_width/remove_directional_marks נפרדים מ-remove_other_format_chars), ולכן הן אינן כפילות טהורה כמו רשימות הבריחה; האישו מדבר על שתי רשימות ה-hex, ואלה נשארות לאישו משלהן.

🧪 בדיקות

  • אפס-דיף, נמדד: AI-MAP.md שנוצר בקוד החדש זהה בית-בית לקובץ שבריפו, שזהה לפלט הקוד הישן (sha256 d97b3160…); שני הנרמולים על 39 קלטים של רצפי בריחה (16 הקודים שהיו ברשימות, Cf שלא היו בהן, לא-Cf, VS בשתי הצורות, אותיות קטנות, רצפים שבורים, מעבר לטווח) × 6 צירופי אפשרויות (ברירת מחדל, VS, המסלול הישן, המסלול הישן+VS, בלי הסרת בריחות) — פלט זהה לפני ואחרי.
  • טסטים חדשים/נערכו: test_the_lone_cr_rule_matches_markdown_it על הכלל המשותף מול markdown-it-py; test_both_consumers_use_the_shared_lone_cr_rule_and_neither_keeps_a_copy (מבני: ייבוא + אין תבנית מקומית); טבלת ה-front matter כמתואר; test_body_start_is_read_from_the_parser_and_not_computed_here; ב-test_utils_normalize_hidden_escapes.py — פונקציה אחת בלי רשימה, 16 הקודים הם Cf ונחתכים בשני המסלולים, VS ענף נפרד, מעבר ל-Unicode נשאר.
  • על הקוד הישן (worktree מנותק על origin/main): כל טסט שנוגע בשמות החדשים נופל (services.line_endings, front_matter_end, strip_hidden_escapes); טסטי ההתנהגות (16 הקודים) עוברים שם בכוונה — זה אפס-הדיף — ולכן הוכחו במוטציות.
  • מוטציות (worktree על הקוד החדש): בדיקת Cf נמחקת מהענף הקצר ← 16 טסטי הקודים נופלים (הרשימה כבר לא שם לתפוס); md_parser מחזיק עותק פרטי של כלל ה-CR ← הטסט המבני נופל.
  • סוויטות: 154 ב-test_md_parser, test_ai_map_generator, test_ai_map_freshness, test_utils_normalize_hidden_escapes, test_code_normalizer; ועוד 656 ב-test_mcp_outline, test_utils, unit/application/services, test_code_processor_coverage_extra, test_save_flow_new_path, test_doc_sections, test_measure_md_parse_cost_script, test_mcp_docs_handlers, test_md_parser_oracle — ירוקים. הטסט "doc_sections לא גורר מודולים כבדים" עובר, ובדיקה בתת-תהליך נקי: services.line_endings ו-services.md_parser לא טוענים pymongo/telegram/flask/database. flake8 מלא על הקבצים החדשים/המרכזיים — נקי; ב-utils.py נשאר F401 'shutil' קיים מלפני (מחוץ לדיף).
  • לא אימתתי: ריצה של generate_ai_map.py ב-CI — לא מצאתי workflow שמריץ אותו (הדוקסטרינג מזכיר workflow עם --out; grep על .github/ לא מצא). מה שכן נבדק: ריצה לבדו מכל תיקייה, ו---check מדווח "עדכני".
  • Unit
  • Integration
  • Manual

🧪 בדיקות נדרשות ב‑PR

  • 🔍 Code Quality & Security
  • Unit Tests (3.11)
  • Unit Tests (3.12)

📝 סוג שינוי

  • feat: פיצ'ר חדש
  • fix: תיקון באג
  • docs: שינוי תיעוד בלבד
  • refactor: שינוי קוד ללא שינוי התנהגות
  • perf: שיפור ביצועים
  • chore/ci: תשתית/CI
  • breaking change: שינוי שובר תאימות

✅ צ'קליסט

  • הקוד עוקב אחרי הסגנון (Black/isort/flake8/mypy)
  • בדיקות רצות ועוברות
  • תיעוד עודכן (README/Docs)
  • אם נוספו ג'ובים חדשים (Background Jobs) – לא נוספו
  • אם נוספו/שונו משתני סביבה – לא נוספו
  • אם נוספו/השתנו טוקנים – לא רלוונטי
  • אין סודות/מפתחות בקוד
  • אין מחיקות מסוכנות/פעולות על root (ראו .cursorrules)
  • הודעת הקומיט תואמת Conventional Commits (ע"פ הטבלה)
  • CHANGELOG עודכן אם נדרש — docs/whats-new.rst עודכן
  • כל ה‑Required Checks לעיל ירוקים — ייבדק ב-CI
  • צילום/וידאו UI מצורף אם רלוונטי — לא רלוונטי
  • עיינתי במסמכי אתר התיעוד — נתיב: AI-MAP.md, docs/doc-authoring.rst (הפסקה על generate_ai_map.py --check), docs/mcp-server.rst (inconsistent_line_endings בשני המסלולים) | המשפט: "python3 scripts/generate_ai_map.py --check מתריע על עמודים כאלה ואינו מפיל את הבנייה" — הצורה שבה הסקריפט רץ לבדו, ולכן sys.path
  • לא נדרש עיון — התנאי התקיים (התנהגות מתועדת)

דפוסי באגים שנקראו ומה שקבעו בקוד: RECURRING-PATTERNS.md R6 + bugbot-rules/duplicate-rule-second-copy.md — שלושת האיחודים עצמם, והתיקון המומלץ שם ("מודול עלה אחד") הוא services/line_endings.py; bugbot-rules/silent-fallback-to-worse-path.md — הייבוא האופציונלי ב-utils היה נפילה שקטה למסלול שני, ולכן הפך לייבוא רגיל; bugbot-rules/import-time-side-effects.md — המודול החדש מקמפל ביטוי אחד בייבוא ותו לא, והסקריפט מייבא services.md_parser (שכבר נמדד: אין רשת/דיסק/חוט בייבוא); bugbot-rules/state-record-without-state-change.md — הפרוזה שציטטה את הפער ("חמש מתוך שתים-עשרה") עודכנה יחד עם סגירתו, בשלושת המקומות; BY-STACK/hebrew-source.md H6 — נקרא; החיתוך כאן הוא ברצפי בריחה ASCII ובאינדקסי שורות, לא בבייטים — לא רלוונטי; claude-md-snippets/testing.md §5 + TESTING-PATTERNS.md T2 — ריצה על הקוד הישן ומוטציות; bugbot-rules/widened-exception-scope.md — ה-except הרחב סביב chr הוצר ל-(ValueError, OverflowError), ולא הורחב.

🧩 השפעות/סיכונים

  • ייצור: אפס שינוי התנהגות, מדוד בשלושת המסלולים. utils מייבא עכשיו את שכבת הדומיין ללא try/except; המודול טהור ונמצא בריפו, וכל צרכן של normalize_code כבר הריץ אותו (המסלול המהיר) לפני השינוי.

🔗 קישורים

🧯 סיכון / החזרה לאחור (Rollback)

  • revert של הקומיט היחיד. אין מיגרציה ואין משתנה סביבה.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SfJTSpDAhDr2yhtmpFkwTx


Generated by Claude Code

Summary by Sourcery

Remove duplicated parsing and Unicode normalization rules while preserving existing outputs and behavior.

Enhancements:

  • Centralize lone carriage-return detection for the outline router and Markdown parser.
  • Use the Markdown parser’s front matter boundary when generating AI documentation maps.
  • Consolidate hidden Unicode escape normalization into a shared domain service based on Unicode categories, with optional variation-selector removal.

Documentation:

  • Update the changelog and related documentation to reflect the unified parsing and normalization behavior.

Tests:

  • Update parser and normalization tests to verify shared implementations, plugin-aligned front matter handling, and unchanged normalization output.

Chores:

  • Replace the optional domain normalizer fallback with the canonical domain implementation.

Review in cubic

…ont matter, תווים נסתרים (#3419, #3427)

- כלל ה-\r הבודד (סיומת שורה שאינה חד-משמעית) ישב גם ב-mcp_server/outline.py
  וגם ב-services/md_parser.py, ושני העותקים היו צריכים להסכים לנצח (R6).
  עכשיו הוא במודול עלה חדש, services/line_endings.py (CR_WITHOUT_LF,
  find_lone_cr), ושני הצרכנים קוראים לו; הכיוון חד-סטרי (mcp_server מייבא
  מ-services). טסט מוכיח מול markdown-it-py שהכלל נכון, וטסט מבני מוכיח
  ששני הצרכנים מייבאים אותו ואף אחד מהם אינו מחזיק עותק.
- scripts/generate_ai_map.py::_body_start כתב ביד את גבול ה-front matter,
  ונמדד ב-#3418 שהוא חולק על התוסף ש-MyST מריץ בחמש מתוך שתים-עשרה צורות.
  עכשיו הוא קורא את הגבול מהפארסר של הכלי — md_parser.front_matter_end,
  דרך mdit_py_plugins.front_matter על אותו מופע — והסקריפט מוסיף את שורש
  הריפו ל-sys.path כדי לרוץ לבדו כמו קודם. אפס-דיף: AI-MAP.md שנוצר זהה
  בית-בית לזה שבריפו (וגם לפלט הקוד הישן). הטסט שקיבע את הפער בכוונה
  (test_the_front_matter_rules_still_disagree_as_measured) נערך יחד עם
  הסגירה, כפי שה-docstring שלו דרש: הטבלה נשארה עם עמודת אמת אחת (התוסף),
  ושני הקוראים נבדקים מולה; הטסט שהצמיד את המספר "חמש מתוך שתים-עשרה"
  לפרוזה הוסר יחד עם הפער, והפרוזה (md_parser, requirements/base.txt)
  מספרת עכשיו את ההיסטוריה.
- #3427: known_hex4 (utils) ו-_KNOWN_ESCAPE_HEX4 (CodeNormalizer) — שתי
  רשימות זהות של 16 קודים שנבדקו לפני בדיקת הקטגוריה, וכל 16 הם Cf, כלומר
  הרשימה לא הוסיפה דבר. שתיהן נמחקו, ושתי הפונקציות אוחדו
  ל-strip_hidden_escapes אחת בשכבת הדומיין (טהורה, בלי I/O); utils.normalize_code
  מייבא אותה במפורש (הייבוא האופציונלי של הדומיין הפך לייבוא רגיל — מסלול
  ישן שרץ בלעדיו היה עותק שני מחדש). ענף ה-Variation Selectors (Mn, לא Cf)
  נשאר נפרד ונדלק רק עם remove_variation_selectors=True, כמו קודם.
  אפס-דיף מדוד: 39 קלטים של רצפי בריחה × 6 צירופי אפשרויות, שני הנרמולים,
  זהים לפני ואחרי.

טסטים: מה שנוגע בשמות החדשים נופל על origin/main (line_endings,
front_matter_end, strip_hidden_escapes); טסטי ההתנהגות עוברים שם בכוונה
(אפס-דיף) ומוכחים במוטציות — בדיקת הקטגוריה שנמחקת מפילה את 16 טסטי
הקודים, ועותק פרטי של כלל ה-CR בפארסר מפיל את הטסט המבני.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfJTSpDAhDr2yhtmpFkwTx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @amirbiron, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 2 hours and 9 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing

@coderabbitai

coderabbitai Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 38 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: b91b1af2-ebf3-43d5-8afc-7773a87e7b1d

📥 Commits

Reviewing files that changed from the base of the PR and between 1a45c28 and 09cae32.

📒 Files selected for processing (11)
  • docs/whats-new.rst
  • mcp_server/outline.py
  • requirements/base.txt
  • scripts/generate_ai_map.py
  • services/line_endings.py
  • services/md_parser.py
  • src/domain/services/code_normalizer.py
  • tests/test_ai_map_generator.py
  • tests/test_md_parser.py
  • tests/test_utils_normalize_hidden_escapes.py
  • utils.py

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

🧯 Dangerous deletes guard report

Policy: see .cursorrules — dangerous deletions are blocked unless wrapped safely.

Summary:

  • Flagged findings (blocking): 0
    0
  • Excluded matches (not blocking): 15
  • Total matches (all files): 128

Flagged findings (file:line:snippet):
(none)

Excluded matches (by path pattern)
./webapp/static/js/md_preview.bundle.js.map:4:  "sourcesContent": ["// Markdown-it plugin to render GitHub-style task lists; see\n//\n// https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments\n// https://github.com/blog/1825-t … [truncated]
./docs/DOCUMENTATION_GUIDE.md:453:rm -rf _build
./docs/Makefile:24:	rm -rf $(BUILDDIR)
./Dockerfile:42:    rm -rf /var/lib/apt/lists/*
./Dockerfile:121:    rm -rf /var/lib/apt/lists/*
./node_modules/katex/package.json:153:    "build": "rimraf dist/ && mkdirp dist && cp README.md dist && rollup -c --failAfterWarnings && webpack && node update-sri.js package dist/README.md",
./node_modules/katex/src/fonts/Makefile:139:	rm -rf pfa ff otf ttf woff woff2
./node_modules/mermaid/dist/mermaid.js.map:4:  "sourcesContent": ["/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values for tr … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm/chunk-2M32CCKP.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence d … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm.min/chunk-4HFYJGYH.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequen … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.esm.min/chunk-4HFYJGYH.mjs:1:var r={name:"mermaid",version:"11.12.0",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graph … [truncated]
./node_modules/mermaid/dist/chunks/mermaid.core/chunk-KS23V3DP.mjs.map:4:  "sourcesContent": ["{\n  \"name\": \"mermaid\",\n  \"version\": \"11.12.0\",\n  \"description\": \"Markdown-ish syntax for generating flowcharts, mindmaps, sequence  … [truncated]
./node_modules/mermaid/dist/mermaid.min.js:1524:`,"getStyles"),c1e=RQe});var h1e={};dr(h1e,{diagram:()=>NQe});var NQe,f1e=N(()=>{"use strict";$ge();a1e();l1e();u1e();NQe={parser:Fge,db:n1e,renderer:o1e,styles:c1e}});var m1e,g1e=N(()=>{"use  … [truncated]
./node_modules/mermaid/dist/mermaid.min.js.map:4:  "sourcesContent": ["/**\n* Default values for dimensions\n*/\nconst defaultIconDimensions = Object.freeze({\n\tleft: 0,\n\ttop: 0,\n\twidth: 16,\n\theight: 16\n});\n/**\n* Default values fo … [truncated]
./README.md:842:find . -name "__pycache__" -exec rm -rf {} +

@sourcery-ai

sourcery-ai Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Refactors three duplicated rules into single authoritative implementations: lone-CR detection, front-matter boundary detection, and hidden Unicode escape stripping. The PR preserves observable output, verifies AI-MAP and normalization parity, and strengthens structural tests against reintroducing duplicate logic.

Sequence diagram for shared lone-CR detection

sequenceDiagram
    participant Outline as mcp_server/outline.py
    participant Parser as services/md_parser.py
    participant Rules as services.line_endings

    Outline->>Rules: find_lone_cr(text)
    Rules-->>Outline: Match or None
    Parser->>Rules: find_lone_cr(text)
    Rules-->>Parser: Match or None
    Parser->>Parser: InconsistentLineEndings(line number)
Loading

Sequence diagram for parser-based front-matter boundaries

sequenceDiagram
    participant Generator as generate_ai_map.py
    participant Parser as services.md_parser
    participant Plugin as front_matter_plugin

    Generator->>Parser: front_matter_end(text)
    Parser->>Plugin: _MD.parse(text)
    Plugin-->>Parser: front_matter token with map
    Parser-->>Generator: boundary index
    Generator->>Generator: _body_start(lines)
Loading

File-Level Changes

Change Details Files
Centralize lone-CR detection for the outline router and Markdown parser.
  • Added a lightweight services.line_endings module exposing the compiled rule and match-returning helper.
  • Updated both consumers to import the shared helper and removed their local regex definitions.
  • Added behavioral and structural tests to verify Markdown-it equivalence and prevent duplicate rules.
services/line_endings.py
mcp_server/outline.py
services/md_parser.py
tests/test_md_parser.py
Make AI map generation use the parser’s actual front-matter boundary.
  • Exposed md_parser.front_matter_end backed by the registered front-matter plugin and token map.
  • Replaced the generator’s hand-written boundary logic and added repository-root path setup for standalone execution.
  • Reworked tests and documentation to assert plugin agreement across twelve input shapes and preserve generated-output freshness.
scripts/generate_ai_map.py
services/md_parser.py
tests/test_ai_map_generator.py
tests/test_md_parser.py
requirements/base.txt
docs/whats-new.rst
Consolidate hidden-escape normalization around Unicode categories and one shared implementation.
  • Added domain-level strip_hidden_escapes handling Cf, optional variation selectors, both escape widths, and out-of-range code points.
  • Removed duplicated allowlists and normalization methods from the domain and legacy utility paths.
  • Changed utils to require the pure domain normalizer via a regular import instead of silently falling back.
  • Added coverage for the former sixteen codes, variation-selector semantics, malformed escapes, and Unicode-boundary behavior.
src/domain/services/code_normalizer.py
utils.py
tests/test_utils_normalize_hidden_escapes.py

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@github-actions

Copy link
Copy Markdown
Contributor

⏱️ Performance report

(No performance test durations collected. Mark tests with @pytest.mark.performance.)

@github-actions

Copy link
Copy Markdown
Contributor

📖 Documentation Preview

The documentation has been built successfully!

To view locally:

  1. Download the artifacts
  2. Extract the zip file
  3. Open index.html in your browser

@codecov

codecov Bot commented Sep 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@amirbiron

Copy link
Copy Markdown
Owner Author

נכנס דרך #3443

@amirbiron amirbiron closed this Sep 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants