uri_service 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a34c4dd9a5b43b9111f59c0577fd2046bb2f00b9
4
- data.tar.gz: 94d3fc905ad56a6aaabb9b0bcad622343877ebfe
3
+ metadata.gz: 5d86291e7f55d8b02a1bda38a3ce2442c57369ed
4
+ data.tar.gz: 1646c0c6ac51556df8823c9c23db7e1a64682692
5
5
  SHA512:
6
- metadata.gz: 5566e17cb45ae010a502a9afbcd06325c9b56fe7acde4114861847b64b2f9dd91164ac93e8b6144081f17d21289f2442552b8553e9b342416be30c5b7669113f
7
- data.tar.gz: 2b3ebc888583e86f6ee879b03416524c7cf7b10fde9dc184dd501238035b3a0ce95a40a51c2316ba09bd25007f8f9eff0d74549688fcae05c22eceff33ca8c18
6
+ metadata.gz: 7b9a6958a9f48b28a238d79d66ac490e24317d1ffffaa4bfa8d5a29d6fc075b75bcae0c6ff8d6963f61937f499288b69543adfc59d7b2539ee644c254cf90cf6
7
+ data.tar.gz: 3c50a6fd5cdf0d0f16092a8fd5be1e83a2af3a8d689cb9b580a339067374e1fc0dbcbe23836cfc7130d71e0b745d9cfa5d1cf170851aac951df09f247b352988
@@ -92,22 +92,23 @@ class UriService::Client
92
92
  ##################
93
93
 
94
94
  def create_vocabulary(string_key, display_label)
95
- if string_key.to_s == 'all'
96
- # Note: There isn't currently a use case for searching across 'all' vocabularies, but I'm leaving this restriction as a placeholder in case that changes.
97
- raise UriService::InvalidVocabularyStringKeyError, 'The value "all" is a reserved word and cannot be used as the string_key value for a vocabulary.'
98
- end
99
- unless string_key =~ ALPHANUMERIC_UNDERSCORE_KEY_REGEX
100
- raise UriService::InvalidVocabularyStringKeyError, "Invalid key (can only include lower case letters, numbers or underscores, but cannot start with an underscore): " + string_key
101
- end
102
-
103
- @db.transaction do
104
- begin
105
- @db[UriService::VOCABULARIES].insert(string_key: string_key, display_label: display_label)
106
- rescue Sequel::UniqueConstraintViolation
107
- raise UriService::ExistingVocabularyStringKeyError, "A vocabulary already exists with string key: " + string_key
95
+ self.handle_database_disconnect do
96
+ if string_key.to_s == 'all'
97
+ # Note: There isn't currently a use case for searching across 'all' vocabularies, but I'm leaving this restriction as a placeholder in case that changes.
98
+ raise UriService::InvalidVocabularyStringKeyError, 'The value "all" is a reserved word and cannot be used as the string_key value for a vocabulary.'
99
+ end
100
+ unless string_key =~ ALPHANUMERIC_UNDERSCORE_KEY_REGEX
101
+ raise UriService::InvalidVocabularyStringKeyError, "Invalid key (can only include lower case letters, numbers or underscores, but cannot start with an underscore): " + string_key
102
+ end
103
+
104
+ @db.transaction do
105
+ begin
106
+ @db[UriService::VOCABULARIES].insert(string_key: string_key, display_label: display_label)
107
+ rescue Sequel::UniqueConstraintViolation
108
+ raise UriService::ExistingVocabularyStringKeyError, "A vocabulary already exists with string key: " + string_key
109
+ end
108
110
  end
109
111
  end
110
-
111
112
  end
112
113
 
113
114
  # Creates a new term.
@@ -136,35 +137,37 @@ class UriService::Client
136
137
  end
137
138
 
138
139
  def create_term_impl(vocabulary_string_key, value, term_uri, additional_fields, is_local)
140
+ self.handle_database_disconnect do
139
141
 
140
- additional_fields.stringify_keys!
141
-
142
- #Ensure that vocabulary with vocabulary_string_key exists
143
- if self.find_vocabulary(vocabulary_string_key).nil?
144
- raise UriService::NonExistentVocabularyError, "There is no vocabulary with string key: " + vocabulary_string_key
145
- end
146
- unless term_uri =~ VALID_URI_REGEX
147
- raise UriService::InvalidUriError, "Invalid URI supplied: #{term_uri}, with result #{(VALID_URI_REGEX.match(term_uri)).to_s}"
148
- end
149
- validate_additional_fields(additional_fields) # This method call raises an error if an invalid additional_field key is supplied
150
-
151
- @db.transaction do
152
- begin
153
- @db[UriService::TERMS].insert(
154
- is_local: is_local,
155
- uri: term_uri,
156
- uri_hash: Digest::SHA256.hexdigest(term_uri),
157
- value: value,
158
- vocabulary_string_key: vocabulary_string_key,
159
- additional_fields: JSON.generate(additional_fields)
160
- )
161
- send_term_to_solr(vocabulary_string_key, value, term_uri, additional_fields, is_local)
162
- rescue Sequel::UniqueConstraintViolation
163
- raise UriService::ExistingUriError, "A term already exists with uri: " + term_uri + " (conflict found via uri_hash check)"
142
+ additional_fields.stringify_keys!
143
+
144
+ #Ensure that vocabulary with vocabulary_string_key exists
145
+ if self.find_vocabulary(vocabulary_string_key).nil?
146
+ raise UriService::NonExistentVocabularyError, "There is no vocabulary with string key: " + vocabulary_string_key
147
+ end
148
+ unless term_uri =~ VALID_URI_REGEX
149
+ raise UriService::InvalidUriError, "Invalid URI supplied: #{term_uri}, with result #{(VALID_URI_REGEX.match(term_uri)).to_s}"
164
150
  end
151
+ validate_additional_fields(additional_fields) # This method call raises an error if an invalid additional_field key is supplied
152
+
153
+ @db.transaction do
154
+ begin
155
+ @db[UriService::TERMS].insert(
156
+ is_local: is_local,
157
+ uri: term_uri,
158
+ uri_hash: Digest::SHA256.hexdigest(term_uri),
159
+ value: value,
160
+ vocabulary_string_key: vocabulary_string_key,
161
+ additional_fields: JSON.generate(additional_fields)
162
+ )
163
+ send_term_to_solr(vocabulary_string_key, value, term_uri, additional_fields, is_local)
164
+ rescue Sequel::UniqueConstraintViolation
165
+ raise UriService::ExistingUriError, "A term already exists with uri: " + term_uri + " (conflict found via uri_hash check)"
166
+ end
167
+ end
168
+
169
+ return generate_frozen_term_hash(vocabulary_string_key, value, term_uri, additional_fields, is_local)
165
170
  end
166
-
167
- return generate_frozen_term_hash(vocabulary_string_key, value, term_uri, additional_fields, is_local)
168
171
  end
169
172
 
170
173
  def generate_frozen_term_hash(vocabulary_string_key, value, uri, additional_fields, is_local)
@@ -245,7 +248,9 @@ class UriService::Client
245
248
  ################
246
249
 
247
250
  def find_vocabulary(vocabulary_string_key)
248
- @db[UriService::VOCABULARIES].where(string_key: vocabulary_string_key).first
251
+ self.handle_database_disconnect do
252
+ @db[UriService::VOCABULARIES].where(string_key: vocabulary_string_key).first
253
+ end
249
254
  end
250
255
 
251
256
  def find_term_by_uri(uri)
@@ -310,8 +315,10 @@ class UriService::Client
310
315
 
311
316
  # Lists vocabularies alphabetically (by string key) and supports paging through results.
312
317
  def list_vocabularies(limit=10, start=0)
313
- db_rows = @db[UriService::VOCABULARIES].order(:string_key).limit(limit, start)
314
- return db_rows.map{|row| row.except(:id).stringify_keys!}
318
+ self.handle_database_disconnect do
319
+ db_rows = @db[UriService::VOCABULARIES].order(:string_key).limit(limit, start)
320
+ return db_rows.map{|row| row.except(:id).stringify_keys!}
321
+ end
315
322
  end
316
323
 
317
324
  # Lists terms alphabetically and supports paging through results.
@@ -342,15 +349,19 @@ class UriService::Client
342
349
  ##################
343
350
 
344
351
  def delete_vocabulary(vocabulary_string_key)
345
- @db[UriService::VOCABULARIES].where(string_key: vocabulary_string_key).delete
352
+ self.handle_database_disconnect do
353
+ @db[UriService::VOCABULARIES].where(string_key: vocabulary_string_key).delete
354
+ end
346
355
  end
347
356
 
348
357
  def delete_term(term_uri, commit=true)
349
- @db.transaction do
350
- @db[UriService::TERMS].where(uri: term_uri).delete
351
- @rsolr_pool.with do |rsolr|
352
- rsolr.delete_by_query('uri:' + UriService.solr_escape(term_uri))
353
- rsolr.commit if commit
358
+ self.handle_database_disconnect do
359
+ @db.transaction do
360
+ @db[UriService::TERMS].where(uri: term_uri).delete
361
+ @rsolr_pool.with do |rsolr|
362
+ rsolr.delete_by_query('uri:' + UriService.solr_escape(term_uri))
363
+ rsolr.commit if commit
364
+ end
354
365
  end
355
366
  end
356
367
  end
@@ -360,40 +371,54 @@ class UriService::Client
360
371
  ##################
361
372
 
362
373
  def update_vocabulary(string_key, new_display_label)
363
- dataset = @db[UriService::VOCABULARIES].where(string_key: string_key)
364
- raise UriService::NonExistentVocabularyError, "No vocabulary found with string_key: " + string_key if dataset.count == 0
365
-
366
- @db.transaction do
367
- dataset.update(display_label: new_display_label)
374
+ self.handle_database_disconnect do
375
+ dataset = @db[UriService::VOCABULARIES].where(string_key: string_key)
376
+ raise UriService::NonExistentVocabularyError, "No vocabulary found with string_key: " + string_key if dataset.count == 0
377
+
378
+ @db.transaction do
379
+ dataset.update(display_label: new_display_label)
380
+ end
368
381
  end
369
382
  end
370
383
 
371
384
  # opts format: {:value => 'new value', :additional_fields => {'key' => 'value'}}
372
385
  def update_term(term_uri, opts, merge_additional_fields=true)
373
- dataset = @db[UriService::TERMS].where(uri: term_uri)
374
- raise UriService::NonExistentUriError, "No term found with uri: " + term_uri if dataset.count == 0
386
+ self.handle_database_disconnect do
387
+ dataset = @db[UriService::TERMS].where(uri: term_uri)
388
+ raise UriService::NonExistentUriError, "No term found with uri: " + term_uri if dataset.count == 0
389
+
390
+ term_db_row = dataset.first
375
391
 
376
- term_db_row = dataset.first
377
-
378
- new_value = opts[:value] || term_db_row[:value]
379
- new_additional_fields = term_db_row[:additional_fields].nil? ? {} : JSON.parse(term_db_row[:additional_fields])
380
-
381
- unless opts[:additional_fields].nil?
382
- if merge_additional_fields
383
- new_additional_fields.merge!(opts[:additional_fields])
384
- new_additional_fields.delete_if { |k, v| v.nil? } # Delete nil values. This is a way to clear data in additional_fields.
385
- else
386
- new_additional_fields = opts[:additional_fields]
392
+ new_value = opts[:value] || term_db_row[:value]
393
+ new_additional_fields = term_db_row[:additional_fields].nil? ? {} : JSON.parse(term_db_row[:additional_fields])
394
+
395
+ unless opts[:additional_fields].nil?
396
+ if merge_additional_fields
397
+ new_additional_fields.merge!(opts[:additional_fields])
398
+ new_additional_fields.delete_if { |k, v| v.nil? } # Delete nil values. This is a way to clear data in additional_fields.
399
+ else
400
+ new_additional_fields = opts[:additional_fields]
401
+ end
387
402
  end
403
+ validate_additional_fields(new_additional_fields)
404
+
405
+ @db.transaction do
406
+ dataset.update(value: new_value, additional_fields: JSON.generate(new_additional_fields))
407
+ self.send_term_to_solr(term_db_row[:vocabulary_string_key], new_value, term_uri, new_additional_fields, term_db_row[:is_local])
408
+ end
409
+
410
+ return generate_frozen_term_hash(term_db_row[:vocabulary_string_key], new_value, term_uri, new_additional_fields, term_db_row[:is_local])
388
411
  end
389
- validate_additional_fields(new_additional_fields)
390
-
391
- @db.transaction do
392
- dataset.update(value: new_value, additional_fields: JSON.generate(new_additional_fields))
393
- self.send_term_to_solr(term_db_row[:vocabulary_string_key], new_value, term_uri, new_additional_fields, term_db_row[:is_local])
412
+ end
413
+
414
+ def handle_database_disconnect
415
+ tries ||= 3
416
+ begin
417
+ yield
418
+ rescue Sequel::DatabaseDisconnectError
419
+ tries -= 1
420
+ retry unless tries == 0
394
421
  end
395
-
396
- return generate_frozen_term_hash(term_db_row[:vocabulary_string_key], new_value, term_uri, new_additional_fields, term_db_row[:is_local])
397
422
  end
398
423
 
399
424
  end
@@ -1,6 +1,6 @@
1
1
  module UriService
2
2
 
3
- VERSION = '0.2.2'
3
+ VERSION = '0.2.3'
4
4
 
5
5
  def self.version
6
6
  VERSION
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uri_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric O'Hanlon
@@ -202,3 +202,4 @@ specification_version: 4
202
202
  summary: A service for registering local URIs and performing both local and remote
203
203
  URI lookups.
204
204
  test_files: []
205
+ has_rdoc: