libis-services 0.1.0-java

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.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +36 -0
  6. data/Rakefile +6 -0
  7. data/lib/libis/services/aleph/search.rb +157 -0
  8. data/lib/libis/services/alma/web_service.rb +36 -0
  9. data/lib/libis/services/collective_access/cataloguing.rb +48 -0
  10. data/lib/libis/services/collective_access/connector.rb +151 -0
  11. data/lib/libis/services/collective_access/item_info.rb +36 -0
  12. data/lib/libis/services/collective_access/search.rb +26 -0
  13. data/lib/libis/services/collective_access/service.rb +80 -0
  14. data/lib/libis/services/collective_access.rb +1 -0
  15. data/lib/libis/services/digitool/digital_entity_manager.rb +223 -0
  16. data/lib/libis/services/digitool/digitool_connector.rb +46 -0
  17. data/lib/libis/services/digitool/meta_data_manager.rb +193 -0
  18. data/lib/libis/services/extend/http_fetch.rb +63 -0
  19. data/lib/libis/services/generic_search.rb +38 -0
  20. data/lib/libis/services/http_error.rb +21 -0
  21. data/lib/libis/services/oracle_client.rb +47 -0
  22. data/lib/libis/services/primo/limo.rb +33 -0
  23. data/lib/libis/services/primo/search.rb +46 -0
  24. data/lib/libis/services/primo.rb +2 -0
  25. data/lib/libis/services/rest_client.rb +66 -0
  26. data/lib/libis/services/rosetta/client.rb +108 -0
  27. data/lib/libis/services/rosetta/collection_handler.rb +45 -0
  28. data/lib/libis/services/rosetta/collection_info.rb +44 -0
  29. data/lib/libis/services/rosetta/deposit_activity.rb +48 -0
  30. data/lib/libis/services/rosetta/deposit_handler.rb +187 -0
  31. data/lib/libis/services/rosetta/ie.rb +19 -0
  32. data/lib/libis/services/rosetta/ie_handler.rb +29 -0
  33. data/lib/libis/services/rosetta/oai_pmh.rb +48 -0
  34. data/lib/libis/services/rosetta/oai_set.rb +21 -0
  35. data/lib/libis/services/rosetta/pds_handler.rb +60 -0
  36. data/lib/libis/services/rosetta/producer.rb +71 -0
  37. data/lib/libis/services/rosetta/producer_handler.rb +125 -0
  38. data/lib/libis/services/rosetta/service.rb +403 -0
  39. data/lib/libis/services/rosetta/sip.rb +26 -0
  40. data/lib/libis/services/rosetta/sip_handler.rb +31 -0
  41. data/lib/libis/services/rosetta/user.rb +70 -0
  42. data/lib/libis/services/rosetta/user_manager.rb +28 -0
  43. data/lib/libis/services/rosetta.rb +2 -0
  44. data/lib/libis/services/scope/search.rb +46 -0
  45. data/lib/libis/services/search_factory.rb +40 -0
  46. data/lib/libis/services/service_error.rb +16 -0
  47. data/lib/libis/services/sharepoint/connector.rb +236 -0
  48. data/lib/libis/services/sharepoint/search.rb +19 -0
  49. data/lib/libis/services/soap_client.rb +57 -0
  50. data/lib/libis/services/soap_error.rb +22 -0
  51. data/lib/libis/services/version.rb +5 -0
  52. data/lib/libis/services.rb +22 -0
  53. data/lib/libis-services.rb +1 -0
  54. data/libis-services.gemspec +40 -0
  55. data/spec/alma_service_spec.rb +104 -0
  56. data/spec/ie_data.rb +726 -0
  57. data/spec/primo_limo_spec.rb +363 -0
  58. data/spec/primo_search_spec.rb +39 -0
  59. data/spec/rosetta_collection_spec.rb +206 -0
  60. data/spec/rosetta_deposit_spec.rb +82 -0
  61. data/spec/rosetta_ie_spec.rb +54 -0
  62. data/spec/rosetta_oai_spec.rb +52 -0
  63. data/spec/rosetta_pds_spec.rb +79 -0
  64. data/spec/rosetta_producer_spec.rb +270 -0
  65. data/spec/rosetta_sip_spec.rb +39 -0
  66. data/spec/spec_helper.rb +28 -0
  67. metadata +317 -0
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ require 'libis/tools/extend/hash'
4
+ require_relative 'client'
5
+ require_relative 'sip'
6
+ require_relative 'ie'
7
+
8
+ module Libis
9
+ module Services
10
+ module Rosetta
11
+
12
+ class SipHandler < Libis::Services::Rosetta::Client
13
+
14
+ def initialize(base_url = 'http://depot.lias.be', options = {})
15
+ super 'repository', 'SipWebServices', {url: base_url}.merge(options)
16
+ end
17
+
18
+ def get_info(sip_id)
19
+ request_object :get_sip_status_info, Rosetta::Sip, arg0: sip_id
20
+ end
21
+
22
+ def get_ies(sip_id)
23
+ request_array(:get_sip_i_es, arg0: sip_id).map {|ie| Rosetta::Ie.new(pid: ie)}
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ require 'virtus'
2
+
3
+ module Libis
4
+ module Services
5
+ module Rosetta
6
+ class User
7
+ # noinspection RubyResolve
8
+ include Virtus.model nullify_blank: true
9
+
10
+ RECORD_TYPE = %w'USER CONTACT ORGANIZATION STAFF PUBLIC'
11
+ USER_STATUS = %w'ACTIVE INACTIVE DELETED'
12
+ USER_ROLES_STATUS = %w'NEW ACTIVE INACTIVE PENDING DELETED'
13
+ USER_TYPE = %w'CASUAL INTERNAL EXTERNAL INTEXTAUTH'
14
+
15
+ attribute :first_name, String
16
+ attribute :last_name, String
17
+ attribute :user_name, String
18
+ attribute :user_group, String
19
+ attribute :expiry_date, String
20
+ attribute :job_title, String
21
+ attribute :default_language, String
22
+ attribute :street, String
23
+ attribute :suburb, String
24
+ attribute :city, String
25
+ attribute :country, String
26
+ attribute :address_1, String
27
+ attribute :address_2, String
28
+ attribute :address_3, String
29
+ attribute :address_4, String
30
+ attribute :address_5, String
31
+ attribute :zip, Integer
32
+ attribute :email_address, String
33
+ attribute :web_site_url, String
34
+ attribute :telephone_1, String
35
+ attribute :telephone_2, String
36
+ attribute :fax, String
37
+
38
+ attribute :password, String
39
+ attribute :password_verify, String
40
+
41
+ def to_hash
42
+ super.cleanup
43
+ end
44
+
45
+ def to_xml
46
+ Libis::Tools::XmlDocument.build do |xml|
47
+ # noinspection RubyResolve
48
+ xml.user_info {
49
+ xml.parent.default_namespace = 'http://www.exlibrisgroup.com/xsd/dps/backoffice/service'
50
+ self.attributes.each do |name, value|
51
+ xml.send(name, xmlns: '') { xml.text(value) } if value
52
+ end
53
+ }
54
+ end.to_xml
55
+ end
56
+
57
+ def self.from_xml(xml)
58
+ xml_doc = Libis::Tools::XmlDocument.parse(xml)
59
+ hash = xml_doc.to_hash(
60
+ strip_namespaces: true,
61
+ delete_namespace_attributes: true,
62
+ empty_tag_value: nil,
63
+ convert_tags_to: lambda { |tag| tag.to_sym }
64
+ )
65
+ self.new(hash[:producer_info])
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ require 'virtus'
3
+
4
+ require 'libis/tools/extend/hash'
5
+ require_relative 'client'
6
+
7
+ module Libis
8
+ module Services
9
+ module Rosetta
10
+
11
+ class UserManager < Libis::Services::Rosetta::Client
12
+
13
+ def initialize(base_url = 'http://depot.lias.be', options = {})
14
+ super 'infra', 'UserManagerWS', {url: base_url}.merge(options)
15
+ end
16
+
17
+ def user(user_id, user_info)
18
+ user_info = user_info.to_hash if user_info.is_a? User
19
+ do_request :update_user, arg0: user_info, arg1: user_id
20
+ end
21
+
22
+ protected
23
+
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'rosetta/service'
2
+ require_relative 'rosetta/oai_pmh'
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+
3
+ require 'libis/services/oracle_client'
4
+ require 'libis/tools/xml_document'
5
+
6
+ module Libis
7
+ module Services
8
+ module Scope
9
+
10
+ class Search
11
+ include ::Libis::Services::GenericSearch
12
+
13
+ def initialize
14
+ @doc = nil
15
+ end
16
+
17
+ def find(term, options = {})
18
+ super
19
+ OracleClient.new('SCOPE01', 'APLKN_ARCHV_LIAS', 'archvsc').
20
+ call('kul_packages.scope_xml_meta_file_ed', [term.upcase])
21
+ err_file = "/nas/vol03/oracle/scope01/#{term}_err.XML"
22
+ if File.exist? err_file
23
+ doc = XmlDocument.open(err_file)
24
+ msg = doc.xpath('/error/error_msg').first.content
25
+ msg_detail = doc.xpath('/error/error_').first.content
26
+ File.delete(err_file)
27
+ @doc = nil
28
+ raise RuntimeError, "Scope search failed: '#{msg}'. Details: '#{msg_detail}'"
29
+ else
30
+ @doc = XmlDocument.open("/nas/vol03/oracle/scope01/#{term}_md.XML").to_hash
31
+ end
32
+ end
33
+
34
+ def each(_ = {})
35
+ yield @doc
36
+ end
37
+
38
+ def next_record(_ = {})
39
+ yield @doc
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'aleph/search'
4
+ require_relative 'primo/search'
5
+ require_relative 'sharepoint/search'
6
+ require_relative 'scope/search'
7
+
8
+ module Libis
9
+ module Services
10
+
11
+ class SearchFactory
12
+ def initialize(format, *args)
13
+ @search_class = self.class.const_get("Libis::Services::#{format}::Search")
14
+ @search_client = @search_class.new *args
15
+
16
+ rescue Exception => e
17
+ puts e.message
18
+ exit -1
19
+ end
20
+
21
+ def query(query, options = {})
22
+ @search_client.get(query, options)
23
+ end
24
+
25
+ def find(term, options = {})
26
+ @search_client.find(term, options)
27
+ end
28
+
29
+ def each(options = {}, &block)
30
+ @search_client.each(options, &block)
31
+ end
32
+
33
+ def next_record(options = {}, &block)
34
+ @search_client.next_record(options, &block)
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ module Libis
4
+ module Services
5
+
6
+ class ServiceError < Exception
7
+ attr_accessor :message
8
+
9
+ def initialize(error)
10
+ @message = error.to_s
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,236 @@
1
+ # coding: utf-8
2
+
3
+ require 'highline'
4
+ require 'libis/tools/logger'
5
+
6
+ require 'libis/services/soap_client'
7
+
8
+ module Libis
9
+ module Services
10
+ module Sharepoint
11
+
12
+ class Search
13
+ include ::Libis::Services::SoapClient
14
+ include ::Libis::Tools::Logger
15
+ include ::Libis::Services::GenericSearch
16
+
17
+ private
18
+
19
+ MY_QUERY_SYMBOLS = {
20
+ nil => 'Eq',
21
+ '==' => 'Eq',
22
+ '!=' => 'Neq',
23
+ '>' => 'Gt',
24
+ '>=' => 'Geq',
25
+ '<' => 'Lt',
26
+ '<=' => 'Leq',
27
+ 'is null' => 'IsNull'
28
+ }
29
+
30
+ MAX_QUERY_RETRY = 10
31
+
32
+ public
33
+
34
+ def initialize(options = {})
35
+ options[:server_url] = (options[:url] || 'https://www.groupware.kuleuven.be/sites/lias') + (options[:url_ext] || '/_vti_bin')
36
+ options[:ssl] = true if options[:server_url] =~ /^https:/
37
+ # options[:soap_url] = options[:server_url].gsub(/^(https?):\/\/)/,"\\1#{CGI.escape(username)}:#{CGI.escape(password)}@") + '/Lists.asmx'
38
+ options[:wsse_auth] = [options[:username], options[:password]]
39
+ options[:soap_url] = options[:server_url] + '/Lists.asmx'
40
+ options[:wsdl_url] = options[:soap_url] + '?wsdl'
41
+ configure options[:wsdl_url], options
42
+ options
43
+ end
44
+
45
+ def query(term, options = {})
46
+
47
+ options[:term] = term
48
+
49
+ options[:limit] ||= 100
50
+ options[:value_type] ||= 'Text'
51
+ options[:query_operator] = MY_QUERY_SYMBOLS[options[:query_operator] || '==']
52
+
53
+ options[:query_operator] = 'BeginsWith' if term =~ /^[^*]+\*$/
54
+ options[:query_operator] = 'Contains' if term =~ /^\*[^*]+\*$/
55
+
56
+ restart_query options
57
+
58
+ options
59
+
60
+ end
61
+
62
+ def each(options)
63
+
64
+ # we start with a new search
65
+ restart_query options
66
+ get_next_set options
67
+
68
+ while records_to_process? options
69
+
70
+ yield options[:result][:records][options[:current]]
71
+
72
+ options[:current] += 1
73
+
74
+ get_next_set(options) if require_next_set?(options)
75
+
76
+ end
77
+
78
+ restart_query(options)
79
+
80
+ end
81
+
82
+ protected
83
+
84
+ def restart_query(options)
85
+ options[:start_id] = 0
86
+ options[:result] = nil
87
+ options[:current] = 0
88
+ options[:set_count] = 0
89
+ options[:next_set] = nil
90
+ end
91
+
92
+ def records_to_process?(options)
93
+ options[:current] < options[:set_count]
94
+ end
95
+
96
+ def require_next_set?(options)
97
+ options[:current] >= options[:set_count] and options[:next_set]
98
+ end
99
+
100
+ def get_next_set(options)
101
+
102
+ options[:current] = 0
103
+ options[:set_count] = 0
104
+
105
+ retry_count = MAX_QUERY_RETRY
106
+
107
+ while retry_count > 0
108
+
109
+ warn "Retrying (#{retry_count}) ..." if retry_count < MAX_QUERY_RETRY
110
+
111
+ query = {
112
+ 'Query' => {
113
+ 'Where' => {
114
+ options[:query_operator] => {
115
+ 'FieldRef' => '',
116
+ 'Value' => options[:term],
117
+ :attributes! => {
118
+ 'FieldRef' => {
119
+ 'Name' => options[:index]
120
+ },
121
+ 'Value' => {
122
+ 'Type' => options[:value_type]
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ query_options = {
131
+ 'QueryOptions' => {
132
+ 'ViewAttributes' => '',
133
+ :attributes! => {
134
+ 'ViewAttributes' => {
135
+ 'Scope' => 'RecursiveAll'
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ now = Time.now
142
+ window_start = Time.new(now.year, now.month, now.day, 12, 15)
143
+ window_end = Time.new(now.year, now.month, now.day, 13, 15)
144
+ if options[:selection] and now > window_start and now < window_end
145
+ query_options['QueryOptions']['Folder'] = options[:server_url] + 'Gedeelde%20documenten/' + options[:selection] + '/.'
146
+ end
147
+
148
+ if options[:next_set]
149
+ query_options['QueryOptions']['Paging'] = ''
150
+ query_options['QueryOptions'][:attributes!]['Paging'] = {'ListItemCollectionPositionNext' => options[:next_set]}
151
+ end
152
+
153
+ result = request 'GetListItems', {
154
+ soap_options: {
155
+ endpoint: options[:soap_url]
156
+ },
157
+ wsse_auth: options[:wsse_auth],
158
+ listName: options[:base],
159
+ viewName: '',
160
+ query: query,
161
+ viewFields: {'ViewFields' => ''},
162
+ rowLimit: options[:limit].to_s,
163
+ query_options: query_options,
164
+ webID: ''
165
+ }, {}, options
166
+
167
+ if result[:error]
168
+ warn "SOAP error: '#{result[:error]}'"
169
+ raise RuntimeError, 'Too many SOAP errors, giving up.' unless retry_count > 0
170
+ elsif result[:exception]
171
+ warn "SOAP exception: '#{result[:exception].message}'"
172
+ raise result[:exception] unless retry_count > 0
173
+ else
174
+ options[:result] = result
175
+ options[:set_count] = result[:count]
176
+ options[:next_set] = result[:next_set]
177
+ retry_count = 0
178
+ retry_count = MAX_QUERY_RETRY + 1 if options[:set_count] == 0 and options[:next_set]
179
+ end
180
+
181
+ retry_count -= 1
182
+
183
+ end
184
+
185
+ end
186
+
187
+ def result_parser(result, options)
188
+
189
+ records = []
190
+ result = result[:get_list_items_response][:get_list_items_result]
191
+
192
+ data = result[:listitems][:data]
193
+
194
+ rows = data[:row]
195
+ rows = [rows] unless rows.is_a? Array
196
+
197
+ rows.each do |row|
198
+ if options[:selection].nil? or row[:ows_FileRef] =~ /^\d+;#sites\/lias\/Gedeelde documenten\/#{options[:selection]}(|\/.*)$/
199
+ records << clean_row(row, options)
200
+ end
201
+ end
202
+
203
+ next_set = data[:@list_item_collection_position_next]
204
+
205
+ # the itemcount in the response is not interesting. We count only the records that match our selection criteria.
206
+ count = records.size
207
+
208
+ {next_set: next_set, records: records, count: count}
209
+
210
+ end
211
+
212
+ def clean_row(row, options)
213
+
214
+ options[:fields_found] ||= Set.new
215
+ row.keys.each { |k| options[:fields_found] << k }
216
+
217
+ fields_to_be_removed = [:ows_MetaInfo]
218
+ fields_to_be_removed = row.keys - options[:field_selection] if options[:field_selection]
219
+
220
+ record = SharepointRecord.new
221
+
222
+ row.each do |k, v|
223
+ key = k.to_s.gsub(/^@/, '').to_sym
224
+ next if fields_to_be_removed.include? key
225
+ record[key] = v.dot_net_clean
226
+ end
227
+
228
+ record
229
+
230
+ end
231
+
232
+ end
233
+
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,19 @@
1
+ # coding: utf-8
2
+
3
+ require 'libis/services/generic_search'
4
+
5
+ module Libis
6
+ module Services
7
+ module Sharepoint
8
+
9
+ class Search
10
+ include ::Libis::Services::GenericSearch
11
+
12
+ def initialize
13
+ puts 'TODO'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,57 @@
1
+ # coding: utf-8
2
+
3
+ require 'savon'
4
+
5
+ require 'libis/tools/xml_document'
6
+ require_relative 'http_error'
7
+ require_relative 'soap_error'
8
+
9
+ module Libis
10
+ module Services
11
+
12
+ module SoapClient
13
+ attr_reader :client
14
+
15
+ def configure(wsdl, options = {})
16
+ opts = {
17
+ wsdl: wsdl,
18
+ raise_errors: false,
19
+ soap_version: 1,
20
+ filters: [:password],
21
+ pretty_print_xml: true,
22
+ }.merge options
23
+
24
+ @client = Savon.client(opts) { yield if block_given? }
25
+ end
26
+
27
+ def operations
28
+ @client.operations
29
+ end
30
+
31
+ def request(method, message = {}, call_options = {}, parse_options = {})
32
+ response = client.call(method, message: message) do |locals|
33
+ call_options.each do |key, value|
34
+ locals.send(key, value)
35
+ end
36
+ end
37
+
38
+ return yield(response) if block_given?
39
+ parse_result(response, parse_options)
40
+ end
41
+
42
+ protected
43
+
44
+ def parse_result(response, options = {})
45
+ raise SoapError.new response.soap_fault.to_hash if response.soap_fault?
46
+ raise HttpError.new response.http_error.to_hash if response.http_error?
47
+ self.result_parser(response.body, options)
48
+ end
49
+
50
+ def result_parser(response, options = {})
51
+ response
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module Libis
4
+ module Services
5
+
6
+ class SoapError < Exception
7
+ attr_accessor :code, :text, :detail, :name
8
+
9
+ def initialize(error)
10
+ @code = error[:fault][:faultcode] rescue nil
11
+ @text = error[:fault][:faultstring] rescue nil
12
+ @detail = error[:fault][:detail] rescue nil
13
+ @name = @detail.first.first rescue nil
14
+ end
15
+
16
+ def message
17
+ "#{code}:#{name} #{text}"
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module Libis
2
+ module Services
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ module Libis
2
+ module Services
3
+
4
+ autoload :HttpError, 'libis/services/http_error'
5
+ autoload :SoapError, 'libis/services/soap_error'
6
+ autoload :ServiceError, 'libis/services/service_error'
7
+
8
+ autoload :SoapClient, 'libis/services/soap_client'
9
+ autoload :RestClient, 'libis/services/rest_client'
10
+
11
+ autoload :OracleClient, 'libis/services/oracle_client'
12
+ autoload :DigitoolConnector, 'libis/services/digitool_connector'
13
+ autoload :DigitalEntityManager, 'libis/services/digital_entity_manager'
14
+ autoload :MetaDataManager, 'libis/services/meta_data_manager'
15
+
16
+ autoload :SharepointConnector, 'libis/services/sharepoint_connector'
17
+
18
+ autoload :Rosetta, 'libis/services/rosetta'
19
+ autoload :Primo, 'libis/services/primo'
20
+
21
+ end
22
+ end
@@ -0,0 +1 @@
1
+ require 'libis/services'
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'libis/services/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'libis-services'
10
+ spec.version = Libis::Services::VERSION
11
+ spec.authors = ['Kris Dekeyser']
12
+ spec.email = ['kris.dekeyser@libis.be']
13
+ spec.summary = %q{LIBIS Services toolbox.}
14
+ spec.description = %q{Set of classes that simplify connection to different LIBIS services.}
15
+ spec.homepage = 'https://github.com/Kris-LIBIS/LIBIS_Services'
16
+ spec.license = 'MIT'
17
+
18
+ spec.platform = Gem::Platform::JAVA if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
19
+
20
+ spec.files = `git ls-files -z`.split("\x0")
21
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.6'
26
+ spec.add_development_dependency 'rake', '~> 10.3'
27
+ spec.add_development_dependency 'rspec', '~> 3.1'
28
+ spec.add_development_dependency 'simplecov', '~> 0.9'
29
+ spec.add_development_dependency 'coveralls', '~> 0.7'
30
+ spec.add_development_dependency 'equivalent-xml', '~> 0.6'
31
+
32
+ spec.add_runtime_dependency 'libis-tools', '~> 0.9'
33
+ spec.add_runtime_dependency 'highline', '~> 1.7'
34
+ spec.add_runtime_dependency 'savon', '~> 2.11'
35
+ spec.add_runtime_dependency 'rest-client', '~> 1.8'
36
+ spec.add_runtime_dependency 'oai', '~> 0.4'
37
+ spec.add_runtime_dependency 'virtus', '~> 1.0'
38
+ spec.add_runtime_dependency 'write_xlsx', '~> 0.83'
39
+ spec.add_runtime_dependency 'awesome_print', '~> 1.6'
40
+ end