iknow_params 2.2.3 → 2.3.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: b89e48380562cd7aa3238e08fbbeb1f947b336eebc3a47582de1ac648da582d0
4
- data.tar.gz: 0d899f1d4a4ce279a9fe50d651769a29c542f9cdd4c7753f8cf9c512b7f47047
3
+ metadata.gz: c54aa3dbf703f1f04fa03e590544353685c0f06164145cba052834c1d55c0930
4
+ data.tar.gz: 6ab10b40f1b8bec45460c00d2bf3a8a5f78d79cc7a4cae4186625f8386c9aeca
5
5
  SHA512:
6
- metadata.gz: c94310c197e1cb3537be0cbd22768e0d557402a11b40c7c692cfc7966d247bfd7455624d54e0f46a41bb049d12db2798c6cb7070a41f168285a10528d5d2d57a
7
- data.tar.gz: 5df5a8a5ebc3cddcb6509faa6ed446ad23265daa5be55f65e1f959f92b554de9388f2ccda020c8dfa226f359b0fa3a39fc16e8453c59be76440e1865b1ab7a12
6
+ metadata.gz: a0b4538a9449e86583e8fa478759c432e66d0157da607a742201205d211121f02c85a93fcc9cdddb887af0257570488c821d814fb4d339968221307a116a5942
7
+ data.tar.gz: fc3d1702617b6694a3849fa4fe707475c9fc672a51e659372307d2175b2b69f481f88fa45e2902e756f3f4da0a02e9229bf14908295924a149fcb77e447eaa01
data/.circleci/config.yml CHANGED
@@ -10,7 +10,7 @@ executors:
10
10
  type: string
11
11
  default: "Gemfile"
12
12
  docker:
13
- - image: circleci/ruby:<< parameters.ruby-version >>
13
+ - image: cimg/ruby:<< parameters.ruby-version >>
14
14
  environment:
15
15
  BUNDLE_JOBS: 3
16
16
  BUNDLE_RETRY: 3
@@ -92,9 +92,13 @@ workflows:
92
92
  ruby-version: "2.6"
93
93
  gemfile: gemfiles/activesupport_5_2.gemfile
94
94
  - test:
95
- name: 'ruby 2.6 ActiveSupport 6.0'
96
- ruby-version: "2.6"
95
+ name: 'ruby 2.7 ActiveSupport 6.0'
96
+ ruby-version: "2.7"
97
97
  gemfile: gemfiles/activesupport_6_0.gemfile
98
+ - test:
99
+ name: 'ruby 3.1 ActiveSupport 7.0'
100
+ ruby-version: "3.1"
101
+ gemfile: gemfiles/activesupport_7_0.gemfile
98
102
  - publish:
99
103
  filters:
100
104
  branches:
data/Appraisals CHANGED
@@ -1,7 +1,14 @@
1
- appraise "activesupport-5-2" do
2
- gem "activesupport", "~> 5.2.0"
1
+ appraise 'activesupport-5-2' do
2
+ gem 'activesupport', '~> 5.2.0'
3
+ gem 'rails', '~> 5.2.0'
3
4
  end
4
5
 
5
- appraise 'activesupport-6-0 do
6
- gem 'activesupport', '~> 6.0.0"
6
+ appraise 'activesupport-6-0' do
7
+ gem 'activesupport', '~> 6.0.0'
8
+ gem 'rails', '~> 6.0.0'
9
+ end
10
+
11
+ appraise 'activesupport-7-0' do
12
+ gem 'activesupport', '~> 7.0.0'
13
+ gem 'rails', '~> 7.0.0'
7
14
  end
@@ -4,5 +4,6 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "rspec_junit_formatter"
6
6
  gem "activesupport", "~> 5.2.0"
7
+ gem "rails", "~> 5.2.0"
7
8
 
8
9
  gemspec path: "../"
@@ -4,5 +4,6 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "rspec_junit_formatter"
6
6
  gem "activesupport", "~> 6.0.0"
7
+ gem "rails", "~> 6.0.0"
7
8
 
8
9
  gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rspec_junit_formatter"
6
+ gem "activesupport", "~> 7.0.0"
7
+ gem "rails", "~> 7.0.0"
8
+
9
+ gemspec path: "../"
data/iknow_params.gemspec CHANGED
@@ -13,22 +13,26 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = "http://github.com/iknow/iknow_params"
14
14
  spec.license = "MIT"
15
15
 
16
+ spec.required_ruby_version = ">= 2.5"
17
+ spec.required_rubygems_version = ">= 2.5"
18
+
16
19
  spec.files = `git ls-files -z`.split("\x0")
17
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
22
  spec.require_paths = ["lib"]
20
23
 
21
- spec.add_development_dependency "bundler", "~> 1.7"
22
- spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "bundler", "~> 2.0"
25
+ spec.add_development_dependency "rake", "~> 12.0"
23
26
  spec.add_development_dependency "rspec", "~> 3.0"
24
27
  spec.add_development_dependency "sqlite3"
25
- spec.add_development_dependency "actionpack", "> 5.0"
26
- spec.add_development_dependency "rails", "> 5.0"
28
+ spec.add_development_dependency "actionpack", "> 5.2.0"
29
+ spec.add_development_dependency "rails", "> 5.2.0"
27
30
 
28
31
  spec.add_development_dependency "byebug"
29
32
  spec.add_development_dependency "appraisal"
33
+ spec.add_development_dependency "tzinfo-data"
30
34
 
31
- spec.add_dependency "activesupport", "> 5.0"
35
+ spec.add_dependency "activesupport", "> 5.2.0"
32
36
  spec.add_dependency "tzinfo"
33
- spec.add_dependency "json-schema", "~> 2.8.0"
37
+ spec.add_dependency "json-schema", "~> 3.0.0"
34
38
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Serialize an array of application types to JSON types. Does not support fully
4
+ # rendering to/from a JSON string.
5
+ class IknowParams::Serializer::ArrayOf < IknowParams::Serializer
6
+ attr_reader :serializer, :allow_singleton
7
+ json_value!
8
+
9
+ def initialize(serializer, allow_singleton: false)
10
+ super(::Array)
11
+ @serializer = serializer
12
+ @allow_singleton = allow_singleton
13
+ end
14
+
15
+ def load(jvals)
16
+ if allow_singleton
17
+ jvals = Array.wrap(jvals)
18
+ else
19
+ unless jvals.is_a?(Array)
20
+ raise IknowParams::Serializer::LoadError.new(
21
+ "Incorrect type for ArrayOf: #{jvals.inspect}:#{jvals.class.name} is not an array")
22
+ end
23
+ end
24
+
25
+ # Special case thanks to Rails' array query param format not differentating
26
+ # empty arrays (i.e. `route?param[]=`). Since we can only express one of
27
+ # empty array and singleton array containing empty string, we pick the more
28
+ # useful former.
29
+ return [] if jvals == ['']
30
+
31
+ jvals.map { |jval| serializer.load(jval) }
32
+ end
33
+
34
+ def dump(vals, json: true)
35
+ matches_type!(vals)
36
+ vals.map { |val| serializer.dump(val, json: json) }
37
+ end
38
+
39
+ def matches_type?(vals)
40
+ super(vals) && vals.all? { |val| serializer.matches_type?(val) }
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Serialize a hash structure of application types to JSON types. Does not
4
+ # support fully rendering to/from a JSON string.
5
+ class IknowParams::Serializer::HashOf < IknowParams::Serializer
6
+ attr_reader :key_serializer, :value_serializer
7
+ json_value!
8
+
9
+ def initialize(key_serializer, value_serializer)
10
+ super(::Hash)
11
+ @key_serializer = key_serializer
12
+ @value_serializer = value_serializer
13
+ end
14
+
15
+ def load(jstructure)
16
+ jstructure = jstructure.to_unsafe_h if jstructure.is_a?(ActionController::Parameters)
17
+
18
+ unless jstructure.is_a?(Hash)
19
+ raise IknowParams::Serializer::LoadError.new(
20
+ "Incorrect type for HashOf: #{jstructure.inspect}:#{jstructure.class.name} is not a hash")
21
+ end
22
+
23
+ jstructure.each_with_object({}) do |(jkey, jvalue), result|
24
+ key = key_serializer.load(jkey)
25
+ value = value_serializer.load(jvalue)
26
+ result[key] = value
27
+ end
28
+ end
29
+
30
+ def dump(structure, json: true)
31
+ matches_type!(structure)
32
+ structure.each_with_object({}) do |(key, value), result|
33
+ jkey = key_serializer.dump(key, json: false)
34
+ jvalue = value_serializer.dump(value, json: json)
35
+ result[jkey] = jvalue
36
+ end
37
+ end
38
+
39
+ def matches_type?(vals)
40
+ super(vals) && vals.all? do |k_val, v_val|
41
+ key_serializer.matches_type?(k_val) && value_serializer.matches_type?(v_val)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Serialize a potentially nil application type to JSON types. Does not support
4
+ # fully rendering to/from a string.
5
+ class IknowParams::Serializer::Nullable < IknowParams::Serializer
6
+ attr_reader :serializer
7
+
8
+ def load(val)
9
+ if val.nil?
10
+ nil
11
+ else
12
+ serializer.load(val)
13
+ end
14
+ end
15
+
16
+ def dump(val, json: false)
17
+ if val.nil?
18
+ nil
19
+ else
20
+ serializer.dump(val, json: json)
21
+ end
22
+ end
23
+
24
+ def matches_type?(val)
25
+ val.nil? || super
26
+ end
27
+
28
+ def json_value?
29
+ true
30
+ end
31
+
32
+ def initialize(serializer)
33
+ @serializer = serializer
34
+ end
35
+ end
@@ -83,6 +83,10 @@ class IknowParams::Serializer
83
83
  end
