striuct 0.6.1 → 0.7.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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +19 -39
  4. data/lib/striuct.rb +3 -3
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +15 -13
  7. data/lib/striuct/classmethods/attributes.rb +94 -92
  8. data/lib/striuct/classmethods/conflict_management.rb +109 -106
  9. data/lib/striuct/classmethods/constructor.rb +47 -54
  10. data/lib/striuct/classmethods/copy.rb +45 -43
  11. data/lib/striuct/classmethods/default.rb +23 -21
  12. data/lib/striuct/classmethods/enum.rb +46 -44
  13. data/lib/striuct/classmethods/fix.rb +23 -21
  14. data/lib/striuct/classmethods/hashdeepdupulicatable.rb +15 -15
  15. data/lib/striuct/classmethods/inner.rb +57 -55
  16. data/lib/striuct/classmethods/length.rb +12 -10
  17. data/lib/striuct/classmethods/macro.rb +110 -106
  18. data/lib/striuct/classmethods/names.rb +69 -65
  19. data/lib/striuct/classmethods/predicate.rb +131 -129
  20. data/lib/striuct/classmethods/requirements.rb +3 -1
  21. data/lib/striuct/classmethods/to_struct.rb +21 -18
  22. data/lib/striuct/classmethods/validation.rb +15 -13
  23. data/lib/striuct/instancemethods/README.md +2 -2
  24. data/lib/striuct/instancemethods/assign.rb +29 -27
  25. data/lib/striuct/instancemethods/cast.rb +28 -26
  26. data/lib/striuct/instancemethods/compare.rb +26 -24
  27. data/lib/striuct/instancemethods/default.rb +31 -29
  28. data/lib/striuct/instancemethods/delegate_class_methods.rb +35 -33
  29. data/lib/striuct/instancemethods/enum.rb +86 -84
  30. data/lib/striuct/instancemethods/getter.rb +39 -37
  31. data/lib/striuct/instancemethods/hashy.rb +99 -97
  32. data/lib/striuct/instancemethods/keyvalidatable.rb +8 -6
  33. data/lib/striuct/instancemethods/lock.rb +46 -44
  34. data/lib/striuct/instancemethods/object.rb +50 -48
  35. data/lib/striuct/instancemethods/requirements.rb +11 -9
  36. data/lib/striuct/instancemethods/safety.rb +11 -9
  37. data/lib/striuct/instancemethods/setter.rb +46 -45
  38. data/lib/striuct/instancemethods/to_s.rb +39 -37
  39. data/lib/striuct/instancemethods/validation.rb +31 -29
  40. data/lib/striuct/instancemethods/values.rb +50 -48
  41. data/lib/striuct/requirements.rb +3 -1
  42. data/lib/striuct/singleton_class.rb +12 -17
  43. data/lib/striuct/structs.rb +3 -3
  44. metadata +33 -178
  45. data/.gitignore +0 -35
  46. data/.travis.yml +0 -17
  47. data/.yardopts +0 -1
  48. data/Gemfile +0 -11
  49. data/MIT-LICENSE +0 -22
  50. data/Rakefile +0 -11
  51. data/benchmark/basics.rb +0 -56
  52. data/example/README.rb +0 -50
  53. data/example/example1.rb +0 -195
  54. data/example/example2.rb +0 -20
  55. data/example/see_trace.rb +0 -32
  56. data/striuct.gemspec +0 -45
  57. data/test/helper.rb +0 -3
  58. data/test/test_sglc-constructor.rb +0 -36
  59. data/test/test_subc-c-add_members.rb +0 -13
  60. data/test/test_subc-c-close_member.rb +0 -36
  61. data/test/test_subc-c-constructor.rb +0 -92
  62. data/test/test_subc-c-copy.rb +0 -71
  63. data/test/test_subc-c-freeze.rb +0 -36
  64. data/test/test_subc-c-inheritable.rb +0 -58
  65. data/test/test_subc-c-safety_naming.rb +0 -73
  66. data/test/test_subc-f-alias_member.rb +0 -54
  67. data/test/test_subc-f-enum.rb +0 -159
  68. data/test/test_subc-f-predicate.rb +0 -647
  69. data/test/test_subc-f-to_struct.rb +0 -61
  70. data/test/test_subc-f-validation_util.rb +0 -59
  71. data/test/test_subc-f_debug.rb +0 -39
  72. data/test/test_subc-f_name.rb +0 -525
  73. data/test/test_subc-i-accessor.rb +0 -138
  74. data/test/test_subc-i-adjuster.rb +0 -95
  75. data/test/test_subc-i-assign.rb +0 -53
  76. data/test/test_subc-i-basic.rb +0 -43
  77. data/test/test_subc-i-cast.rb +0 -27
  78. data/test/test_subc-i-compare.rb +0 -52
  79. data/test/test_subc-i-copy.rb +0 -23
  80. data/test/test_subc-i-default_value.rb +0 -129
  81. data/test/test_subc-i-freeze.rb +0 -19
  82. data/test/test_subc-i-hashlike.rb +0 -144
  83. data/test/test_subc-i-keyvalidatable.rb +0 -25
  84. data/test/test_subc-i-lock.rb +0 -40
  85. data/test/test_subc-i-must.rb +0 -30
  86. data/test/test_subc-i-to_s_family.rb +0 -26
  87. data/test/test_subc-i-validation_specific_conditions.rb +0 -297
  88. data/test/test_subc-i-validation_with_getter.rb +0 -33
  89. data/test/test_version.rb +0 -13
