some minor cleanups, argument renaming for clarity, etc
This commit is contained in:
parent
2ab1aaffe0
commit
cee04ee347
|
@ -11,7 +11,7 @@
|
||||||
vwowrla.core.utils))
|
vwowrla.core.utils))
|
||||||
|
|
||||||
(defn- ignore-interaction?
|
(defn- ignore-interaction?
|
||||||
[entity-name ignore-entity-list {:keys [target-name source-name] :as parsed-line}]
|
[entity-name ignore-entity-list {:keys [target-name source-name] :as event}]
|
||||||
(and (or (= entity-name target-name)
|
(and (or (= entity-name target-name)
|
||||||
(= entity-name source-name))
|
(= entity-name source-name))
|
||||||
(or (contained-in? target-name ignore-entity-list)
|
(or (contained-in? target-name ignore-entity-list)
|
||||||
|
@ -21,20 +21,20 @@
|
||||||
"returns true if the given parsed combat log line is between entities that have
|
"returns true if the given parsed combat log line is between entities that have
|
||||||
been specified to ignore interactions between for the purposes of detecting
|
been specified to ignore interactions between for the purposes of detecting
|
||||||
an encounter trigger"
|
an encounter trigger"
|
||||||
[encounter :- Encounter
|
[encounter :- Encounter
|
||||||
parsed-line :- CombatEvent]
|
event :- CombatEvent]
|
||||||
(->> (:entities encounter)
|
(->> (:entities encounter)
|
||||||
(filter
|
(filter
|
||||||
(fn [[entity-name entity-props]]
|
(fn [[entity-name entity-props]]
|
||||||
(seq (:ignore-interactions-with entity-props))))
|
(seq (:ignore-interactions-with entity-props))))
|
||||||
(filter
|
(filter
|
||||||
(fn [[entity-name entity-props]]
|
(fn [[entity-name entity-props]]
|
||||||
(ignore-interaction? entity-name (:ignore-interactions-with entity-props) parsed-line)))
|
(ignore-interaction? entity-name (:ignore-interactions-with entity-props) event)))
|
||||||
(seq)
|
(seq)
|
||||||
(boolean)))
|
(boolean)))
|
||||||
|
|
||||||
(defn- ignore-skill?
|
(defn- ignore-skill?
|
||||||
[entity-name ignore-skill-list {:keys [source-name skill] :as parsed-line}]
|
[entity-name ignore-skill-list {:keys [source-name skill] :as event}]
|
||||||
(and (= entity-name source-name)
|
(and (= entity-name source-name)
|
||||||
(contained-in? skill ignore-skill-list)))
|
(contained-in? skill ignore-skill-list)))
|
||||||
|
|
||||||
|
@ -42,15 +42,15 @@
|
||||||
"returns true if the given parsed combat log line is for an encounter entity
|
"returns true if the given parsed combat log line is for an encounter entity
|
||||||
that is using a skill that has been specifically indicated should be ignored
|
that is using a skill that has been specifically indicated should be ignored
|
||||||
for the purposes of triggering an encounter"
|
for the purposes of triggering an encounter"
|
||||||
[encounter :- Encounter
|
[encounter :- Encounter
|
||||||
parsed-line :- CombatEvent]
|
event :- CombatEvent]
|
||||||
(->> (:entities encounter)
|
(->> (:entities encounter)
|
||||||
(filter
|
(filter
|
||||||
(fn [[entity-name entity-props]]
|
(fn [[entity-name entity-props]]
|
||||||
(seq (:ignore-skills entity-props))))
|
(seq (:ignore-skills entity-props))))
|
||||||
(filter
|
(filter
|
||||||
(fn [[entity-name entity-props]]
|
(fn [[entity-name entity-props]]
|
||||||
(ignore-skill? entity-name (:ignore-skills entity-props) parsed-line)))
|
(ignore-skill? entity-name (:ignore-skills entity-props) event)))
|
||||||
(seq)
|
(seq)
|
||||||
(boolean)))
|
(boolean)))
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@
|
||||||
"determines if the parsed combat log line is for an event involving any specific encounter entities which
|
"determines if the parsed combat log line is for an event involving any specific encounter entities which
|
||||||
should cause an encounter to begin, returning the name of the encounter if it should begin, or nil if no
|
should cause an encounter to begin, returning the name of the encounter if it should begin, or nil if no
|
||||||
encounter begin was detected"
|
encounter begin was detected"
|
||||||
[{:keys [target-name source-name damage aura-name type skill] :as parsed-line} :- CombatEvent
|
[{:keys [target-name source-name damage aura-name type skill] :as event} :- CombatEvent
|
||||||
data :- RaidAnalysis]
|
data :- RaidAnalysis]
|
||||||
(if-let [encounter-name (or (find-defined-encounter-name target-name)
|
(if-let [encounter-name (or (find-defined-encounter-name target-name)
|
||||||
(find-defined-encounter-name source-name))]
|
(find-defined-encounter-name source-name))]
|
||||||
|
@ -67,10 +67,10 @@
|
||||||
(not (contained-in? skill non-combat-starting-skills)))
|
(not (contained-in? skill non-combat-starting-skills)))
|
||||||
(let [encounter (get defined-encounters encounter-name)]
|
(let [encounter (get defined-encounters encounter-name)]
|
||||||
(cond
|
(cond
|
||||||
(ignored-interaction-event? encounter parsed-line)
|
(ignored-interaction-event? encounter event)
|
||||||
nil
|
nil
|
||||||
|
|
||||||
(ignored-skill-event? encounter parsed-line)
|
(ignored-skill-event? encounter event)
|
||||||
nil
|
nil
|
||||||
|
|
||||||
; if either of these are defined, then their criteria MUST pass to
|
; if either of these are defined, then their criteria MUST pass to
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
(keyword event)))
|
(keyword event)))
|
||||||
|
|
||||||
(defmethod handle-event :skill-damage-to-target
|
(defmethod handle-event :skill-damage-to-target
|
||||||
[{:keys [source-name skill target-name damage damage-type absorbed resisted blocked crit? timestamp] :as parsed} data]
|
[{:keys [source-name skill target-name damage damage-type absorbed resisted blocked crit? timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-damage
|
(analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
target-name
|
target-name
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :skill-avoided-by-target
|
(defmethod handle-event :skill-avoided-by-target
|
||||||
[{:keys [source-name target-name skill avoidance-method timestamp] :as parsed} data]
|
[{:keys [source-name target-name skill avoidance-method timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-damage
|
(analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
target-name
|
target-name
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :damage-reflected
|
(defmethod handle-event :damage-reflected
|
||||||
[{:keys [source-name target-name damage damage-type timestamp] :as parsed} data]
|
[{:keys [source-name target-name damage damage-type timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-damage
|
(analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
target-name
|
target-name
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :melee-damage-to-target
|
(defmethod handle-event :melee-damage-to-target
|
||||||
[{:keys [source-name target-name damage damage-type hit-type absorbed resisted blocked crit? timestamp] :as parsed} data]
|
[{:keys [source-name target-name damage damage-type hit-type absorbed resisted blocked crit? timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-damage
|
(analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
target-name
|
target-name
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :melee-avoided-by-target
|
(defmethod handle-event :melee-avoided-by-target
|
||||||
[{:keys [source-name target-name avoidance-method timestamp] :as parsed} data]
|
[{:keys [source-name target-name avoidance-method timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-damage
|
(analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
target-name
|
target-name
|
||||||
|
@ -75,11 +75,11 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :skill-interrupted-by-target
|
(defmethod handle-event :skill-interrupted-by-target
|
||||||
[{:keys [source-name target-name skill timestamp] :as parsed} data]
|
[{:keys [source-name target-name skill timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :dot-damages-target
|
(defmethod handle-event :dot-damages-target
|
||||||
[{:keys [source-name skill target-name damage damage-type absorbed resisted timestamp] :as parsed} data]
|
[{:keys [source-name skill target-name damage damage-type absorbed resisted timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-damage
|
(analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
target-name
|
target-name
|
||||||
|
@ -94,28 +94,28 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :cast-begins
|
(defmethod handle-event :cast-begins
|
||||||
[{:keys [source-name skill spell? timestamp] :as parsed} data]
|
[{:keys [source-name skill spell? timestamp] :as event} data]
|
||||||
; don't think we really care about this ?
|
; don't think we really care about this ?
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :skill-performed-on-target
|
(defmethod handle-event :skill-performed-on-target
|
||||||
[{:keys [source-name target-name skill spell? extra timestamp] :as parsed} data]
|
[{:keys [source-name target-name skill spell? extra timestamp] :as event} data]
|
||||||
(analysis/process-source-to-target-cast source-name target-name skill timestamp data))
|
(analysis/process-source-to-target-cast source-name target-name skill timestamp data))
|
||||||
|
|
||||||
(defmethod handle-event :cast
|
(defmethod handle-event :cast
|
||||||
[{:keys [source-name skill spell? timestamp] :as parsed} data]
|
[{:keys [source-name skill spell? timestamp] :as event} data]
|
||||||
(analysis/process-entity-cast source-name skill timestamp data))
|
(analysis/process-entity-cast source-name skill timestamp data))
|
||||||
|
|
||||||
(defmethod handle-event :skill-heals-target
|
(defmethod handle-event :skill-heals-target
|
||||||
[{:keys [source-name skill crit? target-name amount timestamp] :as parsed} data]
|
[{:keys [source-name skill crit? target-name amount timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :resource-gained
|
(defmethod handle-event :resource-gained
|
||||||
[{:keys [target-name amount resource-type source-name skill timestamp] :as parsed} data]
|
[{:keys [target-name amount resource-type source-name skill timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :resource-lost
|
(defmethod handle-event :resource-lost
|
||||||
[{:keys [target-name amount resource-type source-name skill timestamp] :as parsed} data]
|
[{:keys [target-name amount resource-type source-name skill timestamp] :as event} data]
|
||||||
(condp = resource-type
|
(condp = resource-type
|
||||||
:health (analysis/process-source-to-target-damage
|
:health (analysis/process-source-to-target-damage
|
||||||
source-name
|
source-name
|
||||||
|
@ -130,32 +130,32 @@
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(defmethod handle-event :special-gained
|
(defmethod handle-event :special-gained
|
||||||
[{:keys [target-name special source timestamp] :as parsed} data]
|
[{:keys [target-name special source timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :aura-gained
|
(defmethod handle-event :aura-gained
|
||||||
[{:keys [target-name aura-name aura-type stacks timestamp] :as parsed} data]
|
[{:keys [target-name aura-name aura-type stacks timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :aura-lost
|
(defmethod handle-event :aura-lost
|
||||||
[{:keys [target-name aura-name faded? stacks timestamp] :as parsed} data]
|
[{:keys [target-name aura-name faded? stacks timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :other-damage
|
(defmethod handle-event :other-damage
|
||||||
[{:keys [target-name damage damage-type resisted absorbed source timestamp] :as parsed} data]
|
[{:keys [target-name damage damage-type resisted absorbed source timestamp] :as event} data]
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :death
|
(defmethod handle-event :death
|
||||||
[{:keys [source-name timestamp] :as parsed} data]
|
[{:keys [source-name timestamp] :as event} data]
|
||||||
(analysis/process-entity-death source-name timestamp data))
|
(analysis/process-entity-death source-name timestamp data))
|
||||||
|
|
||||||
|
|
||||||
(defmethod handle-event :ignored
|
(defmethod handle-event :ignored
|
||||||
[{:keys [line] :as parsed} data]
|
[{:keys [line] :as event} data]
|
||||||
#_(println "[WARN] *** IGNORED ***" line)
|
#_(println "[WARN] *** IGNORED ***" line)
|
||||||
data)
|
data)
|
||||||
|
|
||||||
(defmethod handle-event :default
|
(defmethod handle-event :default
|
||||||
[{:keys [line] :as parsed} data]
|
[{:keys [line] :as event} data]
|
||||||
(println "[WARN] *** UNRECOGNIZED ***" line)
|
(println "[WARN] *** UNRECOGNIZED ***" line)
|
||||||
data)
|
data)
|
||||||
|
|
|
@ -790,3 +790,13 @@
|
||||||
:source-name %1)}
|
:source-name %1)}
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
(defn find-matcher
|
||||||
|
[^String line]
|
||||||
|
(->> regex-matchers
|
||||||
|
(filter #(re-matches (:regex %) line))
|
||||||
|
(first)))
|
||||||
|
|
||||||
|
(defn get-line-regex-matches
|
||||||
|
[^String line matcher]
|
||||||
|
(rest (re-matches (:regex matcher) line)))
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
[vwowrla.core.encounters.detection :refer [detect-encounter-end detect-encounter-triggered]]
|
[vwowrla.core.encounters.detection :refer [detect-encounter-end detect-encounter-triggered]]
|
||||||
[vwowrla.core.encounters.analysis :refer [begin-encounter end-encounter]]
|
[vwowrla.core.encounters.analysis :refer [begin-encounter end-encounter]]
|
||||||
[vwowrla.core.events.handlers :refer [handle-event]]
|
[vwowrla.core.events.handlers :refer [handle-event]]
|
||||||
[vwowrla.core.events.matchers :refer [regex-matchers]])
|
[vwowrla.core.events.matchers :refer [find-matcher get-line-regex-matches]])
|
||||||
(:use
|
(:use
|
||||||
vwowrla.core.schemas
|
vwowrla.core.schemas
|
||||||
vwowrla.core.preparsing
|
vwowrla.core.preparsing
|
||||||
|
@ -19,61 +19,59 @@
|
||||||
(not (nil? (:active-encounter data))))
|
(not (nil? (:active-encounter data))))
|
||||||
|
|
||||||
(defn- ->ignored-event
|
(defn- ->ignored-event
|
||||||
[parsed-line]
|
[event]
|
||||||
(assoc parsed-line
|
(assoc event
|
||||||
:id :ignored
|
:id :ignored
|
||||||
:logfmt :ignored))
|
:logfmt :ignored))
|
||||||
|
|
||||||
(defn ->unrecognized-event
|
(defn ->unrecognized-event
|
||||||
[parsed-line]
|
[event]
|
||||||
(assoc parsed-line
|
(assoc event
|
||||||
:id :unknown
|
:id :unknown
|
||||||
:logfmt :unknown
|
:logfmt :unknown
|
||||||
:event :unknown))
|
:event :unknown))
|
||||||
|
|
||||||
(s/defn parse-line :- CombatEvent
|
(s/defn parse-line :- CombatEvent
|
||||||
[^String line
|
[line :- s/Str
|
||||||
options :- ParserOptions]
|
options :- ParserOptions]
|
||||||
(let [[timestamp stripped-line] (split-log-timestamp-and-content line)
|
(let [[timestamp stripped-line] (split-log-timestamp-and-content line)
|
||||||
sanitized-line (-> stripped-line
|
sanitized-line (-> stripped-line
|
||||||
(undo-swstats-fixlogstring)
|
(undo-swstats-fixlogstring)
|
||||||
(sanitize-entity-names))
|
(sanitize-entity-names))
|
||||||
line-metadata {:timestamp (parse-log-timestamp timestamp options)
|
event-metadata {:timestamp (parse-log-timestamp timestamp options)
|
||||||
:line line}]
|
:line line}]
|
||||||
(if-let [matcher (->> regex-matchers
|
(if-let [matcher (find-matcher sanitized-line)]
|
||||||
(filter #(re-matches (:regex %) sanitized-line))
|
(let [matches (get-line-regex-matches sanitized-line matcher)
|
||||||
(first))]
|
args-fn (or (:args matcher) (fn [& _]))
|
||||||
(let [regex-matches (rest (re-matches (:regex matcher) sanitized-line))
|
event (merge
|
||||||
args-fn (or (:args matcher) (fn [& _]))
|
event-metadata
|
||||||
parsed-line (merge
|
(select-keys matcher [:logfmt :event :id])
|
||||||
line-metadata
|
(apply args-fn matches))]
|
||||||
(select-keys matcher [:logfmt :event :id])
|
(if (= :ignored (:event event))
|
||||||
(apply args-fn regex-matches))]
|
(->ignored-event event)
|
||||||
(if (= :ignored (:event parsed-line))
|
(process-event event (:log-owner-char-name options))))
|
||||||
(->ignored-event parsed-line)
|
(->unrecognized-event event-metadata))))
|
||||||
(process-parsed-line parsed-line (:log-owner-char-name options))))
|
|
||||||
(->unrecognized-event line-metadata))))
|
|
||||||
|
|
||||||
(s/defn handle-line
|
(s/defn handle-line
|
||||||
[parsed-line :- CombatEvent
|
[event :- CombatEvent
|
||||||
data :- RaidAnalysis]
|
data :- RaidAnalysis]
|
||||||
(handle-event parsed-line data))
|
(handle-event event data))
|
||||||
|
|
||||||
(s/defn ^:private active-encounter-processing
|
(s/defn ^:private active-encounter-processing
|
||||||
[parsed-line :- CombatEvent
|
[event :- CombatEvent
|
||||||
data :- RaidAnalysis]
|
data :- RaidAnalysis]
|
||||||
(let [data (handle-line parsed-line data)]
|
(let [data (handle-line event data)]
|
||||||
(if-let [encounter-end (detect-encounter-end parsed-line data)]
|
(if-let [encounter-end (detect-encounter-end event data)]
|
||||||
(end-encounter parsed-line encounter-end data)
|
(end-encounter event encounter-end data)
|
||||||
data)))
|
data)))
|
||||||
|
|
||||||
(s/defn ^:private out-of-encounter-processing
|
(s/defn ^:private out-of-encounter-processing
|
||||||
[parsed-line :- CombatEvent
|
[event :- CombatEvent
|
||||||
data :- RaidAnalysis]
|
data :- RaidAnalysis]
|
||||||
(if-let [encounter-name (detect-encounter-triggered parsed-line data)]
|
(if-let [encounter-name (detect-encounter-triggered event data)]
|
||||||
(->> data
|
(->> data
|
||||||
(begin-encounter encounter-name parsed-line)
|
(begin-encounter encounter-name event)
|
||||||
(handle-line parsed-line))
|
(handle-line event))
|
||||||
data))
|
data))
|
||||||
|
|
||||||
(s/defn ^:private parse-log* :- (s/maybe RaidAnalysis)
|
(s/defn ^:private parse-log* :- (s/maybe RaidAnalysis)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
(ns vwowrla.core.preparsing
|
(ns vwowrla.core.preparsing
|
||||||
(:import
|
(:import
|
||||||
(java.util Calendar Date GregorianCalendar TimeZone))
|
(java.util Calendar Date GregorianCalendar))
|
||||||
(:require
|
(:require
|
||||||
[clojure.string :as string]
|
[clojure.string :as string]
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
(def problem-entity-name-to-fixed-name
|
(def problem-entity-name-to-fixed-name
|
||||||
(reduce
|
(reduce
|
||||||
(fn [m problem-name]
|
(fn [m problem-name]
|
||||||
(let [fixed-name (.replace problem-name "'s" "s")]
|
(let [fixed-name (.replace ^String problem-name "'s" "s")]
|
||||||
(-> m
|
(-> m
|
||||||
(assoc-in [:problem-to-fixed problem-name] fixed-name)
|
(assoc-in [:problem-to-fixed problem-name] fixed-name)
|
||||||
(assoc-in [:fixed-to-problem fixed-name] problem-name))))
|
(assoc-in [:fixed-to-problem fixed-name] problem-name))))
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
[line :- s/Str]
|
[line :- s/Str]
|
||||||
(.replace ^String line " 's" "'s"))
|
(.replace ^String line " 's" "'s"))
|
||||||
|
|
||||||
(s/defn parse-log-timestamp :- Date
|
(s/defn parse-log-timestamp :- (s/maybe Date)
|
||||||
[timestamp :- s/Str
|
[timestamp :- s/Str
|
||||||
options :- ParserOptions]
|
options :- ParserOptions]
|
||||||
(if-let [matches (re-matches #"^(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{2}):(\d{2})\.(\d{3})$" timestamp)]
|
(if-let [matches (re-matches #"^(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{2}):(\d{2})\.(\d{3})$" timestamp)]
|
||||||
|
@ -58,11 +58,11 @@
|
||||||
[line :- s/Str]
|
[line :- s/Str]
|
||||||
(string/split line #" " 2))
|
(string/split line #" " 2))
|
||||||
|
|
||||||
(s/defn process-parsed-line :- CombatEvent
|
(s/defn process-event :- CombatEvent
|
||||||
[{:keys [source-name target-name source] :as parsed-line} :- CombatEvent
|
[{:keys [source-name target-name source] :as event} :- CombatEvent
|
||||||
log-owner-char-name :- s/Str]
|
log-owner-char-name :- s/Str]
|
||||||
(merge
|
(merge
|
||||||
parsed-line
|
event
|
||||||
(if source-name
|
(if source-name
|
||||||
{:source-name (if (= "you" (string/lower-case source-name))
|
{:source-name (if (= "you" (string/lower-case source-name))
|
||||||
log-owner-char-name
|
log-owner-char-name
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
vwowrla.core.parser))
|
vwowrla.core.parser))
|
||||||
|
|
||||||
(deftest barebones-line-parse-results
|
(deftest barebones-line-parse-results
|
||||||
(let [parsed (parse-line "1/2 3:45:00.000 Test combat log line with 2 spaces in content part."
|
(let [event (parse-line "1/2 3:45:00.000 Test combat log line with 2 spaces in content part."
|
||||||
{:log-owner-char-name "Blasticus"
|
{:log-owner-char-name "Blasticus"
|
||||||
:year 2015
|
:year 2015
|
||||||
:timezone (TimeZone/getDefault)
|
:timezone (TimeZone/getDefault)
|
||||||
:windows? false})]
|
:windows? false})]
|
||||||
(is (and (map? parsed)
|
(is (and (map? event)
|
||||||
(contains? parsed :timestamp)
|
(contains? event :timestamp)
|
||||||
(contains? parsed :line)))))
|
(contains? event :line)))))
|
||||||
|
|
Reference in a new issue