remont 0.1.0 → 0.1.2

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: 2ffe65eff0fe907d7834a94e028001396ad17937b313cb9197475b66c4938c33
4
- data.tar.gz: 7247441b4f59709a8c877da6ae9a9679f27c02916ca553f0f7f9d9f2808c9805
3
+ metadata.gz: fef6ca4c4fb15d4b408b15362f695d57f35c251bd1a39e9acffe3781e1ba0dfe
4
+ data.tar.gz: 9232bafef16dd069c9e3beab41225ffc01e2a5efc828ef3127044f1d8dea7039
5
5
  SHA512:
6
- metadata.gz: 60ae2dc780851f4bef7436e65b2143cfd5b8454b2cd5f3dc512985f32ab061f59eed24ff769e34fc26adabe43a7346aaf411b824d8e9979153b7fac342792e05
7
- data.tar.gz: 745d82eac997e1bda274f2e5fc20f3f6b10b69043efe0de83746804725fea5b7a5b5bf99c585d9f866ca88e6bd9d1c1a901855c6b7cc034f4ebf1846b56e9446
6
+ metadata.gz: 6fda028ec5e55bdb4fef7b1cb60e955444bae187f611ebf7fe0b8e7ff2d9d8e365f58903b653cc16e15039c6d15202e7cf133250fc43e3027a16e7b499171f03
7
+ data.tar.gz: 41c1b71c8b424a99dbf022dd51ca11b13df6a982163ef3f8ad9988090808bd1f115dee0779ace5d1e99084566079b0b6037573a283d03400920907da5e967c8f
data/.rubocop.yml CHANGED
@@ -11,3 +11,6 @@ RSpec/MultipleExpectations:
11
11
 
12
12
  Style/FrozenStringLiteralComment:
13
13
  Enabled: false
14
+
15
+ Gemspec/DevelopmentDependencies:
16
+ EnforcedStyle: gemspec
data/CHANGELOG.md CHANGED
@@ -0,0 +1,9 @@
1
+ # Remont Change Log
2
+
3
+ ## 0.1.1 (Mar 23rd, 2022)
4
+
5
+ - Add support for adding script path argument to the rake task (@cukoreva)
6
+ - Add support for configuring processing status attribute per schema (@vr4b4c)
7
+
8
+ ## 0.1.2 (Sep 26th, 2023)
9
+ - Add MIT license.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Infinum
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -21,14 +21,12 @@ Add `config/initializers/remont.rb`
21
21
  ```ruby
22
22
  Remont.setup do |config|
23
23
  config.process_timestamp_attribute = :processed_at
24
- config.script_path = 'db/remont.rb'
25
24
  end
26
25
  ```
27
26
 
28
- | Option | Default value | Description |
29
- | --- | :---: | --- |
30
- | `process_timestamp_attribute` | `:processed_at` | processing status attribute identifier |
31
- | `script_path` | `'db/remont.rb'` | entry point for the schema processing task |
27
+ | Option | Default value | Description |
28
+ | --- | :---: | --- |
29
+ | `process_timestamp_attribute` | `nil` | processing status attribute identifier |
32
30
 
33
31
  On successful record processing, `process_timestamp_attribute` on the record will be set to the current processing time (`Time.now.getlocal`).
34
32
 
@@ -38,11 +36,10 @@ In the following example, the intention is to simulate anonymization of the `use
38
36
  ```ruby
39
37
  # config/initializers/remont.rb
40
38
  Remont.setup do |config|
41
- config.process_timestamp_attribute = :anonyzmied_at
42
- config.script_path = 'db/anonymize.rb'
39
+ config.process_timestamp_attribute = :anonymized_at
43
40
  end
44
41
  ```
45
- - define processing script
42
+ - define the processing script
46
43
  ```ruby
47
44
  # db/anonymize.rb
48
45
  schema model: User do
@@ -53,8 +50,12 @@ schema model: Order do
53
50
  attribute(:billing_address) { '23 Wall Street, NY' }
54
51
  end
55
52
  ```
56
- - and run `bundle exec rake remont`
53
+ - and run `remont` rake task with the path to the processing script
54
+ ```bash
55
+ bundle exec rake "remont[db/anonymize.rb]"
56
+ ```
57
57
 
58
+ Passing the script path to the rake task is mandatory.
58
59
  Running the rake task would result in updating `email` (and `anonymized_at`) column for each row in the `users` table, and `billing_address` column for each row in the `orders` table.
59
60
 
60
61
  ### Schema
@@ -77,14 +78,29 @@ schema model: Order do
77
78
  scope { |scope| scope.where(status: :active) }
78
79
  end
79
80
  ```
