Fork me on GitHub
#clojure-russia
<
2016-12-14
>
dima01:12:32

@rustam.gilaztdinov например, вот https://github.com/joshrotenberg/josef практически нет clojure кода как такового, сплошной interop

leov04:12:12

@misha: plz, хоть один дефтест

artemyarulin08:12:32

а спеку можно приспособить для сообщениях об ошибках для юзеров валидация, етс? Я читал пару раз что оно вроде не для этого и тока костылями. Может есть какой прогресс?

artemyarulin08:12:04

и еще несколько вопросов по спеке в догонку: 1) Может уже есть какой пример использования в каком популярном проекте/либе? Охота посмотреть как спеки добавляют в уже существующую базу 2) Куда спеки класть - рядом с функциями, рядом с тестами, видел пару раз даже отдельно даже [module-name]-spec.clj 3) Можно ли делать IO в самой спеке? Я хочу проверить что например функция всегда возвращает строку как валидный XML, т.е. нужно распарсить строку и дернуть пару XPath запросов

andre09:12:52

4) Почему в некоторых CLJS либах спека закомментирована и написано, что раскомментируют как будет стейбл версия, известно когда она будет?

artemyarulin09:12:00

ну на 4 я могу ответить - в кложуре спека есть тока в 1.9-альфа релизах, а Нолен решил что хуя-хуяк-и-в-продакшен и спека уже в релизах 1.9.* давененько доступна для использования

artemyarulin09:12:07

когда будет спека закончена тока Ричи знает

artemyarulin09:12:57

