netsuke-build 0.1.0-beta2

A YAML-powered Ninja/Jinja hybrid build system.
[package]
name = "netsuke-build"
version = "0.1.0-beta2"
edition = "2024"
include = [
    "/src/**",
    "/locales/**",
    "/Cargo.toml",
    "/README.md",
    "/LICENSE",
    "/build.rs",
    "/build_l10n_audit/**",
]
license = "ISC"
readme = "README.md"
description = "A YAML-powered Ninja/Jinja hybrid build system."
authors = ["Payton McIntosh <pmcintosh@df12.net>"]
homepage = "https://df12.studio/netsuke"
repository = "https://github.com/leynos/netsuke"
documentation = "https://df12.studio/netsuke/docs/"
keywords = ["build", "ninja", "jinja", "yaml", "automation"]
categories = ["command-line-utilities", "development-tools::build-utils"]

[lib]
name = "netsuke"

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

[package.metadata.ortho_config]
root_type = "netsuke::cli::ReleaseHelpCli"
locales   = [
    "ar",
    "cs",
    "cy",
    "da",
    "de",
    "el",
    "en-GB",
    "en-US",
    "es-419",
    "es-ES",
    "fa",
    "fi",
    "fr",
    "gd",
    "he",
    "hi",
    "hu",
    "id",
    "it",
    "ja",
    "ko",
    "nb",
    "nl",
    "pl",
    "pt-BR",
    "pt-PT",
    "ro",
    "ru",
    "sv",
    "th",
    "tr",
    "uk",
    "vi",
    "zh-Hans",
    "zh-Hant",
]

[package.metadata.kani.flags]
default-unwind = "6"

[lints]
workspace = true

# `cargo binstall` fetches the tar.gz archives staged by the
# `stage-release-artefacts` action (`[common.binstall]` in
# `.github/release-staging.toml`) and hoisted to the release root by
# `.github/workflows/release.yml`. Each archive is named
# `{package_name}-{version}-{target}.tar.gz` — where the package name matches
# binstall's `{ name }` — and contains the bare `netsuke` binary at its root,
# so one template covers every released target.
# `tests/binstall_metadata_tests.rs` holds this metadata, the staging
# configuration, and the release workflow to that contract.
[package.metadata.binstall]
pkg-url = "{ repo }/releases/download/v{ version }/{ name }-{ version }-{ target }.tar.gz"
bin-dir = "{ bin }{ binary-ext }"
pkg-fmt = "tgz"

[features]
default = []
legacy-digests = ["sha1", "md5"]

[dependencies]
clap = { version = "4.5.0", features = ["derive"] }
serde = { version = "1", features = ["derive"] }
serde-saphyr = "0.0.6"
minijinja = { version = "2.12.0", features = ["loader"] }
cap-primitives = "3.4.4"
cap-std = { version = "3.4.4", features = ["fs_utf8"] }
fs4 = "1.1.0"
camino = "1.2.0"
semver = { version = "1", features = ["serde"] }
anyhow = "1"
indicatif = "0.18.4"
thiserror = "1"
miette = { version = "7.6.0", features = ["fancy"] }
digest = "0.11"
sha2 = "0.11"
sha1 = { version = "0.11", optional = true }
md5 = { package = "md-5", version = "0.11", optional = true }
itoa = "1"
itertools = "0.12"
indexmap = { version = "2.5", features = ["serde"] }
lru = "0.18"
glob = "0.3.3"
hashbrown = "0.17.1"
walkdir = "2.5"
metrics = "0.24.6"
monotony = "0.1.0"
metrics-util = { version = "0.20", features = ["debugging"] }
mockable = "3.0"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt"] }
serde_json = { version = "1", features = ["preserve_order"] }
serde_json_canonicalizer = "0.3"
tempfile = "3.8.0"
shell-quote = { version = "0.7.2", default-features = false, features = ["sh"] }
shlex = "2.0.1"
time = { version = "0.3.44", features = ["formatting", "macros", "parsing", "serde"] }
ureq = { version = "2.10.5" }
wait-timeout = "0.2"
url = "^2.5.0"
ortho_config = { version = "0.9.0", features = ["serde_json"] }
sys-locale = "0.3.2"
unicode-width = "0.2.1"

