Example #1
0
 def test_yaml_db_filename(self):
     db_path = os.path.join(self.temp_dir, 'test.yaml')
     with open(db_path, 'w') as f:
         f.write(TEST_DB_CONTENTS)
     version_db = PackageVersionClassifications(yaml_db=db_path)
     self.assertEqual(
         'https://docs.d.com/CHANGELOG.md',
         version_db.get_changelog('d')
     )
 def test_report_ignore_all(self):
     env = InstalledPackageVersions.from_freeze_file(StringIO('non-lts-example==1.0.7'))
     version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
     available = FakePackageVersionInfo.from_list('non-lts-example', NON_LTS_EXAMPLE_VERSIONS)
     analyzer = Analyzer(env, available, version_db)
     report = analyzer.analyze(
         ignored_packages=['non-lts-example']
     )
     self.assertEqual('', report.render())
    def test_unknown_package(self):
        env = InstalledPackageVersions.from_freeze_file(StringIO('FOO==1.0.8'))
        version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
        available = FakePackageVersionInfo()
        analyzer = Analyzer(env, available, version_db)
        report = analyzer.analyze()
        expected_report = """Packages with PyPI or version problem: FOO
"""
        self.assertEqual(expected_report, report.render())
    def test_package_not_in_release_database(self):
        env = InstalledPackageVersions.from_freeze_file(StringIO('FOO==1.0.8'))
        version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
        available = FakePackageVersionInfo.from_list('FOO', ['1.0.8', '1.0.9'])
        analyzer = Analyzer(env, available, version_db)
        report = analyzer.analyze()
        expected_report = """FOO: 1.0.8
Newer releases:
  1.0.9: No information about package
"""
        self.assertEqual(expected_report, report.render())
Example #5
0
def main(args):
    """Parse arguments and call library to analyze"""
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--cache-file',
        help='name of JSON document where data from PyPI is cached')
    parser.add_argument('--cache-time',
                        help='seconds that data from PyPI is cached',
                        type=int)
    parser.add_argument('--db', help='path to package release database')
    parser.add_argument('--ignore',
                        help='comma-delimited list of packages to ignore',
                        default='')
    parser.add_argument('--types', help='all|feature|compat|bug|security')
    parser.add_argument('--verbose',
                        help='show more details',
                        action='store_true')
    parser.add_argument('freeze_output', nargs='?')
    args = parser.parse_args(args)

    try:
        types = ReportedUpdateTypes(types=args.types)
    except ValueError:
        print('Bad value for --types', file=sys.stderr)
        sys.exit(1)

    if args.freeze_output:
        env_packages = InstalledPackageVersions.from_freeze_file(
            args.freeze_output)
    else:
        env_packages = InstalledPackageVersions.from_active_env()
    if env_packages.packages_with_error:
        print('Packages in virtualenv with error:', file=sys.stderr)
        for package in env_packages.packages_with_error:
            print('  %s' % package, file=sys.stderr)

    version_db = PackageVersionClassifications(yaml_db=args.db)

    split_re = re.compile(r'( +| *, *)')
    with AvailablePackageVersions(
            max_cache_time_seconds=args.cache_time,
            cache_file_path=args.cache_file) as version_info:
        analyzer = Analyzer(env_packages, version_info, version_db)
        report = analyzer.analyze(
            ignored_packages=split_re.split(args.ignore),
            types=types,
        )

    print(report.render(verbose=args.verbose), end='')
    def test_report_no_newer(self):
        env = InstalledPackageVersions.from_freeze_file(StringIO('non-lts-example==1.0.8'))
        version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
        available = FakePackageVersionInfo.from_list('non-lts-example', NON_LTS_EXAMPLE_VERSIONS)
        analyzer = Analyzer(env, available, version_db)
        report = analyzer.analyze()
        # non-verbose:
        expected_report = ''
        self.assertEqual(expected_report, report.render())
        # verbose: (should show older releases)
        expected_report = """non-lts-example: 1.0.8
Older: 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6, 1.0.7a1, 1.0.7b2, 1.0.7, 1.0.8rc3

Up to date: non-lts-example
"""
        self.assertEqual(expected_report, report.render(verbose=True))
    def test_report_older(self):
        env = InstalledPackageVersions.from_freeze_file(StringIO('non-lts-example==1.0.7'))
        version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
        available = FakePackageVersionInfo.from_list('non-lts-example', NON_LTS_EXAMPLE_VERSIONS)
        analyzer = Analyzer(env, available, version_db)
        report = analyzer.analyze()
        # non-verbose:
        expected_report = """non-lts-example: 1.0.7
Newer releases:
  1.0.8: SECURITY
  Changelog: https://non-lts-example.com/CHANGES.md
"""
        self.assertEqual(expected_report, report.render())
        # verbose: (should show older releases)
        expected_report = """non-lts-example: 1.0.7
Newer releases:
  1.0.8: SECURITY
  Changelog: https://non-lts-example.com/CHANGES.md
Older: 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6, 1.0.7a1, 1.0.7b2
"""
        self.assertEqual(expected_report, report.render(verbose=True))
    def test_lts(self):
        env = InstalledPackageVersions.from_freeze_file(StringIO('d===1.11.5'))
        version_db = PackageVersionClassifications(yaml_db=TEST_DB_NAME)
        available = FakePackageVersionInfo({
            'd': {
                'releases': {
                    '1.11.9': True,
                    '1.11.10': True,
                    '2.0': True,
                    '2.0.1': True,
                    '2.0.2': True
                }
            }
        })
        analyzer = Analyzer(env, available, version_db)
        report = analyzer.analyze()
        expected_report = """d: 1.11.5
Newer releases:
  1.11.9: Non-security bug fixes
  1.11.10: SECURITY
  Changelog: https://docs.d.com/CHANGELOG.md
"""
        self.assertEqual(expected_report, report.render())
Example #9
0
 def setUp(self):
     self.db = PackageVersionClassifications(yaml_db=StringIO(TEST_DB_CONTENTS))
Example #10
0
class TestDB(unittest.TestCase):

    def setUp(self):
        self.db = PackageVersionClassifications(yaml_db=StringIO(TEST_DB_CONTENTS))

    def test_bad_arg_recognition(self):
        with self.assertRaises(ValueError):
            ReportedUpdateTypes('foo')
        types = ReportedUpdateTypes()
        with self.assertRaises(ValueError):
            types.update(foo=True)
        with self.assertRaises(ValueError):
            types.update(ignore_feature_releases=0)

    def test_good_args(self):
        ReportedUpdateTypes('bug').update(ignore_bug_fix_releases=True)

    def test_changelog(self):
        self.assertEqual(
            'https://non-lts-example.com/CHANGES.md',
            self.db.get_changelog('non-lts-example')
        )

    def test_changelog_for_missing_package(self):
        self.assertEqual(None, self.db.get_changelog('NO-SUCH-PACKAGE'))

    def test_mode_security(self):
        types = ReportedUpdateTypes(types='security')
        self.assertTrue(types.is_reported('security'))
        versions = self.db.filter_available_releases(
            'non-lts-example', '1.0.0', NON_LTS_EXAMPLE_VERSIONS, types
        )
        self.assertEqual(['1.0.5', '1.0.8'], versions)

    def test_mode_report_nothing(self):
        types = ReportedUpdateTypes(types='security')
        types.update(ignore_security_releases=True)  # nothing left!
        versions = self.db.filter_available_releases(
            'non-lts-example', '1.0.0', NON_LTS_EXAMPLE_VERSIONS, types
        )
        self.assertEqual([], versions)

    def test_ignore_compat_releases(self):
        types = ReportedUpdateTypes(types='all')
        types.update(ignore_compat_releases=True)
        versions = self.db.filter_available_releases(
            'non-lts-example', '1.0.0', NON_LTS_EXAMPLE_VERSIONS, types
        )
        self.assertEqual([
            '1.0.2', '1.0.4', '1.0.5', '1.0.7', '1.0.7a1',
            '1.0.8', '1.0.8rc3'
        ], versions)

    def test_ignore_alpha_releases(self):
        types = ReportedUpdateTypes(types='all')
        types.update(ignore_alpha_beta_rc_releases=False)
        versions = self.db.filter_available_releases(
            'non-lts-example', '1.0.0', NON_LTS_EXAMPLE_VERSIONS, types
        )
        self.assertEqual([
            v for v in NON_LTS_EXAMPLE_VERSIONS
            if v != '1.0.1'
        ], versions)

        types = ReportedUpdateTypes(types='all')
        types.update(ignore_alpha_beta_rc_releases=True)
        versions = self.db.filter_available_releases(
            'non-lts-example', '1.0.0', NON_LTS_EXAMPLE_VERSIONS, types
        )
        self.assertEqual([
            v for v in NON_LTS_EXAMPLE_VERSIONS
            if v != '1.0.1' and not re.match(r'.*(a|b|rc)\d+$', v)
        ], versions)

    def test_classify_invalid_package(self):
        s = self.db.classify_release('foo-package', '1.8.5')
        self.assertTrue(s.startswith('No '))

    def test_classify_invalid_release(self):
        s = self.db.classify_release('non-lts-example', '99.99.99')
        self.assertTrue(s.startswith('No '))

    def test_valid_classify_release(self):
        s = self.db.classify_release('non-lts-example', '1.0.3')
        self.assertTrue(s.startswith('Adds compatibility '))

    def test_is_security_release_invalid_package(self):
        with self.assertRaises(ValueError):
            self.db.is_security_release('foo-package', '1.0.5')

    def test_is_security_release_true(self):
        self.assertTrue(self.db.is_security_release('non-lts-example', '1.0.8'))
        self.assertTrue(self.db.is_security_release('non-lts-example', ['1.0.8']))
        self.assertTrue(self.db.is_security_release('non-lts-example', ['1.0.1', '1.0.8']))

    def test_is_security_release_false(self):
        self.assertFalse(self.db.is_security_release('non-lts-example', '1.0.1'))
        self.assertFalse(self.db.is_security_release('non-lts-example', ['1.0.1']))
Example #11
0
 def test_yaml_db_object(self):
     version_db = PackageVersionClassifications(yaml_db=StringIO(TEST_DB_CONTENTS))
     self.assertEqual(
         'https://docs.d.com/CHANGELOG.md',
         version_db.get_changelog('d')
     )
Example #12
0
 def test_yaml_db_default(self):
     version_db = PackageVersionClassifications()
     self.assertEqual(
         'https://github.com/mozilla/bleach/blob/master/CHANGES',
         version_db.get_changelog('bleach')
     )