rubycritic 1.1.1 → 1.2.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 +4 -4
- data/.rubocop.yml +593 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +7 -0
- data/CONTRIBUTING.md +17 -15
- data/README.md +15 -4
- data/Rakefile +9 -6
- data/bin/rubycritic +2 -2
- data/lib/rubycritic.rb +21 -1
- data/lib/rubycritic/analysers/churn.rb +4 -2
- data/lib/rubycritic/analysers/helpers/ast_node.rb +4 -8
- data/lib/rubycritic/analysers/helpers/methods_counter.rb +2 -5
- data/lib/rubycritic/analysers/helpers/modules_locator.rb +2 -5
- data/lib/rubycritic/analysers/helpers/parser.rb +12 -0
- data/lib/rubycritic/analysers/helpers/reek.rb +6 -2
- data/lib/rubycritic/analysers/smells/reek.rb +1 -1
- data/lib/rubycritic/analysers_runner.rb +13 -7
- data/lib/rubycritic/cli/application.rb +24 -0
- data/lib/rubycritic/cli/options.rb +57 -0
- data/lib/rubycritic/commands/ci.rb +28 -0
- data/lib/rubycritic/commands/default.rb +30 -0
- data/lib/rubycritic/commands/help.rb +13 -0
- data/lib/rubycritic/commands/version.rb +11 -0
- data/lib/rubycritic/configuration.rb +19 -14
- data/lib/rubycritic/core/analysed_module.rb +1 -1
- data/lib/rubycritic/core/smell.rb +1 -1
- data/lib/rubycritic/report_generators/base.rb +1 -1
- data/lib/rubycritic/report_generators/line.rb +1 -1
- data/lib/rubycritic/report_generators/smells_index.rb +1 -0
- data/lib/rubycritic/report_generators/templates/code_file.html.erb +1 -1
- data/lib/rubycritic/report_generators/templates/smells_index.html.erb +6 -2
- data/lib/rubycritic/report_generators/templates/smelly_line.html.erb +1 -1
- data/lib/rubycritic/report_generators/view_helpers.rb +4 -4
- data/lib/rubycritic/reporters/base.rb +1 -1
- data/lib/rubycritic/revision_comparator.rb +14 -14
- data/lib/rubycritic/source_control_systems/base.rb +9 -32
- data/lib/rubycritic/source_control_systems/double.rb +6 -7
- data/lib/rubycritic/source_control_systems/git.rb +10 -16
- data/lib/rubycritic/source_control_systems/mercurial.rb +29 -0
- data/lib/rubycritic/source_locator.rb +4 -5
- data/lib/rubycritic/version.rb +1 -1
- data/rubycritic.gemspec +4 -3
- data/test/lib/rubycritic/analysers/churn_test.rb +5 -5
- data/test/lib/rubycritic/analysers/smells/flay_test.rb +1 -1
- data/test/lib/rubycritic/configuration_test.rb +8 -7
- data/test/lib/rubycritic/core/analysed_module_test.rb +2 -2
- data/test/lib/rubycritic/core/smell_test.rb +2 -2
- data/test/lib/rubycritic/source_control_systems/{source_control_system_test.rb → base_test.rb} +1 -1
- data/test/lib/rubycritic/source_control_systems/double_test.rb +11 -0
- data/test/lib/rubycritic/source_control_systems/git_test.rb +13 -0
- data/test/lib/rubycritic/source_control_systems/interfaces/basic.rb +7 -0
- data/test/lib/rubycritic/source_control_systems/interfaces/time_travel.rb +7 -0
- data/test/lib/rubycritic/source_control_systems/mercurial_test.rb +11 -0
- data/test/lib/rubycritic/source_locator_test.rb +8 -2
- data/test/test_helper.rb +29 -0
- metadata +49 -13
- data/lib/rubycritic/cli.rb +0 -46
- data/lib/rubycritic/modules_initializer.rb +0 -14
- data/lib/rubycritic/orchestrator.rb +0 -23
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# 1.2.0 / 2014-12-27
|
2
|
+
|
3
|
+
* [FEATURE] Add CI mode that only analyses the last commit
|
4
|
+
* [FEATURE] Add partial support for Mercurial
|
5
|
+
* [FEATURE] Allow using Rubycritic programatically
|
6
|
+
* [CHANGE] Update to Reek 1.6.0 (from 1.3.8)
|
7
|
+
|
1
8
|
# 1.1.1 / 2014-07-29
|
2
9
|
|
3
10
|
* [BUGFIX] Analyse only the files whose paths are specified in the CLI
|
data/CONTRIBUTING.md
CHANGED
@@ -26,28 +26,30 @@ If you want to squash a bug or add a new feature, please:
|
|
26
26
|
Make exactly as many commits as you need.
|
27
27
|
Each commit should do one thing and one thing only. For example, all whitespace fixes should be relegated to a single commit.
|
28
28
|
|
29
|
-
7. Write descriptive commit messages
|
29
|
+
7. Write [descriptive commit messages].
|
30
30
|
|
31
|
-
8.
|
32
|
-
For a more in-depth look at interactive rebasing, be sure to check [how to rewrite history][4].
|
31
|
+
8. Push the branch to GitHub (`git push origin my-new-feature`).
|
33
32
|
|
34
|
-
9.
|
33
|
+
9. [Create a Pull Request] and send it to be merged with the master branch.
|
35
34
|
|
36
|
-
10.
|
35
|
+
10. After your code is reviewed, [hide the sausage making]. Squash, split and reorder commits if necessary (`git rebase -i`).
|
36
|
+
For a more in-depth look at interactive rebasing, be sure to check [how to rewrite history].
|
37
37
|
|
38
38
|
Improving the Documentation
|
39
39
|
---------------------------
|
40
40
|
|
41
|
-
You are welcome to clarify how something works or simply fix a typo. Please include `[ci skip]` on a new line in each of your commit messages. This will signal [Travis]
|
41
|
+
You are welcome to clarify how something works or simply fix a typo. Please include `[ci skip]` on a new line in each of your commit messages. This will signal [Travis] that running the test suite is not necessary for these changes.
|
42
42
|
|
43
43
|
Reporting a Bug
|
44
44
|
---------------
|
45
45
|
|
46
46
|
If you are experiencing unexpected behavior and, after having read Rubycritic's documentation, are convinced this behavior is a bug, please:
|
47
47
|
|
48
|
-
1. Search the [issues tracker]
|
48
|
+
1. Search the [issues tracker] to see if it was already reported / fixed.
|
49
49
|
|
50
|
-
2.
|
50
|
+
2. [Create a new issue].
|
51
|
+
|
52
|
+
3. Include the Ruby and RubyCritic versions in your report. Here's a little table to help you out:
|
51
53
|
|
52
54
|
```
|
53
55
|
| | Version |
|
@@ -58,11 +60,11 @@ If you are experiencing unexpected behavior and, after having read Rubycritic's
|
|
58
60
|
|
59
61
|
The more information you provide, the easier it will be to track down the issue and fix it.
|
60
62
|
|
61
|
-
3. Create a new issue.
|
62
63
|
|
63
|
-
[
|
64
|
-
[
|
65
|
-
[
|
66
|
-
[
|
67
|
-
[
|
68
|
-
[
|
64
|
+
[descriptive commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
65
|
+
[Create a pull request]: https://help.github.com/articles/creating-a-pull-request
|
66
|
+
[hide the sausage making]: http://sethrobertson.github.io/GitBestPractices/#sausage
|
67
|
+
[how to rewrite history]: http://git-scm.com/book/en/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages
|
68
|
+
[Travis]: https://travis-ci.org
|
69
|
+
[issues tracker]: https://github.com/whitesmith/rubycritic/search?type=Issues
|
70
|
+
[Create a new issue]: https://github.com/whitesmith/rubycritic/issues/new
|
data/README.md
CHANGED
@@ -86,10 +86,11 @@ For a full list of the command-line options run:
|
|
86
86
|
$ rubycritic --help
|
87
87
|
```
|
88
88
|
|
89
|
-
| Command flag | Description
|
90
|
-
|
91
|
-
| `-v/--version` | Displays the current version and exits
|
92
|
-
| `-p/--path` |
|
89
|
+
| Command flag | Description |
|
90
|
+
|--------------------------|-------------------------------------------------------|
|
91
|
+
| `-v/--version` | Displays the current version and exits |
|
92
|
+
| `-p/--path` | Sets the output directory (tmp/rubycritic by default) |
|
93
|
+
| `-m/--mode-ci` | Uses CI mode (faster, but only analyses last commit) |
|
93
94
|
|
94
95
|
Alternative Usage Methods
|
95
96
|
-------------------------
|
@@ -109,6 +110,13 @@ Similarly, Pull Requests that improve the look and feel of the gem, that tweak t
|
|
109
110
|
|
110
111
|
See RubyCritic's [contributing guidelines](CONTRIBUTING.md) about how to proceed.
|
111
112
|
|
113
|
+
Credits
|
114
|
+
-------
|
115
|
+
|
116
|
+

