oba-client 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.md +3 -0
- data/README.md +4 -1
- data/lib/oba-client.rb +53 -40
- metadata +3 -3
data/History.md
CHANGED
data/README.md
CHANGED
@@ -67,7 +67,10 @@ See [the Annotator documentation](http://www.bioontology.org/wiki/index.php/Anno
|
|
67
67
|
:ontologies => [{
|
68
68
|
:localOntologyId => 40404,
|
69
69
|
:name => "Ontology Name",
|
70
|
-
:virtualOntologyId => 1042
|
70
|
+
:virtualOntologyId => 1042,
|
71
|
+
:version => 1.1,
|
72
|
+
:nbAnnotation => 40
|
73
|
+
|
71
74
|
}, "more ontologies..."]
|
72
75
|
|
73
76
|
client2.execute("another text string, maybe longer this time.")
|
data/lib/oba-client.rb
CHANGED
@@ -4,18 +4,26 @@ require "cgi"
|
|
4
4
|
require "net/http"
|
5
5
|
require "uri"
|
6
6
|
|
7
|
+
##
|
8
|
+
# A class for interacting with the Open Biomedical Annotator. There are two
|
9
|
+
# things we do: get text, and parse it. We can do both independently or
|
10
|
+
# serially.
|
7
11
|
class OBAClient
|
8
|
-
VERSION = "2.0.
|
12
|
+
VERSION = "2.0.2"
|
9
13
|
|
14
|
+
##
|
10
15
|
# A high HTTP read timeout, as the service sometimes takes awhile to respond.
|
11
16
|
DEFAULT_TIMEOUT = 30
|
12
17
|
|
18
|
+
##
|
13
19
|
# The endpoint URI for the production version of the Annotator service.
|
14
20
|
DEFAULT_URI = "http://rest.bioontology.org/obs/annotator"
|
15
21
|
|
22
|
+
##
|
16
23
|
# The header for every request. There's no need to specify this per-instance.
|
17
24
|
HEADER = {"Content-Type" => "application/x-www-form-urlencoded"}
|
18
25
|
|
26
|
+
##
|
19
27
|
# Parameters the annotator accepts. Any one not in this list (excluding
|
20
28
|
# textToAnnotate) is not valid.
|
21
29
|
ANNOTATOR_PARAMETERS = [
|
@@ -38,10 +46,7 @@ class OBAClient
|
|
38
46
|
:withSynonyms,
|
39
47
|
]
|
40
48
|
|
41
|
-
|
42
|
-
ANNOTATION_BEANS_XPATH = "/success/data/annotatorResultBean/annotations/annotationBean"
|
43
|
-
ONTOLOGY_BEANS_XPATH = "/success/data/annotatorResultBean/ontologies/ontologyUsedBean"
|
44
|
-
|
49
|
+
##
|
45
50
|
# Instantiate the class with a set of reused options. Options used by the
|
46
51
|
# method are:
|
47
52
|
#
|
@@ -59,7 +64,7 @@ class OBAClient
|
|
59
64
|
if ontologies = options.delete(:ontologies)
|
60
65
|
[:ontologiesToExpand, :ontologiesToKeepInResult].each do |k|
|
61
66
|
if options.include?(k)
|
62
|
-
puts "WARNING: specified both :ontologies and #{k}, ignoring
|
67
|
+
puts "WARNING: specified both :ontologies and #{k}, ignoring #{k}."
|
63
68
|
end
|
64
69
|
options[k] = ontologies
|
65
70
|
end
|
@@ -78,10 +83,11 @@ class OBAClient
|
|
78
83
|
end
|
79
84
|
|
80
85
|
if !@options.include?(:email)
|
81
|
-
puts "TIP: as a courtesy, consider including your email in the request."
|
86
|
+
puts "TIP: as a courtesy, consider including your email in the request (:email => 'a@b.com')"
|
82
87
|
end
|
83
88
|
end
|
84
89
|
|
90
|
+
##
|
85
91
|
# Perform the annotation.
|
86
92
|
# @param [String] text The text to annotate.
|
87
93
|
# @return [Hash<Symbol, Array>, String, nil] A Hash representing the parsed
|
@@ -105,21 +111,14 @@ class OBAClient
|
|
105
111
|
end
|
106
112
|
end
|
107
113
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
case value
|
113
|
-
when "0" then false
|
114
|
-
when "1" then true
|
115
|
-
when "false" then false
|
116
|
-
when "true" then true
|
117
|
-
end
|
118
|
-
end
|
114
|
+
|
115
|
+
STATISTICS_BEANS_XPATH = "/success/data/annotatorResultBean/statistics/statisticsBean"
|
116
|
+
ANNOTATION_BEANS_XPATH = "/success/data/annotatorResultBean/annotations/annotationBean"
|
117
|
+
ONTOLOGY_BEANS_XPATH = "/success/data/annotatorResultBean/ontologies/ontologyUsedBean"
|
119
118
|
|
119
|
+
##
|
120
120
|
# Attributes for mapping concepts (annotation concepts add one additional
|
121
|
-
# attribute.
|
122
|
-
# @see ANNOTATION_CONCEPT_ATTRIBUTES
|
121
|
+
# attribute. See also {ANNOTATION_CONCEPT_ATTRIBUTES}.
|
123
122
|
CONCEPT_ATTRIBUTES = {
|
124
123
|
:id => lambda {|c| c.xpath("id").text.to_i},
|
125
124
|
:localConceptId => lambda {|c| c.xpath("localConceptId").text},
|
@@ -145,31 +144,33 @@ class OBAClient
|
|
145
144
|
end
|
146
145
|
}
|
147
146
|
|
148
|
-
# Annotation concepts have the same attributes as mapping concepts, plus one.
|
149
|
-
ANNOTATION_CONCEPT_ATTRIBUTES = CONCEPT_ATTRIBUTES.merge(
|
150
|
-
:mappingType => lambda {|c| c.xpath("mappingType").text}
|
151
|
-
)
|
152
|
-
|
153
|
-
# Toplevel attributes for annotation contexts.
|
154
|
-
ANNOTATION_CONTEXT_ATTRIBUTES = {
|
155
|
-
:score => lambda {|c| c.xpath("score").text.to_i},
|
156
|
-
:concept => lambda {|c| parse_concept(c.xpath("concept").first)},
|
157
|
-
:context => lambda {|c| parse_context(c.xpath("context").first)}
|
158
|
-
}
|
159
147
|
|
160
|
-
|
148
|
+
##
|
149
|
+
# Toplevel attributes for mapping and mgrep contexts (both will add
|
150
|
+
# additional attributes).
|
161
151
|
CONTEXT_ATTRIBUTES = {
|
162
152
|
:contextName => lambda {|c| c.xpath("contextName").text},
|
163
153
|
:isDirect => lambda {|c| to_b(c.xpath("isDirect").text)},
|
164
154
|
:from => lambda {|c| c.xpath("from").text.to_i},
|
165
155
|
:to => lambda {|c| c.xpath("to").text.to_i},
|
166
156
|
}
|
157
|
+
|
158
|
+
##
|
159
|
+
# Toplevel attributes for annotation contexts.
|
160
|
+
ANNOTATION_CONTEXT_ATTRIBUTES = {
|
161
|
+
:score => lambda {|c| c.xpath("score").text.to_i},
|
162
|
+
:concept => lambda {|c| parse_concept(c.xpath("concept").first)},
|
163
|
+
:context => lambda {|c| parse_context(c.xpath("context").first)}
|
164
|
+
}
|
167
165
|
|
166
|
+
##
|
168
167
|
# Toplevel attributes for mapping contexts.
|
169
168
|
MAPPED_CONTEXT_ATTRIBUTES = CONTEXT_ATTRIBUTES.merge(
|
169
|
+
:mappingType => lambda {|c| c.xpath("mappingType").text},
|
170
170
|
:mappedConcept => lambda {|c| parse_concept(c.xpath("mappedConcept").first)}
|
171
171
|
)
|
172
172
|
|
173
|
+
##
|
173
174
|
# Toplevel attributes for mgrep contexts.
|
174
175
|
MGREP_CONTEXT_ATTRIBUTES = CONTEXT_ATTRIBUTES.merge(
|
175
176
|
:name => lambda {|c| c.xpath("term/name").text},
|
@@ -178,11 +179,6 @@ class OBAClient
|
|
178
179
|
:dictionaryId => lambda {|c| c.xpath("term/dictionaryId").text}
|
179
180
|
)
|
180
181
|
|
181
|
-
CONCEPT_TYPES = {
|
182
|
-
"concept" => ANNOTATION_CONCEPT_ATTRIBUTES,
|
183
|
-
"mappedConcept" => CONCEPT_ATTRIBUTES
|
184
|
-
}
|
185
|
-
|
186
182
|
CONTEXT_CLASSES = {
|
187
183
|
"annotationContextBean" => ANNOTATION_CONTEXT_ATTRIBUTES,
|
188
184
|
"mgrepContextBean" => MGREP_CONTEXT_ATTRIBUTES,
|
@@ -195,7 +191,8 @@ class OBAClient
|
|
195
191
|
# @return Hash<Symbol, Object> The parsed context.
|
196
192
|
def self.parse_context(context)
|
197
193
|
# Annotations (annotationBeans) do not have a class, so we'll refer to them
|
198
|
-
# as annotationContextBeans
|
194
|
+
# as annotationContextBeans. context_class will be one of the types in
|
195
|
+
# {CONTEXT_CLASSES}.
|
199
196
|
context_class = if context.attribute("class").nil?
|
200
197
|
"annotationContextBean"
|
201
198
|
else
|
@@ -213,7 +210,7 @@ class OBAClient
|
|
213
210
|
# @param [Nokogiri::XML::Node] concept The root node of the concept.
|
214
211
|
# @return [Hash<Symbol, Object>] The parsed concept.
|
215
212
|
def self.parse_concept(concept)
|
216
|
-
Hash[
|
213
|
+
Hash[CONCEPT_ATTRIBUTES.map do |k, v|
|
217
214
|
[k, v.call(concept)]
|
218
215
|
end]
|
219
216
|
end
|
@@ -243,7 +240,9 @@ class OBAClient
|
|
243
240
|
{
|
244
241
|
:localOntologyId => ontology.xpath("localOntologyId").text.to_i,
|
245
242
|
:virtualOntologyId => ontology.xpath("virtualOntologyId").text.to_i,
|
246
|
-
:name => ontology.xpath("name").text
|
243
|
+
:name => ontology.xpath("name").text,
|
244
|
+
:version => ontology.xpath("version").text.to_f,
|
245
|
+
:nbAnnotation => ontology.xpath("nbAnnotation").text.to_i
|
247
246
|
}
|
248
247
|
end
|
249
248
|
|
@@ -253,4 +252,18 @@ class OBAClient
|
|
253
252
|
:ontologies => ontologies
|
254
253
|
}
|
255
254
|
end
|
255
|
+
|
256
|
+
##
|
257
|
+
# A little helper: convert a string true/false or 1/0 value to boolean.
|
258
|
+
# AFAIK, there's no better way to do this.
|
259
|
+
# @param [String] value The value to convert.
|
260
|
+
# @return [true, false]
|
261
|
+
def self.to_b(value)
|
262
|
+
case value
|
263
|
+
when "0" then false
|
264
|
+
when "1" then true
|
265
|
+
when "false" then false
|
266
|
+
when "true" then true
|
267
|
+
end
|
268
|
+
end
|
256
269
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oba-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.
|
9
|
+
- 2
|
10
|
+
version: 2.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Rob Tirrell
|