Skip to content

Commit b5aa10b

Browse files
authored
Commands return correct exit codes. (#26)
1 parent 09efb6a commit b5aa10b

File tree

14 files changed

+115
-17
lines changed

14 files changed

+115
-17
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ repos:
88
- id: check-yaml
99
exclude: meta.yaml
1010
- id: debug-statements
11-
exclude: (debugging\.py|build\.py)
11+
exclude: (debugging\.py|build\.py|clean\.py|mark/__init__\.py)
1212
- id: end-of-file-fixer
1313
- repo: https://github.com/asottile/pyupgrade
1414
rev: v2.7.2

docs/changes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ all releases are available on `Anaconda.org <https://anaconda.org/pytask/pytask>
1010
------------------
1111

1212
- :gh:`25` allows to customize the names of the task files.
13+
- :gh:`26` makes commands return the correct exit codes.
1314
- :gh:`27` implements the ``pytask_collect_task_teardown`` hook specification to perform
1415
checks after a task is collected.
1516

src/_pytask/build.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
import click
77
from _pytask.config import hookimpl
8-
from _pytask.database import create_database
98
from _pytask.enums import ExitCode
109
from _pytask.exceptions import CollectionError
10+
from _pytask.exceptions import ConfigurationError
1111
from _pytask.exceptions import ExecutionError
1212
from _pytask.exceptions import ResolvingDependenciesError
1313
from _pytask.pluginmanager import get_plugin_manager
@@ -49,16 +49,16 @@ def main(config_from_cli):
4949

5050
config = pm.hook.pytask_configure(pm=pm, config_from_cli=config_from_cli)
5151

52-
create_database(**config["database"])
53-
5452
session = Session.from_config(config)
55-
session.exit_code = ExitCode.OK
5653

57-
except Exception:
54+
except (ConfigurationError, Exception):
5855
traceback.print_exception(*sys.exc_info())
5956
session = Session({}, None)
6057
session.exit_code = ExitCode.CONFIGURATION_FAILED
6158

59+
if config_from_cli.get("pdb"):
60+
pdb.post_mortem()
61+
6262
else:
6363
try:
6464
session.hook.pytask_log_session_header(session=session)

src/_pytask/clean.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Add a command to clean the project from files unknown to pytask."""
22
import itertools
3+
import pdb
34
import shutil
45
import sys
56
import traceback
@@ -71,15 +72,16 @@ def clean(**config_from_cli):
7172
pm.hook.pytask_add_hooks(pm=pm)
7273

7374
config = pm.hook.pytask_configure(pm=pm, config_from_cli=config_from_cli)
74-
7575
session = Session.from_config(config)
76-
session.exit_code = ExitCode.OK
7776

7877
except Exception:
7978
traceback.print_exception(*sys.exc_info())
8079
session = Session({}, None)
8180
session.exit_code = ExitCode.CONFIGURATION_FAILED
8281

82+
if config_from_cli.get("pdb"):
83+
pdb.post_mortem()
84+
8385
else:
8486
try:
8587
session.hook.pytask_log_session_header(session=session)
@@ -119,7 +121,7 @@ def clean(**config_from_cli):
119121
traceback.print_exception(*sys.exc_info())
120122
session.exit_code = ExitCode.FAILED
121123

122-
return session
124+
sys.exit(session.exit_code)
123125

124126

125127
def _collect_all_paths_known_to_pytask(session):

src/_pytask/config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import click
1111
import pluggy
12+
from _pytask.shared import convert_truthy_or_falsy_to_bool
1213
from _pytask.shared import get_first_non_none_value
1314
from _pytask.shared import parse_paths
1415
from _pytask.shared import parse_value_or_multiline_option
@@ -112,7 +113,7 @@ def pytask_parse_config(config, config_from_cli, config_from_file):
112113
config_from_file,
113114
key="debug_pytask",
114115
default=False,
115-
callback=bool,
116+
callback=convert_truthy_or_falsy_to_bool,
116117
)
117118
if config["debug_pytask"]:
118119
config["pm"].trace.root.setwriter(click.echo)

src/_pytask/database.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,8 @@ def pytask_parse_config(config, config_from_cli, config_from_file):
120120
"create_db": config["database_create_db"],
121121
"create_tables": config["database_create_tables"],
122122
}
123+
124+
125+
@hookimpl
126+
def pytask_post_parse(config):
127+
create_database(**config["database"])

src/_pytask/enums.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"""Enumerations for pytask."""
12
import enum
23

34

src/_pytask/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ class NodeNotCollectedError(PytaskError):
1010
"""Exception for nodes which could not be collected."""
1111

1212

13+
class ConfigurationError(PytaskError):
14+
"""Exception during the configuration."""
15+
16+
1317
class CollectionError(PytaskError):
1418
"""Exception during collection."""
1519

src/_pytask/mark/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pdb
12
import sys
23
import textwrap
34
import traceback
@@ -50,9 +51,10 @@ def markers(**config_from_cli):
5051
pm.hook.pytask_add_hooks(pm=pm)
5152

5253
config = pm.hook.pytask_configure(pm=pm, config_from_cli=config_from_cli)
53-
5454
session = Session.from_config(config)
55-
session.exit_code = ExitCode.OK
55+
56+
if config_from_cli.get("pdb"):
57+
pdb.post_mortem()
5658

5759
except Exception:
5860
traceback.print_exception(*sys.exc_info())
@@ -68,7 +70,7 @@ def markers(**config_from_cli):
6870
)
6971
click.echo("")
7072

71-
return session
73+
sys.exit(session.exit_code)
7274

7375

7476
@hookimpl

src/_pytask/session.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import attr
2+
from _pytask.enums import ExitCode
23

34

45
@attr.s
@@ -27,6 +28,7 @@ class Session:
2728
"""
2829
execution_reports = attr.ib(factory=list)
2930
"""Optional[List[pytask.report.ExecutionReport]]: Reports for executed tasks."""
31+
exit_code = attr.ib(default=ExitCode.OK)
3032

3133
@classmethod
3234
def from_config(cls, config):

0 commit comments

Comments
 (0)