diff --git a/httpie/__init__.py b/httpie/__init__.py index 9929885d..7686500b 100644 --- a/httpie/__init__.py +++ b/httpie/__init__.py @@ -2,27 +2,7 @@ HTTPie - a CLI, cURL-like tool for humans. """ -from enum import Enum - __version__ = '2.0.0-dev' __author__ = 'Jakub Roztocil' __licence__ = 'BSD' - - -class ExitStatus(Enum): - """Program exit code constants.""" - SUCCESS = 0 - ERROR = 1 - PLUGIN_ERROR = 7 - - # 128+2 SIGINT - ERROR_CTRL_C = 130 - - ERROR_TIMEOUT = 2 - ERROR_TOO_MANY_REDIRECTS = 6 - - # Used only when requested with --check-status: - ERROR_HTTP_3XX = 3 - ERROR_HTTP_4XX = 4 - ERROR_HTTP_5XX = 5 diff --git a/httpie/__main__.py b/httpie/__main__.py index 08d7a58f..494a0d1c 100644 --- a/httpie/__main__.py +++ b/httpie/__main__.py @@ -10,7 +10,7 @@ def main(): from .core import main exit_status = main() except KeyboardInterrupt: - from . import ExitStatus + from httpie.status import ExitStatus exit_status = ExitStatus.ERROR_CTRL_C sys.exit(exit_status.value) diff --git a/httpie/cli/definition.py b/httpie/cli/definition.py index c770e5db..61ed3d3b 100644 --- a/httpie/cli/definition.py +++ b/httpie/cli/definition.py @@ -25,7 +25,7 @@ from httpie.sessions import DEFAULT_SESSIONS_DIR parser = HTTPieArgumentParser( prog='http', - description='%s ' % __doc__.strip(), + description='%s ' % __doc__.strip(), epilog=dedent(""" For every --OPTION there is also a --no-OPTION that reverts OPTION to its default value. diff --git a/httpie/core.py b/httpie/core.py index 69266f31..84f31fbe 100644 --- a/httpie/core.py +++ b/httpie/core.py @@ -7,7 +7,8 @@ import requests from pygments import __version__ as pygments_version from requests import __version__ as requests_version -from httpie import ExitStatus, __version__ as httpie_version +from httpie import __version__ as httpie_version +from httpie.status import ExitStatus, http_status_to_exit_status from httpie.client import collect_messages from httpie.context import Environment from httpie.downloads import Downloader @@ -154,7 +155,7 @@ def program( else: final_response = message if args.check_status or downloader: - exit_status = get_exit_status( + exit_status = http_status_to_exit_status( http_status=message.status_code, follow=args.follow ) @@ -193,21 +194,6 @@ def program( args.output_file.close() -def get_exit_status(http_status: int, follow=False) -> ExitStatus: - """Translate HTTP status code to exit status code.""" - if 300 <= http_status <= 399 and not follow: - # Redirect - return ExitStatus.ERROR_HTTP_3XX - elif 400 <= http_status <= 499: - # Client Error - return ExitStatus.ERROR_HTTP_4XX - elif 500 <= http_status <= 599: - # Server Error - return ExitStatus.ERROR_HTTP_5XX - else: - return ExitStatus.SUCCESS - - def print_debug_info(env: Environment): env.stderr.writelines([ 'HTTPie %s\n' % httpie_version, diff --git a/httpie/status.py b/httpie/status.py new file mode 100644 index 00000000..93671383 --- /dev/null +++ b/httpie/status.py @@ -0,0 +1,39 @@ +from enum import Enum + + +class ExitStatus(Enum): + """Program exit code constants.""" + SUCCESS = 0 + ERROR = 1 + PLUGIN_ERROR = 7 + + # 128+2 SIGINT + ERROR_CTRL_C = 130 + + ERROR_TIMEOUT = 2 + ERROR_TOO_MANY_REDIRECTS = 6 + + # Used only when requested with --check-status: + ERROR_HTTP_3XX = 3 + ERROR_HTTP_4XX = 4 + ERROR_HTTP_5XX = 5 + + +def http_status_to_exit_status(http_status: int, follow=False) -> ExitStatus: + """ + Translate HTTP status code to exit status code. + + (Relevant only when invoked with --check-status or --download.) + + """ + if 300 <= http_status <= 399 and not follow: + # Redirect + return ExitStatus.ERROR_HTTP_3XX + elif 400 <= http_status <= 499: + # Client Error + return ExitStatus.ERROR_HTTP_4XX + elif 500 <= http_status <= 599: + # Server Error + return ExitStatus.ERROR_HTTP_5XX + else: + return ExitStatus.SUCCESS diff --git a/tests/test_cli.py b/tests/test_cli.py index 7f1e5f6f..439aad30 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -10,7 +10,7 @@ from fixtures import ( FILE_CONTENT, FILE_PATH, FILE_PATH_ARG, JSON_FILE_CONTENT, JSON_FILE_PATH_ARG, ) -from httpie import ExitStatus +from httpie.status import ExitStatus from httpie.cli import constants from httpie.cli.definition import parser from httpie.cli.argtypes import KeyValueArg, KeyValueArgType diff --git a/tests/test_errors.py b/tests/test_errors.py index 57788a40..93594a80 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -3,7 +3,7 @@ from pytest import raises from requests import Request from requests.exceptions import ConnectionError -from httpie import ExitStatus +from httpie.status import ExitStatus from httpie.core import main from utils import HTTP_OK, http diff --git a/tests/test_exit_status.py b/tests/test_exit_status.py index fa25036b..abc93518 100644 --- a/tests/test_exit_status.py +++ b/tests/test_exit_status.py @@ -1,6 +1,6 @@ import mock -from httpie import ExitStatus +from httpie.status import ExitStatus from utils import MockEnvironment, http, HTTP_OK diff --git a/tests/test_httpie.py b/tests/test_httpie.py index e1a954f9..430459d5 100644 --- a/tests/test_httpie.py +++ b/tests/test_httpie.py @@ -1,6 +1,7 @@ """High-level tests.""" import pytest +import httpie.status from httpie.cli.exceptions import ParseError from utils import MockEnvironment, http, HTTP_OK from fixtures import FILE_PATH, FILE_CONTENT @@ -10,19 +11,19 @@ import httpie def test_debug(): r = http('--debug') - assert r.exit_status == httpie.ExitStatus.SUCCESS + assert r.exit_status == httpie.status.ExitStatus.SUCCESS assert 'HTTPie %s' % httpie.__version__ in r.stderr def test_help(): r = http('--help', tolerate_error_exit_status=True) - assert r.exit_status == httpie.ExitStatus.SUCCESS + assert r.exit_status == httpie.status.ExitStatus.SUCCESS assert 'https://github.com/jakubroztocil/httpie/issues' in r def test_version(): r = http('--version', tolerate_error_exit_status=True) - assert r.exit_status == httpie.ExitStatus.SUCCESS + assert r.exit_status == httpie.status.ExitStatus.SUCCESS # FIXME: py3 has version in stdout, py2 in stderr assert httpie.__version__ == r.strip() diff --git a/tests/test_output.py b/tests/test_output.py index 8bdfa572..cbbf8b73 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -5,7 +5,7 @@ from urllib.request import urlopen import pytest from utils import MockEnvironment, http, HTTP_OK, COLOR, CRLF -from httpie import ExitStatus +from httpie.status import ExitStatus from httpie.output.formatters.colors import get_lexer diff --git a/tests/test_redirects.py b/tests/test_redirects.py index 95d51fe8..c1ad9537 100644 --- a/tests/test_redirects.py +++ b/tests/test_redirects.py @@ -1,7 +1,7 @@ """High-level tests.""" import pytest -from httpie import ExitStatus +from httpie.status import ExitStatus from utils import http, HTTP_OK diff --git a/tests/test_ssl.py b/tests/test_ssl.py index e47e1601..051532f8 100644 --- a/tests/test_ssl.py +++ b/tests/test_ssl.py @@ -4,7 +4,7 @@ import pytest import pytest_httpbin.certs import requests.exceptions -from httpie import ExitStatus +from httpie.status import ExitStatus from httpie.cli.constants import SSL_VERSION_ARG_MAPPING from utils import HTTP_OK, TESTS_ROOT, http diff --git a/tests/utils.py b/tests/utils.py index bf279ccd..0bfce07e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -8,7 +8,7 @@ import tempfile from pathlib import Path from typing import Optional -from httpie import ExitStatus +from httpie.status import ExitStatus from httpie.config import Config from httpie.context import Environment from httpie.core import main