rbbt-util 5.3.4 → 5.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDVhYjZhYjA1ZDQwYzMxM2I4NjJjY2I0NjFhNjMwMzJmMzlmZTFiNg==
4
+ MzQxM2Y1NGU5NjBmNjc1M2IzZWExM2ZiNzU0OWIxNzRiZjYyMjdkNg==
5
5
  data.tar.gz: !binary |-
6
- ZGI5NDE4MDk1ODg5OTIwZjgzOTJiYzQ2MDU2MjgzNWFhOTljNzlmYQ==
6
+ MjUwNjI3OTFhODA5YTQ0ZThkYzM5OWNiZjFjZGRmMDU1MWY3ZjI0NQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NjQ2YTgzMTBhN2ZhNzVlN2RmMTMwYjgyNmQ0NWU2ZWY0ZGQ1MmY3Y2ZhYmZk
10
- NmQzOTc0NmY0ZjdiYTVkZjM4OTFmYmE1YTZlZWQyYWIyYTU2NTY3NzI5NmEx
11
- MzVkMWRmYzI1MjQ4ZDYwMGQzMjA2M2M3NjJjYjk2NmZkM2U1MGQ=
9
+ Y2Y5ZjBmNWVkOTkwZDNiNmI5NTkyMzJkZjZkN2M1OTY1ZmQzZWQyMWY2Zjkz
10
+ YTM3MTIyODJkMmRhZjQwNzI3NTIxZjNiNWQzY2Q0ODlmZDg2ODU1OWUxYTkx
11
+ YTIyOTRjNzA2MGNhZjNmOGVhYmEwMjJjMzZkYjM0ZDNhM2QwZjc=
12
12
  data.tar.gz: !binary |-
13
- MTIxNjlmMjQxMjI2YjhmYjAwYzdkMmEyNjUyYjE1MjFiZDEyM2E5ZWE0Zjhi
14
- ZTRjMzU5MWFiMTUwYzA4YjJkMTNjOWYwMzQzZmU3MDJmMjIzOTMyN2Y4N2Y5
15
- ZWU5MTQxN2RhOThkZWQzYzE5YmM5NTdiZWFiM2QxYWVlYzhiZjY=
13
+ ZDI1MmRlNzhmZGI5ZDJmZGJiNzMyMTkzNjY1ODUyYjQ2ZTM1ZTZlZTBkOTZk
14
+ N2ZlMDAzOGRmOWY3ZmUyZDExZGVlNDVhOTIzMDQzMjhiNTc3MjgzMjA1Y2Rk
15
+ YjUxN2MxMjM3NDEyNTk4MGZjYTI2YjlhODZkOTY0YTg0NjFlOTU=
@@ -24,8 +24,10 @@ module AnnotatedArray
24
24
 
25
25
  value.extend AnnotatedArray if Array === value
26
26
 
27
- value.container = self
28
- value.container_index = pos
27
+ if value.respond_to? :container
28
+ value.container = self
29
+ value.container_index = pos
30
+ end
29
31
 
30
32
  value
31
33
  end
@@ -0,0 +1,256 @@
1
+ require 'rbbt-util'
2
+
3
+ module Association
4
+ class << self
5
+ attr_accessor :databases
6
+ def databases
7
+ @databases ||= {}
8
+ end
9
+ end
10
+
11
+ def self.register(database, file, options = {})
12
+ self.databases[database.to_s] = [file, options]
13
+ end
14
+
15
+ def self.get_database(database)
16
+ self.databases[database.to_s]
17
+ end
18
+
19
+ def self.open_database(database, options = {}, persist_options = {})
20
+ file, database_options = get_database database
21
+ open(file, database_options.merge(options), persist_options)
22
+ end
23
+
24
+ def self.index_database(database, options = {}, persist_options = {})
25
+ file, database_options = databases[database.to_s]
26
+ index(file, database_options.merge(options), persist_options)
27
+ end
28
+
29
+ def self.parse_field_specification(spec, fields)
30
+ spec = spec.split "=>" unless Array === spec
31
+ field_part, final_type = spec
32
+
33
+ field, type = field_part.split "=~"
34
+
35
+ [field, type, final_type]
36
+ end
37
+
38
+ def self.resolve_field(name, fields)
39
+ type = Entity.formats[name]
40
+ return "Field #{ name } could not be resolved: #{fields}" if type.nil?
41
+ field = fields.select{|f| Entity.formats[f] == type}.first
42
+ [field, nil, name]
43
+ end
44
+
45
+ def self.add_reciprocal(tsv)
46
+ new_tsv = {}
47
+ tsv.with_unnamed do
48
+
49
+ tsv.through do |target,v|
50
+ source_values = tsv.type == :double ? Misc.zip_fields(v) : [v]
51
+
52
+ source_values.each do |values|
53
+ source = values.shift
54
+ values.unshift target
55
+ current = new_tsv[source] || tsv[source]
56
+
57
+ case tsv.type
58
+ when :double
59
+ new = current ? current.zip(values).collect{|p| p.flatten} : values.collect{|p| [p]}
60
+ when :flat
61
+ new = current ? (current + values).compact.uniq : values
62
+ end
63
+
64
+ new_tsv[source] = new
65
+ end
66
+ end
67
+
68
+ tsv.merge! new_tsv
69
+ end
70
+
71
+ tsv
72
+ end
73
+
74
+ def self.load_tsv(file, options)
75
+ key_field = TSV.parse_header(file, options).key_field
76
+ fields = TSV.parse_header(file, options).fields
77
+ all_fields = TSV.parse_header(file, options).all_fields
78
+
79
+ source = options[:source] || options[:source_type]
80
+ source = TSV.identify_field key_field, fields, options[:key_field] if source.nil? and options[:key_field]
81
+ source = all_fields[source] if Fixnum === source
82
+ source = key_field if source == :key or source.nil?
83
+
84
+ target = options[:target]
85
+ target = TSV.identify_field key_field, fields, options[:fields].first if target.nil? and options[:fields]
86
+ target = all_fields[target] if Fixnum === target
87
+ target = key_field if target == :key
88
+
89
+ zipped = options[:zipped]
90
+ undirected = options[:undirected]
91
+
92
+ source, source_header, source_final_type = parse_field_specification source, all_fields
93
+ target, target_header, target_final_type = parse_field_specification target, all_fields if target
94
+
95
+ if source and not all_fields.include? source
96
+ Log.debug("Resolving source: #{ source }")
97
+ source, source_header, source_final_type = resolve_field source, all_fields
98
+ Log.debug([source, source_header, source_final_type] * ", ")
99
+ end
100
+
101
+ if target and not all_fields.include? target
102
+ Log.debug("Resolving target: #{ target }")
103
+ target, target_header, target_final_type = resolve_field target, all_fields
104
+ Log.debug([target, target_header, target_final_type] * ", ")
105
+ end
106
+
107
+ source_final_type ||= options[:source_type] if options[:source_type]
108
+ target_final_type ||= options[:target_type] if options[:target_type]
109
+
110
+ Log.debug("Loading associations from: #{ file }")
111
+ Log.debug("sources: #{[source, source_header, source_final_type] * ", "}")
112
+ Log.debug("targets: #{[target, target_header, target_final_type] * ", "}")
113
+ if source != all_fields.first or (target and target != all_fields[1])
114
+ fields = ([target] + (all_fields - [source, target])).compact
115
+ open_options = options.merge({:key_field => source, :fields => fields})
116
+ tsv = TSV.open(file, open_options)
117
+ else
118
+ tsv = TSV.open(file, options)
119
+ end
120
+
121
+ if source_header and tsv.key_field != source_header
122
+ tsv.key_field = source_header
123
+ end
124
+
125
+ if source_final_type and tsv.key_field != source_final_type
126
+ Log.debug("Changing source type from #{tsv.key_field} to #{source_final_type}")
127
+ tsv.with_unnamed do
128
+ tsv = TSVWorkflow.job(:change_id, tsv.filename, :tsv => tsv, :format => source_final_type, :organism => tsv.namespace).exec
129
+ end
130
+ end
131
+
132
+ if target_header and tsv.fields.first != target_header
133
+ tsv.fields = tsv.fields.collect{|f| f == target ? target_header : f }
134
+ end
135
+
136
+ if target_final_type and tsv.fields.first != target_final_type and
137
+ Entity.formats[tsv.fields.first] and
138
+ Entity.formats[tsv.fields.first] == Entity.formats[target_final_type]
139
+
140
+ Log.debug("Changing target type from #{tsv.fields.first} to #{source_final_type}")
141
+ save_key_field = tsv.key_field
142
+ tsv.key_field = "MASKED"
143
+ tsv.with_unnamed do
144
+ tsv = TSVWorkflow.job(:swap_id, tsv.filename, :tsv => tsv, :field => tsv.fields.first, :format => target_final_type, :organism => tsv.namespace).exec
145
+ end
146
+ tsv.key_field = save_key_field
147
+ end
148
+
149
+ if undirected
150
+ tsv = add_reciprocal tsv
151
+ end
152
+
153
+ tsv
154
+ end
155
+
156
+ def self.open(file, options = {}, persist_options = {})
157
+ options = {} if options.nil?
158
+ persist_options = {} if persist_options.nil?
159
+
160
+ namespace = options[:namespace]
161
+ old_file, file = file, file.sub('NAMESPACE', namespace) if namespace and String === file
162
+ old_file.annotate file if Path === old_file
163
+
164
+ Persist.persist_tsv(file, nil, options, {:persist => true, :prefix => "Association"}.merge(persist_options)) do |data|
165
+ options = options.clone
166
+
167
+ tsv = load_tsv(file, options)
168
+
169
+ tsv.annotate(data)
170
+ data.serializer = tsv.type if TokyoCabinet::HDB === data
171
+ data.merge! tsv
172
+ tsv.annotate data
173
+
174
+ data
175
+ end
176
+ end
177
+
178
+ def self.index(file, options = {}, persist_options = {})
179
+ options = {} if options.nil?
180
+ persist_options = {} if persist_options.nil?
181
+
182
+ Persist.persist_tsv(file, nil, options, {:persist => true, :prefix => "Association Index"}.merge(persist_options).merge(:engine => TokyoCabinet::BDB, :serializer => :clean)) do |assocs|
183
+ undirected = options[:undirected]
184
+ tsv = TSV === file ? file : Association.open(file, options, persist_options.merge(:persist => false))
185
+
186
+ key_field = [tsv.key_field, tsv.fields.first.split(":").last, undirected ? "undirected" : nil].compact * "~"
187
+
188
+ TSV.setup(assocs, :key_field => key_field, :fields => tsv.fields[1..-1], :type => :list, :serializer => :list)
189
+
190
+ tsv.with_unnamed do
191
+ tsv.with_monitor :desc => "Extracting annotations" do
192
+ case tsv.type
193
+ when :flat
194
+ tsv.through do |source, targets|
195
+ next if source.nil? or source.empty? or targets.nil? or targets.empty?
196
+
197
+ targets.each do |target|
198
+ next if target.nil? or target.empty?
199
+ key = [source, target] * "~"
200
+ assocs[key] = nil
201
+ end
202
+ end
203
+
204
+ when :double
205
+ tsv.through do |source, values|
206
+ next if values.empty?
207
+ next if source.nil?
208
+ next if values.empty?
209
+ targets = values.first
210
+ rest = Misc.zip_fields values[1..-1]
211
+
212
+ annotations = rest.length > 1 ?
213
+ targets.zip(rest) :
214
+ targets.zip(rest * targets.length)
215
+
216
+ annotations.each do |target, info|
217
+ next if target.nil?
218
+ key = [source, target] * "~"
219
+ assocs[key] = info
220
+ end
221
+ end
222
+ else
223
+ raise "Type not supported: #{tsv.type}"
224
+ end
225
+ end
226
+ end
227
+ assocs.close
228
+
229
+ assocs
230
+ end
231
+ end
232
+
233
+ def self.connections(repo, entities)
234
+ source_field, target_field, undirected = repo.key_field.split("~")
235
+
236
+ source_type = Entity.formats[source_field].to_s
237
+ target_type = Entity.formats[target_field].to_s
238
+
239
+ source_entities = entities[source_type] || entities[source_field]
240
+ target_entities = entities[target_type] || entities[target_field]
241
+
242
+ return [] if source_entities.nil? or target_entities.nil?
243
+
244
+ source_entities.collect do |entity|
245
+ keys = repo.prefix(entity + "~")
246
+ keys.collect do |key|
247
+ source, target = key.split("~")
248
+ next unless target_entities.include? target
249
+ next if undirected and target > source
250
+ info = Hash[*repo.fields.zip(repo[key]).flatten]
251
+
252
+ {:source => source, :target => target, :info => info}
253
+ end.compact
254
+ end.flatten
255
+ end
256
+ end
@@ -10,11 +10,16 @@ module Path
10
10
  string.resource = resource
11
11
  string
12
12
  end
13
+
14
+ def annotate(name)
15
+ Path.setup name.to_s, @pkgdir, @resource
16
+ end
17
+
13
18
  def join(name)
14
19
  if self.empty?
15
- Path.setup name.to_s, @pkgdir, @resource
20
+ self.annotate name.to_s
16
21
  else
17
- Path.setup File.join(self, name.to_s), @pkgdir, @resource
22
+ self.annotate File.join(self, name.to_s)
18
23
  end
19
24
  end
20
25
 
@@ -540,6 +540,17 @@ end
540
540
  peek
541
541
  end
542
542
 
543
+ def summary
544
+ <<-EOF
545
+ Key field = #{key_field}
546
+ Fields = #{fields * ", "}
547
+ Type = #{type}
548
+ Example:
549
+ - #{key = keys.first}: #{self[key].inspect}
550
+
551
+ EOF
552
+ end
553
+
543
554
  def to_hash
544
555
  new = self.dup
545
556
  ENTRY_KEYS.each{|entry| new.delete entry}
@@ -237,19 +237,7 @@ module TSV
237
237
  end
238
238
  end
239
239
 
240
- def self.build_traverse_index(files, options = {})
241
- options = Misc.add_defaults options, :in_namespace => false, :persist_input => true
242
- in_namespace = options[:in_namespace]
243
- persist_input = options[:persist_input]
244
-
245
- path = find_path(files, options)
246
-
247
- return nil if path.nil?
248
-
249
- traversal_ids = path.collect{|p| p.first}
250
-
251
- Log.debug "Found Traversal: #{traversal_ids * " => "}"
252
-
240
+ def self.index_for_traversal(path, persist_input = false)
253
241
  data_key, data_file = path.shift
254
242
  data_index = if data_key == data_file.key_field
255
243
  Log.debug "Data index not required '#{data_file.key_field}' => '#{data_key}'"
@@ -292,6 +280,23 @@ module TSV
292
280
  end
293
281
 
294
282
  current_index
283
+
284
+ end
285
+
286
+ def self.build_traverse_index(files, options = {})
287
+ options = Misc.add_defaults options, :in_namespace => false, :persist_input => true
288
+ in_namespace = options[:in_namespace]
289
+ persist_input = options[:persist_input]
290
+
291
+ path = find_path(files, options)
292
+
293
+ return nil if path.nil?
294
+
295
+ traversal_ids = path.collect{|p| p.first}
296
+
297
+ Log.debug "Found Traversal: #{traversal_ids * " => "}"
298
+
299
+ index_for_traversal path, persist_input
295
300
  end
296
301
 
297
302
 
@@ -187,14 +187,14 @@ module Filtered
187
187
  end
188
188
  end
189
189
 
190
- def filtered_set(key, value)
190
+ def filtered_set(key, value, clean = false)
191
191
  if filters.empty?
192
- self.send(:unfiltered_set, key, value)
192
+ self.send(:unfiltered_set, key, value, clean)
193
193
  else
194
194
  filters.each do |filter|
195
195
  filter.add key if filter.match_entry key, value
196
196
  end
197
- self.send(:unfiltered_set, key, value)
197
+ self.send(:unfiltered_set, key, value, clean)
198
198
  end
199
199
  end
200
200
 
@@ -257,7 +257,7 @@ module TSV
257
257
  data.namespace = namespace
258
258
  data.entity_options = entity_options
259
259
  data.entity_templates = entity_templates
260
- data.type = type
260
+ data.type = zipped ? :list : type
261
261
  end
262
262
  end
263
263
  end
@@ -187,6 +187,12 @@ module TSV
187
187
 
188
188
  def add_to_data_merge_zipped(data, keys, values)
189
189
  num = keys.length
190
+
191
+ if values.first.length > 1 and num == 1
192
+ keys = keys * values.first.length
193
+ num = keys.length
194
+ end
195
+
190
196
  values = values.collect{|v| v.length != num ? [v.first] * num : v}
191
197
  all = values.unshift keys
192
198
  Misc.zip_fields(all).each do |values|
@@ -204,6 +210,12 @@ module TSV
204
210
 
205
211
  def add_to_data_zipped(data, keys, values)
206
212
  num = keys.length
213
+
214
+ if values.first.length > 1 and num == 1
215
+ keys = keys * values.first.length
216
+ num = keys.length
217
+ end
218
+
207
219
  values = values.collect{|v| v.length != num ? [v.first] * num : v}
208
220
  all = values.unshift keys
209
221
  Misc.zip_fields(all).each do |values|
@@ -309,7 +321,6 @@ module TSV
309
321
  options = header_options.merge options
310
322
 
311
323
  @type = Misc.process_options(options, :type) || :double
312
- merge = Misc.process_options(options, :merge) || false
313
324
 
314
325
  @sep2 = Misc.process_options(options, :sep2) || "|"
315
326
  @cast = Misc.process_options options, :cast; @cast = @cast.to_sym if String === @cast
@@ -318,6 +329,9 @@ module TSV
318
329
  @select= Misc.process_options options, :select
319
330
  @zipped = Misc.process_options options, :zipped
320
331
  @namespace = Misc.process_options options, :namespace
332
+ merge = Misc.process_options(options, :merge)
333
+ merge = @zipped if merge.nil?
334
+ merge = false if merge.nil?
321
335
 
322
336
  case @type
323
337
  when :double
data/lib/rbbt/tsv/util.rb CHANGED
@@ -62,13 +62,16 @@ module TSV
62
62
  case
63
63
  when Integer === field
64
64
  field
65
- when (field.nil? or field == :key or key_field == field)
65
+ when (field.nil? or field == :key)
66
66
  :key
67
- when String === field
68
- raise "No fields specified in TSV.identify_field" if fields.nil?
67
+ when (String === field and not fields.nil?)
69
68
  pos = fields.index field
69
+ pos ||= :key if key_field == field
70
70
  Log.medium "Field #{ field } was not found. Options: #{fields * ", "}" if pos.nil?
71
71
  pos
72
+ else
73
+ raise "No fields specified in TSV.identify_field" if fields.nil?
74
+ Log.medium "Field #{ field } was not found. Options: (#{key_field}), #{fields * ", "}"
72
75
  end
73
76
  end
74
77
 
@@ -76,5 +79,55 @@ module TSV
76
79
  TSV.identify_field(key_field, fields, field)
77
80
  end
78
81
 
82
+ def to_double
83
+ new = {}
84
+ case type
85
+ when :double
86
+ self
87
+ when :flat
88
+ through do |k,v|
89
+ new[k] = [v]
90
+ end
91
+ when :single
92
+ through do |k,v|
93
+ new[k] = [[v]]
94
+ end
95
+ when :list
96
+ through do |k,v|
97
+ new[k] = v.collect{|e| [e]}
98
+ end
99
+ end
100
+ self.annotate(new)
101
+ new.type = :double
102
+ new
103
+ end
104
+
105
+ def to_flat(field = nil)
106
+ new = {}
107
+ case type
108
+ when :double
109
+ if field.nil?
110
+ through do |k,v| new[k] = v.first end
111
+ else
112
+ pos = identify_field field
113
+ through do |k,v| new[k] = v[pos] end
114
+ end
115
+ when :flat
116
+ self
117
+ when :single
118
+ through do |k,v|
119
+ new[k] = [v]
120
+ end
121
+ when :list
122
+ through do |k,v|
123
+ new[k] = [v.first]
124
+ end
125
+ end
126
+ self.annotate(new)
127
+ new.type = :flat
128
+ new
129
+ end
130
+
131
+
79
132
 
80
133
  end
data/lib/rbbt/tsv.rb CHANGED
@@ -96,7 +96,7 @@ module TSV
96
96
  Parser.new f, options
97
97
  end
98
98
  when (String === stream and stream.length < 300 and Open.exists? stream)
99
- stream.open do |f|
99
+ Open.open(stream) do |f|
100
100
  Parser.new f, options
101
101
  end
102
102
  else
@@ -184,15 +184,15 @@ module Misc
184
184
  ARRAY_MAX_LENGTH = 1000
185
185
  STRING_MAX_LENGTH = ARRAY_MAX_LENGTH * 10
186
186
 
187
- def self.sanitize_filename(filename, length = 200)
187
+ def self.sanitize_filename(filename, length = 254)
188
188
  if filename.length > length
189
- if filename =~ /(\..{2,4})$/
189
+ if filename =~ /(\..{2,9})$/
190
190
  extension = $1
191
191
  else
192
192
  extension = ''
193
193
  end
194
194
 
195
- post_fix = " TRUNCATED at #{length} (#{filename.length})" + extension
195
+ post_fix = "--#{filename.length}@#{length}_#{Misc.digest(filename)[0..4]}" + extension
196
196
 
197
197
  filename = filename[0..(length - post_fix.length - 1)] << post_fix
198
198
  else
@@ -87,10 +87,11 @@ module NamedArray
87
87
  def [](key, clean = false)
88
88
  pos = Misc.field_position(fields, key)
89
89
  elem = super(pos)
90
+ return elem if clean
90
91
 
91
92
  return elem if @fields.nil? or @fields.empty?
92
93
 
93
- field = NamedArray === @fields ? @fields.named_array_clean_get_brackets(pos) : @fields[pos]
94
+ field = NamedArray === @fields ? @fields[pos, true] : @fields[pos]
94
95
  elem = prepare_entity(elem, field, entity_options)
95
96
  elem
96
97
  end
@@ -12,6 +12,7 @@ class Step
12
12
  class Aborted < Exception; end
13
13
 
14
14
  def initialize(path, task = nil, inputs = nil, dependencies = nil, bindings = nil)
15
+ path = Misc.sanitize_filename path
15
16
  @path = Path.setup(path)
16
17
  @task = task
17
18
  @bindings = bindings
@@ -172,6 +173,10 @@ class Step
172
173
  FileUtils.mkdir_p File.dirname(path) unless Open.exists? File.dirname(path)
173
174
  begin
174
175
  run(true)
176
+ rescue Step::Aborted
177
+ Log.debug("Forked process aborted: #{@path}")
178
+ log :aborted, "Aborted"
179
+ exit -1
175
180
  rescue Exception
176
181
  Log.debug("Exception caught on forked process: #{$!.message}")
177
182
  exit -1
@@ -15,7 +15,7 @@ app_dir = app_dir[app]
15
15
  server = options[:server] || 'thin'
16
16
  Misc.in_dir(app_dir) do
17
17
  require 'rack'
18
- ENV["RBBT_FINDER"] = true if options.include?(:finder)
18
+ ENV["RBBT_FINDER"] = "true" if options.include?(:finder)
19
19
  ENV["RACK_ENV"] = options[:environment] if options.include?(:environment)
20
20
  Rack::Server.start(options.merge(:config => 'config.ru'))
21
21
  end
@@ -0,0 +1,76 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+ require 'rbbt/workflow'
3
+ require 'rbbt/association'
4
+ require 'rbbt/entity'
5
+ require 'rbbt/util/tmpfile'
6
+ require 'test/unit'
7
+
8
+ Workflow.require_workflow "Genomics"
9
+ require 'rbbt/entity/gene'
10
+
11
+ Workflow.require_workflow "TSVWorkflow"
12
+
13
+ TEST_ASSOCIATIONS =<<-EOF
14
+ #: :sep=" "#:namespace=Hsa/jan2013
15
+ #Entity1 Entity2 Score Entity3 Gene
16
+ a A 1 aa TP53
17
+ b B 2 bb KRAS
18
+ c C|K 3|4 cc|kk PTEN|PTEN
19
+ EOF
20
+
21
+ class TestAssociations < Test::Unit::TestCase
22
+
23
+ FAssocs = ""
24
+ DAssocs = ""
25
+ def setup
26
+ FAssocs.replace TmpFile.tmp_file
27
+ DAssocs.replace TmpFile.tmp_file
28
+ Open.write(FAssocs, TEST_ASSOCIATIONS)
29
+ end
30
+ def teardown
31
+ FileUtils.rm FAssocs
32
+ FileUtils.rm_rf DAssocs
33
+ end
34
+
35
+ def test_simple_open
36
+ database = Association.open(FAssocs, {}, :dir => DAssocs)
37
+ assert_equal ["C", "K"], database["c"]["Entity2"]
38
+ end
39
+
40
+ def test_source_open
41
+ database = Association.open(FAssocs, {:source => "Entity2", :zipped => true}, :dir => DAssocs)
42
+ assert_equal ["c", "3", 'cc', "PTEN"], database["C"].flatten
43
+ assert_equal ["c", "4", 'kk', "PTEN"], database["K"].flatten
44
+ end
45
+
46
+ def test_target_open
47
+ database = Association.open(FAssocs, {:source => "Entity2", :target => "Entity3", :zipped => true}, :dir => DAssocs)
48
+ assert_equal ["cc", "c", "3", "PTEN"], database["C"].flatten
49
+ assert_equal ["kk", "c", "4", "PTEN"], database["K"].flatten
50
+ end
51
+
52
+ def test_gene_open
53
+ database = Association.open(FAssocs, {:source => "Gene=~Associated Gene Name", :target => "Entity3", :zipped => true}, :dir => DAssocs)
54
+ assert_equal ["aa"], database["TP53"].first
55
+ end
56
+
57
+ def test_gene_open_translate
58
+ tp53 = Gene.setup("TP53", "Associated Gene Name", "Hsa/jan2013")
59
+ database = Association.open(FAssocs, {:source => "Gene=~Associated Gene Name", :source_type => "Ensembl Gene ID", :target => "Entity3", :zipped => true}, :dir => DAssocs)
60
+ assert_equal ["aa"], database[tp53.ensembl].first
61
+ end
62
+
63
+ def test_gene_target_open_translate
64
+ tp53 = Gene.setup("TP53", "Associated Gene Name", "Hsa/jan2013")
65
+ database = Association.open(FAssocs, {:target => "Gene=~Associated Gene Name=>Ensembl Gene ID", :source => "Entity3", :zipped => true}, :dir => DAssocs)
66
+ assert_equal [tp53.ensembl], database["aa"].first
67
+ end
68
+
69
+ def test_undirected
70
+ require 'rbbt/sources/pina'
71
+ require 'rbbt/gene_associations'
72
+ tp53 = Gene.setup("TP53", "Associated Gene Name", "Hsa/jan2013")
73
+ index = Association.index_database('pina', {:source_type => "Ensembl Gene ID", :target_type => "Ensembl Gene ID", :undirected => true}, {:dir => DAssocs})
74
+ assert Association.connections(index, "Gene" => tp53.pina_interactors.ensembl.compact).any?
75
+ end
76
+ end
@@ -446,5 +446,33 @@ bb Id4
446
446
  assert_equal %w(ValueA ValueB OtherID), tsv1.fields
447
447
  assert_equal %w(Id1 Id4), tsv1["row3"]["OtherID"]
448
448
  end
449
+
450
+ def test_attach_flat
451
+ content1 =<<-EOF
452
+ #Id ValueA ValueB
453
+ row1 a|aa|aaa b
454
+ row2 A B
455
+ EOF
456
+
457
+ content2 =<<-EOF
458
+ #ValueA OtherID
459
+ a Id1|Id2
460
+ A Id3
461
+ EOF
462
+
463
+ tsv1 = tsv2 = index = nil
464
+ TmpFile.with_file(content1) do |filename|
465
+ tsv1 = TSV.open(File.open(filename), :flat, :fields => ["ValueA"], :sep => /\s+/)
466
+ puts tsv1
467
+ end
468
+
469
+ TmpFile.with_file(content2) do |filename|
470
+ tsv2 = TSV.open(File.open(filename), :double, :sep => /\s+/)
471
+ end
472
+
473
+ res = tsv1.attach tsv2, :fields => ["OtherID"]
474
+ puts res
475
+
476
+ end
449
477
  end
450
478
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.4
4
+ version: 5.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-02 00:00:00.000000000 Z
11
+ date: 2013-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -173,6 +173,7 @@ files:
173
173
  - lib/rbbt/annotations.rb
174
174
  - lib/rbbt/annotations/annotated_array.rb
175
175
  - lib/rbbt/annotations/util.rb
176
+ - lib/rbbt/association.rb
176
177
  - lib/rbbt/entity.rb
177
178
  - lib/rbbt/fix_width_table.rb
178
179
  - lib/rbbt/persist.rb
@@ -240,6 +241,7 @@ files:
240
241
  - test/rbbt/tsv/test_attach.rb
241
242
  - test/rbbt/tsv/test_manipulate.rb
242
243
  - test/rbbt/test_fix_width_table.rb
244
+ - test/rbbt/test_association.rb
243
245
  - test/rbbt/test_workflow.rb
244
246
  - test/rbbt/workflow/test_step.rb
245
247
  - test/rbbt/workflow/test_task.rb
@@ -303,6 +305,7 @@ test_files:
303
305
  - test/rbbt/tsv/test_attach.rb
304
306
  - test/rbbt/tsv/test_manipulate.rb
305
307
  - test/rbbt/test_fix_width_table.rb
308
+ - test/rbbt/test_association.rb
306
309
  - test/rbbt/test_workflow.rb
307
310
  - test/rbbt/workflow/test_step.rb
308
311
  - test/rbbt/workflow/test_task.rb