Add support to create Jenkins object without immediately polling jobs.
authorJoao Vale <jpvale@gmail.com>
Wed, 12 Mar 2014 17:39:41 +0000 (17:39 +0000)
committerAleksey Maksimov <ctpeko3a@gmail.com>
Sun, 30 Mar 2014 08:50:38 +0000 (16:50 +0800)
jenkinsapi/jenkins.py
jenkinsapi_tests/unittests/test_jenkins.py

index 01fbf073b5341b2367e980692013f4af48790ba7..823db74bd9fa6b6bb0b3188f5656307df39c3b14 100644 (file)
@@ -30,7 +30,7 @@ class Jenkins(JenkinsBase):
     """
     Represents a jenkins environment.
     """
-    def __init__(self, baseurl, username=None, password=None, requester=None):
+    def __init__(self, baseurl, username=None, password=None, requester=None, lazy=False):
         """
         :param baseurl: baseurl for jenkins instance including port, str
         :param username: username for jenkins auth, str
@@ -40,7 +40,12 @@ class Jenkins(JenkinsBase):
         self.username = username
         self.password = password
         self.requester = requester or Requester(username, password, baseurl=baseurl)
-        JenkinsBase.__init__(self, baseurl)
+        self.lazy = lazy
+        JenkinsBase.__init__(self, baseurl, poll=not lazy)
+
+    def _poll_if_needed(self):
+        if self.lazy and self._data is None:
+            self.poll()
 
     def _clone(self):
         return Jenkins(self.baseurl, username=self.username,
@@ -92,6 +97,7 @@ class Jenkins(JenkinsBase):
         """
         Fetch all the build-names on this Jenkins server.
         """
+        self._poll_if_needed()
         for info in self._data["jobs"]:
             yield info["name"], \
                 Job(info["url"], info["name"], jenkins_obj=self)
@@ -101,6 +107,7 @@ class Jenkins(JenkinsBase):
         Get the jobs information
         :return url, name
         """
+        self._poll_if_needed()
         for info in self._data["jobs"]:
             yield info["url"], info["name"]
 
@@ -159,6 +166,7 @@ class Jenkins(JenkinsBase):
         return self.jobs.rename(jobname, newjobname)
 
     def iterkeys(self):
+        self._poll_if_needed()
         for info in self._data["jobs"]:
             yield info["name"]
 
@@ -205,12 +213,15 @@ class Jenkins(JenkinsBase):
         :param jobname: name of job, str
         :return: Job obj
         """
+        self._poll_if_needed()
+
         for info in self._data["jobs"]:
             if info["name"] == jobname:
                 return Job(info["url"], info["name"], jenkins_obj=self)
         raise UnknownJob(jobname)
 
     def __len__(self):
+        self._poll_if_needed()
         return len(self._data["jobs"])
 
     def __contains__(self, jobname):
index fa39055bea3bc3af503a6828676225e9d5bcaaac..07634cedb7b0f42d15c4355e1a41f436f260df0b 100644 (file)
@@ -57,6 +57,29 @@ class TestJenkins(unittest.TestCase):
             self.assertEquals(job.name, _poll.return_value['jobs'][idx]['name'])
             self.assertEquals(job.baseurl, _poll.return_value['jobs'][idx]['url'])
 
+    @mock.patch.object(JenkinsBase, '_poll')
+    @mock.patch.object(Jenkins, '_poll')
+    @mock.patch.object(Job, '_poll')
+    def test_lazy_loading(self, _base_poll, _poll, _job_poll):
+        _poll.return_value = {
+            'jobs': [
+                {'name': 'job_one', 'url': 'http://localhost:8080/job_one', 'color': 'blue'},
+                {'name': 'job_two', 'url': 'http://localhost:8080/job_two', 'color': 'blue'},
+            ]
+        }
+        _base_poll.return_value = _poll.return_value
+        _job_poll.return_value = {}
+        J = Jenkins('http://localhost:8080/',
+                    username='foouser', password='foopassword', lazy=True)
+
+        self.assertEquals(J._data, None)
+
+        for idx, (job_name, job) in enumerate(J.get_jobs()):
+            self.assertEquals(job_name, _poll.return_value['jobs'][idx]['name'])
+            self.assertTrue(isinstance(job, Job))
+            self.assertEquals(job.name, _poll.return_value['jobs'][idx]['name'])
+            self.assertEquals(job.baseurl, _poll.return_value['jobs'][idx]['url'])
+
     @mock.patch.object(JenkinsBase, '_poll')
     @mock.patch.object(Jenkins, '_poll')
     @mock.patch.object(Job, '_poll')