openbel-api 0.4.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.gemspec +65 -0
  3. data/CHANGELOG.md +22 -0
  4. data/INSTALL.md +19 -0
  5. data/INSTALL_RUBY.md +107 -0
  6. data/LICENSE +191 -0
  7. data/README.md +208 -0
  8. data/app/openbel/api/app.rb +83 -0
  9. data/app/openbel/api/config.rb +45 -0
  10. data/app/openbel/api/config.ru +3 -0
  11. data/app/openbel/api/helpers/pager.rb +109 -0
  12. data/app/openbel/api/middleware/auth.rb +112 -0
  13. data/app/openbel/api/resources/adapters/basic_json.rb +52 -0
  14. data/app/openbel/api/resources/annotation.rb +141 -0
  15. data/app/openbel/api/resources/base.rb +16 -0
  16. data/app/openbel/api/resources/completion.rb +89 -0
  17. data/app/openbel/api/resources/evidence.rb +115 -0
  18. data/app/openbel/api/resources/evidence_transform.rb +143 -0
  19. data/app/openbel/api/resources/function.rb +98 -0
  20. data/app/openbel/api/resources/match_result.rb +79 -0
  21. data/app/openbel/api/resources/namespace.rb +174 -0
  22. data/app/openbel/api/routes/annotations.rb +168 -0
  23. data/app/openbel/api/routes/authenticate.rb +108 -0
  24. data/app/openbel/api/routes/base.rb +326 -0
  25. data/app/openbel/api/routes/datasets.rb +519 -0
  26. data/app/openbel/api/routes/evidence.rb +330 -0
  27. data/app/openbel/api/routes/expressions.rb +560 -0
  28. data/app/openbel/api/routes/functions.rb +41 -0
  29. data/app/openbel/api/routes/namespaces.rb +382 -0
  30. data/app/openbel/api/routes/root.rb +39 -0
  31. data/app/openbel/api/schemas.rb +34 -0
  32. data/app/openbel/api/schemas/annotation_collection.schema.json +20 -0
  33. data/app/openbel/api/schemas/annotation_resource.schema.json +36 -0
  34. data/app/openbel/api/schemas/annotation_value_collection.schema.json +21 -0
  35. data/app/openbel/api/schemas/annotation_value_resource.schema.json +35 -0
  36. data/app/openbel/api/schemas/completion_collection.schema.json +21 -0
  37. data/app/openbel/api/schemas/completion_resource.schema.json +146 -0
  38. data/app/openbel/api/schemas/evidence.schema.json +198 -0
  39. data/app/openbel/api/schemas/evidence_collection.schema.json +98 -0
  40. data/app/openbel/api/schemas/evidence_resource.schema.json +29 -0
  41. data/app/openbel/api/schemas/namespace_value_collection.schema.json +21 -0
  42. data/app/openbel/api/schemas/namespace_value_resource.schema.json +43 -0
  43. data/app/openbel/api/util.rb +11 -0
  44. data/bin/openbel-api +78 -0
  45. data/bin/openbel-config +46 -0
  46. data/config/async_evidence.rb +12 -0
  47. data/config/async_jena.rb +14 -0
  48. data/config/config.yml +31 -0
  49. data/config/server_config.rb +184 -0
  50. data/lib/openbel/api/cache/cache.rb +30 -0
  51. data/lib/openbel/api/config/config.rb +33 -0
  52. data/lib/openbel/api/evidence/api.rb +39 -0
  53. data/lib/openbel/api/evidence/facet_api.rb +18 -0
  54. data/lib/openbel/api/evidence/facet_filter.rb +83 -0
  55. data/lib/openbel/api/evidence/mongo.rb +247 -0
  56. data/lib/openbel/api/evidence/mongo_facet.rb +105 -0
  57. data/lib/openbel/api/helpers/dependency_graph.rb +52 -0
  58. data/lib/openbel/api/model/rdf_resource.rb +74 -0
  59. data/lib/openbel/api/plugin/cache/kyotocabinet.rb +85 -0
  60. data/lib/openbel/api/plugin/configure_plugins.rb +97 -0
  61. data/lib/openbel/api/plugin/evidence/evidence.rb +58 -0
  62. data/lib/openbel/api/plugin/plugin.rb +99 -0
  63. data/lib/openbel/api/plugin/plugin_manager.rb +20 -0
  64. data/lib/openbel/api/plugin/plugin_repository.rb +60 -0
  65. data/lib/openbel/api/storage/cache_proxy.rb +74 -0
  66. data/lib/openbel/api/storage/triple_storage.rb +43 -0
  67. metadata +379 -0
@@ -0,0 +1,98 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema",
3
+ "description": "DESCRIBE EVIDENCE COLLECTION",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": [
7
+ "evidence_collection",
8
+ "facets"
9
+ ],
10
+ "properties": {
11
+ "evidence_collection": {
12
+ "type": "array",
13
+ "minItems": 0,
14
+ "title": "",
15
+ "description": "",
16
+ "items": {
17
+ "$ref":"evidence_resource.schema.json"
18
+ }
19
+ },
20
+ "facets": {
21
+ "type": "array",
22
+ "minItems": 0,
23
+ "title": "",
24
+ "description": "",
25
+ "items": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": [
29
+ "category",
30
+ "name",
31
+ "value",
32
+ "filter",
33
+ "count"
34
+ ],
35
+ "properties": {
36
+ "category": {
37
+ "type": "string"
38
+ },
39
+ "name": {
40
+ "type": "string"
41
+ },
42
+ "value": {
43
+ "type": "string"
44
+ },
45
+ "filter": {
46
+ "type": "string"
47
+ },
48
+ "count": {
49
+ "type": "integer"
50
+ }
51
+ }
52
+ }
53
+ },
54
+ "metadata": {
55
+ "title": "Metadata",
56
+ "description": "Data about the evidence collection",
57
+ "type": "object",
58
+ "additionalProperties": true,
59
+ "properties": {
60
+ "collection_paging": {
61
+ "type": "object",
62
+ "properties": {
63
+ "total": {
64
+ "title": "Total",
65
+ "description": "The total number of resources in this collection.",
66
+ "type": "number",
67
+ "minimum": 0
68
+ },
69
+ "total_filtered": {
70
+ "title": "Total Filtered",
71
+ "description": "The total number of resources in the filtered collection.",
72
+ "type": "number",
73
+ "minimum": 0
74
+ },
75
+ "total_pages": {
76
+ "title": "Total Pages",
77
+ "description": "The total number of pages (i.e. sized partitions) in the filtered collection.",
78
+ "type": "number",
79
+ "minimum": 0
80
+ },
81
+ "current_page": {
82
+ "title": "Current Page",
83
+ "description": "The current page of the filtered collection that this resource represents.",
84
+ "type": "number",
85
+ "minimum": 0
86
+ },
87
+ "current_page_size": {
88
+ "title": "Current Page Size",
89
+ "description": "The number of resources in the current page of the filtered collection.",
90
+ "type": "number",
91
+ "minimum": 0
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema",
3
+ "title": "Evidence Resource",
4
+ "description": "A single evidence resource.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "evidence"
9
+ ],
10
+ "properties": {
11
+ "allOf": [
12
+ {
13
+ "$ref":"evidence.schema.json"
14
+ },
15
+ {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": [
19
+ "links"
20
+ ],
21
+ "properties": {
22
+ "links": {
23
+ "type": "object"
24
+ }
25
+ }
26
+ }
27
+ ]
28
+ }
29
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema",
3
+ "title": "Namespace Value Collection",
4
+ "description": "A collection of namespace value resources.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "namespace_value_collection"
9
+ ],
10
+ "properties": {
11
+ "namespace_value_collection": {
12
+ "type": "array",
13
+ "minItems": 0,
14
+ "title": "",
15
+ "description": "",
16
+ "items": {
17
+ "$ref":"http://next.belframework.org/schemas/namespace_value_resource.schema.json"
18
+ }
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-04/schema",
3
+ "title": "Namespace Value Resource",
4
+ "description": "A single namespace value within a BEL Namespace.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "namespace_value"
9
+ ],
10
+ "properties": {
11
+ "namespace_value": {
12
+ "type": "object",
13
+ "additionalProperties": false,
14
+ "required": [
15
+ "type",
16
+ "identifier",
17
+ "name",
18
+ "title",
19
+ "species"
20
+ ],
21
+ "properties": {
22
+ "type": {
23
+ "type": "string"
24
+ },
25
+ "identifier": {
26
+ "type": "string"
27
+ },
28
+ "name": {
29
+ "type": "string"
30
+ },
31
+ "title": {
32
+ "type": ["null", "string"]
33
+ },
34
+ "species": {
35
+ "type": ["null", "string"]
36
+ },
37
+ "match_text": {
38
+ "type": "string"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,11 @@
1
+ require 'pathname'
2
+
3
+ module OpenBEL
4
+ module Util
5
+ def self.path(*args)
6
+ return nil if args.empty?
7
+ tokens = args.flatten
8
+ tokens.reduce(Pathname(tokens.shift)) { |path, t| path += t }
9
+ end
10
+ end
11
+ end
data/bin/openbel-api ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env jruby
2
+
3
+ require 'optparse'
4
+ require 'puma/cli'
5
+
6
+ ORIGINAL_ARGV = ARGV.dup
7
+ OPENBEL_ARGV = ARGV.slice_before('--').to_a[0]
8
+ PUMA_ARGV = ARGV.slice_after('--').to_a[1] || []
9
+
10
+ ROOT = File.expand_path('..', File.dirname(__FILE__))
11
+ config_file = ENV['OPENBEL_API_CONFIG_FILE']
12
+
13
+ exec('puma', '--help') if ['-h', '--help'].any? {|opt| PUMA_ARGV.include?(opt) }
14
+
15
+ # Parse OpenBEL API arguments.
16
+ options = {}
17
+ parser = OptionParser.new do |opts|
18
+ opts.banner = %Q{
19
+ Runs the OpenBEL API application using the Puma HTTP server (Ruby).
20
+
21
+ Usage:
22
+
23
+ openbel-api -f [FILE] -- [Puma options]
24
+
25
+ Detail:
26
+
27
+ The command-line is divided into OpenBEL API and Puma options. These options
28
+ are divided using the "--" delimiter.
29
+
30
+ OpenBEL API
31
+ ===========
32
+
33
+ The first set of options pertain to the OpenBEL API.
34
+
35
+ A configuration file must be provided for the OpenBEL API application.
36
+ This can be provided by setting the OPENBEL_API_CONFIG_FILE environment
37
+ variable or by passing the "-f" option.
38
+
39
+ Puma HTTP Server
40
+ ================
41
+
42
+ The second set of options pertain to the Puma HTTP server. This includes
43
+ settings like bind interface, port, PID file, etc. To see all options for
44
+ Puma run:
45
+
46
+ openbel-api -- --help
47
+
48
+ OpenBEL API Options
49
+ ===================
50
+ }
51
+
52
+ opts.on('-f', '--file FILE', 'The file where the configuration will be written.') do |file|
53
+ options[:file] = file
54
+ end
55
+ end
56
+
57
+ parser.default_argv = OPENBEL_ARGV
58
+ parser.parse!
59
+
60
+ if options[:file]
61
+ config_file = options[:file]
62
+ end
63
+
64
+ begin
65
+ File.open(config_file, 'r')
66
+ rescue SystemCallError => err
67
+ if err.class.name.start_with?('Errno::')
68
+ $stderr.puts %Q{The configuration file "#{File.expand_path(config_file)}" cannot be read.\nError: #{err.message}}
69
+ exit 1
70
+ else
71
+ raise err
72
+ end
73
+ end
74
+
75
+ ENV['OPENBEL_API_CONFIG_FILE'] = config_file
76
+
77
+ # Run Puma.
78
+ exec('puma', *PUMA_ARGV, "#{File.join(ROOT, 'app', 'openbel', 'api', 'config.ru')}")
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env jruby
2
+ require 'optparse'
3
+
4
+ # options; any default go here
5
+ options = {}
6
+
7
+ # parse options from cli
8
+ OptionParser.new do |opts|
9
+ opts.banner = %Q{
10
+ Writes an OpenBEL configuration file (YAML format).
11
+
12
+ Usage: openbel-config -f [FILE]
13
+ }.gsub(/^ +/, '')
14
+
15
+ opts.on('-f', '--file FILE', 'The file where the configuration will be written.') do |file|
16
+ options[:file] = file
17
+ end
18
+ end.parse!
19
+
20
+ # resolve path for config.yml template
21
+ CONFIG = File.join(File.expand_path('..', File.dirname(__FILE__)), 'config', 'config.yml')
22
+
23
+ # sanity check
24
+ unless File.readable?(CONFIG)
25
+ $stderr.puts %Q{The configuration template cannot be read. Path was "#{CONFIG}".}
26
+ exit 1
27
+ end
28
+
29
+ # write out the config
30
+ if options[:file]
31
+ begin
32
+ File.open(options[:file], 'w') do |f|
33
+ f.write(File.read(CONFIG))
34
+ end
35
+ rescue SystemCallError => err
36
+ if err.class.name.start_with?('Errno::')
37
+ $stderr.puts %Q{The file option "#{options[:file]}" cannot be written.\nError: #{err.message}}
38
+ exit 1
39
+ else
40
+ raise err
41
+ end
42
+ end
43
+ $stdout.puts "Wrote configuration template to path #{options[:file]}."
44
+ else
45
+ $stdout.puts(File.read(CONFIG))
46
+ end
@@ -0,0 +1,12 @@
1
+ # $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ # require 'evidence/mongo'
3
+ # config['evidence'] = OpenBEL::Evidence::Evidence.new(mongo)
4
+
5
+ # mongo = {
6
+ # :host => 'localhost',
7
+ # :port => 27017,
8
+ # :database => 'openbel'
9
+ # }
10
+
11
+ require 'em-mongo'
12
+ config['evidence_collection'] = EM::Mongo::Connection.new('localhost', 27017).db('openbel').collection('evidence')
@@ -0,0 +1,14 @@
1
+ require 'bel'
2
+
3
+ # Use Jena RdfRepository plugin from bel.rb.
4
+ config['rdf_repository'] = BEL::RdfRepository.plugins[:jena].create_repository(:tdb_directory => 'data2')
5
+ $stdout.puts "Initialized rdf/jena."
6
+
7
+ # Include RDF monkeypatch of BEL::Model classes.
8
+ BEL::Translator.plugins[:rdf].create_translator
9
+ $stdout.puts "Loaded monkey patch for BEL RDF methods."
10
+
11
+ # Bootstrap
12
+ require 'rdf'
13
+ UUID.generate
14
+ $stdout.puts "Bootstrapped RDF (uuid)."
data/config/config.yml ADDED
@@ -0,0 +1,31 @@
1
+ # Configuration template for OpenBEL API
2
+
3
+ # Storage of evidence through the Mongo database.
4
+ evidence_store:
5
+ mongo:
6
+ host: 'localhost'
7
+ port: 27017
8
+ database: 'openbel'
9
+
10
+ # RDF dataset for BEL datasets, annotations, and namespaces using Apache Jena.
11
+ resource_rdf:
12
+ jena:
13
+ tdb_directory: 'biological-concepts-rdf'
14
+
15
+ # Full-text search over annotation and namespace values using SQLite.
16
+ resource_search:
17
+ sqlite:
18
+ database_file: 'biological-concepts-rdf.db'
19
+
20
+ # Set a secret used during session creation....
21
+ session_secret: 'changeme'
22
+
23
+ # User authentication using Auth0.
24
+ auth:
25
+ enabled: false
26
+ redirect: 'https://openbel.auth0.com/authorize?response_type=code&scope=openid%20profile&client_id=K4oAPUaROjbWWTCoAhf0nKYfTGsZWbHE'
27
+ default_connection: 'linkedin'
28
+ domain: 'openbel.auth0.com'
29
+ id: 'K4oAPUaROjbWWTCoAhf0nKYfTGsZWbHE'
30
+ # secret: 'auth0 client secret here'
31
+
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env puma
2
+
3
+ tag 'OBP - API'
4
+
5
+ pidfile 'openbel-api.pid'
6
+
7
+ # if ENV['SERVER_AS_DAEMON'].to_i == 1
8
+ # daemonize true
9
+ #
10
+ # require 'fileutils'
11
+ # stdout_file = ENV['OUT_SERVER_STDOUT']
12
+ # FileUtils.mkdir_p File.dirname(stdout_file)
13
+ # stderr_file = ENV['OUT_SERVER_STDERR']
14
+ # FileUtils.mkdir_p File.dirname(stderr_file)
15
+ # stdout_redirect stdout_file, stderr_file
16
+ # end
17
+
18
+ bind 'tcp://0.0.0.0:9000'
19
+
20
+ threads 1, 8
21
+
22
+ # The directory to operate out of.
23
+ #
24
+ # The default is the current directory.
25
+ #
26
+ # directory '/u/apps/lolcat'
27
+
28
+ # Use an object or block as the rack application. This allows the
29
+ # config file to be the application itself.
30
+ #
31
+ # app do |env|
32
+ # puts env
33
+ #
34
+ # body = 'Hello, World!'
35
+ #
36
+ # [200, { 'Content-Type' => 'text/plain', 'Content-Length' => body.length.to_s }, [body]]
37
+ # end
38
+
39
+ # Load “path” as a rackup file.
40
+ #
41
+ # The default is “config.ru”.
42
+ #
43
+ # rackup '/u/apps/lolcat/config.ru'
44
+
45
+ # Set the environment in which the rack's app will run. The value must be a string.
46
+ #
47
+ # The default is “development”.
48
+ #
49
+ # environment 'production'
50
+
51
+ # Daemonize the server into the background. Highly suggest that
52
+ # this be combined with “pidfile” and “stdout_redirect”.
53
+ #
54
+ # The default is “false”.
55
+ #
56
+ # daemonize
57
+ # daemonize false
58
+
59
+ # Store the pid of the server in the file at “path”.
60
+ #
61
+ # pidfile '/u/apps/lolcat/tmp/pids/puma.pid'
62
+
63
+ # Use “path” as the file to store the server info state. This is
64
+ # used by “pumactl” to query and control the server.
65
+ #
66
+ # state_path '/u/apps/lolcat/tmp/pids/puma.state'
67
+
68
+ # Redirect STDOUT and STDERR to files specified. The 3rd parameter
69
+ # (“append”) specifies whether the output is appended, the default is
70
+ # “false”.
71
+ #
72
+ # stdout_redirect '/u/apps/lolcat/log/stdout', '/u/apps/lolcat/log/stderr'
73
+ # stdout_redirect '/u/apps/lolcat/log/stdout', '/u/apps/lolcat/log/stderr', true
74
+
75
+ # Disable request logging.
76
+ #
77
+ # The default is “false”.
78
+ #
79
+ # quiet
80
+
81
+ # Configure “min” to be the minimum number of threads to use to answer
82
+ # requests and “max” the maximum.
83
+ #
84
+ # The default is “0, 16”.
85
+ #
86
+ # threads 0, 16
87
+
88
+ # Bind the server to “url”. “tcp://”, “unix://” and “ssl://” are the only
89
+ # accepted protocols.
90
+ #
91
+ # The default is “tcp://0.0.0.0:9292”.
92
+ #
93
+ # bind 'tcp://0.0.0.0:9292'
94
+ # bind 'unix:///var/run/puma.sock'
95
+ # bind 'unix:///var/run/puma.sock?umask=0111'
96
+ # bind 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'
97
+
98
+ # Instead of “bind 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'” you
99
+ # can also use the “ssl_bind” option.
100
+ #
101
+ # ssl_bind '127.0.0.1', '9292', { key: path_to_key, cert: path_to_cert }
102
+
103
+ # Code to run before doing a restart. This code should
104
+ # close log files, database connections, etc.
105
+ #
106
+ # This can be called multiple times to add code each time.
107
+ #
108
+ # on_restart do
109
+ # puts 'On restart...'
110
+ # end
111
+
112
+ # Command to use to restart puma. This should be just how to
113
+ # load puma itself (ie. 'ruby -Ilib bin/puma'), not the arguments
114
+ # to puma, as those are the same as the original process.
115
+ #
116
+ # restart_command '/u/app/lolcat/bin/restart_puma'
117
+
118
+ # === Cluster mode ===
119
+
120
+ # How many worker processes to run.
121
+ #
122
+ # The default is “0”.
123
+ #
124
+ # workers 2
125
+
126
+ # Code to run when a worker boots to setup the process before booting
127
+ # the app.
128
+ #
129
+ # This can be called multiple times to add hooks.
130
+ #
131
+ # on_worker_boot do
132
+ # puts 'On worker boot...'
133
+ # end
134
+
135
+ # Code to run when a worker boots to setup the process after booting
136
+ # the app.
137
+ #
138
+ # This can be called multiple times to add hooks.
139
+ #
140
+ # after_worker_boot do
141
+ # puts 'On worker boot...'
142
+ # end
143
+
144
+ # Code to run when a worker shutdown.
145
+ #
146
+ #
147
+ # on_worker_shutdown do
148
+ # puts 'On worker boot...'
149
+ # end
150
+
151
+ # Allow workers to reload bundler context when master process is issued
152
+ # a USR1 signal. This allows proper reloading of gems while the master
153
+ # is preserved across a phased-restart. (incompatible with preload_app)
154
+ # (off by default)
155
+
156
+ # prune_bundler
157
+
158
+ # Preload the application before starting the workers; this conflicts with
159
+ # phased restart feature. (off by default)
160
+
161
+ # preload_app!
162
+
163
+ # Additional text to display in process listing
164
+ #
165
+ # tag 'app name'
166
+
167
+ # Change the default timeout of workers
168
+ #
169
+ # worker_timeout 60
170
+
171
+ # === Puma control rack application ===
172
+
173
+ # Start the puma control rack application on “url”. This application can
174
+ # be communicated with to control the main server. Additionally, you can
175
+ # provide an authentication token, so all requests to the control server
176
+ # will need to include that token as a query parameter. This allows for
177
+ # simple authentication.
178
+ #
179
+ # Check out https://github.com/puma/puma/blob/master/lib/puma/app/status.rb
180
+ # to see what the app has available.
181
+ #
182
+ # activate_control_app 'unix:///var/run/pumactl.sock'
183
+ # activate_control_app 'unix:///var/run/pumactl.sock', { auth_token: '12345' }
184
+ # activate_control_app 'unix:///var/run/pumactl.sock', { no_token: true }