@@ -1,47 +1,49 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Getter
3
+ class Striuct
4
+ module InstanceMethods
5
+ # @group Getter
4
6
 
5
- # @param [Symbol, String, #to_sym] autonym
6
- def fetch_by_autonym(autonym)
7
- autonym = autonym.to_sym
8
- raise NameError unless autonym? autonym
7
+ # @param [Symbol, String, #to_sym] autonym
8
+ def fetch_by_autonym(autonym)
9
+ autonym = autonym.to_sym
10
+ raise NameError unless autonym?(autonym)
9
11
 
10
- _get autonym
11
- end
12
-
13
- # @param [Symbol, String, #to_sym] member
14
- def fetch_by_member(member)
15
- _get autonym_for_member(member)
16
- end
12
+ _get(autonym)
13
+ end
17
14
 
18
- # @param [Integer, #to_int] index
19
- def fetch_by_index(index)
20
- _get autonym_for_index(index)
21
- end
15
+ # @param [Symbol, String, #to_sym] member
16
+ def fetch_by_member(member)
17
+ _get(autonym_for_member(member))
18
+ end
22
19
 
23
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
24
- def fetch_by_key(key)
25
- _get autonym_for_key(key)
26
- end
20
+ # @param [Integer, #to_int] index
21
+ def fetch_by_index(index)
22
+ _get(autonym_for_index(index))
23
+ end
27
24
 
28
- alias_method :[], :fetch_by_key
29
- alias_method :fetch, :fetch_by_key
30
-
31
- protected
32
-
33
- # @param [Symbol] autonym - MUST already converted to native autonym
34
- def _get(autonym)
35
- value = @db[autonym]
36
-
37
- if with_safety_getter?(autonym) and !accept?(autonym, value)
38
- raise ::Validation::InvalidReadingError,
39
- "#{value.inspect} is deficient for #{autonym} in #{self.class}"
25
+ # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
26
+ def fetch_by_key(key)
27
+ _get(autonym_for_key(key))
40
28
  end
41
29
 
42
- value
43
- end
30
+ alias_method :[], :fetch_by_key
31
+ alias_method :fetch, :fetch_by_key
32
+
33
+ protected
34
+
35
+ # @param [Symbol] autonym - MUST already converted to native autonym
36
+ def _get(autonym)
37
+ value = @db[autonym]
44
38
 
45
- # @endgroup
39
+ if with_safety_getter?(autonym) && !accept?(autonym, value)
40
+ raise ::Validation::InvalidReadingError,
41
+ "#{value.inspect} is deficient for #{autonym} in #{self.class}"
42
+ end
46
43
 
47
- end; end
44
+ value
45
+ end
46
+
47
+ # @endgroup
48
+ end
49
+ end
@@ -1,118 +1,120 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Like Ruby's Hash
3
+ class Striuct
4
+ module InstanceMethods
5
+ # @group Like Ruby's Hash
4
6
 
5
- def has_value?(value)
6
- @db.has_value? value
7
- end
7
+ def has_value?(value)
8
+ @db.value?(value)
9
+ end
8
10
 
9
- alias_method :value?, :has_value?
10
-
11
- # keep truthy only (unassign falsy member)
12
- # @yield [autonym, value]
13
- # @yieldparam [Symbol] autonym
14
- # @see #each_pair
15
- # @return [Enumerator]
16
- # @yieldreturn [self]
17
- # @yieldreturn [nil]
18
- def select!
19
- _check_frozen
20
- return to_enum(__callee__) unless block_given?
21
-
22
- modified = false
23
- each_pair do |autonym, value|
24
- unless yield autonym, value
25
- unassign autonym
26
- modified = true
11
+ alias_method :value?, :has_value?
12
+
13
+ # keep truthy only (unassign falsy member)
14
+ # @yield [autonym, value]
15
+ # @yieldparam [Symbol] autonym
16
+ # @see #each_pair
17
+ # @return [Enumerator]
18
+ # @yieldreturn [self]
19
+ # @yieldreturn [nil]
20
+ def select!
21
+ _check_frozen
22
+ return to_enum(__callee__) unless block_given?
23
+
24
+ modified = false
25
+ each_pair do |autonym, value|
26
+ unless yield autonym, value
27
+ unassign(autonym)
28
+ modified = true
29
+ end
27
30
  end
31
+
32
+ modified ? self : nil
28
33
  end
29
-
30
- modified ? self : nil
31
- end
32
34
 
33
- # @see #select!
34
- # @yield [autonym, value]
35
- # @yieldparam [Symbol] autonym
36
- # @return [Enumerator]
37
- def keep_if(&block)
38
- _check_frozen
39
- return to_enum(__callee__) unless block_given?
35
+ # @see #select!
36
+ # @yield [autonym, value]
37
+ # @yieldparam [Symbol] autonym
38
+ # @return [Enumerator]
39
+ def keep_if(&block)
40
+ _check_frozen
41
+ return to_enum(__callee__) unless block
40
42
 
41
- select!(&block)
42
- self
43
- end
43
+ select!(&block)
44
+ self
45
+ end
44
46
 
45
- # @see #select!
46
- # keep falsy only (unassign truthy member)
47
- # @yield [autonym, value]
48
- # @yieldparam [Symbol] autonym
49
- # @return [Enumerator]
50
- def reject!
51
- _check_frozen
52
- return to_enum(__callee__) unless block_given?
53
-
54
- modified = false
55
- each_pair do |autonym, value|
56
- if yield autonym, value
57
- unassign autonym
58
- modified = true
47
+ # @see #select!
48
+ # keep falsy only (unassign truthy member)
49
+ # @yield [autonym, value]
50
+ # @yieldparam [Symbol] autonym
51
+ # @return [Enumerator]
52
+ def reject!
53
+ _check_frozen
54
+ return to_enum(__callee__) unless block_given?
55
+
56
+ modified = false
57
+ each_pair do |autonym, value|
58
+ if yield autonym, value
59
+ unassign(autonym)
60
+ modified = true
61
+ end
59
62
  end
63
+
64
+ modified ? self : nil
60
65
  end
61
-
62
- modified ? self : nil
63
- end
64
66
 
65
- # @see #reject!
66
- # @yield [autonym, value]
67
- # @yieldparam [Symbol] autonym
68
- # @return [Enumerator]
69
- def delete_if(&block)
70
- _check_frozen
71
- return to_enum(__callee__) unless block_given?
67
+ # @see #reject!
68
+ # @yield [autonym, value]
69
+ # @yieldparam [Symbol] autonym
70
+ # @return [Enumerator]
71
+ def delete_if(&block)
72
+ _check_frozen
73
+ return to_enum(__callee__) unless block
72
74
 
73
- reject!(&block)
74
- self
75
- end
76
-
77
- # @param [Symbol, String] name
78
- # @return [Array] e.g [autonym, value]
79
- def assoc(name)
80
- autonym = autonym_for_member name
75
+ reject!(&block)
76
+ self
77
+ end
81
78
 
82
- [autonym, self[name]]
83
- end
79
+ # @param [Symbol, String] name
80
+ # @return [Array] e.g [autonym, value]
81
+ def assoc(name)
82
+ autonym = autonym_for_member(name)
84
83
 
