summary refs log tree commit diff
path: root/pkgs/tools/admin/pgadmin/default.nix
blob: d917acd656c828c40b24edc1eee4b6b4e56116b3 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
{ lib
, python3
, fetchurl
, zlib
, mkYarnModules
, sphinx
, nixosTests
, pkgs
}:

let

  pname = "pgadmin";
  version = "6.8";

  src = fetchurl {
    url = "https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v${version}/source/pgadmin4-${version}.tar.gz";
    sha256 = "sha256-kS9GV/j28zkXTJZkRrG2JDgas210rQqXOJrwwxzepbw=";
  };

  yarnDeps = mkYarnModules {
    pname = "${pname}-yarn-deps";
    inherit version;
    packageJSON = ./package.json;
    yarnLock = ./yarn.lock;
    yarnNix = ./yarn.nix;
  };

  # move buildDeps here to easily pass to test suite
  buildDeps = with pythonPackages; [
    flask
    flask-gravatar
    flask_login
    flask_mail
    flask_migrate
    flask_sqlalchemy
    flask_wtf
    flask-compress
    passlib
    pytz
    simplejson
    six
    sqlparse
    wtforms
    flask-paranoid
    psutil
    psycopg2
    python-dateutil
    sqlalchemy
    itsdangerous
    flask-security-too
    bcrypt
    cryptography
    sshtunnel
    ldap3
    flask-babelex
    flask-babel
    gssapi
    flask-socketio
    eventlet
    httpagentparser
    user-agents
    wheel
    authlib
    qrcode
    pillow
    pyotp
    botocore
    boto3
  ];

  # override necessary on pgadmin4 6.8
  pythonPackages = python3.pkgs.overrideScope (final: prev: rec {
    flask = prev.flask.overridePythonAttrs (oldAttrs: rec {
      version = "2.0.3";
      src = oldAttrs.src.override {
        inherit version;
        sha256 = "sha256-4RIMIoyi9VO0cN9KX6knq2YlhGdSYGmYGz6wqRkCaH0=";
      };
      disabledTests = (oldAttrs.disabledTests or [ ]) ++ [
        "test_aborting"
      ];
    });
    flask-paranoid = prev.flask-paranoid.overridePythonAttrs (oldAttrs: rec {
      # tests fail due to downgrades here
      doCheck = false;
    });
    werkzeug = prev.werkzeug.overridePythonAttrs (oldAttrs: rec {
      version = "2.0.3";
      src = oldAttrs.src.override {
        inherit version;
        sha256 = "sha256-uGP4/wV8UiFktgZ8niiwQRYbS+W6TQ2s7qpQoWOCLTw=";
      };
    });
  });

in

pythonPackages.buildPythonApplication rec {
  inherit pname version src;

  # from Dockerfile
  CPPFLAGS = "-DPNG_ARM_NEON_OPT=0";

  format = "setuptools";

  patches = [
    # Expose setup.py for later use
    ./expose-setup.py.patch
  ];

  postPatch = ''
    # patching Makefile, so it doesn't try to build sphinx documentation here
    # (will do so later)
    substituteInPlace Makefile --replace 'LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 $(MAKE) -C docs/en_US -f Makefile.sphinx html' "true"
    # fix document which refers a non-existing document and fails
    substituteInPlace docs/en_US/contributions.rst --replace "code_snippets" ""
    patchShebangs .
    # relax dependencies
    substituteInPlace requirements.txt \
      --replace "psycopg2==2.9.*" "psycopg2>=2.9" \
      --replace "cryptography==3.*" "cryptography>=3.0" \
      --replace "requests==2.25.*" "requests>=2.25.0" \
      --replace "boto3==1.20.*" "boto3>=1.20" \
      --replace "botocore==1.23.*" "botocore>=1.23" \
      --replace "pytz==2021.*" "pytz" \
      --replace "Werkzeug==2.0.3" "werkzeug>=2.*"
    # don't use Server Mode (can be overridden later)
    substituteInPlace pkg/pip/setup_pip.py \
      --replace "req = req.replace('psycopg2', 'psycopg2-binary')" "req = req" \
      --replace "builtins.SERVER_MODE = None" "builtins.SERVER_MODE = False"
  '';

  preBuild = ''
    # Adapted from pkg/pip/build.sh
    echo Creating required directories...
    mkdir -p pip-build/pgadmin4/docs

    # build the documentation
    cd docs/en_US
    ${sphinx}/bin/sphinx-build -W -b html -d _build/doctrees . _build/html

    # Build the clean tree
    cd ../../web
    cp -r * ../pip-build/pgadmin4
    cd ../docs
    cp -r * ../pip-build/pgadmin4/docs
    for DIR in `ls -d ??_??/`
    do
      if [ -d ''${DIR}_build/html ]; then
          mkdir -p ../pip-build/pgadmin4/docs/''${DIR}_build
          cp -Rv ''${DIR}_build/html ../pip-build/pgadmin4/docs/''${DIR}_build
      fi
    done
    cd ../

    cp -r ${yarnDeps}/* pip-build/pgadmin4

    echo Creating distro config...
    echo HELP_PATH = \'../../docs/en_US/_build/html/\' > pip-build/pgadmin4/config_distro.py
    echo MINIFY_HTML = False >> pip-build/pgadmin4/config_distro.py

    echo Creating manifest...
    echo recursive-include pgadmin4 \* > pip-build/MANIFEST.in

    echo Building wheel...
    cd pip-build
    # copy non-standard setup.py to local directory
    # so setuptools-build-hook can call it
    cp -v ../pkg/pip/setup_pip.py setup.py
  '';

  nativeBuildInputs = with pythonPackages; [ cython pip ];
  buildInputs = [
    zlib
    pythonPackages.wheel
  ];

  # tests need an own data, log directory
  # and a working and correctly setup postgres database
  # checks will be run through nixos/tests
  doCheck = false;

  # speaklater3 is seperate because when passing buildDeps
  # to the test, it fails there due to a collision with speaklater
  propagatedBuildInputs = buildDeps ++ [ pythonPackages.speaklater3 ];

  passthru.tests = {
    standalone = nixosTests.pgadmin4-standalone;
    # regression and function tests of the package itself
    package = (import ../../../../nixos/tests/pgadmin4.nix ({ inherit pkgs; buildDeps = buildDeps; pythonEnv = pythonPackages; }));
  };

  meta = with lib; {
    description = "Administration and development platform for PostgreSQL";
    homepage = "https://www.pgadmin.org/";
    license = licenses.mit;
    changelog = "https://www.pgadmin.org/docs/pgadmin4/latest/release_notes_${lib.versions.major version}_${lib.versions.minor version}.html";
    maintainers = with maintainers; [ gador ];
  };
}