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

Handle json.load() exceptions #2134

Merged
merged 11 commits into from
Dec 17, 2022
Merged
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
### General

- Only check that a pipeline name doesn't contain dashes if the name is provided by prompt of `--name`. Don't check if a template file is used. ([#2123](https://github.com/nf-core/tools/pull/2123))
- Deprecate `--enable_conda` parameter. Use `conda.enable` instead ([#2131](https://github.com/nf-core/tools/pull/2131))
- Handle `json.load()` exceptions ([#2134](https://github.com/nf-core/tools/pull/2134))

## [v2.7.1 - Mercury Eagle Patch](https://github.com/nf-core/tools/releases/tag/2.7.1) - [2022-12-08]

Expand Down
1 change: 1 addition & 0 deletions nf_core/lint/nextflow_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ def nextflow_config(self):
"params.singleEnd",
"params.igenomesIgnore",
"params.name",
"params.enable_conda",
]

# Remove field that should be ignored according to the linting config
Expand Down
6 changes: 5 additions & 1 deletion nf_core/modules/modules_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,11 @@ def load(self):
"""
try:
with open(self.modules_json_path, "r") as fh:
self.modules_json = json.load(fh)
try:
self.modules_json = json.load(fh)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{self.modules_json_path}' due to error {e}")

except FileNotFoundError:
raise UserWarning("File 'modules.json' is missing")

Expand Down
5 changes: 0 additions & 5 deletions nf_core/pipeline-template/lib/WorkflowMain.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,6 @@ class WorkflowMain {
// Check that a -profile or Nextflow config has been provided to run the pipeline
NfcoreTemplate.checkConfigProvided(workflow, log)

// Check that conda channels are set-up correctly
if (params.enable_conda) {
Utils.checkCondaChannels(log)
}

// Check AWS batch settings
NfcoreTemplate.awsBatch(workflow, params)

Expand Down
6 changes: 3 additions & 3 deletions nf_core/pipeline-template/modules.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@
"nf-core": {
"custom/dumpsoftwareversions": {
"branch": "master",
"git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905",
"git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
"installed_by": ["modules"]
},
"fastqc": {
"branch": "master",
"git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905",
"git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
"installed_by": ["modules"]
},
"multiqc": {
"branch": "master",
"git_sha": "5e34754d42cd2d5d248ca8673c0a53cdf5624905",
"git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c",
"installed_by": ["modules"]
}
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

99 changes: 55 additions & 44 deletions ...ne-template/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py
100644 → 100755

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 16 additions & 24 deletions nf_core/pipeline-template/modules/nf-core/fastqc/main.nf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion nf_core/pipeline-template/modules/nf-core/multiqc/main.nf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 0 additions & 3 deletions nf_core/pipeline-template/nextflow.config
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ params {
validate_params = true
show_hidden_params = false
schema_ignore_params = 'genomes'
enable_conda = false
{% if nf_core_configs %}

// Config options
Expand Down Expand Up @@ -84,7 +83,6 @@ try {
profiles {
debug { process.beforeScript = 'echo $HOSTNAME' }
conda {
params.enable_conda = true
conda.enabled = true
docker.enabled = false
singularity.enabled = false
Expand All @@ -93,7 +91,6 @@ profiles {
charliecloud.enabled = false
}
mamba {
params.enable_conda = true
conda.enabled = true
conda.useMamba = true
docker.enabled = false
Expand Down
6 changes: 0 additions & 6 deletions nf_core/pipeline-template/nextflow_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -263,12 +263,6 @@
"description": "Show all params when using `--help`",
"hidden": true,
"help_text": "By default, parameters set as _hidden_ in the schema are not shown on the command line when a user runs with `--help`. Specifying this option will tell the pipeline to show all parameters."
},
"enable_conda": {
"type": "boolean",
"description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.",
"hidden": true,
"fa_icon": "fas fa-bacon"
}
}
}
Expand Down
5 changes: 4 additions & 1 deletion nf_core/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,10 @@ def load_input_params(self, params_path):
# First, try to load as JSON
try:
with open(params_path, "r") as fh:
params = json.load(fh)
try:
params = json.load(fh)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{params_path}' due to error {e}")
self.input_params.update(params)
log.debug(f"Loaded JSON input params: {params_path}")
except Exception as json_e:
Expand Down
5 changes: 4 additions & 1 deletion nf_core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,10 @@ def fetch_wf_config(wf_path, cache_config=True):
if os.path.isfile(cache_path):
log.debug(f"Found a config cache, loading: {cache_path}")
with open(cache_path, "r") as fh:
config = json.load(fh)
try:
config = json.load(fh)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{cache_path}' due to error {e}")
return config
log.debug("No config cache found")

Expand Down
10 changes: 8 additions & 2 deletions tests/modules/modules_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ def test_get_modules_json(self):
"""Checks that the get_modules_json function returns the correct result"""
mod_json_path = os.path.join(self.pipeline_dir, "modules.json")
with open(mod_json_path, "r") as fh:
mod_json_sb = json.load(fh)
try:
mod_json_sb = json.load(fh)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{mod_json_path}' due to error {e}")

mod_json_obj = ModulesJson(self.pipeline_dir)
mod_json = mod_json_obj.get_modules_json()
Expand Down Expand Up @@ -212,7 +215,10 @@ def test_mod_json_dump(self):

# Check that the dump function writes the correct content
with open(mod_json_path, "r") as f:
mod_json_new = json.load(f)
try:
mod_json_new = json.load(f)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{mod_json_path}' due to error {e}")
assert mod_json == mod_json_new


Expand Down
12 changes: 12 additions & 0 deletions tests/modules/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,12 @@ def test_update_only_show_differences(self, mock_prompt):
modules_json = ModulesJson(self.pipeline_dir)
update_obj = ModuleUpdate(self.pipeline_dir, update_all=True, show_diff=True)

# Update modules to a fixed old SHA
update_old = ModuleUpdate(
self.pipeline_dir, update_all=True, show_diff=False, sha="5e34754d42cd2d5d248ca8673c0a53cdf5624905"
)
update_old.update()

tmpdir = tempfile.mkdtemp()
shutil.rmtree(tmpdir)
shutil.copytree(Path(self.pipeline_dir, "modules", NF_CORE_MODULES_NAME), tmpdir)
Expand All @@ -329,6 +335,12 @@ def test_update_only_show_differences_when_patch(self, mock_prompt):
modules_json = ModulesJson(self.pipeline_dir)
update_obj = ModuleUpdate(self.pipeline_dir, update_all=True, show_diff=True)

# Update modules to a fixed old SHA
update_old = ModuleUpdate(
self.pipeline_dir, update_all=True, show_diff=False, sha="5e34754d42cd2d5d248ca8673c0a53cdf5624905"
)
update_old.update()

# Modify fastqc module, it will have a patch which will be applied during update
# We modify fastqc because it's one of the modules that can be updated and there's another one before it (custom/dumpsoftwareversions)
module_path = Path(self.pipeline_dir, "modules", "nf-core", "fastqc")
Expand Down
6 changes: 5 additions & 1 deletion tests/test_launch.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,11 @@ def test_build_command_params(self):
)
# Check saved parameters file
with open(self.nf_params_fn, "r") as fh:
saved_json = json.load(fh)
try:
saved_json = json.load(fh)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{self.nf_params_fn}' due to error {e}")

assert saved_json == {"input": "custom_input"}

def test_build_command_params_cl(self):
Expand Down
5 changes: 4 additions & 1 deletion tests/test_lint.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,10 @@ def test_json_output(self, tmp_dir):

# Load created JSON file and check its contents
with open(json_fn, "r") as fh:
saved_json = json.load(fh)
try:
saved_json = json.load(fh)
except json.JSONDecodeError as e:
raise UserWarning(f"Unable to load JSON file '{json_fn}' due to error {e}")
assert saved_json["num_tests_pass"] > 0
assert saved_json["num_tests_warned"] > 0
assert saved_json["num_tests_ignored"] == 0
Expand Down