From c377c634cbfe246246bfbb34ed6c45e7bf80a1e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Deuchnord?= Date: Wed, 27 Apr 2022 11:53:35 +0000 Subject: [PATCH] feat: send error and warning messages in standard error instead of standard output --- kosmorro/__main__.py | 68 ++++++++++++++++++----------------- kosmorro/locales/messages.pot | 36 +++++++++---------- kosmorro/utils.py | 5 +++ tests/dates.py | 16 +++++++-- tests/output.py | 58 +++++++++++++++--------------- 5 files changed, 102 insertions(+), 81 deletions(-) diff --git a/kosmorro/__main__.py b/kosmorro/__main__.py index 3331df8..5660cb4 100644 --- a/kosmorro/__main__.py +++ b/kosmorro/__main__.py @@ -28,7 +28,13 @@ from datetime import date from . import dumper, environment, debug from .date import parse_date from .geolocation import get_position -from .utils import KOSMORRO_VERSION, KOSMORROLIB_VERSION, colored, set_colors_activated +from .utils import ( + KOSMORRO_VERSION, + KOSMORROLIB_VERSION, + colored, + set_colors_activated, + print_stderr, +) from .exceptions import ( InvalidOutputFormatError, UnavailableFeatureError, @@ -52,7 +58,7 @@ def run(): try: compute_date = parse_date(args.date) except ValueError as error: - print(colored(error.args[0], color="red", attrs=["bold"])) + print_stderr(colored(error.args[0], color="red", attrs=["bold"])) return -1 position = None @@ -79,8 +85,7 @@ def run(): ) ) if position is None: - print() - print( + print_stderr( colored( _( "PDF output will not contain the ephemerides, because you didn't provide the observation " @@ -109,15 +114,15 @@ def run(): args.show_graph, ) except InvalidOutputFormatError as error: - print(colored(error.msg, "red")) + print_stderr(colored(error.msg, "red")) debug.debug_print(error) return 3 except UnavailableFeatureError as error: - print(colored(error.msg, "red")) + print_stderr(colored(error.msg, "red")) debug.debug_print(error) return 2 except DateRangeError as error: - print(colored(error.msg, "red")) + print_stderr(colored(error.msg, "red")) debug.debug_print(error) return 1 @@ -128,11 +133,11 @@ def run(): with open(args.output, opening_mode) as output_file: output_file.write(file_content) except UnavailableFeatureError as error: - print(colored(error.msg, "red")) + print_stderr(colored(error.msg, "red")) debug.debug_print(error) return 2 except OSError as error: - print( + print_stderr( colored( _('The file could not be saved in "{path}": {error}').format( path=args.output, error=error.strerror @@ -146,7 +151,7 @@ def run(): elif not output.is_file_output_needed(): print(output) else: - print( + print_stderr( colored( _("Please provide a file path to export in this format (--output)."), color="red", @@ -165,35 +170,32 @@ def get_information( colors: bool, show_graph: bool, ) -> dumper.Dumper: - if position is not None: - try: + try: + if position is not None: eph = get_ephemerides( for_date=compute_date, position=position, timezone=timezone ) - except OutOfRangeDateError as error: - raise DateRangeError(error.min_date, error.max_date) - else: - eph = [] + else: + eph = [] - try: - moon_phase = get_moon_phase(for_date=compute_date, timezone=timezone) - except OutOfRangeDateError as error: - moon_phase = None - print( - colored( - _( - "Moon phase can only be computed between {min_date} and {max_date}" - ).format( - min_date=format_date(error.min_date, "long"), - max_date=format_date(error.max_date, "long"), - ), - "yellow", + try: + moon_phase = get_moon_phase(for_date=compute_date, timezone=timezone) + except OutOfRangeDateError as error: + moon_phase = None + print_stderr( + colored( + _( + "Moon phase can only be computed between {min_date} and {max_date}" + ).format( + min_date=format_date(error.min_date, "long"), + max_date=format_date(error.max_date, "long"), + ), + "yellow", + ) ) - ) - events_list = get_events(compute_date, timezone) + events_list = get_events(compute_date, timezone) - try: return get_dumpers()[output_format]( ephemerides=eph, moon_phase=moon_phase, @@ -205,6 +207,8 @@ def get_information( ) except KeyError as error: raise InvalidOutputFormatError(output_format, list(get_dumpers().keys())) + except OutOfRangeDateError as error: + raise DateRangeError(error.min_date, error.max_date) def get_dumpers() -> {str: dumper.Dumper}: diff --git a/kosmorro/locales/messages.pot b/kosmorro/locales/messages.pot index defbe2f..ec7403f 100644 --- a/kosmorro/locales/messages.pot +++ b/kosmorro/locales/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-27 11:36+0000\n" +"POT-Creation-Date: 2022-04-29 12:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,94 +17,94 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.10.1\n" -#: kosmorro/__main__.py:76 +#: kosmorro/__main__.py:82 msgid "" "Save the planet and paper!\n" "Consider printing your PDF document only if really necessary, and use the" " other side of the sheet." msgstr "" -#: kosmorro/__main__.py:85 +#: kosmorro/__main__.py:90 msgid "" "PDF output will not contain the ephemerides, because you didn't provide " "the observation coordinates." msgstr "" -#: kosmorro/__main__.py:137 +#: kosmorro/__main__.py:142 msgid "The file could not be saved in \"{path}\": {error}" msgstr "" -#: kosmorro/__main__.py:151 +#: kosmorro/__main__.py:156 msgid "Please provide a file path to export in this format (--output)." msgstr "" -#: kosmorro/__main__.py:184 +#: kosmorro/__main__.py:187 msgid "Moon phase can only be computed between {min_date} and {max_date}" msgstr "" -#: kosmorro/__main__.py:234 +#: kosmorro/__main__.py:238 msgid "Running on Python {python_version} with Kosmorrolib v{kosmorrolib_version}" msgstr "" -#: kosmorro/__main__.py:247 +#: kosmorro/__main__.py:251 msgid "" "Compute the ephemerides and the events for a given date and a given " "position on Earth." msgstr "" -#: kosmorro/__main__.py:250 +#: kosmorro/__main__.py:254 msgid "" "By default, only the events will be computed for today.\n" "To compute also the ephemerides, latitude and longitude arguments are " "needed." msgstr "" -#: kosmorro/__main__.py:263 +#: kosmorro/__main__.py:267 msgid "Show the program version" msgstr "" -#: kosmorro/__main__.py:271 +#: kosmorro/__main__.py:275 msgid "" "The format to output the information to. If not provided, the output " "format will be inferred from the file extension of the output file." msgstr "" -#: kosmorro/__main__.py:281 +#: kosmorro/__main__.py:285 msgid "" "The observer's position on Earth, in the \"{latitude},{longitude}\" " "format. Can also be set in the KOSMORRO_POSITION environment variable." msgstr "" -#: kosmorro/__main__.py:291 +#: kosmorro/__main__.py:295 msgid "" "The date for which the ephemerides must be calculated. Can be in the " "YYYY-MM-DD format or an interval in the \"[+-]YyMmDd\" format (with Y, M," " and D numbers). Defaults to current date." msgstr "" -#: kosmorro/__main__.py:302 +#: kosmorro/__main__.py:306 msgid "" "The timezone to display the hours in (e.g. 2 for UTC+2 or -3 for UTC-3). " "Can also be set in the KOSMORRO_TIMEZONE environment variable." msgstr "" -#: kosmorro/__main__.py:311 +#: kosmorro/__main__.py:315 msgid "Disable the colors in the console." msgstr "" -#: kosmorro/__main__.py:318 +#: kosmorro/__main__.py:322 msgid "" "A file to export the output to. If not given, the standard output is " "used. This argument is needed for PDF format." msgstr "" -#: kosmorro/__main__.py:327 +#: kosmorro/__main__.py:331 msgid "" "Do not generate a graph to represent the rise and set times in the PDF " "format." msgstr "" -#: kosmorro/__main__.py:335 +#: kosmorro/__main__.py:339 msgid "Show debugging messages" msgstr "" diff --git a/kosmorro/utils.py b/kosmorro/utils.py index 2d42e82..c952e2e 100644 --- a/kosmorro/utils.py +++ b/kosmorro/utils.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from termcolor import colored as do_color +from sys import stderr try: from importlib.metadata import version @@ -25,3 +26,7 @@ def colored(text, color=None, on_color=None, attrs=None): return text return do_color(text, color, on_color, attrs) + + +def print_stderr(*values: object): + print(*values, file=stderr) diff --git a/tests/dates.py b/tests/dates.py index 2e6f0a9..4b91518 100644 --- a/tests/dates.py +++ b/tests/dates.py @@ -29,7 +29,7 @@ def test_with_incorrect_date_values(): result = execute(KOSMORRO + arg) assert not result.is_successful() assert ( - result.stdout + result.stderr == f"The date {value} does not match the required YYYY-MM-DD format or the offset format.\n" ) @@ -38,7 +38,7 @@ def test_with_incorrect_date_values(): result = execute(KOSMORRO + arg) assert not result.is_successful() assert ( - result.stdout == f"The date {value} is not valid: month must be in 1..12\n" + result.stderr == f"The date {value} is not valid: month must be in 1..12\n" ) @@ -47,6 +47,16 @@ def test_with_out_of_range_dates(): result = execute(KOSMORRO + arg) assert not result.is_successful() assert ( - result.stdout + result.stderr + == "Moon phase can only be computed between August 9, 1899 and September 26, 2053\nThe date must be between July 28, 1899 and October 8, 2053\n" + ) + + +def test_with_out_of_range_dates_for_moon_phase_only(): + for arg in [["-d", "1899-07-30"], ["-d", "2053-10-06"]]: + result = execute(KOSMORRO + arg) + assert result.is_successful() + assert ( + result.stderr == "Moon phase can only be computed between August 9, 1899 and September 26, 2053\n" ) diff --git a/tests/output.py b/tests/output.py index 850835b..fd185c4 100644 --- a/tests/output.py +++ b/tests/output.py @@ -171,35 +171,37 @@ def test_tex_output(): i += 1 -# disabled for now, waiting for the new pdf generator -# def test_pdf_output(): -# if platform != "linux": -# # Consider it works everywhere if it does at least on Linux -# return -# -# tmp_dir = tempfile.mkdtemp() -# result = execute( -# KOSMORRO -# + [ -# "--position=50.5876,3.0624", -# "-d2020-01-27", -# "--format=pdf", -# f"--output={tmp_dir}/document.pdf", -# ] -# ) -# -# if environ.get("TEXLIVE_INSTALLED") is None: -# assert not result.is_successful() -# assert ( -# result.stdout -# == """Save the planet and paper! -# Consider printing your PDF document only if really necessary, and use the other side of the sheet. -# Building PDF was not possible, because some dependencies are not installed. -# Please look at the documentation at https://kosmorro.space/cli/generate-pdf/ for more information. -# """ -# ) +def test_pdf_output(): + if platform != "linux": + # Consider it works everywhere if it does at least on Linux + return + + tmp_dir = tempfile.mkdtemp() + result = execute( + KOSMORRO + + [ + "--position=50.5876,3.0624", + "-d2020-01-27", + "--format=pdf", + f"--output={tmp_dir}/document.pdf", + ] + ) + + if environ.get("TEXLIVE_INSTALLED") is None: + assert not result.is_successful() + assert ( + result.stdout + == "Save the planet and paper!\nConsider printing your PDF document only if really necessary, and use the other side of the sheet.\n" + ) + assert ( + result.stderr + == "Building PDF was not possible, because some dependencies are not installed.\nPlease look at the documentation at https://kosmorro.space/cli/generate-pdf/ for more information.\n" + ) + + +# return # -# return +# disabled for now, waiting for the new pdf generator # # assert result.is_successful() # assert (