interrobang 1.1.1 → 1.2.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
2
  SHA1:
3
- metadata.gz: 0ceec7459be5080517cd7fb86a34a82d298a4566
4
- data.tar.gz: 786219e05a0eb05f8ce748145847dfd993a25831
3
+ metadata.gz: 099c151998012c3b83493b640f45acbf91247f57
4
+ data.tar.gz: 2da0a2856a9e9f416898f205d514a66b6143a496
5
5
  SHA512:
6
- metadata.gz: f0a2e2f65b003c5e1d5af6ac61634d284d502f44c45708f92715babd30e258f2ffea92d192d557a1340eb22e41039a54e12350799bb75fb75f12a7c4fc9b4767
7
- data.tar.gz: 47ed4dfbe582b2151a7666430c910b1bbd7e3fb9243d47d3f8f01275175a6a9f47d04749186126fecaea8cbdde632eae65b75c44b4c1272660e9217cd67329f3
6
+ metadata.gz: 1160b524c4aad14728ee2ecd935ea249f941ff363da066996911e81ee2b1c63123e66d6ca3a9ae00a535137c0a6f34f8211a86be5c43fb7b9d3f93e1fb93e6ec
7
+ data.tar.gz: 1b13e92885ebf30278e6a463a788f79cdb4a0d354875104fc0afbb4331ef5be4292fd66f2eb2e04c08d63ef9887a9140146b53e527c65fe4e0dccef35d0f9dc6
@@ -5,8 +5,11 @@ rvm:
5
5
  - 2.1
6
6
  - 2.0.0
7
7
  - ruby-head
8
- - jruby-head
8
+ - jruby-9
9
9
  - rbx-2
10
10
  addons:
11
11
  code_climate:
12
12
  repo_token: 6f4b7c1f44b29f414ffb9b243b1f83cf5fa40eb297b4cd0c7761bf960487a8eb
