Skip to main content

A Python refactoring CLI tool with structured edits and pattern transforms

Project description

emend

A Python refactoring CLI built on LibCST. The name means "to make corrections to a text" — which is what it does, but with AST-aware precision instead of find-and-replace.

Two complementary systems: structured edits use selectors like file.py::func[params][0] for precise changes to symbol metadata, and pattern transforms use capture variables like print($X)logger.info($X) for code-pattern search and replace.

Installation

Using uv with free-threaded Python (recommended for best performance)

uv tool install --python 3.14t emend

Python 3.13+ ships a free-threaded variant (3.13t, 3.14t) that removes the GIL. emend's Rust core (emend_core) is already GIL-free (built with #[pymodule(gil_used = false)]), so on free-threaded Python it can run parallel file scans with no lock contention — meaning search, lint, refs, and rename across large codebases are significantly faster.

The --python 3.14t flag tells uv to use the free-threaded interpreter. Use 3.13t if you prefer the stable free-threaded release:

uv tool install --python 3.13t emend   # free-threaded 3.13 (stable)
uv tool install --python 3.14t emend   # free-threaded 3.14 (latest)

Using uv (standard Python)

uv tool install emend

Using pip

pip install emend

Run emend --help to verify. Full documentation at lucaswiman.github.io/emend.

Usage

emend <command> [options]

Workflow

All mutating commands default to dry-run, showing a diff of proposed changes. Re-run with --apply to write them. You'll probably want to run a formatter (black/ruff/isort) afterward, since emend doesn't try to preserve exact formatting.

Selector Syntax

Three types of selectors:

Symbol Selectors

file.py::Class.method.nested   # Nested symbol path
file.py::func                  # Module-level symbol

Extended Selectors (with components)

file.py::func[params]           # Function parameters
file.py::func[params][ctx]      # Specific parameter (by name)
file.py::func[params][0]        # Specific parameter (by index)
file.py::func[returns]          # Return annotation
file.py::func[decorators]       # Decorator list
file.py::MyClass[bases]         # Base classes
file.py::func[body]             # Function body

Pseudo-class Selectors

file.py::func[params]:KEYWORD_ONLY       # Keyword-only parameter slot
file.py::func[params]:POSITIONAL_ONLY    # Positional-only parameter slot

Line Selectors

file.py:42                      # Single line
file.py:42-100                  # Line range

Wildcard Selectors

file.py::*[params]              # All function parameters
file.py::Test*[decorators]      # Test class parameters
file.py::*.*[returns]           # All method return types
file.py::Class.*[body]          # All method bodies in Class

Wildcards support glob patterns:

  • * - Match any symbol at this level
  • Test* - Match symbols starting with Test
  • *.* - Match any method in any class
  • Class.* - Match any method in Class

Selector Grammar (Lark)

start: selector

selector: file_path DOUBLE_COLON symbol_path? component*

file_path: PATH
symbol_path: symbol_segment ("." symbol_segment)*
symbol_segment: WILDCARD | IDENTIFIER
component: "[" COMPONENT_NAME "]" accessor? pseudo_class?
accessor: "[" (IDENTIFIER | INT) "]"
pseudo_class: PSEUDO_CLASS

COMPONENT_NAME: "params" | "returns" | "decorators" | "bases" | "body" | "imports"
DOUBLE_COLON: "::"
PATH: /[^:]+/
WILDCARD: "*" | /[a-zA-Z_*][a-zA-Z0-9_*]*/
IDENTIFIER: /[a-zA-Z_][a-zA-Z0-9_]*/
INT: /-?\d+/
PSEUDO_CLASS: /:KEYWORD_ONLY|:POSITIONAL_ONLY|:POSITIONAL_OR_KEYWORD/

Commands

Search & Read

search - Unified search with auto-detection

  • Pattern mode: emend search 'print($X)' file.py
  • Lookup mode: emend search file.py::func
  • Summary mode: emend search file.py (list symbols)
  • Filters: --kind, --name, --returns, --depth, --has-param, --output, --where, --imported-from, --scope-local
  • Output formats: code, location, selector, summary, metadata, json, count, summary::flat, code::dedent
  • Also available as: query, show, get, lookup, find for intuitive workflows

