lode 0.1.0

A Ruby package manager
[package]
name = "lode"
version = "0.1.0"
edition = "2024"
authors = ["Shannon Skipper"]
description = "A Ruby package manager"
license = "MIT"
repository = "https://github.com/havenwood/lode"
keywords = ["ruby", "gem", "package-manager", "bundler", "dependencies"]
categories = ["command-line-utilities", "development-tools"]

[[bin]]
name = "lode"
path = "src/main.rs"

[dependencies]
# CLI framework
clap = { version = "4.5", features = ["derive", "cargo", "env"] }
clap_complete = "4.5"

# Async runtime
tokio = { version = "1.40", features = ["macros", "rt-multi-thread", "sync", "fs", "io-util"] }
futures-util = "0.3"

# HTTP client for gem downloads
reqwest = { version = "0.12", features = ["json", "stream", "rustls-tls", "multipart"], default-features = false }

# Serialization
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
toml = "0.9"

# Dependency resolution
pubgrub = "0.3"

# Terminal utilities (for gem-signin password input)
crossterm = "0.29"

# Archive extraction (.gem files are tar.gz)
tar = "0.4"
flate2 = "1.0"

# Ruby Marshal format parsing (for full gem index)
marshal-rs = "1.1"

# Git operations (for git gem support)
git2 = "0.20"

# Error handling
anyhow = "1.0"
thiserror = "2.0"

# Utilities
tempfile = "3.13"
dirs = "6.0"
chrono = "0.4"
sha2 = "0.10"

# X.509 certificate verification for gem signatures
x509-verify = { version = "0.4", features = ["rsa", "sha2", "x509", "pem"] }
x509-cert = { version = "0.2", features = ["pem"] }
der = { version = "0.7", features = ["pem"] }

# Certificate generation (for gem-cert command)
rcgen = "0.13"
time = "0.3"

# Unicode utilities (explicit dependency to unify versions across tree)
unicode-width = "=0.2.0"
regex = "1.12.2"
semver = "1.0.27"
indicatif = "0.18.2"
rayon = "1.11.0"
walkdir = "2.5.0"

[dev-dependencies]

[package.metadata.cargo-machete]
# unicode-width is explicitly pinned to unify versions across dependency tree
ignored = ["unicode-width"]

[profile.release]
opt-level = 3
lto = true
codegen-units = 1
strip = true

[lints.clippy]
# Clippy lint groups
cargo = { level = "deny", priority = -1 }
correctness = { level = "deny", priority = -1 }
nursery = { level = "deny", priority = -1 }
pedantic = { level = "deny", priority = -1 }
perf = { level = "deny", priority = -1 }
style = { level = "deny", priority = -1 }
suspicious = { level = "deny", priority = -1 }

# Clippy nursery group allows
redundant_pub_crate = "allow"
missing_const_for_fn = "allow"

# Clippy cargo group allows
multiple_crate_versions = "allow"

# Clippy pedantic group allows
missing_errors_doc = "allow"
must_use_candidate = "allow"
cast_possible_truncation = "allow"
cast_sign_loss = "allow"
cast_precision_loss = "allow"
too_many_lines = "allow"
similar_names = "allow"
struct_excessive_bools = "allow"

# Clippy restriction lints
boxed_local = "deny"
clone_on_copy = "deny"
cognitive_complexity = "deny"
panic = "deny"
todo = "deny"
unimplemented = "deny"
undocumented_unsafe_blocks = "deny"
multiple_unsafe_ops_per_block = "deny"
indexing_slicing = "deny"

[lints.rust]
# Rust lint groups
future_incompatible = { level = "deny", priority = -1 }
let_underscore = { level = "deny", priority = -1 }
nonstandard_style = { level = "deny", priority = -1 }
rust_2018_compatibility = { level = "deny", priority = -1 }
rust_2018_idioms = { level = "deny", priority = -1 }
rust_2021_compatibility = { level = "deny", priority = -1 }
rust_2024_compatibility = { level = "deny", priority = -1 }
unused = { level = "deny", priority = -1 }

# Rust lints (not covered by groups above)
missing_copy_implementations = "deny"
missing_debug_implementations = "deny"
single_use_lifetimes = "deny"
trivial_casts = "deny"
trivial_numeric_casts = "deny"
unreachable_pub = "deny"
variant_size_differences = "deny"
unsafe_code = "deny"