85
- # @return [Array] [autonym, value]
86
- def rassoc(value)
87
- each_pair.find{|_, val|val == value}
88
- end
84
+ [autonym, self[name]]
85
+ end
89
86
 
90
- # @see Hash#flatten
91
- # @return [Array]
92
- def flatten(level=1)
93
- each_pair.to_a.flatten level
94
- end
87
+ # @return [Array] [autonym, value]
88
+ def rassoc(value)
89
+ each_pair.find { |_, val| val == value }
90
+ end
95
91
 
96
- # @see #select!
97
- # @yield [autonym, value]
98
- # @yieldparam [Symbol] autonym
99
- # @return [Striuct]
100
- def select(&block)
101
- return to_enum(__callee__) unless block_given?
92
+ # @see Hash#flatten
93
+ # @return [Array]
94
+ def flatten(level=1)
95
+ each_pair.to_a.flatten(level)
96
+ end
102
97
 
103
- dup.tap {|r|r.select!(&block)}
104
- end
98
+ # @see #select!
99
+ # @yield [autonym, value]
100
+ # @yieldparam [Symbol] autonym
101
+ # @return [Striuct]
102
+ def select(&block)
103
+ return to_enum(__callee__) unless block
105
104
 
106
- # @see #reject!
107
- # @yield [autonym, value]
108
- # @yieldparam [Symbol] autonym
109
- # @return [Striuct]
110
- def reject(&block)
111
- return to_enum(__callee__) unless block_given?
105
+ dup.tap { |r| r.select!(&block) }
106
+ end
112
107
 
113
- dup.tap {|r|r.reject!(&block)}
114
- end
108
+ # @see #reject!
109
+ # @yield [autonym, value]
110
+ # @yieldparam [Symbol] autonym
111
+ # @return [Striuct]
112
+ def reject(&block)
113
+ return to_enum(__callee__) unless block
115
114
 
116
- # @endgroup
115
+ dup.tap { |r| r.reject!(&block) }
116
+ end
117
117
 
118
- end; end
118
+ # @endgroup
119
+ end
120
+ end
@@ -1,9 +1,11 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- KeyValidatable.instance_methods.each do |feature|
4
- if specific_feature = feature.to_s.sub!('members'){'autonyms'}
5
- def_delegator :self, feature, specific_feature.to_sym
3
+ class Striuct
4
+ module InstanceMethods
5
+ KeyValidatable.instance_methods.each do |feature|
6
+ if specific_feature = feature.to_s.sub!('members') { 'autonyms' }
7
+ def_delegator :self, feature, specific_feature.to_sym
8
+ end
6
9
  end
7
10
  end
8
-
9
- end; end
11
+ end
@@ -1,53 +1,55 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Lock / Unlock
4
-
5
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
6
- # @return [self]
7
- def lock(key)
8
- _check_frozen
3
+ class Striuct
4
+ module InstanceMethods
5
+ # @group Lock / Unlock
9
6
 
10
- @locks[autonym_for_key(key)] = true
11
- self
12
- end
13
-
14
- # @return [self]
15
- def lock_all
16
- _check_frozen
17
-
18
- each_autonym do |autonym|
19
- @locks[autonym] = true
7
+ # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
8
+ # @return [self]
9
+ def lock(key)
10
+ _check_frozen
11
+
12
+ @locks[autonym_for_key(key)] = true
13
+ self
20
14
  end
21
- end
22
15
 
23
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
24
- def locked?(key)
25
- @locks.has_key? autonym_for_key(key)
26
- end
27
-
28
- def all_locked?
29
- _autonyms.all?{|autonym|@locks.has_key? autonym}
30
- end
31
-
32
- private
16
+ # @return [self]
17
+ def lock_all
18
+ _check_frozen
33
19
 
34
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
35
- # @return [self]
36
- def unlock(key)
37
- _check_frozen
20
+ each_autonym do |autonym|
21
+ @locks[autonym] = true
22
+ end
23
+ end
38
24
 
39
- @locks.delete autonym_for_key(key)
40
- self
41
- end
42
-
43
- # @return [self]
44
- def unlock_all
45
- _check_frozen
25
+ # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
26
+ def locked?(key)
27
+ @locks.key?(autonym_for_key(key))
28
+ end
46
29
 