13
+ matrix:
14
+ allow_failures:
15
+ - rvm: ruby-head
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/interrobang.svg)](http://badge.fury.io/rb/interrobang)
4
4
  [![Build Status](https://travis-ci.org/fny/interrobang.svg?branch=master)](https://travis-ci.org/fny/interrobang)
5
5
  [![Test Coverage](https://codeclimate.com/github/fny/interrobang/badges/coverage.svg)](https://codeclimate.com/github/fny/interrobang)
6
+ [![Code Climate](https://codeclimate.com/github/fny/interrobang/badges/gpa.svg)](https://codeclimate.com/github/fny/interrobang)
6
7
  [![Inline docs](http://inch-ci.org/github/fny/interrobang.svg?branch=master)](http://inch-ci.org/github/fny/interrobang)
7
8
 
8
9
  Convert your `predicate_methods?` into `bang_methods!` without abusing `method_missing`.
@@ -23,7 +24,7 @@ class Answer
23
24
  end
24
25
  ```
25
26
 
26
- `Interrobang` automagically adds corresponding bang methods for any predicate methods that end in a `?`. The bang methods explode when the predicate method returns a falsey value.
27
+ `Interrobang` automagically adds corresponding bang methods for any predicate methods that end in a `?`. The bang methods explode when the predicate method returns a falsey value and otherwise return true.
27
28
 
28
29
  ```ruby
29
30
  # Pick your poison...
@@ -82,6 +83,8 @@ end
82
83
  Interrobang(NaySayer, :correct?) # => :correct!
83
84
  ```
84
85
 
86
+ `Interrobang` returns `nil` instead of converting `bang_methods!` or `assignment_methods`.
87
+
85
88
  ### Filters
86
89
 
87
90
  Perhaps you'd like to convert methods that match a different pattern?
@@ -94,12 +97,11 @@ Interrobang(Answer, matching: %r{\Ais_.*\z})
94
97
  You can exclude methods that match the pattern with `except`.
95
98
 
96
99
  ```ruby
97
- Interrobang(Answer, matching: %r{\Ais_.*\z},
98
- except: [:is_factual, :is_right])
100
+ Interrobang(Answer, matching: %r{\Ais_.*\z}, except: [:is_factual, :is_right])
99
101
  # => [:is_correct!]
100
102
  ```
101
103
 
102
- Maybe you'd like to state the methods to convert explicitly?
104
+ Maybe you'd like to state the methods to convert explicitly? Use `only`. This will override the pattern or any exclusions.
103
105
 
104
106
  ```ruby
105
107
  Interrobang(Answer, only: :is_correct) # => [:is_correct!]
@@ -113,7 +115,7 @@ Interrobang(Answer, include_super: true, prefix: 'ensure_')
113
115
  Answer.new.ensure_nil! # => Raises Interrobang::FalsePredicate
114
116
  ```
115
117
 
116
- Too lazy to type `Interrobang` a few timews? Just `extend` it. It's methods are `module_function`s.
118
+ Too lazy to type `Interrobang` a few times? Just `extend` it. It's methods are `module_function`s.
117
119
 
118
120
  ```ruby
119
121
  class Answer
@@ -8,8 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Interrobang::VERSION
9
9
  spec.authors = ["Faraz Yashar"]
10
10
  spec.email = ["faraz.yashar@gmail.com"]
11
- spec.summary = "Convert your predicate_methods? into bang_methods! without
12
- abusing method_missing"
11
+ spec.summary = "Convert your predicate_methods? into bang_methods!"
13
12
  spec.description = "Convert your predicate_methods? into bang_methods! without
14
13
  abusing method_missing."
15
14
  spec.homepage = 'https://github.com/fny/interrobang'
@@ -3,7 +3,7 @@ require 'interrobang/version'
3
3
  # Convert your `#predicate_methods?` to `#bang_methods!`
4
4
  module Interrobang
5
5
  # Exception to raise when no block is provided for bangified falsey methods
6
- FalsePredicate = Class.new(Exception)
6
+ FalsePredicate = Class.new(StandardError)
7
7
 
8
8
  # Regexp that matches methods that end in question marks.
9
9
  DEFAULT_PATTERN = %r{\A[^?]+\?\z}
@@ -59,7 +59,8 @@ module Interrobang
59
59
  end
60
60
 
61
61
  # Converts the specified predicate method to a bang method. Beware: bang
62
- # methods will be created for undefined methods too.
62
+ # methods will be created for undefined methods too. Assignment methods (`method=`)
63
+ # and bang methods (`method!`) will not be converted.
63
64
  #
64
65
  # klass - The Class to target for bangification
65
66
  # predicate_method - The Symbol of the predicate method
@@ -71,7 +72,8 @@ module Interrobang
71
72
  # prefix - The String prefix to add to front of the bangified method
72
73
  # suffix - The String suffix to add to end of the bangified method
73
74
  #
74
- # Returns the Symbol name of the bang method created.
75
+ # Returns the Symbol name of the bang method created or nil if the method
76
+ # was not bangified (ends in `!` or `=`.)
75
77
  def bangify_method(klass, predicate_method, prefix: '', suffix: '')
76
78
  predicate_method_string = predicate_method.to_s
77
79
  method_name_base =
@@ -79,9 +81,9 @@ module Interrobang
79
81
  when '=', '!'
80
82
  return
81
83
  when '?'
82
- predicate_method.to_s[0..-2]
84
+ predicate_method_string[0..-2]
83
85
  else
84
- predicate_method.to_s
86
+ predicate_method_string
85
87
  end
86
88
 
87
89
  bang_method = :"#{prefix}#{method_name_base}#{suffix}!"
@@ -100,7 +102,7 @@ module Interrobang
100
102
  if send(predicate_method, *args, &block)
101
103
  true
102
104
  else
103
- raise(Interrobang::FalsePredicate, "#{predicate_method} is false")
105
+ fail Interrobang::FalsePredicate, "#{predicate_method} is false"
104
106
  end
105
107
  end
106
108
  end
@@ -1,3 +1,3 @@
1
1
  module Interrobang
2
- VERSION = '1.1.1'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -1,22 +1,21 @@
1
1
  require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
- SomeError = Class.new(Exception)
4
-
5
- def test_class
6
- Class.new {
7
- def true?; true; end
8
- def veritable?; true; end
9
- def so_true; true; end
10
- def so_very_true; true; end
11
- def false?; false; end
12
- def so_false; false; end
13
- def assignment=; end
14
- def bang!; '!'; end
15
- def with_argument?(bool); bool; end
16
- }
17
- end
18
-
19
3
  describe Interrobang do
4
+ let(:klass) do
5
+ Class.new {
6
+ def true?; true; end
7
+ def veritable?; true; end
8
+ def so_true; true; end
9
+ def so_very_true; true; end
10
+ def false?; false; end
11
+ def so_false; false; end
12
+ def assignment=; end
13
+ def bang!; '!'; end
14
+ def with_argument?(bool); bool; end
15
+ }
16
+ end
17
+
18
+ SomeError = Class.new(StandardError)
20
19
 
21
20
  #
22
21
  # Bangify Class
@@ -30,70 +29,61 @@ describe Interrobang do
30
29
  '.bangify_class' =>
31
30
  -> (*args, &block) { Interrobang.bangify_class(*args, &block) }
32
31
  }
33
- bangify_class_signatures.each do |method_call, method_block|
34
- describe method_call do
32
+ bangify_class_signatures.each do |signature_name, bangify_class|
33
+ describe signature_name do
35
34
  it "converts all predicate? methods by default" do
36
- klass = test_class
37
- method_block.call klass
35
+ bangify_class.call klass
38
36
  assert klass.new.true!
39
37
  assert klass.new.veritable!
40
38
  end
41
39
 
42
40
  it "returns an array of symbols of the bangified methods" do
43
- klass = test_class
44
- assert_equal method_block.call(klass).sort, [:true!, :veritable!, :false!, :with_argument!].sort
41
+ assert_equal bangify_class.call(klass).sort, [:true!, :veritable!, :false!, :with_argument!].sort
45
42
  end
46
43
 
47
44
  it "converts all methods according to the provided prefix and suffix" do
48
- klass = test_class
49
- method_block.call(klass, prefix: 'prefix_', suffix: '_suffix')
45
+ bangify_class.call(klass, prefix: 'prefix_', suffix: '_suffix')
50
46
  assert klass.new.prefix_true_suffix!
51
47
  assert klass.new.prefix_veritable_suffix!
52
48
  end
53
49
 
54
50
  it "converts all methods that match the provided pattern" do
55
- klass = test_class
56
- method_block.call(klass, matching: %r{\Aso_.*\z})
51
+ bangify_class.call(klass, matching: %r{\Aso_.*\z})
57
52
  assert klass.new.so_true!
58
53
  assert klass.new.so_very_true!
59
54
  -> { klass.new.true! }.must_raise NoMethodError
60
55
  end
61
56
 
62
57
  it "converts all methods that match the provided pattern respected except" do
63
- klass = test_class
64
- method_block.call(klass, matching: %r{\Aso_.*\z}, except: [:so_very_true])
58
+ bangify_class.call(klass, matching: %r{\Aso_.*\z}, except: [:so_very_true])
65
59
  assert klass.new.so_true!
66
60
  -> { klass.new.so_very_true! }.must_raise NoMethodError
67
61
  -> { klass.new.true! }.must_raise NoMethodError
68
62
  end
69
63
 
70
64
  it "except option accepts a singular symbol" do
71
- klass = test_class
72
- method_block.call(klass, matching: %r{\Aso_.*\z}, except: :so_very_true)
65
+ bangify_class.call(klass, matching: %r{\Aso_.*\z}, except: :so_very_true)
73
66
  assert klass.new.so_true!
74
67
  -> { klass.new.so_very_true! }.must_raise NoMethodError
75
68
  -> { klass.new.true! }.must_raise NoMethodError
76
69
  end
77
70
 
78
71
  it "converts only the methods specified in the only option" do
79
- klass = test_class
80
- method_block.call(klass, only: [:so_true])
72
+ bangify_class.call(klass, only: [:so_true])
81
73
  assert klass.new.so_true!
82
74
  -> { klass.new.so_very_true! }.must_raise NoMethodError
83
75
  -> { klass.new.true! }.must_raise NoMethodError
84
76
  end
85
77
 
86
78
  it "except option accepts a singular symbol" do
87
- klass = test_class
88
- method_block.call(klass, only: :so_true)
79
+ bangify_class.call(klass, only: :so_true)
89
80
  assert klass.new.so_true!
90
81
  -> { klass.new.so_very_true! }.must_raise NoMethodError
91
82
  -> { klass.new.true! }.must_raise NoMethodError
92
83
  end
93
84
 
94
85
  it "converts only the methods specified in the only option with a block" do
95
- klass = test_class
96
- method_block.call(klass, only: [:so_false]) do
86
+ bangify_class.call(klass, only: [:so_false]) do
97
87
  raise SomeError
98
88
  end
99
89
  -> { klass.new.so_false! }.must_raise SomeError
@@ -102,8 +92,7 @@ describe Interrobang do
102
92
  end
103
93
 
104
94
  it "performs the provided block for the bang method" do
105
- klass = test_class
106
- method_block.call(klass) do
95
+ bangify_class.call(klass) do
107
96
  raise SomeError
108
97
  end
109
98
  assert klass.new.true!
@@ -111,8 +100,7 @@ describe Interrobang do
111
100
  end
112
101
 
113
102
  it "converts super methods when specified" do
114
- klass = test_class
115
- method_block.call(klass, include_super: true, prefix: 'ensure_')
103
+ bangify_class.call(klass, include_super: true, prefix: 'ensure_')
116
104
  -> { klass.new.ensure_nil! }.must_raise Interrobang::FalsePredicate
117
105
  end
118
106
  end
@@ -130,63 +118,63 @@ describe Interrobang do
130
118
  '.bangify_method' =>
131
119
  -> (*args, &block) { Interrobang.bangify_method(*args, &block) }
132
120
  }
133
- bangify_method_signatures.each do |method_call, method_block|
134
- describe method_call do
121
+ bangify_method_signatures.each do |signature_name, bangify_method|
122
+ describe signature_name do
135
123
  describe "with a method that ends in a ?" do
136
124
  it "adds a ! method dropping the ?" do
137
- klass = test_class
138
- method_block.call(klass, :true?)
125
+ bangify_method.call(klass, :true?)
139
126
  assert klass.new.true!
140
127
  end
141
128
 
142
129
  it "has no method missing shenanigans" do
143
- klass = test_class
144
- method_block.call(klass, :true?)
130
+ bangify_method.call(klass, :true?)
145
131
  assert klass.new.respond_to?(:true!)
146
132
  end
147
133
  end
148
134
 
149
135
  describe "with a method that does not end in a ?" do
150
136
  it "adds a ! method" do
151
- klass = test_class
152
- method_block.call(klass, :so_true)
137
+ bangify_method.call(klass, :so_true)
153
138
  end
154
139
  end
155
140
 
156
141
  it "returns the symbol of the bangified method" do
157
- klass = test_class
158
- assert_equal method_block.call(klass, :true?), :true!
142
+ assert_equal bangify_method.call(klass, :true?), :true!
159
143
  end
160
144
 
161
145
  it "works on methods with arguments" do
162
- klass = test_class
163
- method_block.call(klass, :with_argument?)
146
+ bangify_method.call(klass, :with_argument?)
164
147
  assert klass.new.with_argument!(true)
165
148
  -> { klass.new.with_argument!(false) }.must_raise Interrobang::FalsePredicate
166
149
  end
167
150
 
168
151
  it "does not convert assignment methods" do
169
- klass = test_class
170
- method_block.call(klass, :assignment_=)
171
- -> { klass.new.assignment_! }.must_raise NoMethodError
152
+ assert_equal bangify_method.call(klass, :assignment=), nil
153
+ assert !klass.new.respond_to?(:assignment!)
172
154
  end
173
155
 
174
156
  it "does not convert bang methods" do
175
- klass = test_class
176
- method_block.call(klass, :bang!)
157
+ assert_equal bangify_method.call(klass, :bang!), nil
177
158
  assert_equal klass.new.bang!, '!'
178
159
  end
179
160
 
180
161
  it "converts undefined methods" do
181
- klass = test_class
182
- method_block.call(klass, :is_not_defined)
162
+ bangify_method.call(klass, :is_not_defined)
183
163
  assert klass.new.respond_to?(:is_not_defined!)
184
164
  end
185
165
 
166
+ it "raises errors with a message about the false predicate" do
167
+ bangify_method.call(klass, :false?)
168
+ begin
169
+ klass.new.false!
170
+ rescue Exception => e
171
+ assert_equal e.message, "false? is false"
172
+ end
173
+ end
174
+
186
175
  describe "options" do
187
176
  it "adds any provided prefix or suffix to the bang method" do
188
- klass = test_class
189
- method_block.call(klass, :true?, prefix: 'prefix_', suffix: '_suffix')
177
+ bangify_method.call(klass, :true?, prefix: 'prefix_', suffix: '_suffix')
190
178
  assert klass.new.prefix_true_suffix!
191
179
  end
192
180
  end
@@ -194,8 +182,7 @@ describe Interrobang do
194
182
  describe "falsey predicates" do
195
183
  describe "without a custom block" do
196
184
  it "raises a FalsePredicate error" do
197
- klass = test_class
198
- method_block.call(klass, :false?)
185
+ bangify_method.call(klass, :false?)
199
186
  err = -> { klass.new.false! }.must_raise Interrobang::FalsePredicate
200
187
  assert_equal err.message, 'false? is false'
201
188
  end
@@ -203,16 +190,14 @@ describe Interrobang do
203
190
 
204
191
  describe "with a provided block" do
205
192
  it "performs the provided block for the bang method" do
206
- klass = test_class
207
- method_block.call(klass, :false?) do
193
+ bangify_method.call(klass, :false?) do
208
194
  raise SomeError
209
195
  end
210
196
  -> { klass.new.false! }.must_raise SomeError
211
197
  end
212
198
 
213
199
  it "allows the provided block to take the predicate method as an argument" do
214
- klass = test_class
215
- method_block.call(klass, :false?) do |predicate_method|
200
+ bangify_method.call(klass, :false?) do |predicate_method|
216
201
  raise SomeError, "#{predicate_method} isn't true"
217
202
  end
218
203
  err = -> { klass.new.false! }.must_raise SomeError
@@ -238,4 +223,9 @@ describe Interrobang do
238
223
  -> { Answer.new.correct! }.must_raise(Interrobang::FalsePredicate)
239
224
  end
240
225
 
226
+ describe Interrobang::FalsePredicate do
227
+ it "can be rescued without specifying an exception" do
228
+ assert begin fail(Interrobang::FalsePredicate); rescue; true; end
229
+ end
230
+ end
241
231
  end
@@ -4,6 +4,7 @@ if ENV['CODECLIMATE_REPO_TOKEN']
4
4
  end
5
5
 
6
6
  require 'minitest/autorun'
7
+ require 'minitest/hell'
7
8
  require 'minitest/pride'
8
9
 
9
10
  require File.expand_path('../../lib/interrobang', __FILE__)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interrobang
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Faraz Yashar
@@ -96,8 +96,7 @@ rubyforge_project:
96
96
  rubygems_version: 2.4.6
97
97
  signing_key:
98
98
  specification_version: 4
99
- summary: Convert your predicate_methods? into bang_methods! without abusing method_missing
99
+ summary: Convert your predicate_methods? into bang_methods!
100
100
  test_files:
101
101
  - test/lib/interrobang_test.rb
102
102
  - test/test_helper.rb
103
- has_rdoc: