nxt_support 0.1.5 → 0.1.6

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: 187a9226c75ccd071bd9c32bf599f3d0b8badf1888fc4d09dd656d815b0af2ff
4
- data.tar.gz: fa7e12a3f24c9bc3a0fe2e3bc455b4b09e3ee3fd2fa90371886e49d3eda2f5c3
3
+ metadata.gz: 683364c398008994e7e9efb8007e03bf7056dd816dec3e396a4482ede9e546d9
4
+ data.tar.gz: 4e8cee47fa7c145b01ae07b5e8c8ded7da56211ba1272794823e2f8b3a8be5ce
5
5
  SHA512:
6
- metadata.gz: 9c9ced17e3a32dd6a91e3863e589d645b0ac6f0b370ce6ba94c8abc7ae645c5f5e3c1d81ef4c15c919afcb8f9c2a931701de67a8304985346c5fc1370e6dad05
7
- data.tar.gz: c62f77b8707d77af40ea9e32c8151c7b8aae07975ac2032b9b73d31b6664c61d9eac7d8159f0842d7bdc202e9fb67504a785b4ef95366020c9fbffc3a721074f
6
+ metadata.gz: de2c12071f41de18b97e49d1516faa54d01b343ab68ff0949004713c8e2345b443cdd60f2f051394e41e966480aca79451b9327d189a60915261814b297620a5
7
+ data.tar.gz: 8b3a6e21cedd45c22ca925099c02a2e62fe1c7f3f25dae05770e09952c754cf433c0737746f699da42fb6caddb966673daafe20795f1618bcdb5411a1db9ac31
@@ -1,3 +1,7 @@
1
+ # v0.1.6 2020-06-18
2
+
3
+ - Added `NxtSupport::PreprocessAttributes`
4
+
1
5
  # v0.1.5 2020-06-17
2
6
 
3
7
  - Added `NxtSupport::AssignableValues`
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nxt_support (0.1.5)
4
+ nxt_support (0.1.6)
5
5
  nxt_init
6
+ nxt_registry
6
7
  rails
7
8
 
8
9
  GEM
@@ -90,6 +91,8 @@ GEM
90
91
  mini_portile2 (~> 2.4.0)
91
92
  nxt_init (0.1.5)
92
93
  activesupport
94
+ nxt_registry (0.1.5)
95
+ activesupport
93
96
  pry (0.13.1)
94
97
  coderay (~> 1.1)
95
98
  method_source (~> 1.0)
data/README.md CHANGED
@@ -96,6 +96,46 @@ book.genre #=> crime
96
96
  ```
97
97
  If the default value is not in the list of assignable values, then validation will fail.
98
98
 
99
+ #### NxtSupport::PreprocessAttributes
100
+
101
+ This mixin provides the `preprocess_attributes` class method which can preprocess columns before saving by either stripping whitespace, downcasing, or both.
102
+
103
+ ```ruby
104
+ class Book < ApplicationRecord
105
+ include NxtSupport::PreprocessAttributes
106
+
107
+ preprocess_attributes :title, :author, preprocessors: %i[strip downcase]
108
+ end
109
+
110
+ book = Book.new(title: ' Moche!')
111
+ book.save
112
+ book.title #=> "moche!"
113
+ ```
114
+
115
+ Register a custom preprocesser:
116
+
117
+ ```ruby
118
+ NxtSupport::Preprocessor.register(:compress, CompressPreprocessor)
119
+ ```
120
+
121
+ Also works with non-string columns
122
+
123
+ ```ruby
124
+ NxtSupport::Preprocessor.register(:add_one, AddOnePreprocessor, :integer)
125
+ ```
126
+
127
+ ```ruby
128
+ class Book < ApplicationRecord
129
+ include NxtSupport::PreprocessAttributes
130
+
131
+ preprocess_attributes :views, preprocessors: %i[add_one], column_type: :integer
132
+ end
133
+
134
+ book = Book.new(views: 1000)
135
+ book.save
136
+ book.views #=> "1001"
137
+ ```
138
+
99
139
  ### NxtSupport/Serializers
100
140
 
101
141
  Enjoy mixins for your serializers.
@@ -1,5 +1,8 @@
1
1
  require 'active_support/all'
2
+ require 'nxt_registry'
3
+
2
4
  require "nxt_support/version"
5
+ require "nxt_support/preprocessor"
3
6
  require "nxt_support/models"
4
7
  require "nxt_support/serializers"
5
8
  require "nxt_support/util"
@@ -2,3 +2,4 @@ require "nxt_support/models/email"
2
2
  require "nxt_support/models/safely_find_or_createable"
3
3
  require "nxt_support/models/indifferently_accessible_json_attrs"
4
4
  require "nxt_support/models/assignable_values"
5
+ require "nxt_support/models/preprocess_attributes"
@@ -0,0 +1,35 @@
1
+ module NxtSupport
2
+ module PreprocessAttributes
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ attr_reader :nxt_preprocessors
7
+
8
+ def preprocess_attributes(*attributes, **options)
9
+ attributes_to_process =
10
+ if attributes.any?
11
+ attributes.map(&:to_sym)
12
+ else
13
+ column_names.map(&:to_sym)
14
+ end
15
+
16
+ @nxt_preprocessors ||= []
17
+ @nxt_preprocessors << NxtSupport::Preprocessor.new(attributes_to_process, options)
18
+ end
19
+ end
20
+
21
+ included do
22
+ before_validation do |record|
23
+ nxt_preprocessors.each do |preprocessor|
24
+ preprocessor.process(record)
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def nxt_preprocessors
32
+ self.class.nxt_preprocessors
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,76 @@
1
+ require "nxt_support/preprocessors/strip_preprocessor"
2
+ require "nxt_support/preprocessors/downcase_preprocessor"
3
+
4
+ module NxtSupport
5
+ class Preprocessor
6
+ extend NxtRegistry
7
+
8
+ PREPROCESSORS = registry :type, callable: false do
9
+ nested :preprocessors
10
+ end
11
+
12
+ attr_accessor :attributes, :preprocessors, :options
13
+ attr_reader :type
14
+
15
+ def initialize(attributes, options)
16
+ @type = options.fetch(:column_type) { :string }
17
+ @options = options
18
+
19
+ attributes_to_preprocess(attributes, options)
20
+ extract_preprocessors
21
+ register_default_preprocessors
22
+ end
23
+
24
+ def process(record)
25
+ attributes.each do |attr|
26
+ value_to_process = record[attr]
27
+ processed_value = process_value(value_to_process)
28
+ record[attr] = processed_value
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def attributes_to_preprocess(attributes, options = {})
35
+ if options[:only]
36
+ attributes.select! { |attr| attr.in?(options[:only]) }
37
+ elsif options[:except]
38
+ attributes.reject! { |attr| attr.in?(options[:except]) }
39
+ end
40
+
41
+ @attributes = attributes
42
+ end
43
+
44
+ def extract_preprocessors
45
+ @preprocessors = options[:preprocessors]
46
+ raise ArgumentError, 'No preprocessors provided' unless preprocessors.present?
47
+ end
48
+
49
+ def process_value(value)
50
+ preprocessors.each do |key|
51
+ value = resolve(key, value)
52
+ end
53
+
54
+ value
55
+ end
56
+
57
+ def resolve(key, value)
58
+ if key.respond_to?(:lambda?)
59
+ key.call(value)
60
+ else
61
+ PREPROCESSORS.resolve(type).resolve(key).new(value).call
62
+ end
63
+ end
64
+
65
+ def register_default_preprocessors
66
+ PREPROCESSORS.type(:string).preprocessors!(:strip, NxtSupport::Preprocessors::StripPreprocessor)
67
+ PREPROCESSORS.type(:string).preprocessors!(:downcase, NxtSupport::Preprocessors::DowncasePreprocessor)
68
+ end
69
+
70
+ class << self
71
+ def register(name, preprocessor, type = :string)
72
+ PREPROCESSORS.type(type).preprocessors!(name, preprocessor)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,22 @@
1
+ module NxtSupport
2
+ module Preprocessors
3
+ class WrongTypeError < StandardError; end
4
+
5
+ class DowncasePreprocessor
6
+ attr_accessor :value
7
+
8
+ def initialize(value)
9
+ @value = value
10
+ end
11
+
12
+ def call
13
+ return if value.nil?
14
+
15
+ value.downcase!
16
+ value
17
+ rescue NoMethodError => e
18
+ raise WrongTypeError, "Tried to call #{e.name} on #{value}, but #{value} does not respond to #{e.name}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ module NxtSupport
2
+ module Preprocessors
3
+ class WrongTypeError < StandardError; end
4
+
5
+ class StripPreprocessor
6
+ attr_accessor :value
7
+
8
+ def initialize(value)
9
+ @value = value
10
+ end
11
+
12
+ def call
13
+ return if value.nil?
14
+
15
+ value.strip!
16
+ value
17
+ rescue NoMethodError => e
18
+ raise WrongTypeError, "Tried to call #{e.name} on #{value}, but #{value} does not respond to #{e.name}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module NxtSupport
2
- VERSION = "0.1.5".freeze
2
+ VERSION = "0.1.6".freeze
3
3
  end
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_dependency "rails"
31
31
  spec.add_dependency "nxt_init"
32
+ spec.add_dependency "nxt_registry"
32
33
  spec.add_development_dependency "bundler"
33
34
  spec.add_development_dependency "rake"
34
35
  spec.add_development_dependency "rspec"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nxt_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nils Sommer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-06-18 00:00:00.000000000 Z
12
+ date: 2020-07-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: nxt_registry
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: bundler
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -137,7 +151,11 @@ files:
137
151
  - lib/nxt_support/models/assignable_values.rb
138
152
  - lib/nxt_support/models/email.rb
139
153
  - lib/nxt_support/models/indifferently_accessible_json_attrs.rb
154
+ - lib/nxt_support/models/preprocess_attributes.rb
140
155
  - lib/nxt_support/models/safely_find_or_createable.rb
156
+ - lib/nxt_support/preprocessor.rb
157
+ - lib/nxt_support/preprocessors/downcase_preprocessor.rb
158
+ - lib/nxt_support/preprocessors/strip_preprocessor.rb
141
159
  - lib/nxt_support/serializers.rb
142
160
  - lib/nxt_support/serializers/has_time_attributes.rb
143
161
  - lib/nxt_support/util.rb
@@ -168,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
186
  - !ruby/object:Gem::Version
169
187
  version: '0'
170
188
  requirements: []
171
- rubygems_version: 3.0.3
189
+ rubygems_version: 3.0.8
172
190
  signing_key:
173
191
  specification_version: 4
174
192
  summary: Support through reusable Mixins and Helpers for Ruby on Rails Applications