rubycritic 3.4.0 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -2
  3. data/README.md +12 -10
  4. data/lib/rubycritic/cli/options.rb +25 -3
  5. data/lib/rubycritic/command_factory.rb +3 -0
  6. data/lib/rubycritic/commands/ci.rb +2 -8
  7. data/lib/rubycritic/commands/compare.rb +105 -0
  8. data/lib/rubycritic/commands/utils/build_number_file.rb +35 -0
  9. data/lib/rubycritic/configuration.rb +18 -1
  10. data/lib/rubycritic/core/analysed_modules_collection.rb +23 -3
  11. data/lib/rubycritic/generators/html/assets/stylesheets/application.css +20 -0
  12. data/lib/rubycritic/generators/html/base.rb +1 -1
  13. data/lib/rubycritic/generators/html/code_file.rb +11 -0
  14. data/lib/rubycritic/generators/html/code_index.rb +7 -0
  15. data/lib/rubycritic/generators/html/overview.rb +7 -0
  16. data/lib/rubycritic/generators/html/smells_index.rb +7 -0
  17. data/lib/rubycritic/generators/html/templates/code_index.html.erb +10 -0
  18. data/lib/rubycritic/generators/html/templates/layouts/application.html.erb +7 -0
  19. data/lib/rubycritic/generators/html/view_helpers.rb +10 -1
  20. data/lib/rubycritic/source_control_systems/git.rb +27 -1
  21. data/lib/rubycritic/version.rb +1 -1
  22. metadata +7 -131
  23. data/.gitignore +0 -23
  24. data/.rubocop.yml +0 -37
  25. data/.rubocop_todo.yml +0 -45
  26. data/.todo.reek +0 -142
  27. data/.travis.yml +0 -29
  28. data/.yardopts +0 -5
  29. data/docs/building-own-code-climate.md +0 -156
  30. data/docs/core-metrics.md +0 -72
  31. data/docs/jenkins-pr-reviews.md +0 -64
  32. data/features/command_line_interface/minimum_score.feature +0 -39
  33. data/features/command_line_interface/options.feature +0 -37
  34. data/features/rake_task.feature +0 -65
  35. data/features/step_definitions/rake_task_steps.rb +0 -5
  36. data/features/step_definitions/rubycritic_steps.rb +0 -33
  37. data/features/step_definitions/sample_file_steps.rb +0 -32
  38. data/features/support/env.rb +0 -43
  39. data/images/churn-vs-complexity.png +0 -0
  40. data/images/code.png +0 -0
  41. data/images/logo.png +0 -0
  42. data/images/overview.png +0 -0
  43. data/images/rating.png +0 -0
  44. data/images/reek.png +0 -0
  45. data/images/smell-details.png +0 -0
  46. data/images/smells.png +0 -0
  47. data/images/whitesmith.png +0 -0
  48. data/rubycritic.gemspec +0 -45
  49. data/test/analysers_test_helper.rb +0 -12
  50. data/test/lib/rubycritic/analysers/churn_test.rb +0 -35
  51. data/test/lib/rubycritic/analysers/complexity_test.rb +0 -18
  52. data/test/lib/rubycritic/analysers/helpers/methods_counter_test.rb +0 -31
  53. data/test/lib/rubycritic/analysers/helpers/modules_locator_test.rb +0 -55
  54. data/test/lib/rubycritic/analysers/smells/flay_test.rb +0 -41
  55. data/test/lib/rubycritic/analysers/smells/flog_test.rb +0 -28
  56. data/test/lib/rubycritic/analysers/smells/reek_test.rb +0 -32
  57. data/test/lib/rubycritic/analysis_summary_test.rb +0 -30
  58. data/test/lib/rubycritic/browser_test.rb +0 -18
  59. data/test/lib/rubycritic/commands/status_reporter_test.rb +0 -81
  60. data/test/lib/rubycritic/configuration_test.rb +0 -31
  61. data/test/lib/rubycritic/core/analysed_module_test.rb +0 -90
  62. data/test/lib/rubycritic/core/analysed_modules_collection_test.rb +0 -111
  63. data/test/lib/rubycritic/core/location_test.rb +0 -39
  64. data/test/lib/rubycritic/core/smell_test.rb +0 -105
  65. data/test/lib/rubycritic/core/smells_array_test.rb +0 -30
  66. data/test/lib/rubycritic/generators/console_report_test.rb +0 -83
  67. data/test/lib/rubycritic/generators/json_report_test.rb +0 -38
  68. data/test/lib/rubycritic/generators/lint_report_test.rb +0 -37
  69. data/test/lib/rubycritic/generators/turbulence_test.rb +0 -19
  70. data/test/lib/rubycritic/generators/view_helpers_test.rb +0 -85
  71. data/test/lib/rubycritic/revision_comparator_test.rb +0 -66
  72. data/test/lib/rubycritic/smells_status_setter_test.rb +0 -24
  73. data/test/lib/rubycritic/source_control_systems/base_test.rb +0 -31
  74. data/test/lib/rubycritic/source_control_systems/double_test.rb +0 -13
  75. data/test/lib/rubycritic/source_control_systems/git_test.rb +0 -15
  76. data/test/lib/rubycritic/source_control_systems/interfaces/basic.rb +0 -9
  77. data/test/lib/rubycritic/source_control_systems/interfaces/time_travel.rb +0 -9
  78. data/test/lib/rubycritic/source_control_systems/mercurial_test.rb +0 -13
  79. data/test/lib/rubycritic/source_control_systems/perforce_test.rb +0 -176
  80. data/test/lib/rubycritic/source_locator_test.rb +0 -80
  81. data/test/lib/rubycritic/version_test.rb +0 -10
  82. data/test/samples/empty.rb +0 -0
  83. data/test/samples/flay/smelly.rb +0 -8
  84. data/test/samples/flay/smelly2.rb +0 -8
  85. data/test/samples/flog/complex.rb +0 -11
  86. data/test/samples/flog/smelly.rb +0 -11
  87. data/test/samples/location/dir1/file1.rb +0 -0
  88. data/test/samples/location/file0.rb +0 -0
  89. data/test/samples/location/file0_symlink.rb +0 -1
  90. data/test/samples/location/file_with_different_extension.py +0 -0
  91. data/test/samples/location/file_with_no_extension +0 -0
  92. data/test/samples/methods_count.rb +0 -7
  93. data/test/samples/module_names.rb +0 -18
  94. data/test/samples/no_methods.rb +0 -4
  95. data/test/samples/reek/not_smelly.rb +0 -35
  96. data/test/samples/reek/smelly.rb +0 -17
  97. data/test/samples/unparsable.rb +0 -1
  98. data/test/test_helper.rb +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 65dd42190e2ce5eb0a6067eaf3a9c158eec42c89