Edit & Transform

edit - Modify or remove existing symbol components

  • Replace: emend edit file.py::func[returns] "int" --apply
  • Insert: emend edit file.py::func[params] "new_param" --before ctx --apply
  • Remove: emend edit file.py::func[params][old_param] --rm --apply
  • Wildcards: emend edit 'file.py::*[decorators]' "@dataclass" --apply

add - Insert new items into list components (alternative to edit)

  • emend add file.py::func[params] "timeout: int = 30" --apply
  • emend add "file.py::func[params]:KEYWORD_ONLY" "debug: bool" --apply

replace - Replace pattern matches with pattern-based substitution

  • emend replace 'print($X)' 'logger.info($X)' file.py --apply
  • Scope: --where (syntax: 'def', 'class', 'MyClass.method', 'not ...')

Symbol Management

refs - Find all references to a symbol across the project

  • emend refs models.py::User
  • Filters: --writes-only, --reads-only, --calls-only
  • Output: --json for JSON output (default shows file:line)

rename - Rename a symbol or module across the project

  • Symbol: emend rename models.py::User --to Account --apply
  • Module: emend rename models.py --to accounts.py --apply
  • Filters: --docs, --no-hierarchy, --unsure

move - Move a symbol or module with automatic import updates

  • Symbol: emend move utils.py::parse_date helpers/dates.py --apply
  • Module: emend move utils.py helpers/utils.py --apply

copy-to - Copy a symbol to another file

  • emend copy-to workflow.py::Builder._build.helper tasks.py --dedent --apply

Utilities

batch - Apply multiple refactoring operations from YAML/JSON file

  • emend batch rules.json --apply

lint - Lint files using pattern rules from .emend/patterns.yaml

  • emend lint src/
  • emend lint src/ --fix to auto-fix issues
  • emend lint src/ --rule no-print to run a single rule
  • See Linting documentation for full details

deadcode - Find potentially dead (unreferenced) code

  • emend deadcode src/
  • emend deadcode . --kind function --json
  • emend deadcode src/ --exclude-references-from tests/

graph - Generate a call graph for functions in a file

  • emend graph src/module.py --format plain
  • Formats: plain, json, dot

Examples

Search & Read Examples

# Search by pattern (pattern mode)
emend search 'print($X)' src/
emend search 'assertEqual($A, $B)' tests/ --output count

# Search by symbol (lookup mode)
emend search file.py::func
emend search src/ --kind function --name test_*
emend search file.py --output json

# Extract function parameters
emend search api.py::handler[params]
emend search 'api.py::*[params]'  # Wildcard: all function params in file

# Get return types
emend search 'src/**/*.py::*[returns]' --output metadata

# List symbols in a module
emend search file.py                          # Tree view
emend search file.py --output summary::flat   # Flat list
emend search file.py --depth 2                # Limit nesting depth

Edit Examples

# Update return type
emend edit api.py::handler[returns] "Response" --apply

# Add parameter with default value
emend edit api.py::handler[params] "timeout: int = 30" --apply

# Add keyword-only parameter
emend edit "api.py::handler[params]:KEYWORD_ONLY" "debug: bool" --apply

# Insert parameter before specific param
emend edit api.py::handler[params] "ctx: Context" --before user_id --apply

# Remove a specific parameter
emend edit api.py::handler[params][deprecated_arg] --rm --apply

# Edit multiple symbols at once (wildcards)
emend edit 'file.py::*[decorators]' "@dataclass" --apply

Pattern Transform Examples

# Simple find and replace (dry-run by default)
emend replace 'print($X)' 'logger.info($X)' file.py

# Replace within a specific scope
emend replace 'old_var' 'new_var' api.py --where process --apply

# Replace with pattern capture
emend replace 'get_field($N)' 'field$N' api.py --where process --apply

# String content interpolation: ${X.content} strips quotes from a captured string literal
emend replace 'Union["$X", $Y]' '$X | $Y' src/ --apply

# Find all pattern matches
emend search 'print($X)' src/ --output location

# Multi-rule batch operations
emend batch rules.json --apply

Symbol Management Examples

