Size: a a a

Clojure — русскоговорящее сообщество

2019 September 04

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
убирает лесенку

(u/<<-
  (or (!already-logged-in session))
  (or (!has-additional-messages msgs))
  (let [user (->user msgs password->digest)])
  (or (!has-validation-errors user))
  (let [user (fill-id user new-user-ids)
        id   (-> user agg/root :agg/id)])
  {:set-session (assoc session :current-user-id id)
   :persist     [user]
   :reaction    {:type :show-screen
                 :name :main}}))
Недавно показывал кусочек кода, но не рассказывал что это.

Я разбирался с эффектами, коэффектами, чистыми фунциями, functional core imperative shell, т.е. о том, как сделать логику принятия решений чистой, а работу с побочными эффектами максимально тупой.

Нашел как сделать suspendable функции, они же async/await и yield, просто на читых функцях и небольшом макросе.
Без project loom и т.п.

В порядке усложнения
https://github.com/darkleaf/suspendable-process/blob/master/src/suspendable_process/a.clj
https://github.com/darkleaf/suspendable-process/blob/master/src/suspendable_process/b.clj
https://github.com/darkleaf/suspendable-process/blob/master/src/suspendable_process/c.clj

Есть функция process, которая описывает логику работы программы, т.е. functional core.
И есть интерпретатор эффектов, т.к. imperative shell.

Пример искусственный, но в нем есть ветвление и цикл/рекурсия.

Более-менее реальный пример
https://github.com/darkleaf/publicator/blob/3.1/core/src/publicator/use_cases/user/register2.clj#L45-L63
https://github.com/darkleaf/publicator/blob/3.1/core/test/publicator/use_cases/user/register2_test.clj
но тут эффекты в виде хэшмап, а не векторов.

@razum2um ты как раз спрашивал про интерпретатор.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Таким образом можно делать ассинхронную обработку на event-loop, а тестировать логику синхронно, привет тестам на фронтенде.
Можно записать результаты эффектов, положить их в базу и потом продолжить вычисления на другой машине спустя длительное время.
Можно вместе с исключением приложить описание всех эффектов - готовый тест на баг.
источник
2019 September 05

AD

Artur Dumchev in Clojure — русскоговорящее сообщество
Может, кто-нибудь подскажется, в чем может быть проблема.

Авторизуюсь через oauth гугла, в коллбеке возвращаю редирект
{:status 302
:headers {"Location" "/"}
:session {:identity (:id user)}}

Затем мой клиент реквестить главную страницу.
Если это google-chrome, в реквесте есть :session {:identity "some-id"}.
В  firefox и safari нет
источник

AK

Anton Karpov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Таким образом можно делать ассинхронную обработку на event-loop, а тестировать логику синхронно, привет тестам на фронтенде.
Можно записать результаты эффектов, положить их в базу и потом продолжить вычисления на другой машине спустя длительное время.
Можно вместе с исключением приложить описание всех эффектов - готовый тест на баг.
Спасибо за труд и примеры
источник

DA

Daniil Arsentiev in Clojure — русскоговорящее сообщество
Anton Karpov
Спасибо за труд и примеры
+
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Artur Dumchev
Может, кто-нибудь подскажется, в чем может быть проблема.

Авторизуюсь через oauth гугла, в коллбеке возвращаю редирект
{:status 302
:headers {"Location" "/"}
:session {:identity (:id user)}}

Затем мой клиент реквестить главную страницу.
Если это google-chrome, в реквесте есть :session {:identity "some-id"}.
В  firefox и safari нет
А session middleware добавлена?
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
Ivan Grishaev
Crux так же как и датомик все в память выгребает?
что всё? индексацию лога jdbc транзакций?
источник

AD

Artur Dumchev in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
А session middleware добавлена?
да, проверял с ring memory-store и ring cookie-store. Оба работают в хроме и оба не работают в firefox (при передачи сессии после редиректа с гугл-аус).
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
Приветствую! Кто работает с duct, как вы загружаете конфигурацию в ваших тестах? Мне для тестов нужно загрузить роутер и я это делаю следующим образом:
(def router
 (ig/init-key
  :myapp/router
  {:tasks (ig/init-key :myapp.services.tasks/routes
                       {:postgres (shrubbery/spy postgres-stub)})}))

это отлично работает в дев моде, но когда я запускаю тест, я получаю

No method in multimethod 'init-key' for dispatch value: :myapp/router

это логично, так как я должен загрузить конфигурации, прежде чем пользоваться интегрантом, и должен сделать что-то подобное как здесь https://github.com/khmelevskii/duct-pedestal-reitit/blob/master/dev/src/dev.clj#L32
Но я не понимаю как это сделать. Кто-то уже это решал?
источник

AD

Artur Dumchev in Clojure — русскоговорящее сообщество
Artur Dumchev
Может, кто-нибудь подскажется, в чем может быть проблема.

Авторизуюсь через oauth гугла, в коллбеке возвращаю редирект
{:status 302
:headers {"Location" "/"}
:session {:identity (:id user)}}

Затем мой клиент реквестить главную страницу.
Если это google-chrome, в реквесте есть :session {:identity "some-id"}.
В  firefox и safari нет
добавил
(wrap-defaults (-> site-defaults (assoc-in [:session :cookie-attrs :same-site] :lax)))

заработало
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
заработало тоже 🙂
(duct/load-hierarchy)

(duct/prep-config
(duct/read-config (io/resource “myapp/config.edn")))
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
У меня несколько бредовый вопрос.
А есть ли для core.async канал, который ведет себя как стек, а не как очередь?
Т.е. элементы добавляются в начало, а не в конец. LIFO
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
У меня несколько бредовый вопрос.
А есть ли для core.async канал, который ведет себя как стек, а не как очередь?
Т.е. элементы добавляются в начало, а не в конец. LIFO
источник
2019 September 06

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
А кто как пишет css в cljs проектах? Хотелось бы все таки css-in-cljs от @roman01la, но тут у cljs все достаточно сложно. Есть либа https://github.com/clj-commons/cljss но как то опасаюсь тянуть ее в продакшн проект. Было бы круто сделать очень тонкий враппер над какой-то популярной и хорошей js либой, как например предлагают здесь https://github.com/clj-commons/cljss/issues/57
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
Garden
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
Но я пока, о стыд, не разобрался на каком этапе компиляция
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
Но к нему есть ещё обёртки
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
я присматривался в свое время к гардену, и что-то я сильно не уверен. Кто-то его использует в проде?
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
да и хочеться немного другого, например такого
(defstyled MenuItem :li
 {:color (with-meta #(if % "black" "grey") :active?)})

(MenuItem {:active? true})
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Кто с Датомиком дружит подскажите, почему второй запрос кидает ошибку?
[:find ?e ?id
:where
[?e :user/pg-id ?id]
[(< ?id 5)]]


[:find ?e ?id
:where
[?e :user/pg-id ?id]
(not [(< ?id 5)])]
источник