clojure-russia 2018-12-29

Разобрался я с валидацией. Все-таки спека это про форму данных, а не валидацию. И валидация может зависеть от разных внешних факторов. У меня вопрос поинтереснее:

{:publication/id 1
 :publication/translations {:en {:publication.translation/title "article"
                                 :article.translation/content "some content"}}
 :article/image-url "http://..."}
Т.е. я хочу расширить вложенную мапу, но не могу этого сделать, т.к. не могу переопределить :publication/translation и добавить туда :article.translation/content. Вариант решения я вижу только один - req-un. Может еще что-то есть?

@kuzmin_m Это нельзя по определению. Если ты ссылаешься на :publication/translations, то она может быть только одного вида.

так я ее расширяю

Либо в :publication/translations сделать дополнительный ключ опциональный, и где-то его требовать.

Так ты расширяешь свою спеку для внешнего типа, а не для внутреннего.

по факту article наследует от publication т.е. он может усиливать контракт, что я и хочу если бы я ослаблял контракт, выкидывая ключи, это да

Тогда просто сделай дополнительную проверку наверху.

генератор отвалится 😃

¯\(ツ)

для датомика с его фактами спека идеально подходит а если нужны вложенные мапы - боль и страдания

Спека плохо подходит для случая "а теперь мы напихаем всякую хрень в типы, на которые мы ссылаемся"

можешь пояснить?

Ну вот есть тип :publication/translations. Ты его определил, у него ключи, всё такое.

А теперь оказывается, что тип-то не тот! В каком-то контексте там ещё другой тип.

так я его расширяю

Не его.

Спека нерекурсивная.

Можно расширить внутренний тип, а потом сослаться на расширенный в том месте, где надо.

что значит “внутренний тип“?

Но тогда нужно другой ключ, так как это другой тип.

Тип мапы с ключом :publication/translations.

Спека говорит "если ты употребил такой-то ключ, то этим ты сказал, что значение этого ключа имеет такой-то тип".

И не подходит в случае, когда у одного и того же ключа разные типы.

и приведения “типов” тут нет

было бы забавно, если для доступа по ключу учитывалось наследование

(derive :b :a)
(:b {:a 1}) ;;=> 1
тогда можно было бы и спеки наследовать но это на первый взгляд наркомания

вроде как дали “типы“, но они не работают как типы

А это не типы, такие дела.

Это формы.

что такое “формы“?

Data shapes. Спека подразумевает очень своеобразный подход к моделированию данных.

Если ты что-то назвал, то у этого чего-то конкретная форма.

Нельзя в двух разных местах использовать две разные формы под одним именем.

ок, спасибо

Я уже на это натыкался, когда хотел спекой покрыть чужую модель данных (там это вообще JSON).

Там в зависимости от места в дереве один и тот же ключ означал разные вещи.

Взял вместо этого схему.

👌 1

Как раз вместе со schema-refined, на которую тут ссылка пробегала.

Понял я свою ошибку. Нельзя так делать, как я хочу. Если у публикации есть публикация.перевод, и статья наследует публикации, то в интерфейсе статьи обязан быть публикация.перевод, а не статья.перевод.

Нет, можно так делать: https://repl.it/@darkleaf/inheritance

https://hardcode.fm/2018/12/29/episode007.html теперь с @nicola Этот выпуск специально для этого чатика - про Рича, conj и maybe not (лучше поздно, чем никогда) Особенно тем, кто не в телеге 🙂

👍 4