aboutsummaryrefslogtreecommitdiffstats
path: root/resources/tools/presentation/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/tools/presentation/utils.py')
-rw-r--r--resources/tools/presentation/utils.py138
1 files changed, 136 insertions, 2 deletions
diff --git a/resources/tools/presentation/utils.py b/resources/tools/presentation/utils.py
index 7037404c27..8365bfad5c 100644
--- a/resources/tools/presentation/utils.py
+++ b/resources/tools/presentation/utils.py
@@ -14,12 +14,18 @@
"""General purpose utilities.
"""
+import subprocess
import numpy as np
+import pandas as pd
+import logging
-from os import walk
-from os.path import join
+from os import walk, makedirs, environ
+from os.path import join, isdir
+from shutil import copy, Error
from math import sqrt
+from errors import PresentationError
+
def mean(items):
"""Calculate mean value from the items.
@@ -85,6 +91,39 @@ def remove_outliers(input_data, outlier_const):
return result_lst
+def find_outliers(input_data, outlier_const=1.5):
+ """Go through the input data and generate two pandas series:
+ - input data without outliers
+ - outliers.
+ The function uses IQR to detect outliers.
+
+ :param input_data: Data to be examined for outliers.
+ :param outlier_const: Outlier constant.
+ :type input_data: pandas.Series
+ :type outlier_const: float
+ :returns: Tuple: input data with outliers removed; Outliers.
+ :rtype: tuple (trimmed_data, outliers)
+ """
+
+ upper_quartile = input_data.quantile(q=0.75)
+ lower_quartile = input_data.quantile(q=0.25)
+ iqr = (upper_quartile - lower_quartile) * outlier_const
+ low = lower_quartile - iqr
+ high = upper_quartile + iqr
+ trimmed_data = pd.Series()
+ outliers = pd.Series()
+ for item in input_data.items():
+ item_pd = pd.Series([item[1], ], index=[item[0], ])
+ if low <= item[1] <= high:
+ trimmed_data = trimmed_data.append(item_pd)
+ else:
+ trimmed_data = trimmed_data.append(pd.Series([np.nan, ],
+ index=[item[0], ]))
+ outliers = outliers.append(item_pd)
+
+ return trimmed_data, outliers
+
+
def get_files(path, extension=None, full_path=True):
"""Generates the list of files to process.
@@ -127,3 +166,98 @@ def get_rst_title_char(level):
return chars[level]
else:
return chars[-1]
+
+
+def execute_command(cmd):
+ """Execute the command in a subprocess and log the stdout and stderr.
+
+ :param cmd: Command to execute.
+ :type cmd: str
+ :returns: Return code of the executed command.
+ :rtype: int
+ """
+
+ env = environ.copy()
+ proc = subprocess.Popen(
+ [cmd],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ shell=True,
+ env=env)
+
+ stdout, stderr = proc.communicate()
+
+ logging.info(stdout)
+ logging.info(stderr)
+
+ if proc.returncode != 0:
+ logging.error(" Command execution failed.")
+ return proc.returncode, stdout, stderr
+
+
+def get_last_successful_build_number(jenkins_url, job_name):
+ """Get the number of the last successful build of the given job.
+
+ :param jenkins_url: Jenkins URL.
+ :param job_name: Job name.
+ :type jenkins_url: str
+ :type job_name: str
+ :returns: The build number as a string.
+ :rtype: str
+ """
+
+ url = "{}/{}/lastSuccessfulBuild/buildNumber".format(jenkins_url, job_name)
+ cmd = "wget -qO- {url}".format(url=url)
+
+ return execute_command(cmd)
+
+
+def get_last_completed_build_number(jenkins_url, job_name):
+ """Get the number of the last completed build of the given job.
+
+ :param jenkins_url: Jenkins URL.
+ :param job_name: Job name.
+ :type jenkins_url: str
+ :type job_name: str
+ :returns: The build number as a string.
+ :rtype: str
+ """
+
+ url = "{}/{}/lastCompletedBuild/buildNumber".format(jenkins_url, job_name)
+ cmd = "wget -qO- {url}".format(url=url)
+
+ return execute_command(cmd)
+
+
+def archive_input_data(spec):
+ """Archive the report.
+
+ :param spec: Specification read from the specification file.
+ :type spec: Specification
+ :raises PresentationError: If it is not possible to archive the input data.
+ """
+
+ logging.info(" Archiving the input data files ...")
+
+ if spec.is_debug:
+ extension = spec.debug["input-format"]
+ else:
+ extension = spec.input["file-format"]
+ data_files = get_files(spec.environment["paths"]["DIR[WORKING,DATA]"],
+ extension=extension)
+ dst = spec.environment["paths"]["DIR[STATIC,ARCH]"]
+ logging.info(" Destination: {0}".format(dst))
+
+ try:
+ if not isdir(dst):
+ makedirs(dst)
+
+ for data_file in data_files:
+ logging.info(" Copying the file: {0} ...".format(data_file))
+ copy(data_file, dst)
+
+ except (Error, OSError) as err:
+ raise PresentationError("Not possible to archive the input data.",
+ str(err))
+
+ logging.info(" Done.")