striuct 0.3.4 → 0.3.5
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.
- data/History.rdoc +6 -0
- data/Manifest.txt +13 -7
- data/README.md +12 -10
- data/example/README.rb +5 -3
- data/lib/striuct/attributes.rb +114 -0
- data/lib/striuct/classmethods/adjustment.rb +8 -15
- data/lib/striuct/classmethods/copy.rb +55 -0
- data/lib/striuct/classmethods/default.rb +18 -13
- data/lib/striuct/classmethods/enum.rb +1 -3
- data/lib/striuct/classmethods/fix.rb +28 -0
- data/lib/striuct/classmethods/hashy.rb +22 -0
- data/lib/striuct/classmethods/inner.rb +24 -58
- data/lib/striuct/classmethods/macro.rb +33 -47
- data/lib/striuct/classmethods/named.rb +52 -40
- data/lib/striuct/classmethods/prevent_conflicts.rb +1 -1
- data/lib/striuct/classmethods/requiremnets.rb +4 -2
- data/lib/striuct/classmethods/validation.rb +19 -22
- data/lib/striuct/hashdeepdupulicatable.rb +21 -0
- data/lib/striuct/instancemethods/assign.rb +9 -6
- data/lib/striuct/instancemethods/default.rb +1 -1
- data/lib/striuct/instancemethods/delegate_class_methods.rb +11 -5
- data/lib/striuct/instancemethods/hashy.rb +1 -1
- data/lib/striuct/instancemethods/{inner.rb → inner_accessor.rb} +6 -13
- data/lib/striuct/instancemethods/lock.rb +7 -4
- data/lib/striuct/instancemethods/object.rb +25 -28
- data/lib/striuct/instancemethods/requirements.rb +3 -2
- data/lib/striuct/instancemethods/subscript.rb +4 -32
- data/lib/striuct/instancemethods/to_s.rb +35 -0
- data/lib/striuct/instancemethods/validation.rb +1 -1
- data/lib/striuct/instancemethods/values.rb +0 -17
- data/lib/striuct/requirements.rb +3 -2
- data/lib/striuct/singleton_class.rb +6 -4
- data/lib/striuct/version.rb +1 -1
- data/test/test_striuct-subclass-class-copy.rb +71 -0
- data/test/{test_striuct-subclass-instance-cloning.rb → test_striuct-subclass-instance-copy.rb} +2 -2
- metadata +13 -9
- data/lib/striuct/classmethods/object.rb +0 -54
- data/lib/striuct/specificcontainer.rb +0 -19
- data/test/test_striuct-subclass-class-cloning.rb +0 -21
@@ -18,10 +18,6 @@ class Striuct; module ClassMethods
|
|
18
18
|
setter_validation: true
|
19
19
|
}.freeze
|
20
20
|
|
21
|
-
def closed?
|
22
|
-
[@autonyms, @adjusters, @defaults, @aliases].any?(&:frozen?)
|
23
|
-
end
|
24
|
-
|
25
21
|
private
|
26
22
|
|
27
23
|
# @param [Symbol, String] autonym
|
@@ -36,6 +32,7 @@ class Striuct; module ClassMethods
|
|
36
32
|
# @option options [Boolean] :setter_validation
|
37
33
|
# @return [nil]
|
38
34
|
def add_member(autonym, condition=Validation::Condition::ANYTHING, options=DEFAULT_MEMBER_OPTIONS, &adjuster)
|
35
|
+
raise "can't modify frozen Class" if frozen?
|
39
36
|
raise "already closed to add member in #{self}" if closed?
|
40
37
|
options = DEFAULT_MEMBER_OPTIONS.merge(options).extend(KeyValidatable)
|
41
38
|
options.validate_keys let: VALID_MEMBER_OPTIONS
|
@@ -43,17 +40,26 @@ class Striuct; module ClassMethods
|
|
43
40
|
raise ArgumentError, 'It is not able to choose "default" with "default_proc" in options'
|
44
41
|
end
|
45
42
|
|
46
|
-
autonym =
|
43
|
+
autonym = _nameable_for autonym # First difinition for an autonym
|
47
44
|
|
48
45
|
raise ArgumentError, %Q!already exist name "#{autonym}"! if member? autonym
|
49
46
|
_check_safety_naming autonym
|
50
|
-
|
51
|
-
_mark_getter_validation autonym if options[:getter_validation] or options[:reader_validation]
|
52
|
-
_mark_inference autonym if options[:inference]
|
47
|
+
_add_autonym autonym
|
53
48
|
|
54
|
-
|
55
|
-
|
56
|
-
|
49
|
+
if options[:setter_validation] or options[:writer_validation]
|
50
|
+
_attributes_for(autonym).validate_with_setter = true
|
51
|
+
end
|
52
|
+
|
53
|
+
if options[:getter_validation] or options[:reader_validation]
|
54
|
+
_attributes_for(autonym).validate_with_getter = true
|
55
|
+
end
|
56
|
+
|
57
|
+
if options[:inference]
|
58
|
+
_attributes_for(autonym).inference = true
|
59
|
+
end
|
60
|
+
|
61
|
+
_def_getter! autonym
|
62
|
+
_def_setter! autonym, condition, &adjuster
|
57
63
|
|
58
64
|
if options.has_key?(:default)
|
59
65
|
set_default_value autonym, options.fetch(:default)
|
@@ -72,6 +78,7 @@ class Striuct; module ClassMethods
|
|
72
78
|
# @param [Symbol, String] autonyms
|
73
79
|
# @return [nil]
|
74
80
|
def add_members(autonym, *autonyms)
|
81
|
+
raise "can't modify frozen Class" if frozen?
|
75
82
|
raise "already closed to add members in #{self}" if closed?
|
76
83
|
|
77
84
|
[autonym, *autonyms].each {|_autonym|add_member _autonym}
|
@@ -82,63 +89,42 @@ class Striuct; module ClassMethods
|
|
82
89
|
# @param [Symbol, String] autonym
|
83
90
|
# @return [nil]
|
84
91
|
def alias_member(aliased, autonym)
|
92
|
+
raise "can't modify frozen Class" if frozen?
|
85
93
|
raise "already closed to add members in #{self}" if closed?
|
86
|
-
autonym =
|
87
|
-
aliased =
|
94
|
+
autonym = autonym_for_name autonym
|
95
|
+
aliased = _nameable_for aliased
|
88
96
|
raise ArgumentError, %Q!already exist name "#{aliased}"! if member? aliased
|
89
97
|
_check_safety_naming aliased
|
90
98
|
|
91
99
|
alias_method aliased, autonym
|
92
100
|
alias_method :"#{aliased}=", :"#{autonym}="
|
93
|
-
|
101
|
+
@aliases[aliased] = autonym
|
94
102
|
nil
|
95
103
|
end
|
96
104
|
|
97
105
|
# @param [Symbol, String] name
|
98
106
|
# @return [nil]
|
99
107
|
def set_default_value(name, value=nil, &block)
|
108
|
+
raise "can't modify frozen Class" if frozen?
|
100
109
|
raise "already closed to modify member attributes in #{self}" if closed?
|
101
|
-
autonym =
|
110
|
+
autonym = autonym_for_name(name)
|
102
111
|
raise "already settled default value for #{name}" if has_default? autonym
|
103
112
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
arity = block.arity
|
108
|
-
|
109
|
-
if valid_default_proc? block
|
110
|
-
DefaultProcHolder.new block
|
111
|
-
else
|
112
|
-
raise ArgumentError, "wrong number of block parameter #{arity} for 0..2"
|
113
|
-
end
|
114
|
-
else
|
115
|
-
raise ArgumentError, 'can not use value and block arguments'
|
116
|
-
end
|
117
|
-
else
|
118
|
-
value
|
113
|
+
if block_given?
|
114
|
+
unless value.nil?
|
115
|
+
raise ArgumentError, 'can not use default-value with default-proc'
|
119
116
|
end
|
120
|
-
|
117
|
+
|
118
|
+
_attributes_for(autonym).set_default block, :lazy
|
119
|
+
else
|
120
|
+
_attributes_for(autonym).set_default value, :value
|
121
|
+
end
|
121
122
|
|
122
|
-
_set_default_value autonym, value
|
123
123
|
nil
|
124
124
|
end
|
125
125
|
|
126
126
|
alias_method :default, :set_default_value
|
127
|
-
|
128
|
-
# @param [Proc] _proc
|
129
|
-
def valid_default_proc?(_proc)
|
130
|
-
_proc.arity <= 2
|
131
|
-
end
|
132
|
-
|
133
|
-
# @return [self]
|
134
|
-
def close_member
|
135
|
-
[@autonyms, @adjusters, @defaults, @aliases].each(&:freeze)
|
136
|
-
self
|
137
|
-
end
|
138
|
-
|
139
|
-
alias_method :fix_structural, :close_member
|
140
|
-
alias_method :close, :close_member
|
141
|
-
|
127
|
+
|
142
128
|
# @endgroup
|
143
129
|
|
144
130
|
end; end
|
@@ -2,12 +2,6 @@ class Striuct; module ClassMethods
|
|
2
2
|
|
3
3
|
# @group Named
|
4
4
|
|
5
|
-
# @param [Symbol, String, #to_sym] name
|
6
|
-
# @return [Symbol]
|
7
|
-
def keyable_for(name)
|
8
|
-
name.to_sym
|
9
|
-
end
|
10
|
-
|
11
5
|
# @return [Array<Symbol>]
|
12
6
|
def autonyms
|
13
7
|
@autonyms.dup
|
@@ -15,7 +9,6 @@ class Striuct; module ClassMethods
|
|
15
9
|
|
16
10
|
alias_method :names, :autonyms
|
17
11
|
alias_method :members, :autonyms
|
18
|
-
alias_method :keys, :autonyms
|
19
12
|
|
20
13
|
# @return [Array<Symbol>]
|
21
14
|
def all_members
|
@@ -23,7 +16,7 @@ class Striuct; module ClassMethods
|
|
23
16
|
end
|
24
17
|
|
25
18
|
def has_member?(name)
|
26
|
-
|
19
|
+
autonym_for_name name
|
27
20
|
rescue Exception
|
28
21
|
false
|
29
22
|
else
|
@@ -31,44 +24,68 @@ class Striuct; module ClassMethods
|
|
31
24
|
end
|
32
25
|
|
33
26
|
alias_method :member?, :has_member?
|
34
|
-
alias_method :has_key?, :has_member?
|
35
|
-
alias_method :key?, :has_key?
|
36
27
|
|
37
|
-
# @param [Symbol, String, #to_sym
|
28
|
+
# @param [Symbol, String, #to_sym] name - autonym / aliased
|
38
29
|
# @return [Symbol]
|
39
|
-
def
|
40
|
-
name =
|
30
|
+
def autonym_for_name(name)
|
31
|
+
name = _nameable_for name
|
41
32
|
|
42
|
-
if @autonyms.include? name
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
33
|
+
return name if @autonyms.include? name
|
34
|
+
|
35
|
+
unless @aliases.has_key? name
|
36
|
+
raise NameError, "not defined member for #{name}"
|
37
|
+
end
|
38
|
+
|
39
|
+
@aliases.fetch name
|
40
|
+
end
|
41
|
+
|
42
|
+
alias_method :autonym_for, :autonym_for_name # todo modify to autonym_for_key
|
43
|
+
|
44
|
+
# @param [Symbol, String, Fixnum] key - autonym / aliased / index
|
45
|
+
# @return [Symbol] autonym
|
46
|
+
def autonym_for_key(key)
|
47
|
+
case key
|
48
|
+
when Symbol, String
|
49
|
+
name = _nameable_for key
|
50
|
+
if member? name
|
51
|
+
return autonym_for_name(name)
|
47
52
|
else
|
48
|
-
raise NameError
|
53
|
+
raise NameError
|
49
54
|
end
|
55
|
+
when Fixnum
|
56
|
+
if autonym = _autonyms[key]
|
57
|
+
return autonym
|
58
|
+
else
|
59
|
+
raise IndexError
|
60
|
+
end
|
61
|
+
else
|
62
|
+
raise ArgumentError
|
50
63
|
end
|
64
|
+
|
65
|
+
raise 'must not happen'
|
51
66
|
end
|
52
67
|
|
53
68
|
# @param [Symbol, String] name
|
54
|
-
def
|
55
|
-
name =
|
69
|
+
def has_autonym?(name)
|
70
|
+
name = _nameable_for name
|
56
71
|
raise NameError unless member? name
|
57
72
|
|
58
73
|
@autonyms.include? name
|
59
74
|
end
|
60
75
|
|
61
|
-
alias_method :
|
76
|
+
alias_method :autonym?, :has_autonym?
|
77
|
+
alias_method :original?, :has_autonym? # obsolute
|
62
78
|
|
63
79
|
# @param [Symbol, String] name
|
64
|
-
def
|
65
|
-
name =
|
80
|
+
def has_alias?(name)
|
81
|
+
name = _nameable_for name
|
66
82
|
raise NameError unless member? name
|
67
83
|
|
68
84
|
@aliases.has_key? name
|
69
85
|
end
|
70
86
|
|
71
|
-
alias_method :
|
87
|
+
alias_method :alias?, :has_alias?
|
88
|
+
alias_method :aliased?, :has_alias? # obsolute
|
72
89
|
|
73
90
|
# @param [Symbol, String] autonym
|
74
91
|
def has_aliases?(autonym)
|
@@ -80,10 +97,10 @@ class Striuct; module ClassMethods
|
|
80
97
|
# @param [Symbol, String] autonym
|
81
98
|
# @return [Array<Symbol>]
|
82
99
|
def aliases_for(autonym)
|
83
|
-
autonym =
|
100
|
+
autonym = _nameable_for autonym
|
84
101
|
raise NameError unless has_aliases? autonym
|
85
102
|
|
86
|
-
|
103
|
+
@aliases.group_by{|aliased, an|an}.fetch(autonym)
|
87
104
|
end
|
88
105
|
|
89
106
|
# @return [Hash] alias => autonym
|
@@ -92,23 +109,18 @@ class Striuct; module ClassMethods
|
|
92
109
|
end
|
93
110
|
|
94
111
|
private
|
112
|
+
|
113
|
+
# @param [Symbol, String, #to_sym] name
|
114
|
+
# @return [Symbol]
|
115
|
+
def _nameable_for(name)
|
116
|
+
name.to_sym
|
117
|
+
end
|
95
118
|
|
119
|
+
# for access from own instance
|
96
120
|
def _autonyms
|
97
121
|
@autonyms
|
98
122
|
end
|
99
123
|
|
100
|
-
def _alias_member(aliased, autonym)
|
101
|
-
@aliases[aliased] = autonym
|
102
|
-
end
|
103
|
-
|
104
|
-
def _autonym_for(aliased)
|
105
|
-
@aliases[aliased]
|
106
|
-
end
|
107
|
-
|
108
|
-
def _aliases_for(autonym)
|
109
|
-
@aliases.group_by{|aliased, an|an}.fetch(autonym)
|
110
|
-
end
|
111
|
-
|
112
124
|
# @endgroup
|
113
125
|
|
114
|
-
end; end
|
126
|
+
end; end
|
@@ -21,7 +21,7 @@ class Striuct; module ClassMethods
|
|
21
21
|
# @param [Object] name
|
22
22
|
# accpeptable the name into own member, under protect level of runtime
|
23
23
|
def cname?(name)
|
24
|
-
_check_safety_naming(
|
24
|
+
_check_safety_naming(_nameable_for name){|r|r}
|
25
25
|
rescue Exception
|
26
26
|
false
|
27
27
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
require_relative 'inner'
|
2
2
|
require_relative 'named'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'copy'
|
4
|
+
require_relative 'fix'
|
4
5
|
require_relative 'length'
|
5
6
|
require_relative 'to_struct'
|
6
7
|
require_relative 'constructor'
|
7
8
|
require_relative 'enum'
|
9
|
+
require_relative 'hashy'
|
8
10
|
require_relative 'default'
|
9
11
|
require_relative 'adjustment'
|
10
12
|
require_relative 'macro'
|
11
13
|
require_relative 'prevent_conflicts'
|
12
|
-
require_relative 'validation'
|
14
|
+
require_relative 'validation'
|
@@ -5,52 +5,49 @@ class Striuct; module ClassMethods
|
|
5
5
|
# @param [Symbol, String] name
|
6
6
|
# inference checker is waiting yet
|
7
7
|
def inference?(name)
|
8
|
-
autonym =
|
8
|
+
autonym = autonym_for_name name
|
9
9
|
|
10
|
-
|
10
|
+
_attributes_for(autonym).inference?
|
11
11
|
end
|
12
12
|
|
13
13
|
# @param [Symbol, String] name
|
14
|
-
def
|
15
|
-
autonym =
|
14
|
+
def has_condition?(name)
|
15
|
+
autonym = autonym_for_name name
|
16
16
|
|
17
|
-
|
17
|
+
_attributes_for(autonym).has_condition?
|
18
18
|
end
|
19
19
|
|
20
|
-
alias_method :
|
21
|
-
alias_method :
|
22
|
-
|
20
|
+
alias_method :restrict?, :has_condition?
|
21
|
+
alias_method :has_validator?, :has_condition? # obsolute
|
22
|
+
|
23
23
|
# @param [Symbol, String] name
|
24
|
-
def
|
25
|
-
|
24
|
+
def condition_for(name)
|
25
|
+
return nil unless has_condition? name
|
26
|
+
autonym = autonym_for_name name
|
27
|
+
|
28
|
+
_attributes_for(autonym).condition
|
26
29
|
end
|
27
30
|
|
28
|
-
alias_method :
|
31
|
+
alias_method :validator_for, :condition_for # obsolute
|
29
32
|
|
30
33
|
# @param [Symbol, String] name
|
31
34
|
def safety_getter?(name)
|
32
|
-
autonym =
|
35
|
+
autonym = autonym_for_name name
|
33
36
|
|
34
|
-
|
37
|
+
_attributes_for(autonym).validate_with_getter?
|
35
38
|
end
|
36
39
|
|
37
40
|
alias_method :safety_reader?, :safety_getter?
|
38
41
|
|
39
42
|
# @param [Symbol, String] name
|
40
43
|
def safety_setter?(name)
|
41
|
-
autonym =
|
44
|
+
autonym = autonym_for_name name
|
42
45
|
|
43
|
-
|
46
|
+
_attributes_for(autonym).validate_with_setter?
|
44
47
|
end
|
45
48
|
|
46
49
|
alias_method :safety_writer?, :safety_setter?
|
47
50
|
|
48
|
-
private
|
49
|
-
|
50
|
-
def _condition_for(name)
|
51
|
-
@conditions[name]
|
52
|
-
end
|
53
|
-
|
54
51
|
# @endgroup
|
55
52
|
|
56
|
-
end; end
|
53
|
+
end; end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Striuct
|
2
|
+
|
3
|
+
module HashDeepDupulicatable
|
4
|
+
|
5
|
+
# @return [Hash]
|
6
|
+
def deep_dup
|
7
|
+
dup.tap {|h|
|
8
|
+
each_pair do |key, value|
|
9
|
+
h[key] = value.dup
|
10
|
+
end
|
11
|
+
h.extend HashDeepDupulicatable
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
if respond_to? :private_constant
|
18
|
+
private_constant :HashDeepDupulicatable
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -8,18 +8,21 @@ class Striuct; module InstanceMethods
|
|
8
8
|
|
9
9
|
# @param [Symbol, String] name
|
10
10
|
def assign?(name)
|
11
|
-
autonym =
|
11
|
+
autonym = autonym_for_name name
|
12
12
|
|
13
13
|
@db.has_key? autonym
|
14
14
|
end
|
15
15
|
|
16
16
|
# @param [Symbol, String, Fixnum] key
|
17
|
-
def
|
18
|
-
|
17
|
+
def unassign(key)
|
18
|
+
raise "can't modify frozen #{self.class}" if frozen?
|
19
|
+
autonym = autonym_for_key key
|
20
|
+
|
21
|
+
@db.delete autonym
|
19
22
|
end
|
20
23
|
|
21
|
-
alias_method :
|
22
|
-
alias_method :reset_at, :
|
24
|
+
alias_method :clear_at, :unassign # obsolute
|
25
|
+
alias_method :reset_at, :unassign
|
23
26
|
|
24
27
|
# all members aren't assigned
|
25
28
|
def empty?
|
@@ -28,4 +31,4 @@ class Striuct; module InstanceMethods
|
|
28
31
|
|
29
32
|
# @endgroup
|
30
33
|
|
31
|
-
end; end
|
34
|
+
end; end
|
@@ -10,18 +10,24 @@ class Striuct; module InstanceMethods
|
|
10
10
|
# @group Delegate Class Methods
|
11
11
|
|
12
12
|
def_delegators :'self.class',
|
13
|
-
:_autonyms,
|
14
|
-
:
|
13
|
+
:_autonyms, :_nameable_for,
|
14
|
+
:autonym_for, :autonym_for_name, :autonym_for_key,
|
15
|
+
:aliases_for,
|
15
16
|
:validator_for, :condition_for,
|
16
17
|
:adjuster_for, :flavor_for,
|
17
18
|
:members, :keys, :names, :autonyms, :all_members, :aliases,
|
18
19
|
:has_member?, :member?, :has_key?, :key?,
|
20
|
+
:has_autonym?, :autonym?,
|
21
|
+
:has_alias?, :alias?, :aliased?,
|
22
|
+
:has_aliases?,
|
19
23
|
:length, :size,
|
20
24
|
:restrict?, :has_validator?, :has_condition?,
|
21
|
-
:safety_getter?, :safety_reader?, :safety_setter?, :safty_writer?,
|
22
|
-
:
|
25
|
+
:safety_getter?, :safety_reader?, :safety_setter?, :safty_writer?,
|
26
|
+
:inference?,
|
27
|
+
:has_default?, :default_value_for, :default_for, :default_type_for,
|
28
|
+
:has_adjuster?, :has_flavor?
|
23
29
|
|
24
|
-
private :_autonyms
|
30
|
+
private :_autonyms, :_nameable_for
|
25
31
|
|
26
32
|
# @endgroup
|
27
33
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
class Striuct; module InstanceMethods
|
2
2
|
|
3
|
-
# @group
|
3
|
+
# @group These Accessor API using only inner
|
4
4
|
|
5
5
|
private
|
6
6
|
|
7
|
-
def
|
8
|
-
autonym =
|
7
|
+
def _get(name)
|
8
|
+
autonym = autonym_for_name name
|
9
9
|
value = @db[autonym]
|
10
10
|
|
11
11
|
if safety_getter?(autonym) and !accept?(autonym, value)
|
@@ -16,9 +16,9 @@ class Striuct; module InstanceMethods
|
|
16
16
|
value
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def _set(name, value)
|
20
20
|
raise "can't modify frozen #{self.class}" if frozen?
|
21
|
-
autonym =
|
21
|
+
autonym = autonym_for_name name
|
22
22
|
raise "can't modify locked member #{name}" if lock? autonym
|
23
23
|
|
24
24
|
if has_adjuster? autonym
|
@@ -35,7 +35,7 @@ class Striuct; module InstanceMethods
|
|
35
35
|
end
|
36
36
|
|
37
37
|
if inference? autonym
|
38
|
-
self.class.__send__ :
|
38
|
+
self.class.__send__ :_found_family!, self, autonym, value
|
39
39
|
end
|
40
40
|
|
41
41
|
@db[autonym] = value
|
@@ -48,13 +48,6 @@ class Striuct; module InstanceMethods
|
|
48
48
|
raise
|
49
49
|
end
|
50
50
|
|
51
|
-
# @param [Symbol] autonym
|
52
|
-
def __clear__(autonym)
|
53
|
-
raise "can't modify frozen #{self.class}" if frozen?
|
54
|
-
|
55
|
-
@db.delete autonym
|
56
|
-
end
|
57
|
-
|
58
51
|
# @endgroup
|
59
52
|
|
60
53
|
end; end
|
@@ -17,7 +17,8 @@ class Striuct; module InstanceMethods
|
|
17
17
|
@locks[autonym] = true
|
18
18
|
end
|
19
19
|
else
|
20
|
-
|
20
|
+
autonym = autonym_for_key key
|
21
|
+
@locks[autonym] = true
|
21
22
|
end
|
22
23
|
|
23
24
|
self
|
@@ -33,7 +34,8 @@ class Striuct; module InstanceMethods
|
|
33
34
|
if key.equal? true
|
34
35
|
_autonyms.all?{|autonym|@locks[autonym]}
|
35
36
|
else
|
36
|
-
|
37
|
+
autonym = autonym_for_key key
|
38
|
+
@locks[autonym] || false
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
@@ -51,7 +53,8 @@ class Striuct; module InstanceMethods
|
|
51
53
|
if key.equal? true
|
52
54
|
@locks.clear
|
53
55
|
else
|
54
|
-
|
56
|
+
autonym = autonym_for_key key
|
57
|
+
@locks.delete autonym
|
55
58
|
end
|
56
59
|
|
57
60
|
self
|
@@ -59,4 +62,4 @@ class Striuct; module InstanceMethods
|
|
59
62
|
|
60
63
|
# @endgroup
|
61
64
|
|
62
|
-
end; end
|
65
|
+
end; end
|
@@ -5,34 +5,8 @@ class Striuct; module InstanceMethods
|
|
5
5
|
def initialize(*values)
|
6
6
|
@db, @locks = {}, {}
|
7
7
|
replace_values(*values)
|
8
|
-
|
9
|
-
|
10
|
-
# @return [String]
|
11
|
-
def inspect
|
12
|
-
"#<struct' #{self.class} strict?:#{strict?}".tap {|s|
|
13
|
-
each_pair do |autonym, value|
|
14
|
-
suffix = (has_default?(autonym) && default?(autonym)) ? '/default' : nil
|
15
|
-
s << " #{autonym}=#{value.inspect}#{suffix}("
|
16
|
-
s << "valid?:#{valid? autonym}, "
|
17
|
-
s << "lock?:#{lock? autonym}"
|
18
|
-
s << '),'
|
19
|
-
end
|
20
|
-
|
21
|
-
s.chop!
|
22
|
-
s << '>'
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
# @return [String]
|
27
|
-
def to_s
|
28
|
-
"#<struct' #{self.class}".tap {|s|
|
29
|
-
each_pair do |autonym, value|
|
30
|
-
s << " #{autonym}=#{value.inspect},"
|
31
|
-
end
|
32
|
-
|
33
|
-
s.chop!
|
34
|
-
s << '>'
|
35
|
-
}
|
8
|
+
excess = _autonyms.last(size - values.size)
|
9
|
+
set_defaults(*excess)
|
36
10
|
end
|
37
11
|
|
38
12
|
# @return [self]
|
@@ -49,4 +23,27 @@ class Striuct; module InstanceMethods
|
|
49
23
|
|
50
24
|
# @endgroup
|
51
25
|
|
26
|
+
# @group Default Value
|
27
|
+
|
28
|
+
# @return [self]
|
29
|
+
def set_defaults(*target_autonyms)
|
30
|
+
target_autonyms.each do |autonym|
|
31
|
+
if has_default? autonym
|
32
|
+
default = default_value_for autonym
|
33
|
+
self[autonym] = (
|
34
|
+
if default_type_for(autonym) == :lazy
|
35
|
+
args = [self, autonym][0, default.arity]
|
36
|
+
default.call(*args)
|
37
|
+
else
|
38
|
+
default
|
39
|
+
end
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
# @endgroup
|
48
|
+
|
52
49
|
end; end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require_relative 'delegate_class_methods'
|
2
2
|
require_relative 'keyvalidatable'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'inner_accessor'
|
4
4
|
require_relative 'object'
|
5
5
|
require_relative 'compare'
|
6
|
+
require_relative 'to_s'
|
6
7
|
require_relative 'values'
|
7
8
|
require_relative 'cast'
|
8
9
|
require_relative 'default'
|
@@ -12,4 +13,4 @@ require_relative 'subscript'
|
|
12
13
|
require_relative 'assign'
|
13
14
|
require_relative 'lock'
|
14
15
|
require_relative 'validation'
|
15
|
-
require_relative 'safety'
|
16
|
+
require_relative 'safety'
|