striuct 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/example/README.rb DELETED
@@ -1,50 +0,0 @@
1
- require_relative '../lib/striuct'
2
-
3
- class Person < Striuct
4
- member :fullname, AND(String, /\A.+\z/) # Flexible Validation
5
- alias_member :name, :fullname # Use other name
6
- end
7
-
8
- class User < Person # Inheritable
9
- member :id, Integer, # Looks typed validation
10
- default_proc: ->{User.next_id} # With default value
11
-
12
- @id = 0
13
- def self.next_id
14
- @id += 1
15
- end
16
- end
17
-
18
- john = User.new 'john'
19
- p john[:name] #=> 'john'
20
- #~ p john.name = '' #=> error
21
- p john.id #=> 1
22
- ken = User[name: 'ken'] # Construct from hash
23
- p ken.id #=> 2
24
-
25
- class Foo < Striuct
26
- member :foo
27
- member :bar, Numeric
28
- member :with_adjuster, Integer,
29
- &->v{Integer v}
30
- end
31
-
32
- foo = Foo.new
33
- p foo.foo #=> nil
34
- p foo.assigned?(:foo) #=> false
35
- foo.foo = nil
36
- p foo.assigned?(:foo) #=> true
37
- foo.lock(:foo)
38
- #~ foo.foo = nil #=> error
39
- foo.bar = 1.2
40
- #~ foo.bar = 1 #=> error
41
-
42
- foo.with_adjuster = '5'
43
- p foo.with_adjuster
44
-
45
- class UseMustOption < Striuct
46
- member :foo, Integer, must: true
47
- end
48
-
49
- #~ p UseMustOption.new #=> InvalidOperationError
50
- p UseMustOption.new(1)
data/example/example1.rb DELETED
@@ -1,195 +0,0 @@
1
- #/usr/bin/ruby -w
2
-
3
- require_relative '../lib/striuct'
4
-
5
- def debug(message)
6
- puts "line: #{caller.first.slice(/:(\w+)/, 1)}"
7
- puts message.inspect, '-' * 80
8
- end
9
-
10
-
11
- # 1. Struct+ "Secure"
12
-
13
- # macro "member" provides to use condtions
14
- class User < Striuct.new
15
- member :id, Integer
16
- member :age, (20..140)
17
- member :name, OR(/\A\w+\z/, /\A\w+ \w+\z/)
18
- end
19
-
20
- user = User.new 128381, 20
21
- debug user
22
-
23
- user.age = 30
24
- user[2] = 'taro yamada'
25
- debug user
26
-
27
- # fail (Exception Striuct::ConditionError)
28
- begin
29
- user[:id] = 10.0
30
- rescue
31
- debug $!
32
- end
33
-
34
- begin
35
- user.age = 19
36
- rescue
37
- debug $!
38
- end
39
-
40
- begin
41
- user[2] = 'typo! name'
42
- rescue
43
- debug $!
44
- end
45
-
46
- # more detail checker do you need, use functional object
47
- module Game
48
- class Character
49
- end
50
-
51
- class DB < Striuct.new
52
- member :monsters, ->list{(list - characters).empty?}
53
- member :characters, GENERICS(Character)
54
- end
55
-
56
- monster = Character.new
57
- db = DB.new
58
-
59
- begin
60
- db.characters = [1, 2]
61
- rescue
62
- debug $!
63
- end
64
-
65
- db.characters = [monster, Character.new]
66
- debug db
67
-
68
- begin
69
- db.monsters = [Character.new]
70
- rescue
71
- debug $!
72
- end
73
-
74
- db.monsters = [monster]
75
- debug db
76
- end
77
-
78
- # Standard Struct not check member name.
79
- NoGuard = Struct.new :__send__, :'? !'
80
- noguard = NoGuard.new false
81
- debug noguard.__send__
82
- debug noguard.methods.include?(:'? !') # lost!!
83
-
84
- # Striuct provides safety levels for naming.
85
- class SafetyNaming < Striuct.new
86
- begin
87
- member :__send__
88
- rescue
89
- debug $!
90
- end
91
-
92
- begin
93
- member :'? !'
94
- rescue
95
- debug $!
96
- end
97
-
98
- # tempolary set lower
99
- conflict_management :struct do
100
- member :__send__, :'? !'
101
- end
102
-
103
- end
104
-
105
- # 2. Struct+ "Handy"
106
-
107
- # to through block called "flavor"
108
- # below case for type cast
109
- class User2 < Striuct.new
110
- member :age, OR(/\A\d+\z/, Numeric) do |arg|
111
- Integer arg
112
- end
113
-
114
- member :name, ->v{v.respond_to? :to_s} do |v|
115
- v.to_s.to_sym
116
- end
117
- end
118
-
119
- user2 = User2.new
120
- user2.age = 9
121
- debug user2
122
-
123
- user2.age = 10.1
124
- debug user2
125
-
126
- user2.age = '10'
127
- debug user2
128
-
129
- user2.name = 10
130
- debug user2
131
- user2.name = Class
132
- debug user2
133
-
134
- # Default value
135
-
136
- class User3 < Striuct.new
137
- member :lank, Fixnum
138
- default :lank, 3
139
- member :name
140
- end
141
-
142
- user3 = User3.new
143
- user3
144
- debug user3
145
-
146
- # Standard Struct always define "nil is default". ...realy?
147
- debug user3.assigned?(:name)
148
- user3.name = nil
149
- debug user3.assigned?(:name)
150
-
151
- # Alias
152
-
153
- class User3
154
- alias_member :position, :lank
155
- end
156
-
157
- debug user3.lank.equal?(user3.position)
158
- debug user3[:lank].equal?(user3[:position])
159
- user3[:position] = 4
160
- debug user3.lank
161
-
162
- # New Constructors
163
-
164
- # Subclass.define reject floating object
165
- # * except if no finished assign each members
166
- # * return object is frozen
167
- user3 = User3.define do |r|
168
- r.lank = 10
169
- r.name = 'foo'
170
- end
171
-
172
- debug user3
173
-
174
- # Subclass.load_pairs easy make from Hash and like Hash
175
- user3 = User3[lank:10, name: 'foo']
176
-
177
- debug user3
178
-
179
- # 3. Keeping Struct's good interface
180
-
181
- Sth1 = Striuct.new do
182
- def my_special_method
183
- end
184
- end
185
-
186
- debug Sth1.new.respond_to?(:my_special_method)
187
-
188
- # to_struct
189
- MyC = Striuct.new :a, :b
190
- a = MyC.to_struct_class
191
- p a
192
-
193
- p MyC.new.to_struct
194
- myc = Striuct.new :a, :b
195
- p myc.new.to_struct
data/example/example2.rb DELETED
@@ -1,20 +0,0 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- require_relative '../lib/striuct'
4
-
5
- User = Striuct.define do # other way "class User < Striuct.new"
6
- member :firstname, /\w+/ # look like case syntax in Ruby
7
- member :lank, AND(Fixnum, 1..10) # easy build multiple validation
8
- default :lank, 3 # set a normal default value
9
- member :registered, Time # look like type variable
10
- default :registered, &->{Time.now} # evaluate with construction
11
- p members #=> [firstname, lank, registered]
12
- end
13
-
14
- class MyUser < User
15
- p members #=> [firstname, lank, registered]
16
- member :foo # no validation, just an accessor
17
- p members #=> [firstname, lank, registered, :foo]
18
- end
19
-
20
- user = MyUser.new
data/example/see_trace.rb DELETED
@@ -1,32 +0,0 @@
1
- #/usr/bin/ruby -w
2
-
3
- require_relative '../lib/striuct'
4
-
5
- class User < Striuct.new
6
- member :id, Integer
7
- member :age, (20..140)
8
- end
9
-
10
- user = User.new
11
-
12
- begin
13
- user[:id] = 10.0
14
- rescue
15
- puts $!.backtrace
16
- end
17
-
18
- puts '-' * 80
19
-
20
- $stdout.flush
21
-
22
- begin
23
- user.age = 19
24
- rescue
25
- puts $!.backtrace
26
- end
27
-
28
- puts '-' * 80
29
-
30
- $stdout.flush
31
-
32
- user.age = 19
data/striuct.gemspec DELETED
@@ -1,45 +0,0 @@
1
- # coding: us-ascii
2
-
3
- lib_name = 'striuct'.freeze
4
-
5
- Gem::Specification.new do |gem|
6
- # specific
7
-
8
- gem.description = %q{Struct++ library.
9
-
10
- ---
11
-
12
- Validatable, Inheritable, Member Aliasing,
13
- Conflict Management, Default Value, Divide nil with unassign,
14
- Lock setter of each member, Hash flendly API, ... And more Struct++ features :)}
15
-
16
- gem.summary = gem.description.dup
17
- gem.homepage = "https://github.com/kachick/#{lib_name}"
18
- gem.license = 'MIT'
19
- gem.name = lib_name.dup
20
- gem.version = '0.6.1'
21
-
22
- gem.required_ruby_version = '>= 2.2'
23
-
24
- gem.add_runtime_dependency 'validation', '~> 0.1'
25
- gem.add_runtime_dependency 'optionalargument', '~> 0.3'
26
- gem.add_runtime_dependency 'keyvalidatable'
27
-
28
- gem.add_development_dependency 'test-unit', '>= 3.2.6', '< 4'
29
- gem.add_development_dependency 'yard', '>= 0.9.11', '< 2.0'
30
- gem.add_development_dependency 'rake', '>= 10', '< 20'
31
- gem.add_development_dependency 'bundler', '>= 1.10', '< 2'
32
-
33
- if RUBY_ENGINE == 'rbx'
34
- gem.add_dependency 'rubysl', '~> 2.2'
35
- end
36
-
37
- # common
38
-
39
- gem.authors = ['Kenichi Kamiya']
40
- gem.email = ['kachick1+ruby@gmail.com']
41
- gem.files = `git ls-files`.split($\)
42
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
43
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
44
- gem.require_paths = ['lib']
45
- end
data/test/helper.rb DELETED
@@ -1,3 +0,0 @@
1
- require 'test/unit'
2
-
3
- require_relative '../lib/striuct'
@@ -1,36 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Constructor < Test::Unit::TestCase
4
-
5
- def test_new
6
- cls = Striuct.new
7
- assert_not_instance_of Striuct, cls
8
- assert_instance_of Class, cls
9
- assert_kind_of Striuct, cls.new
10
-
11
- cls2 = Striuct.new :name, :age
12
-
13
- assert_equal cls2.members, [:name, :age]
14
-
15
- cls3 = Striuct.new :foo do
16
- member :var
17
- end
18
-
19
- assert_equal cls3.members, [:foo, :var]
20
- end
21
-
22
- def test_define
23
- assert_raises RuntimeError do
24
- Striuct.define do
25
- end
26
- end
27
-
28
- klass = Striuct.define do
29
- member :foo
30
- end
31
-
32
- assert_equal true, klass.closed?
33
- end
34
-
35
- end
36
-
@@ -1,13 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Class_Macro < Test::Unit::TestCase
4
-
5
- def test_add_members
6
- klass = Striuct.new :foo do
7
- add_members :aaa, 'bbb', :ccc
8
- end
9
-
10
- assert_equal [:foo, :aaa, :bbb, :ccc], klass.members
11
- end
12
-
13
- end
@@ -1,36 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Class_Close < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new do
6
- member :foo
7
- end
8
-
9
- def test_class_close
10
- sth = Sth.new
11
-
12
- assert_equal true, sth.member?(:foo)
13
-
14
- Sth.class_eval do
15
- member :bar
16
- end
17
-
18
- assert_equal true, sth.member?(:bar)
19
- assert_equal [:foo, :bar], sth.members
20
-
21
- assert_equal false, Sth.closed?
22
-
23
- Sth.__send__ :close
24
-
25
- assert_equal true, Sth.closed?
26
-
27
- assert_raises RuntimeError do
28
- Sth.class_eval do
29
- member :var2
30
- end
31
- end
32
-
33
- assert_equal false, sth.member?(:var2)
34
- end
35
-
36
- end
@@ -1,92 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Class_Constructor < Test::Unit::TestCase
4
-
5
- User = Striuct.define do
6
- member :name, AND(String, NOT(''))
7
- member :age, Integer
8
- end.freeze
9
-
10
- [:for_values, :new].each do |callee|
11
- define_method :"test_subclass_#{callee}" do
12
- user = User.public_send callee
13
- assert_instance_of User, user
14
- assert_not_kind_of Class, user
15
- assert_equal [:name, :age], user.members
16
- assert_equal [nil, nil], user.values
17
-
18
- assert_raises Validation::InvalidWritingError do
19
- User.public_send callee, :SYMBOL
20
- end
21
-
22
- assert_raises Validation::InvalidWritingError do
23
- User.public_send callee, ''
24
- end
25
-
26
- user = User.public_send callee, '.'
27
- assert_instance_of User, user
28
- assert_not_kind_of Class, user
29
- assert_equal ['.', nil], user.values
30
-
31
- assert_raises Validation::InvalidWritingError do
32
- User.public_send callee, '.', 1.0
33
- end
34
-
35
- user = User.public_send callee, '.', 1
36
- assert_equal ['.', 1], user.values
37
- end
38
- end
39
-
40
- def test_define
41
- user = User.define{|r|r.age = 1; r.name = 'a'}
42
- assert_same 1, user.age
43
-
44
- assert_raises RuntimeError do
45
- user.age = 1
46
- end
47
-
48
- user = User.define{|r|r.age = 1; r.name = 'a'}
49
- assert_same 1, user.age
50
- assert_same true, user.all_locked?
51
- assert_same false, user.frozen?
52
-
53
- assert_raises RuntimeError do
54
- User.define{|r|r.age = 1}
55
- end
56
-
57
- user = User.define(lock: true){|r|r.age = 1; r.name = 'a'}
58
- assert_same 1, user.age
59
- assert_same true, user.all_locked?
60
- user = User.define(lock: false){|r|r.age = 1; r.name = 'a'}
61
- assert_same false, user.all_locked?
62
- assert_equal true, user.strict?
63
-
64
- assert_raises Validation::InvalidWritingError do
65
- User.define{|r|r.age = 1; r.name = 'a'; r.name.clear}
66
- end
67
-
68
- user = User.define(strict: false){|r|r.age = 1; r.name = 'a'; r.name.clear}
69
- assert_equal '', user.name
70
- assert_equal false, user.strict?
71
- end
72
-
73
- Sth = Striuct.new :foo, :bar, :hoge
74
- SampleStruct = Struct.new :foo, :bar, :hoge
75
-
76
- def test_for_pairs_from_hash
77
- sth = Sth[hoge: 7, foo: 8]
78
-
79
- assert_equal [8, nil, 7], sth.values
80
-
81
- sth = Sth['hoge' => 7, 'foo' => 8]
82
-
83
- assert_equal [8, nil, 7], sth.values
84
- end
85
-
86
- def test_for_pairs_from_struct
87
- sth = Sth[SampleStruct.new 8, nil, 7]
88
-
89
- assert_equal [8, nil, 7], sth.values
90
- end
91
-
92
- end