Skip to content

Refactor fetch config logic#2259

Merged
findolor merged 4 commits intomainfrom
local-db-fetch-config
Oct 30, 2025
Merged

Refactor fetch config logic#2259
findolor merged 4 commits intomainfrom
local-db-fetch-config

Conversation

@findolor
Copy link
Copy Markdown
Collaborator

@findolor findolor commented Oct 22, 2025

Motivation

See issue: #2221

Solution

  • Update FetchConfig to properly return errors in its constructor
  • Add tests

Constructor is not used at the moment but we are going to switch to it when we implement the local db configuration parsing with #2247

Checks

By submitting this for review, I'm confirming I've done the following:

  • made this PR as small as possible
  • unit-tested any new functionality
  • linked any relevant issues or PRs
  • included screenshots (if this involves a front-end change)

Summary by CodeRabbit

  • Refactor
    • Improved fetch configuration: stricter validation, clear error messages, and sensible defaults for chunking, concurrency, and retry settings.
  • Bug Fixes
    • Prevents invalid configuration values from causing runtime failures by validating inputs at construction time and surfacing readable errors.

@findolor findolor requested review from 0xgleb and hardyjosh October 22, 2025 05:39
@findolor findolor self-assigned this Oct 22, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 22, 2025

Walkthrough

Encapsulates and validates fetch configuration: FetchConfig fields made private, a new constructor with validation returns FetchConfigError variants, defaults provided, accessors added, call sites updated to use getters, and FetchConfigError is re-exported and mapped into LocalDbError.

Changes

Cohort / File(s) Summary
Configuration implementation
crates/common/src/local_db/fetch.rs
Adds FetchConfig with private fields, FetchConfig::new(...) -> Result<..., FetchConfigError>, associated DEFAULT_* constants, Default impl, public accessor methods (chunk_size(), max_concurrent_requests(), max_concurrent_blocks(), max_retry_attempts()), and FetchConfigError enum with four validation variants. Replaces direct field usage with accessor calls.
Module surface & error mapping
crates/common/src/local_db/mod.rs
Re-exports FetchConfigError (pub use fetch::{FetchConfig, FetchConfigError};) and adds LocalDbError::FetchConfigError(#[from] FetchConfigError) with readable message mapping.
Call-site updates
crates/common/src/local_db/token_fetch.rs
Replaces direct field accesses on FetchConfig with accessor calls in fetch_erc20_metadata_concurrent (e.g., max_concurrent_requests() and max_retry_attempts()), adapting concurrency/retry logic to use getters.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Caller as caller (tests / init)
  participant FetchConfig as FetchConfig::new
  participant Valid as Validation
  participant TokenFetch as fetch_erc20_metadata_concurrent
  participant LocalDbErr as LocalDbError mapping

  Caller->>FetchConfig: call new(chunk_size, max_req, max_blocks, max_retries)
  FetchConfig->>Valid: validate params
  alt valid
    Valid-->>FetchConfig: Ok(FetchConfig)
    FetchConfig-->>Caller: returns FetchConfig
    Caller->>TokenFetch: pass &FetchConfig
    TokenFetch->>FetchConfig: call accessors (chunk_size(), max_concurrent_requests(), max_retry_attempts())
    TokenFetch-->>Caller: proceed with fetch using values
  else invalid
    Valid-->>FetchConfig: Err(FetchConfigError)
    FetchConfig-->>Caller: returns FetchConfigError
    Caller->>LocalDbErr: propagate via From
    LocalDbErr-->>Caller: LocalDbError::FetchConfigError
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Review validation logic and error messages in fetch.rs.
  • Verify all previous direct field accesses were replaced with accessors (search for remaining usages).
  • Confirm LocalDbError conversion and readable message branch are correct.

Possibly related PRs

Suggested reviewers

  • hardyjosh
  • 0xgleb

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The PR title "Refactor fetch config logic" directly corresponds to the main changes in the changeset. The pull request refactors the FetchConfig struct by introducing a constructor-based pattern with validation, making fields private, and adding public accessor methods. The title is specific enough to convey that the change involves FetchConfig (referring to "fetch config logic"), and it accurately captures the primary nature of the work as a refactoring effort. The title is also concise, clear, and avoids vague or misleading terms, allowing a teammate scanning the commit history to understand that this involves structural changes to the FetchConfig implementation.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch local-db-fetch-config

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b7dd54f and 15305e4.

📒 Files selected for processing (3)
  • crates/common/src/local_db/fetch.rs (6 hunks)
  • crates/common/src/local_db/mod.rs (3 hunks)
  • crates/common/src/local_db/token_fetch.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/*/{src,tests,benches,examples}/**/*.rs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Rust code must pass clippy with all warnings denied (cargo clippy --workspace --all-targets --all-features -D warnings)

Files:

  • crates/common/src/local_db/fetch.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/token_fetch.rs
crates/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Rust code lives in the workspace under crates/* (e.g., cli, common, bindings, js_api, quote, subgraph, settings, math, integration_tests)

Files:

  • crates/common/src/local_db/fetch.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/token_fetch.rs
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Format Rust with nix develop -c cargo fmt --all
Lint Rust with nix develop -c rainix-rs-static (preconfigured flags)
Use snake_case for Rust crates/modules and PascalCase for types

Files:

  • crates/common/src/local_db/fetch.rs
  • crates/common/src/local_db/mod.rs
  • crates/common/src/local_db/token_fetch.rs
🧠 Learnings (1)
📚 Learning: 2025-07-09T07:42:48.458Z
Learnt from: findolor
PR: rainlanguage/rain.orderbook#1975
File: crates/js_api/src/config.rs:44-45
Timestamp: 2025-07-09T07:42:48.458Z
Learning: User findolor prefers to defer code improvements and refactoring suggestions to future PRs when they are not directly related to the current PR's scope, even when the suggestions are valid improvements.

Applied to files:

  • crates/common/src/local_db/fetch.rs
🧬 Code graph analysis (1)
crates/common/src/local_db/mod.rs (2)
crates/cli/src/commands/local_db/fetch_events.rs (3)
  • fetch (14-19)
  • fetch (28-41)
  • fetch (193-206)
crates/cli/src/commands/local_db/sync/data_source.rs (2)
  • fetch (49-50)
  • fetch (57-71)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: test
  • GitHub Check: git-clean
  • GitHub Check: test
  • GitHub Check: Deploy-Preview-Push
  • GitHub Check: Deploy-Docs-Preview
🔇 Additional comments (6)
crates/common/src/local_db/fetch.rs (4)

13-26: LGTM! Well-designed error type.

The error variants are clear, capture the invalid values, and provide helpful error messages. The use of thiserror::Error for automatic Display implementation is idiomatic.


42-71: LGTM! Constructor validation is thorough.

The validation logic correctly rejects all zero values and returns descriptive errors. The parameter order matches the struct field order, which aids readability.


73-87: LGTM! Accessor methods are straightforward.

The getter methods provide the necessary public API for the now-private fields.


392-428: LGTM! Comprehensive validation tests.

The tests cover all four validation scenarios and verify that default values are correctly set. The test names are descriptive and the assertions are clear.

crates/common/src/local_db/token_fetch.rs (1)

21-22: LGTM! Accessor methods used correctly.

The changes properly use max_concurrent_requests() and max_retry_attempts() accessor methods instead of direct field access, aligning with the new FetchConfig API.

crates/common/src/local_db/mod.rs (1)

14-14: LGTM! Clean error integration.

The changes properly expose FetchConfigError through the public API, integrate it into LocalDbError with automatic conversion (#[from]), and provide consistent error message formatting in to_readable_msg.

Also applies to: 125-126, 185-185


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

@findolor findolor linked an issue Oct 22, 2025 that may be closed by this pull request
@findolor
Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 22, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
crates/common/src/local_db/token_fetch.rs (1)

24-61: Simplify stream: use try_collect to short‑circuit and avoid a second pass.

Removes the intermediate Vec<Result<..>> and the manual loop.

Apply:

-    let results: Vec<Result<(Address, TokenInfo), LocalDbError>> =
-        futures::stream::iter(missing_addrs.into_iter().map(|addr| {
+    let successes: Vec<(Address, TokenInfo)> =
+        futures::stream::iter(missing_addrs.into_iter().map(|addr| {
             let rpcs = rpcs.clone();
             async move {
                 let erc20 = ERC20::new(rpcs, addr);
                 let result = retry_with_backoff(
                     || {
                         let erc20 = erc20.clone();
                         async move { erc20.token_info(None).await }
                     },
                     max_attempts,
                     should_retry_token_error,
                 )
                 .await;
 
                 match result {
-                    Ok(info) => Ok((addr, info)),
+                    Ok(info) => Ok::<_, LocalDbError>((addr, info)),
                     Err(RetryError::Operation(err)) => Err(LocalDbError::CustomError(format!(
                         "Failed to fetch token info for 0x{:x} after {} attempts: {}",
                         addr, max_attempts, err
                     ))),
                     Err(RetryError::Config { message }) => Err(LocalDbError::Config { message }),
                 }
             }
         }))
-        .buffer_unordered(concurrency)
-        .collect()
-        .await;
-
-    let mut successes: Vec<(Address, TokenInfo)> = Vec::new();
-    for r in results {
-        match r {
-            Ok(pair) => successes.push(pair),
-            Err(e) => return Err(e),
-        }
-    }
-    Ok(successes)
+        .buffer_unordered(concurrency)
+        .try_collect()
+        .await?;
+    Ok(successes)

And add the missing import:

-use futures::StreamExt;
+use futures::{StreamExt, TryStreamExt};
crates/common/src/local_db/fetch.rs (3)

323-357: Retry predicate: include transient HTTP/timeout conditions.

Increase resilience by retrying on common transient failures.

Apply:

-fn should_retry_local_db_error(error: &LocalDbError) -> bool {
-    matches!(error, LocalDbError::Rpc(_))
-}
+fn should_retry_local_db_error(error: &LocalDbError) -> bool {
+    matches!(
+        error,
+        LocalDbError::Rpc(_)
+            | LocalDbError::Timeout
+            | LocalDbError::HttpStatus { status }
+                if *status == 429 || (500..=599).contains(status)
+    )
+}

359-367: Minor perf nit: avoid repeated parses in sort.

Precompute block/log indices once to reduce duplicate parsing in comparator.


398-423: Convert block number overflow to InvalidBlockNumber error instead of panicking.

The conversion block_u256.to::<u64>() is a checked conversion that panics on overflow when the block number exceeds u64::MAX. Instead, use a fallible conversion method or add overflow detection to return InvalidBlockNumber error consistently with other parsing failures.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a36c5f4 and b7dd54f.

📒 Files selected for processing (3)
  • crates/common/src/local_db/fetch.rs (13 hunks)
  • crates/common/src/local_db/mod.rs (1 hunks)
  • crates/common/src/local_db/token_fetch.rs (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (17)
  • GitHub Check: git-clean
  • GitHub Check: test
  • GitHub Check: build-tauri (ubuntu-22.04, true)
  • GitHub Check: test
  • GitHub Check: test
  • GitHub Check: standard-tests (ubuntu-latest, rainix-sol-legal)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-sol-static)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-sol-test)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-sol-artifacts)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-wasm-test)
  • GitHub Check: standard-tests (ubuntu-latest, test-js-bindings)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-rs-artifacts, true)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-rs-static)
  • GitHub Check: standard-tests (ubuntu-latest, rainix-wasm-artifacts)
  • GitHub Check: standard-tests (ubuntu-latest, ob-rs-test, true)
  • GitHub Check: Deploy-Preview-Push
  • GitHub Check: Deploy-Docs-Preview
🔇 Additional comments (6)
crates/common/src/local_db/mod.rs (1)

13-13: Additive re‑export looks good.

Publicly exposing FetchConfigError matches the new constructor/validation flow and keeps error routing coherent via From<FetchConfigError> for LocalDbError.

crates/common/src/local_db/token_fetch.rs (1)

21-22: LGTM on accessor usage.

Switch to getters is correct and enforces validated, non‑zero values from the constructor/default.

crates/common/src/local_db/fetch.rs (4)

12-25: Good dedicated config‑validation errors.

Clear, precise variants with user‑friendly messages. Suits constructor validation.


27-33: Error routing is coherent.

From<FetchConfigError> for LocalDbError keeps callers on a single error type.


49-78: Constructor validation is correct.

All knobs validated for non‑zero; prevents runtime panics (e.g., zero concurrency) downstream.


288-311: Chunking logic handles boundaries well; constructor pattern properly enforced throughout codebase.

Use of saturating_* and min avoids overflow; loop termination covers u64::MAX edge. Verification confirms all FetchConfig instantiations across the codebase use either the new() constructor or Default trait—no direct struct literals bypassing validation were found.

Comment thread crates/common/src/local_db/fetch.rs Outdated
@findolor findolor added this to the LocalDB Implementation milestone Oct 22, 2025
Comment thread crates/common/src/local_db/fetch.rs Outdated
Comment on lines +27 to +32
impl From<FetchConfigError> for LocalDbError {
fn from(error: FetchConfigError) -> Self {
LocalDbError::Config {
message: error.to_string(),
}
}
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.

Why still squashing this to a string?

Base automatically changed from local-db-fetch-retry to main October 28, 2025 12:32
@findolor findolor requested a review from hardyjosh October 28, 2025 13:49
@findolor findolor merged commit 53be6f7 into main Oct 30, 2025
19 checks passed
@findolor findolor deleted the local-db-fetch-config branch October 30, 2025 16:56
@github-actions
Copy link
Copy Markdown
Contributor

@coderabbitai assess this PR size classification for the totality of the PR with the following criterias and report it in your comment:

S/M/L PR Classification Guidelines:

This guide helps classify merged pull requests by effort and complexity rather than just line count. The goal is to assess the difficulty and scope of changes after they have been completed.

Small (S)

Characteristics:

  • Simple bug fixes, typos, or minor refactoring
  • Single-purpose changes affecting 1-2 files
  • Documentation updates
  • Configuration tweaks
  • Changes that require minimal context to review

Review Effort: Would have taken 5-10 minutes

Examples:

  • Fix typo in variable name
  • Update README with new instructions
  • Adjust configuration values
  • Simple one-line bug fixes
  • Import statement cleanup

Medium (M)

Characteristics:

  • Feature additions or enhancements
  • Refactoring that touches multiple files but maintains existing behavior
  • Breaking changes with backward compatibility
  • Changes requiring some domain knowledge to review

Review Effort: Would have taken 15-30 minutes

Examples:

  • Add new feature or component
  • Refactor common utility functions
  • Update dependencies with minor breaking changes
  • Add new component with tests
  • Performance optimizations
  • More complex bug fixes

Large (L)

Characteristics:

  • Major feature implementations
  • Breaking changes or API redesigns
  • Complex refactoring across multiple modules
  • New architectural patterns or significant design changes
  • Changes requiring deep context and multiple review rounds

Review Effort: Would have taken 45+ minutes

Examples:

  • Complete new feature with frontend/backend changes
  • Protocol upgrades or breaking changes
  • Major architectural refactoring
  • Framework or technology upgrades

Additional Factors to Consider

When deciding between sizes, also consider:

  • Test coverage impact: More comprehensive test changes lean toward larger classification
  • Risk level: Changes to critical systems bump up a size category
  • Team familiarity: Novel patterns or technologies increase complexity

Notes:

  • the assessment must be for the totality of the PR, that means comparing the base branch to the last commit of the PR
  • the assessment output must be exactly one of: S, M or L (single-line comment) in format of: SIZE={S/M/L}
  • do not include any additional text, only the size classification
  • your assessment comment must not include tips or additional sections
  • do NOT tag me or anyone else on your comment

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 30, 2025

Tip

For best results, initiate chat on the files or code changes.

SIZE=M


🧠 Learnings used
Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:24:42.275Z
Learning: For PR #1884, after each commit review, I should provide a new comment with a PR size report in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding irrelevant files such as lock files (package-lock.json, cargo.lock, etc.).

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:24:42.275Z
Learning: After each commit in PR #1884, I should provide a new comment with the PR size report in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`. The report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the format: "TOTAL=number ADDITIONS=number DELETIONS=number". This report should exclude irrelevant files such as lock files (e.g., package-lock.json, cargo.lock).

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:25:47.873Z
Learning: After each new commit review for rainlanguage/rain.orderbook repository, generate a PR size report in a separate comment with the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". This report should exclude irrelevant files such as lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T22:14:22.646Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, I must consistently report the PR size after EVERY new commit in the exact format "TOTAL=number\nADDITIONS=number\nDELETIONS=number" without any additional text or formatting blocks. The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock) and can be included either as part of the review or as a separate comment.

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T22:46:08.530Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, the PR size report should be the only content in the comment - no text before it, no text after it, no formatting blocks, just the raw report in the exact format: "TOTAL=number\nADDITIONS=number\nDELETIONS=number". The report must exclude lock files (package-lock.json, yarn.lock, pnpm-lock.yaml, cargo.lock).

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: rouzwelt
PR: rainlanguage/rain.orderbook#0
File: :0-0
Timestamp: 2025-05-21T21:24:53.708Z
Learning: For PR #1884 in rainlanguage/rain.orderbook, provide a separate comment after each review with PR size statistics in the format: `TOTAL=number ADDITIONS=number DELETIONS=number`, excluding lock files like package-lock.json and cargo.lock.

Learnt from: findolor
PR: rainlanguage/rain.orderbook#1971
File: .github/workflows/vercel-docs-prod.yaml:32-34
Timestamp: 2025-07-11T12:30:09.245Z
Learning: findolor prefers not to pin Node versions explicitly in GitHub Actions workflows when using Nix with webapp-shell, considering the current setup sufficient for deterministic builds in the rainlanguage/rain.orderbook project.

Learnt from: findolor
PR: rainlanguage/rain.orderbook#1971
File: .github/workflows/vercel-docs-prod.yaml:10-14
Timestamp: 2025-07-11T12:29:49.284Z
Learning: In GitHub Actions workflows for the rainlanguage/rain.orderbook project, findolor is comfortable with job names that may seem misleading (like "Deploy-Docs-Preview" in a production workflow) when there's only one job in the workflow, as the context makes it clear enough.

Learnt from: findolor
PR: rainlanguage/rain.orderbook#2117
File: crates/js_api/src/gui/select_tokens.rs:421-424
Timestamp: 2025-09-02T08:04:34.729Z
Learning: User findolor in the rainlanguage/rain.orderbook codebase prefers not to change test code when tests are already passing, even if there appear to be type mismatches or potential issues. Working tests should be left alone unless there are actual errors.

Learnt from: findolor
PR: rainlanguage/rain.orderbook#1975
File: crates/js_api/src/config.rs:44-45
Timestamp: 2025-07-09T07:42:48.458Z
Learning: User findolor prefers to defer code improvements and refactoring suggestions to future PRs when they are not directly related to the current PR's scope, even when the suggestions are valid improvements.

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.

Validate FetchConfig Parameters Instead of Clamping

3 participants