← Back to team overview

checkbox-dev team mailing list archive

[PATCH 1/2] plainbox: add gettext_domain to providers

 

This patch adds an optional gettext_domain attribute to
Provider1Defintion, Provider1 and IProvider1

Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@xxxxxxxxxxxxx>
---
 plainbox/docs/changelog.rst                        |  4 ++++
 plainbox/plainbox/abc.py                           |  9 +++++++++
 plainbox/plainbox/impl/providers/v1.py             |  4 ++++
 plainbox/plainbox/impl/secure/providers/test_v1.py | 13 +++++++++++--
 plainbox/plainbox/impl/secure/providers/v1.py      | 22 ++++++++++++++++++++--
 plainbox/plainbox/provider_manager.py              |  3 ++-
 plainbox/plainbox/test_provider_manager.py         |  5 +++++
 7 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/plainbox/docs/changelog.rst b/plainbox/docs/changelog.rst
index b295590..7d4a8ab 100644
--- a/plainbox/docs/changelog.rst
+++ b/plainbox/docs/changelog.rst
@@ -77,6 +77,10 @@ API changes (Providers)
   internally by the class itself. Identical functionality is now offered by
   :class:`plainbox.impl.secure.plugins.FsPlugInCollection` and
   :class:`plainbox.impl.secure.providers.v1.JobDefinitionPlugIn`.
+* PlainBox now associates a gettext domain with each provider. This
+  information is available both in
+  :attr:`plainbox.impl.secure.providers.v1.Provider1Definition.gettext_domain`
+  and :attr:`plainbox.impl.secure.providers.v1.Provider1.gettext_domain`
 
 API changes (Qualifiers)
 ........................
diff --git a/plainbox/plainbox/abc.py b/plainbox/plainbox/abc.py
index 7224e28..dbb29ed 100644
--- a/plainbox/plainbox/abc.py
+++ b/plainbox/plainbox/abc.py
@@ -444,6 +444,15 @@ class IProvider1(metaclass=ABCMeta):
         This name should be dbus-friendly. It should not be localizable.
         """
 
+    @abstractproperty
+    def gettext_domain(self):
+        """
+        the name of the gettext domain associated with this provider
+
+        This value may be empty, in such case provider data cannot be localized
+        for the user environment.
+        """
+
     @abstractmethod
     def get_builtin_jobs(self):
         """
diff --git a/plainbox/plainbox/impl/providers/v1.py b/plainbox/plainbox/impl/providers/v1.py
index e7998f3..930e538 100644
--- a/plainbox/plainbox/impl/providers/v1.py
+++ b/plainbox/plainbox/impl/providers/v1.py
@@ -74,6 +74,10 @@ class DummyProvider1(IProvider1, IProviderBackend1):
             'description', "A dummy provider useful for testing")
 
     @property
+    def gettext_domain(self):
+        return self._extras.get('gettext_domain', "")
+
+    @property
     def CHECKBOX_SHARE(self):
         return self._extras.get('CHECKBOX_SHARE', "")
 
diff --git a/plainbox/plainbox/impl/secure/providers/test_v1.py b/plainbox/plainbox/impl/secure/providers/test_v1.py
index f9f9a49..66e1323 100644
--- a/plainbox/plainbox/impl/secure/providers/test_v1.py
+++ b/plainbox/plainbox/impl/secure/providers/test_v1.py
@@ -129,7 +129,8 @@ class Provider1DefinitionTests(TestCase):
         "location = /some/directory/\n"
         "name = 2013.org.example:smoke-test\n"
         "version = 1.0\n"
-        "description = A provider for smoke testing\n")
+        "description = A provider for smoke testing\n"
+        "gettext_domain = plainbox\n")
 
     def setUp(self):
         self.definition = Provider1Definition()
@@ -144,6 +145,7 @@ class Provider1DefinitionTests(TestCase):
         self.assertEqual(self.definition.version, "1.0")
         self.assertEqual(
             self.definition.description, "A provider for smoke testing")
+        self.assertEqual(self.definition.gettext_domain, "plainbox")
 
 
 class Provider1PlugInTests(TestCase):
@@ -455,11 +457,12 @@ class Provider1Tests(TestCase):
     VERSION = "1.0"
     DESCRIPTION = "description"
     SECURE = True
