striuct 0.6.1 → 0.9.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 +44 -60
- data/lib/striuct/{requirements.rb → bootstrap.rb} +6 -2
- data/lib/striuct/classmethods/README.md +2 -2
- data/lib/striuct/classmethods/adjustment.rb +77 -13
- data/lib/striuct/classmethods/attributes.rb +94 -92
- data/lib/striuct/classmethods/conflict_management.rb +109 -106
- data/lib/striuct/classmethods/constructor.rb +55 -65
- 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 +99 -106
- data/lib/striuct/classmethods/names.rb +69 -65
- data/lib/striuct/classmethods/predicate.rb +131 -129
- data/lib/striuct/classmethods/requirements.rb +2 -2
- 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/lock.rb +46 -44
- data/lib/striuct/instancemethods/object.rb +50 -48
- data/lib/striuct/instancemethods/requirements.rb +9 -13
- 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 +46 -29
- data/lib/striuct/instancemethods/values.rb +50 -48
- data/lib/striuct/singleton_class.rb +25 -18
- data/lib/striuct/structs.rb +3 -3
- data/lib/striuct.rb +7 -3
- metadata +18 -209
- 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/lib/striuct/instancemethods/keyvalidatable.rb +0 -9
- 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,112 +1,115 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# @group Member Conflict Management
|
4
|
-
|
5
|
-
# @return [Hash] Symbol => Fixnum
|
6
|
-
NAMING_RISKS = {
|
7
|
-
conflict: 10,
|
8
|
-
no_identifier: 9,
|
9
|
-
bad_manners: 5,
|
10
|
-
no_ascii: 3,
|
11
|
-
strict: 0
|
12
|
-
}.freeze
|
13
|
-
|
14
|
-
# @return [Hash] Symbol => Hash
|
15
|
-
CONFLICT_MANAGEMENT_LEVELS = {
|
16
|
-
struct: {error: 99, warn: 99},
|
17
|
-
warning: {error: 99, warn: 5},
|
18
|
-
error: {error: 9, warn: 5},
|
19
|
-
prevent: {error: 5, warn: 1},
|
20
|
-
nervous: {error: 1, warn: 1}
|
21
|
-
}.each(&:freeze).freeze
|
22
|
-
|
23
|
-
# @return [Symbol]
|
24
|
-
DEFAULT_CONFLICT_MANAGEMENT_LEVEL = :prevent
|
25
|
-
|
26
|
-
# @param [Object] name
|
27
|
-
# accpeptable the name into own member, under protect level of runtime
|
28
|
-
def cname?(name)
|
29
|
-
_check_safety_naming(name.to_sym){|r|r}
|
30
|
-
rescue Exception
|
31
|
-
false
|
32
|
-
end
|
33
|
-
|
34
|
-
attr_reader :conflict_management_level
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
# @param [Symbol, String, #to_sym] level
|
39
|
-
# @return [Symbol] level
|
40
|
-
# change level of management conflict member names
|
41
|
-
def set_conflict_management_level(level)
|
42
|
-
level = level.to_sym
|
43
|
-
raise NameError unless CONFLICT_MANAGEMENT_LEVELS.has_key? level
|
44
|
-
|
45
|
-
@conflict_management_level = level
|
46
|
-
end
|
1
|
+
# frozen_string_literal: true
|
47
2
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# @return [void]
|
52
|
-
# @raise [ArgumentError] if no block given
|
53
|
-
# temp scope of a conflict_management_level
|
54
|
-
def conflict_management(level=DEFAULT_CONFLICT_MANAGEMENT_LEVEL)
|
55
|
-
before = @conflict_management_level
|
56
|
-
set_conflict_management_level level
|
57
|
-
|
58
|
-
yield
|
59
|
-
ensure
|
60
|
-
@conflict_management_level = before
|
61
|
-
self
|
62
|
-
end
|
63
|
-
|
64
|
-
# @param [Symbol] name
|
65
|
-
# @return [void]
|
66
|
-
# @yieldreturn [Boolean]
|
67
|
-
def _check_safety_naming(name)
|
68
|
-
estimation = _estimate_naming name
|
69
|
-
risk = NAMING_RISKS.fetch estimation
|
70
|
-
plevels = CONFLICT_MANAGEMENT_LEVELS.fetch @conflict_management_level
|
71
|
-
caution = "undesirable naming '#{name}', because #{estimation}"
|
72
|
-
|
73
|
-
r = (
|
74
|
-
case
|
75
|
-
when risk >= plevels.fetch(:error)
|
76
|
-
raise NameError, caution unless block_given?
|
77
|
-
false
|
78
|
-
when risk >= plevels.fetch(:warn)
|
79
|
-
warn caution unless block_given?
|
80
|
-
false
|
81
|
-
else
|
82
|
-
true
|
83
|
-
end
|
84
|
-
)
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Member Conflict Management
|
85
6
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
7
|
+
# @return [Hash] Symbol => Fixnum
|
8
|
+
NAMING_RISKS = {
|
9
|
+
conflict: 10,
|
10
|
+
no_identifier: 9,
|
11
|
+
bad_manners: 5,
|
12
|
+
no_ascii: 3,
|
13
|
+
strict: 0
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
# @return [Hash] Symbol => Hash
|
17
|
+
CONFLICT_MANAGEMENT_LEVELS = {
|
18
|
+
struct: { error: 99, warn: 99 },
|
19
|
+
warning: { error: 99, warn: 5 },
|
20
|
+
error: { error: 9, warn: 5 },
|
21
|
+
prevent: { error: 5, warn: 1 },
|
22
|
+
nervous: { error: 1, warn: 1 }
|
23
|
+
}.each(&:freeze).freeze
|
24
|
+
|
25
|
+
# @return [Symbol]
|
26
|
+
DEFAULT_CONFLICT_MANAGEMENT_LEVEL = :prevent
|
27
|
+
|
28
|
+
# @param [Object] name
|
29
|
+
# acceptable the name into own member, under protect level of runtime
|
30
|
+
def cname?(name)
|
31
|
+
_check_safety_naming(name.to_sym) { |r| r }
|
32
|
+
rescue Exception
|
33
|
+
false
|
94
34
|
end
|
95
35
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
36
|
+
attr_reader :conflict_management_level
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# @param [Symbol, String, #to_sym] level
|
41
|
+
# @return [Symbol] level
|
42
|
+
# change level of management conflict member names
|
43
|
+
def set_conflict_management_level(level)
|
44
|
+
level = level.to_sym
|
45
|
+
raise NameError unless CONFLICT_MANAGEMENT_LEVELS.key?(level)
|
46
|
+
|
47
|
+
@conflict_management_level = level
|
107
48
|
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# @endgroup
|
111
49
|
|
112
|
-
|
50
|
+
# @param [Symbol, String, #to_sym] level
|
51
|
+
# @see [#set_conflict_management_level]
|
52
|
+
# @yieldreturn [self]
|
53
|
+
# @return [void]
|
54
|
+
# @raise [ArgumentError] if no block given
|
55
|
+
# temp scope of a conflict_management_level
|
56
|
+
def conflict_management(level=DEFAULT_CONFLICT_MANAGEMENT_LEVEL)
|
57
|
+
before = @conflict_management_level
|
58
|
+
set_conflict_management_level(level)
|
59
|
+
|
60
|
+
yield
|
61
|
+
ensure
|
62
|
+
@conflict_management_level = before
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param [Symbol] name
|
67
|
+
# @return [void]
|
68
|
+
# @yieldreturn [Boolean]
|
69
|
+
def _check_safety_naming(name)
|
70
|
+
estimation = _estimate_naming(name)
|
71
|
+
risk = NAMING_RISKS.fetch(estimation)
|
72
|
+
plevels = CONFLICT_MANAGEMENT_LEVELS.fetch(@conflict_management_level)
|
73
|
+
caution = "undesirable naming '#{name}', because #{estimation}"
|
74
|
+
|
75
|
+
r = (
|
76
|
+
case
|
77
|
+
when risk >= plevels.fetch(:error)
|
78
|
+
raise NameError, caution unless block_given?
|
79
|
+
|
80
|
+
false
|
81
|
+
when risk >= plevels.fetch(:warn)
|
82
|
+
warn(caution) unless block_given?
|
83
|
+
false
|
84
|
+
else
|
85
|
+
true
|
86
|
+
end
|
87
|
+
)
|
88
|
+
|
89
|
+
yield r if block_given?
|
90
|
+
end
|
91
|
+
|
92
|
+
# @param [Symbol] name
|
93
|
+
# @return [Symbol]
|
94
|
+
def _estimate_naming(name)
|
95
|
+
if (instance_methods + private_instance_methods).include?(name)
|
96
|
+
return :conflict
|
97
|
+
end
|
98
|
+
|
99
|
+
return :no_ascii unless name.encoding.equal?(Encoding::ASCII)
|
100
|
+
|
101
|
+
case name
|
102
|
+
when /\W/, /\A[^a-zA-Z_]/, :''
|
103
|
+
:no_identifier
|
104
|
+
when /\Aeach/, /\A__[^_]*__\z/, /\A_[^_]*\z/, /[!?]\z/, /\Ato_/
|
105
|
+
:bad_manners
|
106
|
+
when /\A[a-zA-Z_]\w*\z/
|
107
|
+
:strict
|
108
|
+
else
|
109
|
+
raise 'must not happen'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# @endgroup
|
114
|
+
end
|
115
|
+
end
|
@@ -1,66 +1,56 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Constructor
|
6
|
+
|
7
|
+
# @return [Striuct]
|
8
|
+
def for_values(*values)
|
9
|
+
new_instance(*values)
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :new, :for_values
|
13
|
+
|
14
|
+
# @param [Hash, Struct, Striuct, #each_pair] pairs
|
15
|
+
# @return [Striuct]
|
16
|
+
def for_pairs(pairs)
|
17
|
+
raise ArgumentError, 'no pairs object' unless pairs.respond_to?(:each_pair)
|
18
|
+
raise ArgumentError unless pairs.each_pair { |key, _value| all_members.include?(key.to_sym) }
|
19
|
+
|
20
|
+
instance = allocate
|
21
|
+
instance.__send__(:initialize_for_pairs, pairs)
|
22
|
+
instance
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method :[], :for_pairs
|
26
|
+
|
27
|
+
# for build the fixed object
|
28
|
+
# @param [Boolean] lock
|
29
|
+
# @param [Boolean] strict
|
30
|
+
# @yieldparam [Striuct] instance
|
31
|
+
# @yieldreturn [Striuct] instance
|
32
|
+
# @return [void]
|
33
|
+
def define(lock: true, strict: true)
|
34
|
+
raise ArgumentError, 'must with block' unless block_given?
|
35
|
+
|
36
|
+
new.tap { |instance|
|
37
|
+
yield instance
|
38
|
+
|
39
|
+
yets = autonyms.select { |autonym| !instance.assigned?(autonym) }
|
40
|
+
unless yets.empty?
|
41
|
+
raise "not assigned members are, yet '#{yets.inspect} in #{self}'"
|
42
|
+
end
|
43
|
+
|
44
|
+
invalids = autonyms.select { |autonym| !instance.valid?(autonym) }
|
45
|
+
if strict && !invalids.empty?
|
46
|
+
raise InvalidWritingError,
|
47
|
+
"invalids members are, yet '#{invalids.inspect} in #{self}'"
|
48
|
+
end
|
49
|
+
|
50
|
+
instance.lock_all if lock
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
# @endgroup
|
11
55
|
end
|
12
|
-
|
13
|
-
alias_method :new, :for_values
|
14
|
-
|
15
|
-
# @param [Hash, Struct, Striuct, #each_pair] pairs
|
16
|
-
# @return [Striuct]
|
17
|
-
def for_pairs(pairs)
|
18
|
-
raise TypeError, 'no pairs object' unless pairs.respond_to?(:each_pair)
|
19
|
-
KeyValidatable.validate_array KeyValidatable.keys_for(pairs).map(&:to_sym),
|
20
|
-
let: all_members
|
21
|
-
|
22
|
-
instance = allocate
|
23
|
-
instance.__send__ :initialize_for_pairs, pairs
|
24
|
-
instance
|
25
|
-
end
|
26
|
-
|
27
|
-
alias_method :[], :for_pairs
|
28
|
-
|
29
|
-
# @return [Class]
|
30
|
-
DEFINE_OptArg = OptionalArgument.define {
|
31
|
-
opt :lock, default: true, condition: BOOLEAN?
|
32
|
-
opt :strict, default: true, condition: BOOLEAN?
|
33
|
-
}
|
34
|
-
|
35
|
-
# for build the fixed object
|
36
|
-
# @param [Hash] options
|
37
|
-
# @option options [Boolean] :lock
|
38
|
-
# @option options [Boolean] :strict
|
39
|
-
# @yieldparam [Striuct] instance
|
40
|
-
# @yieldreturn [Striuct] instance
|
41
|
-
# @return [void]
|
42
|
-
def define(options={})
|
43
|
-
raise ArgumentError, 'must with block' unless block_given?
|
44
|
-
opts = DEFINE_OptArg.parse options
|
45
|
-
|
46
|
-
new.tap {|instance|
|
47
|
-
yield instance
|
48
|
-
|
49
|
-
yets = autonyms.select{|autonym|! instance.assigned?(autonym)}
|
50
|
-
unless yets.empty?
|
51
|
-
raise "not assigned members are, yet '#{yets.inspect} in #{self}'"
|
52
|
-
end
|
53
|
-
|
54
|
-
invalids = autonyms.select{|autonym|! instance.valid?(autonym)}
|
55
|
-
if opts.strict && !invalids.empty?
|
56
|
-
raise Validation::InvalidWritingError,
|
57
|
-
"invalids members are, yet '#{invalids.inspect} in #{self}'"
|
58
|
-
end
|
59
|
-
|
60
|
-
instance.lock_all if opts.lock
|
61
|
-
}
|
62
|
-
end
|
63
|
-
|
64
|
-
# @endgroup
|
65
|
-
|
66
|
-
end; end
|
56
|
+
end
|
@@ -1,52 +1,54 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Basic Methods for Ruby's Object
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
# @return [Class]
|
8
|
+
def clone
|
9
|
+
ret = super
|
10
|
+
ret.__send__(:close_member) if closed?
|
11
|
+
ret
|
12
|
+
end
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
# @return [Class]
|
15
|
+
def dup
|
16
|
+
copy_variables!(super)
|
17
|
+
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
def inherited(subclass)
|
20
|
-
ret = super subclass
|
21
|
-
copy_variables! subclass
|
22
|
-
ret
|
23
|
-
end
|
24
|
-
|
25
|
-
def initialize_copy(original)
|
26
|
-
ret = super original
|
27
|
-
@autonyms = @autonyms.dup
|
28
|
-
@aliases = @aliases.dup
|
29
|
-
@attributes = @attributes.deep_dup
|
30
|
-
ret
|
31
|
-
end
|
19
|
+
private
|
32
20
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
attributes = @attributes.deep_dup
|
38
|
-
conflict_management = @conflict_management_level
|
39
|
-
|
40
|
-
familar_class.class_eval do
|
41
|
-
@autonyms = autonyms
|
42
|
-
@aliases = aliases
|
43
|
-
@attributes = attributes
|
44
|
-
@conflict_management_level = conflict_management
|
21
|
+
def inherited(subclass)
|
22
|
+
ret = super(subclass)
|
23
|
+
copy_variables!(subclass)
|
24
|
+
ret
|
45
25
|
end
|
46
26
|
|
47
|
-
|
48
|
-
|
27
|
+
def initialize_copy(original)
|
28
|
+
ret = super(original)
|
29
|
+
@autonyms = @autonyms.dup
|
30
|
+
@aliases = @aliases.dup
|
31
|
+
@attributes = @attributes.deep_dup
|
32
|
+
ret
|
33
|
+
end
|
49
34
|
|
50
|
-
|
35
|
+
# @return [familiar_class]
|
36
|
+
def copy_variables!(familiar_class)
|
37
|
+
autonyms = @autonyms.dup
|
38
|
+
aliases = @aliases.dup
|
39
|
+
attributes = @attributes.deep_dup
|
40
|
+
conflict_management = @conflict_management_level
|
41
|
+
|
42
|
+
familiar_class.class_eval do
|
43
|
+
@autonyms = autonyms
|
44
|
+
@aliases = aliases
|
45
|
+
@attributes = attributes
|
46
|
+
@conflict_management_level = conflict_management
|
47
|
+
end
|
48
|
+
|
49
|
+
familiar_class
|
50
|
+
end
|
51
51
|
|
52
|
-
|
52
|
+
# @endgroup
|
53
|
+
end
|
54
|
+
end
|
@@ -1,24 +1,26 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def default_value_for(key)
|
7
|
-
autonym = autonym_for_key key
|
8
|
-
raise KeyError unless with_default? autonym
|
9
|
-
|
10
|
-
_attributes_for(autonym).default_value
|
11
|
-
end
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group With default value
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
# @endgroup
|
7
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
8
|
+
def default_value_for(key)
|
9
|
+
autonym = autonym_for_key(key)
|
10
|
+
raise KeyError unless with_default?(autonym)
|
11
|
+
|
12
|
+
_attributes_for(autonym).default_value
|
13
|
+
end
|
23
14
|
|
24
|
-
|
15
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
16
|
+
# @return [Symbol] :value / :proc
|
17
|
+
def default_type_for(key)
|
18
|
+
autonym = autonym_for_key(key)
|
19
|
+
raise KeyError unless with_default?(autonym)
|
20
|
+
|
21
|
+
_attributes_for(autonym).default_type
|
22
|
+
end
|
23
|
+
|
24
|
+
# @endgroup
|
25
|
+
end
|
26
|
+
end
|
@@ -1,45 +1,47 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
return
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Enumerative
|
6
|
+
|
7
|
+
# @yield [autonym]
|
8
|
+
# @yieldparam [Symbol] autonym - sequential under defined
|
9
|
+
# @yieldreturn [Class] self
|
10
|
+
# @return [Enumerator]
|
11
|
+
def each_autonym
|
12
|
+
return to_enum(__callee__) { size } unless block_given?
|
13
|
+
|
14
|
+
@autonyms.each { |autonym| yield autonym }
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :each_member, :each_autonym
|
19
|
+
|
20
|
+
# @yield [index]
|
21
|
+
# @yieldparam [Integer] Index
|
22
|
+
# @yieldreturn [Class] self
|
23
|
+
# @return [Enumerator]
|
24
|
+
def each_index
|
25
|
+
return to_enum(__callee__) { size } unless block_given?
|
26
|
+
|
27
|
+
@autonyms.each_index { |index| yield index }
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# @yield [autonym, index]
|
32
|
+
# @yieldparam [Symbol] autonym
|
33
|
+
# @yieldparam [Integer] index
|
34
|
+
# @yieldreturn [Class] self
|
35
|
+
# @return [Enumerator]
|
36
|
+
def each_autonym_with_index
|
37
|
+
return to_enum(__callee__) { size } unless block_given?
|
38
|
+
|
39
|
+
@autonyms.each_with_index { |autonym, index| yield autonym, index }
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
alias_method :each_member_with_index, :each_autonym_with_index
|
44
|
+
|
45
|
+
# @endgroup
|
14
46
|
end
|
15
|
-
|
16
|
-
alias_method :each_member, :each_autonym
|
17
|
-
|
18
|
-
# @yield [index]
|
19
|
-
# @yieldparam [Integer] Index
|
20
|
-
# @yieldreturn [Class] self
|
21
|
-
# @return [Enumerator]
|
22
|
-
def each_index
|
23
|
-
return to_enum(__callee__) { size } unless block_given?
|
24
|
-
|
25
|
-
@autonyms.each_index{|index|yield index}
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
# @yield [autonym, index]
|
30
|
-
# @yieldparam [Symbol] autonym
|
31
|
-
# @yieldparam [Integer] index
|
32
|
-
# @yieldreturn [Class] self
|
33
|
-
# @return [Enumerator]
|
34
|
-
def each_autonym_with_index
|
35
|
-
return to_enum(__callee__) { size } unless block_given?
|
36
|
-
|
37
|
-
@autonyms.each_with_index{|autonym, index|yield autonym, index}
|
38
|
-
self
|
39
|
-
end
|
40
|
-
|
41
|
-
alias_method :each_member_with_index, :each_autonym_with_index
|
42
|
-
|
43
|
-
# @endgroup
|
44
|
-
|
45
|
-
end; end
|
47
|
+
end
|
@@ -1,28 +1,30 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Fix inner data structures
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
# @return [self]
|
8
|
+
def freeze
|
9
|
+
[@autonyms, @attributes, @aliases].each(&:freeze)
|
10
|
+
super
|
11
|
+
end
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
def closed?
|
14
|
+
[@autonyms, @attributes, @aliases].any?(&:frozen?)
|
15
|
+
end
|
14
16
|
|
15
|
-
|
17
|
+
private
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
alias_method :fix_structural, :close_member
|
24
|
-
alias_method :close, :close_member
|
19
|
+
# @return [self]
|
20
|
+
def close_member
|
21
|
+
[@autonyms, @attributes, @aliases].each(&:freeze)
|
22
|
+
self
|
23
|
+
end
|
25
24
|
|
26
|
-
|
25
|
+
alias_method :fix_structural, :close_member
|
26
|
+
alias_method :close, :close_member
|
27
27
|
|
28
|
-
|
28
|
+
# @endgroup
|
29
|
+
end
|
30
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
module HashDeepDupulicatable
|
6
|
+
# @return [Hash]
|
7
|
+
def deep_dup
|
8
|
+
dup.tap { |h|
|
9
|
+
each_pair do |key, value|
|
10
|
+
h[key] = value.dup
|
11
|
+
end
|
12
|
+
h.extend HashDeepDupulicatable
|
13
|
+
}
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
17
|
+
private_constant :HashDeepDupulicatable
|
15
18
|
end
|
16
|
-
|
17
|
-
private_constant :HashDeepDupulicatable
|
18
|
-
|
19
|
-
end; end
|
19
|
+
end
|