Модульное тестирование удивительного конфига moonscript

То, что я пытаюсь сделать, чтобы выучить некоторый lua / moonscript, - это перенести мой удивительный файл конфигурации (rc.lua) в http://moonscript.org/ и выполнить несколько юнит-тестов по пути. Для этого я настроил rc.lua, чтобы он требовал конфигурационный файл moonscript, как это

package.path = pathsToAdd .. package.path
-- a bit of a hassle to amend the lua require paths
-- correctly; I boldly assume for now that these are not the
-- cause of the problem
require('moonscript')
require('config')

Для первого модульного теста, чтобы проверить, вызывает ли моя конфигурация определенную функцию модуля 'шестерни', все прошло достаточно хорошо. Я закончил издеваться над модулем передач каждого последующего вызова

require('gears')

настроив юнит тест так

package.loaded.gears = myMockVersion

перемотка вперед, когда моему тестируемому конфигурационному файлу требуется модуль 'ужасный': вызывается его init.lua, немедленно выполняющийся

return
{
    client = require("awful.client");
    ...
}

что приводит к client.lua делать

...
local tag = require("awful.tag")
...
local client = {}
-- define lots of functions, register some signal handlers
return client

и теперь, для всех, кто все еще читает, проблема в tag.lua:

...
local capi =
{
    ...
    client = client,
    ...
}
...
capi.client.connect_signal(...)

Этот последний звонок бросает старый добрый

attempt to index a nil value (field 'client')

Я полагаю, это потому, что client.lua еще не прошел несколько первых вызовов, требующих вызова, и поэтому вообще не доступен глобально или, по крайней мере, еще не определил его функциональность.
Что приводит меня, наконец, к вопросу:

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

Спасибо большое заранее.
С уважением

1 ответ

Решение

Ядро C awesome экспортирует некоторые объекты для использования в lua. Ужасные (и многие другие) используют их напрямую. Они в отличном 3.5 (см. https://awesome.naquadah.org/doc/api/):

  • тег
  • таймер
  • drawin
  • KeyGrabber
  • рисуем
  • корень
  • мышь
  • клиент
  • экран
  • классно
  • mousegrabber
  • выбор
  • ключ
  • DBus
  • кнопка

У большинства из них есть оболочки в awful, которые добавляют полезные вещи (например, ключ против awful.key, то же самое для тега, keygrabber, button). Другие вещи полностью скрыты от "среднего пользователя" (например, drawin, drawable).

Вы также должны иметь возможность их смоделировать, но вам придется устанавливать глобальные переменные с тем же именем.

Редактировать: кстати, вот почему вы не можете require("awful") в нормальном луа промт. Те же встроенные объекты отсутствуют.

Другие вопросы по тегам