Fork me on GitHub
#clojure-russia
<
2016-11-03
>
be902:11:48

а вот посоветуйте. есть развесистая структура данных, которую хочется писать в EDN и читать из него же. для целей как минимум отладочных. но есть один нюанс: в ней встречаются даты, которые java.time.LocalDate (использую clojure.java-time для работы с ними). и вот как бы сделать, чтобы для этих дат магически генерировались EDN-теги?

prepor06:11:06

(defmethod print-method java.time.ZonedDateTime [o writer] (let [s (.format o DateTimeFormatter/ISO_OFFSET_DATE_TIME)] (.write writer (format "#time/zoned-date-time \"%s\"" s))))

prepor06:11:14

примерно так, например

prepor06:11:20

(по аналогии)

prepor06:11:29

(def edn-readers {'time/zoned-date-time (fn [s] (-> (.parse DateTimeFormatter/ISO_OFFSET_DATE_TIME s) (ZonedDateTime/from)))})

a.espolov08:11:04

а разве не проще для дат long юзать?

alexander_mihailov08:11:21

ммм, а как в long положить часовой пояс? troll

prepor08:11:55

лонг это лонг, дата это дата

prepor08:11:01

простите на банальности )

a.espolov09:11:18

@alexander_mihailov ни как это ж число

be909:11:21

@prepor спасибо, попробую!

kuzmin_m18:11:55

Привет! Разбираюсь с spec. Нашел вполне ожидаемое, но опасное поведение нечистых функций, s/fspec и stest/instrument.

clojure
(ns spec.func.example
  (:require [clojure.spec :as s]
            [clojure.spec.test :as stest]))

(defn foo [bar]
  (bar 42))

(s/def ::bar (s/fspec :args (s/cat :x integer?)
                      :ret integer?))

(s/fdef foo
  :args (s/cat :bar ::bar)
  :ret integer?)

(stest/instrument)

(foo #(do
        (println %)
        (inc %)))
Будет “веслело", если случится такой вызов (foo remove-user) с включенным instrument. Кто-нибудь сталкивался с подобным?

kuzmin_m18:11:31

Т.е. fspec, как и ожидается, тестирует преданную функцию, путем нескольких ее вызовов.

artemyarulin18:11:31

эм, а можно для тупых - я не очень понимаю

kuzmin_m19:11:07

есть foo, принимающая функцию как параметр

kuzmin_m19:11:12

для foo есть спека

kuzmin_m19:11:50

и в ней мы описываем, что первый аргумент foo будет функцией с такой-то сигнатурой

kuzmin_m19:11:05

это как раз ::bar

kuzmin_m19:11:19

потом мы запускаем instrument

kuzmin_m19:11:40

что бы была проверка аргументов по спеке при вызове функции

kuzmin_m19:11:48

и самое интересное

kuzmin_m19:11:28

как проверить, что параметр bar (анонимная функция) подходит под спеку ::bar?

kuzmin_m19:11:41

запустить ее с рандомными параметрами

kuzmin_m19:11:02

т.е. будет не 1 вызов bar внутри foo

kuzmin_m19:11:05

а много

kuzmin_m19:11:28

и если есть сайд-эффекты, то можно это отлаживать много часов

kuzmin_m19:11:03

или передал туда функцию remove-user

kuzmin_m19:11:17

она пользователей поудаляла

kuzmin_m19:11:27

понятно, что это только в dev/test

kuzmin_m19:11:34

но все равно больно(

artemyarulin19:11:56

тру. Хм, не знаю даже как себя обезопасить от такого

artemyarulin19:11:11

все чистыми не сделаешь все равно

kuzmin_m19:11:57

да вот и я о том же

kuzmin_m19:11:21

т.е. s/fspec опасная штука

kuzmin_m19:11:52

можно, вместо нее написать спеку, которая, например, только арность проверяет

kuzmin_m19:11:02

без вызова функции

kuzmin_m19:11:25

т.е. тип входа/выхода без вызова не проверить

kuzmin_m19:11:34

все-таки это динамический язык

kuzmin_m19:11:20

но с другой стороны stest/check будеь фигню генерировать и check тесты не будут работать правильно (если только арность проверять)

prepor19:11:01

хороший поинт

prepor19:11:18

в слаке есть clojure-spec например

prepor19:11:23

можно туда написать