ScriptsBrowser — управление скриптами [экспериментально]

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ScriptsBrowser — управление скриптами [экспериментально]

Post by John Doe »

Каждый автор так или иначе снабжает свои скрипты метаинформацией, такой как название, описание, версия, автор, тема обсуждения на форуме, и т. п.
Сейчас эта информация может содержаться где угодно: в комментариях, или в каком-то диалоге, или в справке.
Естественно централизовано посмотреть её не получится.

Но раз каждый скрипт в любом случае содержит какую-то метаинформацию, то почему бы не заполнять её стандартизировано?
В результате мы получим возможность управлять скриптами централизованно, и реализовать разные интересные возможности, такие как изложенные ранее: http://forum.farmanager.com/viewtopic.p ... 66#p121966

Представляю экспериментальную реализацию некоторых идей:
Основные понятия:
  • Скрипт — это lua-файл. Он может содержать макросы или выполнять свои функции иным способом.
  • Скрипт может иметь вспомогательные файлы (cfg/lng/hlf).
  • Несколько скриптов могут формировать "пакет".
ScriptsBrowser.lua — утилита для работы со скриптами, запускается из меню плагинов.

regscript.lua — сам модуль, регистрирующий скрипты.
Все поля на данный момент опциональны, и их список открыт для обсуждения.
Пока предлагаю следующие:


cfgscript.lua — вспомогательный модуль, позволяющий переопределить начальные настройки скриптов не трогая их исходный код.

cfgscript_test.lua — демонстрационный скрипт для иллюстрации того, что регистрация может быть полезна и в произвольных скриптах

InsertInfo.lua — вспомогательный макрос для вставки в скрипт шаблона с метаинформацией.

P.S.
Интерфейс самого модуля может быть интересен для применения в макробраузерах.
Сейчас он позволяет получить таблицу скрипта по индексу, по id, или по полному имени файла.
Attachments
scriptbrowser02.7z
(10.12 KiB) Downloaded 299 times
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

scriptbrowser — управление скриптами [экспериментально]

Post by John Doe »

Latest post of the previous page:

IgorZ wrote: Я что-то крупное не заметил? Реализован ещё какой-то способ регистрации, кроме nfo-таблиц?
Я имел ввиду всю обвязку, в том числе получение функции Info (и само её название), завершающее условие (оно добавляет громоздкости), манипуляции с опциями.
IgorZ wrote: хотелось бы видеть это независимым от regscript механизмом. Это возможно?
Возможно всё, но есть ли смысл?
В простейшем случае это сейчас так:

Code: Select all

local Info = package.loaded.regscript or function(...) return ... end
local nfo = Info { ...,
  id = "EE765F8C-EF4B-4820-A3E5-DFD25F280852";
  options = {
    --...
  };
}
if not nfo then return end
local O = nfo.options
Собственно, мне лично тоже не нравится как сейчас опции загромождают определение.

Можно было бы сделать независимо, например как-то так:

Code: Select all

local options = {
    --...
  };
local cfg = package.loaded.cfgscript or function(...) return ... end
if not cfg(options,"EE765F8C-EF4B-4820-A3E5-DFD25F280852") then return end
Условие тут обязательно, это единственный способ "отключения" скрипта...

Ещё можно объединить варианты, как-то так:

Code: Select all

local nfo = Info { ...,
  id = "EE765F8C-EF4B-4820-A3E5-DFD25F280852";
  --...
}
if not nfo then return end

local O = {
    --...
  };
nfo:cfg(O)
Таблицу опций и в этом случае может сохраняться в nfo, для удобства доступа браузера.
Но можно и отдельную функцию.

В общем, нужна обратная связь.

P.S.
IgorZ wrote: Можно и так.
А вызывать тогда в духе ооп: nfo:help()
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

scriptbrowser — управление скриптами [экспериментально]

Post by IgorZ »

John Doe wrote:
IgorZ wrote: Тогда пока отложить на будущее?
Обсудить может быть полезно и сейчас.
Ну, тогда мой взгляд таков. С программной точки зрения это удобней всего видеть как таблицу. Скажем,

Code: Select all

{
  {date=дата, version=версия, changes=изменения},
  {...},
  ...
}
Или несимметричный вариант:

Code: Select all

{
  version={date=дата, changes=изменения},
  {...},
  ...
}
Дата, наверное, может быть необязательной. Симметричный (первый) вариант кажется мне навскидку более удобным, потому что он универсален и позволяет легко получить из себя любой другой.
В файле это можно указывать либо как таблицу (в этом случае формат записи очевиден) , либо как многострочный текст, подаваемый на вход специальной функции. Допустим, так:

Code: Select all

nfo:history[[
dd/mm/yyyy    версия    изменения
dd/mm/yyyy    версия    изме...
                        ...нения
dd/mm/yyyy    версия    изменения
...
]]
За образец текста взял используемый мной шаблон оформления истории.
John Doe wrote:
IgorZ wrote: И как заставить всех абсолютно авторов? Добавить код, рекурсивно обходящий папку Macros и удаляющий все файлы с "некошерными" расширениями? Ибо альтернативой - только добрая воля (субстанция куда более редкая, чем хотелось бы).
Не будем заставлять)
Если автор позаботился о регистрации скрипта, значит увидел для себя какую-то в этом пользу, и (будем надеяться) предварительно изучил прилагающуюся документацию.
Коллега, Вы противоречите самому себе. С одной стороны, автору будет лень писать несколько знаков дополнительно на каждый файл, с другой, ему не лень проделать работу по изучению документации, вставке nfo и, для уже имеющихся проектов, переименованию файлов и соответствующей переделке кода программы.
Как вариант, предложу компромиссный способ:

Code: Select all

