Skip to content

Commit 78cf16c

Browse files
authored
Use goog.i18n.DateTimeFormat (xapix-io#103)
1 parent 369be72 commit 78cf16c

File tree

11 files changed

+99
-77
lines changed

11 files changed

+99
-77
lines changed

.github/workflows/publish.yml

+6-2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ jobs:
4545
sed -i 's;<version/>;<version>${{ env.GIT_TAG }}</version>;' pom.xml
4646
sed -i 's;<tag/>;<tag>${{ github.sha }}</tag>;' pom.xml
4747
48+
- name: Compile java classes
49+
run: |
50+
javac $(find . -name '*.java' -type f)
51+
4852
- name: Update pom.xml
4953
run: clojure -Srepro -Spom
5054

@@ -94,11 +98,11 @@ jobs:
9498
- name: Install NodeJS
9599
uses: actions/setup-node@v1
96100
with:
97-
node-version: 12.13.x
101+
node-version: 13.9.x
98102

99103
- name: Build JS
100104
run: |
101-
clojure -A:1.10:cljs -m cljs.main -co axel_f.min.js.edn --compile
105+
clojure -A:cljs:cljs-build
102106
103107
- name: Prepare package
104108
run: |

.github/workflows/tests.yml

+3-11
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,14 @@ jobs:
88
tests:
99
runs-on: ubuntu-latest
1010

11-
strategy:
12-
matrix:
13-
clojure: [ 1.9, latest ]
14-
1511
steps:
1612
- uses: actions/setup-java@v1
1713
with:
1814
java-version: '1.8'
1915

2016
- uses: actions/setup-node@v1
21-
if: matrix.clojure == 'latest'
2217
with:
23-
node-version: '10.x'
18+
node-version: '13.9.x'
2419

2520
- uses: DeLaGuardo/[email protected]
2621
with:
@@ -29,7 +24,6 @@ jobs:
2924
- uses: actions/checkout@v1
3025

3126
- name: Prepare npm modules for tests
32-
if: matrix.clojure == 'latest'
3327
run: |
3428
npm install ws isomorphic-ws
3529
@@ -47,15 +41,13 @@ jobs:
4741
4842
- name: Run tests
4943
run: |
50-
clojure -A:${{ matrix.clojure }}:kaocha:unit --plugin cloverage
44+
./bin/kaocha clj --plugin cloverage
5145
5246
- name: Run JS tests
53-
if: matrix.clojure == 'latest'
5447
run: |
55-
clojure -A:${{ matrix.clojure }}:kaocha:unit-cljs
48+
./bin/kaocha cljs
5649
5750
- name: Upload test coverage results
5851
uses: codecov/[email protected]
59-
if: matrix.clojure == 'latest'
6052
with:
6153
token: ${{secrets.CODECOV_TOKEN}}

bin/kaocha

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
3+
clojure -A:cljs:test -m kaocha.runner "$@"

deps.edn

+7-25
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,13 @@
88
:paths ["src"]
99

1010
:aliases
11-
{:cljs {:extra-deps {org.clojure/clojurescript {:mvn/version "RELEASE"}}}
11+
{:cljs {:extra-deps {org.clojure/clojurescript {:mvn/version "1.10.758"}}}
1212

13-
:cljs-repl {:extra-deps {com.bhauman/figwheel-main {:mvn/version "0.2.3"}
14-
com.bhauman/rebel-readline-cljs {:mvn/version "0.1.4"}}
15-
:extra-paths ["dev" "target"]
16-
:main-opts ["-m" "figwheel.main" "-b" "dev" "-r"]}
13+
:cljs-repl {:main-opts ["-m" "cljs.main" "-co" "axel_f.dev.js.edn" "--repl"]}
1714

18-
:bench {:extra-deps {criterium {:mvn/version "0.4.5"}
19-
com.taoensso/tufte {:mvn/version "2.1.0-RC4"}}}
15+
:cljs-build {:main-opts ["-m" "cljs.main" "-co" "axel_f.min.js.edn" "--compile"]}
2016

21-
:1.9 {:override-deps {org.clojure/clojure {:mvn/version "1.9.0"}}}
22-
23-
:1.10 {:override-deps {org.clojure/clojure {:mvn/version "1.10.1"}}}
24-
25-
:latest {:override-deps {org.clojure/clojure {:mvn/version "1.10.1"}}}
26-
27-
:kaocha {:extra-paths ["test"]
28-
:extra-deps {lambdaisland/kaocha {:mvn/version "0.0-554"}
29-
lambdaisland/kaocha-cloverage {:mvn/version "0.0-41"}
30-
lambdaisland/kaocha-cljs {:mvn/version "0.0-59"}}}
31-
32-
:unit {:main-opts ["-m" "kaocha.runner" "unit"]}
33-
34-
:unit-cljs {:main-opts ["-m" "kaocha.runner" "unit-cljs"]
35-
:extra-deps {org.clojure/clojurescript {:mvn/version "RELEASE"}}
36-
:override-deps {org.clojure/clojure {:mvn/version "1.10.1"}}}
37-
38-
:watch {:main-opts ["-m" "kaocha.runner" "unit" "--watch"]}}}
17+
:test {:extra-paths ["test"]
18+
:extra-deps {lambdaisland/kaocha {:mvn/version "1.0.629"}
19+
lambdaisland/kaocha-cloverage {:mvn/version "1.0-45"}
20+
lambdaisland/kaocha-cljs {:mvn/version "0.0-71"}}}}}

src/axel_f/buddy/codecs/base64.cljc

+4-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
(Base64/encodeBase64URLSafe ^bytes data)
2828
(Base64/encodeBase64 ^bytes data))
2929
:cljs (codecs/to-bytes
30-
((if urlsafe? trim-padding identity) (base64/encodeByteArray data urlsafe?)))))))
30+
(base64/encodeByteArray data
31+
(if urlsafe?
32+
base64/Alphabet.WEBSAFE_NO_PADDING
33+
base64/Alphabet.DEFAULT)))))))
3134

3235
(defn decode
3336
"Decode base64 data into byte array.

src/axel_f/excel/coerce.cljc

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(ns axel-f.excel.coerce
22
#?(:clj (:require [clojure.edn :as edn])))
33

4-
(defn excel-type [x]
4+
(defn excel-type [x & _]
55
(cond
66
#?@(:clj [(ratio? x) :ratio])
77
(number? x) :number
@@ -40,25 +40,26 @@
4040

4141
(defmethod excel-number :null [_] 0)
4242

43-
(defmulti excel-str excel-type)
43+
(defmulti excel-string excel-type)
4444

45-
(defmethod excel-str :default [x]
45+
(defmethod excel-string :default [x & _]
4646
(str x))
4747

48-
(defmethod excel-str :boolean [b]
48+
(defmethod excel-string :boolean [b & _]
4949
(if b "TRUE" "FALSE"))
5050

51-
(defmethod excel-str :null [_]
51+
(defmethod excel-string :null [_ & _]
5252
"NULL")
5353

5454
#?(:clj
55-
(defmethod excel-str :ratio [r]
55+
(defmethod excel-string :ratio [r & _]
5656
(str (double r))))
5757

5858
(defn to-string*
5959
"Tries to coerce given value to a string type. Returns null for empty value."
60-
[^{:doc "Any object to coerce to a string."} obj]
61-
(when obj (str obj)))
60+
[^{:doc "Any object to coerce to a string."} obj
61+
& ^{:doc "Optional arguments"} opts]
62+
(when obj (apply (partial excel-string obj) opts)))
6263

6364
(def to-string #'to-string*)
6465

src/axel_f/excel/date.cljc

+41-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
(ns axel-f.excel.date
2-
(:require #?(:clj [java-time :as jt])
2+
(:require #?(:clj [java-time :as jt]
3+
:cljs [goog.i18n.DateTimeFormat])
34
[axel-f.excel.coerce :as coerce])
45
#?(:clj (:import java.time.ZoneOffset
56
java.time.ZoneId)))
@@ -13,22 +14,51 @@
1314
#?(:cljs (defmethod coerce/excel-number js/Date [jsd]
1415
(Math/round (/ (.getTime jsd) 1000))))
1516

17+
#?(:clj (defmethod coerce/excel-string java.time.LocalDate
18+
([ld] (str ld))
19+
([ld fmt] (jt/format fmt ld))))
20+
21+
#?(:clj (defmethod coerce/excel-string java.time.LocalDateTime
22+
([ldt] (str ldt))
23+
([ldt fmt] (jt/format fmt ldt))))
24+
25+
#?(:cljs (defmethod coerce/excel-string js/Date
26+
([jsd]
27+
(coerce/excel-string jsd (case (.-AxelFType jsd)
28+
:local-date "YYYY-MM-dd"
29+
:local-date-time "YYYY-MM-dd'T'HH:mm:ss.SSS"
30+
(throw (ex-info "Please specify format for date to string conversion" {})))))
31+
([jsd fmt]
32+
(let [formatter (goog.i18n.DateTimeFormat. fmt)]
33+
(.format formatter jsd)))))
34+
1635
(defn NOW*
1736
"Returns the current date and time as a date value."
1837
[]
1938
#?(:clj (jt/local-date-time)
20-
:cljs (js/Date.)))
39+
:cljs (let [n (js/Date.)
40+
ldt (js/Date. (js/Date.UTC (.getUTCFullYear n)
41+
(.getUTCMonth n)
42+
(.getUTCDate n)
43+
(.getUTCHours n)
44+
(.getUTCMinutes n)
45+
(.getUTCSeconds n)
46+
(.getUTCMilliseconds n)))]
47+
(set! (.-AxelFType ldt) :local-date-time)
48+
ldt)))
2149

2250
(def NOW #'NOW*)
2351

2452
(defn TODAY*
2553
"Returns the current date as a date value."
2654
[]
2755
#?(:clj (jt/local-date)
28-
:cljs (let [n (js/Date.)]
29-
(js/Date. (js/Date.UTC (.getUTCFullYear n)
30-
(.getUTCMonth n)
31-
(.getUTCDate n))))))
56+
:cljs (let [n (js/Date.)
57+
ld (js/Date. (js/Date.UTC (.getUTCFullYear n)
58+
(.getUTCMonth n)
59+
(.getUTCDate n)))]
60+
(set! (.-AxelFType ld) :local-date)
61+
ld)))
3262

3363
(def TODAY #'TODAY*)
3464

@@ -40,9 +70,11 @@
4070
#?(:clj (jt/local-date (coerce/excel-number year)
4171
(coerce/excel-number month)
4272
(coerce/excel-number day))
43-
:cljs (js/Date. (js/Date.UTC (coerce/excel-number year)
44-
(dec (coerce/excel-number month))
45-
(coerce/excel-number day)))))
73+
:cljs (let [d (js/Date. (js/Date.UTC (coerce/excel-number year)
74+
(dec (coerce/excel-number month))
75+
(coerce/excel-number day)))]
76+
(set! (.-AxelFType d) :local-date)
77+
d)))
4678

4779
(def DATE #'DATE*)
4880

src/axel_f/excel/operators.cljc

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@
9797
"Concatenate two strings."
9898
[^{:doc "String or number that can be coerced to string."} x
9999
^{:doc "String or number that can be coerced to string."} y]
100-
(str (coerce/excel-str x)
101-
(coerce/excel-str y)))
100+
(str (coerce/excel-string x)
101+
(coerce/excel-string y)))
102102

