-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
file.clj
64 lines (50 loc) · 1.64 KB
/
file.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
(ns pip-license-checker.file
"Reading and parsing files"
(:gen-class)
(:require
[clojure.data.csv :as csv]
[clojure.java.io :as io]))
(defn exists?
"Return true if file exists"
[path]
(.exists (io/file path)))
;; requirements.txt files
(defn path->lines
"Return a vector of file lines
Vector used instead of lazy seq to handle open/close file using with-open"
[path]
(with-open [reader (io/reader path)]
(vec (for [line (line-seq reader)] line))))
(defn get-requirement-lines
"Get a sequence of lines from all requirement files"
[requirements]
(apply concat (for [path requirements] (path->lines path))))
;; CSV files
(def csv-column-indecies-to-read [0 1])
(def csv-header [:package :license])
(def csv-out-of-range-column-index nil)
(defn take-csv-columns
[columns indices]
(for [idx indices]
(nth columns idx csv-out-of-range-column-index)))
(defn csv->lines
"Read CSV file into vector of lines"
[path]
(with-open [reader (io/reader path)]
(let [lines (csv/read-csv reader)
result (vec lines)]
result)))
(defn csv->data
"Read CSV file in format: package-name,license-name[,...] into a map"
[path options]
(let [lines (csv->lines path)
with-headers (:external-csv-headers options)
lines-to-skip (if with-headers 1 0)
data (drop lines-to-skip lines)
selected-columns (map #(take-csv-columns % csv-column-indecies-to-read) data)
result (map zipmap (repeat csv-header) selected-columns)]
result))
(defn get-csv-lines
"Concatenates all parsed CSV files"
[paths with-headers]
(apply concat (for [path paths] (csv->data path with-headers))))