ols 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -3
- data/.rbenv-version +1 -0
- data/.travis.yml +10 -0
- data/Gemfile.lock +76 -0
- data/History.txt +15 -0
- data/README.rdoc +3 -1
- data/lib/ols.rb +14 -12
- data/lib/ols/cache.rb +25 -7
- data/lib/ols/term.rb +24 -18
- data/lib/ols/version.rb +1 -1
- data/ols.gemspec +8 -4
- data/script/console +10 -6
- data/test/fixtures/EMAP0.marshal +0 -0
- data/test/fixtures/MP0000001.marshal +0 -0
- data/test/fixtures/cached_ontologies.yaml +6 -2
- data/test/test_helper.rb +46 -4
- data/test/test_ols_cache.rb +35 -3
- data/test/test_ols_graph.rb +2 -2
- data/test/test_ols_term.rb +19 -17
- data/test/vcr_cassettes_ruby1.8/test_ols.yml +7041 -0
- data/test/vcr_cassettes_ruby1.9.2+/test_ols.yml +8226 -0
- metadata +48 -19
data/.gitignore
CHANGED
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p0
|
data/.travis.yml
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
ols (0.3.3)
|
5
|
+
savon
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
addressable (2.2.6)
|
11
|
+
akami (1.0.0)
|
12
|
+
gyoku (>= 0.4.0)
|
13
|
+
awesome_print (1.0.1)
|
14
|
+
builder (3.0.0)
|
15
|
+
coderay (0.9.8)
|
16
|
+
crack (0.3.1)
|
17
|
+
gyoku (0.4.4)
|
18
|
+
builder (>= 2.1.2)
|
19
|
+
httpi (0.9.5)
|
20
|
+
rack
|
21
|
+
metaclass (0.0.1)
|
22
|
+
method_source (0.6.7)
|
23
|
+
ruby_parser (>= 2.3.1)
|
24
|
+
mocha (0.10.0)
|
25
|
+
metaclass (~> 0.0.1)
|
26
|
+
multi_json (1.0.3)
|
27
|
+
nokogiri (1.5.0)
|
28
|
+
nori (1.0.2)
|
29
|
+
pry (0.9.7.4)
|
30
|
+
coderay (~> 0.9.8)
|
31
|
+
method_source (~> 0.6.7)
|
32
|
+
ruby_parser (>= 2.3.1)
|
33
|
+
slop (~> 2.1.0)
|
34
|
+
rack (1.3.5)
|
35
|
+
rake (0.9.2.2)
|
36
|
+
ruby_parser (2.3.1)
|
37
|
+
sexp_processor (~> 3.0)
|
38
|
+
savon (0.9.7)
|
39
|
+
akami (~> 1.0)
|
40
|
+
builder (>= 2.1.2)
|
41
|
+
gyoku (>= 0.4.0)
|
42
|
+
httpi (~> 0.9)
|
43
|
+
nokogiri (>= 1.4.0)
|
44
|
+
nori (~> 1.0)
|
45
|
+
wasabi (~> 2.0)
|
46
|
+
sexp_processor (3.0.10)
|
47
|
+
shoulda (2.11.3)
|
48
|
+
simplecov (0.5.4)
|
49
|
+
multi_json (~> 1.0.3)
|
50
|
+
simplecov-html (~> 0.5.3)
|
51
|
+
simplecov-html (0.5.3)
|
52
|
+
simplecov-rcov (0.2.3)
|
53
|
+
simplecov (>= 0.4.1)
|
54
|
+
slop (2.1.0)
|
55
|
+
vcr (1.11.3)
|
56
|
+
wasabi (2.0.0)
|
57
|
+
nokogiri (>= 1.4.0)
|
58
|
+
webmock (1.7.8)
|
59
|
+
addressable (~> 2.2, > 2.2.5)
|
60
|
+
crack (>= 0.1.7)
|
61
|
+
|
62
|
+
PLATFORMS
|
63
|
+
ruby
|
64
|
+
|
65
|
+
DEPENDENCIES
|
66
|
+
awesome_print
|
67
|
+
jruby-openssl
|
68
|
+
mocha
|
69
|
+
ols!
|
70
|
+
pry
|
71
|
+
rake
|
72
|
+
shoulda
|
73
|
+
simplecov
|
74
|
+
simplecov-rcov
|
75
|
+
vcr
|
76
|
+
webmock
|
data/History.txt
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
=== 0.3.4 2012-01-18
|
2
|
+
|
3
|
+
* Minor update/clarification - the OLS::Term method .level() is now .depth(),
|
4
|
+
an alias is still in place for .level() though, and when this is called on a
|
5
|
+
term with multiple paths through the graph it will give a depth level for the
|
6
|
+
shortest route through the graph.
|
7
|
+
* Bugfix - the cache functionallity (and test suite) will now work with Ruby 1.8.7.
|
8
|
+
* Bugfix - the OLS::Term methods .all_children() and .all_parents() now return
|
9
|
+
arrays of uniq OLS::Term objects.
|
10
|
+
* Bugfix - when using a cached copy of an ontology, we will now pull the root
|
11
|
+
term out of the cache rather than hitting the soap service.
|
12
|
+
* Bugfix - when caching an ontology, we now grab the metadata for each term
|
13
|
+
and put that into the cache also.
|
14
|
+
* Some code cleaning/refactoring.
|
15
|
+
|
1
16
|
=== 0.3.3 2011-11-11
|
2
17
|
|
3
18
|
* Minor cache modification - hold the marshaled strings in ram rather than repeadedly
|
data/README.rdoc
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
= OLS
|
1
|
+
= OLS {<img src="https://secure.travis-ci.org/dazoakley/ols.png?branch=master" />}[http://travis-ci.org/dazoakley/ols] {<img src="https://gemnasium.com/dazoakley/ols.png?travis" />}[https://gemnasium.com/dazoakley/ols]
|
2
2
|
|
3
|
+
http://rubygems.org/gems/ols
|
3
4
|
http://github.com/dazoakley/ols
|
4
5
|
|
5
6
|
OLS provides a simple interface to the EBI's Ontology Lookup Service (http://www.ebi.ac.uk/ontology-lookup/).
|
@@ -117,6 +118,7 @@ Different cache back-ends and other features will be built into future releases.
|
|
117
118
|
|
118
119
|
Written by Darren Oakley (daz dot oakley at gmail dot com)
|
119
120
|
|
121
|
+
http://rubygems.org/gems/ols
|
120
122
|
http://github.com/dazoakley/ols
|
121
123
|
|
122
124
|
== License
|
data/lib/ols.rb
CHANGED
@@ -62,15 +62,19 @@ module OLS
|
|
62
62
|
# @return [Array] An array of OLS::Term objects for all root terms the requested ontology
|
63
63
|
def root_terms(ontology)
|
64
64
|
root_terms = []
|
65
|
-
|
65
|
+
root_terms = @cache.root_terms(ontology) if using_cache?
|
66
66
|
|
67
|
-
if
|
68
|
-
response
|
67
|
+
if root_terms.empty?
|
68
|
+
response = request(:get_root_terms) { soap.body = { :ontologyName => ontology } }
|
69
|
+
|
70
|
+
if response[:item].is_a? Array
|
71
|
+
response[:item].each do |term|
|
72
|
+
root_terms.push( OLS::Term.new(term[:key],term[:value]) )
|
73
|
+
end
|
74
|
+
else
|
75
|
+
term = response[:item]
|
69
76
|
root_terms.push( OLS::Term.new(term[:key],term[:value]) )
|
70
77
|
end
|
71
|
-
else
|
72
|
-
term = response[:item]
|
73
|
-
root_terms.push( OLS::Term.new(term[:key],term[:value]) )
|
74
78
|
end
|
75
79
|
|
76
80
|
root_terms
|
@@ -199,9 +203,7 @@ module OLS
|
|
199
203
|
end
|
200
204
|
end
|
201
205
|
|
202
|
-
|
203
|
-
|
204
|
-
require
|
205
|
-
require
|
206
|
-
require File.join(directory, 'ols', 'term')
|
207
|
-
require File.join(directory, 'ols', 'cache')
|
206
|
+
require 'ols/version'
|
207
|
+
require 'ols/graph'
|
208
|
+
require 'ols/term'
|
209
|
+
require 'ols/cache'
|
data/lib/ols/cache.rb
CHANGED
@@ -25,7 +25,7 @@ module OLS
|
|
25
25
|
found_term = nil
|
26
26
|
filename = @term_id_to_files[term_id]
|
27
27
|
|
28
|
-
unless filename.nil? || filename.empty?
|
28
|
+
unless filename.nil? || filename.to_s.empty?
|
29
29
|
root_term = Marshal.load( @the_cache[filename] )
|
30
30
|
found_term = root_term.send(:find_in_graph,term_id)
|
31
31
|
end
|
@@ -33,6 +33,21 @@ module OLS
|
|
33
33
|
found_term
|
34
34
|
end
|
35
35
|
|
36
|
+
# Pull root_terms (as OLS::Term objects) out of the cache. Returns an empty array
|
37
|
+
# if the specified ontology is not in the cache.
|
38
|
+
#
|
39
|
+
# @param [String] ontology The ontology name
|
40
|
+
# @return [Array] An array of root terms
|
41
|
+
def root_terms(ontology)
|
42
|
+
root_terms = []
|
43
|
+
|
44
|
+
if @cached_ontologies.keys.include? ontology
|
45
|
+
root_terms = @cached_ontologies[ontology][:root_terms].map { |term_id| self.find_by_id(term_id) }
|
46
|
+
end
|
47
|
+
|
48
|
+
root_terms
|
49
|
+
end
|
50
|
+
|
36
51
|
# Returns a list of the cached ontologies.
|
37
52
|
#
|
38
53
|
# @return [Array] A list of the cached ontologies
|
@@ -47,17 +62,20 @@ module OLS
|
|
47
62
|
def add_ontology_to_cache(ontology)
|
48
63
|
raise ArgumentError, "'#{ontology}' is not a valid OLS ontology" unless OLS.ontologies.include?(ontology)
|
49
64
|
|
50
|
-
|
65
|
+
remove_ontology_from_cache(ontology) if @cached_ontologies.has_key?(ontology)
|
51
66
|
|
52
67
|
OLS.root_terms(ontology).each do |term|
|
53
|
-
term_filename = "#{term.term_id.gsub(':','')}.marshal"
|
54
68
|
term.focus_graph!
|
69
|
+
term.send(:get_term_metadata)
|
70
|
+
term.all_children.each { |child| child.send(:get_term_metadata) }
|
71
|
+
|
72
|
+
term_filename = "#{term.term_id.gsub(':','')}.marshal"
|
55
73
|
File.open("#{@cache_directory}/#{term_filename}",'w') { |f| f << Marshal.dump(term) }
|
56
|
-
|
74
|
+
|
75
|
+
@cached_ontologies[ontology] ||= { :root_terms => [], :filenames => [], :date => Date.today }
|
76
|
+
@cached_ontologies[ontology][:root_terms].push(term.term_id) unless @cached_ontologies[ontology][:root_terms].include? term.term_id
|
57
77
|
@cached_ontologies[ontology][:filenames].push(term_filename) unless @cached_ontologies[ontology][:filenames].include? term_filename
|
58
|
-
new_filenames.push(term_filename)
|
59
78
|
end
|
60
|
-
@cached_ontologies[ontology][:filenames].delete_if { |file| !new_filenames.include?(file) }
|
61
79
|
|
62
80
|
write_cached_ontologies_to_disk
|
63
81
|
prepare_cache
|
@@ -95,7 +113,7 @@ module OLS
|
|
95
113
|
@term_id_to_files = {}
|
96
114
|
@the_cache = {}
|
97
115
|
|
98
|
-
Dir.mkdir(@cache_directory) unless
|
116
|
+
Dir.mkdir(@cache_directory) unless File.directory?(@cache_directory)
|
99
117
|
|
100
118
|
@cached_ontologies = YAML.load( File.open("#{@cache_directory}/cached_ontologies.yaml") ) if File.exists?("#{@cache_directory}/cached_ontologies.yaml")
|
101
119
|
|
data/lib/ols/term.rb
CHANGED
@@ -93,12 +93,18 @@ module OLS
|
|
93
93
|
#
|
94
94
|
# Depth:: Length of the terms path to its root. Depth of a root term is zero.
|
95
95
|
#
|
96
|
+
# If this term has multiple parents (and more than one route through the graph to
|
97
|
+
# the root node) we will return the value for the shortest distance through the graph.
|
98
|
+
#
|
96
99
|
# @return [Number] Depth of this node.
|
97
|
-
|
100
|
+
# @since 0.3.4
|
101
|
+
def depth
|
98
102
|
return 0 if self.is_root?
|
99
|
-
1 + parents.first
|
103
|
+
1 + parents.map(&:depth).sort.first
|
100
104
|
end
|
101
105
|
|
106
|
+
alias :level :depth
|
107
|
+
|
102
108
|
# Returns the root term for this ontology.
|
103
109
|
#
|
104
110
|
# @return [OLS::Term] The root term for this ontology
|
@@ -166,17 +172,17 @@ module OLS
|
|
166
172
|
prev_parents = prev_parents.map(&:parents).flatten
|
167
173
|
end
|
168
174
|
|
169
|
-
parentage_array.reverse.flatten
|
175
|
+
parentage_array.reverse.flatten.uniq
|
170
176
|
end
|
171
177
|
|
172
178
|
# Returns an array of all parent term_ids for this ontology term
|
173
179
|
# (all the way to the top of the ontology). The array is ordered
|
174
|
-
# with the root term first and the most direct parent(s) last.
|
180
|
+
# with the root term first and the most direct parent(s) last.
|
175
181
|
# Duplicates are also filtered out.
|
176
182
|
#
|
177
183
|
# @return [Array] An array of ontology term_ids
|
178
184
|
def all_parent_ids
|
179
|
-
all_parents.map(&:term_id)
|
185
|
+
all_parents.map(&:term_id)
|
180
186
|
end
|
181
187
|
|
182
188
|
# Returns an array of all parent term_names for this ontology term
|
@@ -186,7 +192,7 @@ module OLS
|
|
186
192
|
#
|
187
193
|
# @return [Array] An array of ontology term_names
|
188
194
|
def all_parent_names
|
189
|
-
all_parents.map(&:term_name)
|
195
|
+
all_parents.map(&:term_name)
|
190
196
|
end
|
191
197
|
|
192
198
|
alias :all_parent_term_ids :all_parent_ids
|
@@ -269,7 +275,7 @@ module OLS
|
|
269
275
|
prev_children = prev_children.map(&:children).flatten
|
270
276
|
end
|
271
277
|
|
272
|
-
children_array.flatten
|
278
|
+
children_array.flatten.uniq
|
273
279
|
end
|
274
280
|
|
275
281
|
# Returns an array of all child term_ids for this ontology term
|
@@ -311,13 +317,13 @@ module OLS
|
|
311
317
|
|
312
318
|
# Flesh out and/or focus the ontology graph around this term.
|
313
319
|
#
|
314
|
-
# This will fetch all children and parents for this term, and will also trick each
|
315
|
-
# parent/child object into thinking the ontology graph is fully formed so no further
|
316
|
-
# requests to OLS will be made (to further flesh out the graph). It will also cut down
|
320
|
+
# This will fetch all children and parents for this term, and will also trick each
|
321
|
+
# parent/child object into thinking the ontology graph is fully formed so no further
|
322
|
+
# requests to OLS will be made (to further flesh out the graph). It will also cut down
|
317
323
|
# a much larger ontology graph to just focus on the parents/descendants of this term.
|
318
324
|
#
|
319
|
-
# *NOTE:* This method will totally clobber the existing ontology graph that this term
|
320
|
-
# is part of by removing any term and relationship that is not supposed to be part of this
|
325
|
+
# *NOTE:* This method will totally clobber the existing ontology graph that this term
|
326
|
+
# is part of by removing any term and relationship that is not supposed to be part of this
|
321
327
|
# focused graph. Use #focus_graph to pull out a copy and be non-destructive.
|
322
328
|
#
|
323
329
|
# i.e. This allows us to do the following
|
@@ -356,13 +362,13 @@ module OLS
|
|
356
362
|
|
357
363
|
# Flesh out and/or focus the ontology graph around this term.
|
358
364
|
#
|
359
|
-
# This will fetch all children and parents for this term, and will also trick each
|
360
|
-
# parent/child object into thinking the ontology graph is fully formed so no further
|
361
|
-
# requests to OLS will be made (to further flesh out the graph). It will also cut down
|
365
|
+
# This will fetch all children and parents for this term, and will also trick each
|
366
|
+
# parent/child object into thinking the ontology graph is fully formed so no further
|
367
|
+
# requests to OLS will be made (to further flesh out the graph). It will also cut down
|
362
368
|
# a much larger ontology graph to just focus on the parents/descendants of this term.
|
363
369
|
#
|
364
|
-
# *NOTE:* This method does not affect self. It returns a completley new OLS::Term
|
365
|
-
# object containing a completley new internal OLS::Graph. Use #focus_graph! if you
|
370
|
+
# *NOTE:* This method does not affect self. It returns a completley new OLS::Term
|
371
|
+
# object containing a completley new internal OLS::Graph. Use #focus_graph! if you
|
366
372
|
# wish to cut down the existing graph.
|
367
373
|
#
|
368
374
|
# i.e. This allows us to do the following
|
@@ -513,7 +519,7 @@ module OLS
|
|
513
519
|
write_dot_and_image_file(dotfile,imgfile,fmt,nodes,node_ranks,edges)
|
514
520
|
end
|
515
521
|
|
516
|
-
# Image drawing utility function. This is responsible for writing the DOT
|
522
|
+
# Image drawing utility function. This is responsible for writing the DOT
|
517
523
|
# source file and converting it into the desired image format.
|
518
524
|
#
|
519
525
|
# @param [String] dotfile The DOT filename
|
data/lib/ols/version.rb
CHANGED
data/ols.gemspec
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$LOAD_PATH << File.expand_path("../lib", __FILE__)
|
4
|
+
|
3
5
|
require "ols/version"
|
4
6
|
|
5
7
|
Gem::Specification.new do |s|
|
@@ -21,9 +23,9 @@ Gem::Specification.new do |s|
|
|
21
23
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
24
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
25
|
s.require_paths = ["lib"]
|
24
|
-
|
26
|
+
|
25
27
|
s.add_dependency "savon"
|
26
|
-
|
28
|
+
|
27
29
|
s.add_development_dependency "rake"
|
28
30
|
s.add_development_dependency "shoulda"
|
29
31
|
s.add_development_dependency "vcr"
|
@@ -31,4 +33,6 @@ Gem::Specification.new do |s|
|
|
31
33
|
s.add_development_dependency "simplecov"
|
32
34
|
s.add_development_dependency "simplecov-rcov"
|
33
35
|
s.add_development_dependency "mocha"
|
36
|
+
s.add_development_dependency "awesome_print"
|
37
|
+
s.add_development_dependency "pry"
|
34
38
|
end
|
data/script/console
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# File: script/console
|
3
|
-
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
2
|
|
5
|
-
|
6
|
-
|
3
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__) + '/../lib')
|
4
|
+
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'pry'
|
7
|
+
require 'ols'
|
8
|
+
|
9
|
+
puts "Welcome to the OLS console (note - you're using pry, not irb)"
|
10
|
+
|
11
|
+
Pry.config.prompt = proc { "ols> " }
|
12
|
+
Pry.start
|
7
13
|
|
8
|
-
puts "Loading ols gem"
|
9
|
-
exec "#{irb} #{libs} --simple-prompt"
|
data/test/fixtures/EMAP0.marshal
CHANGED
Binary file
|
Binary file
|
data/test/test_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Add the lib directory to the search path
|
2
|
-
|
2
|
+
$LOAD_PATH.unshift( "#{File.expand_path(File.dirname(__FILE__))}/../lib" )
|
3
3
|
|
4
|
-
require '
|
4
|
+
require 'bundler/setup'
|
5
5
|
|
6
6
|
# Set-up SimpleCov (code coverage tool for Ruby 1.9)
|
7
7
|
if /^1.9/ === RUBY_VERSION
|
@@ -25,11 +25,51 @@ if /^1.9/ === RUBY_VERSION
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
require 'test/unit'
|
28
29
|
require 'shoulda'
|
29
30
|
require 'vcr'
|
31
|
+
require 'webmock'
|
30
32
|
require 'mocha'
|
33
|
+
require 'awesome_print'
|
31
34
|
require 'ols'
|
32
35
|
|
36
|
+
# Backport some useful assertions from minitest
|
37
|
+
if /^1\.8/ === RUBY_VERSION
|
38
|
+
module Test::Unit::Assertions
|
39
|
+
def assert_output stdout = nil, stderr = nil
|
40
|
+
out, err = capture_io do
|
41
|
+
yield
|
42
|
+
end
|
43
|
+
|
44
|
+
x = assert_equal stdout, out, "In stdout" if stdout
|
45
|
+
y = assert_equal stderr, err, "In stderr" if stderr
|
46
|
+
|
47
|
+
(!stdout || x) && (!stderr || y)
|
48
|
+
end
|
49
|
+
|
50
|
+
def assert_silent
|
51
|
+
assert_output "", "" do
|
52
|
+
yield
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def capture_io
|
57
|
+
require 'stringio'
|
58
|
+
|
59
|
+
orig_stdout, orig_stderr = $stdout, $stderr
|
60
|
+
captured_stdout, captured_stderr = StringIO.new, StringIO.new
|
61
|
+
$stdout, $stderr = captured_stdout, captured_stderr
|
62
|
+
|
63
|
+
yield
|
64
|
+
|
65
|
+
return captured_stdout.string, captured_stderr.string
|
66
|
+
ensure
|
67
|
+
$stdout = orig_stdout
|
68
|
+
$stderr = orig_stderr
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
33
73
|
# Set-up VCR for mocking up web requests.
|
34
74
|
VCR.config do |c|
|
35
75
|
if /^1\.8/ === RUBY_VERSION
|
@@ -43,8 +83,10 @@ VCR.config do |c|
|
|
43
83
|
c.stub_with :webmock
|
44
84
|
c.ignore_localhost = true
|
45
85
|
c.default_cassette_options = {
|
46
|
-
:record => :new_episodes,
|
47
|
-
:re_record_interval =>
|
86
|
+
# :record => :new_episodes,
|
87
|
+
# :re_record_interval => 5184000, # 60 days in seconds
|
88
|
+
:record => :none,
|
48
89
|
:match_requests_on => [:uri, :method, :body]
|
49
90
|
}
|
50
91
|
end
|
92
|
+
|