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.
- checksums.yaml +4 -4
- data/MIT-LICENSE.txt +21 -0
- data/README.md +19 -39
- data/lib/striuct.rb +3 -3
- data/lib/striuct/classmethods/README.md +2 -2
- data/lib/striuct/classmethods/adjustment.rb +15 -13
- data/lib/striuct/classmethods/attributes.rb +94 -92
- data/lib/striuct/classmethods/conflict_management.rb +109 -106
- data/lib/striuct/classmethods/constructor.rb +47 -54
- data/lib/striuct/classmethods/copy.rb +45 -43
- data/lib/striuct/classmethods/default.rb +23 -21
- data/lib/striuct/classmethods/enum.rb +46 -44
- data/lib/striuct/classmethods/fix.rb +23 -21
- data/lib/striuct/classmethods/hashdeepdupulicatable.rb +15 -15
- data/lib/striuct/classmethods/inner.rb +57 -55
- data/lib/striuct/classmethods/length.rb +12 -10
- data/lib/striuct/classmethods/macro.rb +110 -106
- data/lib/striuct/classmethods/names.rb +69 -65
- data/lib/striuct/classmethods/predicate.rb +131 -129
- data/lib/striuct/classmethods/requirements.rb +3 -1
- data/lib/striuct/classmethods/to_struct.rb +21 -18
- data/lib/striuct/classmethods/validation.rb +15 -13
- data/lib/striuct/instancemethods/README.md +2 -2
- data/lib/striuct/instancemethods/assign.rb +29 -27
- data/lib/striuct/instancemethods/cast.rb +28 -26
- data/lib/striuct/instancemethods/compare.rb +26 -24
- data/lib/striuct/instancemethods/default.rb +31 -29
- data/lib/striuct/instancemethods/delegate_class_methods.rb +35 -33
- data/lib/striuct/instancemethods/enum.rb +86 -84
- data/lib/striuct/instancemethods/getter.rb +39 -37
- data/lib/striuct/instancemethods/hashy.rb +99 -97
- data/lib/striuct/instancemethods/keyvalidatable.rb +8 -6
- data/lib/striuct/instancemethods/lock.rb +46 -44
- data/lib/striuct/instancemethods/object.rb +50 -48
- data/lib/striuct/instancemethods/requirements.rb +11 -9
- data/lib/striuct/instancemethods/safety.rb +11 -9
- data/lib/striuct/instancemethods/setter.rb +46 -45
- data/lib/striuct/instancemethods/to_s.rb +39 -37
- data/lib/striuct/instancemethods/validation.rb +31 -29
- data/lib/striuct/instancemethods/values.rb +50 -48
- data/lib/striuct/requirements.rb +3 -1
- data/lib/striuct/singleton_class.rb +12 -17
- data/lib/striuct/structs.rb +3 -3
- metadata +33 -178
- data/.gitignore +0 -35
- data/.travis.yml +0 -17
- data/.yardopts +0 -1
- data/Gemfile +0 -11
- data/MIT-LICENSE +0 -22
- data/Rakefile +0 -11
- data/benchmark/basics.rb +0 -56
- data/example/README.rb +0 -50
- data/example/example1.rb +0 -195
- data/example/example2.rb +0 -20
- data/example/see_trace.rb +0 -32
- data/striuct.gemspec +0 -45
- data/test/helper.rb +0 -3
- data/test/test_sglc-constructor.rb +0 -36
- data/test/test_subc-c-add_members.rb +0 -13
- data/test/test_subc-c-close_member.rb +0 -36
- data/test/test_subc-c-constructor.rb +0 -92
- data/test/test_subc-c-copy.rb +0 -71
- data/test/test_subc-c-freeze.rb +0 -36
- data/test/test_subc-c-inheritable.rb +0 -58
- data/test/test_subc-c-safety_naming.rb +0 -73
- data/test/test_subc-f-alias_member.rb +0 -54
- data/test/test_subc-f-enum.rb +0 -159
- data/test/test_subc-f-predicate.rb +0 -647
- data/test/test_subc-f-to_struct.rb +0 -61
- data/test/test_subc-f-validation_util.rb +0 -59
- data/test/test_subc-f_debug.rb +0 -39
- data/test/test_subc-f_name.rb +0 -525
- data/test/test_subc-i-accessor.rb +0 -138
- data/test/test_subc-i-adjuster.rb +0 -95
- data/test/test_subc-i-assign.rb +0 -53
- data/test/test_subc-i-basic.rb +0 -43
- data/test/test_subc-i-cast.rb +0 -27
- data/test/test_subc-i-compare.rb +0 -52
- data/test/test_subc-i-copy.rb +0 -23
- data/test/test_subc-i-default_value.rb +0 -129
- data/test/test_subc-i-freeze.rb +0 -19
- data/test/test_subc-i-hashlike.rb +0 -144
- data/test/test_subc-i-keyvalidatable.rb +0 -25
- data/test/test_subc-i-lock.rb +0 -40
- data/test/test_subc-i-must.rb +0 -30
- data/test/test_subc-i-to_s_family.rb +0 -26
- data/test/test_subc-i-validation_specific_conditions.rb +0 -297
- data/test/test_subc-i-validation_with_getter.rb +0 -33
- data/test/test_version.rb +0 -13
@@ -1,47 +1,49 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Getter
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
11
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
# @param [Symbol, String, #to_sym] member
|
16
|
+
def fetch_by_member(member)
|
17
|
+
_get(autonym_for_member(member))
|
18
|
+
end
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
# @param [Integer, #to_int] index
|
21
|
+
def fetch_by_index(index)
|
22
|
+
_get(autonym_for_index(index))
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
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
|
-
|
43
|
-
|
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
|
-
|
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
|
-
|
44
|
+
value
|
45
|
+
end
|
46
|
+
|
47
|
+
# @endgroup
|
48
|
+
end
|
49
|
+
end
|
@@ -1,118 +1,120 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Like Ruby's Hash
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
def has_value?(value)
|
8
|
+
@db.value?(value)
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
43
|
+
select!(&block)
|
44
|
+
self
|
45
|
+
end
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
74
|
-
|
75
|
-
|
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
|
-
[
|
83
|
-
|
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
|
-
|
86
|
-
|
87
|
-
each_pair.find{|_, val|val == value}
|
88
|
-
end
|
84
|
+
[autonym, self[name]]
|
85
|
+
end
|
89
86
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
87
|
+
# @return [Array] [autonym, value]
|
88
|
+
def rassoc(value)
|
89
|
+
each_pair.find { |_, val| val == value }
|
90
|
+
end
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
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
|
-
|
104
|
-
|
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
|
-
|
107
|
-
|
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
|
-
|
114
|
-
|
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
|
-
|
115
|
+
dup.tap { |r| r.reject!(&block) }
|
116
|
+
end
|
117
117
|
|
118
|
-
|
118
|
+
# @endgroup
|
119
|
+
end
|
120
|
+
end
|
@@ -1,9 +1,11 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
# @return [self]
|
7
|
-
def lock(key)
|
8
|
-
_check_frozen
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Lock / Unlock
|
9
6
|
|
10
|
-
@
|
11
|
-
self
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
20
|
+
each_autonym do |autonym|
|
21
|
+
@locks[autonym] = true
|
22
|
+
end
|
23
|
+
end
|
38
24
|
|
39
|
-
@
|
40
|
-
|
41
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
49
|
+
@locks.clear
|
50
|
+
self
|
51
|
+
end
|
52
52
|
|
53
|
-
|
53
|
+
# @endgroup
|
54
|
+
end
|
55
|
+
end
|
@@ -1,66 +1,68 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Basic Methods for Ruby's Object
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
# @return [self]
|
8
|
+
def freeze
|
9
|
+
@db.freeze; @locks.freeze
|
10
|
+
super
|
11
|
+
end
|
10
12
|
|
11
|
-
|
13
|
+
private
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
def initialize(*values)
|
16
|
+
_initialize_database
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
replace_values(*values)
|
19
|
+
excess_autonyms = _autonyms.last(size - values.size)
|
20
|
+
_set_defaults(*excess_autonyms)
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
each_autonym do |autonym|
|
23
|
+
_check_must(autonym)
|
24
|
+
end
|
22
25
|
end
|
23
|
-
end
|
24
26
|
|
25
|
-
|
26
|
-
|
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
|
-
|
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
|
-
|
38
|
-
|
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
|
-
|
47
|
-
|
48
|
-
|
44
|
+
def initialize_copy(original)
|
45
|
+
@db, @locks = @db.dup, {}
|
46
|
+
end
|
49
47
|
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
def _initialize_database
|
49
|
+
@db, @locks = {}, {}
|
50
|
+
end
|
53
51
|
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
def _check_frozen
|
53
|
+
raise "can't modify frozen #{self.class}" if frozen?
|
54
|
+
end
|
57
55
|
|
58
|
-
|
59
|
-
|
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
|
-
|
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
|
-
|
66
|
+
# @endgroup
|
67
|
+
end
|
68
|
+
end
|