4
- data.tar.gz: 8e2633b8d064349f4f412dad2a4993c8def5a6c1
3
+ metadata.gz: 6299ec37fabeb3fb630a70326b39377eee3aa4c4
4
+ data.tar.gz: c82518cf3a9c6120e109399fb967ede60a38b7bf
5
5
  SHA512:
6
- metadata.gz: 6ed0426b235e89803c2930852b3a88f49176d049526c64d36be0e4d3ec1708f049c672d51030bfb43c32e0f6476d41da9dad4c72e8964e5821ac2647dee8f4c5
7
- data.tar.gz: 266453f2ae7cadbb4373adddaf33d15bde1bac2d46aeb3b26c71a519d72ccc1e6ddc74e7ec501db1ceb3c6587083e70184642d066d2a44f7ce445c4cee1718d0
6
+ metadata.gz: e9df974efb0abbf35414284b494b4295a8b927d8c5d7c7a688dcb22666dfb7b2d2b183fa0621f1b50a70fe82f5e9376f7d5c5b3022305ce850fdfbd100b5d730
7
+ data.tar.gz: e57225932ea86556058a25b9f06fe6068457edd1d127abdbdbda126d040dc62a8964eb4bc6abcda4f4b39ba43aa7626078ba81d8cd6e7ff966e4ec10be72a8cc
@@ -1,6 +1,12 @@
1
- # master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v3.4.0...master)
1
+ # master [(unreleased)](https://github.com/whitesmith/rubycritic/compare/v3.5.0...master)
2
2
 
