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
@@ -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
|