type_struct 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2cfa24de41d389c4673dbfb4ed687240ce20657
4
- data.tar.gz: 601c08537cfc0b5611c56c84dc038be39c126d07
3
+ metadata.gz: 7cb90a5e3baaac22f77fc721160e434f7d79a4fe
4
+ data.tar.gz: 5db1cae7790e5cc16b89f9d17a386e33958ad88f
5
5
  SHA512:
6
- metadata.gz: 49c262034c7d567bd0a9a92750f2252d159d65d6b907cff5482fef960c4c018781e072686bb30da35630d7b54cde69b4e728cab050dfd71c76439d5fcbc3347f
7
- data.tar.gz: 45c7fdf89ea4980a161cba41d09ef89fbf6375f1e25a4a7f78a00dfe2d771145e30a8da28b647330ea765dcdc220c9f37611d228dad3d5b4185253065dde8845
6
+ metadata.gz: 0caefd5bf92dc35fc51774741a110b8a712a97ee333a7f7fd170b0a3e90675fe02050570cb2fc452865a92985fbe8b3189dcfa3c91d473f413935e55c4e267d2
7
+ data.tar.gz: 3d88d07143f6455aadab4723c1e761a49b8e152c905669a9250030cce67cce2cd324e0f6c79c419467aef3ba5445d7308c5ecb3c518eecceddda022320f46c7d
data/README.md CHANGED
@@ -11,12 +11,12 @@ All type is checked by `===` method.
11
11
  ### Check type
12
12
 
13
13
  ```ruby
14
- class Sample < TypeStruct.new(
14
+ Sample = TypeStruct.new(
15
15
  str: String,
16
16
  reg: /exp/,
17
17
  num: Integer,
18
18
  any: Object,
19
- ); end
19
+ )
20
20
 
21
21
  sample = Sample.new(
22
22
  str: "instance of String",
@@ -71,6 +71,8 @@ line.stort
71
71
 
72
72
  Union is a object express class that some classes as one class like crystal `Union`.
73
73
 
74
+ `Union#===` check all object with `===` method.
75
+
74
76
  ```ruby
75
77
  Foo = TypeStruct.new(
76
78
  bar: TypeStruct::Union.new(TrueClass, FalseClass)
@@ -78,11 +80,11 @@ Foo = TypeStruct.new(
78
80
  p Foo.new(bar: false) #=> #<Foo bar=false>
79
81
  ```
80
82
 
81
- or
83
+ or add `Class#|` method by refinements
82
84
 
83
85
  ```ruby
84
86
  require "type_struct/ext"
85
- using UnionExt
87
+ using TypeStruct::Union::Ext
86
88
  Foo = TypeStruct.new(
87
89
  bar: TrueClass | FalseClass,
88
90
  )
@@ -92,6 +94,8 @@ Foo = TypeStruct.new(
92
94
 
93
95
  ArrayOf is a object express array type.
94
96
 
97
+ `ArrayOf#===` check all item with `===` method.
98
+
95
99
  ```ruby
96
100
  Bar = TypeStruct.new(
97
101
  baz: TypeStruct::ArrayOf.new(Integer),
@@ -101,6 +105,8 @@ p Bar.new(baz: [1, 2, 3]) #=> #<Bar baz=[1, 2, 3]>
101
105
 
102
106
  ### HashOf
103
107
 
108
+ `HashOf#===` check all keys and values with `===` method.
109
+
104
110
  ```ruby
105
111
  Baz = TypeStruct.new(
106
112
  qux: TypeStruct::HashOf.new(String, TypeStruct::ArrayOf.new(Integer))
@@ -130,9 +136,9 @@ Foo.new(bar: 1) #=> TypeError
130
136
 
131
137
  ```ruby
132
138
  require "type_struct/ext"
133
- using UnionExt
139
+ using TypeStruct::Union::Ext
134
140
  Baz = TypeStruct.new(
135
- qux: ArrayOf.new(Integer | TrueClass | FalseClass) | NilClass
141
+ qux: ArrayOf(Integer | TrueClass | FalseClass) | NilClass
136
142
  )
137
143
  p Baz.new(qux: [1]) #=> #<AAA::Baz qux=[1]>
138
144
  p Baz.new(qux: [true, false]) #=> #<AAA::Baz qux=[true, false]>
