-
Notifications
You must be signed in to change notification settings - Fork 193
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
Migrate list command to components #1995
Merged
Merged
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
27775a8
add get_all_components to modules_json
mashehu 9e83aa5
Merge branch 'dev' of https://github.com/nf-core/tools into dev
mashehu fd9e1d6
first running version of new list command for subworkflows
mashehu 1dfafa7
first running version of components based list
mashehu abbd1bc
fix for modules list
mashehu 3090531
Apply suggestions from code review
mashehu 06a272d
remove implementation relicts
mashehu 8a81859
Merge branch 'migrate-sw-list' of https://github.com/mashehu/tools in…
mashehu e763cca
Merge branch 'dev' of https://github.com/nf-core/tools into migrate-s…
mashehu f289a69
add test for sw list
mashehu 7a2fa10
use keywords as arrays in list
mashehu ad2db6c
Update nf_core/components/list.py
mashehu 19d0ae1
Update tests/test_subworkflows.py
mashehu 4be837d
Update tests/test_subworkflows.py
mashehu 69f0216
update gitlab subworkflow names
mashehu 3f8863e
Merge branch 'migrate-sw-list' of https://github.com/mashehu/tools in…
mashehu File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
import json | ||
import logging | ||
|
||
import rich | ||
|
||
import nf_core.modules.modules_utils | ||
from nf_core.components.components_command import ComponentCommand | ||
from nf_core.modules.modules_json import ModulesJson | ||
|
||
# from .modules_command import ModulesRepo | ||
from nf_core.modules.modules_repo import ModulesRepo | ||
|
||
log = logging.getLogger(__name__) | ||
|
||
|
||
class ComponentList(ComponentCommand): | ||
def __init__(self, component_type, pipeline_dir, remote=True, remote_url=None, branch=None, no_pull=False): | ||
super().__init__(component_type, pipeline_dir, remote_url, branch, no_pull) | ||
self.remote = remote | ||
|
||
def list_components(self, keywords=None, print_json=False): | ||
keywords = keywords or [] | ||
""" | ||
Get available modules/subworkflows names from GitHub tree for repo | ||
and print as list to stdout | ||
""" | ||
# Check modules directory structure | ||
# self.check_component_structure(self.component_type) | ||
|
||
# Initialise rich table | ||
table = rich.table.Table() | ||
table.add_column(f"{self.component_type[:-1].capitalize()} Name") | ||
components = [] | ||
|
||
def pattern_msg(keywords): | ||
if len(keywords) == 0: | ||
return "" | ||
if len(keywords) == 1: | ||
return f" matching pattern '{keywords[0]}'" | ||
else: | ||
quoted_keywords = (f"'{key}'" for key in keywords) | ||
return f" matching patterns {', '.join(quoted_keywords)}" | ||
|
||
# No pipeline given - show all remote | ||
if self.remote: | ||
# Filter the modules/subworkflows by keywords | ||
components = [ | ||
comp | ||
for comp in self.modules_repo.get_avail_components(self.component_type) | ||
if all(k in comp for k in keywords) | ||
] | ||
|
||
# Nothing found | ||
if len(components) == 0: | ||
log.info( | ||
f"No available {self.component_type} found in {self.modules_repo.remote_url} ({self.modules_repo.branch})" | ||
f"{pattern_msg(keywords)}" | ||
) | ||
return "" | ||
|
||
for comp in sorted(components): | ||
table.add_row(comp) | ||
|
||
# We have a pipeline - list what's installed | ||
else: | ||
# Check that we are in a pipeline directory | ||
|
||
try: | ||
_, repo_type = nf_core.modules.modules_utils.get_repo_type(self.dir) | ||
if repo_type != "pipeline": | ||
raise UserWarning( | ||
f"The command 'nf-core {self.component_type} list local' must be run from a pipeline directory.", | ||
) | ||
except UserWarning as e: | ||
log.error(e) | ||
return "" | ||
# Check whether pipelines is valid | ||
try: | ||
self.has_valid_directory() | ||
except UserWarning as e: | ||
log.error(e) | ||
return "" | ||
|
||
# Verify that 'modules.json' is consistent with the installed modules | ||
modules_json = ModulesJson(self.dir) | ||
modules_json.check_up_to_date() | ||
|
||
# Filter by keywords | ||
repos_with_comps = { | ||
repo_url: [comp for comp in components if all(k in comp[1] for k in keywords)] | ||
for repo_url, components in modules_json.get_all_components(self.component_type).items() | ||
} | ||
|
||
# Nothing found | ||
if sum(map(len, repos_with_comps)) == 0: | ||
log.info(f"No nf-core {self.component_type} found in '{self.dir}'{pattern_msg(keywords)}") | ||
return "" | ||
|
||
table.add_column("Repository") | ||
table.add_column("Version SHA") | ||
table.add_column("Message") | ||
table.add_column("Date") | ||
|
||
# Load 'modules.json' | ||
modules_json = modules_json.modules_json | ||
|
||
for repo_url, component_with_dir in sorted(repos_with_comps.items()): | ||
repo_entry = modules_json["repos"].get(repo_url, {}) | ||
for install_dir, component in sorted(component_with_dir): | ||
repo_modules = repo_entry.get(self.component_type) | ||
component_entry = repo_modules.get(install_dir).get(component) | ||
|
||
if component_entry: | ||
version_sha = component_entry["git_sha"] | ||
try: | ||
# pass repo_name to get info on modules even outside nf-core/modules | ||
message, date = ModulesRepo( | ||
remote_url=repo_url, | ||
branch=component_entry["branch"], | ||
).get_commit_info(version_sha) | ||
except LookupError as e: | ||
log.warning(e) | ||
date = "[red]Not Available" | ||
message = "[red]Not Available" | ||
else: | ||
log.warning( | ||
f"Commit SHA for {self.component_type[:-1]} '{install_dir}/{self.component_type}' is missing from 'modules.json'" | ||
) | ||
version_sha = "[red]Not Available" | ||
date = "[red]Not Available" | ||
message = "[red]Not Available" | ||
table.add_row(component, repo_url, version_sha, message, date) | ||
|
||
if print_json: | ||
return json.dumps(components, sort_keys=True, indent=4) | ||
|
||
if self.remote: | ||
log.info( | ||
f"{self.component_type.capitalize()} available from {self.modules_repo.remote_url} ({self.modules_repo.branch})" | ||
f"{pattern_msg(keywords)}:\n" | ||
) | ||
else: | ||
log.info(f"{self.component_type.capitalize()} installed in '{self.dir}'{pattern_msg(keywords)}:\n") | ||
return table |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm never sure on when it is really necessary to have a method within a method, but this feels like it could (and should) be a standalone method outside the class. I find it particularly confusing that
keywords
is used in the scope of this internal method whilst being defined in the enclosing method directly above.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
partially fixed in 7a2fa10