assaydepot 0.0.5 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/Gemfile +0 -1
- data/README.md +23 -7
- data/assaydepot.gemspec +4 -4
- data/lib/assaydepot/client.rb +29 -18
- data/lib/assaydepot/endpoints.rb +107 -42
- data/lib/assaydepot/model.rb +147 -103
- data/lib/assaydepot/version.rb +1 -1
- data/spec/assaydepot_backoffice_spec.rb +30 -0
- data/spec/assaydepot_spec.rb +6 -7
- data/spec/assaydepot_wrapper_spec.rb +29 -30
- metadata +12 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ac3e59291589c598212136d3054ea0c5abc24c594b7278f3ab69b28c25fa7509
|
4
|
+
data.tar.gz: 3cabe89cd8cd5c7828a6de608ccf5587867ab707bbda355900b6cd9830c50528
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e68c24ab5fd611118b446d7a987336a364d062dd772fa2b920b213f4611f08bd64a0895d0501934bc5679e9cfc3d2092d1c9bf5164e4afec34bd1bcb50e78b94
|
7
|
+
data.tar.gz: 0c0c9f56eca381700ccb7cdc2c9d25823ecfb932e5b8f297330b976dd7e9504f1a6bcd101223123d66d3b9a2702217c1014c9b07cd4b2bbdb89a861c40064003
|
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--format documentation
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# Scientist.com
|
2
2
|
|
3
|
-
Ruby interface for Assay Depot's
|
3
|
+
Ruby interface for Scientist.com's (formerly Assay Depot's) research services marketplace (http://www.scientist.com).
|
4
4
|
|
5
|
-
##
|
5
|
+
## Scientist.com Developer Program
|
6
6
|
|
7
|
-
An authentication token is required for the API to function. If you would like access to the API, please email
|
7
|
+
An authentication token is required for the API to function. If you would like access to the API, please email support@scientist.com.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -22,16 +22,32 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Basic Usage
|
24
24
|
|
25
|
+
### Storefront
|
26
|
+
|
25
27
|
```ruby
|
26
28
|
require 'assaydepot'
|
27
29
|
AssayDepot.configure do |config|
|
28
30
|
config.access_token = "1234567890"
|
29
|
-
config.url = "https://
|
31
|
+
config.url = "https://app.scientist.com"
|
30
32
|
end
|
31
33
|
wares = AssayDepot::Ware.find("Antibody")
|
32
34
|
wares.total
|
33
35
|
```
|
34
36
|
|
37
|
+
### Backoffice
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
require 'assaydepot'
|
41
|
+
AssayDepot.configure do |config|
|
42
|
+
config.access_token = "1234567890"
|
43
|
+
config.url = "https://backoffice.scientist.com"
|
44
|
+
end
|
45
|
+
quoted_ware = AssayDepot::QuotedWare.get()
|
46
|
+
```
|
47
|
+
|
48
|
+
## API Documentation
|
49
|
+
See the [Scientist.com API documentation](https://assaydepot.github.io/scientist_api_docs/#introduction) for details on the Scientist.com API resources and code examples using this SDK.
|
50
|
+
|
35
51
|
## Using Facets
|
36
52
|
|
37
53
|
```ruby
|
@@ -56,7 +72,7 @@ providers.count
|
|
56
72
|
## Get Details
|
57
73
|
```ruby
|
58
74
|
providers = AssayDepot::Provider.where(:starts_with => "a")
|
59
|
-
AssayDepot::Provider.get(providers.first["id"])
|
75
|
+
AssayDepot::Provider.get(id: providers.first["id"])
|
60
76
|
```
|
61
77
|
|
62
78
|
## Contributing
|
@@ -69,4 +85,4 @@ AssayDepot::Provider.get(providers.first["id"])
|
|
69
85
|
|
70
86
|
## License
|
71
87
|
|
72
|
-
The
|
88
|
+
The Scientist.com Ruby SDK is released under the MIT license.
|
data/assaydepot.gemspec
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
require File.expand_path('../lib/assaydepot/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Christopher Petersen"]
|
6
|
-
gem.email = ["
|
7
|
-
gem.description = %q{
|
5
|
+
gem.authors = ["Christopher Petersen", "Ron Ranauro"]
|
6
|
+
gem.email = ["chris@scientist.com", "ron@scientist.com"]
|
7
|
+
gem.description = %q{The Scientist Ruby SDK. It provides read access to Services and Suppliers through scientist.com's JSON API.}
|
8
8
|
gem.summary = %q{Provides read access to Assay Depot's Services and Vendors.}
|
9
9
|
gem.homepage = "https://github.com/assaydepot/assaydepot-rb"
|
10
10
|
|
11
11
|
gem.add_dependency('json')
|
12
|
-
gem.add_dependency('
|
12
|
+
gem.add_dependency('rack')
|
13
13
|
|
14
14
|
gem.add_development_dependency('rake')
|
15
15
|
gem.add_development_dependency('rspec')
|
data/lib/assaydepot/client.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "open-uri"
|
2
2
|
require "json"
|
3
|
-
require 'uri/query_params'
|
4
3
|
require 'net/http'
|
4
|
+
require 'rack'
|
5
5
|
|
6
6
|
module AssayDepot
|
7
7
|
class Client
|
@@ -10,75 +10,86 @@ module AssayDepot
|
|
10
10
|
@endpoint = options[:endpoint]
|
11
11
|
end
|
12
12
|
|
13
|
-
def request(url, params={}, headers={}, auth={})
|
14
|
-
uri = URI( "#{url}" )
|
15
|
-
|
13
|
+
def request(url = nil, params={}, headers={}, auth={})
|
14
|
+
uri = url.nil? ? get_uri(params) : URI( "#{url}" )
|
15
|
+
puts "CLIENT.REQUEST HOST [#{uri.host}] URI [#{uri.request_uri}] PARAMS [#{params.inspect}]" if ENV["DEBUG"] == "true"
|
16
|
+
uri.query = Rack::Utils.build_nested_query(params) unless params.keys.length == 0
|
16
17
|
http = Net::HTTP.new(uri.host, uri.port)
|
18
|
+
http.use_ssl = uri.scheme === 'https'
|
17
19
|
request = Net::HTTP::Get.new(uri.request_uri)
|
20
|
+
request["Authorization"] = "Bearer #{AssayDepot.access_token}" unless params[:access_token] || auth[:username]
|
18
21
|
request.basic_auth auth[:username], auth[:password] unless auth[:username].nil?
|
19
22
|
res = http.request(request)
|
20
23
|
JSON.parse(res.body)
|
21
24
|
end
|
22
25
|
|
23
|
-
def get(params
|
26
|
+
def get(params: {})
|
24
27
|
uri = get_uri( params )
|
25
28
|
http = Net::HTTP.new(uri.host, uri.port)
|
29
|
+
http.use_ssl = uri.scheme === 'https'
|
26
30
|
request = Net::HTTP::Get.new(uri.request_uri)
|
31
|
+
puts "CLIENT.GET HOST [#{uri.host}] URI [#{uri.request_uri}] PARAMS [#{params.inspect}]" if ENV["DEBUG"] == "true"
|
27
32
|
request["Authorization"] = "Bearer #{AssayDepot.access_token}" unless params[:access_token]
|
28
33
|
res = http.request(request)
|
29
|
-
|
34
|
+
res.body
|
30
35
|
end
|
31
36
|
|
32
|
-
def put(body
|
37
|
+
def put(body: {}, params: {})
|
33
38
|
uri = get_uri( params )
|
34
39
|
http = Net::HTTP.new(uri.host, uri.port)
|
40
|
+
http.use_ssl = uri.scheme === 'https'
|
35
41
|
request = Net::HTTP::Put.new(uri.request_uri)
|
42
|
+
puts "CLIENT.PUT HOST [#{uri.host}] URI [#{uri.request_uri}] BODY [#{body.inspect}] PARAMS [#{params.inspect}]" if ENV["DEBUG"] == "true"
|
36
43
|
request["Authorization"] = "Bearer #{AssayDepot.access_token}" unless params[:access_token]
|
37
44
|
request["Content-Type"] = "application/json"
|
38
45
|
if (body.keys.length > 0)
|
39
46
|
request.body = body.to_json
|
40
47
|
end
|
41
48
|
res = http.request(request)
|
42
|
-
|
49
|
+
res.body
|
43
50
|
end
|
44
51
|
|
45
|
-
def post(body
|
52
|
+
def post(body: {}, params: {})
|
46
53
|
uri = get_uri( params )
|
47
54
|
http = Net::HTTP.new(uri.host, uri.port)
|
55
|
+
http.use_ssl = uri.scheme === 'https'
|
48
56
|
request = Net::HTTP::Post.new(uri.request_uri)
|
57
|
+
puts "CLIENT.POST HOST [#{uri.host}] URI [#{uri.request_uri}] BODY [#{body.inspect}] PARAMS [#{params.inspect}]" if ENV["DEBUG"] == "true"
|
49
58
|
request["Authorization"] = "Bearer #{AssayDepot.access_token}" unless params[:access_token]
|
50
59
|
request["Accept"] = "application/json"
|
51
60
|
request["Content-Type"] = "application/json"
|
52
|
-
if (body.keys.length > 0)
|
61
|
+
if (body && body.keys.length > 0)
|
53
62
|
request.body = body.to_json
|
54
63
|
end
|
55
64
|
res = http.request(request)
|
56
|
-
|
65
|
+
res.body
|
57
66
|
end
|
58
67
|
|
59
|
-
def delete(params
|
68
|
+
def delete(params: {})
|
60
69
|
uri = get_uri( params )
|
61
70
|
http = Net::HTTP.new(uri.host, uri.port)
|
71
|
+
http.use_ssl = uri.scheme === 'https'
|
62
72
|
request = Net::HTTP::Delete.new(uri.request_uri)
|
73
|
+
puts "CLIENT.DELETE HOST [#{uri.host}] URI [#{uri.request_uri}]}] PARAMS [#{params.inspect}]" if ENV["DEBUG"] == "true"
|
63
74
|
request["Authorization"] = "Bearer #{AssayDepot.access_token}" unless params[:access_token]
|
64
75
|
res = http.request(request)
|
65
|
-
|
76
|
+
res.body
|
66
77
|
end
|
67
78
|
|
68
|
-
def search(query, facets, params
|
79
|
+
def search(query: nil, facets: {}, params: {})
|
69
80
|
params["q"] = query if query != ""
|
70
|
-
facets
|
81
|
+
facets&.map do |name,value|
|
71
82
|
params["facets[#{name}][]"] = value
|
72
83
|
end
|
73
|
-
get(params)
|
84
|
+
get(params: params)
|
74
85
|
end
|
75
86
|
|
76
87
|
private
|
77
88
|
|
78
89
|
def get_uri( params )
|
79
90
|
uri = URI( "#{AssayDepot.url}/#{@endpoint}" )
|
80
|
-
uri.query =
|
91
|
+
uri.query = Rack::Utils.build_nested_query(params) unless params.keys.length == 0
|
81
92
|
uri
|
82
93
|
end
|
83
94
|
end
|
84
|
-
end
|
95
|
+
end
|
data/lib/assaydepot/endpoints.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module AssayDepot
|
2
2
|
|
3
3
|
class Category
|
4
|
-
include ::AssayDepot::
|
4
|
+
include ::AssayDepot::SearchModel
|
5
5
|
|
6
|
-
def self.endpoint(id=nil)
|
7
|
-
get_endpoint(id, "categories")
|
6
|
+
def self.endpoint(id=nil, format="json")
|
7
|
+
get_endpoint(id, "categories", format)
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.ref_name
|
@@ -13,34 +13,38 @@ module AssayDepot
|
|
13
13
|
end
|
14
14
|
|
15
15
|
class DynamicForm
|
16
|
-
include ::AssayDepot::
|
16
|
+
include ::AssayDepot::SearchModel
|
17
17
|
|
18
|
-
def self.endpoint(id=nil)
|
19
|
-
get_endpoint(id, "dynamic_forms")
|
18
|
+
def self.endpoint(id=nil, format="json")
|
19
|
+
get_endpoint(id, "dynamic_forms", format)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
class Info
|
24
|
-
include ::AssayDepot::
|
24
|
+
include ::AssayDepot::SearchModel
|
25
25
|
|
26
|
-
def self.endpoint(id=nil)
|
27
|
-
get_endpoint(nil, "info")
|
26
|
+
def self.endpoint(id=nil, format="json")
|
27
|
+
get_endpoint(nil, "info", format)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
class Organization
|
32
|
-
include ::AssayDepot::
|
32
|
+
include ::AssayDepot::SearchModel
|
33
33
|
|
34
|
-
def self.endpoint(id=nil)
|
35
|
-
get_endpoint(id, "organizations")
|
34
|
+
def self.endpoint(id=nil, format="json")
|
35
|
+
get_endpoint(id, "organizations", format)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
class QuoteGroup
|
40
|
-
include ::AssayDepot::
|
40
|
+
include ::AssayDepot::SearchModel
|
41
41
|
|
42
|
-
def self.
|
43
|
-
|
42
|
+
def self.mine
|
43
|
+
get(id: "mine")
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.endpoint(id=nil, format="json")
|
47
|
+
get_endpoint(id, "quote_groups", format)
|
44
48
|
end
|
45
49
|
|
46
50
|
def self.ref_name
|
@@ -49,10 +53,10 @@ module AssayDepot
|
|
49
53
|
end
|
50
54
|
|
51
55
|
class AddNote
|
52
|
-
include ::AssayDepot::
|
56
|
+
include ::AssayDepot::SearchModel
|
53
57
|
|
54
|
-
def self.endpoint(id)
|
55
|
-
"/quote_groups/#{id}/add_note"
|
58
|
+
def self.endpoint(id, format="json")
|
59
|
+
"/quote_groups/#{id}/add_note.#{format}"
|
56
60
|
end
|
57
61
|
|
58
62
|
def self.ref_name
|
@@ -61,10 +65,22 @@ module AssayDepot
|
|
61
65
|
end
|
62
66
|
|
63
67
|
class QuotedWare
|
64
|
-
include ::AssayDepot::
|
68
|
+
include ::AssayDepot::SearchModel
|
69
|
+
|
70
|
+
def self.proposals(id, format="json")
|
71
|
+
get(id: "#{id[:id]}/proposals", format: format)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.purchase_orders(id, format="json")
|
75
|
+
get(id: "#{id[:id]}/purchase_orders", format: format)
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.messages(id, format="json")
|
79
|
+
get(id: "#{id[:id]}/messages", format: format)
|
80
|
+
end
|
65
81
|
|
66
|
-
def self.endpoint(id=nil)
|
67
|
-
get_endpoint(id, "quoted_wares")
|
82
|
+
def self.endpoint(id=nil, format="json")
|
83
|
+
get_endpoint(id, "quoted_wares", format)
|
68
84
|
end
|
69
85
|
|
70
86
|
def self.ref_name
|
@@ -73,10 +89,10 @@ module AssayDepot
|
|
73
89
|
end
|
74
90
|
|
75
91
|
class Provider
|
76
|
-
include ::AssayDepot::
|
92
|
+
include ::AssayDepot::SearchModel
|
77
93
|
|
78
|
-
def self.endpoint(id=nil)
|
79
|
-
get_endpoint( id, "providers" )
|
94
|
+
def self.endpoint(id=nil, format="json")
|
95
|
+
get_endpoint( id, "providers", format)
|
80
96
|
end
|
81
97
|
|
82
98
|
def self.search_type
|
@@ -89,10 +105,10 @@ module AssayDepot
|
|
89
105
|
end
|
90
106
|
|
91
107
|
class ProviderWare
|
92
|
-
include ::AssayDepot::
|
108
|
+
include ::AssayDepot::SearchModel
|
93
109
|
|
94
|
-
def self.endpoint(id)
|
95
|
-
"/providers/#{id.is_a?(Array) ? id[0] : id}/wares
|
110
|
+
def self.endpoint(id, format="json")
|
111
|
+
"/providers/#{id.is_a?(Array) ? id[0] : id}/wares.#{format}"
|
96
112
|
end
|
97
113
|
|
98
114
|
def self.ref_name
|
@@ -101,10 +117,14 @@ module AssayDepot
|
|
101
117
|
end
|
102
118
|
|
103
119
|
class User
|
104
|
-
include ::AssayDepot::
|
120
|
+
include ::AssayDepot::SearchModel
|
121
|
+
|
122
|
+
def self.profile
|
123
|
+
get(id: "profile")
|
124
|
+
end
|
105
125
|
|
106
|
-
def self.endpoint(id=nil)
|
107
|
-
get_endpoint(id == nil || id[0] == nil ? nil : 'profile', "users")
|
126
|
+
def self.endpoint(id=nil, format="json")
|
127
|
+
get_endpoint(id == nil || id[0] == nil ? nil : 'profile', "users", format)
|
108
128
|
end
|
109
129
|
|
110
130
|
def self.ref_name
|
@@ -113,10 +133,10 @@ module AssayDepot
|
|
113
133
|
end
|
114
134
|
|
115
135
|
class Ware
|
116
|
-
include ::AssayDepot::
|
136
|
+
include ::AssayDepot::SearchModel
|
117
137
|
|
118
|
-
def self.endpoint(id=nil)
|
119
|
-
get_endpoint( id, "wares" )
|
138
|
+
def self.endpoint(id=nil, format="json")
|
139
|
+
get_endpoint( id, "wares", format)
|
120
140
|
end
|
121
141
|
|
122
142
|
def self.search_type
|
@@ -129,13 +149,13 @@ module AssayDepot
|
|
129
149
|
end
|
130
150
|
|
131
151
|
class WareProvider
|
132
|
-
include ::AssayDepot::
|
152
|
+
include ::AssayDepot::SearchModel
|
133
153
|
|
134
|
-
def self.endpoint(id)
|
154
|
+
def self.endpoint(id, format="json")
|
135
155
|
if (id.is_a?(Array) && id.length > 1)
|
136
|
-
url = "/wares/#{id[0]}/providers/#{id[1]}
|
156
|
+
url = "/wares/#{id[0]}/providers/#{id[1]}.#{format}"
|
137
157
|
else
|
138
|
-
url = "/wares/#{id.is_a?(Array) ? id[0] : id}/providers
|
158
|
+
url = "/wares/#{id.is_a?(Array) ? id[0] : id}/providers.#{format}"
|
139
159
|
end
|
140
160
|
url
|
141
161
|
end
|
@@ -146,10 +166,10 @@ module AssayDepot
|
|
146
166
|
end
|
147
167
|
|
148
168
|
class Webhook
|
149
|
-
include ::AssayDepot::
|
169
|
+
include ::AssayDepot::SearchModel
|
150
170
|
|
151
|
-
def self.endpoint(id=nil)
|
152
|
-
get_endpoint(id, "webhook_config")
|
171
|
+
def self.endpoint(id=nil, format="json")
|
172
|
+
get_endpoint(id, "webhook_config", format)
|
153
173
|
end
|
154
174
|
|
155
175
|
def self.ref_name
|
@@ -158,9 +178,9 @@ module AssayDepot
|
|
158
178
|
end
|
159
179
|
|
160
180
|
class TokenAuth
|
161
|
-
include ::AssayDepot::
|
181
|
+
include ::AssayDepot::SearchModel
|
162
182
|
|
163
|
-
def self.endpoint(site="")
|
183
|
+
def self.endpoint(site="", format=nil)
|
164
184
|
"#{site}/oauth/token?grant_type=client_credentials"
|
165
185
|
end
|
166
186
|
|
@@ -168,4 +188,49 @@ module AssayDepot
|
|
168
188
|
"access_token"
|
169
189
|
end
|
170
190
|
end
|
191
|
+
|
192
|
+
class PurchaseOrder
|
193
|
+
include ::AssayDepot::DatabaseModel
|
194
|
+
|
195
|
+
def self.endpoint(id=nil, format="json")
|
196
|
+
get_endpoint(id, "purchase_orders", format)
|
197
|
+
end
|
198
|
+
|
199
|
+
def self.ref_name
|
200
|
+
"purchase_orders"
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
class List
|
205
|
+
include ::AssayDepot::DatabaseModel
|
206
|
+
|
207
|
+
def self.create(slug, name)
|
208
|
+
post(body: { slug: slug, name: name })
|
209
|
+
end
|
210
|
+
|
211
|
+
def self.endpoint(id=nil, format="json")
|
212
|
+
get_endpoint(id, "dynamic_lists", format)
|
213
|
+
end
|
214
|
+
|
215
|
+
def self.ref_name
|
216
|
+
"dynamic_lists"
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
class ListItem
|
221
|
+
include ::AssayDepot::SearchModel
|
222
|
+
|
223
|
+
def self.endpoint(id, format="json")
|
224
|
+
if (id.is_a?(Array) && id.length > 1)
|
225
|
+
url = "/dynamic_lists/#{id[0]}/items/#{id[1]}.#{format}"
|
226
|
+
else
|
227
|
+
url = "/dynamic_lists/#{id.is_a?(Array) ? id[0] : id}/items.#{format}"
|
228
|
+
end
|
229
|
+
url
|
230
|
+
end
|
231
|
+
|
232
|
+
def self.ref_name
|
233
|
+
"items"
|
234
|
+
end
|
235
|
+
end
|
171
236
|
end
|
data/lib/assaydepot/model.rb
CHANGED
@@ -1,18 +1,35 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
module AssayDepot
|
3
|
-
module
|
3
|
+
module DatabaseModel
|
4
4
|
module ClassMethods
|
5
|
-
|
6
|
-
|
7
|
-
response = Client.new.request(AssayDepot::TokenAuth.endpoint(site), {}, {}, {:username => client_id, :password => client_secret})
|
8
|
-
response[AssayDepot::TokenAuth.ref_name]
|
5
|
+
def all(options = {})
|
6
|
+
self.new.all(options)
|
9
7
|
end
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
def self.included(base)
|
11
|
+
base.include AssayDepot::Model
|
12
|
+
base.extend AssayDepot::Model::ClassMethods
|
13
|
+
base.extend ClassMethods
|
14
|
+
end
|
15
|
+
|
16
|
+
def all(options = {})
|
17
|
+
result = self.clone
|
18
|
+
result.internal_options = options
|
19
|
+
result
|
20
|
+
end
|
21
|
+
|
22
|
+
# Overridden from Model
|
23
|
+
def internal_results
|
24
|
+
unless @internal_results
|
25
|
+
@internal_results = JSON.parse(Client.new(endpoint: self.class.endpoint(nil)).get(params: @internal_options))
|
14
26
|
end
|
27
|
+
@internal_results
|
28
|
+
end
|
29
|
+
end
|
15
30
|
|
31
|
+
module SearchModel
|
32
|
+
module ClassMethods
|
16
33
|
# find and where to modify params
|
17
34
|
def find(query)
|
18
35
|
self.new.find(query)
|
@@ -21,55 +38,97 @@ module AssayDepot
|
|
21
38
|
def where(conditions={})
|
22
39
|
self.new.where(conditions)
|
23
40
|
end
|
41
|
+
end
|
24
42
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
43
|
+
def self.included(base)
|
44
|
+
base.extend AssayDepot::Model::ClassMethods
|
45
|
+
base.extend ClassMethods
|
46
|
+
base.include AssayDepot::Model
|
47
|
+
base.include AssayDepot::Pageable
|
48
|
+
|
49
|
+
attr_accessor :search_query
|
50
|
+
attr_accessor :search_facets
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(options={})
|
54
|
+
@internal_options = options[:search_options] || { }
|
55
|
+
@search_query = options[:search_query] || ""
|
56
|
+
@search_facets = options[:search_facets] || { }
|
57
|
+
end
|
58
|
+
|
59
|
+
def facets
|
60
|
+
internal_results["facets"]
|
61
|
+
end
|
62
|
+
|
63
|
+
def find(query)
|
64
|
+
result = self.clone
|
65
|
+
result.search_query = query
|
66
|
+
result
|
67
|
+
end
|
68
|
+
|
69
|
+
def where(conditions={})
|
70
|
+
result = self.clone
|
71
|
+
result.search_facets = self.search_facets ? self.search_facets.merge(conditions) : conditions
|
72
|
+
result
|
73
|
+
end
|
74
|
+
|
75
|
+
# Overridden from Model
|
76
|
+
def internal_results
|
77
|
+
unless @internal_results
|
78
|
+
results = Client.new(endpoint: self.class.endpoint(nil)).search(query: search_query, facets: search_facets, params: internal_options)
|
79
|
+
@internal_results = JSON.parse(results)
|
80
|
+
end
|
81
|
+
@internal_results
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module Model
|
86
|
+
module ClassMethods
|
87
|
+
def get_token(client_id, client_secret, site)
|
88
|
+
response = Client.new.request(AssayDepot::TokenAuth.endpoint(site), {}, {}, {:username => client_id, :password => client_secret})
|
89
|
+
response[AssayDepot::TokenAuth.ref_name]
|
29
90
|
end
|
30
91
|
|
31
|
-
def
|
92
|
+
def get_endpoint(id, endpoint, format = "json")
|
93
|
+
id = id[0] if id && id.kind_of?(Array)
|
94
|
+
id ? "#{endpoint}/#{id}.#{format}" : "#{endpoint}.#{format}"
|
95
|
+
end
|
32
96
|
|
33
|
-
|
34
|
-
|
35
|
-
|
97
|
+
# HTTP request verbs
|
98
|
+
# optional "id" followed by optional hash
|
99
|
+
def get(id: nil, params: {}, format: "json")
|
100
|
+
puts "GET id #{id}, params #{params}" if ENV["DEBUG"] == "true"
|
101
|
+
result = Client.new(endpoint: endpoint(id, format)).get(params: params)
|
102
|
+
return JSON.parse(result) if format == "json"
|
103
|
+
result
|
36
104
|
end
|
37
105
|
|
38
|
-
def
|
39
|
-
id, body, params
|
40
|
-
Client.new(:
|
106
|
+
def put(id: nil, body: nil, params: {}, format: "json")
|
107
|
+
puts "PUT id #{id}, body #{body.to_s}, params #{params}" if ENV["DEBUG"] == "true"
|
108
|
+
result = Client.new(endpoint: endpoint(id, format)).put( body: body, params: params )
|
109
|
+
return JSON.parse(result) if format == "json"
|
110
|
+
result
|
41
111
|
end
|
42
112
|
|
43
|
-
def
|
44
|
-
id, body, params
|
45
|
-
Client.new(:
|
113
|
+
def patch(id: nil, body: nil, params: {}, format: "json")
|
114
|
+
puts "PATCH id #{id}, body #{body.to_s}, params #{params}" if ENV["DEBUG"] == "true"
|
115
|
+
result = Client.new(endpoint: endpoint(id, format)).put( body: body, params: params )
|
116
|
+
return JSON.parse(result) if format == "json"
|
117
|
+
result
|
46
118
|
end
|
47
119
|
|
48
|
-
def
|
49
|
-
|
120
|
+
def post(id: nil, body: nil, params: {}, format: "json")
|
121
|
+
puts "POST id #{id}, body #{body.to_s}, params #{params}" if ENV["DEBUG"] == "true"
|
122
|
+
result = Client.new(endpoint: endpoint(id, format)).post( body: body, params: params )
|
123
|
+
return JSON.parse(result) if format == "json"
|
124
|
+
result
|
50
125
|
end
|
51
126
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
elsif (id && id.length > 1)
|
58
|
-
body = id[1]
|
59
|
-
id = id[0]
|
60
|
-
elsif (id && id[0].is_a?(Hash))
|
61
|
-
body = id.last
|
62
|
-
id = nil
|
63
|
-
elsif (id && id.length == 1 && id[0].is_a?(Hash) == false)
|
64
|
-
body = params
|
65
|
-
id = id[0]
|
66
|
-
params = {}
|
67
|
-
else
|
68
|
-
body = params
|
69
|
-
params = {}
|
70
|
-
id = nil
|
71
|
-
end
|
72
|
-
[id, body, params]
|
127
|
+
def delete(id: nil, body: nil, params: {}, format: "json")
|
128
|
+
puts "DELETE id #{id}, params #{params}" if ENV["DEBUG"] == "true"
|
129
|
+
result = Client.new(endpoint: endpoint(id, format)).delete(params: params)
|
130
|
+
return JSON.parse(result) if format == "json"
|
131
|
+
result
|
73
132
|
end
|
74
133
|
end
|
75
134
|
|
@@ -98,73 +157,58 @@ module AssayDepot
|
|
98
157
|
:reject,
|
99
158
|
:reverse
|
100
159
|
|
101
|
-
attr_accessor :
|
102
|
-
|
103
|
-
attr_accessor :search_options
|
160
|
+
attr_accessor :internal_options
|
161
|
+
end
|
104
162
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
@search_options = options[:search_options] || {:page => 1}
|
109
|
-
end
|
163
|
+
def initialize(options={})
|
164
|
+
@internal_options = options[:search_options] || { }
|
165
|
+
end
|
110
166
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
167
|
+
def initialize_copy(source)
|
168
|
+
super
|
169
|
+
@search_query = @search_query.dup
|
170
|
+
@search_facets = @search_facets.dup
|
171
|
+
end
|
116
172
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
def total
|
121
|
-
search_results["total"]
|
122
|
-
end
|
123
|
-
def page
|
124
|
-
search_results["page"]
|
125
|
-
end
|
126
|
-
def per_page
|
127
|
-
search_results["per_page"]
|
128
|
-
end
|
129
|
-
def facets
|
130
|
-
search_results["facets"]
|
131
|
-
end
|
173
|
+
def query_time
|
174
|
+
internal_results["query_time"]
|
175
|
+
end
|
132
176
|
|
133
|
-
|
134
|
-
|
135
|
-
|
177
|
+
def total
|
178
|
+
internal_results["total"]
|
179
|
+
end
|
136
180
|
|
137
|
-
|
138
|
-
|
139
|
-
|
181
|
+
def options(options={})
|
182
|
+
result = self.clone
|
183
|
+
result.internal_options = self.internal_options ? self.internal_options.merge(options) : options
|
184
|
+
result
|
185
|
+
end
|
140
186
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
result
|
145
|
-
end
|
187
|
+
def private_results
|
188
|
+
internal_results[self.class.ref_name]
|
189
|
+
end
|
146
190
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
191
|
+
# def internal_results
|
192
|
+
# # To be overridden
|
193
|
+
# # If I leave this method in, it gets called, possibly a problem with the order of inclusion
|
194
|
+
# end
|
195
|
+
end
|
152
196
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
end
|
197
|
+
module Pageable
|
198
|
+
def page
|
199
|
+
internal_results["page"]
|
200
|
+
end
|
158
201
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
202
|
+
def per_page
|
203
|
+
internal_results["per_page"]
|
204
|
+
end
|
205
|
+
|
206
|
+
def page(page_num)
|
207
|
+
options( { "page" => page_num } )
|
208
|
+
end
|
209
|
+
|
210
|
+
def per_page(page_size)
|
211
|
+
options( { "per_page" => page_size } )
|
168
212
|
end
|
169
213
|
end
|
170
214
|
end
|
data/lib/assaydepot/version.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'assaydepot'
|
2
|
+
require 'dotenv'
|
3
|
+
Dotenv.load
|
4
|
+
|
5
|
+
describe AssayDepot do
|
6
|
+
context "scientist_api backoffice tests" do
|
7
|
+
before(:all) do
|
8
|
+
AssayDepot.configure do |config|
|
9
|
+
config.access_token = ENV['BACKOFFICE_ACCESS_TOKEN']
|
10
|
+
config.url = "#{ENV['BACKOFFICE_SITE']}/api/v2"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "info" do
|
15
|
+
let(:info) { AssayDepot::Info.get() }
|
16
|
+
|
17
|
+
it "info version V2" do
|
18
|
+
info["api_version"].should == "V2"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "quoted wares" do
|
23
|
+
let(:qw) { AssayDepot::QuotedWare.get() }
|
24
|
+
|
25
|
+
it "get all quoted wares" do
|
26
|
+
qw.is_a?(Array).should == true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/assaydepot_spec.rb
CHANGED
@@ -5,10 +5,9 @@ Dotenv.load
|
|
5
5
|
describe AssayDepot do
|
6
6
|
context "when accessing the api via token client credentials" do
|
7
7
|
before(:all) do
|
8
|
-
site = "http://dev.scientist.com:3000"
|
9
8
|
AssayDepot.configure do |config|
|
10
9
|
config.access_token = ENV['ACCESS_TOKEN']
|
11
|
-
config.url = "#{
|
10
|
+
config.url = "#{ENV['SITE']}/api/v2"
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
@@ -24,7 +23,7 @@ describe AssayDepot do
|
|
24
23
|
end
|
25
24
|
|
26
25
|
context "and getting the details for the first ware" do
|
27
|
-
let(:ware_result) { AssayDepot::Ware.get(wares.first["id"]) }
|
26
|
+
let(:ware_result) { AssayDepot::Ware.get(id: wares.first["id"]) }
|
28
27
|
|
29
28
|
it "should have a ware" do
|
30
29
|
ware_result["ware"].should_not be_nil
|
@@ -110,14 +109,14 @@ describe AssayDepot do
|
|
110
109
|
end
|
111
110
|
|
112
111
|
context "and getting the details for the first provider" do
|
113
|
-
let(:provider_result) { AssayDepot::Provider.get(providers.first["id"]) }
|
112
|
+
let(:provider_result) { AssayDepot::Provider.get(id: providers.first["id"]) }
|
114
113
|
|
115
|
-
it "
|
114
|
+
it "have a provider" do
|
116
115
|
provider_result["provider"].should_not be_nil
|
117
116
|
end
|
118
117
|
|
119
|
-
it "
|
120
|
-
provider_result[
|
118
|
+
it "have keywords" do
|
119
|
+
expect(provider_result['provider']).to have_key('keywords')
|
121
120
|
end
|
122
121
|
end
|
123
122
|
end
|
@@ -5,10 +5,9 @@ Dotenv.load
|
|
5
5
|
describe AssayDepot do
|
6
6
|
context "scientist_api tests" do
|
7
7
|
before(:all) do
|
8
|
-
site = "http://dev.scientist.com:3000"
|
9
8
|
AssayDepot.configure do |config|
|
10
9
|
config.access_token = ENV['ACCESS_TOKEN']
|
11
|
-
config.url = "#{
|
10
|
+
config.url = "#{ENV['SITE']}/api/v2"
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
@@ -27,7 +26,7 @@ describe AssayDepot do
|
|
27
26
|
end
|
28
27
|
|
29
28
|
it "get specific category" do
|
30
|
-
category = AssayDepot::Category.get(categories[AssayDepot::Category.ref_name].first[:id])
|
29
|
+
category = AssayDepot::Category.get(id: categories[AssayDepot::Category.ref_name].first[:id])
|
31
30
|
categories[AssayDepot::Category.ref_name][0][:id].should == category[:id]
|
32
31
|
end
|
33
32
|
end
|
@@ -40,7 +39,7 @@ describe AssayDepot do
|
|
40
39
|
end
|
41
40
|
|
42
41
|
it "get specific organization" do
|
43
|
-
organization = AssayDepot::Organization.get(organizations.first["id"])
|
42
|
+
organization = AssayDepot::Organization.get(id: organizations.first["id"])
|
44
43
|
organizations.first["id"].should == organization["id"]
|
45
44
|
end
|
46
45
|
end
|
@@ -54,28 +53,28 @@ describe AssayDepot do
|
|
54
53
|
|
55
54
|
it "get specific provider" do
|
56
55
|
id = providers[AssayDepot::Provider.ref_name].first["id"]
|
57
|
-
provider = AssayDepot::Provider.get(id)
|
56
|
+
provider = AssayDepot::Provider.get(id: id)
|
58
57
|
id.is_a?(Integer).should == true
|
59
58
|
id.should == provider["provider"]["id"]
|
60
59
|
end
|
61
60
|
|
62
61
|
it "get wares for a specific provider" do
|
63
62
|
id = providers[AssayDepot::Provider.ref_name].first["id"]
|
64
|
-
ware = AssayDepot::ProviderWare.get(id)
|
63
|
+
ware = AssayDepot::ProviderWare.get(id: id)
|
65
64
|
ware[AssayDepot::ProviderWare.ref_name].is_a?(Array).should == true
|
66
65
|
end
|
67
66
|
|
68
67
|
it "update specific provider attribute" do
|
69
68
|
id = providers[AssayDepot::Provider.ref_name].first["id"]
|
70
69
|
num_employees = rand(1000)
|
71
|
-
response = AssayDepot::Provider.put(id, {number_of_employees: num_employees});
|
70
|
+
response = AssayDepot::Provider.put(id: id, body: { number_of_employees: num_employees });
|
72
71
|
response["code"].should == "forbidden"
|
73
72
|
end
|
74
73
|
|
75
74
|
end
|
76
75
|
|
77
76
|
context "quote groups" do
|
78
|
-
let(:qg) { AssayDepot::QuoteGroup.
|
77
|
+
let(:qg) { AssayDepot::QuoteGroup.mine }
|
79
78
|
|
80
79
|
it "quote groups mine" do
|
81
80
|
qg[AssayDepot::QuoteGroup.ref_name].is_a?(Array).should == true
|
@@ -83,7 +82,7 @@ describe AssayDepot do
|
|
83
82
|
|
84
83
|
it "quote groups specific id" do
|
85
84
|
id = qg[AssayDepot::QuoteGroup.ref_name].first["id"]
|
86
|
-
response = AssayDepot::QuoteGroup.get( id )
|
85
|
+
response = AssayDepot::QuoteGroup.get( id: id )
|
87
86
|
response["id"].should == id
|
88
87
|
end
|
89
88
|
|
@@ -91,7 +90,7 @@ describe AssayDepot do
|
|
91
90
|
id = qg[AssayDepot::QuoteGroup.ref_name].first["id"]
|
92
91
|
title_text = "This is some #{rand(1000)} text."
|
93
92
|
body_text = "This is some #{rand(1000)} body text."
|
94
|
-
response = AssayDepot::AddNote.post(id, {
|
93
|
+
response = AssayDepot::AddNote.post(id: id, body: {
|
95
94
|
note: {
|
96
95
|
title: title_text,
|
97
96
|
body: body_text
|
@@ -101,17 +100,9 @@ describe AssayDepot do
|
|
101
100
|
end
|
102
101
|
end
|
103
102
|
|
104
|
-
context "quoted wares" do
|
105
|
-
let(:qw) { AssayDepot::QuotedWare.get() }
|
106
|
-
|
107
|
-
it "get all quoted wares" do
|
108
|
-
qw.is_a?(Array).should == true
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
103
|
context "users" do
|
113
104
|
let(:users) { AssayDepot::User.get() }
|
114
|
-
let(:profile) { AssayDepot::User.
|
105
|
+
let(:profile) { AssayDepot::User.profile }
|
115
106
|
|
116
107
|
it "get all users" do
|
117
108
|
users[AssayDepot::User.ref_name].is_a?(Array).should == true
|
@@ -130,12 +121,12 @@ describe AssayDepot do
|
|
130
121
|
end
|
131
122
|
|
132
123
|
it "get specific ware" do
|
133
|
-
ware = AssayDepot::Ware.get( wares[AssayDepot::Ware.ref_name].first["id"] )
|
124
|
+
ware = AssayDepot::Ware.get( id: wares[AssayDepot::Ware.ref_name].first["id"] )
|
134
125
|
wares[AssayDepot::Ware.ref_name].first["id"].should == ware["ware"]["id"]
|
135
126
|
end
|
136
127
|
|
137
128
|
it "get providers for a ware id" do
|
138
|
-
response = AssayDepot::WareProvider.get( wares[AssayDepot::Ware.ref_name].first["id"] )
|
129
|
+
response = AssayDepot::WareProvider.get( id: wares[AssayDepot::Ware.ref_name].first["id"] )
|
139
130
|
response[AssayDepot::WareProvider.ref_name].is_a?(Array).should == true
|
140
131
|
end
|
141
132
|
end
|
@@ -149,15 +140,15 @@ describe AssayDepot do
|
|
149
140
|
@provider_id = providers[AssayDepot::Provider.ref_name].first["id"]
|
150
141
|
@provider_name = providers[AssayDepot::Provider.ref_name].first["name"]
|
151
142
|
sleep(1)
|
152
|
-
@delete = AssayDepot::WareProvider.delete( @ware_id, @provider_id )
|
153
|
-
@ware_provider_response = AssayDepot::WareProvider.post( @ware_id, @provider_id )
|
143
|
+
@delete = AssayDepot::WareProvider.delete( id: [@ware_id, @provider_id] )
|
144
|
+
@ware_provider_response = AssayDepot::WareProvider.post( id: [@ware_id, @provider_id] )
|
154
145
|
# TODO: this should not be needed
|
155
146
|
sleep(2)
|
156
|
-
@ware_provider = AssayDepot::WareProvider.get( @ware_id )
|
157
|
-
@provider_ware = AssayDepot::ProviderWare.get( @provider_id )
|
158
|
-
@clean_up = AssayDepot::WareProvider.delete( @ware_id, @provider_id )
|
159
|
-
@provider_clean_up = AssayDepot::WareProvider.get( @ware_id )
|
160
|
-
@ware_clean_up = AssayDepot::ProviderWare.get( @provider_id )
|
147
|
+
@ware_provider = AssayDepot::WareProvider.get( id: @ware_id )
|
148
|
+
@provider_ware = AssayDepot::ProviderWare.get( id: @provider_id )
|
149
|
+
@clean_up = AssayDepot::WareProvider.delete( id: [@ware_id, @provider_id] )
|
150
|
+
@provider_clean_up = AssayDepot::WareProvider.get( id: @ware_id )
|
151
|
+
@ware_clean_up = AssayDepot::ProviderWare.get( id: @provider_id )
|
161
152
|
end
|
162
153
|
|
163
154
|
it "make sure provider is not published" do
|
@@ -197,9 +188,17 @@ describe AssayDepot do
|
|
197
188
|
end
|
198
189
|
end
|
199
190
|
|
191
|
+
context "quoted wares" do
|
192
|
+
let(:qw) { AssayDepot::QuotedWare.get() }
|
193
|
+
|
194
|
+
it "deny quoted wares" do
|
195
|
+
qw.is_a?(Array).should == false
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
200
199
|
context "webhooks" do
|
201
200
|
it "create a web hook for this user" do
|
202
|
-
response = AssayDepot::Webhook.put({
|
201
|
+
response = AssayDepot::Webhook.put(body: {
|
203
202
|
name: "This is another new 'name'.",
|
204
203
|
bogus_key: "ignore_me"
|
205
204
|
})
|
@@ -209,7 +208,7 @@ describe AssayDepot do
|
|
209
208
|
end
|
210
209
|
|
211
210
|
it "create a web hook for this user (patch) and verify (get)" do
|
212
|
-
response = AssayDepot::Webhook.patch({
|
211
|
+
response = AssayDepot::Webhook.patch(body: {
|
213
212
|
name: "And another new 'name'.",
|
214
213
|
bogus_key: "ignore_me"
|
215
214
|
})
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: assaydepot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Petersen
|
8
|
+
- Ron Ranauro
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2021-03-12 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: json
|
@@ -25,7 +26,7 @@ dependencies:
|
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '0'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
+
name: rack
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
32
|
- - ">="
|
@@ -80,15 +81,17 @@ dependencies:
|
|
80
81
|
- - ">="
|
81
82
|
- !ruby/object:Gem::Version
|
82
83
|
version: '0'
|
83
|
-
description:
|
84
|
-
|
84
|
+
description: The Scientist Ruby SDK. It provides read access to Services and Suppliers
|
85
|
+
through scientist.com's JSON API.
|
85
86
|
email:
|
86
|
-
-
|
87
|
+
- chris@scientist.com
|
88
|
+
- ron@scientist.com
|
87
89
|
executables: []
|
88
90
|
extensions: []
|
89
91
|
extra_rdoc_files: []
|
90
92
|
files:
|
91
93
|
- ".gitignore"
|
94
|
+
- ".rspec"
|
92
95
|
- ".travis.yml"
|
93
96
|
- Gemfile
|
94
97
|
- LICENSE.md
|
@@ -103,6 +106,7 @@ files:
|
|
103
106
|
- lib/assaydepot/event.rb
|
104
107
|
- lib/assaydepot/model.rb
|
105
108
|
- lib/assaydepot/version.rb
|
109
|
+
- spec/assaydepot_backoffice_spec.rb
|
106
110
|
- spec/assaydepot_spec.rb
|
107
111
|
- spec/assaydepot_wrapper_spec.rb
|
108
112
|
homepage: https://github.com/assaydepot/assaydepot-rb
|
@@ -123,11 +127,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
127
|
- !ruby/object:Gem::Version
|
124
128
|
version: '0'
|
125
129
|
requirements: []
|
126
|
-
|
127
|
-
rubygems_version: 2.5.1
|
130
|
+
rubygems_version: 3.0.3
|
128
131
|
signing_key:
|
129
132
|
specification_version: 4
|
130
133
|
summary: Provides read access to Assay Depot's Services and Vendors.
|
131
134
|
test_files:
|
135
|
+
- spec/assaydepot_backoffice_spec.rb
|
132
136
|
- spec/assaydepot_spec.rb
|
133
137
|
- spec/assaydepot_wrapper_spec.rb
|