files = [[
  cfg:имя файла
  lng:help:имя файла
  lng:help:имя файла
  lng:имя файла
]]
На строки я разбил для красоты. Суть в префиксе типа для имени - минимальная добавка для автора, которая легко парсится программно. Кстати, в принципе можно вместо префиксов использовать постфиксы, но мне кажется, спереди красивее.
John Doe wrote:
IgorZ wrote: А если внутри Луа-код, то и расширение логично поставить .lua. Но при этом для соответствующего скрипта и то, и другое - файл настроек.
Файлы с расширением lua в папке scripts это скрипты. Они могут себя зарегистрировать сами, в частности используя и специальное поле для типа.
Аналогично, они могут быть зарегистрированы и из основного скрипта дополнительным вызовом Info.
И третий вариант, тип "настройки" например может быть определён и маской вида *.cfg.*
(В следующей версии я уже ввёл типы, пока только в browser)
Файл языка или настроек с расширением .lua - не скрипт по смыслу. Писать отдельной nfo на каждый такой файл - излишне и даже, я бы сказал, противоречит главной идее. По расширениям я уже писал. Всё-таки описание типа - просто, компактно и универсально.
John Doe wrote:
IgorZ wrote: Если, к примеру и языковые настройки, и справка находятся в одном файле (у самого в некоторых скриптах так), то отдельное поле типа позволит явно это указать, а ориентирование по расширению окажется бесполезно.
Используя Info вы можете предусмотреть и такую гипотетическую ситуацию, если это необходимо.
Info здесь избыточен, а значит, вреден. Всё-таки не стоит забывать, что эта информация должна ещё и легко восприниматься визуально, а nfo довольно объёмен. Один - ладно, но писать их в одном файле по штуке на каждый вспомогательный файл - явно лишне.
John Doe wrote:
IgorZ wrote: крайне желателен символ, невозможный в имени переменной.
Знаю только один такой \0.
Ну а на практике вряд ли есть необходимость использовать даже слэш.
С другой стороны, использование таблицы позволило бы не делать никаких допущений о практике.
Думаю, dbkey = {"GLOBAL","IgorZ","LuaManager"} выглядит не особо элегантно. Да и писать неудобно. Наверное, лучше всего использовать слэш и удвоение, если надо: dbkey = [[GLOBAL/IgorZ/Import//Export configuration]].
Last edited by IgorZ on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: [c]
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

scriptbrowser — управление скриптами [экспериментально]

Post by IgorZ »

John Doe wrote:
IgorZ wrote: Я что-то крупное не заметил? Реализован ещё какой-то способ регистрации, кроме nfo-таблиц?
Я имел ввиду всю обвязку, в том числе получение функции Info (и само её название), завершающее условие (оно добавляет громоздкости), манипуляции с опциями.
Ну, навскидку - несколько громоздко, чересчур усложнённо, опции лучше бы реализовать независимо. Собственно, последние вообще имеют реальный, а не надуманный смысл только если находятся в отдельном файле. Ну и хотелось бы избавиться от последующего if. Может, в случае ошибки возвращать таблицу с двумя полями, FileName и error, такой вариант реален?
John Doe wrote:
IgorZ wrote: хотелось бы видеть это независимым от regscript механизмом. Это возможно?
Собственно, мне лично тоже не нравится как сейчас опции загромождают определение.
"Ну вот и атлисьно!"(с) ;)
John Doe wrote:
В общем, нужна обратная связь.
По опциям пока только в общих чертах - манагер пишу, когда время есть.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

scriptbrowser — управление скриптами [экспериментально]

Post by John Doe »

(По первому сообщению отвечу позже)
IgorZ wrote: Собственно, последние вообще имеют реальный, а не надуманный смысл только если находятся в отдельном файле.
А так и есть ведь, в таблице только умолчания.
Выпущу наверно вечером новую версию, там будет больше реальных примеров.
IgorZ wrote: Ну, навскидку - несколько громоздко, чересчур усложнённо, опции лучше бы реализовать независимо.
Громоздко: ну.. есть такое.
Усложнённо: предложите проще.
Независимо: было бы лучше, но поскольку вещи связанные, то по отдельности будет более громоздко.
IgorZ wrote: Может, в случае ошибки возвращать таблицу с двумя полями, FileName и error, такой вариант реален?
Запросто, рассматривал и такой вариант, только что это даёт?
От последующего if не избавляет.
IgorZ wrote: "Ну вот и атлисьно!"(с)
Не понял вашу мысль.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

scriptbrowser — управление скриптами [экспериментально]

Post by IgorZ »

John Doe wrote:(По первому сообщению отвечу позже)
IgorZ wrote: Собственно, последние вообще имеют реальный, а не надуманный смысл только если находятся в отдельном файле.
А так и есть ведь, в таблице только умолчания.
Выпущу наверно вечером новую версию, там будет больше реальных примеров.
Подожду, посмотрю. Может, что-то пока недопонимаю.
John Doe wrote:
IgorZ wrote: Может, в случае ошибки возвращать таблицу с двумя полями, FileName и error, такой вариант реален?
Запросто, рассматривал и такой вариант, только что это даёт?
От последующего if не избавляет.
А, собственно, почему ошибка в nfo должна полностью отключать весь файл скрипта, как это сейчас? С таблицей всё просто - если ошибка в nfo вызывает ошибку в скрипте, отработает стандартный механизм, а если не вызывает, браузер сможет показать скрипт с ошибкой в описании. Какие недостатки у данной схемы?
John Doe wrote:
IgorZ wrote: "Ну вот и атлисьно!"(с)
Не понял вашу мысль.
Пардон, вспомнил старый КВН и не подумал, что не все обязаны это помнить (у нас в этом году всё лето стоит жара за 30-35 в тени, при том, что обычно хорошо если месяц за всё лето наберётся. Соответственно, на работе аналогичная душегубка, поскольку кондиционера от родного начальства не дождёшься. С утра мозги ещё работают, а после обеда просто караул).
Собственно, сценка:
У китайского студента Ли дед был нарком здравоохранения, отец - министр здравоохранения, естественно, сам Ли пошёл в медицинский. Учился - ясно как, и вот экзамен.
Экзаменатор: Плохо, молодой человек.
Дед, выходя из тени: Моему внуку "плохо"???
Экзаменатор: Ну, ладно, "удовлетворительно".
Отец, выходя из тени: Моему сыну "удовлетворительно"???
Экзаменатор: Но на "хорошо" он не знает!!!
Студент Ли: Ну вот и атлисьно!
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

scriptbrowser — управление скриптами [экспериментально]

Post by John Doe »

IgorZ wrote: А, собственно, почему ошибка в nfo должна полностью отключать весь файл скрипта, как это сейчас?
Ошибка в nfo не отключает файл скрипта.
А отключается он сейчас только в 2х случаях.
- если в настройках disabled=true
- если minfarversion не соответствует
IgorZ wrote:а если не вызывает, браузер сможет показать скрипт с ошибкой в описании. Какие недостатки у данной схемы?
Никаких, ведь именно так оно сейчас и работает.
IgorZ wrote: По опциям пока только в общих чертах - манагер пишу, когда время есть.
Ок. Пока остаётся как есть, и жду предложений.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

scriptbrowser — управление скриптами [экспериментально]

Post by John Doe »

В шапке обновление.
  • scriptbrowser (сделан главным скриптом пакета):
  • Окне информации о скрипте:
  • regscript:
  • cfgscript
  • InsertInfo.lua: добавлен шаблон для scriptscfg
  • samples:
P.S.
Большинство описанных функций можно проверить на самом пакете scriptbrowser, и его файлах.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

scriptbrowser — управление скриптами [экспериментально]

Post by John Doe »

Обновил скриншоты в шапке
User avatar
HaRT
Moderator
Posts: 10820
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

scriptbrowser — управление скриптами [экспериментально]

Post by HaRT »

John Doe wrote: Обновил скриншоты в шапке
Хорошо бы расшифровку значков из первой колонки добавить в Справку, а то с непривычки выглядит пугающе.

И, пока не поздно, может переименовать везде в ScriptsBrowser (с ‘s’ в середине и с заглавными)? Это чтобы лучше читалось.
Тем более, что внутри архива директория так уже и называется…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

scriptsbrowser — управление скриптами [экспериментально]

Post by John Doe »

HaRT wrote: Хорошо бы расшифровку значков из первой колонки добавить в Справку, а то с непривычки выглядит пугающе.
Разумеется, просто не всё сразу. Как-то так:

Code: Select all

  ┌─────── скрипт подчинён другому
  │ ┌───── доступна функция конфигурации
  │ │ ┌─── опции скрипта доступны для изменения
≡ »¤☼?o‼ ─ ошибка в информации о скрипте
│  │ └──── доступна функция справки
│  └────── доступна функция исполнения
└───────── есть подчинённые скрипты (под-скрипты) 
           если есть вспомогательные файлы нескрипты, то пункт будет помечен знаком +
HaRT wrote: И, пока не поздно, может переименовать
Никогда не поздно)
По мере добавления функций переименую в ScriptsManager.
IgorZ
Posts: 790
Joined: Wed 13 Jul, 2011 03:32
Has thanked: 15 times
Been thanked: 93 times

