tinytyping 0.4.0 → 0.5.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
- SHA1:
3
- metadata.gz: cba2458a80da86752f355d90a207e9eaa78c2897
4
- data.tar.gz: 38df98d991b18264e5c4e8753e11f4183e9b05bf
2
+ SHA256:
3
+ metadata.gz: 36dc3d61798a42ffdca99b014ccf5022017339ac6ff2eab5d5f882b4c8588f54
4
+ data.tar.gz: 11ec5b0fd4d5f3aebcb46213bdcd2d68b0c9a1a5498208a6b1ae707a91e61f97
5
5
  SHA512:
6
- metadata.gz: 9dc39325c75c19eb403b830fd61168873bd1602181ca3d293231893f710d02b77297fed8ea12ee9b1ef1fca1ca76a1fb918434bf0eee97a451dd8dae0c97caee
7
- data.tar.gz: 4cb899ee424fbd42ec732d491203482992e9d93b215e457bd24c08c20e31945436f989295aaca2585ee882628bbdf211343a2f4f6ced286bd53dde7bce98aaee
6
+ metadata.gz: 5d9cd1391863d07cbd78348bd110924ae5c6931a05a06d0aee0720a9530379a94169209a5de28e53c90b39a13ce63ee14b78e92201ff26798bb4b4b4fe086896
7
+ data.tar.gz: '08589546b13b0cd18605a9668b8fe3bffaf9dd6a33c6adda3e5c542d38bffabfadb4cf5d320d0f699a06eed31f10372407170af302ef7c06db9cdc80fe1e8965'
@@ -1,14 +1,26 @@
1
+ AllCops:
2
+ NewCops: enable
3
+
4
+ Layout/LineLength:
5
+ Enabled: false
6
+
1
7
  Metrics/AbcSize:
2
8
  Enabled: false
3
9
 
4
- Metrics/CyclomaticComplexity:
10
+ Metrics/BlockLength:
5
11
  Enabled: false
6
12
 
7
- Metrics/LineLength:
13
+ Metrics/CyclomaticComplexity:
8
14
  Enabled: false
9
15
 
10
16
  Metrics/MethodLength:
11
17
  Enabled: false
12
18
 
19
+ Metrics/PerceivedComplexity:
20
+ Enabled: false
21
+
22
+ Naming/MethodParameterName:
23
+ Enabled: false
24
+
13
25
  Style/Documentation:
14
26
  Enabled: false
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in tinytyping.gemspec
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rake/testtask'
3
5
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'tinytyping'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TinyTyping
2
4
  class Tester
3
5
  class << self
@@ -9,10 +11,12 @@ module TinyTyping
9
11
  value == type
10
12
  when Array
11
13
  return false unless value.is_a?(Array)
14
+
12
15
  value.each { |val| expect(type, val) }
13
16
  true
14
17
  when Hash
15
18
  return false unless value.is_a?(Hash)
19
+
16
20
  class_key_types = []
17
21
  named_key_types = []
18
22
  type.each_key do |key|
@@ -42,6 +46,7 @@ module TinyTyping
42
46
 
43
47
  def expect(types, value)
44
48
  return if expect_any(types, value)
49
+
45
50
  raise ArgumentError, "#{value.inspect} isn't #{(Array.try_convert(types) || [types]).map(&:inspect).join(' or ')}."
46
51
  end
47
52
  end
@@ -81,26 +86,39 @@ module TinyTyping
81
86
  class << self
82
87
  private
83
88
 
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]))
89
+ def method_added(method)
90
+ return unless @next_decorator
91
+
92
+ unbound_method = instance_method(method)
93
+
94
+ if unbound_method.arity == @next_decorator_airty && (@prev_added_method.nil? || method.to_s == "#{@prev_added_method}=")
95
+ decorator = @next_decorator
96
+ @next_decorator = @prev_added_method = nil
97
+ define_method(method) do |*args, &block|
98
+ decorator.call(unbound_method.bind(self), *args, &block)
88
99
  end
89
- instance_exec(*args, &block)
100
+ elsif unbound_method.arity.zero? && @prev_added_method.nil?
101
+ @prev_added_method = method
102
+ else
103
+ raise ArgumentError, "#{method}.arity(#{unbound_method.arity}) does not match decorator's arity(#{@next_decorator_airty})"
90
104
  end
91
105
  end
92
106
 
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
107
+ def decorate(airty, &block)
108
+ @next_decorator_airty = airty
109
+ @next_decorator = block
110
+ @prev_added_method = nil
99
111
  end
100
112
 
101
- def typed_attr_accessor(pairs)
102
- attr_reader(*pairs.keys)
103
- typed_attr_writer(pairs)
113
+ def typed(*types)
114
+ return if types.empty?
115
+
116
+ decorate(types.size) do |method, *args, &block|
117
+ types.each_with_index do |type, index|
118
+ TinyTyping.test!(args[index], *(Array.try_convert(type) || [type]))
119
+ end
120
+ method.call(*args, &block)
121
+ end
104
122
  end
105
123
  end
106
124
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TinyTyping
2
- VERSION = '0.4.0'.freeze
4
+ VERSION = '0.5.0'
3
5
  end
@@ -1,4 +1,6 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'tinytyping/version'
4
6
 
@@ -22,6 +24,6 @@ Gem::Specification.new do |spec|
22
24
 
23
25
  spec.add_development_dependency 'bundler', '~> 1.14'
24
26
  spec.add_development_dependency 'minitest', '~> 5.0'
25
- spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'rake', '~> 12.3.3'
26
28
  spec.add_development_dependency 'rubocop'
27
29
  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.4.0
4
+ version: 0.5.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-12-26 00:00:00.000000000 Z
11
+ date: 2020-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: 12.3.3
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: '10.0'
54
+ version: 12.3.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -104,8 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
104
  - !ruby/object:Gem::Version
105
105
  version: '0'
106
106
  requirements: []
107
- rubyforge_project:
108
- rubygems_version: 2.6.13
107
+ rubygems_version: 3.0.3
109
108
  signing_key:
110
109
  specification_version: 4
111
110
  summary: tinytyping is simply type check.