otoroshi 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/otoroshi/sanctuary.rb +119 -141
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cec895aa30d2fb89c0b824b38c2b0b710558419aa7ef1308769b8550969924ba
4
- data.tar.gz: a8f06adce33632af173d95282440685ab009c6095f6db889e21b25ffd4cccb40
3
+ metadata.gz: 22e2b21cfce2f6c2a95ef146e1d06b54d6c94d517069045262027de1e3511627
4
+ data.tar.gz: 6fe3ced425d76d05fd9e214871fadf8211b7b18d00d2c5fc5c20274cce9eb925
5
5
  SHA512:
6
- metadata.gz: 581a9bb26d5c1f861fa5f3c0e60d554c9a4f0e2f47c17df3856d957202ab1909ec74da411b2f0878c7ab0f0e59e904c1220b77e71f67dc1543a5959da0aa3f77
7
- data.tar.gz: 7811ee410f737e3f53d133eee22d62d0ed1e6b140d45801cad33aff475ced6a2e6b1e91acd92b4047f4c38c12b53ce64256dd935a3571e49758fa41f760d2e75
6
+ metadata.gz: 8aa7cd811fb08539425530d17c3633142b52a7602894708291cdeaea609c669340d43a8b645fd32a8b3b8679c2782a8ff2ef1cca8edfcaf6eb9dede7db36c2f8
7
+ data.tar.gz: ec5a6f08aece81a5be8b7db5e3ad5d2b10cf73800fd308f29cae84ad6650d21911f06fbe267a04a930a0b0f05c0900f816916d78bd6c4822e93576777899933f
@@ -1,29 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Otoroshi
4
- # Help setting and validating instance arguments
4
+ # This module is designed to be included in a class. This will provide
5
+ # the "property" ({Sanctuary::ClassMethods.property}) method for defining class properties.
6
+ # @example
7
+ # class Importer
8
+ # include Otoroshi::Sanctuary
9
+ #
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
14
+ # end
5
15
  module Sanctuary
6
- # Initialize an instance
7
- # This method will be redefined each time a property is added to the class
8
- def initialize; end
9
-
10
16
  class << self
11
- # Extend class method to the included class
17
+ # Extend ClassMethods for the base class
12
18
  def included(base)
13
19
  base.extend ClassMethods
14
20
  end
15
21
  end
16
22
 
17
- # Define class methods
23
+ # Class methods extended for the base class
18
24
  module ClassMethods
19
- # Add a new property to the class
20
- # -------------------------------
21
- #
22
- # / Examples
23
- #
24
- # property name, type: String, validate: ->(v) { v.length > 3 }, allow_nil: true
25
- # property score, type: Integer, validate: ->(v) { v >= 0 }, default: 0
26
- #
25
+ # Adds a new "property" to the class
26
+ # @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
29
+ # @param allow_nil [true, false] allow nil as a value
30
+ # @param default [Object] default value if not set on initialization
31
+ # @return [void]
32
+ # @example
33
+ # property name, type: String, validate: ->(v) { v.length > 3 }, allow_nil: true
34
+ # @example
35
+ # property score, type: Integer, validate: ->(v) { v >= 0 }, default: 0
27
36
  def property(name, type = Object, validate: ->(_) { true }, allow_nil: false, default: nil)
28
37
  add_to_properties(name, allow_nil, default)
29
38
  define_validate_type!(name, type, allow_nil)
@@ -33,36 +42,37 @@ module Otoroshi
33
42
  redefine_initialize
34
43
  end
35
44
 
36
- # Return the (inherited) class properties
37
- # (this method will be updated by ::add_to_properties)
38
- #
45
+ # Returns the class properties
46
+ # @return [Hash]
47
+ # @note this method will be updated by {add_to_properties}
39
48
  def properties
40
49
  {}
41
50
  end
42
51
 
43
52
  private
44
53
 
45
- # Update the ::properties method to add new property to the current list
46
- #
54
+ # Updates {properties} to add new property to the returned ones
55
+ # @return [void]
47
56
  def add_to_properties(name, allow_nil, default)
48
57
  current_state = properties
49
58
  current_state[name] = { allow_nil: allow_nil, default: default }
50
59
  define_singleton_method(:properties) { current_state }
51
60
  end
52
61
 
53
- # Define a private method that raises an error if type is not respected
54
- #
55
- # / Examples
56
- #
57
- # ::define_validate_type!("score", Integer, false) --> will define:
58
- #
59
- # def validate_score_type!(value)
60
- # return if allow_nil && value.nil?
61
- # return if value.is_a?(Integer)
62
- #
63
- # raise ArgumentError, ":score does not match required type"
64
- # end
65
- #
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
70
+ # def validate_score_type!(value)
71
+ # return if Integer.nil? || false && value.nil?
72
+ # return if value.is_a? Integer
73
+ #
74
+ # raise ArgumentError, ":score does not match required type"
75
+ # end
66
76
  def define_validate_type!(name, type, allow_nil)
67
77
  lambda = type_validation(type)
68
78
  define_method :"validate_#{name}_type!" do |value|
@@ -74,17 +84,13 @@ module Otoroshi
74
84
  private :"validate_#{name}_type!"
75
85
  end