|
117
|
+
|
118
|
+
RubyCritic is maintained and funded by [Whitesmith][9]. Tweet your questions or suggestions to [@glitchdout][10] or [@Whitesmithco][11].
|
119
|
+
|
112
120
|
[1]: https://github.com/troessner/reek
|
113
121
|
[2]: https://github.com/seattlerb/flay
|
114
122
|
[3]: https://github.com/seattlerb/flog
|
@@ -117,3 +125,6 @@ See RubyCritic's [contributing guidelines](CONTRIBUTING.md) about how to proceed
|
|
117
125
|
[6]: https://github.com/whitesmith/rubycritic/wiki/Building-your-own-Code-Climate
|
118
126
|
[7]: https://github.com/charliesome/better_errors
|
119
127
|
[8]: https://github.com/charliesome/better_errors/pull/22
|
128
|
+
[9]: http://www.whitesmith.co/
|
129
|
+
[10]: https://twitter.com/glitchdout
|
130
|
+
[11]: https://twitter.com/Whitesmithco
|
data/Rakefile
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/testtask"
|
3
|
+
require "rubocop/rake_task"
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
t.libs.push "test"
|
9
|
-
t.pattern = "test/**/*_test.rb"
|
5
|
+
Rake::TestTask.new do |task|
|
6
|
+
task.libs.push "lib"
|
7
|
+
task.libs.push "test"
|
8
|
+
task.pattern = "test/**/*_test.rb"
|
10
9
|
end
|
10
|
+
|
11
|
+
RuboCop::RakeTask.new
|
12
|
+
|
13
|
+
task :default => [:test, :rubocop]
|
data/bin/rubycritic
CHANGED
data/lib/rubycritic.rb
CHANGED
@@ -1,2 +1,22 @@
|
|
1
1
|
require "rubycritic/configuration"
|
2
|
-
|
2
|
+
|
3
|
+
module Rubycritic
|
4
|
+
def self.create(options = {})
|
5
|
+
options_hash = options.to_h
|
6
|
+
Config.set(options_hash)
|
7
|
+
case Config.mode
|
8
|
+
when :version
|
9
|
+
require "rubycritic/commands/version"
|
10
|
+
Command::Version.new
|
11
|
+
when :help
|
12
|
+
require "rubycritic/commands/help"
|
13
|
+
Command::Help.new(options)
|
14
|
+
when :ci
|
15
|
+
require "rubycritic/commands/ci"
|
16
|
+
Command::Ci.new(options_hash)
|
17
|
+
else
|
18
|
+
require "rubycritic/commands/default"
|
19
|
+
Command::Default.new(options_hash)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -2,9 +2,11 @@ module Rubycritic
|
|
2
2
|
module Analyser
|
3
3
|
|
4
4
|
class Churn
|
5
|
-
|
5
|
+
attr_writer :source_control_system
|
6
|
+
|
7
|
+
def initialize(analysed_modules)
|
6
8
|
@analysed_modules = analysed_modules
|
7
|
-
@source_control_system = source_control_system
|
9
|
+
@source_control_system = Config.source_control_system
|
8
10
|
end
|
9
11
|
|
10
12
|
def run
|
@@ -23,9 +23,9 @@ module Parser
|
|
23
23
|
def get_module_names
|
24
24
|
children_modules = children
|
25
25
|
.select { |child| child.is_a?(Parser::AST::Node) }
|
26
|
-
.flat_map
|
26
|
+
.flat_map(&:get_module_names)
|
27
27
|
|
28
|
-
if MODULE_TYPES.include?(
|
28
|
+
if MODULE_TYPES.include?(type)
|
29
29
|
if children_modules.empty?
|
30
30
|
[module_name]
|
31
31
|
else
|
@@ -33,8 +33,6 @@ module Parser
|
|
33
33
|
"#{module_name}::#{children_module}"
|
34
34
|
end
|
35
35
|
end
|
36
|
-
elsif children_modules.empty?
|
37
|
-
[]
|
38
36
|
else
|
39
37
|
children_modules
|
40
38
|
end
|
@@ -45,22 +43,20 @@ module Parser
|
|
45
43
|
def module_name
|
46
44
|
name_segments = []
|
47
45
|
current_node = children[0]
|
48
|
-
while
|
46
|
+
while current_node
|
49
47
|
name_segments.unshift(current_node.children[1])
|
50
48
|
current_node = current_node.children[0]
|
51
49
|
end
|
52
50
|
name_segments.join("::")
|
53
51
|
end
|
54
52
|
end
|
55
|
-
|
56
53
|
end
|
57
54
|
end
|
58
55
|
|
59
56
|
module Rubycritic
|
60
57
|
module AST
|
61
|
-
|
62
58
|
class EmptyNode
|
63
|
-
def count_nodes_of_type(*
|
59
|
+
def count_nodes_of_type(*)
|
64
60
|
0
|
65
61
|
end
|
66
62
|
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require "parser
|
2
|
-
require "rubycritic/analysers/helpers/ast_node"
|
1
|
+
require "rubycritic/analysers/helpers/parser"
|
3
2
|
|
4
3
|
module Rubycritic
|
5
4
|
|
@@ -15,9 +14,7 @@ module Rubycritic
|
|
15
14
|
private
|
16
15
|
|
17
16
|
def node
|
18
|
-
Parser
|
19
|
-
rescue Parser::SyntaxError => error
|
20
|
-
AST::EmptyNode.new
|
17
|
+
Parser.parse(content)
|
21
18
|
end
|
22
19
|
|
23
20
|
def content
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require "parser
|
2
|
-
require "rubycritic/analysers/helpers/ast_node"
|
1
|
+
require "rubycritic/analysers/helpers/parser"
|
3
2
|
|
4
3
|
module Rubycritic
|
5
4
|
|
@@ -25,9 +24,7 @@ module Rubycritic
|
|
25
24
|
private
|
26
25
|
|
27
26
|
def node
|
28
|
-
Parser
|
29
|
-
rescue Parser::SyntaxError => error
|
30
|
-
AST::EmptyNode.new
|
27
|
+
Parser.parse(content)
|
31
28
|
end
|
32
29
|
|
33
30
|
def content
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "parser/current"
|
2
|
+
require "rubycritic/analysers/helpers/ast_node"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
module Parser
|
6
|
+
def self.parse(content)
|
7
|
+
::Parser::CurrentRuby.parse(content) || AST::EmptyNode.new
|
8
|
+
rescue ::Parser::SyntaxError
|
9
|
+
AST::EmptyNode.new
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require "reek"
|
2
|
+
require "reek/configuration/app_configuration"
|
3
|
+
require "ostruct"
|
2
4
|
|
3
5
|
module Rubycritic
|
4
6
|
|
5
7
|
class Reek < ::Reek::Examiner
|
6
|
-
|
8
|
+
DEFAULT_CONFIG_FILE = File.expand_path("../config.reek", __FILE__)
|
7
9
|
|
8
10
|
def initialize(paths)
|
9
|
-
|
11
|
+
config = OpenStruct.new(:options => OpenStruct.new(:config_file => DEFAULT_CONFIG_FILE))
|
12
|
+
::Reek::Configuration::AppConfiguration.initialize_with(config)
|
13
|
+
super(Array(paths))
|
10
14
|
end
|
11
15
|
end
|
12
16
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "rubycritic/source_locator"
|
2
|
+
require "rubycritic/core/analysed_module"
|
1
3
|
require "rubycritic/analysers/smells/flay"
|
2
4
|
require "rubycritic/analysers/smells/flog"
|
3
5
|
require "rubycritic/analysers/smells/reek"
|
@@ -13,19 +15,23 @@ module Rubycritic
|
|
13
15
|
Analyser::FlogSmells,
|
14
16
|
Analyser::ReekSmells,
|
15
17
|
Analyser::Complexity,
|
16
|
-
Analyser::Attributes
|
18
|
+
Analyser::Attributes,
|
19
|
+
Analyser::Churn
|
17
20
|
]
|
18
21
|
|
19
|
-
def initialize(
|
20
|
-
@
|
21
|
-
@source_control_system = source_control_system
|
22
|
+
def initialize(paths)
|
23
|
+
@paths = paths
|
22
24
|
end
|
23
25
|
|
24
26
|
def run
|
25
|
-
ANALYSERS.each
|
26
|
-
|
27
|
+
ANALYSERS.each { |analyser| analyser.new(analysed_modules).run }
|
28
|
+
analysed_modules
|
29
|
+
end
|
30
|
+
|
31
|
+
def analysed_modules
|
32
|
+
@analysed_modules ||= SourceLocator.new(@paths).pathnames.map do |pathname|
|
33
|
+
AnalysedModule.new(:pathname => pathname)
|
27
34
|
end
|
28
|
-
Analyser::Churn.new(@analysed_modules, @source_control_system).run
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rubycritic"
|
2
|
+
require "rubycritic/cli/options"
|
3
|
+
|
4
|
+
module Rubycritic
|
5
|
+
module Cli
|
6
|
+
class Application
|
7
|
+
STATUS_SUCCESS = 0
|
8
|
+
STATUS_ERROR = 1
|
9
|
+
|
10
|
+
def initialize(argv)
|
11
|
+
@options = Options.new(argv)
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
parsed_options = @options.parse
|
16
|
+
::Rubycritic.create(parsed_options).execute
|
17
|
+
STATUS_SUCCESS
|
18
|
+
rescue OptionParser::InvalidOption => error
|
19
|
+
$stderr.puts "Error: #{error}"
|
20
|
+
STATUS_ERROR
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
module Rubycritic
|
4
|
+
module Cli
|
5
|
+
class Options
|
6
|
+
def initialize(argv)
|
7
|
+
@argv = argv
|
8
|
+
@parser = OptionParser.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse
|
12
|
+
@parser.new do |opts|
|
13
|
+
opts.banner = "Usage: rubycritic [options] [paths]"
|
14
|
+
|
15
|
+
opts.on("-p", "--path [PATH]", "Set path where report will be saved (tmp/rubycritic by default)") do |path|
|
16
|
+
@root = path
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("-m", "--mode-ci", "Use CI mode (faster, but only analyses last commit)") do
|
20
|
+
@mode = :ci
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on_tail("-v", "--version", "Show gem's version") do
|
24
|
+
@mode = :version
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
28
|
+
@mode = :help
|
29
|
+
end
|
30
|
+
end.parse!(@argv)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def help_text
|
35
|
+
@parser.help
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_h
|
39
|
+
{
|
40
|
+
:mode => @mode,
|
41
|
+
:root => @root,
|
42
|
+
:paths => paths
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def paths
|
49
|
+
if @argv.empty?
|
50
|
+
["."]
|
51
|
+
else
|
52
|
+
@argv
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "rubycritic/source_control_systems/base"
|
2
|
+
require "rubycritic/analysers_runner"
|
3
|
+
require "rubycritic/reporters/main"
|
4
|
+
|
5
|
+
module Rubycritic
|
6
|
+
module Command
|
7
|
+
class Ci
|
8
|
+
def initialize(options)
|
9
|
+
@paths = options[:paths]
|
10
|
+
Config.source_control_system = SourceControlSystem::Base.create
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
critique(@paths)
|
15
|
+
report
|
16
|
+
end
|
17
|
+
|
18
|
+
def critique(paths)
|
19
|
+
@analysed_modules = AnalysersRunner.new(paths).run
|
20
|
+
end
|
21
|
+
|
22
|
+
def report
|
23
|
+
report_location = Reporter::Main.new(@analysed_modules).generate_report
|
24
|
+
puts "New critique at #{report_location}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|