DeskChan: Jython Support
13.03.2017


Новая штука для DC! В этот раз это плагин, который позволяет другим плагинам быть написанными на языке Python 2.5 2.7 (с v1.0.2). Ну, если быть более точным, называется он Jython и поддерживает не только модули, входящие в стандартную поставку Python-интерпретатора, но и библиотеки Java. Пример простейшего плагина для изучения присутствует в архиве для версий до 1.2.0 или его можно скачать отдельно для поздних версий (test_python).
По сути тут поддерживаются вызовы тех же функций, что и в Groovy-плагине (sendMessage(), addMessageListener(), getPluginDir() и т. д.), но мне пока не удалось элегантно "заинжектить" их в интерпретатор именно как функции*. Поэтому взаимодействие с системой сообщений приложения осуществляется через так называемую шину (bus) — специальный объект, проксирующий вызовы методов в Java-код.

* Сделать плагин наследником Java-класса, как сделано для Groovy-плагинов у меня не получилось. В многообразии Джавовских "коллбэков" я тоже плохо ориентируюсь. Ближе всего к желаемому результату получилось заинжектить Грувовский Closure. Но из Python-кода его приходится вызывать через callOn(), что ещё хуже, чем решение с шиной. Может потом я всё-таки что-нибудь придумаю. Или кто-нибудь подскажет. В любом случае, обратная совместимость с шиной будет сохранена.

Как обычно, два варианта установки, которым надо указать папку с DC.

Для особых "извращенцев", любящих голый код и ручную сборку, ссылка на ветку.

Скачать тестовый плагин-пример (для версий до 1.2.0 он включён в основной архив):

Также не забываем подписываться на мой канал в Telegram! Там новости, связанные с этим проектом, выходят первыми. А ещё я там публикую некоторые эксклюзивные штуки, связанные с мессенджером.


Обновление от 24 марта 2017 (v1.0.1)

  • Восстановлена совместимость с последними версиями приложения, переделанного со Swing на JavaFX;
  • добавлены новые методы для логирования, доступные Groovy-плагинам;
  • добавлен нестандартный метод say(), облегчающий вывод сообщений и автоматически приводящий строку к нужной кодировке (почему-то там опять что-то отвалилось, так что поправлю завтра); качестве параметра принимает любой объект, приводимый к строке (то есть вообще любой, лол);
  • плагин-пример теперь использует стандартный таймер, а не из Swing.

Старые ссылки: ZIPак (v1.0.0), SFX (v1.0.0).


Обновление от 25 марта 2017 (v1.0.2)

  • Исправлена ошибка с кодировками, оставшаяся в предыдущей сборке;
  • зависимость изменена с Jython 2.5.2 на более новый 2.7.1b3, что позволяет пользоваться новыми фишками языка и улучшает совместимость со сторонними модулями;
  • добавлен Python-модуль busproxy, который содержит функции, проксирующие вызовы к шине, и алиасы к ним с именами более близкими стилю языка; просто импортируйте из него все или только нужные функции и больше не пишите постоянно «bus.»!

Кроме того, я придумал, как мне кажется, оптимальный вариант для дистрибуции зависимостей. К JYTHON_PATH теперь отдельно добавляется папка __dependencies__ внутри папки Вашего плагина. Туда я и предлагаю устанавливать все зависимости с помощью следующей команды, чтобы не мешались:

pip install --target=__dependencies__ --ignore-installed <названия пакетов...>

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

Старые ссылки: ZIPак (v1.0.1), SFX (v1.0.1).


Обновление от 17 апреля 2017 (v1.1.0)

  • Плагины теперь компилируются только при загрузке. Это значит, что плагины, занесённые в «чёрный список» больше не будут тратить время на собственную компиляцию. Но при этом при каждой загрузке плагина через load/unload или blacklist/unblacklist он будет компилироваться заново. Также это позволяет ещё немного обособить плагины друг от друга.
  • Методы шины getPluginDirPath(), getDataDirPath() и их псевдонимы в модуле busproxy теперь возвращают строки, а не объект Path из Java-кода. Это позволяет без лишних преобразований пользоваться стандартным Питоновским модулем os.path.
  • Метоод say() вновь поддерживает не только строки, а любые объекты, приводимые к ним. Также теперь ему можно передавать те же дополнительные параметры приоритета, спрайта и таймаута, какие доступны через обычный sendMessage().
  • Добавлен новый метод getId(), который позволяет получить идентификатор плагина (на данный момент, это строка с его именем).
  • Документация обновлена до актуального состояния.
  • В тестовый плагин-пример (test_python) добавлена демонстрация новых возможностей, а текстовое поле в настройках теперь не просто выводит сообщение, а позволяет выполнять и тестировать однострочные команды на языке Python.
  • Добавлен новый модуль pluginutils, предоставляющий классы Settings и Localization, предоставляющие для плагинописателей встроенные средства для сохранения настроек плагина и создания мультиязычных плагинов. Подробнее можно почитать в документации или посмотреть в обновлённом плагине-примере.

Старые ссылки: ZIPак (v1.0.2), SFX (v1.0.2).


Обновление от 21 апреля 2017 (v1.1.1)

Исправлено несколько ошибок, в том числе с кодировками и кроссплатформенностью.

Старые ссылки: ZIPак (v1.1.0), SFX (v1.1.0).


Обновление от 28 мая 2017 (v1.2.0)

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

В прошлых версиях был серьёзный баг: все загружающиеся плагины, пользующиеся моими модулями, переписывали для этих самых модулей общую ссылку на pluginProxy. Поэтому все плагины выполнялись от ID последнего загруженного плагина. Я придумал, как это исправить, но пришлось полностью изменить логику работы этих самых модулей.
В итоге теперь нельзя импортировать нужные функции из busproxy. Теперь нужно импортировать его и вызвать функцию inject, передав ей ссылку на шину и текущую область видимости. А меняя ссылку на область видимости, можно «инжектить» функции в другие модули. По умолчанию внедряются все функции, но можно ограничить только до перечисленных.
Также обратите внимание, что get_instance у модулей локализации и настроек теперь всегда требует ссылку на шину! Поэтому при необходимости либо передавайте её в другие модули, либо сделайте собственный статический класс-хранитель, который будете инициализировать в начале плагина, а дальше использовать из других модулей (подобный подход использован в плагине vk_message_reader, который будет опубликован на днях).

В общем, советую изучить плагин-пример, который, начиная с этого релиза, не включён в основной архив, а идёт отдельно, и посмотреть, как всё реализовано там. Ну а ещё есть же и документация.

Для работы требуется версия DC не ниже сборки от 30 апреля.

Старые ссылки: ZIPак (v1.1.1), SFX (v1.1.1).


Обновление от 9 сентября 2017 (v1.2.1)

  • Восстановлена работоспособность с новыми версиями DeskChan (начиная с v0.2.0-r256).
  • Библиотека jython-standalone:2.7.1b3 заменена на вышедшую релизную версию 2.7.1.
  • Добавлены манифесты.

Старые ссылки:

  • сам плагин-загрузчик: ZIPак (v1.2.0), SFX (v1.2.0).
  • тестовый плагин: ZIPак (v1.2.0), SFX (v1.2.0).