rubycritic 3.4.0 → 3.5.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.
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|