Fork me on GitHub
#clojure-russia
<
2016-07-19
>
artemyarulin06:07:48

Я тут нынче много очень пишу CLJC кода и соответсвенно тестов к ним. Не могу унифицировать никак тестирование асинхронного кода. Проблема заключается в том что при CLJ можно просто заюзать promise и потом в конце теста соответсвенно заблокировать его пока он не зарезолвиться. А при CLJS подходе надо все оборачивать в (async done … где вызывать done когда все закончилось и оно зараза макрос ко всему прочему. Может кто видел какое решение (скорее всего еще одни макрос) для таких кейсов? Или может какие другие либы

artemyarulin08:07:53

кто юзает https://github.com/funcool/promesa ? Думаю дропнуть core.async, отговорите меня

niquola09:07:03

Ну не дропай, пожалуста! 🙂 А для чего ты его используешь?

artemyarulin10:07:58

@nicola: На мобайле, всякие хттп запросики, React Native native communcation тоже все асинхронное на коллбеках

niquola10:07:21

а зачем пишешь cljc?

artemyarulin10:07:27

1 В будущем думаю бек написать и пере-использовать большую часть логики уже на кложуре 2 Тестирую и разрабатываю в кложуре, ибо в репле могу сделать (-> (clj-http url) my-function) ибо можно сделать блокирующий вызов. Если писать на cljs только то будет (-> (http-req url) my-function #(print %)) и прочее-прочее, блокирующий вызов не сделать 😞

misha10:07:21

@artemyarulin: кор асинк жеж и на клиенте можно

misha11:07:22

(я так сейчас все асинхронные React Native native communcation'ы и собираю в кучу)

misha11:07:38

хотя как оно в контексте тестов - не знаю пока что

artemyarulin11:07:30

@misha: Можно-можно, у меня так на нем и сделано - все на нем. Но вот чота задумался дропнуть и взять промисы ибо у меня очень простые все кейсы

artemyarulin13:07:41

:language-in and :language-out
Configure the input and output languages for the closure library. May be :ecmascript3, ecmascript5, ecmascript5-strict, :ecmascript6-typed, :ecmascript6-strict, :ecmascript6 or :no-transpile.
никто не пробовал ES6 да еще и typed генерить для CLJS?

rmuslimov14:07:45

это опшены из figwheel/cljsbuild?

rmuslimov14:07:55

прикольно, да интересно случается ли в жизни флоу генерации в ES6

rmuslimov14:07:19

затем же снова получается нужно заниматься генерацией ES5 хотя бы

rmuslimov14:07:06

сегодня только обсуждали снова cljs + js. У нас есть палитра компонентов в большом ES6 + webpack приложении можно ли заатачить их cljs проекту чтобы собирать все вместе с помощью cljs. Ну чтоб не было двух бандлов и запущенного сборщика webpack и figwheel параллельно

rmuslimov14:07:32

может кто уже собирал такую машину?

artemyarulin14:07:04

хм, у гугла есть свой транспайлер для ES6 > ES5 https://github.com/google/traceur-compiler. Хотя может сам Google Closure может подхватить es6 js код. Но вроде можно рядом с CLJS положить пачку JS и все вместе запускать, в ридми фигвила вроде даже было что-то про такое. Или нет, не помню чтот

delaguardo14:07:47

http://lukevanderhart.com/2011/09/30/using-javascript-and-clojurescript.html можно, но если хочется их в общий бандл собирать нужно будет дополнительно экстерны писать

delaguardo14:07:53

если я правильно понял о чем вопрос

delaguardo14:07:04

и если я правльно помню cljs сейчас не может давать на выходе ES6, только 5 или 3

kuzmin_m14:07:16

@rmuslimov: а figwheel будет перезагружать внешние реакт компоненты как react-hot-reload?

delaguardo14:07:17

ограничения closure компайлера

rmuslimov14:07:05

@kuzmin_m: можно попросить смотреть за директорией и релодится когда нужно

rmuslimov14:07:38

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

kuzmin_m14:07:56

просто тупые копоненты

kuzmin_m14:07:05

без стейта

kuzmin_m14:07:17

ок, спасибо

kuzmin_m14:07:34

насколько я понимаю, вы не используете модульный css (css-loader)

rmuslimov14:07:34

@delaguardo: там была реализация через foreigh-libs http://mneise.github.io/posts/2015-08-04-week-9-and-10.html

rmuslimov14:07:52

но она правда читает только jsx

rmuslimov14:07:47

> Но вроде можно рядом с CLJS положить пачку JS и все вместе запускать, в ридми фигвила вроде даже было что-то про такое. Или Ну получается сделать два файлы от JS и от CLJS. и два ватчера повесить, как то не айс мне кажется

delaguardo14:07:11

надо будет посмотреть, спасибо

rmuslimov14:07:47

вообщем текущая идея взять rollup.js/browerify.js и вызывать генерацию через preprocess как выше указанной ссылке

rmuslimov14:07:01

должен получиться каменный цветок

comerc15:07:14

@artemyarulin babel - лучший выбор по заверениям Андрея Листочкина, вроде бы в этом докладе было https://www.youtube.com/watch?v=NLPC3EHtiBU

artemyarulin15:07:18

@comerc: Дада, для ЖС то бабел безусловно самый няшный. Я просто думал что мож Traceur интегрируется с Closure как-нить (или он уже там внутри используется кста хз)

asolovyov17:07:35

случайно заметил

asolovyov17:07:41

там что-то про атомы было?

asolovyov17:07:46

ааа, датаскрипт

asolovyov17:07:27

короч, если тебе нужно в просто браузере и для просто людей - то я б без него обошелся, к сожалению. Если у тебя админка, в которую не будут ходить с андроида или убогих компов, то тогда ноу проблемос.

niquola18:07:02

Бабель говно, извените - тормозит как Scala ;) и все ради стрелочки и импорта?

artemyarulin19:07:07

не согласен. Ничто не тормозит так как делает это скала slowpoke

kronos_vano19:07:36

почему тогда за скалу платят больше чем за кложу?)

skammer20:07:06

надбавка за вредность?

artemyarulin21:07:10

я тут спрашивал сегодня как унифицировать асинхронные тесты с CLJC, поиск по гитхабу выдал хелпер для core.async. Не составит труда изменить для промисов и прочих коллбеков

(defn test-async  "Asynchronous test awaiting ch to produce a value or close."
  [ch]
  #?(:clj   (a/<!! ch)
     :cljs  (async done
              (a/take! ch (fn [_] (done))))))

(deftest a-test
  (test-async
    (async/go …))