Skip to content

Commit 3e34f0d

Browse files
authored
Merge pull request #48 from opus-codium/rubocop
2 parents 87921a9 + 40459c0 commit 3e34f0d

File tree

10 files changed

+198
-158
lines changed

10 files changed

+198
-158
lines changed

.rubocop.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ AllCops:
77
- tmp/**/*.rb
88
- vendor/bundle/**/*
99

10+
plugins:
11+
- rubocop-rake
12+
- rubocop-rspec
13+
1014
Layout/HashAlignment:
1115
EnforcedColonStyle: table
1216
EnforcedHashRocketStyle: table
@@ -26,6 +30,16 @@ Metrics/ModuleLength:
2630
Exclude:
2731
- spec/**/*.rb
2832

33+
RSpec/ExampleLength:
34+
Max: 50
35+
36+
RSpec/MultipleExpectations:
37+
Max: 10
38+
39+
RSpec/SpecFilePathFormat:
40+
Exclude:
41+
- spec/core_ext_spec.rb
42+
2943
Style/Documentation:
3044
Exclude:
3145
- features/support/env.rb

Rakefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ task test: %i[spec features]
2222

2323
task default: :test
2424

25+
# rubocop:disable Rake/Desc
2526
task feature: :gen_parser
2627
task build: :gen_parser
2728
task spec: :gen_parser
29+
# rubocop:enable Rake/Desc
2830

2931
desc 'Generate the puffy language parser'
3032
task gen_parser: 'lib/puffy/parser.tab.rb'

spec/core_ext_spec.rb

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,53 @@
66
describe '#expand' do
77
describe 'No expansion' do
88
subject { { a: :b }.expand }
9+
910
it { is_expected.to eq([{ a: :b }]) }
1011
end
1112

1213
describe 'Single expansion' do
13-
subject { { a: %i[b c] }.expand }
14+
subject(:expanded_hash) { { a: %i[b c] }.expand }
15+
1416
it do
15-
is_expected.to eq([
16-
{ a: :b },
17-
{ a: :c },
18-
])
17+
expect(expanded_hash).to eq([
18+
{ a: :b },
19+
{ a: :c },
20+
])
1921
end
2022
end
2123

2224
describe 'Multiple expansions' do
23-
subject { { a: %i[b c], d: %i[e f] }.expand }
25+
subject(:expanded_hash) { { a: %i[b c], d: %i[e f] }.expand }
26+
2427
it do
25-
is_expected.to eq([
26-
{ a: :b, d: :e },
27-
{ a: :c, d: :e },
28-
{ a: :b, d: :f },
29-
{ a: :c, d: :f },
30-
])
28+
expect(expanded_hash).to eq([
29+
{ a: :b, d: :e },
30+
{ a: :c, d: :e },
31+
{ a: :b, d: :f },
32+
{ a: :c, d: :f },
33+
])
3134
end
3235
end
3336

3437
describe 'Nested Array expansions' do
35-
subject { { a: [{ b: { c: %i[d e] } }] }.expand }
38+
subject(:expanded_hash) { { a: [{ b: { c: %i[d e] } }] }.expand }
39+
3640
it do
37-
is_expected.to eq([
38-
{ a: { b: { c: :d } } },
39-
{ a: { b: { c: :e } } },
40-
])
41+
expect(expanded_hash).to eq([
42+
{ a: { b: { c: :d } } },
43+
{ a: { b: { c: :e } } },
44+
])
4145
end
4246
end
4347

4448
describe 'Nested Hash expansions' do
45-
subject { { a: [{ b: [{ c: :d }, { e: :f }] }] }.expand }
49+
subject(:expanded_hash) { { a: [{ b: [{ c: :d }, { e: :f }] }] }.expand }
50+
4651
it do
47-
is_expected.to eq([
48-
{ a: { b: { c: :d } } },
49-
{ a: { b: { e: :f } } },
50-
])
52+
expect(expanded_hash).to eq([
53+
{ a: { b: { c: :d } } },
54+
{ a: { b: { e: :f } } },
55+
])
5156
end
5257
end
5358
end