scriptsbrowser — управление скриптами [экспериментально]

Post by IgorZ »

John Doe wrote:По мере добавления функций переименую в ScriptsManager.
Простите, коллега, но ScriptsManager уже есть, хоть и в альфа-виде (если не загрузят сильно, то и первый релиз, надеюсь, не за горами). Предлагаю, и сейчас, и на будущее, просто для удобства сохранить уже сложившееся стихийно разделение: у Вас браузеры, у меня менеджеры. В конце концов, функциональность первична, а название пусть будет своего рода брендом.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ScriptsBrowser — управление скриптами [экспериментально]

Post by John Doe »

IgorZ wrote: В конце концов, функциональность первична, а название пусть будет своего рода брендом.
Да мне не жалко оставить вам manager, но название всё же должно отражать функциональность.
Сейчас тут у нас действительно браузер, но это ненадолго.

Предлагаю обсудить дальнейшее развитие в следующих направлениях:
  • Формат пакета/дистрибутива: Тип архива (zip/7z). Расширение файла (.farscript). Структура папок (modules/scripts/другое). Некий описатель пакета (достаточно ли Info, или желательно выделить дополнительно файл с фиксированным именем.)
  • Установка скриптов из пакета/дистрибутива. На основании Info, плюс допустима кастомная функция.
  • Удаление установленных пакетов.
  • Обновление/переустановка скриптов. С проверкой версий, с сохранением резервных копий.
  • Обновление из сети. Централизованное хранилище (plugring) или альтернативы.
