striuct 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/History.rdoc +6 -0
  2. data/Manifest.txt +13 -7
  3. data/README.md +12 -10
  4. data/example/README.rb +5 -3
  5. data/lib/striuct/attributes.rb +114 -0
  6. data/lib/striuct/classmethods/adjustment.rb +8 -15
  7. data/lib/striuct/classmethods/copy.rb +55 -0
  8. data/lib/striuct/classmethods/default.rb +18 -13
  9. data/lib/striuct/classmethods/enum.rb +1 -3
  10. data/lib/striuct/classmethods/fix.rb +28 -0
  11. data/lib/striuct/classmethods/hashy.rb +22 -0
  12. data/lib/striuct/classmethods/inner.rb +24 -58
  13. data/lib/striuct/classmethods/macro.rb +33 -47
  14. data/lib/striuct/classmethods/named.rb +52 -40
  15. data/lib/striuct/classmethods/prevent_conflicts.rb +1 -1
  16. data/lib/striuct/classmethods/requiremnets.rb +4 -2
  17. data/lib/striuct/classmethods/validation.rb +19 -22
  18. data/lib/striuct/hashdeepdupulicatable.rb +21 -0
  19. data/lib/striuct/instancemethods/assign.rb +9 -6
  20. data/lib/striuct/instancemethods/default.rb +1 -1
  21. data/lib/striuct/instancemethods/delegate_class_methods.rb +11 -5
  22. data/lib/striuct/instancemethods/hashy.rb +1 -1
  23. data/lib/striuct/instancemethods/{inner.rb → inner_accessor.rb} +6 -13
  24. data/lib/striuct/instancemethods/lock.rb +7 -4
  25. data/lib/striuct/instancemethods/object.rb +25 -28
  26. data/lib/striuct/instancemethods/requirements.rb +3 -2
  27. data/lib/striuct/instancemethods/subscript.rb +4 -32
  28. data/lib/striuct/instancemethods/to_s.rb +35 -0
  29. data/lib/striuct/instancemethods/validation.rb +1 -1
  30. data/lib/striuct/instancemethods/values.rb +0 -17
  31. data/lib/striuct/requirements.rb +3 -2
  32. data/lib/striuct/singleton_class.rb +6 -4
  33. data/lib/striuct/version.rb +1 -1
  34. data/test/test_striuct-subclass-class-copy.rb +71 -0
  35. data/test/{test_striuct-subclass-instance-cloning.rb → test_striuct-subclass-instance-copy.rb} +2 -2
  36. metadata +13 -9
  37. data/lib/striuct/classmethods/object.rb +0 -54
  38. data/lib/striuct/specificcontainer.rb +0 -19
  39. 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
- __subscript__(key){|autonym|__get__ autonym}
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
- true_name = nil
15
- __subscript__(key){|autonym|
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}(#{true_name})]=': #{$!.message}",
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 = autonym_for name
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
@@ -1,6 +1,7 @@
1
1
  require_relative 'version'
2
2
  require_relative 'structs'
3
- require_relative 'specificcontainer'
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
- @conditions, @adjusters, @defaults, @inferences, @aliases, @setter_validations, @getter_validations = \
59
- {}, {}, {}, {}, {}, {}, {}
59
+ @autonyms = []
60
+ @attributes = {}.extend HashDeepDupulicatable # autonym => Attributes
61
+ @aliases = {} # aliased => autonym
60
62
  @protect_level = :prevent
61
63
  end
62
64
  end
@@ -1,5 +1,5 @@
1
1
  class Striuct
2
2
 
3
- VERSION = '0.3.4'.freeze
3
+ VERSION = '0.3.5'.freeze
4
4
 
5
5
  end
@@ -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
@@ -1,6 +1,6 @@
1
1
  require_relative 'helper'
2
2
 
3
- class Test_Striuct_Subclass_Instance_Cloning < Test::Unit::TestCase
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
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-07 00:00:00.000000000 Z
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/inner.rb
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