From de03590cf74eb0cd5868eaf240719d40cc2e485b Mon Sep 17 00:00:00 2001 From: Kristian Krsnik Date: Thu, 29 May 2025 18:19:57 +0200 Subject: [PATCH] update --- flake.lock | 6 +-- flake.nix | 121 +++++++++++++----------------------------------- nix/module.nix | 49 ++++++++++++-------- nix/package.nix | 44 ++++++++++++++++++ pyproject.toml | 13 ++---- 5 files changed, 112 insertions(+), 121 deletions(-) create mode 100644 nix/package.nix diff --git a/flake.lock b/flake.lock index 62e0614..09b747a 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1742422364, - "narHash": "sha256-mNqIplmEohk5jRkqYqG19GA8MbQ/D4gQSK0Mu4LvfRQ=", + "lastModified": 1748370509, + "narHash": "sha256-QlL8slIgc16W5UaI3w7xHQEP+Qmv/6vSNTpoZrrSlbk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a84ebe20c6bc2ecbcfb000a50776219f48d134cc", + "rev": "4faa5f5321320e49a78ae7848582f684d64783e9", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 471424b..4891fa0 100644 --- a/flake.nix +++ b/flake.nix @@ -5,101 +5,44 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; }; - outputs = { - self, - nixpkgs, - ... - } @ inputs: let - supportedSystems = ["x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"]; - forAllSystems = nixpkgs.lib.genAttrs supportedSystems; - pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system}.extend overlay); - - overlay = final: prev: rec { - python3Packages = prev.python3Packages.overrideScope (pfinal: pprev: { - packageNameToDrv = x: builtins.getAttr (cleanPythonPackageName x) final.python3Packages; + outputs = + { + self, + nixpkgs, + ... + }@inputs: + let + supportedSystems = [ "x86_64-linux" ]; + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system}); + in + { + # `nix build` + packages = forAllSystems (system: rec { + default = cloudns; + cloudns = pkgs.${system}.callPackage ./nix/package.nix { src = ./.; }; }); - cleanPythonPackageName = x: let - cleanName = builtins.match "([a-z,A-Z,0-9,_,-]+).*" x; - in - if cleanName != null - then builtins.elemAt cleanName 0 - else builtins.warn "Could not determine package name from '${x}'" null; - }; + # `nix develop` + devShells = forAllSystems (system: rec { + default = venv; - pyproject = builtins.fromTOML (builtins.readFile ./pyproject.toml); + venv = pkgs.${system}.mkShell { + shellHook = '' + if [ ! -d .venv/ ]; then + echo "Creating Virtual Environment..." + ${pkgs.${system}.python3}/bin/python3 -m venv .venv + fi - buildDependencies = forAllSystems (system: builtins.map pkgs.${system}.python3Packages.packageNameToDrv pyproject.build-system.requires); - runtimeDependencies = forAllSystems (system: builtins.map pkgs.${system}.python3Packages.packageNameToDrv pyproject.project.dependencies); - optionalDependencies = forAllSystems (system: builtins.mapAttrs (name: value: builtins.map pkgs.${system}.python3Packages.packageNameToDrv value) pyproject.project.optional-dependencies); - in { - # `nix build` - packages = forAllSystems (system: let - buildProject = {skipCheck ? false}: - pkgs.${system}.python3Packages.buildPythonPackage { - pname = pyproject.project.name; - version = pyproject.project.version; - src = ./.; + alias activate='source .venv/bin/activate' - pyproject = true; - - build-system = buildDependencies.${system}; - - dependencies = runtimeDependencies.${system}; - - optional-dependencies = optionalDependencies.${system}; - - nativeCheckInputs = optionalDependencies.${system}.dev; - - checkPhase = let - dev = builtins.map (x: x.pname) optionalDependencies.${system}.dev; - in '' - ${ - if builtins.elem "pytest" dev && !skipCheck - then "pytest tests" - else "" - } - ${ - if builtins.elem "mypy" dev && !skipCheck - then "mypy src" - else "" - } - ${ - if builtins.elem "pylint" dev && !skipCheck - then "pylint src" - else "" - } + echo "Entering Virtual Environment..." + source .venv/bin/activate ''; }; - in { - default = self.packages.${system}."${pyproject.project.name}"; - "${pyproject.project.name}" = buildProject {skipCheck = false;}; - quick = buildProject {skipCheck = true;}; - }); + }); - # `nix fmt` - formatter = forAllSystems (system: pkgs.${system}.alejandra); - - # `nix develop` - devShells = forAllSystems (system: rec { - default = venv; - - venv = pkgs.${system}.mkShell { - shellHook = '' - if [ ! -d .venv/ ]; then - echo "Creating Virtual Environment..." - ${pkgs.${system}.python3}/bin/python3 -m venv .venv - fi - - alias activate='source .venv/bin/activate' - - echo "Entering Virtual Environment..." - source .venv/bin/activate - ''; - }; - }); - - # NixOS Module - nixosModules.default = import ./nix/module.nix inputs; - }; + # NixOS Module + nixosModules.default = import ./nix/module.nix inputs; + }; } diff --git a/nix/module.nix b/nix/module.nix index bd54334..ea5b59a 100644 --- a/nix/module.nix +++ b/nix/module.nix @@ -1,16 +1,24 @@ -inputs: { +inputs: +{ config, lib, pkgs, ... -}: let +}: +let cfg = config.cloudns; package = inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.default; - inherit (lib) mkIf mkEnableOption mkOption types; + inherit (lib) + mkIf + mkEnableOption + mkOption + types + ; - format = pkgs.formats.json {}; + format = pkgs.formats.json { }; configFile = format.generate "config.json" cfg.settings; -in { +in +{ options.cloudns = { enable = mkEnableOption "cloudns"; @@ -23,36 +31,37 @@ in { }; settings = mkOption { - type = with types; let - valueType = nullOr (oneOf [ - # TODO: restrict type to actual config file structure - bool - int - float - str - path - (attrsOf valueType) - (listOf valueType) - ]); - in + type = + with types; + let + valueType = nullOr (oneOf [ + bool + int + float + str + path + (attrsOf valueType) + (listOf valueType) + ]); + in valueType; default = throw "Please specify cloudns.settings"; }; }; config = mkIf cfg.enable { - environment.systemPackages = [package]; + environment.systemPackages = [ package ]; systemd.services.cloudns = mkIf (cfg.timer != null) { script = "${package}/bin/cloudns --config ${configFile}"; - requires = ["network-online.target"]; + requires = [ "network-online.target" ]; serviceConfig = { Type = "oneshot"; }; }; systemd.timers.cloudns = mkIf (cfg.timer != null) { - wantedBy = ["timers.target"]; + wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = "0s"; OnUnitActiveSec = "${toString cfg.timer}s"; diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 0000000..c50dabc --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,44 @@ +{ + src, + python3Packages, +}: +let + inherit (python3Packages) + setuptools + pydantic + pytest + requests + types-requests + mypy + pylint + ; + + project = (builtins.fromTOML (builtins.readFile "${src}/pyproject.toml")).project; + pname = project.name; + version = project.version; +in +python3Packages.buildPythonPackage { + inherit pname version src; + + pyproject = true; + + build-system = [ setuptools ]; + + dependencies = [ + requests + pydantic + ]; + + nativeCheckInputs = [ + pytest + mypy + types-requests + pylint + ]; + + checkPhase = '' + pytest tests + mypy src + pylint src + ''; +} diff --git a/pyproject.toml b/pyproject.toml index b67a146..e787cf0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,22 +1,17 @@ [project] name = "cloudns" -version = "0.1.0" +version = "0.1.1" requires-python = "~=3.12, <4" -dependencies = ["requests~=2.32.3", "pydantic~=2.10.5"] +dependencies = ["requests~=2.32.3", "pydantic~=2.11.1"] [project.optional-dependencies] -dev = [ - "pytest~=8.3", - "mypy~=1.13", - "pylint~=3.3", - "types-requests~=2.32.0.20241016", -] +dev = ["pytest~=8.3", "mypy~=1.13", "pylint~=3.3", "types-requests~=2.32"] [project.scripts] cloudns = "cloudns.main:main" [build-system] -requires = ["setuptools~=75.1"] +requires = ["setuptools~=78.1"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find]