Пример #1
0
    def test_save_compatibility_statuses_self(self):
        packages = [PACKAGE_1]
        status = compatibility_store.Status.SUCCESS
        comp_status = compatibility_store.CompatibilityResult(
            packages=packages,
            python_major_version='3',
            status=status,
            details=None,
            dependency_info=None,
            timestamp=None)
        row_self = ('package1', 'SUCCESS', '3', None, None)

        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)

        self_sql = 'REPLACE INTO self_compatibility_status values ' \
                    '(%s, %s, %s, %s, %s)'

        with patch_pymysql:
            store = compatibility_store.CompatibilityStore()
            store.save_compatibility_statuses([comp_status])

        mock_cursor.executemany.assert_called_with(self_sql, [row_self])
    def test_get_pair_compatibility(self):
        mock_client = mock.Mock()

        def MockClient(project=None):
            return mock_client

        row = mock.Mock(status='SUCCESS',
                        py_version='3',
                        timestamp='2018-07-17 02:14:27.15768 UTC',
                        details=None)
        mock_client.query.return_value = [row]

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()

        patch_bigquery = mock.patch(
            'compatibility_lib.compatibility_store.bigquery', MockBigquery)
        packages = [PACKAGE_1, PACKAGE_2]

        with patch_bigquery:
            res = store.get_pair_compatibility(packages)

        self.assertEqual(len(res), 1)
        self.assertEqual(len(res[0].packages), 2)
        self.assertTrue(
            isinstance(res[0], compatibility_store.CompatibilityResult))
Пример #3
0
    def test_compatibility_combinations(self):
        row1 = ('package1', 'package2', 'SUCCESS', '3',
                '2018-07-17 02:14:27.15768 UTC', None)
        row2 = ('package1', 'package3', 'SUCCESS', '3',
                '2018-07-17 02:14:27.15768 UTC', None)
        row3 = ('package2', 'package3', 'SUCCESS', '3',
                '2018-07-17 02:14:27.15768 UTC', None)
        store = compatibility_store.CompatibilityStore()

        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        mock_cursor.fetchall.return_value = [row1, row2, row3]

        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)
        packages = [PACKAGE_1, PACKAGE_2, PACKAGE_3]

        with patch_pymysql:
            res = store.get_compatibility_combinations(packages)

        expected_pair_1 = frozenset({PACKAGE_1, PACKAGE_2})
        expected_pair_2 = frozenset({PACKAGE_1, PACKAGE_3})
        expected_pair_3 = frozenset({PACKAGE_2, PACKAGE_3})

        self.assertEqual(len(res.keys()), 3)
        self.assertEqual(
            frozenset(res.keys()),
            frozenset({expected_pair_1, expected_pair_2, expected_pair_3}))
    def test_get_self_compatibilities(self):
        mock_client = mock.Mock()

        def MockClient(project=None):
            return mock_client

        packages = [PACKAGE_1, PACKAGE_2, PACKAGE_3, PACKAGE_4]
        rows = []
        for pkg in packages:
            row = mock.Mock(install_name=pkg.install_name,
                            status='SUCCESS',
                            py_version='3',
                            timestamp='2018-07-17 01:07:08.936648 UTC',
                            details=None)
            rows.append(row)

        mock_client.query.return_value = rows

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()

        patch_bigquery = mock.patch(
            'compatibility_lib.compatibility_store.bigquery', MockBigquery)

        with patch_bigquery:
            res = store.get_self_compatibilities(packages)

        self.assertEqual(len(res), 4)
        self.assertEqual(frozenset(res.keys()), frozenset(packages))
    def test_get_self_compatibility(self):
        mock_client = mock.Mock()

        def MockClient(project=None):
            return mock_client

        row = mock.Mock(install_name=PACKAGE_1.install_name,
                        status='SUCCESS',
                        py_version='3',
                        timestamp='2018-07-17 01:07:08.936648 UTC',
                        details=None)

        mock_client.query.return_value = [row]
        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()

        patch_bigquery = mock.patch(
            'compatibility_lib.compatibility_store.bigquery', MockBigquery)

        with patch_bigquery:
            res = store.get_self_compatibility(PACKAGE_1)

        self.assertEqual(len(res), 1)
        self.assertTrue(
            isinstance(res[0], compatibility_store.CompatibilityResult))