@@ -48,72 +48,6 @@ class TypeStruct
48
48
  end
49
49
 
50
50
  class << self
51
- def try_convert(klass, value)
52
- return nil unless !klass.nil? && !value.nil?
53
-
54
- if Union === klass
55
- errors = []
56
- klass.each do |k|
57
- t = begin
58
- try_convert(k, value)
59
- rescue TypeError => e
60
- errors << e
61
- nil
62
- end
63
- return t if !t.nil?
64
- end
65
- raise UnionNotFoundError, "#{klass} is not found with errors:\n#{errors.join("\n")}"
66
- elsif ArrayOf === klass
67
- value.map { |v| try_convert(klass.type, v) }
68
- elsif HashOf === klass
69
- return value unless Hash === value
70
- new_hash = {}
71
- value.each do |hk, hv|
72
- new_hash[hk] = try_convert(klass.value_type, hv)
73
- end
74
- new_hash
75
- elsif klass.respond_to?(:ancestors)
76
- if klass.ancestors.include?(TypeStruct)
77
- return nil unless Hash === value
78
- klass.from_hash(value)
79
- elsif klass.ancestors.include?(Struct)
80
- struct = klass.new
81
- value.each { |k, v| struct[k] = v }
82
- struct
83
- else
84
- value
85
- end
86
- else
87
- value
88
- end
89
- end
90
-
91
- def from_hash(h)
92
- args = {}
93
- h.each do |key, value|
94
- key = key.to_sym
95
- t = type(key)
96
- args[key] = try_convert(t, value)
97
- end
98
- new(args)
99
- end
100
-
101
- def definition
102
- const_get(:DEFINITION)
103
- end
104
-
105
- def members
106
- definition.keys
107
- end
108
-
109
- def type(k)
110
- definition[k]
111
- end
112
-
113
- def valid?(k, v)
114
- definition[k] === v
115
- end
116
-
117
51
  alias original_new new
118
52
  def new(**args, &block)
119
53
  c = Class.new(TypeStruct) do
@@ -121,6 +55,74 @@ class TypeStruct
121
55
 
122
56
  class << self
123
57
  alias_method :new, :original_new
58
+
59
+ def from_hash(h)
60
+ args = {}
61
+ h.each do |key, value|
62
+ key = key.to_sym
63
+ t = type(key)
64
+ args[key] = try_convert(t, value)
65
+ end
66
+ new(args)
67
+ end
68
+
69
+ def definition
70
+ const_get(:DEFINITION)
71
+ end
72
+
73
+ def members
74
+ definition.keys
75
+ end
76
+
77
+ def type(k)
78
+ definition[k]
79
+ end
80
+
81
+ def valid?(k, v)
82
+ definition[k] === v
83
+ end
84
+
85
+ private
86
+
87
+ def try_convert(klass, value)
88
+ return nil unless !klass.nil? && !value.nil?
89
+
90
+ if Union === klass
91
+ errors = []
92
+ klass.each do |k|
93
+ t = begin
94
+ try_convert(k, value)
95
+ rescue TypeError => e
96
+ errors << e
97
+ nil
98
+ end
99
+ return t if !t.nil?
100
+ end
101
+ raise UnionNotFoundError, "#{klass} is not found with errors:\n#{errors.join("\n")}"
102
+ elsif ArrayOf === klass
103
+ value.map { |v| try_convert(klass.type, v) }
104
+ elsif HashOf === klass
105
+ return value unless Hash === value
106
+ new_hash = {}
107
+ value.each do |hk, hv|
108
+ new_hash[hk] = try_convert(klass.value_type, hv)
109
+ end
110
+ new_hash
111
+ elsif klass.respond_to?(:ancestors)
112
+ if klass.ancestors.include?(TypeStruct)
113
+ return nil unless Hash === value
114
+ klass.from_hash(value)
115
+ elsif klass.ancestors.include?(Struct)
116
+ struct = klass.new
117
+ value.each { |k, v| struct[k] = v }
118
+ struct
119
+ else
120
+ value
121
+ end
122
+ else
123
+ value
124
+ end
125
+ end
124
126
  end
125
127
 
126
128
  args.each_key do |k|
@@ -30,8 +30,8 @@ module ArrayOfTest
30
30
 
31
31
  def test_to_s(t)