# Find all references to a symbol
emend refs models.py::User --json
emend refs models.py::User --writes-only    # Only write references
emend refs models.py::User --calls-only     # Only function calls

# Rename a symbol project-wide
emend rename models.py::User --to Account --apply

# Move a symbol to another file (updates imports)
emend move utils.py::parse_date helpers/dates.py --apply

# Copy a symbol to another file
emend copy-to workflow.py::Builder._build.helper tasks.py --dedent --apply

# List symbols using search
emend search workflow.py --depth 3

Pattern Syntax

Patterns support metavariables for capturing:

# Single expression
emend find 'print($MSG)' src/

# Multiple arguments with capture
emend find 'func($A, $B)' src/

# Variable arguments
emend find 'func($...ARGS)' src/

# Type constraints
emend find 'range($N:int)' src/

# Anonymous metavariables
emend find 'func($_, $ARG)' src/

# Structural constraints (via --where)
emend find 'print($X)' src/ --where 'async def'
emend find 'await $X' src/ --where 'not if __debug__'

# Supported pattern types:
#   Literals: $X, $MSG:str, $N:int, 3.14
#   Calls: func($X), obj.method($A, $B)
#   Operations: $A + $B, $A and $B, not $X, $X[$Y]
#   Collections: ($A, $B), [$X, $Y], {$K: $V}
#   Control: return $X, assert $A == $B, raise $EXC

Pattern Grammar (Lark)

start: pattern

pattern: (code_chunk | metavar)+

metavar: DOLLAR (ELLIPSIS)? METAVAR_NAME TYPE_CONSTRAINT?
       | DOLLAR UNDERSCORE

DOLLAR: "$"
ELLIPSIS: "..."
UNDERSCORE: "_"
METAVAR_NAME: /[A-Z][A-Z0-9_]*/
TYPE_CONSTRAINT: /:!?(?:expr|stmt|identifier|int|str|float|call|attr|any)/
code_chunk: /[^$:]+/ | ":"

The code_chunk rule excludes colons (/[^$:]+/) to prevent consuming colons that are part of type constraints (e.g., $MSG:str). A standalone colon is matched by the alternative | ":" for patterns containing colons outside of type constraints.

Diff Patch Format

- pattern_to_find
+ replacement_pattern

- another_pattern
+ another_replacement

Lines prefixed with - are matched; corresponding + lines are the replacement. Blank lines separate rules.

Linting

emend includes a pattern-based linter. Define rules in .emend/patterns.yaml and check your code for violations:

# .emend/patterns.yaml
macros:
  print_call: "print($...ARGS)"

rules:
  no-print:
    find: "{print_call}"
    not-inside: "def test_*"
    message: "Use logger instead of print"
    replace: "logger.info($...ARGS)"

  no-open-without-encoding:
    find: "open($PATH)"
    message: "Specify encoding when calling open()"
    replace: "open($PATH, encoding='utf-8')"
# Check for violations
emend lint src/

# Auto-fix violations that have a replace rule
emend lint src/ --fix

# Run only a specific rule
emend lint src/ --rule no-print

Suppress violations inline with # noqa comments:

print("keep this")  # noqa
print("keep this")  # noqa: emend:no-print
print("keep this")  # noqa: E501, emend:no-print  # mixed with other linters

Dead code detection

emend includes a deadcode section in .emend/patterns.yaml to detect unreferenced symbols as part of linting:

# .emend/patterns.yaml
deadcode: true

# Or with options:
deadcode:
  enabled: true
  kind: function                          # Only functions (or "class")
  exclude-references-from: ["tests/"]     # Ignore refs from tests
  include-private: false                  # Skip _private symbols
  strings-count-as-references: true       # String literals count as refs
  message: "Symbol appears to be unused"
# Run as part of lint
emend lint src/

# Or use the standalone command
emend deadcode src/
emend deadcode src/ --exclude-references-from tests/ --json

Suppress false positives inline:

def my_entry_point():  # noqa: emend:deadcode
    ...

pre-commit integration

emend can run as a pre-commit hook. Add to your .pre-commit-config.yaml:

repos:
  - repo: https://github.com/lucaswiman/emend
    rev: v0.2.0  # replace with desired version tag
    hooks:
      - id: emend-lint

This runs emend lint on staged Python files using your .emend/patterns.yaml config.

To auto-fix violations, add args: ["--fix"] to the hook configuration.

Development

Installing from Source

Clone the repository and install for development:

git clone https://github.com/lucaswiman/emend
cd emend

# Using make (creates a 3.14t venv, compiles the Rust extension, installs dev deps)
make venv

# Or manually (requires maturin and a Rust toolchain):
uv venv .venv --python 3.14t
uv pip install maturin
.venv/bin/maturin develop -E dev

Running Tests

# Run all tests
make test

# Run specific test file
make test TESTS=tests/test_emend/test_add_parameter.py

# Run specific test
make test TESTS="tests/test_emend/test_add_parameter.py::test_add_parameter_with_default"

Project Structure

emend/
├── src/emend/
│   ├── cli.py                # CLI entry point, argument parsing
│   ├── transform.py          # Transform primitives (get/set/add/remove/find/replace)
│   ├── pattern.py            # Pattern parsing and compilation
│   ├── query.py              # Symbol querying with filters
│   ├── ast_commands.py       # AST-based command implementations
│   ├── ast_utils.py          # AST traversal utilities
│   ├── component_selector.py # Extended selector parsing
│   ├── lint.py               # Pattern-based linter engine
│   └── grammars/
│       ├── selector.lark     # Extended selector grammar
│       └── pattern.lark      # Pattern grammar
├── rust/                     # emend_core Rust extension (bundled in wheel)
│   ├── src/lib.rs            # PyO3 bindings, GIL-free module definition
│   └── Cargo.toml
├── tests/test_emend/         # Test suite
├── Makefile
└── pyproject.toml            # maturin build (bundles Rust + Python in one wheel)

License

MPL 2.0

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

