diff data_stores/vdb_data_stores.py @ 1:5c5027485f7d draft

Uploaded correct file
author damion
date Sun, 09 Aug 2015 16:07:50 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data_stores/vdb_data_stores.py	Sun Aug 09 16:07:50 2015 -0400
@@ -0,0 +1,142 @@
+import vdb_common
+import vdb_retrieval # For message text
+
+class VDBDataStore(object):
+
+	"""
+		Provides data store engine super-class with methods to list available versions, and to generate a version (potentially providing a link to cached version).  Currently have options for git, folder, and kipper.
+		
+		get_data_store_gateway() method loads the appropriate data_stores/vdb_.... data store variant.
+		
+	"""
+	
+	def __init__(self, retrieval_obj, spec_file_id):
+		"""
+		Note that api is only needed for data store type = folder.
+		
+		@init self.type
+		@init self.base_file_name
+		@init self.library_label_path
+		@init self.data_store_path
+		@init self.global_retrieval_date
+		
+		@sets self.library_version_path
+		@sets self.version_label
+		@sets self.version_path
+		"""
+	
+		self.admin_api = retrieval_obj.admin_api
+		self.library_id = retrieval_obj.library_id
+		self.library_label_path = retrieval_obj.get_library_label_path(spec_file_id)
+		try:
+			# Issue: Error probably gets trapped but is never reported back to Galaxy from thread via <code file="versioned_data_form.py" /> form's call?
+			# It appears galaxy user needs more than just "r" permission on this file, oddly? 
+			spec = self.admin_api.libraries.show_folder(self.library_id, spec_file_id)
+
+		except IOError as e:
+			print 'Tried to fetch library folder spec file: %s.  Check permissions?"' % spec_file_id
+			print "I/O error({0}): {1}".format(e.errno, e.strerror)			
+			sys.exit(1)
+
+		self.type = retrieval_obj.test_data_store_type(spec['name'])
+
+		#Server absolute path to data_store spec file (can be Galaxy .dat file representing Galaxy library too.
+
+		self.base_file_name = spec['file_name'] 
+
+		# In all cases a pointer file's content (data_store_path) 
+		# should point to a real server folder (that galaxy has permission to read).
+		# Exception to this is for pointer.folder, where content can be empty, 
+		# in which case idea is to use library folder contents directly.
+ 
+		with open(self.base_file_name,'r') as path_spec:
+			self.data_store_path = path_spec.read().strip()
+			if len(self.data_store_path) > 0:
+				# Let people forget to put a trailing slash on the folder path.
+				if not self.data_store_path[-1] == '/':
+					self.data_store_path += '/'
+		
+		# Generated on subsequent subclass call
+		self.library_version_path = None
+		self.version_label = None
+		self.version_path = None
+		
+	
+	def get_version_options(self, global_retrieval_date=0, version_name=None, selection=False):
+		"""
+		Provides list of available versions of a given archive.  List is filtered by
+		optional global_retrieval_date or version id.  For date filter, the version immediately 
+		preceeding given datetime (includes same datetime) is returned.  
+		All comparisons are done by version NAME not id, because underlying db id might change.
+		
+		If global_retrieval_date datetime preceeds first version, no filtering is done.
+		
+		@param global_retrieval_date long unix time date to test entry against.
+		@param version_name string Name of version
+		@param version_id string Looks like a number, or '' to pull latest id.
+		"""
+
+		data = []
+
+		date_match = vdb_common.date_matcher(global_retrieval_date)
+		found=False
+
+		for ptr, item in enumerate(self.versions):
+			created = float(item['created'])
+			item_name = item['name']
+
+			# Note version_id is often "None", so must come last in conjunction.						
+			selected = (found == False) \
+				and ((item_name == version_name ) or date_match.next(created))
+				
+			if selected == True:
+				found = True
+				if selection==True:
+					return item_name
+
+			# Folder type data stores should already have something resembling created date in name.
+			if type(self).__name__ in 'VDBFolderDataStore VDBBiomajDataStore':
+				item_label = item['name']
+			else:
+				item_label = vdb_common.lightDate(created) + '_' + item['name']
+
+			data.append([item_label, item['name'], selected]) 
+	
+		if not found and len(self.versions) > 0:
+			if global_retrieval_date: # Select oldest date version since no match above.
+				item_name = data[-1][1]
+				data[-1][2] = True
+			else:
+				item_name = data[0][1]
+				data[0][2] = True
+			if selection == True: 
+				return item_name		
+
+
+		# For cosmetic display: Natural sort takes care of version keys that have mixed characters/numbers
+		data = sorted(data, key=lambda el: vdb_common.natural_sort_key(el[0]), reverse=True) #descending
+
+		#Always tag the first item as the most current one
+		if len(data) > 0:
+			data[0][0] = data[0][0] + ' (current)'
+		else:
+			data.append([vdb_retrieval.VDB_DATASET_NOT_AVAILABLE + ' Is pointer file content right? : ' + self.data_store_path,'',False])
+
+		"""
+		globalFound = False
+		for i in range(len(data)):
+			if data[i][2] == True:
+				globalFound = True
+				break
+
+		if globalFound == False:
+			data[0][2] = True 			# And select it if no other date has been selcted
+
+		"""
+
+		return data	
+
+
+	def get_version(self, version_name):
+		# All subclasses must define this.
+		pass