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,138 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Setter < Test::Unit::TestCase
4
-
5
- class User < Striuct.new
6
- member :id, Integer
7
- member :last_name, /\A\w+\z/
8
- member :family_name, /\A\w+\z/
9
- member :address, /\A((\w+) ?)+\z/
10
- member :age, ->age{(20..140).include? age}
11
- end
12
-
13
- def test_setter
14
- user = User.new
15
- user[:last_name] = 'foo'
16
- assert_equal user.last_name, 'foo'
17
- user.last_name = 'bar'
18
- assert_equal user[:last_name], 'bar'
19
-
20
- assert_raises Validation::InvalidWritingError do
21
- user[:last_name] = 'foo s'
22
- end
23
-
24
- assert_raises Validation::InvalidWritingError do
25
- User.new 'asda'
26
- end
27
-
28
- assert_raises Validation::InvalidWritingError do
29
- user.age = 19
30
- end
31
- end
32
-
33
- end
34
-
35
- class Test_Striuct_Subclass_Instance_Accessor_With_Validation < Test::Unit::TestCase
36
-
37
- class User < Striuct.new
38
- member :id, Integer
39
- member :last_name, /\A\w+\z/
40
- member :family_name, /\A\w+\z/
41
- member :address, /\A((\w+) ?)+\z/
42
- member :age, ->age{(20..140).include? age}
43
- end
44
-
45
- def setup
46
- @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
47
- end
48
-
49
- def test_reader
50
- assert_equal @user[1], 'taro'
51
- assert_equal @user[:last_name], 'taro'
52
- assert_equal @user.last_name, 'taro'
53
- end
54
-
55
- def test_setter_pass
56
- assert_equal((@user.id = 2139203509295), 2139203509295)
57
- assert_equal @user.id, 2139203509295
58
- assert_equal((@user.last_name = 'jiro'), 'jiro')
59
- assert_equal @user.last_name, 'jiro'
60
- assert_equal((@user.age = 40), 40)
61
- assert_equal @user.age, 40
62
- end
63
-
64
- def test_setter_fail
65
- assert_raises Validation::InvalidWritingError do
66
- @user.id = 2139203509295.0
67
- end
68
-
69
- assert_raises Validation::InvalidWritingError do
70
- @user.last_name = 'ignore name'
71
- end
72
-
73
- assert_raises Validation::InvalidWritingError do
74
- @user.age = 19
75
- end
76
- end
77
-
78
- def test_strict?
79
- assert_same @user.sufficient?(:last_name), true
80
- assert_same @user.strict?, true
81
- assert_same @user.sufficient?(:last_name), true
82
- @user.last_name.clear
83
- assert_same @user.sufficient?(:last_name), false
84
- assert_same @user.strict?, false
85
- end
86
-
87
- end
88
-
89
-
90
- class Test_Striuct_Subclass_Instance_Accsessor < Test::Unit::TestCase
91
-
92
- class Sth < Striuct.new
93
- member :bool, OR(true, false)
94
- member :sth
95
- conflict_management :struct do
96
- member :lambda, OR(->v{v % 3 == 2}, ->v{v.kind_of? Float})
97
- end
98
- end
99
-
100
- def setup
101
- @sth = Sth.new
102
- end
103
-
104
- def test_accessor
105
- @sth.bool = true
106
- assert_same true, @sth.bool
107
- @sth.bool = false
108
- assert_same false, @sth.bool
109
-
110
- assert_raises Validation::InvalidWritingError do
111
- @sth.bool = nil
112
- end
113
-
114
- @sth.sth = 1
115
- assert_same 1, @sth.sth
116
-
117
- @sth.sth = 'String'
118
- assert_equal 'String', @sth.sth
119
-
120
- @sth.sth = Class.class
121
- assert_same Class.class, @sth.sth
122
-
123
- assert_raises Validation::InvalidWritingError do
124
- @sth.lambda = 9
125
- end
126
-
127
- assert_raises Validation::InvalidWritingError do
128
- @sth.lambda = 7
129
- end
130
-
131
- @sth.lambda = 8
132
- assert_same 8, @sth.lambda
133
-
134
- @sth.lambda = 9.0
135
- assert_equal 9.0, @sth.lambda
136
- end
137
-
138
- end
@@ -1,95 +0,0 @@
1
- require_relative 'helper'
2
-
3
-
4
- class Test_Striuct_Subclass_Instance_Adjuster < Test::Unit::TestCase
5
-
6
- class MyClass
7
- def self.parse(v)
8
- raise unless /\A[a-z]+\z/ =~ v
9
- new
10
- end
11
- end
12
-
13
- Sth = Striuct.define do
14
- member :chomped, AND(Symbol, /[^\n]\z/), &WHEN(String, ->v{v.chomp.to_sym})
15
- member :no_reduced, Symbol, &->v{v.to_sym}
16
- member :reduced, Symbol, &INJECT(->v{v.to_s}, ->v{v.to_sym})
17
- member :integer, Integer, &PARSE(Integer)
18
- member :myobj, ->v{v.instance_of? MyClass}, &PARSE(MyClass)
19
- end
20
-
21
- def test_WHEN
22
- sth = Sth.new
23
-
24
- assert_raises Validation::InvalidWritingError do
25
- sth.chomped = :"a\n"
26
- end
27
-
28
- sth.chomped = "a\n"
29
-
30
- assert_equal :a, sth.chomped
31
-
32
- sth.chomped = :b
33
- assert_equal :b, sth.chomped
34
- end
35
-
36
- def test_INJECT
37
- sth = Sth.new
38
-
39
- assert_raises Validation::UnmanagebleError do
40
- sth.no_reduced = 1
41
- end
42
-
43
- sth.reduced = 1
44
-
45
- assert_equal :'1', sth.reduced
46
- end
47
-
48
- def test_PARSE
49
- sth = Sth.new
50
-
51
- assert_raises Validation::UnmanagebleError do
52
- sth.integer = '1.0'
53
- end
54
-
55
- sth.integer = '1'
56
-
57
- assert_equal 1, sth.integer
58
-
59
- assert_raises Validation::UnmanagebleError do
60
- sth.myobj = '1'
61
- end
62
-
63
- sth.myobj = 'a'
64
-
65
- assert_kind_of MyClass, sth.myobj
66
- end
67
-
68
- end
69
-
70
- class Test_Striuct_Subclass_Instance_AdjusterOld < Test::Unit::TestCase
71
-
72
- Sth = Striuct.new do
73
- member :age, Numeric, &->arg{Integer arg}
74
- end
75
-
76
- def setup
77
- @sth = Sth.new
78
- assert_same nil, @sth.age
79
- end
80
-
81
- def test_procedure
82
- @sth.age = 10
83
- assert_same 10, @sth.age
84
- @sth.age = 10.0
85
- assert_same 10, @sth.age
86
-
87
- assert_raises Validation::UnmanagebleError do
88
- @sth.age = '10.0'
89
- end
90
-
91
- @sth.age = '10'
92
- assert_same 10, @sth.age
93
- end
94
-
95
- end
@@ -1,53 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Assign < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new do
6
- member :foo
7
- end
8
-
9
- [:unassign, :delete_at].each do |callee|
10
- define_method :"test_#{callee}" do
11
- sth = Sth.new
12
- assert_equal false, sth.assign?(:foo)
13
- assert_equal false, sth.assigned?(:foo)
14
- sth.foo = nil
15
- assert_equal true, sth.assign?(:foo)
16
- assert_equal true, sth.assigned?(:foo)
17
- sth.public_send callee, :foo
18
- assert_equal false, sth.assign?(:foo)
19
- assert_equal false, sth.assigned?(:foo)
20
- sth.foo = nil
21
- assert_equal true, sth.assign?(:foo)
22
- assert_equal true, sth.assigned?(:foo)
23
- sth.public_send callee, 0
24
- assert_equal false, sth.assign?(:foo)
25
-
26
- assert_raises KeyError do
27
- sth.public_send callee, :var
28
- end
29
-
30
- assert_raises KeyError do
31
- sth.public_send callee, 1
32
- end
33
- end
34
- end
35
-
36
- def test_empty?
37
- cls = Striuct.new :foo, :bar
38
- sth = cls.new
39
-
40
- assert_same true, sth.empty?
41
-
42
- sth.foo = nil
43
- assert_same false, sth.empty?
44
- sth.bar = true
45
- assert_same false, sth.empty?
46
- sth.unassign :foo
47
- assert_same false, sth.empty?
48
- sth.unassign :bar
49
-
50
- assert_same true, sth.empty?
51
- end
52
-
53
- end
@@ -1,43 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Basic < Test::Unit::TestCase
4
-
5
- class User < Striuct.new
6
- member :id, Integer
7
- member :last_name, /\A\w+\z/
8
- member :family_name, /\A\w+\z/
9
- member :address, /\A((\w+) ?)+\z/
10
- member :age, ->age{(20..140).include? age}
11
- end
12
-
13
- def setup
14
- @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
15
- @user2 = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
16
- end
17
-
18
- def test_delegate_class_method
19
- assert_equal @user.members, User.members
20
- assert_equal @user.size, User.size
21
- assert_equal @user.member?(:age), User.member?(:age)
22
- end
23
-
24
- def test_values
25
- assert_equal @user.values, [9999, 'taro', 'yamada', 'Tokyo Japan', 30]
26
- end
27
-
28
- def test_values_at
29
- assert_equal(@user.values_at(4, 0, (2..4)), [30, 9999, 'yamada', 'Tokyo Japan', 30])
30
- end
31
-
32
- def test_fetch_values
33
- assert_equal(@user.fetch_values(:id, 4, :id), [9999, 30, 9999])
34
- assert_equal(@user.fetch_values, [])
35
-
36
- assert_raise ArgumentError do
37
- @user.fetch_values :id, 5, :id
38
- end
39
-
40
- assert_equal(@user.fetch_values(:id, 5, :id) { :substitute }, [9999, :substitute, 9999])
41
- end
42
-
43
- end
@@ -1,27 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Cast < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new :foo, :bar, :hoge
6
-
7
- def test_to_h
8
- sth = Sth.new
9
- assert_equal({foo: nil, bar: nil, hoge: nil}, sth.to_h)
10
- assert_equal({foo: nil, bar: nil, hoge: nil}, sth.to_h(true))
11
- assert_equal({}, sth.to_h(false))
12
-
13
- sth.bar = :BAR
14
- assert_equal({foo: nil, bar: :BAR, hoge: nil}, sth.to_h)
15
- assert_equal({foo: nil, bar: :BAR, hoge: nil}, sth.to_h(true))
16
- assert_equal({bar: :BAR}, sth.to_h(false))
17
- end
18
-
19
- def test_to_a
20
- sth = Sth.new
21
- assert_equal([nil, nil, nil], sth.to_a)
22
-
23
- sth.bar = :BAR
24
- assert_equal([nil, :BAR, nil], sth.to_a)
25
- end
26
-
27
- end
@@ -1,52 +0,0 @@
1
- require_relative 'helper'
2
-
3
-
4
- class Test_Striuct_Subclass_Instance_Compare < Test::Unit::TestCase
5
-
6
- class User < Striuct.new
7
- member :id, Integer
8
- member :last_name, /\A\w+\z/
9
- member :family_name, /\A\w+\z/
10
- member :address, /\A((\w+) ?)+\z/
11
- member :age, ->age{(20..140).include? age}
12
- end
13
-
14
- def setup
15
- @user = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
16
- @user2 = User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 30
17
- end
18
-
19
- def test_hash
20
- assert_kind_of Integer, @user.hash
21
- assert_equal @user.hash, @user2.hash
22
- end
23
-
24
- def test_eql?
25
- assert_equal true, @user.eql?(@user2)
26
- assert_equal true, @user2.eql?(@user)
27
- assert_equal false, @user.eql?(User.new 9999, 'taro', 'yamada', 'Tokyo Japan', 31)
28
- end
29
-
30
- def test_equal
31
- user1 = User.new 11218, 'taro'
32
- user2 = User.new 11218, 'taro'
33
- assert_equal true, (user1 == user2)
34
- user2.last_name = 'ichiro'
35
- assert_equal false, (user1 == user2)
36
- end
37
-
38
- Sth = Striuct.new :foo, :bar, :hoge
39
-
40
- def test_hashkeyable
41
- sth1 = Sth[hoge: 7, foo: 8]
42
- sth2 = Sth[hoge: 7, foo: 8]
43
- assert_equal true, sth1.eql?(sth2)
44
- assert_equal true, sth2.eql?(sth1)
45
- assert_equal sth1.hash, sth2.hash
46
- assert_equal true, {sth1 => 1}.has_key?(sth2)
47
- assert_equal true, {sth2 => 1}.has_key?(sth1)
48
- assert_equal 1, {sth1 => 1}[sth2]
49
- assert_equal 1, {sth2 => 1}[sth1]
50
- end
51
-
52
- end
@@ -1,23 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Copy < Test::Unit::TestCase
4
-
5
- class Sth < Striuct.new
6
- member :sth
7
- end
8
-
9
- def test_dup
10
- sth = Sth.new
11
- sth2 = sth.dup
12
- sth.sth = 1
13
- assert_equal false, (sth.sth == sth2.sth)
14
- end
15
-
16
- def test_clone
17
- sth = Sth.new
18
- sth2 = sth.clone
19
- sth.sth = 2
20
- assert_equal false, (sth.sth == sth2.sth)
21
- end
22
-
23
- end
@@ -1,129 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class Test_Striuct_Subclass_Instance_Default_Value < Test::Unit::TestCase
4
-
5
- Sth = Striuct.new do
6
- member :lank, OR(Integer, Rational)
7
- default :lank, 1
8
- end
9
-
10
- def test_default
11
- sth = Sth.new 2
12
- assert_equal 2, sth.lank
13
- sth = Sth.new
14
- assert_equal 1, sth.lank
15
- assert_equal true, sth.default?(:lank)
16
- sth.lank = 2
17
- assert_equal false, sth.default?(:lank)
18
- end
19
-
20
- def test_define_default
21
- assert_raises NameError do
22
- Sth.class_eval do
23
- default :anything, 10
24
- end
25
- end
26
-
27
- klass = Striuct.define do
28
- member :lank2, Integer
29
- default :lank2, '10'
30
- end
31
-
32
- assert_raises Validation::InvalidWritingError do
33
- klass.new
34
- end
35
-
36
- scope = self
37
- seef = nil
38
- klass = Striuct.define do
39
- member :lank, Integer
40
-
41
- scope.assert_raises ArgumentError do
42
- default :lank, &->own, name, exess{rand}
43
- end
44
-
45
- scope.assert_raises ArgumentError do
46
- default :lank, '10', &->own, name{rand}
47
- end
48
-
49
- scope.assert_raises ArgumentError do
50
- default :lank, '10', &->own{rand}
51
- end
52
-
53
- scope.assert_raises ArgumentError do
54
- default :lank, '10', &->{rand}
55
- end
56
-
57
- default :lank, &->own, name{(seef = own); rand}
58
- end
59
-
60
- assert_raises Validation::InvalidWritingError do
61
- klass.new
62
- end
63
-
64
- klass = Striuct.define do
65
- member :lank, Integer
66
- default :lank, &->own, name{(seef = own); 10 - name.length}
67
- end
68
-
69
- assert_equal 6, klass.new.lank
70
- assert_equal seef, klass.new
71
- end
72
-
73
- end
74
-
75
- class Test_Striuct_Subclass_Instance_DefaultValue_Under_MemberMacro < Test::Unit::TestCase
76
-
77
- Sth = Striuct.new do
78
- member :lank, OR(Integer, Rational), default: 1
79
- end
80
-
81
- def test_default
82
- sth = Sth.new 2
83
- assert_equal 2, sth.lank
84
- sth = Sth.new
85
- assert_equal 1, sth.lank
86
- assert_equal true, sth.default?(:lank)
87
- sth.lank = 2
88
- assert_equal false, sth.default?(:lank)
89
- end
90
-
91
- def test_define_default
92
- assert_raises NameError do
93
- Sth.class_eval do
94
- default :anything, 10
95
- end
96
- end
97
-
98
- klass = Striuct.define do
99
- member :lank2, Integer, default: '10'
100
- end
101
-
102
- assert_raises Validation::InvalidWritingError do
103
- klass.new
104
- end
105
-
106
- scope = self
107
- seef = nil
108
- klass = Striuct.define do
109
-
110
- scope.assert_raises OptionalArgument::KeyConflictError do
111
- member :lank, Integer, default: '10', default_proc: ->own,name{rand}
112
- end
113
-
114
- member :lank, Integer, default_proc: ->own,name{(seef = own); rand}
115
- end
116
-
117
- assert_raises Validation::InvalidWritingError do
118
- klass.new
119
- end
120
-
121
- klass = Striuct.define do
122
- member :lank, Integer, default_proc: ->own,name{(seef = own); 10 - name.length}
123
- end
124
-
125
- assert_equal 6, klass.new.lank
126
- assert_equal seef, klass.new
127
- end
128
-
129
- end