striuct 0.3.3 → 0.3.4

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 (88) hide show
  1. data/.gitignore +35 -34
  2. data/.travis.yml +6 -6
  3. data/Gemfile +12 -12
  4. data/History.rdoc +279 -273
  5. data/LICENSE +21 -21
  6. data/Manifest.txt +91 -90
  7. data/README.ja.old.rdoc +297 -297
  8. data/README.md +128 -128
  9. data/Rakefile +11 -11
  10. data/benchmark/basics.rb +56 -56
  11. data/example/README.rb +44 -44
  12. data/example/example.old.rdoc +187 -187
  13. data/example/example1.rb +233 -233
  14. data/example/example2.rb +22 -22
  15. data/example/see_trace.rb +32 -32
  16. data/lib/striuct/classmethods/README.md +5 -5
  17. data/lib/striuct/classmethods/adjustment.rb +32 -32
  18. data/lib/striuct/classmethods/constructor.rb +63 -63
  19. data/lib/striuct/classmethods/default.rb +27 -27
  20. data/lib/striuct/classmethods/enum.rb +48 -48
  21. data/lib/striuct/classmethods/inner.rb +91 -91
  22. data/lib/striuct/classmethods/length.rb +14 -14
  23. data/lib/striuct/classmethods/macro.rb +144 -144
  24. data/lib/striuct/classmethods/named.rb +113 -113
  25. data/lib/striuct/classmethods/object.rb +54 -54
  26. data/lib/striuct/classmethods/prevent_conflicts.rb +89 -89
  27. data/lib/striuct/classmethods/requiremnets.rb +11 -11
  28. data/lib/striuct/classmethods/to_struct.rb +23 -25
  29. data/lib/striuct/classmethods/validation.rb +55 -55
  30. data/lib/striuct/classmethods.rb +1 -1
  31. data/lib/striuct/instancemethods/README.md +5 -5
  32. data/lib/striuct/instancemethods/assign.rb +30 -30
  33. data/lib/striuct/instancemethods/cast.rb +34 -34
  34. data/lib/striuct/instancemethods/compare.rb +30 -30
  35. data/lib/striuct/instancemethods/default.rb +13 -13
  36. data/lib/striuct/instancemethods/delegate_class_methods.rb +28 -28
  37. data/lib/striuct/instancemethods/enum.rb +103 -103
  38. data/lib/striuct/instancemethods/hashy.rb +121 -121
  39. data/lib/striuct/instancemethods/inner.rb +60 -60
  40. data/lib/striuct/instancemethods/keyvalidatable.rb +14 -14
  41. data/lib/striuct/instancemethods/lock.rb +61 -61
  42. data/lib/striuct/instancemethods/object.rb +52 -52
  43. data/lib/striuct/instancemethods/requirements.rb +14 -14
  44. data/lib/striuct/instancemethods/safety.rb +11 -11
  45. data/lib/striuct/instancemethods/subscript.rb +55 -55
  46. data/lib/striuct/instancemethods/validation.rb +29 -25
  47. data/lib/striuct/instancemethods/values.rb +57 -57
  48. data/lib/striuct/instancemethods.rb +1 -1
  49. data/lib/striuct/requirements.rb +5 -5
  50. data/lib/striuct/singleton_class.rb +66 -66
  51. data/lib/striuct/specificcontainer.rb +19 -19
  52. data/lib/striuct/structs.rb +7 -7
  53. data/lib/striuct/version.rb +5 -5
  54. data/lib/striuct.rb +13 -13
  55. data/striuct.gemspec +24 -24
  56. data/test/helper.rb +5 -5
  57. data/test/test_striuct-singleton_class-define.rb +19 -19
  58. data/test/test_striuct-subclass-class-cloning.rb +20 -20
  59. data/test/test_striuct-subclass-class-close.rb +36 -36
  60. data/test/test_striuct-subclass-class-constructor.rb +82 -82
  61. data/test/test_striuct-subclass-class-freeze.rb +36 -36
  62. data/test/test_striuct-subclass-class-inheritable.rb +57 -57
  63. data/test/test_striuct-subclass-class-macro.rb +13 -13
  64. data/test/test_striuct-subclass-class-safety_naming.rb +72 -72
  65. data/test/test_striuct-subclass-class-validation.rb +26 -26
  66. data/test/test_striuct-subclass-feature-alias_member.rb +53 -53
  67. data/test/test_striuct-subclass-feature-to_struct.rb +61 -25
  68. data/test/test_striuct-subclass-feature-validation_util.rb +57 -0
  69. data/test/test_striuct-subclass-instance-accessor.rb +137 -137
  70. data/test/test_striuct-subclass-instance-adjuster.rb +94 -94
  71. data/test/test_striuct-subclass-instance-assign.rb +30 -30
  72. data/test/test_striuct-subclass-instance-basic.rb +32 -32
  73. data/test/test_striuct-subclass-instance-cloning.rb +22 -22
  74. data/test/test_striuct-subclass-instance-compare.rb +51 -51
  75. data/test/test_striuct-subclass-instance-default_value.rb +128 -128
  76. data/test/test_striuct-subclass-instance-enum.rb +92 -92
  77. data/test/test_striuct-subclass-instance-freeze.rb +19 -19
  78. data/test/test_striuct-subclass-instance-hashlike.rb +153 -153
  79. data/test/test_striuct-subclass-instance-keyvalidatable.rb +24 -24
  80. data/test/test_striuct-subclass-instance-lock.rb +39 -39
  81. data/test/test_striuct-subclass-instance-to_s_family.rb +25 -25
  82. data/test/test_striuct-subclass-instance-validation_functional_condition.rb +50 -50
  83. data/test/test_striuct-subclass-instance-validation_inference.rb +50 -50
  84. data/test/test_striuct-subclass-instance-validation_specific_conditions.rb +247 -247
  85. data/test/test_striuct-subclass-instance-validation_with_getter.rb +33 -33
  86. data/test/test_striuct-subclass-instance_names.rb +18 -18
  87. data/test/test_striuct-version.rb +10 -10
  88. metadata +4 -2
