striuct 0.4.4.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/MIT-LICENSE.txt +21 -0
- data/README.md +45 -62
- data/lib/striuct.rb +7 -3
- 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 -90
- 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 -64
- data/lib/striuct/classmethods/length.rb +12 -10
- data/lib/striuct/classmethods/macro.rb +98 -111
- data/lib/striuct/classmethods/names.rb +69 -65
- data/lib/striuct/classmethods/predicate.rb +131 -138
- 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 +36 -32
- 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 -49
- data/lib/striuct/instancemethods/to_s.rb +39 -37
- data/lib/striuct/instancemethods/validation.rb +46 -29
- data/lib/striuct/instancemethods/values.rb +52 -33
- data/lib/striuct/singleton_class.rb +25 -18
- data/lib/striuct/structs.rb +3 -3
- metadata +23 -213
- data/.gitignore +0 -35
- data/.travis.yml +0 -20
- data/.yardopts +0 -1
- data/Gemfile +0 -11
- data/History.old(~0.3.n).rdoc +0 -289
- data/MIT-LICENSE +0 -22
- data/Rakefile +0 -10
- data/benchmark/basics.rb +0 -56
- data/example/README.rb +0 -53
- data/example/example1.rb +0 -235
- data/example/example2.rb +0 -22
- 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 -5
- 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 -139
- data/test/test_subc-f-predicate.rb +0 -711
- 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 -32
- 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_inference.rb +0 -51
- 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,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__) 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__) 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
|
@@ -1,80 +1,73 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
def _init
|
19
|
-
@autonyms = []
|
20
|
-
@attributes = {}.extend HashDeepDupulicatable # autonym => Attributes
|
21
|
-
@aliases = {} # aliased => autonym
|
22
|
-
@conflict_management_level = DEFAULT_CONFLICT_MANAGEMENT_LEVEL
|
23
|
-
end
|
24
|
-
|
25
|
-
def _add_autonym(autonym)
|
26
|
-
autonym = autonym.to_sym
|
27
|
-
raise NameError, 'already defined' if member? autonym
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Inner Methods
|
6
|
+
|
7
|
+
# for debug
|
8
|
+
# @return [Hash]
|
9
|
+
def attributes
|
10
|
+
{
|
11
|
+
autonyms: @autonyms.dup,
|
12
|
+
aliases: @aliases.dup,
|
13
|
+
conflict_management_level: @conflict_management_level,
|
14
|
+
attributes_each_autonym: @attributes.dup
|
15
|
+
}
|
16
|
+
end
|
28
17
|
|
29
|
-
|
30
|
-
@autonyms << autonym
|
31
|
-
end
|
18
|
+
private
|
32
19
|
|
33
|
-
|
34
|
-
|
35
|
-
|
20
|
+
def _init
|
21
|
+
@autonyms = []
|
22
|
+
@attributes = {}.extend HashDeepDupulicatable # autonym => Attributes
|
23
|
+
@aliases = {} # aliased => autonym
|
24
|
+
@conflict_management_level = DEFAULT_CONFLICT_MANAGEMENT_LEVEL
|
25
|
+
end
|
36
26
|
|
37
|
-
|
38
|
-
|
39
|
-
|
27
|
+
def _add_autonym(autonym)
|
28
|
+
autonym = autonym.to_sym
|
29
|
+
raise NameError, 'already defined' if member?(autonym)
|
40
30
|
|
41
|
-
|
42
|
-
|
43
|
-
|
31
|
+
@attributes[autonym] = Attributes.new
|
32
|
+
@autonyms << autonym
|
33
|
+
end
|
44
34
|
|
45
|
-
|
46
|
-
|
47
|
-
_get autonym
|
35
|
+
def _attributes_for(autonym)
|
36
|
+
@attributes.fetch(autonym)
|
48
37
|
end
|
49
|
-
|
50
|
-
nil
|
51
|
-
end
|
52
38
|
|
53
|
-
|
54
|
-
|
55
|
-
_attributes_for(autonym).condition = condition
|
39
|
+
def _check_frozen
|
40
|
+
raise "can't modify frozen Class" if frozen?
|
56
41
|
end
|
57
42
|
|
58
|
-
|
59
|
-
|
43
|
+
def _check_closed
|
44
|
+
raise "can't modify closed member attributes in #{self}" if closed?
|
60
45
|
end
|
61
46
|
|
62
|
-
|
63
|
-
|
47
|
+
def _def_getter(autonym)
|
48
|
+
define_method(autonym) do
|
49
|
+
_get(autonym)
|
50
|
+
end
|
51
|
+
|
52
|
+
nil
|
64
53
|
end
|
65
|
-
|
66
|
-
nil
|
67
|
-
end
|
68
54
|
|
69
|
-
|
70
|
-
|
55
|
+
def _def_setter(autonym, condition, &adjuster)
|
56
|
+
unless ANYTHING.equal?(condition)
|
57
|
+
_attributes_for(autonym).condition = condition
|
58
|
+
end
|
71
59
|
|
72
|
-
|
73
|
-
|
60
|
+
if adjuster
|
61
|
+
_attributes_for(autonym).adjuster = adjuster
|
62
|
+
end
|
74
63
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
64
|
+
define_method(:"#{autonym}=") do |value|
|
65
|
+
_set(autonym, value)
|
66
|
+
end
|
67
|
+
|
68
|
+
nil
|
69
|
+
end
|
79
70
|
|
80
|
-
|
71
|
+
# @endgroup
|
72
|
+
end
|
73
|
+
end
|
@@ -1,14 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Length/Size
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
alias_method :size, :length
|
7
|
+
# @return [Integer]
|
8
|
+
def length
|
9
|
+
@autonyms.length
|
10
|
+
end
|
11
11
|
|
12
|
-
|
12
|
+
alias_method :size, :length
|
13
13
|
|
14
|
-
|
14
|
+
# @endgroup
|
15
|
+
end
|
16
|
+
end
|
@@ -1,122 +1,109 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module ClassMethods
|
5
|
+
# @group Macro for Member Definition
|
6
|
+
|
7
|
+
ANYTHING = Eqq.ANYTHING()
|
8
|
+
|
9
|
+
# @return [Class]
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# @param [Symbol, String, #to_sym] autonym
|
14
|
+
# @param [#===, Proc, Method] pattern
|
15
|
+
# @param [Proc] default_proc
|
16
|
+
# @param [Boolean] must
|
17
|
+
# @param [Boolean] writer_validation
|
18
|
+
# @param [Boolean] reader_validation
|
19
|
+
# @return [void]
|
20
|
+
def add_member(autonym, pattern=ANYTHING, default_value: nil, default_proc: nil, must: false, writer_validation: true, reader_validation: false, &adjuster)
|
21
|
+
_check_frozen
|
22
|
+
_check_closed
|
23
|
+
|
24
|
+
raise ArgumentError if !default_value.nil? && default_proc
|
25
|
+
|
26
|
+
autonym = autonym.to_sym # First definition for an autonym
|
27
|
+
|
28
|
+
raise ArgumentError, %Q!already exist name "#{autonym}"! if member?(autonym)
|
29
|
+
|
30
|
+
_check_safety_naming(autonym)
|
31
|
+
_add_autonym(autonym)
|
32
|
+
|
33
|
+
_attributes_for(autonym).safety_setter = writer_validation
|
34
|
+
_attributes_for(autonym).safety_getter = reader_validation
|
35
|
+
|
36
|
+
if must
|
37
|
+
_attributes_for(autonym).must = true
|
38
|
+
end
|
39
|
+
|
40
|
+
_def_getter(autonym)
|
41
|
+
_def_setter(autonym, pattern, &adjuster)
|
42
|
+
|
43
|
+
case
|
44
|
+
when !default_value.nil?
|
45
|
+
set_default_value(autonym, default_value)
|
46
|
+
when default_proc
|
47
|
+
set_default_value(autonym, &default_proc)
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
_attributes_for(autonym).must = true
|
50
|
+
nil
|
52
51
|
end
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
53
|
+
alias_method :member, :add_member
|
54
|
+
|
55
|
+
# @param [Symbol, String, #to_sym] autonym
|
56
|
+
# @param [Symbol, String, #to_sym] autonyms
|
57
|
+
# @return [nil]
|
58
|
+
def add_members(autonym, *autonyms)
|
59
|
+
_check_frozen
|
60
|
+
_check_closed
|
61
|
+
|
62
|
+
[autonym, *autonyms].each { |name| add_member(name) }
|
63
|
+
nil
|
62
64
|
end
|
63
|
-
|
64
|
-
nil
|
65
|
-
end
|
66
65
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
66
|
+
# @param [Symbol, String, #to_sym] aliased
|
67
|
+
# @param [Symbol, String, #to_sym] autonym
|
68
|
+
# @return [nil]
|
69
|
+
def alias_member(aliased, autonym)
|
70
|
+
_check_frozen
|
71
|
+
_check_closed
|
72
|
+
autonym = autonym_for_member(autonym)
|
73
|
+
aliased = aliased.to_sym
|
74
|
+
raise ArgumentError, %Q!already exist name "#{aliased}"! if member?(aliased)
|
75
|
+
|
76
|
+
_check_safety_naming(aliased)
|
77
|
+
|
78
|
+
alias_method(aliased, autonym)
|
79
|
+
alias_method(:"#{aliased}=", :"#{autonym}=")
|
80
|
+
@aliases[aliased] = autonym
|
81
|
+
nil
|
82
|
+
end
|
79
83
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
# @param [Symbol, String, #to_sym] name
|
98
|
-
# @return [nil]
|
99
|
-
def set_default_value(name, value=nil, &block)
|
100
|
-
_check_frozen
|
101
|
-
_check_closed
|
102
|
-
autonym = autonym_for_member name
|
103
|
-
raise "already settled default value for #{name}" if with_default? autonym
|
104
|
-
|
105
|
-
if block_given?
|
106
|
-
unless value.nil?
|
107
|
-
raise ArgumentError, 'can not use default-value with default-proc'
|
84
|
+
# @param [Symbol, String, #to_sym] name
|
85
|
+
# @return [nil]
|
86
|
+
def set_default_value(name, value=nil, &block)
|
87
|
+
_check_frozen
|
88
|
+
_check_closed
|
89
|
+
autonym = autonym_for_member(name)
|
90
|
+
raise "already settled default value for #{name}" if with_default?(autonym)
|
91
|
+
|
92
|
+
if block
|
93
|
+
unless value.nil?
|
94
|
+
raise ArgumentError, 'can not use default-value with default-proc'
|
95
|
+
end
|
96
|
+
|
97
|
+
_attributes_for(autonym).set_default(block, :lazy)
|
98
|
+
else
|
99
|
+
_attributes_for(autonym).set_default(value, :value)
|
108
100
|
end
|
109
101
|
|
110
|
-
|
111
|
-
else
|
112
|
-
_attributes_for(autonym).set_default value, :value
|
102
|
+
nil
|
113
103
|
end
|
114
|
-
|
115
|
-
nil
|
116
|
-
end
|
117
|
-
|
118
|
-
alias_method :default, :set_default_value
|
119
104
|
|
120
|
-
|
105
|
+
alias_method :default, :set_default_value
|
121
106
|
|
122
|
-
|
107
|
+
# @endgroup
|
108
|
+
end
|
109
|
+
end
|