typed-parameter 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +228 -7
  4. data/lib/typed_parameter/base.rb +46 -21
  5. data/lib/typed_parameter/boolean.rb +2 -6
  6. data/lib/typed_parameter/constraints/base.rb +11 -0
  7. data/lib/typed_parameter/constraints/boolean_constraint.rb +15 -0
  8. data/lib/typed_parameter/constraints/date_constraint.rb +11 -0
  9. data/lib/typed_parameter/constraints/date_time_constraint.rb +11 -0
  10. data/lib/typed_parameter/constraints/float_constraint.rb +11 -0
  11. data/lib/typed_parameter/constraints/integer_constraint.rb +11 -0
  12. data/lib/typed_parameter/constraints/string_constraint.rb +11 -0
  13. data/lib/typed_parameter/constraints.rb +21 -41
  14. data/lib/typed_parameter/enum_constraint.rb +13 -3
  15. data/lib/typed_parameter/errors.rb +9 -0
  16. data/lib/typed_parameter/parameter_types.rb +18 -3
  17. data/lib/typed_parameter/permit_field_generator.rb +8 -8
  18. data/lib/typed_parameter/swagger/component_generator.rb +9 -1
  19. data/lib/typed_parameter/swagger/type_generator.rb +3 -6
  20. data/lib/typed_parameter/swagger/types/base.rb +13 -0
  21. data/lib/typed_parameter/swagger/types/boolean_type.rb +13 -0
  22. data/lib/typed_parameter/swagger/types/date_time_type.rb +13 -0
  23. data/lib/typed_parameter/swagger/types/date_type.rb +13 -0
  24. data/lib/typed_parameter/swagger/types/float_type.rb +13 -0
  25. data/lib/typed_parameter/swagger/types/integer_type.rb +13 -0
  26. data/lib/typed_parameter/swagger/types/string_type.rb +13 -0
  27. data/lib/typed_parameter/swagger/types.rb +22 -36
  28. data/lib/typed_parameter/type_constraint.rb +6 -6
  29. data/lib/typed_parameter/version.rb +1 -1
  30. data/lib/typed_parameter.rb +4 -4
  31. data/typed_parameter.gemspec +1 -1
  32. metadata +22 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e0f46ef3693b82ba2c85964aba75468b69971855dbe6cff28e8b6c7c66d2f74
4
- data.tar.gz: 2a3d91c2d8d229bb89336bd891db8169494619d996f6ec2553a14ffc213733b6
3
+ metadata.gz: ff83851eec45e830cd251fa2a886722d6968373ce94f3a84eef45b47b3c67351
4
+ data.tar.gz: 47f08d63b04dad171ff357ca3ce31433d586bd5da1adc95560395783e687a80b
5
5
  SHA512:
