~ chicken-core (chicken-5) 5b9822a1950cc95cc12d847eaeba4caa0479101d


commit 5b9822a1950cc95cc12d847eaeba4caa0479101d
Author:     Kooda <kooda@upyum.com>
AuthorDate: Sat May 5 13:03:44 2018 +0200
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Sun May 13 15:33:41 2018 +0200

    Add a little script to check the consistency between documentation and actual modules
    
    Signed-off-by: Peter Bex <peter@more-magic.net>

diff --git a/distribution/manifest b/distribution/manifest
index a7fccbbd..55e2f286 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -377,6 +377,7 @@ scripts/chicken-flymake
 scripts/chicken-flymake.bat
 scripts/csc-trans
 scripts/compile-all
+scripts/compare-documentation-exports.scm
 scripts/reconstruct-egg-name.scm
 scripts/mini-salmonella.scm
 scripts/make-wrapper.scm
diff --git a/scripts/compare-documentation-exports.scm b/scripts/compare-documentation-exports.scm
new file mode 100644
index 00000000..0334fc81
--- /dev/null
+++ b/scripts/compare-documentation-exports.scm
@@ -0,0 +1,49 @@
+;; This script takes a filename as its first argument, which should be a file
+;; consisting of multiple lists in this format: ((module name) exported-symbol ...)
+;; It imports the specified module and checks that the export list of the module matches
+;; with the one supplied in the file.
+;; This is useful to check that the documentation and module exports are synchronized.
+
+;; TODO make the script read svn-wiki syntax directly
+
+(import chicken.sort srfi-1)
+
+(define *exit-code* 0)
+
+(define (warn msg . args)
+  (apply fprintf (current-error-port)
+         msg args)
+  (set! *exit-code* 1))
+
+(define (module-exports mod)
+  (receive (_ ve se) (##sys#module-exports mod)
+    (sort (append (map car ve) (map car se)) symbol<?)))
+
+(define (symbol<? s1 s2)
+  (string<? (symbol->string s1)
+            (symbol->string s2)))
+
+(define (check-module name exports)
+  (eval `(import ,name))
+  (let* ((exports (sort exports symbol<?))
+         (canonical-name
+          (string->symbol
+            (string-intersperse (map ->string name) ".")))
+         (mod (##sys#find-module canonical-name))
+         (mod-exports (module-exports mod))
+         (diff (lset-difference eqv? exports mod-exports)))
+    (unless (null? diff)
+      (warn "Mismatch is ~a: ~a~%"
+            name diff))))
+
+(define (run-checks filename)
+  (with-input-from-file filename
+    (lambda ()
+      (port-for-each check read))))
+
+(define (check desc)
+  (check-module (car desc) (cdr desc)))
+
+(run-checks (car (command-line-arguments)))
+
+(exit *exit-code*)
Trap