def test_clone(self): """Test GitHandler's `clone` method.""" with self.assertRaises(StatusError): _ = GitHandler.clone(url='https://nonexisting/repo') handler = GitHandler.clone(url=TEST_GIT_REPO_URL) self.assertIsInstance(handler, GitHandler)
def test_init(self): """Test GitHandler initialization.""" tmp_dir = tempfile.mkdtemp(prefix='test_', suffix='_init') with self.assertRaises(StatusError): _ = GitHandler(tmp_dir) handler = GitHandler.clone(url=TEST_GIT_REPO_URL) self.assertIsInstance(handler, GitHandler)
def get_packages_by_commits(repository: str, commits: list, package_limit=1, ecosystem='maven') -> list: """Get package name from git repository and commit hash. A git handler is created and modified files are searched by the given commit. Package is inferred based on those modified files. There can be multiple packages, by default only one child package is returned. *NOTE:* Only usable for git repositories. :param repository: str, path to local repository or url If url is provided, to repository will be cloned into a temporary folder (at /tmp) :param commits: list, commit hashes to search the modified files by :param package_limit: int or None, limit number of packages The limit is applied per modified file. If all packages found in the path should be listed, provide None or 0 :param ecosystem: ecosystem the repository belongs to {maven, npm, python}, by default 'maven' is assumed """ if repository.startswith('http'): print('\nCloning repository...\n', file=sys.stderr) handler = GitHandler.clone(url=repository) else: handler = GitHandler(path=repository) with handler as git: mod_files = git.get_modified_files(commits=commits) mod_files = sorted(mod_files, key=len, reverse=True) eco_namespace = _get_namespace_by_eco(ecosystem) packages = set() for mod_file_path in mod_files: root_dir = os.path.dirname(str(mod_file_path)) found_packages = eco_namespace.find_packages(root_dir, topdown=False) for p in found_packages[:[None, package_limit][package_limit]]: packages.add(p) # the first found package should be the child package belonging to the file # which has been modified return list(packages)
def test_exec_cmd(self): """Test GitHandler's `exec_cmd` method.""" with self.assertRaises(ValueError): # should raise, command does not start with git GitHandler.exec_cmd('echo "Hello Git!"') tmp_dir = tempfile.mkdtemp(prefix='test_', suffix='_exec_cmd') _, __ = GitHandler.exec_cmd('git clone {repo} {dest}'.format( repo=TEST_GIT_REPO_URL, dest=tmp_dir)) self.assertTrue(any(os.listdir(tmp_dir)))
def test_get_package_from_spec_exception(self, mock_find): """Test `get_package_from_spec` with missing parent namespace.""" with GitHandler.clone(TEST_MAVEN_REPO_URL) as git: repo_dir = git.repository pom_files = Maven.find_pom_files(repo_dir) assert any(pom_files) with open(pom_files[0], 'r') as pom_spec: # set up mock mock_find.return_value = None package = Maven.get_package_from_spec(pom_spec) self.assertIsNotNone(package) self.assertTrue(isinstance(package, Package)) self.assertTrue( all([ getattr(package, attr, None) is None for attr in ['aid', 'gid', 'name', 'owner', 'version', 'description'] ]) )
def test_find_packages(self): """Test MavenRepository `find_packages` method.""" with GitHandler.clone(TEST_MAVEN_REPO_URL) as git: repo_dir = git.repository packages = Maven.find_packages(repo_dir) self.assertIsNotNone(packages) self.assertTrue(any(packages)) self.assertTrue(all([isinstance(f, Package) for f in packages]))
def test_get_modified_files(self): """Test GitHandler's `get_modified_files` method.""" handler = GitHandler.clone(url=TEST_GIT_REPO_URL) mod_file, = handler.get_modified_files(commits=TEST_COMMITS) self.assertEqual(os.path.basename(mod_file), 'README.md') # test multiple commits mod_files = handler.get_modified_files(commits=TEST_COMMITS * 2) self.assertEqual(len(mod_files), 2)
def test_get_package_from_spec(self): """Test MavenRepository `get_package_from_spec` method.""" with GitHandler.clone(TEST_MAVEN_REPO_URL) as git: repo_dir = git.repository pom_files = Maven.find_pom_files(repo_dir) assert any(pom_files) with open(pom_files[0], 'r') as pom_spec: package = Maven.get_package_from_spec(pom_spec) self.assertIsNotNone(package) self.assertTrue(isinstance(package, Package)) self.assertTrue( all([getattr(package, attr, None)] for attr in ['name', 'owner', 'version', 'description']))
def test_find_pom_files(self): """Test MavenRepository `find_pom_files` method.""" with GitHandler.clone(TEST_MAVEN_REPO_URL) as git: repo_dir = git.repository pom_files = Maven.find_pom_files(repo_dir) self.assertIsNotNone(pom_files) self.assertTrue(any(pom_files)) self.assertTrue(all([f.endswith('.xml') for f in pom_files])) # try it with reverse search child_path = os.path.join(repo_dir, TEST_TRAVERSAL_PATH) pom_files = Maven.find_pom_files(child_path, topdown=False) self.assertIsNotNone(pom_files) self.assertTrue(any(pom_files)) self.assertTrue(all([f.endswith('.xml') for f in pom_files]))