76
86
 
77
- # Define a lambda to be call to validate that value match the type
78
- # ----------------------------------------------------------------
79
- #
80
- # / Examples
81
- #
82
- # ::type_validation(Integer) --> will return:
83
- # ->(v) { v.is_a? Integer }
84
- #
85
- # :type_validation([String, Symbol]) --> will return:
86
- # ->(v) { [String, Symbol].any? { |t| v.is_a? t } }
87
- #
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 } }
88
94
  def type_validation(type)
89
95
  if type.is_a? Array
90
96
  ->(v) { type.any? { |t| v.is_a? t } }
@@ -93,20 +99,20 @@ module Otoroshi
93
99
  end
94
100
  end
95
101
 
96
- # Define a private method that raises an error if validate block returns false
97
- # ----------------------------------------------------------------------------
98
- #
99
- # / Examples
100
- #
101
- # ::define_validate_lambda!("score", ->(v) { v >= 0 }, false) --> will define:
102
- #
103
- # def validate_score_lambda!(value)
104
- # return if false && value.nil?
105
- # return if value >= 0
106
- #
107
- # raise ArgumentError, ":score does not match validation"
108
- # end
109
- #
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)
111
+ # return if false && value.nil?
112
+ # return if value >= 0
113
+ #
114
+ # raise ArgumentError, ":score does not match validation"
115
+ # end
110
116
  def define_validate_lambda!(name, validate, allow_nil)
111
117
  define_method :"validate_#{name}_lambda!" do |value|
112
118
  return if allow_nil && value.nil?
@@ -117,34 +123,30 @@ module Otoroshi
117
123
  private :"validate_#{name}_lambda!"
118
124
  end
119
125
 
120
- # Define a getter method for the property
121
- # ---------------------------------------
122
- #
123
- # / Examples
124
- #
125
- # ::define_getter("score") --> will define:
126
- #
127
- # def score
128
- # @score
129
- # end
130
- #
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
131
135
  def define_getter(name)
132
136
  define_method(name) { instance_variable_get("@#{name}") }
133
137
  end
134
138
 
135
- # Define a setter method for the property
136
- # ---------------------------------------
137
- #
138
- # / Examples
139
- #
140
- # ::define_setter("score") --> will define:
141
- #
142
- # def score=(value)
143
- # validate_score_type!(value)
144
- # validate_score!(value)
145
- # @score = value
146
- # end
147
- #
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
145
+ # def score=(value)
146
+ # validate_score_type!(value)
147
+ # validate_score!(value)
148
+ # instance_variable_set(@score, value)
149
+ # end
148
150
  def define_setter(name)
149
151
  define_method :"#{name}=" do |value|
150
152
  __send__(:"validate_#{name}_type!", value)
@@ -153,22 +155,14 @@ module Otoroshi
153
155
  end
154
156
  end
155
157
 
156
- # Redefine the initialize method
157
- # ------------------------------
158
- #
159
- # / Examples
160
- #
161
- # Given the properties:
162
- # foo: { allow_nil: false, default: nil }
163
- # bar: { allow_nil: true, default: 0 }
164
- #
165
- # ::define_initialize --> will define:
166
- #
167
- # def initialize(foo:, bar: 0)
168
- # self.foo = foo
169
- # self.bar = bar
170
- # end
171
- #
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
172
166
  def redefine_initialize
173
167
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
174
168
  def initialize(#{initialize_parameters})
@@ -177,54 +171,38 @@ module Otoroshi
177
171
  RUBY
178
172
  end
179
173
 
180
- # Define initialize method parameters
181
- # -----------------------------------
182
- #
183
- # / Examples
184
- #
185
- # Given the properties:
186
- # foo: { allow_nil: false, default: nil }
187
- # bar: { allow_nil: true, default: 0 }
188
- #
189
- # ::initialize_parameters --> will return:
190
- # "foo:, bar: 0"
191
- #
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"
192
178
  def initialize_parameters
193
- properties.map { |key, options| "#{key}:#{default_parameter_for(options)}" }.join(', ')
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(', ')
194
185
  end
195
186
 
196
- # Define the default value of a parameter depending on options
197
- # ------------------------------------------------------------
198
- #
199
- # / Examples
200
- #
201
- # default_parameter_for(allow_nil: true, default: 0) --> will return
202
- # ' 0'
203
- #
204
- # default_parameter_for(allow_nil: true, default: nil) --> will return
205
- # ' nil'
206
- #
207
- # default_parameter_for(allow_nil: false, default: nil) --> will return
208
- # ''
209
- #
210
- def default_parameter_for(options)
211
- return " #{options[:default]}" if options[:default]
212
-
213
- options[:allow_nil] ? ' nil' : ''
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' : ''
214
200
  end
215
201
 
216
- # Define initialize method body
217
- # -----------------------------
218
- #
219
- # / Examples
220
- #
221
- # Given the properties:
222
- # :foo, :bar
223
- #
224
- # ::initialize_body --> will return:
225
- # "self.foo = foo
226
- # self.bar = bar"
227
- #
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"
228
206
  def initialize_body
229
207
  properties.keys.map { |key| "self.#{key} = #{key}" }.join("\n")
230
208
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: otoroshi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edouard Piron