decanter 2.1.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +38 -0
  3. data/.gitignore +5 -0
  4. data/.rspec +2 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +10 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +102 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +232 -0
  11. data/Rakefile +1 -0
  12. data/bin/console +3 -4
  13. data/decanter.gemspec +39 -0
  14. data/lib/decanter.rb +18 -10
  15. data/lib/decanter/base.rb +0 -2
  16. data/lib/decanter/configuration.rb +2 -3
  17. data/lib/decanter/core.rb +136 -126
  18. data/lib/decanter/exceptions.rb +4 -7
  19. data/lib/decanter/extensions.rb +11 -11
  20. data/lib/decanter/parser.rb +13 -5
  21. data/lib/decanter/parser/array_parser.rb +29 -0
  22. data/lib/decanter/parser/base.rb +1 -2
  23. data/lib/decanter/parser/boolean_parser.rb +4 -3
  24. data/lib/decanter/parser/compose_parser.rb +27 -0
  25. data/lib/decanter/parser/core.rb +8 -16
  26. data/lib/decanter/parser/date_parser.rb +6 -7
  27. data/lib/decanter/parser/datetime_parser.rb +15 -0
  28. data/lib/decanter/parser/float_parser.rb +7 -5
  29. data/lib/decanter/parser/hash_parser.rb +6 -9
  30. data/lib/decanter/parser/integer_parser.rb +8 -4
  31. data/lib/decanter/parser/pass_parser.rb +5 -3
  32. data/lib/decanter/parser/phone_parser.rb +3 -3
  33. data/lib/decanter/parser/string_parser.rb +4 -5
  34. data/lib/decanter/parser/utils.rb +1 -3
  35. data/lib/decanter/parser/value_parser.rb +3 -4
  36. data/lib/decanter/railtie.rb +15 -11
  37. data/lib/decanter/version.rb +1 -3
  38. data/lib/generators/decanter/install_generator.rb +3 -5
  39. data/lib/generators/decanter/templates/initializer.rb +1 -4
  40. data/lib/generators/rails/decanter_generator.rb +5 -7
  41. data/lib/generators/rails/parser_generator.rb +3 -5
  42. data/lib/generators/rails/resource_override.rb +0 -2
  43. data/migration-guides/v3.0.0.md +21 -0
  44. metadata +43 -23
  45. data/lib/decanter/decant.rb +0 -11
  46. data/lib/decanter/parser/date_time_parser.rb +0 -21
  47. data/lib/decanter/parser/join_parser.rb +0 -14
  48. data/lib/decanter/parser/key_value_splitter_parser.rb +0 -18
  49. data/lib/decanter/parser/time_parser.rb +0 -19
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Decanter
4
- VERSION = '2.1.2'.freeze
2
+ VERSION = '3.0.0'.freeze
5
3
  end
@@ -1,14 +1,12 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Decanter
4
2
  module Generators
5
3
  class InstallGenerator < Rails::Generators::Base
6
- source_root File.expand_path('templates', __dir__)
4
+ source_root File.expand_path('../templates', __FILE__)
7
5
 
8
- desc 'Creates a Decanter initializer in your application.'
6
+ desc "Creates a Decanter initializer in your application."
9
7
 
10
8
  def copy_initializer
11
- copy_file 'initializer.rb', 'config/initializers/decanter.rb'
9
+ copy_file "initializer.rb", "config/initializers/decanter.rb"
12
10
  end
13
11
  end
14
12
  end
@@ -1,6 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  Decanter.config do |config|
4
- # Possible values are :with_exception, true or false
5
- config.strict = :with_exception
2
+ config.strict = true
6
3
  end
@@ -1,15 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Rails
4
2
  module Generators
5
3
  class DecanterGenerator < NamedBase
6
- source_root File.expand_path('templates', __dir__)
7
- check_class_collision suffix: 'Decanter'
8
- ASSOCIATION_TYPES = %i(has_many has_one belongs_to).freeze
4
+ source_root File.expand_path('../templates', __FILE__)
5
+ check_class_collision :suffix => 'Decanter'
6
+ ASSOCIATION_TYPES = [:has_many, :has_one, :belongs_to]
9
7
 
10
- argument :attributes, type: :array, default: [], banner: 'field:type field:type'
8
+ argument :attributes, :type => :array, :default => [], :banner => 'field:type field:type'
11
9
 
12
- class_option :parent, type: :string, desc: 'The parent class for the generated decanter'
10
+ class_option :parent, :type => :string, :desc => 'The parent class for the generated decanter'
13
11
 
14
12
  def create_decanter_file
15
13
  template 'decanter.rb.erb', File.join('app/decanters', class_path, "#{file_name}_decanter.rb")
@@ -1,12 +1,10 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Rails
4
2
  module Generators