47
- @locks.clear
48
- self
49
- end
30
+ def all_locked?
31
+ _autonyms.all? { |autonym| @locks.key?(autonym) }
32
+ end
33
+
34
+ private
35
+
36
+ # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
37
+ # @return [self]
38
+ def unlock(key)
39
+ _check_frozen
40
+
41
+ @locks.delete(autonym_for_key(key))
42
+ self
43
+ end
44
+
45
+ # @return [self]
46
+ def unlock_all
47
+ _check_frozen
50
48
 
51
- # @endgroup
49
+ @locks.clear
50
+ self
51
+ end
52
52
 
53
- end; end
53
+ # @endgroup
54
+ end
55
+ end
@@ -1,66 +1,68 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Basic Methods for Ruby's Object
3
+ class Striuct
4
+ module InstanceMethods
5
+ # @group Basic Methods for Ruby's Object
4
6
 
5
- # @return [self]
6
- def freeze
7
- @db.freeze; @locks.freeze
8
- super
9
- end
7
+ # @return [self]
8
+ def freeze
9
+ @db.freeze; @locks.freeze
10
+ super
11
+ end
10
12
 
11
- private
13
+ private
12
14
 
13
- def initialize(*values)
14
- _initialize_database
15
+ def initialize(*values)
16
+ _initialize_database
15
17
 
16
- replace_values(*values)
17
- excess_autonyms = _autonyms.last(size - values.size)
18
- _set_defaults(*excess_autonyms)
18
+ replace_values(*values)
19
+ excess_autonyms = _autonyms.last(size - values.size)
20
+ _set_defaults(*excess_autonyms)
19
21
 
20
- each_autonym do |autonym|
21
- _check_must autonym
22
+ each_autonym do |autonym|
23
+ _check_must(autonym)
24
+ end
22
25
  end
23
- end
24
26
 
25
- def initialize_for_pairs(pairs)
26
- _initialize_database
27
-
28
- excess_autonyms = _autonyms.dup
29
- pairs.each_pair do |key, value|
30
- autonym = autonym_for_key key
31
- self[autonym] = value
32
- excess_autonyms.delete autonym
33
- end
27
+ def initialize_for_pairs(pairs)
28
+ _initialize_database
34
29
 
35
- _set_defaults(*excess_autonyms)
30
+ excess_autonyms = _autonyms.dup
31
+ pairs.each_pair do |key, value|
32
+ autonym = autonym_for_key(key)
33
+ self[autonym] = value
34
+ excess_autonyms.delete(autonym)
35
+ end
36
36
 
37
- excess_autonyms.each do |autonym|
38
- _check_must autonym
37
+ _set_defaults(*excess_autonyms)
38
+
39
+ excess_autonyms.each do |autonym|
40
+ _check_must(autonym)
41
+ end
39
42
  end
40
- end
41
-
42
- def initialize_copy(original)
43
- @db, @locks = @db.dup, {}
44
- end
45
43
 
46
- def _initialize_database
47
- @db, @locks = {}, {}
48
- end
44
+ def initialize_copy(original)
45
+ @db, @locks = @db.dup, {}
46
+ end
49
47
 
50
- def _check_frozen
51
- raise "can't modify frozen #{self.class}" if frozen?
52
- end
48
+ def _initialize_database
49
+ @db, @locks = {}, {}
50
+ end
53
51
 
54
- def _check_locked(key)
55
- raise "can't modify locked member `#{key}`" if locked? key
56
- end
52
+ def _check_frozen
53
+ raise "can't modify frozen #{self.class}" if frozen?
54
+ end
57
55
 
58
- def _check_must(key)
59
- if must?(key) && !assigned?(key)
60
- raise InvalidOperationError, "`#{key}` require a value under `must` option"
56
+ def _check_locked(key)
57
+ raise "can't modify locked member `#{key}`" if locked?(key)
61
58
  end
62
- end
63
59
 
64
- # @endgroup
60
+ def _check_must(key)
61
+ if must?(key) && !assigned?(key)
62
+ raise InvalidOperationError, "`#{key}` require a value under `must` option"
63
+ end
64
+ end
65
65
 
66
- end; end
66
+ # @endgroup
67
+ end
68
+ end