Чтобы добавлять сообщения и комментарии, .

@matero:
matero

делать было нечего и я решил поставить haskel фреймворк yesod.
с такой долгой установкой я первый раз столкнулся
команды stack build yesod-bin cabal-install --install-ghc и stack build накачали тонны неведомых файлов.
запускаю stack exec — yesod devel тоже не менее 10 минут всё компилилось

размер полученного проекта оказался (уф...) не больше метра

Теперь вот думаю сильно ли сложно на основе этой заготовки какой-нить бложек с авторизацией замутить?...

@segfault:
segfault

Быть снойманом — это требовать в типе `(Maybe (Maybe a))` чтобы потом в коде в единственном месте сделать `(join mdef)`

@dr-Chaos:
dr-Chaos

За 1 день смог перескочит на пару релизов yesod, wai, persistent и т.п. Теперь осталось проверить.

@agr:
agr

Произвёл анатомию интегрированного в Yesod Fay. Себя порадовал, и вас заодно: an-pro.org

@segfault:
segfault

github.com <github.com>
А кто еще как считает? Нужен префикс `App` или нет? Лучше с `Route` или с `Handler`?

@segfault:
segfault

forum.ruhaskell.org

@segfault:
segfault

hackage.haskell.org
Как ни крути, а ребе — самый быстрый мейнтейнер. Вчера пропатчил — сегодня уже на хакадже.

@segfault:
segfault

lpaste.net
Если надоело роуты вручную преобразовывать в заглушки хендлеров (йесодовый скафод сосет конеш)
Алсо, как можно улучшить? Особенно говнецо с l1 l2

@segfault:
segfault

yesodweb.com
А ведь неплохо!

@segfault:
segfault

Сасайты.

@segfault:
segfault

Было бы не плохо вместо тупого Vault в йесоде использовать DMap. И тебе защита от неправильного приведения типов, и вполне себе явный список ключей, доступный в одном месте, и защита от не правильного приведения типов. DM вообще можно применить много где ...

@b0oh:
b0oh

жуйк выручай, ща у меня морда треснет от натуги, как в йесоде сделать из EntityField Tag (Key Tag) просто PersistValue?
пример кода:
getTagR tagId = do
tags <- (runDB $ rawSql "select ?? from tag where tag.id = ?" [tagId]) :: Handler [Entity Tag]
...

@b0oh:
b0oh

решил в качестве дз повторить на йесоде ruhaskell.org, и вот написал такой код, для того что бы ссылки разделялись запятой
$with categoriesCount <- length categories
$forall (Entity categoryId category, ix) <- zip categories ints
<a href=@{CategoryR categoryId}>
#{categoryTitle category}
<span .badge-for-tag-link>1
$if ix < (categoriesCount — 1)
, #
помимо удивления, что в гамлете нельзя использовать [0..], появился вопрос: можно ли это сделать прилично?

@provaton:
provaton

Ну вот, небольших успехов добился. Подытожу наблюдения за сегодня:
1. yesod в целом очень неплох, цельный и продуманный фреймворк.
2. компилирующиеся темплейты — мегакрутая идея.
3. Тайп-сейф урлы — шикарно
4. роутинг и хендлеры — нормально
5. виджеты — отличная концепция
6. Не совсем разобрался с наследованием темплейтов, с лайаутами
7. Персистент — говно, которое даже до джанговского ОРМ и близко не дотягивает, не говоря уже об алхимии. Умеет только простейшие вещи, в более-менее сложных нужно писать SQL руками, что нивелирует все заявленные преимущества этого самого персистенса. Шутка ли, даже LIKE не умеет!
8. кондуит — хорошая идея, если реализация соответствует заявленным параметрам, то очень хорошо.
9. Все абстракции по делу, темплейт хаскелл использован только там, где без него совсем туго.
Вывод — для себя можно писать, и оттачивать навыки, в продакшен пока не рискнул бы. Все-таки, без нормального ОРМ там туговато будет.

@segfault:
segfault

Бля, где такое надыбать?
basicHttpAuthenticationData :: (Yesod master ....) => HandlerT master IO (Maybe (Text, Text))
en.wikipedia.org вот, хочу пользователя и пароль вытащить из запроса.

@segfault:
segfault

Полный урл текущего запроса. Как?

@dr-Chaos:
dr-Chaos

а чо... Жить на warp-е без yesod-а вполне даже себе забавно. :)

@segfault:
segfault

А кто у нас тут раскурил, нахуя нужны AForm когда есть MForm? И почему в Foundation.hs есть
type Form x = Html -> MForm (HandlerT App IO) (FormResult x, Widget)
Что за хуйня? Почему именно такой тип, зачем Form принимает Html ?

