about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMunyoki Kilyungi2024-10-21 13:53:56 +0300
committerMunyoki Kilyungi2024-10-21 13:53:56 +0300
commit2e954105f3cdd1a93c41f8e3168677ac0355e94f (patch)
treedf8f0a5a1e1c246a3dccf0ffabc8107680d1a611
parentc0936aea74122ea225966b2a353a59a174b2a7b7 (diff)
downloadgn-transform-databases-2e954105f3cdd1a93c41f8e3168677ac0355e94f.tar.gz
Use (guix build utils) to generate, validate, and version TTL files.
Signed-off-by: Munyoki Kilyungi <me@bonfacemunyoki.com>
-rwxr-xr-xgenerate-ttl-files.scm108
1 files changed, 57 insertions, 51 deletions
diff --git a/generate-ttl-files.scm b/generate-ttl-files.scm
index cf9d2a0..2f14b25 100755
--- a/generate-ttl-files.scm
+++ b/generate-ttl-files.scm
@@ -1,61 +1,67 @@
-#! ./pre-inst-env
+#! /usr/bin/env guile
 !#
+
 (use-modules (ice-9 format)
-             (ice-9 futures)
              (ice-9 getopt-long)
-             (ice-9 ftw))
+             (guix build utils)
+             (srfi srfi-26)
+             (srfi srfi-34)
+             (srfi srfi-35))
+
+
+(define (call-with-temporary-directory proc)
+  (let ((tmp-dir (mkdtemp "/tmp/generate-ttl-files.XXXXXX")))
+    (dynamic-wind
+      (const #t)
+      (cut proc tmp-dir)
+      (cut delete-file-recursively tmp-dir))))
 
 (let* ((option-spec
         '((settings (single-char #\s) (value #t))
-          (output (single-char #\o) (value #t))
-          (documentation (single-char #\d) (value #t))))
+          (documentation (single-char #\d) (value #t))
+          (output (single-char #\o) (value #t))))
        (options (getopt-long (command-line) option-spec))
-       (settings (option-ref options 'settings #f))
-       (output (option-ref options 'output #f))
-       (documentation (option-ref options 'documentation #f)))
-  (define (enter? name stat result)
-    stat result            ;ignore
-    ;; Skip version control directories if any.
-    (not (member (basename name) '(".git" ".svn" "CVS"))))
-
-  (define (leaf name stat result)
-    stat result                         ;ignore
-    (when (string-suffix? ".scm" name)
-      (let* ((base-file-name (basename name ".scm"))
-             (cmd (format #f " ~a --settings ~a --output ~a --documentation ~a"
-                          name
-                          settings
-                          (string-append output "/" base-file-name ".ttl")
-                          (string-append documentation "/" base-file-name ".md"))))
-        (unless (string? base-file-name "dataset-metadata-git")
-          (touch
-           (future
-            (begin
-              (display (format #f "Running ~a" cmd))
-              (display "\n")
-              (system cmd))))))))
-
-  (define (down name stat result)
-    name stat                         ;ignore
-    result)
-
-  (define (up name stat result)
-    name stat                           ;ignore
-    result)
-
-  (define (skip name stat result)
-    name stat                           ;ignore
-    result)
-
-  ;; Ignore unreadable files/directories but warn the user.
-  (define (error name stat errno result)
-    stat                                ;ignore
-    (format (current-error-port) "warning: ~a: ~a~%"
-            name (strerror errno))
-    result)
+       (settings (canonicalize-path (option-ref options 'settings #f)))
+       (output (canonicalize-path (option-ref options 'output #f)))
+       (documentation (canonicalize-path (option-ref options 'documentation #f)))
+       (%source-dir (dirname (current-filename))))
+  (call-with-temporary-directory
+   (lambda (tmpdir)
+     (let* ((gn-docs-dir (string-append tmpdir "/gn-docs"))
+            (rdf-documentation (string-append gn-docs-dir "/rdf-documentation")))
+       (unless (file-exists? output)
+         (mkdir-p output))
 
-  (file-system-fold enter? leaf down up skip error
-                    0                  ;initial counter is zero bytes
-                    "./examples"))
+       (invoke "git" "clone" "--depth" "1"
+               documentation gn-docs-dir)
+       ;; Delete all the files in the gn-docs/rdf-documentation
+       (delete-file-recursively rdf-documentation)
+       (mkdir-p rdf-documentation)
+       ;; Transform data to RDF
+       (for-each (lambda (file)
+                   (let* ((base-file-name (basename file ".scm"))
+                          (pre-inst-env (canonicalize-path "./pre-inst-env"))
+                          (ttl-file (string-append (canonicalize-path output)
+                                                   "/" base-file-name ".ttl"))
+                          (md-file (format #f "~a/~a.md" rdf-documentation base-file-name)))
+                     ;; Ignore dataset-metadata-git.scm because TODO
+                     (unless (string=? base-file-name "dataset-metadata-git")
+                       (invoke "./pre-inst-env" file "--settings" settings
+                               "--output" ttl-file
+                               "--documentation" md-file))))
+                 (find-files "./examples" ".scm"))
+       (copy-recursively "./schema" output)
+       ;; Validate transformed turtle files
+       (for-each (lambda (file)
+                   (invoke "rapper" "--input" "turtle" "--count" file))
+                 (append (find-files output ".ttl")
+                         (find-files "./schema" ".ttl")))
+       ;; Push changes to git when data is correctly valldated
+       (guard (c ((invoke-error? c)
+                  (invoke "git" "-C" gn-docs-dir "add" rdf-documentation)
+                  (invoke "git" "-C" gn-docs-dir "commit" "--no-gpg-sign" "-m"
+                          "Update RDF documentation.\n\n* Commit made via the generate-ttl-files.scm script\"")
+                  (invoke "git" "-C" gn-docs-dir "push" "origin" "master")))
+         (invoke "git" "-C" gn-docs-dir "diff" "--exit-code"))))))