nrser 0.0.19 → 0.0.20

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
  SHA1:
3
- metadata.gz: f34385ea491972db4f43263773d9e9655ddabf85
4
- data.tar.gz: af6e560b27729d1d16e8aa007515eb2d4eee354f
3
+ metadata.gz: 01fe1d56c4df90623c6407128463f67ca2e65426
4
+ data.tar.gz: 0b1dfcb6cdd036647526482901cffe7e652cf189
5
5
  SHA512:
6
- metadata.gz: 8b9e68cefda2494539cd0f44efdee84ce70ddba6bbaccbe989e1cae0de30356cfbac0c5ede7df901489317a970cc3bec8dd38a720654344497e7dc3b47e66d3f
7
- data.tar.gz: c400d4be2fed9d8120453f049dd86904c9bd8a2283525dee076318054d690f66b36f838453ef5a0c650f37323c57df86ee0acf33bf303893959f02d27c8342cc
6
+ metadata.gz: af6cf0974b665d43b2b56a5fecbc1c44c2014f2aeb031eb3b831d599d55003a5d83ba6a6cdf604b34fc64700a6f713a96c8d9b69e51f550a3008449ee2d5de79
7
+ data.tar.gz: e368146e2161490ed4a831063e6a79540e084c45c52a685801776b759c43cf37e5d679bad11bbe2b22fd8f2d78012276f73843a0afa0a14d54226bccd138b8ca
data/lib/nrser/hash.rb CHANGED
@@ -238,22 +238,59 @@ module NRSER
238
238
  # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:symbolize_keys!
239
239
  #
240
240
  # @param [Hash] hash
241
- # Hash to mutate.
242
241
  #
243
- # @return [return_type]
244
- # @todo Document return value.
242
+ # @return [Hash]
245
243
  #
246
244
  def self.symbolize_keys! hash
247
245
  transform_keys!(hash) { |key| key.to_sym rescue key }
248
246
  end # .symbolize_keys!
249
247
 
250
248
 
251
-
249
+ # Returns a new hash with all keys that respond to `#to_sym` converted to
250
+ # symbols.
251
+ #
252
+ # Lifted from ActiveSupport.
253
+ #
254
+ # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:symbolize_keys
255
+ #
256
+ # @param [Hash] hash
257
+ #
258
+ # @return [Hash]
259
+ #
252
260
  def self.symbolize_keys hash
253
261
  # File 'lib/active_support/core_ext/hash/keys.rb', line 54
254
262
  transform_keys(hash) { |key| key.to_sym rescue key }
255
263
  end
256
264
 
265
+
266
+ # Converts all keys into strings by calling `#to_s` on them. **Mutates the
267
+ # hash.**
268
+ #
269
+ # Lifted from ActiveSupport.
270
+ #
271
+ # @param [Hash] hash
272
+ #
273
+ # @return [Hash<String, *>]
274
+ #
275
+ def self.stringify_keys! hash
276
+ transform_keys! hash, &:to_s
277
+ end
278
+
279
+
280
+ # Returns a new hash with all keys transformed to strings by calling `#to_s`
281
+ # on them.
282
+ #
283
+ # Lifted from ActiveSupport.
284
+ #
285
+ # @param [Hash] hash
286
+ #
287
+ # @return [Hash<String, *>]
288
+ #
289
+ def self.stringify_keys hash
290
+ transform_keys hash, &:to_s
291
+ end
292
+
293
+
257
294
  # Lifted from ActiveSupport.
258
295
  #
259
296
  # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:slice
@@ -0,0 +1,212 @@
1
+ require 'nrser/no_arg'
2
+
3
+ require 'nrser/refinements'
4
+ require 'nrser/refinements/types'
5
+
6
+ using NRSER::Types
7
+
8
+ module NRSER
9
+ module Meta
10
+ module Props
11
+
12
+ class Prop
13
+ attr_accessor :defined_in,
14
+ :name,
15
+ :type,
16
+ :source
17
+
18
+
19
+ def initialize defined_in,
20
+ name,
21
+ type: t.any,
22
+ default: NRSER::NO_ARG,
23
+ source: nil
24
+
25
+ @defined_in = defined_in
26
+ @name = name
27
+ @type = t.make type
28
+ @source = source
29
+ @default = default
30
+
31
+ if @source.nil?
32
+ @instance_variable_source = false
33
+ else
34
+ source_str = source.to_s
35
+ @instance_variable_source = source_str[0] == '@'
36
+ end
37
+ end
38
+
39
+
40
+ # @todo Document default? method.
41
+ #
42
+ # @param [type] arg_name
43
+ # @todo Add name param description.
44
+ #
45
+ # @return [return_type]
46
+ # @todo Document return value.
47
+ #
48
+ def default?
49
+ @default != NRSER::NO_ARG
50
+ end # #default?
51
+
52
+
53
+ def default
54
+ if default?
55
+ @default
56
+ else
57
+ raise NameError.new NRSER.squish <<-END
58
+ Prop #{ self } has no default value.
59
+ END
60
+ end
61
+ end
62
+
63
+
64
+ # @todo Document source? method.
65
+ #
66
+ # @param [type] arg_name
67
+ # @todo Add name param description.
68
+ #
69
+ # @return [return_type]
70
+ # @todo Document return value.
71
+ #
72
+ def source?
73
+ !@source.nil?
74
+ end # #source?
75
+
76
+
77
+ # @todo Document instance_variable_source? method.
78
+ #
79
+ # @param [type] arg_name
80
+ # @todo Add name param description.
81
+ #
82
+ # @return [return_type]
83
+ # @todo Document return value.
84
+ #
85
+ def instance_variable_source?
86
+ @instance_variable_source
87
+ end # #instance_variable_source?
88
+
89
+
90
+ # @todo Document primary? method.
91
+ #
92
+ # @param [type] arg_name
93
+ # @todo Add name param description.
94
+ #
95
+ # @return [return_type]
96
+ # @todo Document return value.
97
+ #
98
+ def primary?
99
+ !source?
100
+ end # #primary?
101
+
102
+
103
+ # @todo Document get method.
104
+ #
105
+ # @param [type] arg_name
106
+ # @todo Add name param description.
107
+ #
108
+ # @return [return_type]
109
+ # @todo Document return value.
110
+ #
111
+ def get instance
112
+ if source?
113
+ if instance_variable_source?
114
+ instance.instance_variable_get source
115
+ else
116
+ instance.send source
117
+ end
118
+ else
119
+ values(instance)[name]
120
+ end
121
+ end # #get
122
+
123
+
124
+ # @todo Document set method.
125
+ #
126
+ # @param [type] arg_name
127
+ # @todo Add name param description.
128
+ #
129
+ # @return [return_type]
130
+ # @todo Document return value.
131
+ #
132
+ def set instance, value
133
+ unless type.test value
134
+ raise TypeError.new NRSER.squish <<-END
135
+ #{ defined_in }##{ name } must be of type #{ type };
136
+ found #{ value.inspect }
137
+ END
138
+ end
139
+
140
+ values(instance)[name] = value
141
+ end # #set
142
+
143
+
144
+
145
+ # @todo Document set_from_hash method.
146
+ #
147
+ # @param [type] arg_name
148
+ # @todo Add name param description.
149
+ #
150
+ # @return [return_type]
151
+ # @todo Document return value.
152
+ #
153
+ def set_from_values_hash instance, **values
154
+ if values.key? name
155
+ set instance, values[name]
156
+ else
157
+ if default?
158
+ set instance, default.dup
159
+ else
160
+ raise TypeError.new NRSER.squish <<-END
161
+ Prop #{ name } has no default value and no value was provided in
162
+ values #{ values.inspect }.
163
+ END
164
+ end
165
+ end
166
+ end # #set_from_hash
167
+
168
+
169
+
170
+ # @todo Document to_data method.
171
+ #
172
+ # @param [type] arg_name
173
+ # @todo Add name param description.
174
+ #
175
+ # @return [return_type]
176
+ # @todo Document return value.
177
+ #
178
+ def to_data instance
179
+ value = get instance
180
+
181
+ if value.respond_to? :to_data
182
+ value.to_data
183
+ else
184
+ value
185
+ end
186
+ end # #to_data
187
+
188
+
189
+
190
+ private
191
+
192
+ # @todo Document values method.
193
+ #
194
+ # @param [type] arg_name
195
+ # @todo Add name param description.
196
+ #
197
+ # @return [return_type]
198
+ # @todo Document return value.
199
+ #
200
+ def values instance
201
+ unless instance.instance_variable_defined? PROP_VALUES_VARIABLE_NAME
202
+ instance.instance_variable_set PROP_VALUES_VARIABLE_NAME, {}
203
+ end
204
+
205
+ instance.instance_variable_get PROP_VALUES_VARIABLE_NAME
206
+ end # #value
207
+
208
+ end # class Prop
209
+
210
+ end # module Props
211
+ end # module Meta
212
+ end # module NRSER
@@ -1,189 +1,28 @@
1
- module NRSER
2
- module Meta
1
+ require 'pp'
2
+
3
+ require 'nrser/refinements'
4
+ require 'nrser/refinements/types'
3
5
 
