aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'g_sorcery/syncer.py')
-rw-r--r--g_sorcery/syncer.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/g_sorcery/syncer.py b/g_sorcery/syncer.py
new file mode 100644
index 0000000..beeffd4
--- /dev/null
+++ b/g_sorcery/syncer.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+ syncer.py
+ ~~~~~~~~~
+
+ sync helper
+
+ :copyright: (c) 2013-2015 by Jauhien Piatlicki
+ :license: GPL-2, see LICENSE for more details.
+"""
+
+import glob
+import os
+
+from .compatibility import TemporaryDirectory
+
+from .exceptions import SyncError
+from .fileutils import wget
+
+
+class SyncedData(object):
+ """
+ Synced data.
+
+ Directory with sync data is guaranted to exist only as long as this
+ object does.
+ """
+ def __init__(self, directory):
+ self.directory = os.path.abspath(directory)
+
+ def get_path(self):
+ return self.directory
+
+
+class TmpSyncedData(SyncedData):
+ """
+ Synced data that lives in a temporary directory.
+ """
+
+ def __init__(self, directory, tmpdirobj):
+ super(TmpSyncedData, self).__init__(directory)
+ self.tmpdirobj = tmpdirobj
+
+
+class Syncer(object):
+ """
+ Class used to sync data with remote source.
+ """
+
+ def __init__(self, persistent_datadir):
+ self.persistent_datadir = persistent_datadir
+
+ def sync(self, db_uri, repository_config):
+ """
+ Synchronize local directory with remote source.
+
+ Args:
+ db_uri: URI for synchronization with remote source.
+ repository_config: repository config.
+
+ Returns:
+ SyncedData object that gives access to the directory with data.
+ """
+ raise NotImplementedError
+
+
+class TGZSyncer(Syncer):
+ """
+ Class used to download and unpack tarballs.
+ """
+
+ def sync(self, db_uri, repository_config):
+ """
+ Synchronize local directory with remote source.
+
+ Args:
+ db_uri: URI for synchronization with remote source.
+ repository_config: repository config.
+
+ Returns:
+ SyncedData object that gives access to the directory with data.
+ """
+ download_dir = TemporaryDirectory()
+ if wget(db_uri, download_dir.name):
+ raise SyncError('sync failed: ' + db_uri)
+
+ tmp_dir = TemporaryDirectory()
+ for f_name in glob.iglob(os.path.join(download_dir.name, '*.tar.gz')):
+ if os.system("tar -xvzf " + f_name + " -C " + tmp_dir.name):
+ raise SyncError('sync failed (unpacking)')
+
+ tmp_path = os.path.join(tmp_dir.name, os.listdir(tmp_dir.name)[0])
+ del download_dir
+ return TmpSyncedData(tmp_path, tmp_dir)
+
+
+SUPPORTED_SYNCERS = {"tgz": TGZSyncer}
+
+# git_syncer module is optional, we should check if it is installed
+try:
+ from .git_syncer.git_syncer import GITSyncer
+ SUPPORTED_SYNCERS["git"] = GITSyncer
+
+except ImportError as e:
+ pass