Source code for labelord.printers
"""Printers module
This module contains BasePrinter class and its descendants. They serve to
print information so user is notified about application's performed actions.
"""
import click
[docs]class BasePrinter:
"""Basic printer interface
This class serves as an ancestor to other printer classes within this
module and defines their common interface. Initializing an instance
will initialize an empty set of the printer's registered GitHub repositories
and sets error count to zero.
Example:
.. testcode::
import labelord
printer = labelord.printers.BasePrinter()
.. doctest::
>>> type(printer.repos)
<class 'set'>
>>> len(printer.repos)
0
>>> printer.errors
0
"""
SUCCESS_SUMMARY = '{} repo(s) updated successfully'
"""str: Summarizing message in case of success."""
ERROR_SUMMARY = '{} error(s) in total, please check log above'
"""str: Summarizing message in case of error."""
EVENT_CREATE = 'ADD'
"""str: Output tag for create event (new label is created)."""
EVENT_DELETE = 'DEL'
"""str: Output tag for delete event (label is deleted)."""
EVENT_UPDATE = 'UPD'
"""str: Output tag for update event (label is updated)."""
EVENT_LABELS = 'LBL'
"""str: Output tag for read labels event (labels are read from repository,
shows only if an error occurs in this phase)."""
RESULT_SUCCESS = 'SUC'
"""str: Output tag for successfully performed operation."""
RESULT_ERROR = 'ERR'
"""str: Output tag for unsuccessfully performed operation."""
RESULT_DRY = 'DRY'
"""str: Output tag for successfully simulated operation."""
def __init__(self):
self.repos = set()
self.errors = 0
[docs] def add_repo(self, slug):
"""Registers repository for the printer
This method adds given repository to the printer's set of
registered repositories.
Example:
.. testcode::
import labelord
printer = labelord.printers.BasePrinter()
printer.add_repo('User/Repo')
.. doctest::
>>> 'User/Repo' in printer.repos
True
Args:
slug (str): GitHub repository slug (eg. User/Repo).
"""
self.repos.add(slug)
[docs] def event(self, event, result, repo, *args):
"""Processes printer events
This method processes printer events and increments its error count
in case of unsuccessfully performed operation.
Example:
.. testcode::
import labelord
printer = labelord.printers.BasePrinter()
printer.event('Test error event', 'ERR', 'User/Repo')
.. doctest::
>>> printer.errors
1
Args:
event (str): Event description.
result (str): Event result.
repo (str): Repository where event happened.
args (list): Additional arguments (placeholder).
"""
if result == self.RESULT_ERROR:
self.errors += 1
[docs] def summary(self):
"""Interface for printing summary
This method only passes control to the subclass.
"""
pass
def _create_summary(self):
if self.errors > 0:
return self.ERROR_SUMMARY.format(self.errors)
return self.SUCCESS_SUMMARY.format(len(self.repos))
[docs]class Printer(BasePrinter):
"""Default printer
This class describes default printer, which only prints errors
and summary.
"""
[docs] def event(self, event, result, repo, *args):
"""Processes printer events
This method processes printer events through base class' method
and prints any errors.
Example:
.. testcode::
import labelord
printer = labelord.printers.Printer()
.. doctest::
>>> printer.event('ADD', 'ERR', 'User/Repo')
ERROR: ADD; User/Repo
>>> printer.errors
1
Args:
event (str): Event description.
result (str): Event result.
repo (str): Repository where event happened.
args (list): Additional arguments describing the error.
"""
super().event(event, result, repo, *args)
if result == self.RESULT_ERROR:
line_parts = ['ERROR: ' + event, repo, *args]
click.echo('; '.join(line_parts))
[docs] def summary(self):
"""Prints summary
This method prints summary after all operations are processed.
Example:
.. testcode::
import labelord
printer = labelord.printers.Printer()
.. doctest::
>>> printer.summary()
SUMMARY: 0 repo(s) updated successfully
"""
click.echo('SUMMARY: ' + self._create_summary())
[docs]class QuietPrinter(BasePrinter):
"""Quiet printer
This class describes quiet printer, which prints nothing.
Example:
.. testcode::
import labelord
printer = labelord.printers.QuietPrinter()
.. doctest::
>>> printer.event('ADD', 'SUC', 'User/Repo')
>>> printer.event('UPD', 'ERR', 'User/Repo')
>>> printer.summary()
>>> printer.errors
1
"""
pass
[docs]class VerbosePrinter(BasePrinter):
"""Verbose printer
This class describes verbose printer, which prints detailed information
about every performed operation including its result. Also prints summary
after all operations are processed.
"""
LINE_START = '[{}][{}] {}'
"""str: Defines printed line format."""
[docs] def event(self, event, result, repo, *args):
"""Processes printer events
This method processes printer events through base class' method
and prints detailed information about every event including its result.
Example:
.. testcode::
import labelord
printer = labelord.printers.VerbosePrinter()
.. doctest::
>>> printer.event('ADD', 'ERR', 'User/Repo')
[ADD][ERR] User/Repo
>>> printer.event('UPD', 'SUC', 'User/Repo')
[UPD][SUC] User/Repo
>>> printer.errors
1
Args:
event (str): Event description.
result (str): Event result.
repo (str): Repository where event happened.
args (list): Additional arguments describing the event.
"""
super().event(event, result, repo, *args)
line_parts = [self.LINE_START.format(event, result, repo), *args]
click.echo('; '.join(line_parts))
[docs] def summary(self):
"""Prints summary
This method prints summary after all operations are processed.
Example:
.. testcode::
import labelord
printer = labelord.printers.VerbosePrinter()
.. doctest::
>>> printer.summary()
[SUMMARY] 0 repo(s) updated successfully
"""
click.echo('[SUMMARY] ' + self._create_summary())