diff --git a/basis/vocabs/metadata/metadata-docs.factor b/basis/vocabs/metadata/metadata-docs.factor index 66041e249c..95c8083e0f 100644 --- a/basis/vocabs/metadata/metadata-docs.factor +++ b/basis/vocabs/metadata/metadata-docs.factor @@ -18,6 +18,11 @@ ARTICLE: "vocabs.metadata" "Vocabulary metadata" set-vocab-tags add-vocab-tags } +"Vocabulary resources:" +{ $subsections + vocab-resources + set-vocab-resources +} "Getting and setting arbitrary vocabulary metadata:" { $subsections vocab-file-contents @@ -50,3 +55,11 @@ HELP: set-vocab-tags { $values { "tags" "a sequence of strings" } { "vocab" "a vocabulary specifier" } } { $description "Stores a list of short tags classifying the vocabulary to the " { $snippet "tags.txt" } " file in the vocabulary's directory." } ; +HELP: vocab-resources +{ $values { "vocab" "a vocabulary specifier" } { "patterns" "a sequence of glob patterns" } } +{ $description "Outputs a list of glob patterns matching files that will be deployed with an application that includes " { $snippet "vocab" } ", as specified by the " { $snippet "resources.txt" } " file in the vocabulary's directory. Outputs an empty array if the file doesn't exist." } +{ $notes "The " { $vocab-link "vocabs.metadata.resources" } " vocabulary contains words that will expand the glob patterns and directory names in " { $snippet "patterns" } " and return all the matching files." } ; + +HELP: set-vocab-resources +{ $values { "patterns" "a sequence of glob patterns" } { "vocab" "a vocabulary specifier" } } +{ $description "Stores a list of glob patterns matching files that will be deployed with an application that includes " { $snippet "vocab" } " to the " { $snippet "resources.txt" } " file in the vocabulary's directory." } ; diff --git a/basis/vocabs/metadata/metadata.factor b/basis/vocabs/metadata/metadata.factor index 85a503c7f0..43c7641577 100644 --- a/basis/vocabs/metadata/metadata.factor +++ b/basis/vocabs/metadata/metadata.factor @@ -19,6 +19,15 @@ MEMO: vocab-file-contents ( vocab name -- seq ) 3append throw ] ?if ; +: vocab-resources-path ( vocab -- string ) + vocab-dir "resources.txt" append-path ; + +: vocab-resources ( vocab -- patterns ) + dup vocab-resources-path vocab-file-contents harvest ; + +: set-vocab-resources ( patterns vocab -- ) + dup vocab-resources-path set-vocab-file-contents ; + : vocab-summary-path ( vocab -- string ) vocab-dir "summary.txt" append-path ; @@ -67,4 +76,4 @@ M: vocab-link summary vocab-summary ; dup vocab-authors-path set-vocab-file-contents ; : unportable? ( vocab -- ? ) - vocab-tags "unportable" swap member? ; \ No newline at end of file + vocab-tags "unportable" swap member? ; diff --git a/basis/vocabs/metadata/resources/resources-docs.factor b/basis/vocabs/metadata/resources/resources-docs.factor new file mode 100644 index 0000000000..b4289ff388 --- /dev/null +++ b/basis/vocabs/metadata/resources/resources-docs.factor @@ -0,0 +1,26 @@ +! (c)2010 Joe Groff bsd license +USING: help.markup help.syntax kernel ; +IN: vocabs.metadata.resources + +HELP: expand-vocab-resource-files +{ $values + { "vocab" "a vocabulary specifier" } { "resource-glob-strings" "a sequence of glob patterns" } + { "filenames" "a sequence of filenames" } +} +{ $description "Matches all the glob patterns in " { $snippet "resource-glob-strings" } " to the set of files inside " { $snippet "vocab" } "'s directory and outputs a sequence containing the individual files and directories that match. Any matching directories will also have their contents recursively included in the output. The paths in the output will be relative to " { $snippet "vocab" } "'s directory." } ; + +HELP: vocab-resource-files +{ $values + { "vocab" "a vocabulary specifier" } + { "filenames" "a sequence of filenames" } +} +{ $description "Outputs a sequence containing the individual resource files and directories that match the patterns specified in " { $snippet "vocab" } "'s " { $snippet "resources.txt" } " file. Any matching directories will also have their contents recursively included in the output. The paths in the output will be relative to " { $snippet "vocab" } "'s directory." } ; + +ARTICLE: "vocabs.metadata.resources" "vocabs.metadata.resources" +"The " { $vocab-link "vocabs.metadata.resources" } " vocabulary contains words to retrieve the full list of files that match the patterns specified in a vocabulary's " { $snippet "resources.txt" } " file." +{ $subsections + vocab-resource-files + expand-vocab-resource-files +} ; + +ABOUT: "vocabs.metadata.resources" diff --git a/basis/vocabs/metadata/resources/resources-tests.factor b/basis/vocabs/metadata/resources/resources-tests.factor new file mode 100644 index 0000000000..36fd13125e --- /dev/null +++ b/basis/vocabs/metadata/resources/resources-tests.factor @@ -0,0 +1,19 @@ +! (c)2010 Joe Groff bsd license +USING: sorting tools.test vocabs.metadata.resources ; +IN: vocabs.metadata.resources.tests + +[ { "bar" "bas" "foo" } ] +[ "vocabs.metadata.resources.test.1" vocab-resource-files natural-sort ] unit-test + +[ { "bar.wtf" "foo.wtf" } ] +[ "vocabs.metadata.resources.test.2" vocab-resource-files natural-sort ] unit-test + +[ { + "resource-dir" + "resource-dir/bar" + "resource-dir/bas" + "resource-dir/bas/zang" + "resource-dir/bas/zim" + "resource-dir/buh" + "resource-dir/foo" +} ] [ "vocabs.metadata.resources.test.3" vocab-resource-files natural-sort ] unit-test diff --git a/basis/vocabs/metadata/resources/resources.factor b/basis/vocabs/metadata/resources/resources.factor new file mode 100644 index 0000000000..1da15f6b9e --- /dev/null +++ b/basis/vocabs/metadata/resources/resources.factor @@ -0,0 +1,24 @@ +! (c)2010 Joe Groff bsd license +USING: arrays fry globs io.directories io.files.info +io.pathnames kernel regexp sequences vocabs.loader +vocabs.metadata ; +IN: vocabs.metadata.resources + + + +: expand-vocab-resource-files ( vocab resource-glob-strings -- filenames ) + [ [ find-vocab-root ] [ vocab-dir ] bi append-path ] dip [ ] map '[ + _ filter-resources + [ (expand-vocab-resource) ] map concat + ] with-directory-tree-files ; + +: vocab-resource-files ( vocab -- filenames ) + dup vocab-resources expand-vocab-resource-files ; diff --git a/basis/vocabs/metadata/resources/test/1/1.factor b/basis/vocabs/metadata/resources/test/1/1.factor new file mode 100644 index 0000000000..dddc0ddd58 --- /dev/null +++ b/basis/vocabs/metadata/resources/test/1/1.factor @@ -0,0 +1,6 @@ +USING: io kernel ; +IN: vocabs.metadata.resources.test.1 + +: main ( -- ) "Resources test 1" print ; + +MAIN: main diff --git a/basis/vocabs/metadata/resources/test/1/bar b/basis/vocabs/metadata/resources/test/1/bar new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/1/bas b/basis/vocabs/metadata/resources/test/1/bas new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/1/foo b/basis/vocabs/metadata/resources/test/1/foo new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/1/resources.txt b/basis/vocabs/metadata/resources/test/1/resources.txt new file mode 100644 index 0000000000..ce0f4c956c --- /dev/null +++ b/basis/vocabs/metadata/resources/test/1/resources.txt @@ -0,0 +1,3 @@ +foo +bar +bas diff --git a/basis/vocabs/metadata/resources/test/2/2.factor b/basis/vocabs/metadata/resources/test/2/2.factor new file mode 100644 index 0000000000..82a5a11d18 --- /dev/null +++ b/basis/vocabs/metadata/resources/test/2/2.factor @@ -0,0 +1,6 @@ +USING: io kernel ; +IN: vocabs.metadata.resources.test.2 + +: main ( -- ) "Resources test 2" print ; + +MAIN: main diff --git a/basis/vocabs/metadata/resources/test/2/bar.wtf b/basis/vocabs/metadata/resources/test/2/bar.wtf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/2/bas.ftw b/basis/vocabs/metadata/resources/test/2/bas.ftw new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/2/foo.wtf b/basis/vocabs/metadata/resources/test/2/foo.wtf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf b/basis/vocabs/metadata/resources/test/2/no-resources-here/zim.wtf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/2/resources.txt b/basis/vocabs/metadata/resources/test/2/resources.txt new file mode 100644 index 0000000000..8dfd81c911 --- /dev/null +++ b/basis/vocabs/metadata/resources/test/2/resources.txt @@ -0,0 +1 @@ +*.wtf diff --git a/basis/vocabs/metadata/resources/test/3/3.factor b/basis/vocabs/metadata/resources/test/3/3.factor new file mode 100644 index 0000000000..a81fd707c5 --- /dev/null +++ b/basis/vocabs/metadata/resources/test/3/3.factor @@ -0,0 +1,6 @@ +USING: io kernel ; +IN: vocabs.metadata.resources.test.3 + +: main ( -- ) "Resources test 3" print ; + +MAIN: main diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bar b/basis/vocabs/metadata/resources/test/3/resource-dir/bar new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang b/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zang new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim b/basis/vocabs/metadata/resources/test/3/resource-dir/bas/zim new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/3/resource-dir/foo b/basis/vocabs/metadata/resources/test/3/resource-dir/foo new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/vocabs/metadata/resources/test/3/resources.txt b/basis/vocabs/metadata/resources/test/3/resources.txt new file mode 100644 index 0000000000..c27d538826 --- /dev/null +++ b/basis/vocabs/metadata/resources/test/3/resources.txt @@ -0,0 +1 @@ +resource-dir