+    GETTEXT_DOMAIN = "domain"
 
     def setUp(self):
         self.provider = Provider1(
             self.BASE_DIR, self.NAME, self.VERSION, self.DESCRIPTION,
-            self.SECURE)
+            self.SECURE, self.GETTEXT_DOMAIN)
 
     def test_repr(self):
         self.assertEqual(
@@ -526,6 +529,12 @@ class Provider1Tests(TestCase):
         """
         self.assertEqual(self.provider.secure, self.SECURE)
 
+    def test_gettext_domain(self):
+        """
+        Verify that Provider1.gettext_domain attribute is set correctly
+        """
+        self.assertEqual(self.provider.gettext_domain, self.GETTEXT_DOMAIN)
+
     def test_get_builtin_whitelists__normal(self):
         """
         verify that Provider1.get_builtin_whitelist() loads and returns all of
diff --git a/plainbox/plainbox/impl/secure/providers/v1.py b/plainbox/plainbox/impl/secure/providers/v1.py
index 8ac53a5..f980643 100644
--- a/plainbox/plainbox/impl/secure/providers/v1.py
+++ b/plainbox/plainbox/impl/secure/providers/v1.py
@@ -126,7 +126,8 @@ class Provider1(IProvider1, IProviderBackend1):
     location for all other data.
     """
 
-    def __init__(self, base_dir, name, version, description, secure):
+    def __init__(self, base_dir, name, version, description, secure,
+                 gettext_domain=None):
         """
         Initialize the provider with the associated base directory.
 
@@ -140,6 +141,7 @@ class Provider1(IProvider1, IProviderBackend1):
         self._version = version
         self._description = description
         self._secure = secure
+        self._gettext_domain = gettext_domain
         self._whitelist_collection = FsPlugInCollection(
             [self.whitelists_dir], ext=".whitelist", wrapper=WhiteListPlugIn)
         self._job_collection = FsPlugInCollection(
@@ -239,6 +241,16 @@ class Provider1(IProvider1, IProviderBackend1):
         """
         return self._secure
 
+    @property
+    def gettext_domain(self):
+        """
+        the name of the gettext domain associated with this provider
+
+        This value may be empty, in such case provider data cannot be localized
+        for the user environment.
+        """
+        return self._gettext_domain
+
     def get_builtin_whitelists(self):
         """
         Load all the whitelists from :attr:`whitelists_dir` and return them
@@ -438,6 +450,11 @@ class Provider1Definition(Config):
         section='PlainBox Provider',
         help_text="Description of the provider")
 
+    gettext_domain = Variable(
+        section='PlainBox Provider',
+        default="",
+        help_text="Name of the gettext domain for translations")
+
 
 class Provider1PlugIn(IPlugIn):
     """
@@ -465,7 +482,8 @@ class Provider1PlugIn(IPlugIn):
             definition.name,
             definition.version,
             definition.description,
-            secure=os.path.dirname(filename) in get_secure_PROVIDERPATH_list())
+            secure=os.path.dirname(filename) in get_secure_PROVIDERPATH_list(),
+            gettext_domain=definition.gettext_domain)
 
     def __repr__(self):
         return "<{!s} plugin_name:{!r}>".format(
diff --git a/plainbox/plainbox/provider_manager.py b/plainbox/plainbox/provider_manager.py
index d6fda12..4db31d7 100644
--- a/plainbox/plainbox/provider_manager.py
+++ b/plainbox/plainbox/provider_manager.py
@@ -82,7 +82,7 @@ class ManageCommand(CommandBase):
         return Provider1(
             self.definition.location, self.definition.name,
             self.definition.version, self.definition.description,
-            secure=False)
+            secure=False, gettext_domain=self.definition.gettext_domain)
 
 
 class InstallCommand(ManageCommand):
@@ -337,6 +337,7 @@ class InfoCommand(ManageCommand):
         print("[Provider MetaData]")
         print("\tname: {}".format(provider.name))
         print("\tversion: {}".format(provider.version))
+        print("\tgettext_domain: {}".format(provider.gettext_domain))
         print("[Job Definitions]")
         job_list, problem_list = provider.load_all_jobs()
         for job in job_list:
diff --git a/plainbox/plainbox/test_provider_manager.py b/plainbox/plainbox/test_provider_manager.py
index a7a8fff..2a0bbfa 100644
--- a/plainbox/plainbox/test_provider_manager.py
+++ b/plainbox/plainbox/test_provider_manager.py
@@ -86,6 +86,7 @@ class ProviderManagerToolTests(TestCase):
         content = (
             "[PlainBox Provider]\n"
             "description = description\n"
+            "gettext_domain = domain\n"
             "location = /foo/lib/plainbox-providers-1/2014.com.example.test\n"
             "name = 2014.com.example:test\n"
             "version = 1.0\n"
@@ -180,6 +181,7 @@ class ProviderManagerToolTests(TestCase):
         content = (
             "[PlainBox Provider]\n"
             "description = description\n"
+            "gettext_domain = domain\n"
             "location = {}\n"
             "name = 2014.com.example:test\n"
             "version = 1.0\n"
@@ -200,6 +202,7 @@ class ProviderManagerToolTests(TestCase):
         content = (
             "[PlainBox Provider]\n"
             "description = description\n"
+            "gettext_domain = domain\n"
             "location = {}\n"
             "name = 2014.com.example:test\n"
             "version = 1.0\n"
@@ -294,6 +297,7 @@ class ProviderManagerToolTests(TestCase):
             "[Provider MetaData]\n"
             "\tname: 2014.com.example:test\n"
             "\tversion: 1.0\n"
+            "\tgettext_domain: domain\n"
             "[Job Definitions]\n"
             "\t'dummy', from jobs/jobs.txt:1-3\n"
             "[White Lists]\n"
@@ -330,6 +334,7 @@ class ProviderManagerToolTests(TestCase):
         definition.name = "2014.com.example:test"
         definition.version = "1.0"
         definition.description = "description"
+        definition.gettext_domain = "domain"
         return definition
 
     def tearDown(self):
-- 
1.9.rc1



Follow ups