clean-hash 0.4.1 → 0.5.0

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: c8da8615041dbba1d87e61ea20b29829ec35a5c6143020b2da7195cd39807dc1
4
- data.tar.gz: 03e0e0588325dca5eb1ad9c61fbace8efc0541f7c46a54c669a9aa2b798bd9ea
3
+ metadata.gz: bca462b038bfca67047b36bb224811ddc6e0bd479418c015b6fb4db81aa27a5f
4
+ data.tar.gz: 12cd3f411a29764539e7f4056a37edb1b7aecb9fb6b10a3c074c4f828f9c3e8f
5
5
  SHA512:
6
- metadata.gz: 16687111810848bf0fad3a7f00560621d96b0be2aadc6593536f1e11a9e787f25716a42ff1e92ac2efe41a6cb713d7ad3776dea72b897143a292717e21679a85
7
- data.tar.gz: ebd5a5eafbf830059730a6b1e9c1a375f2a0e5cc194f6b4bee279b9d1bcaebe994d702d57226b48ce7b5f1e244f06343343c09115b28a7e774acf20e93a10194
6
+ metadata.gz: e79d1c984d8afa266df0bb1b38d8c0c868d5f1446d97c37887568766156273f009a8ae22b900e12e3188ea5af9aff5c1de574fc583db463d1de725358a241e1b
7
+ data.tar.gz: 7073960b6690ab77393f8612ff134d26db236149d66ad9934d1b4b04dcc2502522c0ab2eebeb4daf87a2504c8c0a559e450633f5d5a5f664d8ae9ab4086effdc
data/.version CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.5.0
@@ -1,8 +1,11 @@
1
1
  require 'hashie'
2
2
 
3
3
  require_relative 'clean-hash/base'
4
+ require_relative 'clean-hash/types/indifferent_type'
5
+ require_relative 'clean-hash/types/mutex_type'
6
+ require_relative 'clean-hash/types/safe_type'
7
+ require_relative 'clean-hash/types/strict_type'
8
+ require_relative 'clean-hash/types/struct_type'
4
9
  require_relative 'clean-hash/deep_merge'
5
- require_relative 'clean-hash/mutex_hash'
6
- require_relative 'clean-hash/opts_hash'
7
10
  require_relative 'clean-hash/hash_pollute'
8
11
 
@@ -1,104 +1,18 @@
1
1
  class CleanHash
2
- def initialize data, mode=nil
3
- @data = data
4
- @mode = mode
5
-
6
- case mode
2
+ def self.create type, data={}
3
+ case type
4
+ when :indifferent
5
+ ::CleanHash::Indifferent.new data
7
6
  when :safe
8
- @is_safe = true
7
+ ::CleanHash::Safe.new data
8
+ when :strict
9
+ ::CleanHash::Strict.new data
10
+ when :stuct
11
+ ::CleanHash.create_strut data
12
+ when :mutex
13
+ ::CleanHash::MutexHash.new data
9
14
  else
10
- @is_strict = true if mode
15
+ raise ArgumentError, 'Unsupported type: %s' % type
11
16
  end
12
17
  end