3
- *
3
+ # 3.5.0 / 2018-09-03 [(commits)](https://github.com/whitesmith/rubycritic/compare/v3.4.0...v3.5.0)
4
+
5
+ * [CHANGE] Add ability to compare only the modified files between two branches. Refactored option `--mode-ci`, added `--branch` and `--maximum-decrease` (by [@HemanthMudalaiah][])
6
+ * [CHANGE] Optimized all images (by [@SuperSandro2000][])
7
+ * [BUGFIX] Fixed opening report in chrome on windows (by [@SuperSandro2000][])
8
+ * [BUGFIX] Fixed churn on windows (by [@SuperSandro2000][])
9
+ * [BUGFIX] Fixed gem not installing under restricted windows environments (by [@onumis][])
4
10
 
5
11
  # 3.4.0 / 2018-03-22 [(commits)](https://github.com/whitesmith/rubycritic/compare/v3.3.0...v3.4.0)
6
12
 
@@ -236,3 +242,5 @@
236
242
  [@nightscape]: https://github.com/nightscape
237
243
  [@nbekirov]: https://github.com/nbekirov
238
244
  [@joshrpowell]: https://github.com/joshrpowell
245
+ [@HemanthMudalaiah]: https://github.com/HemanthMudalaiah
246
+ [@SuperSandro2000]: https://github.com/SuperSandro2000
data/README.md CHANGED
@@ -112,16 +112,18 @@ For a full list of the command-line options run:
112
112
  $ rubycritic --help
