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

[Feature Request] Better project template configuration options #1701

Open
bavalpey opened this issue Aug 30, 2024 · 6 comments
Open

[Feature Request] Better project template configuration options #1701

bavalpey opened this issue Aug 30, 2024 · 6 comments

Comments

@bavalpey
Copy link

I really like hatch. In fact, I've been using it a lot.
However, the one area where hatch is weakest is in project templates. We have almost no ability to modify how project templates are created (or at least, none documented). The documentation for the configuration options is lacking, and the blogposts don't seem to be paying any attention to it, either.

First, licenses should be always put in the LICENSES/ directory regardless if there is more than one license. This is in accordance with the REUSE spec. If there is one license, it is fine to have it in the project root as well, but the creation of the LICENSES directory should not be conditional.

Second, there is currently no way to adjust the copyright text in headers. For instance, it always uses the author for the copyright text. This is insufficient for a good percentage of projects, where the author is different from the copyright holder (e.g., where work done is copyrighted by the company and not the author).

Third, is there support for defining arbitrary project template structures? What if I want to add, say, a .editorconfig to the project root. Or maybe I want a default .gitignore, or to change the placeholder text in README.md. If there are ways of doing this already, they are not communicated to the user.

@djcopley
Copy link
Contributor

djcopley commented Aug 30, 2024

Although not documented, it is possible to create plugins that augment, or completely replace the built in templating. You'll need make a class derived from TemplateInterface and set up the hooks / entry points as described in the plugins section of the docs. Reading the source for the default template will give you a good idea of how to do it.

Once you've created your plugin, you'll need to update your hatch config and add your plugin and its configuration (you can find your configuration with hatch config find).

[template.plugins.YOUR-PLUGIN]  # <<<< add your plugin here
my-opt1 = true

[template.plugins.default]  # <<<< remove this entire section if you want to completely replace the default template
tests = true
ci = false
src-layout = true

@bavalpey
Copy link
Author

Once you've created your plugin, you'll need to update your hatch config and add your plugin and its configuration (you can find your configuration with hatch config find).

Ok, where exactly does the code for my plugin have to be in order for hatch to locate it? Is there a plugin directory somewhere? Do I have to publish it and it gets installed?

The plugin section of the docs answers none of these questions.

@djcopley
Copy link
Contributor

These are python-isms, not necessarily just hatch things.

The plugin has to be accessible to the build system, to do that, declare the plugin as a build time dependency in your pyproject.toml. Typically, these are pip installable, however, you can also specify python distributions that exist locally.

[build-system]
requires = ["hatchling", "hatch-your-plugin @ <PATH_TO_YOUR_PLUGIN>"]
build-backend = "hatchling.build"

@bavalpey
Copy link
Author

The plugin has to be accessible to the build system, to do that, declare the plugin as a build time dependency in your pyproject.toml. Typically, these are pip installable, however, you can also specify python distributions that exist locally.

Okay this is what doesn't make any sense to me. This is like a chicken-and-egg problem. The point is that the plugin augments the behavior of hatch new which is what creates the pyproject.toml in the first place. How can I specify that hatch should use my plugin if pyproject.toml doesn't exist?

I assume I need to tell hatchling about my plugin in hatch's global configuration file. Is this not the case?

@djcopley
Copy link
Contributor

djcopley commented Aug 30, 2024

Sorry yes, you're correct. You'll need to install your template plugin into whatever environment hatch is running from. If you installed hatch with pipx, you can use pipx inject. If you used something else, you'll need to figure out where hatch's python environment lives, activate it, and pip install your plugin into it. I've always used pipx so I don't have any specifics for the other installation methods.

@bavalpey
Copy link
Author

bavalpey commented Aug 30, 2024

If you used something else, you'll need to figure out where hatch's python environment lives, activate it, and pip install your plugin into it. I've always used pipx so I don't have any specifics for the other installation methods.

Hmm. I'm using the binary distribution from the .tar.gz
No idea how to inject it there...

Thanks for all the help!

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

No branches or pull requests

2 participants