13
-
14
- # for debug
15
- def to_json
16
- JSON.pretty_generate @data
17
- end
18
-
19
- # for puts
20
- def to_ary
21
- [@data]
22
- end
23
-
24
- def [] key
25
- data = @data[key.to_sym]
26
- data = @data[key.to_s] if data.nil?
27
-
28
- if data.nil?
29
- if @is_strict && !keys.include?(key.to_sym)
30
- raise NoMethodError, 'Clean hash: key "%s" not found (%s)' % [key, keys]
31
- else
32
- nil
33
- end
34
- elsif data.is_a?(Hash)
35
- CleanHash.new data, @mode
36
- else
37
- data
38
- end
39
- end
40
-
41
- def []= key, value
42
- key = key.to_sym unless key.class == Symbol
43
-
44
- __error_set if @is_strict && !key?(key)
45
-
46
- if @is_safe
47
- value = value.to_s if value.is_a?(Symbol)
48
-
49
- unless value.nil? || value.is_a?(Hash) || value.is_a?(Numeric) || value.is_a?(String)
50
- raise ArgumentError.new('Unsupported safe type: %s' % value.class)
51
- end
52
- end
53
-
54
- @data.delete(key.to_s)
55
-
56
- @data[key] = value
57
- end
58
-
59
- def key? name
60
- self[name]
61
- true
62
- rescue NoMethodError
63
- false
64
- end
65
-
66
- def keys
67
- @data.keys
68
- end
69
-
70
- def values
71
- @data.values
72
- end
73
-
74
- def to_h
75
- @data
76
- end
77
-
78
- def to_json *args
79
- @data.to_json *args
80
- end
81
-
82
- def method_missing name, *args
83
- m = name.to_s
84
-
85
- if m.end_with?('=')
86
- m = m.sub('=', '')
87
- self[m] = args.first
88
- elsif m.end_with?('?')
89
- begin
90
- !self[m.sub('?', '')].nil?
91
- rescue NoMethodError
92
- false
93
- end
94
- else
95
- self[m]
96
- end
97
- end
98
-
99
- private
100
-
101
- def __error_set
102
- raise NoMethodError, 'Clean hash: setting a key value is not allowedß'
103
- end
104
- end
18
+ end
@@ -14,34 +14,13 @@ class CleanHash
14
14
 
15
15
  def to_ch mode=nil
16
16
  if mode.is_a?(Array)
17
- for key in keys
18
- raise ArgumentError, 'CleanHash key "%s" not allowed' % key unless mode.include?(key)
19
- end
20
-
21
- for key in mode
22
- self[key] = nil unless key?(key)
23
- end
24
-
25
- ::CleanHash::OptsHash.new self
17
+ mode.each { |el| self[el] = nil if self[el].nil? }
18
+ ::CleanHash.create_struct self
26
19
  else
27
- supported = %i{safe mutex strict}
28
- raise ArgumentError, 'Unsupported type "%s", supported: %s' % [mode, supported] if mode && !supported.include?(mode)
29
-
30
- if mode == :mutex
31
- ::CleanHash::MutexHash.new self
32
- else
33
- ::CleanHash.new self, mode
34
- end
20
+ mode ||= :indifferent
21
+ ::CleanHash.create mode, self
35
22
  end
36
23
  end
37
24
  end
38
-
39
- ::Array.class_eval do
40
- # coverts keys to empty hash methods and returns read_only hash
41
- def to_ch strict=false
42
- hash = inject({}) { |h, key| h[key] = nil; h }
43
- ::CleanHash::OptsHash.new hash
44
- end
45
- end
46
25
  end
47
26
  end
@@ -0,0 +1,73 @@
1
+ class CleanHash
2
+ class Indifferent
3
+ def initialize data
4
+ @data = data
5
+ end
6
+
7
+ # for debug
8
+ def to_json
9
+ JSON.pretty_generate @data
10
+ end
11
+
12
+ # for puts
13
+ def to_ary
14
+ [@data]
15
+ end
16
+
17
+ def key? name
18
+ @data.key?(name.to_sym) || @data.key?(name.to_s)
19
+ end
20
+
21
+ def keys
22
+ @data.keys
23
+ end
24
+
25
+ def values
26
+ @data.values
27
+ end
28
+
29
+ def to_h
30
+ @data
31
+ end
32
+
33
+ def to_json *args
34
+ @data.to_json *args
35
+ end
36
+
37
+ def [] key
38
+ data = @data[key.to_sym]
39
+ data = @data[key.to_s] if data.nil?
40
+
41
+ if data.is_a?(Hash)
42
+ self.class.new data
43
+ else
44
+ data
45
+ end
46
+ end
47
+
48
+ def []= key, value
49
+ key = key.to_sym unless key.class == Symbol
50
+ @data.delete(key.to_s)
51
+ @data[key] = value
52
+ end
53
+
54
+ def method_missing name, *args, &block
55
+ m = name.to_s
56
+
57
+ if m.end_with?('=')
58
+ m = m.sub('=', '')
59
+ self[m] = args.first
60
+ elsif m.end_with?('?')
61
+ begin
62
+ !self[m.sub('?', '')].nil?
63
+ rescue NoMethodError
64
+ false
65
+ end
66
+ elsif block
67
+ self[m] = block
68
+ else
69
+ self[m]
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,13 @@
1
+ class CleanHash
2
+ class Safe < Indifferent
3
+ def []= key, value
4
+ value = value.to_s if value.is_a?(Symbol)
5
+
6
+ unless value.nil? || value.is_a?(Hash) || value.is_a?(Numeric) || value.is_a?(String)
7
+ raise ArgumentError.new('Unsupported safe type: %s' % value.class)
8
+ end
9
+
10
+ super
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # Type good for configurations
2
+
3
+ class CleanHash
4
+ class Strict < Indifferent
5
+ def [] key
6
+ _check_key_existance key
7
+ super
8
+ end
9
+
10
+ def []= key, value
11
+ _check_key_existance key
12
+ super
13
+ end
14
+
15
+ private
16
+
17
+ def _check_key_existance key
18
+ raise ArgumentError.new('Key not found: %s' % key) unless key?(key)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ # Creates dynamic struct based on arguments
2
+
3
+ class CleanHash
4
+ STRUCTS = {}
5
+
6
+ def self.create_struct hash
7
+ raise ArgumentError.new('Not a hash') unless hash.is_a?(Hash)
8
+
9
+ name = 'DynStruct_' + hash.keys.join('_')
10
+ STRUCTS[name] ||= ::Struct.new(name, *hash.keys.sort)
11
+
12
+ STRUCTS[name].new.tap do |o|
13
+ hash.each do |k, v|
14
+ o.send('%s=' % k, v) unless v.nil?
15
+ end
16
+ end
17
+ end
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clean-hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-01 00:00:00.000000000 Z
11
+ date: 2020-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -35,9 +35,12 @@ files:
35
35
  - "./lib/clean-hash/base.rb"
36
36
  - "./lib/clean-hash/deep_merge.rb"
37
37
  - "./lib/clean-hash/hash_pollute.rb"
38
- - "./lib/clean-hash/mutex_hash.rb"
39
- - "./lib/clean-hash/opts_hash.rb"
40
38
  - "./lib/clean-hash/pollute.rb"
39
+ - "./lib/clean-hash/types/indifferent_type.rb"
40
+ - "./lib/clean-hash/types/mutex_type.rb"
41
+ - "./lib/clean-hash/types/safe_type.rb"
42
+ - "./lib/clean-hash/types/strict_type.rb"
43
+ - "./lib/clean-hash/types/struct_type.rb"
41
44
  homepage: https://github.com/dux/clean-hash
42
45
  licenses:
43
46
  - MIT
@@ -1,41 +0,0 @@
1
- # @ivars = [:foo, :bar].to_ch
2
- # @ivars = {foo: nil, bar: 2}.to_ch [:foo, :bar, :baz]
3
-
4
- class CleanHash
5
- class OptsHash
6
- def initialize *hash
7
- if hash.first.class == Hash
8
- @hash = hash.first
9
- else
10
- @hash = hash.inject({}) { |h, el| h[el.to_sym] = nil; h }
11
- end
12
- end
13
-
14
- def [] key
15
- method_missing key
16
- end
17
-
18
- def []= key, value
19
- method_missing '%s=' % key, value
20
- end
21
-
22
- def method_missing name, value=nil
23
- name = name.to_s
24
- is_set = !!name.sub!('=', '')
25
- name = name.to_sym
26
-
27
- raise NoMethodError.new('Key %s not found' % name) unless @hash.has_key?(name)
28
-
29
- if is_set
30
- @hash[name] = value
31
- else
32
- @hash[name]
33
- end
34
- end
35
-
36
- def to_h
37
- @hash.dup
38
- end
39
- end
40
- end
41
-