Skip to main content

Structural-refactor framework for Galaxy tool XML — tier 2 of the galaxy-tool-source ecosystem.

Project description

galaxy-tool-codemod

A LibCST-shaped framework for structural refactors of Galaxy tool XML. The structure tier of the Galaxy refactoring architecture:

Tier Layer Package Role
0.5 rule metadata galaxy-tool-refactor-rules shared RuleMeta descriptor
1 parsing & validation galaxy-tool-source parse · profile-aware validate · typed view
2 structure galaxy-tool-codemod (this repo) structural refactors
3 formatting galaxy-tool-fmt cosmetic black-like formatter
3.5 advisory checks galaxy-tool-lint detect-only checks
3.6 rule registry / rulesets galaxy-tool-refactor-registry unified rules + rulesets (facade)
4 app / CLI galaxy-tool-refactor-cli composes the tiers via the facade (format / upgrade / check)

Status

M1–M3.5 shipped: framework primitives (Module, Cursor, CodemodCommand), the corpus_check.py codemod sweep (retains failures as regression fixtures), and two ordered pipeline contracts run by the tier-4 app (galaxy-tool-refactor-cli):

  • canonical_codemods() = FixTypos → NormalizeBooleanValues → RepairHelpRst → TrimAttributeWhitespace → ReplaceOutputElement → DropRedundantParamName → ReorderParamAttributes → ReorderToolAttributes → ReorderToolChildren → WrapCommandCdata → WrapHelpCdata → SingleQuoteCommandVars — the safe canonical/format pipeline (the app's format command), derived from the codemods declaring the "default" ruleset and ordered by meta.order (no hardcoded tuple, §36). Never changes profile=.
  • AUTO_UPGRADE_CODEMODS = FixTypos → NormalizeBooleanValues → UpgradeToLatest — the opt-in profile-upgrade pipeline (the app's upgrade command).

The codemods:

  • FixTypos — repair near-miss spelling typos so a well-formed-but-globally-invalid tool validates (in both pipelines);
  • NormalizeBooleanValues — rewrite Python-style boolean attribute values (True/Yes/…) to canonical xs:boolean so a globally-invalid tool validates; schema-type-aware and behaviour-preserving (in both pipelines);
  • UpgradeToLatest — loop UpdateProfile (declare the newest profile the tool validates at, bump-up-only) + single-step upgrade_vN codemods from upgrades.py to bring a tool to the latest profile (UpdateProfile is a building block run inside this loop, not a separate pipeline entry);
  • ReorderParamAttributes / ReorderToolAttributes — IUC <param> and documented <tool> attribute order;
  • ReorderToolChildren — IUC <tool> child-element order (best-practice #52); validity-safe because the <tool> content model is order-free (xs:all).

Every bundled codemod carries a RuleMeta GTR code; catalog.coded_codemods() is the authoritative enumeration (the prose list above is illustrative — format also runs the planemo-parity fixers GTR035–037 and the partition .1 fixers GTR018.1/019.1/020.1 and GTR089.1 RepairHelpRst). See docs/decisions.md §15–37.

The upgrade registry is grown empirically: the corpus_check codemod sweep reports STICKING POINT versions still needing an upgrade_vN, and each upgrade_vN's advance count. Upgrades shipped: Upgrade24_1 (24.1 → 24.2), Upgrade25_1 (25.1 → 26.0). See docs/decisions.md §11–14.

M4 (matcher language) and M5 (Cheetah reference resolver) are not yet implemented — see PLAN.md.

Public API

from pathlib import Path

from galaxy_tool_codemod.parse import parse_module
from galaxy_tool_codemod.canonical import canonical_codemods

module = parse_module(Path("tool.xml"))
for codemod_cls in canonical_codemods():
    codemod_cls().apply(module)
# module.document.tree now reflects the canonical structural form
Symbol Purpose
parse.parse_module(source) Entry point — accepts Path | bytes | ToolDocument.
module.Module Frozen wrapper carrying document, model, cursor.
cursor.Cursor lxml-backed view with read + typed mutation primitives.
codemod.CodemodCommand Base for user-authored codemods (tag-PascalCase dispatch).
codemods.fix_typos.FixTypos Repair near-miss typos until a globally-invalid tool validates (canonical, runs first).
codemods.normalize_boolean_values.NormalizeBooleanValues Normalize Python-style boolean values (True/Yes/…) to xs:boolean until a globally-invalid tool validates (canonical, GTR017).
codemods.repair_help_rst.RepairHelpRst Repair deterministically-fixable invalid <help> reStructuredText behind a render-equivalence gate (canonical, GTR089.1; the fix half of the GTR089 partition).
upgrades.UpgradeToLatest In AUTO_UPGRADE_CODEMODS. Loop UpdateProfile + single-step upgrades to reach the latest profile.
codemods.update_profile.UpdateProfile Declare the newest profile the tool validates at, bump-up-only. Building block run inside UpgradeToLatest — not itself a pipeline member.
upgrades.UPGRADE_CODEMODS Registry: sticking version → its single-step upgrade codemod.
codemods.upgrade_24_1.Upgrade24_1 Single-step 24.1 → 24.2 (normalize format / ftype).
codemods.upgrade_25_1.Upgrade25_1 Single-step 25.1 → 26.0 (drop obsolete <trackster_conf>).
codemods.reorder_param_attributes.ReorderParamAttributes IUC <param> attribute order.
codemods.reorder_tool_attributes.ReorderToolAttributes Documented <tool> attribute prefix.
codemods.reorder_tool_children.ReorderToolChildren IUC <tool> child-element order (#52).
canonical.canonical_codemods() Ordered canonical/format pipeline (the app's format command).
canonical.AUTO_UPGRADE_CODEMODS Ordered opt-in upgrade pipeline (the app's upgrade command).
catalog.coded_codemods Every GTR-coded codemod, sorted by code (for the rule registry).
eligibility.corpus_test_profile Codemod-sweep validation-profile policy (sweep default).

Setup

From the workspace root:

uv sync
uv run --package galaxy-tool-codemod pytest galaxy-tool-codemod/tests/

Relationship to fmt and the app

Neither galaxy-tool-fmt's library nor its CLI depends on this package — fmt is cosmetic-only. Orchestration lives one tier up: the galaxy-tool-refactor app CLI (galaxy-tool-refactor-cli) hard-depends on this package and on fmt, runs canonical_codemods() (its format command) or AUTO_UPGRADE_CODEMODS (its upgrade command), and writes the result through fmt's serializer.

Coding standards

Hand-written code follows dignified-python (vendored at .claude/skills/dignified-python/). See CLAUDE.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

galaxy_tool_codemod-0.3.0.tar.gz (209.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

galaxy_tool_codemod-0.3.0-py3-none-any.whl (109.9 kB view details)

Uploaded Python 3

File details

Details for the file galaxy_tool_codemod-0.3.0.tar.gz.

File metadata

  • Download URL: galaxy_tool_codemod-0.3.0.tar.gz
  • Upload date:
  • Size: 209.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for galaxy_tool_codemod-0.3.0.tar.gz
Algorithm Hash digest
SHA256 3d3d9b33689a3fb8fad74ca8981794f1125026e698abb79880d4da0d91ada1c9
MD5 6c397aa5c3285a0d53953fe510e79376
BLAKE2b-256 b6168a169d4e1f8b8206544f869edaf38e1791117ba53f006a6881ef8651a4c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for galaxy_tool_codemod-0.3.0.tar.gz:

Publisher: release.yml on richard-burhans/galaxy-tool-refactor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file galaxy_tool_codemod-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for galaxy_tool_codemod-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c93331d79d825d3f3d5148e99d42875823c2dbb03de076dd36e904cc216e1125
MD5 bc5c74a6181e4db17308292a2a89e2bd
BLAKE2b-256 6a7be0b45a7cb34d730097eb4d44203af8470464e9f63d402acb80bb9b05c9cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for galaxy_tool_codemod-0.3.0-py3-none-any.whl:

Publisher: release.yml on richard-burhans/galaxy-tool-refactor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page