Я за то, чтобы регламентации везде было минимум.
Разве что тип архива и расширение лучше фиксированные, никого не должно напрячь, и структура папок (modules/scripts) достаточно очевидна.
Всевозможных описателей надо как можно меньше, всё необходимое на практике можно извлечь из Info (уже сейчас).
Никакой базы данных установленных пакетов не надо.
User avatar
HaRT
Moderator
Posts: 10820
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

ScriptsBrowser — управление скриптами [экспериментально]

Post by HaRT »

John Doe, коль скоро речь идёт и об управлении пакетами, не пора ли смотреть в сторону NuGet?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ScriptsBrowser — управление скриптами [экспериментально]

Post by John Doe »

Не пользовался, давайте посмотрим.
(Я сильно не копал, поэтому попробую дофантазировать, а вы поправьте что не так)

Определённо решает вопрос размещения пакетов, и их обновления.
Клиент (nuget.exe) ~ 4 MB, вроде не проблема.
Требует какой-то там дотнет, но на современных ОС тоже не проблема (на XP сходу не запустился).

Вопрос: а что собой представляет база установленных пакетов?
Она общая для системы, или хранится локально?
Будет ли всё работать портабельно, с неустановленными копиями фара?

Из практики использования пользователями я вижу что файлы свободно переименовываются, папки переносятся, и в nuget эту ситуацию никак не обработать.
Т.е. всё нормально, если каждый пакет устанавливается в собственную папку, и создатели пакетов согласовывают их уникальность.
Или можно использовать nuget как хранилище и транспорт, а если хочется большей гибкости, то установку и прочее придётся пилить самостоятельно.
User avatar
HaRT
Moderator
Posts: 10820
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

ScriptsBrowser — управление скриптами [экспериментально]

Post by HaRT »

John Doe wrote: вы поправьте что не так
У меня опыта работы с NuGet тоже нет. Просто я читал, что Майкрософт его продвигает как менеджер пакетов, и многие хорошие инструменты (особенно ориентированные на .NET) его поддерживают. Вот бы NightRoman поделился своим опытом…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

ScriptsBrowser — управление скриптами [экспериментально]

Post by John Doe »

IgorZ wrote: С одной стороны, автору будет лень писать несколько знаков дополнительно на каждый файл, с другой, ему не лень проделать работу по изучению документации, вставке nfo и, для уже имеющихся проектов, переименованию файлов и соответствующей переделке кода программы.
В конечном счёте всё упирается для чего всё это автору. На мой взгляд установка/обновление/автообновление это наиболее весомые причины.
А что касается заполнения полей.. Ну необязательны они, зачем кого-то заставлять.
Вот посмотрит автор как выглядит его скрипт в браузере, и может наведёт это его на какие-то мысли.
Возвращаясь к вопросу указания типа файла: если это нигде потом не используется, то для чего автору его заполнять? А если зачем-то нужно, значит он мотивирован, и заполнит как надо (или файл переименует).
IgorZ wrote: Файл языка или настроек с расширением .lua - не скрипт по смыслу.
Если они загружаются, то нет проблемы добавить туда Info из 2х строк.
Если нет, то тот же nfo может сейчас содержаться в родительском скрипте, или в специально выделенном файле (как вы и предлагали).
Я не вижу чтобы это противоречило главной идее.
Собственно, принципиальных возражений против того, чтобы изменить формат поля files у меня нет, просто пока необходимости не вижу.
IgorZ wrote: nfo довольно объёмен.
2 строки, ведь необязательно все поля заполнять.
IgorZ wrote: писать их в одном файле по штуке на каждый вспомогательный файл - явно лишне.
Я тоже так решил, потому и предусмотрел поле files.
Info предлагаю писать не на каждый файл, а только там, где реально потребуется.
IgorZ wrote: dbkey = {"GLOBAL","IgorZ","LuaManager"} выглядит не особо элегантно.
А мне нравится)
Но не буду упираться, решать вам, как автору редактора (к нему правда вопросы тоже есть, но это в другой теме)

По формату истории: посмотрим как она у нас будет на практике использоваться.
И стоит ли ей находиться в nfo, это ж громоздко. Может лучше в отдельном файле.
Post Reply

Return to “Обсуждение макросов”