103103
(def concatenate #'concatenate*)
104104

src/axel_f/excel/text.cljc

+17-17
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
(defn CODE*
6363
"Returns the numeric Unicode map value of the first character in the string provided."
6464
[text]
65-
(let [text (coerce/excel-str text)
65+
(let [text (coerce/excel-string text)
6666
res #?(:clj (some-> text first int)
6767
:cljs (.charCodeAt text 0))]
6868
#?(:clj res
@@ -102,8 +102,8 @@
102102
(defn EXACT*
103103
"Tests whether two strings are identical."
104104
[str1 str2]
105-
(= (coerce/excel-str str1)
106-
(coerce/excel-str str2)))
105+
(= (coerce/excel-string str1)
106+
(coerce/excel-string str2)))
107107

108108
(def EXACT #'EXACT*)
109109

@@ -141,14 +141,14 @@
141141
(let [text (cond
142142
(string? text) text
143143
(seqable? text) (first text))]
144-
(count (coerce/excel-str text))))
144+
(count (coerce/excel-string text))))
145145

146146
(def LEN #'LEN*)
147147

148148
(defn LOWER*
149149
"Converts a specified string to lowercase."
150150
[text]
151-
(string/lower-case (coerce/excel-str text)))
151+
(string/lower-case (coerce/excel-string text)))
152152

153153
(def LOWER #'LOWER*)
154154

@@ -157,7 +157,7 @@
157157
[text start number]
158158
(let [start (coerce/excel-number start)
159159
number (coerce/excel-number number)
160-
text (coerce/excel-str text)
160+
text (coerce/excel-string text)
161161
text-end (count text)
162162
params-start (dec start)
163163
params-end (+ (dec start) number)
@@ -174,7 +174,7 @@
174174
(defn PROPER*
175175
"Capitalizes each word in a specified string."
176176
[text]
177-
(string/replace (coerce/excel-str text) #"\w*" string/capitalize))
177+
(string/replace (coerce/excel-string text) #"\w*" string/capitalize))
178178

179179
(def PROPER #'PROPER*)
180180

@@ -210,7 +210,7 @@
210210
(let [position (coerce/excel-number position)
211211
length (coerce/excel-number length)]
212212
(str (subs text 0 (dec position))
213-
(coerce/excel-str new-text)
213+
(coerce/excel-string new-text)
214214
(subs text (+ (dec position) length)))))
215215

216216
(def REPLACE #'REPLACE*)
@@ -267,11 +267,11 @@
267267
remove-empty-text)
268268
not-empty
269269
identity)
270-
(string/split (coerce/excel-str text)
270+
(string/split (coerce/excel-string text)
271271
(re-pattern (if split-by-each
272272
(string/join "|" (map regex-escape
273-
(vec (coerce/excel-str delimeter))))
274-
(regex-escape (coerce/excel-str delimeter))))
273+
(vec (coerce/excel-string delimeter))))
274+
(regex-escape (coerce/excel-string delimeter))))
275275
-1)))
276276

277277
(def SPLIT #'SPLIT*)
@@ -298,9 +298,9 @@
298298
(let [occurrence (cond
299299
(nil? occurrence) :all
300300
:else (coerce/excel-number occurrence))]
301-
(substitute-fn* (coerce/excel-str text)
302-
(coerce/excel-str old-text)
303-
(coerce/excel-str new-text)
301+
(substitute-fn* (coerce/excel-string text)
302+
(coerce/excel-string old-text)
303+
(coerce/excel-string new-text)
304304
occurrence)))
305305

306306
(def SUBSTITUTE #'SUBSTITUTE*)
@@ -320,7 +320,7 @@
320320
"Removes leading, trailing, and repeated spaces in text."
321321
[& args]
322322
(string/trim
323-
(string/replace (-> args first coerce/excel-str) #"\ +" " ")))
323+
(string/replace (-> args first coerce/excel-string) #"\ +" " ")))
324324

325325
(def TRIM #'TRIM*)
326326

@@ -329,7 +329,7 @@
329329
[& args]
330330
(-> args
331331
first
332-
coerce/excel-str
332+
coerce/excel-string
333333
string/upper-case))
334334

335335
(def UPPER #'UPPER*)
@@ -353,7 +353,7 @@
353353
(let [items (flatten items)
354354
items (if ignore-empty (keep identity items) items)]
355355
(->> items
356-
(map coerce/excel-str)
356+
(map coerce/excel-string)
357357
(string/join delimeter))))
358358

359359
(def TEXTJOIN #'TEXTJOIN*)

test/axel_f/date_test.cljc

+4
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,7 @@
6767
(t/testing "local date time"
6868
(t/is ((af/compile "NOW() > 0")))
6969
(t/is ((af/compile "NOW() > DATE(1988, 8, 21)")))))
70+
71+
(t/deftest format-test
72+
(t/is (= "1988-08-21" ((af/compile "coerce.to-string(DATE(1988, 8, 21))"))))
73+
(t/is (= "Aug-88-21" ((af/compile "coerce.to-string(DATE(1988, 8, 21), 'MMM-yy-dd')")))))

0 commit comments

Comments
 (0)