pippi 0.0.13 → 0.0.14

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: d37c65528172c3c0e6fedbf801f96e8ea46034df
4
- data.tar.gz: 846113876273b325dfa0b806dc817931444aed35
3
+ metadata.gz: 948ecbfacbd679fa33cc861541088156d6928069
4
+ data.tar.gz: 7037d5aa7e33ac744b041d4f15e266e433b138f8
5
5
  SHA512:
6
- metadata.gz: 9cb6f46aaaae477eefc994667a1890c68e748ee223c3c1d9b0fa3462b1af82ce8b467d697a54fe639a8ab8f5e9193acaafdaf3f2039a4c7e7a684a7bc47efdd7
7
- data.tar.gz: 25204a662c61af0f5906211e1b198286a04e94913a53753c807dd351a8c183fc8140c72103f163525bd3bd40d97fb853fd762a784aa1251ced648135fcdead21
6
+ metadata.gz: 3889d565b2472028144711ea64975e6e70ea6153b52a86d69eeb31767be7a8893ea939437319da2fae390f6ac78f81bc699c98673e451c11c679de74235d1b7f
7
+ data.tar.gz: 6578976bea375f870a594525cee6fdf6b20f07f0158deb9a1947178083ec84cd32686d028f16340973055252eb8296303a42c2062dddfc220ce062697abf6fd1
@@ -1,10 +1,16 @@
1
+ ## 0.0.14 (2015-04-23)
2
+
3
+ * [NEW] Added Rails checkset with first rule StripFollowedByEmpty
4
+ * [FIXED] Docs fixes
5
+ * [FIXED] Missing require when using pippi outside Rails
6
+
1
7
  ## 0.0.13 (2015-02-17)
2
8
 
3
- * (FIXED) :io option was still opening default file
9
+ * [FIXED] :io option was still opening default file
4
10
 
5
11
  ## 0.0.12 (2015-02-16)
6
12
 
7
- * (NEW) Changed output format to work better with IDEs
13
+ * [NEW] Changed output format to work better with IDEs
8
14
 
9
15
  ## 0.0.11 (2014-12-19)
10
16
 
data/README.md CHANGED
@@ -74,7 +74,13 @@ USE_PIPPI=true bundle exec rake test:units && cat log/pippi.log
74
74
  * You can also select a different checkset:
75
75
 
76
76
  ```text
77
- USE_PIPPI=true PIPPI_CHECKSET=training bundle exec rake test:units && cat log/pippi.log
77
+ USE_PIPPI=true PIPPI_CHECKSET=rails bundle exec rake test:units && cat log/pippi.log
78
+ ```
79
+
80
+ * And you can run multiple checksets:
81
+
82
+ ```text
83
+ USE_PIPPI=true PIPPI_CHECKSET=basic,rails bundle exec rake test:units && cat log/pippi.log
78
84
  ```
79
85
 
80
86
 
@@ -129,18 +135,18 @@ Pippi has the concept of "checksets" which are, well, sets of checks. The curre
129
135
 
130
136
  #### ReverseFollowedByEach
131
137
 
132
- Don't use each followed by reverse; use reverse_each instead
138
+ Don't use reverse followed by each; use reverse_each instead
133
139
 
134
140
  For example, rather than doing this:
135
141
 
136
142
  ```ruby
137
- [1, 2, 3].reverse.each { |x| x + 1 }
143
+ [1,2,3].reverse.each {|x| x+1 }
138
144
  ```
139
145
 
140
146
  Instead, consider doing this:
141
147
 
142
148
  ```ruby
143
- [1, 2, 3].reverse_each { |x| x + 1 }
149
+ [1,2,3].reverse_each {|x| x+1 }
144
150
  ```
145
151
 
146
152
  #### SelectFollowedByAny
@@ -150,13 +156,13 @@ Don't use select followed by any?; use any? with a block instead
150
156
  For example, rather than doing this:
151
157
 
152
158
  ```ruby
153
- [1, 2, 3].select { |x| x > 1 }.any?
159
+ [1,2,3].select {|x| x > 1 }.any?
154
160
  ```
155
161
 
156
162
  Instead, consider doing this:
157
163
 
158
164
  ```ruby
159
- [1, 2, 3].any? { |x| x > 1 }
165
+ [1,2,3].any? {|x| x > 1 }
160
166
  ```