@@ -1,188 +1,188 @@
1
- === Struct+ "Safety"
2
-
3
- ==== "member" macro
4
-
5
- * Use "member" and you get a accessor, it looks Struct with tester(validator)s.
6
- class User < Striuct.new
7
- member :id, Integer
8
- member :age, (20..140)
9
- member :name, OR(/\A\w+\z/, /\A\w+ \w+\z/)
10
- end
11
-
12
- # pass
13
- user = User.new 128381, 20
14
- user.age = 30
15
- user[2] = 'foo bar'
16
-
17
- # fail
18
- user[:id] = 10.0
19
- user.age = 19
20
- user[2] = nil
21
-
22
- * Use functional object and you get a tester on upstairs.
23
- module Game
24
- class Character
25
- end
26
-
27
- class DB < Striuct.new
28
- member :monsters, ->list{(list - characters).empty?}
29
- member :characters, GENERICS(Character)
30
- end
31
-
32
- monster = Character.new
33
- db = DB.new
34
-
35
- # fail
36
- db.characters = [1, 2]
37
-
38
- # pass
39
- db.characters = [monster, Character.new]
40
-
41
- # fail
42
- db.monsters = [Character.new]
43
-
44
- # pass
45
- db.monsters = [monster]
46
- end
47
-
48
- * Use "inference" and all instance test under class of first passed object.
49
- class FlexibleContainer < Striuct.new
50
- member :anything, anything, inference: true
51
- member :number, Numeric, inference: true
52
- end
53
-
54
- fc1, fc2 = FlexibleContainer.new, FlexibleContainer.new
55
- # pass
56
- fc1.anything = 'str'
57
-
58
- # fail
59
- fc1.anything = :sym
60
- fc2.anything = :sym
61
-
62
- # pass
63
- fc2.anything = 'string too'
64
-
65
- # fail
66
- fc1.number = 'str'
67
-
68
- # pass
69
- fc1.number = 1.0
70
-
71
- # fail
72
- fc2.number = 1
73
-
74
- ==== Protect from risks in naming members
75
-
76
- * Standard Struct dosen't check member-name.
77
- NoGuard = Struct.new :object_id, :'? !'
78
- noguard = NoGuard.new false
79
- noguard.object_id #=> false
80
- noguard.methods.include?(:'? !') #=> false(lost!!)
81
-
82
- * Striuct provides safety levels for this. (default: :prevent)
83
- class SafetyNaming < Striuct.new
84
- begin
85
- member :object_id
86
- rescue
87
- p $!
88
- end
89
-
90
- begin
91
- member :'? !'
92
- rescue
93
- p $!
94
- end
95
-
96
- # set lower
97
- protect_level :struct
98
-
99
- member :object_id, :'? !'
100
- end
101
-
102
- === Struct+ "Handy"
103
-
104
- ==== Flavor
105
-
106
- * Block with member macro, it is called "flavor" at here.
107
- Below cases for type cast.
108
- class User2 < Striuct.new
109
- member :age, Fixnum, &->v{Integer v}
110
- member :name, Symbol, &->v{v.to_s.to_sym}
111
- end
112
-
113
- user2 = User2.new
114
- user2.age = 9 #=> 9(Fixnum)
115
- user2.age = 10.1 #=> 10(Fixnum)
116
- user2.age = '10' #=> 10(Fixnum)
117
-
118
- user2.name = 10 #=> :10(Symbol)
119
- user2.name = Class #=> :Class(Symbol)
120
-
121
- ==== Default
122
-
123
- * provides default value and can use block parameter(like Hash.new)
124
- class User3 < Striuct.new
125
- member :lank, Fixnum
126
- default :lank, 3
127
- member :name
128
- end
129
-
130
- user3 = User3.new
131
- user3.lank #=> 3
132
-
133
- * Standard Struct always define "nil is default". Realy?
134
- user3.name #=> nil
135
- user3.assign? :name #=> false
136
- user3.name = nil
137
- user3.assign? :name #=> true
138
-
139
- ==== Alias
140
-
141
- * alias member name
142
- class User3
143
- alias_member :position, :lank
144
- end
145
-
146
- user3.lank.equal? user3.position #=> true
147
- user3[:lank].equal? user3[:position] #=> true
148
- user3[:position] = 4
149
- user3.lank #=> 4
150
-
151
- ==== Inherit
152
-
153
- * (writing...)
154
-
155
- ==== Lock
156
-
157
- * (writing...)
158
-
159
- ==== New Constructors
160
-
161
- * Subclass.define reject floating object.
162
- * block parameter is new instance
163
- * except if no finished to assign each member
164
- * returning object is tested strict(optional)
165
- * returning object is locked(optional)
166
- user3 = User3.define do |r|
167
- r.lank = 10
168
- r.name = 'foo'
169
- end
170
-
171
- * Subclass.[](load_pairs) make from Hash and like Hash
172
- user3 = User3[lank: 10, name: 'foo']
173
-
174
- === Almost interfaces are keeping Struct has.
175
-
176
- Sth1 = Striuct.new do
177
- def my_special_method
178
- end
179
- end
180
-
181
- Sth1.new.respond_to?(:my_special_method) #=> true
182
-
183
- === HashLike
184
-
185
- * some interfaces import from Hash
186
-
187
- * easy cast to Hash
1
+ === Struct+ "Safety"
2
+
3
+ ==== "member" macro
4
+
5
+ * Use "member" and you get a accessor, it looks Struct with tester(validator)s.
6
+ class User < Striuct.new
7
+ member :id, Integer
8
+ member :age, (20..140)
9
+ member :name, OR(/\A\w+\z/, /\A\w+ \w+\z/)
10
+ end
11
+
12
+ # pass
13
+ user = User.new 128381, 20
14
+ user.age = 30
15
+ user[2] = 'foo bar'
16
+
17
+ # fail
18
+ user[:id] = 10.0
19
+ user.age = 19
20
+ user[2] = nil
21
+
22
+ * Use functional object and you get a tester on upstairs.
23
+ module Game
24
+ class Character
25
+ end
26
+
27
+ class DB < Striuct.new
28
+ member :monsters, ->list{(list - characters).empty?}
29
+ member :characters, GENERICS(Character)
30
+ end
31
+
32
+ monster = Character.new
33
+ db = DB.new
34
+
35
+ # fail
36
+ db.characters = [1, 2]
37
+
38
+ # pass
39
+ db.characters = [monster, Character.new]
40
+
41
+ # fail
42
+ db.monsters = [Character.new]
43
+
44
+ # pass
45
+ db.monsters = [monster]
46
+ end
47
+
48
+ * Use "inference" and all instance test under class of first passed object.
49
+ class FlexibleContainer < Striuct.new
50
+ member :anything, anything, inference: true
51
+ member :number, Numeric, inference: true
52
+ end
53
+
54
+ fc1, fc2 = FlexibleContainer.new, FlexibleContainer.new
55
+ # pass
56
+ fc1.anything = 'str'
57
+
58
+ # fail
59
+ fc1.anything = :sym
60
+ fc2.anything = :sym
61
+
62
+ # pass
63
+ fc2.anything = 'string too'
64
+
65
+ # fail
66
+ fc1.number = 'str'
67
+
68
+ # pass
69
+ fc1.number = 1.0
70
+
71
+ # fail
72
+ fc2.number = 1
73
+
74
+ ==== Protect from risks in naming members
75
+
76
+ * Standard Struct dosen't check member-name.
77
+ NoGuard = Struct.new :object_id, :'? !'
78
+ noguard = NoGuard.new false
79
+ noguard.object_id #=> false
80
+ noguard.methods.include?(:'? !') #=> false(lost!!)
81
+
82
+ * Striuct provides safety levels for this. (default: :prevent)
83
+ class SafetyNaming < Striuct.new
84
+ begin
85
+ member :object_id
86
+ rescue
87
+ p $!
88
+ end
89
+
90
+ begin
91
+ member :'? !'
92
+ rescue
93
+ p $!
94
+ end
95
+
96
+ # set lower
97
+ protect_level :struct
98
+
99
+ member :object_id, :'? !'
100
+ end
101
+
102
+ === Struct+ "Handy"
103
+
104
+ ==== Flavor
105
+
106
+ * Block with member macro, it is called "flavor" at here.
107
+ Below cases for type cast.
108
+ class User2 < Striuct.new
109
+ member :age, Fixnum, &->v{Integer v}
110
+ member :name, Symbol, &->v{v.to_s.to_sym}
111
+ end
112
+
113
+ user2 = User2.new
114
+ user2.age = 9 #=> 9(Fixnum)
115
+ user2.age = 10.1 #=> 10(Fixnum)
116
+ user2.age = '10' #=> 10(Fixnum)
117
+
118
+ user2.name = 10 #=> :10(Symbol)
119
+ user2.name = Class #=> :Class(Symbol)
120
+
121
+ ==== Default
122
+
123
+ * provides default value and can use block parameter(like Hash.new)
124
+ class User3 < Striuct.new
125
+ member :lank, Fixnum
126
+ default :lank, 3
127
+ member :name
128
+ end
129
+
130
+ user3 = User3.new
131
+ user3.lank #=> 3
132
+
133
+ * Standard Struct always define "nil is default". Realy?
134
+ user3.name #=> nil
135
+ user3.assign? :name #=> false
136
+ user3.name = nil
137
+ user3.assign? :name #=> true
138
+
139
+ ==== Alias
140
+
141
+ * alias member name
142
+ class User3
143
+ alias_member :position, :lank
144
+ end
145
+
146
+ user3.lank.equal? user3.position #=> true
147
+ user3[:lank].equal? user3[:position] #=> true
148
+ user3[:position] = 4
149
+ user3.lank #=> 4
150
+
151
+ ==== Inherit
152
+
153
+ * (writing...)
154
+
155
+ ==== Lock
156
+
157
+ * (writing...)
158
+
159
+ ==== New Constructors
160
+
161
+ * Subclass.define reject floating object.
162
+ * block parameter is new instance
163
+ * except if no finished to assign each member
164
+ * returning object is tested strict(optional)
165
+ * returning object is locked(optional)
166
+ user3 = User3.define do |r|
167
+ r.lank = 10
168
+ r.name = 'foo'
169
+ end
170
+
171
+ * Subclass.[](load_pairs) make from Hash and like Hash
172
+ user3 = User3[lank: 10, name: 'foo']
173
+
174
+ === Almost interfaces are keeping Struct has.
175
+
176
+ Sth1 = Striuct.new do
177
+ def my_special_method
178
+ end
179
+ end
180
+
181
+ Sth1.new.respond_to?(:my_special_method) #=> true
182
+
183
+ === HashLike
184
+
185
+ * some interfaces import from Hash
186
+
187
+ * easy cast to Hash
188
188
  user3.to_h #=> {:lank=>3, :name=>nil}