comparison 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
comparison
equal deleted inserted replaced
0:d31a1bd74e63 1:5c5027485f7d
1 import vdb_common
2 import vdb_retrieval # For message text
3
4 class VDBDataStore(object):
5
6 """
7 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.
8
9 get_data_store_gateway() method loads the appropriate data_stores/vdb_.... data store variant.
10
11 """
12
13 def __init__(self, retrieval_obj, spec_file_id):
14 """
15 Note that api is only needed for data store type = folder.
16
17 @init self.type
18 @init self.base_file_name
19 @init self.library_label_path
20 @init self.data_store_path
21 @init self.global_retrieval_date
22
23 @sets self.library_version_path
24 @sets self.version_label
25 @sets self.version_path
26 """
27
28 self.admin_api = retrieval_obj.admin_api
29 self.library_id = retrieval_obj.library_id
30 self.library_label_path = retrieval_obj.get_library_label_path(spec_file_id)
31 try:
32 # Issue: Error probably gets trapped but is never reported back to Galaxy from thread via <code file="versioned_data_form.py" /> form's call?
33 # It appears galaxy user needs more than just "r" permission on this file, oddly?
34 spec = self.admin_api.libraries.show_folder(self.library_id, spec_file_id)
35
36 except IOError as e:
37 print 'Tried to fetch library folder spec file: %s. Check permissions?"' % spec_file_id
38 print "I/O error({0}): {1}".format(e.errno, e.strerror)
39 sys.exit(1)
40
41 self.type = retrieval_obj.test_data_store_type(spec['name'])
42
43 #Server absolute path to data_store spec file (can be Galaxy .dat file representing Galaxy library too.
44
45 self.base_file_name = spec['file_name']
46
47 # In all cases a pointer file's content (data_store_path)
48 # should point to a real server folder (that galaxy has permission to read).
49 # Exception to this is for pointer.folder, where content can be empty,
50 # in which case idea is to use library folder contents directly.
51
52 with open(self.base_file_name,'r') as path_spec:
53 self.data_store_path = path_spec.read().strip()
54 if len(self.data_store_path) > 0:
55 # Let people forget to put a trailing slash on the folder path.
56 if not self.data_store_path[-1] == '/':
57 self.data_store_path += '/'
58
59 # Generated on subsequent subclass call
60 self.library_version_path = None
61 self.version_label = None
62 self.version_path = None
63
64
65 def get_version_options(self, global_retrieval_date=0, version_name=None, selection=False):
66 """
67 Provides list of available versions of a given archive. List is filtered by
68 optional global_retrieval_date or version id. For date filter, the version immediately
69 preceeding given datetime (includes same datetime) is returned.
70 All comparisons are done by version NAME not id, because underlying db id might change.
71
72 If global_retrieval_date datetime preceeds first version, no filtering is done.
73
74 @param global_retrieval_date long unix time date to test entry against.
75 @param version_name string Name of version
76 @param version_id string Looks like a number, or '' to pull latest id.
77 """
78
79 data = []
80
81 date_match = vdb_common.date_matcher(global_retrieval_date)
82 found=False
83
84 for ptr, item in enumerate(self.versions):
85 created = float(item['created'])
86 item_name = item['name']
87
88 # Note version_id is often "None", so must come last in conjunction.
89 selected = (found == False) \
90 and ((item_name == version_name ) or date_match.next(created))
91
92 if selected == True:
93 found = True
94 if selection==True:
95 return item_name
96
97 # Folder type data stores should already have something resembling created date in name.
98 if type(self).__name__ in 'VDBFolderDataStore VDBBiomajDataStore':
99 item_label = item['name']
100 else:
101 item_label = vdb_common.lightDate(created) + '_' + item['name']
102
103 data.append([item_label, item['name'], selected])
104
105 if not found and len(self.versions) > 0:
106 if global_retrieval_date: # Select oldest date version since no match above.
107 item_name = data[-1][1]
108 data[-1][2] = True
109 else:
110 item_name = data[0][1]
111 data[0][2] = True
112 if selection == True:
113 return item_name
114
115
116 # For cosmetic display: Natural sort takes care of version keys that have mixed characters/numbers
117 data = sorted(data, key=lambda el: vdb_common.natural_sort_key(el[0]), reverse=True) #descending
118
119 #Always tag the first item as the most current one
120 if len(data) > 0:
121 data[0][0] = data[0][0] + ' (current)'
122 else:
123 data.append([vdb_retrieval.VDB_DATASET_NOT_AVAILABLE + ' Is pointer file content right? : ' + self.data_store_path,'',False])
124
125 """
126 globalFound = False
127 for i in range(len(data)):
128 if data[i][2] == True:
129 globalFound = True
130 break
131
132 if globalFound == False:
133 data[0][2] = True # And select it if no other date has been selcted
134
135 """
136
137 return data
138
139
140 def get_version(self, version_name):
141 # All subclasses must define this.
142 pass