From 1a0e8c8d691342ef9e1ad2703dbf4e76e40e81bf Mon Sep 17 00:00:00 2001
From: Denis Laxalde <denis.laxalde@logilab.fr>
Date: Mon, 30 Nov 2015 09:22:47 +0100
Subject: [PATCH] Add support for "tox" builder

This builder uses the ShiningPanda plugin. It is implemented as a
"tox" builder independent of the "shining-panda" one since the latter
defines "common" arguments (such as `nature` or `command`) that do not
apply to this tox builder.

Change-Id: Ia78cf6cf5c4b5807562032fc9936e589877564df
---
 jenkins_jobs/modules/builders.py    | 26 ++++++++++++++++++++++++++
 tests/builders/fixtures/tox001.xml  |  9 +++++++++
 tests/builders/fixtures/tox001.yaml |  3 +++
 tests/builders/fixtures/tox002.xml  | 10 ++++++++++
 tests/builders/fixtures/tox002.yaml |  5 +++++
 5 files changed, 53 insertions(+)
 create mode 100644 tests/builders/fixtures/tox001.xml
 create mode 100644 tests/builders/fixtures/tox001.yaml
 create mode 100644 tests/builders/fixtures/tox002.xml
 create mode 100644 tests/builders/fixtures/tox002.yaml

diff --git a/jenkins_jobs/modules/builders.py b/jenkins_jobs/modules/builders.py
index 8efd38409..4311b5fb8 100644
--- a/jenkins_jobs/modules/builders.py
+++ b/jenkins_jobs/modules/builders.py
@@ -1947,6 +1947,32 @@ def shining_panda(parser, xml_parent, data):
     XML.SubElement(t, 'ignoreExitCode').text = str(ignore_exit_code).lower()
 
 
+def tox(parser, xml_parent, data):
+    """yaml: tox
+    Use tox to build a multi-configuration project. Requires the Jenkins
+    :jenkins-wiki:`ShiningPanda plugin <ShiningPanda+Plugin>`.
+
+    :arg str ini: The TOX configuration file path (default: tox.ini)
+    :arg bool recreate: If true, create a new environment each time (default:
+        false)
+    :arg str toxenv-pattern: The pattern used to build the TOXENV environment
+        variable. (optional)
+
+    Example:
+
+    .. literalinclude:: /../../tests/builders/fixtures/tox001.yaml
+       :language: yaml
+    """
+    pluginelement = 'jenkins.plugins.shiningpanda.builders.ToxBuilder'
+    t = XML.SubElement(xml_parent, pluginelement)
+    XML.SubElement(t, 'toxIni').text = data.get('ini', 'tox.ini')
+    XML.SubElement(t, 'recreate').text = str(
+        data.get('recreate', False)).lower()
+    pattern = data.get('toxenv-pattern')
+    if pattern:
+        XML.SubElement(t, 'toxenvPattern').text = pattern
+
+
 def managed_script(parser, xml_parent, data):
     """yaml: managed-script
     This step allows to reference and execute a centrally managed
diff --git a/tests/builders/fixtures/tox001.xml b/tests/builders/fixtures/tox001.xml
new file mode 100644
index 000000000..1456396a3
--- /dev/null
+++ b/tests/builders/fixtures/tox001.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project>
+  <builders>
+    <jenkins.plugins.shiningpanda.builders.ToxBuilder>
+      <toxIni>tox.ini</toxIni>
+      <recreate>true</recreate>
+    </jenkins.plugins.shiningpanda.builders.ToxBuilder>
+  </builders>
+</project>
diff --git a/tests/builders/fixtures/tox001.yaml b/tests/builders/fixtures/tox001.yaml
new file mode 100644
index 000000000..4dfead283
--- /dev/null
+++ b/tests/builders/fixtures/tox001.yaml
@@ -0,0 +1,3 @@
+builders:
+  - tox:
+      recreate: True
diff --git a/tests/builders/fixtures/tox002.xml b/tests/builders/fixtures/tox002.xml
new file mode 100644
index 000000000..26cb9291f
--- /dev/null
+++ b/tests/builders/fixtures/tox002.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project>
+  <builders>
+    <jenkins.plugins.shiningpanda.builders.ToxBuilder>
+      <toxIni>foo.conf</toxIni>
+      <recreate>false</recreate>
+      <toxenvPattern>TOX_ENV</toxenvPattern>
+    </jenkins.plugins.shiningpanda.builders.ToxBuilder>
+  </builders>
+</project>
diff --git a/tests/builders/fixtures/tox002.yaml b/tests/builders/fixtures/tox002.yaml
new file mode 100644
index 000000000..8376f440a
--- /dev/null
+++ b/tests/builders/fixtures/tox002.yaml
@@ -0,0 +1,5 @@
+builders:
+  - tox:
+      ini: "foo.conf"
+      toxenv-pattern: TOX_ENV
+