tinytyping 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 98b8ac5e9350094a53bcf326f802cfe799bffe8e
4
- data.tar.gz: d535dbad1253288a8d279a0f5055ef8dd56c92e6
3
+ metadata.gz: cba2458a80da86752f355d90a207e9eaa78c2897
4
+ data.tar.gz: 38df98d991b18264e5c4e8753e11f4183e9b05bf
5
5
  SHA512:
6
- metadata.gz: 3a2124dba1f5236766b439a17cd30105117862fcca4f88e4b20d44e56ee3d73fc3a590d1330c72e3325078402fc801910baaa92c32ea6f989bbb0392b56461d5
7
- data.tar.gz: e9cb78daf8a369f539584ffd387fe68811a14bfe191558bf62637663250cfcc93a0921aeb205db91eed8c4ab848ddde00b48fbd60b666f52d8d6e4748296d9ee
6
+ metadata.gz: 9dc39325c75c19eb403b830fd61168873bd1602181ca3d293231893f710d02b77297fed8ea12ee9b1ef1fca1ca76a1fb918434bf0eee97a451dd8dae0c97caee
7
+ data.tar.gz: 4cb899ee424fbd42ec732d491203482992e9d93b215e457bd24c08c20e31945436f989295aaca2585ee882628bbdf211343a2f4f6ced286bd53dde7bce98aaee
data/lib/tinytyping.rb CHANGED
@@ -1,4 +1,61 @@
1
1
  module TinyTyping
2
+ class Tester
3
+ class << self
4
+ def expect_shape(type, value)
5
+ case type
6
+ when Class
7
+ value.is_a?(type)
8
+ when true, false, nil
9
+ value == type
10
+ when Array
11
+ return false unless value.is_a?(Array)
12
+ value.each { |val| expect(type, val) }
13
+ true
14
+ when Hash
15
+ return false unless value.is_a?(Hash)
16
+ class_key_types = []
17
+ named_key_types = []
18
+ type.each_key do |key|
19
+ case key
20
+ when Class, Array
21
+ class_key_types << key
22
+ else
23
+ named_key_types << key
24
+ end
25
+ end
26
+ (value.keys + named_key_types).uniq.each do |key|
27
+ expect(class_key_types.flatten(1), key) unless type.include?(key)
28
+ ktypes = []
29
+ ktypes << key if named_key_types.include?(key)
30
+ ktypes.push(*class_key_types.select { |t| expect_any(t, key) }) if value.include?(key)
31
+ expect(ktypes.flat_map { |k| type[k] }, value[key])
32
+ end
33
+ true
34
+ else
35
+ raise TypeError, "no implicit conversion of #{type.class} into Class"
36
+ end
37
+ end
38
+
39
+ def expect_any(types, value)
40
+ (Array.try_convert(types) || [types]).any? { |type| expect_shape(type, value) }
41
+ end
42
+
43
+ def expect(types, value)
44
+ return if expect_any(types, value)
45
+ raise ArgumentError, "#{value.inspect} isn't #{(Array.try_convert(types) || [types]).map(&:inspect).join(' or ')}."
46
+ end
47
+ end
48
+
49
+ def initialize(*types)
50
+ @types = types
51
+ end
52
+
53
+ def run!(value)
54
+ self.class.expect(@types, value)
55
+ nil
56
+ end
57
+ end
58
+
2
59
  class << self
3
60
  def test?(*args)
4
61
  test!(*args)
@@ -8,85 +65,51 @@ module TinyTyping
8
65
  end
9
66
 
10
67
  def test!(value, *types)
11
- check!(types, value)
12
- nil
68
+ Tester.new(*types).run!(value)
13
69
  end
14
70
 
15
71
  private
16
72
 
17
- def check!(types, value)
18
- index = types.index { |type| check?(type, value) }
19
- raise ArgumentError, "#{value.inspect} isn't #{types.map(&:inspect).join(' or ')}." unless index
20
- types[index]
21
- end
73
+ def included(base)
74
+ base.class_eval do
75
+ private
22
76
 