4
- T = NRSER::Types
6
+ using NRSER
7
+ using NRSER::Types
8
+
9
+ module NRSER
10
+ module Meta
5
11
 
6
- #
7
12
  module Props
13
+ CLASS_KEY = '__class__';
8
14
  PROPS_VARIABLE_NAME = :@__NRSER_props
9
15
  PROP_VALUES_VARIABLE_NAME = :@__NRSER_prop_values
10
16
 
11
- class Prop
12
- attr_accessor :defined_in,
13
- :name,
14
- :type,
15
- :source
16
-
17
-
18
- def initialize defined_in,
19
- name,
20
- type: T.any,
21
- default: NRSER::NO_ARG,
22
- source: nil
23
-
24
- @defined_in = defined_in
25
- @name = name
26
- @type = NRSER::Types.make type
27
- @source = source
28
- @default = default
29
-
30
- if @source.nil?
31
- @instance_variable_source = false
32
- else
33
- source_str = source.to_s
34
- @instance_variable_source = source_str[0] == '@'
35
- end
36
- end
37
-
38
-
39
- # @todo Document default? method.
40
- #
41
- # @param [type] arg_name
42
- # @todo Add name param description.
43
- #
44
- # @return [return_type]
45
- # @todo Document return value.
46
- #
47
- def default?
48
- @default != NRSER::NO_ARG
49
- end # #default?
50
-
51
-
52
- def default
53
- if default?
54
- @default
55
- else
56
- raise NameError.new NRSER.squish <<-END
57
- Prop #{ self } has no default value.
58
- END
59
- end
60
- end
61
-
62
-
63
- # @todo Document source? method.
64
- #
65
- # @param [type] arg_name
66
- # @todo Add name param description.
67
- #
68
- # @return [return_type]
69
- # @todo Document return value.
70
- #
71
- def source?
72
- !@source.nil?
73
- end # #source?
74
-
75
-
76
- # @todo Document instance_variable_source? method.
77
- #
78
- # @param [type] arg_name
79
- # @todo Add name param description.
80
- #
81
- # @return [return_type]
82
- # @todo Document return value.
83
- #
84
- def instance_variable_source?
85
- @instance_variable_source
86
- end # #instance_variable_source?
87
-
88
-
89
- # @todo Document primary? method.
90
- #
91
- # @param [type] arg_name
92
- # @todo Add name param description.
93
- #
94
- # @return [return_type]
95
- # @todo Document return value.
96
- #
97
- def primary?
98
- !source?
99
- end # #primary?
100
-
101
-
102
- # @todo Document get method.
103
- #
104
- # @param [type] arg_name
105
- # @todo Add name param description.
106
- #
107
- # @return [return_type]
108
- # @todo Document return value.
109
- #
110
- def get instance
111
- if source?
112
- if instance_variable_source?
113
- instance.instance_variable_get source
114
- else
115
- instance.send source
116
- end
117
- else
118
- values(instance)[name]
119
- end
120
- end # #get
121
-
122
-
123
- # @todo Document set method.
124
- #
125
- # @param [type] arg_name
126
- # @todo Add name param description.
127
- #
128
- # @return [return_type]
129
- # @todo Document return value.
130
- #
131
- def set instance, value
132
- unless type.test value
133
- raise TypeError.new NRSER.squish <<-END
134
- #{ defined_in }##{ name } must be of type #{ type };
135
- found #{ value.inspect }
136
- END
137
- end
138
-
139
- values(instance)[name] = value
140
- end # #set
141
-
142
-
143
-
144
- # @todo Document set_from_hash method.
145
- #
146
- # @param [type] arg_name
147
- # @todo Add name param description.
148
- #
149
- # @return [return_type]
150
- # @todo Document return value.
151
- #
152
- def set_from_values_hash instance, **values
153
- if values.key? name
154
- set instance, values[name]
155
- else
156
- if default?
157
- set instance, default.dup
158
- else
159
- raise TypeError.new NRSER.squish <<-END
160
- Prop #{ name } has no default value and no value was provided in
161
- values #{ values.inspect }.
162
- END
163
- end
164
- end
165
- end # #set_from_hash
166
-
167
-
168
- private
169
-
170
- # @todo Document values method.
171
- #
172
- # @param [type] arg_name
173
- # @todo Add name param description.
174
- #
175
- # @return [return_type]
176
- # @todo Document return value.
177
- #
178
- def values instance
179
- unless instance.instance_variable_defined? PROP_VALUES_VARIABLE_NAME
180
- instance.instance_variable_set PROP_VALUES_VARIABLE_NAME, {}
181
- end
182
-
183
- instance.instance_variable_get PROP_VALUES_VARIABLE_NAME
184
- end # #value
185
-
186
- end # class Prop
17
+
18
+ # Module Methods (Utilities)
19
+ # =====================================================================
20
+ #
21
+ # These are *NOT* mixed in to including classes, and must be accessed
22
+ # via `NRSER::Meta::Props.<method_name>`.
23
+ #
24
+ # They're utilities that should only really need to be used internally.
25
+ #
187
26
 
