Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to load extra commands from plugins (with test) #1142

Merged
merged 9 commits into from
Sep 20, 2023

Conversation

gouttegd
Copy link
Contributor

@gouttegd gouttegd commented Aug 8, 2023

  • docs/ have been added/updated
  • tests have been added/updated
  • mvn verify says all tests pass
  • mvn site says all JavaDocs correct
  • CHANGELOG.md has been updated

This is a the same PR as #1119, except that it includes an integration test to check that the plugin manager does find a plugin and can load a new command from it.

gouttegd and others added 6 commits May 16, 2023 09:31
When ROBOT's CLI is initialised, we search for implementations of the
`Command` interface offered as services, both in the system class path
and in any Jar file found in the following directories:

* the directory specified by the `robot.pluginsdir` system property;
* the directory specified by the `ROBOT_PLUGINS_DIRECTORY` environment
  variable;
* the calling user's `~/.robot/plugins` directory.

When an implementation is found, it is registered to the CommandManager,
allowing to use the command the same way as any built-in command.

When a command has been loaded from a Jar file from one of the
directories listed above (instead of from the system class path), its
name must be prefixed by the basename of the Jar file (without the .jar
extension) followed by a colon, for the command to be invoked from the
command line.

For example, if the file `my-plugins.jar` contains a command named
`hello`, that command must be invoked as `my-plugins:hello`.
It could happen that a Jar plugin file could contain a bogus service
configuration file, that is, a file that does not point to an existing
org.obolibrary.robot.Command implementation. ROBOT should not abruptly
fail in that situation, but should instead ignore the Jar file.
Add a new 'plugins' page in the documentation to briefly explain how to
use and develop plugins. Mention the added support for plugins in the
changelog.
Add a new module for a mock plugin (a command that inserts a silly
message into the current ontology). The plugin will be used to test the
support for pluggable commands and may also act as an example of how to
create ROBOT plugins.
Add a new test fixture to check that the plugin manager can successfully
find and load the mock plugin.
@gouttegd gouttegd marked this pull request as draft August 8, 2023 20:47
@gouttegd gouttegd changed the title Wip/simple plugins test Allow to load extra commands from plugins (with test) Aug 8, 2023
@gouttegd gouttegd mentioned this pull request Aug 8, 2023
5 tasks
It is counterintuitive that a test for the PluginManager, which is a
component of the robot-command module, shall be in a separate module.
But obviously we cannot test loading a plugin before the plugin itself
has been built, and we cannot build the plugin before robot-command
because the plugin itself is dependent on robot-command.

So we test the plugin manager during the integration testing phase of
the plugin; at this point all artifacts have been built (both the
robot.jar and the plugin jar).
CHANGELOG.md Show resolved Hide resolved
@matentzn matentzn added this to the Robot 1.9.5 milestone Aug 24, 2023
@matentzn matentzn marked this pull request as ready for review August 24, 2023 14:51
@jamesaoverton
Copy link
Member

I finally made time to review and test this for myself. The design and code are lovely, and aside from one typo that tripped me up for a minute, everything worked as expected.

@jamesaoverton jamesaoverton merged commit 87146ea into ontodev:master Sep 20, 2023
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants