This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-07-13
Channels
- # admin-announcements (4)
- # beginners (14)
- # boot (41)
- # capetown (1)
- # carry (10)
- # clojure (168)
- # clojure-czech (11)
- # clojure-mexico (3)
- # clojure-quebec (1)
- # clojure-russia (63)
- # clojure-spec (108)
- # clojure-uk (44)
- # clojurescript (37)
- # component (5)
- # data-science (2)
- # datascript (5)
- # datomic (3)
- # defnpodcast (9)
- # dirac (14)
- # emacs (18)
- # events (1)
- # funcool (2)
- # garden (2)
- # hoplon (48)
- # leiningen (6)
- # numerical-computing (1)
- # off-topic (8)
- # om (61)
- # onyx (22)
- # proton (14)
- # re-frame (50)
- # reagent (2)
- # uncomplicate (1)
- # untangled (41)
- # vim (5)
- # yada (5)
@timbrk: нужно конкретизировать вопрос. есть куча вариантов. в виде http запроса для получения сессионного ключа? через веб драйвер (selenium например)? или чтение почты через imap?
@seryh: мне нужно зайти в аккаунт и спарсить оттуда данные. веб драйвер уже рассматриваю, интересная штука, монструозная только. Думаю, лучший вариант - в виде http запроса
@timbrk: это самый сложный вариант. нужно вооружатся профилировщиком запросов, расковыривать протокол, и эмулировать вот это все через какойнить clj-http. если задача читать почту, то самое простое сделать это через imap
по монструозности веб драйвера, вместо селениума можно использовать phantomjs, где то натыкался на пример как его довольно просто использовали с clj-webdriver
ну там ну там regex op "последовательно" идут. типа вот такое:
(s/conform (s/* (s/alt :even (s/+ even?) :odd (s/+ odd?))) [1 1 1 1 2 4 6 1 2 3])
[[:odd [1 1 1 1]] [:even [2 4 6]] [:odd [1]] [:even [2]] [:odd [3]]]
как самому определять conform-поведение кастомное? скажем я хочу сделать
(s/def ::int #(try (Long. %) (catch Exception e nil)))
и хочу что бы conformed значение такой спеки было всегда int, т.е. "123" скажем приводилось к 123
в кишках вижу только вот такое: (defprotocol Spec (conform* [spec x]) (unform* [spec y]) (explain* [spec path via in x]) (gen* [spec overrides path rmap]) (with-gen* [spec gfn]) (describe* [spec]))
ну хотя почему бы и нет, работает:
(s/def ::int (reify s/Spec (conform* [spec x] (try (Long. x) (catch Exception e nil)))))
@prepor еще вариант делать кастомное поведение через мультиметоды. у меня есть кейс, когда в зависимости от типа есть разные варианты правильных конфигов. вот пример
на вход :atomix/storage-config он ждет мапу и в зависимости от ключика ::storage-type у него будут разные варианты "правильного" конфига
s/conform в spec не только валидирует данные, но и приводит их к спеке. предикат-функции никак не изменяют значения, а вот всякие or cat — очень даже
(type (s/conform ::int "123"))
java.lang.Long
вот что я хотел получить (и получил с примером выше)@prepor сорри, не вдуплил сразу.
смотрел уже?
а или они тока-что запостили
кста пытался найти, но что-то мое гугл кунг-фу слабо - в 1.9 что-нить еще кроме спеки добавили?
тоже не нашел чейнжлоги, но как минимум namespaced map которые в гайде про спеку проскакивают
Andrew Rudenko, [Jul 13, 2016, 2:46 PM]: #my.app{:foo 1 :bar 2} эквиалетно {:my.app/foo 1 :my.app/bar 2}
дада, т.е. по сути весь релиз под спеку по сути ну ок
няшно кста - в ом-некст народ наверняка рад этим неймспесд мапам, а то там тоже принято через них писать
@asolovyov: так и задумано, только так и можно заставить пользователя изучить lisp
я вот думаю, если я оберу в свою схему, которая будет выдавать нормальную ошибку, коэрсия не поломается?
@asolovyov: не вызовется если ключа нет
@asolovyov: так вон спеку и возьми
@artemyarulin: ты там уже в зелени, поди, купаешься?