Skip to content
This repository was archived by the owner on May 3, 2024. It is now read-only.

Commit 3e0333c

Browse files
author
Alex Evanczuk
authored
Export package protections rspec support (#13)
* move package protections rspec support into exported part of code * fix ERB loading when getting rubocop * bump version * fix thing * fix use of select
1 parent f892f88 commit 3e0333c

File tree

7 files changed

+119
-110
lines changed

7 files changed

+119
-110
lines changed

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: .
33
specs:
4-
package_protections (1.1.1)
4+
package_protections (1.2.0)
55
activesupport
66
parse_packwerk
77
rubocop
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
def offense(
2+
package_name, message, file, violation_type
3+
)
4+
5+
package = ParsePackwerk.all.find { |p| p.name == package_name }
6+
PackageProtections::Offense.new(
7+
package: package,
8+
message: message,
9+
file: file,
10+
violation_type: violation_type
11+
)
12+
end
13+
14+
def serialize_offenses_diff(actual_offenses, expected_offense)
15+
color_by_match = ->(actual, expected) { actual == expected ? Rainbow(actual).green : "#{Rainbow(actual).red} (expected: #{expected})" }
16+
17+
actual_offenses.map do |offense|
18+
# We color each field red or green depending on if the attributes match our expected
19+
<<~SERIALIZED_OFFENSE
20+
File: #{color_by_match.call(offense.file, expected_offense.file)}
21+
Message: #{color_by_match.call(offense.message, expected_offense.message)}
22+
Violation Type: #{color_by_match.call(offense.violation_type, expected_offense.violation_type)}
23+
Package: #{color_by_match.call(offense.package.name, expected_offense.package.name)}
24+
SERIALIZED_OFFENSE
25+
end
26+
end
27+
28+
def serialize_offenses(actual_offenses)
29+
actual_offenses.map do |offense|
30+
<<~SERIALIZED_OFFENSE
31+
File: #{offense.file}
32+
Message: #{offense.message}
33+
Violation Type: #{offense.violation_type}
34+
Package: #{offense.package.name}
35+
SERIALIZED_OFFENSE
36+
end
37+
end
38+
39+
RSpec::Matchers.define(:include_offense) do |expected_offense|
40+
match do |actual_offenses|
41+
@actual_offenses = actual_offenses
42+
@expected_offense = expected_offense
43+
if ENV['DEBUG']
44+
PackageProtections.print_offenses(actual_offenses)
45+
end
46+
@matching_offense = actual_offenses.find do |actual_offense|
47+
actual_offense.file == expected_offense.file &&
48+
actual_offense.message == expected_offense.message &&
49+
actual_offense.violation_type == expected_offense.violation_type &&
50+
actual_offense.package.name == expected_offense.package.name
51+
end
52+
!@matching_offense.nil?
53+
end
54+
55+
description do
56+
"to have an offense with type `#{expected_offense.type}` tied to package `#{expected_offense.package_name}` with message `#{expected_offense.message}` and instances `#{expected_offense.submessages.join(', ')}`"
57+
end
58+
59+
failure_message do
60+
<<~MSG
61+
Could not find offense! Here are the found offenses:
62+
#{serialize_offenses_diff(@actual_offenses, expected_offense).join("\n\n")}
63+
MSG
64+
end
65+
end
66+
67+
RSpec::Matchers.define(:contain_exactly) do |number_of_offenses|
68+
match do |actual_offenses|
69+
@actual_offenses = actual_offenses || []
70+
@offenses = []
71+
@actual_offenses.each do |offense|
72+
@offenses << offense
73+
end
74+
@offenses.size == number_of_offenses
75+
end
76+
77+
chain :offense, :number_of_offenses
78+
chain :offenses, :number_of_offenses
79+
80+
description do
81+
'to contain offenses'
82+
end
83+
84+
failure_message_when_negated do
85+
"Found the following offenses:\n#{@offenses.map { |r| "#{r.package_name}: #{r.message}" }}"
86+
end
87+
88+
failure_message do
89+
if @offenses.empty?
90+
"Found #{@offenses.size} instead."
91+
else
92+
<<~MSG
93+
Found #{@offenses.size} instead.
94+
95+
#{serialize_offenses(@offenses).join("\n")}
96+
MSG
97+
end
98+
end
99+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
# Require this file to load code that supports testing using RSpec.
4+
5+
require_relative 'application_fixture_helper'
6+
require_relative 'matchers'
7+
8+
def get_resulting_rubocop
9+
write_file('config/default.yml', <<~YML.strip)
10+
<%= PackageProtections.rubocop_yml %>
11+
YML
12+
YAML.safe_load(ERB.new(File.read('config/default.yml')).result(binding))
13+
end
14+
15+
RSpec.configure do |config|
16+
config.include ApplicationFixtureHelper
17+
end

package_protections.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Gem::Specification.new do |spec|
22
spec.name = 'package_protections'
3-
spec.version = '1.1.1'
3+
spec.version = '1.2.0'
44
spec.authors = ['Gusto Engineers']
55
spec.email = ['[email protected]']
66
spec.summary = 'Package protections for Rails apps'

spec/package_protections_spec.rb

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -13,93 +13,6 @@
1313
allow(Bundler).to receive(:root).and_return(Pathname.new('.'))
1414
end
1515

16-
RSpec::Matchers.define(:include_offense) do |expected_offense|
17-
match do |actual_offenses|
18-
@actual_offenses = actual_offenses
19-
@expected_offense = expected_offense
20-
if ENV['DEBUG']
21-
PackageProtections.print_offenses(actual_offenses)
22-
end
23-
@matching_offense = actual_offenses.find do |actual_offense|
24-
actual_offense.file == expected_offense.file &&
25-
actual_offense.message == expected_offense.message &&
26-
actual_offense.violation_type == expected_offense.violation_type &&
27-
actual_offense.package.name == expected_offense.package.name
28-
end
29-
!@matching_offense.nil?
30-
end
31-
32-
description do
33-
"to have an offense with type `#{expected_offense.type}` tied to package `#{expected_offense.package_name}` with message `#{expected_offense.message}` and instances `#{expected_offense.submessages.join(', ')}`"
34-
end
35-
36-
failure_message do
37-
<<~MSG
38-
Could not find offense! Here are the found offenses:
39-
#{serialize_offenses_diff(@actual_offenses, expected_offense).join("\n\n")}
40-
MSG
41-
end
42-
end
43-
44-
RSpec::Matchers.define(:contain_exactly) do |number_of_offenses|
45-
match do |actual_offenses|
46-
@actual_offenses = actual_offenses || []
47-
@offenses = []
48-
@actual_offenses.select do |offense|
49-
@offenses << offense
50-
end
51-
@offenses.size == number_of_offenses
52-
end
53-
54-
chain :offense, :number_of_offenses
55-
chain :offenses, :number_of_offenses
56-
57-
description do
58-
'to contain offenses'
59-
end
60-
61-
failure_message_when_negated do
62-
"Found the following offenses:\n#{@offenses.map { |r| "#{r.package_name}: #{r.message}" }}"
63-
end
64-
65-
failure_message do
66-
if @offenses.empty?
67-
"Found #{@offenses.size} instead."
68-
else
69-
<<~MSG
70-
Found #{@offenses.size} instead.
71-
72-
#{serialize_offenses(@offenses).join("\n")}
73-
MSG
74-
end
75-
end
76-
end
77-
78-
def serialize_offenses_diff(actual_offenses, expected_offense)
79-
color_by_match = ->(actual, expected) { actual == expected ? Rainbow(actual).green : "#{Rainbow(actual).red} (expected: #{expected})" }
80-
81-
actual_offenses.map do |offense|
82-
# We color each field red or green depending on if the attributes match our expected
83-
<<~SERIALIZED_OFFENSE
84-
File: #{color_by_match.call(offense.file, expected_offense.file)}
85-
Message: #{color_by_match.call(offense.message, expected_offense.message)}
86-
Violation Type: #{color_by_match.call(offense.violation_type, expected_offense.violation_type)}
87-
Package: #{color_by_match.call(offense.package.name, expected_offense.package.name)}
88-
SERIALIZED_OFFENSE
89-
end
90-
end
91-
92-
def serialize_offenses(actual_offenses)
93-
actual_offenses.map do |offense|
94-
<<~SERIALIZED_OFFENSE
95-
File: #{offense.file}
96-
Message: #{offense.message}
97-
Violation Type: #{offense.violation_type}
98-
Package: #{offense.package.name}
99-
SERIALIZED_OFFENSE
100-
end
101-
end
102-
10316
def get_packages
10417
ParsePackwerk.all
10518
end
@@ -112,25 +25,6 @@ def get_new_violations
11225
end
11326
end
11427

115-
def get_resulting_rubocop
116-
write_file('config/default.yml', <<~YML.strip)
117-
<%= PackageProtections.rubocop_yml %>
118-
YML
119-
YAML.safe_load(ERB.new(YAML.load_file('config/default.yml')).result(binding))
120-
end
121-
122-
def offense(
123-
package_name, message, file, violation_type
124-
)
125-
package = get_packages.find { |p| p.name == package_name }
126-
PackageProtections::Offense.new(
127-
package: package,
128-
message: message,
129-
file: file,
130-
violation_type: violation_type
131-
)
132-
end
133-
13428
describe 'get_offenses' do
13529
describe 'general behavior' do
13630
it 'raises on incorrect protection configuration keys' do

spec/spec_helper.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
require 'pry'
22
require 'package_protections'
33
require 'rubocop/rspec/support'
4-
5-
require_relative 'support/application_fixture_helper'
4+
require 'package_protections/rspec/support'
65

76
RSpec.configure do |config|
87
# Enable flags like --only-failures and --next-failure

0 commit comments

Comments
 (0)