-
Notifications
You must be signed in to change notification settings - Fork 32
/
ruby_example.rb
104 lines (88 loc) · 3.04 KB
/
ruby_example.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
require 'json'
require 'net/http'
require 'uri'
class DgidbApiClient
def initialize(host = 'http://dgidb.org', port = 80, api_version = '/api/v1/')
@connection_uri = URI(host).tap do |uri|
uri.port = port
end
endpoints.each do |endpoint_name, (_, endpoint_path)|
endpoints[endpoint_name][1] = uri_for_endpoint(host, port, api_version, endpoint_path)
end
end
def connect
if block_given?
Net::HTTP.start(@connection_uri.hostname, @connection_uri.port) do |http|
yield http
end
else
Net::HTTP.new(@connection_uri.hostname, @connection_uri.port)
end
end
def query(endpoint, connection = nil, opts = {})
if connection.is_a? Hash
opts = connection
connection = nil
end
given_connection = !!connection
connection ||= connect.start
request = prepare_request(*endpoints[endpoint], opts)
response = connection.request(request)
connection.finish unless given_connection
process_response(response)
end
def available_endpoints
endpoints.keys
end
private
def uri_for_endpoint(host, port, api_version, endpoint)
URI.join(host, api_version, endpoint).tap do |uri|
uri.port = port
end
end
def prepare_request(request_type, uri, opts)
request_type.new(uri).tap do |req|
req.set_form_data(opts)
end
end
def process_response(res)
case res
when Net::HTTPSuccess then
JSON.parse(res.body)
else
raise "Request failed with code #{res.code} and message #{res.body}!"
end
end
def endpoints
@endpoints ||= {
interactions: [Net::HTTP::Post, 'interactions.json'],
interaction_types: [Net::HTTP::Get, 'interaction_types.json'],
interaction_sources: [Net::HTTP::Get, 'interaction_sources.json'],
drug_types: [Net::HTTP::Get, 'drug_types.json'],
gene_categories: [Net::HTTP::Get, 'gene_categories.json'],
source_trust_levels: [Net::HTTP::Get, 'source_trust_levels.json'],
related_genes: [Net::HTTP::Post, 'related_genes.json']
}
end
end
#Create a new API client
#if you are running your own dgidb locally, you can supply custom hostnames and ports
#otherwise you can use the default constructor
client = DgidbApiClient.new('http://localhost', 3000)
#get a list of endpoints that the client supports and print it out
endpoints = client.available_endpoints
puts endpoints
#get a list of source trust levels available for filtering and print it out
source_trust_levels = client.query(:source_trust_levels)
puts source_trust_levels
#Query for drug-gene interactions involving FLT3 or EGFR, but only from expert curated sources
query_params = { source_trust_levels: 'Expert curated', genes: 'FLT3,EGFR' }
interaction_results = client.query(:interactions, query_params)
puts interaction_results
#If you are making multiple requests, you can reuse the same http connection
#for better performance
client.connect do |http|
puts client.query(:drug_types, http)
puts client.query(:interaction_sources, http)
puts client.query(:related_genes, http, { genes: 'MPL,JAKK2' })
end