striuct 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -4,52 +4,24 @@ class Striuct; module InstanceMethods
|
|
4
4
|
|
5
5
|
# @param [Symbol, String, Fixnum] key
|
6
6
|
def [](key)
|
7
|
-
|
7
|
+
_get autonym_for_key(key)
|
8
8
|
end
|
9
9
|
|
10
10
|
# @param [Symbol, String, Fixnum] key
|
11
11
|
# @param [Object] value
|
12
12
|
# @return [value]
|
13
13
|
def []=(key, value)
|
14
|
-
|
15
|
-
|
16
|
-
true_name = autonym
|
17
|
-
__set__ autonym, value
|
18
|
-
}
|
14
|
+
autonym = autonym_for_key key
|
15
|
+
_set autonym, value
|
19
16
|
rescue Validation::InvalidWritingError
|
20
17
|
$!.set_backtrace([
|
21
|
-
"#{$!.backtrace[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{
|
18
|
+
"#{$!.backtrace[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{autonym})]=': #{$!.message}",
|
22
19
|
$!.backtrace[-1]
|
23
20
|
])
|
24
21
|
|
25
22
|
raise
|
26
23
|
end
|
27
24
|
|
28
|
-
private
|
29
|
-
|
30
|
-
# @param [Symbol, String, Fixnum] key
|
31
|
-
# @yield [autonym]
|
32
|
-
# @yieldparam [Symbol] autonym
|
33
|
-
def __subscript__(key)
|
34
|
-
case key
|
35
|
-
when Symbol, String
|
36
|
-
name = keyable_for key
|
37
|
-
if member? name
|
38
|
-
yield autonym_for(name)
|
39
|
-
else
|
40
|
-
raise NameError
|
41
|
-
end
|
42
|
-
when Fixnum
|
43
|
-
if autonym = _autonyms[key]
|
44
|
-
yield autonym
|
45
|
-
else
|
46
|
-
raise IndexError
|
47
|
-
end
|
48
|
-
else
|
49
|
-
raise ArgumentError
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
25
|
# @endgroup
|
54
26
|
|
55
27
|
end; end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Striuct; module InstanceMethods
|
2
|
+
|
3
|
+
# @group To Strings
|
4
|
+
|
5
|
+
# @return [String]
|
6
|
+
def inspect
|
7
|
+
"#<struct' #{self.class} strict?:#{strict?}".tap {|s|
|
8
|
+
each_pair do |autonym, value|
|
9
|
+
suffix = (has_default?(autonym) && default?(autonym)) ? '/default' : nil
|
10
|
+
s << " #{autonym}=#{value.inspect}#{suffix}("
|
11
|
+
s << "valid?:#{valid? autonym}, "
|
12
|
+
s << "lock?:#{lock? autonym}"
|
13
|
+
s << '),'
|
14
|
+
end
|
15
|
+
|
16
|
+
s.chop!
|
17
|
+
s << '>'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String]
|
22
|
+
def to_s
|
23
|
+
"#<struct' #{self.class}".tap {|s|
|
24
|
+
each_pair do |autonym, value|
|
25
|
+
s << " #{autonym}=#{value.inspect},"
|
26
|
+
end
|
27
|
+
|
28
|
+
s.chop!
|
29
|
+
s << '>'
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
# @endgroup
|
34
|
+
|
35
|
+
end; end
|
@@ -6,7 +6,7 @@ class Striuct; module InstanceMethods
|
|
6
6
|
# @param [Object] value - no argument and use own
|
7
7
|
# passed under any condition
|
8
8
|
def sufficient?(name, value=self[name])
|
9
|
-
autonym =
|
9
|
+
autonym = autonym_for_name name
|
10
10
|
return true unless restrict? autonym
|
11
11
|
|
12
12
|
begin
|
@@ -31,23 +31,6 @@ class Striuct; module InstanceMethods
|
|
31
31
|
values.each_with_index do |value, index|
|
32
32
|
self[index] = value
|
33
33
|
end
|
34
|
-
|
35
|
-
excess = _autonyms.last(size - values.size)
|
36
|
-
|
37
|
-
excess.each do |autonym|
|
38
|
-
if has_default? autonym
|
39
|
-
self[autonym] = (
|
40
|
-
value = default_for autonym
|
41
|
-
if value.kind_of? DefaultProcHolder
|
42
|
-
block = value.value
|
43
|
-
args = [self, autonym][0, block.arity]
|
44
|
-
block.call(*args)
|
45
|
-
else
|
46
|
-
value
|
47
|
-
end
|
48
|
-
)
|
49
|
-
end
|
50
|
-
end
|
51
34
|
|
52
35
|
self
|
53
36
|
end
|
data/lib/striuct/requirements.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'version'
|
2
2
|
require_relative 'structs'
|
3
|
-
require_relative '
|
3
|
+
require_relative 'attributes'
|
4
|
+
require_relative 'hashdeepdupulicatable'
|
4
5
|
require_relative 'classmethods'
|
5
6
|
require_relative 'instancemethods'
|
6
|
-
require_relative 'singleton_class'
|
7
|
+
require_relative 'singleton_class'
|
@@ -1,7 +1,9 @@
|
|
1
|
+
require_relative 'hashdeepdupulicatable'
|
2
|
+
require_relative 'classmethods'
|
1
3
|
require_relative 'instancemethods'
|
2
4
|
|
3
5
|
class Striuct
|
4
|
-
|
6
|
+
|
5
7
|
class << self
|
6
8
|
|
7
9
|
# @group Constructor
|
@@ -54,9 +56,9 @@ class Striuct
|
|
54
56
|
include Enumerable
|
55
57
|
include InstanceMethods
|
56
58
|
|
57
|
-
@autonyms
|
58
|
-
@
|
59
|
-
|
59
|
+
@autonyms = []
|
60
|
+
@attributes = {}.extend HashDeepDupulicatable # autonym => Attributes
|
61
|
+
@aliases = {} # aliased => autonym
|
60
62
|
@protect_level = :prevent
|
61
63
|
end
|
62
64
|
end
|
data/lib/striuct/version.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
|
3
|
+
class Test_Striuct_Subclass_Class_Copy < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_dup
|
6
|
+
org_cls = Striuct.define do
|
7
|
+
member :sth
|
8
|
+
end.freeze
|
9
|
+
|
10
|
+
assert_same true, org_cls.frozen?
|
11
|
+
assert_same true, org_cls.closed?
|
12
|
+
cls2 = org_cls.dup
|
13
|
+
assert_same true, org_cls.frozen?
|
14
|
+
assert_same true, org_cls.closed?
|
15
|
+
assert_same false, cls2.frozen?
|
16
|
+
assert_same false, cls2.closed?
|
17
|
+
cls2.__send__ :member, :dummy1
|
18
|
+
assert_same false, org_cls.member?(:dummy1)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_clone
|
22
|
+
org_cls = Striuct.define do
|
23
|
+
member :sth
|
24
|
+
end.freeze
|
25
|
+
|
26
|
+
assert_same true, org_cls.frozen?
|
27
|
+
assert_same true, org_cls.closed?
|
28
|
+
cls2 = org_cls.clone
|
29
|
+
assert_same true, org_cls.frozen?
|
30
|
+
assert_same true, org_cls.closed?
|
31
|
+
assert_same true, cls2.frozen?
|
32
|
+
assert_same true, cls2.closed?
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_dup_deep
|
36
|
+
org_cls = Striuct.define do
|
37
|
+
member :foo, Numeric, inference: true
|
38
|
+
end
|
39
|
+
|
40
|
+
foo = org_cls.new
|
41
|
+
cls2 = org_cls.dup
|
42
|
+
foo2 = cls2.new
|
43
|
+
foo2.foo = 0.1
|
44
|
+
assert_raises Validation::InvalidWritingError do
|
45
|
+
foo2.foo = 1
|
46
|
+
end
|
47
|
+
|
48
|
+
foo.foo = 1
|
49
|
+
|
50
|
+
assert_same 1, foo.foo
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_clone_deep
|
54
|
+
org_cls = Striuct.define do
|
55
|
+
member :foo, Numeric, inference: true
|
56
|
+
end
|
57
|
+
|
58
|
+
foo = org_cls.new
|
59
|
+
cls2 = org_cls.clone
|
60
|
+
foo2 = cls2.new
|
61
|
+
foo2.foo = 0.1
|
62
|
+
assert_raises Validation::InvalidWritingError do
|
63
|
+
foo2.foo = 1
|
64
|
+
end
|
65
|
+
|
66
|
+
foo.foo = 1
|
67
|
+
|
68
|
+
assert_same 1, foo.foo
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/test/{test_striuct-subclass-instance-cloning.rb → test_striuct-subclass-instance-copy.rb}
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class Test_Striuct_Subclass_Instance_Copy < Test::Unit::TestCase
|
4
4
|
|
5
5
|
class Sth < Striuct.new
|
6
6
|
member :sth
|
@@ -20,4 +20,4 @@ class Test_Striuct_Subclass_Instance_Cloning < Test::Unit::TestCase
|
|
20
20
|
assert_equal false, (sth.sth == sth2.sth)
|
21
21
|
end
|
22
22
|
|
23
|
-
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: striuct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: validation
|
@@ -83,21 +83,25 @@ files:
|
|
83
83
|
- example/example2.rb
|
84
84
|
- example/see_trace.rb
|
85
85
|
- lib/striuct.rb
|
86
|
+
- lib/striuct/attributes.rb
|
86
87
|
- lib/striuct/classmethods.rb
|
87
88
|
- lib/striuct/classmethods/README.md
|
88
89
|
- lib/striuct/classmethods/adjustment.rb
|
89
90
|
- lib/striuct/classmethods/constructor.rb
|
91
|
+
- lib/striuct/classmethods/copy.rb
|
90
92
|
- lib/striuct/classmethods/default.rb
|
91
93
|
- lib/striuct/classmethods/enum.rb
|
94
|
+
- lib/striuct/classmethods/fix.rb
|
95
|
+
- lib/striuct/classmethods/hashy.rb
|
92
96
|
- lib/striuct/classmethods/inner.rb
|
93
97
|
- lib/striuct/classmethods/length.rb
|
94
98
|
- lib/striuct/classmethods/macro.rb
|
95
99
|
- lib/striuct/classmethods/named.rb
|
96
|
-
- lib/striuct/classmethods/object.rb
|
97
100
|
- lib/striuct/classmethods/prevent_conflicts.rb
|
98
101
|
- lib/striuct/classmethods/requiremnets.rb
|
99
102
|
- lib/striuct/classmethods/to_struct.rb
|
100
103
|
- lib/striuct/classmethods/validation.rb
|
104
|
+
- lib/striuct/hashdeepdupulicatable.rb
|
101
105
|
- lib/striuct/instancemethods.rb
|
102
106
|
- lib/striuct/instancemethods/README.md
|
103
107
|
- lib/striuct/instancemethods/assign.rb
|
@@ -107,26 +111,26 @@ files:
|
|
107
111
|
- lib/striuct/instancemethods/delegate_class_methods.rb
|
108
112
|
- lib/striuct/instancemethods/enum.rb
|
109
113
|
- lib/striuct/instancemethods/hashy.rb
|
110
|
-
- lib/striuct/instancemethods/
|
114
|
+
- lib/striuct/instancemethods/inner_accessor.rb
|
111
115
|
- lib/striuct/instancemethods/keyvalidatable.rb
|
112
116
|
- lib/striuct/instancemethods/lock.rb
|
113
117
|
- lib/striuct/instancemethods/object.rb
|
114
118
|
- lib/striuct/instancemethods/requirements.rb
|
115
119
|
- lib/striuct/instancemethods/safety.rb
|
116
120
|
- lib/striuct/instancemethods/subscript.rb
|
121
|
+
- lib/striuct/instancemethods/to_s.rb
|
117
122
|
- lib/striuct/instancemethods/validation.rb
|
118
123
|
- lib/striuct/instancemethods/values.rb
|
119
124
|
- lib/striuct/requirements.rb
|
120
125
|
- lib/striuct/singleton_class.rb
|
121
|
-
- lib/striuct/specificcontainer.rb
|
122
126
|
- lib/striuct/structs.rb
|
123
127
|
- lib/striuct/version.rb
|
124
128
|
- striuct.gemspec
|
125
129
|
- test/helper.rb
|
126
130
|
- test/test_striuct-singleton_class-define.rb
|
127
|
-
- test/test_striuct-subclass-class-cloning.rb
|
128
131
|
- test/test_striuct-subclass-class-close.rb
|
129
132
|
- test/test_striuct-subclass-class-constructor.rb
|
133
|
+
- test/test_striuct-subclass-class-copy.rb
|
130
134
|
- test/test_striuct-subclass-class-freeze.rb
|
131
135
|
- test/test_striuct-subclass-class-inheritable.rb
|
132
136
|
- test/test_striuct-subclass-class-macro.rb
|
@@ -139,8 +143,8 @@ files:
|
|
139
143
|
- test/test_striuct-subclass-instance-adjuster.rb
|
140
144
|
- test/test_striuct-subclass-instance-assign.rb
|
141
145
|
- test/test_striuct-subclass-instance-basic.rb
|
142
|
-
- test/test_striuct-subclass-instance-cloning.rb
|
143
146
|
- test/test_striuct-subclass-instance-compare.rb
|
147
|
+
- test/test_striuct-subclass-instance-copy.rb
|
144
148
|
- test/test_striuct-subclass-instance-default_value.rb
|
145
149
|
- test/test_striuct-subclass-instance-enum.rb
|
146
150
|
- test/test_striuct-subclass-instance-freeze.rb
|
@@ -181,9 +185,9 @@ summary: Struct++
|
|
181
185
|
test_files:
|
182
186
|
- test/helper.rb
|
183
187
|
- test/test_striuct-singleton_class-define.rb
|
184
|
-
- test/test_striuct-subclass-class-cloning.rb
|
185
188
|
- test/test_striuct-subclass-class-close.rb
|
186
189
|
- test/test_striuct-subclass-class-constructor.rb
|
190
|
+
- test/test_striuct-subclass-class-copy.rb
|
187
191
|
- test/test_striuct-subclass-class-freeze.rb
|
188
192
|
- test/test_striuct-subclass-class-inheritable.rb
|
189
193
|
- test/test_striuct-subclass-class-macro.rb
|
@@ -196,8 +200,8 @@ test_files:
|
|
196
200
|
- test/test_striuct-subclass-instance-adjuster.rb
|
197
201
|
- test/test_striuct-subclass-instance-assign.rb
|
198
202
|
- test/test_striuct-subclass-instance-basic.rb
|
199
|
-
- test/test_striuct-subclass-instance-cloning.rb
|
200
203
|
- test/test_striuct-subclass-instance-compare.rb
|
204
|
+
- test/test_striuct-subclass-instance-copy.rb
|
201
205
|
- test/test_striuct-subclass-instance-default_value.rb
|
202
206
|
- test/test_striuct-subclass-instance-enum.rb
|
203
207
|
- test/test_striuct-subclass-instance-freeze.rb
|
@@ -1,54 +0,0 @@
|
|
1
|
-
class Striuct; module ClassMethods
|
2
|
-
|
3
|
-
# @group Basic Methods for Ruby's Object
|
4
|
-
|
5
|
-
# @return [self]
|
6
|
-
def freeze
|
7
|
-
__floating_attributes__.each(&:freeze)
|
8
|
-
super
|
9
|
-
end
|
10
|
-
|
11
|
-
# @return [Class]
|
12
|
-
def dup
|
13
|
-
r = super
|
14
|
-
@autonyms, @adjusters, @defaults, @aliases,
|
15
|
-
@setter_validations, @getter_validations,
|
16
|
-
@conditions, @inferences =
|
17
|
-
*__floating_attributes__.map(&:dup)
|
18
|
-
r
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def inherited(subclass)
|
24
|
-
autonyms = @autonyms.dup
|
25
|
-
attributes = [@conditions, @adjusters, @defaults, @inferences, @aliases, @setter_validations, @getter_validations].map(&:dup)
|
26
|
-
protect_level = @protect_level
|
27
|
-
|
28
|
-
subclass.class_eval do
|
29
|
-
original_inherited subclass
|
30
|
-
|
31
|
-
@autonyms = autonyms
|
32
|
-
@conditions, @adjusters, @defaults, @inferences, @aliases, @setter_validations, @getter_validations = *attributes
|
33
|
-
@protect_level = protect_level
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def initialize_copy(original)
|
38
|
-
ret = super original
|
39
|
-
@autonyms, @adjusters, @defaults, @aliases,
|
40
|
-
@setter_validations, @getter_validations,
|
41
|
-
@conditions, @inferences =
|
42
|
-
*__floating_attributes__.map(&:dup)
|
43
|
-
ret
|
44
|
-
end
|
45
|
-
|
46
|
-
def __floating_attributes__
|
47
|
-
[@autonyms, @adjusters, @defaults, @aliases,
|
48
|
-
@setter_validations, @getter_validations,
|
49
|
-
@conditions, @inferences]
|
50
|
-
end
|
51
|
-
|
52
|
-
# @endgroup
|
53
|
-
|
54
|
-
end; end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class Striuct
|
2
|
-
|
3
|
-
class SpecificContainer
|
4
|
-
|
5
|
-
attr_reader :value
|
6
|
-
|
7
|
-
def initialize(value)
|
8
|
-
@value = value
|
9
|
-
end
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
class DefaultProcHolder < SpecificContainer; end
|
14
|
-
|
15
|
-
if respond_to? :private_constant
|
16
|
-
private_constant :SpecificContainer, :DefaultProcHolder
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require_relative 'helper'
|
2
|
-
|
3
|
-
class Test_Striuct_Subclass_Class_Cloning < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class Sth < Striuct.new
|
6
|
-
member :sth
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_dup
|
10
|
-
klass = Sth.dup
|
11
|
-
Sth.__send__ :member, :dummy1
|
12
|
-
assert_equal false, klass.member?(:dummy1)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_clone
|
16
|
-
klass = Sth.clone
|
17
|
-
Sth.__send__ :member, :dummy2
|
18
|
-
assert_equal false, klass.member?(:dummy2)
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|