Skip to content

Commit 3ec765e

Browse files
author
Ashley Baldwin-Hunter
committed
Merge pull request #81 from codeclimate/abh-erb-files
Include erb files for analysis, following Flay
2 parents 18dd32f + 620f2dd commit 3ec765e

File tree

6 files changed

+78
-2
lines changed

6 files changed

+78
-2
lines changed

.codeclimate.yml

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ engines:
88
enabled: true
99
duplication:
1010
enabled: true
11+
exclude_fingerprints:
12+
- b2dc8dbd27916d8321e298f59fc2f431 # Erubis < ::Erubis::Eruby
1113
config:
1214
languages:
1315
- ruby

Gemfile

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
source 'https://rubygems.org'
22

3+
gem 'erubis'
34
gem 'flay', git: 'https://github.com/codeclimate/flay.git'
45
gem 'concurrent-ruby', "~> 1.0.0"
56
gem 'ruby_parser'

Gemfile.lock

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ GEM
1010
coderay (1.1.0)
1111
concurrent-ruby (1.0.0)
1212
diff-lcs (1.2.5)
13+
erubis (2.7.0)
1314
json (1.8.3)
1415
method_source (0.8.2)
1516
pry (0.10.3)
@@ -40,6 +41,7 @@ PLATFORMS
4041

4142
DEPENDENCIES
4243
concurrent-ruby (~> 1.0.0)
44+
erubis
4345
flay!
4446
json
4547
pry

lib/cc/engine/analyzers/ruby/main.rb

+33-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
require "erubis"
12
require "flay"
23
require "json"
34
require "cc/engine/analyzers/reporter"
@@ -10,12 +11,12 @@ module Ruby
1011
class Main < CC::Engine::Analyzers::Base
1112
LANGUAGE = "ruby"
1213
DEFAULT_PATHS = [
14+
"**/*.erb",
1315
"**/*.rb",
1416
"**/*.rake",
1517
"**/Rakefile",
1618
"**/Gemfile",
1719
"**/*.gemspec"
18-
1920
]
2021
DEFAULT_MASS_THRESHOLD = 18
2122
BASE_POINTS = 1_500_000
@@ -33,7 +34,37 @@ def overage(mass)
3334
end
3435

3536
def process_file(file)
36-
RubyParser.new.process(File.binread(file), file, TIMEOUT)
37+
if File.extname(file) == ".erb"
38+
process_erb file
39+
else
40+
RubyParser.new.process(File.binread(file), file, TIMEOUT)
41+
end
42+
end
43+
44+
def process_erb(file)
45+
erb = File.binread(file)
46+
ruby = Erubis.new(erb).src
47+
RubyParser.new.process(ruby, file)
48+
end
49+
50+
class Erubis < ::Erubis::Eruby
51+
BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
52+
53+
def add_expr_literal(src, code)
54+
if code =~ BLOCK_EXPR
55+
src << "@output_buffer.append= " << code
56+
else
57+
src << "@output_buffer.append=(" << code << ");"
58+
end
59+
end
60+
61+
def add_expr_escaped(src, code)
62+
if code =~ BLOCK_EXPR
63+
src << "@output_buffer.safe_append= " << code
64+
else
65+
src << "@output_buffer.safe_append=(" << code << ");"
66+
end
67+
end
3768
end
3869
end
3970
end

spec/cc/engine/analyzers/javascript/main_spec.rb

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'cc/engine/analyzers/reporter'
44
require 'cc/engine/analyzers/engine_config'
55
require 'cc/engine/analyzers/file_list'
6+
require 'erubis'
67

78
RSpec.describe CC::Engine::Analyzers::Javascript::Main, in_tmpdir: true do
89
include AnalyzerSpecHelpers

spec/cc/engine/analyzers/ruby/main_spec.rb

+39
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,45 @@ module CC::Engine::Analyzers
8888
expect(run_engine(engine_conf)).to eq("")
8989
}.to output(/Skipping file/).to_stderr
9090
end
91+
92+
it "analyzes erb files" do
93+
create_source_file("recipe.erb", <<-EOERB)
94+
<div class="container">
95+
<h1>Select a Category</h1>
96+
<ul>
97+
<%categories.each do |category| %>
98+
<li> <a href= "/category/<%=category.id%>"><%=category.name%> | <%=category.recipes.count%> Recipes </a></li>
99+
<%end%>
100+
101+
<%categories.each do |category| %>
102+
<li> <a href= "/category/<%=category.id%>"><%=category.name%> | <%=category.recipes.count%> Recipes </a></li>
103+
<%end%>
104+
105+
<%categories.each do |category| %>
106+
<li> <a href= "/category/<%=category.id%>"><%=category.name%> | <%=category.recipes.count%> Recipes </a></li>
107+
<%end%>
108+
</ul>
109+
</div>
110+
EOERB
111+
112+
issues = run_engine(engine_conf).strip.split("\0")
113+
result = issues.first.strip
114+
json = JSON.parse(result)
115+
116+
expect(json["type"]).to eq("issue")
117+
expect(json["check_name"]).to eq("Similar code")
118+
expect(json["description"]).to eq("Similar code found in 2 other locations (mass = 30)")
119+
expect(json["categories"]).to eq(["Duplication"])
120+
expect(json["location"]).to eq({
121+
"path" => "recipe.erb",
122+
"lines" => { "begin" => 4, "end" => 5 },
123+
})
124+
expect(json["remediation_points"]).to eq(2_700_000)
125+
expect(json["other_locations"]).to eq([
126+
{"path" => "recipe.erb", "lines" => { "begin" => 8, "end" => 9} },
127+
{"path" => "recipe.erb", "lines" => { "begin" => 12, "end" => 13} }
128+
])
129+
end
91130
end
92131

93132
describe "#calculate_points(mass)" do

0 commit comments

Comments
 (0)