32
32
  array_of = ArrayOf.new(Symbol)
33
- expect = "TypeStruct::ArrayOf(Symbol)"
34
- unless expect == array_of.to_s
33
+ expect = /ArrayOf\(Symbol\)/
34
+ unless expect =~ array_of.to_s
35
35
  t.error("to_s string was break #{expect} != #{array_of}")
36
36
  end
37
37
  end
@@ -1,15 +1,44 @@
1
1
  require "type_struct"
2
2
 
3
+ class Object
4
+ ArrayOf = TypeStruct::ArrayOf
5
+ HashOf = TypeStruct::HashOf
6
+ Union = TypeStruct::Union
7
+ Interface = TypeStruct::Interface
8
+ end
9
+
3
10
  class TypeStruct
4
- module UnionExt
5
- refine Class do
6
- include Unionable
11
+ class ArrayOf
12
+ def to_s
13
+ "#{self.class.name.split('::').last}(#{@type})"
14
+ end
15
+ end
16
+
17
+ class HashOf
18
+ def to_s
19
+ "#{self.class.name.split('::').last}(#{@key_type}, #{@value_type})"
20
+ end
21
+ end
22
+
23
+ class Interface
24
+ def to_s
25
+ "#<#{self.class.name.split('::').last}(#{@methods.map(&:inspect).join(',')})>"
26
+ end
27
+ end
28
+
29
+ class Union
30
+ def to_s
31
+ "#<#{self.class.name.split('::').last} #{@classes.join('|')}>"
7
32
  end
8
33
  end
9
34
  end
10
35
 
11
- ArrayOf = TypeStruct::ArrayOf
12
- HashOf = TypeStruct::HashOf
13
- Union = TypeStruct::Union
14
- UnionExt = TypeStruct::UnionExt
15
- Interface = TypeStruct::Interface
36
+ module Kernel
37
+ def ArrayOf(klass)
38
+ ArrayOf.new(klass)
39
+ end
40
+
41
+ def HashOf(key_class, value_class)
42
+ HashOf.new(key_class, value_class)
43
+ end
44
+ end
@@ -33,8 +33,8 @@ module HashOfTest
33
33
 
34
34
  def test_to_s(t)
35
35
  hash_of = HashOf.new(Symbol, Integer)
36
- expect = "TypeStruct::HashOf(Symbol, Integer)"
37
- unless expect == hash_of.to_s
36
+ expect = /HashOf\(Symbol, Integer\)/
37
+ unless expect =~ hash_of.to_s
38
38
  t.error("to_s string was break #{expect} != #{hash_of}")
39
39
  end
40
40
  end
@@ -1,14 +1,21 @@
1
- require "forwardable"
2
-
3
1
  class TypeStruct
2
+ module Unionable
3
+ def |(other)
4
+ Union.new(self, other)
5
+ end
6
+ end
7
+
4
8
  class Union
5
- extend Forwardable
6
- def_delegators :@classes, :each
7
9
  include Enumerable
10
+
8
11
  def initialize(*classes)
9
12
  @classes = classes
10
13
  end
11
14
 
15
+ def each(*args, &block)
16
+ @classes.each(*args, &block)
17
+ end
18
+
12
19
  def |(other)
13
20
  Union.new(*@classes, other)
14
21
  end
@@ -21,11 +28,11 @@ class TypeStruct
21
28
  "#<#{self.class} #{@classes.join('|')}>"
22
29
  end
23
30
  alias inspect to_s
24
- end
25
31
 
26
- module Unionable
27
- def |(other)
28
- Union.new(self, other)
32
+ module Ext
33
+ refine Class do
34
+ include Unionable
35
+ end
29
36
  end
30
37
  end
31
38
  end
@@ -41,7 +41,7 @@ module UnionTest
41
41
  t.error("refinents miss")
42
42
  end
43
43
 
44
- using UnionExt
44
+ using TypeStruct::Union::Ext
45
45
 
46
46
  def test_class_or(t)
47
47
  u = TrueClass | FalseClass
@@ -1,3 +1,3 @@
1
1
  class TypeStruct
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -2,13 +2,13 @@ require "type_struct"
2
2
  require "type_struct/ext"
3
3
 
4
4
  module TypeStructTest
5
- using UnionExt
5
+ using TypeStruct::Union::Ext
6
6
 
7
7
  class Dummy < TypeStruct.new(
8
8
  str: String,
9
9
  num: Integer,
10
10
  reg: /abc/,
11
- ary: ArrayOf.new(Integer | Float) | NilClass,
11
+ ary: ArrayOf(Integer | Float) | NilClass,
12
12
  any: Object,
13
13
  ); end
14
14
 
@@ -21,7 +21,7 @@ module TypeStructTest
21
21
  ); end
22
22
 
23
23
  class Bar < TypeStruct.new(
24
- baz: ArrayOf.new(Integer | NilClass),
24
+ baz: ArrayOf(Integer | NilClass),
25
25
  ); end
26
26
 
27
27
  class Foo < TypeStruct.new(
@@ -31,22 +31,22 @@ module TypeStructTest
31
31
 
32
32
  BoolClass = TrueClass | FalseClass
33
33
  C = TypeStruct.new(
34
- a: ArrayOf.new(BoolClass),
34
+ a: ArrayOf(BoolClass),
35
35
  )
36
36
  B = TypeStruct.new(
37
37
  a: Integer,
38
38
  b: BoolClass,
39
- c: ArrayOf.new(Integer),
40
- d: ArrayOf.new(BoolClass),
39
+ c: ArrayOf(Integer),
40
+ d: ArrayOf(BoolClass),
41
41
  e: C,
42
42
  )
43
43
  A = TypeStruct.new(
44
- a: ArrayOf.new(Integer),
45
- b: ArrayOf.new(BoolClass),
44
+ a: ArrayOf(Integer),
45
+ b: ArrayOf(BoolClass),
46
46
  c: BoolClass,
47
47
  d: B,
48
- e: ArrayOf.new(B),
49
- f: HashOf.new(String, Integer),
48
+ e: ArrayOf(B),
49
+ f: HashOf(String, Integer),
50
50
  )
51
51
 
52
52
  def test_s_from_hash_a(t)
@@ -92,7 +92,7 @@ module TypeStructTest
92
92
  def test_hash_of(t)
93
93
  b = TypeStruct.new(b: Integer)
94
94
  hc = TypeStruct.new(
95
- a: HashOf.new(Symbol, b),
95
+ a: HashOf(Symbol, b),
96
96
  )
97
97
 
98
98
  h = hc.new(
@@ -102,7 +102,6 @@ module TypeStructTest
102
102
  t.error("assign failed")
103
103
  end
104
104
 
105
- p HashOf.new(Symbol, b) === []
106
105
  begin
107
106
  hc.new(
108
107
  a: [],
@@ -129,7 +128,7 @@ module TypeStructTest
129
128
 
130
129
  def test_array_of(t)
131
130
  a = TypeStruct.new(a: Integer)
132
- b = TypeStruct.new(a: ArrayOf.new(a))
131
+ b = TypeStruct.new(a: ArrayOf(a))
133
132
  bb = b.new(a: [a.new(a: 1), a.new(a: 2), a.new(a: 3)])
134
133
  unless b === bb
135
134
  t.error("type error")
@@ -191,14 +190,20 @@ module TypeStructTest
191
190
 
192
191
  begin
193
192
  d.from_hash(d: [b: 1])
194
- rescue TypeStruct::UnionNotFoundError
193
+ rescue TypeStruct::UnionNotFoundError => err
194
+ unless /is not found with errors/ =~ err.message
195
+ t.error("error message was changed")
196
+ end
195
197
  else
196
198
  t.error("error dose not raised")
197
199
  end
198
200
 
199
201
  begin
200
202
  d.from_hash(d: { b: "a" })
201
- rescue TypeStruct::UnionNotFoundError
203
+ rescue TypeStruct::UnionNotFoundError => err
204
+ unless /is not found with errors/ =~ err.message
205
+ t.error("error message was changed")
206
+ end
202
207
  else
203
208
  t.error("error dose not raised")
204
209
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: type_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-15 00:00:00.000000000 Z
11
+ date: 2016-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  version: '0'
99
99
  requirements: []
100
100
  rubyforge_project:
101
- rubygems_version: 2.5.2
101
+ rubygems_version: 2.6.1
102
102
  signing_key:
103
103
  specification_version: 4
104
104
  summary: Imitating static typed struct.