From 36809cf6d6d7ec8bc065f7b96e11697cd8ae00bc Mon Sep 17 00:00:00 2001 From: Michel Alexandre Salim Date: Apr 30 2020 20:33:47 +0000 Subject: [PATCH 1/5] Fix typo --- diff --git a/fedora-business-cards b/fedora-business-cards index 0fbc1ee..4aba74e 100755 --- a/fedora-business-cards +++ b/fedora-business-cards @@ -1,5 +1,5 @@ #!/usr/bin/python3 -# This file is provided as a conveinence to people using the Git repository. +# This file is provided as a convenience to people using the Git repository. # It is not included in source distributions, and it is created in binary # distributions as a setuptools entry point. from fedora_business_cards.frontend.cmdline import main From cb9217b7c4326335ec2bbed5952135b4a132d76b Mon Sep 17 00:00:00 2001 From: Michel Alexandre Salim Date: Apr 30 2020 20:33:58 +0000 Subject: [PATCH 2/5] Make generators share extra_options This method is duplicated in three places, and does exactly the same thing. Sharing makes it possible to implement the `--test` option only once. --- diff --git a/fedora_business_cards/generators/__init__.py b/fedora_business_cards/generators/__init__.py index 6d35aa6..c21a3b2 100644 --- a/fedora_business_cards/generators/__init__.py +++ b/fedora_business_cards/generators/__init__.py @@ -35,6 +35,10 @@ class BaseGenerator(object): unit = None rgb_to_cmyk = None + # These should be overridden by subclasses + _gen_name = 'base' + _gen_desc = 'Base generator' + def __init__(self, options): self.options = options self.height = options.height @@ -44,9 +48,14 @@ class BaseGenerator(object): raise KeyError(options.unit) self.unit = options.unit - @staticmethod - def extra_options(parser): - return None + @classmethod + def extra_options(cls, parser): + option_group = parser.add_parser(cls._gen_name, help=cls._gen_desc) + option_group.add_argument('-u', '--username', dest='username', + default='', help='If set, use a different name' + ' than the one logged in with to fill out' + ' business card information') + return option_group def collect_information(self): pass diff --git a/fedora_business_cards/generators/fedora-horizontal.py b/fedora_business_cards/generators/fedora-horizontal.py index 8d2036f..6ebfef8 100644 --- a/fedora_business_cards/generators/fedora-horizontal.py +++ b/fedora_business_cards/generators/fedora-horizontal.py @@ -47,6 +47,9 @@ FEDORA_LOGO_VIEWBOX = '100 100 707.776 215.080' class FedoraHorizontalGenerator(BaseGenerator): + _gen_name = 'fedora-horizontal' + _gen_desc = 'Fedora horizontal business cards' + rgb_to_cmyk = { (60, 110, 180): (1, .46, 0, 0), (41, 65, 114): (1, .57, 0, .38), @@ -54,15 +57,6 @@ class FedoraHorizontalGenerator(BaseGenerator): (255, 255, 255): (0, 0, 0, 0), } - @staticmethod - def extra_options(parser): - option_group = parser.add_parser('fedora-horizontal', help='Fedora horizontal business cards') - option_group.add_argument('-u', '--username', dest='username', - default='', help='If set, use a different name' - ' than the one logged in with to fill out' - ' business card information') - return option_group - def collect_information(self): # ask for FAS login print("Login to FAS:") diff --git a/fedora_business_cards/generators/fedora-vertical.py b/fedora_business_cards/generators/fedora-vertical.py index bb6fe63..79ad312 100644 --- a/fedora_business_cards/generators/fedora-vertical.py +++ b/fedora_business_cards/generators/fedora-vertical.py @@ -47,6 +47,9 @@ FEDORA_LOGO_VIEWBOX = '100 100 707.776 215.080' class FedoraVerticalGenerator(BaseGenerator): + _gen_name = 'fedora-vertical' + _gen_desc = 'Fedora vertical business cards' + rgb_to_cmyk = { (60, 110, 180): (1, .46, 0, 0), (41, 65, 114): (1, .57, 0, .38), @@ -54,15 +57,6 @@ class FedoraVerticalGenerator(BaseGenerator): (255, 255, 255): (0, 0, 0, 0), } - @staticmethod - def extra_options(parser): - option_group = parser.add_parser('fedora-vertical', help='Fedora vertical business cards') - option_group.add_argument('-u', '--username', dest='username', - default='', help='If set, use a different name' - ' than the one logged in with to fill out' - ' business card information') - return option_group - def collect_information(self): # ask for FAS login print("Login to FAS:") diff --git a/fedora_business_cards/generators/fedora.py b/fedora_business_cards/generators/fedora.py index c0dec30..02ed93d 100644 --- a/fedora_business_cards/generators/fedora.py +++ b/fedora_business_cards/generators/fedora.py @@ -42,6 +42,9 @@ FEDORA_LOGO_VIEWBOX = '100 100 707.776 215.080' class FedoraGenerator(BaseGenerator): + _gen_name = 'fedora' + _gen_desc = 'Fedora original horizontal business cards' + rgb_to_cmyk = { (60, 110, 180): (1, .46, 0, 0), (41, 65, 114): (1, .57, 0, .38), @@ -49,15 +52,6 @@ class FedoraGenerator(BaseGenerator): (255, 255, 255): (0, 0, 0, 0), } - @staticmethod - def extra_options(parser): - option_group = parser.add_parser('fedora', help='Fedora original horizontal business cards') - option_group.add_argument('-u', '--username', dest='username', - default='', help='If set, use a different name' - ' than the one logged in with to fill out' - ' business card information') - return option_group - def collect_information(self): # ask for FAS login print("Login to FAS:") From 0d6c97391ee25a255ab0b9fa4e707bb2ae8062f6 Mon Sep 17 00:00:00 2001 From: Michel Alexandre Salim Date: Apr 30 2020 20:39:27 +0000 Subject: [PATCH 3/5] Add `--test` option to generators --- diff --git a/fedora_business_cards/generators/__init__.py b/fedora_business_cards/generators/__init__.py index c21a3b2..0c90db6 100644 --- a/fedora_business_cards/generators/__init__.py +++ b/fedora_business_cards/generators/__init__.py @@ -55,6 +55,9 @@ class BaseGenerator(object): default='', help='If set, use a different name' ' than the one logged in with to fill out' ' business card information') + option_group.add_argument('-t', '--test', dest='test', + action='store_true', help='If set, use test data' + ' to fill out business card information') return option_group def collect_information(self): From 85ad039073ac33244320a2c8699b505a8c7ad592 Mon Sep 17 00:00:00 2001 From: Michel Alexandre Salim Date: Apr 30 2020 21:21:46 +0000 Subject: [PATCH 4/5] Move FAS lookup to a common method This allows providing dummy data in case `-t` is passed --- diff --git a/fedora_business_cards/generators/__init__.py b/fedora_business_cards/generators/__init__.py index 0c90db6..6403f1e 100644 --- a/fedora_business_cards/generators/__init__.py +++ b/fedora_business_cards/generators/__init__.py @@ -23,6 +23,10 @@ Various business card generators can be placed here (i.e., a Fedora business card layout, a Beefy Miracle business card layout). """ +from fedora.client.fas2 import AccountSystem +from getpass import getpass + +from fedora_business_cards import __version__ from fedora_business_cards import common @@ -60,6 +64,28 @@ class BaseGenerator(object): ' to fill out business card information') return option_group + def collect_fas_information(self): + if self.options.test: + return { + 'human_name': 'Jane Doe', + 'gpg_keyid': '0xGPGKEYID', + 'ircnick': 'jane_doe', + 'username': self.options.username or 'jane_doe', + } + else: + # ask for FAS login + print("Login to FAS:") + username = input("Username: ") + password = getpass() + + # get information from FAS + fas = AccountSystem(username=username, password=password, + useragent='fedora-business-cards/%s' % __version__) + if self.options.username: + username = self.options.username + return fas.person_by_username(username) + + def collect_information(self): pass diff --git a/fedora_business_cards/generators/fedora-horizontal.py b/fedora_business_cards/generators/fedora-horizontal.py index 6ebfef8..c4fa918 100644 --- a/fedora_business_cards/generators/fedora-horizontal.py +++ b/fedora_business_cards/generators/fedora-horizontal.py @@ -31,18 +31,13 @@ import string import importlib.resources as pkg_resources import argparse from decimal import Decimal -from getpass import getpass from xml.dom import minidom from builtins import input -from fedora_business_cards import __version__ from fedora_business_cards import common from fedora_business_cards.generators import BaseGenerator from fedora_business_cards import templates # relative-import the *package* containing the card templates -AccountSystem = \ - common.recursive_import('fedora.client.fas2', True).AccountSystem - FEDORA_LOGO_VIEWBOX = '100 100 707.776 215.080' @@ -58,23 +53,13 @@ class FedoraHorizontalGenerator(BaseGenerator): } def collect_information(self): - # ask for FAS login - print("Login to FAS:") - username = input("Username: ") - password = getpass() - - # get information from FAS - fas = AccountSystem(username=username, password=password, - useragent='fedora-business-cards/%s' % __version__) - if self.options.username: - username = self.options.username - userinfo = fas.person_by_username(username) + userinfo = self.collect_fas_information() # set business card fields self.fields['name'] = userinfo["human_name"] self.fields['title'] = "Fedora Project Contributor" self.fields['lines'] = [''] * 6 - self.fields['lines'][0] = '%s@fedoraproject.org' % username + self.fields['lines'][0] = '%s@fedoraproject.org' % userinfo['username'] self.fields['lines'][1] = 'fedoraproject.org' next_line = 2 if userinfo['ircnick']: diff --git a/fedora_business_cards/generators/fedora-vertical.py b/fedora_business_cards/generators/fedora-vertical.py index 79ad312..553904f 100644 --- a/fedora_business_cards/generators/fedora-vertical.py +++ b/fedora_business_cards/generators/fedora-vertical.py @@ -31,18 +31,13 @@ import string import importlib.resources as pkg_resources import argparse from decimal import Decimal -from getpass import getpass from xml.dom import minidom from builtins import input -from fedora_business_cards import __version__ from fedora_business_cards import common from fedora_business_cards.generators import BaseGenerator from fedora_business_cards import templates # relative-import the *package* containing the card templates -AccountSystem = \ - common.recursive_import('fedora.client.fas2', True).AccountSystem - FEDORA_LOGO_VIEWBOX = '100 100 707.776 215.080' @@ -58,23 +53,13 @@ class FedoraVerticalGenerator(BaseGenerator): } def collect_information(self): - # ask for FAS login - print("Login to FAS:") - username = input("Username: ") - password = getpass() - - # get information from FAS - fas = AccountSystem(username=username, password=password, - useragent='fedora-business-cards/%s' % __version__) - if self.options.username: - username = self.options.username - userinfo = fas.person_by_username(username) + userinfo = self.collect_fas_information() # set business card fields self.fields['name'] = userinfo["human_name"] self.fields['title'] = "Fedora Project Contributor" self.fields['lines'] = [''] * 5 - self.fields['lines'][0] = '%s@fedoraproject.org' % username + self.fields['lines'][0] = '%s@fedoraproject.org' % userinfo['username'] self.fields['lines'][1] = 'fedoraproject.org' next_line = 2 if userinfo['ircnick']: diff --git a/fedora_business_cards/generators/fedora.py b/fedora_business_cards/generators/fedora.py index 02ed93d..397dfe3 100644 --- a/fedora_business_cards/generators/fedora.py +++ b/fedora_business_cards/generators/fedora.py @@ -27,17 +27,12 @@ https://fedoraproject.org/wiki/Business_cards import sys import argparse from decimal import Decimal -from getpass import getpass from xml.dom import minidom from builtins import input -from fedora_business_cards import __version__ from fedora_business_cards import common from fedora_business_cards.generators import BaseGenerator -AccountSystem = \ - common.recursive_import('fedora.client.fas2', True).AccountSystem - FEDORA_LOGO_VIEWBOX = '100 100 707.776 215.080' @@ -53,17 +48,7 @@ class FedoraGenerator(BaseGenerator): } def collect_information(self): - # ask for FAS login - print("Login to FAS:") - username = input("Username: ") - password = getpass() - - # get information from FAS - fas = AccountSystem(username=username, password=password, - useragent='fedora-business-cards/%s' % __version__) - if self.options.username: - username = self.options.username - userinfo = fas.person_by_username(username) + userinfo = self.collect_fas_information() # set business card fields self.fields['name'] = userinfo["human_name"] @@ -73,7 +58,7 @@ class FedoraGenerator(BaseGenerator): else: gpg = "GPG key ID: %s" % userinfo['gpg_keyid'] self.fields['lines'] = [''] * 6 - self.fields['lines'][0] = '%s@fedoraproject.org' % username + self.fields['lines'][0] = '%s@fedoraproject.org' % userinfo['username'] self.fields['lines'][1] = 'fedoraproject.org' next_line = 2 if userinfo['ircnick']: From 3679807bea722ed065b2532264b3442c8b837f8e Mon Sep 17 00:00:00 2001 From: Michel Alexandre Salim Date: May 01 2020 01:10:30 +0000 Subject: [PATCH 5/5] Test file generation The test would iterate over possible file formats and generators, and verify that for each of them the front of the card can be written to a file and that file is non-empty. CMYK PDF is currently not working so it's not tested; also, testing for the back of the card (which a generator might or might not produce) is not added yet. --- diff --git a/README b/README index b02ea0a..8575805 100644 --- a/README +++ b/README @@ -24,6 +24,11 @@ Arturo Fernandez (Unicode fixes) Nick Bebout (Fedora card layout fixes) Michael Scherer (security fixes) Brian Exelbierd (continued maintenance) +Michel Alexandre Salim (testing) + +-- + +To test, run `python3 -m unittest discover` -- diff --git a/fedora_business_cards/generators/fedora-horizontal.py b/fedora_business_cards/generators/fedora-horizontal.py index c4fa918..f71a2a7 100644 --- a/fedora_business_cards/generators/fedora-horizontal.py +++ b/fedora_business_cards/generators/fedora-horizontal.py @@ -78,7 +78,8 @@ class FedoraHorizontalGenerator(BaseGenerator): def cmdline_card_line(data): return "| %s%s |" % (data, ' ' * (59 - len(data))) - done_editing = False + # don't prompt user to edit in test mode + done_editing = self.options.test while not done_editing: print("Current business card layout:") print(" +" + "-" * 61 + "+") diff --git a/fedora_business_cards/generators/fedora-vertical.py b/fedora_business_cards/generators/fedora-vertical.py index 553904f..12fb797 100644 --- a/fedora_business_cards/generators/fedora-vertical.py +++ b/fedora_business_cards/generators/fedora-vertical.py @@ -79,7 +79,8 @@ class FedoraVerticalGenerator(BaseGenerator): def cmdline_card_line(data): return "| %s%s |" % (data, ' ' * (35 - len(data))) - done_editing = False + # don't prompt user to edit in test mode + done_editing = self.options.test while not done_editing: print("Current business card layout:") print("Vertical cards don't hold much data ...:") diff --git a/fedora_business_cards/generators/fedora.py b/fedora_business_cards/generators/fedora.py index 397dfe3..1cbba27 100644 --- a/fedora_business_cards/generators/fedora.py +++ b/fedora_business_cards/generators/fedora.py @@ -72,7 +72,8 @@ class FedoraGenerator(BaseGenerator): def cmdline_card_line(data): return "| %s%s |" % (data, ' ' * (59 - len(data))) - done_editing = False + # don't prompt user to edit in test mode + done_editing = self.options.test while not done_editing: print("Current business card layout:") print(" +" + "-" * 61 + "+") diff --git a/fedora_business_cards/tests/__init__.py b/fedora_business_cards/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/fedora_business_cards/tests/__init__.py diff --git a/fedora_business_cards/tests/test_generators.py b/fedora_business_cards/tests/test_generators.py new file mode 100755 index 0000000..2b9e4d7 --- /dev/null +++ b/fedora_business_cards/tests/test_generators.py @@ -0,0 +1,47 @@ +#!/usr/bin/python3 + +import argparse +import decimal +import os +import tempfile +import unittest + +from .. import common +from .. import export +from .. import generators + +class TestGenerators(unittest.TestCase): + + def test_generate_output(self): + options = argparse.Namespace( + height=decimal.Decimal('2'), + width=decimal.Decimal('3.5'), + bleed=decimal.Decimal('0'), + unit='in', + dpi=300, + username='', + test=True, + ) + # cmyk_pdf currently broken + outputs = ['pdf', 'png', 'svg', 'eps'] + for genstr in generators.__all__: + module = common.recursive_import('fedora_business_cards.generators.%s' % genstr) + gen = module.generator(options) + gen.collect_information() + xml = gen.generate_front() + with tempfile.TemporaryDirectory() as tmpdirname: + for fmt in outputs: + filename = os.path.join(tmpdirname, 'front.' + fmt) + if fmt == "svg": + export.svg_to_file(xml, filename) + elif fmt == "cmyk_pdf": + export.svg_to_cmyk_pdf(xml, filename, options.height, options.width, + options.bleed, options.unit, gen.rgb_to_cmyk) + else: + export.svg_to_pdf_png(xml, filename, fmt, + options.dpi) + self.assertTrue(os.path.exists(filename), filename + " should be generated") + self.assertTrue(os.stat(filename).st_size > 0, filename + " should not be empty") + +if __name__ == '__main__': + unittest.main()