umbrellio-utils 1.3.0 → 1.4.0

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
  SHA256:
3
- metadata.gz: d17fd4116bc29709f96f27f812fdf8f9b5e977a1f0982ec6ca39616c6458e879
4
- data.tar.gz: 64de97d755d6759be25ff38cc07d1680d4501f355982e22003f59520c21c01bb
3
+ metadata.gz: 4ed0221575b9cfc5c5350ea8eed168a30e9804b943c20fc357c8ee36c963d767
4
+ data.tar.gz: 18eb1859efe000d5c5d2bb13b57217a84651f0f824542f49c8093439b49d8141
5
5
  SHA512:
6
- metadata.gz: f32e5a5768428d0a2b7d3a8b0737916947088c35490ea8da10bddad4296683eac86612494cabae0dff9a50b6ec4aeb29dcd2adba7677133079282ae4fea7d7a0
7
- data.tar.gz: 559fba254624cee4c16bb6f078cff3ea7c3b40f64579429d663fb89ff4c90e6afff20ec9f8d76cbb94c134598ab833c09cc5a74d61553cfd45e757145268553d
6
+ metadata.gz: 2e4077e807ee85ebc7e4db39f3f3e94ee5b75e94fde085082aadcd3d5422a0827522f00d37022cbb1bf6df71a051d5a1faaad53468870fa189f3f496e17d5531
7
+ data.tar.gz: cdd6bce77b7ab07d9ebc975c08551c73f0804540ae9fbff1145965118db40ec0a7f0719b25166ea6e4e5bff2bbc2d01a316b20cfd4a9761074fa9e93bd9d7987
data/Gemfile CHANGED
@@ -5,25 +5,24 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in umbrellio_utils.gemspec
6
6
  gemspec
7
7
 
8
- group :development, :test do
9
- gem "activesupport"
10
- gem "bundler"
11
- gem "ci-helper"
12
- gem "http"
13
- gem "nokogiri"
14
- gem "nori"
15
- gem "pg"
16
- gem "pry"
17
- gem "rake"
18
- gem "rspec"
19
- gem "rspec-json_matcher"
20
- gem "rubocop-config-umbrellio"
21
- gem "semantic_logger"
22
- gem "sequel"
23
- gem "sequel-batches"
24
- gem "simplecov"
25
- gem "simplecov-lcov"
26
- gem "table_sync"
27
- gem "timecop"
28
- gem "yard"
29
- end
8
+ gem "activesupport"
9
+ gem "bundler"
10
+ gem "ci-helper"
11
+ gem "http"
12
+ gem "net-pop", github: "ruby/net-pop" # See https://stackoverflow.com/questions/78617432/strange-bundle-update-issue-disappearing-net-pop-0-1-2-dependency
13
+ gem "nokogiri"
14
+ gem "nori"
15
+ gem "pg"
16
+ gem "pry"
17
+ gem "rake"
18
+ gem "rspec"
19
+ gem "rspec-json_matcher"
20
+ gem "rubocop-config-umbrellio"
21
+ gem "semantic_logger"
22
+ gem "sequel"
23
+ gem "sequel-batches"
24
+ gem "simplecov"
25
+ gem "simplecov-lcov"
26
+ gem "table_sync"
27
+ gem "timecop"
28
+ gem "yard"
data/Gemfile.lock CHANGED
@@ -1,7 +1,14 @@
1
+ GIT
2
+ remote: https://github.com/ruby/net-pop.git
3
+ revision: e8d0afe2773b9eb6a23c39e9e437f6fc0fc7c733
4
+ specs:
5
+ net-pop (0.1.2)
6
+ net-protocol
7
+
1
8
  PATH
2
9
  remote: .
3
10
  specs:
4
- umbrellio-utils (1.3.0)
11
+ umbrellio-utils (1.4.0)
5
12
  memery (~> 1)
6
13
 
7
14
  GEM
@@ -106,7 +113,7 @@ GEM
106
113
  docile (1.4.0)
107
114
  domain_name (0.6.20240107)
108
115
  drb (2.2.1)
109
- dry-inflector (1.0.0)
116
+ dry-inflector (1.1.0)
110
117
  erubi (1.13.0)
111
118
  ffi (1.17.0)
112
119
  ffi (1.17.0-arm64-darwin)
@@ -158,7 +165,6 @@ GEM
158
165
  net-imap (0.4.14)
159
166
  date
160
167
  net-protocol
161
- net-pop (0.1.2)
162
168
  net-protocol (0.2.2)
163
169
  timeout
164
170
  net-smtp (0.5.0)
@@ -193,7 +199,7 @@ GEM
193
199
  sneakers (~> 2.0)
194
200
  tainbox
195
201
  racc (1.8.0)
196
- rack (3.1.4)
202
+ rack (3.1.6)
197
203
  rack-session (2.0.0)
198
204
  rack (>= 3.0.0)
199
205
  rack-test (2.1.0)
@@ -304,7 +310,7 @@ GEM
304
310
  self_data (1.3.0)
305
311
  semantic_logger (4.15.0)
306
312
  concurrent-ruby (~> 1.0)
307
- sequel (5.81.0)
313
+ sequel (5.82.0)
308
314
  bigdecimal
309
315
  sequel-batches (2.0.2)
310
316
  sequel
@@ -367,6 +373,7 @@ DEPENDENCIES
367
373
  bundler
368
374
  ci-helper
369
375
  http
376
+ net-pop!
370
377
  nokogiri
371
378
  nori
372
379
  pg
@@ -22,8 +22,8 @@ module UmbrellioUtils
22
22
  error.result.error_field(PG::Result::PG_DIAG_CONSTRAINT_NAME)
23
23
  end
24
24
 
25
- def each_record(dataset, **options, &block)
26
- primary_key = primary_key_from(dataset, **options)
25
+ def each_record(dataset, primary_key: nil, **options, &block)
26
+ primary_key = primary_key_from(dataset, primary_key: primary_key)
27
27
 
28
28
  with_temp_table(dataset, **options) do |ids|
29
29
  rows = ids.map { |id| row(id.is_a?(Hash) ? id.values : [id]) }
@@ -31,11 +31,28 @@ module UmbrellioUtils
31
31
  end
32
32
  end
33
33
 
34
- def with_temp_table(dataset, page_size: 1_000, sleep: nil, **options)
35
- primary_key = primary_key_from(dataset, **options)
34
+ # Iterates over a dataset and yields batches of primary keys.
35
+ # First, a temporary table is created and populated with dataset primary keys.
36
+ # After that, a batch of rows is deleted from the temp table on each iteration
37
+ # and gets yielded to the caller.
38
+ # @option [Integer] page_size max size of each yielded PK batch
39
+ # @option [Integer] sleep interval to sleep between each iteration
40
+ # @option [Array] primary_key custom primary key to use for dataset
41
+ # @option [Symbol, String] temp_table_name custom name for temporary table,
42
+ # table is reused if already exists
43
+ def with_temp_table(
44
+ dataset,
45
+ page_size: 1_000,
46
+ sleep: nil,
47
+ primary_key: nil,
48
+ temp_table_name: nil
49
+ )
50
+ primary_key = primary_key_from(dataset, primary_key: primary_key)
36
51
  sleep_interval = sleep_interval_from(sleep)
37
52
 
38
- temp_table_name = create_temp_table(dataset, primary_key: primary_key)
53
+ temp_table_name = create_temp_table(
54
+ dataset, primary_key: primary_key, temp_table_name: temp_table_name&.to_sym
55
+ )
39
56
 
40
57
  pk_set = []
41
58
 
@@ -49,23 +66,26 @@ module UmbrellioUtils
49
66
 
50
67
  Kernel.sleep(sleep_interval) if sleep_interval.positive?
51
68
  end
52
- ensure
69
+
53
70
  DB.drop_table(temp_table_name)
54
71
  end
55
72
 
56
- def create_temp_table(dataset, **options)
73
+ def create_temp_table(dataset, primary_key: nil, temp_table_name: nil)
57
74
  time = Time.current
58
75
  model = dataset.model
59
- temp_table_name = :"temp_#{model.table_name}_#{time.to_i}_#{time.nsec}"
60
- primary_key = primary_key_from(dataset, **options)
76
+
77
+ temp_table_name ||= :"temp_#{model.table_name}_#{time.to_i}_#{time.nsec}"
78
+ return temp_table_name if DB.table_exists?(temp_table_name)
79
+
80
+ primary_key = primary_key_from(dataset, primary_key: primary_key)
61
81
 
62
82
  DB.create_table(temp_table_name, unlogged: true) do
63
83
  primary_key.each do |field|
64
84
  type = model.db_schema[field][:db_type]
65
- column field, type
85
+ column(field, type)
66
86
  end
67
87
 
68
- primary_key primary_key
88
+ primary_key(primary_key)
69
89
  end
70
90
 
71
91
  insert_ds = dataset.select(*qualified_pk(model.table_name, primary_key))
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module UmbrellioUtils
4
- VERSION = "1.3.0"
4
+ VERSION = "1.4.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: umbrellio-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Team Umbrellio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-01 00:00:00.000000000 Z
11
+ date: 2024-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: memery