pippi 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +16 -6
- data/doc/docs.md +16 -0
- data/lib/pippi/check_set_mapper.rb +1 -0
- data/lib/pippi/checks/assert_with_nil.rb +43 -0
- data/lib/pippi/tasks.rb +2 -1
- data/lib/pippi/version.rb +1 -1
- data/lib/pippi.rb +1 -0
- data/test/check_test.rb +5 -5
- data/test/rails_core_extensions.rb +8 -0
- data/test/unit/assert_with_nil_test.rb +17 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5a74d95bf3f5630ef99c31014f3bfcc83043cab
|
4
|
+
data.tar.gz: d3225b55129c7c327fa963cec71a281c17f275c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 367327d170a40465f8df9ff8bd41efb8c673068898dce752958557cf3cdc0c28f14f3fb8f4b0c8d2efe71ac18f321010f7f6814e679c4739010297daa7ab6fe1
|
7
|
+
data.tar.gz: a2900f8d02ca4d99aed0f5180ba87489da2d9ca260434b7bd582d019eed30ec8f502f2c8c142a78f83d06da596d603057fc68425d768cd83530662cc442cd4e0
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,24 @@
|
|
1
1
|
Pippi is a utility for finding suboptimal Ruby class API usage.
|
2
2
|
|
3
|
-
<a href="http://thomasleecopeland.com/2014/10/22/finding-suboptimal-api-usage.html">Here's a project overview
|
3
|
+
<a href="http://thomasleecopeland.com/2014/10/22/finding-suboptimal-api-usage.html">Here's a project overview</a>.
|
4
4
|
|
5
5
|
## Checks
|
6
6
|
|
7
|
+
### AssertWithNil
|
8
|
+
|
9
|
+
Don't use assert_equal with nil as a first argument; use assert_nil instead
|
10
|
+
|
11
|
+
For example, rather than doing this:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
x = nil ; assert_equal(nil, x)
|
15
|
+
```
|
16
|
+
|
17
|
+
Instead, consider doing this:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
x = nil ; assert_nil(x)
|
21
|
+
|
7
22
|
### MapFollowedByFlatten
|
8
23
|
|
9
24
|
Don't use map followed by flatten; use flat_map instead
|
@@ -92,11 +107,6 @@ bundle exec ruby -rpippi/auto_runner -e "MyClass.new.exercise_some_code"
|
|
92
107
|
|
93
108
|
```ruby
|
94
109
|
# Don't use select followed by compact, use select with the nil inside the block
|
95
|
-
# Use assert_nil rather than assert_equals
|
96
|
-
# wrong
|
97
|
-
assert_equals(nil, foo)
|
98
|
-
# right
|
99
|
-
assert_nil foo
|
100
110
|
|
101
111
|
# unnecessary assignment since String#strip! mutates receiver
|
102
112
|
# wrong
|
data/doc/docs.md
CHANGED
@@ -1,4 +1,20 @@
|
|
1
1
|
|
2
|
+
### AssertWithNil
|
3
|
+
|
4
|
+
Don't use assert_equal with nil as a first argument; use assert_nil instead
|
5
|
+
|
6
|
+
For example, rather than doing this:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
x = nil ; assert_equal(nil, x)
|
10
|
+
```
|
11
|
+
|
12
|
+
Instead, consider doing this:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
x = nil ; assert_nil(x)
|
16
|
+
```
|
17
|
+
|
2
18
|
### MapFollowedByFlatten
|
3
19
|
|
4
20
|
Don't use map followed by flatten; use flat_map instead
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pippi::Checks
|
2
|
+
|
3
|
+
class AssertWithNil < Check
|
4
|
+
|
5
|
+
module MyAssertEqual
|
6
|
+
def assert_equal(*args)
|
7
|
+
result = super
|
8
|
+
if args.size > 1 && args[0].object_id == 8
|
9
|
+
self.class._pippi_check_assert_with_nil.add_problem
|
10
|
+
end
|
11
|
+
result
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def decorate
|
16
|
+
if defined?(ActiveSupport::TestCase)
|
17
|
+
ActiveSupport::TestCase.class_exec(self) do |my_check|
|
18
|
+
@_pippi_check_assert_with_nil = my_check
|
19
|
+
def self._pippi_other_check_assert_with_nil
|
20
|
+
@_pippi_check_assert_with_nil
|
21
|
+
end
|
22
|
+
def self._pippi_check_assert_with_nil
|
23
|
+
self.ancestors.detect {|x| x == ActiveSupport::TestCase }._pippi_other_check_assert_with_nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
ActiveSupport::TestCase.prepend Pippi::Checks::AssertWithNil::MyAssertEqual
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Documentation
|
31
|
+
def description
|
32
|
+
"Don't use assert_equal with nil as a first argument; use assert_nil instead"
|
33
|
+
end
|
34
|
+
def sample
|
35
|
+
"x = nil ; assert_equal(nil, x)"
|
36
|
+
end
|
37
|
+
def instead_use
|
38
|
+
"x = nil ; assert_nil(x)"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/lib/pippi/tasks.rb
CHANGED
@@ -7,7 +7,8 @@ module Pippi
|
|
7
7
|
[Pippi::Checks::SelectFollowedBySize::Documentation,
|
8
8
|
Pippi::Checks::SelectFollowedByFirst::Documentation,
|
9
9
|
Pippi::Checks::ReverseFollowedByEach::Documentation,
|
10
|
-
Pippi::Checks::MapFollowedByFlatten::Documentation
|
10
|
+
Pippi::Checks::MapFollowedByFlatten::Documentation,
|
11
|
+
Pippi::Checks::AssertWithNil::Documentation,
|
11
12
|
].sort {|a,b| a.name <=> b.name }.each do |clz|
|
12
13
|
obj = clz.new
|
13
14
|
str << %Q{
|
data/lib/pippi/version.rb
CHANGED
data/lib/pippi.rb
CHANGED
@@ -12,4 +12,5 @@ require 'pippi/checks/map_followed_by_flatten'
|
|
12
12
|
require 'pippi/checks/reverse_followed_by_each'
|
13
13
|
require 'pippi/checks/select_followed_by_first'
|
14
14
|
require 'pippi/checks/select_followed_by_size'
|
15
|
+
require 'pippi/checks/assert_with_nil'
|
15
16
|
require 'pippi/checks/debug_check'
|
data/test/check_test.rb
CHANGED
@@ -4,12 +4,12 @@ class CheckTest < MiniTest::Test
|
|
4
4
|
|
5
5
|
CodeSample = Struct.new(:code_text, :eval_to_execute)
|
6
6
|
|
7
|
-
def assert_no_problems(str)
|
8
|
-
assert execute_pippi_on(foo_bar_code_sample(str)).empty?
|
7
|
+
def assert_no_problems(str, opts={})
|
8
|
+
assert execute_pippi_on(foo_bar_code_sample(str, opts[:subclass] || ""), opts).empty?
|
9
9
|
end
|
10
10
|
|
11
11
|
def assert_problems(str, opts={})
|
12
|
-
assert_equal opts[:count] || 1, execute_pippi_on(foo_bar_code_sample(str), opts).size
|
12
|
+
assert_equal opts[:count] || 1, execute_pippi_on(foo_bar_code_sample(str, opts[:subclass] || ""), opts).size
|
13
13
|
end
|
14
14
|
|
15
15
|
def output_file_name
|
@@ -20,8 +20,8 @@ class CheckTest < MiniTest::Test
|
|
20
20
|
@tmp_code_sample_file_name ||= Tempfile.new("pippi_codesample").path
|
21
21
|
end
|
22
22
|
|
23
|
-
def foo_bar_code_sample(code)
|
24
|
-
CodeSample.new.tap {|c| c.code_text = "class Foo ; def bar ; #{code} ; end ; end" ; c.eval_to_execute = "Foo.new.bar" }
|
23
|
+
def foo_bar_code_sample(code, subclass="")
|
24
|
+
CodeSample.new.tap {|c| c.code_text = "class Foo #{subclass.size > 0 ? "< #{subclass}" : ""}; def bar ; #{code} ; end ; end" ; c.eval_to_execute = "Foo.new.bar" }
|
25
25
|
end
|
26
26
|
|
27
27
|
def execute_pippi_on(code, opts={})
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class AssertWithNilTest < CheckTest
|
4
|
+
|
5
|
+
def test_canonical_case_is_found
|
6
|
+
assert_problems "x = 42 ; assert_equal(nil, x)", :include_rails_core_extensions => true, :subclass => "ActiveSupport::TestCase"
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_non_nil_first_arg_doesnt_flag
|
10
|
+
assert_no_problems "x = 42 ; assert_equal(42, x)", :include_rails_core_extensions => true, :subclass => "ActiveSupport::TestCase"
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_three_arg_is_flagged
|
14
|
+
assert_problems "x = 42 ; assert_equal(nil, x, 'whatevs')", :include_rails_core_extensions => true, :subclass => "ActiveSupport::TestCase"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pippi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Copeland
|
@@ -74,6 +74,7 @@ files:
|
|
74
74
|
- lib/pippi/auto_runner.rb
|
75
75
|
- lib/pippi/check_loader.rb
|
76
76
|
- lib/pippi/check_set_mapper.rb
|
77
|
+
- lib/pippi/checks/assert_with_nil.rb
|
77
78
|
- lib/pippi/checks/check.rb
|
78
79
|
- lib/pippi/checks/debug_check.rb
|
79
80
|
- lib/pippi/checks/map_followed_by_flatten.rb
|
@@ -91,6 +92,7 @@ files:
|
|
91
92
|
- test/check_test.rb
|
92
93
|
- test/rails_core_extensions.rb
|
93
94
|
- test/test_helper.rb
|
95
|
+
- test/unit/assert_with_nil_test.rb
|
94
96
|
- test/unit/map_followed_by_flatten_test.rb
|
95
97
|
- test/unit/problem_test.rb
|
96
98
|
- test/unit/report_test.rb
|
@@ -131,6 +133,7 @@ test_files:
|
|
131
133
|
- test/check_test.rb
|
132
134
|
- test/rails_core_extensions.rb
|
133
135
|
- test/test_helper.rb
|
136
|
+
- test/unit/assert_with_nil_test.rb
|
134
137
|
- test/unit/map_followed_by_flatten_test.rb
|
135
138
|
- test/unit/problem_test.rb
|
136
139
|
- test/unit/report_test.rb
|