Make SemaphoreParser a regular class

Part of a series refactoring the configloader to make it more
maintainable.

Change-Id: Id45e3fc3df51cbadd0b1fe5b843483ae5f8ee9c7
diff --git a/zuul/configloader.py b/zuul/configloader.py
index 0a20321..89b3f74 100644
--- a/zuul/configloader.py
+++ b/zuul/configloader.py
@@ -1154,8 +1154,13 @@
 
 
 class SemaphoreParser(object):
-    @staticmethod
-    def getSchema():
+    def __init__(self, tenant, layout):
+        self.log = logging.getLogger("zuul.SemaphoreParser")
+        self.tenant = tenant
+        self.layout = layout
+        self.schema = self.getSchema()
+
+    def getSchema(self):
         semaphore = {vs.Required('name'): str,
                      'max': int,
                      '_source_context': model.SourceContext,
@@ -1164,9 +1169,8 @@
 
         return vs.Schema(semaphore)
 
-    @staticmethod
-    def fromYaml(conf):
-        SemaphoreParser.getSchema()(conf)
+    def fromYaml(self, conf):
+        self.schema(conf)
         semaphore = model.Semaphore(conf['name'], conf.get('max', 1))
         semaphore.source_context = conf.get('_source_context')
         return semaphore
@@ -1671,13 +1675,14 @@
             semaphore_layout = model.Layout(tenant)
         else:
             semaphore_layout = layout
+        semaphore_parser = SemaphoreParser(tenant, layout)
         for config_semaphore in data.semaphores:
             classes = TenantParser._getLoadClasses(
                 tenant, config_semaphore)
             if 'semaphore' not in classes:
                 continue
             with configuration_exceptions('semaphore', config_semaphore):
-                semaphore = SemaphoreParser.fromYaml(config_semaphore)
+                semaphore = semaphore_parser.fromYaml(config_semaphore)
                 semaphore_layout.addSemaphore(semaphore)
 
         project_template_parser = ProjectTemplateParser(tenant, layout)