6
- metadata.gz: 798e72cc8eefdd41e684ab5e9df6c0513a4bdaed0559136e8c0839a51113e2c696f229d751dbae83f664d7a642e5cb6d1df7ab3fa5a9bae00ac4dbc976d11a1b
7
- data.tar.gz: a1d9565b84129234acf6cb683c10762751b62b2de77e4dc15842c71e413881e0d4c5e6d3ddaef9d4f3cd8a877de8a68cb3deb677079f54af838796d2c62aa17d
6
+ metadata.gz: c3ceb0d67668c8f4b02a3269c450c9800b9c63821b1904d14992b50d06475bc911b0bb6b5b3a5fe7d26db97aa03e164fe877ec533058c7426eea520027e90d6f
7
+ data.tar.gz: c505148ce9101eebf71c145f000abd8e45aa6501c4832cc39e03d43b0a734890d70cdf53a13226c8653ba4bee847d566672d4f139075d003b046a944b6fa54a4
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ - 2021-03-06
2
+ -
3
+ - Release TypedParameter
data/README.md CHANGED
@@ -1,9 +1,6 @@
1
- # TypedParameter
2
-
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/typed-parameter`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
6
-
1
+ # typed_parameter
2
+ Create typed parameter class using strong paramter in rails.
3
+ You can cleanup parameter code for permit in your controller and convert it to the type you want.
7
4
  ## Installation
8
5
 
9
6
  Add this line to your application's Gemfile:
@@ -22,7 +19,231 @@ Or install it yourself as:
22
19
 
23
20
  ## Usage
24
21
 
25
- TODO: Write usage instructions here
22
+ Example 1. Type convert
23
+ -----
24
+ ~~~ruby
25
+ class UserCreateParams < TypedParamter::Base
26
+ field :name, String
27
+ field :age, Integer
28
+ field :email, String
29
+ end
30
+ -----------------------------------------------
31
+ ############
32
+ ## before ##
33
+ ############
34
+ # method for params
35
+ def user_create_params
36
+ params.permit(:name, :age, :email)
37
+ end
38
+
39
+ # in action
40
+ def create
41
+ raise UserAgeTooYoung if user_create_params[:age].to_i < 20
42
+ # You need to convert your parameter type
43
+ end
44
+
45
+ ############
46
+ ## after ###
47
+ ############
48
+ # method for params
49
+ def user_create_params
50
+ UserCreateParams.permit(params)
51
+ end
52
+
53
+ # in action
54
+ def create
55
+ raise UserAgeTooYoung if user_create_params[:age] < 20
56
+ # paramters are converted as your type
57
+ end
58
+ ~~~
59
+
60
+
61
+ Example 2. More Types
62
+ ------
63
+ ~~~ruby
64
+ class CustomParameter < TypedParameter::Base
65
+ field :string_field, String
66
+ field :integer_field, Integer
67
+ field :float_field, Float
68
+ field :date_field, Date
69
+ field :datetime_field, DateTime
70
+ field :boolean_field, Boolean
71
+ end
72
+
73
+ ############
74
+ ## before ##
75
+ ############
76
+ def custom_params
77
+ params.permit(
78
+ :string_field, # => is_a? String
79
+ :integer_field, # => is_a? String. You need to &:to_i
80
+ :fload_field, # => is_a? String. You need to &:to_f
81
+ :date_field, # => is_a? String. You need to &:to_date
82
+ :datetime_field # => is_a? String. You need to &:to_datetime
83
+ :boolean_field # => is_a? Boolean. If paramter is string (like "false") then String
84
+ )
85
+ end
86
+
87
+ ############
88
+ ## after ##
89
+ ############
90
+ def custom_params
91
+ CustomParamter.permit(params)
92
+ end
93
+
94
+ custom_params[:string_field] # => is_a? String
95
+ custom_params[:integer_field] # => is_a? Integer
96
+ custom_params[:float_field] # => is_a? Float
97
+ custom_params[:date_field] # => is_a? Date
98
+ custom_params[:datetime_field] # => is_a? DateTime
99
+ custom_params[:boolean] # => is_a? Boolean, If parameter is string (like "false", "true" "False", "True") then convert true or false
100
+ ~~~
101
+
102
+ Example 3. Enum & Required
103
+ ---
104
+ ~~~ruby
105
+ class EnumAndRequiredParameter < TypedParameter::base
106
+ field :enum_field, Integer, enum: [10, 20, 30, 40]
107
+ field :required_field, String, required: true
108
+ end
109
+
110
+ def enum_and_required_params
111
+ EnumAndRequiredParameter.permit(params)
112
+ end
113
+
114
+ # If params[:enum_field] has 25 ( not in 10, 20, 30, 40)
115
+ # => ArgumentError, "enum_field must be in 10, 20, 30, 40"
116
+
117
+ # if params[:required_field] is Nil
118
+ # => ArgumentError, "required_field is required"
119
+ ~~~
120
+
121
+ Example 4. array & nested parameters
122
+ ---
123
+ ~~~ruby
124
+ class ParentParameter < TypedParameter::Base
125
+ field :name, String
126
+ field :integers, [Integer]
127
+ field :child, ChildParameter
128
+ field :childs, [ChildParamter]
129
+ end
130
+
131
+ class ChildParameter < TypedParameter::Base
132
+ field :name, String
133
+ end
134
+
135
+
136
+ example_params = {
137
+ name: "Name",
138
+ integers: ['1','2','3','4'],
139
+ child: { name: "child" },
140
+ childs: [
141
+ { name: "child1", age: "10" },
142
+ { name: "child2", age: "12" },
143
+ { name: "child3", age: "15" }
144
+ ]
145
+ }
146
+
147
+ def parent_and_childs_params
148
+ ParentParameter.permit(example_params)
149
+ end
150
+
151
+ # Result
152
+ {
153
+ name: "Name",
154
+ integers: [1,2,3,4],
155
+ child: { name: "child" },
156
+ childs: [
157
+ { name: "child1" },
158
+ { name: "child2" },
159
+ { name: "child3" }
160
+ ]
161
+ }
162
+
163
+ ~~~
164
+ Example 4. CustomType
165
+ ------
166
+ If You want to use your custom type like Email, just create two file.
167
+ - your type file. like "Email"
168
+ - yout type constant. like "EmailConstrant"
169
+
170
+ ~~~ruby
171
+ class Email
172
+ def initialize(value)
173
+ @email = value
174
+ end
175
+ end
176
+
177
+ class EmailConstrant
178
+ class << self
179
+ EMAIL_REGREX = //
180
+
181
+ # using convert value to your type
182
+ def value(value)
183
+ raise ArgumentError unless EMAIL_REGREX.match? value
184
+
185
+ Email.new(value)
186
+ end
187
+ end
188
+ end
189
+
190
+ class EmailSwaggerType
191
+ class << self
192
+ def value
193
+ { type: :string }
194
+ end
195
+ end
196
+ end
197
+
198
+ # Register your type to typed-parameter when application initialize.
199
+ TypedParameter::ParameterTypes.register Email
200
+ TypedParameter::Constants.register :Email, EmailConstrant
201
+ TypedParameter::Swagger::Types.register :Email, EmailSwaggerType
202
+ ~~~
203
+
204
+ Example 5. Swaggerize
205
+ ------
206
+ With Rswag(https://github.com/rswag/rswag), you can swaggerize your parameter types.
207
+
208
+ ~~~ruby
209
+ class SwaggerParameter < TypedParameter::Base
210
+ field :string, String, enum: ["one", "two"], description: "String Field"
211
+ field :integer, Integer, description: "Integer Field"
212
+ field :ref_field, SwaggerRefParameter
213
+ end
214
+
215
+ class SwaggerRefParameter < TypedParameter::Base
216
+ field :string, String, description: "Ref String Field"
217
+ end
218
+
219
+ SwaggerParameter.swagger_properties
220
+ # =>
221
+ # {
222
+ # string: { type: :string, enum: ["one", "two" ], description: "String Field" },
223
+ # integer: { type: :integer, description: "Integer Field" },
224
+ # ref_field: { "$ref": "#/components/schemas/SwaggerRefParamter" }
225
+ # }
226
+ #
227
+
228
+ # Add Components in your swagger
229
+ # in swagger_helper
230
+ components = TypedParameter::Swagger::ComponentGenerator.generate_all!
231
+
232
+ config.swagger_docs = {
233
+ 'v1/swagger.yaml' => {
234
+ openapi: '3.0.1',
235
+ # ...,
236
+ components: {
237
+ schemas: {
238
+ **components
239
+ }
240
+ }
241
+ #...
242
+ }
243
+ }
244
+ ~~~
245
+ ...
246
+
26
247
 
27
248
  ## Development
28
249
 
@@ -2,25 +2,46 @@ module TypedParameter
2
2
  class Base
3
3
  class << self
4
4
  def field(name, type, **kargs)
5
- initialize_permitted_fields(name, type)
6
- initialize_swagger_properties(name, type, kargs)
7
- initialize_constraints(name, type, kargs)
8
- end
5
+ if block_given?
6
+ raise Error::InvalidBlockParameter unless [type].flatten[0].in?([Hash, Object])
7
+
8
+ block_param_name = "#{self.to_s}_Partial_#{name.to_s.camelize}"
9
+ class_eval("class ::#{block_param_name} < ::TypedParameter::Base; end")
10
+ block_param = block_param_name.constantize
11
+ yield(block_param)
12
+
13
+ if type.is_a?(Array)
14
+ target = [block_param]
15
+ else
16
+ target = block_param
17
+ end
18
+ else
19
+ target = type
20
+ end
9
21
 
10
- def permit(params)
11
- raise ArgumentError unless params.class <= ActionController::Parameters
12
22
 
13
- use_constraints params.permit(fields)
23
+ initialize_constraints(name, target, kargs)
24
+ initialize_swagger_properties(name, target, kargs)
14
25
  end
15
26
 
16
- def fields
17
- __fields.freeze
27
+ def permit(params)
28
+ raise Error::ParameterError unless params.class <= ActionController::Parameters
29
+
30
+ use_constraints(params).permit!
18
31
  end
19
32
 
20
33
  def swagger_properties
21
34
  __swagger_properties.freeze
22
35
  end
23
36
 
37
+ def swagger_requirements
38
+ __swagger_requirements.freeze
39
+ end
40
+
41
+ def constraints
42
+ __constraints.freeze
43
+ end
44
+
24
45
  alias key name
25
46
 
26
47
  def ref
@@ -31,41 +52,45 @@ module TypedParameter
31
52
 
32
53
  def initialize_swagger_properties(name, type, kargs)
33
54
  swagger_type = TypedParameter::Swagger::TypeGenerator.generate(type)
34
- swagger_options = swagger_type.merge(kargs)
55
+ swagger_options = swagger_type.merge(kargs.slice(:enum, :description))
35
56
  __swagger_properties[name] = swagger_options
36
- end
37
-
38
- def initialize_permitted_fields(name, type)
39
- __fields << PermitFieldGenerator.generate(name, type)
57
+ __swagger_requirements << name if kargs[:required]
40
58
  end
41
59
 
42
60
  def initialize_constraints(name, type, kargs)
43
61
  options = kargs.slice(:enum, :required)
44
-
62
+ options[:enum] = options[:enum].map(&:to_s) if options[:enum]
45
63
  __constraints << [name, type, options]
46
64
  end
47
65
 
48
66
  def use_constraints(params)
67
+ typed_params = ActionController::Parameters.new
68
+
49
69
  __constraints.each do |name, type, options|
50
70
  value = params[name]
51
- raise ArgumentError, "(#{self.name}) #{name} is required" if options[:required] && !value.present?
71
+ raise Error::RequiredFieldError, "(#{self.name}) #{name} is required" if options[:required] && empty_value?(value)
72
+
52
73
  next unless value.present?
53
74
 
54
- params[name] = TypeConstraint.value(type, value)
55
- params[name] = EnumConstraint.value(value, options[:enum]) if options[:enum]
75
+ typed_params[name] = TypeConstraint.value(type, value)
76
+ typed_params[name] = EnumConstraint.value(value, options[:enum]) if options[:enum]
56
77
  end
57
78
 
58
- params
79
+ typed_params
59
80
  end
60
81
 
61
- def __fields
62
- @__fields ||= []
82
+ def empty_value?(value)
83
+ value.nil? || value == '' || (value.is_a?(Array) && value.empty?)
63
84
  end
64
85
 
65
86
  def __constraints
66
87
  @__constraints ||= []
67
88
  end
68
89
 
90
+ def __swagger_requirements
91
+ @__swagger_requirements ||= []
92
+ end
93
+
69
94
  def __swagger_properties
70
95
  @__swagger_properties ||= {}
71
96
  end
@@ -4,16 +4,12 @@ class Boolean; end
4
4
 
5
5
  class TrueClass
6
6
  def is_a?(type)
7
- return true if type == Boolean
8
-
9
- super(type)
7
+ type == Boolean || super(type)
10
8
  end
11
9
  end
12
10
 
13
11
  class FalseClass
14
12
  def is_a?(type)
15
- return true if type == Boolean
16
-
17
- super(type)
13
+ type == Boolean || super(type)
18
14
  end
19
15
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class Base
6
+ def self.value(value)
7
+ raise NotImplementedError, "need to implement"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class BooleanConstraint < Base
6
+ TRUE_VALUES = [true, 'true', '1', 1].freeze
7
+ FALSE_VALUES = [false, 'false', '0', 0].freeze
8
+
9
+ def self.value(value)
10
+ return true if TRUE_VALUES.include?(value)
11
+ return false if FALSE_VALUES.include?(value)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class DateConstraint < Base
6
+ def self.value(value)
7
+ value.to_time.to_date
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class DateTimeConstraint < Base
6
+ def self.value(value)
7
+ value.to_time.to_datetime
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class FloatConstraint < Base
6
+ def self.value(value)
7
+ value.to_f
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class IntegerConstraint < Base
6
+ def self.value(value)
7
+ value.to_i
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Constraints
5
+ class StringConstraint < Base
6
+ def self.value(value)
7
+ value.to_s
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,49 +1,29 @@
1
- # frozen_string_literal: true
1
+ require 'typed_parameter/constraints/base'
2
+ require 'typed_parameter/constraints/integer_constraint'
3
+ require 'typed_parameter/constraints/float_constraint'
4
+ require 'typed_parameter/constraints/string_constraint'
5
+ require 'typed_parameter/constraints/date_constraint'
6
+ require 'typed_parameter/constraints/date_time_constraint'
7
+ require 'typed_parameter/constraints/boolean_constraint'
2
8
 
3
9
  module TypedParameter
4
- class Constraints
5
- def self.value(_v)
6
- nil
7
- end
8
-
9
- class IntegerConstraint < self
10
- def self.value(value)
11
- value.to_i
10
+ module Constraints
11
+ class << self
12
+ def register(key, constraint)
13
+ @constraints ||= {}
14
+ @constraints[key] = constraint
12
15
  end
13
- end
14
16
 
15
- class FloatConstraint < self
16
- def self.value(value)
17
- value.to_f
18
- end
19
- end
20
-
21
- class StringConstraint < self
22
- def self.value(value)
23
- value.to_s
24
- end
25
- end
26
-
27
- class BooleanConstraint < self
28
- TRUE_VALUES = [true, 'true', '1', 1].freeze
29
- FALSE_VALUES = [false, 'false', '0', 0].freeze
30
-
31
- def self.value(value)
32
- return true if TRUE_VALUES.include?(value)
33
- return false if FALSE_VALUES.include?(value)
34
- end
35
- end
36
-
37
- class DateConstraint < self
38
- def self.value(value)
39
- value.to_date
40
- end
41
- end
42
-
43
- class DateTimeConstraint < self
44
- def self.value(value)
45
- value.to_datetime
17
+ def [](name)
18
+ @constraints[name].freeze
46
19
  end
47
20
  end
48
21
  end
49
22
  end
23
+
24
+ TypedParameter::Constraints.register :Integer, TypedParameter::Constraints::IntegerConstraint
25
+ TypedParameter::Constraints.register :String, TypedParameter::Constraints::StringConstraint
26
+ TypedParameter::Constraints.register :Float, TypedParameter::Constraints::FloatConstraint
27
+ TypedParameter::Constraints.register :Date, TypedParameter::Constraints::DateConstraint
28
+ TypedParameter::Constraints.register :DateTime, TypedParameter::Constraints::DateTimeConstraint
29
+ TypedParameter::Constraints.register :Boolean, TypedParameter::Constraints::BooleanConstraint
@@ -1,10 +1,20 @@
1
1
  module TypedParameter
2
2
  module EnumConstraint
3
3
  def self.value(value, enums)
4
- enums = enums.map(&:to_s) if value.is_a? String
5
- raise ArgumentError, "#{value} must be in #{enums.join(', ')}" unless value.in? enums
4
+ return array_value(value, enums) if value.is_a? Array
5
+ return value if value.to_s.in? enums
6
6
 
7
- value
7
+ raise EnumFieldError, "#{value} must be in #{enums.join(', ')}"
8
+ end
9
+
10
+ def self.array_value(values, enums)
11
+ values.each do |value|
12
+ next if value.to_s.in? enums
13
+
14
+ raise EnumFieldError, "#{value} must be in #{enums.join(', ')}"
15
+ end
16
+
17
+ values
8
18
  end
9
19
  end
10
20
  end
@@ -0,0 +1,9 @@
1
+ module TypedParameter
2
+ class Error < StandardError; end
3
+
4
+ class RequiredFieldError < Error; end
5
+
6
+ class EnumFieldError < Error; end
7
+
8
+ class InvalidBlockParameter < Error; end
9
+ end
@@ -1,6 +1,21 @@
1
1
  module TypedParameter
2
2
  module ParameterTypes
3
- BASE_TYPES = [Integer, Float, String, Date, DateTime, Boolean].freeze
4
- CUSTOM_TYPES = [].freeze
3
+ class << self
4
+ def register(type)
5
+ @types ||= []
6
+ @types << type
7
+ end
8
+
9
+ def types
10
+ @types.freeze
11
+ end
12
+ end
5
13
  end
6
- end
14
+ end
15
+
16
+ TypedParameter::ParameterTypes.register Integer
17
+ TypedParameter::ParameterTypes.register String
18
+ TypedParameter::ParameterTypes.register Float
19
+ TypedParameter::ParameterTypes.register Date
20
+ TypedParameter::ParameterTypes.register DateTime
21
+ TypedParameter::ParameterTypes.register Boolean
@@ -1,20 +1,20 @@
1
1
  module TypedParameter
2
2
  module PermitFieldGenerator
3
3
  class << self
4
- BASE_TYPES = TypedParameter::ParameterTypes::BASE_TYPES
5
-
6
4
  def generate(name, type)
7
- props = generate_properties(type)
5
+ type_class = [type].flatten.first
8
6
 
9
- props = [] if type.is_a?(Array) && type[0].in?(BASE_TYPES)
10
- return name unless props
7
+ props = if type.is_a? Array
8
+ type_class.in?(TypedParameter::ParameterTypes.types) ? [] : generate_properties(type_class)
9
+ else
10
+ generate_properties(type_class)
11
+ end
11
12
 
12
- [[name, props]].to_h
13
+ props ? [[name, props]].to_h : name
13
14
  end
14
15
 
15
16
  def generate_properties(type)
16
- return if type.in? BASE_TYPES
17
- return generate_properties(type[0]) if type.is_a? Array
17
+ return if type.in? TypedParameter::ParameterTypes.types
18
18
  return type.keys if type.is_a? Hash
19
19
 
20
20
  type.fields
@@ -6,7 +6,15 @@ module TypedParameter
6
6
  key = parameter_class.key
7
7
  properties = Swagger::PropertyGenerator.generate(parameter_class.swagger_properties)
8
8
 
9
- { "#{key}": { type: :object, properties: properties } }
9
+ swagger = { type: :object, properties: properties }
10
+ swagger[:required] = parameter_class.swagger_requirements if parameter_class.swagger_requirements.present?
11
+ { "#{key}": swagger }
12
+ end
13
+
14
+ def generate_all!
15
+ parameter_classes = TypedParameter::Base.descendants.reject { |c| c.swagger_properties.empty? }
16
+
17
+ parameter_classes.reduce({}) { |prev, curr| prev.merge(generate(curr)) }
10
18
  end
11
19
  end
12
20
  end
@@ -2,15 +2,12 @@ module TypedParameter
2
2
  module Swagger
3
3
  module TypeGenerator
4
4
  class << self
5
- BASE_TYPES = TypedParameter::ParameterTypes::BASE_TYPES
6
- CUSTOM_TYPES = TypedParameter::ParameterTypes::CUSTOM_TYPES
7
-
8
5
  def generate(type)
9
6
  return array_generate(type) if type.is_a? Array
10
7
  return hash_generate(type) if type.is_a? Hash
8
+ return { ref: type } if type < TypedParameter::Base
11
9
 
12
- swagger_type = "TypedParameter::Swagger::Types::#{type.name}Type".safe_constantize
13
- swagger_type&.value || { ref: type }
10
+ Swagger::Types[type.name.to_sym]&.value
14
11
  end
15
12
 
16
13
  def hash_generate(hash)
@@ -20,7 +17,7 @@ module TypedParameter
20
17
  end
21
18
 
22
19
  def array_generate(type)
23
- { type: :array, items: generate(type[0]) }
20
+ { type: :array, items: generate(type[0]) }
24
21
  end
25
22
  end
26
23
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class Base
7
+ def self.value
8
+ raise NotImplementedError, 'You need to implement this method'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class BooleanType < Base
7
+ def self.value
8
+ { type: :boolean }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class DateTimeType < Base
7
+ def self.value
8
+ { type: :string, format: :datetime }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class DateType < Base
7
+ def self.value
8
+ { type: :string, format: :date }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class FloatType < Base
7
+ def self.value
8
+ { type: :number, format: :float }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class IntegerType < Base
7
+ def self.value
8
+ { type: :integer }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TypedParameter
4
+ module Swagger
5
+ module Types
6
+ class StringType < Base
7
+ def self.value
8
+ { type: :string }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,45 +1,31 @@
1
+ require 'typed_parameter/swagger/types/base'
2
+ require 'typed_parameter/swagger/types/integer_type'
3
+ require 'typed_parameter/swagger/types/float_type'
4
+ require 'typed_parameter/swagger/types/string_type'
5
+ require 'typed_parameter/swagger/types/date_type'
6
+ require 'typed_parameter/swagger/types/date_time_type'
7
+ require 'typed_parameter/swagger/types/boolean_type'
8
+
1
9
  module TypedParameter
2
10
  module Swagger
3
- class Types
4
- def self.value
5
- raise NotImplementedError, 'You need to implement this method'
6
- end
7
-
8
- class IntegerType
9
- def self.value
10
- { type: :integer }
11
+ module Types
12
+ class << self
13
+ def register(key, type)
14
+ @swagger_types ||= {}
15
+ @swagger_types[key] = type
11
16
  end
12
- end
13
17
 
14
- class FloatType
15
- def self.value
16
- { type: :number, format: :float }
17
- end
18
- end
19
-
20
- class StringType
21
- def self.value
22
- { type: :string }
23
- end
24
- end
25
-
26
- class BooleanType
27
- def self.value
28
- { type: :boolean }
29
- end
30
- end
31
-
32
- class DateTimeType
33
- def self.value
34
- { type: :string, format: :datetime }
35
- end
36
- end
37
-
38
- class DateType
39
- def self.value
40
- { type: :string, format: :date }
18
+ def [](key)
19
+ @swagger_types[key].freeze
41
20
  end
42
21
  end
43
22
  end
44
23
  end
45
24
  end
25
+
26
+ TypedParameter::Swagger::Types.register :Integer, TypedParameter::Swagger::Types::IntegerType
27
+ TypedParameter::Swagger::Types.register :String, TypedParameter::Swagger::Types::StringType
28
+ TypedParameter::Swagger::Types.register :Float, TypedParameter::Swagger::Types::FloatType
29
+ TypedParameter::Swagger::Types.register :Date, TypedParameter::Swagger::Types::DateType
30
+ TypedParameter::Swagger::Types.register :DateTime, TypedParameter::Swagger::Types::DateTimeType
31
+ TypedParameter::Swagger::Types.register :Boolean, TypedParameter::Swagger::Types::BooleanType
@@ -3,19 +3,19 @@ module TypedParameter
3
3
  class << self
4
4
  def value(type, value)
5
5
  type_class = [type].flatten.first
6
- array_type = type.is_a?(Array)
7
- parameter_type = type_class < TypedParameter::Base
8
6
 
9
- if parameter_type
10
- array_type ? parameter_array(type_class, value) : type.permit(value)
7
+ if type_class < TypedParameter::Base
8
+ type.is_a?(Array) ? parameter_array(type_class, value) : type.permit(value)
11
9
  else
12
- constraint = "TypedParameter::Constraints::#{type_class}Constraint".safe_constantize
10
+ constraint = TypedParameter::Constraints[type_class.name.to_sym]
13
11
  constraint ||= TypedParameter::Constraints::StringConstraint # Default
14
12
 
15
- array_type ? constraint_array(constraint, value) : constraint.value(value)
13
+ type.is_a?(Array) ? constraint_array(constraint, value) : constraint.value(value)
16
14
  end
17
15
  end
18
16
 
17
+ private
18
+
19
19
  def parameter_array(parameter_class, values)
20
20
  values.map { |value| parameter_class.permit(value) }
21
21
  end
@@ -1,3 +1,3 @@
1
1
  module TypedParameter
2
- VERSION = '0.1.0'
2
+ VERSION = '0.5.0'.freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'typed_parameter/boolean' # For Booelan Class Define
1
+ require 'typed_parameter/boolean.rb' # For Booelan Class Define
2
2
 
3
3
  require 'typed_parameter/version'
4
4
  require 'typed_parameter/parameter_types'
@@ -12,6 +12,6 @@ require 'typed_parameter/swagger/types'
12
12
  require 'typed_parameter/swagger/type_generator'
13
13
  require 'typed_parameter/swagger/property_generator'
14
14
  require 'typed_parameter/swagger/component_generator'
15
- module TypedParameter
16
- class Error < StandardError; end
17
- end
15
+
16
+ require 'typed_parameter/errors'
17
+ module TypedParameter; end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ['lib']
28
28
 
29
29
  # Dependencies
30
- spec.add_dependency 'rails', '~> 6.1'
30
+ spec.add_dependency 'rails'
31
31
 
32
32
  # Test Dependencies
33
33
  spec.add_development_dependency 'rspec'
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typed-parameter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minwoo Jo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-06 00:00:00.000000000 Z
11
+ date: 2022-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '6.1'
19
+ version: '0'
20
20
  type: :runtime
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: '6.1'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -48,6 +48,7 @@ files:
48
48
  - ".gitignore"
49
49
  - ".rubocop.yml"
50
50
  - ".ruby-version"
51
+ - CHANGELOG.md
51
52
  - Gemfile
52
53
  - README.md
53
54
  - Rakefile
@@ -57,13 +58,28 @@ files:
57
58
  - lib/typed_parameter/base.rb
58
59
  - lib/typed_parameter/boolean.rb
59
60
  - lib/typed_parameter/constraints.rb
61
+ - lib/typed_parameter/constraints/base.rb
62
+ - lib/typed_parameter/constraints/boolean_constraint.rb
63
+ - lib/typed_parameter/constraints/date_constraint.rb
64
+ - lib/typed_parameter/constraints/date_time_constraint.rb
65
+ - lib/typed_parameter/constraints/float_constraint.rb
66
+ - lib/typed_parameter/constraints/integer_constraint.rb
67
+ - lib/typed_parameter/constraints/string_constraint.rb
60
68
  - lib/typed_parameter/enum_constraint.rb
69
+ - lib/typed_parameter/errors.rb
61
70
  - lib/typed_parameter/parameter_types.rb
62
71
  - lib/typed_parameter/permit_field_generator.rb
63
72
  - lib/typed_parameter/swagger/component_generator.rb
64
73
  - lib/typed_parameter/swagger/property_generator.rb
65
74
  - lib/typed_parameter/swagger/type_generator.rb
66
75
  - lib/typed_parameter/swagger/types.rb
76
+ - lib/typed_parameter/swagger/types/base.rb
77
+ - lib/typed_parameter/swagger/types/boolean_type.rb
78
+ - lib/typed_parameter/swagger/types/date_time_type.rb
79
+ - lib/typed_parameter/swagger/types/date_type.rb
80
+ - lib/typed_parameter/swagger/types/float_type.rb
81
+ - lib/typed_parameter/swagger/types/integer_type.rb
82
+ - lib/typed_parameter/swagger/types/string_type.rb
67
83
  - lib/typed_parameter/type_constraint.rb
68
84
  - lib/typed_parameter/version.rb
69
85
  - typed_parameter.gemspec