Browse Source

Merge pull request #42 from Deuchnord/colors

Add colors in the text return
tags/v0.5.0
Jérôme Deuchnord 5 years ago
committed by GitHub
parent
commit
ae87a896ec
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 110 additions and 83 deletions
  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 View File

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


[requires] [requires]
python_version = "3" python_version = "3"

+ 44
- 37
Pipfile.lock View File

@@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "d5c2451a4f189a6d10a9205879f066fd9b595723f2e1077416aa3f48cdcbfb9f"
"sha256": "fb530146420b5768bc25165302d947d11615aac375e7a63a9076fdddd0372d53"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
@@ -68,6 +68,13 @@
], ],
"index": "pypi", "index": "pypi",
"version": "==0.8.6" "version": "==0.8.6"
},
"termcolor": {
"hashes": [
"sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
],
"index": "pypi",
"version": "==1.1.0"
} }
}, },
"develop": { "develop": {
@@ -110,39 +117,39 @@
}, },
"coverage": { "coverage": {
"hashes": [ "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": { "idna": {
"hashes": [ "hashes": [
@@ -223,10 +230,10 @@
}, },
"six": { "six": {
"hashes": [ "hashes": [
"sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd",
"sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"
"sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
"sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
], ],
"version": "==1.13.0"
"version": "==1.14.0"
}, },
"urllib3": { "urllib3": {
"hashes": [ "hashes": [


+ 41
- 28
kosmorrolib/dumper.py View File

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


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




class Dumper(ABC): 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.ephemeris = ephemeris
self.events = events self.events = events
self.date = date self.date = date
self.with_colors = with_colors


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


class TextDumper(Dumper): class TextDumper(Dumper):
def to_string(self): 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: 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: 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 = [] data = []


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


if aster.ephemerides.rise_time is not None: if aster.ephemerides.rise_time is not None:
planet_rise = aster.ephemerides.rise_time.utc_strftime(TIME_FORMAT) 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]) 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',)) tablefmt='simple', stralign='center', colalign=('left',))


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


for event in events: 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') 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( 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=moon_phase.get_next_phase(),
next_moon_phase_date=moon_phase.next_phase_date.utc_strftime(FULL_DATE_FORMAT), next_moon_phase_date=moon_phase.next_phase_date.utc_strftime(FULL_DATE_FORMAT),


+ 16
- 12
kosmorrolib/locales/messages.pot View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kosmorro 0.4.0\n" "Project-Id-Version: kosmorro 0.4.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -99,43 +99,43 @@ msgstr ""
msgid "%s and %s are in conjunction" msgid "%s and %s are in conjunction"
msgstr "" msgstr ""


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


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


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


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


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


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


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


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


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


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


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


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


+ 3
- 1
kosmorrolib/main.py View File

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


events_list = events.search_events(compute_date) 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()) print(dump.to_string())


return 0 return 0
@@ -121,5 +121,7 @@ def get_args(output_formats: [str]):
parser.add_argument('--year', '-y', type=int, default=today.year, parser.add_argument('--year', '-y', type=int, default=today.year,
help=_('The year you want to compute the ephemerides for.' help=_('The year you want to compute the ephemerides for.'
' Defaults to {default_year} (the current year).').format(default_year=today.year)) ' 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() return parser.parse_args()

+ 5
- 5
test/dumper.py View File

@@ -52,7 +52,7 @@ class DumperTestCase(unittest.TestCase):
'Moon phase: Full Moon\n' 'Moon phase: Full Moon\n'
'Last Quarter on Monday October 21, 2019 at 00:00\n\n' 'Last Quarter on Monday October 21, 2019 at 00:00\n\n'
'Note: All the hours are given in UTC.', '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): def test_text_dumper_with_events(self):
ephemerides = self._get_data() ephemerides = self._get_data()
@@ -62,26 +62,26 @@ class DumperTestCase(unittest.TestCase):
'Mars - - -\n\n' 'Mars - - -\n\n'
'Moon phase: Full Moon\n' 'Moon phase: Full Moon\n'
'Last Quarter on Monday October 21, 2019 at 00:00\n\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' '05:12 Mars is in opposition\n\n'
'Note: All the hours are given in UTC.', 'Note: All the hours are given in UTC.',
TextDumper(ephemerides, [Event('OPPOSITION', TextDumper(ephemerides, [Event('OPPOSITION',
[Planet('Mars', 'MARS')], [Planet('Mars', 'MARS')],
get_timescale().utc(2018, 7, 27, 5, 12)) 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): def test_text_dumper_without_ephemerides_and_with_events(self):
ephemerides = self._get_data(False) ephemerides = self._get_data(False)
self.assertEqual('Monday October 14, 2019\n\n' self.assertEqual('Monday October 14, 2019\n\n'
'Moon phase: Full Moon\n' 'Moon phase: Full Moon\n'
'Last Quarter on Monday October 21, 2019 at 00:00\n\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' '05:12 Mars is in opposition\n\n'
'Note: All the hours are given in UTC.', 'Note: All the hours are given in UTC.',
TextDumper(ephemerides, [Event('OPPOSITION', TextDumper(ephemerides, [Event('OPPOSITION',
[Planet('Mars', 'MARS')], [Planet('Mars', 'MARS')],
get_timescale().utc(2018, 7, 27, 5, 12)) 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 @staticmethod
def _get_data(has_ephemerides: bool = True): def _get_data(has_ephemerides: bool = True):


Loading…
Cancel
Save