From aeedfbb93db18972fb1d52685337e6995060dfd4 Mon Sep 17 00:00:00 2001 From: Jon Grace-Cox <30441316+jongracecox@users.noreply.github.com> Date: Sun, 15 Mar 2020 12:51:34 -0400 Subject: [PATCH] Fix padding issues (#38) * Set default padding chars to 0.5. * Split num_padding_chars into num_label_padding_chars and num_value_padding_chars to allow better control. Retain num_padding_chars as an input parameter, but internally it is dropped. * Remove padding multipliers. * Add measurements image for developers. Helps show what each of the internal measurements are. * Add script to build example badges. * Update example badges. Reliability ======= * Raise a value error if an invalid font is passed. * Handle labels that are not passed as str. * Raise a value error if an invalid color name is passed. Testing ======= * Expand doctests to increase test coverage. * Add Arial size 11 font and extra font sizes (mainly for testing). * Make parse_args and main more testable by taking args as an input parameter. * Use useful badge text in unittest badges. * Add template svg file for testing. * Add HTML coverage generation to travis yaml. --- .travis.yml | 2 +- README.md | 6 +- anybadge.py | 104 ++++++++++++----- build_examples.py | 15 +++ examples/color_aqua.svg | 16 +-- examples/color_black.svg | 16 +-- examples/color_blue.svg | 16 +-- examples/color_brightred.svg | 16 +-- examples/color_brightyellow.svg | 16 +-- examples/color_fuchsia.svg | 16 +-- examples/color_gray.svg | 16 +-- examples/color_green.svg | 16 +-- examples/color_lightgrey.svg | 16 +-- examples/color_lime.svg | 16 +-- examples/color_maroon.svg | 16 +-- examples/color_navy.svg | 16 +-- examples/color_olive.svg | 16 +-- examples/color_orange.svg | 16 +-- examples/color_purple.svg | 16 +-- examples/color_red.svg | 16 +-- examples/color_silver.svg | 16 +-- examples/color_teal.svg | 16 +-- examples/color_white.svg | 16 +-- examples/color_yellow.svg | 16 +-- examples/color_yellowgreen.svg | 16 +-- measurements.png | Bin 0 -> 75296 bytes tests/template.svg | 23 ++++ tests/test_anybadge.py | 191 +++++++++++++++++++++++++++----- 28 files changed, 450 insertions(+), 227 deletions(-) create mode 100644 build_examples.py create mode 100644 measurements.png create mode 100644 tests/template.svg diff --git a/.travis.yml b/.travis.yml index 83aa2c8..3c43788 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ python: install: - pip install -U setuptools pip -r build-requirements.txt script: -- pytest --doctest-modules --cov=anybadge anybadge.py tests +- pytest --doctest-modules --cov=anybadge --cov-report html:htmlcov anybadge.py tests before_deploy: - sed -i "s/^version = .*/version = __version__ = \"$TRAVIS_TAG\"/" anybadge.py deploy: diff --git a/README.md b/README.md index 247570f..3822acf 100644 --- a/README.md +++ b/README.md @@ -163,10 +163,10 @@ This table was generated with the following code: print("""| Color Name | Hex Code | Example | | ---------- | -------- | ------- |""") for color, hex in sorted(anybadge.COLORS.items()): - file = 'https://cdn.rawgit.com/jongracecox/anybadge/master/examples/color_' + color + '.svg' + file = 'examples/color_' + color + '.svg' + url = 'https://cdn.rawgit.com/jongracecox/anybadge/master/' + file anybadge.Badge(label='Color', value=color, default_color=color).write_badge(file, overwrite=True) - print("| {color} | {hex} | ![]({file}) |".format(color=color, hex=hex.upper(), file=file)) - + print("| {color} | {hex} | ![]({url}) |".format(color=color, hex=hex.upper(), url=url)) ``` ### Examples diff --git a/anybadge.py b/anybadge.py index 29ef9fc..f62d3d5 100755 --- a/anybadge.py +++ b/anybadge.py @@ -5,9 +5,11 @@ anybadge A Python module for generating badges for your projects, with a focus on simplicity and flexibility. """ +import sys import os import re - +import argparse +import textwrap # Package information version = __version__ = "0.0.0" @@ -20,7 +22,7 @@ __uri__ = "https://github.com/jongracecox/anybadge" # Set some defaults DEFAULT_FONT = 'DejaVu Sans,Verdana,Geneva,sans-serif' DEFAULT_FONT_SIZE = 11 -NUM_PADDING_CHARS = 0 +NUM_PADDING_CHARS = 0.5 DEFAULT_COLOR = '#4c1' DEFAULT_TEXT_COLOR = '#fff' MASK_ID_PREFIX = 'anybadge_' @@ -29,8 +31,13 @@ MASK_ID_PREFIX = 'anybadge_' # supported fonts and font sizes. FONT_WIDTHS = { 'DejaVu Sans,Verdana,Geneva,sans-serif': { - 11: 10 - } + 10: 9, + 11: 10, + 12: 11, + }, + 'Arial, Helvetica, sans-serif': { + 11: 8, + }, } # Create a dictionary of colors to make selections @@ -111,6 +118,10 @@ class Badge(object): font_size(int, optional): Font size. num_padding_chars(float, optional): Number of padding characters to use to give extra space around text. + num_label_padding_chars(float, optional): Number of padding characters to use to give extra + space around label text. + num_value_padding_chars(float, optional): Number of padding characters to use to give extra + space around value text. template(str, optional): String containing the SVG template. This should be valid SVG file content with place holders for variables to be populated during rendering. value_prefix(str, optional): Prefix to be placed before value. @@ -178,18 +189,26 @@ class Badge(object): """ def __init__(self, label, value, font_name=None, font_size=None, - num_padding_chars=None, template=None, + num_padding_chars=None, num_label_padding_chars=None, + num_value_padding_chars=None, template=None, value_prefix='', value_suffix='', thresholds=None, default_color=None, use_max_when_value_exceeds=True, value_format=None, text_color=None): """Constructor for Badge class.""" - # Set defaults if values were not passed if not font_name: font_name = DEFAULT_FONT if not font_size: font_size = DEFAULT_FONT_SIZE - if num_padding_chars is None: - num_padding_chars = NUM_PADDING_CHARS + if num_label_padding_chars is None: + if num_padding_chars is None: + num_label_padding_chars = NUM_PADDING_CHARS + else: + num_label_padding_chars = num_padding_chars + if num_value_padding_chars is None: + if num_padding_chars is None: + num_value_padding_chars = NUM_PADDING_CHARS + else: + num_value_padding_chars = num_padding_chars if not template: template = TEMPLATE_SVG if not default_color: @@ -207,9 +226,13 @@ class Badge(object): self.value_prefix = value_prefix self.value_suffix = value_suffix self.value_text = value_prefix + value_text + value_suffix + + if font_name not in FONT_WIDTHS: + raise ValueError('Font name "%s" not found. Available fonts: %s' % (font_name, ', '.join(FONT_WIDTHS.keys()))) self.font_name = font_name self.font_size = font_size - self.num_padding_chars = num_padding_chars + self.num_label_padding_chars = num_label_padding_chars + self.num_value_padding_chars = num_value_padding_chars self.template = template self.thresholds = thresholds self.default_color = default_color @@ -244,14 +267,34 @@ class Badge(object): >>> repr(badge) "Badge('example', '123.456', value_suffix='TB', text_color='#111111')" + >>> badge = Badge('example', '123', num_padding_chars=5) + >>> repr(badge) + "Badge('example', '123', num_padding_chars=5)" + + >>> badge = Badge('example', '123', num_label_padding_chars=5) + >>> repr(badge) + "Badge('example', '123', num_label_padding_chars=5)" + + >>> badge = Badge('example', '123', num_label_padding_chars=5, num_value_padding_chars=6, + ... template='template.svg', value_prefix='$', thresholds={10: 'green', 30: 'red'}, + ... default_color='red', use_max_when_value_exceeds=False, value_format="%s m/s") + >>> repr(badge) + "Badge('example', '123', num_label_padding_chars=5, num_value_padding_chars=6, template='template.svg', value_prefix='$', thresholds={10: 'green', 30: 'red'}, default_color='red', use_max_when_value_exceeds=False, value_format='%s m/s')" + """ optional_args = "" if self.font_name != DEFAULT_FONT: optional_args += ", font_name=%s" % repr(self.font_name) if self.font_size != DEFAULT_FONT_SIZE: optional_args += ", font_size=%s" % repr(self.font_size) - if self.num_padding_chars != NUM_PADDING_CHARS: - optional_args += ", num_padding_chars=%s" % repr(self.num_padding_chars) + if self.num_label_padding_chars == self.num_value_padding_chars: + if self.num_label_padding_chars != NUM_PADDING_CHARS: + optional_args += ", num_padding_chars=%s" % repr(self.num_label_padding_chars) + else: + if self.num_label_padding_chars != NUM_PADDING_CHARS: + optional_args += ", num_label_padding_chars=%s" % repr(self.num_label_padding_chars) + if self.num_value_padding_chars != NUM_PADDING_CHARS: + optional_args += ", num_value_padding_chars=%s" % repr(self.num_value_padding_chars) if self.template != TEMPLATE_SVG: optional_args += ", template=%s" % repr(self.template) if self.value_prefix != '': @@ -351,7 +394,7 @@ class Badge(object): Returns: int """ - return int(self.get_text_width(self.label) + (2.0 * self.num_padding_chars * self.font_width)) + return int(self.get_text_width(str(self.label)) + (2.0 * self.num_label_padding_chars * self.font_width)) @property def value_width(self): @@ -359,7 +402,7 @@ class Badge(object): Returns: int """ - return int(self.get_text_width(str(self.value_text)) + (self.num_padding_chars * self.font_width)) + return int(self.get_text_width(str(self.value_text)) + (2.0 * self.num_value_padding_chars * self.font_width)) @property def font_width(self): @@ -381,8 +424,7 @@ class Badge(object): Returns: int """ - return int(self.font_width + self.label_width + - float(self.font_width) * float(self.num_padding_chars)) + return self.badge_width - self.value_width @property def label_anchor(self): @@ -426,11 +468,9 @@ class Badge(object): >>> badge = Badge('pylint', '5') >>> badge.badge_width - 53 + 61 """ - padding_char_width = self.get_text_width(' ') - padding = int(padding_char_width * (self.num_padding_chars + 3)) - return padding + self.label_width + self.value_width + return self.label_width + self.value_width @property def badge_svg_text(self): @@ -459,7 +499,7 @@ class Badge(object): .replace('{{ label text color }}', self.label_text_color) \ .replace('{{ value text color }}', self.value_text_color) \ .replace('{{ color split x }}', str(self.color_split_position)) \ - .replace('{{ value width }}', str(self.badge_width - self.color_split_position))\ + .replace('{{ value width }}', str(self.value_width))\ .replace('{{ mask id }}', self.mask_id) def __str__(self): @@ -531,18 +571,24 @@ class Badge(object): """Return the color code for the badge. Returns: str + + Raises: ValueError when an invalid badge color is set. """ color = self.badge_color if color[0] == '#': return color - return COLORS[color] + + try: + return COLORS[color] + except KeyError: + raise ValueError('Invalid color code "%s". Valid color codes are: %s', (color, ", ".join(COLORS.keys()))) def write_badge(self, file_path, overwrite=False): """Write badge to file.""" # Validate path (part 1) if file_path.endswith('/'): - raise Exception('File location may not be a directory.') + raise ValueError('File location may not be a directory.') # Get absolute filepath path = os.path.abspath(file_path) @@ -551,7 +597,7 @@ class Badge(object): # Validate path (part 2) if not overwrite and os.path.exists(path): - raise Exception('File "{}" already exists.'.format(path)) + raise RuntimeError('File "{}" already exists.'.format(path)) with open(path, mode='w') as file_handle: file_handle.write(self.badge_svg_text) @@ -664,10 +710,8 @@ def _get_approx_string_width(text, font_width, fixed_width=False): # for group in char_width_groups} -def parse_args(): +def parse_args(args): """Parse the command line arguments.""" - import argparse - import textwrap parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\ Command line utility to generate .svg badges. @@ -741,13 +785,13 @@ examples: parser.add_argument('args', nargs=argparse.REMAINDER, help='Pairs of =. ' 'For example 2=red 4=orange 6=yellow 8=good. ' 'Read this as "Less than 2 = red, less than 4 = orange...".') - return parser.parse_args() + return parser.parse_args(args) -def main(): +def main(args): """Generate a badge based on command line arguments.""" # Parse command line arguments - args = parse_args() + args = parse_args(args) label = args.label threshold_text = args.args @@ -786,4 +830,4 @@ def main(): if __name__ == '__main__': - main() + main(sys.argv[1:]) diff --git a/build_examples.py b/build_examples.py new file mode 100644 index 0000000..4ffbaab --- /dev/null +++ b/build_examples.py @@ -0,0 +1,15 @@ +import anybadge + +if __name__ == '__main__': + + print("""| Color Name | Hex Code | Example | + | ---------- | -------- | ------- |""") + for color, hex in sorted(anybadge.COLORS.items()): + + file = 'examples/color_' + color + '.svg' + + url = 'https://cdn.rawgit.com/jongracecox/anybadge/master/' + file + + anybadge.Badge(label='Color', value=color, default_color=color).write_badge(file, overwrite=True) + + print("| {color} | {hex} | ![]({url}) |".format(color=color, hex=hex.upper(), url=url)) diff --git a/examples/color_aqua.svg b/examples/color_aqua.svg index 9293cd7..8f94e9d 100644 --- a/examples/color_aqua.svg +++ b/examples/color_aqua.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - aqua - aqua + aqua + aqua \ No newline at end of file diff --git a/examples/color_black.svg b/examples/color_black.svg index 21d92e6..50b40e1 100644 --- a/examples/color_black.svg +++ b/examples/color_black.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - black - black + black + black \ No newline at end of file diff --git a/examples/color_blue.svg b/examples/color_blue.svg index 8a7e734..2fb3b62 100644 --- a/examples/color_blue.svg +++ b/examples/color_blue.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - blue - blue + blue + blue \ No newline at end of file diff --git a/examples/color_brightred.svg b/examples/color_brightred.svg index 0a34830..7e5e873 100644 --- a/examples/color_brightred.svg +++ b/examples/color_brightred.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - brightred - brightred + brightred + brightred \ No newline at end of file diff --git a/examples/color_brightyellow.svg b/examples/color_brightyellow.svg index a3508c5..d0dd1ba 100644 --- a/examples/color_brightyellow.svg +++ b/examples/color_brightyellow.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - brightyellow - brightyellow + brightyellow + brightyellow \ No newline at end of file diff --git a/examples/color_fuchsia.svg b/examples/color_fuchsia.svg index cc5e346..4e0d9c7 100644 --- a/examples/color_fuchsia.svg +++ b/examples/color_fuchsia.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - fuchsia - fuchsia + fuchsia + fuchsia \ No newline at end of file diff --git a/examples/color_gray.svg b/examples/color_gray.svg index 5e309a1..e99fe36 100644 --- a/examples/color_gray.svg +++ b/examples/color_gray.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - gray - gray + gray + gray \ No newline at end of file diff --git a/examples/color_green.svg b/examples/color_green.svg index fd379ae..b99a269 100644 --- a/examples/color_green.svg +++ b/examples/color_green.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - green - green + green + green \ No newline at end of file diff --git a/examples/color_lightgrey.svg b/examples/color_lightgrey.svg index 3da03cd..74e1abc 100644 --- a/examples/color_lightgrey.svg +++ b/examples/color_lightgrey.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - lightgrey - lightgrey + lightgrey + lightgrey \ No newline at end of file diff --git a/examples/color_lime.svg b/examples/color_lime.svg index 959b7b9..167150c 100644 --- a/examples/color_lime.svg +++ b/examples/color_lime.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - lime - lime + lime + lime \ No newline at end of file diff --git a/examples/color_maroon.svg b/examples/color_maroon.svg index 73cd8c9..cb96180 100644 --- a/examples/color_maroon.svg +++ b/examples/color_maroon.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - maroon - maroon + maroon + maroon \ No newline at end of file diff --git a/examples/color_navy.svg b/examples/color_navy.svg index 1751f54..7a16fda 100644 --- a/examples/color_navy.svg +++ b/examples/color_navy.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - navy - navy + navy + navy \ No newline at end of file diff --git a/examples/color_olive.svg b/examples/color_olive.svg index 4b0c810..e0e0c64 100644 --- a/examples/color_olive.svg +++ b/examples/color_olive.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - olive - olive + olive + olive \ No newline at end of file diff --git a/examples/color_orange.svg b/examples/color_orange.svg index 17015c4..fc43cf7 100644 --- a/examples/color_orange.svg +++ b/examples/color_orange.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - orange - orange + orange + orange \ No newline at end of file diff --git a/examples/color_purple.svg b/examples/color_purple.svg index a1f98c8..c02bb54 100644 --- a/examples/color_purple.svg +++ b/examples/color_purple.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - purple - purple + purple + purple \ No newline at end of file diff --git a/examples/color_red.svg b/examples/color_red.svg index 30b2b32..570aa56 100644 --- a/examples/color_red.svg +++ b/examples/color_red.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - red - red + red + red \ No newline at end of file diff --git a/examples/color_silver.svg b/examples/color_silver.svg index e25bf7d..bdffeea 100644 --- a/examples/color_silver.svg +++ b/examples/color_silver.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - silver - silver + silver + silver \ No newline at end of file diff --git a/examples/color_teal.svg b/examples/color_teal.svg index 095ebed..6b81930 100644 --- a/examples/color_teal.svg +++ b/examples/color_teal.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - teal - teal + teal + teal \ No newline at end of file diff --git a/examples/color_white.svg b/examples/color_white.svg index 6a79aef..3c64231 100644 --- a/examples/color_white.svg +++ b/examples/color_white.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - white - white + white + white \ No newline at end of file diff --git a/examples/color_yellow.svg b/examples/color_yellow.svg index 899c2c5..a0a248a 100644 --- a/examples/color_yellow.svg +++ b/examples/color_yellow.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - yellow - yellow + yellow + yellow \ No newline at end of file diff --git a/examples/color_yellowgreen.svg b/examples/color_yellowgreen.svg index f60ce56..266f20a 100644 --- a/examples/color_yellowgreen.svg +++ b/examples/color_yellowgreen.svg @@ -1,23 +1,23 @@ - + - + - - + + - Color - Color + Color + Color - yellowgreen - yellowgreen + yellowgreen + yellowgreen \ No newline at end of file diff --git a/measurements.png b/measurements.png new file mode 100644 index 0000000000000000000000000000000000000000..b74aea2512dff544b33c8fd7fba2f404e6705aeb GIT binary patch literal 75296 zcmdpeg+-sociyL;b+3EfYt4?)(NZHmcm5m<1|z<#uA&Enor#6P z;6wO$;0e2nd@>An?xlmWvd(2?WfmQGmzxf^ZDBC=nAEhh*RL6!@80keYDTk=;qW|? zRP;?XQ%)z5P$FkZp(PKEC8lyis8LcOujAd}E||r@=m@P8BNWld0|b)FlYxI+XW}fs z+s)n8^$DTnrK3TGnWLGF=_bFyv#>=G6K>5Y2bc|hmC9UTZvS|_H|McPFzieZ4k6mk zqeCgNqJky3tABfA^O!m-zKgi}a(U42qt-}xI@b~m7V#*jhsr}#M?NIMk>L?HA&i~o zgJ-%e0oOiD?-f)HI>m%j+9#`#Q`#-7@S1eeoEdlPnP9YKwdxy~4(FKFO^*k<%;zX< z331Ye&_3=r47JW>$8AZZEZf-dKm0txP0w-M$+hp28zZVManY!2#4qz)sH8c+rd|1- zLgGS@+ND=EH;HfD(a}>mp8Jw4;^XX~amJQkorvI}rMwq!Q0z7KV_mU+q+jQdaQYe} zcXl=txp@0!fAh3{t~e^`_JYDW(V*OMF006if(^&Z!v(T7D_a=Rp`4VS47$N3wW$6I zDFM`Xzl3y6n#*mr7r0{lZTzKeGP>J_Kx)Y&!+_d=8m2kj{k8RAZLP=;PXvGFW&aRNO8;@e zyq5ruT*(p&W?!?BHO&co{t#A^EJd!nQxlna*aj!RfA$KR%D!MD87Zt>QhjC+%lJYH z79Ofjc9!}Ki8>A)8j%*FZ^77eHo}5_9Jd#ZD+Rmt8tFxyG)7b?w#2hQHO4M~$0d;24h*FlbJycsEq4}=dBv*nTu;Q?X7%0-`D?O*>4dZ_2}!W$&BOWf}6oYQmTb2D*0aE-5*FcosfmyGOQ(BFLOP2! z(gzB=6$_|gG9yJx}72#d?x+Qxd?p3O>S~EI8{fJvFT`b-DjoadA zZ))F#H$UGrKj7+J>GSImN*hWNN>UIEx^c`AuP&DF^KQK6LXG<*&m_!AGo;L-h^+Yj zqYBlz`)&FWcCp^7XH=P0%dB$eaXJZOmG6X?Y3vqwe4+nx_G|i=_A62x${cBW#d?p1 zk%i8My0)se^o#b3i@l4zb}5BK;g(nnkzqR3d)D_%?hRFo-}LF9ADEOau{4+|CFQNw zpVIf{#pR9XJ>t#N&n%WNb}0U+pRLdQ-15EV`=t_rYah$+US3Vx6$cOR`Ro-G+wK_;dNbGLkQ!N zYSuh`BcPxqEHL)i`H19*6fY7_1TUK?i#V6An6`?@gJ^|#gI+g&>YiwP@jd7B3-=iB zjojO%+s(jo)^hT2E^>}twY+xmTFY1Yk!k61=>!jiNAVI-hHk%Xf7QUZ0lWdaCB>zc zf$RbEfe+dA3SI|O2@Ny+w*`g;NQ|eduh$S&n7T~d+VAS^h_%*t_8iH&wdUA7`l|ES z%lIPVp_{D(PA0FMD%LnZ-UVBm@THhxrl$JP6+fB8{)f=iW4 z^TzYM7c*B{C4x$W@_*m`jgy8K*IsNLk2ij{l%$?ko!}lmKcPRR4LSR{Tf~uJXF|OY zGoTP|p*jX%65gJ*jI_+OY#r<#Ak8+H|9!dMcCYw*0={p@gJ@;s2AdpP9BM^p~*8swT3r;_J&Kaa?a_r(cI;3jFn64xiXb4)w?;ry3{oL%EQZD z&0Da^YI=k{{mJ|jyElSwEkVU|X^&>B_Nx$THy&1d~LG9MS9bzjnw3z65^@H~pwPVZ2!(iP2E%es+! zw-P_3I_6)9ahx3cRyJUA zF=r*+q%omJ(CL%QiohsMc~BkeO=ZX2OJ>f~Z!fjR|J--qFE|XjI+)EHh&{yqe&kpE zb4f0{mCBW{jLMiYjWTeeZNhy`t&dqFC}%vY=4E3~nf-5xDT&v$CLcf5j#2YbE>n`O z;ZMJ-Np7gNSZ=(barcHmB~Q`#)k%Q~0RduOr-{dPb{}(vYD^)TSZC)S_Jsy|(up9FsX-qtRs)|6Nyo^j#2gy?y~#L&kN9uEaw-dh~4#9FU) zGbTvpyj7^&Wk0e}qrkR6nWq zvEv$C%%OLrsBM9pH6nwjQv06neJiEC=ZaW`iT=L%+xGwR~^B^{ZIX?Re~` zob!k#u`{uiXj$%&JdaQD&zkkj57i@VEo^c_G_uTrto|a$qQ6Na6n0ufeLd&3cNH2h zS*t~v$C+t2O>7zbbQ-vr?X_lYX-zs~*Tno==ezDt>ou+@ZN@xnc?CxE9o*lAKT0;o zMqNT?*0pUkHSs4nz29x!c0e?E#-mzrycDn8CA>%EFI(b6|{0%)8Lb05@ za>r2)g}JK3qU_>s%W^?bTu>M#e~yKPMb_Qsri`A-r9aKVCpnb;oja~FLPB0%UV>g? zf-dfMLL$=A(n7+bLZYGq;0*x}ALl!k-U7}ZY^R<4?MKDd!`j`!^^Sv!GYizOrIm~4 z9XS*V8t9+@PUmUs?eL$GoIU<53oK9w`bJ1ZP*~{y*6fbM&HqO;=$q4KC+j*LP8RA+ zM#sV1_O_9VgOjbZ2bh|?q=>Za$uR%xoBvGoUoA2JX(=r%@$Z)Z`sQCPp_#~NyF1u| zO@g*UUPM;te?9y2zN`?mPygDt(?dCV3Qk4-oUG74CoF$%u29Yz21COxt0-Rg##wD9 zSml^7n=uq?*4j9j9_iB@YVt{37Qq)rA@Cy+Jlw1*XqK)H#mZ!E-FX&dXB+3as?fq< zE8GyO+kI&Z9LPZYi{nz>Ar<&%51Cw+iKm0_xtVg^@b01>pQI)`k#i9 zidUwJuRR;w&$;$ne&*NFU=dBOKtw+a4uLuvP~u<&`=3Ae#t>#H;s1R6`wa_6zK*5? zZTf#+JozR>^N~H*-*^6Y6e0*e*D1(w{NK-UA_@ZjzVpwxukg7k8(sI5|HmXiOUl@t zf8O~!w=bxCoz=EE(*K^b4)^5Qzwi7VG(Rp_sgf{C;lH0-6ypEu5vSVhM77;Sv)}F( zk>u_1`_13m2vakYYiIU*3FTP91T17$GZS>!F-}&)% zq_=mbCE%jp?kBJ6gWV0or<>6Bh4>)f7Dx$gO&k7MS;#07tF$*4#eCDG&UwJhf3x$7 z;~ZC>|AQN^?(opWFbDk5tqnZ-HCkDrM1CJ#O~6f={V6cb>~HJyNHk2|_XqdK1`oSh z=TEP$Jc@SwmdvFsYI=IM*M=SODlmDJ`Jp1>}Zsuh;vTmd}Sck|F_4QZbi{ADHsI#Y6^M93(*KFKA z{@b;BeguLn^vFQ8^IK1?@6T^7UyY-?crT;j#NdE#>sT9I|9e7D)q)!$`1z}Ig4JzS zXzEFEcHdhL@Amb1oOG;;ek3JOwZ!-5pwZU&v!cI7O}0}4uNKNu#($k_<;G}t(~MmPtBe4T^+CVKb}20*zM*OQxYkS z)u)@C?rp}OqFE_W1h1k$ft$KAib_-a+pYnLX>hmgs?7=BD>;WbU&(FN(D5mCKepra zKrVp;siUrx{kv=ZIWV}Og!A-}=N+9nJR?eEbba>xx7Z6v$?IXzl3pQoxJO^8@+ba1 z6fv$~SLIm&H5R=u*Kh9>t9%}6hOS=ok712hxjXPh5pX@%fuVS~zzP2vGWrHS%V#pT z5mO7iIMm#9v){zhK=z8BXCHK#|Jx=oDsaoIHrih#hg`}1D>zY?D!I=?#_>K0*iOO= ztIWTalED+=N)Vr&;HXRVnr{EcB%6}UOv^*3i7M5)5wl=fPS7M2G@%}_VEx;KHWe1S z0>+*QJ4<@0`A5T#BCN8wV0Qtn!JB30sync{5qe4I&(9>BCg1bLbf1j+zq`P;N0CnB~BbZKn=F8!G8op6(-(JoSjL*bcjFPi-h z)v3mGOq1t|f#v0?N^7;+yK9rW&JM=Vg%;z=*U6D~cj5kXU$IZ{Sq9r8s`IE^^>*3v zJXb~+OHxr&H;8> zGYs6t^VbKi{k>B~6lnIy*{mngv9cw+*nm3cPg!}K0#?EutR3W_4LfejS#W_6zoa1RV%#XX?@cK{=Dbacc8 zw}xHfxh^JMiB&6!Bqkb+L@!KYf}x?%N!VTW;x%K z#tibHUq2k~etTbZPu00t1x1&%3yfh~9ABk3x-*H&yi$C=Dwcx+#|i4U!W1~HMe-lM ze_`vq8p{$@l^VwKHJFL{&a~ggBK%%M@B(6Melm_mXvz7xen~d!3Nmhr^ifY!JHU+H z8uqll5Ht}hy@9@|8M8v5?E9aKhlc`?)zO5|q)n^Kt$4Os|HT6J{CEWIFN*-{LFQ2f zcqnp(Deg_v@8g3B$)Ih?<<{;Z1s_JxhgV#u(m04jTl_r#@;}SLL1c7C1p~7z3SRJ_tj|SJx~XvtxGQJ_(LM1`6>ikeS^W<;yZ22yEX&1C5dRe!fX6}( z{;0q3c#R9&q-a39cHt~C{aX0vx%McJq@Jcuw=;wz6~#Q;j4q#EUD)xW>uzoxgVu-< z#EF=9C-80l+diHJ>#u04jf`!Ew30KbC=>OLz=f`Q}^k)EM+)z5~GL ztBxXle|;Rb3csU{Vnnmz*QW*#E^}h4y7zl`IzN;ccGrTVQDNt$yf)m$!4mQmtX871 zkpJ1=+2Z2JUuP!lqC9(6g)EF;FzjVHLr>y7%OE}@0(-7`&DB`Kn ziHdfW4LbH06dsX{dgv8xD>@)H&|VK_6Cy(a4x+)6Kl|_0hLBj*lntgTC7!quB6>2f z+qQA2w95vZp8$TQFOn+0IrkiY}Uhp7Uw_(Nth2I0a6U4~{p9F1-Zm+k`io1&sxVZ&K@ za^jm!2ug1|c9y39ozfaxFz)7?WUhTHv3?v`&u`ZS8OC0iNLEzg_f|dc;Pu(xS~T_E zG5#E>S$BKlft!$lV&|{=TOW$81Q)Q`S&&7bl>q~zpLC@*IW>=pXvCf=ZUJ#+SFPJZ z*S*xsz|_RwwngCzzl5WH37Xd5kCUI$I>23jbMpjJxDj{cZlt8u=APO}NF)XJe2>2( zbu_`dI*;W+|1#A2^Dy{WH%fffIw|W@qn8&!kK(>J#P_f$aQK2sd?sqAc!bTtw|Hqy zPf6zNUr?}mKFh3|LD^K>sD~47AisnZjjEV=nUpJ6R#Kld-RLD`UK-hufOpdJ3oyCW zr8%L~Zh{e<>a)NjH?YvBaFoPuy&*K9d~ps#T*>~lEdeNTVH&*K#0R)bEGT2`9H}G| zipon*3#w;c<|acBX^+TxTyHPn9Pq~g#MsIB;&&Q343xr|X6RLjcCrZ7<@;5qUU{x~ z|A(@-#@kQxT5K`Zh46oZ(Kdc4X%ZC`_pW$f>v{IjnyWLS5J9yxcEWU(%1 z*b=cj6DPk;wZq6$qCQI>%kzP3EJk;3cE(c4IYyy1Z|M1PZsng`5~8bse2Vi@T!9Wd z7}3RrwG!x$_gi^U=iWEAC;f8e3U!5LyDjCTs0&H^u_A^@Rv$p255;KP{rM_y+$oKR zOkp2Tw!y?^uQVtu3c*DM>vVKJklWtGGn%BvAtuT&jJ_aJ8UlRC(1P7i?m(G&Yi^v1 ze9Y@jMd!jeY`+XNcm@?9pl&i3+OQC?C(!$|r=5x@w}<$)u%?hfztx%8{9n4`Oi{!DY`bI5Wh7zX8Yr zEBf-fs^{E8eN=J4%fOaP{1#!VNkccT6DTGaKJ=4UON5Z{K9-%pUN?vR>h=R@1vmsm zEM)VpOz>zw>o+zF?b{fMO4lvMwykAuyzACqM&2hMRH;5hzUf!!xJBzh5jFTW{A9Ai z6u=2*TI_J1e5&|@P!g`pxQhSONKBEXYKs?6?4`}`d${y5{46O`&XtA?kBoEIz7001 zsN5=dK@Dcb>_XR+<-e|$up7Jxt+_zas+&lJwBypw?Qd1>u@b?MRc>ttC{d3oVhsWw zSE$`pW>!imyU{3Ny{N|@^FG@rrhh0WjmqOoTc*y*_230y!1vBu>GZrX#n5}@iLvv z6Hvbl*nAA}yU2VidM?*bopCfCb-L7@tl9}8L-&W&pP&S`mKT232Qgi|yDBY0XB%77 zHxUHF#|GL${!{C=mjL}$e;gV<0Z_Cuet59o;hvlGySSOhl*}5aG{q%qCYd|j=5nbk zMj4UT`abh_V{L&~^c?y`GH2}h$s^`~0sA5)RZ|j>aIVy6r?cci9Liq0X58z3Vj1Yi z1hY)N&sfULnvMHE&=)G<%d}jKrnR1hJHA&=in(=`YbZ&$Kj~5BGXt_Q!kTi2K-mK+JY=$b*58 zWxcdN{fXJ<1-L}&-if%7p9F9){R(s!A9z zsdDQH4X@9%w({L*ur0bs-N>ev@FT}s-M53etf>Bpd!jqKgV0g6Mxa09^W-M)KZbiz7caFK-;4pJ4~ z!xt~T9Y!6g7+v|C_-h4vt8wNTk5p7DS!I`}1Gd)-5DL?`mFIc+607c$_&i{m>y3Tl zFLP$a93KPxKpFe`WByCZzTdFTWWl<*Qju{y`_;ufZhvk|9(wn;)LMD@g_IKr!Xrml zyq9LFshDEzQnJxcrEycs0t(YoSw6nBseTFEg9I4>K~V%#Yx{6iD(PlabUSVeF(I2( zl0Pzyzqmc;&3m{yQ?#mqF2@u9kvk5V#R<kAd*xEOqStcHA06?5FJyhUNn|)R2!cGz~Ou#DvV-jL2|??m|jJ zwthfp(mDdEv1CD&8=gUlCy@Zw3Q|^XHkvp>dl}Cf{F3jb_lL?^d{u;zg6^e;qO*c| zPn2^+%I~|-2@jmN$HxX6#s;#fJP9NPZjZzI6_l-DD*vE5b z09Hqn9pop2pkuK7;iynTWH(C8($YFnm9)=Pp$`;3e281Q(kT>(;%+!gt->E@8usx^ z3ZSwcHZnQuqJ0@Y4&uL6^7eZK^ z@5%OwM@C!AshFb3-Q?taf7rKl>rIsSyS?x`S;~EE1;T$(il1lXbi+*XK^$j0xVPHQ zQu0YE!bX>N>0A|-s4Ux!RAphYFMV6ps$OA!HM`|&c5d}J>)6k%RMpgxBkUa2O@o|AbK96?g2Jtc81sYh;px&v8qxK8yeMuk6|Us!qHJm~0WFO?QD zu2d)1mO@b-U4ars21Q?o^F0A#;!8Ut^^fKJK6uAKAA>BG7HBbU`0AXez`9S4J)-2B z6jl-m*IR9up*^VKeDXTBdl}_Ax0;IQMq3h((sMgdDJ|TFA>HeXQ0Lmodjed=R9V~y zo+%uCHT}NxN-ZVEPnQJ27qazGK0s#ZENdU{v#$XQGCLSXo@dmZDY0&+Mev?5w1P1d)r@B9G*i{vFOn080jxA7Vs`*(uidplJrbHUJ7;K_rj zbX+Ggw`lp&`~G4gDy+5(jS-k5^{{*ucB>*Aj^QygKLMKbBNeN2V#B&;5!{3y!o4*| zRC8Xjd0*~3?5>v|Z2Ys)_pZ!F6#fqXc0{$H>u7T-3;-DGpc|D&Fk2xB&nuCp>!{Gp zR;6F5Pe0*jv-$^C5uaa?Wkl;E zI0*YISdAqCH()f&^6T-`-`{mCIfVc;MJc zP@jEHO^FzX+Woa}O=)3l|8xEKnNXL#Y5bQz8 zb$O)egnw8RBgiZ;qhxCMb-D;WevAhsTys#)sRpus_oZT}(;61ps9>mApZnG;F@WBm z&yE{uO7!^?L+Zg>LjPtdLX0WU;vzJpyVsVMRk5$SCAepwUco+0ZfcVmTahXCu78D6 zk9ujm)7$+=l?mYl$R|Wng6v6RYru4PQr2mzF!KdgRSe_@UvLM3wvTZ* zig3i05tZCzrOZC>-aDlxaq0`yE#BdO@qP6-P!i995q4C>a*xVS$-9wuUZBL0(!}CY zxm{+eugEpas*9#~sDFf_M&8FT@4xThUVqU(HFLV{EFqj^t|Hl-H4ki0y^0_l1Do+( zc`@ag(rJIG@)xV{1`sLOLgoS%%Kq+R~p8kALe9$5-JGs?Q~% z&+t?KOlec6~B1mChS#L&%C+zXS-N|gO3WfAwOC2 z9}@wP9H)Za;1<+#G%@_IFO-2;K!Wpz{j~Whe1m4xF<{+E#vfmuo>7QeB9m?D-CKV< zw2%Q-Ju-Kz?4+462i$98dLZ!kZjb`t<5MZ?7PWu-+w&nhfX)$zKs*w=_OXsIr03kT zp@Mx%vd;g}Mzqn7#`6;GPVT-%0)qC-Npz(SX=$}U$~R>RSI@A1 zcPn6pOuh111?!~MP($>yHd5X0E}xwzG1mC#glC5_9z>g}{y;VK$(cdgF^@JyCrczC z6IZTPEc&^X`QOf%G2NYg9X92ZDRUc$^)%I{8vY>uy5WgBF%N73kkSNwNh?k=Yqzch zD;~zvOG0etW|8`ndi;CfGB1W5>6aLMsKHC-qvpq7wN}QmekYT!tUSNE(49ya$Jnh* zM4l)+&Ne6&g=QNfb7WnYVzSyOOgHNtExVEZS|;2K|Kd)P`RW_Kd7meEzjf4lwS!*y z{=8)-8H+2#A8%57`^{*%d0yiMwTHKKZpVRRR=03Qm|=dk?;m~+X`t$+|AVb9O0cA! z-lsyXhwgyg)e7=M8OxpZ#*Leech`D%HfCm|9LawFj6C45iYN0Mw0y0MWm%7oA|pbo zXN@bRu;wC_ZsRlVFla=WN6RKe34fmMSn&Exb09U;LX5Ls@i=g`5@Qb3e`OmF=YgyX zK0(S-Ru17ty#>TXrI1;MSVD&J$maaX{m-Do!Q1G+tiq0hXC{w3<|pV!H^fGfF!qkH z+*@Mg_B&6;1k{qDIWr;i0LXP~^HvM~!g-^6!iUNC=zIE8BRLNkEZB{zG6gYqt#@IiL?o2-*tkPYod8 zG*41rBr_c=Hy^^~fXD2|VM1J!iTK{~caSfliL5ex_r6;?9}&K$ZZ#^rK;>EQHop}8 zoiIerXrd?4x`-uHRqp(R<G+Q*d|1h$gq4XHGAi;eMgFIemPq@K0?oX*7Q7I$ z`%M-2b^2zs6>eI5HjM`{FO$*qP>}OBcJxHs4I{9~oTHCfO=ObGGJ$jHGvfWM6sb4Y zV#y;*agfI(P)744b;hYNw?F9bJBMH!bwaTFNem_>1V_+sM!(FIv(lTZ_de=6uaOTW zOFdm!`yh6iUx*-cu6Hs6d3>)4o4NB-J4EF66gVBM0gR7&B2(#c=m?iscq{YS&U>wn zCw2SmTR_k$>;gn8pSs{(h$dD9BV0vn-<`+nt9PoZDhgY`UBxFfwMDSEAsyL~$eC&#+uLdZ0_5FuC@4Ss? zcF54;Rt_D#gOPj^LxiBWi!4XW-z_)Ico(0SFLDv=I%mMz&x?nuLL2ec0N&qf zRe9d@i)&u{r<$?eM@}zVe?9;y(F%MLt0bR$<*moBtlac020*&}IeWfNsmcPuiRIF! z!wgiYm$46e3K;x$*9Q~`gq;H+!f(@{y4ev!F#)vjYRPGDw!Btu8mPqxC@RRIHrj?f z4cPJwlg@JqP(HYoZaL};O$7yJv4|Wi^ZWH#=Ff4T{C|z)?Iep{D|A{S$J_=J?sN`v z6awdMfkI@c{d}j!Y-?C%`eyl>2x*ejhhlw-H#3?5TS#yWRF2ve4%-j2(cPTD$u0GGNi%R~KQ?xQmV+|JWYMe3%d z>lRMS>cKRk{Wx9C*~>}$uTMN&GCRl+J`f+!fT*7afo#ApaW8?z_8AO0$b_Ub%K3_$ zdnVzm(6oGym^w=NaMj%Zo!5PVH9Uion+UQP2uh~|c0b)-9(>qfTX|EpMhbKj1}R6c zDyhTaf3_W@L99k@3rtcTa(-sa&! ztocuU^F_EGhx{>EUl&NHGvqxqJRvARA&T;!p9hA}pkp)5%9r6hUcqY8pr@8%An_{o zmN<^tmnNV?O&lK`Y`=JyTKOH!#tDBsT+j&yQk-u(HK00iWIjVaSL-mZY8TP8?c_g}10 z6=o&cr>56f-8LfRC;x8Cp=zoz;V75m<+6PYzz~)T^EXNIiGyyqM?{pG-4%c)p~2Lh z=Y*MnRWE6aNG`ug z_wiblj!Jbp*jbCG57*`TMyxS)1sO%eZ&+^j&}p)U#~l9*&9x58ifk9s@9TgnaU;C% zng{MLuJ)N9yRXw>xx|PdEJy>2+r0Z1pBDh7kZ{(1vQSJdnV5eEV;l{f7^nK?K$huy zmPvJUYBAQ&1?VTNPrjnA`UaGHms^|0y?qsUeh)RqA7o6G|jDGYa7P8{-iz? zMI_xNNs4SrVO%)_ABR|A9&G5i=-RU_yJNAuea&OZ>iw5hcwk;l09uw+rw^`Jgb)a4 zC{jkQu+86>>Lv?~R-)E=eU#+=u+%gfBac+{L7L&~hSS&*$1!+j6z+v`*(&zy3HC<4 zU6NWvleH!LXx{dmZ@?yo=%-_^+I0XnefD zxzb$gh-`vJ(6mP&^7GXOva(XWE7Ie`euB$pW`LTDhr#lyL3-4y3Q`QbQe7?;2^50+ zBMAWI)ywF`Bw$c17PL({fTGs5036_>iHUxG8ULw|b$eEnej@Q^q<6=s+_tpe@hTxLQx!6YzQ{#CN^VR{SE*;KV77 zhEN>h1?6Tk1AY)xfQj9qz{b`G{XX`8&9|gQ4?Vf31TuB!1V#W(upuoJX{dF_fiR{% zmI(UKThIgf@y%RVDz4XJj*2%wvFFEClJ`y{xa*OSK}QgQ4O$< z(n$Zk?{ljlqJxV6I3GOA1Wn@<(U0nB*KP}N2z$W&&F`nm)j55X*!J^NKJi>%$Sgc< zBsvNVI!S1NW`GU?x8c}d7TlM6iovN`Mjban#$mtisH>+<<5bH~LhMQKc~F(#XiO6l zlz4P|0I(^0X`qDm(T{(-Y{7(J0<|iY4p(!|25dlXV%7)VPZjjFFue+-h!C%SI?GrL+%s~(jgs^2nZUXfgI&0` zn#%-CYAL(#K|6XMdq~iA(?=`>oX{_gf2Gf+mALJ zn0e1d_~TxeRlwk$A$Q5VK?%^Yh}|cxkMD9vLGI3;3#T*|lt#Q!u)g#2+lRXb!^XhJ z|Et0%6gH}oW?^?yAafrbK=573<@fQ?M4?7{4ew}OCVwVk=?b`vhKJLp@HG^e42Ihh z042Fk^Z}eSOG`V61ETm5EEUT8+9q%Y)oj7~ZlKg;A7$emP7B?M zCt#sG#30#%#US?h!6r&pfv{Ct!HqxEj2$98@(2tLc=BTZndqL$iLWCAO%&UJwjwMM z0-6AKEjq39XXEJ*drNBxj2Ej`#>$sV@+BU>PtyZ1iwj_upWBa=pe6^#?0ho;ML2OX zx_Z75VxEIJm-XZx0=uDQhpM%#De6J#T;#!nyiQvBM>LRY&!7(h0qo-XGYr)xnFw^9 zf`gUb1%egu$HCG%0Bv0gBl@J39x)sT0aJejEU2-Pce=r&+l6tV5o8MsQlvy$2d+^ z9r0vXPwBp&G$&Fp;5^@B*p_%uln{#vP6!11TYtDF7q(yz zkmSYfp=@(DN9d6LsqQ1x!ZySZPUDoefSb+>FZBkctB=0)K6`P?n2#-_5_tdawk6e* z69Mhi^KT$Pac7EOjA`Rtfjr~4Ws^qq;8tD-TcI113F=(9@n?OD^((QKC#kH*1f^!p zG8cjR(t@V*cnh*RSSt!l!}y1~9q^|+e*O6CQ*r}L2WgQoFX`VdX@j9TeGhn*y9XwI z(2W{Z>71`3^R0wz%osVl@hex(@0LC%ArRpDqd;}T_T2gnj<@IFMBI1eoK&wFp9Uq6 zO}+)?$m0?1%wRZfLi$?0(;8L#R7D*YQUGDd0{623}iZ`63N*Q!$uSbj4SOaCjQhz92XN zlS{)AYJ@e}RW}!U0nasw4pv|U5pVBksnJ5Hgp<9_3bd)vV8IA-u!o39-M=6IPNPTk zhV~ln-wyx0`>$o44)phVzD^D4-@pHMjfP4TXh?$o`#CUJ=)U~V$2Y*5Z%7?Ng~g}S z`ZJGns(HVf4=Shl{0`RYsuLBC>$Q2cPwf4~RlI}PpxqJ`v{APdfu494@<@=IBPRT_ z`}WYmHBOF9g02WvW+Q0KdR!GQ{Ik&^mjPmFWj)`AI?X_yT+vpF(05=W@55kav*4l? zt6B0#Kt^K=DY0jA(@(G)ILw%6)fchbw{bTFLY(2C7^4p;{Bs@?@tx+tD9%7da^v>Y zM&Mq;5YUer{Dq5kY82G-sJn){~Aiq;UfA$uPlZ(U8`z!wd(N z{XOF+_>-lDMP3>)dAkMtNIZ)x;B2d#3*8g~d>)U$PjOYmB*X}6Qcfzu`_hFHkB)T9 zn1A#;%(^h=C0-SA5pmQm%WN!2+5md~^nS~3>8?B-_+lQ|s&olw|qP+J&(8_1s% zqc2RVvn5>;1Ssc1HBcrPlD-2e=CZk|JnO@*BYzNb?2mGGIhAPCSho6FdVW@A6v81U zx91CalW015rPmiaXxe007ztina?N29R~RMU!}?)HDOZbv{X`>up=9(LJ_}JLH&mPw zbjh2fB)1bHc0e-~GHVI9n2jJpQ5d@9N|s(tQfqo16Hy4V#HlwL+&O5T%08ZB(qbrw zBT61kBkXqrL$;xG(p!1eu{we|xjQLdSPVf2p9UI#oFS=!t;<7yq9c29$)E?j(|2p|1tj zoiGBf=GHTO_el�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 z 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
~wn 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 + + + + + + + + + + + + + + + {{ label }} + {{ label }} + + + {{ value }} + {{ value }} + + \ No newline at end of file diff --git a/tests/test_anybadge.py b/tests/test_anybadge.py index 82b3ec0..d4bb4f6 100644 --- a/tests/test_anybadge.py +++ b/tests/test_anybadge.py @@ -1,10 +1,28 @@ from unittest import TestCase -from anybadge import Badge +from anybadge import Badge, parse_args, main class TestAnybadge(TestCase): """Test case class for anybadge package.""" + def test_badge_equal_label_value_width(self): + """Test that label and value widths are equal when text is the same.""" + badge = Badge(label='a', value='a', num_padding_chars=0) + + self.assertEqual(badge.label_width, badge.value_width) + + def test_badge_equal_split(self): + """Test that the color split is in the middle when label and value are equal width.""" + badge = Badge(label='a', value='a') + + self.assertEqual(int(badge.badge_width / 2), badge.color_split_position) + + def test_badge_equal_split_no_padding(self): + """Test that the color split is in the middle when label and value are equal width.""" + badge = Badge(label='a', value='a', num_padding_chars=0) + + self.assertEqual(int(badge.badge_width / 2), badge.color_split_position) + def test_badge_width_with_long_value_text(self): """Test the width of a badge generated with a long text value.""" @@ -35,21 +53,21 @@ class TestAnybadge(TestCase): value='89.67%', default_color='green') - badge.write_badge('test_badge_3.svg', overwrite=True) + badge.write_badge('test_badge_medium.svg', overwrite=True) self.assertLessEqual(badge.badge_width, 138) def test_badge_width_with_medium_value_text_zero_pad(self): """Test the width of a badge generated with a medium text value.""" - badge = Badge(label='medium', + badge = Badge(label='medium no padding', value='89.67%', default_color='green', num_padding_chars=0) - badge.write_badge('test_badge_4.svg', overwrite=True) + badge.write_badge('test_badge_medium_no_padding.svg', overwrite=True) - self.assertLessEqual(badge.badge_width, 118) + self.assertLessEqual(badge.badge_width, 156) def test_badge_width_with_short_value_text(self): """Test the width of a badge generated with a short text value.""" @@ -58,21 +76,21 @@ class TestAnybadge(TestCase): value='1', default_color='green') - badge.write_badge('test_badge_5.svg', overwrite=True) + badge.write_badge('test_badge_short.svg', overwrite=True) self.assertLessEqual(badge.badge_width, 101) def test_badge_width_with_short_value_text_zero_pad(self): """Test the width of a badge generated with a short text value.""" - badge = Badge(label='short', + badge = Badge(label='short value no padding', value='1', default_color='green', num_padding_chars=0) - badge.write_badge('test_badge_6.svg', overwrite=True) + badge.write_badge('test_badge_short_no_padding.svg', overwrite=True) - self.assertLessEqual(badge.badge_width, 81) + self.assertLessEqual(badge.badge_width, 143) def test_badge_width_with_tiny_value_text(self): """Test the width of a badge generated with a short text value.""" @@ -81,7 +99,19 @@ class TestAnybadge(TestCase): value='1', default_color='green') - badge.write_badge('test_badge_7.svg', overwrite=True) + badge.write_badge('test_badge_tiny_text_value.svg', overwrite=True) + + self.assertLessEqual(badge.badge_width, 76) + + def test_badge_width_with_tiny_value_text_no_padding(self): + """Test the width of a badge generated with a short text value.""" + + badge = Badge(label='a', + value='1', + default_color='green', + num_padding_chars=0) + + badge.write_badge('test_badge_tiny_text_value_no_padding.svg', overwrite=True) self.assertLessEqual(badge.badge_width, 76) @@ -91,58 +121,169 @@ class TestAnybadge(TestCase): 2: 'red', 4: 'orange', 6: 'green', 8: 'brightgreen' } - badge = Badge('test', '2.22', value_suffix='%', + badge = Badge('thresholds', '2.22', value_suffix='%', thresholds=thresholds) - badge.write_badge('test_badge_8.svg', overwrite=True) + badge.write_badge('test_badge_thresholds.svg', overwrite=True) def test_badge_with_text_color(self): """Test generating a badge with alternate text_color.""" - badge = Badge('test', '2.22', value_suffix='%', + badge = Badge('text color', '2.22', value_suffix='%', text_color='#010101,#101010') - badge.write_badge('test_badge_9.svg', overwrite=True) + badge.write_badge('test_badge_text_color.svg', overwrite=True) def test_multiple_badges_in_one_session(self): badges = [ - Badge('something', value='100', value_suffix='%', num_padding_chars=0), - Badge('coverage', value='1234567890'), + Badge('multiple 1', value='100', value_suffix='%', num_padding_chars=0), + Badge('multiple 2', value='1234567890'), ] self.assertNotEqual(badges[0].badge_width, badges[1].badge_width) def test_multiple_badges_get_different_mask_id(self): badges = [ - Badge('something', value='100', value_suffix='%', num_padding_chars=0), - Badge('coverage', value='1234567890'), + Badge('multiple 1', value='100', value_suffix='%', num_padding_chars=0), + Badge('multiple 2', value='1234567890'), ] self.assertNotEqual(badges[0].mask_id, badges[1].mask_id) - def test_integer_value_is_handled_as_integer(self): - badge = Badge('test', value='1234') + def test_integer_str_value_is_handled_as_integer(self): + badge = Badge('integer', value='1234') self.assertTrue(badge.value_is_int) self.assertFalse(badge.value_is_float) + badge.write_badge('test_badge_int_str.svg', overwrite=True) + + def test_integer_int_value_is_handled_as_integer(self): + badge = Badge('integer', value=1234) + + self.assertTrue(badge.value_is_int) + self.assertFalse(badge.value_is_float) + badge.write_badge('test_badge_int.svg', overwrite=True) + + def test_float_str_value_is_handled_as_float(self): + badge = Badge('float str', value='1234.1') + + self.assertFalse(badge.value_is_int) + self.assertTrue(badge.value_is_float) + badge.write_badge('test_badge_float_str.svg', overwrite=True) def test_float_value_is_handled_as_float(self): - badge = Badge('test', value='1234.1') + badge = Badge('float int', value=1234.1) self.assertFalse(badge.value_is_int) self.assertTrue(badge.value_is_float) + badge.write_badge('test_badge_float.svg', overwrite=True) def test_float_value_with_zero_decimal(self): - badge = Badge('test', value='10.00') + badge = Badge('float with zeros', value='10.00') self.assertFalse(badge.value_is_int) self.assertTrue(badge.value_is_float) - badge.write_badge('test_badge_10.svg', overwrite=True) + badge.write_badge('test_badge_float_zeros.svg', overwrite=True) def test_float_value_with_non_zero_decimal(self): - badge = Badge('test', value='10.01') + badge = Badge('float str no decimal', value='10.01') self.assertFalse(badge.value_is_int) self.assertTrue(badge.value_is_float) - badge.write_badge('test_badge_11.svg', overwrite=True) + badge.write_badge('test_badge_float-str-no-decimal.svg', overwrite=True) + + def test_padding_label(self): + badge = Badge('label padding', value='10.01', num_label_padding_chars=2) + + badge.write_badge('test_badge_padding_label.svg', overwrite=True) + + def test_padding_value(self): + badge = Badge('value padding', value='10.01', num_value_padding_chars=2) + + badge.write_badge('test_badge_padding_value.svg', overwrite=True) + + def test_value_formatting(self): + badge = Badge('value formatting', value="10", value_format="%s hits/sec") + + self.assertEqual("10 hits/sec", badge.value_text) + + def test_font_name(self): + font = 'Arial, Helvetica, sans-serif' + badge = Badge('font', value=font, font_name=font) + badge.write_badge('test_badge_font.svg', overwrite=True) + + badge_repr = repr(badge) + self.assertTrue("font_name='Arial, Helvetica, sans-serif'" in badge_repr) + + def test_invalid_font_name(self): + font = 'Invalid font' + with self.assertRaises(ValueError): + _ = Badge('font', value=font, font_name=font) + + def test_font_size(self): + for size in [10, 11, 12]: + badge = Badge('font size', value=size, font_size=size) + badge.write_badge('test_badge_font_size_%s.svg' % size, overwrite=True) + + def test_font_size_repr(self): + badge = Badge('font size', value=10, font_size=10) + badge_repr = repr(badge) + self.assertTrue("font_size=10" in badge_repr) + + def test_template_from_file(self): + file = "tests/template.svg" + badge = Badge('template from file', value=file, template=file) + _ = badge.badge_svg_text + + def test_repr_svg(self): + badge = Badge('label', 'value') + self.assertEqual(badge.badge_svg_text, badge._repr_svg_()) + + def test_str_value_with_threshold_and_default(self): + badge = Badge('label', value='fred', thresholds={'pass': 'green', 'fail': 'red'}, default_color='orange') + self.assertTrue('orange', badge.badge_color) + + def test_invalid_color(self): + with self.assertRaises(ValueError): + badge = Badge('label', value='fred', default_color='floberry') + _ = badge.badge_color_code + + def test_invalid_write_path(self): + badge = Badge('label', 'value') + with self.assertRaisesRegexp(ValueError, r'File location may not be a directory\.'): + badge.write_badge('tests/') + + with self.assertRaisesRegexp(RuntimeError, r'File ".*tests\/exists\.svg" already exists\.'): + badge.write_badge('tests/exists') + badge.write_badge('tests/exists') + + def test_arg_parsing(self): + args = parse_args(['-l', 'label', '-v', 'value']) + self.assertEqual('label', args.label) + self.assertEqual('value', args.value) + + def test_main_print(self): + main(['--label', 'label', '--value', 'value']) + + def test_main_write_to_file(self): + main(['--label', 'label', '--value', 'value', '--file', 'test_badge_main.svg', '--overwrite']) + + def test_main_thresholds(self): + main([ + '--label', 'label', + '--value', 'value', + '--file', 'test_badge_main_threshold.svg', + '--overwrite', + '2=red', '4=orange']) + + def test_named_threshold(self): + main([ + '--value', 'value', + '--file', 'test_badge_main_named_threshold.svg', + '--overwrite', + 'coverage']) + + def test_main_missing_value(self): + with self.assertRaisesRegexp(ValueError, r'Label has not been set\. Please use --label argument\.'): + main(['--value', '123', '--file', 'test_badge_main.svg', '--overwrite'])