otoroshi 0.0.5 → 0.1.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: 6b84f923c9c4e6ea666ec899e051c3e58deff635fe00a8fe116faff2dd0c81b3
4
- data.tar.gz: 34899b93e6efa7e257821b553ea4ae9d84510b47734a396e7674cf540e6ded9b
3
+ metadata.gz: 12cba26aea6aca35ae46692ed5f9e9e4a72c3231651a132c25e793d697c17dbc
4
+ data.tar.gz: eb24b1df208ef59c64f3a2ea045a52b578969d75fb6cef6907189b6512bb30e1
5
5
  SHA512:
6
- metadata.gz: c44a2deba36e4ab2faf479162c40fba26643a5aab8666e1e2a7b287ce4fc4d33ab1b41f33639f5bd5b6b93a26891c663a00af971e50160a40bdee3df49997c63
7
- data.tar.gz: f4893e22addea6e851d6a6fc21eb6d5c5188a95c66f52e12b16ff44afc3a9340b33bf3aa472d3962bad572e42f412028d0887d6f5bf09d71efb435e66a84a848
6
+ metadata.gz: cc8bd50a648a681442722ad6456535d76fe3bc2dfa2bb2e4041a1548f710c64634c9ebc10e5e02fd7b397f608f8abbc34f17a6aa4dc7dd190780e0d77cd9e60a
7
+ data.tar.gz: ab934b7e39d816afcaae0bb07d0a142904aecb11ece6e75fb4590974483fa9bcc476767583a2c74ae907d2e77afb04501e35044e9e999e89197025881c0a863b
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Otoroshi entry-point
4
+ module Otoroshi
5
+ require_relative 'otoroshi/sanctuary'
6
+ require_relative 'otoroshi/exceptions'
7
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './initializer'
4
+
5
+ module Otoroshi
6
+ class Error < StandardError; end
7
+
8
+ # Manages errors raised when value is not an instance of the expected class
9
+ class TypeError < Error
10
+ # @param property [Symbol] name of the property
11
+ # @param type [Class] class to match
12
+ # @example
13
+ # ":number is not an instance of Integer"
14
+ def initialize(property, type)
15
+ super ":#{property} is not an instance of #{type}"
16
+ end
17
+ end
18
+
19
+ # Manages errors raised when value is not accepted (not in the "one_of")
20
+ class OneOfError < Error
21
+ # @param property [Symbol] name of the property
22
+ # @param values [Array] accepted values
23
+ # @example
24
+ # ":fruit is not in [:apple, :pear]"
25
+ def initialize(property, values)
26
+ # reintegrate the colon for symbols which is lost during interpolation
27
+ to_s = ->(v) { v.is_a?(Symbol) ? ":#{v}" : v }
28
+ list = values.map { |v| to_s.call(v) }.join(', ')
29
+ super ":#{property} is not in [#{list}]"
30
+ end
31
+ end
32
+
33
+ # Manages errors raised when value does not pass the assertion
34
+ class AssertError < Error
35
+ # @param property [Symbol] name of the property
36
+ # @example
37
+ # ":number does not respect the assertion"
38
+ def initialize(property)
39
+ super ":#{property} does not respect the assertion"
40
+ end
41
+ end
42
+
43
+ module Collection
44
+ # Manages errors raised when value should be an collection
45
+ class ArrayError < Error
46
+ # @param property [Symbol] name of the property
47
+ # @example
48
+ # ":numbers is not an array"
49
+ def initialize(property)
50
+ super ":#{property} is not an array"
51
+ end
52
+ end
53
+
54
+ # Manages errors raised when at least one element of the collection is not an instance of the expected class
55
+ class TypeError < Error
56
+ # @param property [Symbol] name of the property
57
+ # @param type [Class] class to match
58
+ # @example
59
+ # ":numbers contains elements that are not instances of Integer"
60
+ def initialize(property, type)
61
+ super ":#{property} contains elements that are not instances of #{type}"
62
+ end
63
+ end
64
+
65
+ # Manages errors raised when at least one element of the collection is not accepted (not in the "one_of")
66
+ class OneOfError < Error
67
+ # @param property [Symbol] name of the property
68
+ # @param values [Array] accepted values
69
+ # @example
70
+ # ":fruits contains elements that are not in [:apple, :pear]"
71
+ def initialize(property, values)
72
+ # reintegrate the colon for symbols which is lost during interpolation
73
+ to_s = ->(v) { v.is_a?(Symbol) ? ":#{v}" : v }
74
+ list = values.map { |v| to_s.call(v) }.join(', ')
75
+ super ":#{property} contains elements that are not in [#{list}]"
76
+ end
77
+ end
78
+
79
+ # Manages errors raised when value does not pass the assertion
80
+ class AssertError < Error
81
+ # @param property [Symbol] name of the property
82
+ # @example
83
+ # ":numbers contains elements that do not respect the assertion"
84
+ def initialize(property)
85
+ super ":#{property} contains elements that do not respect the assertion"
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,183 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Otoroshi
4
+ # Drawing of #initialize method
5
+ #
6
+ class Initializer
7
+ class << self
8
+ # Draw a stringified initialize method
9
+ #
10
+ # @param properties [Hash] a description of the class properties
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @example
15
+ # <<-RUBY
16
+ # def initialize(number: 0, message:, fruits: [])
17
+ # self.number = number
18
+ # self.message = message
19
+ # self.fruits = fruits
20
+ # bind = self
21
+ # @fruits.singleton_class.send(:define_method, :<<) do |v|
22
+ # bind.send(:"validate_fruits!", [v])
23
+ # push(v)
24
+ # end
25
+ # end
26
+ # RUBY
27
+ def draw(properties)
28
+ new(properties).draw
29
+ end
30
+ end
31
+
32
+ # Initialize an instance
33
+ #
34
+ # @param properties [Hash] a description of the class properties
35
+ def initialize(properties = {})
36
+ @properties = properties
37
+ end
38
+
39
+ # Draws a stringified initialize method
40
+ #
41
+ # @return [String]
42
+ #
43
+ # @example
44
+ # <<-RUBY
45
+ # def initialize(foo:, bar: 0)
46
+ # self.foo = foo
47
+ # self.bar = bar
48
+ # end
49
+ # RUBY
50
+ def draw
51
+ <<~RUBY
52
+ def initialize(#{initialize_parameters})
53
+ #{initialize_assignments}
54
+ #{initialize_push_singletons}
55
+ end
56
+ RUBY
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :properties
62
+
63
+ # Generates initialize method parameters
64
+ #
65
+ # @return [String]
66
+ #
67
+ # @example
68
+ # "foo:, bar: 0"
69
+ def initialize_parameters
70
+ parameters =
71
+ properties.map do |key, options|
72
+ "#{key}:#{default_parameter_for(options)}"
73
+ end
74
+ parameters.join(', ')
75
+ end
76
+
77
+ # Generates the default value of a parameter depending on options
78
+ #
79
+ # @return [String]
80
+ #
81
+ # @example when nil is allowed and default is set
82
+ # " \"default\""
83
+ # @example when nil is allowed and default is not set
84
+ # " nil"
85
+ # @example when nil is not allowed
86
+ # ""
87
+ def default_parameter_for(options)
88
+ default, allow_nil = options.values_at(:default, :allow_nil)
89
+ if default.nil?
90
+ allow_nil ? ' nil' : ''
91
+ else
92
+ " #{prefix(default)}#{default}#{suffix(default)}"
93
+ end
94
+ end
95
+
96
+ # Generates the characters to put before the value
97
+ # @note it avoids symbol without colon or string without quotes
98
+ # which would be interpreted as methods
99
+ def prefix(default)
100
+ case default
101
+ when Symbol then ':'
102
+ when String then '"'
103
+ end
104
+ end
105
+
106
+ # Generates the characters to put after the value
107
+ # @note it avoids string without quotes which would be interpreted as method
108
+ def suffix(default)
109
+ case default
110
+ when String then '"'
111
+ end
112
+ end
113
+
114
+ # Generates initialize method assignments
115
+ #
116
+ # @return [String]
117
+ #
118
+ # @example Given properties { foo: { allow_nil: false, default: nil }, { allow_nil: true, default: 0 } }
119
+ # <<-RUBY
120
+ # self.foo = foo
121
+ # self.bar = bar
122
+ # RUBY
123
+ def initialize_assignments
124
+ assignments =
125
+ properties.keys.map do |name|
126
+ "self.#{name} = #{name}"
127
+ end
128
+ assignments.join("\n ")
129
+ end
130
+
131
+ # Generates push singleton for each array property
132
+ #
133
+ # @return [String]
134
+ #
135
+ # @example
136
+ # <<-RUBY
137
+ # bind = self
138
+ # @fruits.singleton_class.send(:define_method, :<<) do |v|
139
+ # bind.send(:"validate_fruits!", [v])
140
+ # push(v)
141
+ # end
142
+ # @numbers.singleton_class.send(:define_method, :<<) do |v|
143
+ # bind.send(:"validate_numbers!", [v])
144
+ # push(v)
145
+ # end
146
+ # RUBY
147
+ def initialize_push_singletons
148
+ collections =
149
+ properties.select do |_, options|
150
+ options[:type].is_a?(Array) || options[:type] == Array
151
+ end
152
+ return if collections.empty?
153
+
154
+ singletons =
155
+ collections.keys.map do |name|
156
+ initialize_push_singleton(name)
157
+ end
158
+ # assign self to a variable so the instance is accessible from the singleton scope
159
+ ['bind = self', singletons.join].join("\n")
160
+ end
161
+
162
+ # Generates singleton on collection instance variable to overide <<
163
+ # so value is validated before being added to the collection
164
+ #
165
+ # @return [String]
166
+ #
167
+ # @example
168
+ # <<-RUBY
169
+ # @fruits.singleton_class.send(:define_method, :<<) do |v|
170
+ # bind.send(:"validate_fruits!", [v])
171
+ # push(v)
172
+ # end
173
+ # RUBY
174
+ def initialize_push_singleton(name)
175
+ <<-RUBY
176
+ @#{name}.singleton_class.send(:define_method, :<<) do |v|
177
+ bind.send(:"validate_#{name}!", [v])
178
+ push(v)
179
+ end
180
+ RUBY
181
+ end
182
+ end
183
+ end
@@ -1,16 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'initializer'
4
+
3
5
  module Otoroshi
4
- # This module is designed to be included in a class. This will provide
6
+ # This module is designed to be in a class. This will provide
5
7
  # the "property" ({Sanctuary::ClassMethods.property}) method for defining class properties.
8
+ #
6
9
  # @example
7
10
  # class Importer
8
11
  # include Otoroshi::Sanctuary
9
12
  #
10
- # property :file_path, String, validate: ->(v) { v.match? /.+\.csv/ }
11
- # property :headers, [TrueClass, FalseClass], default: false
12
- # property :col_sep, String, validate: ->(v) { v.in? [',', ';', '\s', '\t', '|'] }, default: ','
13
- # property :converters, Symbol, validate: ->(v) { v.in? %i[integer float date] }, allow_nil: true
13
+ # property :whatever
14
+ # property :number, Integer
15
+ # property :numbers, [Integer]
16
+ # property :positive_number, Integer, verify: ->(v) { v >= 0 }
17
+ # property :number_or_nil, Integer, allow_nil: true
18
+ # property :number_with_default, Integer, default: 42
19
+ # property :number_in_collection, Integer, one_of: [1, 2, 3, 5, 8, 13, 21, 34]
14
20
  # end
15
21
  module Sanctuary
16
22
  class << self
@@ -23,125 +29,187 @@ module Otoroshi
23
29
  # Class methods extended for the base class
24
30
  module ClassMethods
25
31
  # Adds a new "property" to the class
32
+ #
26
33
  # @param name [Symbol] the property name
27
- # @param type [Class] the expected value type
28
- # @param validate [Proc] a lambda processing the value and returning true or false
34
+ # @param type [Class, Array<Class>] the expected value or values type
35
+ # @param one_of [Array] the accepted values
36
+ # @param assert [Proc] a lambda processing the value and returning true or false
29
37
  # @param allow_nil [true, false] allow nil as a value
30
38
  # @param default [Object] default value if not set on initialization
39
+ #
31
40
  # @return [void]
41
+ #
32
42
  # @example
33
- # property name, type: String, validate: ->(v) { v.length > 3 }, allow_nil: true
43
+ # property name, type: String, assert: ->(v) { v.length > 3 }, allow_nil: true
34
44
  # @example
35
- # property score, type: Integer, validate: ->(v) { v >= 0 }, default: 0
36
- def property(name, type = Object, validate: ->(_) { true }, allow_nil: false, default: nil)
37
- add_to_properties(name, allow_nil, default)
38
- define_validate_type!(name, type, allow_nil)
39
- define_validate_lambda!(name, validate, allow_nil)
45
+ # property scores, type: [Integer], assert: ->(v) { v >= 0 }, default: []
46
+ def property(name, type = Object, one_of: nil, assert: ->(_) { true }, allow_nil: false, default: nil)
47
+ add_to_properties(name, type, allow_nil, default)
48
+ expected_type = type.is_a?(Array) ? type.first || Object : type
49
+ collection = expected_type == Array || type.is_a?(Array)
50
+ define_validate_type!(name, expected_type, collection, allow_nil)
51
+ define_validate_one_of!(name, collection, one_of, allow_nil)
52
+ define_validate_assertion!(name, collection, assert, allow_nil)
53
+ define_validate!(name)
40
54
  define_getter(name)
41
55
  define_setter(name)
42
- redefine_initialize
56
+ class_eval Initializer.draw(properties), __FILE__, __LINE__ + 1
43
57
  end
44
58
 
45
- # Returns the class properties
59
+ # Class properties
60
+ #
46
61
  # @return [Hash]
47
- # @note this method will be updated by {add_to_properties}
62
+ #
63
+ # @example
64
+ # {
65
+ # number: { type: Integer, allow_nil: false, default: 0 },
66
+ # message: { type: Integer, allow_nil: true, default: nil }
67
+ # }
48
68
  def properties
49
69
  {}
50
70
  end
51
71
 
52
72
  private
53
73
 
54
- # Updates {properties} to add new property to the returned ones
55
- # @return [void]
56
- def add_to_properties(name, allow_nil, default)
74
+ # Adds a properties to the {properties}
75
+ def add_to_properties(name, type, allow_nil, default)
57
76
  current_state = properties
58
- current_state[name] = { allow_nil: allow_nil, default: default }
77
+ current_state[name] = {
78
+ type: type,
79
+ allow_nil: allow_nil,
80
+ default: default
81
+ }
59
82
  define_singleton_method(:properties) { current_state }
60
83
  end
61
84
 
62
- # Defines a private method that raises an error if type is not respected
63
- # @param name [Symbol] the property name
64
- # @param type [Class] the type to test against
65
- # @param allow_nil [true, false] allow nil as a value
66
- # @return [void]
67
- # @example
68
- # define_validate_type!(score, Integer, false) => def validate_score_type!(value) ...
69
- # @example Generated method
85
+ # Defines a private method that validates type condition
86
+ #
87
+ # Given name = :score, type = Integer, allow_nil = false
88
+ #
70
89
  # def validate_score_type!(value)
71
90
  # return if Integer.nil? || false && value.nil?
72
91
  # return if value.is_a? Integer
73
92
  #
74
- # raise ArgumentError, ":score does not match required type"
93
+ # raise Otoroshi::TypeError, :score, Integer
75
94
  # end
76
- def define_validate_type!(name, type, allow_nil)
77
- lambda = type_validation(type)
95
+ def define_validate_type!(name, type, collection, allow_nil)
96
+ validator = validate_type?(name, type, collection)
78
97
  define_method :"validate_#{name}_type!" do |value|
79
- return if type.nil? || allow_nil && value.nil?
80
- return if lambda.call(value)
81
-
82
- raise ArgumentError, ":#{name} does not match required type"
98
+ allow_nil && value.nil? || validator.call(value)
83
99
  end
84
100
  private :"validate_#{name}_type!"
85
101
  end
86
102
 
87
- # Defines a lambda to be call to validate that value matches the type
88
- # @param type [Class] the type to test against
89
- # @return [Proc] the lambda to use in order to test the value matches the type
90
- # @example
91
- # type_validation(Integer) #=> ->(v) { v.is_a? Integer }
92
- # @example
93
- # type_validation([String, Symbol]) #=> ->(v) { [String, Symbol].any? { |t| v.is_a? t } }
94
- def type_validation(type)
95
- if type.is_a? Array
96
- ->(v) { type.any? { |t| v.is_a? t } }
103
+ # Lambda that validates (value) respects the type condition
104
+ # @return [Proc]
105
+ def validate_type?(name, type, collection)
106
+ if collection
107
+ # validate each element of (v) is an instance of the type
108
+ lambda do |v|
109
+ v.is_a?(Array) || raise(Otoroshi::Collection::ArrayError, name)
110
+ v.all? { |elt| elt.is_a? type } || raise(Otoroshi::Collection::TypeError.new(name, type))
111
+ end
97
112
  else
98
- ->(v) { v.is_a? type }
113
+ # validate (v) is an instance of the type
114
+ ->(v) { v.is_a?(type) || raise(Otoroshi::TypeError.new(name, type)) }
99
115
  end
100
116
  end
101
117
 
102
- # Defines a private method that raises an error if validate block returns false
103
- # @param name [Symbol] the property name
104
- # @param validate [Proc] a lambda processing the value and returning true or false
105
- # @param allow_nil [true, false] allow nil as a value
106
- # @return [void]
107
- # @example
108
- # define_validate_lambda!("score", ->(v) { v >= 0 }, false) #=> def validate_score_lambda!(value) ...
109
- # @example Generated instance method
110
- # def validate_score_lambda!(value)
118
+ # Defines a private method that validates one_of condition
119
+ #
120
+ # Given name = :side, collection = false, one_of = [:left, :right], allow_nil = false
121
+ #
122
+ # def validate_side_type!(value)
123
+ # return if false && value.nil?
124
+ # return if [:left, :right].include? value
125
+ #
126
+ # raise Otoroshi::OneOfError, :side, [:left, :right]
127
+ # end
128
+ def define_validate_one_of!(name, collection, one_of, allow_nil)
129
+ validator = validate_one_of?(name, one_of, collection)
130
+ define_method(:"validate_#{name}_one_of!") do |value|
131
+ allow_nil && value.nil? || validator.call(value)
132
+ end
133
+ private :"validate_#{name}_one_of!"
134
+ end
135
+
136
+ # Lambda that validates (value) respects the one_of condition
137
+ # @return [Proc]
138
+ def validate_one_of?(name, one_of, collection)
139
+ return ->(_) {} unless one_of
140
+
141
+ if collection
142
+ lambda do |v|
143
+ v.all? { |e| one_of.include? e } || raise(Otoroshi::Collection::OneOfError.new(name, one_of))
144
+ end
145
+ else
146
+ lambda do |v|
147
+ one_of.include?(v) || raise(Otoroshi::OneOfError.new(name, one_of))
148
+ end
149
+ end
150
+ end
151
+
152
+ # Defines a private method that validates assert condition
153
+ #
154
+ # Given name = :score, assert = ->(v) { v >= 0 }, allow_nil = false
155
+ #
156
+ # def validate_score_assertion!(value)
111
157
  # return if false && value.nil?
112
158
  # return if value >= 0
113
159
  #
114
- # raise ArgumentError, ":score does not match validation"
160
+ # raise Otoroshi::AssertError, :score
115
161
  # end
116
- def define_validate_lambda!(name, validate, allow_nil)
117
- define_method :"validate_#{name}_lambda!" do |value|
118
- return if allow_nil && value.nil?
119
- return if instance_exec(value, &validate)
162
+ def define_validate_assertion!(name, collection, assert, allow_nil)
163
+ validator = validate_assert?(name, assert, collection)
164
+ define_method :"validate_#{name}_assertion!" do |value|
165
+ allow_nil && value.nil? || validator.call(value)
166
+ end
167
+ private :"validate_#{name}_assertion!"
168
+ end
120
169
 
121
- raise ArgumentError, ":#{name} does not match validation"
170
+ # Lambda that validates (value) respects the assert condition
171
+ # @return [Proc]
172
+ def validate_assert?(name, assert, collection)
173
+ if collection
174
+ ->(v) { v.all? { |e| instance_exec(e, &assert) } || raise(Otoroshi::Collection::AssertError, name) }
175
+ else
176
+ ->(v) { instance_exec(v, &assert) || raise(Otoroshi::AssertError, name) }
122
177
  end
123
- private :"validate_#{name}_lambda!"
124
178
  end
125
179
 
126
- # Defines a getter method for the property
127
- # @param name [Symbol] the property name
128
- # @return [void]
129
- # @example
130
- # define_getter(:score) #=> def score ...
131
- # @example Generated instance method
132
- # def score
133
- # instance_variable_get(@score)
134
- # end
180
+ # Defines a private method that calls all validations
181
+ #
182
+ # Given name = :score
183
+ #
184
+ # def validate_score!(value)
185
+ # validate_score_type!(value)
186
+ # validate_score_one_of!(value)
187
+ # validate_score_assert(value)
188
+ # end
189
+ def define_validate!(name)
190
+ define_method :"validate_#{name}!" do |value|
191
+ __send__(:"validate_#{name}_type!", value)
192
+ __send__(:"validate_#{name}_one_of!", value)
193
+ __send__(:"validate_#{name}_assertion!", value)
194
+ end
195
+ private :"validate_#{name}!"
196
+ end
197
+
198
+ # Defines a getter
199
+ #
200
+ # Given name = :score
201
+ #
202
+ # def score
203
+ # instance_variable_get(@score)
204
+ # end
135
205
  def define_getter(name)
136
206
  define_method(name) { instance_variable_get("@#{name}") }
137
207
  end
138
208
 
139
- # Defines a setter method for the property
140
- # @param name [Symbol] the property name
141
- # @return [void]
142
- # @example
143
- # define_getter(:score) #=> def score=(value) ...
144
- # @example Generated instance method
209
+ # Defines a setter
210
+ #
211
+ # Given name = :score
212
+ #
145
213
  # def score=(value)
146
214
  # validate_score_type!(value)
147
215
  # validate_score!(value)
@@ -149,63 +217,10 @@ module Otoroshi
149
217
  # end
150
218
  def define_setter(name)
151
219
  define_method :"#{name}=" do |value|
152
- __send__(:"validate_#{name}_type!", value)
153
- __send__(:"validate_#{name}_lambda!", value)
220
+ __send__(:"validate_#{name}!", value)
154
221
  instance_variable_set("@#{name}", value)
155
222
  end
156
223
  end
157
-
158
- # Redefines initialize method
159
- # @return [void]
160
- # @note method is defined with `class_eval`
161
- # @example Generated method
162
- # def initialize(foo:, bar: 0)
163
- # self.foo = foo
164
- # self.bar = bar
165
- # end
166
- def redefine_initialize
167
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
168
- def initialize(#{initialize_parameters})
169
- #{initialize_body}
170
- end
171
- RUBY
172
- end
173
-
174
- # Defines initialize method parameters
175
- # @return [String]
176
- # @example Given properties { foo: { allow_nil: false, default: nil }, { allow_nil: true, default: 0 } }
177
- # redefine_initialize #=> "foo:, bar: 0"
178
- def initialize_parameters
179
- parameters =
180
- properties.map do |key, options|
181
- allow_nil, default = options.values
182
- "#{key}:#{default_parameter_for(allow_nil, default)}"
183
- end
184
- parameters.join(', ')
185
- end
186
-
187
- # Defines the default value of a parameter depending on options
188
- # @param options [Hash]
189
- # @return [String]
190
- # @example when nil is allowed and default is set
191
- # default_parameter_for(true, 0) #=> " 0"
192
- # @example when nil is allowed and default is not set
193
- # default_parameter_for(true, nil) #=> " nil"
194
- # @example when nil is not allowed
195
- # default_parameter_for(false, nil) #=> ""
196
- def default_parameter_for(allow_nil, default)
197
- return " #{default}" if default
198
-
199
- allow_nil ? ' nil' : ''
200
- end
201
-
202
- # Defines initialize method body
203
- # @return [String]
204
- # @example Given properties { foo: { allow_nil: false, default: nil }, { allow_nil: true, default: 0 } }
205
- # initialize_body #=> "self.foo = foo\nself.bar = bar"
206
- def initialize_body
207
- properties.keys.map { |key| "self.#{key} = #{key}" }.join("\n")
208
- end
209
224
  end
210
225
  end
211
226
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: otoroshi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edouard Piron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-10 00:00:00.000000000 Z
11
+ date: 2020-10-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Help defining class properties
14
14
  email: ed.piron@gmail.com
@@ -16,6 +16,9 @@ executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
+ - lib/otoroshi.rb
20
+ - lib/otoroshi/exceptions.rb
21
+ - lib/otoroshi/initializer.rb
19
22
  - lib/otoroshi/sanctuary.rb
20
23
  homepage: https://rubygems.org/gems/otoroshi
21
24
  licenses: