hash_wia 0.7.2 → 0.7.7

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 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: []