Story #4082
closedAs a plugin writer I can use plugin_template to bootstrap or update a plugin
100%
Description
The plugin template has been very useful for creating new plugins. The downside is that since it is used only to create new plugins, it is not used frequently. The recent addition of generate_travis_config demonstrates that the template can also be useful for updating plugins, which will both increase usage and save plugin writers time.
As we are expanding the usage, the following issues are arising:
Problem 1: args instead of config.
One pain point with generate_travis_config is that all the variables are set at runtime, so plugin writers need to remember the exact command used to generate their travis if they want to run it again to update those files. This concept will be a pain point for anything that the template is capable of updating.
Problem 2: Multiple template types
Some files are templated with string processing, some are templated with jinja
Problem 3: Difficult to update plugins.
Currently the template can only update travis files because bootstrap will clobber their existing work.
HIgh Level Plan¶
The changes will all be implemented in sub-tasks to this epic issue.
all jinja
Replace all string formatting with jinja templates.
committed config values:
A yml file (checked into git) will be used to store human readable values, allowing repeated, idempotent usage.
New CLI:
`plugin-template init [path/to/plugin/parentdir/, defaults to ../]`:
- Wizard asks user for any config values necessary to bootstrap the template.
- Create a root directory for new plugin
- creates a user-editable template-config.yml file in the plugin root dir that stores all the config values (all values documented in the file comments)
`plugin-template bootstrap <path-to-plugin-rootdir>`:
- Reads the template file at <path>/template-config.yml
- render files conditionally based on yml. (ie, if deploy-pypi-client is set to false, don't template that file)
`plugin-template update <path-to-plugin-rootdir> [--file-path <path>]
- Reads the template file at <path>/template.yml
- similar to bootstrap command, but act only on "managed files" which are files which should not be updated manually by the plugin author, ex .travis/script.sh
- if --file-path <path> is passed, render that file only. this can be used to deliberately clobber files that need updating, but are not "managed files", giving the plugin author granular control.
Note: All changes should be made against the filesystem only, and should not invoke git. The plugin writer can then use `git diff` to make sure that the changes are correct for their plugin, and gives them the option to not stage certain changes.
Related issues
Problem: can't generate a new plugin template config
Solution: add command line argument for generating a config
This patch changes the name of the boostrap.py script to plugin-template. The plugin writer is now requred to generate a template_config.yml before bootstrapping a new plugin.
Adds a --generate-config argument that generates a template_config.yml inside the plugin's root directory. This config is then going to be used to generate Travis configuration and scripts.
Plugin names can now be anything. The user must specify a plugin-app-label when generating a config.
This patch removes all the command line arguments that are now represented in the template config.
The settings in the template_config.yml no longer have exclude_ prefix.
The location of where the 'app' and 'tests' directories get created inside a new plugin has been updated.
The documentation was updated to reflect the new workflow.
re: #4082 https://pulp.plan.io/issues/4082