def test_get_distributions(): env = NicemanProvenance(multi_debian_yaml).get_environment() with raises(ValueError): env.get_distribution(DebianDistribution) dist = env.get_distribution(CondaDistribution) assert dist is None env = NicemanProvenance(diff_1_yaml).get_environment() dist = env.get_distribution(DebianDistribution) assert isinstance(dist, DebianDistribution)
def __call__(prov1, prov2): env_1 = NicemanProvenance(prov1).get_environment() env_2 = NicemanProvenance(prov2).get_environment() for (dist_type, pkg_type) in ((DebianDistribution, "Debian package"), (CondaDistribution, "Conda package")): dist_1 = env_1.get_distribution(dist_type) if dist_1: pkgs_1 = { p._cmp_id: p for p in dist_1.packages } else: pkgs_1 = {} dist_2 = env_2.get_distribution(dist_type) if dist_2: pkgs_2 = { p._cmp_id: p for p in dist_2.packages } else: pkgs_2 = {} pkgs_1_s = set(pkgs_1) pkgs_2_s = set(pkgs_2) pkgs_only_1 = pkgs_1_s - pkgs_2_s pkgs_only_2 = pkgs_2_s - pkgs_1_s if pkgs_only_1 or pkgs_only_2: print(pkg_type + 's:') if pkgs_only_1: for cmp_key in sorted(pkgs_only_1): package = pkgs_1[cmp_key] print('< %s %s' % (" ".join(cmp_key), package.version)) if pkgs_only_2 and pkgs_only_2: print('---') if pkgs_only_2: for cmp_key in sorted(pkgs_only_2): package = pkgs_2[cmp_key] print('> %s %s' % (" ".join(cmp_key), package.version)) for cmp_key in pkgs_1_s.intersection(pkgs_2_s): package_1 = pkgs_1[cmp_key] package_2 = pkgs_2[cmp_key] if package_1.version != package_2.version: print('%s %s:' % (pkg_type, " ".join(cmp_key))) print('< %s' % package_1.version) print('---') print('> %s' % package_2.version) for (dist_type, repo_type) in ((GitDistribution, 'Git'), (SVNDistribution, 'SVN')): dist_1 = env_1.get_distribution(dist_type) if dist_1: repos_1 = { p.identifier: p for p in dist_1.packages } else: repos_1 = {} dist_2 = env_2.get_distribution(dist_type) if dist_2: repos_2 = { p.identifier: p for p in dist_2.packages } else: repos_2 = {} repos_1_s = set(repos_1) repos_2_s = set(repos_2) repos_1_only = repos_1_s - repos_2_s repos_2_only = repos_2_s - repos_1_s if repos_1_only or repos_2_only: print('%s repositories:' % repo_type) if repos_1_only: for repo_id in repos_1_only: repo = repos_1[repo_id] print('< %s (%s)' % (repo.identifier, repo.path)) if repos_1_only and repos_2_only: print('---') if repos_2_only: for repo_id in repos_2_only: repo = repos_2[repo_id] print('> %s (%s)' % (repo.identifier, repo.path)) for repo_id in repos_1_s.intersection(repos_2_s): repo_1 = repos_1[repo_id] repo_2 = repos_2[repo_id] if repo_1.commit == repo_2.commit: continue print('%s repository %s:' % (repo_type, repo_id)) print('< %s (%s)' % (repo_1.commit, repo_1.path)) print('---') print('> %s (%s)' % (repo_2.commit, repo_2.path)) files1 = set(env_1.files) files2 = set(env_2.files) files_1_only = files1 - files2 files_2_only = files2 - files1 if files_1_only or files_2_only: print('Files:') for fname in files_1_only: print('< %s' % fname) if files_1_only and files_2_only: print('---') for fname in files_2_only: print('> %s' % fname) return