rbc 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.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
|