161
167
 
162
168
  #### SelectFollowedByEmpty
@@ -166,13 +172,13 @@ Don't use select followed by empty?; use none? instead
166
172
  For example, rather than doing this:
167
173
 
168
174
  ```ruby
169
- [1, 2, 3].select { |x| x > 1 }.empty?
175
+ [1,2,3].select {|x| x > 1 }.empty?
170
176
  ```
171
177
 
172
178
  Instead, consider doing this:
173
179
 
174
180
  ```ruby
175
- [1, 2, 3].none? { |x| x > 1 }
181
+ [1,2,3].none? {|x| x > 1 }
176
182
  ```
177
183
 
178
184
  #### SelectFollowedByFirst
@@ -182,13 +188,13 @@ Don't use select followed by first; use detect instead
182
188
  For example, rather than doing this:
183
189
 
184
190
  ```ruby
185
- [1, 2, 3].select { |x| x > 1 }.first
191
+ [1,2,3].select {|x| x > 1 }.first
186
192
  ```
187
193
 
188
194
  Instead, consider doing this:
189
195
 
190
196
  ```ruby
191
- [1, 2, 3].detect { |x| x > 1 }
197
+ [1,2,3].detect {|x| x > 1 }
192
198
  ```
193
199
 
194
200
  #### SelectFollowedByNone
@@ -198,13 +204,13 @@ Don't use select followed by none?; use none? with a block instead
198
204
  For example, rather than doing this:
199
205
 
200
206
  ```ruby
201
- [1, 2, 3].select { |x| x > 1 }.none?
207
+ [1,2,3].select {|x| x > 1 }.none?
202
208
  ```
203
209
 
204
210
  Instead, consider doing this:
205
211
 
206
212
  ```ruby
207
- [1, 2, 3].none? { |x| x > 1 }
213
+ [1,2,3].none? {|x| x > 1 }
208
214
  ```
209
215
 
210
216
  #### SelectFollowedBySelect
@@ -214,13 +220,13 @@ Don't use consecutive select blocks; use a single select instead
214
220
  For example, rather than doing this:
215
221
 
216
222
  ```ruby
217
- [1, 2, 3].select { |x| x > 1 }.select { |x| x > 2 }
223
+ [1,2,3].select {|x| x > 1 }.select {|x| x > 2 }
218
224
  ```
219
225
 
220
226
  Instead, consider doing this:
221
227
 
222
228
  ```ruby
223
- [1, 2, 3].select { |x| x > 2 }
229
+ [1,2,3].select {|x| x > 2 }
224
230
  ```
225
231
 
226
232
  #### SelectFollowedBySize
@@ -230,13 +236,13 @@ Don't use select followed by size; use count instead
230
236
  For example, rather than doing this:
231
237
 
232
238
  ```ruby
233
- [1 ,2, 3].select { |x| x > 1 }.size
239
+ [1,2,3].select {|x| x > 1 }.size
234
240
  ```
235
241
 
236
242
  Instead, consider doing this:
237
243
 
238
244
  ```ruby
239
- [1, 2, 3].count { |x| x > 1 }
245
+ [1,2,3].count {|x| x > 1 }
240
246
  ```
241
247
  ### buggy
242
248
 
@@ -263,13 +269,30 @@ Don't use map followed by flatten(1); use flat_map instead
263
269
  For example, rather than doing this:
264
270
 
265
271
  ```ruby
266
- [1, 2, 3].map { |x| [x, x + 1] }.flatten(1)
272
+ [1,2,3].map {|x| [x,x+1] }.flatten(1)
273
+ ```
274
+
275
+ Instead, consider doing this:
276
+
277
+ ```ruby
278
+ [1,2,3].flat_map {|x| [x, x+1]}
279
+ ```
280
+ ### rails
281
+
282
+ #### StripFollowedByEmpty
283
+
284
+ Don't use String#strip followed by empty?; use String#blank? instead
285
+
286
+ For example, rather than doing this:
287
+
288
+ ```ruby
289
+ ' '.strip.empty?
267
290
  ```
268
291
 
269
292
  Instead, consider doing this:
270
293
 
271
294
  ```ruby
272
- [1, 2, 3].flat_map { |x| [x, x + 1] }
295
+ ' '.blank?
273
296
  ```
274
297
 
