alternativa para logs/trace espalhados por todo moclojer-app #369
Replies: 2 comments 3 replies
-
eu e o @J0sueTM conversamos em call e percebemos uma insconstância na ideia atual de envolver as funções de x namespace por sua versão reescria com o trace. No caso abaixo, funções que recebem um argumento 'descontruido' (vide {:keys [a b c]}, a função atual não retornaria os values do mapa, apenas a string "{:a a :b :c c}". (doseq [[fsym func] (ns-publics *ns*)]
(let [args (first (:arglists (meta func)))
argmap (reduce
(fn [acc v]
(assoc acc (keyword v) v))
;; remove components and ctx
{} (drop-last 2 args))
symkey (keyword (symbol (str *ns*) (str fsym)))]
(intern
*ns* fsym
(eval
`(fn [~@args]
(com.moclojer.components.logs/trace
~symkey ~argmap
(~func ~@args)))))))
@avelino @matheusfrancisco pensamos em reescrever todas as funções sem a desconstrução, ou seja, só passar os args e qualquer extra seria passando usando o operador & (o que é um trabalho muito grande e não otimizado) a outra ideia seria criar um parser do mapa retornado em string, o que parece ser bem mais rápido de ser feito. O que vocês acham? |
Beta Was this translation helpful? Give feedback.
-
@J0sueTM @avelino @matheusfrancisco obs: ainda estou tendo um erro com os args '&', mas acredito que possamos muda-los para o {:keys } como haviamos comentado anteriormente (defn trace-all-ns
"Iterate over all desired ns functions and replace them with themselves within
a `logs/trace` call that uses each function's arglist as context."
[]
(let [desired-ns (->> (all-ns)
(map ns-name)
(map name)
(filter #(clojure.string/starts-with? % "com.moclojer"))
(filter #(not (clojure.string/ends-with? % "logs")))
(map symbol)
(into []))]
(doseq [current-ns desired-ns]
(clojure.pprint/pprint current-ns)
(doseq [[fsym func] (ns-publics current-ns)]
(let [symkey (keyword (symbol (str current-ns) (name fsym)))
args (first (:arglists (meta func)))
pre-argmap (fn [acc v]
(cond
;; Arg with a :as alias, making it not necessary to
;; get the inner deconstructed keys.
(and (map? v) (:as v))
(acc (keyword (:as v)) (:as v))
;; Arg with only the :keys vec declared.
(and (map? v) (:keys v))
(into {} (map (fn [k]
[(keyword k) k])
(:keys v)))
;; Normal arg types.
:else (assoc acc (keyword v) v)))
argmap (reduce pre-argmap {} (drop-last 2 args))
callargs (map
(fn [arg]
(cond
(and (map? arg) (:as arg))
(:as arg)
(and (map? arg) (:keys arg))
(into {} (map (fn [a]
[(keyword a) a])
(:keys arg)))
:else arg))
args)]
(intern
*ns* fsym
(eval `(fn [~@args]
(com.moclojer.components.logs/trace ~symkey ~argmap
(~func ~@callargs)))))))))) |
Beta Was this translation helpful? Give feedback.
-
foi discudido no servidor do discord criar uma forma de "reescrever" as partes do código que utilizam o logs/trace como descrito nessa branch: https://github.com/moclojer/moclojer-app/blob/refactor/telemere/src/back/api/controllers/mocks.clj#L169
Beta Was this translation helpful? Give feedback.
All reactions