Osome linter presentation
Почему это важно?
Наши ценности как платформенной команды
- Быть рычагом продуктовых команд, а не становиться gate keeper'ами или bottleneck'ом
- Тратить время на важное, а не на рутину
Где мы сейчас?
🥺 Платформенная команда каждый раз пишет, то как должна называться модель или какой префикс должен быть у модели в соответсвии с принципами
🥺 Платформенная команда вручную смотрит каждый пр спек
🥺 Платформенная команда форсирует стайлгайд вручную
🥺 Платформенная команда иногда растягивает ревью спек на 2-3 дня
Погружаемся в данные






Чего хотелось бы добиться в итоге?
Идеальная ситуация в выдуманном мире:
Человек из продуктовой команды открывает пр в sdk, его смотрят его же члены продуктовой команды, пр висит не больше дня, далее оказывается в мастере
Хорошая ситуация:
Человек из продуктовой команды открывает пр, его смотрит платформенная команда, но обсуждения по стилистике неймингу и принципам сведены к нулю
Гипотеза: кажется нам нужно автоматизировать этот процесс, используя линтер
Принципы выбора решения
Текущая реализация языка tinyspec неподдерживаемая и тяжело расширяемая
Tinyspec - one pass compiler
Tinyspec базируется на регулярных выражениях

Такие сложные регулярные выражения приносят в компиляторы не только нерасширяемость, но и недерминистичность синтаксиса. То есть другими словами никто доподлинно сейчас не ответит какую комбинацию символов и newlin'ов тайниспек сможет распарсить а какую нет.

`/industries`:
$L /industries ?branch?


Обратная совместимость с текущей реализацией*
Breaking changes
Запрещаем теги для эндпоинтов без ``
❌ bad
Kek:
POST /industies
✅ good
`Kek`:
POST /industies
Запрещаем inline query
❌ bad
POST /industies?filter=
✅ good
POST /industies?SomeQuery
Запрещаем new:message синтакс для ключей объектов
WSEventsFromServerForAgent {
messages:new?: WSOnNewMessageForAgent,
messages:update?: WSOnUpdateMessageForAgent,
}
Запрещаем $CRUDL
@token $CRUDL /conversations/:id/messages

Легкость поддержки любым разработчиком
- Нет регулярных выражений
- 0 зависимостей на уровне языка (peg.js, yak, tree-sitter, bison)
Расширяемость линтера
😍 Возможность писать кастомные правила
😍 Удобный интерфейс (абстракция) для описания правил

Demo time!
Rule typecheck
Возможность постепенной миграции

Потенцаильная возможность для развития и поддержки данной технологии



Не отставать от современного opensource и идти в ногу со временем
На текущий момент tinyspec не совместим с форматом openapi
Историческая справка
Openapi стал популярен в момент выхода спецификации v2. Примерно в это время появился tinyspec. Tinyspec позиционируется как DSL совместимый с openapi v2
Openapi3 сейчас чаще всего называется Swagger
Сила спецификации в том, что когда ты читаешь спецификацию, можно ожидать от программ имплементирующих данную спецификацию, что они будут работать корректно - в соответствии с данной спецификацией
Действительно ли tinyspec следует openapi2?
Это ложь

AnyOf никогда не был частью openapi v2
Мы застряли в чистилище между двумя спецификациями и придумываем нашу собственную
Почему вообще использовать openapi 2, когда по всему миру шагает openapi 3?
✨ Текущая реализация языка tinyspec неподдерживаемая и тяжело расширяемая
✨ Обратная совместимость с текущей реализацией*
✨ Легкость поддержки любыми разработчиками
✨ Линтер должен быть легко расширяемым новыми правилами, правило можно писать из вне
✨ Возможность постепенной миграции
✨ Потенцаильная возможность для развития и поддержки данной технологии
✨ Не отставать от современного opensource и идти в ногу со временем
Demo time!
What's next?
🚀 Printer (WIP) - watch an example in slack
🚀 Compiler (WIP)
🚀 Обучение и презентации для продуктовых команд
🚀 Документация
Roadmap
Q&A
deck
By Andrey Frolov
deck
- 21