Enable parallel execution and output of tox env
[osm/common.git] / osm_common / fslocal.py
index b90b25e..5bae0e9 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import os
-import logging
-# import tarfile
 from http import HTTPStatus
+import logging
+import os
 from shutil import rmtree
+import tarfile
+import zipfile
+
 from osm_common.fsbase import FsBase, FsException
 
 __author__ = "Alfonso Tierno <alfonso.tiernosepulveda@telefonica.com>"
 
 
 class FsLocal(FsBase):
-
-    def __init__(self, logger_name='fs', lock=False):
+    def __init__(self, logger_name="fs", lock=False):
         super().__init__(logger_name, lock)
         self.path = None
 
@@ -42,8 +43,11 @@ class FsLocal(FsBase):
             if not self.path.endswith("/"):
                 self.path += "/"
             if not os.path.exists(self.path):
-                raise FsException("Invalid configuration param at '[storage]': path '{}' does not exist".format(
-                    config["path"]))
+                raise FsException(
+                    "Invalid configuration param at '[storage]': path '{}' does not exist".format(
+                        config["path"]
+                    )
+                )
         except FsException:
             raise
         except Exception as e:  # TODO refine
@@ -113,10 +117,10 @@ class FsLocal(FsBase):
             f = "/".join(storage)
         return os.path.getsize(self.path + f)
 
-    def file_extract(self, tar_object, path):
+    def file_extract(self, compressed_object, path):
         """
         extract a tar file
-        :param tar_object: object of type tar
+        :param compressed_object: object of type tar or zip
         :param path: can be a str or a str list, or a tar object where to extract the tar_object
         :return: None
         """
@@ -124,7 +128,13 @@ class FsLocal(FsBase):
             f = self.path + path
         else:
             f = self.path + "/".join(path)
-        tar_object.extractall(path=f)
+
+        if type(compressed_object) is tarfile.TarFile:
+            compressed_object.extractall(path=f)
+        elif (
+            type(compressed_object) is zipfile.ZipFile
+        ):  # Just a check to know if this works with both tar and zip
+            compressed_object.extractall(path=f)
 
     def file_open(self, storage, mode):
         """
@@ -140,9 +150,13 @@ class FsLocal(FsBase):
                 f = "/".join(storage)
             return open(self.path + f, mode)
         except FileNotFoundError:
-            raise FsException("File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND)
+            raise FsException(
+                "File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND
+            )
         except IOError:
-            raise FsException("File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST)
+            raise FsException(
+                "File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST
+            )
 
     def dir_ls(self, storage):
         """
@@ -157,9 +171,13 @@ class FsLocal(FsBase):
                 f = "/".join(storage)
             return os.listdir(self.path + f)
         except NotADirectoryError:
-            raise FsException("File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND)
+            raise FsException(
+                "File {} does not exist".format(f), http_code=HTTPStatus.NOT_FOUND
+            )
         except IOError:
-            raise FsException("File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST)
+            raise FsException(
+                "File {} cannot be opened".format(f), http_code=HTTPStatus.BAD_REQUEST
+            )
 
     def file_delete(self, storage, ignore_non_exist=False):
         """
@@ -176,9 +194,18 @@ class FsLocal(FsBase):
             if os.path.exists(f):
                 rmtree(f)
             elif not ignore_non_exist:
-                raise FsException("File {} does not exist".format(storage), http_code=HTTPStatus.NOT_FOUND)
+                raise FsException(
+                    "File {} does not exist".format(storage),
+                    http_code=HTTPStatus.NOT_FOUND,
+                )
         except (IOError, PermissionError) as e:
-            raise FsException("File {} cannot be deleted: {}".format(f, e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR)
+            raise FsException(
+                "File {} cannot be deleted: {}".format(f, e),
+                http_code=HTTPStatus.INTERNAL_SERVER_ERROR,
+            )
+
+    def sync(self, from_path=None):
+        pass  # Not needed in fslocal
 
-    def sync(self):
+    def reverse_sync(self, from_path):
         pass  # Not needed in fslocal