[build-dependencies]
cap-std = "3.4.4"
clap = { version = "4.5.0", features = ["derive"] }
clap_complete = "4.5.0"
clap_mangen = "0.3.0"
ortho_config = { version = "0.9.0", features = ["serde_json"] }
serde = { version = "1", features = ["derive"] }
serde_json = { version = "1", features = ["preserve_order"] }
thiserror = "1"
time = { version = "0.3.44", features = ["formatting"] }
tracing = "0.1"
[dev-dependencies]
rstest = "0.26.1"
rstest-bdd = "0.5.0"
rstest-bdd-macros = { version = "0.5.0", features = ["strict-compile-time-validation"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"], default-features = false }
insta = { version = "1", features = ["yaml", "filters"] }
assert_cmd = "2.0.0"
predicates = "3"
mockable = { version = "3.0", features = ["mock"] }
monotony = { version = "0.1.0", features = ["test-util"] }
serial_test = "3"
mockall = "0.11"
camino = "1.2.0"
test_support = { path = "test_support" }
strip-ansi-escapes = "0.2"
toml = "0.8"
serde_yaml = "0.9"
proptest = "1.11.0"
googletest = "0.14.3"
pretty_assertions = "1.4.1"
# Plural-selection tests must pass numeric arguments to Fluent. `ortho_config`
# exposes `LocalizationArgs` as a map of `FluentValue`, but does not re-export
# the value type, so the tests need `fluent-bundle` directly. Constrained to
# the version `ortho_config` resolves, or the `FluentValue` types would differ.
fluent-bundle = "0.16.0"

# Target-specific dev-deps
[target.'cfg(unix)'.dev-dependencies]
# Used only to construct FIFOs and device nodes in tests.
rustix = { version = "1.0.8", features = ["fs"] }

[workspace]
members = ["test_support"]

[workspace.lints.clippy]
pedantic = { level = "warn", priority = -1 }

# 1. hygiene
allow_attributes                    = "deny"
allow_attributes_without_reason     = "deny"
blanket_clippy_restriction_lints    = "deny"
cognitive_complexity                = "deny"
disallowed_methods                  = "deny"
needless_pass_by_value              = "deny"
implicit_hasher                     = "deny"
missing_assert_message              = "deny"

# 2. debugging leftovers
dbg_macro                           = "deny"
print_stdout                        = "deny"
print_stderr                        = "deny"

# 2. panic-prone operations
unwrap_used                         = "deny"
expect_used                         = "deny"
indexing_slicing                    = "deny"
string_slice                        = "deny"
integer_division                    = "deny"
integer_division_remainder_used     = "deny"
panic_in_result_fn                  = "deny"
unreachable                         = "deny"

# 4. portability
host_endian_bytes                   = "deny"
little_endian_bytes                 = "deny"
big_endian_bytes                    = "deny"

# 5. nursery idiom polish
let_underscore_must_use             = "deny"
or_fun_call                         = "deny"
option_if_let_else                  = "deny"
self_named_module_files             = "deny"
shadow_reuse                        = "deny"
shadow_same                         = "deny"
shadow_unrelated                    = "deny"
str_to_string                       = "deny"
string_lit_as_bytes                 = "deny"
try_err                             = "deny"
unneeded_field_pattern              = "deny"
use_self                            = "deny"

# 6. numerical foot-guns
float_arithmetic                    = "deny"
cast_possible_truncation            = "deny"
cast_possible_wrap                  = "deny"
cast_precision_loss                 = "deny"
lossy_float_literal                 = "deny"

# 7. API ergonomics
missing_const_for_fn                = "deny"
must_use_candidate                  = "deny"
unused_async                        = "deny"

# 8. Error handling
missing_panics_doc                  = "deny"
error_impl_error                    = "deny"
result_large_err                    = "deny"

[workspace.lints.rust]
unknown_lints                       = "deny"
renamed_and_removed_lints           = "deny"
unsafe_code                         = "forbid"
missing_docs                        = "deny"
unexpected_cfgs                     = { level = "warn", check-cfg = ["cfg(kani)", "cfg(dylint_lib, values(any()))"] }

[workspace.lints.rustdoc]
missing_crate_level_docs            = "deny"
broken_intra_doc_links              = "deny"
private_intra_doc_links             = "deny"
bare_urls                           = "deny"
invalid_html_tags                   = "deny"
invalid_codeblock_attributes        = "deny"
unescaped_backticks                 = "deny"