5
3
  class ParserGenerator < NamedBase
6
- source_root File.expand_path('templates', __dir__)
7
- check_class_collision suffix: 'Parser'
4
+ source_root File.expand_path('../templates', __FILE__)
5
+ check_class_collision :suffix => 'Parser'
8
6
 
9
- class_option :parent, type: :string, desc: 'The parent class for the generated parser'
7
+ class_option :parent, :type => :string, :desc => 'The parent class for the generated parser'
10
8
 
11
9
  def create_parser_file
12
10
  template 'parser.rb.erb', File.join('lib/decanter/parsers', class_path, "#{file_name}_parser.rb")
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'rails/generators'
4
2
  require 'rails/generators/rails/resource/resource_generator'
5
3
 
@@ -0,0 +1,21 @@
1
+ # v3.0.0 Migration Guide
2
+
3
+ _Note: this guide assumes you are upgrading from decanter v1 to v3. In order to migrate from v2, please downgrade to v1 first._
4
+
5
+ This version contains the following breaking changes:
6
+
7
+ 1. `strict true` mode will now raise exceptions for unhandled keys.
8
+
9
+ `strict true` previously displayed warnings rather than raising exceptions. To adapt to the new behavior, replace all instances of `strict true` in your app with `strict false`, and replace all instances of `strict :with_exception` to `strict true`.
10
+
11
+ 2. `JoinParser` and `KeyValueSplitterParser` default parsers have been removed.
12
+
13
+ If you use these parsers in your project, you should include them as custom parsers. Their source code is available on the `v1` branch.
14
+
15
+ 3. All default parsers (except for `ArrayParser`) now strictly require a single value.
16
+
17
+ Default parsers will now raise an exception when passed an array of values. For instance, an attribute declared with `input <name>, :string` will expect to receive a single string rather than an array of strings. Previously, default parsers handled arrays of values in unstable and undocumented ways. In the (unlikely) event that your project was relying on the previous behavior, you can include the legacy version(s) of the parsers as custom parsers in your project.
18
+
19
+ 4. Decanter exceptions have been renamed from `Decanter::Core::<Exception>` to `Decanter::<Exception>`.
20
+
21
+ If your project relies on specific decanter exception names, make sure to rename those instances accordingly.
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decanter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Francis
8
8
  - David Corwin
9
9
  autorequire:
10
- bindir: bin
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2020-01-27 00:00:00.000000000 Z
12
+ date: 2020-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -55,6 +55,20 @@ dependencies:
55
55
  version: 1.0.4
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.9'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.9'
70
+ - !ruby/object:Gem::Dependency
71
+ name: dotenv
58
72
  requirement: !ruby/object:Gem::Requirement
59
73
  requirements:
60
74
  - - ">="
@@ -71,16 +85,16 @@ dependencies:
71
85
  name: rake
72
86
  requirement: !ruby/object:Gem::Requirement
73
87
  requirements:
74
- - - ">="
88
+ - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: '0'
90
+ version: '10.0'
77
91
  type: :development
78
92
  prerelease: false
79
93
  version_requirements: !ruby/object:Gem::Requirement
80
94
  requirements:
81
- - - ">="
95
+ - - "~>"
82
96
  - !ruby/object:Gem::Version
83
- version: '0'
97
+ version: '10.0'
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: rspec-rails
86
100
  requirement: !ruby/object:Gem::Requirement
@@ -99,50 +113,57 @@ dependencies:
99
113
  name: simplecov
100
114
  requirement: !ruby/object:Gem::Requirement
101
115
  requirements:
102
- - - ">="
116
+ - - "~>"
103
117
  - !ruby/object:Gem::Version
104
- version: '0'
118
+ version: 0.15.1
105
119
  type: :development
106
120
  prerelease: false
107
121
  version_requirements: !ruby/object:Gem::Requirement
108
122
  requirements:
109
- - - ">="
123
+ - - "~>"
110
124
  - !ruby/object:Gem::Version
111
- version: '0'
125
+ version: 0.15.1
112
126
  description: Decanter aims to reduce complexity in Rails controllers by creating a
113
127
  place for transforming data before it hits the model and database.
114
128
  email:
115
129
  - ryan@launchpadlab.com
116
- executables:
117
- - console
118
- - setup
130
+ executables: []
119
131
  extensions: []
120
132
  extra_rdoc_files: []
121
133
  files:
134
+ - ".codeclimate.yml"
135
+ - ".gitignore"
136
+ - ".rspec"
137
+ - ".ruby-version"
138
+ - ".travis.yml"
139
+ - Gemfile
140
+ - Gemfile.lock
141
+ - LICENSE.txt
142
+ - README.md
143
+ - Rakefile
122
144
  - bin/console
123
145
  - bin/setup
146
+ - decanter.gemspec
124
147
  - lib/decanter.rb
125
148
  - lib/decanter/base.rb
126
149
  - lib/decanter/configuration.rb
127
150
  - lib/decanter/core.rb
128
- - lib/decanter/decant.rb
129
151
  - lib/decanter/exceptions.rb
130
152
  - lib/decanter/extensions.rb
131
153
  - lib/decanter/parser.rb
154
+ - lib/decanter/parser/array_parser.rb
132
155
  - lib/decanter/parser/base.rb
133
156
  - lib/decanter/parser/boolean_parser.rb
157
+ - lib/decanter/parser/compose_parser.rb
134
158
  - lib/decanter/parser/core.rb
135
159
  - lib/decanter/parser/date_parser.rb
136
- - lib/decanter/parser/date_time_parser.rb
160
+ - lib/decanter/parser/datetime_parser.rb
137
161
  - lib/decanter/parser/float_parser.rb
138
162
  - lib/decanter/parser/hash_parser.rb
139
163
  - lib/decanter/parser/integer_parser.rb
140
- - lib/decanter/parser/join_parser.rb
141
- - lib/decanter/parser/key_value_splitter_parser.rb
142
164
  - lib/decanter/parser/pass_parser.rb
143
165
  - lib/decanter/parser/phone_parser.rb
144
166
  - lib/decanter/parser/string_parser.rb
145
- - lib/decanter/parser/time_parser.rb
146
167
  - lib/decanter/parser/utils.rb
147
168
  - lib/decanter/parser/value_parser.rb
148
169
  - lib/decanter/railtie.rb
@@ -154,13 +175,13 @@ files:
154
175
  - lib/generators/rails/resource_override.rb
155
176
  - lib/generators/rails/templates/decanter.rb.erb
156
177
  - lib/generators/rails/templates/parser.rb.erb
178
+ - migration-guides/v3.0.0.md
157
179
  homepage: https://github.com/launchpadlab/decanter
158
180
  licenses:
159
181
  - MIT
160
182
  metadata:
161
183
  allowed_push_host: https://rubygems.org
162
- post_install_message: 'WARNING: Decanter 2.x is unstable and not recommended for production
163
- use. Please use another major version of this gem.'
184
+ post_install_message:
164
185
  rdoc_options: []
165
186
  require_paths:
166
187
  - lib
@@ -175,8 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
196
  - !ruby/object:Gem::Version
176
197
  version: '0'
177
198
  requirements: []
178
- rubyforge_project:
179
- rubygems_version: 2.7.6
199
+ rubygems_version: 3.0.3
180
200
  signing_key:
181
201
  specification_version: 4
182
202
  summary: Form Parser for Rails
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decanter
4
- module Decant
5
- extend ActiveSupport::Concern
6
-
7
- def decant(decanter, params)
8
- Decanter.decanter_for(decanter).decant(params)
9
- end
10
- end
11
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decanter
4
- module Parser
5
- # rubocop:disable Style/DateTime
6
- class DateTimeParser < ValueParser
7
- allow DateTime
8
-
9
- parser do |val, options|
10
- if val.is_a?(Time)
11
- val.to_datetime
12
- elsif (parse_format = options[:parse_format])
13
- ::DateTime.strptime(val, parse_format)
14
- else
15
- ::DateTime.parse(val)
16
- end
17
- end
18
- end
19
- # rubocop:enable Style/DateTime
20
- end
21
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decanter
4
- module Parser
5
- class JoinParser < ValueParser
6
- ITEM_DELIM = ','
7
-
8
- parser do |val, options|
9
- delimiter = options.fetch(:delimiter, ITEM_DELIM)
10
- val.join(delimiter)
11
- end
12
- end
13
- end
14
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decanter
4
- module Parser
5
- class KeyValueSplitterParser < HashParser
6
- ITEM_DELIM = ','
7
- PAIR_DELIM = ':'
8
-
9
- parser do |val, options|
10
- item_delimiter = options.fetch(:item_delimiter, ITEM_DELIM)
11
- pair_delimiter = options.fetch(:pair_delimiter, PAIR_DELIM)
12
- val.split(item_delimiter).reduce({}) do |memo, pair|
13
- memo.merge(Hash[*pair.split(pair_delimiter)])
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decanter
4
- module Parser
5
- class TimeParser < ValueParser
6
- allow Time
7
-
8
- parser do |val, options|
9
- if val.is_a?(DateTime)
10
- val.to_time
11
- elsif (parse_format = options[:parse_format])
12
- ::Time.strptime(val, parse_format)
13
- else
14
- ::Time.parse(val)
15
- end
16
- end
17
- end
18
- end
19
- end