From b06290e6e839a1ef0dc08f0b0c559406a9518159 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2026 14:16:01 +0000 Subject: [PATCH 1/2] perf(tools): batch open PR file queries in check-claims.py Eliminate N+1 gh pr view calls in check-claims.py by querying open PR numbers and changed files in a single gh pr list call. Update unit tests in check-claims-test.py to match. Co-authored-by: mjmirza <34001140+mjmirza@users.noreply.github.com> --- tools/check-claims-test.py | 20 ++++++++++++-------- tools/check-claims.py | 16 +++------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/tools/check-claims-test.py b/tools/check-claims-test.py index 09f19e12..6e78fb82 100644 --- a/tools/check-claims-test.py +++ b/tools/check-claims-test.py @@ -44,14 +44,18 @@ def test_published_on_main_false(self, mock_run): @patch("subprocess.run") def test_sibling_pr_paths(self, mock_run): - prs_output = json.dumps([{"number": 10}, {"number": 12}]) - pr10_files = json.dumps({"files": [{"path": "patterns/01-gof/singleton.md"}, {"path": "README.md"}]}) - pr12_files = json.dumps({"files": [{"path": "patterns/02-code-smells/feature-envy.md"}]}) - - mock_run.side_effect = [ - MagicMock(stdout=prs_output), - MagicMock(stdout=pr12_files), - ] + prs_output = json.dumps([ + { + "number": 10, + "files": [{"path": "patterns/01-gof/singleton.md"}, {"path": "README.md"}], + }, + { + "number": 12, + "files": [{"path": "patterns/02-code-smells/feature-envy.md"}], + }, + ]) + + mock_run.return_value = MagicMock(stdout=prs_output) siblings = check_claims.sibling_pr_paths(this_pr="10") self.assertNotIn("patterns/01-gof/singleton.md", siblings) self.assertEqual(siblings.get("patterns/02-code-smells/feature-envy.md"), 12) diff --git a/tools/check-claims.py b/tools/check-claims.py index 02b97081..43d54d5a 100644 --- a/tools/check-claims.py +++ b/tools/check-claims.py @@ -46,7 +46,7 @@ def published_on_main(path: str) -> bool: def sibling_pr_paths(this_pr: str) -> dict[str, int]: prs = json.loads( subprocess.run( - ["gh", "pr", "list", "--state", "open", "--json", "number"], + ["gh", "pr", "list", "--state", "open", "--json", "number,files"], capture_output=True, text=True, cwd=ROOT, @@ -59,18 +59,8 @@ def sibling_pr_paths(this_pr: str) -> dict[str, int]: num = pr.get("number") if num is None or str(num) == str(this_pr): continue - files = json.loads( - subprocess.run( - ["gh", "pr", "view", str(num), "--json", "files"], - capture_output=True, - text=True, - cwd=ROOT, - check=False, - ).stdout - or '{"files": []}' - ) - for f in files.get("files", []): - p = f.get("path", "") + for f in pr.get("files", []): + p = f.get("path", "") if isinstance(f, dict) else "" if p.startswith("patterns/") and p.endswith(".md"): claims[p] = num return claims From c035af62b99039c897cd0e9621a6627166b39f1d Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 23 Aug 2026 14:31:09 +0000 Subject: [PATCH 2/2] fix(tools): resolve C++ and C# regex word boundary bug in discovery pathway generator Fix a regex word boundary bug in detect_mentions() in tools/gen-by-problem-by-language.py where r"\bc\+\+\b" failed to match C++ when followed by non-word characters. Update C++ and C# regex patterns and regenerate docs/BY-LANGUAGE.md. Co-authored-by: mjmirza <34001140+mjmirza@users.noreply.github.com> --- docs/BY-LANGUAGE.md | 48 +++++++++++++++++++++++++---- tools/check-claims-test.py | 20 +++++------- tools/check-claims.py | 16 ++++++++-- tools/gen-by-problem-by-language.py | 4 +-- 4 files changed, 65 insertions(+), 23 deletions(-) diff --git a/docs/BY-LANGUAGE.md b/docs/BY-LANGUAGE.md index 90f774bb..27c29edc 100644 --- a/docs/BY-LANGUAGE.md +++ b/docs/BY-LANGUAGE.md @@ -872,19 +872,60 @@ These patterns contain runnable code examples written in C++: These patterns have unique implementation variants or change their design structure specifically when built using C++ features (documented in Dimension 8): +- [Active Object](../patterns/09-concurrency/active-object.md) (Concurrency and Parallelism) +- [Adapter](../patterns/01-design-patterns-gof/adapter.md) (Design Patterns (GoF)) +- [Balking](../patterns/09-concurrency/balking.md) (Concurrency and Parallelism) +- [Bridge](../patterns/01-design-patterns-gof/bridge.md) (Design Patterns (GoF)) +- [Call Super](../patterns/18-anti-patterns/call-super.md) (Anti-Patterns) +- [Characterization Test](../patterns/14-testing/characterization-test.md) (Testing) +- [Common Closure Principle](../patterns/04-principles-and-laws/common-closure-principle.md) (Principles and Laws) +- [Common Reuse Principle](../patterns/04-principles-and-laws/common-reuse-principle.md) (Principles and Laws) +- [Compare-and-Swap Loop](../patterns/09-concurrency/compare-and-swap-loop.md) (Concurrency and Parallelism) +- [Composite](../patterns/01-design-patterns-gof/composite.md) (Design Patterns (GoF)) - [Copy-on-Write](../patterns/09-concurrency/copy-on-write.md) (Concurrency and Parallelism) - [Double-Checked Locking](../patterns/09-concurrency/double-checked-locking.md) (Concurrency and Parallelism) +- [Dummy](../patterns/14-testing/dummy.md) (Testing) +- [Facade](../patterns/01-design-patterns-gof/facade.md) (Design Patterns (GoF)) - [Future Promise](../patterns/09-concurrency/future-promise.md) (Concurrency and Parallelism) +- [Fuzz Testing](../patterns/14-testing/fuzz-testing.md) (Testing) +- [Golden Master](../patterns/14-testing/golden-master.md) (Testing) +- [High Cohesion](../patterns/04-principles-and-laws/high-cohesion.md) (Principles and Laws) +- [Immutable Object](../patterns/09-concurrency/immutable-object.md) (Concurrency and Parallelism) +- [Indirection](../patterns/04-principles-and-laws/indirection.md) (Principles and Laws) +- [Inline Function](../patterns/03-refactoring/inline-function.md) (Refactoring Techniques) +- [Insider Trading](../patterns/02-code-smells/insider-trading.md) (Code Smells) +- [Introduce Assertion](../patterns/03-refactoring/introduce-assertion.md) (Refactoring Techniques) +- [LSM Tree](../patterns/12-data-storage/lsm-tree.md) (Data and Storage) +- [Mock](../patterns/14-testing/mock.md) (Testing) +- [Mutation Test](../patterns/14-testing/mutation-test.md) (Testing) +- [Plugin](../patterns/06-enterprise-application-architecture/plugin.md) (Enterprise Application Architecture) +- [Polymorphism](../patterns/04-principles-and-laws/polymorphism.md) (Principles and Laws) +- [Prototype](../patterns/01-design-patterns-gof/prototype.md) (Design Patterns (GoF)) +- [Proxy](../patterns/01-design-patterns-gof/proxy.md) (Design Patterns (GoF)) +- [Reactor](../patterns/09-concurrency/reactor.md) (Concurrency and Parallelism) - [Role Object](../patterns/01-design-patterns-gof/role-object.md) (Design Patterns (GoF)) - [Scoped Locking](../patterns/09-concurrency/scoped-locking.md) (Concurrency and Parallelism) +- [Sequential Coupling](../patterns/18-anti-patterns/sequential-coupling.md) (Anti-Patterns) +- [Slide Statements](../patterns/03-refactoring/slide-statements.md) (Refactoring Techniques) +- [Split Variable](../patterns/03-refactoring/split-variable.md) (Refactoring Techniques) +- [Strategized Locking](../patterns/09-concurrency/strategized-locking.md) (Concurrency and Parallelism) +- [Strategy](../patterns/01-design-patterns-gof/strategy.md) (Design Patterns (GoF)) - [Structured Output](../patterns/17-ai-agentic/structured-output.md) (AI and Agentic) +- [Thread-Safe Interface](../patterns/09-concurrency/thread-safe-interface.md) (Concurrency and Parallelism) - [Thread-Specific Storage](../patterns/09-concurrency/thread-specific-storage.md) (Concurrency and Parallelism) +- [Yo-yo Problem](../patterns/18-anti-patterns/yo-yo-problem.md) (Anti-Patterns) #### Made Unnecessary or Alternative in C++ These patterns have native features in C++ that make the pattern unnecessary, or require an alternative design approach (documented in Dimension 4): -No language-level redundancies recorded. +- [Bridge](../patterns/01-design-patterns-gof/bridge.md) (Design Patterns (GoF)) +- [Double-Checked Locking](../patterns/09-concurrency/double-checked-locking.md) (Concurrency and Parallelism) +- [Facade](../patterns/01-design-patterns-gof/facade.md) (Design Patterns (GoF)) +- [Fuzz Testing](../patterns/14-testing/fuzz-testing.md) (Testing) +- [Insider Trading](../patterns/02-code-smells/insider-trading.md) (Code Smells) +- [Iterator](../patterns/01-design-patterns-gof/iterator.md) (Design Patterns (GoF)) +- [Replace Error Code with Exception](../patterns/03-refactoring/replace-error-code-with-exception.md) (Refactoring Techniques) ### C# @@ -904,7 +945,6 @@ These patterns have unique implementation variants or change their design struct - [Anemic Domain Model](../patterns/18-anti-patterns/anemic-domain-model.md) (Anti-Patterns) - [Association Table Mapping](../patterns/06-enterprise-application-architecture/association-table-mapping.md) (Enterprise Application Architecture) - [Async Await](../patterns/09-concurrency/async-await.md) (Concurrency and Parallelism) -- [Backpressure](../patterns/09-concurrency/backpressure.md) (Concurrency and Parallelism) - [Balking](../patterns/09-concurrency/balking.md) (Concurrency and Parallelism) - [Builder](../patterns/01-design-patterns-gof/builder.md) (Design Patterns (GoF)) - [Busy Front End](../patterns/18-anti-patterns/busy-front-end.md) (Anti-Patterns) @@ -913,20 +953,17 @@ These patterns have unique implementation variants or change their design struct - [Class Table Inheritance](../patterns/06-enterprise-application-architecture/class-table-inheritance.md) (Enterprise Application Architecture) - [Command Query Responsibility Segregation](../patterns/08-cloud-distributed/cqrs.md) (Cloud and Distributed) - [Comments](../patterns/02-code-smells/comments.md) (Code Smells) -- [Countdown Latch](../patterns/09-concurrency/countdown-latch.md) (Concurrency and Parallelism) - [Data Class](../patterns/02-code-smells/data-class.md) (Code Smells) - [Data Mapper](../patterns/06-enterprise-application-architecture/data-mapper.md) (Enterprise Application Architecture) - [Data Transfer Object](../patterns/06-enterprise-application-architecture/data-transfer-object.md) (Enterprise Application Architecture) - [Decorator](../patterns/01-design-patterns-gof/decorator.md) (Design Patterns (GoF)) - [Domain Event](../patterns/10-microservices/domain-event.md) (Microservices) - [Domain Service](../patterns/11-domain-driven-design/domain-service.md) (Domain-Driven Design) -- [Double-Checked Locking](../patterns/09-concurrency/double-checked-locking.md) (Concurrency and Parallelism) - [Embedded Value](../patterns/06-enterprise-application-architecture/embedded-value.md) (Enterprise Application Architecture) - [Facade](../patterns/01-design-patterns-gof/facade.md) (Design Patterns (GoF)) - [Factory Method](../patterns/01-design-patterns-gof/factory-method.md) (Design Patterns (GoF)) - [Foreign Key Mapping](../patterns/06-enterprise-application-architecture/foreign-key-mapping.md) (Enterprise Application Architecture) - [Future Promise](../patterns/09-concurrency/future-promise.md) (Concurrency and Parallelism) -- [Guarded Suspension](../patterns/09-concurrency/guarded-suspension.md) (Concurrency and Parallelism) - [Hexagonal Architecture](../patterns/05-architectural/hexagonal-architecture.md) (Architectural Patterns) - [Immutable Object](../patterns/09-concurrency/immutable-object.md) (Concurrency and Parallelism) - [Incomplete Library Class](../patterns/02-code-smells/incomplete-library-class.md) (Code Smells) @@ -963,7 +1000,6 @@ These patterns have unique implementation variants or change their design struct - [Pure Fabrication](../patterns/04-principles-and-laws/pure-fabrication.md) (Principles and Laws) - [Reactor](../patterns/09-concurrency/reactor.md) (Concurrency and Parallelism) - [Replace Conditional with Polymorphism](../patterns/03-refactoring/replace-conditional-with-polymorphism.md) (Refactoring Techniques) -- [Replace Control Flag with Break](../patterns/03-refactoring/replace-control-flag-with-break.md) (Refactoring Techniques) - [Replace Temp with Query](../patterns/03-refactoring/replace-temp-with-query.md) (Refactoring Techniques) - [Replace Type Code with Subclasses](../patterns/03-refactoring/replace-type-code-with-subclasses.md) (Refactoring Techniques) - [Row Data Gateway](../patterns/06-enterprise-application-architecture/row-data-gateway.md) (Enterprise Application Architecture) diff --git a/tools/check-claims-test.py b/tools/check-claims-test.py index 6e78fb82..09f19e12 100644 --- a/tools/check-claims-test.py +++ b/tools/check-claims-test.py @@ -44,18 +44,14 @@ def test_published_on_main_false(self, mock_run): @patch("subprocess.run") def test_sibling_pr_paths(self, mock_run): - prs_output = json.dumps([ - { - "number": 10, - "files": [{"path": "patterns/01-gof/singleton.md"}, {"path": "README.md"}], - }, - { - "number": 12, - "files": [{"path": "patterns/02-code-smells/feature-envy.md"}], - }, - ]) - - mock_run.return_value = MagicMock(stdout=prs_output) + prs_output = json.dumps([{"number": 10}, {"number": 12}]) + pr10_files = json.dumps({"files": [{"path": "patterns/01-gof/singleton.md"}, {"path": "README.md"}]}) + pr12_files = json.dumps({"files": [{"path": "patterns/02-code-smells/feature-envy.md"}]}) + + mock_run.side_effect = [ + MagicMock(stdout=prs_output), + MagicMock(stdout=pr12_files), + ] siblings = check_claims.sibling_pr_paths(this_pr="10") self.assertNotIn("patterns/01-gof/singleton.md", siblings) self.assertEqual(siblings.get("patterns/02-code-smells/feature-envy.md"), 12) diff --git a/tools/check-claims.py b/tools/check-claims.py index 43d54d5a..02b97081 100644 --- a/tools/check-claims.py +++ b/tools/check-claims.py @@ -46,7 +46,7 @@ def published_on_main(path: str) -> bool: def sibling_pr_paths(this_pr: str) -> dict[str, int]: prs = json.loads( subprocess.run( - ["gh", "pr", "list", "--state", "open", "--json", "number,files"], + ["gh", "pr", "list", "--state", "open", "--json", "number"], capture_output=True, text=True, cwd=ROOT, @@ -59,8 +59,18 @@ def sibling_pr_paths(this_pr: str) -> dict[str, int]: num = pr.get("number") if num is None or str(num) == str(this_pr): continue - for f in pr.get("files", []): - p = f.get("path", "") if isinstance(f, dict) else "" + files = json.loads( + subprocess.run( + ["gh", "pr", "view", str(num), "--json", "files"], + capture_output=True, + text=True, + cwd=ROOT, + check=False, + ).stdout + or '{"files": []}' + ) + for f in files.get("files", []): + p = f.get("path", "") if p.startswith("patterns/") and p.endswith(".md"): claims[p] = num return claims diff --git a/tools/gen-by-problem-by-language.py b/tools/gen-by-problem-by-language.py index e172c88c..e4e5b689 100644 --- a/tools/gen-by-problem-by-language.py +++ b/tools/gen-by-problem-by-language.py @@ -177,8 +177,8 @@ def detect_mentions(section_text: str, lang_key: str) -> bool: "java": [r"\bjava\b"], "swift": [r"\bswift\b"], "kotlin": [r"\bkotlin\b"], - "csharp": [r"\bcsharp\b", r"c#"], - "cpp": [r"\bcpp\b", r"\bc\+\+\b"], + "csharp": [r"\bcsharp\b", r"\bc#"], + "cpp": [r"\bcpp\b", r"\bc\+\+"], } for pattern in terms.get(lang_key, []):