113
113
  ```
114
114
 
115
- | Command flag | Description |
116
- |--------------------------|-------------------------------------------------------|
117
- | `-v` / `--version` | Displays the current version and exits |
118
- | `-p` / `--path` | Set path where report will be saved (tmp/rubycritic by default) |
119
- | `-f` / `--format` | Report smells in the given format: `html` (default; will open in a browser), `json`, `console`. |
120
- | `-s` / `--minimum-score` | Set a minimum score (FLOAT: ex: 96.28) |
121
- | `--mode-ci` | Use CI mode (faster, but only analyses last commit) |
122
- | `--deduplicate-symlinks` | De-duplicate symlinks based on their final target |
123
- | `--suppress-ratings` | Suppress letter ratings |
124
- | `--no-browser` | Do not open html report with browser |
115
+ | Command flag | Description |
116
+ |-----------------------------|------------------------------------------------------------------------------------------------|
117
+ | `-v` / `--version` | Displays the current version and exits |
118
+ | `-p` / `--path` | Set path where report will be saved (tmp/rubycritic by default) |
119
+ | `-f` / `--format` | Report smells in the given format: `html` (default; will open in a browser), `json`, `console` |
120
+ | `-s` / `--minimum-score` | Set a minimum score (FLOAT: ex: 96.28), default: 0 |
121
+ | `-m` / `--mode-ci` | Use CI mode. Faster, analyses diffs w.r.t base_branch (default: master), see -b |
122
+ | `-b` / `--branch` | Set branch to compare |
123
+ | `-t` / `--maximum-decrease` | Set a threshold for score difference between two branches (works only with -b), default: 0 |
124
+ | `--deduplicate-symlinks` | De-duplicate symlinks based on their final target |
125
+ | `--suppress-ratings` | Suppress letter ratings |
126
+ | `--no-browser` | Do not open html report with browser |
125
127
 
126
128
 
127
129
  ### Analyzer Configuration
@@ -20,6 +20,17 @@ module RubyCritic
20
20
  @root = path
21
21
  end
22
22
 
23
+ opts.on('-b', '--branch BRANCH', 'Set branch to compare') do |branch|
24
+ self.base_branch = String(branch)
25
+ set_current_branch
26
+ self.mode = :compare_branches
27
+ end
28
+
29
+ opts.on('-t', '--maximum-decrease [MAX_DECREASE]',
30
+ 'Set a threshold for score difference between two branches (works only with -b)') do |threshold_score|
31
+ self.threshold_score = Integer(threshold_score)
32
+ end
33
+
23
34
  opts.on(
24
35
  '-f', '--format [FORMAT]',
25
36
  %i[html json console lint],
@@ -36,7 +47,10 @@ module RubyCritic
36
47
  self.minimum_score = Float(min_score)
37
48
  end
38
49
 
39
- opts.on('-m', '--mode-ci', 'Use CI mode (faster, but only analyses last commit)') do
50
+ opts.on('-m', '--mode-ci [BASE_BRANCH]',
51
+ 'Use CI mode (faster, analyses diffs w.r.t base_branch (default: master))') do |branch|
52
+ self.base_branch = branch || 'master'
53
+ set_current_branch
40
54
  self.mode = :ci
41
55
  end
42
56
 
@@ -73,7 +87,10 @@ module RubyCritic
73
87
  suppress_ratings: suppress_ratings,
74
88
  help_text: parser.help,
75
89
  minimum_score: minimum_score || 0,
76
- no_browser: no_browser
90
+ no_browser: no_browser,
91
+ base_branch: base_branch,
92
+ feature_branch: feature_branch,
93
+ threshold_score: threshold_score || 0
77
94
  }
78
95
  end
79
96
  # rubocop:enable Metrics/MethodLength
@@ -81,7 +98,8 @@ module RubyCritic
81
98
  private
82
99
 
83
100
  attr_accessor :mode, :root, :format, :deduplicate_symlinks,
84
- :suppress_ratings, :minimum_score, :no_browser, :parser
101
+ :suppress_ratings, :minimum_score, :no_browser,
102
+ :parser, :base_branch, :feature_branch, :threshold_score
85
103
  def paths
86
104
  if @argv.empty?
87
105
  ['.']
@@ -89,6 +107,10 @@ module RubyCritic
89
107
  @argv
90
108
  end
91
109
  end
110
+
111
+ def set_current_branch
112
+ self.feature_branch = SourceControlSystem::Git.current_branch
113
+ end
92
114
  end
93
115
  end
94
116
  end
@@ -20,6 +20,9 @@ module RubyCritic
20
20
  when :ci
21
21
  require 'rubycritic/commands/ci'
22
22
  Command::Ci
23
+ when :compare_branches
24
+ require 'rubycritic/commands/compare'
25
+ Command::Compare
23
26
  else
24
27
  require 'rubycritic/commands/default'
25
28
  Command::Default
@@ -4,17 +4,11 @@ require 'rubycritic/source_control_systems/base'
4
4
  require 'rubycritic/analysers_runner'
5
5
  require 'rubycritic/reporter'
6
6
  require 'rubycritic/commands/default'
7
+ require 'rubycritic/commands/compare'
7
8
 
8
9
  module RubyCritic
9
10
  module Command
10
- class Ci < Default
11
- def critique
12
- AnalysersRunner.new(paths).run
13
- end
14
-
15
- private
16
-
17
- attr_reader :paths
11
+ class Ci < Compare
18
12
  end
19
13
  end
20
14
  end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubycritic/source_control_systems/base'
4
+ require 'rubycritic/analysers_runner'
5
+ require 'rubycritic/revision_comparator'
6
+ require 'rubycritic/reporter'
7
+ require 'rubycritic/commands/base'
8
+ require 'rubycritic/commands/default'
9
+ require 'rubycritic/commands/utils/build_number_file'
10
+
11
+ module RubyCritic
12
+ module Command
13
+ class Compare < Default
14
+ def initialize(options)
15
+ super
16
+ @build_number = 0
17
+ end
18
+
19
+ def execute
20
+ compare_branches
21
+ status_reporter.score = Config.feature_branch_score
22
+ status_reporter
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :paths, :status_reporter
28
+
29
+ def compare_branches
30
+ @build_number = Utils::BuildNumberFile.new.update_build_number
31
+ set_root_paths
32
+ original_no_browser_config = Config.no_browser
33
+ Config.no_browser = true
34
+ analyse_branch(:base_branch)
35
+ analyse_branch(:feature_branch)
36
+ Config.no_browser = original_no_browser_config
37
+ analyse_modified_files
38
+ compare_code_quality
39
+ end
40
+
41
+ def set_root_paths
42
+ Config.base_root_directory = Pathname.new(branch_directory(:base_branch))
43
+ Config.feature_root_directory = Pathname.new(branch_directory(:feature_branch))
44
+ Config.compare_root_directory = Pathname.new("#{Config.root}/compare")
45
+ end
46
+
47
+ # switch branch and analyse files
48
+ def analyse_branch(branch)
49
+ SourceControlSystem::Git.switch_branch(Config.send(branch))
50
+ critic = critique(branch)
51
+ Config.send(:"#{branch}_score=", critic.score)
52
+ Config.root = branch_directory(branch)
53
+ report(critic)
54
+ end
55
+
56
+ # generate report only for modified files
57
+ def analyse_modified_files
58
+ modified_files = Config.feature_branch_collection.where(SourceControlSystem::Git.modified_files)
59
+ analysed_modules = AnalysedModulesCollection.new(modified_files.map(&:path), modified_files)
60
+ Config.root = "#{Config.root}/compare"
61
+ report(analysed_modules)
62
+ end
63
+
64
+ def compare_code_quality
65
+ build_details
66
+ compare_threshold
67
+ end
68
+
69
+ # mark build as failed if the diff b/w the score of
70
+ # two branches is greater than threshold value
71
+ def compare_threshold
72
+ return unless mark_build_fail?
73
+ print("Threshold: #{Config.threshold_score}\n")
74
+ print("Difference: #{(Config.base_branch_score - Config.feature_branch_score).abs}\n")
75
+ abort('The score difference between the two branches is over the threshold.')
76
+ end
77
+
78
+ def mark_build_fail?
79
+ Config.threshold_score > 0 && threshold_reached?
80
+ end
81
+
82
+ def threshold_reached?
83
+ (Config.base_branch_score - Config.feature_branch_score) > Config.threshold_score
84
+ end
85
+
86
+ def branch_directory(branch)
87
+ "#{Config.root}/compare/#{Config.send(branch)}"
88
+ end
89
+
90
+ # create a txt file with the branch score details
91
+ def build_details
92
+ details = "Base branch (#{Config.base_branch}) score: #{Config.base_branch_score} \n"\
93
+ "Feature branch (#{Config.feature_branch}) score: #{Config.feature_branch_score} \n"
94
+ File.open("#{Config.compare_root_directory}/build_details.txt", 'w') { |file| file.write(details) }
95
+ end
96
+
97
+ # store the analysed moduled collection based on the branch
98
+ def critique(branch)
99
+ module_collection = AnalysersRunner.new(paths).run
100
+ Config.send(:"#{branch}_collection=", module_collection)
101
+ RevisionComparator.new(paths).set_statuses(module_collection)
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,35 @@
1
+ module RubyCritic
2
+ module Command
3
+ module Utils
4
+ class BuildNumberFile
5
+ attr_reader :file, :build_number
6
+
7
+ def initialize
8
+ open_build_number_file
9
+ end
10
+
11
+ # keep track of the number of builds and
12
+ # use this build number to create separate directory for each build
13
+ def update_build_number
14
+ @build_number = file.read.to_i + 1
15
+ write_build_number
16
+ build_number
17
+ end
18
+
19
+ def write_build_number
20
+ file.rewind
21
+ file.write(build_number)
22
+ file.close
23
+ end
24
+
25
+ def open_build_number_file
26
+ root = Config.root
27
+ FileUtils.mkdir_p(root) unless File.directory?(root)
28
+ location = "#{root}/build_number.txt"
29
+ File.new(location, 'a') unless File.exist?(location)
30
+ @file = File.open(location, 'r+')
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -6,7 +6,11 @@ module RubyCritic
6
6
  class Configuration
7
7
  attr_reader :root
8
8
  attr_accessor :source_control_system, :mode, :format, :deduplicate_symlinks,
9
- :suppress_ratings, :open_with, :no_browser
9
+ :suppress_ratings, :open_with, :no_browser, :base_branch,
10
+ :feature_branch, :base_branch_score, :feature_branch_score,
11
+ :base_root_directory, :feature_root_directory,
12
+ :compare_root_directory, :threshold_score, :base_branch_collection,
13
+ :feature_branch_collection
10
14
 
11
15
  def set(options)
12
16
  self.mode = options[:mode] || :default
@@ -16,6 +20,9 @@ module RubyCritic
16
20
  self.suppress_ratings = options[:suppress_ratings] || false
17
21
  self.open_with = options[:open_with]
18
22
  self.no_browser = options[:no_browser]
23
+ self.base_branch = options[:base_branch]
24
+ self.feature_branch = options[:feature_branch]
25
+ self.threshold_score = options[:threshold_score]
19
26
  end
20
27
 
21
28
  def root=(path)
@@ -37,6 +44,16 @@ module RubyCritic
37
44
  configuration.set(options)
38
45
  end
39
46
 
47
+ def self.compare_branches_mode?
48
+ mode = Config.mode
49
+ mode == :compare_branches || mode == :ci
50
+ end
51
+
52
+ def self.build_mode?
53
+ mode = Config.mode
54
+ (mode == :compare_branches || mode == :ci) && !Config.no_browser
55
+ end
56
+
40
57
  def self.method_missing(method, *args, &block)
41
58
  configuration.public_send(method, *args, &block)
42
59
  end
@@ -17,9 +17,14 @@ module RubyCritic
17
17
  ZERO_SCORE_COST = 16.0
18
18
  COST_MULTIPLIER = MAX_SCORE / ZERO_SCORE_COST
19
19
 
20
- def initialize(paths)
20
+ def initialize(paths, modules = nil)
21
21
  @modules = SourceLocator.new(paths).pathnames.map do |pathname|
22
- AnalysedModule.new(pathname: pathname)
22
+ if modules
23
+ analysed_module = modules.find { |mod| mod.pathname == pathname }
24
+ build_analysed_module(analysed_module)
25
+ else
26
+ AnalysedModule.new(pathname: pathname)
27
+ end
23
28
  end
24
29
  end
25
30
 
@@ -27,13 +32,21 @@ module RubyCritic
27
32
  @modules.each(&block)
28
33
  end
29
34
 
35
+ def where(module_paths)
36
+ @modules.find_all { |mod| module_paths.include? mod.path }
37
+ end
38
+
39
+ def find(module_path)
40
+ @modules.find { |mod| mod.pathname == module_path }
41
+ end
42
+
30
43
  def to_json(*options)
31
44
  @modules.to_json(*options)
32
45
  end
33
46
 
34
47
  def score
35
48
  if @modules.any?
36
- MAX_SCORE - average_limited_cost * COST_MULTIPLIER
49
+ (MAX_SCORE - average_limited_cost * COST_MULTIPLIER).round(2)
37
50
  else
38
51
  0.0
39
52
  end
@@ -65,5 +78,12 @@ module RubyCritic
65
78
  def limited_cost_for(mod)
66
79
  [mod.cost, COST_LIMIT].min
67
80
  end
81
+
82
+ def build_analysed_module(analysed_module)
83
+ AnalysedModule.new(pathname: analysed_module.pathname, name: analysed_module.name,
84
+ smells: analysed_module.smells, churn: analysed_module.churn,
85
+ committed_at: analysed_module.committed_at, complexity: analysed_module.complexity,
86
+ duplication: analysed_module.duplication, methods_count: analysed_module.methods_count)
87
+ end
68
88
  end
69
89
  end
@@ -531,6 +531,7 @@ span.metric {
531
531
  margin-left: 20px;
532
532
  }
533
533
 
534
+
534
535
  .filter-table {
535
536
  text-align: right;
536
537
  }
@@ -548,3 +549,22 @@ span.metric {
548
549
  border: 1px solid #ccc;
549
550
  border-radius: 4px;
550
551
  }
552
+
553
+ .branch{
554
+ font-size: 15px;
555
+ color: #9b111d;
556
+ font-weight: bold;
557
+ display: inline-block;
558
+ padding: 13px;
559
+ }
560
+
561
+ .green-color {
562
+ color: #00A900;
563
+ }
564
+ .red-color {
565
+ color: #ED0000;
566
+ }
567
+ .empty-span{
568
+ height: 17px;
569
+ width: 17px;
570
+ }
@@ -18,7 +18,7 @@ module RubyCritic
18
18
  include ViewHelpers
19
19
 
20
20
  def file_href
21
- "file://#{file_pathname}"
21
+ "file:///#{file_pathname}"
22
22
  end
23
23
 
24
24
  def file_pathname
@@ -13,6 +13,13 @@ module RubyCritic
13
13
  def initialize(analysed_module)
14
14
  @analysed_module = analysed_module
15
15
  @pathname = @analysed_module.pathname
16
+ set_header_links if Config.compare_branches_mode?
17
+ end
18
+
19
+ def set_header_links
20
+ @base_path = code_index_path(Config.base_root_directory, file_location)
21
+ @feature_path = code_index_path(Config.feature_root_directory, file_location)
22
+ @build_path = code_index_path(Config.compare_root_directory, file_location)
16
23
  end
17
24
 
18
25
  def file_directory
@@ -23,6 +30,10 @@ module RubyCritic
23
30
  @pathname.basename.sub_ext('.html')
24
31
  end
25
32
 
33
+ def file_location
34
+ @pathname.sub_ext('.html')
35
+ end
36
+
26
37
  def render
27
38
  file_code = []
28
39
  File.readlines(@pathname).each.with_index(LINE_NUMBER_OFFSET) do |line_text, line_number|