def main():
    parser = argparse.ArgumentParser(
        description='Display a grid show the dependency compatibility ' +
        'between Python packages')
    parser.add_argument('--packages',
                        nargs='+',
                        default=_DEFAULT_INSTALL_NAMES,
                        help='the packages to display compatibility ' +
                        'information for')
    parser.add_argument('--browser',
                        action='store_true',
                        default=False,
                        help='display the grid in a browser tab')

    args = parser.parse_args()

    store = compatibility_store.CompatibilityStore()
    grid_builder = GridBuilder(store)
    grid_html = grid_builder.build_grid(
        (package.Package(install_name) for install_name in args.packages))

    if args.browser:
        _, grid_path = tempfile.mkstemp(suffix='.html')
        with open(grid_path, 'wt') as f:
            f.write(grid_html)
        webbrowser.open_new_tab('file://' + grid_path)
    else:
        print(grid_html, end='')
    def test_constructor(self):
        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        expected__self_table_id = 'compatibility_checker.self_compatibility_status'
        expected__pairwise_table_id = 'compatibility_checker.pairwise_compatibility_status'
        expected__release_time_table_id = 'compatibility_checker.release_time_for_dependencies'

        with patch_client:
            store = compatibility_store.CompatibilityStore()

        self.assertEqual(store._self_table_id, expected__self_table_id)
        self.assertEqual(store._pairwise_table_id, expected__pairwise_table_id)
        self.assertEqual(store._release_time_table_id,
                         expected__release_time_table_id)

        self.assertEqual(
            store._self_table,
            compatibility_store._SELF_COMPATIBILITY_STATUS_TABLE_NAME)
        self.assertEqual(
            store._pairwise_table,
            compatibility_store._PAIRWISE_COMPATIBILITY_STATUS_TABLE_NAME)
        self.assertEqual(
            store._release_time_table,
            compatibility_store._RELEASE_TIME_FOR_DEPENDENCIES_TABLE_NAME)
    def test_save_compatibility_statuses_self(self):
        mock_client = mock.Mock()
        packages = [PACKAGE_1]
        timestamp = '2018-07-17 03:01:06.11693 UTC'
        status = compatibility_store.Status.SUCCESS
        comp_status = mock.Mock(packages=packages,
                                python_major_version='3',
                                status=status,
                                details=None,
                                dependency_info=None,
                                timestamp=timestamp)
        row_self = {
            'install_name': 'package1',
            'status': 'SUCCESS',
            'py_version': '3',
            'timestamp': timestamp,
            'details': None,
        }

        def MockClient(project=None):
            return mock_client

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()
            store.save_compatibility_statuses([comp_status])

        mock_client.insert_rows.assert_called_with(store._self_table,
                                                   [row_self])
Пример #9
0
    def test_save_compatibility_statuses_release_time_for_latest(self):
        mock_client = mock.Mock()
        packages = [PACKAGE_4]
        timestamp = '2018-07-17 03:01:06.11693 UTC'
        status = compatibility_store.Status.SUCCESS
        comp_status_py2 = mock.Mock(
            packages=packages,
            python_major_version='2',
            status=status,
            details=None,
            dependency_info={'package4': {
                'installed_version': '2.7.0',
                'installed_version_time': '2018-05-12T16:26:31',
                'latest_version': '2.7.0',
                'current_time': '2018-07-13T17:11:29.140608',
                'latest_version_time': '2018-05-12T16:26:31',
                'is_latest': True,
            }},
            timestamp=timestamp)
        comp_status_py3 = mock.Mock(
            packages=packages,
            python_major_version='3',
            status=status,
            details=None,
            dependency_info={'package4': {
                'installed_version': '2.2.0',
                'installed_version_time': '2018-05-12T16:26:31',
                'latest_version': '2.7.0',
                'current_time': '2018-07-13T17:11:29.140608',
                'latest_version_time': '2018-05-12T16:26:31',
                'is_latest': False,
            }},
            timestamp=timestamp)
        row_release_time = {
            'install_name': 'package4[gcp]',
            'dep_name': 'package4',
            'installed_version': '2.7.0',
            'installed_version_time': '2018-05-12T16:26:31',
            'latest_version': '2.7.0',
            'timestamp': '2018-07-13T17:11:29.140608',
            'latest_version_time': '2018-05-12T16:26:31',
            'is_latest': True,
        }

        def MockClient(project=None):
            return mock_client

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()
            store.save_compatibility_statuses(
                [comp_status_py2, comp_status_py3])

        mock_client.insert_rows.assert_called_with(
            store._release_time_table, [row_release_time])
