From 4ea148e8d1a31ad6d369ace1b5bdaa9b0440be3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Deuchnord?= Date: Sun, 26 Apr 2020 16:39:28 +0200 Subject: [PATCH] feat: display a graph in the PDF output for the ephemerides Show a graph instead of a table for the ephemerides in the PDF output --- .gitignore | 4 +- .scripts/tests-e2e.sh | 1 + kosmorrolib/assets/pdf/kosmorro.sty | 115 ++++++++++++++++++++++++++++ kosmorrolib/assets/pdf/template.tex | 54 +++---------- kosmorrolib/dumper.py | 67 ++++++++++++++-- kosmorrolib/locales/messages.pot | 76 +++++++++--------- kosmorrolib/main.py | 10 ++- manpage/kosmorro.1.md | 3 + test/dumper.py | 71 +++++++++++++++++ 9 files changed, 309 insertions(+), 92 deletions(-) create mode 100644 kosmorrolib/assets/pdf/kosmorro.sty diff --git a/.gitignore b/.gitignore index b338cab..894ebbc 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,10 @@ kosmorro.egg-info coverage.xml node_modules/ package-lock.json + /kosmorrolib/assets/pdf/* -!/assets/pdf/*.tex +!/kosmorrolib/assets/pdf/*.tex +!/kosmorrolib/assets/pdf/*.sty /manpage/* !/manpage/*.md diff --git a/.scripts/tests-e2e.sh b/.scripts/tests-e2e.sh index 1f9d149..f5a657f 100755 --- a/.scripts/tests-e2e.sh +++ b/.scripts/tests-e2e.sh @@ -104,6 +104,7 @@ assertSuccess "$PIP_BIN install latex" "CI" # Dependencies installed, should not fail assertSuccess "kosmorro --latitude=50.5876 --longitude=3.0624 -d 2020-01-27 --format=pdf -o /tmp/document.pdf" +assertSuccess "kosmorro --latitude=50.5876 --longitude=3.0624 -d 2020-01-27 --format=pdf -o /tmp/document.pdf --no-graph" # man page assertSuccess "man --pager=cat kosmorro" diff --git a/kosmorrolib/assets/pdf/kosmorro.sty b/kosmorrolib/assets/pdf/kosmorro.sty new file mode 100644 index 0000000..ee0b906 --- /dev/null +++ b/kosmorrolib/assets/pdf/kosmorro.sty @@ -0,0 +1,115 @@ +%! Package = kosmorro +%! Author = Jérôme Deuchnord +%! Date = 2020-04-26 + +\NeedsTeXFormat{LaTeX2e}[1994/06/01] +\ProvidesPackage{kosmorro}[2020/04/26 Kosmorro Package] + +\RequirePackage{xcolor} +\RequirePackage{fp} + +\newcommand{\moonphase}[2]{ + \begin{center} + \begin{minipage}{2cm} + \includegraphics[width=\linewidth]{#1} + \end{minipage} + \hspace{5mm} + \begin{minipage}{7cm} + \textbf{\currentmoonphasetitle}\\#2 + \end{minipage} + \end{center} +} + +\newenvironment{ephemerides}{ + \begin{table}[h] + \centering + \begin{tabular}{lccc} + \textbf{\ephemeridesobjecttitle} & + \textbf{\ephemeridesrisetimetitle} & + \textbf{\ephemeridesculminationtimetitle} & + \textbf{\ephemeridessettimetitle}\\ +\hline +}{ + \end{tabular} + \end{table} +} + +\newcommand{\object}[4]{ + \hline + \textbf{#1} & {#2} & {#3} & {#4}\\ +} + +\newenvironment{graphephemerides}{\setlength{\unitlength}{0.02\linewidth} +\begin{picture}(20,20) + % Axes + \put(0,-2){\vector(1,0){50}} + \multiput(0,-2)(2,0){24}{ + \line(0,-1){0.25} + } + \newcounter{hour} + \multiput(-0.25,-3.5)(4,0){12}{ + \sffamily\footnotesize + \arabic{hour}\stepcounter{hour}\stepcounter{hour} + } + \put(49,-3.5){\sffamily\footnotesize hours} + + % Graduation + + \put(50,-0.5){\sffamily\footnotesize Pluto} + \put(50,1.5){\sffamily\footnotesize Neptune} + \put(50,3.5){\sffamily\footnotesize Uranus} + \put(50,5.5){\sffamily\footnotesize Saturn} + \put(50,7.5){\sffamily\footnotesize Jupiter} + \put(50,9.5){\sffamily\footnotesize Mars} + \put(50,11.5){\sffamily\footnotesize Venus} + \put(50,13.5){\sffamily\footnotesize Mercury} + \put(50,15.5){\sffamily\footnotesize Moon} + \put(50,17.5){\sffamily\footnotesize Sun} + + \multiput(0,0)(0,2){10}{ + \color{gray}\line(1,0){48} + } + + \linethickness{1.5mm} +}{ +\end{picture} +\vspace{1cm} +} + +\newcommand{\graphobject}[8]{% + % #1: Y coordinate component + % #2: Color + % #3: Hour rise time + % #4: Minute rise time + % #5: Hour set time + % #6: Minute set time + % #7: Human-readable rise time + % #8: Human-readable set time + + \FPeval{\start}{#3*2+(#4/60)*2}% + \FPeval{\length}{#5*2+(#6/60)*2 - \start}% + \FPeval{\starttext}{\start+0.7}% + \FPeval{\endtext}{\start+\length-3.25}% + + {\color{#2}% + \put(\start,#1){% + \line(1, 0){\length}% + }}% + + \put(\starttext,#1.5){\sffamily\footnotesize #7}% + \put(\endtext,#1.5){\sffamily\footnotesize #8}% +} + +\newcommand{\event}[2]{ + \textbf{#1} & {#2}\\ +} + +\newenvironment{events}{ + \begin{table}[h] + \begin{tabular}{ll} +}{ + \end{tabular} + \end{table} +} + +\endinput diff --git a/kosmorrolib/assets/pdf/template.tex b/kosmorrolib/assets/pdf/template.tex index d5d148b..0f572a7 100644 --- a/kosmorrolib/assets/pdf/template.tex +++ b/kosmorrolib/assets/pdf/template.tex @@ -5,12 +5,19 @@ \usepackage[margin=25mm]{geometry} \usepackage{graphicx} \usepackage{hyperref} +\usepackage{kosmorro} + +\newcommand{\currentmoonphasetitle}{+++CURRENT-MOON-PHASE-TITLE+++} +\newcommand{\ephemeridesobjecttitle}{+++EPHEMERIDES-OBJECT+++} +\newcommand{\ephemeridesrisetimetitle}{+++EPHEMERIDES-RISE-TIME+++} +\newcommand{\ephemeridesculminationtimetitle}{+++EPHEMERIDES-CULMINATION-TIME+++} +\newcommand{\ephemeridessettimetitle}{+++EPHEMERIDES-SET-TIME+++} % Fix Unicode issues \DeclareUnicodeCharacter{202F}{~} \DeclareUnicodeCharacter{00B0}{$^\circ$} -\hypersetup{pdfinfo={ +\hypersetup{pdfinfo={% Title={+++DOCUMENT-TITLE+++}, Creator={Kosmorro v+++KOSMORRO-VERSION+++} }} @@ -23,49 +30,6 @@ \begin{document} - \newcommand{\object}[4]{ - \hline - \textbf{#1} & {#2} & {#3} & {#4}\\ - } - - \newcommand{\moonphase}[2]{ - \begin{center} - \begin{minipage}{2cm} - \includegraphics[width=\linewidth]{#1} - \end{minipage} - \hspace{5mm} - \begin{minipage}{7cm} - \textbf{+++CURRENT-MOON-PHASE-TITLE+++}\\#2 - \end{minipage} - \end{center} -} - - \newenvironment{ephemerides}{ - \begin{table}[h] - \centering - \begin{tabular}{lccc} - \textbf{+++EPHEMERIDES-OBJECT+++} & - \textbf{+++EPHEMERIDES-RISE-TIME+++} & - \textbf{+++EPHEMERIDES-CULMINATION-TIME+++} & - \textbf{+++EPHEMERIDES-SET-TIME+++}\\ - \hline - }{ - \end{tabular} - \end{table} - } - - \newcommand{\event}[2]{ - \textbf{#1} & {#2}\\ - } - - \newenvironment{events}{ - \begin{table}[h] - \begin{tabular}{ll} - }{ - \end{tabular} - \end{table} - } - \maketitle +++INTRODUCTION+++ @@ -76,7 +40,7 @@ \section{\sffamily +++SECTION-EPHEMERIDES+++} \begin{ephemerides} - +++EPHEMERIDES+++ ++++EPHEMERIDES+++ \end{ephemerides} %%% END-EPHEMERIDES-SECTION diff --git a/kosmorrolib/dumper.py b/kosmorrolib/dumper.py index 1c75ecd..add7153 100644 --- a/kosmorrolib/dumper.py +++ b/kosmorrolib/dumper.py @@ -20,6 +20,7 @@ from abc import ABC, abstractmethod import datetime import json import os +from pathlib import Path from tabulate import tabulate from numpy import int64 from termcolor import colored @@ -41,13 +42,15 @@ TIME_FORMAT = _('{hours}:{minutes}').format(hours='%H', minutes='%M') class Dumper(ABC): def __init__(self, ephemerides: [AsterEphemerides] = None, moon_phase: MoonPhase = None, events: [Event] = None, - date: datetime.date = datetime.date.today(), timezone: int = 0, with_colors: bool = True): + date: datetime.date = datetime.date.today(), timezone: int = 0, with_colors: bool = True, + show_graph: bool = False): self.ephemerides = ephemerides self.moon_phase = moon_phase self.events = events self.date = date self.timezone = timezone self.with_colors = with_colors + self.show_graph = show_graph if self.timezone != 0: self._convert_dates_to_timezones() @@ -282,10 +285,17 @@ class _LatexDumper(Dumper): .replace('+++SECTION-EVENTS+++', _('Expected events')) \ .replace('+++EVENTS+++', self._make_events()) + if self.show_graph: + # The graphephemerides environment beginning tag must end with a percent symbol to ensure + # that no extra space will interfere with the graph. + document = document.replace(r'\begin{ephemerides}', r'\begin{graphephemerides}%')\ + .replace(r'\end{ephemerides}', r'\end{graphephemerides}') + return document def _make_ephemerides(self) -> str: latex = [] + graph_y_component = 18 if self.ephemerides is not None: for ephemeris in self.ephemerides: @@ -308,10 +318,46 @@ class _LatexDumper(Dumper): else: aster_set = '-' - latex.append(r'\object{%s}{%s}{%s}{%s}' % (ephemeris.object.name, - aster_rise, - aster_culmination, - aster_set)) + if not self.show_graph: + latex.append(r'\object{%s}{%s}{%s}{%s}' % (ephemeris.object.name, + aster_rise, + aster_culmination, + aster_set)) + else: + if ephemeris.rise_time is not None: + raise_hour = ephemeris.rise_time.hour + raise_minute = ephemeris.rise_time.minute + else: + raise_hour = raise_minute = 0 + aster_rise = '' + + if ephemeris.set_time is not None: + set_hour = ephemeris.set_time.hour + set_minute = ephemeris.set_time.minute + else: + set_hour = 24 + set_minute = 0 + aster_set = '' + sets_after_end = set_hour > raise_hour + + if not sets_after_end: + latex.append(r'\graphobject{%d}{gray}{0}{0}{%d}{%d}{}{%s}' % (graph_y_component, + set_hour, + set_minute, + aster_set)) + set_hour = 24 + set_minute = 0 + + latex.append(r'\graphobject{%d}{gray}{%d}{%d}{%d}{%d}{%s}{%s}' % ( + graph_y_component, + raise_hour, + raise_minute, + set_hour, + set_minute, + aster_rise, + aster_set if sets_after_end else '' + )) + graph_y_component -= 2 return ''.join(latex) @@ -345,10 +391,15 @@ class _LatexDumper(Dumper): class PdfDumper(Dumper): + def _convert_dates_to_timezones(self): + """This method is disabled in this dumper, because the timezone is already converted + in :class:`_LatexDumper`.""" + def to_string(self): try: latex_dumper = _LatexDumper(self.ephemerides, self.moon_phase, self.events, - date=self.date, timezone=self.timezone, with_colors=self.with_colors) + date=self.date, timezone=self.timezone, with_colors=self.with_colors, + show_graph=self.show_graph) return self._compile(latex_dumper.to_string()) except RuntimeError: raise UnavailableFeatureError(_("Building PDFs was not possible, because some dependencies are not" @@ -364,4 +415,6 @@ class PdfDumper(Dumper): if build_pdf is None: raise RuntimeError('Python latex module not found') - return bytes(build_pdf(latex_input)) + package = str(Path(__file__).parent.absolute()) + '/assets/pdf/' + + return bytes(build_pdf(latex_input, [package])) diff --git a/kosmorrolib/locales/messages.pot b/kosmorrolib/locales/messages.pot index 841a531..8ddfccb 100644 --- a/kosmorrolib/locales/messages.pot +++ b/kosmorrolib/locales/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: kosmorro 0.7.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2020-04-18 15:51+0200\n" +"POT-Creation-Date: 2020-05-12 13:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -119,80 +119,80 @@ msgstr "" msgid "Pluto" msgstr "" -#: kosmorrolib/dumper.py:35 +#: kosmorrolib/dumper.py:36 msgid "{day_of_week} {month} {day_number}, {year}" msgstr "" -#: kosmorrolib/dumper.py:37 +#: kosmorrolib/dumper.py:38 msgid "{month} {day_number}, {hours}:{minutes}" msgstr "" -#: kosmorrolib/dumper.py:39 +#: kosmorrolib/dumper.py:40 msgid "{hours}:{minutes}" msgstr "" -#: kosmorrolib/dumper.py:150 +#: kosmorrolib/dumper.py:153 msgid "Expected events:" msgstr "" -#: kosmorrolib/dumper.py:154 +#: kosmorrolib/dumper.py:157 msgid "Note: All the hours are given in UTC." msgstr "" -#: kosmorrolib/dumper.py:159 +#: kosmorrolib/dumper.py:162 msgid "Note: All the hours are given in the UTC{offset} timezone." msgstr "" -#: kosmorrolib/dumper.py:205 kosmorrolib/dumper.py:274 +#: kosmorrolib/dumper.py:208 kosmorrolib/dumper.py:277 msgid "Object" msgstr "" -#: kosmorrolib/dumper.py:206 kosmorrolib/dumper.py:275 +#: kosmorrolib/dumper.py:209 kosmorrolib/dumper.py:278 msgid "Rise time" msgstr "" -#: kosmorrolib/dumper.py:207 kosmorrolib/dumper.py:276 +#: kosmorrolib/dumper.py:210 kosmorrolib/dumper.py:279 msgid "Culmination time" msgstr "" -#: kosmorrolib/dumper.py:208 kosmorrolib/dumper.py:277 +#: kosmorrolib/dumper.py:211 kosmorrolib/dumper.py:280 msgid "Set time" msgstr "" -#: kosmorrolib/dumper.py:222 kosmorrolib/dumper.py:280 +#: kosmorrolib/dumper.py:225 kosmorrolib/dumper.py:283 msgid "Moon phase:" msgstr "" -#: kosmorrolib/dumper.py:223 +#: kosmorrolib/dumper.py:226 msgid "{next_moon_phase} on {next_moon_phase_date} at {next_moon_phase_time}" msgstr "" -#: kosmorrolib/dumper.py:261 +#: kosmorrolib/dumper.py:264 msgid "A Summary of your Sky" msgstr "" -#: kosmorrolib/dumper.py:265 +#: kosmorrolib/dumper.py:268 msgid "" "This document summarizes the ephemerides and the events of {date}. It " "aims to help you to prepare your observation session. All the hours are " "given in {timezone}." msgstr "" -#: kosmorrolib/dumper.py:271 +#: kosmorrolib/dumper.py:274 msgid "" "Don't forget to check the weather forecast before you go out with your " "equipment." msgstr "" -#: kosmorrolib/dumper.py:273 +#: kosmorrolib/dumper.py:276 msgid "Ephemerides of the day" msgstr "" -#: kosmorrolib/dumper.py:282 +#: kosmorrolib/dumper.py:285 msgid "Expected events" msgstr "" -#: kosmorrolib/dumper.py:354 +#: kosmorrolib/dumper.py:405 msgid "" "Building PDFs was not possible, because some dependencies are not " "installed.\n" @@ -213,82 +213,88 @@ msgid "" "the observation coordinate." msgstr "" -#: kosmorrolib/main.py:93 +#: kosmorrolib/main.py:94 msgid "Could not save the output in \"{path}\": {error}" msgstr "" -#: kosmorrolib/main.py:98 +#: kosmorrolib/main.py:99 msgid "Selected output format needs an output file (--output)." msgstr "" -#: kosmorrolib/main.py:117 +#: kosmorrolib/main.py:116 msgid "Running on Python {python_version}" msgstr "" -#: kosmorrolib/main.py:123 +#: kosmorrolib/main.py:122 msgid "Do you really want to clear Kosmorro's cache? [yN] " msgstr "" -#: kosmorrolib/main.py:130 +#: kosmorrolib/main.py:129 msgid "Answer did not match expected options, cache not cleared." msgstr "" -#: kosmorrolib/main.py:139 +#: kosmorrolib/main.py:138 msgid "" "Compute the ephemerides and the events for a given date, at a given " "position on Earth." msgstr "" -#: kosmorrolib/main.py:141 +#: kosmorrolib/main.py:140 msgid "" "By default, only the events will be computed for today ({date}).\n" "To compute also the ephemerides, latitude and longitude arguments are " "needed." msgstr "" -#: kosmorrolib/main.py:146 +#: kosmorrolib/main.py:145 msgid "Show the program version" msgstr "" -#: kosmorrolib/main.py:148 +#: kosmorrolib/main.py:147 msgid "Delete all the files Kosmorro stored in the cache." msgstr "" -#: kosmorrolib/main.py:150 +#: kosmorrolib/main.py:149 msgid "The format under which the information have to be output" msgstr "" -#: kosmorrolib/main.py:152 +#: kosmorrolib/main.py:151 msgid "" "The observer's latitude on Earth. Can also be set in the " "KOSMORRO_LATITUDE environment variable." msgstr "" -#: kosmorrolib/main.py:155 +#: kosmorrolib/main.py:154 msgid "" "The observer's longitude on Earth. Can also be set in the " "KOSMORRO_LONGITUDE environment variable." msgstr "" -#: kosmorrolib/main.py:158 +#: kosmorrolib/main.py:157 msgid "" "The date for which the ephemerides must be computed (in the YYYY-MM-DD " "format). Defaults to the current date ({default_date})" msgstr "" -#: kosmorrolib/main.py:162 +#: kosmorrolib/main.py:161 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 "" -#: kosmorrolib/main.py:165 +#: kosmorrolib/main.py:164 msgid "Disable the colors in the console." msgstr "" -#: kosmorrolib/main.py:167 +#: kosmorrolib/main.py:166 msgid "" "A file to export the output to. If not given, the standard output is " "used. This argument is needed for PDF format." msgstr "" +#: kosmorrolib/main.py:169 +msgid "" +"Generate a graph instead of a table to show the rise, culmination set " +"times (PDF only)" +msgstr "" + diff --git a/kosmorrolib/main.py b/kosmorrolib/main.py index 3f23b65..60f6688 100644 --- a/kosmorrolib/main.py +++ b/kosmorrolib/main.py @@ -79,7 +79,8 @@ def main(): timezone = 0 format_dumper = output_formats[output_format](ephemerides=eph, moon_phase=moon_phase, events=events_list, - date=compute_date, timezone=timezone, with_colors=args.colors) + date=compute_date, timezone=timezone, with_colors=args.colors, + show_graph=args.show_graph) output = format_dumper.to_string() except UnavailableFeatureError as error: print(colored(error.msg, 'red')) @@ -101,13 +102,11 @@ def main(): return 0 - - def get_dumpers() -> {str: dumper.Dumper}: return { 'text': dumper.TextDumper, 'json': dumper.JsonDumper, - 'pdf': dumper.PdfDumper + 'pdf': dumper.PdfDumper, } @@ -166,5 +165,8 @@ def get_args(output_formats: [str]): parser.add_argument('--output', '-o', type=str, default=None, help=_('A file to export the output to. If not given, the standard output is used. ' 'This argument is needed for PDF format.')) + parser.add_argument('--no-graph', dest='show_graph', action='store_false', + help=_('Generate a graph instead of a table to show the rise, culmination set times ' + '(PDF only)')) return parser.parse_args() diff --git a/manpage/kosmorro.1.md b/manpage/kosmorro.1.md index 17dbf00..e46662d 100644 --- a/manpage/kosmorro.1.md +++ b/manpage/kosmorro.1.md @@ -37,6 +37,9 @@ `--format=`_FORMAT_, `-f` _FORMAT_ the format under which the information have to be output; one of the following: text, json, pdf +`--no-graph` + present the ephemerides in a table instead of a graph; PDF output format only + ## ENVIRONMENT VARIABLES The environment variable listed below may be used instead of the options. diff --git a/test/dumper.py b/test/dumper.py index 63a0f95..5c0573a 100644 --- a/test/dumper.py +++ b/test/dumper.py @@ -229,6 +229,77 @@ class DumperTestCase(unittest.TestCase): self.assertNotRegex(latex, r'\\section{\\sffamily Expected events}') + def test_latex_dumper_with_graph(self): + latex = _LatexDumper(self._get_ephemerides(True), self._get_moon_phase(), self._get_events(), + date=date(2019, 10, 14), show_graph=True).to_string() + + self.assertRegex(latex, 'Monday October 14, 2019') + self.assertRegex(latex, 'Full Moon') + self.assertRegex(latex, r'\\section{\\sffamily Expected events}') + self.assertRegex(latex, r'\\section{\\sffamily Ephemerides of the day}') + self.assertRegex(latex, r'\\graphobject\{18\}\{gray\}\{8\}\{0\}\{23\}\{0\}\{08:00\}\{23:00\}') + self.assertRegex(latex, r'\\event\{23:00\}\{Mars is in opposition\}') + self.assertRegex(latex, r"\\event\{12:00\}\{Venus's largest elongation \(42.0°\)\}") + + latex = _LatexDumper(self._get_ephemerides(aster_rise_set=True), self._get_moon_phase(), + self._get_events(), date=date(2019, 10, 14)).to_string() + self.assertRegex(latex, r'\\object\{Mars\}\{08:00\}\{13:00\}\{23:00\}') + + def test_latex_dumper_with_graph_but_without_rise_time(self): + ephemerides = self._get_ephemerides(True) + ephemerides[0].rise_time = None + latex = _LatexDumper(ephemerides, self._get_moon_phase(), self._get_events(), + date=date(2019, 10, 14), show_graph=True).to_string() + + self.assertRegex(latex, 'Monday October 14, 2019') + self.assertRegex(latex, 'Full Moon') + self.assertRegex(latex, r'\\section{\\sffamily Expected events}') + self.assertRegex(latex, r'\\section{\\sffamily Ephemerides of the day}') + self.assertRegex(latex, r'\\graphobject\{18\}\{gray\}\{0\}\{0\}\{23\}\{0\}\{\}\{23:00\}') + self.assertRegex(latex, r'\\event\{23:00\}\{Mars is in opposition\}') + self.assertRegex(latex, r"\\event\{12:00\}\{Venus's largest elongation \(42.0°\)\}") + + latex = _LatexDumper(self._get_ephemerides(aster_rise_set=True), self._get_moon_phase(), + self._get_events(), date=date(2019, 10, 14)).to_string() + self.assertRegex(latex, r'\\object\{Mars\}\{08:00\}\{13:00\}\{23:00\}') + + def test_latex_dumper_with_graph_but_without_set_time(self): + ephemerides = self._get_ephemerides(True) + ephemerides[0].set_time = None + latex = _LatexDumper(ephemerides, self._get_moon_phase(), self._get_events(), + date=date(2019, 10, 14), show_graph=True).to_string() + + self.assertRegex(latex, 'Monday October 14, 2019') + self.assertRegex(latex, 'Full Moon') + self.assertRegex(latex, r'\\section{\\sffamily Expected events}') + self.assertRegex(latex, r'\\section{\\sffamily Ephemerides of the day}') + self.assertRegex(latex, r'\\graphobject\{18\}\{gray\}\{8\}\{0\}\{24\}\{0\}\{08:00\}\{\}') + self.assertRegex(latex, r'\\event\{23:00\}\{Mars is in opposition\}') + self.assertRegex(latex, r"\\event\{12:00\}\{Venus's largest elongation \(42.0°\)\}") + + latex = _LatexDumper(self._get_ephemerides(aster_rise_set=True), self._get_moon_phase(), + self._get_events(), date=date(2019, 10, 14)).to_string() + self.assertRegex(latex, r'\\object\{Mars\}\{08:00\}\{13:00\}\{23:00\}') + + def test_latex_dumper_with_graph_but_mars_sets_tomorrow(self): + ephemerides = self._get_ephemerides(True) + ephemerides[0].set_time = datetime(2019, 10, 15, 1) + latex = _LatexDumper(ephemerides, self._get_moon_phase(), self._get_events(), + date=date(2019, 10, 14), show_graph=True).to_string() + + self.assertRegex(latex, 'Monday October 14, 2019') + self.assertRegex(latex, 'Full Moon') + self.assertRegex(latex, r'\\section{\\sffamily Expected events}') + self.assertRegex(latex, r'\\section{\\sffamily Ephemerides of the day}') + self.assertRegex(latex, r'\\graphobject\{18\}\{gray\}\{8\}\{0\}\{24\}\{0\}\{08:00\}\{\}') + self.assertRegex(latex, r'\\graphobject\{18\}\{gray\}\{0\}\{0\}\{1\}\{0\}\{\}\{Oct 15, 01:00\}') + self.assertRegex(latex, r'\\event\{23:00\}\{Mars is in opposition\}') + self.assertRegex(latex, r"\\event\{12:00\}\{Venus's largest elongation \(42.0°\)\}") + + latex = _LatexDumper(self._get_ephemerides(aster_rise_set=True), self._get_moon_phase(), + self._get_events(), date=date(2019, 10, 14)).to_string() + self.assertRegex(latex, r'\\object\{Mars\}\{08:00\}\{13:00\}\{23:00\}') + @staticmethod def _get_ephemerides(aster_rise_set=False) -> [AsterEphemerides]: rise_time = datetime(2019, 10, 14, 8) if aster_rise_set else None