chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This source code is licensed under the MIT license found in the
|
||||
# LICENSE file in the root directory of this source tree.
|
||||
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
from typing import List, Optional
|
||||
|
||||
|
||||
logger = logging.getLogger(__file__)
|
||||
|
||||
|
||||
try:
|
||||
from fvcore.common.file_io import PathManager as FVCorePathManager
|
||||
|
||||
try:
|
||||
# [FB only - for now] AWS PathHandler for PathManager
|
||||
from .fb_pathhandlers import S3PathHandler
|
||||
|
||||
FVCorePathManager.register_handler(S3PathHandler())
|
||||
except KeyError:
|
||||
logging.warning("S3PathHandler already registered.")
|
||||
except ImportError:
|
||||
logging.debug(
|
||||
"S3PathHandler couldn't be imported. Either missing fb-only files, or boto3 module."
|
||||
)
|
||||
|
||||
except ImportError:
|
||||
FVCorePathManager = None
|
||||
|
||||
|
||||
class PathManager:
|
||||
"""
|
||||
Wrapper for insulating OSS I/O (using Python builtin operations) from
|
||||
fvcore's PathManager abstraction (for transparently handling various
|
||||
internal backends).
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def open(
|
||||
path: str,
|
||||
mode: str = "r",
|
||||
buffering: int = -1,
|
||||
encoding: Optional[str] = None,
|
||||
errors: Optional[str] = None,
|
||||
newline: Optional[str] = None,
|
||||
):
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.open(
|
||||
path=path,
|
||||
mode=mode,
|
||||
buffering=buffering,
|
||||
encoding=encoding,
|
||||
errors=errors,
|
||||
newline=newline,
|
||||
)
|
||||
return open(
|
||||
path,
|
||||
mode=mode,
|
||||
buffering=buffering,
|
||||
encoding=encoding,
|
||||
errors=errors,
|
||||
newline=newline,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def copy(src_path: str, dst_path: str, overwrite: bool = False) -> bool:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.copy(
|
||||
src_path=src_path, dst_path=dst_path, overwrite=overwrite
|
||||
)
|
||||
return shutil.copyfile(src_path, dst_path)
|
||||
|
||||
@staticmethod
|
||||
def get_local_path(path: str, **kwargs) -> str:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.get_local_path(path, **kwargs)
|
||||
return path
|
||||
|
||||
@staticmethod
|
||||
def exists(path: str) -> bool:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.exists(path)
|
||||
return os.path.exists(path)
|
||||
|
||||
@staticmethod
|
||||
def isfile(path: str) -> bool:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.isfile(path)
|
||||
return os.path.isfile(path)
|
||||
|
||||
@staticmethod
|
||||
def ls(path: str) -> List[str]:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.ls(path)
|
||||
return os.listdir(path)
|
||||
|
||||
@staticmethod
|
||||
def mkdirs(path: str) -> None:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.mkdirs(path)
|
||||
os.makedirs(path, exist_ok=True)
|
||||
|
||||
@staticmethod
|
||||
def rm(path: str) -> None:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.rm(path)
|
||||
os.remove(path)
|
||||
|
||||
@staticmethod
|
||||
def chmod(path: str, mode: int) -> None:
|
||||
if not PathManager.path_requires_pathmanager(path):
|
||||
os.chmod(path, mode)
|
||||
|
||||
@staticmethod
|
||||
def register_handler(handler) -> None:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.register_handler(handler=handler)
|
||||
|
||||
@staticmethod
|
||||
def copy_from_local(
|
||||
local_path: str, dst_path: str, overwrite: bool = False, **kwargs
|
||||
) -> None:
|
||||
if FVCorePathManager:
|
||||
return FVCorePathManager.copy_from_local(
|
||||
local_path=local_path, dst_path=dst_path, overwrite=overwrite, **kwargs
|
||||
)
|
||||
return shutil.copyfile(local_path, dst_path)
|
||||
|
||||
@staticmethod
|
||||
def path_requires_pathmanager(path: str) -> bool:
|
||||
"""Do we require PathManager to access given path?"""
|
||||
if FVCorePathManager:
|
||||
for p in FVCorePathManager._path_handlers.keys():
|
||||
if path.startswith(p):
|
||||
return True
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def supports_rename(path: str) -> bool:
|
||||
# PathManager doesn't yet support renames
|
||||
return not PathManager.path_requires_pathmanager(path)
|
||||
|
||||
@staticmethod
|
||||
def rename(src: str, dst: str):
|
||||
os.rename(src, dst)
|
||||
Reference in New Issue
Block a user