async def validate_path(self, path: str, **kwargs) -> BitbucketPath: commit_sha = kwargs.get('commitSha') branch_name = kwargs.get('branch') # revision query param could be commit sha OR branch # take a guess which one it will be. revision = kwargs.get('revision', None) if revision is not None: try: int(revision, 16) # is revision valid hex? except (TypeError, ValueError): branch_name = revision else: commit_sha = revision if not commit_sha and not branch_name: branch_name = await self._fetch_default_branch() if path == '/': return BitbucketPath(path, _ids=[(commit_sha, branch_name)]) path_obj = BitbucketPath(path) for part in path_obj.parts: part._id = (commit_sha, branch_name) return path_obj
async def validate_v1_path(self, path: str, **kwargs) -> BitbucketPath: commit_sha = kwargs.get('commitSha') branch_name = kwargs.get('branch') # revision query param could be commit sha OR branch # take a guess which one it will be. revision = kwargs.get('revision', None) if revision is not None: try: int(revision, 16) # is revision valid hex? except (TypeError, ValueError): branch_name = revision else: commit_sha = revision if not commit_sha and not branch_name: branch_name = await self._fetch_default_branch() if path == '/': return BitbucketPath(path, _ids=[(commit_sha, branch_name)]) path_obj = BitbucketPath(path) for part in path_obj.parts: part._id = (commit_sha, branch_name) # Cache parent directory listing (a WB API V1 feature) # Note: Property ``_parent_dir`` has been re-structured for Bitbucket API 2.0. Please refer # to ``_fetch_path_metadata()`` and ``_fetch_dir_listing()`` for detailed information. self._parent_dir = { 'metadata': await self._fetch_path_metadata(path_obj.parent), 'contents': await self._fetch_dir_listing(path_obj.parent) } # Tweak dir_commit_sha and dir_path for Bitbucket API 2.0 parent_dir_commit_sha = self._parent_dir['metadata']['commit']['hash'][:12] parent_dir_path = '{}/'.format(self._parent_dir['metadata']['path']) # Check file or folder existence path_obj_type = 'commit_directory' if path_obj.is_dir else 'commit_file' if path_obj.name not in [ self.bitbucket_path_to_name(x['path'], parent_dir_path) for x in self._parent_dir['contents'] if x['type'] == path_obj_type ]: raise exceptions.NotFoundError(str(path)) # _fetch_dir_listing() will tell us the commit sha used to look up the listing # if not set in path_obj or if the lookup sha is shorter than the returned sha, update it if not commit_sha or (len(commit_sha) < len(parent_dir_commit_sha)): path_obj.set_commit_sha(parent_dir_commit_sha) return path_obj
def test_build_file_metadata(self, file_metadata, owner, repo): name = 'file0002.20bytes.txt' subdir = 'folder2-lvl1/folder1-lvl2/folder1-lvl3' full_path = '/{}/{}'.format(subdir, name) # Note: When building Bitbucket Path, the length of ``_ids`` array must be equal to the # number of path segments, including the root. path = BitbucketPath(full_path, _ids=[(COMMIT_SHA, BRANCH) for _ in full_path.split('/')]) try: metadata = BitbucketFileMetadata(file_metadata, path, owner=owner, repo=repo) except Exception as exc: pytest.fail(str(exc)) return assert metadata.name == name assert metadata.path == full_path assert metadata.kind == 'file' assert metadata.modified == '2019-04-26T15:13:12+00:00' assert metadata.modified_utc == '2019-04-26T15:13:12+00:00' assert metadata.created_utc == '2019-04-25T06:18:21+00:00' assert metadata.content_type is None assert metadata.size == 20 assert metadata.size_as_int == 20 assert metadata.etag == '{}::{}'.format(full_path, COMMIT_SHA) assert metadata.provider == 'bitbucket' assert metadata.last_commit_sha == 'dd8c7b642e32' assert metadata.commit_sha == COMMIT_SHA assert metadata.branch_name == BRANCH web_view = ('https://bitbucket.org/{}/{}/src/{}{}?' 'fileviewer=file-view-default'.format( owner, repo, COMMIT_SHA, full_path)) assert metadata.web_view == web_view assert metadata.extra == { 'commitSha': COMMIT_SHA, 'branch': BRANCH, 'webView': web_view, 'lastCommitSha': 'dd8c7b642e32', } resource = 'mst3k' assert metadata._json_api_links(resource) == { 'delete': None, 'upload': None, 'move': 'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?' 'commitSha={}'.format(resource, full_path, COMMIT_SHA), 'download': 'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?' 'commitSha={}'.format(resource, full_path, COMMIT_SHA), }
def test_id_accessors(self): bb_path = BitbucketPath('/foo', _ids=[(COMMIT_SHA, BRANCH), (COMMIT_SHA, BRANCH)]) assert bb_path.commit_sha == COMMIT_SHA assert bb_path.branch_name == BRANCH assert bb_path.ref == COMMIT_SHA
def test_child_inherits_id(self): bb_parent = BitbucketPath('/foo/', _ids=[(COMMIT_SHA, BRANCH), (COMMIT_SHA, BRANCH)]) bb_child = bb_parent.child('foo') assert bb_child.commit_sha == COMMIT_SHA assert bb_child.branch_name == BRANCH assert bb_child.ref == COMMIT_SHA
def test_build_file_metadata(self, file_metadata, owner, repo): name = 'aaa-01-2.txt' subdir = 'plaster' full_path = '/{}/{}'.format(subdir, name) branch = 'master' path = BitbucketPath(full_path, _ids=[(COMMIT_SHA, branch), (COMMIT_SHA, branch), (COMMIT_SHA, branch)]) try: metadata = BitbucketFileMetadata(file_metadata, path, owner=owner, repo=repo) except Exception as exc: pytest.fail(str(exc)) assert metadata.name == name assert metadata.path == full_path assert metadata.kind == 'file' assert metadata.modified == '2016-10-14T00:37:55Z' assert metadata.modified_utc == '2016-10-14T00:37:55+00:00' assert metadata.created_utc is None assert metadata.content_type is None assert metadata.size == 13 assert metadata.size_as_int == 13 assert metadata.etag == '{}::{}'.format(full_path, COMMIT_SHA) assert metadata.provider == 'bitbucket' assert metadata.last_commit_sha == '90c8f7eef948' assert metadata.commit_sha == COMMIT_SHA assert metadata.branch_name == branch web_view = ('https://bitbucket.org/{}/{}/src/{}{}?' 'fileviewer=file-view-default'.format( owner, repo, COMMIT_SHA, full_path)) assert metadata.web_view == web_view assert metadata.extra == { 'commitSha': COMMIT_SHA, 'branch': 'master', 'webView': web_view, 'lastCommitSha': '90c8f7eef948', } resource = 'mst3k' assert metadata._json_api_links(resource) == { 'delete': None, 'upload': None, 'move': 'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?commitSha={}' .format(resource, full_path, COMMIT_SHA), 'download': 'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?commitSha={}' .format(resource, full_path, COMMIT_SHA), }
async def validate_v1_path(self, path: str, **kwargs) -> BitbucketPath: commit_sha = kwargs.get('commitSha') branch_name = kwargs.get('branch') # revision query param could be commit sha OR branch # take a guess which one it will be. revision = kwargs.get('revision', None) if revision is not None: try: int(revision, 16) # is revision valid hex? except (TypeError, ValueError): branch_name = revision else: commit_sha = revision if not commit_sha and not branch_name: branch_name = await self._fetch_default_branch() if path == '/': return BitbucketPath(path, _ids=[(commit_sha, branch_name)]) path_obj = BitbucketPath(path) for part in path_obj.parts: part._id = (commit_sha, branch_name) self._parent_dir = await self._fetch_dir_listing(path_obj.parent) if path_obj.is_dir: if path_obj.name not in self._parent_dir['directories']: raise exceptions.NotFoundError(str(path)) else: if path_obj.name not in [ self.bitbucket_path_to_name(x['path'], self._parent_dir['path']) for x in self._parent_dir['files'] ]: raise exceptions.NotFoundError(str(path)) # _fetch_dir_listing will tell us the commit sha used to look up the listing # if not set in path_obj or if the lookup sha is shorter than the returned sha, update it if not commit_sha or (len(commit_sha) < len(self._parent_dir['node'])): path_obj.set_commit_sha(self._parent_dir['node']) return path_obj
def test_child_given_explicit_branch(self): """This one is weird. An explicit child id should override the id from the parent, but I don't know if this is sensible behavior.""" bb_parent = BitbucketPath('/foo/', _ids=[(COMMIT_SHA, BRANCH), (COMMIT_SHA, BRANCH)]) bb_child = bb_parent.child('foo', _id=('413006763', 'master')) assert bb_child.commit_sha == '413006763' assert bb_child.branch_name == 'master' assert bb_child.ref == '413006763' assert bb_parent.commit_sha == COMMIT_SHA assert bb_parent.branch_name == BRANCH assert bb_parent.ref == COMMIT_SHA
def test_build_folder_metadata(self, folder_metadata, owner, repo): name = 'folder1-lvl3' subdir = 'folder2-lvl1/folder1-lvl2' full_path = '/{}/{}'.format(subdir, name) path = BitbucketPath(full_path, _ids=[(None, BRANCH) for _ in full_path.split('/')]) try: metadata = BitbucketFolderMetadata(folder_metadata, path, owner=owner, repo=repo) except Exception as exc: pytest.fail(str(exc)) return assert metadata.name == name assert metadata.path == '{}/'.format(full_path) assert metadata.kind == 'folder' assert metadata.children is None assert metadata.extra == { 'commitSha': None, 'branch': BRANCH, } assert metadata.provider == 'bitbucket' assert metadata.commit_sha is None assert metadata.branch_name == BRANCH assert metadata._json_api_links('mst3k') == { 'delete': None, 'upload': None, 'move': 'http://localhost:7777/v1/resources/mst3k/providers/bitbucket{}/?' 'branch={}'.format(full_path, BRANCH), 'new_folder': None, }
def test_update_commit_sha(self): bb_child = BitbucketPath('/foo/bar', _ids=[(None, BRANCH), (None, BRANCH), (None, BRANCH)]) assert bb_child.commit_sha == None assert bb_child.branch_name == BRANCH assert bb_child.ref == BRANCH bb_child.set_commit_sha(COMMIT_SHA) assert bb_child.commit_sha == COMMIT_SHA assert bb_child.branch_name == BRANCH assert bb_child.ref == COMMIT_SHA bb_parent = bb_child.parent assert bb_parent.commit_sha == COMMIT_SHA assert bb_parent.branch_name == BRANCH assert bb_parent.ref == COMMIT_SHA bb_grandparent = bb_parent.parent assert bb_grandparent.commit_sha == COMMIT_SHA assert bb_grandparent.branch_name == BRANCH assert bb_grandparent.ref == COMMIT_SHA
def test_build_folder_metadata(self, folder_metadata, owner, repo): branch = 'master' name = 'plaster' path = BitbucketPath('/{}/'.format(name), _ids=[(None, branch), (None, branch)]) try: metadata = BitbucketFolderMetadata(folder_metadata, path, owner=owner, repo=repo) except Exception as exc: pytest.fail(str(exc)) assert metadata.name == name assert metadata.path == '/{}/'.format(name) assert metadata.kind == 'folder' assert metadata.children is None assert metadata.extra == { 'commitSha': None, 'branch': branch, } assert metadata.provider == 'bitbucket' assert metadata.commit_sha is None assert metadata.branch_name == branch assert metadata._json_api_links('mst3k') == { 'delete': None, 'upload': None, 'move': 'http://localhost:7777/v1/resources/mst3k/providers/bitbucket/{}/?branch={}' .format(name, branch), 'new_folder': None, }
def test_id_accessors_no_branch(self): bb_path = BitbucketPath('/foo', _ids=[(COMMIT_SHA, None), (COMMIT_SHA, None)]) assert bb_path.commit_sha == COMMIT_SHA assert bb_path.branch_name == None assert bb_path.ref == COMMIT_SHA
def test_id_accessors_no_sha(self): bb_path = BitbucketPath('/foo', _ids=[(None, BRANCH), (None, BRANCH)]) assert bb_path.commit_sha == None assert bb_path.branch_name == BRANCH assert bb_path.ref == BRANCH