hash_wia 0.7.2 → 0.7.7

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: b04e3c95e0dc2110c6d95ef47b4c516a687115a54afd7b70a53e3b154830d430
4
- data.tar.gz: 836ba57d4c12ba93887edee22185b8f375831deb490ea1d136115823ce0ba0f1
3
+ metadata.gz: afe16ea4e4d8f3fdb8aeb049db4b22841a5b3ac195dd8fe017d6c48dca229de6
4
+ data.tar.gz: 46633e2df0827031dbafdbb8ad335975329d2c876c1209b21a2ec98c15ec10d2
5
5
  SHA512:
6
- metadata.gz: 0ad0138042f331794ec9430f65b20a6a3519a1a5f6073f01ea654e4d0fffea009df09f80d71e2902ac165d490ae17bbf3d304ae2857b38a6bb40ffa3ca6bf83f
7
- data.tar.gz: 589607252b2e044ee2800d99bb0807fd2a50738bf164c58dc0d2a327e57029364b8972505ce6472729dd95082a36c5ccebf89c38015d10c8be78b99da280cd8a
6
+ metadata.gz: 6563528dd2841ce621639b3c2d96b29d8299d9ec335f99d83b647d91e421c5192d9ffd3eaa0748c217e34219ac6a57844f284d345fd9d4e019341f0abf49e849
7
+ data.tar.gz: 4517ab23a0a7d2246483f16037dfe949a6264a73ce8e82ec3136651083402bfe8dfec468c72bc7b4cf782cba53e5fe4a4fbecacd1b8970b3b3654997f8c302f2
data/.version CHANGED
@@ -1 +1 @@
1
- 0.7.2
1
+ 0.7.7
@@ -1,4 +1,52 @@
1
1
  class HashWia < Hash
2
- STRUCTS = {}
3
2
  include HashWiaModule
4
3
  end
4
+
5
+ class HashWia
6
+ class NamedOptions
7
+ def initialize hash
8
+ @hash = hash
9
+ end
10
+
11
+ def set code, constant, name = nil
12
+ unless name
13
+ name = constant.keys.first
14
+ constant = constant.values.first
15
+ end
16
+
17
+ @hash[code.to_s] = name.to_s
18
+ @hash[constant.to_s] = code.to_s
19
+ end
20
+
21
+ def method_missing code, *args
22
+ self.set code, *args
23
+ end
24
+ end
25
+ end
26
+
27
+ # to create Task::STATUS and Task.status
28
+ # HashWia self, :status do |opt|
29
+ #
30
+ # or just to get a hash
31
+ # HashWia do |opt|
32
+ # opt.DONE d: 'Done'
33
+ # # or
34
+ # opt.DONE :d, 'Done'
35
+ # end
36
+ def HashWia klass = nil, name = nil
37
+ if block_given?
38
+ hash = HashWia.new
39
+
40
+ if name
41
+ constant = name.to_s.upcase
42
+ klass.const_set constant, hash
43
+ klass.define_singleton_method(name) { klass.const_get(constant) }
44
+ end
45
+
46
+ named_opts = HashWia::NamedOptions.new hash
47
+ yield named_opts
48
+ hash
49
+ else
50
+ raise ArgumentError, 'Block not provided'
51
+ end
52
+ end
@@ -5,18 +5,31 @@ module HashWiaModule
5
5
  end
6
6
  end
7
7
 
8
+ # overload common key names with
9
+ %i(size length zip minmax store cycle chunk sum uniq chain).each do |el|
10
+ define_method el do
11
+ self[el]
12
+ end
13
+ end
14
+
8
15
  def [] key
9
16
  data = super key
10
17
  data = super key.to_s if data.nil?
11
18
  data = super key.to_sym if key.respond_to?(:to_sym) && data.nil?
12
19
 
13
20
  # if we are returning hash as a value, just include with wia methods hash
14
- data.extend HashWiaModule if data.is_a?(Hash)
21
+ if data.is_a?(Hash)
22
+ data.extend HashWiaModule
23
+ end
15
24
 
16
25
  data
17
26
  end
18
27
 
19
28
  def []= key, value
29
+ if @frozen_keys
30
+ raise NoMethodError, "Hash keys are frozen and can't be modified"
31
+ end
32
+
20
33
  delete key
21
34
  super key, value
22
35
  end
@@ -37,7 +50,7 @@ module HashWiaModule
37
50
  # key is common id direct access
38
51
  # allow direct get or fuction the same if name given
39
52
  def key name=nil
40
- name ? self[name] : self[:key]
53
+ name.nil? ? self[:key] : self[name.to_s]
41
54
  end
42
55
 
43
56
  # true clone of the hash with 0 references to the old one
@@ -51,6 +64,23 @@ module HashWiaModule
51
64
  end
52
65
  end
53
66
 
67
+ def freeze_keys!
68
+ @frozen_keys = true
69
+ self
70
+ end
71
+
72
+ def each &block
73
+ to_a.each do |key, data|
74
+ if data.is_a?(Hash)
75
+ data.extend HashWiaModule
76
+ end
77
+
78
+ block.call key, data
79
+ end
80
+
81
+ self
82
+ end
83
+
54
84
  def method_missing name, *args, &block
55
85
  strname = name.to_s
56
86
 
@@ -67,9 +97,11 @@ module HashWiaModule
67
97
  if block
68
98
  # h.foo { rand }
69
99
  self[name] = block
70
- else
100
+ elsif !keys.include?(name.to_sym)
71
101
  # h.foo
72
- raise ArgumentError.new('%s not defined' % strname)
102
+ raise NoMethodError.new('%s not defined' % strname)
103
+ else
104
+ nil
73
105
  end
74
106
  else
75
107
  value
@@ -5,13 +5,16 @@ class Hash
5
5
  unless args.first
6
6
  HashWia.new self
7
7
  else
8
- list = args.flatten
9
- name = 'DynStruct_' + list.join('_')
10
- HashWia::STRUCTS[name] ||= ::Struct.new(name, *list)
8
+ list = args.flatten
9
+ extra = keys - list
11
10
 
12
- HashWia::STRUCTS[name].new.tap do |o|
13
- each do |k, v|
14
- o.send('%s=' % k, v) unless v.nil?
11
+ if extra.first
12
+ raise ArgumentError.new('Unallowed key/s: %s' % extra.map{ |_| ':%s' % _ }.join(', '))
13
+ end
14
+
15
+ HashWia.new.tap do |o|
16
+ list.each do |k|
17
+ o[k] = self[k]
15
18
  end
16
19
  end
17
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_wia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-27 00:00:00.000000000 Z
11
+ date: 2022-02-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Gem provides simple access to common Ruby hash types bundled in one simple
14
14
  class
@@ -26,7 +26,7 @@ homepage: https://github.com/dux/hash_wia
26
26
  licenses:
27
27
  - MIT
28
28
  metadata: {}
29
- post_install_message:
29
+ post_install_message:
30
30
  rdoc_options: []
31
31
  require_paths:
32
32
  - lib
@@ -41,8 +41,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  requirements: []
44
- rubygems_version: 3.0.6
45
- signing_key:
44
+ rubygems_version: 3.2.22
45
+ signing_key:
46
46
  specification_version: 4
47
47
  summary: Hash with indifferent access + goodies
48
48
  test_files: []