Пример #10
0
    def test_save_compatibility_statuses_release_time_for_latest(self):
        packages = [PACKAGE_4]
        timestamp = '2018-07-17 03:01:06.11693 UTC'
        status = compatibility_store.Status.SUCCESS
        comp_status_py2 = compatibility_store.CompatibilityResult(
            packages=packages,
            python_major_version='2',
            status=status,
            details=None,
            dependency_info={
                'package4': {
                    'installed_version': '12.7.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '12.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': True,
                }
            },
            timestamp=timestamp)
        comp_status_py3 = compatibility_store.CompatibilityResult(
            packages=packages,
            python_major_version='3',
            status=status,
            details=None,
            dependency_info={
                'package4': {
                    'installed_version': '2.2.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                }
            },
            timestamp=timestamp)
        row_release_time = ('package4[gcp]', 'package4', '12.7.0',
                            '2018-05-12T16:26:31', '12.7.0',
                            '2018-05-12T16:26:31', True,
                            '2018-07-13T17:11:29.140608')

        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)
        sql = 'REPLACE INTO release_time_for_dependencies values ' \
              '(%s, %s, %s, %s, %s, %s, %s, %s)'

        with patch_pymysql:
            store = compatibility_store.CompatibilityStore()
            store.save_compatibility_statuses(
                [comp_status_py2, comp_status_py3])

        mock_cursor.executemany.assert_called_with(sql, [row_release_time])
Пример #11
0
def main():
    parser = argparse.ArgumentParser(
        description='Display a grid show the dependency compatibility ' +
        'between Python packages')
    parser.add_argument('--packages',
                        nargs='+',
                        default=_DEFAULT_INSTALL_NAMES,
                        help='the packages to display compatibility ' +
                        'information for')
    parser.add_argument('--browser',
                        action='store_true',
                        default=False,
                        help='display the grid in a browser tab')

    args = parser.parse_args()

    checker = compatibility_checker.CompatibilityChecker()
    store = compatibility_store.CompatibilityStore()

    packages = [
        package.Package(install_name) for install_name in args.packages
    ]
    logging.info("Getting self compatibility results...")
    package_to_results = store.get_self_compatibilities(packages)
    logging.info("Getting pairwise compatibility results...")
    pairwise_to_results = store.get_compatibility_combinations(packages)

    package_with_dependency_info = {}
    for pkg in configs.PKG_LIST:
        dep_info = store.get_dependency_info(pkg)
        package_with_dependency_info[pkg] = dep_info

    results = _ResultHolder(package_to_results, pairwise_to_results,
                            package_with_dependency_info, checker, store)

    dashboard_builder = DashboardBuilder(packages, results)

    # Build the pairwise grid dashboard
    logging.info('Starting build the grid...')
    grid_html = dashboard_builder.build_dashboard(
        'dashboard/grid-template.html')
    grid_path = os.path.dirname(os.path.abspath(__file__)) + '/grid.html'
    with open(grid_path, 'wt') as f:
        f.write(grid_html)

    # Build the dashboard main page
    logging.info('Starting build the main dashboard...')
    main_html = dashboard_builder.build_dashboard(
        'dashboard/main-template.html')

    main_path = os.path.dirname(os.path.abspath(__file__)) + '/index.html'
    with open(main_path, 'wt') as f:
        f.write(main_html)

    if args.browser:
        webbrowser.open_new_tab('file://' + main_path)
Пример #12
0
    def test_compatibility_combinations(self):
        mock_client = mock.Mock()

        def MockClient(project=None):
            return mock_client

        row1 = mock.Mock(
            install_name_lower='package1',
            install_name_higher='package2',
            status='SUCCESS',
            py_version='3',
            timestamp='2018-07-17 02:14:27.15768 UTC',
            details=None)
        row2 = mock.Mock(
            install_name_lower='package1',
            install_name_higher='package3',
            status='SUCCESS',
            py_version='3',
            timestamp='2018-07-17 02:14:27.15768 UTC',
            details=None)
        row3 = mock.Mock(
            install_name_lower='package2',
            install_name_higher='package3',
            status='SUCCESS',
            py_version='3',
            timestamp='2018-07-17 02:14:27.15768 UTC',
            details=None)
        mock_client.query.return_value = [row1, row2, row3]

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()

        patch_bigquery = mock.patch(
            'compatibility_lib.compatibility_store.bigquery', MockBigquery)
        packages = [PACKAGE_1, PACKAGE_2, PACKAGE_3]

        with patch_bigquery:
            res = store.get_compatibility_combinations(packages)

        expected_pair_1 = frozenset({PACKAGE_1, PACKAGE_2})
        expected_pair_2 = frozenset({PACKAGE_1, PACKAGE_3})
        expected_pair_3 = frozenset({PACKAGE_2, PACKAGE_3})

        self.assertEqual(len(res.keys()), 3)
        self.assertEqual(
            frozenset(res.keys()),
            frozenset({expected_pair_1, expected_pair_2, expected_pair_3}))
Пример #13
0
    def test_get_pair_compatibility_value_error(self):
        # get_pair_compatibility needs 2 packages to run the check, or it will
        # raise ValueError.
        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        store = compatibility_store.CompatibilityStore()

        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)
        packages = [PACKAGE_1]
        with patch_pymysql, self.assertRaises(ValueError):
            store.get_pair_compatibility(packages)
    def test_get_pair_compatibility_value_error(self):
        # get_pair_compatibility needs 2 packages to run the check, or it will
        # raise ValueError.
        mock_client = mock.Mock()

        def MockClient(project=None):
            return mock_client

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()

        packages = [PACKAGE_1]
        with self.assertRaises(ValueError):
            store.get_pair_compatibility(packages)
Пример #15
0
    def test_get_self_compatibility(self):
        row = (PACKAGE_1.install_name, 'SUCCESS', '3',
               '2018-07-17 01:07:08.936648 UTC', None)

        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        mock_cursor.fetchall.return_value = [row]
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)

        store = compatibility_store.CompatibilityStore()
        with patch_pymysql:
            res = store.get_self_compatibility(PACKAGE_1)

        self.assertEqual(len(res), 1)
        self.assertTrue(
            isinstance(res[0], compatibility_store.CompatibilityResult))
Пример #16
0
    def test_get_pair_compatibility(self):
        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        row = ('pkg1', 'pkg2', 'SUCCESS', '3', '2018-07-17 02:14:27.15768 UTC',
               None)
        mock_cursor.fetchall.return_value = [row]
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)
        store = compatibility_store.CompatibilityStore()
        packages = [PACKAGE_1, PACKAGE_2]

        with patch_pymysql:
            res = store.get_pair_compatibility(packages)

        self.assertEqual(len(res), 1)
        self.assertEqual(len(res[0].packages), 2)
        self.assertTrue(
            isinstance(res[0], compatibility_store.CompatibilityResult))
Пример #17
0
    def test_get_packages(self):
        pkgs = ['google-api-core', 'apache-beam']
        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        mock_cursor.fetchall.return_value = [[pkgs[0], 'SUCCESS'],
                                             [pkgs[1], 'CHECK WARNING']]
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)

        with patch_pymysql:
            store = compatibility_store.CompatibilityStore()
            packages = list(store.get_packages())

        self.assertEqual(len(packages), 2)

        for i, pkg in enumerate(packages):
            self.assertTrue(
                isinstance(pkg, compatibility_store.package.Package))
            self.assertEqual(pkg.install_name, pkgs[i])
Пример #18
0
    def test_get_self_compatibilities(self):
        packages = [PACKAGE_1, PACKAGE_2, PACKAGE_3, PACKAGE_4]
        rows = []
        for pkg in packages:
            row = (pkg.install_name, 'SUCCESS', '3',
                   '2018-07-17 01:07:08.936648 UTC', None)
            rows.append(row)

        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        mock_cursor.fetchall.return_value = rows
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)
        store = compatibility_store.CompatibilityStore()

        with patch_pymysql:
            res = store.get_self_compatibilities(packages)

        self.assertEqual(len(res), 4)
        self.assertEqual(frozenset(res.keys()), frozenset(packages))
Пример #19
0
    def test_get_packages(self):
        mock_client = mock.Mock()
        pkgs = ['google-api-core', 'apache-beam']
        mock_client.query.return_value = [
            [pkgs[0], 'SUCCESS'],
            [pkgs[1], 'CHECK WARNING'],
        ]
        def MockClient(project=None):
            return mock_client

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)
        with patch_client:
            store = compatibility_store.CompatibilityStore()
            packages = list(store.get_packages())

        self.assertEqual(len(packages), 2)

        for i, pkg in enumerate(packages):
            self.assertTrue(
                isinstance(pkg, compatibility_store.package.Package))
            self.assertEqual(pkg.install_name, pkgs[i])
def main():
    parser = argparse.ArgumentParser(
        description='Display a grid show the dependency compatibility ' +
        'between Python packages')
    parser.add_argument('--packages',
                        nargs='+',
                        default=_DEFAULT_INSTALL_NAMES,
                        help='the packages to display compatibility ' +
                        'information for')
    parser.add_argument('--browser',
                        action='store_true',
                        default=False,
                        help='display the grid in a browser tab')

    args = parser.parse_args()

    checker = compatibility_checker.CompatibilityChecker()
    store = compatibility_store.CompatibilityStore()

    instance_flag = '-instances={}=tcp:{}'.format(INSTANCE_CONNECTION_NAME,
                                                  PORT)
    cloud_sql_proxy_path = './cloud_sql_proxy'

    try:
        # Run cloud_sql_proxy
        process = popen_spawn.PopenSpawn([cloud_sql_proxy_path, instance_flag])
        process.expect('Ready for new connection', timeout=5)

        packages = [
            package.Package(install_name) for install_name in args.packages
        ]
        logging.info('Getting self compatibility results...')
        package_to_results = store.get_self_compatibilities(packages)
        logging.info('Getting pairwise compatibility results...')
        pairwise_to_results = store.get_compatibility_combinations(packages)

        package_with_dependency_info = {}
        for pkg in configs.PKG_LIST:
            dep_info = store.get_dependency_info(pkg)
            package_with_dependency_info[pkg] = dep_info

        results = _ResultHolder(package_to_results, pairwise_to_results,
                                package_with_dependency_info, checker, store)

        dashboard_builder = DashboardBuilder(packages, results)

        # Build the pairwise grid dashboard
        logging.info('Starting build the grid...')
        grid_html = dashboard_builder.build_dashboard(
            'dashboard/grid-template.html')
        grid_path = os.path.dirname(os.path.abspath(__file__)) + '/grid.html'
        with open(grid_path, 'wt') as f:
            f.write(grid_html)

        # Build the dashboard main page
        logging.info('Starting build the main dashboard...')
        main_html = dashboard_builder.build_dashboard(
            'dashboard/main-template.html')

        main_path = os.path.dirname(os.path.abspath(__file__)) + '/index.html'
        with open(main_path, 'wt') as f:
            f.write(main_html)
    except Exception:
        raise DashboardBuilderError('Error occurs when building dashboard.'
                                    'Output: {}'.format(process.before))
    finally:
        process.kill(signal.SIGTERM)

    if args.browser:
        webbrowser.open_new_tab('file://' + main_path)
Пример #21
0
import argparse
import contextlib
import datetime
import itertools
import signal

import pexpect
from pexpect import popen_spawn

from compatibility_lib import compatibility_checker
from compatibility_lib import compatibility_store
from compatibility_lib import configs
from compatibility_lib import package

checker = compatibility_checker.CompatibilityChecker(max_workers=800)
store = compatibility_store.CompatibilityStore()

