aboutsummaryrefslogtreecommitdiff
;; SPDX-License-Identifier: CC0-1.0

;; Copyright (C) 2022,2023 Wojtek Kosior <koszko@koszko.org>
;;
;; Available under the terms of Creative Commons Zero v1.0 Universal.

(define-module (hydrilla-base)
  #:use-module (ice-9 rdelim)
  #:use-module (ice-9 regex)
  #:use-module (guix build-system python)
  #:use-module (guix download)
  #:use-module (guix gexp)
  #:use-module (guix packages)
  #:use-module ((guix licenses) #:prefix license:)
  #:use-module (gnu packages check)
  #:use-module (gnu packages license)
  #:use-module (gnu packages python-build)
  #:use-module (gnu packages python-check)
  #:use-module (gnu packages python-web)
  #:use-module (gnu packages python-xyz)
  #:export (%source-dir
            %pkg-info-path
            %hydrilla-version
            %source-tarball-name))

(define %source-dir
  (let* ((this-file (search-path %load-path "hydrilla.scm"))
         (proj-dir (dirname (dirname this-file))))
    (if (absolute-file-name? proj-dir)
        proj-dir
        (string-append (getcwd) "/" proj-dir))))

;; The PKG-INFO file is generated when running `python3 -m build -s` or similar.
;; It is also automatically included in the source release tarballs.
(define %pkg-info-path
  (string-append %source-dir "/src/hydrilla.egg-info/PKG-INFO"))

(define %hydrilla-version
  (if (access? %pkg-info-path R_OK)
      (call-with-input-file %pkg-info-path
        (lambda (port)
          (let ((process-line
                 (lambda (self-ref)
                   (let ((match-result
                          (string-match "^Version: (.*)" (read-line port))))
                     (if match-result (match:substring match-result 1)
                         (self-ref self-ref))))))
            (process-line process-line))))
      "unknown"))

(define %source-tarball-name
  (string-append "hydrilla-" %hydrilla-version ".tar.gz"))

(define-public python-types-requests-2.26
  (package
    (name "python-types-requests")
    (version "2.26.0")
    (source (origin
              (method url-fetch)
              (uri (pypi-uri "types-requests" version))
              (sha256
               (base32
                "10sq8jarr642vhw53k6zbf3hn2b8xfyrckwfngml4fj19g1whpnz"))))
    (build-system python-build-system)
    (home-page "https://github.com/python/typeshed")
    (synopsis "Typing stubs for requests")
    (description
     "This package provides a collection of library stubs for Python, with
static types.")
    (license license:asl2.0)))

(define-public hydrilla-without-haketilo
  (package
    (name "hydrilla-without-haketilo")
    (version %hydrilla-version)
    (source
     ;; setuptools_scm makes it impossible to build directly from git
     ;; checkout. We instead build from source tarball generated under ./dist/.
     (local-file (string-append %source-dir "/dist/" %source-tarball-name)))
    (build-system python-build-system)
    (arguments
     `(#:modules ((ice-9 match)
                  (guix build utils)
                  (guix build python-build-system))
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'patch-requirements
           (lambda _
             (substitute* "setup.cfg"
               (("^all = .*")
                "all = flask>=1.1")
               (("[ ]*haketilo = .*:.*" match)
                (string-append "#" match)))))
         (replace 'check
           (lambda* (#:key tests? #:allow-other-keys)
             (when tests?
               (invoke "pytest"))))
         (add-after 'wrap 'prevent-local-package-interference
           (lambda* (#:key outputs #:allow-other-keys)
             (match-let ((((_ . dir)) outputs))
               (for-each (lambda (prog-name)
                           (substitute* (string-append dir "/bin/" prog-name)
                             (("^#!/.*$" shabang)
                              (string-append shabang
                                             "export PYTHONNOUSERSITE=1\n"))))
                         '("hydrilla"
                           "hydrilla-server"
                           "hydrilla-builder"))))))))
    (propagated-inputs
     (list python-click
           python-flask
           python-immutables
           python-jsonschema
           reuse))
    (native-inputs
      (list python-setuptools-scm
            python-babel
            python-pytest
            python-pypa-build
            python-mypy
            (module-ref (current-module) 'python-types-requests
                        python-types-requests-2.26)))
    (home-page "https://hydrillabugs.koszko.org/projects/haketilo/wiki")
    (synopsis "Block JavaScript and add custom logic to web pages")
    (description "Haketilo HTTP proxy facilitates viewing of websites while
having their original JavaScript replaced by user-provided scripts. Haketilo
combines the functionalities of content blocker and user script manager. It can
be used with its script repository, Hydrilla.")
    (license (list license:agpl3+ license:gpl3+ license:cc0))))