tinytyping 0.4.0 → 0.5.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
- 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.