275
298
  ## Ideas for other problems to detect:
@@ -335,9 +358,7 @@ end
335
358
  ## TODO
336
359
 
337
360
  * Clean up this initial hacked out metaprogramming
338
- * Do more checks
339
361
  * Finish refactoring duplicated code into MethodSequenceChecker
340
- * Use MethodSequenceFinder to do something with String
341
362
 
342
363
  ## Developing
343
364
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  #### ReverseFollowedByEach
4
4
 
5
- Don't use each followed by reverse; use reverse_each instead
5
+ Don't use reverse followed by each; use reverse_each instead
6
6
 
7
7
  For example, rather than doing this:
8
8
 
@@ -144,3 +144,20 @@ Instead, consider doing this:
144
144
  ```ruby
145
145
  [1,2,3].flat_map {|x| [x, x+1]}
146
146
  ```
147
+ ### rails
148
+
149
+ #### StripFollowedByEmpty
150
+
151
+ Don't use String#strip followed by empty?; use String#blank? instead
152
+
153
+ For example, rather than doing this:
154
+
155
+ ```ruby
156
+ ' '.strip.empty?
157
+ ```
158
+
159
+ Instead, consider doing this:
160
+
161
+ ```ruby
162
+ ' '.blank?
163
+ ```
@@ -16,6 +16,7 @@ require 'pippi/checks/select_followed_by_empty'
16
16
  require 'pippi/checks/select_followed_by_any'
17
17
  require 'pippi/checks/select_followed_by_none'
18
18
  require 'pippi/checks/select_followed_by_select'
19
+ require 'pippi/checks/strip_followed_by_empty'
19
20
  require 'pippi/checks/method_sequence_finder'
20
21
  require 'pippi/checks/method_sequence_checker'
21
22
  require 'pippi/checks/assert_with_nil'
@@ -28,6 +28,9 @@ module Pippi
28
28
  "ReverseFollowedByEach",
29
29
  "SelectFollowedBySelect"
30
30
  ],
31
+ "rails" => [
32
+ "StripFollowedByEmpty"
33
+ ],
31
34
  "training" => [
32
35
  ],
