У меня, кстати, есть ещё одна разработка – скрипт, который проходится по всем форкам и ищет несмердженные в апстрим ветки. Про такое тоже можно как-то напоминать владельцу основного репозитория. В форках иногда попадаются полезные доработки, которые люди по разным причинам не превращают в пуллы и не вливают в апстрим.
Хотя странно. Я сейчас поставил Firefox Quantum 66.0.3 (64-битный). И у меня проблема не воспроизвелась, ни в обычной вкладке, ни в incognito режиме (где он написал:
Ресурс на «https://mc.yandex.ru/metrika/watch.js» был заблокирован, так как включена блокировка содержимого.[Подробнее] 12forks.com
Ресурс на «https://yandex.ru/clck/click» был заблокирован, так как включена блокировка содержимого.[Подробнее] 12forks.com
Может быть дело в каких-то дополнительных плагинах? Что-нибудь вроде адблока или ещё чего-то такого?
Говоря про регистрацию, я имел в виду, что автор пулла или репозитория могут быть не зарегестрированы в моём сервисе, и даже не знать про него. Бот может прийти в любой пулл и покомментить, что пулл похоже подтухает :)
Только закладки не спасут от того, что эти задачи будут мешаться, когда ты будешь (в рамках второго пункта) пробегаться по всему списку в поисках того, на каком моменте какая задача застряла.
Сейчас мой MVP берёт весь список пуллов и тикетов и разбивает их на несколько категорий:
* Тикеты в которых есть новые комменты с момента, когда я последний раз там что-то писал или создал тикет (тут же показывается число этих комментов, а в веб-версии можно будет отображать их самих + дать возможность тут же ответить)
* Тикеты в которых давно не было активности. Пока MVP пишет лишь время с последнего коммента, но опять же, можно последние комменты и форму ответа подтянуть или сделать кнопки для быстрых ответов с шаблонами, типа: «Please, review my pull».
* Пуллы в коорых есть мердж конфликты.
* Тикеты которые я по каким-то причинам решил отложить до лучших времён + заметка для меня самого, с указанием причины. Например там можно написать, что сейчас пока времени нет на этот проект, и «отложить его на месяц». Спустя заданное время он автоматически появится в одном из списков описанных выше.
Вот такими вещами он может отличаться. И я уверен, что можно ещё много чего придумать.
Так бывает, что эти уведомления теряются в общем потоке писем. В этом и суть того, проекта который я тут описываю – показывать на одной странице в удобном виде все действия, которые тебе нужно совершить, чтобы работа по всем пуллам и тикетам двигалась вперёд.
Читать уведомления на почту конечно же надо. Но я могу читать только свои письма, и не могу повлиять на то, как их разбирают мейнтейнеры библиотек. И если мейнтейнер уведомление пропустил, то нужно как-то ему напомнить о себе. Как это сделать? Ведь гтихаб не присылает на почту напоминалку о том, что ты вот писал две недели назад коммент в таком то пулле, но там тебе никто так и не ответил. А мой сервис сможет делать и это тоже.
На лиспе в наших краях много не пишут потомучто тут нет среды для его развития.
Среда не появится, если её не создать. Этим надо заниматься – писать тулинг, улучшать библиотеки, создавать компании, которые будут использовать эту экосистему. Я понемногу этим занимаюсь.
Вообще dsl можно и на функциях построить. Язык же может быть сколь угодно странным. К примеру, ORM Django или SQLAlchemy предоставляют DSL позволяющий определять модели данных и делать запросы выполняя цепочки методов.
Правилами вычисления аргументов. У функции аргументы вычисляются, как правило, в определённом порядке. В в случае DSL могут не вычисляться вовсе, а как-то трансформироваться в код, например.
К примеру, loop макрос определяет язык для итерации по коллекциям и такой простой код:
DBAAS> (loop for i in '(1 2 3 4 5)
when (evenp i)
collect i)
Разворачивается в более сложную конструкцию, где некоторые аргументы макроса будут вычислены (1 2 3 4 5) и (evenp i), а другие использованы для генерации кода реализующего бизнес-логику. В результате получится нечто вроде этого:
При этом скобочность лиспа позволяет не писать поддержку каждого нового DSL в редакторе. Всё работает «из коробки». И манипуляции с кодом серьёзно упрощаются. Так что я бы не считал это рудиментом. Просто особенность к которой быстро привыкаешь.
Раз уж мы тут про DSL говорим, то при чём тут скобки?
Вот тебе пример из одной библиотеки которую я некоторое время назад написал. Она упрощает парсинг опций командной строки и большую часть работы делает за тебя. Прикладной код выглядит так:
(defmain main ((debug "Show traceback instead of short message."
:flag t)
(log "Filename to write log to.")
(token "GitHub personal access token."
:env-var "TOKEN")
&rest repositories)
"Utility to analyze github forks."
;; Making real work
(loop for repository in repositories
do (analyze repository
:log log
:debug debug
:token token)))
Всё, что ты видишь до строчки Making real work, это DSL для описания функции, принимающей параметры командной строки. Под капотом оно разворачивается в такой вот код:
(progn
(net.didierverna.clon:defsynopsis (:postfix "REPOSITORY")
(defmain/defmain::text :contents "Utility to analyze github forks.")
(defmain/defmain::flag :long-name "help" :env-var nil :description
"Show help on this program." :short-name "h")
(defmain/defmain::flag :long-name "debug" :env-var nil :description
"Show traceback instead of short message." :short-name "d")
(defmain/defmain::stropt :long-name "log" :env-var nil :description
"Filename to write log to." :short-name "l")
(defmain/defmain::stropt :long-name "token" :env-var "TOKEN" :description
"GitHub personal access token." :short-name "t"))
(defun main (&rest defmain/defmain::argv)
(net.didierverna.clon:make-context :cmdline
(cons "cl-info" defmain/defmain::argv))
(let ((repository (net.didierverna.clon:remainder))
(net.didierverna.clon:help
(net.didierverna.clon:getopt :long-name "help"))
(debug (net.didierverna.clon:getopt :long-name "debug"))
(log (net.didierverna.clon:getopt :long-name "log"))
(token (net.didierverna.clon:getopt :long-name "token")))
(when net.didierverna.clon:help
(net.didierverna.clon:help)
(uiop/image:quit 1))
(handler-bind ((t
(lambda (condition)
(uiop/image:print-condition-backtrace condition :stream
*error-output*)
(uiop/image:quit 1))))
(loop for reporitory in (remainder)
do (analyze repository :log log :debug debug :token token))))))
Тут видно, как задаются возможные аргументы, какие у них могут быть флаги и короткие названия, как запускается парсинг аргументов и их значения присваиваются переменным внутри функции.
Абстракция defmain, написанная один раз, сама задаёт разумные дефолты и избавляет меня от написания или копирования всего этого бойлерплейта в каждой программе.
В результате у программистов на других языках лапшекод, который надо будет через год полностью переписать, а у программистов на Lisp лаконично сформулированная бизнеслогика, которую легко читать и поддерживать.
Проверил. Да, по HTTP. Но ведь если параноить, то надо параноить по полной – вычитывать весь код всех своих opensource зависимостей и их зависимостей, и зависимостей их зависимостей.
А почему не стали использовать формат reStructured Text? Он хотя и более странно выглядит, чем Маркдаун, но стандартизирован, и для описания документации лучше походит, так как задумывался именно с этой целью.
В reStructured Text заложены возможности для расширения и то как это делается, тоже стандартизировано, в отличии от Markdown, где разработчик каждой библиотеки городит свой велосипед.
Ресурс на «https://mc.yandex.ru/metrika/watch.js» был заблокирован, так как включена блокировка содержимого.[Подробнее] 12forks.com
Ресурс на «https://yandex.ru/clck/click» был заблокирован, так как включена блокировка содержимого.[Подробнее] 12forks.com
Может быть дело в каких-то дополнительных плагинах? Что-нибудь вроде адблока или ещё чего-то такого?
Спасибо за помощь!
Такой, который будет сам находить забытые PR и напоминать о них даже без регистрации автора пулла или репозитория?
* Тикеты в которых есть новые комменты с момента, когда я последний раз там что-то писал или создал тикет (тут же показывается число этих комментов, а в веб-версии можно будет отображать их самих + дать возможность тут же ответить)
* Тикеты в которых давно не было активности. Пока MVP пишет лишь время с последнего коммента, но опять же, можно последние комменты и форму ответа подтянуть или сделать кнопки для быстрых ответов с шаблонами, типа: «Please, review my pull».
* Пуллы в коорых есть мердж конфликты.
* Тикеты которые я по каким-то причинам решил отложить до лучших времён + заметка для меня самого, с указанием причины. Например там можно написать, что сейчас пока времени нет на этот проект, и «отложить его на месяц». Спустя заданное время он автоматически появится в одном из списков описанных выше.
Вот такими вещами он может отличаться. И я уверен, что можно ещё много чего придумать.
Читать уведомления на почту конечно же надо. Но я могу читать только свои письма, и не могу повлиять на то, как их разбирают мейнтейнеры библиотек. И если мейнтейнер уведомление пропустил, то нужно как-то ему напомнить о себе. Как это сделать? Ведь гтихаб не присылает на почту напоминалку о том, что ты вот писал две недели назад коммент в таком то пулле, но там тебе никто так и не ответил. А мой сервис сможет делать и это тоже.
Среда не появится, если её не создать. Этим надо заниматься – писать тулинг, улучшать библиотеки, создавать компании, которые будут использовать эту экосистему. Я понемногу этим занимаюсь.
Вообще dsl можно и на функциях построить. Язык же может быть сколь угодно странным. К примеру, ORM Django или SQLAlchemy предоставляют DSL позволяющий определять модели данных и делать запросы выполняя цепочки методов.
Правилами вычисления аргументов. У функции аргументы вычисляются, как правило, в определённом порядке. В в случае DSL могут не вычисляться вовсе, а как-то трансформироваться в код, например.
К примеру, loop макрос определяет язык для итерации по коллекциям и такой простой код:
Разворачивается в более сложную конструкцию, где некоторые аргументы макроса будут вычислены
(1 2 3 4 5)
и(evenp i)
, а другие использованы для генерации кода реализующего бизнес-логику. В результате получится нечто вроде этого:Раз уж мы тут про DSL говорим, то при чём тут скобки?
Вот тебе пример из одной библиотеки которую я некоторое время назад написал. Она упрощает парсинг опций командной строки и большую часть работы делает за тебя. Прикладной код выглядит так:
Всё, что ты видишь до строчки
Making real work
, это DSL для описания функции, принимающей параметры командной строки. Под капотом оно разворачивается в такой вот код:Тут видно, как задаются возможные аргументы, какие у них могут быть флаги и короткие названия, как запускается парсинг аргументов и их значения присваиваются переменным внутри функции.
Абстракция defmain, написанная один раз, сама задаёт разумные дефолты и избавляет меня от написания или копирования всего этого бойлерплейта в каждой программе.
Такой вот DSL. Реальный.
Кстати, opensource хорош тем, что его можно исправлять. Пока завёл issue про https: github.com/quicklisp/quicklisp-client/issues/167
В reStructured Text заложены возможности для расширения и то как это делается, тоже стандартизировано, в отличии от Markdown, где разработчик каждой библиотеки городит свой велосипед.