23
- def check?(type, value)
24
- case type
25
- when Class
26
- value.is_a?(type)
27
- when true, false, nil
28
- value == type
29
- when Array
30
- return false unless value.is_a?(Array)
31
- value.each { |val| check!(type, val) }
32
- true
33
- when Hash
34
- return false unless value.is_a?(Hash)
35
- class_key_types = []
36
- named_key_types = []
37
- type.each_key do |key|
38
- if [Class, Array, Hash].any? { |klass| key.is_a?(klass) }
39
- class_key_types << key
40
- else
41
- named_key_types << key
42
- end
43
- end
44
- (value.keys + named_key_types).uniq.each do |key|
45
- ktype = type.include?(key) ? key : check!(class_key_types, key)
46
- vtype = type[ktype]
47
- check!(Array.try_convert(vtype) || [vtype], value[key])
77
+ def test!(*args)
78
+ TinyTyping.test!(*args)
48
79
  end
49
- true
50
- else
51
- raise TypeError, "no implicit conversion of #{type.class} into Class"
52
- end
53
- end
54
- end
55
80
 
56
- def test!(*args)
57
- TinyTyping.test!(*args)
58
- end
81
+ class << self
82
+ private
59
83
 
60
- class Base
61
- include TinyTyping
62
- private :test!
63
-
64
- class << self
65
- private
84
+ def typed_def(method, *types, &block)
85
+ define_method(method) do |*args|
86
+ types.each_with_index do |type, index|
87
+ test!(args[index], *(Array.try_convert(type) || [type]))
88
+ end
89
+ instance_exec(*args, &block)
90
+ end
91
+ end
66
92
 
67
- def typed_def(method, *types, &block)
68
- define_method(method) do |*args|
69
- types.each_with_index do |type, index|
70
- test!(args[index], *(Array.try_convert(type) || [type]))
93
+ def typed_attr_writer(pairs)
94
+ pairs.each do |key, types|
95
+ typed_def "#{key}=", types do |value|
96
+ instance_variable_set("@#{key}", value)
97
+ end
98
+ end
71
99
  end
72
- instance_exec(*args, &block)
73
- end
74
- end
75
100
 
76
- def typed_attr_writer(pairs)
77
- pairs.each do |key, types|
78
- typed_def "#{key}=", types do |value|
79
- instance_variable_set("@#{key}", value)
101
+ def typed_attr_accessor(pairs)
102
+ attr_reader(*pairs.keys)
103
+ typed_attr_writer(pairs)
80
104
  end
81
105
  end
82
106
  end
83
-
84
- def typed_attr_accessor(pairs)
85
- attr_reader(*pairs.keys)
86
- typed_attr_writer(pairs)
87
- end
88
107
  end
89
108
  end
109
+
110
+ class Base
111
+ include TinyTyping
112
+ end
90
113
  end
91
114
 
92
115
  require 'tinytyping/version'
@@ -1,3 +1,3 @@
1
1
  module TinyTyping
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
data/tinytyping.gemspec CHANGED
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'tinytyping/version'
@@ -22,7 +21,7 @@ Gem::Specification.new do |spec|
22
21
  spec.require_paths = ['lib']
23
22
 
24
23
  spec.add_development_dependency 'bundler', '~> 1.14'
25
- spec.add_development_dependency 'rake', '~> 10.0'
26
24
  spec.add_development_dependency 'minitest', '~> 5.0'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
27
26
  spec.add_development_dependency 'rubocop'
28
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tinytyping
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
  - ofk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-08 00:00:00.000000000 Z
11
+ date: 2017-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,33 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.14'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '5.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '5.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  version: '0'
106
106
  requirements: []
107
107
  rubyforge_project:
108
- rubygems_version: 2.6.8
108
+ rubygems_version: 2.6.13
109
109
  signing_key:
110
110
  specification_version: 4
111
111
  summary: tinytyping is simply type check.