emend-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (705.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

emend-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (667.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

emend-0.2.1-cp312-cp312-win_amd64.whl (504.1 kB view details)

Uploaded CPython 3.12Windows x86-64

emend-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (705.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

emend-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (667.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

emend-0.2.1-cp312-cp312-macosx_11_0_arm64.whl (618.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

emend-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl (631.0 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

emend-0.2.1-cp311-cp311-win_amd64.whl (505.3 kB view details)

Uploaded CPython 3.11Windows x86-64

emend-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (706.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

emend-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (668.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

emend-0.2.1-cp311-cp311-macosx_11_0_arm64.whl (620.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

emend-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl (632.3 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

emend-0.2.1-cp310-cp310-win_amd64.whl (505.2 kB view details)

Uploaded CPython 3.10Windows x86-64

emend-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (706.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

emend-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (668.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

emend-0.2.1-cp310-cp310-macosx_11_0_arm64.whl (621.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

emend-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl (632.9 kB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file emend-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 410d6383e11b25db7686ae71f2f334d01d89fef050254da9d0f41f4f7e95c143
MD5 5a18a52ab85738b40685256cf2452c09
BLAKE2b-256 ba6f94641fa966d388b10c809b612516c0f0c6227da4af9084cad11a3939470a

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 09fda4f15e4dbb91c435bb5275146dcda54563984f9651792d6cc45d446b1ad9
MD5 327e82a837423f2921f6a423a4985dcd
BLAKE2b-256 bfa669c79106534b6ddefd1f619349b62693b7b3909fdcb1ef66174207bfce6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: emend-0.2.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 504.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for emend-0.2.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 47febd132101769a679687bc277985a6bdb9ff94063b70253677a1bde831fbef
MD5 ea611430ba05b44723580a66c111dae9
BLAKE2b-256 2810f8dded2227a4f58942ef8fba07d89f9adfb6a5eb20536b820f7eab92674f

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 34782e9e5ff6531a3a3609984e84a73a902b7b92b0cbef35a90e89bf865776cf
MD5 f3cac0098d51d7973e4be2bd870e872f
BLAKE2b-256 895d61d3ea262680b428d77f1faf3fca7c4651454689b4717114ee8238bf33a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cd170c367f3dc1287f33e1e4260da0e3db8015fe9b2395ca767686e7a82f433f
MD5 951de24cbe4fa4efce5928dd0a2817ea
BLAKE2b-256 52828e3d74fd91a1abb5875051e21a899a87aa1d7f0bd9d20bd7383fd6630812

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 78b9f11d087cf39cd4040c9baa6905443d44738063ca3b9640f19fe9f5248784
MD5 d291d46e6671cf2b7f0677b954ec7c38
BLAKE2b-256 98033ee8f12124e396e9b77c993d1033c839f365fd815d355e1b06b8f0c7bb02

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8dcad08ffccbc4ecaeab6f12066219a527a40dd03647ee381718d05f7973c8aa
MD5 d9e003bfd9c9eb8764f588fba3f84165
BLAKE2b-256 c8e5ecd4501d70df7891a6aa0920f674beff001c46b07febf83f7f5c65a9003c

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: emend-0.2.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 505.3 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for emend-0.2.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7eb7b1e58986127b8404c444312e29416001ccb0b1396964272d080eca04a85c
MD5 08a1be88ab6bd6e8adcc791eeff5a9cb
BLAKE2b-256 338d3ffac1e8513ee4f0d658db549aedb094870f6aa898e6e5e73cc3b4077e86

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp311-cp311-win_amd64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d4d676f04d2207ddaef28c95c16afb0b2aa033df84ae4434a140867c45d7f7f6
MD5 1eaf08aceabb2a93c534689309a61546
BLAKE2b-256 1b7c0c771401726074ed08bbb49378d7162aaf3cc1b890d9ef25d81b1f56cc20

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9f7dc715dc25737e985e8169bf49e544a4b2c65ee9c73fb1fac77cba8c413e04
MD5 ef8cc253f0c8974269e8c53bb0a8f747
BLAKE2b-256 cf368bf306681a1658f55c01504a797da73837a275aee0f01080cfcb2e5e78ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88b4f5eae36ee56dd574211ef9692ea830d5e6047380ecc60642174ef83d5775
MD5 bcb3c86d3b9c801345ef735725eb9762
BLAKE2b-256 5a1d046cd368931bb6be5cecad771609368518b081c52468212a4609a7bc5ce6

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 39c06d5cd64295086eeefdf8850e135dae9279969e76863ead480e608206e644
MD5 7c312730c80999296bad42069edd9242
BLAKE2b-256 5bf84e1809f143fe656d64e158c0a2f393254ce043d2ba6588992de6d20c5776

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: emend-0.2.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 505.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for emend-0.2.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2e8679ff52aa3ce2d4c551fbd11814819fd5f89aa51b0cd65cea20e27423cd61
MD5 42998f48c5cb5a078e16b5a355928894
BLAKE2b-256 c8d5ce3fa89d0f3cc95a5f5819aa1240425983e5bf7a1550bd870d5ec6832c1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp310-cp310-win_amd64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f7b098f16612203c3365c248996c6af19a2d8eca8a9fd008272ff4f959f0b953
MD5 8cc7f24dd6b3eae48f197f91b5bba50d
BLAKE2b-256 d222a3365bb29ee6cdcb354255a4a5167419cfe508a25e6a10b126f307bb1d89

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f64a1e4d3b6895d05d9378c195958f09bc3be2658e0e5ada2cc3d4011209f2df
MD5 2fca1f560aeb1ca8bba188af4c6ce314
BLAKE2b-256 6a3c5596922f89bb89cb71e6b5c6adb52fc3eff5bccefa6994198881b5f4b2ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a9f18d9243240a64fd7111654d501a9f4791765a494566ea2de234486b047549
MD5 d86275c0ea5b727f39dbbf3bba7a08ef
BLAKE2b-256 d750d5adf7a24eb69d4a15df2315f3a97f43da04b60536ad315ae73c72f26e27

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: wheels.yml on lucaswiman/emend

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

File details

Details for the file emend-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for emend-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c9194b58a2676bccff01ddb1eb0957d5f3c32a7cfbe910a9b8f39689fc2df9c2
MD5 45f96fbd7b39f5243e546e77c0ceac75
BLAKE2b-256 cd08f74297dbac1d40ee7e005a8ac0dada0f3a32916563e51806af20eb5be853

See more details on using hashes here.

Provenance

The following attestation bundles were made for emend-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: wheels.yml on lucaswiman/emend

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