marklogic 0.0.1 → 0.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ddad5d982939d5693742db6623e91f7d557de379
4
- data.tar.gz: 77e4174a64065444b8a58408eeddfc3d7d23c879
3
+ metadata.gz: a18a7c658e56f1ad3d394de8120246955b35c90d
4
+ data.tar.gz: 5380d8f65f962dec8c958be996194ece2724e35e
5
5
  SHA512:
6
- metadata.gz: ba515d4ec20bb8c9f22ff93749d2df9542d5803eb9622d7dea000de4edb6085c90da2a2cd4ecb8f24c0d1c2c2d7efdef62dcd1b56ab9f91bebc3dd5d99d25f30
7
- data.tar.gz: 162f3f432d888b4ae47357c4345b68069a761b4c6fc14498922ecdbf4138d60c933c2a665602008eaa07a5ea33a9b0fd56dffd6864677f9961e3dd3d0acff16b
6
+ metadata.gz: 465d4b95d2cb7b89f62b29e9462d4f44f029fc45d2a73132b117aa1bbf326d9e05bb11094cc7701c073a22fa6ff05628655c0dec7fa6751c08fcd654837b9424
7
+ data.tar.gz: 01c5b4435cc0f35ed3d6c1a0e93f159b4b7c41f3ecac97d75f5db111783c0363025ddb6f0bddf48a6be0b3c6afb5ad51ffcd25fcdf3c583e79a69f49ebf5e9ec
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.2.2
data/Rakefile CHANGED
@@ -1,6 +1,26 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
3
  require 'rspec/core/rake_task'
4
+ require File.expand_path('../lib/marklogic/version', __FILE__)
5
+
4
6
  RSpec::Core::RakeTask.new
5
7
 
6
8
  task :default => :spec
9
+
10
+ desc 'Builds the gem'
11
+ task :build do
12
+ sh "gem build marklogic.gemspec"
13
+ end
14
+
15
+ desc 'Builds and installs the gem'
16
+ task :install => :build do
17
+ sh "gem install marklogic-#{MarkLogic::Version}"
18
+ end
19
+
20
+ desc 'Tags version, pushes to remote, and pushes gem'
21
+ task :release => :build do
22
+ sh "git tag v#{MarkMapper::Version}"
23
+ sh "git push origin master"
24
+ sh "git push origin v#{MarkLogic::Version}"
25
+ sh "gem push marklogic-#{MarkLogic::Version}.gem"
26
+ end
data/lib/marklogic.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'oj'
1
2
  require 'active_support'
2
3
  require 'active_support/core_ext/object'
3
4
  require 'active_support/core_ext/string/inflections'
@@ -6,6 +7,7 @@ require "marklogic/consts"
6
7
  require 'marklogic/queries'
7
8
  require 'marklogic/exceptions'
8
9
  require 'marklogic/object_id'
10
+ require 'marklogic/multipart_parser'
9
11
 
10
12
  module MarkLogic
11
13
  autoload :Application, 'marklogic/application'
@@ -26,6 +26,31 @@ module MarkLogic
26
26
  }
27
27
  end
28
28
 
29
+ def self.load(server_name, group_name = "Default")
30
+ app_server = AppServer.new(server_name, 0, 'http', group_name)
31
+ app_server.load
32
+ app_server
33
+ end
34
+
35
+ def load
36
+ resp = manage_connection.get(%Q{/manage/v2/servers/#{server_name}/properties?group-id=#{group_name}&format=json})
37
+ if resp.code.to_i == 200
38
+ options = Oj.load(resp.body)
39
+ options.each do |key, value|
40
+ self[key] = value
41
+ end
42
+ end
43
+ end
44
+
45
+ def inspect
46
+ as_nice_string = [
47
+ "server_name: #{server_name}",
48
+ "server_type: #{server_type}",
49
+ "port: #{self['port']}"
50
+ ].join(",")
51
+ "#<#{self.class}#{as_nice_string}>"
52
+ end
53
+
29
54
  def []=(key, value)
30
55
  @options[key] = value
31
56
  end
@@ -2,7 +2,7 @@ module MarkLogic
2
2
  class Application
3
3
  include MarkLogic::Persistence
4
4
 
5
- attr_accessor :app_name
5
+ attr_accessor :app_name, :port
6
6
 
7
7
  def initialize(app_name, options = {})
8
8
  @app_name = app_name
@@ -157,10 +157,16 @@ module MarkLogic
157
157
  end
158
158
  end
159
159
 
160
+ def modules_databases
161
+ app_servers.values.map do |app_server|
162
+ databases[app_server['modules-database']]
163
+ end
164
+ end
165
+
160
166
  def database(name)
161
- database = MarkLogic::Database.new(name)
167
+ database = MarkLogic::Database.new(name, self.connection)
162
168
  yield(database) if block_given?
163
- logger.info("#{__LINE__}: db_name: #{name}")
169
+ database.application = self
164
170
  databases[name] = database
165
171
  end
166
172
 
@@ -170,8 +176,73 @@ module MarkLogic
170
176
  app_servers[name] = app_server
171
177
  end
172
178
 
179
+ def inspect
180
+ as_nice_string = [
181
+ " app_name: #{app_name.inspect}",
182
+ " port: #{port.inspect}",
183
+ " app_servers: #{app_servers.values.each { |app_server| app_server.inspect }}"
184
+ ].join(",")
185
+ "#<#{self.class}#{as_nice_string}>"
186
+ end
187
+
188
+ def self.load(app_name, options = {})
189
+ app = Application.new(app_name, options)
190
+ app.load
191
+ app
192
+ end
193
+
194
+ def load
195
+ app_servers[app_name] = MarkLogic::AppServer.load(app_name)
196
+ @port = app_servers[app_name]['port']
197
+ load_databases
198
+ build_indexes
199
+ end
200
+
173
201
  private
174
202
 
203
+ def load_database(db_name)
204
+ db = MarkLogic::Database.load(db_name, self.connection)
205
+ db.application = self
206
+ databases[db_name] = db
207
+
208
+ db['forest'].each do |forest_name|
209
+ forests[forest_name] = MarkLogic::Forest.load(forest_name, nil, self.connection) unless forests.has_key?(forest_name)
210
+ forests[forest_name].database = db
211
+ end
212
+ end
213
+
214
+ def load_databases
215
+ app_servers.each_value do |app_server|
216
+ db_name = app_server['content-database']
217
+ load_database(db_name) unless databases.has_key?(db_name)
218
+
219
+ modules_db_name = app_server['modules-database']
220
+ load_database(modules_db_name) unless databases.has_key?(modules_db_name)
221
+ end
222
+
223
+ triggers_database = nil
224
+ schema_database = nil
225
+ databases.each_value do |database|
226
+ if database.has_key?('triggers-database')
227
+ triggers_database = database['triggers-database']
228
+ end
229
+
230
+ if database.has_key?('schema-database')
231
+ schema_database = database['schema-database']
232
+ end
233
+ end
234
+
235
+ if triggers_database && !databases.has_key?(triggers_database)
236
+ load_database(triggers_database)
237
+ # databases[triggers_database] = MarkLogic::Database.new(triggers_database, self.connection)
238
+ end
239
+
240
+ if schema_database && !databases.has_key?(schema_database)
241
+ load_database(schema_database)
242
+ # databases[schema_database] = MarkLogic::Database.new(schema_database, self.connection)
243
+ end
244
+ end
245
+
175
246
  def indexes
176
247
  @indexes ||= {}
177
248
  end
@@ -213,7 +284,6 @@ module MarkLogic
213
284
  schema_database = nil
214
285
  databases.each_value do |database|
215
286
  if database.has_key?('triggers-database')
216
- logger.info "has triggers: [#{database['triggers-database']}]"
217
287
  triggers_database = database['triggers-database']
218
288
  end
219
289
 
@@ -222,11 +292,11 @@ module MarkLogic
222
292
  end
223
293
  end
224
294
 
225
- if triggers_database and !databases.has_key?(triggers_database)
295
+ if triggers_database && !databases.has_key?(triggers_database)
226
296
  databases[triggers_database] = MarkLogic::Database.new(triggers_database, self.connection)
227
297
  end
228
298
 
229
- if schema_database and !databases.has_key?(schema_database)
299
+ if schema_database && !databases.has_key?(schema_database)
230
300
  databases[schema_database] = MarkLogic::Database.new(schema_database, self.connection)
231
301
  end
232
302
  end
@@ -21,7 +21,7 @@ module MarkLogic
21
21
  url = "/v1/documents?uri=#{gen_uri(id)}&format=json"
22
22
  response = @database.connection.get(url)
23
23
  raise Exception.new("Invalid response: #{response.code.to_i}, #{response.body}") unless response.code.to_i == 200
24
- JSON.parse(response.body)
24
+ Oj.load(response.body)
25
25
  end
26
26
 
27
27
  def save(doc)
@@ -217,6 +217,18 @@ module MarkLogic
217
217
  end
218
218
  end
219
219
 
220
+ def to_s
221
+ %Q{collection: #{collection}}
222
+ end
223
+
224
+ def inspect
225
+ as_nice_string = [
226
+ " collection: #{collection.inspect}",
227
+ " database: #{database.database_name.inspect}"
228
+ ].join(",")
229
+ "#<#{self.class}#{as_nice_string}>"
230
+ end
231
+
220
232
  private
221
233
 
222
234
  def doc_uri(doc)
@@ -2,6 +2,7 @@ require 'net/http'
2
2
  require 'date'
3
3
  require 'json'
4
4
  require 'digest'
5
+ require 'net/http/persistent'
5
6
 
6
7
  module Net
7
8
  module HTTPHeader
@@ -54,6 +55,11 @@ module Net
54
55
 
55
56
  @header['Authorization'] = ["Basic #{encoded}"]
56
57
  end
58
+
59
+ # diable header capitalization for a performance gain
60
+ def capitalize(name)
61
+ name
62
+ end
57
63
  end
58
64
  end
59
65
 
@@ -61,6 +67,14 @@ module MarkLogic
61
67
  class Connection
62
68
  include MarkLogic::Loggable
63
69
 
70
+ NEWLINE_SPLITTER = Regexp.new("\r\n", Regexp::MULTILINE)
71
+ DOUBLE_NEWLINE_SPLITTER = Regexp.new("\r\n\r\n", Regexp::MULTILINE)
72
+ START_BOUNDARY_REGEX = Regexp.new("^[\r\n]+--[^-].+?[\r\n]+", Regexp::MULTILINE)
73
+ END_BOUNDARY_REGEX = Regexp.new("[\r\n]+--[^-]+--[\r\n]+$", Regexp::MULTILINE)
74
+ BOUNDARY_SPLITTER_REGEX = Regexp.new(%Q{[\r\n]+--[^-]+[\r\n]+}, Regexp::MULTILINE)
75
+ CONTENT_TYPE_REGEX = /Content-Type:\s+(.*)$/
76
+ PRIMITIVE_REGEX = /X-Primitive:\s+(.*)$/
77
+
64
78
  attr_accessor :admin, :manage, :app_services, :username, :password, :host, :port, :request_retries
65
79
 
66
80
  def self.configure(options = {})
@@ -118,15 +132,19 @@ module MarkLogic
118
132
  @username = username || self.class.default_user
119
133
  @password = password || self.class.default_password
120
134
  @request_retries = options[:request_retries] || 3
121
- @http = Net::HTTP.new(host, port)
135
+ @http = Net::HTTP::Persistent.new 'marklogic'
122
136
  end
123
137
 
124
138
  def run_query(query, type = "javascript", options = {})
125
- params = {
126
- type.to_sym => query
139
+ # manually building the params yielded a performance improvement
140
+ params = %Q{#{type}=#{URI.encode_www_form_component(query)}}
141
+ params += %Q{&dbname=#{options[:db]}} if options[:db]
142
+
143
+ headers = {
144
+ 'content-type' => 'application/x-www-form-urlencoded'
127
145
  }
128
- params[:dbname] = options[:db] if options[:db]
129
- response = post('/eval', params)
146
+ response = request('/eval', 'post', headers, params)
147
+
130
148
  # :xquery => options[:query],
131
149
  # :locale => LOCALE,
132
150
  # :tzoffset => "-18000",
@@ -164,14 +182,14 @@ module MarkLogic
164
182
  end
165
183
 
166
184
  def wait_for_restart(body)
167
- json = JSON.parse(body)
185
+ json = Oj.load(body)
168
186
  ts_value = json["restart"]["last-startup"][0]["value"]
169
187
  timestamp = DateTime.iso8601(ts_value).to_time
170
188
  new_timestamp = timestamp
171
189
 
172
190
  code = nil
173
191
  logger.debug "Waiting for restart"
174
- until code == 200 and new_timestamp > timestamp
192
+ until code == 200 && new_timestamp > timestamp
175
193
  begin
176
194
  rr = get(%Q{/admin/v1/timestamp})
177
195
  code = rr.code.to_i
@@ -202,65 +220,61 @@ module MarkLogic
202
220
  end
203
221
 
204
222
  def split_multipart(response)
205
- if response.read_body
206
- body = response.body
223
+ body = response.body
207
224
 
208
- if body.length == 0
209
- response.body = nil
210
- return
211
- end
225
+ if body.nil? || body.length == 0
226
+ response.body = nil
227
+ return
228
+ end
229
+
230
+ content_type = response['Content-Type']
231
+ if (content_type && content_type.match(/multipart\/mixed.*/))
232
+ boundary = $1 if content_type =~ /^.*boundary=(.*)$/
212
233
 
213
- content_type = response['Content-Type']
214
- if (content_type and content_type.match(/multipart\/mixed.*/))
215
- boundary = $1 if content_type =~ /^.*boundary=(.*)$/
216
-
217
- body.sub!(Regexp.new("[\r\n]+--#{boundary}--[\r\n]+$", Regexp::MULTILINE), "")
218
- body.sub!(Regexp.new("^[\r\n]+--#{boundary}.+?[\r\n]+", Regexp::MULTILINE), "")
219
-
220
- values = []
221
- body.split(Regexp.new(%Q{[\r\n]+--#{boundary}[\r\n]+}, Regexp::MULTILINE)).each do |item|
222
- splits = item.split(/\r\n\r\n/m)
223
- metas = splits[0]
224
- raw_value = splits[1]
225
-
226
- value_content_type = type = xpath = nil
227
-
228
- metas.split(/\r\n/m).each do |meta|
229
- if meta.match(/^Content-Type:.*/m)
230
- value_content_type = $1 if meta =~ /Content-Type:\s+(.*)$/
231
- elsif meta.match(/^X-Primitive:.*/)
232
- type = $1 if meta =~ /X-Primitive:\s+(.*)$/
233
- elsif meta.match(/^X-Path:.*/)
234
- xpath = $1 if meta =~ /X-Path:\s+(.*)$/
235
- end
234
+ body.sub!(END_BOUNDARY_REGEX, "")
235
+ body.sub!(START_BOUNDARY_REGEX, "")
236
+
237
+ values = []
238
+ body.split(BOUNDARY_SPLITTER_REGEX).each do |item|
239
+ splits = item.split(DOUBLE_NEWLINE_SPLITTER)
240
+ metas = splits[0]
241
+ raw_value = splits[1]
242
+
243
+ value_content_type = type = nil
244
+
245
+ metas.split(NEWLINE_SPLITTER).each do |meta|
246
+ if meta =~ CONTENT_TYPE_REGEX
247
+ value_content_type = $1
248
+ elsif meta =~ PRIMITIVE_REGEX
249
+ type = $1
236
250
  end
251
+ end
237
252
 
238
- if (value_content_type == "application/json") then
239
- value = JSON.parse(raw_value)
253
+ if (value_content_type == "application/json") then
254
+ value = Oj.load(raw_value)
255
+ else
256
+ case type
257
+ when "integer"
258
+ value = raw_value.to_i
259
+ when "boolean"
260
+ value = raw_value == "true"
261
+ when "decimal"
262
+ value = raw_value.to_f
240
263
  else
241
- case type
242
- when "integer"
243
- value = raw_value.to_i
244
- when "boolean"
245
- value = raw_value == "true"
246
- when "decimal"
247
- value = raw_value.to_f
248
- else
249
- value = raw_value
250
- end
264
+ value = raw_value
251
265
  end
252
- values.push(value)
253
266
  end
267
+ values.push(value)
268
+ end
254
269
 
255
- if (values.length == 1)
256
- values = values[0]
257
- end
258
- output = values
259
- else
260
- output = body
270
+ if (values.length == 1)
271
+ values = values[0]
261
272
  end
262
- response.body = output
273
+ output = values
274
+ else
275
+ output = body
263
276
  end
277
+ response.body = output
264
278
  end
265
279
 
266
280
  def request(url, verb = 'get', headers = {}, body = nil, params = nil)
@@ -281,12 +295,20 @@ module MarkLogic
281
295
  request.digest_auth(@username, @password, @auth)
282
296
  end
283
297
 
284
- request.set_form_data(params) if (params)
285
- request.body = body if (body)
298
+ if params
299
+ # query = URI.encode_www_form(params)
300
+ # query.gsub!(/&/, sep) if sep != '&'
301
+ # self.body = query
302
+ # request['content-type'] = 'application/x-www-form-urlencoded'
303
+ request.set_form_data(params) if (params)
304
+ elsif body
305
+ request.body = body if (body)
306
+ end
286
307
 
287
- response = @http.request request
308
+ full_url = URI("http://#{@host}:#{@port}#{url}")
309
+ response = @http.request full_url, request
288
310
 
289
- if (response.code.to_i == 401 and @username and @password)
311
+ if (response.code.to_i == 401 && @username && @password)
290
312
  auth_method = $1.downcase if response['www-authenticate'] =~ /^(\w+) (.*)/
291
313
  if (auth_method == "basic")
292
314
  request.basic_auth(@username, @password)
@@ -294,7 +316,7 @@ module MarkLogic
294
316
  @auth = request.create_digest_auth(@username, @password, response)
295
317
  end
296
318
 
297
- response = @http.request request
319
+ response = @http.request full_url, request
298
320
  end
299
321
 
300
322
  # puts("#{response.code} : #{verb.upcase} => ://#{@host}:#{@port}#{url} :: #{body} #{params}")
@@ -155,7 +155,7 @@ module MarkLogic
155
155
  end
156
156
 
157
157
  def has_sort?
158
- @options.has_key?(:sort) or @options.has_key?(:order)
158
+ @options.has_key?(:sort) || @options.has_key?(:order)
159
159
  end
160
160
 
161
161
  def query
@@ -170,7 +170,7 @@ module MarkLogic
170
170
 
171
171
  sorters.map do |sorter|
172
172
  name = sorter[0].to_s
173
- direction = (sorter[1] and (sorter[1] == -1)) ? "descending" : "ascending"
173
+ direction = (sorter[1] && (sorter[1] == -1)) ? "descending" : "ascending"
174
174
 
175
175
 
176
176
  if @collection.database.has_range_index?(name)
@@ -197,7 +197,7 @@ module MarkLogic
197
197
 
198
198
  sorters.map do |sorter|
199
199
  name = sorter[0].to_s
200
- direction = (sorter[1] and (sorter[1] == -1)) ? "descending" : "ascending"
200
+ direction = (sorter[1] && (sorter[1] == -1)) ? "descending" : "ascending"
201
201
 
202
202
  unless @collection.database.has_range_index?(name)
203
203
  raise MissingIndexError.new("Missing index on #{name}")
@@ -31,6 +31,29 @@ module MarkLogic
31
31
  reset_indexes
32
32
  end
33
33
 
34
+ def self.load(database_name, conn = nil)
35
+ db = Database.new(database_name, conn)
36
+ db.load
37
+ db
38
+ end
39
+
40
+ def load
41
+ resp = manage_connection.get(%Q{/manage/v2/databases/#{database_name}/properties?format=json})
42
+ if resp.code.to_i == 200
43
+ options = Oj.load(resp.body)
44
+ options.each do |key, value|
45
+ self[key] = value
46
+ end
47
+ end
48
+ end
49
+
50
+ def inspect
51
+ as_nice_string = @options.collect do |key, value|
52
+ " #{key}: #{value.inspect}"
53
+ end.sort.join(",")
54
+ "#<#{self.class}#{as_nice_string}>"
55
+ end
56
+
34
57
  def []=(key, value)
35
58
  @options[key] = value
36
59
  end
@@ -121,7 +144,7 @@ module MarkLogic
121
144
  response = manage_connection.get(%Q{/manage/v2/databases/#{database_name}/properties?format=json})
122
145
  raise Exception.new("Invalid response: #{response.code.to_i}: #{response.body}") if (response.code.to_i != 200)
123
146
 
124
- props = JSON.parse(response.body)
147
+ props = Oj.load(response.body)
125
148
 
126
149
  INDEX_KEYS.each do |key|
127
150
  if props[key]
@@ -131,7 +154,7 @@ module MarkLogic
131
154
  logger.debug "#{database_name}: #{local} != #{remote}"
132
155
  return true
133
156
  end
134
- elsif @options.has_key?(key) and @options[key] != []
157
+ elsif @options.has_key?(key) && @options[key] != []
135
158
  logger.debug "#{database_name}: #{key} is not on the remote end"
136
159
  return true
137
160
  end
@@ -199,7 +222,12 @@ module MarkLogic
199
222
  end
200
223
 
201
224
  def collections()
202
- return connection.run_query('cts:collections()', "xquery").body || []
225
+ res = connection.run_query('cts:collections()', "xquery")
226
+ if res.code.to_i == 200
227
+ return res.body || []
228
+ else
229
+ raise MissingCollectionLexiconError.new if res.body =~ /XDMP-COLLXCNNOTFOUND/
230
+ end
203
231
  end
204
232
  end
205
233
  end
@@ -2,4 +2,5 @@
2
2
  module MarkLogic
3
3
  class MissingIndexError < StandardError; end
4
4
  class SearchError < StandardError; end
5
+ class MissingCollectionLexiconError < StandardError; end
5
6
  end
@@ -13,6 +13,22 @@ module MarkLogic
13
13
  }
14
14
  end
15
15
 
16
+ def self.load(forest_name, host_name = nil, conn = nil)
17
+ db = Forest.new(forest_name, host_name, conn)
18
+ db.load
19
+ db
20
+ end
21
+
22
+ def load
23
+ resp = manage_connection.get(%Q{/manage/v2/forests/#{forest_name}/properties?format=json})
24
+ if resp.code.to_i == 200
25
+ options = Oj.load(resp.body)
26
+ options.each do |key, value|
27
+ self[key] = value
28
+ end
29
+ end
30
+ end
31
+
16
32
  def []=(key, value)
17
33
  @options[key] = value
18
34
  end
@@ -1,6 +1,25 @@
1
1
  module MarkLogic
2
2
  module Persistence
3
3
  include MarkLogic::Loggable
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ def manage_connection=(manage_conn)
8
+ @@manage_connection = manage_conn if manage_conn
9
+ end
10
+
11
+ def manage_connection
12
+ @@manage_connection ||= MarkLogic::Connection.manage_connection
13
+ end
14
+
15
+ def admin_connection=(admin_conn)
16
+ @@admin_connection = admin_conn if admin_conn
17
+ end
18
+
19
+ def admin_connection
20
+ @@admin_connection ||= MarkLogic::Connection.admin_connection
21
+ end
22
+ end
4
23
 
5
24
  def connection=(conn)
6
25
  @connection = conn if conn
@@ -1,3 +1,3 @@
1
1
  module Marklogic
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
data/marklogic.gemspec CHANGED
@@ -19,5 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
  spec.has_rdoc = 'yard'
21
21
 
22
+ spec.add_runtime_dependency 'net-http-persistent', '~> 2.9', '>= 2.9.4'
23
+ spec.add_runtime_dependency 'oj', '~> 2.12', '>= 2.12.2'
22
24
  spec.add_runtime_dependency 'activesupport', '~> 4.2', '>= 4.2.0'
23
25
  end
@@ -18,4 +18,14 @@ describe MarkLogic::AppServer do
18
18
  end
19
19
 
20
20
  end
21
+
22
+ describe "load" do
23
+ it "should load an existing config from the server" do
24
+ app = MarkLogic::AppServer.load('App-Services')
25
+ expect(app['server-name']).to eq('App-Services')
26
+ expect(app['content-database']).to eq('Documents')
27
+ expect(app['modules-database']).to eq('Modules')
28
+ expect(app['port']).to eq(8000)
29
+ end
30
+ end
21
31
  end
@@ -102,4 +102,18 @@ describe MarkLogic::Application do
102
102
  expect(@a).to be_stale
103
103
  end
104
104
  end
105
+
106
+ describe "load" do
107
+ it "should load from existing config" do
108
+ app = MarkLogic::Application.load('App-Services', connection: CONNECTION)
109
+ expect(app.port).to eq(8000)
110
+ expect(app.app_servers.count).to eq(1)
111
+ expect(app.app_servers['App-Services'].server_name).to eq('App-Services')
112
+ expect(app.content_databases.count).to eq(1)
113
+ expect(app.content_databases.first.database_name).to eq('Documents')
114
+ expect(app.content_databases.first['forest']).to eq(['Documents'])
115
+ expect(app.modules_databases.count).to eq(1)
116
+ expect(app.modules_databases.first.database_name).to eq('Modules')
117
+ end
118
+ end
105
119
  end
@@ -104,6 +104,14 @@ describe MarkLogic::Connection do
104
104
  it "should split properly when a crazy object is returned" do
105
105
  expect(@b.run_query(%Q{x = { stuff: [1, 2, 3], junk: false}; x}).body).to eq({"stuff" => [1, 2, 3], "junk" => false})
106
106
  end
107
+
108
+ it "should handle url unencoded stuff" do
109
+ expect(@b.run_query(%Q{
110
+ let $x := "Hi &amp; stuff"
111
+ return
112
+ $x
113
+ }, 'xquery').body).to eq("Hi & stuff")
114
+ end
107
115
  end
108
116
 
109
117
  describe "#digest" do
metadata CHANGED
@@ -1,15 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marklogic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paxton Hare
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-14 00:00:00.000000000 Z
11
+ date: 2015-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-http-persistent
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.9'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.9.4
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.9'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.9.4
33
+ - !ruby/object:Gem::Dependency
34
+ name: oj
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.12'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.12.2
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.12'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.12.2
13
53
  - !ruby/object:Gem::Dependency
14
54
  name: activesupport
15
55
  requirement: !ruby/object:Gem::Requirement
@@ -145,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
185
  version: '0'
146
186
  requirements: []
147
187
  rubyforge_project:
148
- rubygems_version: 2.4.5
188
+ rubygems_version: 2.4.6
149
189
  signing_key:
150
190
  specification_version: 4
151
191
  summary: A Ruby Driver for MarkLogic