wgit 0.10.2 → 0.10.5

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
  SHA256:
3
- metadata.gz: c712169a7a2cf41bebb38b2c798aa883c9f685e4d3671929ab7a3ead55da0134
4
- data.tar.gz: 0fb789510761c01f3d0459415b653f4eb896d194e31c610300ef94141dfab63a
3
+ metadata.gz: a359a5011cce717a84c0fa353cba658a4abcd11d2e8575da701b39eef35f641c
4
+ data.tar.gz: 730b2eee3c88d9cd99c1d9754744aa4bae71bc10019113e840f2914b3a7909e5
5
5
  SHA512:
6
- metadata.gz: e175d2d23877fbb5aefc89aca1f98c31d9fee0ba78ec810bb3cc2260fdd97208c35ba9840b8cdc92ea49bdd8f6fd198910443fd61efdd563767048206f5a9788
7
- data.tar.gz: 7dad82e66a10228ba0bce8e7d4cf8d17bdab734f90315813854c0c7e17807fa4c7f500711290a3e5eb28c431bab1c22ba4d25d7b585c1516c8f5470636bf37b4
6
+ metadata.gz: 4807d488cf03aa3dcf624249bd5169871bc17dd7e2de273cb841801147c040843912edc225a1f7346e427c022ecb2ce5360581323509221560ee99b31ea6a72b
7
+ data.tar.gz: ea3f1237116d05bbb24b2e85fdba1b6447821377a07ff5c5e6afea859afa5fb36d4e2c3f708c6f5dc201e0802aa61f0eaa56e63a62882330b5225dbbaa08721d
data/CHANGELOG.md CHANGED
@@ -9,6 +9,33 @@
9
9
  - ...
10
10
  ---
11
11
 
12
+ ## v0.10.5
13
+ ### Added
14
+ - `Database#last_result` getter method to return the most recent raw mongo result.
15
+ ### Changed/Removed
16
+ - ...
17
+ ### Fixed
18
+ - ...
19
+ ---
20
+
21
+ ## v0.10.4
22
+ ### Added
23
+ - `Database#search_text` method which returns a Hash of `url => text_results` instead of `Wgit::Documents` (like `#search`).
24
+ ### Changed/Removed
25
+ - ...
26
+ ### Fixed
27
+ - ...
28
+ ---
29
+
30
+ ## v0.10.3
31
+ ### Added
32
+ - ...
33
+ ### Changed/Removed
34
+ - Changed `Database#create_collections` and `#create_unique_indexes` by removing `rescue nil` from their database operations. Now any underlying errors with the database client are not masked.
35
+ ### Fixed
36
+ - ...
37
+ ---
38
+
12
39
  ## v0.10.2
13
40
  ### Added
14
41
  - `Wgit::Base#setup` and `#teardown` methods (lifecycle hooks) that can be overridden by subclasses.
@@ -45,6 +45,9 @@ module Wgit
45
45
  # A custom setter method is also provided for changing the search logic.
46
46
  attr_reader :text_index
47
47
 
48
+ # The raw MongoDB result of the most recent operation.
49
+ attr_reader :last_result
50
+
48
51
  # Initializes a connected database client using the provided
49
52
  # connection_string or ENV['WGIT_CONNECTION_STRING'].
50
53
  #
@@ -91,29 +94,27 @@ module Wgit
91
94
 
92
95
  ### DDL ###
93
96
 
94
- # Creates the urls and documents collections if they don't already exist.
95
- # This method is therefore idempotent.
97
+ # Creates the 'urls' and 'documents' collections.
96
98
  #
97
99
  # @return [nil] Always returns nil.
98
100
  def create_collections
99
- db.client[URLS_COLLECTION].create rescue nil
100
- db.client[DOCUMENTS_COLLECTION].create rescue nil
101
+ @client[URLS_COLLECTION].create
102
+ @client[DOCUMENTS_COLLECTION].create
101
103
 
102
104
  nil
103
105
  end
104
106
 
105
- # Creates the urls and documents unique 'url' indexes if they don't already
106
- # exist. This method is therefore idempotent.
107
+ # Creates the urls and documents unique 'url' indexes.
107
108
  #
108
109
  # @return [nil] Always returns nil.
109
110
  def create_unique_indexes
110
111
  @client[URLS_COLLECTION].indexes.create_one(
111
112
  { url: 1 }, name: UNIQUE_INDEX, unique: true
112
- ) rescue nil
113
+ )
113
114
 
114
115
  @client[DOCUMENTS_COLLECTION].indexes.create_one(
115
116
  { 'url.url' => 1 }, name: UNIQUE_INDEX, unique: true
116
- ) rescue nil
117
+ )
117
118
 
118
119
  nil
119
120
  end
@@ -187,6 +188,8 @@ module Wgit
187
188
  result = @client[collection].replace_one(query, data_hash, upsert: true)
188
189
 
189
190
  result.matched_count.zero?
191
+ ensure
192
+ @last_result = result
190
193
  end
191
194
 
192
195
  ### Retrieve Data ###
@@ -296,16 +299,12 @@ module Wgit
296
299
  results = retrieve(DOCUMENTS_COLLECTION, query,
297
300
  sort: sort_proj, projection: sort_proj,
298
301
  limit: limit, skip: skip)
299
- return [] if results.count < 1 # respond_to? :empty? == false
300
302
 
301
- # results.respond_to? :map! is false so we use map and overwrite the var.
302
- results = results.map do |mongo_doc|
303
+ results.map do |mongo_doc|
303
304
  doc = Wgit::Document.new(mongo_doc)
304
305
  yield(doc) if block_given?
305
306
  doc
306
307
  end
307
-
308
- results
309
308
  end
310
309
 
311
310
  # Searches the database's Documents for the given query and then searches
@@ -350,6 +349,58 @@ module Wgit
350
349
  results
351
350
  end
352
351
 
352
+ # Searches the database's Documents for the given query and then searches
353
+ # each result in turn using `doc.search`. Instead of an Array of Documents,
354
+ # this method returns a Hash of the docs url => search_results creating a
355
+ # search engine like result set for quick access to text matches.
356
+ #
357
+ # @param query [String] The text query to search with.
358
+ # @param case_sensitive [Boolean] Whether character case must match.
359
+ # @param whole_sentence [Boolean] Whether multiple words should be searched
360
+ # for separately.
361
+ # @param limit [Integer] The max number of results to return.
362
+ # @param skip [Integer] The number of results to skip.
363
+ # @param sentence_limit [Integer] The max length of each search result
364
+ # sentence.
365
+ # @param top_result_only [Boolean] Whether to return all of the documents
366
+ # search results or just the top (most relavent) result.
367
+ # @yield [doc] Given each search result (Wgit::Document) returned from the
368
+ # DB.
369
+ # @return [Hash<String, String | Array<String>>] The search results obtained
370
+ # from the DB having mapped the docs url => search_results. The format of
371
+ # search_results depends on the value of `top_result_only`.
372
+ def search_text(
373
+ query, case_sensitive: false, whole_sentence: true,
374
+ limit: 10, skip: 0, sentence_limit: 80, top_result_only: false
375
+ )
376
+ results = search(
377
+ query,
378
+ case_sensitive: case_sensitive,
379
+ whole_sentence: whole_sentence,
380
+ limit: limit,
381
+ skip: skip
382
+ )
383
+
384
+ results
385
+ .map do |doc|
386
+ yield(doc) if block_given?
387
+
388
+ results = doc.search(
389
+ query,
390
+ case_sensitive: case_sensitive,
391
+ whole_sentence: whole_sentence,
392
+ sentence_limit: sentence_limit
393
+ )
394
+
395
+ # Only return result if its text has a match - compact is called below.
396
+ next nil if results.empty?
397
+
398
+ [doc.url, (top_result_only ? results.first : results)]
399
+ end
400
+ .compact
401
+ .to_h
402
+ end
403
+
353
404
  # Returns statistics about the database.
354
405
  #
355
406
  # @return [BSON::Document#[]#fetch] Similar to a Hash instance.
@@ -456,21 +507,30 @@ module Wgit
456
507
  # 0 or 1 because urls are unique.
457
508
  def delete(obj)
458
509
  collection, query = get_type_info(obj)
459
- @client[collection].delete_one(query).n
510
+ result = @client[collection].delete_one(query)
511
+ result.n
512
+ ensure
513
+ @last_result = result
460
514
  end
461
515
 
462
516
  # Deletes everything in the urls collection.
463
517
  #
464
518
  # @return [Integer] The number of deleted records.
465
519
  def clear_urls
466
- @client[URLS_COLLECTION].delete_many({}).n
520
+ result = @client[URLS_COLLECTION].delete_many({})
521
+ result.n
522
+ ensure
523
+ @last_result = result
467
524
  end
468
525
 
469
526
  # Deletes everything in the documents collection.
470
527
  #
471
528
  # @return [Integer] The number of deleted records.
472
529
  def clear_docs
473
- @client[DOCUMENTS_COLLECTION].delete_many({}).n
530
+ result = @client[DOCUMENTS_COLLECTION].delete_many({})
531
+ result.n
532
+ ensure
533
+ @last_result = result
474
534
  end
475
535
 
476
536
  # Deletes everything in the urls and documents collections. This will nuke
@@ -538,6 +598,8 @@ module Wgit
538
598
  else
539
599
  raise 'data must be a Hash or an Array of Hashes'
540
600
  end
601
+ ensure
602
+ @last_result = result
541
603
  end
542
604
 
543
605
  # Return if the write to the DB succeeded or not.
@@ -574,8 +636,8 @@ module Wgit
574
636
  sort: {}, projection: {},
575
637
  limit: 0, skip: 0)
576
638
  assert_type(query, Hash)
577
- @client[collection.to_sym].find(query).projection(projection)
578
- .skip(skip).limit(limit).sort(sort)
639
+ @last_result = @client[collection.to_sym].find(query).projection(projection)
640
+ .skip(skip).limit(limit).sort(sort)
579
641
  end
580
642
 
581
643
  # Mutate/update one or more Url or Document records in the DB.
@@ -595,6 +657,8 @@ module Wgit
595
657
  raise 'DB write(s) (update) failed' unless write_succeeded?(result)
596
658
 
597
659
  result.n
660
+ ensure
661
+ @last_result = result
598
662
  end
599
663
 
600
664
  alias num_objects num_records
data/lib/wgit/document.rb CHANGED
@@ -453,7 +453,7 @@ be relative"
453
453
 
454
454
  if query.is_a?(Regexp)
455
455
  regex = query
456
- else # respond_to? #to_s == true
456
+ else # query.respond_to? :to_s == true
457
457
  query = query.to_s
458
458
  query = query.gsub(' ', '|') unless whole_sentence
459
459
  regex = Regexp.new(query, !case_sensitive)
data/lib/wgit/version.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  # @author Michael Telford
7
7
  module Wgit
8
8
  # The current gem version of Wgit.
9
- VERSION = '0.10.2'
9
+ VERSION = '0.10.5'
10
10
 
11
11
  # Returns the current gem version of Wgit as a String.
12
12
  def self.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wgit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Telford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-22 00:00:00.000000000 Z
11
+ date: 2022-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable