deep-hash-struct 0.1.2 → 0.1.3

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.
@@ -1,503 +1,5 @@
1
- require "deep/hash/struct/version"
2
1
  require "json"
3
-
4
- module Deep
5
- module Hash
6
- module Struct
7
- class Wrapper
8
- attr_accessor :default
9
-
10
- def initialize(h = {})
11
- return if h.nil? || h.count.zero?
12
- wrap h, self
13
- end
14
-
15
- def keys
16
- instance_variables.select { |k| k !~ /default/ }.map do |k|
17
- k.to_s[1..-1].to_sym
18
- end
19
- end
20
-
21
- def values
22
- keys.map do |k|
23
- self[k]
24
- end
25
- end
26
-
27
- def [](k)
28
- __send__ k
29
- end
30
-
31
- def []=(k, v)
32
- __send__ "#{k}=", v
33
- end
34
-
35
- def ==(hash)
36
- if hash.class == self.class
37
- to_h == hash.to_h
38
- else
39
- to_h == hash
40
- end
41
- end
42
-
43
- def ===(klass)
44
- self.class == klass
45
- end
46
-
47
- def each
48
- if block_given?
49
- keys.each do |k|
50
- yield k, self[k]
51
- end
52
- else
53
- to_h.each
54
- end
55
- end
56
-
57
- def each_with_index
58
- index = 0
59
- keys.each do |k|
60
- yield [k, self[k]], index
61
- index += 1
62
- end
63
- end
64
-
65
- def each_with_object(init)
66
- each do |k, v|
67
- yield [k, v], init
68
- end
69
-
70
- init
71
- end
72
-
73
- def each_key
74
- keys.each do |k|
75
- yield k
76
- end
77
- end
78
-
79
- def each_value
80
- values.each do |v|
81
- yield v
82
- end
83
- end
84
-
85
- def count
86
- keys.size
87
- end
88
- alias size count
89
-
90
- def blank?
91
- keys.size.zero?
92
- end
93
-
94
- def present?
95
- !blank?
96
- end
97
-
98
- def dig(*syms)
99
- syms.inject(self) do |h, k|
100
- h[k]
101
- end
102
- rescue
103
- nil
104
- end
105
-
106
- def merge(hash)
107
- klass = dup
108
-
109
- hash.each do |k, v|
110
- klass[k] = v
111
- end
112
-
113
- klass
114
- end
115
-
116
- def merge!(hash)
117
- hash.each do |k, v|
118
- self[k] = v
119
- end
120
- self
121
- end
122
- alias update merge!
123
-
124
- def deep_merge(hash, klass = self)
125
- klass = klass.dup
126
-
127
- hash.each do |k , v|
128
- klass[k] = hash?(v) ? klass.deep_merge(v, klass[k]) : v
129
- end
130
-
131
- klass
132
- end
133
-
134
- def deep_merge!(hash, klass = self)
135
- hash.each do |k, v|
136
- klass[k] = hash?(v) ? deep_merge!(v, klass[k]) : v
137
- end
138
-
139
- klass
140
- end
141
-
142
- def reverse_merge(hash)
143
- klass = dup
144
-
145
- hash.each do |k, v|
146
- klass[k] = v if klass.exclude?(k)
147
- end
148
-
149
- klass
150
- end
151
-
152
- def reverse_merge!(hash)
153
- hash.each do |k, v|
154
- self[k] = v if exclude?(k)
155
- end
156
-
157
- self
158
- end
159
-
160
- def reverse_deep_merge(hash, klass = self)
161
- klass = klass.dup
162
-
163
- hash.each do |k , v|
164
- next if !hash?(v) && klass.include?(k)
165
- klass[k] = hash?(v) ? klass.reverse_deep_merge(v, klass[k]) : v
166
- end
167
-
168
- klass
169
- end
170
-
171
- def reverse_deep_merge!(hash)
172
- hash.each do |k, v|
173
- next if !hash?(v) && include?(k)
174
- self[k] = hash?(v) ? reverse_deep_merge(v, self[k]) : v
175
- end
176
-
177
- self
178
- end
179
-
180
- def fetch(k, msg = nil)
181
- v = self[k]
182
- if block_given?
183
- if v.class == self.class || v.nil?
184
- yield k
185
- else
186
- v
187
- end
188
- else
189
- case v
190
- when self.class
191
- if v.blank?
192
- msg
193
- else
194
- to_h
195
- end
196
- when nil
197
- msg
198
- else
199
- v
200
- end
201
- end
202
- end
203
-
204
- def map
205
- vs = []
206
-
207
- each do |k, v|
208
- vs << yield(k, v)
209
- end
210
-
211
- vs
212
- end
213
- alias collect map
214
-
215
- def map_key
216
- vs = []
217
-
218
- keys.each do |k|
219
- vs << yield(k)
220
- end
221
-
222
- vs
223
- end
224
-
225
- def map_value
226
- vs = []
227
-
228
- values.each do |v|
229
- vs << yield(v)
230
- end
231
-
232
- vs
233
- end
234
-
235
- def fetch_values(*syms)
236
- syms.map do |sym|
237
- if block_given?
238
- if keys.include?(sym)
239
- self[sym]
240
- else
241
- yield sym
242
- end
243
- else
244
- raise KeyError, "key not found: :#{sym}" unless keys.include?(sym)
245
- self[sym]
246
- end
247
- end
248
- end
249
-
250
- def values_at(*syms)
251
- syms.map do |sym|
252
- v = self[sym]
253
- (v.nil? || (v.class == self.class && v.blank?)) ? nil : v
254
- end
255
- end
256
-
257
- def invert
258
- each_with_object({}) do |(k, v), h|
259
- h[v] = k
260
- end
261
- end
262
-
263
- def delete(k)
264
- remove_instance_variable "@#{k}"
265
- end
266
-
267
- def delete_if
268
- each do |k, v|
269
- remove_instance_variable "@#{k}" if yield(k, v)
270
- end
271
- self
272
- end
273
-
274
- def find
275
- klass = self.class.new
276
-
277
- each do |k, v|
278
- if yield(k, v)
279
- klass[k] = v
280
- break
281
- end
282
- end
283
-
284
- klass
285
- end
286
-
287
- def select
288
- klass = self.class.new
289
-
290
- each do |k, v|
291
- klass[k] = v if yield(k, v)
292
- end
293
-
294
- klass
295
- end
296
- alias find_all select
297
-
298
- def reject
299
- klass = self.class.new
300
-
301
- each do |k, v|
302
- klass[k] = v unless yield(k, v)
303
- end
304
-
305
- klass
306
- end
307
-
308
- def reject!
309
- each do |k, v|
310
- remove_instance_variable "@#{k}" if yield(k, v)
311
- end
312
- self
313
- end
314
-
315
- def inject(init = 0)
316
- value = init.dup
317
- each do |k, v|
318
- val = yield init.dup, [k, v]
319
- next if val.nil?
320
- value += val
321
- end
322
- value
323
- end
324
- alias reduce inject
325
-
326
- def clear
327
- each_key do |k|
328
- remove_instance_variable "@#{k}"
329
- end
330
- self
331
- end
332
-
333
- def replace(other)
334
- h = if other.class == self.class
335
- other.to_hash
336
- elsif hash? other
337
- other
338
- else
339
- other.to_hash
340
- end
341
-
342
- clear
343
- wrap h, self
344
- end
345
-
346
- def flatten
347
- to_h.flatten
348
- end
349
-
350
- def has_key?(k)
351
- keys.include? k
352
- end
353
- alias include? has_key?
354
-
355
- def has_keys?(*syms)
356
- syms.inject(self) do |klass, sym|
357
- val = klass[sym]
358
- return false if val.class == self.class && val.blank?
359
- klass[sym]
360
- end
361
- true
362
- end
363
-
364
- def exclude?(k)
365
- !include? k
366
- end
367
-
368
- def sort
369
- to_h.sort
370
- end
371
-
372
- def shift
373
- k = keys.first
374
- [k, remove_instance_variable("@#{k}")]
375
- end
376
-
377
- def to_a
378
- to_h.to_a
379
- end
380
- alias to_ary to_a
381
-
382
- def compact
383
- klass = dup
384
-
385
- klass.each do |k, v|
386
- klass.remove_instance_variable("@#{k}") if (v.class == self.class && v.blank?) || v.nil?
387
- end
388
-
389
- klass
390
- end
391
-
392
- def compact!
393
- each do |k, v|
394
- remove_instance_variable("@#{k}") if (v.class == self.class && v.blank?) || v.nil?
395
- end
396
-
397
- self
398
- end
399
-
400
- def deep_compact
401
- klass = dup
402
-
403
- klass.each do |k, v|
404
- flag = if v.class == self.class
405
- klass[k] = v.deep_compact
406
- klass[k].present?
407
- else
408
- !v.nil?
409
- end
410
- next if flag
411
- klass.remove_instance_variable("@#{k}")
412
- end
413
-
414
- klass
415
- end
416
-
417
- def deep_compact!
418
- each do |k, v|
419
- flag = if v.class == self.class
420
- self[k] = v.deep_compact
421
- self[k].present?
422
- else
423
- !v.nil?
424
- end
425
- next if flag
426
- remove_instance_variable("@#{k}")
427
- end
428
-
429
- self
430
- end
431
-
432
- def slice(*syms)
433
- klass = self.class.new
434
-
435
- each_key do |k|
436
- klass[k] = self[k] if syms.map(&:to_sym).include?(k)
437
- end
438
-
439
- klass
440
- end
441
-
442
- def slice!(*syms)
443
- each_key do |k|
444
- remove_instance_variable("@#{k}") unless syms.map(&:to_sym).include?(k)
445
- end
446
-
447
- self
448
- end
449
-
450
- def to_hash
451
- deep_hash self
452
- end
453
- alias to_h to_hash
454
-
455
- def to_json
456
- to_h.to_json
457
- end
458
-
459
- private
460
-
461
- def method_missing(method_name, arg = nil)
462
- name = method_name.to_s.delete("=")
463
-
464
- if method_name.to_s.end_with? "="
465
- instance_variable_set "@#{name}", hash?(arg) ? wrap(arg) : arg
466
- elsif block_given?
467
- __send__ "#{name}=", yield
468
- else
469
- val = instance_variable_get "@#{name}"
470
- return val unless val.nil?
471
- instance_variable_set "@#{name}", default.dup || self.class.new
472
- end
473
- rescue => e
474
- super
475
- end
476
-
477
- def deep_hash(klass)
478
- h = {}
479
-
480
- klass.each do |k, v|
481
- h[k] = v.class == self.class ? deep_hash(v) : v
482
- end
483
-
484
- h
485
- end
486
-
487
- def wrap(hash, klass = nil)
488
- base = klass || self.class.new
489
-
490
- hash.each do |k, v|
491
- base[k] = hash?(v) ? wrap(v) : v
492
- end
493
-
494
- base
495
- end
496
-
497
- def hash?(val)
498
- !val.is_a?(Array) && val.respond_to?(:each)
499
- end
500
- end
501
- end
502
- end
503
- end
2
+ require "deep/hash/struct/pp"
3
+ require "deep/hash/struct/wrapper"
4
+ require "deep/hash/struct/dashboard"
5
+ require "deep/hash/struct/error"