about summary refs log tree commit diff
path: root/users/Profpatsch/writers/default.nix
blob: 812a3f010d9f945b5cad3cf3381ac87ef695ba13 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
{ depot, pkgs, lib, ... }:
let
  bins = depot.nix.getBins pkgs.s6-portable-utils [ "s6-mkdir" "s6-cat" "s6-ln" "s6-ls" "s6-touch" ]
    // depot.nix.getBins pkgs.coreutils [ "printf" ];

  inherit (depot.nix.yants) defun struct restrict attrs list string drv any;

  inherit (depot.nix) drvSeqL;

  FlakeError =
    restrict
      "flake error"
      (s: lib.any (prefix: (builtins.substring 0 1 s) == prefix)
        [ "E" "W" ])
      string;
  Libraries = defun [ (attrs any) (list drv) ];

  pythonPackages = pkgs.python310Packages;
  python = pythonPackages.python;

  python3 =
    { name
    , libraries ? (_: [ ])
    , flakeIgnore ? [ ]
    }:
    let
    in
    pkgs.writers.makePythonWriter python pythonPackages name {
      libraries = Libraries libraries pythonPackages;
      flakeIgnore =
        let
          ignoreTheseErrors = [
            # whitespace after {
            "E201"
            # whitespace before }
            "E202"
            # fuck 4-space indentation
            "E121"
            "E111"
            # who cares about blank lines …
            # … at end of files
            "W391"
            # … between functions
            "E302"
            "E305"
            # … if there’s too many of them
            "E303"
            # or lines that are too long
            "E501"
          ];
        in
        list FlakeError (ignoreTheseErrors ++ flakeIgnore);
    };

  # TODO: add the same flake check as the pyhon3 writer
  python3Lib = { name, libraries ? (_: [ ]) }: moduleString:
    let
      srcTree = depot.nix.runExecline.local name { stdin = moduleString; } [
        "importas"
        "out"
        "out"
        "if"
        [ bins.s6-mkdir "-p" "\${out}/${name}" ]
        "if"
        [
          "redirfd"
          "-w"
          "1"
          "\${out}/setup.py"
          bins.printf
          ''
            from distutils.core import setup

            setup(
              name='%s',
              packages=['%s']
            )
          ''
          name
          name
        ]
        "if"
        [
          # redirect stdin to the init py
          "redirfd"
          "-w"
          "1"
          "\${out}/${name}/__init__.py"
          bins.s6-cat
        ]
      ];
    in
    pythonPackages.buildPythonPackage {
      inherit name;
      src = srcTree;
      propagatedBuildInputs = libraries pythonPackages;
      doCheck = false;
    };


in
{
  inherit
    python3
    python3Lib
    ;
}