PY2 = '2'
PY3 = '3'

INSTANCE_CONNECTION_NAME = 'python-compatibility-tools:us-central1:' \
                           'compatibility-data'

PORT = '3306'


class ConnectionError(Exception):
    pass


def _result_dict_to_compatibility_result(results):
Пример #22
0
import pybadges

from compatibility_lib import compatibility_checker
from compatibility_lib import compatibility_store
from compatibility_lib import configs
from compatibility_lib import dependency_highlighter
from compatibility_lib import deprecated_dep_finder

# Initializations
DB_CONNECTION_NAME = 'python-compatibility-tools:us-central1:' \
                     'compatibility-data'
UNIX_SOCKET = '/cloudsql/{}'.format(DB_CONNECTION_NAME)

checker = compatibility_checker.CompatibilityChecker()
store = compatibility_store.CompatibilityStore(mysql_unix_socket=UNIX_SOCKET)
highlighter = dependency_highlighter.DependencyHighlighter(
    checker=checker, store=store)
finder = deprecated_dep_finder.DeprecatedDepFinder(
    checker=checker, store=store)
priority_level = dependency_highlighter.PriorityLevel

TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S"

URL_PREFIX = 'https://img.shields.io/badge/'
GITHUB_HEAD_NAME = 'github head'
GITHUB_API = 'https://api.github.com/repos'
GITHUB_CACHE_TIME = 1800  # seconds
SVG_CONTENT_TYPE = 'image/svg+xml'
EMPTY_DETAILS = 'NO DETAILS'
PACKAGE_NOT_SUPPORTED = "The package is not supported by checker server."
 def __init__(self, py_version='3'):
     self.py_version = py_version
     self._store = compatibility_store.CompatibilityStore()
     self._checker = compatibility_checker.CompatibilityChecker()
    def test_save_compatibility_statuses_release_time_for_latest_many_packages(
            self):
        mock_client = mock.Mock()
        timestamp = '2018-07-17 03:01:06.11693 UTC'
        status = compatibility_store.Status.SUCCESS
        apache_beam_py2 = mock.Mock(
            packages=[package.Package('apache-beam[gcp]')],
            python_major_version='2',
            status=status,
            details=None,
            dependency_info={
                'six': {
                    'installed_version': '9.9.9',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                },
                'apache-beam': {
                    'installed_version': '2.7.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': True,
                }
            },
            timestamp=timestamp)
        apache_beam_py3 = mock.Mock(
            packages=[package.Package('apache-beam[gcp]')],
            python_major_version='3',
            status=status,
            details=None,
            dependency_info={
                'apache-beam': {
                    'installed_version': '2.2.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                }
            },
            timestamp=timestamp)
        google_api_core_py2 = mock.Mock(
            packages=[package.Package('google-api-core')],
            python_major_version='2',
            status=status,
            details=None,
            dependency_info={
                'google-api-core': {
                    'installed_version': '3.7.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': True,
                }
            },
            timestamp=timestamp)
        google_api_core_py3 = mock.Mock(
            packages=[package.Package('google-api-core')],
            python_major_version='3',
            status=status,
            details=None,
            dependency_info={
                'google-api-core': {
                    'installed_version': '3.7.1',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                }
            },
            timestamp=timestamp)

        apache_beam_row = {
            'install_name': 'apache-beam[gcp]',
            'dep_name': 'apache-beam',
            'installed_version': '2.7.0',
            'installed_version_time': '2018-05-12T16:26:31',
            'latest_version': '2.7.0',
            'latest_version_time': '2018-05-12T16:26:31',
            'is_latest': True,
            'timestamp': '2018-07-13T17:11:29.140608',
        }

        six_row = {
            'install_name': 'apache-beam[gcp]',
            'dep_name': 'six',
            'installed_version': '9.9.9',
            'installed_version_time': '2018-05-12T16:26:31',
            'latest_version': '2.7.0',
            'latest_version_time': '2018-05-12T16:26:31',
            'is_latest': False,
            'timestamp': '2018-07-13T17:11:29.140608',
        }

        google_api_core_row = {
            'install_name': 'google-api-core',
            'dep_name': 'google-api-core',
            'installed_version': '3.7.1',
            'installed_version_time': '2018-05-12T16:26:31',
            'latest_version': '2.7.0',
            'latest_version_time': '2018-05-12T16:26:31',
            'is_latest': False,
            'timestamp': '2018-07-13T17:11:29.140608',
        }

        def MockClient(project=None):
            return mock_client

        patch_client = mock.patch(
            'compatibility_lib.compatibility_store.bigquery.Client',
            MockClient)

        with patch_client:
            store = compatibility_store.CompatibilityStore()
            store.save_compatibility_statuses([
                apache_beam_py2, apache_beam_py3, google_api_core_py2,
                google_api_core_py3
            ])

        mock_client.insert_rows.assert_called_with(
            store._release_time_table,
            [apache_beam_row, six_row, google_api_core_row])
Пример #25
0
    def test_save_compatibility_statuses_release_time_for_latest_many_packages(
            self):
        status = compatibility_store.Status.SUCCESS
        apache_beam_py2 = compatibility_store.CompatibilityResult(
            packages=[package.Package('apache-beam[gcp]')],
            python_major_version='2',
            status=status,
            details=None,
            dependency_info={
                'six': {
                    'installed_version': '9.9.9',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                },
                'apache-beam': {
                    'installed_version': '2.7.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': True,
                }
            },
            timestamp=None)
        apache_beam_py3 = compatibility_store.CompatibilityResult(
            packages=[package.Package('apache-beam[gcp]')],
            python_major_version='3',
            status=status,
            details=None,
            dependency_info={
                'apache-beam': {
                    'installed_version': '2.2.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                }
            },
            timestamp=None)
        google_api_core_py2 = compatibility_store.CompatibilityResult(
            packages=[package.Package('google-api-core')],
            python_major_version='2',
            status=status,
            details=None,
            dependency_info={
                'google-api-core': {
                    'installed_version': '3.7.0',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': True,
                }
            },
            timestamp=None)
        google_api_core_py3 = compatibility_store.CompatibilityResult(
            packages=[package.Package('google-api-core')],
            python_major_version='3',
            status=status,
            details=None,
            dependency_info={
                'google-api-core': {
                    'installed_version': '3.7.1',
                    'installed_version_time': '2018-05-12T16:26:31',
                    'latest_version': '2.7.0',
                    'current_time': '2018-07-13T17:11:29.140608',
                    'latest_version_time': '2018-05-12T16:26:31',
                    'is_latest': False,
                }
            },
            timestamp=None)

        apache_beam_row = ('apache-beam[gcp]', 'apache-beam', '2.7.0',
                           '2018-05-12T16:26:31', '2.7.0',
                           '2018-05-12T16:26:31', True,
                           '2018-07-13T17:11:29.140608')

        six_row = ('apache-beam[gcp]', 'six', '9.9.9', '2018-05-12T16:26:31',
                   '2.7.0', '2018-05-12T16:26:31', False,
                   '2018-07-13T17:11:29.140608')

        google_api_core_row = ('google-api-core', 'google-api-core', '3.7.1',
                               '2018-05-12T16:26:31', '2.7.0',
                               '2018-05-12T16:26:31', False,
                               '2018-07-13T17:11:29.140608')

        mock_pymysql = mock.Mock()
        mock_conn = mock.Mock()
        mock_cursor = mock.Mock()
        mock_pymysql.connect.return_value = mock_conn
        mock_conn.cursor.return_value = mock_cursor
        patch_pymysql = mock.patch(
            'compatibility_lib.compatibility_store.pymysql', mock_pymysql)
        sql = 'REPLACE INTO release_time_for_dependencies values ' \
              '(%s, %s, %s, %s, %s, %s, %s, %s)'

        with patch_pymysql:
            store = compatibility_store.CompatibilityStore()
            store.save_compatibility_statuses([
                apache_beam_py2, apache_beam_py3, google_api_core_py2,
                google_api_core_py3
            ])

        mock_cursor.executemany.assert_called_with(
            sql, [apache_beam_row, six_row, google_api_core_row])