33
36
  "research" => [
@@ -6,8 +6,12 @@ module Pippi::Checks
6
6
  @ctx = ctx
7
7
  end
8
8
 
9
- def array_mutator_methods
10
- [:collect!, :compact!, :flatten!, :map!, :reject!, :reverse!, :rotate!, :select!, :shuffle!, :slice!, :sort!, :sort_by!, :uniq!]
9
+ def mutator_methods(the_type=Array)
10
+ if the_type == String
11
+ [:insert, :<<]
12
+ else
13
+ [:collect!, :compact!, :flatten!, :map!, :reject!, :reverse!, :rotate!, :select!, :shuffle!, :slice!, :sort!, :sort_by!, :uniq!]
14
+ end
11
15
  end
12
16
 
13
17
  def method_names_that_indicate_this_is_being_used_as_a_collection
@@ -22,7 +22,7 @@ module Pippi::Checks
22
22
  # Ignore Array subclasses since map or flatten may have difference meanings
23
23
  else
24
24
  result.extend MyFlatten
25
- self.class._pippi_check_map_followed_by_flatten.array_mutator_methods.each do |this_means_its_ok_sym|
25
+ self.class._pippi_check_map_followed_by_flatten.mutator_methods.each do |this_means_its_ok_sym|
26
26
  result.define_singleton_method(this_means_its_ok_sym, self.class._pippi_check_map_followed_by_flatten.its_ok_watcher_proc(MyFlatten, :flatten))
27
27
  end
28
28
  end
@@ -3,7 +3,7 @@ class MethodSequenceChecker
3
3
  ARITY_TYPE_BLOCK_ARG = 1
4
4
  ARITY_TYPE_NONE = 2
5
5
 
6
- attr_reader :check, :clazz_to_decorate, :method1, :method2, :first_method_arity_type, :second_method_arity_type, :should_check_subsequent_calls
6
+ attr_reader :check, :clazz_to_decorate, :method1, :method2, :first_method_arity_type, :second_method_arity_type, :should_check_subsequent_calls, :return_type
7
7
 
8
8
  def initialize(check, clazz_to_decorate, method1, method2, first_method_arity_type, second_method_arity_type, should_check_subsequent_calls)
9
9
  @check = check
@@ -33,7 +33,7 @@ class MethodSequenceChecker
33
33
  # e.g., Array#select returns an Array. Would need to further parameterize this to get
34
34
  # different behavior.
35
35
  self.class.instance_variable_get(name).add_problem
36
- if method_sequence_check_instance.should_check_subsequent_calls && method_sequence_check_instance.clazz_to_decorate == Array
36
+ if method_sequence_check_instance.should_check_subsequent_calls && method_sequence_check_instance.clazz_to_decorate == self.class
37
37
  problem_location = caller_locations.find { |c| c.to_s !~ /byebug|lib\/pippi\/checks/ }
38
38
  self.class.instance_variable_get(name).method_names_that_indicate_this_is_being_used_as_a_collection.each do |this_means_its_ok_sym|
39
39
  define_singleton_method(this_means_its_ok_sym, self.class.instance_variable_get(name).clear_fault_proc(self.class.instance_variable_get(name), problem_location))
@@ -58,7 +58,7 @@ class MethodSequenceChecker
58
58
  end
59
59
  if self.class.instance_variable_get(name)
60
60
  result.extend second_method_decorator
61
- self.class.instance_variable_get(name).array_mutator_methods.each do |this_means_its_ok_sym|
61
+ self.class.instance_variable_get(name).mutator_methods(result.class).each do |this_means_its_ok_sym|
62
62
  result.define_singleton_method(this_means_its_ok_sym, self.class.instance_variable_get(name).its_ok_watcher_proc(second_method_decorator, method_sequence_check_instance.method2))
63
63
  end
64
64
  end
@@ -16,7 +16,7 @@ module Pippi::Checks
16
16
  # Ignore Array subclasses since reverse or each may have difference meanings
17
17
  else
18
18
  result.singleton_class.class_eval { prepend MyEach }
19
- self.class._pippi_check_reverse_followed_by_each.array_mutator_methods.each do |this_means_its_ok_sym|
19
+ self.class._pippi_check_reverse_followed_by_each.mutator_methods.each do |this_means_its_ok_sym|
20
20
  result.define_singleton_method(this_means_its_ok_sym, self.class._pippi_check_reverse_followed_by_each.its_ok_watcher_proc(MyEach, :each))
21
21
  end
22
22
  end
@@ -37,7 +37,7 @@ module Pippi::Checks
37
37
 
38
38
  class Documentation
39
39
  def description
40
- "Don't use each followed by reverse; use reverse_each instead"
40
+ "Don't use reverse followed by each; use reverse_each instead"
41
41
  end
42
42
 
43
43
  def sample
@@ -0,0 +1,30 @@
1
+ module Pippi::Checks
2
+
3
+ # This is a Rails-only check; how to call it out as such?
4
+ # Putting it in a "rails" checkset for now
5
+ class StripFollowedByEmpty < Check
6
+
7
+ def decorate
8
+ @mycheck.decorate
9
+ end
10
+
11
+ def initialize(ctx)
12
+ super
13
+ @mycheck = MethodSequenceChecker.new(self, String, "strip", "empty?", MethodSequenceChecker::ARITY_TYPE_NONE, MethodSequenceChecker::ARITY_TYPE_NONE, true)
14
+ end
15
+
16
+ class Documentation
17
+ def description
18
+ "Don't use String#strip followed by empty?; use String#blank? instead"
19
+ end
20
+ def sample
21
+ "' '.strip.empty?"
22
+ end
23
+ def instead_use
24
+ "' '.blank?"
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module Pippi
2
4
  class Report
3
5
  attr_reader :problems, :removed
@@ -1,3 +1,3 @@
1
1
  module Pippi
2
- VERSION = '0.0.13'
2
+ VERSION = '0.0.14'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pippi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Copeland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-18 00:00:00.000000000 Z
11
+ date: 2015-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -82,6 +82,7 @@ files:
82
82
  - lib/pippi/checks/select_followed_by_none.rb
83
83
  - lib/pippi/checks/select_followed_by_select.rb
84
84
  - lib/pippi/checks/select_followed_by_size.rb
85
+ - lib/pippi/checks/strip_followed_by_empty.rb
85
86
  - lib/pippi/context.rb
86
87
  - lib/pippi/exec_runner.rb
87
88
  - lib/pippi/problem.rb