84
84
  end
85
85
 
86
+ require 'iknow_params/serializer/nullable'
87
+ require 'iknow_params/serializer/array_of'
88
+ require 'iknow_params/serializer/hash_of'
89
+
86
90
  class String < IknowParams::Serializer
87
91
  def initialize
88
92
  super(::String)
@@ -173,6 +177,8 @@ class IknowParams::Serializer
173
177
  # Abstract serializer for ISO8601 dates and times
174
178
  class ISO8601 < IknowParams::Serializer
175
179
  def load(str)
180
+ raise TypeError.new unless str.is_a?(::String)
181
+
176
182
  clazz.parse(str)
177
183
  rescue TypeError, ArgumentError => _e
178
184
  raise LoadError.new("Invalid type for conversion to #{clazz}")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IknowParams
4
- VERSION = '2.2.3'
4
+ VERSION = '2.3.0'
5
5
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'iknow_params'
5
+ require 'rails'
6
+
7
+ RSpec.describe IknowParams::Serializer::ArrayOf do
8
+ let(:subject) { IknowParams::Serializer::ArrayOf.new(IknowParams::Serializer::Date) }
9
+
10
+ let(:serialized_dates) { ['2000-01-01', '2000-01-02'] }
11
+ let(:dates) { serialized_dates.map { |d| Date.parse(d) } }
12
+
13
+ describe '#load' do
14
+ it 'can load correct values' do
15
+ expect(subject.load(serialized_dates)).to eq(dates)
16
+ end
17
+
18
+ it 'raises load error on incorrect type' do
19
+ expect { subject.load(12) }.to raise_error(IknowParams::Serializer::LoadError)
20
+ end
21
+ end
22
+
23
+ describe '#dump' do
24
+ it 'can dump correct values' do
25
+ expect(subject.dump(dates)).to eq(serialized_dates)
26
+ end
27
+
28
+ it 'raises dump error on incorrect type' do
29
+ expect { subject.dump(12) }.to raise_error(IknowParams::Serializer::DumpError)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'iknow_params'
5
+ require 'rails'
6
+
7
+ RSpec.describe IknowParams::Serializer::HashOf do
8
+ let(:subject) { IknowParams::Serializer::HashOf.new(IknowParams::Serializer::Integer, IknowParams::Serializer::Date) }
9
+
10
+ let(:serialized_dates) { { '1' => '2000-01-01', '2' => '2000-01-02' } }
11
+ let(:dates) do
12
+ { 1 => Date.parse('2000-01-01'), 2 => Date.parse('2000-01-02') }
13
+ end
14
+
15
+ describe '#load' do
16
+ it 'can load correct values' do
17
+ expect(subject.load(serialized_dates)).to eq(dates)
18
+ end
19
+
20
+ it 'raises load error on incorrect type' do
21
+ expect { subject.load(12) }.to raise_error(IknowParams::Serializer::LoadError)
22
+ end
23
+ end
24
+
25
+ describe '#dump' do
26
+ it 'can dump correct values' do
27
+ expect(subject.dump(dates)).to eq(serialized_dates)
28
+ end
29
+
30
+ it 'raises dump error on incorrect type' do
31
+ expect { subject.dump(12) }.to raise_error(IknowParams::Serializer::DumpError)
32
+ end
33
+ end
34
+ end
@@ -4,6 +4,7 @@ require 'spec_helper'
4
4
  require 'iknow_params'
