hermes.commands.init.base

Contents

hermes.commands.init.base

Attributes

Classes

GitHoster

Create a collection of name/value pairs.

DepositId

Enum as additional identifier for DepositPlatforms so we have something persistent to code with.

DepositPlatform

This dataclass contains all relevant data to set up hermes for a given platform.

HermesInitFolderInfo

Contains information about the current state of the target project directory.

_HermesInitSettings

Configuration of the init command.

HermesInitCommand

Install HERMES onto a project.

Functions

scout_current_folder(→ HermesInitFolderInfo)

This method looks at the current directory and collects all init relevant data.

get_git_hoster_from_url(→ GitHoster)

Returns the matching GitHoster value to the given url. Returns GitHoster.Empty if none is found.

download_file_from_url(→ None)

string_in_file(→ bool)

get_builtin_plugins(→ dict[str, ...)

Returns a list of installed HermesPlugins based on a list of related command names.

get_handler_by_name(→ logging.Handler | None)

Own implementation of logging.getHandlerByName so that we don't require Python 3.12

Module Contents

hermes.commands.init.base.TUTORIAL_URL = 'https://hermes.software-metadata.pub/en/latest/tutorials/automated-publication-with-ci.html'
hermes.commands.init.base.REPOSITORY_URL = 'https://github.com/softwarepub/hermes'
class hermes.commands.init.base.GitHoster(*args, **kwds)

Bases: enum.Enum

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

    >>> Color.RED
    <Color.RED: 1>
    
  • value lookup:

    >>> Color(1)
    <Color.RED: 1>
    
  • name lookup:

    >>> Color['RED']
    <Color.RED: 1>
    

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes – see the documentation for details.

Empty
GitHub
GitLab
class hermes.commands.init.base.DepositId(*args, **kwds)

Bases: enum.Enum

Enum as additional identifier for DepositPlatforms so we have something persistent to code with.

Empty
Zenodo
ZenodoSandbox
Rodare
RodareTest
class hermes.commands.init.base.DepositPlatform(name: str = '', url: str = '', plugin_name: str = '', deposit_id: DepositId = DepositId.Empty)

This dataclass contains all relevant data to set up hermes for a given platform.

name: str = ''
url: str = ''

Base url of the deposit platform

plugin_name: str = ''

Internal name of our related hermes deposit plugin

id: DepositId

Non changing enum-based ID to keep the consistency

internal_name: str = 'Empty'
token: str = ''

This is the access token which will get filled in connect_deposit_platform

token_name: str

This is the internal name in uppercase, with underscores and ending with _TOKEN. This is used as name for the secret variable on the GitHoster.

hermes.commands.init.base.DepositOptions: list[DepositPlatform]
class hermes.commands.init.base.HermesInitFolderInfo

Contains information about the current state of the target project directory.

absolute_path: str = ''
has_git_folder: bool = False
has_hermes_toml: bool = False
has_gitignore: bool = False
has_citation_cff: bool = False
has_readme: bool = False
current_dir: str = ''
dir_list: list[str] = []
dir_folders: list[str] = []
hermes.commands.init.base.scout_current_folder() HermesInitFolderInfo

This method looks at the current directory and collects all init relevant data. This method is not meant to contain any user interactions. @return: HermesInitFolderInfo object containing the gathered knowledge

hermes.commands.init.base.get_git_hoster_from_url(url: str) GitHoster

Returns the matching GitHoster value to the given url. Returns GitHoster.Empty if none is found.

hermes.commands.init.base.download_file_from_url(url, filepath, append: bool = False) None
hermes.commands.init.base.string_in_file(file_path, search_string: str) bool
hermes.commands.init.base.get_builtin_plugins(plugin_commands: list[str]) dict[str, hermes.commands.base.HermesPlugin]

Returns a list of installed HermesPlugins based on a list of related command names. This is currently not used (we use the marketplace code instead) but maybe later.

hermes.commands.init.base.get_handler_by_name(name: str) logging.Handler | None

Own implementation of logging.getHandlerByName so that we don’t require Python 3.12

class hermes.commands.init.base._HermesInitSettings(/, **data: Any)

Bases: pydantic.BaseModel

Configuration of the init command.

class hermes.commands.init.base.HermesInitCommand(parser: argparse.ArgumentParser)

Bases: hermes.commands.base.HermesCommand

Install HERMES onto a project.

command_name = 'init'
settings_class
folder_info: HermesInitFolderInfo
hermes_was_already_installed: bool = False
warn_on_old_version: bool = True
new_created_paths: list[pathlib.Path] = []
tokens: dict
setup_method: str = ''
deposit_platform: DepositPlatform
git_branch: str = ''
git_remote: str = ''
git_remote_url = ''
git_hoster: GitHoster
template_base_url: str = 'https://raw.githubusercontent.com'
template_branch: str = 'main'
template_repo: str = 'softwarepub/ci-templates'
template_folder: str = 'init-templates'
ci_parameters: dict
hermes_toml_data
plugin_relevant_commands = ['harvest', 'deposit']
builtin_plugins: dict[str, hermes.commands.base.HermesPlugin]
selected_plugins: list[hermes.commands.marketplace.PluginInfo] = []
init_command_parser(command_parser: argparse.ArgumentParser) None

Initialize the command line arguments available for this specific HERMES sub-commands.

You should override this method to add your custom arguments to the command line parser of the respective sub-command.

Parameters:

command_parser – The command line sub-parser responsible for the HERMES sub-command.

load_settings(args: argparse.Namespace)

Load settings from the configuration file (passed in from command line).

refresh_folder_info() None

Checks the contents of the current directory and saves relevant info in self.folder_info

setup_file_logging() None
__call__(args: argparse.Namespace) None

Execute the HERMES sub-command.

Parameters:

args – The namespace that was returned by the command line parser when reading the arguments.

check_hermes_version() None

Fetches the current Pypi Hermes version. Gives a warning if the current version is not up to date.

test_initialization() None

Test if init is possible and wanted. If not: sys.exit()

create_hermes_toml() None

Creates the hermes.toml file based on a self.hermes_toml_data

create_citation_cff() None

If there is no CITATION.cff, the user gets the opportunity to create one online.

update_gitignore() None

Creates .gitignore if there is none and adds ‘.hermes’ to it

get_template_url(filename: str) str

Returns the full template url with a given filename.

create_ci_template() None

Downloads and configures the ci workflow files using templates from the chosen template branch.

configure_ci_template(ci_file_path) None

Replaces all {%parameter%} in a ci file with values from ci_parameters dict

create_zenodo_token() None

Makes the user create a zenodo token and saves it in self.deposit_platform.token.

create_rodare_token()
configure_git_project() None

Adds the token to the git secrets & changes action workflow settings.

configure_github() None
configure_gitlab() None
choose_deposit_platform() None

User chooses his desired deposit platform.

integrate_deposit_platform() None

Makes changes to the toml data or something else based on the chosen deposit platform.

choose_setup_method() None

User chooses his desired setup method: Either preferring automatic (if available) or manual.

connect_deposit_platform() None

Acquires the access token of the chosen deposit platform.

choose_plugins() None

User chooses the plugins he wants to use.

integrate_plugins() None

Plugin installation is added to the ci-parameters. Also for now we use this method to do custom plugin installation steps.

no_git_setup(start_question: str = '') None

Makes the init for a gitless project (basically just creating hermes.toml)

choose_push_trigger() None

User chooses the branch / tag that should be used to trigger the whole hermes pipeline.

set_push_trigger_to_branch(branch: str) None

Sets the CI parameters, so that the pipeline gets triggered when the branch gets pushed.

set_push_trigger_to_tag(tag_pattern: str = '') None

Sets the CI parameters, so that the pipeline gets triggered when a tag that matches the pattern gets pushed.

choose_deposit_files() None

User chooses the files that should be included in the deposition.

mark_as_new_path(path: pathlib.Path, avoid_existing: bool = True) None

This method should be called directly BEFORE creating a new file in the given Path. This way we can look if something already exists there to decide later-on if we want to delete it on abort.

clean_up_files(aborted: bool) None

This gets called when init is finished (successfully or aborted). It cleans up unwanted files (like .hermes folder) and everything new when aborted.