Skip to content

Commit

Permalink
[TST] Add test for command line commands.
Browse files Browse the repository at this point in the history
  • Loading branch information
JGarciaCondado committed Jan 9, 2024
1 parent c3f9828 commit ff8c6ef
Show file tree
Hide file tree
Showing 6 changed files with 244 additions and 97 deletions.
3 changes: 2 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ ignore = F401, # Imported but unused
B028, # No explicit stacklevel keyword argument found
W293, # blank line contains whitespace (I don't like this rule, interferes with good function indentation)
C419, # Unnecessary list comprehension passed to all() prevents short-circuiting - rewrite as a generator

E702, # Multiple statements on one line (semicolon)

per-file-ignores =
# It poses no inconvenient to violate B006 in this file.
tests/test_ageml/test_modelling.py: B006
Expand Down
3 changes: 2 additions & 1 deletion src/ageml/__main__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import ageml


def main():
"""Run age modelling interactive command line interface."""

ageml.ui.InteractiveCLI()
ageml.ui.CLI()


if __name__ == '__main__':
Expand Down
112 changes: 60 additions & 52 deletions src/ageml/commands.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
"""Command line commands.
Used in the AgeML project with poetry to create command line commands.
Public classes:
---------------
ModelAge: Run age modelling with required parameters.
FactorAnalysis: Run factor analysis with required parameters.
ClinicalGroups: Run clinical analysis with age deltas with required parameters.
ClinicalClassification: Run classification of groups based on age deltas with required parameters.
Public functions:
-----------------
model_age(): Run ModelAge class.
factor_analysis(): Run FactorAnalysis class.
clinical_groups(): Run ClinicalGroups class.
clinical_classify(): Run ClinicalClassification class.
"""

import argparse

import ageml.messages as messages

from ageml.ui import Interface
from ageml.utils import convert

class ModelAge(Interface):
"""Read and parses user commands via command line.
Public methods:
---------------
configure_parser(self): Configure parser with required arguments for processing.

configure_args(self, args): Configure arguments with required fromatting for modelling.
"""
class ModelAge(Interface):
"""Run age modelling with required parameters."""

def __init__(self):
"""Initialise variables."""
Expand All @@ -40,27 +54,27 @@ def configure_parser(self):

# Required arguments
self.parser.add_argument("-o", "--output", metavar="DIR", required=True,
help=messages.output_long_description,)
help=messages.output_long_description,)
self.parser.add_argument("-f", "--features", metavar="FILE", required=True,
help=messages.features_long_description)
help=messages.features_long_description)

# Parameter arguments with defaults
self.parser.add_argument("-m","--model", nargs="*", default=["linear"],
help=messages.model_long_description)
self.parser.add_argument("-m", "--model", nargs="*", default=["linear"],
help=messages.model_long_description)
self.parser.add_argument("-s", "--scaler", nargs="*", default=["standard"],
help=messages.scaler_long_description)
help=messages.scaler_long_description)
self.parser.add_argument("--cv", nargs="+", type=int, default=[5, 0],
help=messages.cv_long_description)
help=messages.cv_long_description)

# Optional arguments
self.parser.add_argument("--covariates", metavar="FILE",
help=messages.covar_long_description)
help=messages.covar_long_description)
self.parser.add_argument("--covar_name", metavar="COVAR_NAME",
help=messages.covar_name_long_description)
help=messages.covar_name_long_description)
self.parser.add_argument("--clinical", metavar="FILE",
help=messages.clinical_long_description)
help=messages.clinical_long_description)
self.parser.add_argument("--systems", metavar="FILE",
help=messages.systems_long_description)
help=messages.systems_long_description)

def configure_args(self, args):
"""Configure argumens with required fromatting for modelling.
Expand Down Expand Up @@ -117,13 +131,9 @@ def configure_args(self, args):

return args

class FactorAnalsyis(Interface):
"""Read and parses user commands via command line.

Public methods:
---------------
configure_parser(self): Configure parser with required arguments for processing.
"""
class FactorAnalsyis(Interface):
"""Run factor analysis with required parameters."""

def __init__(self):
"""Initialise variables."""
Expand All @@ -149,25 +159,21 @@ def configure_parser(self):

# Required arguments
self.parser.add_argument("-o", "--output", metavar="DIR", required=True,
help=messages.output_long_description,)
help=messages.output_long_description,)
self.parser.add_argument("-a", "--ages", metavar="FILE", required=True,
help=messages.ages_long_description)
help=messages.ages_long_description)
self.parser.add_argument("-f", "--factors", metavar="FILE", required=True,
help=messages.factors_long_description)
help=messages.factors_long_description)

# Optional arguments
self.parser.add_argument("--covariates", metavar="FILE",
help=messages.covar_long_description)
help=messages.covar_long_description)
self.parser.add_argument("--clinical", metavar="FILE",
help=messages.clinical_long_description)
help=messages.clinical_long_description)

class ClinicalGroups(Interface):
"""Read and parses user commands via command line.