@segfault:
segfault

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

@segfault:
segfault

Не понимаю Сноймана, неужели это не ReaderT ?
hackage.haskell.org

@segfault:
segfault

А почему yesod devel жрет цпу в простое ? Что он делает ?

@dr-Chaos:
dr-Chaos

Пока не поменял ендпоинт европейскому бкету на EU-шный. При аплоаде периодически пугал меня ошибками
hClose: resource vanished
и
FailedConnectionException "bucket_name.s3.amazonaws.com" 443
после удаления. Хотя и удалял
Срань какая-то...

@dr-Chaos:
dr-Chaos

блин какая-то магия. Делаю всё то же что и в #2522513 , но не в виртуалке. Не хочет собираться, как залипло. Кажет ошибку :

Resolving dependencies...
cabal: Could not resolve dependencies:
trying: AxxonCloud-0.0.1 (user goal)
trying: asn1-types-0.2.1 (dependency of AxxonCloud-0.0.1)
next goal: yesod-platform (dependency of AxxonCloud-0.0.1)
rejecting: yesod-platform-1.2.4.2, 1.2.4.1, 1.2.4 (conflict:
asn1-types==0.2.1, yesod-platform => asn1-types==0.2.0)
rejecting: yesod-platform-1.2.3, 1.2.2, 1.2.1, 1.2.0.1, 1.2.0, 1.1.9.1, 1.1.9,
1.1.8, 1.1.7.2, 1.1.7.1, 1.1.7, 1.1.6.1, 1.1.6, 1.1.5, 1.1.4.1, 1.1.4, 1.1.3,
1.1.2, 1.1.1, 1.1.0, 1.0.6.1, 1.0.6, 1.0.5, 1.0.4.2, 1.0.4.1, 1.0.4, 1.0.3.4,
1.0.3.3, 1.0.3.2, 1.0.2, 1.0.1, 1.0.0, 0.10.3, 0.10.2 (conflict: AxxonCloud =>
yesod-platform>=1.2.4 && <1.3)
Backjump limit reached (change with --max-backjumps).
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.
cabal-meta:
log of commands saved to: /home/yuriy-shelyag/sandboxes/axxoncloud/.shelly/4.txt
Exception: error running: cabal install hashable -fsse41 /home/yuriy-shelyag/sandboxes/axxoncloud/ vendor/starling
exit status: 1
stderr: cabal: Could not resolve dependencies:
trying: AxxonCloud-0.0.1 (user goal)
trying: asn1-types-0.2.1 (dependency of AxxonCloud-0.0.1)
next goal: yesod-platform (dependency of AxxonCloud-0.0.1)
rejecting: yesod-platform-1.2.4.2, 1.2.4.1, 1.2.4 (conflict:
asn1-types==0.2.1, yesod-platform => asn1-types==0.2.0)
rejecting: yesod-platform-1.2.3, 1.2.2, 1.2.1, 1.2.0.1, 1.2.0, 1.1.9.1, 1.1.9,
1.1.8, 1.1.7.2, 1.1.7.1, 1.1.7, 1.1.6.1, 1.1.6, 1.1.5, 1.1.4.1, 1.1.4, 1.1.3,
1.1.2, 1.1.1, 1.1.0, 1.0.6.1, 1.0.6, 1.0.5, 1.0.4.2, 1.0.4.1, 1.0.4, 1.0.3.4,
1.0.3.3, 1.0.3.2, 1.0.2, 1.0.1, 1.0.0, 0.10.3, 0.10.2 (conflict: AxxonCloud =>
yesod-platform>=1.2.4 && <1.3)
Backjump limit reached (change with --max-backjumps).
Note: when using a sandbox, all packages are required to have consistent
dependencies. Try reinstalling/unregistering the offending packages or
recreating the sandbox.

@dr-Chaos:
dr-Chaos

Чувствую себя дибилом. #2521749 . Сделал всё начисто — работает.
Т.е. удалил весь локальный кабал, поставил системный, им поставил последнюю версию локально, прибил системный, вышел из баша , добавил ~/.cabal/bin в пути ; поставил cabal-meta и cabal-src , создал сендбокс, поставил сборку. И оно, сука, собралось.

@dr-Chaos:
dr-Chaos

я так понял прописывать в cabal-файл зависимост от yesod-platform проставлять бессмысленно. Платфоорму надо просто поставить, а затем собирать свой пакет?

@kb:
kb

Наконец-то домучал
github.com

А вчера взялся за новую сверхзадачу — при пост-запросе распарсить
JSON, провалидировать через форму и создать объект вида {"foo":
"bar"}. Начал копаться в формах — ох там и типы, голову сломать
можно. Всерьез уже подумываю слазить с yesod, т.к. ну слишком криво и
сложно вникать в это всё.

@kb:
kb

Таки, кажется, сделал возможность послать данные через POST в тесте. github.com

// ну и код в этом yesod-test, конечно. Даже мне понятно что фигня. Плюс много сомнений по поводу поддержки стандартов.

@dr-Chaos:
dr-Chaos

#2430178 таки походу глюк ghc. github.com

@dr-Chaos:
dr-Chaos

Забавный прикол 
Этот хендлер отправляет приложение в SegFault

getFileMetaR  fileId = do
    File {..} <- runDB $ get404 fileId
    returnJson $ object ["id" .= fileId, "mime-type" .= fileMimetype, "ttl" .= fileTtl]

а этот нет
getFileMetaR  fileId = do
    File {..} <- fromJust404 $ runDB $ get fileId
    returnJson $ object ["id" .= fileId, "mime-type" .= fileMimetype, "ttl" .= fileTtl]

Где 
fromJust404 ::MonadHandler m => m (Maybe a) -> m a
fromJust404 l = l >>= maybe notFound return

а get404 http://hackage.haskell.org/packages/archive/yesod-persistent/1.2.0/doc/html/src/Yesod-Persist.html#get404

@dr-Chaos:
dr-Chaos

Господа, подскажите как лучше сделать.
Задача: тестирование веб приложения на yesod.
Как я это себе вижу — идёт последовательно несколько тестов:
1. Добавление пользователя
2. Добавление этому пользователю некоего хранилища с секретом для подписывания (здесь мы где-то запоминаем id хранилища и секрет)
3. Добавление файлов в это хранилище.

Т.е. мне надо как-то шарить состояние между тестами. А hspec такого не умеет :( github.com И походу yesod.test основанный на нём не умеет тоже.
Можно, конечно, погдотовить некое тестовое окружение, т.е. добавить в базу нужные значения и пользоваться захардкожеными значениями.
Возможно, есть какие-то готовые рекомндации или всё самому?

@dr-Chaos:
dr-Chaos

кажись я въехал в эти ваши кондуиты применительно к http ...

@qnikst:
qnikst

а что Снойман и товарищи не парятся по поводу
Web Framework Benchmarks других фреймворков в списке участников тоже не видно?

@kb:
kb

Persistent прямо поразил своей красотой и чистотой. То, что в ООП-языках приходится делать при помощи создания уродских сущностей, сочетающих в себе и БД-данные и бизнес-модели, там разделили на уровне типов (пусть иногда и сложноватых).

@dr-Chaos:
dr-Chaos

Надо признать в 1.2 Снойман таки упростил типы ...

@dr-Chaos:
dr-Chaos

портировался на yesod 1.2 ... Пришло время пписать тесты.

@dr-Chaos:
dr-Chaos

хотел ещё оди тип аутентификации добавить, а в итоге перешёл на более старшую версию yesdod, persistent и т.п.

@kb:
kb

Мда, интересно. При вот такой страшной ошибке [1] (код теста внизу) оказалось, что не нужно мучаться с первой из них, а лишь поправить очевидную вторую, как первая сразу же пропадёт. Ко мне вернулась вера в человечность как-то даже.

gist.github.com

@kb:
kb

Уродство hackage.haskell.org . Какой-то dynamic scoping сделали (сделал Снойман этот). В результате тесты выглядят по типу:

entitiesSpecs :: Spec
entitiesSpecs =
ydescribe "/entries/ API tests" $ do
yit "gets empty list of entries" $ do
get EntriesR
statusIs 200
bodyEquals "[]"

Ну и, снова таки, чувак пошёл в сторону "лезть в тестах в кишки UI (HTML)". Видно, что тестов он и правда не пишет, т.к. все тесты UI заканчиваются плачевно при любых редизайнах (превращаются в головную боль).

@dr-Chaos:
dr-Chaos

Чувствую себя идиотом, но никак не могу ответить на вопрос. Как правильно работать с файлами открытыми на время жизни приложения?
Вот есть у меня тип App для которого я делаю инстанс Yesod тайпкласа. Запихнул я в него хендл файла. Открыл файл в makeFoundations функции открыл этот файл, а в других фитаю из него. Вопрос в том куда запихать closeFile? Я сперва подумал про ResourceT и его register, но не тут то было. Сигнатура makeFoundation Этого не позволяет. Делать обёртки вида withFile? Что-то как-то совсем криво получется...

@trapdoor:
trapdoor

А snap-то получше yesod будет... Во всяком случае мне удалось его собрать, потвикать и запустить тестовый сайт. Да и снаплеты выглядят погуманнее йесодовых аппликух.