tinytyping 0.1.0 → 0.2.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: ad218feab5996c898d325cc3f44f9be37f6d4822
4
- data.tar.gz: 3f3701d19c755c1a7b9cb1eb5d97b42917909cfd
3
+ metadata.gz: c219fda2f7091c601dd8c91c5bfa98480a4102be
4
+ data.tar.gz: 90e73b4a5348db7639246eab6bdc48af95c5ba85
5
5
  SHA512:
6
- metadata.gz: 9314e8d4f56abaef43a9da56eb5d2b06b11b519ce8d70f027bc56cef0091c8ffdbf62767c9321267c7cdcf95b21159a5513d706ef0a8535610be14eb457f42e0
7
- data.tar.gz: 29eceec1230f8667faee9ff81444bbf4710d10acddf684e629755ca648480d153ab5c11b86e10bee23c14dab125ecbbc1da8407b50789513b9990ac36b568135
6
+ metadata.gz: ac1093b555c1f3d420047d5fba233db96a8b9d642612b376833daaa98da8eaee0a59c8ec274f95b77e7d26aa62fda66e308f92caa85429601cdeb31053654720
7
+ data.tar.gz: 63eb63c60d8f310c82a66ca0c2e3b20364a6873a6046f2bdc816f25bc427eaa983976918567b0d52c91032c8695915e4c36ecfb85e73298bdef2c3eea4c60198
@@ -1,3 +1,3 @@
1
1
  module TinyTyping
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/lib/tinytyping.rb CHANGED
@@ -9,13 +9,15 @@ module TinyTyping
9
9
 
10
10
  def test!(value, *types)
11
11
  check!(types, value)
12
+ nil
12
13
  end
13
14
 
14
15
  private
15
16
 
16
17
  def check!(types, value)
17
- return if types.any? { |type| check?(type, value) }
18
- raise ArgumentError, "#{value.inspect} isn't #{types.map(&:inspect).join(' or ')}."
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]
19
21
  end
20
22
 
21
23
  def check?(type, value)
@@ -30,7 +32,20 @@ module TinyTyping
30
32
  true
31
33
  when Hash
32
34
  return false unless value.is_a?(Hash)
33
- type.each { |key, val| check!(Array.try_convert(val) || [val], value[key]) }
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])
48
+ end
34
49
  true
35
50
  else
36
51
  raise TypeError, "no implicit conversion of #{type.class} into Class"
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.1.0
4
+ version: 0.2.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-03-08 00:00:00.000000000 Z
11
+ date: 2017-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -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.10
108
+ rubygems_version: 2.6.8
109
109
  signing_key:
110
110
  specification_version: 4
111
111
  summary: tinytyping is simply type check.