copier/flake.nix

151 lines
4.4 KiB
Nix

{
description = "Source code project lifecycle management tool";
nixConfig = {
# HACK https://github.com/NixOS/nix/issues/6771
# TODO Leave only own cache settings when fixed
extra-trusted-public-keys = [
"copier.cachix.org-1:sVkdQyyNXrgc53qXPCH9zuS91zpt5eBYcg7JQSmTBG4="
"devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw="
];
extra-substituters = [
"https://copier.cachix.org"
"https://devenv.cachix.org"
];
# HACK https://github.com/renovatebot/renovate/issues/29721
# TODO Remove these comments when fixed
# github:NixOS/nixpkgs/nixpkgs-24.05
};
inputs = {
devenv.url = "github:cachix/devenv";
flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.*.tar.gz";
flake-parts.url = "github:hercules-ci/flake-parts";
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/*.tar.gz";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = inputs @ {
flake-parts,
devenv,
nixpkgs,
nixpkgs-unstable,
...
}:
flake-parts.lib.mkFlake {inherit inputs;} {
imports = [
inputs.devenv.flakeModule
];
systems = nixpkgs.lib.systems.flakeExposed;
perSystem = {
config,
self',
inputs',
pkgs,
lib,
system,
...
}: let
python = pkgs.python311;
uv = inputs'.nixpkgs-unstable.legacyPackages.uv;
in {
devenv.shells.default = {
languages.python = {
enable = true;
package = python;
uv = {
enable = true;
package = uv;
sync.enable = true;
};
};
env = {
# Force uv to use nixpkgs' Python interpreter
UV_PYTHON = python;
# Prevent uv from managing Python downloads
UV_PYTHON_DOWNLOADS = "never";
};
tasks = {
# Patch binaries to make them runnable on NixOS
# E.g.: https://github.com/astral-sh/ruff/issues/1699
"venv:patchelf" = {
exec = ''
for exe in ruff taplo; do
${lib.getExe pkgs.patchelf} --set-interpreter ${pkgs.stdenv.cc.bintools.dynamicLinker} $(uv run which $exe)
done;
'';
after = ["devenv:python:uv"];
before = ["devenv:enterShell"];
};
};
packages = [
pkgs.git
pkgs.alejandra
pkgs.nodePackages.prettier
];
difftastic.enable = true;
pre-commit.gitPackage = pkgs.git;
pre-commit.hooks = {
alejandra.enable = true;
commitizen = {
enable = true;
package = null;
entry = "uv run cz check --allow-abort --commit-msg-file";
};
editorconfig-checker.enable = true;
editorconfig-checker.excludes = [
"\.md$"
"\.noeof\."
"\.bundle$"
];
prettier.enable = true;
prettier.excludes = [
# Some API reference identifiers are dotted paths involving
# internal modules prefixed with `_` which are converted by
# Prettier to `\_`, making them invalid.
"^docs/reference/.+\.md$"
# Those files have wrong syntax and would fail
"^tests/demo_invalid/copier.yml$"
"^tests/demo_transclude_invalid(_multi)?/demo/copier.yml$"
# HACK https://github.com/prettier/prettier/issues/9430
"^tests/demo"
];
ruff = {
enable = true;
package = null;
entry = "uv run ruff check --fix";
};
ruff-format = {
enable = true;
package = null;
entry = "uv run ruff format";
};
taplo = {
enable = true;
package = null;
entry = "uv run taplo fmt";
};
};
enterTest = ''
env \
GIT_AUTHOR_EMAIL=copier@example.com \
GIT_AUTHOR_NAME=copier \
GIT_COMMITTER_EMAIL=copier@example.com \
GIT_COMMITTER_NAME=copier \
PYTHONOPTIMIZE= \
uv run poe test
'';
};
};
};
}