spec/puffy/formatters/iptables_spec.rb

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,61 +7,65 @@
77
module Puffy
88
module Formatters
99
RSpec.describe Iptables::Rule do
10+
subject(:formatter) { described_class.new }
11+
1012
it 'formats simple rules' do
1113
rule = Rule.new(action: :pass, dir: :in, proto: :tcp, to: { host: nil, port: 80 })
12-
expect(subject.emit_rule(rule)).to eq('-A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT')
14+
expect(formatter.emit_rule(rule)).to eq('-A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT')
1315

1416
rule = Rule.new(action: :pass, dir: :in, on: 'lo')
15-
expect(subject.emit_rule(rule)).to eq('-A INPUT -i lo -j ACCEPT')
17+
expect(formatter.emit_rule(rule)).to eq('-A INPUT -i lo -j ACCEPT')
1618

1719
rule = Rule.new(action: :block, dir: :in, on: '!lo', to: { host: IPAddr.new('127.0.0.0/8') })
18-
expect(subject.emit_rule(rule)).to eq('-A INPUT ! -i lo -d 127.0.0.0/8 -j DROP')
20+
expect(formatter.emit_rule(rule)).to eq('-A INPUT ! -i lo -d 127.0.0.0/8 -j DROP')
1921

2022
rule = Rule.new(action: :pass, dir: :out)
21-
expect(subject.emit_rule(rule)).to eq('-A OUTPUT -j ACCEPT')
23+
expect(formatter.emit_rule(rule)).to eq('-A OUTPUT -j ACCEPT')
2224

2325
rule = Rule.new(action: :pass, dir: :in, proto: :tcp, from: { port: 67..68 }, to: { port: 67..68 })
24-
expect(subject.emit_rule(rule)).to eq('-A INPUT -m conntrack --ctstate NEW -p tcp --sport 67:68 --dport 67:68 -j ACCEPT')
26+
expect(formatter.emit_rule(rule)).to eq('-A INPUT -m conntrack --ctstate NEW -p tcp --sport 67:68 --dport 67:68 -j ACCEPT')
2527
end
2628

2729
it 'returns packets when instructed so' do
2830
rule = Rule.new(action: :block, return: true, dir: :in, proto: :icmp)
29-
expect(subject.emit_rule(rule)).to eq('-A INPUT -p icmp -j RETURN')
31+
expect(formatter.emit_rule(rule)).to eq('-A INPUT -p icmp -j RETURN')
3032
end
3133

3234
it 'formats forward rules' do
3335
rule = Rule.new(action: :pass, dir: :fwd, in: 'eth1', out: 'ppp0', from: { host: IPAddr.new('192.168.0.0/24') })
34-
expect(subject.emit_rule(rule)).to eq('-A FORWARD -i eth1 -o ppp0 -s 192.168.0.0/24 -j ACCEPT')
36+
expect(formatter.emit_rule(rule)).to eq('-A FORWARD -i eth1 -o ppp0 -s 192.168.0.0/24 -j ACCEPT')
3537
end
3638

3739
it 'formats dnat rules' do
3840
rule = Rule.new(action: :pass, dir: :in, on: 'ppp0', proto: :tcp, to: { port: 80 }, rdr_to: { host: IPAddr.new('192.168.0.42') })
39-
expect(subject.emit_rule(rule)).to eq('-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.42')
41+
expect(formatter.emit_rule(rule)).to eq('-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.42')
4042
end
4143

4244
it 'formats dnat rules ignoring same port' do
4345
rule = Rule.new(action: :pass, dir: :in, on: 'ppp0', proto: :tcp, to: { port: 80 }, rdr_to: { host: IPAddr.new('192.168.0.42'), port: 80 })
44-
expect(subject.emit_rule(rule)).to eq('-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.42')
46+
expect(formatter.emit_rule(rule)).to eq('-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.42')
4547
end
4648