188
27
 
189
28
  # @todo Document get_props_ref method.
@@ -203,8 +42,50 @@ module Props
203
42
  end # .get_props_ref
204
43
 
205
44
 
206
- module ClassMethods
45
+ # Instantiate a class from a data hash. The hash must contain the
46
+ # `__class__` key and the target class must be loaded already.
47
+ #
48
+ # **WARNING**
49
+ #
50
+ # I'm sure this is all-sorts of unsafe. Please don't ever think this is
51
+ # reasonable to use on untrusted data.
52
+ #
53
+ # @param [Hash<String, Object>] data
54
+ #
55
+ # @return [Object]
56
+ # @todo Document return value.
57
+ #
58
+ #
59
+ #
60
+ def self.from_data data
61
+ t.hash_.check data
207
62
 
63
+ unless data.key?(CLASS_KEY)
64
+ raise ArgumentError.new <<-END.dedent
65
+ Data is missing #{ CLASS_KEY } key - no idea what class to instantiate.
66
+
67
+ #{ data.pretty_inspect }
68
+ END
69
+ end
70
+
71
+ class_name = t.str.check data[CLASS_KEY]
72
+ klass = class_name.to_const
73
+ klass.from_data data
74
+ end # .from_data
75
+
76
+
77
+ # Hook to extend the including class with {NRSER::Meta::Props:ClassMethods}
78
+ def self.included base
79
+ base.extend ClassMethods
80
+ end
81
+
82
+
83
+ # Mixed-In Class Methods
84
+ # =====================================================================
85
+
86
+ # Methods added to the including *class* via `extend`.
87
+ #
88
+ module ClassMethods
208
89
 
209
90
  # @todo Document props method.
210
91
  #
@@ -214,16 +95,16 @@ module Props
214
95
  # @return [return_type]
215
96
  # @todo Document return value.
216
97
  #
