Quellcode durchsuchen

feat: add colors in the text return

Colors can be disabled with the new `--no-colors` argument.
tags/v0.5.0
Jérôme Deuchnord vor 4 Jahren
Ursprung
Commit
38fc06657f
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden GPG-Schlüssel-ID: BC6F3C345B7D33B0
6 geänderte Dateien mit 110 neuen und 83 gelöschten Zeilen
  1. +1
    -0
      Pipfile
  2. +44
    -37
      Pipfile.lock
  3. +41
    -28
      kosmorrolib/dumper.py
  4. +16
    -12
      kosmorrolib/locales/messages.pot
  5. +3
    -1
      kosmorrolib/main.py
  6. +5
    -5
      test/dumper.py

+ 1
- 0
Pipfile Datei anzeigen

@@ -13,6 +13,7 @@ babel = "*"
skyfield = ">=1.13.0,<2.0.0"
tabulate = "*"
numpy = ">=1.17.0,<2.0.0"
termcolor = "*"

[requires]
python_version = "3"

+ 44
- 37
Pipfile.lock Datei anzeigen

@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "d5c2451a4f189a6d10a9205879f066fd9b595723f2e1077416aa3f48cdcbfb9f"
"sha256": "fb530146420b5768bc25165302d947d11615aac375e7a63a9076fdddd0372d53"
},
"pipfile-spec": 6,
"requires": {
@@ -68,6 +68,13 @@
],
"index": "pypi",
"version": "==0.8.6"
},
"termcolor": {
"hashes": [
"sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
],
"index": "pypi",
"version": "==1.1.0"
}
},
"develop": {
@@ -110,39 +117,39 @@
},
"coverage": {
"hashes": [
"sha256:189aac76d6e0d7af15572c51892e7326ee451c076c5a50a9d266406cd6c49708",
"sha256:1bf7ba2af1d373a1750888724f84cffdfc697738f29a353c98195f98fc011509",
"sha256:1f4ee8e2e4243971618bc16fcc4478317405205f135e95226c2496e2a3b8dbbf",
"sha256:225e79a5d485bc1642cb7ba02281419c633c216cdc6b26c26494ba959f09e69f",
"sha256:23688ff75adfa8bfa2a67254d889f9bdf9302c27241d746e17547c42c732d3f4",
"sha256:28f7f73b34a05e23758e860a89a7f649b85c6749e252eff60ebb05532d180e86",
"sha256:2d0cb9b1fe6ad0d915d45ad3d87f03a38e979093a98597e755930db1f897afae",
"sha256:47874b4711c5aeb295c31b228a758ce3d096be83dc37bd56da48ed99efb8813b",
"sha256:511ec0c00840e12fb4e852e4db58fa6a01ca4da72f36a9766fae344c3d502033",
"sha256:53e7438fef0c97bc248f88ba1edd10268cd94d5609970aaf87abbe493691af87",
"sha256:569f9ee3025682afda6e9b0f5bb14897c0db03f1a1dc088b083dd36e743f92bb",
"sha256:593853aa1ac6dcc6405324d877544c596c9d948ef20d2e9512a0f5d2d3202356",
"sha256:5b0a07158360d22492f9abd02a0f2ee7981b33f0646bf796598b7673f6bbab14",
"sha256:7ca3db38a61f3655a2613ee2c190d63639215a7a736d3c64cc7bbdb002ce6310",
"sha256:7d1cc7acc9ce55179616cf72154f9e648136ea55987edf84addbcd9886ffeba2",
"sha256:88b51153657612aea68fa684a5b88037597925260392b7bb4509d4f9b0bdd889",
"sha256:955ec084f549128fa2702f0b2dc696392001d986b71acd8fd47424f28289a9c3",
"sha256:b251c7092cbb6d789d62dc9c9e7c4fb448c9138b51285c36aeb72462cad3600e",
"sha256:bd82b684bb498c60ef47bb1541a50e6d006dde8579934dcbdbc61d67d1ea70d9",
"sha256:bfe102659e2ec13b86c7f3b1db6c9a4e7beea4255058d006351339e6b342d5d2",
"sha256:c1e4e39e43057396a5e9d069bfbb6ffeee892e40c5d2effbd8cd71f34ee66c4d",
"sha256:cb2b74c123f65e8166f7e1265829a6c8ed755c3cd16d7f50e75a83456a5f3fd7",
"sha256:cca38ded59105f7705ef6ffe1e960b8db6c7d8279c1e71654a4775ab4454ca15",
"sha256:cf908840896f7aa62d0ec693beb53264b154f972eb8226fb864ac38975590c4f",
"sha256:d095a7b473f8a95f7efe821f92058c8a2ecfb18f8db6677ae3819e15dc11aaae",
"sha256:d22b4297e7e4225ccf01f1aa55e7a96412ea0796b532dd614c3fcbafa341128e",
"sha256:d4a2b578a7a70e0c71f662705262f87a456f1e6c1e40ada7ea699abaf070a76d",
"sha256:ddeb42a3d5419434742bf4cc71c9eaa22df3b76808e23a82bd0b0bd360f1a9f1",
"sha256:e65a5aa1670db6263f19fdc03daee1d7dbbadb5cb67fd0a1f16033659db13c1d",
"sha256:eaad65bd20955131bcdb3967a4dea66b4e4d4ca488efed7c00d91ee0173387e8",
"sha256:f45fba420b94165c17896861bb0e8b27fb7abdcedfeb154895d8553df90b7b00"
],
"version": "==5.0.2"
"sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3",
"sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c",
"sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0",
"sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477",
"sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a",
"sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf",
"sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691",
"sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73",
"sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987",
"sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894",
"sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e",
"sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef",
"sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf",
"sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68",
"sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8",
"sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954",
"sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2",
"sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40",
"sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc",
"sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc",
"sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e",
"sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d",
"sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f",
"sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc",
"sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301",
"sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea",
"sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb",
"sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af",
"sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52",
"sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37",
"sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0"
],
"version": "==5.0.3"
},
"idna": {
"hashes": [
@@ -223,10 +230,10 @@
},
"six": {
"hashes": [
"sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd",
"sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"
"sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
"sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
],
"version": "==1.13.0"
"version": "==1.14.0"
},
"urllib3": {
"hashes": [


+ 41
- 28
kosmorrolib/dumper.py Datei anzeigen

@@ -22,6 +22,7 @@ import json
from tabulate import tabulate
from skyfield.timelib import Time
from numpy import int64
from termcolor import colored
from .data import Object, AsterEphemerides, MoonPhase, Event
from .i18n import _

@@ -31,10 +32,12 @@ TIME_FORMAT = _('{hours}:{minutes}').format(hours='%H', minutes='%M')


class Dumper(ABC):
def __init__(self, ephemeris: dict, events: [Event], date: datetime.date = datetime.date.today()):
def __init__(self, ephemeris: dict, events: [Event], date: datetime.date = datetime.date.today(),
with_colors: bool = True):
self.ephemeris = ephemeris
self.events = events
self.date = date
self.with_colors = with_colors

@abstractmethod
def to_string(self):
@@ -80,35 +83,45 @@ class JsonDumper(Dumper):

class TextDumper(Dumper):
def to_string(self):
text = self.date.strftime(FULL_DATE_FORMAT)
# Always capitalize the first character
text = ''.join([text[0].upper(), text[1:]])
text = [self.style(self.get_date(), 'h1')]

if len(self.ephemeris['details']) > 0:
text = '\n\n'.join([text,
self.get_asters(self.ephemeris['details'])
])
text.append(self.get_asters(self.ephemeris['details']))

text = '\n\n'.join([text,
self.get_moon(self.ephemeris['moon_phase'])
])
text.append(self.get_moon(self.ephemeris['moon_phase']))

if len(self.events) > 0:
text = '\n\n'.join([text,
_('Expected events:'),
self.get_events(self.events)
])
text.append('\n'.join([self.style(_('Expected events:'), 'h2'),
self.get_events(self.events)]))

text = '\n\n'.join([text, _('Note: All the hours are given in UTC.')])
text.append(self.style(_('Note: All the hours are given in UTC.'), 'em'))

return text
return '\n\n'.join(text)

@staticmethod
def get_asters(asters: [Object]) -> str:
def style(self, text: str, tag: str) -> str:
if not self.with_colors:
return text

styles = {
'h1': lambda t: colored(t, 'yellow', attrs=['bold']),
'h2': lambda t: colored(t, 'magenta', attrs=['bold']),
'th': lambda t: colored(t, 'white', attrs=['bold']),
'strong': lambda t: colored(t, attrs=['bold']),
'em': lambda t: colored(t, attrs=['dark'])
}

return styles[tag](text)

def get_date(self) -> str:
date = self.date.strftime(FULL_DATE_FORMAT)

return ''.join([date[0].upper(), date[1:]])

def get_asters(self, asters: [Object]) -> str:
data = []

for aster in asters:
name = aster.name
name = self.style(aster.name, 'th')

if aster.ephemerides.rise_time is not None:
planet_rise = aster.ephemerides.rise_time.utc_strftime(TIME_FORMAT)
@@ -127,23 +140,23 @@ class TextDumper(Dumper):

data.append([name, planet_rise, planet_culmination, planet_set])

return tabulate(data, headers=[_('Object'), _('Rise time'), _('Culmination time'), _('Set time')],
return tabulate(data, headers=[self.style(_('Object'), 'th'),
self.style(_('Rise time'), 'th'),
self.style(_('Culmination time'), 'th'),
self.style(_('Set time'), 'th')],
tablefmt='simple', stralign='center', colalign=('left',))

@staticmethod
def get_events(events: [Event]) -> str:
def get_events(self, events: [Event]) -> str:
data = []

for event in events:
data.append([event.start_time.utc_strftime(TIME_FORMAT), event.get_description()])
data.append([self.style(event.start_time.utc_strftime(TIME_FORMAT), 'th'),
event.get_description()])

return tabulate(data, tablefmt='plain', stralign='left')

@staticmethod
def get_moon(moon_phase: MoonPhase) -> str:
current_moon_phase = _('Moon phase: {current_moon_phase}').format(
current_moon_phase=moon_phase.get_phase()
)
def get_moon(self, moon_phase: MoonPhase) -> str:
current_moon_phase = ' '.join([self.style(_('Moon phase:'), 'strong'), moon_phase.get_phase()])
new_moon_phase = _('{next_moon_phase} on {next_moon_phase_date} at {next_moon_phase_time}').format(
next_moon_phase=moon_phase.get_next_phase(),
next_moon_phase_date=moon_phase.next_phase_date.utc_strftime(FULL_DATE_FORMAT),


+ 16
- 12
kosmorrolib/locales/messages.pot Datei anzeigen

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kosmorro 0.4.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-01-02 14:05+0100\n"
"POT-Creation-Date: 2020-01-19 10:39+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -99,43 +99,43 @@ msgstr ""
msgid "%s and %s are in conjunction"
msgstr ""

#: kosmorrolib/dumper.py:28
#: kosmorrolib/dumper.py:29
msgid "{day_of_week} {month} {day_number}, {year}"
msgstr ""

#: kosmorrolib/dumper.py:30
#: kosmorrolib/dumper.py:31
msgid "{hours}:{minutes}"
msgstr ""

#: kosmorrolib/dumper.py:98
#: kosmorrolib/dumper.py:94
msgid "Expected events:"
msgstr ""

#: kosmorrolib/dumper.py:102
#: kosmorrolib/dumper.py:97
msgid "Note: All the hours are given in UTC."
msgstr ""

#: kosmorrolib/dumper.py:130
#: kosmorrolib/dumper.py:143
msgid "Object"
msgstr ""

#: kosmorrolib/dumper.py:130
#: kosmorrolib/dumper.py:144
msgid "Rise time"
msgstr ""

#: kosmorrolib/dumper.py:130
#: kosmorrolib/dumper.py:145
msgid "Culmination time"
msgstr ""

#: kosmorrolib/dumper.py:130
#: kosmorrolib/dumper.py:146
msgid "Set time"
msgstr ""

#: kosmorrolib/dumper.py:144
msgid "Moon phase: {current_moon_phase}"
#: kosmorrolib/dumper.py:159
msgid "Moon phase:"
msgstr ""

#: kosmorrolib/dumper.py:147
#: kosmorrolib/dumper.py:160
msgid "{next_moon_phase} on {next_moon_phase_date} at {next_moon_phase_time}"
msgstr ""

@@ -203,3 +203,7 @@ msgid ""
"{default_year} (the current year)."
msgstr ""

#: kosmorrolib/main.py:125
msgid "Disable the colors in the console."
msgstr ""


+ 3
- 1
kosmorrolib/main.py Datei anzeigen

@@ -57,7 +57,7 @@ def main():

events_list = events.search_events(compute_date)

dump = output_formats[args.format](ephemerides, events_list, compute_date)
dump = output_formats[args.format](ephemerides, events_list, compute_date, args.colors)
print(dump.to_string())

return 0
@@ -121,5 +121,7 @@ def get_args(output_formats: [str]):
parser.add_argument('--year', '-y', type=int, default=today.year,
help=_('The year you want to compute the ephemerides for.'
' Defaults to {default_year} (the current year).').format(default_year=today.year))
parser.add_argument('--no-colors', dest='colors', action='store_false',
help=_('Disable the colors in the console.'))

return parser.parse_args()

+ 5
- 5
test/dumper.py Datei anzeigen

@@ -52,7 +52,7 @@ class DumperTestCase(unittest.TestCase):
'Moon phase: Full Moon\n'
'Last Quarter on Monday October 21, 2019 at 00:00\n\n'
'Note: All the hours are given in UTC.',
TextDumper(ephemerides, [], date=date(2019, 10, 14)).to_string())
TextDumper(ephemerides, [], date=date(2019, 10, 14), with_colors=False).to_string())

def test_text_dumper_with_events(self):
ephemerides = self._get_data()
@@ -62,26 +62,26 @@ class DumperTestCase(unittest.TestCase):
'Mars - - -\n\n'
'Moon phase: Full Moon\n'
'Last Quarter on Monday October 21, 2019 at 00:00\n\n'
'Expected events:\n\n'
'Expected events:\n'
'05:12 Mars is in opposition\n\n'
'Note: All the hours are given in UTC.',
TextDumper(ephemerides, [Event('OPPOSITION',
[Planet('Mars', 'MARS')],
get_timescale().utc(2018, 7, 27, 5, 12))
], date=date(2019, 10, 14)).to_string())
], date=date(2019, 10, 14), with_colors=False).to_string())

def test_text_dumper_without_ephemerides_and_with_events(self):
ephemerides = self._get_data(False)
self.assertEqual('Monday October 14, 2019\n\n'
'Moon phase: Full Moon\n'
'Last Quarter on Monday October 21, 2019 at 00:00\n\n'
'Expected events:\n\n'
'Expected events:\n'
'05:12 Mars is in opposition\n\n'
'Note: All the hours are given in UTC.',
TextDumper(ephemerides, [Event('OPPOSITION',
[Planet('Mars', 'MARS')],
get_timescale().utc(2018, 7, 27, 5, 12))
], date=date(2019, 10, 14)).to_string())
], date=date(2019, 10, 14), with_colors=False).to_string())

@staticmethod
def _get_data(has_ephemerides: bool = True):


Laden…
Abbrechen
Speichern