4749
it 'formats dnat rules with port' do
4850
rule = Rule.new(action: :pass, dir: :in, on: 'ppp0', proto: :tcp, to: { port: 80 }, rdr_to: { host: IPAddr.new('192.168.0.42'), port: 8080 })
49-
expect(subject.emit_rule(rule)).to eq('-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.42:8080')
51+
expect(formatter.emit_rule(rule)).to eq('-A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.42:8080')
5052
end
5153

5254
it 'formats redirect rules' do
5355
rule = Rule.new(action: :pass, dir: :in, on: 'eth0', proto: :tcp, to: { port: 80 }, rdr_to: { host: IPAddr.new('127.0.0.1/32'), port: 3128 })
54-
expect(subject.emit_rule(rule)).to eq('-A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128')
56+
expect(formatter.emit_rule(rule)).to eq('-A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128')
5557
end
5658

5759
it 'formats nat rules' do
5860
rule = Rule.new(action: :pass, dir: :out, on: 'ppp0', nat_to: IPAddr.new('198.51.100.72'))
59-
expect(subject.emit_rule(rule)).to eq('-A POSTROUTING -o ppp0 -j MASQUERADE')
61+
expect(formatter.emit_rule(rule)).to eq('-A POSTROUTING -o ppp0 -j MASQUERADE')
6062
end
6163
end
6264

6365
RSpec.describe Iptables::Ruleset do
64-
context 'ruleset' do
66+
subject(:formatter) { described_class.new }
67+
68+
context 'with a ruleset' do
6569
before do
6670
Timecop.freeze('2000-01-01 00:00:00')
6771
end
@@ -74,7 +78,7 @@ module Formatters
7478
parser = Puffy::Parser.new
7579
parser.parse(File.read(File.join('spec', 'fixtures', 'simple_lan_network.puffy')))
7680
rules = parser.ruleset_for('gw')
77-
expect(subject.emit_ruleset(rules, :block)).to eq <<~NETFILTER
81+
expect(formatter.emit_ruleset(rules, :block)).to eq <<~NETFILTER
7882
# Generated by puffy v#{Puffy::VERSION} on Sat Jan 1 00:00:00 2000
7983
*nat
8084
:PREROUTING ACCEPT [0:0]
@@ -99,7 +103,7 @@ module Formatters
99103
COMMIT
100104
NETFILTER
101105
rules = parser.ruleset_for('www')
102-
expect(subject.emit_ruleset(rules, :block)).to eq <<~NETFILTER
106+
expect(formatter.emit_ruleset(rules, :block)).to eq <<~NETFILTER
103107
# Generated by puffy v#{Puffy::VERSION} on Sat Jan 1 00:00:00 2000
104108
*filter
105109
:INPUT DROP [0:0]

spec/puffy/formatters/pf_spec.rb

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,71 +5,75 @@
55
module Puffy
66
module Formatters
77
RSpec.describe Pf::Rule do
8+
subject(:formatter) { described_class.new }
9+
810
it 'formats simple rules' do
911
rule = Rule.new(action: :pass, dir: :out, proto: :tcp)
10-
expect(subject.emit_rule(rule)).to eq('pass out quick proto tcp')
12+
expect(formatter.emit_rule(rule)).to eq('pass out quick proto tcp')
1113

1214
rule = Rule.new(action: :pass, dir: :in, proto: :tcp, to: { host: nil, port: 80 })
13-
expect(subject.emit_rule(rule)).to eq('pass in quick proto tcp to any port 80')
15+
expect(formatter.emit_rule(rule)).to eq('pass in quick proto tcp to any port 80')
1416

1517
rule = Rule.new(action: :block, dir: :in, proto: :icmp)
16-
expect(subject.emit_rule(rule)).to eq('block in quick proto icmp')
18+
expect(formatter.emit_rule(rule)).to eq('block in quick proto icmp')
1719