5
5
 
6
6
  require 'rails'
7
+ require 'active_support/core_ext'
7
8
  require 'action_controller'
8
9
 
9
10
  RSpec.describe IknowParams::Serializer do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iknow_params
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dev@iknow.jp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-26 00:00:00.000000000 Z
11
+ date: 2022-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '12.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '12.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - ">"
74
74
  - !ruby/object:Gem::Version
75
- version: '5.0'
75
+ version: 5.2.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">"
81
81
  - !ruby/object:Gem::Version
82
- version: '5.0'
82
+ version: 5.2.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rails
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">"
88
88
  - !ruby/object:Gem::Version
89
- version: '5.0'
89
+ version: 5.2.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">"
95
95
  - !ruby/object:Gem::Version
96
- version: '5.0'
96
+ version: 5.2.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: byebug
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +122,34 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tzinfo-data
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: activesupport
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">"
130
144
  - !ruby/object:Gem::Version
131
- version: '5.0'
145
+ version: 5.2.0
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ">"
137
151
  - !ruby/object:Gem::Version
138
- version: '5.0'
152
+ version: 5.2.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: tzinfo
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +170,14 @@ dependencies:
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: 2.8.0
173
+ version: 3.0.0
160
174
  type: :runtime
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
178
  - - "~>"
165
179
  - !ruby/object:Gem::Version
166
- version: 2.8.0
180
+ version: 3.0.0
167
181
  description: ''
168
182
  email:
169
183
  - ''
@@ -174,7 +188,6 @@ files:
174
188
  - ".circleci/config.yml"
175
189
  - ".gitignore"
176
190
  - ".rspec"
177
- - ".travis.yml"
178
191
  - Appraisals
179
192
  - Gemfile
180
193
  - LICENSE.txt
@@ -182,14 +195,20 @@ files:
182
195
  - Rakefile
183
196
  - gemfiles/activesupport_5_2.gemfile
184
197
  - gemfiles/activesupport_6_0.gemfile
198
+ - gemfiles/activesupport_7_0.gemfile
185
199
  - iknow_params.gemspec
186
200
  - lib/iknow_params.rb
187
201
  - lib/iknow_params/parser.rb
188
202
  - lib/iknow_params/parser/hash_parser.rb
189
203
  - lib/iknow_params/serializer.rb
204
+ - lib/iknow_params/serializer/array_of.rb
205
+ - lib/iknow_params/serializer/hash_of.rb
206
+ - lib/iknow_params/serializer/nullable.rb
190
207
  - lib/iknow_params/version.rb
191
208
  - spec/spec_helper.rb
192
209
  - spec/unit/parser_spec.rb
210
+ - spec/unit/serializer/array_of_spec.rb
211
+ - spec/unit/serializer/hash_of_spec.rb
193
212
  - spec/unit/serializer_spec.rb
194
213
  homepage: http://github.com/iknow/iknow_params
195
214
  licenses:
@@ -203,18 +222,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
203
222
  requirements:
204
223
  - - ">="
205
224
  - !ruby/object:Gem::Version
206
- version: '0'
225
+ version: '2.5'
207
226
  required_rubygems_version: !ruby/object:Gem::Requirement
208
227
  requirements:
209
228
  - - ">="
210
229
  - !ruby/object:Gem::Version
211
- version: '0'
230
+ version: '2.5'
212
231
  requirements: []
213
- rubygems_version: 3.0.3
232
+ rubygems_version: 3.3.11
214
233
  signing_key:
215
234
  specification_version: 4
216
235
  summary: Rails parameter parser for iKnow.
217
236
  test_files:
218
237
  - spec/spec_helper.rb
219
238
  - spec/unit/parser_spec.rb
239
+ - spec/unit/serializer/array_of_spec.rb
240
+ - spec/unit/serializer/hash_of_spec.rb
220
241
  - spec/unit/serializer_spec.rb
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- dist: trusty
2
- language: ruby
3
- rvm:
4
- - 2.4
5
- gemfile:
6
- - gemfiles/activesupport_5_2.gemfile
7
- notifications:
8
- email: false