81
+ ### Recording the processing end time
82
+ Library supports an option to store the processing end time of a record. Enable the behavior by configuring a processing status attribute identifier for the schema. Configure the attribute identifier
83
+ - globally (`Remont::Config#process_timestamp_attribute`, for all schemas)
84
+ - or individually per schema (in the schema DSL, overrides the global setting)
85
+ ```ruby
86
+ schema model: User, process_timestamp_attribute: :anonymized_at do
87
+ end
88
+
89
+ schema model: Order do
90
+ with_process_timestamp_attribute :anonymized_at
91
+ end
92
+ ```
93
+
94
+ Set process status attribute to `nil` to disable the behavior.
80
95
  ### Skipping the processed records
81
- In some cases, it's desirable to skip already processed records. You can opt-in to this behavior by declaring `without_processed` within the `schema` block. When declared, the processing dataset query will be extended with a condition that excludes already processed records (ie. `where(Remont.process_timestamp_attribute => nil)`)
96
+ In some cases, it's desirable to skip already processed records. You can enable this behavior by declaring `without_processed` within the `schema` block. When declared, the processing dataset query will be extended with a condition that excludes already processed records.
82
97
  ```ruby
83
98
  schema model: User do
84
99
  without_processed
85
100
  # ...
86
101
  end
87
102
  ```
103
+ Configure processing status attribute before declaring the `without_processed`. An error will be raised otherwise.
88
104
  ### Callbacks
89
105
  Custom pre-processing or post-processing behavior can be declared using `before` and `after` callbacks.
90
106
  ```ruby
data/lib/remont/config.rb CHANGED
@@ -1,16 +1,10 @@
1
1
  module Remont
2
2
  class Config
3
- DEFAULT_SCRIPT_PATH = 'db/remont.rb'.freeze
4
-
5
3
  # @return [Symbol]
6
4
  attr_accessor :process_timestamp_attribute
7
5
 
8
- # @return [String]
9
- attr_accessor :script_path
10
-
11
6
  def initialize
12
- @process_timestamp_attribute = :processed_at
13
- @script_path = DEFAULT_SCRIPT_PATH
7
+ @process_timestamp_attribute = nil
14
8
  end
15
9
  end
16
10
  end
@@ -2,11 +2,11 @@ module Remont
2
2
  class RecordProcessor
3
3
  NOOP = proc {}
4
4
 
5
- # @param [Array<Remont::Attribute>] attributes
5
+ # @param [Remont::Schema] schema
6
6
  # @param [Proc] before
7
7
  # @param [Proc] after
8
- def initialize(attributes, before, after)
9
- @attributes = attributes
8
+ def initialize(schema, before, after)
9
+ @schema = schema
10
10
  @before = before || NOOP
11
11
  @after = after || NOOP
12
12
  end
@@ -25,12 +25,13 @@ module Remont
25
25
 
26
26
  private
27
27
 
28
- attr_reader :attributes
28
+ attr_reader :schema
29
29
  attr_reader :before
30
30
  attr_reader :after
31
31
 
32
32
  def processed_attributes(record)
33
- attributes
33
+ schema
34
+ .attributes
34
35
  .select { |attribute| record.send(attribute.name).present? }
35
36
  .reduce(default_processed_attributes) do |memo, attribute|
36
37
  memo.merge(attribute.name => attribute.process(record.send(attribute.name), record))
@@ -38,10 +39,10 @@ module Remont
38
39
  end
39
40
 
40
41
  def default_processed_attributes
41
- return {} unless Remont.config.process_timestamp_attribute
42
+ return {} unless schema.process_timestamp_attribute
42
43
 
43
44
  {
44
- Remont.config.process_timestamp_attribute => Time.now.getlocal
45
+ schema.process_timestamp_attribute => Time.now.getlocal
45
46
  }
46
47
  end
47
48
  end
data/lib/remont/schema.rb CHANGED
@@ -1,16 +1,23 @@
1
1
  module Remont
2
2
  class Schema
3
- DEFAULT_SCOPE = proc { |scope| scope }
4
- WITHOUT_PROCESSED = proc { |scope| scope.where(Remont.config.process_timestamp_attribute => nil) }
3
+ MISSING_PROCESSING_STATUS_ATTR = "Processing status attribute isn't configured".freeze
4
+
5
+ # @return [Array<Remont::Attribute>]
6
+ attr_reader :attributes
7
+
8
+ # @return [Nil, String, Symbol]
9
+ attr_reader :process_timestamp_attribute
5
10
 
6
11
  # @param [Hash] opts
7
12
  # @option [Class] :model
8
13
  # @option [Proc] :scope
14
+ # @option [String, Symbol] :process_timestamp_attribute
9
15
  # @param [Proc] block
10
16
  def initialize(opts = {}, &block)
11
17
  @model = opts.fetch(:model)
12
- @model_scope = opts.fetch(:scope, DEFAULT_SCOPE)
13
- @without_processed_scope = DEFAULT_SCOPE
18
+ @model_scope = opts.fetch(:scope, default_scope)
19
+ @without_processed_scope = default_scope
20
+ @process_timestamp_attribute = opts.fetch(:process_timestamp_attribute, Remont.config.process_timestamp_attribute)
14
21
  @before_cb = nil
15
22
  @after_cb = nil
16
23
  @attributes = []
@@ -20,7 +27,17 @@ module Remont
20
27
 
21
28
  # @return [Remont::Schema]
22
29
  def without_processed
23
- @without_processed_scope = WITHOUT_PROCESSED
30
+ raise MISSING_PROCESSING_STATUS_ATTR if @process_timestamp_attribute.nil?
31
+
32
+ @without_processed_scope = proc { |scope| scope.where(process_timestamp_attribute => nil) }
33
+
34
+ self
35
+ end
36
+
37
+ # @param [String, Symbol] attr_name
38
+ # @return [Remont::Schema]
39
+ def with_process_timestamp_attribute(attr_name)
40
+ @process_timestamp_attribute = attr_name
24
41
 
25
42
  self
26
43
  end
@@ -70,12 +87,11 @@ module Remont
70
87
  attr_reader :model
71
88
  attr_reader :without_processed_scope
72
89
  attr_reader :model_scope
73
- attr_reader :attributes
74
90
  attr_reader :before_cb
75
91
  attr_reader :after_cb
76
92
 
77
93
  def processor
78
- @processor ||= RecordProcessor.new(attributes, before_cb, after_cb)
94
+ @processor ||= RecordProcessor.new(self, before_cb, after_cb)
79
95
  end
80
96
 
81
97
  def records_for_processing
@@ -83,5 +99,9 @@ module Remont
83
99
  without_processed_scope.call(model.all)
84
100
  )
85
101
  end
102
+
103
+ def default_scope
104
+ proc { |scope| scope }
105
+ end
86
106
  end
87
107
  end
@@ -1,5 +1,13 @@
1
1
  desc 'Run schema processing'
2
- task remont: :environment do
3
- path = Rails.root.join(Remont.config.script_path)
2
+ task :remont, [:script_path] => :remont_env do |_, args|
3
+ script_path = args[:script_path]
4
+ abort 'Missing script path' unless script_path
5
+
6
+ path = Rails.root.join(script_path)
4
7
  Remont::Script.new(path).run!
5
8
  end
9
+
10
+ task :remont_env do # rubocop:disable Rails/RakeEnvironment
11
+ Rake::Task['environment'].invoke
12
+ rescue StandardError # rubocop:disable Lint/SuppressedException
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Remont
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.1.2'.freeze
3
3
  end
data/remont.gemspec CHANGED
@@ -8,6 +8,7 @@ Gem::Specification.new do |spec|
8
8
 
9
9
  spec.summary = 'DSL for row level data processing.'
10
10
  spec.homepage = 'https://github.com/infinum/remont'
11
+ spec.license = 'MIT'
11
12
  spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
12
13
 
13
14
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remont
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rails Team
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-08 00:00:00.000000000 Z
11
+ date: 2023-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -108,7 +108,7 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
- description:
111
+ description:
112
112
  email:
113
113
  - team.rails@infinum.com
114
114
  executables: []
@@ -125,6 +125,7 @@ files:
125
125
  - CHANGELOG.md
126
126
  - CODE_OF_CONDUCT.md
127
127
  - Gemfile
128
+ - LICENSE
128
129
  - README.md
129
130
  - Rakefile
130
131
  - bin/console
@@ -140,14 +141,15 @@ files:
140
141
  - lib/remont/version.rb
141
142
  - remont.gemspec
142
143
  homepage: https://github.com/infinum/remont
143
- licenses: []
144
+ licenses:
145
+ - MIT
144
146
  metadata:
145
147
  allowed_push_host: https://rubygems.org
146
148
  homepage_uri: https://github.com/infinum/remont
147
149
  source_code_uri: https://github.com/infinum/remont
148
150
  changelog_uri: https://github.com/infinum/remont/blob/master/CHANGELOG.md
149
151
  rubygems_mfa_required: 'true'
150
- post_install_message:
152
+ post_install_message:
151
153
  rdoc_options: []
152
154
  require_paths:
153
155
  - lib
@@ -163,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
165
  version: '0'
164
166
  requirements: []
165
167
  rubygems_version: 3.1.4
166
- signing_key:
168
+ signing_key:
167
169
  specification_version: 4
168
170
  summary: DSL for row level data processing.
169
171
  test_files: []