safety_check 0.0.1 → 0.0.2

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: 768cb88cef157bf5b487f5f988cf3ce0adfccfb7
4
- data.tar.gz: c0b8b0dfd8ac6c2f3fd7ad6cde6ffd39246fd362
3
+ metadata.gz: b69b29a68b53c6b95b6a3f9a5d7698648e48420e
4
+ data.tar.gz: 962d6867ababa327165ec0a635fa670d57051202
5
5
  SHA512:
6
- metadata.gz: a2af22acea0fe6318a8daa3751b894e1818e1eb6387dd804d06ce0bd4b5938aa6c7303b879056ca194f7bdbc8f30d8cee7413f8946b0647b1241222e81b1483a
7
- data.tar.gz: 8dab9529587167d1738ec89a2c07b045e54d0ac236563b5fae2f1587576a86e27df14ddecc59c7b64d4ddc8737d51aeb9f6d907b0fc82e336fe33df2cd4d344e
6
+ metadata.gz: e304f523ddfca6d916e3f1037bc51475d21aff4686559e1f765a0e58c7074ea6eb33dccbc1a5c37a31368d133f1daac307b09dda10367eb955eb12920ba65533
7
+ data.tar.gz: 152629295a966098a9e985bcaf70bf1ff543d97be3785daa48381c4733ccd9669487470d13f2b65b9739e6d57d3f90d1e1634397d7758da744c0d1af17102c2b
data/lib/safety_check.rb CHANGED
@@ -15,24 +15,26 @@ module SafetyCheck
15
15
 
16
16
  unsafe_method_name = "#{method_name.to_s}_without_type_safety".to_sym
17
17
 
18
- if arg_types.length != receiver.instance_method(method_name).arity
19
- raise ArgumentError, "wrong number of arguments for #{method_name.inspect} (#{arg_types.length} for #{receiver.instance_method(method_name).arity})"
18
+ required_arity = receiver.instance_method(method_name).parameters.select { |type, name| type == :req }.length
19
+
20
+ if arg_types.length < required_arity
21
+ raise ArgumentError, "wrong number of arguments for #{method_name.inspect} (#{arg_types.length} for #{required_arity})"
20
22
  end
21
23
 
22
24
  receiver.send(:alias_method, unsafe_method_name, method_name)
23
25
 
24
- receiver.send(:define_method, method_name) do |*args|
25
- if args.length != arg_types.length
26
+ receiver.send(:define_method, method_name) do |*args, &block|
27
+ if args.length < required_arity
26
28
  raise ArgumentError, "wrong number of arguments (#{args.length} for #{arg_types.length}) when calling #{method_name.inspect}"
27
29
  end
28
30
 
29
- arg_types.zip(args).each do |arg_type, arg|
31
+ args.zip(arg_types).each do |arg, arg_type|
30
32
  unless arg.is_a? arg_type
31
33
  raise ArgumentError, "expected #{arg.inspect} to be a #{arg_type} when calling #{method_name.inspect}"
32
34
  end
33
35
  end
34
36
 
35
- self.send(unsafe_method_name, *args)
37
+ self.send(unsafe_method_name, *args, &block)
36
38
  end
37
39
  end
38
40
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module SafetyCheck
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -5,7 +5,7 @@ describe SafetyCheck do
5
5
  it 'instance methods should not raise an error when the correct type of argument is used' do
6
6
  hi = Hello.new
7
7
 
8
- expect(hi.greetings('world')).to eq("Hello, world!")
8
+ expect(hi.greetings('world')).to eq('Hello, world!')
9
9
  end
10
10
 
11
11
  it 'instance methods should raise an error when the wrong type of argument is used' do
@@ -20,8 +20,46 @@ describe SafetyCheck do
20
20
  expect { hi.greetings('world', 'lol') }.to raise_error
21
21
  end
22
22
 
