add get_causes
authorJingjing Duan <jduan@twitter.com>
Mon, 9 Jun 2014 22:02:23 +0000 (15:02 -0700)
committerJingjing Duan <jduan@twitter.com>
Mon, 9 Jun 2014 22:02:23 +0000 (15:02 -0700)
jenkinsapi/build.py
jenkinsapi_tests/unittests/test_build.py

index da04fd83b563b7c575e7e1a9182726f63254a992..a0a2d7a1a467695bc7562ffc17cfe99786206c5d 100644 (file)
@@ -361,6 +361,21 @@ class Build(JenkinsBase):
             all_actions.update(dct_action)
         return all_actions
 
+    def get_causes(self):
+        '''
+        Returns a list of causes. There can be multiple causes lists and
+        some of the can be empty. For instance, when a build is manually
+        aborted, Jenkins could add an empty causes list to the actions
+        dict. Empty ones are ignored.
+        '''
+        all_causes = []
+        for dct_action in self._data["actions"]:
+            if dct_action is None:
+                continue
+            if 'causes' in dct_action and dct_action['causes']:
+                all_causes.extend(dct_action['causes'])
+        return all_causes
+
     def get_timestamp(self):
         '''
         Returns build timestamp in UTC
index 0e67858f7f0ce9643ad2035f203aa493c1a5c03d..9223cbe2f1662cf07e42fd435d8235485b70876c 100644 (file)
@@ -15,7 +15,8 @@ class test_build(unittest.TestCase):
     DATA = {
         'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
                                  'userId': None,
-                                 'userName': 'anonymous'}]}],
+                                 'userName': 'anonymous'}]},
+                    {'causes': []}],
         'artifacts': [],
         'building': False,
         'builtOn': '',
@@ -73,6 +74,12 @@ class test_build(unittest.TestCase):
         self.assertEquals(self.b.get_duration().microseconds, 782000)
         self.assertEquals(str(self.b.get_duration()), '0:00:05.782000')
 
+    def test_get_causes(self):
+        self.assertEquals(self.b.get_causes(),
+                          [{'shortDescription': 'Started by user anonymous',
+                            'userId': None,
+                            'userName': 'anonymous'}])
+
     @mock.patch.object(Build, 'get_data')
     def test_build_depth(self, get_data_mock):
         build = Build('http://halob:8080/job/foo/98', 98, self.j, depth=0)