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 : process-files ( seq -- newseq )
39 [ dup string? [ [ t ] 2array ] when ] map
40 [ second call ] subset
43 : add-module ( module -- )
44 dup module-name swap 2array modules get push ;
46 : remove-module ( name -- )
47 modules get [ first = ] find-with nip
48 [ modules get delete ] when* ;
50 : provide ( name files tests -- )
52 [ process-files ] 2apply <module>
53 [ module-files run-files ] keep
56 : test-module ( name -- ) module module-tests run-tests ;
58 : all-modules ( -- seq ) modules get [ second ] map ;
60 : all-module-names ( -- seq ) modules get [ first ] map ;
63 all-modules [ module-tests ] map concat run-tests ;
66 all-module-names natural-sort [ print ] each ;
68 : reload-module ( module -- )
69 dup module-name module-def source-modified? [
70 module-name load-module
72 module-files [ source-modified? ] subset run-files
75 : reload-modules ( -- )
76 all-modules [ reload-module ] each do-parse-hook ;