1820
rule = Rule.new(action: :pass, dir: :in, proto: :udp, from: { port: 123 }, to: { port: 123 })
19-
expect(subject.emit_rule(rule)).to eq('pass in quick proto udp from any port 123 to any port 123')
21+
expect(formatter.emit_rule(rule)).to eq('pass in quick proto udp from any port 123 to any port 123')
2022

2123
rule = Rule.new(action: :pass, dir: :in, proto: :tcp, from: { port: 67..68 }, to: { port: 67..68 })
22-
expect(subject.emit_rule(rule)).to eq('pass in quick proto tcp from any port 67:68 to any port 67:68')
24+
expect(formatter.emit_rule(rule)).to eq('pass in quick proto tcp from any port 67:68 to any port 67:68')
2325
end
2426

2527
it 'generates non-quick rules' do
2628
rule = Rule.new(action: :block, dir: :in, no_quick: true)
27-
expect(subject.emit_rule(rule)).to eq('block in all')
29+
expect(formatter.emit_rule(rule)).to eq('block in all')
2830
end
2931

3032
it 'returns packets when instructed so' do
3133
rule = Rule.new(action: :block, return: true, dir: :in, proto: :icmp)
32-
expect(subject.emit_rule(rule)).to eq('block return in quick proto icmp')
34+
expect(formatter.emit_rule(rule)).to eq('block return in quick proto icmp')
3335
end
3436

35-
context 'redirect rules' do
37+
context 'when formatting redirect rules' do
3638
it 'formats redirect rules' do
3739
rule = Rule.new(action: :pass, dir: :in, on: 'eth0', proto: :tcp, to: { port: 80 }, rdr_to: { host: IPAddr.new('127.0.0.1/32'), port: 3128 })
38-
expect(subject.emit_rule(rule)).to eq('pass in quick on eth0 proto tcp to any port 80 divert-to 127.0.0.1 port 3128')
40+
expect(formatter.emit_rule(rule)).to eq('pass in quick on eth0 proto tcp to any port 80 divert-to 127.0.0.1 port 3128')
3941
end
4042

4143
it 'fails on ambiguous redirect rule' do
4244
rule = Rule.new(action: :pass, dir: :in, on: 'eth0', proto: :tcp, to: { port: 80 }, rdr_to: { port: 3128 })
43-
expect { subject.emit_rule(rule) }.to raise_exception('Unspecified address family')
45+
expect { formatter.emit_rule(rule) }.to raise_exception('Unspecified address family')
4446
end
4547

4648
it 'formats implicit IPv4 destination' do
4749
rule = Rule.new(action: :pass, dir: :in, on: 'eth0', af: :inet, proto: :tcp, to: { port: 80 }, rdr_to: { port: 3128 })
48-
expect(subject.emit_rule(rule)).to eq('pass in quick on eth0 proto tcp to any port 80 divert-to 127.0.0.1 port 3128')
50+
expect(formatter.emit_rule(rule)).to eq('pass in quick on eth0 proto tcp to any port 80 divert-to 127.0.0.1 port 3128')
4951
end
5052

5153
it 'formats implicit IPv6 destination' do
5254
rule = Rule.new(action: :pass, dir: :in, on: 'eth0', af: :inet6, proto: :tcp, to: { port: 80 }, rdr_to: { port: 3128 })
53-
expect(subject.emit_rule(rule)).to eq('pass in quick on eth0 proto tcp to any port 80 divert-to ::1 port 3128')
55+
expect(formatter.emit_rule(rule)).to eq('pass in quick on eth0 proto tcp to any port 80 divert-to ::1 port 3128')
5456
end
5557
end
5658

