codeclimate/python-test-reporter

View on GitHub
codeclimate_test_reporter/components/ci.py

Summary

Maintainability
A
0 mins
Test Coverage
import os
import re

import itertools


class CI:
    def __init__(self, env=os.environ):
        self.env = env

    def predicate(self, service):
        return service["matcher"](self.env)

    def data(self):
        service = next(iter(filter(self.predicate, self.__services())), None)

        if service:
            return service["data"](self.env)
        else:
            return {}

    def __services(self):
        return [{
            "matcher": lambda env: env.get("TRAVIS"),
            "data": lambda env: {
                "name": "travis-ci",
                "branch": self.env.get("TRAVIS_BRANCH"),
                "build_identifier": self.env.get("TRAVIS_JOB_ID"),
                "pull_request": self.env.get("TRAVIS_PULL_REQUEST")
            }
        }, {
            "matcher": lambda env: env.get("CIRCLECI"),
            "data": lambda env: {
                "name": "circleci",
                "branch": self.env.get("CIRCLE_BRANCH"),
                "build_identifier": self.env.get("CIRCLE_BUILD_NUM"),
                "commit_sha": self.env.get("CIRCLE_SHA1")
            }
        }, {
            "matcher": lambda env: env.get("SEMAPHORE"),
            "data": lambda env: {
                "name": "semaphore",
                "branch": self.env.get("BRANCH_NAME"),
                "build_identifier": self.env.get("SEMAPHORE_BUILD_NUMBER")
            }
        }, {
            "matcher": lambda env: env.get("JENKINS_URL"),
            "data": lambda env: {
                "name": "jenkins",
                "build_identifier": self.env.get("BUILD_NUMBER"),
                "build_url": self.env.get("BUILD_URL"),
                "branch": self.env.get("GIT_BRANCH"),
                "commit_sha": self.env.get("GIT_COMMIT")
            }
        }, {
            "matcher": lambda env: env.get("TDDIUM"),
            "data": lambda env: {
                "name": "tddium",
                "build_identifier": self.env.get("TDDIUM_SESSION_ID"),
                "worker_id": self.env.get("TDDIUM_TID")
            }
        }, {
            "matcher": lambda env: env.get("WERCKER"),
            "data": lambda env: {
                "name": "wercker",
                "build_identifier": self.env.get("WERCKER_BUILD_ID"),
                "build_url": self.env.get("WERCKER_BUILD_URL"),
                "branch": self.env.get("WERCKER_GIT_BRANCH"),
                "commit_sha": self.env.get("WERCKER_GIT_COMMIT")
            }
        }, {
            "matcher": lambda env: env.get("APPVEYOR"),
            "data": lambda env: {
                "name": "appveyor",
                "build_identifier": self.env.get("APPVEYOR_BUILD_ID"),
                "build_url": self.env.get("APPVEYOR_API_URL"),
                "branch": self.env.get("APPVEYOR_REPO_BRANCH"),
                "commit_sha": self.env.get("APPVEYOR_REPO_COMMIT"),
                "pull_request": self.env.get("APPVEYOR_PULL_REQUEST_NUMBER")
            }
        }, {
            "matcher": lambda env: self.__ci_name_match("DRONE"),
            "data": lambda env: {
                "name": "drone",
                "build_identifier": self.env.get("CI_BUILD_NUMBER"),
                "build_url": self.env.get("CI_BUILD_URL"),
                "branch": self.env.get("CI_BRANCH"),
                "commit_sha": self.env.get("CI_COMMIT"),
                "pull_request": self.env.get("CI_PULL_REQUEST")
            }
        }, {
            "matcher": lambda env: self.__ci_name_match("CODESHIP"),
            "data": lambda env: {
                "name": "codeship",
                "build_identifier": self.env.get("CI_BUILD_NUMBER"),
                "build_url": self.env.get("CI_BUILD_URL"),
                "branch": self.env.get("CI_BRANCH"),
                "commit_sha": self.env.get("CI_COMMIT_ID")
            }
        }, {
            "matcher": lambda env: self.__ci_name_match("VEXOR"),
            "data": lambda env: {
                "name": "vexor",
                "build_identifier": self.env.get("CI_BUILD_NUMBER"),
                "build_url": self.env.get("CI_BUILD_URL"),
                "branch": self.env.get("CI_BRANCH"),
                "commit_sha": self.env.get("CI_BUILD_SHA"),
                "pull_request": self.env.get("CI_PULL_REQUEST_ID")
            }
        }, {
            "matcher": lambda env: env.get("BUILDKITE"),
            "data": lambda env: {
                "name": "buildkite",
                "build_identifier": self.env.get("BUILDKITE_JOB_ID"),
                "build_url": self.env.get("BUILDKITE_BUILD_URL"),
                "branch": self.env.get("BUILDKITE_BRANCH"),
                "commit_sha": self.env.get("BUILDKITE_COMMIT"),
            }
        }, {
            "matcher": lambda env: env.get("GITLAB_CI"),
            "data": lambda env: {
                "name": "gitlab-ci",
                "build_identifier": self.env.get("CI_BUILD_ID"),
                "branch": self.env.get("CI_BUILD_REF_NAME"),
                "commit_sha": self.env.get("CI_BUILD_REF"),
            }
        }]

    def __ci_name_match(self, pattern):
        ci_name = self.env.get("CI_NAME")

        return ci_name and re.match(pattern, ci_name, re.IGNORECASE)