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