striuct 0.3.1 → 0.3.2
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/.gitignore +2 -0
- data/.yardopts +1 -0
- data/History.rdoc +6 -0
- data/Manifest.txt +38 -17
- data/README.md +6 -4
- data/{benchmarks → benchmark}/basics.rb +0 -0
- data/{examples → example}/README.rb +0 -0
- data/{examples → example}/example.old.rdoc +0 -0
- data/{examples → example}/example1.rb +0 -0
- data/{examples → example}/example2.rb +0 -0
- data/{examples → example}/see_trace.rb +0 -0
- data/lib/striuct/classmethods/adjustment.rb +31 -0
- data/lib/striuct/classmethods/constructor.rb +8 -8
- data/lib/striuct/classmethods/default.rb +28 -0
- data/lib/striuct/classmethods/enum.rb +49 -0
- data/lib/striuct/classmethods/inner.rb +25 -108
- data/lib/striuct/classmethods/length.rb +14 -0
- data/lib/striuct/classmethods/macro.rb +38 -41
- data/lib/striuct/classmethods/named.rb +94 -0
- data/lib/striuct/classmethods/object.rb +24 -0
- data/lib/striuct/classmethods/prevent_conflicts.rb +89 -0
- data/lib/striuct/classmethods/requiremnets.rb +9 -4
- data/lib/striuct/classmethods/to_struct.rb +26 -0
- data/lib/striuct/classmethods/validation.rb +56 -0
- data/lib/striuct/instancemethods/assign.rb +31 -0
- data/lib/striuct/instancemethods/compare.rb +31 -0
- data/lib/striuct/instancemethods/default.rb +14 -0
- data/lib/striuct/instancemethods/delegate_class_methods.rb +20 -0
- data/lib/striuct/instancemethods/enum.rb +104 -0
- data/lib/striuct/instancemethods/{hashlike.rb → hashy.rb} +39 -45
- data/lib/striuct/instancemethods/inner.rb +16 -77
- data/lib/striuct/instancemethods/lock.rb +51 -0
- data/lib/striuct/instancemethods/object.rb +47 -0
- data/lib/striuct/instancemethods/requirements.rb +12 -3
- data/lib/striuct/instancemethods/safety.rb +2 -66
- data/lib/striuct/instancemethods/singleton_class.rb +4 -1
- data/lib/striuct/instancemethods/subscript.rb +55 -0
- data/lib/striuct/instancemethods/to_struct.rb +12 -0
- data/lib/striuct/instancemethods/validation.rb +25 -0
- data/lib/striuct/instancemethods/values.rb +64 -0
- data/lib/striuct/singleton_class.rb +10 -10
- data/lib/striuct/specificcontainer.rb +3 -1
- data/lib/striuct/version.rb +1 -1
- data/striuct.gemspec +1 -1
- data/test/test_striuct_subclass_alias_member.rb +3 -3
- data/test/test_striuct_subclass_for_pairs.rb +8 -1
- metadata +32 -17
- data/lib/striuct/classmethods/basic.rb +0 -54
- data/lib/striuct/classmethods/constants.rb +0 -23
- data/lib/striuct/classmethods/handy.rb +0 -124
- data/lib/striuct/classmethods/safety.rb +0 -52
- data/lib/striuct/instancemethods/basic.rb +0 -135
- data/lib/striuct/instancemethods/handy.rb +0 -91
data/.gitignore
CHANGED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--readme README.md --protected --private lib/**/*.rb --exclude inner|instancemethods/singleton_class - LICENSE
|
data/History.rdoc
CHANGED
data/Manifest.txt
CHANGED
@@ -6,27 +6,46 @@ Manifest.txt
|
|
6
6
|
Rakefile
|
7
7
|
Gemfile
|
8
8
|
striuct.gemspec
|
9
|
+
.yardopts
|
10
|
+
|
9
11
|
lib/striuct.rb
|
10
12
|
lib/striuct/version.rb
|
11
13
|
lib/striuct/specificcontainer.rb
|
14
|
+
lib/striuct/singleton_class.rb
|
15
|
+
|
12
16
|
lib/striuct/classmethods.rb
|
13
17
|
lib/striuct/classmethods/requirements.rb
|
14
|
-
lib/striuct/classmethods/
|
15
|
-
lib/striuct/classmethods/
|
18
|
+
lib/striuct/classmethods/inner.rb
|
19
|
+
lib/striuct/classmethods/named.rb
|
20
|
+
lib/striuct/classmethods/object.rb
|
21
|
+
lib/striuct/classmethods/length.rb
|
22
|
+
lib/striuct/classmethods/to_struct.rb
|
16
23
|
lib/striuct/classmethods/constructor.rb
|
17
|
-
lib/striuct/classmethods/
|
18
|
-
lib/striuct/classmethods/
|
24
|
+
lib/striuct/classmethods/enum.rb
|
25
|
+
lib/striuct/classmethods/default.rb
|
26
|
+
lib/striuct/classmethods/adjustment.rb
|
19
27
|
lib/striuct/classmethods/macro.rb
|
20
|
-
lib/striuct/classmethods/
|
28
|
+
lib/striuct/classmethods/prevent_conflicts.rb
|
29
|
+
lib/striuct/classmethods/validation.rb
|
30
|
+
|
21
31
|
lib/striuct/instancemethods.rb
|
22
32
|
lib/striuct/instancemethods/requirements.rb
|
23
33
|
lib/striuct/instancemethods/singleton_class.rb
|
24
|
-
lib/striuct/instancemethods/
|
25
|
-
lib/striuct/instancemethods/safety.rb
|
26
|
-
lib/striuct/instancemethods/handy.rb
|
27
|
-
lib/striuct/instancemethods/hashlike.rb
|
34
|
+
lib/striuct/instancemethods/delegate_class_methods.rb
|
28
35
|
lib/striuct/instancemethods/inner.rb
|
29
|
-
lib/striuct/
|
36
|
+
lib/striuct/instancemethods/object.rb
|
37
|
+
lib/striuct/instancemethods/compare.rb
|
38
|
+
lib/striuct/instancemethods/values.rb
|
39
|
+
lib/striuct/instancemethods/to_struct.rb
|
40
|
+
lib/striuct/instancemethods/default.rb
|
41
|
+
lib/striuct/instancemethods/enum.rb
|
42
|
+
lib/striuct/instancemethods/hashy.rb
|
43
|
+
lib/striuct/instancemethods/subscript.rb
|
44
|
+
lib/striuct/instancemethods/assign.rb
|
45
|
+
lib/striuct/instancemethods/lock.rb
|
46
|
+
lib/striuct/instancemethods/validation.rb
|
47
|
+
lib/striuct/instancemethods/safety.rb
|
48
|
+
|
30
49
|
test/helper.rb
|
31
50
|
test/test_striuct.rb
|
32
51
|
test/test_striuct_define.rb
|
@@ -36,7 +55,7 @@ test/test_striuct_subclass_assign.rb
|
|
36
55
|
test/test_striuct_subclass_classlock.rb
|
37
56
|
test/test_striuct_subclass_classmethods.rb
|
38
57
|
test/test_striuct_subclass_cloning.rb
|
39
|
-
test_striuct_subclass_default_value.rb
|
58
|
+
test/test_striuct_subclass_default_value.rb
|
40
59
|
test/test_striuct_subclass_for_pairs.rb
|
41
60
|
test/test_striuct_subclass_freeze.rb
|
42
61
|
test/test_striuct_subclass_functional_condition.rb
|
@@ -50,10 +69,12 @@ test/test_striuct_subclass_safetynaming.rb
|
|
50
69
|
test/test_striuct_subclass_specific_conditions.rb
|
51
70
|
test/test_striuct_subclass_to_struct.rb
|
52
71
|
test/test_striuct_version.rb
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
72
|
+
|
73
|
+
example/README.rb
|
74
|
+
example/example1.rb
|
75
|
+
example/example2.rb
|
76
|
+
example/example.old.rdoc
|
77
|
+
example/see_trace.rb
|
78
|
+
|
79
|
+
benchmark/basics.rb
|
59
80
|
|
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
|
|
@@ -13,9 +11,9 @@ Features
|
|
13
11
|
|
14
12
|
### Strict
|
15
13
|
|
16
|
-
* Base API looks like Struct
|
17
14
|
* Easy and Flexible Validations
|
18
15
|
* Prevent to conflict member names
|
16
|
+
* Lock setters for each member
|
19
17
|
|
20
18
|
### Useful
|
21
19
|
|
@@ -23,9 +21,12 @@ Features
|
|
23
21
|
* Default value
|
24
22
|
* Member aliasing
|
25
23
|
* Inheritable
|
24
|
+
* Hndling between nil <-> unassigned
|
25
|
+
* More flendly API for Hash
|
26
26
|
|
27
27
|
### Onepoint
|
28
28
|
|
29
|
+
* Base API looks like Struct
|
29
30
|
* Pure Ruby :)
|
30
31
|
|
31
32
|
Usage
|
@@ -63,7 +64,7 @@ ken.id #=> 2
|
|
63
64
|
|
64
65
|
#### Basics
|
65
66
|
|
66
|
-
|
67
|
+
example/*
|
67
68
|
|
68
69
|
Requirements
|
69
70
|
-------------
|
@@ -83,6 +84,7 @@ Link
|
|
83
84
|
----
|
84
85
|
|
85
86
|
* [code](https://github.com/kachick/striuct)
|
87
|
+
* [API](http://kachick.github.com/docs/striuct/api/frames.html)
|
86
88
|
* [issues](https://github.com/kachick/striuct/issues)
|
87
89
|
* [CI](http://travis-ci.org/#!/kachick/striuct)
|
88
90
|
* [gem](https://rubygems.org/gems/striuct)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Striuct; module ClassMethods
|
2
|
+
|
3
|
+
# @group Adjuster
|
4
|
+
|
5
|
+
# @param [Symbol, String] name
|
6
|
+
def has_adjuster?(name)
|
7
|
+
autonym = autonym_for name
|
8
|
+
|
9
|
+
! adjuster_for(autonym).nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :has_flavor?, :has_adjuster?
|
13
|
+
|
14
|
+
# @param [Symbol, String] name
|
15
|
+
def adjuster_for(name)
|
16
|
+
_adjuster_for autonym_for(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :flavor_for, :adjuster_for
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def _adjuster_for(name)
|
24
|
+
@adjusters[name]
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :_flavor_for, :_adjuster_for
|
28
|
+
|
29
|
+
# @endgroup
|
30
|
+
|
31
|
+
end; end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'keyvalidatable'
|
2
2
|
|
3
3
|
class Striuct; module ClassMethods
|
4
|
+
|
4
5
|
# @group Constructor
|
5
6
|
|
6
|
-
# @return [
|
7
|
+
# @return [Striuct]
|
7
8
|
def for_values(*values)
|
8
9
|
new_instance(*values)
|
9
10
|
end
|
@@ -11,12 +12,10 @@ class Striuct; module ClassMethods
|
|
11
12
|
alias_method :load_values, :for_values
|
12
13
|
alias_method :new, :for_values
|
13
14
|
|
14
|
-
# @param [Hash, Struct]
|
15
|
+
# @param [Hash, Struct] pairs
|
15
16
|
# @return [Striuct]
|
16
17
|
def for_pairs(pairs)
|
17
|
-
|
18
|
-
raise TypeError, 'no pairs object'
|
19
|
-
end
|
18
|
+
raise TypeError, 'no pairs object' unless pairs.respond_to?(:each_pair)
|
20
19
|
|
21
20
|
pairs.dup.extend(KeyValidatable).validate_keys let: all_members
|
22
21
|
|
@@ -39,19 +38,19 @@ class Striuct; module ClassMethods
|
|
39
38
|
# @return [void]
|
40
39
|
def define(options={lock: true, strict: true})
|
41
40
|
raise ArgumentError, 'must with block' unless block_given?
|
42
|
-
options.extend(KeyValidatable).validate_keys let: [:lock, :strict]
|
41
|
+
options.dup.extend(KeyValidatable).validate_keys let: [:lock, :strict]
|
43
42
|
|
44
43
|
lock, strict = options[:lock], options[:strict]
|
45
44
|
|
46
45
|
new.tap {|instance|
|
47
46
|
yield instance
|
48
47
|
|
49
|
-
unless (yets =
|
48
|
+
unless (yets = autonyms.select{|autonym|! instance.assign?(autonym)}).empty?
|
50
49
|
raise "not assigned members are, yet '#{yets.inspect} in #{self}'"
|
51
50
|
end
|
52
51
|
|
53
52
|
if strict &&
|
54
|
-
! (invalids =
|
53
|
+
! (invalids = autonyms.select{|autonym|! instance.valid?(autonym)}).empty?
|
55
54
|
|
56
55
|
raise Validation::InvalidWritingError, "invalids members are, yet '#{invalids.inspect} in #{self}'"
|
57
56
|
end
|
@@ -61,4 +60,5 @@ class Striuct; module ClassMethods
|
|
61
60
|
end
|
62
61
|
|
63
62
|
# @endgroup
|
63
|
+
|
64
64
|
end; end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Striuct; module ClassMethods
|
2
|
+
|
3
|
+
# @group With default value
|
4
|
+
|
5
|
+
# @param [Symbol, String] name
|
6
|
+
def has_default?(name)
|
7
|
+
autonym = autonym_for name
|
8
|
+
|
9
|
+
@defaults.has_key? autonym
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [Symbol, String] name
|
13
|
+
def default_for(name)
|
14
|
+
autonym = autonym_for name
|
15
|
+
raise "#{name} has no default value" unless has_default? autonym
|
16
|
+
|
17
|
+
_default_for autonym
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def _default_for(name)
|
23
|
+
@defaults[name]
|
24
|
+
end
|
25
|
+
|
26
|
+
# @endgroup
|
27
|
+
|
28
|
+
end; end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Striuct; module ClassMethods
|
2
|
+
|
3
|
+
# @group Enumerative
|
4
|
+
|
5
|
+
# @yield [autonym]
|
6
|
+
# @yieldparam [Symbol] autonym - sequential under defined
|
7
|
+
# @yieldreturn [self]
|
8
|
+
# @return [Enumerator]
|
9
|
+
def each_autonym
|
10
|
+
return to_enum(__callee__) unless block_given?
|
11
|
+
|
12
|
+
_autonyms.each{|autonym|yield autonym}
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
alias_method :each_name, :each_autonym
|
17
|
+
alias_method :each_member, :each_autonym
|
18
|
+
alias_method :each_key, :each_autonym
|
19
|
+
|
20
|
+
# @yield [index]
|
21
|
+
# @yieldparam [Integer] Index
|
22
|
+
# @yieldreturn [self]
|
23
|
+
# @return [Enumerator]
|
24
|
+
def each_index
|
25
|
+
return to_enum(__callee__) 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 [self]
|
35
|
+
# @return [Enumerator]
|
36
|
+
def each_autonym_with_index
|
37
|
+
return to_enum(__callee__) unless block_given?
|
38
|
+
|
39
|
+
_autonyms.each_with_index{|autonym, index|yield autonym, index}
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
alias_method :each_name_with_index, :each_autonym_with_index
|
44
|
+
alias_method :each_member_with_index, :each_autonym_with_index
|
45
|
+
alias_method :each_key_with_index, :each_autonym_with_index
|
46
|
+
|
47
|
+
# @endgroup
|
48
|
+
|
49
|
+
end; end
|
@@ -1,19 +1,32 @@
|
|
1
1
|
class Striuct; module ClassMethods
|
2
|
-
|
2
|
+
|
3
|
+
# @group Inner Methods
|
3
4
|
|
4
5
|
private
|
5
6
|
|
6
|
-
def
|
7
|
-
|
7
|
+
def __getter__!(name)
|
8
|
+
define_method name do
|
9
|
+
__get__ name
|
10
|
+
end
|
11
|
+
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def _autonyms
|
16
|
+
@autonyms
|
8
17
|
end
|
9
18
|
|
19
|
+
alias_method :_names, :_autonyms
|
20
|
+
|
10
21
|
def _alias_member(aliased, original)
|
11
22
|
@aliases[aliased] = original
|
12
23
|
end
|
13
24
|
|
14
|
-
def
|
25
|
+
def _autonym_for(aliased)
|
15
26
|
@aliases[aliased]
|
16
27
|
end
|
28
|
+
|
29
|
+
alias_method :_original_for, :_autonym_for
|
17
30
|
|
18
31
|
def _aliases_for(original)
|
19
32
|
@aliases.group_by{|aliased, org|org}[original]
|
@@ -35,8 +48,8 @@ class Striuct; module ClassMethods
|
|
35
48
|
@inferences[name] = true
|
36
49
|
end
|
37
50
|
|
38
|
-
def
|
39
|
-
@
|
51
|
+
def _set_adjuster(name, adjuster)
|
52
|
+
@adjusters[name] = adjuster
|
40
53
|
end
|
41
54
|
|
42
55
|
def _set_condition(name, condition)
|
@@ -47,84 +60,9 @@ class Striuct; module ClassMethods
|
|
47
60
|
@defaults[name] = value
|
48
61
|
end
|
49
62
|
|
50
|
-
|
51
|
-
def autonym_for(name)
|
52
|
-
name = keyable_for name
|
53
|
-
|
54
|
-
if _names.include? name
|
55
|
-
name
|
56
|
-
else
|
57
|
-
if original = _original_for(name)
|
58
|
-
original
|
59
|
-
else
|
60
|
-
raise NameError, "not defined member for #{name}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# @param [Symbol, String, #to_sym] name
|
66
|
-
# @return [Symbol]
|
67
|
-
def keyable_for(name)
|
68
|
-
name.to_sym
|
69
|
-
end
|
70
|
-
|
71
|
-
# @param [Symbol] name
|
72
|
-
# @return [void]
|
73
|
-
# @yieldreturn [Boolean]
|
74
|
-
def _check_safety_naming(name)
|
75
|
-
estimation = _estimate_naming name
|
76
|
-
risk = NAMING_RISKS[estimation]
|
77
|
-
plevels = PROTECT_LEVELS[@protect_level]
|
78
|
-
caution = "undesirable naming '#{name}', because #{estimation}"
|
79
|
-
|
80
|
-
r = (
|
81
|
-
case
|
82
|
-
when risk >= plevels[:error]
|
83
|
-
raise NameError, caution unless block_given?
|
84
|
-
false
|
85
|
-
when risk >= plevels[:warn]
|
86
|
-
warn caution unless block_given?
|
87
|
-
false
|
88
|
-
else
|
89
|
-
true
|
90
|
-
end
|
91
|
-
)
|
92
|
-
|
93
|
-
yield r if block_given?
|
94
|
-
end
|
95
|
-
|
96
|
-
# @param [Symbol] name
|
97
|
-
# @return [Symbol]
|
98
|
-
def _estimate_naming(name)
|
99
|
-
if (instance_methods + private_instance_methods).include? name
|
100
|
-
return :conflict
|
101
|
-
end
|
102
|
-
|
103
|
-
return :no_ascii unless name.encoding.equal? Encoding::ASCII
|
104
|
-
|
105
|
-
case name
|
106
|
-
when /[\W]/, /\A[^a-zA-Z_]/, :''
|
107
|
-
:no_identifier
|
108
|
-
when /\Aeach/, /\A__[^_]*__\z/, /\A_[^_]*\z/, /[!?]\z/, /\Ato_/
|
109
|
-
:bad_manners
|
110
|
-
when /\A[a-zA-Z_]\w*\z/
|
111
|
-
:strict
|
112
|
-
else
|
113
|
-
raise 'must not happen'
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def __getter__!(name)
|
118
|
-
define_method name do
|
119
|
-
__get__ name
|
120
|
-
end
|
121
|
-
|
122
|
-
nil
|
123
|
-
end
|
124
|
-
|
125
|
-
def __setter__!(name, condition, &flavor)
|
63
|
+
def __setter__!(name, condition, &adjuster)
|
126
64
|
__set_condition__! name, condition unless Validation::Condition::ANYTHING.equal? condition
|
127
|
-
|
65
|
+
__set_adjuster__! name, &adjuster if block_given?
|
128
66
|
|
129
67
|
define_method :"#{name}=" do |value|
|
130
68
|
__set__ name, value
|
@@ -144,9 +82,9 @@ class Striuct; module ClassMethods
|
|
144
82
|
nil
|
145
83
|
end
|
146
84
|
|
147
|
-
def
|
148
|
-
if ::Validation.adjustable?
|
149
|
-
|
85
|
+
def __set_adjuster__!(name, &adjuster)
|
86
|
+
if ::Validation.adjustable? adjuster
|
87
|
+
_set_adjuster name, adjuster
|
150
88
|
else
|
151
89
|
raise ArgumentError, "wrong number of block argument #{arity} for 1"
|
152
90
|
end
|
@@ -170,27 +108,6 @@ class Striuct; module ClassMethods
|
|
170
108
|
nil
|
171
109
|
end
|
172
110
|
|
173
|
-
def _condition_for(name)
|
174
|
-
@conditions[name]
|
175
|
-
end
|
176
|
-
|
177
|
-
# @param [Symbol, String] name
|
178
|
-
def condition_for(name)
|
179
|
-
_condition_for autonym_for(name)
|
180
|
-
end
|
181
|
-
|
182
|
-
def _flavor_for(name)
|
183
|
-
@flavors[name]
|
184
|
-
end
|
185
|
-
|
186
|
-
# @param [Symbol, String] name
|
187
|
-
def flavor_for(name)
|
188
|
-
_flavor_for autonym_for(name)
|
189
|
-
end
|
190
|
-
|
191
|
-
def _default_for(name)
|
192
|
-
@defaults[name]
|
193
|
-
end
|
194
|
-
|
195
111
|
# @endgroup
|
112
|
+
|
196
113
|
end; end
|
@@ -1,19 +1,8 @@
|
|
1
1
|
require 'keyvalidatable'
|
2
2
|
|
3
3
|
class Striuct; module ClassMethods
|
4
|
-
# @group Macro for Definition
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
# @param [Symbol] level
|
9
|
-
# @return [nil]
|
10
|
-
# change protect level for risk of naming members
|
11
|
-
def protect_level(level)
|
12
|
-
raise NameError unless PROTECT_LEVELS.has_key? level
|
13
|
-
|
14
|
-
@protect_level = level
|
15
|
-
nil
|
16
|
-
end
|
5
|
+
# @group Macro for Member Definition
|
17
6
|
|
18
7
|
VALID_MEMBER_OPTIONS = [
|
19
8
|
:default,
|
@@ -28,8 +17,14 @@ class Striuct; module ClassMethods
|
|
28
17
|
DEFAULT_MEMBER_OPTIONS = {
|
29
18
|
setter_validation: true
|
30
19
|
}.freeze
|
20
|
+
|
21
|
+
def closed?
|
22
|
+
[@autonyms, @adjusters, @defaults, @aliases].any?(&:frozen?)
|
23
|
+
end
|
31
24
|
|
32
|
-
|
25
|
+
private
|
26
|
+
|
27
|
+
# @param [Symbol, String] autonym
|
33
28
|
# @param [#===, Proc, Method, ANYTHING] condition
|
34
29
|
# @param [Hash] options
|
35
30
|
# @option options [BasicObject] :default
|
@@ -40,7 +35,7 @@ class Striuct; module ClassMethods
|
|
40
35
|
# @option options [Boolean] :writer_validation
|
41
36
|
# @option options [Boolean] :setter_validation
|
42
37
|
# @return [nil]
|
43
|
-
def add_member(
|
38
|
+
def add_member(autonym, condition=Validation::Condition::ANYTHING, options=DEFAULT_MEMBER_OPTIONS, &adjuster)
|
44
39
|
raise "already closed to add member in #{self}" if closed?
|
45
40
|
options = DEFAULT_MEMBER_OPTIONS.merge(options).extend(KeyValidatable)
|
46
41
|
options.validate_keys let: VALID_MEMBER_OPTIONS
|
@@ -48,23 +43,24 @@ class Striuct; module ClassMethods
|
|
48
43
|
raise ArgumentError, 'It is not able to choose "default" with "default_proc" in options'
|
49
44
|
end
|
50
45
|
|
51
|
-
|
52
|
-
raise ArgumentError, %Q!already exist name "#{name}"! if member? name
|
53
|
-
_check_safety_naming name
|
54
|
-
_mark_setter_validation name if options[:setter_validation] or options[:writer_validation]
|
55
|
-
_mark_getter_validation name if options[:getter_validation] or options[:reader_validation]
|
56
|
-
_mark_inference name if options[:inference]
|
46
|
+
autonym = keyable_for autonym # First difinition for an autonym
|
57
47
|
|
58
|
-
|
59
|
-
|
60
|
-
|
48
|
+
raise ArgumentError, %Q!already exist name "#{autonym}"! if member? autonym
|
49
|
+
_check_safety_naming autonym
|
50
|
+
_mark_setter_validation autonym if options[:setter_validation] or options[:writer_validation]
|
51
|
+
_mark_getter_validation autonym if options[:getter_validation] or options[:reader_validation]
|
52
|
+
_mark_inference autonym if options[:inference]
|
53
|
+
|
54
|
+
@autonyms << autonym
|
55
|
+
__getter__! autonym
|
56
|
+
__setter__! autonym, condition, &adjuster
|
61
57
|
|
62
58
|
if options.has_key?(:default)
|
63
|
-
set_default_value
|
59
|
+
set_default_value autonym, options.fetch(:default)
|
64
60
|
end
|
65
61
|
|
66
62
|
if options.has_key?(:default_proc)
|
67
|
-
set_default_value
|
63
|
+
set_default_value autonym, &options.fetch(:default_proc)
|
68
64
|
end
|
69
65
|
|
70
66
|
nil
|
@@ -72,30 +68,29 @@ class Striuct; module ClassMethods
|
|
72
68
|
|
73
69
|
alias_method :member, :add_member
|
74
70
|
|
75
|
-
# @param [Symbol, String]
|
76
|
-
# @param [Symbol, String]
|
71
|
+
# @param [Symbol, String] autonym
|
72
|
+
# @param [Symbol, String] autonyms
|
77
73
|
# @return [nil]
|
78
|
-
def add_members(
|
74
|
+
def add_members(autonym, *autonyms)
|
79
75
|
raise "already closed to add members in #{self}" if closed?
|
80
76
|
|
81
|
-
[
|
77
|
+
[autonym, *autonyms].each {|_autonym|add_member _autonym}
|
82
78
|
nil
|
83
79
|
end
|
84
80
|
|
85
81
|
# @param [Symbol, String] aliased
|
86
|
-
# @param [Symbol, String]
|
82
|
+
# @param [Symbol, String] autonym
|
87
83
|
# @return [nil]
|
88
|
-
def alias_member(aliased,
|
84
|
+
def alias_member(aliased, autonym)
|
89
85
|
raise "already closed to add members in #{self}" if closed?
|
90
|
-
|
86
|
+
autonym = autonym_for autonym
|
91
87
|
aliased = keyable_for aliased
|
92
|
-
raise NameError unless member? original
|
93
88
|
raise ArgumentError, %Q!already exist name "#{aliased}"! if member? aliased
|
94
89
|
_check_safety_naming aliased
|
95
90
|
|
96
|
-
alias_method aliased,
|
97
|
-
alias_method "#{aliased}=", "#{
|
98
|
-
_alias_member aliased,
|
91
|
+
alias_method aliased, autonym
|
92
|
+
alias_method :"#{aliased}=", :"#{autonym}="
|
93
|
+
_alias_member aliased, autonym
|
99
94
|
nil
|
100
95
|
end
|
101
96
|
|
@@ -103,8 +98,8 @@ class Striuct; module ClassMethods
|
|
103
98
|
# @return [nil]
|
104
99
|
def set_default_value(name, value=nil, &block)
|
105
100
|
raise "already closed to modify member attributes in #{self}" if closed?
|
106
|
-
|
107
|
-
raise "already settled default value for #{name}" if has_default?
|
101
|
+
autonym = autonym_for(name)
|
102
|
+
raise "already settled default value for #{name}" if has_default? autonym
|
108
103
|
|
109
104
|
value = (
|
110
105
|
if block_given?
|
@@ -112,7 +107,7 @@ class Striuct; module ClassMethods
|
|
112
107
|
arity = block.arity
|
113
108
|
|
114
109
|
if valid_default_proc? block
|
115
|
-
|
110
|
+
DefaultProcHolder.new block
|
116
111
|
else
|
117
112
|
raise ArgumentError, "wrong number of block parameter #{arity} for 0..2"
|
118
113
|
end
|
@@ -124,19 +119,20 @@ class Striuct; module ClassMethods
|
|
124
119
|
end
|
125
120
|
)
|
126
121
|
|
127
|
-
_set_default_value
|
122
|
+
_set_default_value autonym, value
|
128
123
|
nil
|
129
124
|
end
|
130
125
|
|
131
126
|
alias_method :default, :set_default_value
|
132
127
|
|
128
|
+
# @param [Proc] _proc
|
133
129
|
def valid_default_proc?(_proc)
|
134
130
|
_proc.arity <= 2
|
135
131
|
end
|
136
132
|
|
137
133
|
# @return [self]
|
138
134
|
def close_member
|
139
|
-
[@
|
135
|
+
[@autonyms, @adjusters, @defaults, @aliases].each(&:freeze)
|
140
136
|
self
|
141
137
|
end
|
142
138
|
|
@@ -144,4 +140,5 @@ class Striuct; module ClassMethods
|
|
144
140
|
alias_method :close, :close_member
|
145
141
|
|
146
142
|
# @endgroup
|
143
|
+
|
147
144
|
end; end
|