Public methods:
---------------
configure_parser(self): Configure parser with required arguments for processing.
"""
class ClinicalGroups(Interface):
"""Run clinical analysis with age deltas with required parameters."""

def __init__(self):
"""Initialise variables."""
Expand All @@ -193,19 +199,15 @@ def configure_parser(self):

# Required arguments
self.parser.add_argument("-o", "--output", metavar="DIR", required=True,
help=messages.output_long_description,)
help=messages.output_long_description,)
self.parser.add_argument("-a", "--ages", metavar="FILE", required=True,
help=messages.ages_long_description)
help=messages.ages_long_description)
self.parser.add_argument("--clinical", metavar="FILE", required=True,
help=messages.clinical_long_description)
help=messages.clinical_long_description)

class ClinicalClassification(Interface):
"""Read and parses user commands via command line.

Public methods:
---------------
configure_parser(self): Configure parser with required arguments for processing.
"""
class ClinicalClassification(Interface):
"""Run classification of groups based on age deltas with required parameters."""

def __init__(self):
"""Initialise variables."""
Expand Down Expand Up @@ -234,30 +236,36 @@ def configure_parser(self):

# Required arguments
self.parser.add_argument("-o", "--output", metavar="DIR", required=True,
help=messages.output_long_description,)
help=messages.output_long_description,)
self.parser.add_argument("-a", "--ages", metavar="FILE", required=True,
help=messages.ages_long_description)
help=messages.ages_long_description)
self.parser.add_argument("--clinical", metavar="FILE", required=True,
help=messages.clinical_long_description)
help=messages.clinical_long_description)
self.parser.add_argument("--groups", nargs=2, metavar="GROUP", required=True,
help=messages.groups_long_description)
help=messages.groups_long_description)


# Object wrappers

def model_age():
"""Run model_age class."""
"""Run ModelAge class."""

ModelAge()


def factor_analysis():
"""Run factor_analysis class."""
"""Run FactorAnalysis class."""

FactorAnalsyis()


def clinical_groups():
"""Run clinical_groups class."""
"""Run ClinicalGroups class."""

ClinicalGroups()


def clinical_classify():
"""Run clinical_classify class."""
"""Run ClinicalClassification class."""

ClinicalClassification()
17 changes: 9 additions & 8 deletions src/ageml/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,13 @@ class Interface:
run_wrapper(self, run): Wrapper for running modelling with log.
run_age(self): Run basic age modelling.
run_age(self): Run age modelling.
run_factor_analysis(self): Run age modelling with lifestyle factors.
run_factor_analysis(self): Factor analysis between deltas and factors.
run_clinical(self): Run age modelling with clinical factors.
run_clinical(self): Analyse differences between deltas in clinical groups.
run_classification(self): Run classification between two different clinical groups.
run_classification(self): Classify groups based on deltas.
"""

def __init__(self, args):
Expand Down Expand Up @@ -553,7 +553,7 @@ def run_wrapper(self, run):
run()

def run_age(self):
"""Run basic age modelling."""
"""Run age modelling."""

# Run age modelling
print("Running age modelling...")
Expand Down Expand Up @@ -637,7 +637,7 @@ def run_age(self):
self.df_ages.to_csv(os.path.join(self.dir_path, filename))

def run_factor_analysis(self):
"""Run age modelling with lifestyle factors."""
"""Run factor analysis between deltas and factors."""

print("Running lifestyle factors...")

Expand Down Expand Up @@ -667,7 +667,7 @@ def run_factor_analysis(self):
self.factors_vs_deltas(dfs_ages, dfs_factors, groups, self.df_factors.columns.to_list())

def run_clinical(self):
"""Run age modelling with clinical factors."""
"""Analyse differences between deltas in clinical groups."""

print("Running clinical outcomes...")

Expand Down Expand Up @@ -727,7 +727,8 @@ def run_classification(self):
self.set_classifier()
self.classify(df_group1, df_group2, groups)

class InteractiveCLI(Interface):

class CLI(Interface):

"""Read and parses user commands via command line via an interactive interface
Expand Down
Loading

0 comments on commit ff8c6ef

Please sign in to comment.