attribute_struct 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +3 -0
- data/attribute_struct.gemspec +16 -13
- data/lib/attribute_struct.rb +6 -6
- data/lib/attribute_struct/attribute_hash.rb +8 -8
- data/lib/attribute_struct/attribute_struct.rb +114 -85
- data/lib/attribute_struct/augmented.rb +1 -3
- data/lib/attribute_struct/irb_compat.rb +0 -1
- data/lib/attribute_struct/monkey_camels.rb +11 -12
- data/lib/attribute_struct/version.rb +1 -1
- metadata +45 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0a111a3bd5eb4ca45c05040837630482f4f4e912955ab82fae427e1d2ee8a8c3
|
4
|
+
data.tar.gz: 9ce85d249bd59542e2eaf5946d145ee8250b54dfa57244fa812143818eea615f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0563f2b735ec6484e54beabc58a7a39051f90d6cf3997426ad06c4f5d1a010a22a79d9a858104cbfb49df29b479d2c1459bc73cac980ff2ad668c24c0a611779
|
7
|
+
data.tar.gz: ae4532589e7ba3136d342df0215ff35176b11a44d173e600521043788d9b66f3051a578d99402d1713945ee817c4c2934a8f4b9f2f2c3db08abe1f6fddf42fef
|
data/CHANGELOG.md
CHANGED
data/attribute_struct.gemspec
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) +
|
2
|
-
require
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + "/lib/"
|
2
|
+
require "attribute_struct/version"
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
4
|
+
s.name = "attribute_struct"
|
5
5
|
s.version = AttributeStruct::VERSION.version
|
6
|
-
s.summary =
|
7
|
-
s.author =
|
8
|
-
s.license =
|
9
|
-
s.email =
|
10
|
-
s.homepage =
|
11
|
-
s.description =
|
12
|
-
s.require_path =
|
13
|
-
s.add_runtime_dependency
|
14
|
-
s.add_development_dependency
|
15
|
-
s.
|
6
|
+
s.summary = "Attribute structures"
|
7
|
+
s.author = "Chris Roberts"
|
8
|
+
s.license = "Apache 2.0"
|
9
|
+
s.email = "chrisroberts.code@gmail.com"
|
10
|
+
s.homepage = "http://github.com/chrisroberts/attribute_struct"
|
11
|
+
s.description = "Attribute structures"
|
12
|
+
s.require_path = "lib"
|
13
|
+
s.add_runtime_dependency "bogo", ">= 0.1.31", "< 0.3.0"
|
14
|
+
s.add_development_dependency "rspec", "~> 3.5"
|
15
|
+
s.add_development_dependency "rake", "~> 10"
|
16
|
+
s.add_development_dependency "rufo", "~> 0.3.0"
|
17
|
+
s.add_development_dependency "minitest"
|
18
|
+
s.files = Dir["lib/**/*"] + %w(attribute_struct.gemspec README.md CHANGELOG.md CONTRIBUTING.md LICENSE)
|
16
19
|
end
|
data/lib/attribute_struct.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "bogo"
|
2
|
+
require "attribute_struct/attribute_struct"
|
3
3
|
|
4
|
-
autoload :MonkeyCamels,
|
5
|
-
autoload :CamelString,
|
6
|
-
autoload :IrbCompat,
|
4
|
+
autoload :MonkeyCamels, "attribute_struct/monkey_camels"
|
5
|
+
autoload :CamelString, "attribute_struct/monkey_camels"
|
6
|
+
autoload :IrbCompat, "attribute_struct/irb_compat"
|
7
7
|
|
8
|
-
require
|
8
|
+
require "attribute_struct/version"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "attribute_struct"
|
2
2
|
|
3
3
|
class AttributeStruct
|
4
4
|
|
@@ -75,7 +75,7 @@ class AttributeStruct
|
|
75
75
|
def initialize_copy(orig)
|
76
76
|
super
|
77
77
|
# Handle nested values
|
78
|
-
each do |k,v|
|
78
|
+
each do |k, v|
|
79
79
|
if v.kind_of?(Mash) || v.is_a?(Array)
|
80
80
|
self[k] = v.dup
|
81
81
|
end
|
@@ -150,7 +150,7 @@ class AttributeStruct
|
|
150
150
|
#
|
151
151
|
# @return [Array] The values at each of the provided keys
|
152
152
|
def values_at(*indices)
|
153
|
-
indices.collect {|key| self[convert_key(key)]}
|
153
|
+
indices.collect { |key| self[convert_key(key)] }
|
154
154
|
end
|
155
155
|
|
156
156
|
# @param hash<Hash> The hash to merge with the mash.
|
@@ -174,7 +174,7 @@ class AttributeStruct
|
|
174
174
|
# { :one => 1, :two => 2, :three => 3 }.except(:one)
|
175
175
|
# #=> { "two" => 2, "three" => 3 }
|
176
176
|
def except(*keys)
|
177
|
-
super(*keys.map {|k| convert_key(k)})
|
177
|
+
super(*keys.map { |k| convert_key(k) })
|
178
178
|
end
|
179
179
|
|
180
180
|
# Used to provide the same interface as Hash.
|
@@ -206,6 +206,7 @@ class AttributeStruct
|
|
206
206
|
end
|
207
207
|
|
208
208
|
protected
|
209
|
+
|
209
210
|
# @param key<Object> The key to convert.
|
210
211
|
#
|
211
212
|
# @param [Object]
|
@@ -242,12 +243,12 @@ class AttributeStruct
|
|
242
243
|
#
|
243
244
|
# @return [AttributeStruct::Mash] merged hash
|
244
245
|
def deep_merge(hash)
|
245
|
-
unless(hash.is_a?(Hash))
|
246
|
+
unless (hash.is_a?(Hash))
|
246
247
|
raise ArgumentError.new "Expecting `Hash` type. Received: `#{hash.class}`"
|
247
248
|
end
|
248
249
|
new_self = self.dup
|
249
|
-
hash.each do |k,v|
|
250
|
-
if(new_self[k].is_a?(Hash) && v.is_a?(Hash))
|
250
|
+
hash.each do |k, v|
|
251
|
+
if (new_self[k].is_a?(Hash) && v.is_a?(Hash))
|
251
252
|
new_self[k] = new_self[k].deep_merge(v)
|
252
253
|
else
|
253
254
|
new_self[k] = v
|
@@ -263,7 +264,6 @@ class AttributeStruct
|
|
263
264
|
self.replace(self.deep_merge(hash))
|
264
265
|
self
|
265
266
|
end
|
266
|
-
|
267
267
|
end
|
268
268
|
|
269
269
|
AttributeHash = Mash
|
@@ -1,9 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "attribute_struct"
|
2
2
|
|
3
3
|
class AttributeStruct < BasicObject
|
4
|
-
|
5
|
-
autoload :
|
6
|
-
autoload :Mash, 'attribute_struct/attribute_hash'
|
4
|
+
autoload :Augmented, "attribute_struct/augmented"
|
5
|
+
autoload :Mash, "attribute_struct/attribute_hash"
|
7
6
|
|
8
7
|
class << self
|
9
8
|
|
@@ -14,7 +13,7 @@ class AttributeStruct < BasicObject
|
|
14
13
|
:no_leading => :no_leading,
|
15
14
|
:dromedary => :leading,
|
16
15
|
:leading_hump => :leading,
|
17
|
-
:leading => :leading
|
16
|
+
:leading => :leading,
|
18
17
|
}
|
19
18
|
|
20
19
|
# @return [Truthy, Falsey] global flag for camel keys
|
@@ -46,17 +45,19 @@ class AttributeStruct < BasicObject
|
|
46
45
|
# @return [Symbol]
|
47
46
|
# @raises [ArgumentError]
|
48
47
|
def validate_camel_style(style)
|
49
|
-
if(VALID_CAMEL_STYLES.has_key?(style))
|
48
|
+
if (VALID_CAMEL_STYLES.has_key?(style))
|
50
49
|
VALID_CAMEL_STYLES[style]
|
51
50
|
else
|
52
|
-
|
51
|
+
valid_types = VALID_CAMEL_STYLES.keys(&:inspect).join(", ")
|
52
|
+
raise ArgumentError.new "Unsupported camel style provided " \
|
53
|
+
"`#{style.inspect}`! (Allowed: #{valid_types})"
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
57
|
# Loads helpers for camel casing
|
57
58
|
def load_the_camels
|
58
|
-
unless(@camels_loaded)
|
59
|
-
require
|
59
|
+
unless (@camels_loaded)
|
60
|
+
require "attribute_struct/monkey_camels"
|
60
61
|
@camels_loaded = true
|
61
62
|
end
|
62
63
|
end
|
@@ -68,7 +69,7 @@ class AttributeStruct < BasicObject
|
|
68
69
|
|
69
70
|
# Create AttributeStruct instance and dump the resulting hash
|
70
71
|
def build(&block)
|
71
|
-
raise ArgumentError.new
|
72
|
+
raise ArgumentError.new "Block required for build!" unless block
|
72
73
|
new(&block)._dump
|
73
74
|
end
|
74
75
|
|
@@ -80,7 +81,6 @@ class AttributeStruct < BasicObject
|
|
80
81
|
self.send(:include, IrbCompat)
|
81
82
|
true
|
82
83
|
end
|
83
|
-
|
84
84
|
end
|
85
85
|
|
86
86
|
# value used to identify unset value
|
@@ -103,15 +103,15 @@ class AttributeStruct < BasicObject
|
|
103
103
|
#
|
104
104
|
# @param init_hash [Hash] hash to initialize struct
|
105
105
|
# @yield block to execute within struct context
|
106
|
-
def initialize(init_hash=nil, &block)
|
106
|
+
def initialize(init_hash = nil, &block)
|
107
107
|
@_camel_keys = _klass.camel_keys
|
108
108
|
@_arg_state = __hashish.new
|
109
109
|
@_objectified = false
|
110
110
|
@table = __hashish.new
|
111
|
-
if(init_hash)
|
111
|
+
if (init_hash)
|
112
112
|
_load(init_hash)
|
113
113
|
end
|
114
|
-
if(block)
|
114
|
+
if (block)
|
115
115
|
self.instance_exec(&block)
|
116
116
|
end
|
117
117
|
end
|
@@ -123,15 +123,17 @@ class AttributeStruct < BasicObject
|
|
123
123
|
def _build(&block)
|
124
124
|
self.instance_exec(&block)
|
125
125
|
end
|
126
|
+
|
126
127
|
alias_method :build!, :_build
|
127
128
|
|
128
129
|
# Set state into current context
|
129
130
|
#
|
130
131
|
# @param args [Hashish] hashish type holding data for context
|
131
132
|
# @return [Hashish]
|
132
|
-
def _set_state(args={})
|
133
|
+
def _set_state(args = {})
|
133
134
|
_arg_state.merge!(args)
|
134
135
|
end
|
136
|
+
|
135
137
|
alias_method :set_state!, :_set_state
|
136
138
|
|
137
139
|
# Value of requested state
|
@@ -139,15 +141,16 @@ class AttributeStruct < BasicObject
|
|
139
141
|
# @param key [Symbol, String]
|
140
142
|
# @param traverse [TrueClass, FalseClass] traverse towards root for matching key
|
141
143
|
# @return [Object, NilClass]
|
142
|
-
def _state(key, traverse=true)
|
143
|
-
if(_arg_state.has_key?(key))
|
144
|
+
def _state(key, traverse = true)
|
145
|
+
if (_arg_state.has_key?(key))
|
144
146
|
_arg_state[key]
|
145
147
|
else
|
146
|
-
if(traverse && _parent)
|
148
|
+
if (traverse && _parent)
|
147
149
|
_parent._state(key)
|
148
150
|
end
|
149
151
|
end
|
150
152
|
end
|
153
|
+
|
151
154
|
alias_method :state!, :_state
|
152
155
|
|
153
156
|
# Enable/disable camel keys
|
@@ -171,9 +174,10 @@ class AttributeStruct < BasicObject
|
|
171
174
|
#
|
172
175
|
# @param enable [TrueClass, FalseClass]
|
173
176
|
# @return [TrueClass, FalseClass]
|
174
|
-
def _objectify(enable=true)
|
177
|
+
def _objectify(enable = true)
|
175
178
|
@_objectified = !!enable
|
176
179
|
end
|
180
|
+
|
177
181
|
alias_method :objectify!, :_objectify
|
178
182
|
|
179
183
|
# @return [TrueClass, FalseClass]
|
@@ -196,13 +200,14 @@ class AttributeStruct < BasicObject
|
|
196
200
|
# @param val [Object]
|
197
201
|
# @yield block to execute within context
|
198
202
|
# @return [Object]
|
199
|
-
def _set(key, val=UNSET_VALUE, &block)
|
200
|
-
if(val != UNSET_VALUE)
|
203
|
+
def _set(key, val = UNSET_VALUE, &block)
|
204
|
+
if (val != UNSET_VALUE)
|
201
205
|
self.method_missing(key, val, &block)
|
202
206
|
else
|
203
207
|
self.method_missing(key, &block)
|
204
208
|
end
|
205
209
|
end
|
210
|
+
|
206
211
|
alias_method :set!, :_set
|
207
212
|
|
208
213
|
# Provides struct DSL behavior
|
@@ -213,66 +218,66 @@ class AttributeStruct < BasicObject
|
|
213
218
|
# @return [Object] existing value or newly set value
|
214
219
|
# @note Dragons and unicorns all over in here
|
215
220
|
def method_missing(_sym, *_args, &_block)
|
216
|
-
if(objectified? && _args.empty? && _block.nil?)
|
221
|
+
if (objectified? && _args.empty? && _block.nil?)
|
217
222
|
_o_lookup = _objectified_constant_lookup(_sym)
|
218
223
|
return _o_lookup if _o_lookup
|
219
224
|
end
|
220
|
-
if(_sym.is_a?(::String) || _sym.is_a?(::Symbol))
|
221
|
-
if((_s = _sym.to_s).end_with?(
|
225
|
+
if (_sym.is_a?(::String) || _sym.is_a?(::Symbol))
|
226
|
+
if ((_s = _sym.to_s).end_with?("="))
|
222
227
|
_s.slice!(-1, _s.length)
|
223
228
|
_sym = _s
|
224
229
|
end
|
225
230
|
_sym = _process_key(_sym)
|
226
231
|
end
|
227
|
-
if(!_args.empty? || _block)
|
228
|
-
if(_args.empty? && _block)
|
232
|
+
if (!_args.empty? || _block)
|
233
|
+
if (_args.empty? && _block)
|
229
234
|
_base = @table.fetch(_sym, UNSET_VALUE)
|
230
|
-
if(_state(:value_collapse) && !_base.is_a?(self.class!))
|
235
|
+
if (_state(:value_collapse) && !_base.is_a?(self.class!))
|
231
236
|
_orig = _base
|
232
237
|
_base = _klass_new
|
233
238
|
else
|
234
|
-
unless(_base.is_a?(self.class!))
|
239
|
+
unless (_base.is_a?(self.class!))
|
235
240
|
_base = _klass_new
|
236
241
|
end
|
237
242
|
end
|
238
243
|
@table[_sym] = _base
|
239
|
-
if(_block.arity == 0)
|
244
|
+
if (_block.arity == 0)
|
240
245
|
_base.instance_exec(&_block)
|
241
246
|
else
|
242
247
|
_base.instance_exec(_base, &_block)
|
243
248
|
end
|
244
|
-
if(_orig.is_a?(::NilClass))
|
249
|
+
if (_orig.is_a?(::NilClass))
|
245
250
|
@table[_sym] = _base
|
246
251
|
else
|
247
|
-
if(_orig == UNSET_VALUE)
|
252
|
+
if (_orig == UNSET_VALUE)
|
248
253
|
@table[_sym] = _base
|
249
254
|
else
|
250
|
-
unless(_orig.is_a?(CollapseArray))
|
255
|
+
unless (_orig.is_a?(CollapseArray))
|
251
256
|
_orig = CollapseArray.new.push(_orig)
|
252
257
|
end
|
253
258
|
_orig << _base
|
254
259
|
@table[_sym] = _orig
|
255
260
|
end
|
256
261
|
end
|
257
|
-
elsif(!_args.empty? && _block)
|
262
|
+
elsif (!_args.empty? && _block)
|
258
263
|
_result = _leaf = _base = @table.fetch(_sym, _klass_new)
|
259
264
|
@table[_sym] = _result
|
260
265
|
|
261
266
|
_args.flatten.each do |_arg|
|
262
267
|
_leaf = _base[_arg]
|
263
|
-
unless(_leaf.is_a?(_klass))
|
268
|
+
unless (_leaf.is_a?(_klass))
|
264
269
|
_leaf = _klass_new
|
265
270
|
_base._set(_arg, _leaf)
|
266
271
|
_base = _leaf
|
267
272
|
end
|
268
273
|
end
|
269
|
-
if(!_leaf.nil? && _state(:value_collapse))
|
274
|
+
if (!_leaf.nil? && _state(:value_collapse))
|
270
275
|
_orig = _leaf
|
271
276
|
_leaf = _orig.parent._klass_new
|
272
277
|
end
|
273
278
|
_block.arity == 0 ? _leaf._build(&_block) : _leaf._build(_leaf, &_block)
|
274
|
-
if(_orig)
|
275
|
-
unless(_orig.is_a?(CollapseArray))
|
279
|
+
if (_orig)
|
280
|
+
unless (_orig.is_a?(CollapseArray))
|
276
281
|
_orig = CollapseArray.new.push(_orig)
|
277
282
|
end
|
278
283
|
_orig << _leaf
|
@@ -280,19 +285,19 @@ class AttributeStruct < BasicObject
|
|
280
285
|
_orig = _leaf
|
281
286
|
end
|
282
287
|
else
|
283
|
-
if(_args.size > 1 && _args.all?{|_i| _i.is_a?(::String) || _i.is_a?(::Symbol)} && !_state(:value_collapse))
|
288
|
+
if (_args.size > 1 && _args.all? { |_i| _i.is_a?(::String) || _i.is_a?(::Symbol) } && !_state(:value_collapse))
|
284
289
|
@table[_sym] = _klass_new unless @table[_sym].is_a?(_klass)
|
285
290
|
_endpoint = _args.inject(@table[_sym]) do |_memo, _k|
|
286
|
-
unless(_memo[_k].is_a?(_klass))
|
291
|
+
unless (_memo[_k].is_a?(_klass))
|
287
292
|
_memo._set(_k, _klass_new)
|
288
293
|
end
|
289
294
|
_memo[_k]
|
290
295
|
end
|
291
296
|
return _endpoint # custom break out
|
292
297
|
else
|
293
|
-
if(_args.size > 1)
|
298
|
+
if (_args.size > 1)
|
294
299
|
_val = _args.map do |_v|
|
295
|
-
if(_v.is_a?(::Hash) && _state(:hash_load_struct))
|
300
|
+
if (_v.is_a?(::Hash) && _state(:hash_load_struct))
|
296
301
|
_val = _klass_new
|
297
302
|
_val._load(_v)
|
298
303
|
else
|
@@ -300,15 +305,15 @@ class AttributeStruct < BasicObject
|
|
300
305
|
end
|
301
306
|
end
|
302
307
|
else
|
303
|
-
if(_args.first.is_a?(::Hash) && _state(:hash_load_struct))
|
308
|
+
if (_args.first.is_a?(::Hash) && _state(:hash_load_struct))
|
304
309
|
_val = _klass_new
|
305
310
|
_val._load(_args.first)
|
306
311
|
else
|
307
312
|
_val = _args.first
|
308
313
|
end
|
309
314
|
end
|
310
|
-
if(_state(:value_collapse) && !(_leaf = @table[_sym]).nil?)
|
311
|
-
unless(_leaf.is_a?(CollapseArray))
|
315
|
+
if (_state(:value_collapse) && !(_leaf = @table[_sym]).nil?)
|
316
|
+
unless (_leaf.is_a?(CollapseArray))
|
312
317
|
_leaf = CollapseArray.new.push(_leaf)
|
313
318
|
end
|
314
319
|
_leaf << _val
|
@@ -340,18 +345,31 @@ class AttributeStruct < BasicObject
|
|
340
345
|
def is_a?(klass)
|
341
346
|
(_klass.ancestors + [::AttributeStruct]).include?(klass)
|
342
347
|
end
|
348
|
+
|
343
349
|
alias_method :kind_of?, :is_a?
|
344
350
|
|
351
|
+
# Check if key exists within struct
|
352
|
+
#
|
353
|
+
# @param key [String, Symbol]
|
354
|
+
# @return [TrueClass, FalseClass]
|
355
|
+
def key?(key)
|
356
|
+
self._keys.include?(_process_key(key))
|
357
|
+
end
|
358
|
+
|
359
|
+
alias_method :has_key?, :key?
|
360
|
+
|
345
361
|
# @return [Array<String,Symbol>] keys within struct
|
346
362
|
def _keys
|
347
363
|
_data.keys
|
348
364
|
end
|
365
|
+
|
349
366
|
alias_method :keys!, :_keys
|
350
367
|
|
351
368
|
# @return [AttributeStruct::AttributeHash, Mash] underlying struct data
|
352
369
|
def _data
|
353
370
|
@table
|
354
371
|
end
|
372
|
+
|
355
373
|
alias_method :data!, :_data
|
356
374
|
|
357
375
|
# Delete entry from struct
|
@@ -361,6 +379,7 @@ class AttributeStruct < BasicObject
|
|
361
379
|
def _delete(key)
|
362
380
|
_data.delete(_process_key(key))
|
363
381
|
end
|
382
|
+
|
364
383
|
alias_method :delete!, :_delete
|
365
384
|
|
366
385
|
# Process and unpack items for dumping within deeply nested
|
@@ -369,8 +388,8 @@ class AttributeStruct < BasicObject
|
|
369
388
|
# @param item [Object]
|
370
389
|
# @return [Object]
|
371
390
|
def _dump_unpacker(item)
|
372
|
-
if(item.is_a?(::Enumerable))
|
373
|
-
if(item.respond_to?(:keys))
|
391
|
+
if (item.is_a?(::Enumerable))
|
392
|
+
if (item.respond_to?(:keys))
|
374
393
|
item.class[
|
375
394
|
*item.map do |entry|
|
376
395
|
_dump_unpacker(entry)
|
@@ -383,7 +402,7 @@ class AttributeStruct < BasicObject
|
|
383
402
|
end
|
384
403
|
]
|
385
404
|
end
|
386
|
-
elsif(item.is_a?(::AttributeStruct))
|
405
|
+
elsif (item.is_a?(::AttributeStruct))
|
387
406
|
item.nil? ? UNSET_VALUE : item._dump
|
388
407
|
else
|
389
408
|
item
|
@@ -399,6 +418,7 @@ class AttributeStruct < BasicObject
|
|
399
418
|
end.compact
|
400
419
|
__hashish[*processed.flatten(1)]
|
401
420
|
end
|
421
|
+
|
402
422
|
alias_method :dump!, :_dump
|
403
423
|
|
404
424
|
# Clear current struct data and replace
|
@@ -407,22 +427,22 @@ class AttributeStruct < BasicObject
|
|
407
427
|
# @return [self]
|
408
428
|
def _load(hashish)
|
409
429
|
@table.clear
|
410
|
-
if(_root._camel_keys_action == :auto_discovery)
|
411
|
-
starts = hashish.keys.map{|k|k[0,1]}
|
412
|
-
unless(starts.detect{|k| k =~ /[A-Z]/})
|
430
|
+
if (_root._camel_keys_action == :auto_discovery)
|
431
|
+
starts = hashish.keys.map { |k| k[0, 1] }
|
432
|
+
unless (starts.detect { |k| k =~ /[A-Z]/ })
|
413
433
|
_camel_keys_set(:auto_disable)
|
414
434
|
else
|
415
435
|
_camel_keys_set(:auto_enable) unless _parent.nil?
|
416
436
|
end
|
417
437
|
end
|
418
438
|
hashish.each do |key, value|
|
419
|
-
if(value.is_a?(::Enumerable))
|
439
|
+
if (value.is_a?(::Enumerable))
|
420
440
|
flat = value.map do |v|
|
421
441
|
v.is_a?(::Hash) ? _klass_new(v) : v
|
422
442
|
end
|
423
443
|
value = value.is_a?(::Hash) ? __hashish[*flat.flatten(1)] : flat
|
424
444
|
end
|
425
|
-
if(value.is_a?(::Hash))
|
445
|
+
if (value.is_a?(::Hash))
|
426
446
|
self._set(key)._load(value)
|
427
447
|
else
|
428
448
|
self._set(key, value)
|
@@ -430,6 +450,7 @@ class AttributeStruct < BasicObject
|
|
430
450
|
end
|
431
451
|
self
|
432
452
|
end
|
453
|
+
|
433
454
|
alias_method :load!, :_load
|
434
455
|
|
435
456
|
# Perform deep merge
|
@@ -475,14 +496,14 @@ class AttributeStruct < BasicObject
|
|
475
496
|
#
|
476
497
|
# @param thing [Object] struct to copy. defaults to self
|
477
498
|
# @return [Object] new instance
|
478
|
-
def _deep_copy(thing=nil)
|
499
|
+
def _deep_copy(thing = nil)
|
479
500
|
thing ||= _dump
|
480
|
-
if(thing.is_a?(::Enumerable))
|
481
|
-
val = thing.map{|v| v.is_a?(::Enumerable) ? _deep_copy(v) : _do_dup(v) }
|
501
|
+
if (thing.is_a?(::Enumerable))
|
502
|
+
val = thing.map { |v| v.is_a?(::Enumerable) ? _deep_copy(v) : _do_dup(v) }
|
482
503
|
else
|
483
504
|
val = _do_dup(thing)
|
484
505
|
end
|
485
|
-
if(thing.is_a?(::Hash))
|
506
|
+
if (thing.is_a?(::Hash))
|
486
507
|
val = __hashish[*val.flatten(1)]
|
487
508
|
end
|
488
509
|
val
|
@@ -494,9 +515,9 @@ class AttributeStruct < BasicObject
|
|
494
515
|
# @param args [Object] argument list (:force will force processing)
|
495
516
|
# @return [String, Symbol]
|
496
517
|
def _process_key(key, *args)
|
497
|
-
if(key.is_a?(::String) || key.is_a?(::Symbol))
|
518
|
+
if (key.is_a?(::String) || key.is_a?(::Symbol))
|
498
519
|
key = ::CamelString.new(key.to_s)
|
499
|
-
if(_camel_keys && _camel_keys_action && !key._hump_format_requested?)
|
520
|
+
if (_camel_keys && _camel_keys_action && !key._hump_format_requested?)
|
500
521
|
case _camel_keys_action
|
501
522
|
when :auto_disable
|
502
523
|
key._no_hump
|
@@ -504,10 +525,10 @@ class AttributeStruct < BasicObject
|
|
504
525
|
key._hump
|
505
526
|
end
|
506
527
|
end
|
507
|
-
if(_camel_keys && (key._camel? || args.include?(:force)))
|
528
|
+
if (_camel_keys && (key._camel? || args.include?(:force)))
|
508
529
|
camel_args = [key]
|
509
|
-
if(key._hump_style || _camel_style == :no_leading)
|
510
|
-
unless(key._hump_style == :leading_hump)
|
530
|
+
if (key._hump_style || _camel_style == :no_leading)
|
531
|
+
unless (key._hump_style == :leading_hump)
|
511
532
|
camel_args << false
|
512
533
|
end
|
513
534
|
end
|
@@ -519,6 +540,7 @@ class AttributeStruct < BasicObject
|
|
519
540
|
key
|
520
541
|
end
|
521
542
|
end
|
543
|
+
|
522
544
|
alias_method :process_key!, :_process_key
|
523
545
|
|
524
546
|
# @return [Class] this class
|
@@ -530,6 +552,7 @@ class AttributeStruct < BasicObject
|
|
530
552
|
def klass!
|
531
553
|
_klass
|
532
554
|
end
|
555
|
+
|
533
556
|
alias_method :class!, :klass!
|
534
557
|
alias_method :class, :klass!
|
535
558
|
|
@@ -537,7 +560,7 @@ class AttributeStruct < BasicObject
|
|
537
560
|
# @note will set self as parent and propogate camelizing status
|
538
561
|
def _klass_new(*args, &block)
|
539
562
|
n = _klass.new(*args, &block)
|
540
|
-
unless(_camel_keys_action == :auto_discovery)
|
563
|
+
unless (_camel_keys_action == :auto_discovery)
|
541
564
|
n._camel_keys_set(_camel_keys_action)
|
542
565
|
end
|
543
566
|
n._camel_keys = _camel_keys
|
@@ -555,6 +578,7 @@ class AttributeStruct < BasicObject
|
|
555
578
|
def _camel_keys_set(v)
|
556
579
|
@_camel_keys_set = v
|
557
580
|
end
|
581
|
+
|
558
582
|
alias_method :camel_keys_set!, :_camel_keys_set
|
559
583
|
|
560
584
|
# @return [Symbol, NilClass] :auto_disable or :auto_enable
|
@@ -563,20 +587,22 @@ class AttributeStruct < BasicObject
|
|
563
587
|
end
|
564
588
|
|
565
589
|
# @return [AttributeStruct, NilClass] parent of this struct
|
566
|
-
def _parent(obj=nil)
|
590
|
+
def _parent(obj = nil)
|
567
591
|
@_parent = obj if obj
|
568
592
|
@_parent
|
569
593
|
end
|
594
|
+
|
570
595
|
alias_method :parent!, :_parent
|
571
596
|
|
572
597
|
# @return [AttributeStruct, NilClass] root of the struct or nil if self is root
|
573
598
|
def _root
|
574
599
|
r = self
|
575
|
-
until(r._parent == nil)
|
600
|
+
until (r._parent == nil)
|
576
601
|
r = r._parent
|
577
602
|
end
|
578
603
|
r
|
579
604
|
end
|
605
|
+
|
580
606
|
alias_method :root!, :_root
|
581
607
|
|
582
608
|
# Create an Array and evaluate discovered AttributeStructs
|
@@ -585,9 +611,9 @@ class AttributeStruct < BasicObject
|
|
585
611
|
# @return [Array]
|
586
612
|
def _array(*args)
|
587
613
|
args.map do |maybe_block|
|
588
|
-
if(maybe_block.is_a?(::Proc))
|
614
|
+
if (maybe_block.is_a?(::Proc))
|
589
615
|
klass = _klass_new
|
590
|
-
if(maybe_block.arity > 0)
|
616
|
+
if (maybe_block.arity > 0)
|
591
617
|
klass.instance_exec(klass, &maybe_block)
|
592
618
|
else
|
593
619
|
klass.instance_exec(&maybe_block)
|
@@ -598,6 +624,7 @@ class AttributeStruct < BasicObject
|
|
598
624
|
end
|
599
625
|
end
|
600
626
|
end
|
627
|
+
|
601
628
|
alias_method :array!, :_array
|
602
629
|
|
603
630
|
# Instance responds to method name
|
@@ -613,7 +640,7 @@ class AttributeStruct < BasicObject
|
|
613
640
|
# @param konst [Symbol, String]
|
614
641
|
# @return [Object, NilClass]
|
615
642
|
def _objectified_constant_lookup(konst)
|
616
|
-
if(konst.to_s[0].match(/[A-Z]/) && ::Object.const_defined?(konst))
|
643
|
+
if (konst.to_s[0].match(/[A-Z]/) && ::Object.const_defined?(konst))
|
617
644
|
::Object.const_get(konst)
|
618
645
|
end
|
619
646
|
end
|
@@ -622,7 +649,7 @@ class AttributeStruct < BasicObject
|
|
622
649
|
#
|
623
650
|
# @return [TrueClass]
|
624
651
|
def _kernelify
|
625
|
-
unless(kernelified?)
|
652
|
+
unless (kernelified?)
|
626
653
|
@_kernelified = true
|
627
654
|
(::Kernel.public_instance_methods + ::Kernel.private_instance_methods).each do |m_name|
|
628
655
|
self.instance_eval("def #{m_name}(*a, &b); ::Kernel.instance_method(:#{m_name}).bind(self).curry.call(*a, &b); end")
|
@@ -630,6 +657,7 @@ class AttributeStruct < BasicObject
|
|
630
657
|
end
|
631
658
|
true
|
632
659
|
end
|
660
|
+
|
633
661
|
alias_method :kernelify!, :_kernelify
|
634
662
|
|
635
663
|
# @return [TrueClass, FalseClass] Kernel methods have been injected
|
@@ -643,28 +671,29 @@ class AttributeStruct < BasicObject
|
|
643
671
|
end
|
644
672
|
|
645
673
|
# @return [AttributeStruct] clone of current instance
|
646
|
-
def _clone(_new_parent=nil)
|
674
|
+
def _clone(_new_parent = nil)
|
647
675
|
_cloned_inst = _klass_new
|
648
676
|
_cloned_inst._data.replace __hashish[
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
677
|
+
@table.map { |_key, _value|
|
678
|
+
if (_key.is_a?(::AttributeStruct))
|
679
|
+
_key = _key._clone
|
680
|
+
else
|
681
|
+
_key = _do_dup(_key)
|
682
|
+
end
|
683
|
+
if (_value.is_a?(::AttributeStruct))
|
684
|
+
_value = _value._clone
|
685
|
+
else
|
686
|
+
_value = _do_dup(_value)
|
687
|
+
end
|
688
|
+
[_key, _value]
|
689
|
+
}
|
690
|
+
]
|
663
691
|
_cloned_inst._parent(_new_parent) if _new_parent
|
664
692
|
_cloned_inst
|
665
693
|
end
|
694
|
+
|
666
695
|
alias_method :clone!, :_clone
|
667
696
|
end
|
668
697
|
|
669
|
-
require
|
670
|
-
require
|
698
|
+
require "attribute_struct/attribute_hash"
|
699
|
+
require "attribute_struct/version"
|
@@ -1,10 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "attribute_struct"
|
2
2
|
|
3
3
|
class AttributeStruct
|
4
4
|
# AttributeStruct expanded class that include the Kernel module
|
5
5
|
# and automatically objectifies the instance
|
6
6
|
class Augmented < ::AttributeStruct
|
7
|
-
|
8
7
|
include ::Kernel
|
9
8
|
|
10
9
|
# Create a new Augmented AttributeStruct instance. Passes arguments
|
@@ -21,6 +20,5 @@ class AttributeStruct
|
|
21
20
|
def _klass
|
22
21
|
::AttributeStruct::Augmented
|
23
22
|
end
|
24
|
-
|
25
23
|
end
|
26
24
|
end
|
@@ -1,13 +1,10 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
unless(defined?(MonkeyCamels))
|
1
|
+
require "attribute_struct"
|
4
2
|
|
3
|
+
unless (defined?(MonkeyCamels))
|
5
4
|
module MonkeyCamels
|
6
|
-
|
7
5
|
class << self
|
8
6
|
def included(klass)
|
9
7
|
klass.class_eval do
|
10
|
-
|
11
8
|
include Humps
|
12
9
|
|
13
10
|
alias_method :un_camel_to_s, :to_s
|
@@ -21,9 +18,9 @@ unless(defined?(MonkeyCamels))
|
|
21
18
|
# Create a camel copy based on settings
|
22
19
|
#
|
23
20
|
# @return [String]
|
24
|
-
def camel_initialize_copy(orig, hump=nil)
|
21
|
+
def camel_initialize_copy(orig, hump = nil)
|
25
22
|
new_val = un_camel_initialize_copy(orig)
|
26
|
-
if(hump.nil?)
|
23
|
+
if (hump.nil?)
|
27
24
|
orig._camel? ? new_val : new_val._no_hump
|
28
25
|
else
|
29
26
|
new_val._no_hump if hump == false
|
@@ -55,6 +52,7 @@ unless(defined?(MonkeyCamels))
|
|
55
52
|
@__not_camel = true
|
56
53
|
self
|
57
54
|
end
|
55
|
+
|
58
56
|
alias_method :disable_camel!, :_no_hump
|
59
57
|
|
60
58
|
# @return [self] enable camelizing
|
@@ -62,12 +60,14 @@ unless(defined?(MonkeyCamels))
|
|
62
60
|
@__not_camel = false
|
63
61
|
self
|
64
62
|
end
|
63
|
+
|
65
64
|
alias_method :camel!, :_hump
|
66
65
|
|
67
66
|
# @return [Symbol, NilClass] style of hump
|
68
67
|
def _hump_style
|
69
68
|
@__hump_style
|
70
69
|
end
|
70
|
+
|
71
71
|
alias_method :hump_style!, :_hump_style
|
72
72
|
|
73
73
|
# Set hump style to non-leading upcase
|
@@ -78,6 +78,7 @@ unless(defined?(MonkeyCamels))
|
|
78
78
|
@__hump_style = :no_leading_hump
|
79
79
|
self
|
80
80
|
end
|
81
|
+
|
81
82
|
alias_method :bactrian!, :_bactrian
|
82
83
|
alias_method :no_leading_hump!, :_bactrian
|
83
84
|
|
@@ -89,11 +90,10 @@ unless(defined?(MonkeyCamels))
|
|
89
90
|
@__hump_style = :leading_hump
|
90
91
|
self
|
91
92
|
end
|
93
|
+
|
92
94
|
alias_method :dromedary!, :_dromedary
|
93
95
|
alias_method :leading_hump!, :_dromedary
|
94
|
-
|
95
96
|
end
|
96
|
-
|
97
97
|
end
|
98
98
|
|
99
99
|
# Force some monkeys around
|
@@ -102,13 +102,12 @@ unless(defined?(MonkeyCamels))
|
|
102
102
|
|
103
103
|
# Specialized String type
|
104
104
|
class CamelString < String
|
105
|
-
def initialize(val=nil)
|
105
|
+
def initialize(val = nil)
|
106
106
|
super
|
107
|
-
if(val.respond_to?(:_camel?))
|
107
|
+
if (val.respond_to?(:_camel?))
|
108
108
|
_no_hump unless val._camel?
|
109
109
|
@__hump_style = val._hump_style
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
114
113
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attribute_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Roberts
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bogo
|
@@ -30,6 +30,48 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.3.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rspec
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.5'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.5'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '10'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '10'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rufo
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.3.0
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.3.0
|
33
75
|
- !ruby/object:Gem::Dependency
|
34
76
|
name: minitest
|
35
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
124
|
version: '0'
|
83
125
|
requirements: []
|
84
126
|
rubyforge_project:
|
85
|
-
rubygems_version: 2.
|
127
|
+
rubygems_version: 2.7.6
|
86
128
|
signing_key:
|
87
129
|
specification_version: 4
|
88
130
|
summary: Attribute structures
|