aboutsummaryrefslogtreecommitdiff
path: root/genenetwork/development-helper.scm
diff options
context:
space:
mode:
Diffstat (limited to 'genenetwork/development-helper.scm')
-rw-r--r--genenetwork/development-helper.scm159
1 files changed, 159 insertions, 0 deletions
diff --git a/genenetwork/development-helper.scm b/genenetwork/development-helper.scm
new file mode 100644
index 0000000..e8364ef
--- /dev/null
+++ b/genenetwork/development-helper.scm
@@ -0,0 +1,159 @@
+;;; genenetwork-machines --- Guix configuration for genenetwork machines
+;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net>
+;;;
+;;; This file is part of genenetwork-machines.
+;;;
+;;; genenetwork-machines is free software: you can redistribute it
+;;; and/or modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation, either version 3 of
+;;; the License, or (at your option) any later version.
+;;;
+;;; genenetwork-machines is distributed in the hope that it will be
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;;; See the GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with genenetwork-machines. If not, see
+;;; <https://www.gnu.org/licenses/>.
+
+(define-module (genenetwork development-helper)
+ #:use-module (ice-9 match)
+ #:use-module (guix gexp)
+ #:use-module (guix profiles)
+ #:use-module (guix search-paths)
+ #:use-module (forge build utils))
+
+(define (command-in-source-gexp source profile command)
+ "Return a G-expression that runs COMMAND in PROFILE and with SOURCE
+as the current directory. SOURCE and PROFILE are store items. COMMAND
+is a list of strings specifying the command to be executed."
+ (with-imported-modules '((guix build utils))
+ (with-profile profile
+ #~(begin
+ (use-modules (rnrs exceptions)
+ (guix build utils))
+
+ (chdir #$source)
+ (guard (condition ((invoke-error? condition)
+ (format (current-error-port)
+ "`~a~{ ~a~}' failed with exit status ~a~%"
+ (invoke-error-program condition)
+ (invoke-error-arguments condition)
+ (invoke-error-exit-status condition))
+ (exit #f)))
+ (apply invoke '#$command))
+ (mkdir-p #$output)))))
+
+(define (asdf-test-gexp source profile system asd-files)
+ "Return a G-expression that tests SYSTEM using asdf after loading
+ASD-FILES. SOURCE is the source code under test. PROFILE is a profile
+with all necessary dependencies. SOURCE and PROFILE are both store
+items."
+ (with-imported-modules '((guix build lisp-utils)
+ (guix build utils))
+ (with-profile profile
+ #~(begin
+ (use-modules (guix build lisp-utils)
+ (guix build utils))
+
+ (chdir #$source)
+ (setenv "HOME" "/tmp")
+ (parameterize ((%lisp "sbcl")
+ (%lisp-type "sbcl"))
+ (test-system #$system '#$asd-files #f))
+ (mkdir-p #$output)))))
+
+(define (genenetwork3-lint-gexp genenetwork3-source profile)
+ "Return a G-expression that runs GeneNetwork3 lint tests in PROFILE
+with GENENETWORK3-SOURCE as the current directory. GENENETWORK3-SOURCE
+is a checkout of the genenetwork3 source code. PROFILE is a profile
+with genenetwork3 dependencies."
+ (with-imported-modules '((guix build utils))
+ (with-profile profile
+ #~(begin
+ (use-modules (rnrs exceptions)
+ (srfi srfi-26)
+ (ice-9 rdelim)
+ (guix build utils))
+
+ (define (shell-script? filename stat-obj)
+ (and (eq? (stat:type stat-obj) 'regular)
+ (call-with-input-file filename
+ (lambda (port)
+ (let ((first-line (read-line port)))
+ (and (not (eof-object? first-line))
+ (> (string-length first-line) 2)
+ (string=? (string-take first-line 2) "#!")
+ (or (string-contains first-line "/bin/sh")
+ (string-contains first-line "/bin/bash"))))))))
+
+ (chdir #$genenetwork3-source)
+ (guard (condition ((invoke-error? condition)
+ (format (current-error-port)
+ "`~a~{ ~a~}' failed with exit status ~a~%"
+ (invoke-error-program condition)
+ (invoke-error-arguments condition)
+ (invoke-error-exit-status condition))
+ (exit #f)))
+ (for-each (cut invoke "shellcheck" <>)
+ (find-files "." shell-script?))
+ (invoke "pylint" "gn3"))
+ (mkdir-p #$output)))))
+
+(define (genenetwork2-runner-gexp genenetwork2-source profile gn3-port genotype-files)
+ "Return a G-expression that runs the genenetwork2 server for
+GENENETWORK2-SOURCE in PROFILE. GENENETWORK2-SOURCE is a checkout of
+the genenetwork2 source code. PROFILE is a profile with genenetwork2
+dependencies. GN3-PORT is the port on which a local instance of
+genenetwork3 is listening. GENOTYPE-FILES is the path to genotype
+files."
+ (with-imported-modules '((guix build utils))
+ (with-profile profile
+ #~(begin
+ (use-modules (guix build utils)
+ (ice-9 match))
+
+ (chdir #$genenetwork2-source)
+ (match (command-line)
+ ((_ ip port)
+ (setenv "SERVER_PORT" port)
+ (setenv "GN2_PROFILE" #$profile)
+ (setenv "GN_PROXY_URL" "http://genenetwork.org/gn3-proxy")
+ (setenv "GN3_LOCAL_URL"
+ (string-append "http://localhost:"
+ (number->string #$gn3-port)))
+ (setenv "GENENETWORK_FILES" #$genotype-files)
+ (setenv "SQL_URI" "mysql://webqtlout:webqtlout@localhost/db_webqtl")
+ (setenv "HOME" "/tmp")
+ (setenv "NO_REDIS" "no-redis")
+ (invoke "sh" "bin/genenetwork2")))))))
+
+(define (genenetwork3-runner-gexp genenetwork3-source profile)
+ "Return a G-expression that runs the genenetwork3 server for
+GENENETWORK3-SOURCE in PROFILE. GENENETWORK3-SOURCE is a checkout of
+the genenetwork3 source code. PROFILE is a profile with genenetwork3
+dependencies."
+ (with-imported-modules '((guix build utils))
+ (with-profile profile
+ #~(begin
+ (use-modules (guix build utils)
+ (ice-9 match))
+
+ (chdir #$genenetwork3-source)
+ (match (command-line)
+ ((_ ip port)
+ (invoke "gunicorn"
+ "-b" (string-append ip ":" port)
+ "gn3.app:create_app()")))))))
+
+(define (tissue-website-gexp source profile)
+ "Return a G-expression that builds a tissue website from
+SOURCE. PROFILE is a profile with necessary dependencies."
+ (with-imported-modules '((guix build utils))
+ (with-profile profile
+ #~(begin
+ (use-modules (guix build utils))
+
+ (chdir #$source)
+ (invoke "tissue" "web" #$output)))))