tartarus-rb 0.1.0 → 0.2.0

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: ff59ebb52771abf8d4f7725d842592c3b5cb9c62e9a2dd263bdce6e4ef433fdf
4
- data.tar.gz: a34ed59c2f0d5fd405e1b55a8537cd91d10f55782e4884c22fc327dfa5eca324
3
+ metadata.gz: ffb5cafa941ec43d2c07a6745ef9b75b91c31784649bbf04187e90f6960812e0
4
+ data.tar.gz: 9615766c2064a4e127c836ca4cf6ad9b0f2925d08246e4486b9f9fd382884e4f
5
5
  SHA512:
6
- metadata.gz: 76f1a2a3567fb8eaacdf244c0ced23d41ac8eb98a5a52e3ce83a48c0650ac6ad0156947665611401d70598502bd4c7ede9c4b4e8729a052c69122260a99c7a0b
7
- data.tar.gz: 0a985afc6e833ef31f08a70b3e4f4479c47b2763ce9266e77eafe6a47cf639d2ae47485a662f71bc8b1fcc09909a7682581aef39a3b93628b183769ad2a8f990
6
+ metadata.gz: a97481429cc2c5faa977d75baae80c78e17f56cfa0323b76e613a91a57586bbfb6890442e340b7d9aff88eb7a155f694174109a92317d77e7b8c4c367224ae50
7
+ data.tar.gz: 143dc43864c453873d6154f52d1504eff11f0f88e406e69893fd62937ea8b59899e4c1fdd344adc65fab4e4d6f15c8dcee4cd5c09c14e86a19d47be2e17d403d
data/.gitignore CHANGED
@@ -6,6 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /spec/test.db
9
10
 
10
11
  # rspec failure tracking
11
12
  .rspec_status
@@ -1,4 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0
4
+ - Add support for deleting and destroying in batches
5
+ - Add integration tests with a real database and ActiveRecord
6
+ - Better docs
7
+
3
8
  ## 0.1.0
4
9
  - Initial release
@@ -1,21 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tartarus-rb (0.1.0)
4
+ tartarus-rb (0.2.0)
5
5
  sidekiq (>= 5)
6
6
  sidekiq-cron (~> 1)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
+ activemodel (6.1.0.rc1)
12
+ activesupport (= 6.1.0.rc1)
13
+ activerecord (6.1.0.rc1)
14
+ activemodel (= 6.1.0.rc1)
15
+ activesupport (= 6.1.0.rc1)
16
+ activesupport (6.1.0.rc1)
17
+ concurrent-ruby (~> 1.0, >= 1.0.2)
18
+ i18n (>= 1.6, < 2)
19
+ minitest (>= 5.1)
20
+ tzinfo (~> 2.0)
21
+ zeitwerk (~> 2.3)
11
22
  concurrent-ruby (1.1.7)
12
23
  connection_pool (2.2.3)
13
24
  diff-lcs (1.4.4)
14
25
  et-orbi (1.2.4)
15
26
  tzinfo
16
- fugit (1.3.9)
27
+ fugit (1.4.0)
17
28
  et-orbi (~> 1.1, >= 1.1.8)
18
- raabro (~> 1.3)
29
+ raabro (~> 1.4)
30
+ i18n (1.8.5)
31
+ concurrent-ruby (~> 1.0)
32
+ minitest (5.14.2)
19
33
  raabro (1.4.0)
20
34
  rack (2.2.3)
21
35
  rake (13.0.1)
@@ -43,16 +57,20 @@ GEM
43
57
  sidekiq-cron (1.2.0)
44
58
  fugit (~> 1.1)
45
59
  sidekiq (>= 4.2.1)
60
+ sqlite3 (1.4.2)
46
61
  tzinfo (2.0.2)
47
62
  concurrent-ruby (~> 1.0)
63
+ zeitwerk (2.4.1)
48
64
 
49
65
  PLATFORMS
50
66
  ruby
51
67
 
52
68
  DEPENDENCIES
69
+ activerecord (~> 6)
53
70
  rake (~> 13.0)
54
71
  rspec (~> 3.0)
55
72
  rspec-sidekiq
73
+ sqlite3
56
74
  tartarus-rb!
57
75
 
58
76
  BUNDLED WITH
data/README.md CHANGED
@@ -43,6 +43,7 @@ if File.exist?(schedule_file) && Sidekiq.server?
43
43
  item.tenant_id_field = :account_uuid
44
44
  item.archive_items_older_than = -> { 30.days.ago }
45
45
  item.timestamp_field = :created_at
46
+ item.archive_with = :destroy_all
46
47
  end
47
48
 
48
49
  tartarus.register do |item|
@@ -77,6 +78,17 @@ You can use the following config params:
77
78
  - `tenant_id_field` - required when using tenant_value_source/tenant_value_source. It's a DB column that will be used for scoping records by a tenant. For example, here it would be: `ModelThatYouWantToArchive.where(account_uuid: value_of_uuid_from_some_active_account)`
78
79
  - `archive_items_older_than` - required, for defining retention policy
79
80
  - `timestamp_field` - required, used for performing a query using the value from `archive_items_older_than`
81
+ - `archive_with` - optional (defaults to `delete_all`). Could be `delete_all`, `destroy_all`, `delete_all_without_batches`, `destroy_all_without_batches`
82
+
83
+ ### Testing before actually using it
84
+
85
+ You might want to verify that the gem works in the way you expect it to work. For that, you will be mostly interested in 2 usecases:
86
+
87
+ 1. scheduling/enqueueing: use `Tartarus::ScheduleArchivingModel#schedule` - for example, `Tartarus::ScheduleArchivingModel.new.schedule("PaperTrailVersion")`, it's going to enqueue either `Tartarus::Sidekiq::ArchiveModelWithTenantJob` or `Tartarus::Sidekiq::ArchiveModelWithoutTenantJob`, depending on the config.
88
+ 2. execution of the archiving logic: use `Tartarus::ArchiveModelWithTenant#archive` (for example, `Tartarus::ArchiveModelWithTenant.new.archive("PaperTrailVersion", "User")`) or `Tartarus::ArchiveModelWithoutTenant#archive` (for example, `Tartarus::ArchiveModelWithoutTenant.new.archive("PaperTrailVersion")`)
89
+
90
+
91
+ You might also want to check `spec/integration` to get an idea how the integration tests were written.
80
92
 
81
93
  ## Development
82
94
 
@@ -3,7 +3,10 @@ require "tartarus/archivable_item"
3
3
  require "tartarus/archivable_item/sidekiq_cron_job_serializer"
4
4
  require "tartarus/archive_strategy"
5
5
  require "tartarus/archive_strategy/delete_all"
6
+ require "tartarus/archive_strategy/delete_all_without_batches"
6
7
  require "tartarus/archive_strategy/destroy_all"
8
+ require "tartarus/archive_strategy/destroy_all_without_batches"
9
+ require "tartarus/archive_strategy/extract_batch"
7
10
  require "tartarus/sidekiq"
8
11
  require "tartarus/sidekiq/archive_model_with_tenant_job"
9
12
  require "tartarus/sidekiq/archive_model_without_tenant_job"
@@ -25,7 +25,7 @@ class Tartarus
25
25
  private
26
26
 
27
27
  def collection_for(model_name)
28
- const_resolver.const_get(model_name)
28
+ const_resolver.const_get(model_name.to_s)
29
29
  end
30
30
 
31
31
  def ensure_column_exists(collection, model_name, column)
@@ -5,6 +5,10 @@ class Tartarus::ArchiveStrategy
5
5
  Tartarus::ArchiveStrategy::DeleteAll.new
6
6
  when :destroy_all
7
7
  Tartarus::ArchiveStrategy::DestroyAll.new
8
+ when :delete_all_without_batches
9
+ Tartarus::ArchiveStrategy::DeleteAllWithoutBatches.new
10
+ when :destroy_all_without_batches
11
+ Tartarus::ArchiveStrategy::DestroyAllWithoutBatches.new
8
12
  else
9
13
  raise "unknown strategy: #{strategy_name}"
10
14
  end
@@ -2,7 +2,9 @@ class Tartarus
2
2
  class ArchiveStrategy
3
3
  class DeleteAll
4
4
  def call(collection)
5
- collection.delete_all
5
+ Tartarus::ArchiveStrategy::ExtractBatch.new.call(collection) do |batch|
6
+ batch.delete_all
7
+ end
6
8
  end
7
9
  end
8
10
  end
@@ -0,0 +1,9 @@
1
+ class Tartarus
2
+ class ArchiveStrategy
3
+ class DeleteAllWithoutBatches
4
+ def call(collection)
5
+ collection.delete_all
6
+ end
7
+ end
8
+ end
9
+ end
@@ -2,7 +2,9 @@ class Tartarus
2
2
  class ArchiveStrategy
3
3
  class DestroyAll
4
4
  def call(collection)
5
- collection.destroy_all
5
+ Tartarus::ArchiveStrategy::ExtractBatch.new.call(collection) do |batch|
6
+ batch.destroy_all
7
+ end
6
8
  end
7
9
  end
8
10
  end
@@ -0,0 +1,9 @@
1
+ class Tartarus
2
+ class ArchiveStrategy
3
+ class DestroyAllWithoutBatches
4
+ def call(collection)
5
+ collection.destroy_all
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ class Tartarus
2
+ class ArchiveStrategy
3
+ class ExtractBatch
4
+ attr_reader :config
5
+ private :config
6
+
7
+ def initialize(config: Thread.current)
8
+ @config = config
9
+ end
10
+
11
+ def call(collection)
12
+ if collection.respond_to?(:in_batches) && !suppressed_in_batches?
13
+ yield collection.in_batches
14
+ else
15
+ primary_key = collection.primary_key
16
+
17
+ collection.select(primary_key).find_in_batches do |group|
18
+ yield collection.where(primary_key => group)
19
+ end
20
+ end
21
+ end
22
+
23
+ def suppressed_in_batches?
24
+ !!config["__TARTARUS__SUPPRESSED_IN_BATCHES"]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,5 +1,5 @@
1
1
  class Tartarus
2
2
  module Rb
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -24,9 +24,7 @@ class Tartarus::ScheduleArchivingModel
24
24
  collection = archivable_item.tenants_range.call
25
25
 
26
26
  if collection.respond_to?(:find_each)
27
- archivable_item.tenants_range
28
- .call
29
- .find_each { |element| yield element.public_send(archivable_item.tenant_value_source) }
27
+ collection.find_each { |element| yield element.public_send(archivable_item.tenant_value_source) }
30
28
  else
31
29
  collection.each { |element| yield element }
32
30
  end
@@ -33,4 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "rake", "~> 13.0"
34
34
  spec.add_development_dependency "rspec", "~> 3.0"
35
35
  spec.add_development_dependency "rspec-sidekiq"
36
+
37
+ spec.add_development_dependency "activerecord", "~> 6"
38
+ spec.add_development_dependency "sqlite3"
36
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tartarus-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karol Galanciak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-21 00:00:00.000000000 Z
11
+ date: 2020-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: A gem for archving (deleting) old records you no longer need. Send them
84
112
  straight to tartarus!
85
113
  email:
@@ -108,7 +136,10 @@ files:
108
136
  - lib/tartarus/archive_model_without_tenant.rb
109
137
  - lib/tartarus/archive_strategy.rb
110
138
  - lib/tartarus/archive_strategy/delete_all.rb
139
+ - lib/tartarus/archive_strategy/delete_all_without_batches.rb
111
140
  - lib/tartarus/archive_strategy/destroy_all.rb
141
+ - lib/tartarus/archive_strategy/destroy_all_without_batches.rb
142
+ - lib/tartarus/archive_strategy/extract_batch.rb
112
143
  - lib/tartarus/rb.rb
113
144
  - lib/tartarus/rb/version.rb
114
145
  - lib/tartarus/registry.rb
@@ -139,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
170
  - !ruby/object:Gem::Version
140
171
  version: '0'
141
172
  requirements: []
142
- rubygems_version: 3.1.4
173
+ rubygems_version: 3.1.2
143
174
  signing_key:
144
175
  specification_version: 4
145
176
  summary: A gem for archving (deleting) old records you no longer need. Send them straight