1 ! Copyright (C) 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: hashtables io kernel namespaces parser sequences
5 test words strings arrays math ;
9 TUPLE: module name files tests ;
11 : module-def ( name -- path )
12 "resource:" over ".factor" append3
13 dup ?resource-path exists? [
16 drop "resource:" swap "/load.factor" append3
19 : prefix-paths ( name seq -- newseq )
20 [ path+ "resource:" swap append ] map-with ;
22 C: module ( name files tests -- module )
23 [ >r >r over r> prefix-paths r> set-module-tests ] keep
24 [ >r dupd prefix-paths r> set-module-files ] keep
25 [ set-module-name ] keep ;
27 : module modules get assoc ;
29 : load-module ( name -- )
31 "Loading module " write dup write "..." print
32 [ dup module-def run-file ] assert-depth drop
36 dup module [ drop ] [ load-module ] if do-parse-hook ;
38 : run-files ( seq -- )
41 [ parse-file % ] [ run-file ] ? each
44 : process-files ( seq -- newseq )
45 [ dup string? [ [ t ] 2array ] when ] map
46 [ second call ] subset
49 : add-module ( module -- )
50 dup module-name swap 2array modules get push ;
52 : remove-module ( name -- )
53 modules get [ first = ] find-with nip
54 [ modules get delete ] when* ;
56 : provide ( name files tests -- )
58 [ process-files ] 2apply <module>
59 [ module-files run-files ] keep
62 : test-module ( name -- ) module module-tests run-tests ;
64 : all-modules ( -- seq ) modules get [ second ] map ;
66 : all-module-names ( -- seq ) modules get [ first ] map ;
69 all-modules [ module-tests ] map concat run-tests ;
72 all-module-names natural-sort [ print ] each ;
74 : reload-module ( module -- )
75 dup module-name module-def source-modified? [
76 module-name load-module
78 module-files [ source-modified? ] subset run-files
81 : reload-modules ( -- )
82 all-modules [ reload-module ] each do-parse-hook ;