Skip to content

Commit 6add7fc

Browse files
author
Francesco Macagno
committed
Support listing in res fs
1 parent 01a8dc7 commit 6add7fc

File tree

6 files changed

+46
-3
lines changed

6 files changed

+46
-3
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Changelog
22

33
## Unreleased
4+
### Added
5+
- Support for listing in resource filesystem.
46

57
## [1.2.3] - 2023-01-09
68
### Fixed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Features:
1919
|[hdfs](#hdfs) |||||||||`hdfs://[host]/path/to/file.txt` |
2020
|[http(s)](#https) || |:cat:| :cat: | | | | |`http[s]://host[:port]/path/to/file.txt`|
2121
|[mem](#mem) |||||||||`mem:///path/to/file.txt` |
22-
|[res](#res) || | || | | | |`res:///com/mypackage/file.txt` |
22+
|[res](#res) || | || | | | |`res:///com/mypackage/file.txt` |
2323
|[s3](#s3) ||||||:dog:|||`s3://bucket/key/with/slashes.txt` |
2424
|[sftp](#sftp) ||:bug:|||:pig: ||||`sftp://host[:port]/path/to/file.txt` |
2525

project.clj

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"-target" "1.8"
4141
"-Xlint:deprecation"
4242
"-Xlint:unchecked"]
43+
:resource-paths ["resources"]
4344

4445
:profiles {:dev {:dependencies [[midje "1.9.2"]]
4546
:plugins [[lein-midje "3.2.1"]]}}

resources/test/test.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
gdbg

src/uio/fs/res.clj

+16-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
; ^^^ triple slash
55
;
66
(ns uio.fs.res
7-
(:require [uio.impl :refer :all])
8-
(:import (clojure.java.api Clojure)))
7+
(:require
8+
[uio.impl :refer :all])
9+
(:import (clojure.java.api Clojure)
10+
(java.io File)))
911

1012
(defn assert-res-url [url]
1113
(if (host url)
@@ -20,3 +22,15 @@
2022
(defmethod exists? :res [url & args] (if (.getResource Clojure (path (assert-res-url url)))
2123
true
2224
false))
25+
26+
(defmethod ls :res [url & args]
27+
(->>
28+
(.substring (path (normalize url)) 1) ; get path and remove leading slash
29+
(.getResources (.getClassLoader Clojure)) ; Multiple resources can have the same name
30+
(enumeration-seq)
31+
(map #(File. (.getPath %)))
32+
(map #(if (.isFile %)
33+
%
34+
(seq (.listFiles %))))
35+
(flatten) ; If it's a directory, flatten the list of files.
36+
(map #(do {:url (str "file://" %)})))) ; expected format is a list of maps

test/uio/fs/test_res.clj

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
(ns uio.fs.test-res
2+
(:require [midje.sweet :refer :all]
3+
[uio.fs.mem :refer :all]
4+
[uio.impl :refer :all]))
5+
6+
(facts "from"
7+
(slurp (from "res:///test/test.txt")) => "gdbg\n")
8+
9+
(facts "exists"
10+
(exists? "res:///") => true
11+
(exists? "res:///test") => true
12+
(exists? "res:///test/") => true
13+
(exists? "res:///test/te") => false
14+
(exists? "res:///test/test.txt") => true)
15+
16+
(facts "Listing"
17+
(fact "listing root succeeds"
18+
(ls "res:///") =not=> [])
19+
(fact "listing test dir gives correct results"
20+
(count (ls "res:///test/")) => 1
21+
(:url (first (ls "res:///test"))) => (has-suffix "test/test.txt")
22+
(:url (first (ls "res:///test/"))) => (has-suffix "test/test.txt"))
23+
(fact "listing test file returns just the same file"
24+
(count (ls "res:///test/test.txt")) => 1
25+
(:url (first (ls "res:///test/test.txt"))) => (has-suffix "test/test.txt")))

0 commit comments

Comments
 (0)