From 3d05983d78c7cd019b531bb9d0327139ac5de02d Mon Sep 17 00:00:00 2001 From: Kyle Date: Sat, 28 Sep 2013 10:22:38 -0500 Subject: [PATCH] Build.get_downstream methods These methods do not return the proper data. Fixing them and adding a unit test for them but i'm not familar with magicmock so its having an issue. --- jenkinsapi/build.py | 44 ++++++++++++++---------- jenkinsapi_tests/unittests/test_build.py | 31 ++++++++++++++++- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/jenkinsapi/build.py b/jenkinsapi/build.py index f7670ac..9e082f1 100644 --- a/jenkinsapi/build.py +++ b/jenkinsapi/build.py @@ -28,6 +28,12 @@ class Build(JenkinsBase): self.buildno = buildno self.job = job JenkinsBase.__init__( self, url ) + + def _poll(self): + #For build's we need more information for downstream and upstream builds + #so we override the poll to get at the extra data for build objects + url = self.python_api_url(self.baseurl) + '?depth=2' + return self.get_data(url) def __str__(self): return self._data['fullDisplayName'] @@ -65,7 +71,7 @@ class Build(JenkinsBase): return [x['mercurialNodeName'] for x in self._data['actions'] if 'mercurialNodeName' in x][0] def get_duration(self): - return self._data["duration"] + return datetime.timedelta(milliseconds=self._data["duration"]) def get_artifacts( self ): for afinfo in self._data["artifacts"]: @@ -165,14 +171,10 @@ class Build(JenkinsBase): Get the downstream jobs for this build :return List of jobs or None """ - downstream_jobs_names = self.job.get_downstream_job_names() - fingerprint_data = self.get_data("%s?depth=2&tree=fingerprint[usage[name]]" % self.python_api_url(self.baseurl)) downstream_jobs = [] try: - fingerprints = fingerprint_data['fingerprint'][0] - for f in fingerprints['usage']: - if f['name'] in downstream_jobs_names: - downstream_jobs.append(self.get_jenkins_obj().get_job(f['name'])) + for job_name in self.get_downstream_job_names(): + downstream_jobs.append(self.get_jenkins_obj().get_job(job_name)) return downstream_jobs except (IndexError, KeyError): return None @@ -182,14 +184,14 @@ class Build(JenkinsBase): Get the downstream job names for this build :return List of string or None """ - downstream_jobs_names = self.job.get_downstream_job_names() - fingerprint_data = self.get_data("%s?depth=2&tree=fingerprint[usage[name]]" % self.python_api_url(self.baseurl)) + downstream_job_names = self.job.get_downstream_job_names() downstream_names = [] try: - fingerprints = fingerprint_data['fingerprint'][0] - for f in fingerprints['usage']: - if f['name'] in downstream_jobs_names: - downstream_names.append(f['name']) + fingerprints = self._data["fingerprint"] + for fingerprint in fingerprints : + for job_usage in fingerprint['usage']: + if job_usage['name'] in downstream_job_names: + downstream_names.append(job_usage['name']) return downstream_names except (IndexError, KeyError): return None @@ -199,14 +201,18 @@ class Build(JenkinsBase): Get the downstream builds for this build :return List of Build or None """ - downstream_jobs_names = self.job.get_downstream_job_names() - fingerprint_data = self.get_data("%s?depth=2&tree=fingerprint[usage[name,ranges[ranges[end,start]]]]" % self.python_api_url(self.baseurl)) + downstream_job_names = self.get_downstream_job_names() downstream_builds = [] try: - fingerprints = fingerprint_data['fingerprint'][0] - for f in fingerprints['usage']: - if f['name'] in downstream_jobs_names: - downstream_builds.append(self.get_jenkins_obj().get_job(f['name']).get_build(f['ranges']['ranges'][0]['start'])) + fingerprints = self._data["fingerprint"] + for fingerprint in fingerprints : + for job_usage in fingerprint['usage']: + if job_usage['name'] in downstream_job_names: + job = self.get_jenkins_obj().get_job(job_usage['name']) + for job_range in job_usage['ranges']['ranges']: + for build_id in range(job_range['start'], + job_range['end']): + downstream_builds.append(job.get_build(build_id)) return downstream_builds except (IndexError, KeyError): return None diff --git a/jenkinsapi_tests/unittests/test_build.py b/jenkinsapi_tests/unittests/test_build.py index 4351173..113477a 100644 --- a/jenkinsapi_tests/unittests/test_build.py +++ b/jenkinsapi_tests/unittests/test_build.py @@ -18,9 +18,21 @@ class test_build(unittest.TestCase): 'changeSet': {'items': [], 'kind': None}, 'culprits': [], 'description': None, - 'duration': 106, + "duration": 5782, 'estimatedDuration': 106, 'executor': None, + "fingerprint": [{"fileName": "BuildId.json", + "hash": "e3850a45ab64aa34c1aa66e30c1a8977", + "original": {"name": "ArtifactGenerateJob", + "number": 469}, + "timestamp": 1380270162488, + "usage": [{"name": "SingleJob", + "ranges": {"ranges": [{"end": 567, + "start": 566}]}}, + {"name": "MultipleJobs", + "ranges": {"ranges": [{"end": 150, + "start": 139}]}}] + }], 'fullDisplayName': 'foo #1', 'id': '2013-05-31_23-15-40', 'keepLog': False, @@ -49,3 +61,20 @@ class test_build(unittest.TestCase): with self.assertRaises(AttributeError): _ = self.b.id() self.assertEquals(self.b.name, 'foo #1') + + def test_duration(self): + expected = datetime.timedelta(milliseconds=5782) + self.assertEquals(self.b.get_duration(), expected) + self.assertEquals(self.b.get_duration().seconds, 5) + self.assertEquals(self.b.get_duration().microseconds, 782000) + self.assertEquals(str(self.b.get_duration()), '0:00:05.782000') + + def test_downstream(self): + expected = ['SingleJob','MultipleJobs'] + self.assertEquals(self.b.get_downstream_job_names(), expected) + +def main(): + unittest.main(verbosity=2) + +if __name__ == '__main__': + main() \ No newline at end of file -- 2.34.1