normalizy 1.6.0 → 2.0.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: 0ce6511269094da3b936369b12195ad147ecbc4a67be1649eedf4a96a18aba63
4
- data.tar.gz: bc8454295d05564e66a702d528132487297a0b969a62b56a182cc33e27156747
3
+ metadata.gz: 7fbc57100ff4a77fb63503844a16059b78537836f4df58f0f64127d2bcfe3270
4
+ data.tar.gz: f0ac58e5e468721dc2ab116a0550b542c495e073d9315b420f8bddb754b327c2
5
5
  SHA512:
6
- metadata.gz: 197c6dc140be871e4758e67e8197ab55015760ec711c54f9923783bd516d79d084a8d13fe39fd6ff582cf634796b533938adfc7d437257d4f8a96ee02f926f5e
7
- data.tar.gz: 36b8f76aa291b2bd977902777518e8c48ca4a6f7be5ab224d17e3de33c04cd1d02fdca9387dcf7ffeab83fc08ebc2f2e657a99fccaa169d6713cad67d236ea46
6
+ metadata.gz: f92bae33a40563537d7b6637118dbdf5b960b979a2941e6aa0859ad738a9dda2db74e1b444de3853ff61c2a4695866ad46efc96d3b34b3088bf16a6e6c87d124
7
+ data.tar.gz: cbf6c06467360321fa144d1800258d4af50215b1b661e9e2056ab1d0c17b712e137a4167d82bb9534030a9f35605faa4af2a140c09e6b2121f42e38d3b7a7560
data/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ ## v2.0.0
2
+
3
+ ### Break Changes
4
+
5
+ - Drops support for Ruby < 3.3;
6
+
7
+ ### Fixes
8
+
9
+ - `date` filter now returns `nil` explicitly on invalid date to avoid Rails 8 compatibility issue where `errors.add` returns the added `ActiveModel::Error` object instead of `nil`;
10
+
11
+ ## v1.7.0
12
+
13
+ ### Features
14
+
15
+ - Adds `truncate` filter; [#3](https://github.com/wbotelhos/normalizy/pull/3) by [rafaeldev](https://github.com/rafaeldev)
16
+
17
+ ### Updates
18
+
19
+ - Adds RuboCop task on the CI;
20
+
1
21
  ## v1.6.0
2
22
 
3
23
  ### Fixes
@@ -9,13 +29,13 @@
9
29
  - Adds Code Quality;
10
30
  - Adds Test Coverage;
11
31
  - Migrates the build to Github Actions;
12
- - Removes Git dependency for build;
32
+ - Removes Git dependency for the build;
13
33
 
14
34
  ## v1.5.0
15
35
 
16
36
  ### Features
17
37
 
18
- - Filter `date` now supports call object that respond to `beginning_of_day` or `end_of_day`;
38
+ - Filter `date` now supports call object that responds to `beginning_of_day` or `end_of_day`;
19
39
 
20
40
  ## v1.4.0
21
41
 
@@ -39,19 +59,19 @@
39
59
 
40
60
  ### Fixes
41
61
 
42
- - When use `slug` filter the original values was not saved.
62
+ - When using `slug` filter the original values were not saved.
43
63
 
44
64
  ## v1.1.0
45
65
 
46
66
  ### Features
47
67
 
48
- - Added `slug` filter with option to apply the value on other field.
68
+ - Added `slug` filter with the option to apply the value on other fields.
49
69
 
50
70
  ## v1.0.1
51
71
 
52
72
  ### Fixes
53
73
 
54
- - When `type` options was `cents` and had no decimal on number, extra decimal were added.
74
+ - When `type` options were `cents` and had no decimal on the number, extra decimals were added.
55
75
 
56
76
  ## v1.0.0
57
77
 
@@ -73,7 +93,7 @@
73
93
  ### Updates
74
94
 
75
95
  - `number` filter no more make cast automatically.
76
- - `number` now accept `cast` options with method to be used on cast type;
96
+ - `number` now accept `cast` options with a method to be used on cast type;
77
97
 
78
98
  ### Features
79
99
 
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Normalizy
2
2
 
3
- [![CI](https://github.com/wbotelhos/normalizy/workflows/CI/badge.svg)](https://github.com/wbotelhos/normalizy/actions)
3
+ [![Tests](https://github.com/wbotelhos/normalizy/workflows/Tests/badge.svg)](https://github.com/wbotelhos/normalizy/actions/workflows/tests.yml)
4
4
  [![Gem Version](https://badge.fury.io/rb/normalizy.svg)](https://badge.fury.io/rb/normalizy)
5
- [![Maintainability](https://api.codeclimate.com/v1/badges/f312587b4f126bb13e85/maintainability)](https://codeclimate.com/github/wbotelhos/normalizy/maintainability)
6
- [![Coverage](https://codecov.io/gh/wbotelhos/normalizy/branch/main/graph/badge.svg)](https://codecov.io/gh/wbotelhos/normalizy)
7
- [![Sponsor](https://img.shields.io/badge/sponsor-%3C3-green)](https://www.patreon.com/wbotelhos)
5
+ [![Maintainability](https://qlty.sh/gh/wbotelhos/projects/normalizy/maintainability.svg)](https://qlty.sh/gh/wbotelhos/projects/normalizy)
6
+ [![Coverage](https://codecov.io/gh/wbotelhos/normalizy/branch/master/graph/badge.svg?token=0XTRFDFHDq)](https://codecov.io/gh/wbotelhos/normalizy)
7
+ [![Sponsor](https://img.shields.io/badge/sponsor-%3C3-green)](https://github.com/sponsors/wbotelhos)
8
8
 
9
9
  Attribute normalizer for Rails.
10
10
 
@@ -406,6 +406,17 @@ normalizy :name, with: { strip: { side: :both } }
406
406
 
407
407
  As you can see, the rules can be passed as Symbol/String or as Hash if it has options.
408
408
 
409
+ ### Truncate
410
+
411
+ Remove excedent string part from a gived limit.
412
+
413
+ ```ruby
414
+ normalizy :description, with: { truncate: { limit: 10 } }
415
+
416
+ 'Once upon a time in a world far far away'
417
+ # 'Once upon '
418
+ ```
419
+
409
420
  ## Multiple Filters
410
421
 
411
422
  You can normalize with a couple of filters at once:
@@ -20,7 +20,7 @@ module Normalizy
20
20
  end
21
21
 
22
22
  def initialize
23
- @default_filters = {}
23
+ @default_filters = {}
24
24
  @normalizy_aliases = {}
25
25
 
26
26
  @filters = {
@@ -29,7 +29,8 @@ module Normalizy
29
29
  number: Normalizy::Filters::Number,
30
30
  percent: Normalizy::Filters::Percent,
31
31
  slug: Normalizy::Filters::Slug,
32
- strip: Normalizy::Filters::Strip
32
+ strip: Normalizy::Filters::Strip,
33
+ truncate: Normalizy::Filters::Truncate,
33
34
  }
34
35
  end
35
36
  end
@@ -8,11 +8,11 @@ module Normalizy
8
8
  private
9
9
 
10
10
  def extract_filter(rule, rule_options, attribute, filters: Normalizy.config.filters)
11
- options = rule_options.merge(attribute: attribute, object: self)
11
+ options = rule_options.merge(attribute:, object: self)
12
12
 
13
13
  return [filters[rule] || rule, options] unless rule.is_a?(Hash)
14
14
 
15
- filter = filters[rule.keys.first] || rule
15
+ filter = filters[rule.keys.first] || rule
16
16
  options = (rule.values.first || {}).merge(options)
17
17
 
18
18
  [filter, options]
@@ -58,7 +58,7 @@ module Normalizy
58
58
 
59
59
  unalias_for(rule_name).each do |unaliased_rule|
60
60
  filter, filter_options = extract_filter(unaliased_rule, rule_options, attribute)
61
- result = extract_value(result, filter, filter_options, block)
61
+ result = extract_value(result, filter, filter_options, block)
62
62
  end
63
63
  end
64
64
 
@@ -75,36 +75,38 @@ module Normalizy
75
75
 
76
76
  def normalizy(*args, &block)
77
77
  options = args.extract_options!
78
- rules = options[:with]
78
+ rules = options[:with]
79
79
 
80
80
  self.normalizy_rules ||= {}
81
81
 
82
82
  args.each do |field|
83
83
  normalizy_rules[field] ||= []
84
- normalizy_rules[field] << { block: block, options: options.except(:with), rules: rules }
84
+ normalizy_rules[field] << { block:, options: options.except(:with), rules: }
85
85
  end
86
86
 
87
- prepend Module.new {
88
- args.each do |attribute|
89
- define_method :"#{attribute}=" do |value|
90
- result = normalizy!(
91
- attribute: attribute,
92
- block: block,
93
- options: options.except(:with),
94
- rules: rules,
95
- value: value
96
- )
97
-
98
- if rules.is_a?(Hash) && rules.dig(:slug, :to).present?
99
- write_attribute rules.dig(:slug, :to), result
100
-
101
- super value
102
- else
103
- super result
87
+ prepend(
88
+ Module.new do
89
+ args.each do |attribute|
90
+ define_method :"#{attribute}=" do |value|
91
+ result = normalizy!(
92
+ attribute:,
93
+ block:,
94
+ options: options.except(:with),
95
+ rules:,
96
+ value:
97
+ )
98
+
99
+ if rules.is_a?(Hash) && rules.dig(:slug, :to).present?
100
+ write_attribute rules.dig(:slug, :to), result
101
+
102
+ super(value)
103
+ else
104
+ super(result)
105
+ end
104
106
  end
105
107
  end
106
108
  end
107
- }
109
+ )
108
110
  end
109
111
  end
110
112
  end
@@ -14,11 +14,13 @@ module Normalizy
14
14
  end
15
15
 
16
16
  input = input.beginning_of_day if options[:adjust] == :begin && input.respond_to?(:beginning_of_day)
17
- input = input.end_of_day if options[:adjust] == :end && input.respond_to?(:end_of_day)
17
+ input = input.end_of_day if options[:adjust] == :end && input.respond_to?(:end_of_day)
18
18
 
19
19
  input
20
20
  rescue ArgumentError
21
- options[:object].errors.add options[:attribute], error_message(input, options)
21
+ options[:object].errors.add(options[:attribute], error_message(input, options))
22
+
23
+ nil
22
24
  end
23
25
 
24
26
  private
@@ -8,7 +8,7 @@ module Normalizy
8
8
 
9
9
  value = input.gsub(/\D/, '')
10
10
 
11
- return nil if value.blank?
11
+ return nil if value.blank?
12
12
  return value.send(options[:cast]) if options[:cast]
13
13
 
14
14
  value
@@ -4,7 +4,7 @@ module Normalizy
4
4
  module Filters
5
5
  module Slug
6
6
  class << self
7
- def call(input, options = {})
7
+ def call(input, _options = {})
8
8
  return input unless input.is_a?(String)
9
9
 
10
10
  input.parameterize
@@ -9,10 +9,10 @@ module Normalizy
9
9
  regex = {
10
10
  both: '\A\s*|\s*\z',
11
11
  left: '\A\s*',
12
- right: '\s*\z'
12
+ right: '\s*\z',
13
13
  }[options[:side] || :both]
14
14
 
15
- input.gsub Regexp.new(/#{regex}/), ''
15
+ input.gsub(/#{regex}/, '')
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Normalizy
4
+ module Filters
5
+ module Truncate
6
+ module_function
7
+
8
+ def call(input, options = {})
9
+ return input unless options[:limit].is_a?(Integer)
10
+ return input unless input.is_a?(String)
11
+
12
+ input[0, options[:limit]]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -43,7 +43,7 @@ module Normalizy
43
43
 
44
44
  return false if options.blank?
45
45
 
46
- options = default_rules if options.map { |option| option[:rules] }.compact.blank?
46
+ options = default_rules if options.filter_map { |option| option[:rules] }.blank?
47
47
 
48
48
  return false if options.blank?
49
49
 
@@ -98,6 +98,14 @@ module Normalizy
98
98
  @to.nil? ? :nil : %("#{@to}")
99
99
  end
100
100
 
101
+ def format_hash(hash)
102
+ pairs = hash.map do |k, v|
103
+ "#{k}: #{v.is_a?(Hash) ? format_hash(v) : v.inspect}"
104
+ end
105
+
106
+ "{#{pairs.join(', ')}}"
107
+ end
108
+
101
109
  def with_expected
102
110
  @with
103
111
  end
@@ -105,7 +113,7 @@ module Normalizy
105
113
  def with_value
106
114
  options = @subject.class.normalizy_rules[@attribute]
107
115
 
108
- return :nil if options.nil?
116
+ return :nil if options.nil?
109
117
  return %("#{options}") if options.blank?
110
118
 
111
119
  result = options.map do |option|
@@ -113,7 +121,7 @@ module Normalizy
113
121
 
114
122
  return :nil if rules.nil?
115
123
 
116
- rules.presence || %("#{rules}")
124
+ rules.is_a?(Hash) ? format_hash(rules) : rules.presence || %("#{rules}")
117
125
  end
118
126
 
119
127
  result.join ', '
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Normalizy
4
- VERSION = '1.6.0'
4
+ VERSION = '2.0.0'
5
5
  end
data/lib/normalizy.rb CHANGED
@@ -17,4 +17,4 @@ require 'normalizy/config'
17
17
  require 'normalizy/extensions'
18
18
  require 'normalizy/rspec/matcher'
19
19
 
20
- ActiveRecord::Base.include Normalizy::Extension
20
+ ActiveSupport.on_load(:active_record) { include Normalizy::Extension }
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: normalizy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Washington Botelho
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-03-19 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activerecord
@@ -24,104 +23,6 @@ dependencies:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
25
  version: '4.1'
27
- - !ruby/object:Gem::Dependency
28
- name: codecov
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: pry-byebug
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rspec-rails
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rubocop-performance
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop-rails
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-rspec
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'
111
- - !ruby/object:Gem::Dependency
112
- name: sqlite3
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
26
  description: Attribute normalizer for Rails.
126
27
  email: wbotelhos@gmail.com
127
28
  executables: []
@@ -146,13 +47,14 @@ files:
146
47
  - lib/normalizy/filters/percent.rb
147
48
  - lib/normalizy/filters/slug.rb
148
49
  - lib/normalizy/filters/strip.rb
50
+ - lib/normalizy/filters/truncate.rb
149
51
  - lib/normalizy/rspec/matcher.rb
150
52
  - lib/normalizy/version.rb
151
53
  homepage: https://github.com/wbotelhos/normalizy
152
54
  licenses:
153
55
  - MIT
154
- metadata: {}
155
- post_install_message:
56
+ metadata:
57
+ rubygems_mfa_required: 'true'
156
58
  rdoc_options: []
157
59
  require_paths:
158
60
  - lib
@@ -167,8 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
69
  - !ruby/object:Gem::Version
168
70
  version: '0'
169
71
  requirements: []
170
- rubygems_version: 3.2.22
171
- signing_key:
72
+ rubygems_version: 4.0.12
172
73
  specification_version: 4
173
74
  summary: Attribute normalizer for Rails.
174
75
  test_files: []