striuct 0.3.5.1 → 0.4.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.
- data/.travis.yml +3 -0
- data/.yardopts +1 -1
- data/LICENSE +1 -1
- data/README.md +7 -3
- data/example/example1.rb +5 -4
- data/lib/striuct/classmethods/README.md +9 -4
- data/lib/striuct/classmethods/adjustment.rb +4 -15
- data/lib/striuct/{attributes.rb → classmethods/attributes.rb} +15 -17
- data/lib/striuct/classmethods/{prevent_conflicts.rb → conflict_management.rb} +37 -14
- data/lib/striuct/classmethods/constructor.rb +2 -4
- data/lib/striuct/classmethods/copy.rb +2 -2
- data/lib/striuct/classmethods/default.rb +9 -18
- data/lib/striuct/classmethods/enum.rb +3 -5
- data/lib/striuct/classmethods/inner.rb +6 -10
- data/lib/striuct/classmethods/macro.rb +33 -48
- data/lib/striuct/classmethods/names.rb +75 -0
- data/lib/striuct/classmethods/predicate.rb +128 -0
- data/lib/striuct/classmethods/{requiremnets.rb → requirements.rb} +6 -3
- data/lib/striuct/classmethods/validation.rb +5 -43
- data/lib/striuct/instancemethods/README.md +4 -4
- data/lib/striuct/instancemethods/assign.rb +11 -13
- data/lib/striuct/instancemethods/cast.rb +5 -8
- data/lib/striuct/instancemethods/compare.rb +6 -6
- data/lib/striuct/instancemethods/default.rb +28 -6
- data/lib/striuct/instancemethods/delegate_class_methods.rb +21 -21
- data/lib/striuct/instancemethods/enum.rb +3 -9
- data/lib/striuct/instancemethods/getter.rb +47 -0
- data/lib/striuct/instancemethods/hashy.rb +2 -6
- data/lib/striuct/instancemethods/keyvalidatable.rb +0 -5
- data/lib/striuct/instancemethods/lock.rb +35 -43
- data/lib/striuct/instancemethods/object.rb +3 -26
- data/lib/striuct/instancemethods/requirements.rb +16 -2
- data/lib/striuct/instancemethods/safety.rb +1 -1
- data/lib/striuct/instancemethods/setter.rb +58 -0
- data/lib/striuct/instancemethods/to_s.rb +2 -2
- data/lib/striuct/instancemethods/validation.rb +13 -7
- data/lib/striuct/instancemethods/values.rb +8 -7
- data/lib/striuct/requirements.rb +2 -5
- data/lib/striuct/{hashdeepdupulicatable.rb → singleton_class/hashdeepdupulicatable.rb} +2 -2
- data/lib/striuct/singleton_class.rb +3 -4
- data/striuct.gemspec +7 -4
- data/test/test_sglc-constructor.rb +36 -0
- data/test/test_subc-c-constructor.rb +88 -0
- data/test/{test_striuct-subclass-class-safety_naming.rb → test_subc-c-safety_naming.rb} +6 -5
- data/test/test_subc-f-enum.rb +139 -0
- data/test/test_subc-f-predicate.rb +647 -0
- data/test/{test_striuct-subclass-feature-validation_util.rb → test_subc-f-validation_util.rb} +10 -8
- data/test/test_subc-f_name.rb +525 -0
- data/test/{test_striuct-subclass-instance-accessor.rb → test_subc-i-accessor.rb} +3 -2
- data/test/test_subc-i-assign.rb +49 -0
- data/test/test_subc-i-cast.rb +27 -0
- data/test/{test_striuct-subclass-instance-default_value.rb → test_subc-i-default_value.rb} +2 -2
- data/test/{test_striuct-subclass-instance-hashlike.rb → test_subc-i-hashlike.rb} +0 -9
- data/test/{test_striuct-subclass-instance-lock.rb → test_subc-i-lock.rb} +8 -8
- data/test/{test_striuct-subclass-instance-to_s_family.rb → test_subc-i-to_s_family.rb} +1 -1
- data/test/{test_striuct-subclass-instance-validation_specific_conditions.rb → test_subc-i-validation_specific_conditions.rb} +50 -0
- data/test/test_version.rb +14 -0
- metadata +124 -80
- data/Manifest.txt +0 -97
- data/README.ja.old.rdoc +0 -298
- data/example/example.old.rdoc +0 -188
- data/lib/striuct/classmethods/hashy.rb +0 -22
- data/lib/striuct/classmethods/named.rb +0 -126
- data/lib/striuct/classmethods.rb +0 -1
- data/lib/striuct/instancemethods/inner_accessor.rb +0 -53
- data/lib/striuct/instancemethods/subscript.rb +0 -27
- data/lib/striuct/instancemethods.rb +0 -1
- data/lib/striuct/version.rb +0 -5
- data/test/test_striuct-singleton_class-define.rb +0 -19
- data/test/test_striuct-subclass-class-constructor.rb +0 -82
- data/test/test_striuct-subclass-class-validation.rb +0 -26
- data/test/test_striuct-subclass-instance-assign.rb +0 -30
- data/test/test_striuct-subclass-instance-enum.rb +0 -93
- data/test/test_striuct-subclass-instance-validation_functional_condition.rb +0 -51
- data/test/test_striuct-subclass-instance_names.rb +0 -18
- data/test/test_striuct-version.rb +0 -11
- /data/{History.rdoc → History.old(~0.3.n).rdoc} +0 -0
- /data/test/{test_striuct-subclass-class-macro.rb → test_subc-c-add_members.rb} +0 -0
- /data/test/{test_striuct-subclass-class-close.rb → test_subc-c-close_member.rb} +0 -0
- /data/test/{test_striuct-subclass-class-copy.rb → test_subc-c-copy.rb} +0 -0
- /data/test/{test_striuct-subclass-class-freeze.rb → test_subc-c-freeze.rb} +0 -0
- /data/test/{test_striuct-subclass-class-inheritable.rb → test_subc-c-inheritable.rb} +0 -0
- /data/test/{test_striuct-subclass-feature-alias_member.rb → test_subc-f-alias_member.rb} +0 -0
- /data/test/{test_striuct-subclass-feature-to_struct.rb → test_subc-f-to_struct.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-adjuster.rb → test_subc-i-adjuster.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-basic.rb → test_subc-i-basic.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-compare.rb → test_subc-i-compare.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-copy.rb → test_subc-i-copy.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-freeze.rb → test_subc-i-freeze.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-keyvalidatable.rb → test_subc-i-keyvalidatable.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-validation_inference.rb → test_subc-i-validation_inference.rb} +0 -0
- /data/test/{test_striuct-subclass-instance-validation_with_getter.rb → test_subc-i-validation_with_getter.rb} +0 -0
data/.travis.yml
CHANGED
data/.yardopts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--readme README.md --private lib/**/*.rb --exclude
|
1
|
+
--readme README.md --private lib/**/*.rb --exclude attributes|hashdeepdupulicatable - LICENSE
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
striuct
|
2
2
|
=======
|
3
3
|
|
4
|
-
[](http://travis-ci.org/kachick/striuct)
|
5
|
-
|
6
4
|
Description
|
7
5
|
-----------
|
8
6
|
|
@@ -103,6 +101,7 @@ Requirements
|
|
103
101
|
|
104
102
|
* Ruby - [1.9.2 or later](http://travis-ci.org/#!/kachick/striuct)
|
105
103
|
* [validation](https://github.com/kachick/validation) - 0.0.3
|
104
|
+
* [optionalargument](https://github.com/kachick/optionalargument) - 0.0.1
|
106
105
|
* [keyvalidatable](https://github.com/kachick/keyvalidatable) - 0.0.3
|
107
106
|
|
108
107
|
Install
|
@@ -112,6 +111,11 @@ Install
|
|
112
111
|
$ gem install striuct
|
113
112
|
```
|
114
113
|
|
114
|
+
Build Status
|
115
|
+
-------------
|
116
|
+
|
117
|
+
[](http://travis-ci.org/kachick/striuct)
|
118
|
+
|
115
119
|
Link
|
116
120
|
----
|
117
121
|
|
@@ -126,6 +130,6 @@ License
|
|
126
130
|
--------
|
127
131
|
|
128
132
|
The MIT X11 License
|
129
|
-
Copyright (
|
133
|
+
Copyright (c) 2011 Kenichi Kamiya
|
130
134
|
See the file LICENSE for further details.
|
131
135
|
|
data/example/example1.rb
CHANGED
@@ -135,10 +135,11 @@ class SafetyNaming < Striuct.new
|
|
135
135
|
debug $!
|
136
136
|
end
|
137
137
|
|
138
|
-
# set lower
|
139
|
-
|
138
|
+
# tempolary set lower
|
139
|
+
conflict_management :struct do
|
140
|
+
member :__send__, :'? !'
|
141
|
+
end
|
140
142
|
|
141
|
-
member :__send__, :'? !'
|
142
143
|
end
|
143
144
|
|
144
145
|
# 2. Struct+ "Handy"
|
@@ -231,4 +232,4 @@ p a
|
|
231
232
|
|
232
233
|
p MyC.new.to_struct
|
233
234
|
myc = Striuct.new :a, :b
|
234
|
-
p myc.new.to_struct
|
235
|
+
p myc.new.to_struct
|
@@ -1,5 +1,10 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
Note
|
2
|
+
=====
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
This dir's tree is diveded under roles/features.
|
5
|
+
Not only divided by CONSTANT names.
|
6
|
+
|
7
|
+
CONSTANT
|
8
|
+
--------
|
9
|
+
|
10
|
+
* attributes - Attributes
|
@@ -2,24 +2,13 @@ class Striuct; module ClassMethods
|
|
2
2
|
|
3
3
|
# @group Adjuster
|
4
4
|
|
5
|
-
# @param [Symbol, String] name
|
6
|
-
def
|
7
|
-
autonym =
|
8
|
-
|
9
|
-
_attributes_for(autonym).has_adjuster?
|
10
|
-
end
|
11
|
-
|
12
|
-
alias_method :has_flavor?, :has_adjuster? # obsolute
|
13
|
-
|
14
|
-
# @param [Symbol, String] name
|
15
|
-
def adjuster_for(name)
|
16
|
-
return nil unless has_adjuster? name
|
17
|
-
autonym = autonym_for_name name
|
5
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
6
|
+
def adjuster_for(key)
|
7
|
+
autonym = autonym_for_key key
|
8
|
+
raise KeyError unless with_adjuster? autonym
|
18
9
|
|
19
10
|
_attributes_for(autonym).adjuster
|
20
11
|
end
|
21
|
-
|
22
|
-
alias_method :flavor_for, :adjuster_for # obsolute
|
23
12
|
|
24
13
|
# @endgroup
|
25
14
|
|
@@ -1,25 +1,23 @@
|
|
1
|
-
class Striuct
|
1
|
+
class Striuct; module ClassMethods
|
2
2
|
|
3
3
|
# Attributes for each Member(Autonym)
|
4
4
|
class Attributes
|
5
5
|
|
6
|
-
VALUES
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
VALUES = [ :condition,
|
7
|
+
:adjuster ].freeze
|
8
|
+
|
9
|
+
BOOLEANS = [ :inference,
|
10
|
+
:safety_setter,
|
11
|
+
:safety_getter ].freeze
|
12
12
|
|
13
13
|
def initialize
|
14
|
-
@hash =
|
15
|
-
|
16
|
-
|
17
|
-
validate_with_getter: false
|
18
|
-
}
|
14
|
+
@hash = { inference: false,
|
15
|
+
safety_setter: false,
|
16
|
+
safety_getter: false }
|
19
17
|
end
|
20
18
|
|
21
19
|
VALUES.each do |role|
|
22
|
-
define_method "
|
20
|
+
define_method :"with_#{role}?" do
|
23
21
|
@hash.has_key? role
|
24
22
|
end
|
25
23
|
|
@@ -38,14 +36,14 @@ class Striuct
|
|
38
36
|
|
39
37
|
def adjuster=(adjuster)
|
40
38
|
unless ::Validation.adjustable? adjuster
|
41
|
-
raise ArgumentError,
|
39
|
+
raise ArgumentError, 'wrong object for adjuster'
|
42
40
|
end
|
43
41
|
|
44
42
|
@hash[:adjuster] = adjuster
|
45
43
|
end
|
46
44
|
|
47
45
|
BOOLEANS.each do |role|
|
48
|
-
define_method "#{role}?"
|
46
|
+
define_method :"with_#{role}?" do
|
49
47
|
@hash.fetch role
|
50
48
|
end
|
51
49
|
|
@@ -56,7 +54,7 @@ class Striuct
|
|
56
54
|
end
|
57
55
|
end
|
58
56
|
|
59
|
-
def
|
57
|
+
def with_default?
|
60
58
|
@hash.has_key? :default_value
|
61
59
|
end
|
62
60
|
|
@@ -111,4 +109,4 @@ class Striuct
|
|
111
109
|
private_constant :Attributes
|
112
110
|
end
|
113
111
|
|
114
|
-
end
|
112
|
+
end; end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
class Striuct; module ClassMethods
|
2
2
|
|
3
|
-
# @group
|
3
|
+
# @group Member Conflict Management
|
4
4
|
|
5
|
+
# @return [Hash] Symbol => Fixnum
|
5
6
|
NAMING_RISKS = {
|
6
7
|
conflict: 10,
|
7
8
|
no_identifier: 9,
|
@@ -10,32 +11,54 @@ class Striuct; module ClassMethods
|
|
10
11
|
strict: 0
|
11
12
|
}.freeze
|
12
13
|
|
13
|
-
|
14
|
+
# @return [Hash] Symbol => Hash
|
15
|
+
CONFLICT_MANAGEMENT_LEVELS = {
|
14
16
|
struct: {error: 99, warn: 99},
|
15
17
|
warning: {error: 99, warn: 5},
|
16
18
|
error: {error: 9, warn: 5},
|
17
19
|
prevent: {error: 5, warn: 1},
|
18
20
|
nervous: {error: 1, warn: 1}
|
19
21
|
}.each(&:freeze).freeze
|
22
|
+
|
23
|
+
# @return [Symbol]
|
24
|
+
DEFAULT_CONFLICT_MANAGEMENT_LEVEL = :prevent
|
20
25
|
|
21
26
|
# @param [Object] name
|
22
27
|
# accpeptable the name into own member, under protect level of runtime
|
23
28
|
def cname?(name)
|
24
|
-
_check_safety_naming(
|
29
|
+
_check_safety_naming(name.to_sym){|r|r}
|
25
30
|
rescue Exception
|
26
31
|
false
|
27
32
|
end
|
33
|
+
|
34
|
+
attr_reader :conflict_management_level
|
28
35
|
|
29
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
|
30
44
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
45
|
+
@conflict_management_level = level
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param [Symbol, String, #to_sym] level
|
49
|
+
# @see [#set_conflict_management_level]
|
50
|
+
# @yieldreturn [self]
|
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
|
36
57
|
|
37
|
-
|
38
|
-
|
58
|
+
yield
|
59
|
+
ensure
|
60
|
+
@conflict_management_level = before
|
61
|
+
self
|
39
62
|
end
|
40
63
|
|
41
64
|
# @param [Symbol] name
|
@@ -43,16 +66,16 @@ class Striuct; module ClassMethods
|
|
43
66
|
# @yieldreturn [Boolean]
|
44
67
|
def _check_safety_naming(name)
|
45
68
|
estimation = _estimate_naming name
|
46
|
-
risk = NAMING_RISKS
|
47
|
-
plevels =
|
69
|
+
risk = NAMING_RISKS.fetch estimation
|
70
|
+
plevels = CONFLICT_MANAGEMENT_LEVELS.fetch @conflict_management_level
|
48
71
|
caution = "undesirable naming '#{name}', because #{estimation}"
|
49
72
|
|
50
73
|
r = (
|
51
74
|
case
|
52
|
-
when risk >= plevels
|
75
|
+
when risk >= plevels.fetch(:error)
|
53
76
|
raise NameError, caution unless block_given?
|
54
77
|
false
|
55
|
-
when risk >= plevels
|
78
|
+
when risk >= plevels.fetch(:warn)
|
56
79
|
warn caution unless block_given?
|
57
80
|
false
|
58
81
|
else
|
@@ -9,10 +9,9 @@ class Striuct; module ClassMethods
|
|
9
9
|
new_instance(*values)
|
10
10
|
end
|
11
11
|
|
12
|
-
alias_method :load_values, :for_values
|
13
12
|
alias_method :new, :for_values
|
14
13
|
|
15
|
-
# @param [Hash, Struct] pairs
|
14
|
+
# @param [Hash, Struct, Striuct, #each_pair] pairs
|
16
15
|
# @return [Striuct]
|
17
16
|
def for_pairs(pairs)
|
18
17
|
raise TypeError, 'no pairs object' unless pairs.respond_to?(:each_pair)
|
@@ -26,7 +25,6 @@ class Striuct; module ClassMethods
|
|
26
25
|
}
|
27
26
|
end
|
28
27
|
|
29
|
-
alias_method :load_pairs, :for_pairs
|
30
28
|
alias_method :[], :for_pairs
|
31
29
|
|
32
30
|
# for build the fixed object
|
@@ -55,7 +53,7 @@ class Striuct; module ClassMethods
|
|
55
53
|
raise Validation::InvalidWritingError, "invalids members are, yet '#{invalids.inspect} in #{self}'"
|
56
54
|
end
|
57
55
|
|
58
|
-
instance.
|
56
|
+
instance.lock_all if lock
|
59
57
|
}
|
60
58
|
end
|
61
59
|
|
@@ -30,7 +30,7 @@ class Striuct; module ClassMethods
|
|
30
30
|
autonyms = @autonyms.dup
|
31
31
|
aliases = @aliases.dup
|
32
32
|
attributes = @attributes.deep_dup
|
33
|
-
|
33
|
+
conflict_management = @conflict_management_level
|
34
34
|
|
35
35
|
subclass.class_eval do
|
36
36
|
original_inherited subclass
|
@@ -38,7 +38,7 @@ class Striuct; module ClassMethods
|
|
38
38
|
@autonyms = autonyms
|
39
39
|
@aliases = aliases
|
40
40
|
@attributes = attributes
|
41
|
-
@
|
41
|
+
@conflict_management_level = conflict_management
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -1,29 +1,20 @@
|
|
1
1
|
class Striuct; module ClassMethods
|
2
2
|
|
3
3
|
# @group With default value
|
4
|
-
|
5
|
-
# @param [Symbol, String] name
|
6
|
-
def
|
7
|
-
autonym =
|
8
|
-
|
9
|
-
_attributes_for(autonym).has_default?
|
10
|
-
end
|
11
|
-
|
12
|
-
# @param [Symbol, String] name
|
13
|
-
def default_value_for(name)
|
14
|
-
autonym = autonym_for_name name
|
15
|
-
raise "#{name} has no default value" unless has_default? autonym
|
4
|
+
|
5
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
6
|
+
def default_value_for(key)
|
7
|
+
autonym = autonym_for_key key
|
8
|
+
raise KeyError unless with_default? autonym
|
16
9
|
|
17
10
|
_attributes_for(autonym).default_value
|
18
11
|
end
|
19
12
|
|
20
|
-
|
21
|
-
|
22
|
-
# @param [Symbol, String] name
|
13
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
23
14
|
# @return [Symbol] :value / :proc
|
24
|
-
def default_type_for(
|
25
|
-
autonym =
|
26
|
-
raise
|
15
|
+
def default_type_for(key)
|
16
|
+
autonym = autonym_for_key key
|
17
|
+
raise KeyError unless with_default? autonym
|
27
18
|
|
28
19
|
_attributes_for(autonym).default_type
|
29
20
|
end
|
@@ -4,7 +4,7 @@ class Striuct; module ClassMethods
|
|
4
4
|
|
5
5
|
# @yield [autonym]
|
6
6
|
# @yieldparam [Symbol] autonym - sequential under defined
|
7
|
-
# @yieldreturn [self
|
7
|
+
# @yieldreturn [Class] self
|
8
8
|
# @return [Enumerator]
|
9
9
|
def each_autonym
|
10
10
|
return to_enum(__callee__) unless block_given?
|
@@ -13,12 +13,11 @@ class Striuct; module ClassMethods
|
|
13
13
|
self
|
14
14
|
end
|
15
15
|
|
16
|
-
alias_method :each_name, :each_autonym
|
17
16
|
alias_method :each_member, :each_autonym
|
18
17
|
|
19
18
|
# @yield [index]
|
20
19
|
# @yieldparam [Integer] Index
|
21
|
-
# @yieldreturn [self
|
20
|
+
# @yieldreturn [Class] self
|
22
21
|
# @return [Enumerator]
|
23
22
|
def each_index
|
24
23
|
return to_enum(__callee__) unless block_given?
|
@@ -30,7 +29,7 @@ class Striuct; module ClassMethods
|
|
30
29
|
# @yield [autonym, index]
|
31
30
|
# @yieldparam [Symbol] autonym
|
32
31
|
# @yieldparam [Integer] index
|
33
|
-
# @yieldreturn [self
|
32
|
+
# @yieldreturn [Class] self
|
34
33
|
# @return [Enumerator]
|
35
34
|
def each_autonym_with_index
|
36
35
|
return to_enum(__callee__) unless block_given?
|
@@ -39,7 +38,6 @@ class Striuct; module ClassMethods
|
|
39
38
|
self
|
40
39
|
end
|
41
40
|
|
42
|
-
alias_method :each_name_with_index, :each_autonym_with_index
|
43
41
|
alias_method :each_member_with_index, :each_autonym_with_index
|
44
42
|
|
45
43
|
# @endgroup
|
@@ -5,7 +5,7 @@ class Striuct; module ClassMethods
|
|
5
5
|
private
|
6
6
|
|
7
7
|
def _add_autonym(autonym)
|
8
|
-
autonym =
|
8
|
+
autonym = autonym.to_sym
|
9
9
|
raise NameError, 'already defined' if member? autonym
|
10
10
|
|
11
11
|
@attributes[autonym] = Attributes.new
|
@@ -16,7 +16,7 @@ class Striuct; module ClassMethods
|
|
16
16
|
@attributes.fetch autonym
|
17
17
|
end
|
18
18
|
|
19
|
-
def _def_getter
|
19
|
+
def _def_getter(autonym)
|
20
20
|
define_method autonym do
|
21
21
|
_get autonym
|
22
22
|
end
|
@@ -24,8 +24,8 @@ class Striuct; module ClassMethods
|
|
24
24
|
nil
|
25
25
|
end
|
26
26
|
|
27
|
-
def _def_setter
|
28
|
-
unless
|
27
|
+
def _def_setter(autonym, condition, &adjuster)
|
28
|
+
unless ANYTHING.equal? condition
|
29
29
|
_attributes_for(autonym).condition = condition
|
30
30
|
end
|
31
31
|
|
@@ -40,12 +40,8 @@ class Striuct; module ClassMethods
|
|
40
40
|
nil
|
41
41
|
end
|
42
42
|
|
43
|
-
def _found_family
|
44
|
-
family =
|
45
|
-
|
46
|
-
raise 'must not happen' unless inference?(autonym) and
|
47
|
-
autonym?(autonym) and
|
48
|
-
_caller.instance_of?(self)
|
43
|
+
def _found_family(autonym, other)
|
44
|
+
family = other.class
|
49
45
|
|
50
46
|
_attributes_for(autonym).condition = family
|
51
47
|
_attributes_for(autonym).inference = false
|
@@ -1,26 +1,21 @@
|
|
1
|
-
require 'keyvalidatable'
|
2
|
-
|
3
1
|
class Striuct; module ClassMethods
|
4
2
|
|
5
3
|
# @group Macro for Member Definition
|
6
4
|
|
7
|
-
|
8
|
-
:default,
|
9
|
-
:default_proc,
|
10
|
-
:inference,
|
11
|
-
:reader_validation,
|
12
|
-
:getter_validation,
|
13
|
-
:writer_validation,
|
14
|
-
:setter_validation
|
15
|
-
].freeze
|
16
|
-
|
17
|
-
DEFAULT_MEMBER_OPTIONS = {
|
18
|
-
setter_validation: true
|
19
|
-
}.freeze
|
5
|
+
ANYTHING = ::Validation::Condition::ANYTHING
|
20
6
|
|
7
|
+
ADD_MEMBER_OPTIONS = OptionalArgument.define {
|
8
|
+
opt :default_value, aliases: [:default]
|
9
|
+
opt :default_proc, aliases: [:lazy_default]
|
10
|
+
conflict :default_value, :default_proc
|
11
|
+
opt :inference, default: false
|
12
|
+
opt :setter_validation, aliases: [:writer_validation], default: true
|
13
|
+
opt :getter_validation, aliases: [:reader_validation], default: false
|
14
|
+
}
|
15
|
+
|
21
16
|
private
|
22
17
|
|
23
|
-
# @param [Symbol, String] autonym
|
18
|
+
# @param [Symbol, String, #to_sym] autonym
|
24
19
|
# @param [#===, Proc, Method, ANYTHING] condition
|
25
20
|
# @param [Hash] options
|
26
21
|
# @option options [BasicObject] :default
|
@@ -31,42 +26,32 @@ class Striuct; module ClassMethods
|
|
31
26
|
# @option options [Boolean] :writer_validation
|
32
27
|
# @option options [Boolean] :setter_validation
|
33
28
|
# @return [nil]
|
34
|
-
def add_member(autonym, condition=
|
29
|
+
def add_member(autonym, condition=ANYTHING, options={}, &adjuster)
|
35
30
|
raise "can't modify frozen Class" if frozen?
|
36
31
|
raise "already closed to add member in #{self}" if closed?
|
37
|
-
options = DEFAULT_MEMBER_OPTIONS.merge(options).extend(KeyValidatable)
|
38
|
-
options.validate_keys let: VALID_MEMBER_OPTIONS
|
39
|
-
if options.has_key?(:default) and options.has_key?(:default_proc)
|
40
|
-
raise ArgumentError, 'It is not able to choose "default" with "default_proc" in options'
|
41
|
-
end
|
42
32
|
|
43
|
-
|
33
|
+
options = ADD_MEMBER_OPTIONS.parse options
|
34
|
+
autonym = autonym.to_sym # First difinition for an autonym
|
44
35
|
|
45
36
|
raise ArgumentError, %Q!already exist name "#{autonym}"! if member? autonym
|
46
37
|
_check_safety_naming autonym
|
47
38
|
_add_autonym autonym
|
48
39
|
|
49
|
-
|
50
|
-
|
51
|
-
end
|
40
|
+
_attributes_for(autonym).safety_setter = !!options.setter_validation
|
41
|
+
_attributes_for(autonym).safety_getter = !!options.getter_validation
|
52
42
|
|
53
|
-
if options
|
54
|
-
_attributes_for(autonym).validate_with_getter = true
|
55
|
-
end
|
56
|
-
|
57
|
-
if options[:inference]
|
43
|
+
if options.inference
|
58
44
|
_attributes_for(autonym).inference = true
|
59
45
|
end
|
60
46
|
|
61
|
-
_def_getter
|
62
|
-
_def_setter
|
63
|
-
|
64
|
-
if options.has_key?(:default)
|
65
|
-
set_default_value autonym, options.fetch(:default)
|
66
|
-
end
|
47
|
+
_def_getter autonym
|
48
|
+
_def_setter autonym, condition, &adjuster
|
67
49
|
|
68
|
-
|
69
|
-
|
50
|
+
case
|
51
|
+
when options.default_value?
|
52
|
+
set_default_value autonym, options.default_value
|
53
|
+
when options.default_proc?
|
54
|
+
set_default_value autonym, &options.default_proc
|
70
55
|
end
|
71
56
|
|
72
57
|
nil
|
@@ -74,8 +59,8 @@ class Striuct; module ClassMethods
|
|
74
59
|
|
75
60
|
alias_method :member, :add_member
|
76
61
|
|
77
|
-
# @param [Symbol, String] autonym
|
78
|
-
# @param [Symbol, String] autonyms
|
62
|
+
# @param [Symbol, String, #to_sym] autonym
|
63
|
+
# @param [Symbol, String, #to_sym] autonyms
|
79
64
|
# @return [nil]
|
80
65
|
def add_members(autonym, *autonyms)
|
81
66
|
raise "can't modify frozen Class" if frozen?
|
@@ -85,14 +70,14 @@ class Striuct; module ClassMethods
|
|
85
70
|
nil
|
86
71
|
end
|
87
72
|
|
88
|
-
# @param [Symbol, String] aliased
|
89
|
-
# @param [Symbol, String] autonym
|
73
|
+
# @param [Symbol, String, #to_sym] aliased
|
74
|
+
# @param [Symbol, String, #to_sym] autonym
|
90
75
|
# @return [nil]
|
91
76
|
def alias_member(aliased, autonym)
|
92
77
|
raise "can't modify frozen Class" if frozen?
|
93
78
|
raise "already closed to add members in #{self}" if closed?
|
94
|
-
autonym =
|
95
|
-
aliased =
|
79
|
+
autonym = autonym_for_member autonym
|
80
|
+
aliased = aliased.to_sym
|
96
81
|
raise ArgumentError, %Q!already exist name "#{aliased}"! if member? aliased
|
97
82
|
_check_safety_naming aliased
|
98
83
|
|
@@ -102,13 +87,13 @@ class Striuct; module ClassMethods
|
|
102
87
|
nil
|
103
88
|
end
|
104
89
|
|
105
|
-
# @param [Symbol, String] name
|
90
|
+
# @param [Symbol, String, #to_sym] name
|
106
91
|
# @return [nil]
|
107
92
|
def set_default_value(name, value=nil, &block)
|
108
93
|
raise "can't modify frozen Class" if frozen?
|
109
94
|
raise "already closed to modify member attributes in #{self}" if closed?
|
110
|
-
autonym =
|
111
|
-
raise "already settled default value for #{name}" if
|
95
|
+
autonym = autonym_for_member name
|
96
|
+
raise "already settled default value for #{name}" if with_default? autonym
|
112
97
|
|
113
98
|
if block_given?
|
114
99
|
unless value.nil?
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class Striuct; module ClassMethods
|
2
|
+
|
3
|
+
# @group Named
|
4
|
+
|
5
|
+
# @return [Array<Symbol>]
|
6
|
+
def autonyms
|
7
|
+
@autonyms.dup
|
8
|
+
end
|
9
|
+
|
10
|
+
alias_method :members, :autonyms
|
11
|
+
|
12
|
+
# @return [Array<Symbol>]
|
13
|
+
def all_members
|
14
|
+
@autonyms + @aliases.keys
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param [Symbol, String, #to_sym] als
|
18
|
+
# @return [Symbol]
|
19
|
+
def autonym_for_alias(als)
|
20
|
+
@aliases.fetch als.to_sym
|
21
|
+
rescue NoMethodError
|
22
|
+
raise TypeError
|
23
|
+
rescue KeyError
|
24
|
+
raise NameError
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param [Symbol, String, #to_sym] name - autonym / aliased
|
28
|
+
# @return [Symbol]
|
29
|
+
def autonym_for_member(name)
|
30
|
+
raise TypeError unless name.respond_to? :to_sym
|
31
|
+
name = name.to_sym
|
32
|
+
|
33
|
+
@autonyms.include?(name) ? name : autonym_for_alias(name)
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [Index, #to_int] index
|
37
|
+
# @return [Symbol] autonym
|
38
|
+
def autonym_for_index(index)
|
39
|
+
@autonyms.fetch index
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
43
|
+
# @return [Symbol] autonym
|
44
|
+
def autonym_for_key(key)
|
45
|
+
key.respond_to?(:to_sym) ? autonym_for_member(key) : autonym_for_index(key)
|
46
|
+
rescue NameError, IndexError, TypeError
|
47
|
+
raise KeyError
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param [Symbol, String, #to_sym] autonym
|
51
|
+
# @return [Array<Symbol>]
|
52
|
+
def aliases_for_autonym(autonym)
|
53
|
+
raise TypeError unless autonym.respond_to?(:to_sym)
|
54
|
+
autonym = autonym.to_sym
|
55
|
+
raise NameError unless with_aliases? autonym
|
56
|
+
|
57
|
+
@aliases.select{|als, aut|autonym == aut}.keys
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Hash] alias => autonym
|
61
|
+
def aliases
|
62
|
+
@aliases.dup
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
# for direct access inner data from own instance
|
68
|
+
# @return [Hash] alias => autonym
|
69
|
+
def _autonyms
|
70
|
+
@autonyms
|
71
|
+
end
|
72
|
+
|
73
|
+
# @endgroup
|
74
|
+
|
75
|
+
end; end
|