23
+ it 'instance methods should not raise an error if optional arguments are ommited' do
24
+ hi = Hello.new
25
+
26
+ expect(hi.moshi_moshi('world')).to eq('Hello from Japan, world!')
27
+ end
28
+
29
+ it 'instance methods should not raise an error when the correct type of argument is used for optional arguments' do
30
+ hi = Hello.new
31
+
32
+ expect(hi.moshi_moshi('world', 'Sweden')).to eq('Hello from Sweden, world!')
33
+ end
34
+
35
+ it 'instance methods should raise an error when the wrong type of argument is used for optional arguments' do
36
+ hi = Hello.new
37
+
38
+ expect { hi.moshi_moshi('world', 5) }.to raise_error
39
+ end
40
+
41
+ it 'instance methods should not raise an error when the correct type of argument is used and a block is passed' do
42
+ hi = Hello.new
43
+
44
+ expect(
45
+ hi.hallo('world') do |subject|
46
+ "what a wonderful #{subject}"
47
+ end
48
+ ).to eq('Hi, what a wonderful world!')
49
+ end
50
+
51
+ it 'instance methods should raise an error when the wrong type of argument is used and a block is passed' do
52
+ hi = Hello.new
53
+
54
+ expect do
55
+ hi.hallo(5) do |subject|
56
+ "what a wonderful #{subject}"
57
+ end
58
+ end.to raise_error
59
+ end
60
+
23
61
  it 'class methods should not raise an error when the correct type of argument is used' do
24
- expect(Hello.salutations('world')).to eq("Good day, world!")
62
+ expect(Hello.salutations('world')).to eq('Good day, world!')
25
63
  end
26
64
 
27
65
  it 'class methods should raise an error when the wrong type of argument is used' do
@@ -31,5 +69,33 @@ describe SafetyCheck do
31
69
  it 'class methods should raise an error when the wrong number of argument is used' do
32
70
  expect { Hello.salutations('world', 'lol') }.to raise_error
33
71
  end
72
+
73
+ it 'class methods should not raise an error if optional arguments are ommited' do
74
+ expect(Hello.ohayou_gozaimasu('world')).to eq('Good morning from Japan, world!')
75
+ end
76
+
77
+ it 'class methods should not raise an error when the correct type of argument is used for optional arguments' do
78
+ expect(Hello.ohayou_gozaimasu('world', 'Sweden')).to eq('Good morning from Sweden, world!')
79
+ end
80
+
81
+ it 'class methods should raise an error when the wrong type of argument is used for optional arguments' do
82
+ expect { Hello.ohayou_gozaimasu('world', 5) }.to raise_error
83
+ end
84
+
85
+ it 'class methods should not raise an error when the correct type of argument is used and a block is passed' do
86
+ expect(
87
+ Hello.guten_morgen('world') do |subject|
88
+ "from a distant #{subject}"
89
+ end
90
+ ).to eq('Good morning, from a distant world!')
91
+ end
92
+
93
+ it 'class methods should raise an error when the wrong type of argument is used and a block is passed' do
94
+ expect do
95
+ Hello.guten_morgen(5) do |subject|
96
+ "from a distant #{subject}"
97
+ end
98
+ end.to raise_error
99
+ end
34
100
  end
35
101
  end
@@ -6,8 +6,40 @@ class Hello
6
6
  end
7
7
  safety_check :greetings, String
8
8
 
9
+ def moshi_moshi(subject, location = '')
10
+ if location == ''
11
+ "Hello from Japan, #{subject}!"
12
+ else
13
+ "Hello from #{location}, #{subject}!"
14
+ end
15
+ end
16
+ safety_check :moshi_moshi, String, String
17
+
18
+ def hallo(subject)
19
+ new_subject = yield subject
20
+
21
+ "Hi, #{new_subject}!"
22
+ end
23
+ safety_check :hallo, String
24
+
9
25
  def self.salutations(subject)
10
26
  "Good day, #{subject}!"
11
27
  end
12
28
  safety_check :salutations, String
29
+
30
+ def self.ohayou_gozaimasu(subject, location = '')
31
+ if location == ''
32
+ "Good morning from Japan, #{subject}!"
33
+ else
34
+ "Good morning from #{location}, #{subject}!"
35
+ end
36
+ end
37
+ safety_check :ohayou_gozaimasu, String, String
38
+
39
+ def self.guten_morgen(subject)
40
+ new_subject = yield subject
41
+
42
+ "Good morning, #{new_subject}!"
43
+ end
44
+ safety_check :guten_morgen, String
13
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safety_check
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Eshbaugh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-04 00:00:00.000000000 Z
11
+ date: 2014-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec