Repository navigation
Conversation
…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
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
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 reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing |
|
Warning Review limit reachedNext included review available in 38 minutes. View limit detailsLimit 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. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (11)
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. Comment |
🧯 Dangerous deletes guard reportPolicy: see .cursorrules — dangerous deletions are blocked unless wrapped safely. Summary:
Flagged findings (file:line:snippet): Excluded matches (by path pattern) |
Reviewer's GuideRefactors 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 detectionsequenceDiagram
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)
Sequence diagram for parser-based front-matter boundariessequenceDiagram
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)
File-Level Changes
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
⏱️ Performance report(No performance test durations collected. Mark tests with |
📖 Documentation PreviewThe documentation has been built successfully!
To view locally:
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
|
נכנס דרך #3443 |
✨ תיאור קצר
\rהבודד נכתב פעמיים (מנתב האאוטליין והפארסר) ← מודול עלה אחד ב-services; גבול ה-front matter ב-scripts/generate_ai_map.pyנכתב ביד ליד תוסף שכבר עושה את העבודה ← הסקריפט קורא את הגבול מהפארסר של הכלי. תווים נסתרים: שתי רשימות זהות שאינן מוסיפות דבר מעל unicodedata, ובדיקה שלישית שלא יודעת עליהן #3427: שתי רשימות זהות של 16 קודי תווים נסתרים שלא הוסיפו דבר על בדיקת הקטגוריה ← נמחקו, ושתי הפונקציות אוחדו לאחת. אף שינוי אינו משנה מה שמשתמש רואה, וזה נמדד: אפס-דיף עלAI-MAP.mdועל שני הנרמולים.claude/gracious-einstein-sevk8pנושא את ה-PR הפתוח של docs_get_section: תקרה ל-candidates, ושמירת חוזה Suggestions — לפני שחיבור ה-Markdown נוחת #3426 (fix(mcp): תקרה לרשימת המועמדים של ambiguous_section, וטסט שמקבע את חוזה Suggestions במסלול ה-Markdown (#3426) #3434), ו-PR נפרד דורש ענף נפרד. ה-PR הזה על ענף נגזר,claude/gracious-einstein-sevk8p-3419, מ-origin/mainהעדכני (1a45c28c).📦 שינויים עיקריים
פירוט נקודות (רשימת תבליטים):
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) מריץ אותו בתת-תהליך.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 נשאר.origin/main): כל טסט שנוגע בשמות החדשים נופל (services.line_endings,front_matter_end,strip_hidden_escapes); טסטי ההתנהגות (16 הקודים) עוברים שם בכוונה — זה אפס-הדיף — ולכן הוכחו במוטציות.Cfנמחקת מהענף הקצר ← 16 טסטי הקודים נופלים (הרשימה כבר לא שם לתפוס);md_parserמחזיק עותק פרטי של כלל ה-CR ← הטסט המבני נופל.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מדווח "עדכני".🧪 בדיקות נדרשות ב‑PR
📝 סוג שינוי
✅ צ'קליסט
docs/whats-new.rstעודכן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.mdR6 +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.mdH6 — נקרא; החיתוך כאן הוא ברצפי בריחה ASCII ובאינדקסי שורות, לא בבייטים — לא רלוונטי;claude-md-snippets/testing.md§5 +TESTING-PATTERNS.mdT2 — ריצה על הקוד הישן ומוטציות;bugbot-rules/widened-exception-scope.md— ה-exceptהרחב סביבchrהוצר ל-(ValueError, OverflowError), ולא הורחב.🧩 השפעות/סיכונים
utilsמייבא עכשיו את שכבת הדומיין ללאtry/except; המודול טהור ונמצא בריפו, וכל צרכן שלnormalize_codeכבר הריץ אותו (המסלול המהיר) לפני השינוי.🔗 קישורים
🧯 סיכון / החזרה לאחור (Rollback)
🤖 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:
Documentation:
Tests:
Chores: