Skip to content

Move Bundler settings parsing out of ruby_crawler into formats/gem/settings.rs, and read .bundle/config keys with one parser (two drifted today) #1935

Open

Description

[agent] Filed by the scheduled architecture audit (audit-core). Register: register.

Kind: refactor (placement plus a duplicated parser; extends E20/#833). Register ID: A57.

Problem

  • Bundler settings logic lives in the crawler. About 1,260 lines of it sit in crawlers/ruby_crawler.rs L1270-L2530:`` config scalar parsing and unquoting, the global and app config locations, the cache dir, the loaded manifest and lockfile, and the moved root.
  • Format modules import from that crawler. formats/gem/manifest.rs L58 and formats/gem/mirror.rs L16 import from crawlers::ruby_crawler, and so do vendor/gem.rs, vendor/lock_inventory/gem.rs, vex/discover/gem.rs, hosted/engine.rs, patch/redirect/upstream/gem.rs and the CLI.
  • The .bundle/config key line is parsed twice, and the copies drifted:
    • ruby_crawler::bundle_config_setting_with L2449-L2461 matches KEY: as a plain prefix: it accepts KEY:value with no space, does not decode quoted keys, and does not normalize legacy keys.
    • formats/gem/mirror.rs L125-L230 (config_key and the key loop) requires ": ", decodes Bundler 4.1's quoted keys, and normalizes dot/dash keys.
    • The drift is latent for BUNDLE_PATH/BUNDLE_GEMFILE/BUNDLE_LOCKFILE, because Bundler quotes only keys that contain :.
  • The Gemfile/gems.rb manifest name list is written twice: ruby_crawler.rs L276 and hosted/engine.rs L1167. formats/gem/mod.rs already holds BUNDLER_LOCKS.

Proposed change

This is a tracking issue; do the steps in order.

  1. Create formats/gem/settings.rs and move the pure parsers there: the config-map parse (one key-line reader, following mirror.rs's rules), unquote, bundler_truthy, and the tier rules from Bundler's path tier rule is written twice in ruby_crawler, and store discovery ignores BUNDLE_DISABLE_SHARED_GEMS: "false" #1931. Also move a BUNDLER_MANIFEST_FILES const there.
  2. Leave only file and env I/O in the crawler, as a BundlerEnv::ambient() snapshot that replaces the 4 copies of the ambient-env tuple (L47, L169, L591, L670).
  3. Repoint the formats/gem, vendor, vex, hosted and redirect imports.

Size

About 10 files; mostly moves (~1,000 lines moved, ~−80 net).

Acceptance criteria

  • Behavior is unchanged: the ruby crawler, gem vendor, gem redirect and mirror tests pass.
  • formats/gem/* no longer imports crawlers::*.
  • One .bundle/config key parser remains.

Activity

  1. added
    arch-auditFiled by a scheduled architecture audit routine (see the architecture review discussion)
    refactorStructural change: duplicated code or logic, missing abstraction, layering, dead code
    on Nov 1, 2026
  2. mikolalysenko commented on Nov 1, 2026

    @mikolalysenko
    CollaboratorAuthor

    [agent] Triage: priority:p1 (Bundler). Overlaps #1931: step 1 here moves the Bundler path tier rule, which #1931 fixes first. Different causes (key-line parser drift vs tier-rule drift), so tracked separately; land #1931 before this move.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent:triagedarch-auditFiled by a scheduled architecture audit routine (see the architecture review discussion)priority:p1refactorStructural change: duplicated code or logic, missing abstraction, layering, dead code

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions