rbc 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +112 -0
- data/Guardfile +11 -0
- data/README.md +4 -0
- data/Rakefile +44 -0
- data/lib/rbc.rb +64 -0
- data/lib/rbc/bsi.rb +325 -0
- data/lib/rbc/version.rb +3 -0
- data/lib/service_spec.yaml +156 -0
- data/rbc.gemspec +39 -0
- data/ref/xml_post_example.xml +9 -0
- data/spec/rbc_spec.rb +25 -0
- data/spec/spec_helper.rb +9 -0
- data/test/test_rbc.rb +53 -0
- metadata +251 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5a3731beac6830ccaeb731bea39085387a18fa60
|
4
|
+
data.tar.gz: fefacafc5c889919dfd74a1980ef2db4a7a20662
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3f58393a6e1ad1752f7ea19b773fee346df289bc807547ad16a5182cc86e268d8107ad6e9396e30336ff02f02efa765f770fadcc21f1eb8bec1ffb3abbcce561
|
7
|
+
data.tar.gz: 24c0edf06d10c7d91b6eb2995ad369c70102be9424d76ee28c860f9e55e720944c43dd771e9cda3f7cdda491cb2330ce894d41028c53ca57890a834db471a892
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rbc (0.2.8)
|
5
|
+
httparty (~> 0.9, >= 0.9.0)
|
6
|
+
nokogiri (>= 1.5.5)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
celluloid (0.15.2)
|
12
|
+
timers (~> 1.1.0)
|
13
|
+
coderay (1.1.0)
|
14
|
+
coveralls (0.7.0)
|
15
|
+
multi_json (~> 1.3)
|
16
|
+
rest-client
|
17
|
+
simplecov (>= 0.7)
|
18
|
+
term-ansicolor
|
19
|
+
thor
|
20
|
+
curb (0.8.5)
|
21
|
+
diff-lcs (1.2.5)
|
22
|
+
docile (1.1.5)
|
23
|
+
ffi (1.9.3)
|
24
|
+
formatador (0.2.5)
|
25
|
+
guard (2.6.1)
|
26
|
+
formatador (>= 0.2.4)
|
27
|
+
listen (~> 2.7)
|
28
|
+
lumberjack (~> 1.0)
|
29
|
+
pry (>= 0.9.12)
|
30
|
+
thor (>= 0.18.1)
|
31
|
+
guard-rspec (4.3.1)
|
32
|
+
guard (~> 2.1)
|
33
|
+
rspec (>= 2.14, < 4.0)
|
34
|
+
httparty (0.13.1)
|
35
|
+
json (~> 1.8)
|
36
|
+
multi_xml (>= 0.5.2)
|
37
|
+
json (1.8.1)
|
38
|
+
listen (2.7.9)
|
39
|
+
celluloid (>= 0.15.2)
|
40
|
+
rb-fsevent (>= 0.9.3)
|
41
|
+
rb-inotify (>= 0.9)
|
42
|
+
lumberjack (1.0.9)
|
43
|
+
method_source (0.8.2)
|
44
|
+
mime-types (2.3)
|
45
|
+
mini_portile (0.6.0)
|
46
|
+
multi_json (1.10.1)
|
47
|
+
multi_xml (0.5.5)
|
48
|
+
netrc (0.7.7)
|
49
|
+
nokogiri (1.6.3.1)
|
50
|
+
mini_portile (= 0.6.0)
|
51
|
+
pry (0.10.0)
|
52
|
+
coderay (~> 1.1.0)
|
53
|
+
method_source (~> 0.8.1)
|
54
|
+
slop (~> 3.4)
|
55
|
+
pry-nav (0.2.4)
|
56
|
+
pry (>= 0.9.10, < 0.11.0)
|
57
|
+
pry-remote (0.1.8)
|
58
|
+
pry (~> 0.9)
|
59
|
+
slop (~> 3.0)
|
60
|
+
rake (10.3.2)
|
61
|
+
rb-fsevent (0.9.4)
|
62
|
+
rb-inotify (0.9.5)
|
63
|
+
ffi (>= 0.5.0)
|
64
|
+
rest-client (1.7.2)
|
65
|
+
mime-types (>= 1.16, < 3.0)
|
66
|
+
netrc (~> 0.7)
|
67
|
+
rspec (3.0.0)
|
68
|
+
rspec-core (~> 3.0.0)
|
69
|
+
rspec-expectations (~> 3.0.0)
|
70
|
+
rspec-mocks (~> 3.0.0)
|
71
|
+
rspec-core (3.0.3)
|
72
|
+
rspec-support (~> 3.0.0)
|
73
|
+
rspec-expectations (3.0.3)
|
74
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
75
|
+
rspec-support (~> 3.0.0)
|
76
|
+
rspec-mocks (3.0.3)
|
77
|
+
rspec-support (~> 3.0.0)
|
78
|
+
rspec-nc (0.1.1)
|
79
|
+
rspec (>= 2.9)
|
80
|
+
terminal-notifier (>= 1.4)
|
81
|
+
rspec-support (3.0.3)
|
82
|
+
simplecov (0.9.0)
|
83
|
+
docile (~> 1.1.0)
|
84
|
+
multi_json
|
85
|
+
simplecov-html (~> 0.8.0)
|
86
|
+
simplecov-html (0.8.0)
|
87
|
+
slop (3.6.0)
|
88
|
+
term-ansicolor (1.3.0)
|
89
|
+
tins (~> 1.0)
|
90
|
+
terminal-notifier (1.6.1)
|
91
|
+
terminal-notifier-guard (1.5.3)
|
92
|
+
thor (0.19.1)
|
93
|
+
timers (1.1.0)
|
94
|
+
tins (1.3.0)
|
95
|
+
|
96
|
+
PLATFORMS
|
97
|
+
ruby
|
98
|
+
|
99
|
+
DEPENDENCIES
|
100
|
+
bundler (~> 1.6)
|
101
|
+
coveralls
|
102
|
+
curb
|
103
|
+
guard
|
104
|
+
guard-rspec
|
105
|
+
pry
|
106
|
+
pry-nav
|
107
|
+
pry-remote
|
108
|
+
rake
|
109
|
+
rbc!
|
110
|
+
rspec
|
111
|
+
rspec-nc
|
112
|
+
terminal-notifier-guard
|
data/Guardfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'curb'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
namespace :fetch do
|
8
|
+
desc "Fetch list of service endpoints and methods and store to file"
|
9
|
+
task "services" do
|
10
|
+
hosts = {
|
11
|
+
:dev => 'http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/',
|
12
|
+
:prod => 'http://www506.imsweb.com/wsapi-prod/bsi/webservices/service/'
|
13
|
+
}
|
14
|
+
|
15
|
+
root = 'package-frame.html'
|
16
|
+
|
17
|
+
host = hosts[:dev]
|
18
|
+
page = `http #{hosts[:dev]+root}`
|
19
|
+
doc = Nokogiri::HTML.parse(page)
|
20
|
+
|
21
|
+
services = {}
|
22
|
+
doc.xpath('//a')[1..-1].each do |link|
|
23
|
+
service = link.content.gsub(/(^(?<s>[a-zA-Z]+)Service)/, '\k<s>').downcase.to_sym
|
24
|
+
services[service] = {
|
25
|
+
:doc_link => host + link.attributes['href'].value,
|
26
|
+
:methods => []
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
services.values.each do |service|
|
31
|
+
page = `http #{service[:doc_link]}`
|
32
|
+
doc = Nokogiri::HTML.parse(page)
|
33
|
+
methods = doc.xpath('//code/b/a').map{|node| node.content}
|
34
|
+
service[:methods] = methods.grep(/^[a-z]+/)
|
35
|
+
end
|
36
|
+
|
37
|
+
File.open('./lib/service_spec.yaml', 'wb') do |f|
|
38
|
+
f.write(services.to_yaml)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
task :default => :spec
|
data/lib/rbc.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'rbc/version'
|
3
|
+
require 'rbc/bsi'
|
4
|
+
|
5
|
+
class RBC
|
6
|
+
include RBCVersion
|
7
|
+
include BSIServices
|
8
|
+
BSI_INSTANCES = {
|
9
|
+
:mirror => 'https://websvc-mirror.bsisystems.com:2271/bsi/xmlrpc',
|
10
|
+
:staging => 'https://websvc-mirror.bsisystems.com:2271/bsi/xmlrpc',
|
11
|
+
:production => 'https://websvc.bsisystems.com:2262/bsi/xmlrpc'
|
12
|
+
}
|
13
|
+
|
14
|
+
attr_accessor :session_id, :url_target, :creds, :test, :common
|
15
|
+
|
16
|
+
services = YAML::load(File.open(File.join(File.dirname(__FILE__), 'service_spec.yaml')))
|
17
|
+
(services.keys-[:test, :common]).each do |s|
|
18
|
+
klass = Class.new(BSIModule)
|
19
|
+
attr_accessor s
|
20
|
+
self.const_set(s.to_s.capitalize, klass)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Initialize connection based on provided credentials
|
24
|
+
def initialize(creds, options={:debug=>false, :stealth=>false, :instance=>:mirror})
|
25
|
+
raise ArgumentError, """
|
26
|
+
No credentials hash provided, expected a hash in the form of:
|
27
|
+
{
|
28
|
+
:user => 'username',
|
29
|
+
:pass => 'password',
|
30
|
+
:server => 'MYBSIDATABASE',
|
31
|
+
}
|
32
|
+
""" if creds.class != Hash || creds[:user].nil? || creds[:pass].nil? || creds[:server].nil?
|
33
|
+
raise ArgumentError, 'Please provide either a valid instance or specify a custom url using option key :url => \'https://...\'' if BSI_INSTANCES[options[:instance]].nil? && options[:url].nil? && options[:stealth]==false
|
34
|
+
options[:url] = BSI_INSTANCES[options[:instance]] unless options[:url]
|
35
|
+
self.url_target = options[:url]
|
36
|
+
|
37
|
+
raise RuntimError, "Invalid url" unless url_target.match(/^https?:\/\/(.+):\d{4}\/bsi\/xmlrpc$/)
|
38
|
+
|
39
|
+
self.session_id = creds[:session_id] if creds[:session_id]
|
40
|
+
services = YAML::load(File.open(File.join(File.dirname(__FILE__), 'service_spec.yaml')))
|
41
|
+
(services.keys).each do |k|
|
42
|
+
instance_eval(
|
43
|
+
"self.#{k} = #{k.to_s.capitalize}.new(creds, options.merge( { :methods => services[k][:methods] } ) )"
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
@test = Test.new(creds, options)
|
48
|
+
@common = Common.new(creds, options)
|
49
|
+
=begin
|
50
|
+
# Initialize BSI service connection adaptors
|
51
|
+
@attachment = Attachment.new(creds, options.merge({:methods => %w(download) } ) )
|
52
|
+
@batch = Batch.new(creds, options.merge( { :methods => %w(addVials commit create delete get getBatchProperties getHeaders getVialProperties performL1Checks performL2Checks removeVials update updateVials reserveAvailableBsiIds)}) )
|
53
|
+
@database = Database.new(creds, options.merge( { :methods => %w(getFields getTables normalizeValues)}) )
|
54
|
+
@shipment = Shipment.new(creds, options.merge( { :methods => %w(getProperties getShipment submit update uploadManifest updateDiscrepancyResolutionSuggestions)}) )
|
55
|
+
@requisition= Requisition.new(creds, options.merge( { :methods => %w(addVials getAttachments getProperties getReqDiscrepancies removeVials save submit submitSavedRequisitions update updateDiscrepancyResolutions updatePriorities uploadAttachment uploadManifest)}) )
|
56
|
+
@reults = Report.new(creds, options.merge( { :methods => %w(createResultsBatch)}) )
|
57
|
+
@report = Report.new(creds, options.merge( { :methods => %w(count execute)}) )
|
58
|
+
@study = Study.new(creds, options.merge( { :methods => %w(getAttachments)}) )
|
59
|
+
@user = User.new(creds, options.merge( { :methods => %w(authorize create getInfo update)}) )
|
60
|
+
@subject = Subject.new(creds, options.merge( { :methods => %w(deleteSubject getAttachments getSubject getSubjectProperties performL1Checks performL2Checks saveNewSubject saveSubject)}) )
|
61
|
+
=end
|
62
|
+
@common.logon if @session_id.nil?
|
63
|
+
end
|
64
|
+
end
|
data/lib/rbc/bsi.rb
ADDED
@@ -0,0 +1,325 @@
|
|
1
|
+
module Marshaling
|
2
|
+
require 'Nokogiri'
|
3
|
+
require 'httparty'
|
4
|
+
require 'base64'
|
5
|
+
####################################
|
6
|
+
# Exceptions #
|
7
|
+
####################################
|
8
|
+
|
9
|
+
# General exception
|
10
|
+
class Error < StandardError
|
11
|
+
|
12
|
+
attr_reader :message, :code
|
13
|
+
attr_accessor :action
|
14
|
+
def initialize(code=nil, message=nil, action=nil)
|
15
|
+
@message = message
|
16
|
+
@code = code
|
17
|
+
@action = action
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"#{@code}: #{@message}"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class IncorrectMethodSignature < Error; end
|
27
|
+
class IncorrectMethodSignature < Error; end
|
28
|
+
|
29
|
+
# Exception dispatcher based on error logged by BSI
|
30
|
+
|
31
|
+
class Marshaler
|
32
|
+
|
33
|
+
SSL_RETRY_LIMIT = 5
|
34
|
+
|
35
|
+
def generate_exception(code, message)
|
36
|
+
case code
|
37
|
+
when 9000
|
38
|
+
# 9000 level
|
39
|
+
case message
|
40
|
+
when 'Logon failed: Broken pipe'
|
41
|
+
raise Error.new(code, message, 'retry')
|
42
|
+
end
|
43
|
+
else
|
44
|
+
raise Error.new(code, message)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def initialize(url, options={:verify=>true})
|
49
|
+
@target_url = url
|
50
|
+
@debug = options[:debug]
|
51
|
+
@stealth = options[:stealth]
|
52
|
+
@verify_ssl = options[:verify]
|
53
|
+
end
|
54
|
+
|
55
|
+
# Build xml for submission
|
56
|
+
def build_call(method_name, *arguments)
|
57
|
+
|
58
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
59
|
+
xml.methodCall{
|
60
|
+
xml.methodName_ method_name.gsub(/_/, '.')
|
61
|
+
xml.params{
|
62
|
+
arguments.each do |a|
|
63
|
+
xml.param{
|
64
|
+
unless a.nil?
|
65
|
+
type = a.class.to_s.downcase
|
66
|
+
send("#{type}_to_xml", xml, a)
|
67
|
+
else
|
68
|
+
raise "Nil is not an acceptable argument for method: #{method_name}#{arguments.to_s.gsub(/\]/, ')').gsub(/\[/, '(')}"
|
69
|
+
end
|
70
|
+
}
|
71
|
+
end
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
# Submit xml to them
|
77
|
+
send_xml( builder.to_xml )
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse(xml)
|
81
|
+
|
82
|
+
# Handle Errors appropriately
|
83
|
+
unless xml['methodResponse'].keys.include?('fault')
|
84
|
+
type = xml['methodResponse']['params']['param']['value'].keys.pop
|
85
|
+
# Handle happy path, no errors
|
86
|
+
send("convert_#{type}".to_sym, xml['methodResponse']['params']['param']['value'][type])
|
87
|
+
else
|
88
|
+
# Error occurred, extract it, notify
|
89
|
+
code = xml['methodResponse']['fault']['value']['struct']['member'][0]['value']['int'].to_i
|
90
|
+
message = xml['methodResponse']['fault']['value']['struct']['member'][1]['value']['string']
|
91
|
+
# How we should generate exceptions
|
92
|
+
generate_exception(code, message)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def send_xml( xml)
|
97
|
+
|
98
|
+
options = {:body => xml}
|
99
|
+
if @target_url.match(/https/)
|
100
|
+
options.merge!(:ssl_version=>:SSLv3)
|
101
|
+
options.merge!(:verify => @verify_ssl)
|
102
|
+
end
|
103
|
+
if @debug
|
104
|
+
puts "Sending:"
|
105
|
+
puts xml
|
106
|
+
puts ""
|
107
|
+
end
|
108
|
+
|
109
|
+
try_num = 0
|
110
|
+
unless @stealth
|
111
|
+
begin
|
112
|
+
response = HTTParty.post(@target_url, options)
|
113
|
+
rescue OpenSSL::SSL::SSLError => e
|
114
|
+
if try_num < SSL_RETRY_LIMIT
|
115
|
+
try_num = try_num + 1
|
116
|
+
puts "SSL error. Retry #{try_num}"
|
117
|
+
retry
|
118
|
+
else
|
119
|
+
raise e
|
120
|
+
end
|
121
|
+
rescue Error => e
|
122
|
+
puts 'Broken Pipe error, retrying'
|
123
|
+
retry if e.action == 'retry'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
unless @stealth
|
128
|
+
if @debug
|
129
|
+
puts "Recieved:"
|
130
|
+
puts Nokogiri::XML(response.body, &:noblanks)
|
131
|
+
end
|
132
|
+
|
133
|
+
parse(response)
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_send_xml(xml)
|
139
|
+
puts xml
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
# Methods to convert ruby structures into XML in the format BSI expects
|
144
|
+
def float_to_xml(noko, float)
|
145
|
+
noko.value{
|
146
|
+
noko.float_ float
|
147
|
+
}
|
148
|
+
end
|
149
|
+
|
150
|
+
def enumerator_to_xml(noko, enumerator)
|
151
|
+
# this should only be exercised when trying to pass a byte array
|
152
|
+
# this should be sent enclosed in <base64> and encoded as such
|
153
|
+
|
154
|
+
noko.value{
|
155
|
+
noko.base64_ Base64.encode64(enumerator.to_a.pack('c*'))
|
156
|
+
}
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
def array_to_xml(noko, array)
|
161
|
+
noko.value{
|
162
|
+
noko.array{
|
163
|
+
noko.data{
|
164
|
+
array.each do |e|
|
165
|
+
send("#{e.class.to_s.downcase}_to_xml".to_sym, noko, e)
|
166
|
+
end
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
def hash_to_xml(noko, hash)
|
173
|
+
noko.value{
|
174
|
+
noko.struct{
|
175
|
+
hash.each do |k,v|
|
176
|
+
noko.member{
|
177
|
+
noko.name_ k.to_s
|
178
|
+
send("#{v.class.to_s.downcase}_to_xml".to_sym, noko, v) unless v.nil?
|
179
|
+
}
|
180
|
+
end
|
181
|
+
}
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
185
|
+
def string_to_xml(noko, string)
|
186
|
+
noko.value{
|
187
|
+
noko.string_ string
|
188
|
+
}
|
189
|
+
end
|
190
|
+
|
191
|
+
def fixnum_to_xml(noko, int)
|
192
|
+
noko.value{
|
193
|
+
noko.int_ int
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
def convert_struct(xml)
|
198
|
+
hash = Hash.new
|
199
|
+
xml['member'].each do |e|
|
200
|
+
member_name = e['name']
|
201
|
+
member_value_type = e['value'].keys.first
|
202
|
+
member_value = send("convert_#{ member_value_type.gsub(/\./, '_') }".to_sym, e['value'][member_value_type] )
|
203
|
+
hash.store( member_name, member_value )
|
204
|
+
end
|
205
|
+
hash
|
206
|
+
end
|
207
|
+
|
208
|
+
def convert_array(xml)
|
209
|
+
array = Array.new
|
210
|
+
unless xml['data'].nil?
|
211
|
+
case xml['data']['value'].class.to_s.downcase
|
212
|
+
when 'array'
|
213
|
+
xml['data']['value'].each do |e|
|
214
|
+
member_type = e.keys.first
|
215
|
+
member_value = e[member_type]
|
216
|
+
array << send( "convert_#{member_type}".to_sym, member_value )
|
217
|
+
end
|
218
|
+
when 'hash'
|
219
|
+
member_type = xml['data']['value'].keys.first
|
220
|
+
member_value = xml['data']['value'][member_type]
|
221
|
+
array << send( "convert_#{member_type.gsub(/\./, '_')}".to_sym, member_value )
|
222
|
+
end
|
223
|
+
else
|
224
|
+
array = nil
|
225
|
+
end
|
226
|
+
array
|
227
|
+
end
|
228
|
+
|
229
|
+
# Methods to convert XML BSI sends back to us into ruby
|
230
|
+
def convert_int(xml)
|
231
|
+
xml.to_i
|
232
|
+
end
|
233
|
+
|
234
|
+
def convert_boolean(xml)
|
235
|
+
xml
|
236
|
+
end
|
237
|
+
|
238
|
+
def convert_nil(xml)
|
239
|
+
nil
|
240
|
+
end
|
241
|
+
|
242
|
+
def convert_string(xml)
|
243
|
+
xml
|
244
|
+
end
|
245
|
+
|
246
|
+
def convert_dateTime_iso8601(xml)
|
247
|
+
DateTime.parse(xml)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
module BSIServices
|
253
|
+
#
|
254
|
+
# Parent class of a standard BSIService
|
255
|
+
#
|
256
|
+
class BSIModule
|
257
|
+
include Marshaling
|
258
|
+
@@target_url = nil
|
259
|
+
@@session_id = nil
|
260
|
+
@@debug = false
|
261
|
+
|
262
|
+
def initialize(creds, options={})
|
263
|
+
methods = []
|
264
|
+
methods = options[:methods] if options[:methods]
|
265
|
+
@@debug = options[:debug]
|
266
|
+
@@stealth = options[:stealth]
|
267
|
+
@@session_id = creds[:session_id] if creds[:session_id]
|
268
|
+
@@target_url = options[:url]
|
269
|
+
@@marshal = Marshaler.new(@@target_url, options)
|
270
|
+
add_methods(methods)
|
271
|
+
end
|
272
|
+
|
273
|
+
def add_methods(methods)
|
274
|
+
methods.each do |meth|
|
275
|
+
define_singleton_method meth, ->(*arguments) { @@marshal.build_call( "#{self.class.to_s.split('::').last.downcase}.#{__method__}", *arguments.unshift( @@session_id ) ) }
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
end
|
280
|
+
|
281
|
+
#
|
282
|
+
# Special standard services that behave differently than the rest
|
283
|
+
#
|
284
|
+
class Test < BSIModule
|
285
|
+
|
286
|
+
def add(*arguments)
|
287
|
+
@@marshal.build_call('test.add', *arguments)
|
288
|
+
end
|
289
|
+
|
290
|
+
def echo(string)
|
291
|
+
@@marshal.build_call('test.echo', string)
|
292
|
+
end
|
293
|
+
|
294
|
+
end
|
295
|
+
|
296
|
+
class Common < BSIModule
|
297
|
+
# Special class where we don't want to pass SESSION_ID to all of its methods
|
298
|
+
|
299
|
+
def initialize(creds, options={})
|
300
|
+
@creds = creds
|
301
|
+
super
|
302
|
+
end
|
303
|
+
|
304
|
+
def logon
|
305
|
+
session_id = @@marshal.build_call( 'common.logon', @creds[:user], @creds[:pass], @creds[:server] )
|
306
|
+
if @@stealth
|
307
|
+
@@session_id = 'DUMMY-SESSION-ID'
|
308
|
+
else
|
309
|
+
@@session_id = session_id
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
def logoff
|
314
|
+
@@marshal.build_call('common.logoff', @@session_id)
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
|
319
|
+
class Batch < BSIModule
|
320
|
+
def reserveNextBsiId( batch_id, sample_id_template)
|
321
|
+
reserveAvailableBsiIds( batch_id, sample_id_template, 1).first
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
end
|
data/lib/rbc/version.rb
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
---
|
2
|
+
:attachment:
|
3
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/AttachmentService.html
|
4
|
+
:methods:
|
5
|
+
- download
|
6
|
+
:batch:
|
7
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/BatchService.html
|
8
|
+
:methods:
|
9
|
+
- addVials
|
10
|
+
- commit
|
11
|
+
- create
|
12
|
+
- delete
|
13
|
+
- get
|
14
|
+
- getBatchProperties
|
15
|
+
- getHeaders
|
16
|
+
- getVialProperties
|
17
|
+
- performL1Checks
|
18
|
+
- performL2Checks
|
19
|
+
- removeVials
|
20
|
+
- reserveAvailableBsiIds
|
21
|
+
- update
|
22
|
+
- updateVials
|
23
|
+
:billing:
|
24
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/BillingService.html
|
25
|
+
:methods:
|
26
|
+
- run
|
27
|
+
:cabig:
|
28
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/CABigService.html
|
29
|
+
:methods:
|
30
|
+
- getAvailableSpecimenCount
|
31
|
+
- getSpecimenCount
|
32
|
+
- getSpecimenFields
|
33
|
+
- getSpecimens
|
34
|
+
- logoff
|
35
|
+
- logon
|
36
|
+
:codelist:
|
37
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/CodeListService.html
|
38
|
+
:methods:
|
39
|
+
- synchCodeList
|
40
|
+
:common:
|
41
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/CommonService.html
|
42
|
+
:methods:
|
43
|
+
- checkPermission
|
44
|
+
- logoff
|
45
|
+
- logon
|
46
|
+
- ping
|
47
|
+
- setForgottenPassword
|
48
|
+
- webLogon
|
49
|
+
:database:
|
50
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/DatabaseService.html
|
51
|
+
:methods:
|
52
|
+
- getFields
|
53
|
+
- getTables
|
54
|
+
- normalizeValues
|
55
|
+
:intrak:
|
56
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/InTrakService.html
|
57
|
+
:methods:
|
58
|
+
- notifyDataModification
|
59
|
+
- notifyEventComplete
|
60
|
+
- notifyShipmentReceived
|
61
|
+
- notifyShipmentSpecimensReceived
|
62
|
+
- notifyShipTaskDataUpdated
|
63
|
+
- notifySpecimensAliquotted
|
64
|
+
- notifySpecimensDestroyed
|
65
|
+
- notifySpecimensRelabeled
|
66
|
+
- notifySpecimensReturned
|
67
|
+
- notifySpecimensShipped
|
68
|
+
:ireport:
|
69
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/IReportService.html
|
70
|
+
:methods:
|
71
|
+
- getDisplayTables
|
72
|
+
- getReport
|
73
|
+
- getReportDirectoryStructure
|
74
|
+
- getReportsInFolder
|
75
|
+
- saveReport
|
76
|
+
:kit:
|
77
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/KitService.html
|
78
|
+
:methods:
|
79
|
+
- updateStatus
|
80
|
+
:ladds:
|
81
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/LADDSService.html
|
82
|
+
:methods:
|
83
|
+
- upload
|
84
|
+
:report:
|
85
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/ReportService.html
|
86
|
+
:methods:
|
87
|
+
- count
|
88
|
+
- count
|
89
|
+
- execute
|
90
|
+
- execute
|
91
|
+
:requisition:
|
92
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/RequisitionService.html
|
93
|
+
:methods:
|
94
|
+
- addVials
|
95
|
+
- changeRequisitionVialApprovalStatus
|
96
|
+
- checkAuthorization
|
97
|
+
- getAttachments
|
98
|
+
- getBsiIdsRequiringApproval
|
99
|
+
- getProperties
|
100
|
+
- getReqDiscrepancies
|
101
|
+
- removeVials
|
102
|
+
- save
|
103
|
+
- submit
|
104
|
+
- submit
|
105
|
+
- submitSavedRequisition
|
106
|
+
- update
|
107
|
+
- updateDiscrepancyResolutionSuggestions
|
108
|
+
- updatePriorities
|
109
|
+
- uploadAttachment
|
110
|
+
- uploadManifest
|
111
|
+
:results:
|
112
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/ResultsService.html
|
113
|
+
:methods:
|
114
|
+
- createResultsBatch
|
115
|
+
- createResultsBatch
|
116
|
+
- getProcedureDescription
|
117
|
+
- getResultsRunData
|
118
|
+
- saveResultsRunData
|
119
|
+
:shipment:
|
120
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/ShipmentService.html
|
121
|
+
:methods:
|
122
|
+
- addVials
|
123
|
+
- getProperties
|
124
|
+
- getShipment
|
125
|
+
- submit
|
126
|
+
- submit
|
127
|
+
- update
|
128
|
+
- updateDiscrepancyResolutionSuggestions
|
129
|
+
- uploadManifest
|
130
|
+
:study:
|
131
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/StudyService.html
|
132
|
+
:methods:
|
133
|
+
- getAttachments
|
134
|
+
:subject:
|
135
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/SubjectService.html
|
136
|
+
:methods:
|
137
|
+
- deleteSubject
|
138
|
+
- getAttachments
|
139
|
+
- getSubject
|
140
|
+
- getSubjectProperties
|
141
|
+
- performL1Checks
|
142
|
+
- performL2Checks
|
143
|
+
- saveNewSubject
|
144
|
+
- saveSubject
|
145
|
+
:test:
|
146
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/TestService.html
|
147
|
+
:methods:
|
148
|
+
- add
|
149
|
+
- echo
|
150
|
+
:user:
|
151
|
+
:doc_link: http://www506.imsweb.com/wsapi-dev/bsi/webservices/service/UserService.html
|
152
|
+
:methods:
|
153
|
+
- authorize
|
154
|
+
- create
|
155
|
+
- getInfo
|
156
|
+
- update
|
data/rbc.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) << File.expand_path('../lib', __FILE__)
|
4
|
+
require 'rbc/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
# Metadata
|
8
|
+
s.name = 'rbc'
|
9
|
+
s.version = RBCVersion::VERSION
|
10
|
+
s.authors = ['Elijah Christensen']
|
11
|
+
s.email = ['ejd.christensen@gmail.com']
|
12
|
+
s.summary = 'A ruby client for managing interactions with the IMS BioSpecimen Inventory system'
|
13
|
+
s.platform = Gem::Platform::RUBY
|
14
|
+
s.homepage = 'https://github.com/elijahc/rbc'
|
15
|
+
s.license = 'MIT'
|
16
|
+
|
17
|
+
# Manifest
|
18
|
+
s.files = `git ls-files`.split(/\n/)
|
19
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
21
|
+
s.require_paths = ['lib']
|
22
|
+
|
23
|
+
# Development Dependencies
|
24
|
+
s.add_development_dependency "bundler", "~> 1.6"
|
25
|
+
s.add_development_dependency "rake"
|
26
|
+
s.add_development_dependency "rspec"
|
27
|
+
s.add_development_dependency "rspec-nc"
|
28
|
+
s.add_development_dependency "guard"
|
29
|
+
s.add_development_dependency "guard-rspec"
|
30
|
+
s.add_development_dependency "terminal-notifier-guard"
|
31
|
+
s.add_development_dependency "pry"
|
32
|
+
s.add_development_dependency "pry-remote"
|
33
|
+
s.add_development_dependency "pry-nav"
|
34
|
+
s.add_development_dependency "coveralls"
|
35
|
+
|
36
|
+
# Runtime Dependencies
|
37
|
+
s.add_runtime_dependency('nokogiri', ['>= 1.5.5'])
|
38
|
+
s.add_runtime_dependency('httparty', '~> 0.9', '>= 0.9.0')
|
39
|
+
end
|
data/spec/rbc_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RBC do
|
4
|
+
|
5
|
+
it 'has a version number' do
|
6
|
+
expect(RBC::VERSION).not_to be_nil
|
7
|
+
expect(RBC::VERSION).to be_instance_of String
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#new' do
|
11
|
+
it 'expects a Hash' do
|
12
|
+
expect{RBC.new}.to raise_error(ArgumentError)
|
13
|
+
expect{RBC.new([])}.to raise_error(ArgumentError)
|
14
|
+
expect{RBC.new({:user => 'me'})}.to raise_error(ArgumentError)
|
15
|
+
expect{RBC.new({:user => 'me', :pass => 'too'})}.to raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'takes an optional instance parameter' do
|
19
|
+
@bsi = RBC.new({:user => 'me', :pass => 'pass', :server => 'server'}, {:instance => :mirror})
|
20
|
+
expect(@bsi.url_target).to eq(RBC::BSI_INSTANCES[:mirror])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/test/test_rbc.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rbc'
|
2
|
+
require 'yaml'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestRBC < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@creds = YAML::load(File.open( './test/key.yaml' ))
|
9
|
+
@bsi = RBC.new(@creds, {:debug => true, :stealth => true})
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
@bsi.logoff
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_init
|
17
|
+
|
18
|
+
assert('RBC', @bsi.class)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_add
|
22
|
+
assert_equal( 4, @bsi.test.add(1,3) )
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_echo
|
26
|
+
assert_equal( 'You said: Hi there BSI', @bsi.test.echo('Hi there BSI') )
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_batch_create
|
30
|
+
batch_props = Hash.new
|
31
|
+
batch_props.store('batch.acess_level', "1")
|
32
|
+
batch_props.store('batch.description', 'Add Batch example')
|
33
|
+
batch_props.store('batch.template_path', '/system/templates/default')
|
34
|
+
batch_props.store('batch_req_verification', '0')
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_report_execute
|
39
|
+
|
40
|
+
report_spec = [{:field => 'vial.bsi_id', :operator => 'not equals', :value => '@@Missing'}]
|
41
|
+
display = ['vial.bsi_id']
|
42
|
+
report = @bsi.report_execute(report_spec, display, ['vial.bsi_id'], 0, 1)
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_report_count
|
47
|
+
report_spec = [ {:field => 'vial.bsi_id', :operator => 'not equals', :value => '@@Missing'}
|
48
|
+
]
|
49
|
+
display = ['requisition.requisition_id', '+req_repository.req_status']
|
50
|
+
count = @bsi.report_count(report_spec, display)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,251 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rbc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Elijah Christensen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-nc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: terminal-notifier-guard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry-remote
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry-nav
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: coveralls
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: nokogiri
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.5.5
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 1.5.5
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: httparty
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0.9'
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 0.9.0
|
191
|
+
type: :runtime
|
192
|
+
prerelease: false
|
193
|
+
version_requirements: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - "~>"
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '0.9'
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: 0.9.0
|
201
|
+
description:
|
202
|
+
email:
|
203
|
+
- ejd.christensen@gmail.com
|
204
|
+
executables: []
|
205
|
+
extensions: []
|
206
|
+
extra_rdoc_files: []
|
207
|
+
files:
|
208
|
+
- ".gitignore"
|
209
|
+
- Gemfile
|
210
|
+
- Gemfile.lock
|
211
|
+
- Guardfile
|
212
|
+
- README.md
|
213
|
+
- Rakefile
|
214
|
+
- lib/rbc.rb
|
215
|
+
- lib/rbc/bsi.rb
|
216
|
+
- lib/rbc/version.rb
|
217
|
+
- lib/service_spec.yaml
|
218
|
+
- rbc.gemspec
|
219
|
+
- ref/xml_post_example.xml
|
220
|
+
- spec/rbc_spec.rb
|
221
|
+
- spec/spec_helper.rb
|
222
|
+
- test/test_rbc.rb
|
223
|
+
homepage: https://github.com/elijahc/rbc
|
224
|
+
licenses:
|
225
|
+
- MIT
|
226
|
+
metadata: {}
|
227
|
+
post_install_message:
|
228
|
+
rdoc_options: []
|
229
|
+
require_paths:
|
230
|
+
- lib
|
231
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - ">="
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '0'
|
236
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
|
+
requirements:
|
238
|
+
- - ">="
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '0'
|
241
|
+
requirements: []
|
242
|
+
rubyforge_project:
|
243
|
+
rubygems_version: 2.2.2
|
244
|
+
signing_key:
|
245
|
+
specification_version: 4
|
246
|
+
summary: A ruby client for managing interactions with the IMS BioSpecimen Inventory
|
247
|
+
system
|
248
|
+
test_files:
|
249
|
+
- spec/rbc_spec.rb
|
250
|
+
- spec/spec_helper.rb
|
251
|
+
- test/test_rbc.rb
|