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

Dihedral Plots: RDKit Mol Object #243

Merged
merged 90 commits into from
Jul 4, 2023
Merged
Show file tree
Hide file tree
Changes from 79 commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
b4aeb11
new PR
cadeduckworth Feb 21, 2023
cc17a6b
update mol object methods, change dihedral_indices naming convention …
cadeduckworth Feb 21, 2023
30ad175
add get_bond_indices
cadeduckworth Feb 21, 2023
8d67d81
reflect name change in tests from dihedrals automated workflow
cadeduckworth Feb 21, 2023
59f32a5
missed name change in test
cadeduckworth Feb 21, 2023
9a7c25a
fix bond highlighting and add low resolution plotting function for di…
cadeduckworth Feb 21, 2023
b6f66c2
add atom_indices to titles of plot columns
cadeduckworth Feb 21, 2023
2f8c042
add atom_indices to label Mol object on plots
cadeduckworth Feb 21, 2023
844b29f
cleaner plot titles
cadeduckworth Feb 21, 2023
5fa5f11
current best plot resolution/proportion
cadeduckworth Feb 21, 2023
82cbaa2
add svgutils and cairosvg methods to plot svg mol object
cadeduckworth Mar 4, 2023
d26d9f1
reimplement DF input option and fix most tests to reflect name change…
cadeduckworth Mar 4, 2023
d80ae4c
add svgutils and cairosvg to dependencies, install, requirements list…
cadeduckworth Mar 4, 2023
a8f5b5e
remove unneccessary import
cadeduckworth Mar 4, 2023
2522b5c
remove import
cadeduckworth Mar 4, 2023
d54cd86
remove temp svg files and build, convert, and save as pdf through mem
cadeduckworth Mar 21, 2023
193dc84
fix legend issue when plotting one solvent
cadeduckworth Mar 21, 2023
dbabc62
Merge branch 'develop' into plot-Mol
cadeduckworth Mar 25, 2023
9ba26ee
Merge branch 'develop' into plot-Mol
orbeckst Mar 28, 2023
fda3206
cleanup
cadeduckworth Mar 28, 2023
e5a440e
move title setting and cleanup
cadeduckworth Mar 28, 2023
c71d3d8
split plot_violins into new build_svg function
cadeduckworth Mar 28, 2023
19973ea
merge updates from develop
cadeduckworth Mar 28, 2023
cc673fe
change, better function names for dihedrals workflow module
cadeduckworth Apr 2, 2023
348495d
cleanup
cadeduckworth Apr 2, 2023
4ad68bb
docs and cleanup, plot width docs, dict comprehension for ab_pairs
cadeduckworth Apr 3, 2023
9609022
cleanup and add list and dict comprehension methods for get_paired_in…
cadeduckworth Apr 3, 2023
42847f8
intersphinx mapping
cadeduckworth Apr 3, 2023
60ec522
remove assert method for notebook test
cadeduckworth Apr 3, 2023
5279161
tests: new fixtures and tests for bond_indices and ab_pairs
cadeduckworth Apr 3, 2023
181c012
tests: new fixtures and tests for bond_indices and ab_pairs, skip 3.7
cadeduckworth Apr 3, 2023
a69f4da
test_build_universe method
cadeduckworth Apr 3, 2023
4df1d88
confirm build universe test
cadeduckworth Apr 3, 2023
c53cd1a
fix df input test
cadeduckworth Apr 3, 2023
8135b51
Update dihedrals.py
cadeduckworth Apr 3, 2023
5d8f960
Merge branch 'develop' into plot-Mol
orbeckst Apr 4, 2023
bf1b05d
remove unused kwargs and update docs for new functions
cadeduckworth Apr 15, 2023
97267ac
rewrite docs to cover new functions and kwarg changes
cadeduckworth Apr 15, 2023
a25c97d
fix tests to accommodate kwarg updates in dihedrals module
cadeduckworth Apr 15, 2023
9175fda
explanation of why figdir is a kwarg at top level of dihedrals module…
cadeduckworth Apr 15, 2023
45cf29d
reorder positional and key word args
cadeduckworth Apr 15, 2023
71da645
accommodation for figdir kwarg
cadeduckworth Apr 15, 2023
2c21a7c
docs typo
cadeduckworth Apr 15, 2023
83c4c63
docs typos
cadeduckworth Apr 15, 2023
60636b4
temporary fix for figdir issue which should currently be a positional…
cadeduckworth Apr 15, 2023
473abaf
upcoming CHANGES
cadeduckworth Apr 15, 2023
6660c98
update to specify where enhancements are occurring
cadeduckworth Jun 9, 2023
554bdd3
remove dafault scope specification for defined functions
cadeduckworth Jun 9, 2023
9de6a4d
reimplement try/except method for rdkit conversion topology element g…
cadeduckworth Jun 9, 2023
d620619
generate combined plots pdf for automated dihedral analysis
cadeduckworth Jun 11, 2023
bd02eb7
updates for implementation of pypdf in workflows dihedrals module: CH…
cadeduckworth Jun 11, 2023
ba05311
intersphinx mapping, docs
cadeduckworth Jun 11, 2023
f435207
fix solute kwarg description for workflows dihedrals module
cadeduckworth Jun 11, 2023
3a85dde
fix ab_pairs kwarg description for workflows dihedrals module
cadeduckworth Jun 11, 2023
7f32b93
documentation for dihedral_violins function in workflows dihedrals mo…
cadeduckworth Jun 11, 2023
87f3930
documentation for get_paired_indices function in workflows dihedrals …
cadeduckworth Jun 11, 2023
34c63ec
documentation and kwarg definition for get_paired_indices function an…
cadeduckworth Jun 11, 2023
bf98c23
kwarg definition for plot_title for dihedral_violins function in work…
cadeduckworth Jun 11, 2023
a3bcddc
move in-line comments explaining figdir kward for workflows dihedrals…
cadeduckworth Jun 11, 2023
c0f9550
reorganize kwargs for plot_dihedral_violins in top-level automated_di…
cadeduckworth Jun 11, 2023
c47e055
add assert method to make figdir kwarg required in workflows dihedral…
cadeduckworth Jun 11, 2023
5376eea
temporarily remove figdir required assertion
cadeduckworth Jun 22, 2023
110b3f9
change MDA guess_atom_element to MDA guess_types for RDKit conversion…
cadeduckworth Jun 22, 2023
f5ead51
fix registry import error for workflows base, close #245
cadeduckworth Jun 22, 2023
a744033
remove guess_atom_element import
cadeduckworth Jun 22, 2023
228b7c0
fix registry import for workflows base module
cadeduckworth Jun 22, 2023
7c9f669
reimplement assert figdir reuired for workflows dihedrals module
cadeduckworth Jun 22, 2023
b8236a6
require RDKit>=2023 for testing environment to investigate failed tes…
cadeduckworth Jun 22, 2023
f45f073
require RDKit<2023 for testing environment to investigate failed test…
cadeduckworth Jun 22, 2023
adcecc6
require RDKit<=2022.09.1 for testing environment to investigate faile…
cadeduckworth Jun 22, 2023
bf6884a
Merge branch 'develop' into plot-Mol
orbeckst Jun 27, 2023
e002845
Merge branch 'develop' into plot-Mol
cadeduckworth Jun 30, 2023
9f751a8
fix function name in dihedral workflows tests
cadeduckworth Jun 30, 2023
13231a2
fix variable reference in dihedral workflows test
cadeduckworth Jun 30, 2023
0db3c5a
fix fixture call and variable assignment in dihedral groups test for …
cadeduckworth Jun 30, 2023
c540c8b
modify workflows base test for assertion of figure directory requirem…
cadeduckworth Jun 30, 2023
eca078a
add name_index pairing tests for dihedral workflows atom indices cons…
cadeduckworth Jun 30, 2023
34f3e18
modify workflows base test for dihedral workflow figure directory req…
cadeduckworth Jul 1, 2023
2b5d7af
add pypdf to setup.py install_requires for dihedrals workflow
cadeduckworth Jul 1, 2023
b6d4f61
Merge branch 'develop' into plot-Mol
cadeduckworth Jul 2, 2023
7843fce
change imports to follow PEP 8
cadeduckworth Jul 2, 2023
0cb2ddc
modify dihedrals workflow docs to explain figdir kwarg requirement
cadeduckworth Jul 2, 2023
84aed57
use first solvent specified to build MDAnalysis Universe
cadeduckworth Jul 2, 2023
d231b45
Merge branch 'develop' into plot-Mol
cadeduckworth Jul 2, 2023
9a7d385
Merge branch 'develop' into plot-Mol
orbeckst Jul 2, 2023
2970b24
modify single solvent plotting method, add solvent count assertion
cadeduckworth Jul 3, 2023
9801848
comment expected fixture scope changes, reference issue #235
cadeduckworth Jul 3, 2023
4ebf3c0
remove solute.unwrap, not needed
cadeduckworth Jul 3, 2023
292a8bd
reference issue #260 to fix jupyter notebook figure output
cadeduckworth Jul 3, 2023
4af6de6
finalize single solvent figure modifications and add test
cadeduckworth Jul 4, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ Changes

Enhancements

* convert figure components to SVG, save as individual PDFs,
and generate PDF of all figures combined in one file,
for workflows dihedrals module (#243)
* add RDKit mol object to dihedrals plot with dihedral atom
indices labeled and dihedral atom group bonds highlighted
for workflows dihedrals module (#243)
* new workflows registry that contains each EnsembleAnalysis for which
a workflows module exists, for use with workflows base module (#229)
* new workflows base module that provides iterative workflow use for
Expand Down
3 changes: 3 additions & 0 deletions devtools/conda-envs/test_env.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ dependencies:
- pymbar >=4
- rdkit
- seaborn
- svgutils
- cairosvg
- pypdf

# Testing
- pytest
Expand Down
3 changes: 3 additions & 0 deletions doc/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ mdanalysis
rdkit
seaborn
matplotlib
svgutils
cairosvg
pypdf
3 changes: 3 additions & 0 deletions doc/sphinx/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,9 @@
'https://www.rdkit.org/docs/': None,
'https://pandas.pydata.org/docs/': None,
'https://seaborn.pydata.org': None,
'https://cairosvg.org/documentation/': None,
'https://svgutils.readthedocs.io/en/latest/': None,
'https://pypdf.readthedocs.io/en/stable/': None,
}


Expand Down
127 changes: 91 additions & 36 deletions mdpow/tests/test_automated_dihedral_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,47 +26,67 @@
RESOURCES = pathlib.PurePath(resource_filename(__name__, 'testing_resources'))
MANIFEST = RESOURCES / "manifest.yml"

@pytest.fixture(scope="function")
resname = "UNK"
molname = "SM25"

@pytest.fixture
def molname_workflows_directory(tmp_path, molname='SM25'):
m = pybol.Manifest(str(MANIFEST))
m.assemble('workflows', tmp_path)
return tmp_path / molname

class TestAutomatedDihedralAnalysis(object):

@pytest.fixture(scope="function")
@pytest.fixture
def SM25_tmp_dir(self, molname_workflows_directory):
dirname = molname_workflows_directory
return dirname

@pytest.fixture(scope="function")
def atom_indices(self, SM25_tmp_dir):
atom_group_indices = dihedrals.dihedral_indices(dirname=SM25_tmp_dir, resname=self.resname)
@pytest.fixture
def mol_sol_data(self, SM25_tmp_dir):
u = dihedrals.build_universe(dirname=SM25_tmp_dir)
mol, solute = dihedrals.rdkit_conversion(u=u, resname=resname)
return mol, solute

@pytest.fixture
def atom_indices(self, mol_sol_data):
mol, _ = mol_sol_data
atom_group_indices = dihedrals.get_atom_indices(mol=mol)

# testing optional user input of alternate SMARTS string
# for automated dihedral atom group selection
atom_group_indices_alt = dihedrals.dihedral_indices(dirname=SM25_tmp_dir,
resname=self.resname,
SMARTS='[!$(*#*)&!D1]-!@[!$(*#*)&!D1]')
atom_group_indices_alt = dihedrals.get_atom_indices(mol=mol, SMARTS='[!$(*#*)&!D1]-!@[!$(*#*)&!D1]')
return atom_group_indices, atom_group_indices_alt
# fixture output, tuple:
# atom_indices[0]=atom_group_indices
# atom_indices[1]=atom_group_indices_alt

@pytest.fixture(scope="function")
@pytest.fixture
def bond_indices(self, mol_sol_data, atom_indices):
mol, _ = mol_sol_data
atom_index, _ = atom_indices
bond_indices = dihedrals.get_bond_indices(mol=mol, atom_indices=atom_index)
return bond_indices

@pytest.fixture
def dihedral_groups(self, mol_sol_data, atom_indices):
_, solute = mol_sol_data
atom_index, _ = atom_indices
dihedral_groups = dihedrals.get_dihedral_groups(solute=solute, atom_indices=atom_index)
return dihedral_groups

@pytest.fixture
def dihedral_data(self, SM25_tmp_dir, atom_indices):
atom_group_indices, _ = atom_indices
df = dihedrals.dihedral_groups_ensemble(atom_group_indices=atom_group_indices,
df = dihedrals.dihedral_groups_ensemble(atom_indices=atom_group_indices,
dirname=SM25_tmp_dir,
solvents=('water',))
df_aug = dihedrals.periodic_angle(df)
df_aug = dihedrals.periodic_angle_padding(df)
return df, df_aug
# fixture output, tuple:
# dihedral_data[0]=df
# dihedral_data[1]=df_aug

resname = 'UNK'

# tuple-tuples of dihedral atom group indices
# collected using mdpow.workflows.dihedrals.SMARTS_DEFAULT
check_atom_group_indices = ((0, 1, 2, 3),(0, 1, 12, 13),(1, 2, 3, 11),(1, 2, 3, 10),
Expand All @@ -79,6 +99,23 @@ def dihedral_data(self, SM25_tmp_dir, atom_indices):
# see: fixture - atom_indices().atom_group_indices_alt
check_atom_group_indices_alt = ((1, 2), (1, 12), (2, 3), (3, 4), (12, 13), (13, 14))

check_atom_name_index_pairs = {'O1-C2-N3-S4': (0, 1, 2, 3),
'O1-C2-C13-C14': (0, 1, 12, 13),
'C2-N3-S4-O12': (1, 2, 3, 11),
'C2-N3-S4-O11': (1, 2, 3, 10),
'C2-N3-S4-C5': (1, 2, 3, 4),
'C2-C13-C14-C15': (1, 12, 13, 14),
'N3-S4-C5-C6': (2, 3, 4, 5),
'N3-S4-C5-C10': (2, 3, 4, 9),
'N3-C2-C13-C14': (2, 1, 12, 13),
'S4-N3-C2-C13': (3, 2, 1, 12),
'C6-C5-S4-O12': (5, 4, 3, 11),
'C6-C5-S4-O11': (5, 4, 3, 10),
'C10-C5-S4-O12': (9, 4, 3, 11),
'C10-C5-S4-O11': (9, 4, 3, 10),
'C13-C14-C15-C16': (12, 13, 14, 15),
'C13-C14-C15-C20': (12, 13, 14, 19)}

check_groups = [np.array(['O1', 'C2', 'N3', 'S4'], dtype=object),
np.array(['O1', 'C2', 'C13', 'C14'], dtype=object),
np.array(['C2', 'N3', 'S4', 'O12'], dtype=object),
Expand Down Expand Up @@ -132,29 +169,49 @@ def test_build_universe(self, SM25_tmp_dir):
# between RDKIT versions; issue raised (#239) to identify and
# resolve exact package/version responsible
def test_dihedral_indices(self, atom_indices):

atom_group_indices = atom_indices[0]
assert set(atom_group_indices) == set(self.check_atom_group_indices)

# Possible ordering issue (#239)
def test_SMARTS(self, atom_indices):
atom_group_indices_alt = atom_indices[1]
_, atom_group_indices_alt = atom_indices
assert atom_group_indices_alt == self.check_atom_group_indices_alt

# Use set comparison because ordering of indices appears to change
# between RDKIT versions; issue raised (#239) to identify and
# resolve exact package/version responsible
def test_dihedral_groups(self, SM25_tmp_dir):
groups = dihedrals.dihedral_groups(dirname=SM25_tmp_dir, resname=self.resname)
def test_dihedral_groups(self, dihedral_groups):
groups = dihedral_groups

values = [g.all() for g in groups]
reference = [g.all() for g in self.check_groups]

assert set(values) == set(reference)

# atom indices are determined by RDKit Mol object
# bond indices are determined by atom indices and are subsequently self-consistent
# dihedral group names are determined by the MDAnalysis solute object from RDKit-derived atom indices
# this test checks if indexing schemes for RDKit and MDAnalysis are consistent
def test_RDKit_MDAnalysis_atom_index_consistency(self, atom_indices, bond_indices, dihedral_groups):
atom_index, _ = atom_indices
bond_index = bond_indices
groups = dihedral_groups

name_index_pairs = dihedrals.get_paired_indices(atom_indices=atom_index, bond_indices=bond_index,
dihedral_groups=groups)

atom_name_index_pairs = {}

for key in name_index_pairs.keys():
atom_name_index_pairs[key] = name_index_pairs[key][0]

assert atom_name_index_pairs == self.check_atom_name_index_pairs

# Possible ordering issue (#239)
def test_dihedral_groups_ensemble(self, dihedral_data):

df = dihedral_data[0]
df, _ = dihedral_data

dh1_result = df.loc[df['selection'] == 'O1-C2-N3-S4']['dihedral']
dh1_mean = circmean(dh1_result, high=180, low=-180)
Expand All @@ -172,19 +229,21 @@ def test_dihedral_groups_ensemble(self, dihedral_data):
dh2_var == pytest.approx(self.DG_C13141520_var)

def test_save_df(self, dihedral_data, SM25_tmp_dir):
dihedrals.save_df(df=dihedral_data[0], df_save_dir=SM25_tmp_dir, molname='SM25')
df, _ = dihedral_data
dihedrals.save_df(df=df, df_save_dir=SM25_tmp_dir, resname='UNK', molname='SM25')
assert (SM25_tmp_dir / 'SM25' / 'SM25_full_df.csv.bz2').exists(), 'Compressed csv file not saved'

def test_save_df_info(self, dihedral_data, SM25_tmp_dir, caplog):
df, _ = dihedral_data
caplog.clear()
caplog.set_level(logging.INFO, logger='mdpow.workflows.dihedrals')
dihedrals.save_df(df=dihedral_data[0], df_save_dir=SM25_tmp_dir, molname='SM25')
dihedrals.save_df(df=df, df_save_dir=SM25_tmp_dir, resname='UNK', molname='SM25')
assert f'Results DataFrame saved as {SM25_tmp_dir}/SM25/SM25_full_df.csv.bz2' in caplog.text, 'Save location not logged or returned'

# Possible ordering issue (#239)
def test_periodic_angle(self, dihedral_data):

df_aug = dihedral_data[1]
_, df_aug = dihedral_data

aug_dh2_result = df_aug.loc[df_aug['selection'] == 'C13-C14-C15-C20']['dihedral']

Expand All @@ -197,7 +256,7 @@ def test_periodic_angle(self, dihedral_data):
# Possible ordering issue (#239)
def test_save_fig(self, SM25_tmp_dir):
dihedrals.automated_dihedral_analysis(dirname=SM25_tmp_dir, figdir=SM25_tmp_dir,
resname=self.resname, molname='SM25',
resname=resname, molname='SM25',
solvents=('water',))
assert (SM25_tmp_dir / 'SM25' / 'SM25_C10-C5-S4-O11_violins.pdf').exists(), 'PDF file not generated'

Expand All @@ -206,26 +265,22 @@ def test_save_fig_info(self, SM25_tmp_dir, caplog):
caplog.clear()
caplog.set_level(logging.INFO, logger='mdpow.workflows.dihedrals')
dihedrals.automated_dihedral_analysis(dirname=SM25_tmp_dir, figdir=SM25_tmp_dir,
resname=self.resname, molname='SM25',
resname=resname, molname='SM25',
solvents=('water',))
assert f'Figure saved as {SM25_tmp_dir}/SM25/SM25_C10-C5-S4-O11_violins.pdf' in caplog.text, 'PDF file not saved'

def test_DataFrame_input(self, SM25_tmp_dir):
test_df = pd.DataFrame([['C1-C2-C3-C4', 'water', 'Coulomb', 0, 0, 60.0],
['C1-C2-C3-C5', 'water', 'Coulomb', 0, 0, 60.0]],
[1,2],['selection', 'solvent', 'interaction', 'lambda', 'time', 'dihedral'])
plot = dihedrals.automated_dihedral_analysis(dirname=SM25_tmp_dir, figdir=SM25_tmp_dir,
resname=self.resname,
solvents=('water',), dataframe=test_df)
assert isinstance(plot, seaborn.axisgrid.FacetGrid)
def test_DataFrame_input(self, SM25_tmp_dir, dihedral_data):
df, _ = dihedral_data
dihedrals.automated_dihedral_analysis(dirname=SM25_tmp_dir, figdir=SM25_tmp_dir,
resname=resname, molname=molname,
solvents=('water',), dataframe=df)
cadeduckworth marked this conversation as resolved.
Show resolved Hide resolved
assert (SM25_tmp_dir / 'SM25' / 'SM25_C10-C5-S4-O11_violins.pdf').exists(), 'PDF file not generated'

def test_DataFrame_input_info(self, SM25_tmp_dir, caplog):
def test_DataFrame_input_info(self, SM25_tmp_dir, dihedral_data, caplog):
caplog.clear()
caplog.set_level(logging.INFO, logger='mdpow.workflows.dihedrals')
test_df = pd.DataFrame([['C1-C2-C3-C4', 'water', 'Coulomb', 0, 0, 60.0],
['C1-C2-C3-C5', 'water', 'Coulomb', 0, 0, 60.0]],
[1,2],['selection', 'solvent', 'interaction', 'lambda', 'time', 'dihedral'])
df, _ = dihedral_data
dihedrals.automated_dihedral_analysis(dirname=SM25_tmp_dir, figdir=SM25_tmp_dir,
resname=self.resname,
solvents=('water',), dataframe=test_df)
resname=resname, molname=molname,
solvents=('water',), dataframe=df)
assert 'Proceeding with results DataFrame provided.' in caplog.text, 'No dataframe provided or dataframe not recognized'
16 changes: 11 additions & 5 deletions mdpow/tests/test_workflows_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,17 +62,23 @@ def test_project_paths_csv_input(self, csv_input_data):

pd.testing.assert_frame_equal(project_paths, csv_df)

def test_automated_project_analysis(self, project_paths_data, caplog):
def test_dihedral_analysis_figdir_requirement(self, project_paths_data, caplog):
caplog.clear()
caplog.set_level(logging.ERROR, logger='mdpow.workflows.base')

project_paths = project_paths_data
# change resname to match topology (every SAMPL7 resname is 'UNK')
# only necessary for this dataset, not necessary for normal use
project_paths['resname'] = 'UNK'

base.automated_project_analysis(project_paths, solvents=('water',),
ensemble_analysis='DihedralAnalysis')
with pytest.raises(AssertionError,
match="figdir MUST be set, even though it is a kwarg. Will be changed with #244"):

base.automated_project_analysis(project_paths, solvents=('water',),
ensemble_analysis='DihedralAnalysis')

assert 'all analyses completed' in caplog.text, ('automated_dihedral_analysis '
'did not iteratively run to completion for the provided project')
assert 'all analyses completed' in caplog.text, ('automated_dihedral_analysis '
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unindent — that's better outside the pytest.raises block.

As a general rule reduce the amount of code in a with block to the essentials as this makes clearer what's relevant for testing the condition.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe the test fails without the indent, possibly because of what is being tested or how it is written in the module. I am not certain of this, but making the change last night resulted in a passing test.

'did not iteratively run to completion for the provided project')

def test_automated_project_analysis_KeyError(self, project_paths_data, caplog):
caplog.clear()
Expand Down
2 changes: 1 addition & 1 deletion mdpow/workflows/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import re
import pandas as pd

from mdpow.workflows import registry
from ..workflows import registry
cadeduckworth marked this conversation as resolved.
Show resolved Hide resolved

import logging

Expand Down
Loading