57-
context 'implicit address family' do
59+
context 'when using an implicit address family' do
5860
it 'skips redundant address family' do
5961
rule = Rule.new(action: :pass, dir: :in, af: :inet, proto: :tcp, to: { host: IPAddr.new('127.0.0.1') })
60-
expect(subject.emit_rule(rule)).to eq('pass in quick proto tcp to 127.0.0.1')
62+
expect(formatter.emit_rule(rule)).to eq('pass in quick proto tcp to 127.0.0.1')
6163
rule = Rule.new(action: :pass, dir: :in, af: :inet6, proto: :tcp, to: { host: IPAddr.new('::1') })
62-
expect(subject.emit_rule(rule)).to eq('pass in quick proto tcp to ::1')
64+
expect(formatter.emit_rule(rule)).to eq('pass in quick proto tcp to ::1')
6365
rule = Rule.new(action: :pass, dir: :in, af: :inet, proto: :tcp, to: { port: 80 })
64-
expect(subject.emit_rule(rule)).to eq('pass in quick inet proto tcp to any port 80')
66+
expect(formatter.emit_rule(rule)).to eq('pass in quick inet proto tcp to any port 80')
6567
rule = Rule.new(action: :pass, dir: :in, af: :inet6, proto: :tcp, to: { port: 80 })
66-
expect(subject.emit_rule(rule)).to eq('pass in quick inet6 proto tcp to any port 80')
68+
expect(formatter.emit_rule(rule)).to eq('pass in quick inet6 proto tcp to any port 80')
6769
end
6870
end
6971
end
7072

7173
RSpec.describe Pf::Ruleset do
72-
context 'ruleset' do
74+
subject(:formatter) { described_class.new }
75+
76+
context 'with a ruleset' do
7377
let(:parser) do
7478
parser = Puffy::Parser.new
7579
parser.parse(File.read(File.join('spec', 'fixtures', 'simple_lan_network.puffy')))
@@ -84,9 +88,9 @@ module Formatters
8488
Timecop.return
8589
end
8690

87-
it 'formats a simple lan network rules' do
91+
it 'generates the correct gw rules' do
8892
rules = parser.ruleset_for('gw')
89-
expect(subject.emit_ruleset(rules, :block)).to eq <<~PF
93+
expect(formatter.emit_ruleset(rules, :block)).to eq <<~PF
9094
# Generated by puffy v#{Puffy::VERSION} on Sat Jan 1 00:00:00 2000
9195
match in all scrub (no-df)
9296
set skip on lo
@@ -99,9 +103,9 @@ module Formatters
99103
PF
100104
end
101105

102-
it 'formats a simple lan network rules' do
106+
it 'generates tE correct www rules' do
103107
rules = parser.ruleset_for('www')
104-
expect(subject.emit_ruleset(rules, :block)).to eq <<~PF
108+
expect(formatter.emit_ruleset(rules, :block)).to eq <<~PF
105109
# Generated by puffy v#{Puffy::VERSION} on Sat Jan 1 00:00:00 2000
106110
match in all scrub (no-df)
107111
set skip on lo

spec/puffy/parser_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
require 'puffy'
44

55
RSpec.describe Puffy::Parser do
6+
subject(:parser) { described_class.new }
7+
68
let(:config) do
79
<<~CONFIG
810
localhost = {127.0.0.1 ::1}
911
CONFIG
1012
end
1113

1214
it 'parses successfuly' do
13-
expect { subject.parse(config) }.not_to raise_error
15+
expect { parser.parse(config) }.not_to raise_error
1416
end
1517
end
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
require 'puffy'
44

55
RSpec.describe Puffy::PuffyError do
6+
subject(:error) do
7+
described_class.new('Message', token)
8+
end
9+
610
let(:token) do
711
{
812
filename: 'filename.ext',
@@ -13,14 +17,11 @@
1317
}
1418
end
1519

16-
subject do
17-
Puffy::PuffyError.new('Message', token)
18-
end
19-
2020
it 'reports the correct location in file' do
21-
expect(subject.to_s).to match(/^filename.ext:12:5: Message/)
21+
expect(error.to_s).to match(/^filename.ext:12:5: Message/)
2222
end
23+
2324
it 'highlights the correct location in the line' do
24-
expect(subject.to_s).to match(/^ \^~~$/)
25+
expect(error.to_s).to match(/^ \^~~$/)
2526
end
2627
end

0 commit comments

Comments
 (0)