217
- def props own: false, primary: false
218
- result = if !own && superclass.respond_to?(:props)
219
- superclass.props own: own, primary: primary
98
+ def props only_own: false, only_primary: false
99
+ result = if !only_own && superclass.respond_to?(:props)
100
+ superclass.props only_own: only_own, only_primary: only_primary
220
101
  else
221
102
  {}
222
103
  end
223
104
 
224
105
  own_props = NRSER::Meta::Props.get_props_ref self
225
106
 
226
- if primary
107
+ if only_primary
227
108
  own_props.each {|name, prop|
228
109
  if prop.primary?
229
110
  result[name] = prop
@@ -248,7 +129,7 @@ module Props
248
129
  def prop name, **opts
249
130
  ref = NRSER::Meta::Props.get_props_ref self
250
131
 
251
- T.sym.check name
132
+ t.sym.check name
252
133
 
253
134
  if ref.key? name
254
135
  raise ArgumentError.new NRSER.squish <<-END
@@ -275,38 +156,27 @@ module Props
275
156
  end # #prop
276
157
 
277
158
 
278
-
279
- # @todo Document from_h method.
159
+ # Instantiate from a data hash.
280
160
  #
281
- # @param [type] arg_name
282
- # @todo Add name param description.
161
+ # @todo
162
+ # This needs to be extended to handle prop'd classes nested in
163
+ # arrays and hashes... but for the moment, it is what it is.
283
164
  #
284
- # @return [return_type]
285
- # @todo Document return value.
165
+ # @param [Hash<String, Object>] data
286
166
  #
287
- def from_h hash
288
- self.new(
289
- NRSER.slice_keys(
290
- NRSER.symbolize_keys(hash),
291
- *self.props(primary: true).keys
292
- )
293
- )
294
- end # #from_h
167
+ # @return [self]
168
+ #
169
+ def from_data data
170
+ self.new data.symbolize_keys
171
+ end # #from_data
172
+
295
173
 
296
-
297
174
  end # module ClassMethods
298
175
 
299
176
 
300
- # Extend the including class with {NRSER::Meta::Props:ClassMethods}
301
- def self.included base
302
- base.extend ClassMethods
303
- end
304
-
305
-
306
- # Instance Methods
177
+ # Mixed-In Instance Methods
307
178
  # =====================================================================
308
179
 
309
-
310
180
  # @todo Document initialize_props method.
311
181
  #
312
182
  # @param [type] arg_name
@@ -316,26 +186,60 @@ module Props
316
186
  # @todo Document return value.
317
187
  #
318
188
  def initialize_props values
319
- self.class.props(primary: true).each { |name, prop|
189
+ self.class.props(only_primary: true).each { |name, prop|
320
190
  prop.set_from_values_hash self, values
321
191
  }
322
192
  end # #initialize_props
323
193
 
324
194
 
195
+ def merge overrides = {}
196
+ self.class.new(
197
+ self.to_h(only_primary: true).merge(overrides.symbolize_keys)
198
+ )
199
+ end
200
+
201
+
325
202
  # @todo Document to_h method.
326
203
  #
327
204
  # @param [type] arg_name
328
205
  # @todo Add name param description.
329
206
  #
330
- # @return [return_type]
207
+ # @return [Hash<Symbol, Object>]
331
208
  # @todo Document return value.
332
209
  #
333
- def to_h primary: false, own: false
334
- NRSER.map_values(
335
- self.class.props own: own, primary: primary
336
- ) { |name, prop| prop.get self }
210
+ def to_h only_own: false, only_primary: false
211
+ self.class.props(only_own: only_own, only_primary: only_primary).
212
+ map_values { |name, prop| prop.get self }
337
213
  end # #to_h
338
214
 
215
+ # Create a "data" representation suitable for transport, storage, etc.
216
+ #
217
+ # The result is meant to consist of only basic data types and structures -
218
+ # strings, numbers, arrays, hashes, datetimes, etc... though it depends on
219
+ # any custom objects it encounters correctly responding to `#to_data` for
220
+ # this to happen (as is implemented from classes that mix in Props here).
221
+ #
222
+ # Prop names are converted to strings (from symbols) since though YAML
223
+ # supports symbol values, they have poor portability across languages,
224
+ # and they mean the same thing in this situation.
225
+ #
226
+ # @param [type] arg_name
227
+ # @todo Add name param description.
228
+ #
229
+ # @return [Hash<String, Object>]
230
+ # @todo Document return value.
231
+ #
232
+ def to_data only_own: false, only_primary: false, add_class: true
233
+ self.class.props(only_own: false, only_primary: false).
234
+ map { |name, prop|
235
+ [name.to_s, prop.to_data(self)]
236
+ }.
237
+ to_h.
238
+ tap { |hash|
239
+ hash[CLASS_KEY] = self.class.name if add_class
240
+ }
241
+ end # #to_data
242
+
339
243
 
340
244
  # @todo Document to_json method.
341
245
  #
@@ -346,12 +250,12 @@ module Props
346
250
  # @todo Document return value.
347
251
  #
348
252
  def to_json *args
349
- to_h.to_json *args
253
+ to_data.to_json *args
350
254
  end # #to_json
351
255
 
352
256
 
353
257
  def to_yaml *args
354
- to_h.to_yaml *args
258
+ to_data.to_yaml *args
355
259
  end
356
260
 
357
261
 
@@ -360,4 +264,5 @@ end # module Props
360
264
  end # module Meta
361
265
  end # module NRSER
362
266
 
363
- require_relative './props/base'
267
+ require_relative './props/prop'
268
+ require_relative './props/base'
@@ -33,29 +33,44 @@ module NRSER
33
33
  NRSER.map_hash_values self, &block
34
34
  end
35
35
 
36
-
36
+ # See {NRSER.transform_keys!}
37
37
  def transform_keys! &block
38
38
  return enum_for(:transform_keys!) { size } unless block_given?
39
39
  NRSER.transform_keys! self, &block
40
40
  end
41
41
 
42
42
 
43
+ # See {NRSER.transform_keys}
43
44
  def transform_keys &block
44
45
  return hash.enum_for(:transform_keys) { size } unless block_given?
45
46
  NRSER.transform_keys self, &block
46
47
  end
47
48
 
48
49
 
50
+ # See {NRSER.symbolize_keys!}
49
51
  def symbolize_keys!
50
52
  NRSER.symbolize_keys! self
51
53
  end
52
54
 
53
55
 
56
+ # See {NRSER.symbolize_keys}
54
57
  def symbolize_keys
55
58
  NRSER.symbolize_keys self
56
59
  end
57
60
 
58
61
 
62
+ # See {NRSER.stringify_keys!}
63
+ def stringify_keys!
64
+ NRSER.stringify_keys! self
65
+ end
66
+
67
+
68
+ # See {NRSER.stringify_keys}
69
+ def stringify_keys
70
+ NRSER.stringify_keys self
71
+ end
72
+
73
+ # See {NRSER.map_hash_keys}
59
74
  def map_keys &block
60
75
  NRSER.map_hash_keys self, &block
61
76
  end
@@ -19,5 +19,13 @@ module NRSER
19
19
  def truncate *args
20
20
  NRSER.truncate self, *args
21
21
  end
22
+
23
+ # See {NRSER.constantize}
24
+ def constantize
25
+ NRSER.constantize self
26
+ end
27
+
28
+ alias_method :to_const, :constantize
29
+
22
30
  end # refine String
23
31
  end # NRSER
data/lib/nrser/string.rb CHANGED
@@ -105,5 +105,55 @@ module NRSER
105
105
 
106
106
  "#{str[0, stop]}#{omission}"
107
107
  end
108
+
109
+ # Get the constant identified by a string.
110
+ #
111
+ # @example
112
+ #
113
+ # SomeClass == NRSER.constantize(SomeClass.name)
114
+ #
115
+ # Lifted from ActiveSupport.
116
+ #
117
+ # @param [String] camel_cased_word
118
+ # The constant's camel-cased, double-colon-separated "name",
119
+ # like "NRSER::Types::Array".
120
+ #
121
+ # @return [Object]
122
+ #
123
+ # @raise [NameError]
124
+ # When the name is not in CamelCase or is not initialized.
125
+ #
126
+ def constantize(camel_cased_word)
127
+ names = camel_cased_word.split('::')
128
+
129
+ # Trigger a built-in NameError exception including the ill-formed constant in the message.
130
+ Object.const_get(camel_cased_word) if names.empty?
131
+
132
+ # Remove the first blank element in case of '::ClassName' notation.
133
+ names.shift if names.size > 1 && names.first.empty?
134
+
135
+ names.inject(Object) do |constant, name|
136
+ if constant == Object
137
+ constant.const_get(name)
138
+ else
139
+ candidate = constant.const_get(name)
140
+ next candidate if constant.const_defined?(name, false)
141
+ next candidate unless Object.const_defined?(name)
142
+
143
+ # Go down the ancestors to check if it is owned directly. The check
144
+ # stops when we reach Object or the end of ancestors tree.
145
+ constant = constant.ancestors.inject do |const, ancestor|
146
+ break const if ancestor == Object
147
+ break ancestor if ancestor.const_defined?(name, false)
148
+ const
149
+ end
150
+
151
+ # owner is in Object, so raise
152
+ constant.const_get(name, false)
153
+ end
154
+ end
155
+ end # constantize
156
+
157
+ alias_method :to_const, :constantize
108
158
  end # class << self
109
159
  end # module NRSER
@@ -21,7 +21,7 @@ module NRSER::Types
21
21
  def test value
22
22
  return false unless super(value)
23
23
 
24
- if keys == NRSER::Types::ALL && values == NRSER::Types::ALL
24
+ if keys == NRSER::Types::ANY && values == NRSER::Types::ANY
25
25
  return true
26
26
  end
27
27
 
data/lib/nrser/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module NRSER
2
- VERSION = "0.0.19"
2
+ VERSION = "0.0.20"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- T = NRSER::Types
3
+ using NRSER::Types
4
4
 
5
5
  describe NRSER::Meta::Props do
6
6
 
@@ -11,9 +11,9 @@ describe NRSER::Meta::Props do
11
11
  Class.new(NRSER::Meta::Props::Base) do
12
12
  # include NRSER::Meta::Props
13
13
 
14
- prop :x, type: T.int
15
- prop :y, type: T.int
16
- prop :blah, type: T.str, source: :blah
14
+ prop :x, type: t.int
15
+ prop :y, type: t.int
16
+ prop :blah, type: t.str, source: :blah
17
17
 
18
18
  def blah
19
19
  "blah!"
@@ -38,7 +38,7 @@ describe NRSER::Meta::Props do
38
38
  expect(props[:blah].source?).to be true
39
39
  expect(props[:blah].primary?).to be false
40
40
 
41
- primary_props = point.props primary: true
41
+ primary_props = point.props only_primary: true
42
42
 
43
43
  expect(primary_props.key? :blah).to be false
44
44
 
@@ -48,14 +48,14 @@ describe NRSER::Meta::Props do
48
48
  expect(p.y).to be 2
49
49
 
50
50
  expect(p.to_h).to eq({x: 1, y: 2, blah: "blah!"})
51
- expect(p.to_h(primary: true)).to eq({x: 1, y: 2})
51
+ expect(p.to_h(only_primary: true)).to eq({x: 1, y: 2})
52
52
 
53
53
  expect { point.new x: 1, y: 'why?' }.to raise_error TypeError
54
54
  expect { p.x = 3 }.to raise_error NoMethodError
55
55
 
56
56
  p_hash = p.to_h
57
57
 
58
- p2 = point.from_h p_hash
58
+ p2 = point.new p_hash
59
59
 
60
60
  expect(p2.x).to be 1
61
61
  expect(p2.y).to be 2
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nrser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - nrser
@@ -101,6 +101,7 @@ files:
101
101
  - lib/nrser/meta/class_attrs.rb
102
102
  - lib/nrser/meta/props.rb
103
103
  - lib/nrser/meta/props/base.rb
104
+ - lib/nrser/meta/props/prop.rb
104
105
  - lib/nrser/no_arg.rb
105
106
  - lib/nrser/refinements.rb
106
107
  - lib/nrser/refinements/array.rb