1 ;;; GNU MediaGoblin -- federated, autonomous media hosting
2 ;;; Copyright © 2015, 2016 David Thompson <davet@gnu.org>
3 ;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
4 ;;; Copyright © 2019 Ben Sturmfels <ben@sturm.com.au>
6 ;;; This program is free software: you can redistribute it and/or modify
7 ;;; it under the terms of the GNU General Public License as published by
8 ;;; the Free Software Foundation, either version 3 of the License, or
9 ;;; (at your option) any later version.
11 ;;; This program is distributed in the hope that it will be useful,
12 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;;; GNU General Public License for more details.
16 ;;; ========================================
18 ;;; ... This file is also part of GNU MediaGoblin, but we're leaving it
19 ;;; under GPLv3 for easy merge back and forth between Guix proper. It
20 ;;; also borrows some code directly from Guix.
22 ;;; ========================================
24 ;;; With `guix environment' you can use guix as kind of a universal
25 ;;; virtualenv, except a universal virtualenv with magical time traveling
26 ;;; properties and also, not just for Python.
28 ;;; Ok, here's how to use this thing! First, install Guix.
30 ;;; guix environment -l guix-env.scm --pure
32 ;;; While using --pure is a robust way to ensure that other environment
33 ;;; variables don't cause unexpected behaviour, it may trip up aspects of your
34 ;;; development tools, such as removing reference to $EDITOR. Feel free to
35 ;;; remove the --pure.
37 ;;; You'll need to run the above command every time you close your terminal or
38 ;;; restart your system, so a handy way to save having to remember is to install
39 ;;; "direnv" an then create a ".envrc" file in your current directory containing
40 ;;; the following and then run "direnv allow" when prompted:
41 ;;; use guix -l guix-env.scm
43 ;;; To set things up for the first time, you'll also need to run:
44 ;;; git submodule init
45 ;;; git submodule update
47 ;;; ./configure --with-python3 --without-virtualenv
49 ;;; python3 -m venv --system-site-packages . && bin/python setup.py develop --no-deps
50 ;;; bin/python -m pip install --force-reinstall PasteScript # workaround
51 ;;; bin/python -m pip install 'werkzeug<1.0.0' # workaround
53 ;;; ... wait whaaat, what's that venv line?! I thought you said this
54 ;;; was a reasonable virtualenv replacement! Well it is and it will
55 ;;; be, but there's a catch, and the catch is that Guix doesn't know
56 ;;; about this directory and "setup.py dist" is technically necessary
57 ;;; for certain things to run, so we have a virtualenv with nothing
58 ;;; in it but this project itself.
60 ;;; The devtools/update_extlib.sh script won't run on Guix due to missing
61 ;;; "/usr/bin/env", so then run:
62 ;;; node node_modules/.bin/bower install
63 ;;; ./devtools/update_extlib.sh
65 ;;; bin/gmg adduser --username admin --password a --email admin@example.com
66 ;;; ./lazyserver.sh <-- won't work
67 ;;; CELERY_ALWAYS_EAGER=true ./bin/paster serve paste.ini --reload
69 ;;; So anyway, now you can do:
70 ;;; PYTHONPATH="${PYTHONPATH}:$(pwd)" ./runtests.sh
72 ;;; bin/python -m pytest ./mediagoblin/tests --boxed
74 ;;; Now notably this is goofier looking than running a virtualenv,
75 ;;; but soon I'll do something truly evil (I hope) that will make
76 ;;; the virtualenv and path-hacking stuff unnecessary.
81 ;;; - currently fails to upload h264 source video: "GStreamer: missing H.264 decoder"
83 ;; TODO: Add PDF support.
85 (use-modules (ice-9 match)
91 (guix build-system gnu)
92 (guix build-system python)
94 (gnu packages autotools)
98 (gnu packages databases)
100 (gnu packages python-crypto)
101 (gnu packages python-web)
102 (gnu packages python-xyz)
103 (gnu packages sphinx)
104 (gnu packages gstreamer)
109 (gnu packages version-control)
111 ((guix licenses) #:select (expat zlib) #:prefix license:))
113 ;; =================================================================
114 ;; These packages are on their way into Guix proper but haven't made
115 ;; it in yet... or they're old versions of packages we're pinning
117 ;; =================================================================
119 (define python-pytest-forked
121 (name "python-pytest-forked")
126 (uri (pypi-uri "pytest-forked" version))
129 "0f4y1jhcg70xhm220pdb8r24n01knhn749aqlr14vmgbsb7allnk"))))
130 (build-system python-build-system)
132 `(("python-pytest" ,python-pytest)
133 ("python-setuptools-scm" ,python-setuptools-scm)))
135 "https://github.com/pytest-dev/pytest-forked")
137 "run tests in isolated forked subprocesses")
139 "run tests in isolated forked subprocesses")
140 (license license:expat)))
142 ;; =================================================================
151 (uri (pypi-uri "mediagoblin" version))
154 "0p2gj4z351166d1zqmmd8wc9bzb69w0fjm8qq1fs8dw2yhcg2wwv"))))
155 (build-system python-build-system)
157 ;; Complains about missing gunicorn. Not sure where that comes from.
160 `(("python-pytest" ,python-pytest)
161 ("nss-certs" ,nss-certs)))
163 `(("python-alembic" ,python-alembic)
164 ("python-pytest-xdist" ,python-pytest-xdist)
165 ("python-pytest-forked" ,python-pytest-forked)
166 ("python-celery" ,python-celery)
167 ("python-kombu" ,python-kombu)
168 ("python-webtest" ,python-webtest)
169 ("python-pastedeploy" ,python-pastedeploy)
170 ("python-paste" ,python-paste)
171 ("python-pastescript" ,python-pastescript)
172 ("python-translitcodec" ,python-translitcodec)
173 ("python-babel" ,python-babel)
174 ("python-configobj" ,python-configobj)
175 ("python-dateutil" ,python-dateutil)
176 ("python-itsdangerous" ,python-itsdangerous)
177 ("python-jinja2" ,python-jinja2)
178 ("python-jsonschema" ,python-jsonschema)
179 ("python-lxml" ,python-lxml)
180 ("python-markdown" ,python-markdown)
181 ("python-oauthlib" ,python-oauthlib)
182 ("python-pillow" ,python-pillow)
183 ("python-py-bcrypt" ,python-py-bcrypt)
184 ("python-pyld" ,python-pyld)
185 ("python-pytz" ,python-pytz)
186 ("python-requests" ,python-requests)
187 ("python-setuptools" ,python-setuptools)
188 ("python-six" ,python-six)
189 ("python-sphinx" ,python-sphinx)
190 ("python-docutils" ,python-docutils)
191 ("python-sqlalchemy" ,python-sqlalchemy)
192 ("python-unidecode" ,python-unidecode)
193 ;; ("python-werkzeug" ,python-werkzeug) ; Broken due to missing werkzeug.contrib.atom in 1.0.0.
194 ("python-exif-read" ,python-exif-read)
195 ("python-wtforms" ,python-wtforms)))
196 (home-page "http://mediagoblin.org/")
197 (synopsis "Web application for media publishing")
198 (description "MediaGoblin is a web application for publishing all kinds of
203 (inherit mediagoblin)
204 (name "mediagoblin-hackenv")
207 `(;;; audio/video stuff
208 ("gstreamer" ,gstreamer)
209 ("gst-libav" ,gst-plugins-base)
210 ("gst-plugins-base" ,gst-plugins-base)
211 ("gst-plugins-good" ,gst-plugins-good)
212 ("gst-plugins-bad" ,gst-plugins-bad)
213 ("gst-plugins-ugly" ,gst-plugins-ugly)
214 ("gobject-introspection" ,gobject-introspection)
216 ("coreutils" ,coreutils)
217 ;; used by runtests.sh!
220 ("automake" ,automake)
221 ("autoconf" ,autoconf)
222 ,@(package-inputs mediagoblin)))
225 ("python-virtualenv" ,python-virtualenv)
226 ("python-pygobject" ,python-pygobject)
227 ("python-gst" ,python-gst)
228 ;; Needs python-gst in order for all tests to pass
229 ("python-numpy" ,python-numpy) ; this pulls in texlive...
230 ; and texlive-texmf is very large...
231 ("python-chardet", python-chardet)
232 ("python-psycopg2" ,python-psycopg2)
237 ,@(package-propagated-inputs mediagoblin))))