openbel-api 0.4.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gemspec +65 -0
- data/CHANGELOG.md +22 -0
- data/INSTALL.md +19 -0
- data/INSTALL_RUBY.md +107 -0
- data/LICENSE +191 -0
- data/README.md +208 -0
- data/app/openbel/api/app.rb +83 -0
- data/app/openbel/api/config.rb +45 -0
- data/app/openbel/api/config.ru +3 -0
- data/app/openbel/api/helpers/pager.rb +109 -0
- data/app/openbel/api/middleware/auth.rb +112 -0
- data/app/openbel/api/resources/adapters/basic_json.rb +52 -0
- data/app/openbel/api/resources/annotation.rb +141 -0
- data/app/openbel/api/resources/base.rb +16 -0
- data/app/openbel/api/resources/completion.rb +89 -0
- data/app/openbel/api/resources/evidence.rb +115 -0
- data/app/openbel/api/resources/evidence_transform.rb +143 -0
- data/app/openbel/api/resources/function.rb +98 -0
- data/app/openbel/api/resources/match_result.rb +79 -0
- data/app/openbel/api/resources/namespace.rb +174 -0
- data/app/openbel/api/routes/annotations.rb +168 -0
- data/app/openbel/api/routes/authenticate.rb +108 -0
- data/app/openbel/api/routes/base.rb +326 -0
- data/app/openbel/api/routes/datasets.rb +519 -0
- data/app/openbel/api/routes/evidence.rb +330 -0
- data/app/openbel/api/routes/expressions.rb +560 -0
- data/app/openbel/api/routes/functions.rb +41 -0
- data/app/openbel/api/routes/namespaces.rb +382 -0
- data/app/openbel/api/routes/root.rb +39 -0
- data/app/openbel/api/schemas.rb +34 -0
- data/app/openbel/api/schemas/annotation_collection.schema.json +20 -0
- data/app/openbel/api/schemas/annotation_resource.schema.json +36 -0
- data/app/openbel/api/schemas/annotation_value_collection.schema.json +21 -0
- data/app/openbel/api/schemas/annotation_value_resource.schema.json +35 -0
- data/app/openbel/api/schemas/completion_collection.schema.json +21 -0
- data/app/openbel/api/schemas/completion_resource.schema.json +146 -0
- data/app/openbel/api/schemas/evidence.schema.json +198 -0
- data/app/openbel/api/schemas/evidence_collection.schema.json +98 -0
- data/app/openbel/api/schemas/evidence_resource.schema.json +29 -0
- data/app/openbel/api/schemas/namespace_value_collection.schema.json +21 -0
- data/app/openbel/api/schemas/namespace_value_resource.schema.json +43 -0
- data/app/openbel/api/util.rb +11 -0
- data/bin/openbel-api +78 -0
- data/bin/openbel-config +46 -0
- data/config/async_evidence.rb +12 -0
- data/config/async_jena.rb +14 -0
- data/config/config.yml +31 -0
- data/config/server_config.rb +184 -0
- data/lib/openbel/api/cache/cache.rb +30 -0
- data/lib/openbel/api/config/config.rb +33 -0
- data/lib/openbel/api/evidence/api.rb +39 -0
- data/lib/openbel/api/evidence/facet_api.rb +18 -0
- data/lib/openbel/api/evidence/facet_filter.rb +83 -0
- data/lib/openbel/api/evidence/mongo.rb +247 -0
- data/lib/openbel/api/evidence/mongo_facet.rb +105 -0
- data/lib/openbel/api/helpers/dependency_graph.rb +52 -0
- data/lib/openbel/api/model/rdf_resource.rb +74 -0
- data/lib/openbel/api/plugin/cache/kyotocabinet.rb +85 -0
- data/lib/openbel/api/plugin/configure_plugins.rb +97 -0
- data/lib/openbel/api/plugin/evidence/evidence.rb +58 -0
- data/lib/openbel/api/plugin/plugin.rb +99 -0
- data/lib/openbel/api/plugin/plugin_manager.rb +20 -0
- data/lib/openbel/api/plugin/plugin_repository.rb +60 -0
- data/lib/openbel/api/storage/cache_proxy.rb +74 -0
- data/lib/openbel/api/storage/triple_storage.rb +43 -0
- metadata +379 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module OpenBEL
|
4
|
+
module Resource
|
5
|
+
module Expressions
|
6
|
+
|
7
|
+
class CompletionSerializer < BaseSerializer
|
8
|
+
adapter Oat::Adapters::HAL
|
9
|
+
schema do
|
10
|
+
type :completion
|
11
|
+
property :type, item[:type]
|
12
|
+
property :label, item[:label]
|
13
|
+
property :value, item[:value]
|
14
|
+
property :highlight, item[:highlight]
|
15
|
+
property :actions, item[:actions]
|
16
|
+
property :id, item[:id]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class CompletionResourceSerializer < BaseSerializer
|
21
|
+
adapter Oat::Adapters::HAL
|
22
|
+
schema do
|
23
|
+
type :completion
|
24
|
+
properties do |p|
|
25
|
+
p.completion item
|
26
|
+
end
|
27
|
+
|
28
|
+
link :self, link_self(item[:id])
|
29
|
+
link :describedby, link_described_by(item[:type], item[:id])
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def link_self(id)
|
35
|
+
{
|
36
|
+
:type => 'completion',
|
37
|
+
:href => "#{base_url}/api/expressions/#{id}/completions"
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def link_described_by(type, id)
|
42
|
+
case type
|
43
|
+
when :function
|
44
|
+
{
|
45
|
+
:type => 'function',
|
46
|
+
:href => "#{base_url}/api/functions/#{id}"
|
47
|
+
}
|
48
|
+
when :namespace_prefix
|
49
|
+
{
|
50
|
+
:type => 'namespace_prefix',
|
51
|
+
:href => "#{base_url}/api/namespaces/#{id}"
|
52
|
+
}
|
53
|
+
when :namespace_value
|
54
|
+
{
|
55
|
+
:type => 'namespace_value',
|
56
|
+
:href => "#{base_url}/api/namespaces/hgnc/#{id}"
|
57
|
+
}
|
58
|
+
else
|
59
|
+
raise NotImplementedError.new("Unexpected resource type, #{type}")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class CompletionCollectionSerializer < BaseSerializer
|
65
|
+
adapter Oat::Adapters::HAL
|
66
|
+
|
67
|
+
schema do
|
68
|
+
type :completion_collection
|
69
|
+
properties do |p|
|
70
|
+
p.completion_collection item
|
71
|
+
end
|
72
|
+
|
73
|
+
link :self, link_self
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def link_self
|
79
|
+
bel = context[:bel]
|
80
|
+
caret_position = context[:caret_position]
|
81
|
+
{
|
82
|
+
:type => :completion_collection,
|
83
|
+
:href => "#{base_url}/api/expressions/#{bel}/completions?caret_position=#{caret_position}"
|
84
|
+
}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'bel'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module OpenBEL
|
5
|
+
module Resource
|
6
|
+
module Evidence
|
7
|
+
|
8
|
+
class EvidenceSerializer < BaseSerializer
|
9
|
+
adapter Oat::Adapters::HAL
|
10
|
+
|
11
|
+
schema do
|
12
|
+
type :evidence
|
13
|
+
property :bel_statement, item['bel_statement']
|
14
|
+
property :citation, item['citation']
|
15
|
+
property :summary_text, item['summary_text']
|
16
|
+
property :experiment_context, item['experiment_context']
|
17
|
+
property :metadata, item['metadata']
|
18
|
+
property :id, item['_id']
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class EvidenceResourceSerializer < BaseSerializer
|
23
|
+
adapter Oat::Adapters::HAL
|
24
|
+
|
25
|
+
schema do
|
26
|
+
type :evidence
|
27
|
+
properties do |p|
|
28
|
+
p.evidence item
|
29
|
+
end
|
30
|
+
|
31
|
+
link :self, link_self
|
32
|
+
link :collection, link_collection
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def link_self
|
38
|
+
id = item[:id] || context[:_id]
|
39
|
+
item.delete(:id)
|
40
|
+
{
|
41
|
+
:type => :evidence,
|
42
|
+
:href => "#{base_url}/api/evidence/#{id}"
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def link_collection
|
47
|
+
{
|
48
|
+
:type => :evidence_collection,
|
49
|
+
:href => "#{base_url}/api/evidence"
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class EvidenceCollectionSerializer < BaseSerializer
|
55
|
+
adapter Oat::Adapters::HAL
|
56
|
+
|
57
|
+
schema do
|
58
|
+
type :evidence_collection
|
59
|
+
property :evidence_collection, item
|
60
|
+
property :facets, context[:facets]
|
61
|
+
property :metadata, context[:metadata]
|
62
|
+
link :self, link_self
|
63
|
+
link :start, link_start
|
64
|
+
link :previous, link_previous
|
65
|
+
link :next, link_next
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def link_self
|
71
|
+
start = context[:start]
|
72
|
+
size = context[:size]
|
73
|
+
{
|
74
|
+
:type => :evidence_collection,
|
75
|
+
:href => "#{base_url}/api/evidence?start=#{start}&size=#{size}&#{filter_query_params.join('&')}"
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
def link_start
|
80
|
+
size = context[:size]
|
81
|
+
{
|
82
|
+
:type => :evidence_collection,
|
83
|
+
:href => "#{base_url}/api/evidence?start=0&size=#{size}&#{filter_query_params.join('&')}"
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def link_previous
|
88
|
+
previous_page = context[:previous_page]
|
89
|
+
return {} unless previous_page
|
90
|
+
|
91
|
+
{
|
92
|
+
:type => :evidence_collection,
|
93
|
+
:href => "#{base_url}/api/evidence?start=#{previous_page.start_offset}&size=#{previous_page.page_size}&#{filter_query_params.join('&')}"
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def link_next
|
98
|
+
next_page = context[:next_page]
|
99
|
+
return {} unless next_page
|
100
|
+
|
101
|
+
{
|
102
|
+
:type => :evidence_collection,
|
103
|
+
:href => "#{base_url}/api/evidence?start=#{next_page.start_offset}&size=#{next_page.page_size}&#{filter_query_params.join('&')}"
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
def filter_query_params
|
108
|
+
context[:filters].map { |filter|
|
109
|
+
"filter=#{filter}"
|
110
|
+
}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'bel'
|
2
|
+
|
3
|
+
module OpenBEL
|
4
|
+
module Resource
|
5
|
+
module Evidence
|
6
|
+
|
7
|
+
class AnnotationTransform
|
8
|
+
|
9
|
+
SERVER_PATTERN = %r{/api/annotations/([^/]*)/values/([^/]*)/?}
|
10
|
+
RDFURI_PATTERN = %r{/bel/namespace/([^/]*)/([^/]*)/?}
|
11
|
+
URI_PATTERNS = [
|
12
|
+
%r{/api/annotations/([^/]*)/values/([^/]*)/?},
|
13
|
+
%r{/bel/namespace/([^/]*)/([^/]*)/?}
|
14
|
+
]
|
15
|
+
ANNOTATION_VALUE_URI = "%s/api/annotations/%s/values/%s"
|
16
|
+
|
17
|
+
def initialize(annotations)
|
18
|
+
@annotations = annotations
|
19
|
+
end
|
20
|
+
|
21
|
+
def transform_evidence!(evidence, base_url)
|
22
|
+
if evidence
|
23
|
+
experiment_context = evidence.experiment_context
|
24
|
+
if experiment_context != nil
|
25
|
+
experiment_context.values.map! { |annotation|
|
26
|
+
transform_annotation(annotation, base_url)
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def transform_annotation(annotation, base_url)
|
33
|
+
if annotation[:uri]
|
34
|
+
transformed = transform_uri(annotation[:uri], base_url)
|
35
|
+
return transformed if transformed != nil
|
36
|
+
end
|
37
|
+
|
38
|
+
if annotation[:name] && annotation[:value]
|
39
|
+
name = annotation[:name]
|
40
|
+
value = annotation[:value]
|
41
|
+
transform_name_value(name, value, base_url)
|
42
|
+
elsif annotation.respond_to?(:each)
|
43
|
+
name = annotation[0]
|
44
|
+
value = annotation[1]
|
45
|
+
transform_name_value(name, value, base_url)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def transform_uri(uri, base_url)
|
52
|
+
URI_PATTERNS.map { |pattern|
|
53
|
+
match = pattern.match(uri)
|
54
|
+
match ? transform_name_value(match[1], match[2], base_url) : nil
|
55
|
+
}.compact.first
|
56
|
+
end
|
57
|
+
|
58
|
+
def transform_name_value(name, value, base_url)
|
59
|
+
structured_annotation(name, value, base_url) || free_annotation(name, value)
|
60
|
+
end
|
61
|
+
|
62
|
+
def structured_annotation(name, value, base_url)
|
63
|
+
annotation = @annotations.find(name).first
|
64
|
+
if annotation
|
65
|
+
if value.respond_to?(:each)
|
66
|
+
{
|
67
|
+
:name => annotation.prefLabel.to_s,
|
68
|
+
:value => value.map { |v|
|
69
|
+
mapped = annotation.find(v).first
|
70
|
+
mapped ? mapped.prefLabel.to_s : v
|
71
|
+
}
|
72
|
+
}
|
73
|
+
else
|
74
|
+
annotation_value = annotation.find(value).first
|
75
|
+
if annotation_value
|
76
|
+
{
|
77
|
+
:name => annotation.prefLabel.to_s,
|
78
|
+
:value => annotation_value.prefLabel.to_s,
|
79
|
+
:uri => ANNOTATION_VALUE_URI % [
|
80
|
+
base_url,
|
81
|
+
annotation.prefix.to_s,
|
82
|
+
annotation_value.identifier.to_s
|
83
|
+
]
|
84
|
+
}
|
85
|
+
else
|
86
|
+
{
|
87
|
+
:name => annotation.prefLabel.to_s,
|
88
|
+
:value => value
|
89
|
+
}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def free_annotation(name, value)
|
96
|
+
{
|
97
|
+
:name => normalize_annotation_name(name),
|
98
|
+
:value => value
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def normalize_annotation_name(name, options = {})
|
103
|
+
name_s = name.to_s
|
104
|
+
|
105
|
+
if name_s.empty?
|
106
|
+
nil
|
107
|
+
else
|
108
|
+
name_s.
|
109
|
+
split(%r{[^a-zA-Z0-9]+}).
|
110
|
+
map! { |word| word.capitalize }.
|
111
|
+
join
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class AnnotationGroupingTransform
|
117
|
+
|
118
|
+
ExperimentContext = ::BEL::Model::ExperimentContext
|
119
|
+
|
120
|
+
def transform_evidence!(evidence)
|
121
|
+
experiment_context = evidence.experiment_context
|
122
|
+
if experiment_context != nil
|
123
|
+
evidence.experiment_context = ExperimentContext.new(
|
124
|
+
experiment_context.group_by { |annotation|
|
125
|
+
annotation[:name]
|
126
|
+
}.values.map do |grouped_annotation|
|
127
|
+
{
|
128
|
+
:name => grouped_annotation.first[:name],
|
129
|
+
:value => grouped_annotation.flat_map { |annotation|
|
130
|
+
annotation[:value]
|
131
|
+
},
|
132
|
+
:uri => grouped_annotation.flat_map { |annotation|
|
133
|
+
annotation[:uri]
|
134
|
+
}
|
135
|
+
}
|
136
|
+
end
|
137
|
+
)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'bel'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module OpenBEL
|
5
|
+
module Resource
|
6
|
+
module Functions
|
7
|
+
|
8
|
+
class FunctionSerializer < BaseSerializer
|
9
|
+
adapter Oat::Adapters::HAL
|
10
|
+
|
11
|
+
schema do
|
12
|
+
type :function
|
13
|
+
properties do |p|
|
14
|
+
p.short_form item[:short_form]
|
15
|
+
p.long_form item[:long_form]
|
16
|
+
p.description item[:description]
|
17
|
+
p.return_type item[:return_type]
|
18
|
+
p.signatures item[:signatures]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class FunctionResourceSerializer < BaseSerializer
|
24
|
+
adapter Oat::Adapters::HAL
|
25
|
+
|
26
|
+
schema do
|
27
|
+
type :function
|
28
|
+
properties do |p|
|
29
|
+
p.functions item
|
30
|
+
end
|
31
|
+
|
32
|
+
link :self, link_self(item.first[:short_form])
|
33
|
+
link :next, link_next
|
34
|
+
link :collection, link_collection
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def link_self(id)
|
40
|
+
{
|
41
|
+
:type => :function,
|
42
|
+
:href => "#{base_url}/api/functions/#{id}"
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def link_collection
|
47
|
+
{
|
48
|
+
:type => :'function_collection',
|
49
|
+
:href => "#{base_url}/api/functions"
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def link_next
|
54
|
+
fx_values = FUNCTIONS.values.uniq.sort_by { |fx|
|
55
|
+
fx[:short_form]
|
56
|
+
}
|
57
|
+
next_fx = fx_values[fx_values.index(item) + 1]
|
58
|
+
{
|
59
|
+
:type => :function,
|
60
|
+
:href => next_fx ?
|
61
|
+
"#{base_url}/api/functions/#{next_fx[:short_form]}" :
|
62
|
+
nil
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class FunctionCollectionSerializer < BaseSerializer
|
68
|
+
adapter Oat::Adapters::HAL
|
69
|
+
|
70
|
+
schema do
|
71
|
+
type :'function_collection'
|
72
|
+
properties do |p|
|
73
|
+
p.functions item
|
74
|
+
end
|
75
|
+
|
76
|
+
link :self, link_self
|
77
|
+
link :start, link_start(item.first[:short_form])
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def link_self
|
83
|
+
{
|
84
|
+
:type => :'function_collection',
|
85
|
+
:href => "#{base_url}/api/functions"
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def link_start(first_function)
|
90
|
+
{
|
91
|
+
:type => :function,
|
92
|
+
:href => "#{base_url}/api/functions/#{first_function}"
|
93
|
+
}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|