striuct 0.6.1 → 0.7.0

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +19 -39
  4. data/lib/striuct.rb +3 -3
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +15 -13
  7. data/lib/striuct/classmethods/attributes.rb +94 -92
  8. data/lib/striuct/classmethods/conflict_management.rb +109 -106
  9. data/lib/striuct/classmethods/constructor.rb +47 -54
  10. data/lib/striuct/classmethods/copy.rb +45 -43
  11. data/lib/striuct/classmethods/default.rb +23 -21
  12. data/lib/striuct/classmethods/enum.rb +46 -44
  13. data/lib/striuct/classmethods/fix.rb +23 -21
  14. data/lib/striuct/classmethods/hashdeepdupulicatable.rb +15 -15
  15. data/lib/striuct/classmethods/inner.rb +57 -55
  16. data/lib/striuct/classmethods/length.rb +12 -10
  17. data/lib/striuct/classmethods/macro.rb +110 -106
  18. data/lib/striuct/classmethods/names.rb +69 -65
  19. data/lib/striuct/classmethods/predicate.rb +131 -129
  20. data/lib/striuct/classmethods/requirements.rb +3 -1
  21. data/lib/striuct/classmethods/to_struct.rb +21 -18
  22. data/lib/striuct/classmethods/validation.rb +15 -13
  23. data/lib/striuct/instancemethods/README.md +2 -2
  24. data/lib/striuct/instancemethods/assign.rb +29 -27
  25. data/lib/striuct/instancemethods/cast.rb +28 -26
  26. data/lib/striuct/instancemethods/compare.rb +26 -24
  27. data/lib/striuct/instancemethods/default.rb +31 -29
  28. data/lib/striuct/instancemethods/delegate_class_methods.rb +35 -33
  29. data/lib/striuct/instancemethods/enum.rb +86 -84
  30. data/lib/striuct/instancemethods/getter.rb +39 -37
  31. data/lib/striuct/instancemethods/hashy.rb +99 -97
  32. data/lib/striuct/instancemethods/keyvalidatable.rb +8 -6
  33. data/lib/striuct/instancemethods/lock.rb +46 -44
  34. data/lib/striuct/instancemethods/object.rb +50 -48
  35. data/lib/striuct/instancemethods/requirements.rb +11 -9
  36. data/lib/striuct/instancemethods/safety.rb +11 -9
  37. data/lib/striuct/instancemethods/setter.rb +46 -45
  38. data/lib/striuct/instancemethods/to_s.rb +39 -37
  39. data/lib/striuct/instancemethods/validation.rb +31 -29
  40. data/lib/striuct/instancemethods/values.rb +50 -48
  41. data/lib/striuct/requirements.rb +3 -1
  42. data/lib/striuct/singleton_class.rb +12 -17
  43. data/lib/striuct/structs.rb +3 -3
  44. metadata +33 -178
  45. data/.gitignore +0 -35
  46. data/.travis.yml +0 -17
  47. data/.yardopts +0 -1
  48. data/Gemfile +0 -11
  49. data/MIT-LICENSE +0 -22
  50. data/Rakefile +0 -11
  51. data/benchmark/basics.rb +0 -56
  52. data/example/README.rb +0 -50
  53. data/example/example1.rb +0 -195
  54. data/example/example2.rb +0 -20
  55. data/example/see_trace.rb +0 -32
  56. data/striuct.gemspec +0 -45
  57. data/test/helper.rb +0 -3
  58. data/test/test_sglc-constructor.rb +0 -36
  59. data/test/test_subc-c-add_members.rb +0 -13
  60. data/test/test_subc-c-close_member.rb +0 -36
  61. data/test/test_subc-c-constructor.rb +0 -92
  62. data/test/test_subc-c-copy.rb +0 -71
  63. data/test/test_subc-c-freeze.rb +0 -36
  64. data/test/test_subc-c-inheritable.rb +0 -58
  65. data/test/test_subc-c-safety_naming.rb +0 -73
  66. data/test/test_subc-f-alias_member.rb +0 -54
  67. data/test/test_subc-f-enum.rb +0 -159
  68. data/test/test_subc-f-predicate.rb +0 -647
  69. data/test/test_subc-f-to_struct.rb +0 -61
  70. data/test/test_subc-f-validation_util.rb +0 -59
  71. data/test/test_subc-f_debug.rb +0 -39
  72. data/test/test_subc-f_name.rb +0 -525
  73. data/test/test_subc-i-accessor.rb +0 -138
  74. data/test/test_subc-i-adjuster.rb +0 -95
  75. data/test/test_subc-i-assign.rb +0 -53
  76. data/test/test_subc-i-basic.rb +0 -43
  77. data/test/test_subc-i-cast.rb +0 -27
  78. data/test/test_subc-i-compare.rb +0 -52
  79. data/test/test_subc-i-copy.rb +0 -23
  80. data/test/test_subc-i-default_value.rb +0 -129
  81. data/test/test_subc-i-freeze.rb +0 -19
  82. data/test/test_subc-i-hashlike.rb +0 -144
  83. data/test/test_subc-i-keyvalidatable.rb +0 -25
  84. data/test/test_subc-i-lock.rb +0 -40
  85. data/test/test_subc-i-must.rb +0 -30
  86. data/test/test_subc-i-to_s_family.rb +0 -26
  87. data/test/test_subc-i-validation_specific_conditions.rb +0 -297
  88. data/test/test_subc-i-validation_with_getter.rb +0 -33
  89. data/test/test_version.rb +0 -13
@@ -1,19 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance__Freeze < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new :foo
6
-
7
- def test_freeze
8
- sth = Sth.new
9
- sth.freeze
10
-
11
- assert_raises RuntimeError do
12
- sth.foo = 8
13
- end
14
-
15
- assert_equal true, sth.frozen?
16
- end
17
-
18
- end
19
-
@@ -1,144 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_HashLike < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new :foo, :bar, :hoge
6
-
7
- def test_has_value?
8
- sth = Sth[hoge: 7, foo: 8]
9
- assert_equal true, sth.value?(7)
10
- assert_equal true, sth.value?(8)
11
- assert_equal false, sth.value?(9)
12
- assert_equal false, sth.value?(nil)
13
- end
14
-
15
- def test_select!
16
- sth = Sth[hoge: 7, foo: 8]
17
- sth2, sth3 = sth.dup, sth.dup
18
-
19
- assert_kind_of Enumerator, enum = sth.select!
20
- assert_equal [:foo, 8], enum.next
21
- assert_equal [:bar, nil], enum.next
22
- assert_equal [:hoge, 7], enum.next
23
- assert_raises StopIteration do
24
- enum.next
25
- end
26
-
27
- assert_equal nil, sth2.select!{|k, v|true}
28
- assert_equal sth3, sth3.select!{|k, v|k == :hoge && v == 7}
29
- assert_equal nil, sth3.foo
30
- assert_equal true, sth3.assign?(:hoge)
31
- assert_equal false, sth3.assign?(:foo)
32
- assert_equal 7, sth3.hoge
33
- end
34
-
35
- def test_keep_if
36
- sth = Sth[hoge: 7, foo: 8]
37
- sth2, sth3 = sth.dup, sth.dup
38
-
39
- assert_kind_of Enumerator, enum = sth.keep_if
40
- assert_equal [:foo, 8], enum.next
41
- assert_equal [:bar, nil], enum.next
42
- assert_equal [:hoge, 7], enum.next
43
- assert_raises StopIteration do
44
- enum.next
45
- end
46
-
47
- assert_equal sth2, sth2.keep_if{|k, v|true}
48
- assert_equal sth3, sth3.keep_if{|k, v|k == :hoge && v == 7}
49
- assert_equal nil, sth3.foo
50
- assert_equal true, sth3.assign?(:hoge)
51
- assert_equal false, sth3.assign?(:foo)
52
- assert_equal 7, sth3.hoge
53
- end
54
-
55
- def test_reject!
56
- sth = Sth[hoge: 7, foo: 8]
57
- sth2, sth3 = sth.dup, sth.dup
58
-
59
- assert_kind_of Enumerator, enum = sth.reject!
60
- assert_equal [:foo, 8], enum.next
61
- assert_equal [:bar, nil], enum.next
62
- assert_equal [:hoge, 7], enum.next
63
- assert_raises StopIteration do
64
- enum.next
65
- end
66
-
67
- enum.rewind
68
- assert_equal [:foo, 8], enum.next
69
-
70
- assert_equal nil, sth2.reject!{|k, v|false}
71
- assert_equal sth3, sth3.reject!{|k, v|k == :hoge && v == 7}
72
- assert_equal nil, sth3.hoge
73
- assert_equal false, sth3.assign?(:hoge)
74
- assert_equal true, sth3.assign?(:foo)
75
- assert_equal 8, sth3.foo
76
- end
77
-
78
- def test_delete_if
79
- sth = Sth[hoge: 7, foo: 8]
80
- sth2, sth3 = sth.dup, sth.dup
81
-
82
- assert_kind_of Enumerator, enum = sth.delete_if
83
-
84
- assert_equal [:foo, 8], enum.next
85
- assert_equal [:bar, nil], enum.next
86
- assert_equal [:hoge, 7], enum.next
87
- assert_raises StopIteration do
88
- enum.next
89
- end
90
-
91
- assert_equal sth2, sth2.delete_if{|k, v|false}
92
- assert_equal sth3, sth3.delete_if{|k, v|k == :hoge && v == 7}
93
- assert_equal nil, sth3.hoge
94
- assert_equal false, sth3.assign?(:hoge)
95
- assert_equal true, sth3.assign?(:foo)
96
- assert_equal 8, sth3.foo
97
- end
98
-
99
- def test_assoc
100
- sth = Sth[hoge: 7, foo: 8]
101
-
102
- assert_equal [:foo, 8], sth.assoc(:foo)
103
- assert_equal [:bar, nil], sth.assoc(:bar)
104
- assert_equal [:hoge, 7], sth.assoc(:hoge)
105
-
106
- assert_raises NameError do
107
- sth.assoc(:dummy)
108
- end
109
- end
110
-
111
- def test_rassoc
112
- sth = Sth[hoge: 7, foo: 7]
113
-
114
- assert_equal [:foo, 7], sth.rassoc(7)
115
- assert_equal [:bar, nil], sth.rassoc(nil)
116
- assert_equal nil, sth.rassoc(9)
117
- end
118
-
119
- def test_flatten
120
- sth = Sth[hoge: 7, foo: 8, bar: [1, 2]]
121
- assert_equal [:foo, 8, :bar, [1, 2], :hoge, 7], sth.flatten
122
- assert_equal [:foo, 8, :bar, [1, 2], :hoge, 7], sth.flatten(1)
123
- assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(2)
124
- assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(3)
125
- assert_equal [:foo, 8, :bar, 1, 2, :hoge, 7], sth.flatten(-1)
126
- end
127
-
128
- def test_select
129
- sth = Sth[hoge: 7, foo: 8]
130
-
131
- assert_kind_of Enumerator, sth.select
132
-
133
- assert_equal Sth[hoge: 7], sth.select{|k, v|k == :hoge}
134
- end
135
-
136
- def test_reject
137
- sth = Sth[hoge: 7, foo: 8]
138
-
139
- assert_kind_of Enumerator, sth.reject
140
-
141
- assert_equal Sth[foo: 8], sth.reject{|k, v|k == :hoge}
142
- end
143
-
144
- end
@@ -1,25 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_KeyVallidatable < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new :foo, :bar
6
-
7
- def test_valid_keys?
8
- sth = Sth.new
9
- assert(sth.valid_keys?(must: [:foo, :bar]))
10
- assert(sth.valid_keys?(let: [:foo, :bar]))
11
- assert(sth.valid_keys?(must: [:foo], let: [:bar]))
12
- assert(sth.valid_keys?(let: [:foo, :bar, :hoge]))
13
- assert_same(false, sth.valid_keys?(must: [:foo, :bar, :hoge]))
14
- end
15
-
16
- def test_valid_autonyms?
17
- sth = Sth.new
18
- assert(sth.valid_autonyms?(must: [:foo, :bar]))
19
- assert(sth.valid_autonyms?(let: [:foo, :bar]))
20
- assert(sth.valid_autonyms?(must: [:foo], let: [:bar]))
21
- assert(sth.valid_autonyms?(let: [:foo, :bar, :hoge]))
22
- assert_same(false, sth.valid_autonyms?(must: [:foo, :bar, :hoge]))
23
- end
24
-
25
- end
@@ -1,40 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Lock < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new :foo, :bar
6
- Sth.__send__ :close
7
-
8
- def test_lock
9
- sth = Sth.new
10
- assert_equal false, sth.locked?(:foo)
11
- assert_equal false, sth.locked?(:bar)
12
- assert_equal false, sth.secure?
13
- sth.lock :bar
14
- assert_equal true, sth.locked?(:bar)
15
- assert_equal false, sth.secure?
16
-
17
- assert_raises RuntimeError do
18
- sth.bar = 1
19
- end
20
-
21
- sth.__send__ :unlock, :bar
22
-
23
- assert_equal false, sth.locked?(:bar)
24
-
25
- sth.bar = 1
26
- assert_equal 1, sth.bar
27
-
28
- sth.lock_all
29
- assert_equal true, sth.locked?(:foo)
30
- assert_equal true, sth.locked?(:bar)
31
- assert_equal true, sth.all_locked?
32
-
33
- assert_raises RuntimeError do
34
- sth.foo = 1
35
- end
36
-
37
- assert_equal true, sth.secure?
38
- end
39
-
40
- end
@@ -1,30 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Must < Test::Unit::TestCase
4
-
5
- Sth = Striuct.define do
6
- member :foo, ANYTHING?, must: false
7
- member :bar, ANYTHING?, must: true
8
- member :baz
9
- end
10
-
11
- def test_must
12
- assert_raises(Striuct::InvalidOperationError) do
13
- Sth.new :foo
14
- end
15
-
16
- assert_raises(Striuct::InvalidOperationError) do
17
- Sth.new foo: :foo, baz: :baz
18
- end
19
-
20
- sth = Sth.new :foo, :bar, :baz
21
- assert_instance_of(Sth, sth)
22
-
23
- assert_raises(Striuct::InvalidOperationError) do
24
- sth.unassign :bar
25
- end
26
-
27
- assert_nil(sth.bar = nil)
28
- end
29
-
30
- end
@@ -1,26 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_to_s_Family < Test::Unit::TestCase
4
-
5
- class User < Striuct.new
6
- member :id, Integer, must: true
7
- member :name, /\w+/
8
- end
9
-
10
- def setup
11
- @sth = User.new 9999, 'taro'
12
- @sth.lock(:name)
13
- @sth.name.clear
14
- end
15
-
16
- def test_to_s
17
- assert_equal %q!#<struct' Test_Striuct_Subclass_Instance_to_s_Family::User id=9999, name="">!,
18
- @sth.to_s
19
- end
20
-
21
- def test_inspect
22
- assert_equal %q!#<struct' Test_Striuct_Subclass_Instance_to_s_Family::User id=9999(must), name=""(invalid, locked)>!,
23
- @sth.inspect
24
- end
25
-
26
- end
@@ -1,297 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_SpecificConditions < Test::Unit::TestCase
4
-
5
- Sth = Striuct.define do
6
- member :list_only_int, GENERICS(Integer)
7
- member :true_or_false, BOOL?
8
- member :like_str, STRINGABLE?
9
- member :has_foo, CAN(:foo)
10
- member :has_foo_and_bar, CAN(:foo, :bar)
11
- member :one_of_member, MEMBER_OF([1, 3])
12
- member :has_ignore, AND(1..5, 3..10)
13
- member :nand, NAND(1..5, 3..10)
14
- member :all_pass, OR(1..5, 3..10)
15
- member :catch_error, CATCH(NoMethodError){|v|v.no_name!}
16
- member :no_exception, QUIET(->v{v.class})
17
- member :not_integer, NOT(Integer)
18
- end
19
-
20
- def test_not
21
- sth = Sth.new
22
-
23
- obj = Object.new
24
-
25
- sth.not_integer = obj
26
- assert_same obj, sth.not_integer
27
-
28
- assert_raises Validation::InvalidWritingError do
29
- sth.not_integer = 1
30
- end
31
- end
32
-
33
-
34
- def test_still
35
- sth = Sth.new
36
-
37
- obj = Object.new
38
-
39
- sth.no_exception = obj
40
- assert_same obj, sth.no_exception
41
- sth.no_exception = false
42
-
43
- obj.singleton_class.class_eval do
44
- undef_method :class
45
- end
46
-
47
- assert_raises Validation::InvalidWritingError do
48
- sth.no_exception = obj
49
- end
50
- end
51
-
52
- def test_catch
53
- sth = Sth.new
54
-
55
- obj = Object.new
56
-
57
- sth.catch_error = obj
58
- assert_same obj, sth.catch_error
59
- sth.catch_error = false
60
-
61
- obj.singleton_class.class_eval do
62
- def no_name!
63
- end
64
- end
65
-
66
- assert_raises Validation::InvalidWritingError do
67
- sth.catch_error = obj
68
- end
69
- end
70
-
71
- def test_or
72
- sth = Sth.new
73
-
74
- assert_raises Validation::InvalidWritingError do
75
- sth.all_pass = 11
76
- end
77
-
78
- sth.all_pass = 1
79
- assert_equal 1, sth.all_pass
80
- sth.all_pass = 4
81
- assert_equal 4, sth.all_pass
82
- assert_equal true, sth.valid?(:all_pass)
83
- end
84
-
85
- def test_and
86
- sth = Sth.new
87
-
88
- assert_raises Validation::InvalidWritingError do
89
- sth.has_ignore = 1
90
- end
91
-
92
- assert_raises Validation::InvalidWritingError do
93
- sth.has_ignore= 2
94
- end
95
-
96
- sth.has_ignore = 3
97
- assert_equal 3, sth.has_ignore
98
- assert_equal true, sth.valid?(:has_ignore)
99
-
100
- assert_raises Validation::InvalidWritingError do
101
- sth.has_ignore = []
102
- end
103
- end
104
-
105
- def test_nand
106
- sth = Sth.new
107
-
108
- assert_raises Validation::InvalidWritingError do
109
- sth.nand = 4
110
- end
111
-
112
- assert_raises Validation::InvalidWritingError do
113
- sth.nand = 4.5
114
- end
115
-
116
- sth.nand = 2
117
- assert_equal 2, sth.nand
118
- assert_equal true, sth.valid?(:nand)
119
- sth.nand = []
120
- assert_equal [], sth.nand
121
- end
122
-
123
- def test_member_of
124
- sth = Sth.new
125
-
126
- assert_raises Validation::InvalidWritingError do
127
- sth.one_of_member = 4
128
- end
129
-
130
- sth.one_of_member = 3
131
- assert_equal 3, sth.one_of_member
132
- assert_equal true, sth.valid?(:one_of_member)
133
- end
134
-
135
- def test_generics
136
- sth = Sth.new
137
-
138
- assert_raises Validation::InvalidWritingError do
139
- sth.list_only_int = [1, '2']
140
- end
141
-
142
- sth.list_only_int = [1, 2]
143
- assert_equal [1, 2], sth.list_only_int
144
- assert_equal true, sth.valid?(:list_only_int)
145
- sth.list_only_int = []
146
- assert_equal [], sth.list_only_int
147
- assert_equal true, sth.valid?(:list_only_int)
148
- sth.list_only_int << '2'
149
- assert_equal false, sth.valid?(:list_only_int)
150
- end
151
-
152
- def test_boolean
153
- sth = Sth.new
154
-
155
- assert_raises Validation::InvalidWritingError do
156
- sth.true_or_false = nil
157
- end
158
-
159
- assert_equal false, sth.valid?(:true_or_false)
160
-
161
- sth.true_or_false = true
162
- assert_equal true, sth.true_or_false
163
- assert_equal true, sth.valid?(:true_or_false)
164
- sth.true_or_false = false
165
- assert_equal false, sth.true_or_false
166
- assert_equal true, sth.valid?(:true_or_false)
167
- end
168
-
169
- def test_stringable
170
- sth = Sth.new
171
- obj = Object.new
172
-
173
- assert_raises Validation::InvalidWritingError do
174
- sth.like_str = obj
175
- end
176
-
177
- sth.like_str = 'str'
178
- assert_equal true, sth.valid?(:like_str)
179
- sth.like_str = :sym
180
- assert_equal true, sth.valid?(:like_str)
181
-
182
- obj.singleton_class.class_eval do
183
- def to_str
184
- end
185
- end
186
-
187
- sth.like_str = obj
188
- assert_equal true, sth.valid?(:like_str)
189
- end
190
-
191
- def test_responsible_arg1
192
- sth = Sth.new
193
- obj = Object.new
194
-
195
- raise if obj.respond_to? :foo
196
-
197
- assert_raises Validation::InvalidWritingError do
198
- sth.has_foo = obj
199
- end
200
-
201
- obj.singleton_class.class_eval do
202
- def foo
203
- end
204
- end
205
-
206
- raise unless obj.respond_to? :foo
207
-
208
- sth.has_foo = obj
209
- assert_equal obj, sth.has_foo
210
- assert_equal true, sth.valid?(:has_foo)
211
- end
212
-
213
- def test_responsible_arg2
214
- sth = Sth.new
215
- obj = Object.new
216
-
217
- raise if obj.respond_to? :foo
218
- raise if obj.respond_to? :bar
219
-
220
- assert_raises Validation::InvalidWritingError do
221
- sth.has_foo_and_bar = obj
222
- end
223
-
224
- obj.singleton_class.class_eval do
225
- def foo
226
- end
227
- end
228
-
229
- assert_raises Validation::InvalidWritingError do
230
- sth.has_foo_and_bar = obj
231
- end
232
-
233
- raise unless obj.respond_to? :foo
234
-
235
- obj.singleton_class.class_eval do
236
- def bar
237
- end
238
- end
239
-
240
- raise unless obj.respond_to? :bar
241
-
242
- sth.has_foo_and_bar = obj
243
- assert_equal obj, sth.has_foo_and_bar
244
- assert_equal true, sth.valid?(:has_foo_and_bar)
245
- end
246
-
247
- end
248
-
249
- class Test_Striuct_Subclass_Instance_SpecificConditions_FunctionalCondition < Test::Unit::TestCase
250
-
251
- Sthlambda = Striuct.new do
252
- member :lank, ->lank{lanks.include? lank}
253
- member :lanks
254
- default :lanks, 1..30
255
- end
256
-
257
- def test_lambda
258
- sth = Sthlambda.new
259
- sth.lank = 2
260
- assert_equal 2, sth.lank
261
-
262
- assert_raises Validation::InvalidWritingError do
263
- sth.lank = 31
264
- end
265
- end
266
-
267
- max = 9
268
-
269
- SthProc = Striuct.new do
270
- member :lank, Proc.new{|n|(3..max) === n}
271
- end
272
-
273
- def test_Proc
274
- sth = SthProc.new
275
- sth.lank = 8
276
- assert_equal 8, sth.lank
277
-
278
- assert_raises Validation::InvalidWritingError do
279
- sth.lank = 2
280
- end
281
- end
282
-
283
- SthMethod = Striuct.new do
284
- member :lank, 7.method(:<)
285
- end
286
-
287
- def test_Method
288
- sth = SthMethod.new
289
- sth.lank = 8
290
- assert_equal 8, sth.lank
291
-
292
- assert_raises Validation::InvalidWritingError do
293
- sth.lank = 6
294
- end
295
- end
296
-
297
- end