view data_stores/vdb_folder.py @ 2:269d246ce6d0 draft default tip

Uploaded
author damion
date Fri, 23 Oct 2015 17:53:29 -0400
parents 5c5027485f7d
children
line wrap: on
line source

#!/usr/bin/python
## ******************************* FILE FOLDER *********************************
##

import re
import os
import vdb_common
import vdb_data_stores

class VDBFolderDataStore(vdb_data_stores.VDBDataStore):

	versions = None
	library = None
	
	def __init__(self, retrieval_obj, spec_file_id):
		"""
		Provides list of available versions where each version is indicated by the 
		existence of a folder that contains its content.  This content can be directly
		in the galaxy Versioned Data folder tree, OR it can be linked to another folder
		on the server.  In the latter case, galaxy will treat the Versioned Data folders as caches.
		View of versions filters out any folders that are used for derivative data caching.
		"""
		super(VDBFolderDataStore, self).__init__(retrieval_obj, spec_file_id)

		self.library = retrieval_obj.library
		
		versions = []
		
		# If data source spec file has no content, use the library folder directly.
		# Name of EACH subfolder should be a label for each version, including date/time and version id.
		if self.data_store_path == '':
			try:
				lib_label_len = len(self.library_label_path) +1 
			
				for item in self.library:
					# If item is under library_label_path ...
					if item['name'][0:lib_label_len] == self.library_label_path + '/':
						item_name = item['name'][lib_label_len:len(item['name'])]
						if item_name.find('/') == -1 and item_name.find('_') != -1:
							(item_date, item_version) = item_name.split('_',1)
							created = vdb_common.parse_date(item_date)	
							versions.append({'name':item_name, 'id':item_name, 'created': created})
		
			except Exception as err: 
				# This is the first call to api so api url or authentication erro can happen here.
				versions.append({
					'name':'Software Error: Unable to get version list: ' + err.message, 
					'id':'',
					'created':''
				})

		else:

			base_file_path = self.data_store_path
			#base_file_path = os.path.dirname(self.base_file_name)
			#Here we need to get directory listing of linked file location.
			for item_name in os.listdir(base_file_path): # Includes files and folders
				# Only interested in folders
				if os.path.isdir( os.path.join(base_file_path, item_name)) and  item_name.find('_') != -1:
					(item_date, item_version) = item_name.split('_',1)
					created = vdb_common.parse_date(item_date)	
					versions.append({'name':item_name, 'id':item_name, 'created': created})

		
		self.versions = sorted(versions, key=lambda x: x['name'], reverse=True)
				
	def get_version(self, version_name):
		"""
		Return server path of requested version info - BUT ONLY IF IT IS LINKED.
		IF NOT LINKED, returns None for self.version_path
		
		QUESTION: DOES GALAXY AUTOMATICALLY HANDLE tar.gz/zip decompression?
		
		@uses library_label_path string Full hierarchic label of a library file or folder, PARENT of version id folder.
		@uses base_file_name string Server absolute path to data_store spec file

		@param version_name alphaneumeric string (git tag)
		"""
		self.version_label = version_name
		self.library_version_path = os.path.join(self.library_label_path, self.version_label)

		if self.data_store_path == '':
			# In this case version content is held in library directly; 
			self.version_path = self.base_file_name

		else:

			#linked to some other folder, spec is location of base_file_name
			self.version_path = os.path.join(self.data_store_path, version_name)