Compare commits

...

3 Commits

Author SHA1 Message Date
Peder Bergebakken Sundt 91f924a75a devenv 2024-11-15 02:34:52 +01:00
Peder Bergebakken Sundt e1605aab29 modernize 2024-11-15 00:26:50 +01:00
Peder Bergebakken Sundt 1164d492a3 conf.py does nothing 2024-11-15 00:18:26 +01:00
12 changed files with 390 additions and 69 deletions

2
.envrc Normal file
View File

@ -0,0 +1,2 @@
# devenv needs to know the path to the current working directory to create and manage mutable state
use flake . --no-pure-eval

4
.gitignore vendored
View File

@ -1,8 +1,12 @@
result result
result-* result-*
.venv
.direnv
.devenv
dist dist
config.ini
test.db test.db
.ruff_cache .ruff_cache

View File

@ -3,29 +3,46 @@
EDB-system for PVVVV EDB-system for PVVVV
## Nix ## Nix
### Hvordan kjøre ### Hvordan kjøre
`nix run github:Prograrmvarverkstedet/dibbler` nix run github:Programvareverkstedet/dibbler
### Hvordan utvikle?
### Bygge nytt image python -m venv .venv
source .venv/activate
pip install -e .
cp example-config.ini config.ini
dibbler -c config.ini create-db
dibbler -c config.ini loop
eller hvis du tolererer nix og postgres:
direnv allow # eller bare `nix develop`
devenv up
dibbler create-db
dibbler loop
### Bygge image
For å bygge et image trenger du en builder som takler å bygge for arkitekturen du skal lage et image for. For å bygge et image trenger du en builder som takler å bygge for arkitekturen du skal lage et image for.
(Eller be til gudene om at cross compile funker) _(Eller be til gudene om at cross compile funker)_
Flaket exposer en modul som autologger inn med en bruker som automatisk kjører dibbler, og setter opp et minimalistisk miljø. Flaket exposer en modul som autologger inn med en bruker som automatisk kjører dibbler, og setter opp et minimalistisk miljø.
Før du bygger imaget burde du endre conf.py lokalt til å inneholde instillingene dine. **NB: Denne kommer til å ligge i nix storen.** Før du bygger imaget burde du lage en `config.ini` fil lokalt som inneholder instillingene dine. **NB: Denne kommer til å ligge i nix storen.**
Du kan også endre hvilken conf.py som blir brukt direkte i pakken eller i modulen. Du kan også endre hvilken `config.ini` som blir brukt direkte i pakken eller i modulen.
Se eksempelet for hvordan skrot er satt opp i flake.nix Se eksempelet for hvordan skrot er satt opp i `flake.nix`
### Bygge image for skrot ### Bygge image for skrot
Skrot har et image definert i flake.nix:
1. endre conf.py Skrot har et system image definert i `flake.nix`:
1. lag `config.ini` (`cp {example-,}config.ini`)
2. `nix build .#images.skrot` 2. `nix build .#images.skrot`
3. ??? 3. ???
4. non-profit 4. non-profit!

13
conf.py
View File

@ -1,13 +0,0 @@
db_url = "postgresql://robertem@127.0.0.1/pvvvv"
quit_allowed = True
stop_allowed = False
show_tracebacks = True
input_encoding = "utf8"
low_credit_warning_limit = -100
user_recent_transaction_limit = 100
# See https://pypi.org/project/brother_ql/ for label types
# Set rotate to False for endless labels
label_type = "62"
label_rotate = False

View File

@ -1,7 +1,12 @@
import os
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from dibbler.conf import config from dibbler.conf import config
engine = create_engine(config.get("database", "url")) engine = create_engine(
os.environ.get("DIBBLER_DATABASE_URL")
or config.get("database", "url")
)
Session = sessionmaker(bind=engine) Session = sessionmaker(bind=engine)

View File

@ -1,4 +1,6 @@
import argparse import argparse
import sys
import os
from dibbler.conf import config from dibbler.conf import config
@ -10,6 +12,7 @@ parser.add_argument(
help="Path to the config file", help="Path to the config file",
type=str, type=str,
required=False, required=False,
default=os.environ.get("DIBBLER_CONFIG_FILE", None)
) )
subparsers = parser.add_subparsers( subparsers = parser.add_subparsers(
@ -24,6 +27,8 @@ subparsers.add_parser("slabbedasker", help="Find out who is slabbedasker")
def main(): def main():
args = parser.parse_args() args = parser.parse_args()
if args.config is None:
print("ERROR: no config was provided", file=sys.stderr)
config.read(args.config) config.read(args.config)
if args.subcommand == "loop": if args.subcommand == "loop":

View File

@ -1,18 +1,20 @@
[general] [general]
quit_allowed = true ; quit_allowed = false
stop_allowed = false ; stop_allowed = false
quit_allowed = true ; not for prod
stop_allowed = true ; not for prod
show_tracebacks = true show_tracebacks = true
input_encoding = 'utf8' input_encoding = 'utf8'
[database] [database]
; url = postgresql://robertem@127.0.0.1/pvvvv ; url = postgresql://dibbler:hunter2@127.0.0.1/pvvvv
url = sqlite:///test.db url = sqlite:///test.db ; devenv will override this to postgres using DIBBLER_DATABASE_URL
[limits] [limits]
low_credit_warning_limit = -100 low_credit_warning_limit = -100
user_recent_transaction_limit = 100 user_recent_transaction_limit = 100
# See https://pypi.org/project/brother_ql/ for label types # See https://pypi.org/project/brother_ql_next/ for label types
# Set rotate to False for endless labels # Set rotate to False for endless labels
[printer] [printer]
label_type = "62" label_type = "62"

View File

@ -1,15 +1,103 @@
{ {
"nodes": { "nodes": {
"cachix": {
"inputs": {
"devenv": [
"devenv"
],
"flake-compat": [
"devenv"
],
"git-hooks": [
"devenv"
],
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1728672398,
"narHash": "sha256-KxuGSoVUFnQLB2ZcYODW7AVPAh9JqRlD5BrfsC/Q4qs=",
"owner": "cachix",
"repo": "cachix",
"rev": "aac51f698309fd0f381149214b7eee213c66ef0a",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "latest",
"repo": "cachix",
"type": "github"
}
},
"devenv": {
"inputs": {
"cachix": "cachix",
"flake-compat": "flake-compat",
"git-hooks": "git-hooks",
"nix": "nix",
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1731619804,
"narHash": "sha256-wyxFaVooL8SzvQNpolpx32X+GoBPnCAg9E0i/Ekn3FU=",
"owner": "cachix",
"repo": "devenv",
"rev": "87edaaf1dddf17fe16eabab3c8edaf7cca2c3bc2",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
"devenv",
"nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1712014858,
"narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "9126214d0a59633752a136528f5f3b9aa8565b7d",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-utils": { "flake-utils": {
"inputs": { "inputs": {
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1692799911, "lastModified": 1731533236,
"narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -18,24 +106,174 @@
"type": "github" "type": "github"
} }
}, },
"git-hooks": {
"inputs": {
"flake-compat": [
"devenv"
],
"gitignore": "gitignore",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"nixpkgs-stable": [
"devenv"
]
},
"locked": {
"lastModified": 1730302582,
"narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"devenv",
"git-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"libgit2": {
"flake": false,
"locked": {
"lastModified": 1697646580,
"narHash": "sha256-oX4Z3S9WtJlwvj0uH9HlYcWv+x1hqp8mhXl7HsLu2f0=",
"owner": "libgit2",
"repo": "libgit2",
"rev": "45fd9ed7ae1a9b74b957ef4f337bc3c8b3df01b5",
"type": "github"
},
"original": {
"owner": "libgit2",
"repo": "libgit2",
"type": "github"
}
},
"nix": {
"inputs": {
"flake-compat": [
"devenv"
],
"flake-parts": "flake-parts",
"libgit2": "libgit2",
"nixpkgs": "nixpkgs_2",
"nixpkgs-23-11": [
"devenv"
],
"nixpkgs-regression": [
"devenv"
],
"pre-commit-hooks": [
"devenv"
]
},
"locked": {
"lastModified": 1727438425,
"narHash": "sha256-X8ES7I1cfNhR9oKp06F6ir4Np70WGZU5sfCOuNBEwMg=",
"owner": "domenkozar",
"repo": "nix",
"rev": "f6c5ae4c1b2e411e6b1e6a8181cc84363d6a7546",
"type": "github"
},
"original": {
"owner": "domenkozar",
"ref": "devenv-2.24",
"repo": "nix",
"type": "github"
}
},
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1693145325, "lastModified": 1730531603,
"narHash": "sha256-Gat9xskErH1zOcLjYMhSDBo0JTBZKfGS0xJlIRnj6Rc=", "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "cddebdb60de376c1bdb7a4e6ee3d98355453fe56", "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "owner": "NixOS",
"type": "indirect" "ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1717432640,
"narHash": "sha256-+f9c4/ZX5MWDOuB1rKoWj+lBNm0z0rs4CK47HBLxy1o=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "88269ab3044128b7c2f4c7d68448b2fb50456870",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "release-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1716977621,
"narHash": "sha256-Q1UQzYcMJH4RscmpTkjlgqQDX5yi1tZL0O345Ri6vXQ=",
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "4267e705586473d3e5c8d50299e71503f16a6fb6",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1731611831,
"narHash": "sha256-R51rOqkWMfubBkZ9BY4Y1VaRoeqEBshlfQ8mMH5RjqI=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "cea28c811faadb50bee00d433bbf2fea845a43e4",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable-small",
"repo": "nixpkgs",
"type": "github"
} }
}, },
"root": { "root": {
"inputs": { "inputs": {
"devenv": "devenv",
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs_4"
} }
}, },
"systems": { "systems": {

View File

@ -1,35 +1,85 @@
{ {
description = "Dibbler samspleisebod"; description = "Dibbler samspleisebod";
inputs.flake-utils.url = "github:numtide/flake-utils"; inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable-small";
flake-utils.url = "github:numtide/flake-utils";
devenv.url = "github:cachix/devenv";
};
outputs = { self, nixpkgs, flake-utils }: nixConfig = {
flake-utils.lib.eachDefaultSystem (system: let extra-trusted-public-keys = [
pkgs = nixpkgs.legacyPackages.${system}; "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw="
];
extra-substituters = [
"https://devenv.cachix.org"
];
};
outputs = { self, ... } @ inputs:
inputs.flake-utils.lib.eachDefaultSystem (system: let
pkgs = inputs.nixpkgs.legacyPackages.${system};
inherit (pkgs) lib;
in { in {
packages = { packages = {
default = self.packages.${system}.dibbler; default = self.packages.${system}.dibbler;
dibbler = pkgs.callPackage ./nix/dibbler.nix {
python3Packages = pkgs.python311Packages;
};
};
apps = { dibbler = pkgs.python311Packages.callPackage ./nix/dibbler.nix { };
default = self.apps.${system}.dibbler; skrot-vm = self.nixosConfigurations.skrot.config.system.build.vm;
dibbler = flake-utils.lib.mkApp {
drv = self.packages.${system}.dibbler; # devenv cruft
}; devenv-up = self.devShells.${system}.default.config.procfileScript;
devenv-test = self.devShells.${system}.default.config.test;
}; };
devShells = { devShells = {
default = self.devShells.${system}.dibbler; default = self.devShells.${system}.dibbler;
dibbler = pkgs.mkShell { dibbler = inputs.devenv.lib.mkShell {
packages = with pkgs; [ inherit inputs pkgs;
python311Packages.black modules = [({ config, ... }: {
ruff # https://devenv.sh/reference/options/
];
enterShell = ''
if [[ ! -f config.ini ]]; then
cp -v example-config.ini config.ini
fi
export REPO_ROOT=$(realpath .) # used by mkPythonEditablePackage
export DIBBLER_CONFIG_FILE=$(realpath config.ini)
export DIBBLER_DATABASE_URL=postgresql://dibbler:hunter2@/dibbler?host=${config.env.PGHOST}
'';
packages = [
/* self.packages.${system}.dibbler */
(pkgs.python311Packages.mkPythonEditablePackage {
inherit (self.packages.${system}.dibbler)
pname version
build-system dependencies;
scripts = (lib.importTOML ./pyproject.toml).project.scripts;
root = "$REPO_ROOT";
})
pkgs.python311Packages.black
pkgs.ruff
];
services.postgres = {
enable = true;
initialDatabases = [
{
name = "dibbler";
user = "dibbler";
pass = "hunter2";
}
];
};
})];
}; };
}; };
}) })
// //
@ -41,10 +91,10 @@
images.skrot = self.nixosConfigurations.skrot.config.system.build.sdImage; images.skrot = self.nixosConfigurations.skrot.config.system.build.sdImage;
nixosConfigurations.skrot = nixpkgs.lib.nixosSystem { nixosConfigurations.skrot = inputs.nixpkgs.lib.nixosSystem {
system = "aarch64-linux"; system = "aarch64-linux";
modules = [ modules = [
(nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64.nix") (inputs.nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64.nix")
self.nixosModules.default self.nixosModules.default
({...}: { ({...}: {
system.stateVersion = "22.05"; system.stateVersion = "22.05";
@ -73,5 +123,6 @@
}) })
]; ];
}; };
}; };
} }

View File

@ -1,17 +1,25 @@
{ lib { lib
, python3Packages
, fetchFromGitHub , fetchFromGitHub
, buildPythonApplication
, setuptools
, brother-ql
, matplotlib
, psycopg2
, python-barcode
, sqlalchemy
}: }:
python3Packages.buildPythonApplication {
buildPythonApplication {
pname = "dibbler"; pname = "dibbler";
version = "unstable-2021-09-07"; version = "0.0.0";
pyproject = true;
src = lib.cleanSource ../.; src = lib.cleanSource ../.;
format = "pyproject"; build-system = [ setuptools ];
dependencies = [
nativeBuildInputs = with python3Packages; [ setuptools ]; # we override pname to satisfy mkPythonEditablePackage
propagatedBuildInputs = with python3Packages; [ (brother-ql.overridePythonAttrs { pname = "brother-ql-next"; })
brother-ql
matplotlib matplotlib
psycopg2 psycopg2
python-barcode python-barcode

View File

@ -23,7 +23,10 @@ in {
group = "dibbler"; group = "dibbler";
extraGroups = [ "lp" ]; extraGroups = [ "lp" ];
isNormalUser = true; isNormalUser = true;
shell = ((pkgs.writeShellScriptBin "login-shell" "${screen} -x dibbler") // {shellPath = "/bin/login-shell";}); shell = (
(pkgs.writeShellScriptBin "login-shell" "${screen} -x dibbler")
// {shellPath = "/bin/login-shell";}
);
}; };
}; };

View File

@ -14,7 +14,7 @@ classifiers = [
] ]
dependencies = [ dependencies = [
"SQLAlchemy >= 2.0, <2.1", "SQLAlchemy >= 2.0, <2.1",
"brother-ql", "brother_ql_next",
"matplotlib", "matplotlib",
"psycopg2 >= 2.8, <2.10", "psycopg2 >= 2.8, <2.10",
"python-barcode", "python-barcode",
@ -32,4 +32,3 @@ line-length = 100
[tool.ruff] [tool.ruff]
line-length = 100 line-length = 100