clojure.future
Copy of all new functions added to clojure.core in Clojure 1.9 (like boolean?, int?, seqable? etc):
(require '[clojure.future :refer :all])
прям как с питоном 2-3 🙂

prepor09:12:07

нет, совсем не как

prepor09:12:24

питон2 код не совместим с питон3 интерпретатором

ponimas09:12:39

это он намекает на неофициальный 2.8

prepor09:12:43

кложа1.8 код полностью совместим с кложа1.9 интерпретатором

prepor09:12:01

а бэкпортирование фич это нормальная практика везде, не только в питоне

prepor09:12:54

@artemyarulin "распарсить строку" это не IO

artemyarulin09:12:37

ну т.е. так можно да?

prepor09:12:05

ну у тебя любая функа может быть предикатом

prepor09:12:13

конечно там может быть какой угодно и парсинг тоже

artemyarulin09:12:32

а про IO всеже - например в базу сходить, файл прочитать?

prepor09:12:03

та так то никто не мешает

prepor09:12:58

но к кастомной функе как правило нужно генератор самому писать (если хочешь генераторы, конечно)

artemyarulin09:12:30

дада, конечно хочу 🙂

artemyarulin09:12:38

@prepor а ты куда кладешь спеки - рядом с функциями или тестами или отдельно вообще?

misha09:12:48

спеки столько места занимают, что я б отдельно клал, если их больше, чем пара штук

artemyarulin09:12:58

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

seryh11:12:34

когда интересно clojurescript зарелизят с поддержкой флага :infer-externs для сборки

misha12:12:01

Собери из мастера, @seryh

andrewtropin14:12:16

господа, кто работал с compojure, а если быть точнее, то с compojure-api. Подскажите пожалуйста как пофиксить одну проблемку с роутами. есть следующий набор роутов

(GET "/my" request
...
   (context
    "/:issue-id" [issue-id]
    :path-params [issue-id :- Long]
    (GET "/" request
...
так вот у меня почему-то при OPTIONS запросе получается следующее:
% curl -H "Origin: " -X OPTIONS --verbose ''
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> OPTIONS /api/issues/my HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.47.0
> Accept: */*
> Origin: 
> 
< HTTP/1.1 400 Bad Request
< Content-Type: application/json; charset=utf-8
< Content-Length: 65
< Server: http-kit
< Date: Wed, 14 Dec 2016 14:08:26 GMT
< 
* Connection #0 to host localhost left intact
{"errors":{"issue-id":"(not (instance? java.lang.Long \"my\"))"}}%  
Хотя я ожидал, что будет 404. Помогите получить 404 пожалуйста.

andrewtropin14:12:44

можно сделать как-то, чтобы (context "/:issues-id" [issues-id]) матчил только урлы с интовым issue-id?

andrewtropin17:12:56

если кому интересно, то как workaround добавил

+   (OPTIONS "/my" []
+            (resp/not-found))
теперь CORS работает, но выглядит это немного костыльно.

andre19:12:36

блин так совпало. я сейчас решил с get на post запрос переделать, и замучился с этим cors, chrome не хочет post запрос делать

seryh19:12:51

@andre подскажи пожалуйста по re-frame

seryh19:12:03

я вот сделал вью

(reagent/render [:div
                   [views/clock-view]
                   [views/buttons-bar-view]
                   [views/home]] (.getElementById js/document "app"))

seryh19:12:45

вот это первое views/clock-view, часики, они тикают каждую секунду, и вместе с этим перерендериваются также uttons-bar-view и home

seryh19:12:00

дергая все зависимые reg-sub

seryh19:12:32

можно же как то инкапсулировать и не дергать за зря остальные вью кроме clock-view

andre19:12:58

ну это не по рефрейм скорей , а по реагенту вопрос

andre19:12:00

если результат reg-sub всех меняется то так и должно быть

andre19:12:13

ну т.е. это три независимых стейтфул компонента, так?

andre19:12:26

просто чтобы мне ответить мне нужно понять что у них там внутри

seryh19:12:38

а. стейт то вот и один

seryh19:12:40

кажется я прозрел

seryh19:12:50

просто писал по обширным хеллой ворд примерам

seryh19:12:53

где один стейт

andre19:12:58

стейт один да

andre19:12:03

в ре-фрейме

andre19:12:19

а вот subscriptions как-раз и нужен чтобы стейт разбить

andre19:12:26

и не перерендеривать все при смене стейта

seryh19:12:32

а не будет примера где рендер идет для каждой из вью по отдельности? при едином стейте

andre19:12:17

а кто-нибудь может подсказать с простейшей задачей по cors?

airnsk19:12:30

@andre у тебя сервер должен правильно отвечать, чтоб хром крос домейн запрос сделал, насколько я помню

andre19:12:55

вот у меня есть фигвил . клиент на localhost:3449 и он хочет compojure на localhost:8080 и он не хочет post делать

andre19:12:11

я хеадеры прописал, POST прописал реквест

andre19:12:18

но он какой то Options хочет

airnsk19:12:45

делай обработчик options на сервере - может и проще можно - но я не знаю как

alexander_mihailov19:12:51

Options делается перед Post в случае нестандартного контент типа или нестандартного набора хэдеров.

andre19:12:54

просто странная фигня, вроде ж это самая банальная вещь должна быть . нет?

airnsk19:12:23

нет с какой-то версии хром не дает такие запросы

alexander_mihailov19:12:53

Вроде в примерах для luminus есть удобный middleware для обработки CORS.

andre19:12:01

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

airnsk19:12:37

отдавай на options нужные хедеры и все

alexander_mihailov19:12:36

тут описан ограниченный набор правил при которых браузер не будет делать Options.

alexander_mihailov19:12:50

но проще обрабатывать Options и честно на него отвечать.

andre20:12:11

т.е. я правильно понимаю, что если я делаю запрос post , то сначала options будет запрос пустой, он должен получить от compojure правильные хеадеры, а только потом если хеадеры правильные будет post запрос выполнен?

andre20:12:23

просто у меня после options post запрос не посылается

andre20:12:25

а вот это никто не знает как пользовать? я попытался что-то не получилось

airnsk20:12:29

пишут что так надо someone has written a framework to make this easy (https://github.com/r0man/ring-cors). If you decide to use ring-cors, then you can wrap all your routes by: (def app (-> (handler/api app-routes) (wrap-cors :access-control-allow-origin #"yoursite" :access-control-allow-methods [:get :put :post] :access-control-allow-headers ["Content-Type"])))

andre20:12:27

отлично!

andre20:12:45

ну так еще ладно 🙂 спасибо большое за помощь

andre20:12:08

завелось наконец, и так удобнее конечно

seryh20:12:13

@andre я тоже все понял. не знал что все reg-sub дергаются при каждом изменении стейта. спасибо )

andre20:12:37

на самом деле ре-фрейм очень крутой

andre20:12:46

и дергаются не все

andre20:12:53

а только те на которые есть активные подписки

andre20:12:14

@seryh вот если ты посмотришь то :sub-key3 не дергается

andre20:12:41

и даже :a, который зависит от :sub-key1

andre20:12:18

вот кстати на моей диаграме тот случай про который ты говорил, как сделать чтобы одна вью рендерилась только

seryh20:12:05

а вот тот пример что ты скинул. там поле с цветом дергает свой sub при каждом обновлении таймера https://monosnap.com/file/Ywjcm2QbwVNSb6LrCg4hU6B90d8qvo

seryh20:12:21

как можно этот пример изменить что бы не дергал?

andre20:12:23

никак 🙂

seryh20:12:30

рендера вьюхи интупа при этом не проиходит. и это круто

andre20:12:34

а что страшного что он дергает его?

andre20:12:54

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

misha21:12:52

@andre а где "you are here ->" на картинке? как на картах в супермаркетах