junklet 0.9.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.ruby-version +1 -0
- data/Gemfile.lock +9 -1
- data/junklet.gemspec +1 -0
- data/lib/junklet/version.rb +1 -1
- data/lib/junklet.rb +6 -9
- data/lib/junklet_upgrade_parser.rb +151 -0
- data/lib/line.rb +44 -0
- data/spec/fixtures/block1_after.txt +6 -0
- data/spec/fixtures/block1_before.txt +7 -0
- data/spec/fixtures/combined_after.txt +6 -0
- data/spec/fixtures/combined_before.txt +9 -0
- data/spec/fixtures/embedded_after.txt +8 -0
- data/spec/fixtures/embedded_before.txt +9 -0
- data/spec/fixtures/mixed_code_after.txt +47 -0
- data/spec/fixtures/mixed_code_before.txt +46 -0
- data/spec/fixtures/old_skool_after.txt +6 -0
- data/spec/fixtures/old_skool_before.txt +7 -0
- data/spec/lib/junklet_spec.rb +2 -1
- data/spec/lib/junklet_upgrade_parser_spec.rb +99 -0
- data/spec/lib/line_spec.rb +76 -0
- data/spec/spec_helper.rb +42 -0
- metadata +43 -3
- data/Rakefile +0 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTc3MWM0MDE5OTgyMDZhNjJiMzU1YmY3NzY2MWYwMDA3N2ZlYzU0Yg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YzZkMTI1ZDMwZjE3ZDg0ODI1MDcxOTEwZTQ3MmY0MDY5MTc5NTdjNA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmNkODBhODcyN2M2Y2U0NWZmMmJlNzMxOWZlNmQ5OTBkNTA5OWEzMjNlNzMw
|
10
|
+
YmQwMWQ5MmM4NDVhOWVkYWIzY2ZjNTQ2NDM4YjdjOWZmYWY5YzU5YWUwY2Qw
|
11
|
+
ZGUxYzczMmI5ODFlYTdmODJkNjc4Y2MzZTE5YTVhNzMyZTFkZmE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NGI0MmYyNDA0MTJmOTJlY2ExYzAxY2Q5MDdjNTEwNTY3Zjc3YjJiOTFlMTli
|
14
|
+
NjIyNDVkZDkzYjZmMzY2Njg3MzEyZDZhOGRmNTdkMzg2N2M4NDk2YWE3YTBh
|
15
|
+
MWU5MmIxODYxOTRhZDdjOWEyNWQwNTc1ZGVmMmM1MWY1ZjcwYzg=
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p551
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
junklet (0.
|
4
|
+
junklet (1.0.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
builder (3.2.2)
|
10
|
+
coderay (1.1.0)
|
10
11
|
cucumber (1.3.18)
|
11
12
|
builder (>= 2.1.2)
|
12
13
|
diff-lcs (>= 1.1.3)
|
@@ -16,8 +17,13 @@ GEM
|
|
16
17
|
diff-lcs (1.2.5)
|
17
18
|
gherkin (2.12.2)
|
18
19
|
multi_json (~> 1.3)
|
20
|
+
method_source (0.8.2)
|
19
21
|
multi_json (1.10.1)
|
20
22
|
multi_test (0.1.1)
|
23
|
+
pry (0.10.1)
|
24
|
+
coderay (~> 1.1.0)
|
25
|
+
method_source (~> 0.8.1)
|
26
|
+
slop (~> 3.4)
|
21
27
|
rake (10.4.2)
|
22
28
|
rspec (2.99.0)
|
23
29
|
rspec-core (~> 2.99.0)
|
@@ -27,6 +33,7 @@ GEM
|
|
27
33
|
rspec-expectations (2.99.2)
|
28
34
|
diff-lcs (>= 1.1.3, < 2.0)
|
29
35
|
rspec-mocks (2.99.2)
|
36
|
+
slop (3.6.0)
|
30
37
|
|
31
38
|
PLATFORMS
|
32
39
|
ruby
|
@@ -35,5 +42,6 @@ DEPENDENCIES
|
|
35
42
|
bundler (~> 1.7)
|
36
43
|
cucumber
|
37
44
|
junklet!
|
45
|
+
pry
|
38
46
|
rake (~> 10.0)
|
39
47
|
rspec (~> 2.0)
|
data/junklet.gemspec
CHANGED
data/lib/junklet/version.rb
CHANGED
data/lib/junklet.rb
CHANGED
@@ -20,16 +20,13 @@ module RSpec
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def junk(size=32)
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
# hex returns size*2 digits, because it returns a 0..255 byte
|
24
|
+
# as a hex pair. But when we want junt, we want *bytes* of
|
25
|
+
# junk. Get (size+1)/2 chars, which will be correct for even
|
26
|
+
# sizes and 1 char too many for odds, so trim off with
|
27
|
+
# [0...size] (note three .'s to trim off final char)
|
28
|
+
SecureRandom.hex((size+1)/2)[0...size]
|
26
29
|
end
|
27
30
|
end
|
28
|
-
|
29
|
-
# class ExampleGroup
|
30
|
-
# def self.junk
|
31
|
-
# SecureRandom.hex
|
32
|
-
# end
|
33
|
-
# end
|
34
31
|
end
|
35
32
|
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# What it does:
|
2
|
+
# Find blocks of mixed lets and "junklets", a special DSL term we use here for
|
3
|
+
# junk data. It then rewrites the block so that the lets come first in
|
4
|
+
# original order, then a newline, then the junklets in order. So it turns this
|
5
|
+
# code:
|
6
|
+
#
|
7
|
+
# let(:name) { "Bob" }
|
8
|
+
# junklet :address
|
9
|
+
# let(:city) { "Faketown" }
|
10
|
+
# junklet :state
|
11
|
+
# junklet :zip
|
12
|
+
# let(:extra) { true }
|
13
|
+
# let(:pants) { ON_FIRE }
|
14
|
+
#
|
15
|
+
# Into THIS code, leaving the rest of the file unaltered:
|
16
|
+
#
|
17
|
+
# let(:name) { "Bob" }
|
18
|
+
# let(:city) { "Faketown" }
|
19
|
+
# let(:extra) { true }
|
20
|
+
# let(:pants) { ON_FIRE }
|
21
|
+
#
|
22
|
+
# junklet :address
|
23
|
+
# junklet :state
|
24
|
+
# junklet :zip
|
25
|
+
#
|
26
|
+
|
27
|
+
require_relative 'line'
|
28
|
+
|
29
|
+
# As with all parsers, this is easy if we allow peeking.
|
30
|
+
class JunkletUpgradeParser
|
31
|
+
attr_reader :lines, :lets, :junklets, :mode, :current_line
|
32
|
+
|
33
|
+
INACTIVE = 'inactive'
|
34
|
+
MAYBE_ACTIVE = 'maybe_active'
|
35
|
+
ACTIVE = 'active'
|
36
|
+
|
37
|
+
def initialize
|
38
|
+
end
|
39
|
+
|
40
|
+
def inactive; INACTIVE; end
|
41
|
+
def maybe_active; MAYBE_ACTIVE; end
|
42
|
+
def active; ACTIVE; end
|
43
|
+
|
44
|
+
def inactive?; mode == inactive; end
|
45
|
+
def maybe_active?; mode == maybe_active; end
|
46
|
+
def active?; mode == active; end
|
47
|
+
|
48
|
+
def upgraded_lines(lines)
|
49
|
+
@lines = lines
|
50
|
+
return unless junky?
|
51
|
+
we_are_inactive!
|
52
|
+
emitted_lines = []
|
53
|
+
lines.each do |line|
|
54
|
+
self.current_line = imblart_line(line)
|
55
|
+
case mode
|
56
|
+
when inactive
|
57
|
+
if current_line.let?
|
58
|
+
lets << parse_line(current_line)
|
59
|
+
we_are_maybe_active!
|
60
|
+
elsif current_line.junklet?
|
61
|
+
junklets << current_line
|
62
|
+
we_are_active!
|
63
|
+
elsif current_line.code?
|
64
|
+
emitted_lines << parse_line(current_line)
|
65
|
+
end
|
66
|
+
when maybe_active
|
67
|
+
if current_line.let?
|
68
|
+
lets << parse_line(current_line)
|
69
|
+
elsif current_line.junklet?
|
70
|
+
junklets << current_line
|
71
|
+
we_are_active!
|
72
|
+
elsif current_line.code?
|
73
|
+
emitted_lines += lets
|
74
|
+
emitted_lines << parse_line(current_line)
|
75
|
+
we_are_inactive!
|
76
|
+
end
|
77
|
+
when active
|
78
|
+
if current_line.let?
|
79
|
+
lets << parse_line(current_line)
|
80
|
+
elsif current_line.junklet?
|
81
|
+
junklets << current_line
|
82
|
+
elsif current_line.code?
|
83
|
+
emitted_lines += reordered_block
|
84
|
+
emitted_lines << parse_line(current_line)
|
85
|
+
reset
|
86
|
+
we_are_inactive!
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# if lets || junklets we've hit EOF while active
|
92
|
+
emitted_lines += reordered_block if active?
|
93
|
+
emitted_lines
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_line(line)
|
97
|
+
numeric_range_match = /(\s*)SecureRandom.(hex|uuid)\[(\d+)\.\.(\d+)\](\s*)/
|
98
|
+
range_match = /(\s*)SecureRandom.(hex|uuid)\[(\d+)\.\.(.+?)\](\s*)/
|
99
|
+
simple_match = /(\s*)SecureRandom.(hex|uuid)(\s*)/
|
100
|
+
|
101
|
+
# match these in order--simple match will match all complicated matches.
|
102
|
+
line \
|
103
|
+
.gsub(numeric_range_match) {|s| "#{$1}junk(#{$4.to_i-$3.to_i})#{$5}" } \
|
104
|
+
.gsub(range_match) {|s| "#{$1}junk(#{$4})#{$5}" } \
|
105
|
+
.gsub(simple_match) {|s| "#{$1}junk#{$3}" }
|
106
|
+
end
|
107
|
+
|
108
|
+
def reordered_block
|
109
|
+
lets << "\n" unless lets.empty? || lets.last == "\n" || junklets.empty?
|
110
|
+
lets + sort_junklets
|
111
|
+
end
|
112
|
+
|
113
|
+
def sort_junklets
|
114
|
+
return if junklets.empty?
|
115
|
+
indent = junklets.first.indent
|
116
|
+
["#{indent}junklet #{(junklets.map(&:names).sort * ', ')}\n"]
|
117
|
+
end
|
118
|
+
|
119
|
+
def imblart_line(line)
|
120
|
+
Line.new line
|
121
|
+
end
|
122
|
+
|
123
|
+
def we_are_inactive!
|
124
|
+
reset
|
125
|
+
@mode = INACTIVE
|
126
|
+
end
|
127
|
+
|
128
|
+
def we_are_maybe_active!
|
129
|
+
@mode = MAYBE_ACTIVE
|
130
|
+
end
|
131
|
+
|
132
|
+
def we_are_active!
|
133
|
+
@mode = ACTIVE
|
134
|
+
end
|
135
|
+
|
136
|
+
def reset
|
137
|
+
@lets, @junklets = [], []
|
138
|
+
end
|
139
|
+
|
140
|
+
def junky?
|
141
|
+
lines.any? { |line| junk_line? line }
|
142
|
+
end
|
143
|
+
|
144
|
+
def junk_line?(line)
|
145
|
+
line =~ /\bSecureRandom\./ || line =~ /\bjunklet\b/
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
attr_accessor :current_line
|
151
|
+
end
|
data/lib/line.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
class Line < String
|
2
|
+
def initialize(line="")
|
3
|
+
super
|
4
|
+
end
|
5
|
+
|
6
|
+
def indent
|
7
|
+
' ' * (size - lstrip.size)
|
8
|
+
end
|
9
|
+
|
10
|
+
def let?
|
11
|
+
match(/^\s*let\s*\(/) && !junklet?
|
12
|
+
end
|
13
|
+
|
14
|
+
def junklet?
|
15
|
+
already_junklet? || secure_random?
|
16
|
+
end
|
17
|
+
|
18
|
+
def already_junklet?
|
19
|
+
match(/^\s*junklet\b/)
|
20
|
+
end
|
21
|
+
|
22
|
+
def secure_random?
|
23
|
+
match(/^\s*(let)\s*\(?([^)]*)\)\s*{\s*SecureRandom.(uuid|hex)\s*}/)
|
24
|
+
end
|
25
|
+
|
26
|
+
def code?
|
27
|
+
empty? || (!let? && !junklet?)
|
28
|
+
end
|
29
|
+
|
30
|
+
def names
|
31
|
+
return nil unless let? || junklet?
|
32
|
+
match(/^\s*(let|junklet)\s*\(?([^)]*)\)?/) \
|
33
|
+
.captures[1..-1] \
|
34
|
+
.join('') \
|
35
|
+
.split(/,/) \
|
36
|
+
.map(&:strip)
|
37
|
+
end
|
38
|
+
|
39
|
+
def convert
|
40
|
+
return nil unless junklet?
|
41
|
+
return self if already_junklet?
|
42
|
+
Line.new("#{indent}junklet #{names.first}")
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
let(:first_name) { "TestBot" }
|
2
|
+
let(:last_name) { "ID-#{SecureRandom.hex[0..8]}" }
|
3
|
+
let(:address) { SecureRandom.uuid }
|
4
|
+
let(:city) { SecureRandom.uuid[0..MAX_CITY_NAME_LENGTH-1] }
|
5
|
+
let(:state) { SecureRandom.uuid }
|
6
|
+
let(:zip) {SecureRandom.uuid}
|
7
|
+
let(:extra) { "www.#{SecureRandom.uuid[6..10].com" }
|
8
|
+
let(:pants) { SecureRandom.hex 32 }
|
9
|
+
let(:other_pants) { SecureRandom.hex(33) }
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe XMLCommon do
|
4
|
+
subject do
|
5
|
+
node = xml_node
|
6
|
+
Class.new do
|
7
|
+
include XMLCommon
|
8
|
+
define_method(:xml_node) { node }
|
9
|
+
end.new
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#fetch" do
|
13
|
+
it "looks in the `:from` element" do
|
14
|
+
other_key, other_value = Array.new(2) { junk }
|
15
|
+
from = { other_key.to_sym => other_value }
|
16
|
+
expect(subject.fetch(other_key, from: from)).to \
|
17
|
+
eq(other_value)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "fails if the attribute isn't in `:from`" do
|
21
|
+
missing_key = junk.to_sym
|
22
|
+
expect{ subject.fetch(missing_key) }.to \
|
23
|
+
raise_error(XMLCommon::AttributeNotFound)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "defaults to `xml_node`" do
|
27
|
+
expect(subject.fetch(key)).to eq(value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
specify "xml_node" do
|
32
|
+
pending "i wouldn't usually test this, but since it's going to be inherited, i think it's a good idea"
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "#==" do
|
36
|
+
pending
|
37
|
+
end
|
38
|
+
|
39
|
+
specify "#to_s" do
|
40
|
+
pending
|
41
|
+
end
|
42
|
+
|
43
|
+
let(:key) { junk.to_sym }
|
44
|
+
let(:xml_node) { { key => value } }
|
45
|
+
|
46
|
+
junklet :value
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe XMLCommon do
|
4
|
+
subject do
|
5
|
+
node = xml_node
|
6
|
+
Class.new do
|
7
|
+
include XMLCommon
|
8
|
+
define_method(:xml_node) { node }
|
9
|
+
end.new
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#fetch" do
|
13
|
+
it "looks in the `:from` element" do
|
14
|
+
other_key, other_value = Array.new(2) { junk }
|
15
|
+
from = { other_key.to_sym => other_value }
|
16
|
+
expect(subject.fetch(other_key, from: from)).to \
|
17
|
+
eq(other_value)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "fails if the attribute isn't in `:from`" do
|
21
|
+
missing_key = junk.to_sym
|
22
|
+
expect{ subject.fetch(missing_key) }.to \
|
23
|
+
raise_error(XMLCommon::AttributeNotFound)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "defaults to `xml_node`" do
|
27
|
+
expect(subject.fetch(key)).to eq(value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
specify "xml_node" do
|
32
|
+
pending "i wouldn't usually test this, but since it's going to be inherited, i think it's a good idea"
|
33
|
+
end
|
34
|
+
|
35
|
+
specify "#==" do
|
36
|
+
pending
|
37
|
+
end
|
38
|
+
|
39
|
+
specify "#to_s" do
|
40
|
+
pending
|
41
|
+
end
|
42
|
+
|
43
|
+
let(:key) { junk.to_sym }
|
44
|
+
junklet :value
|
45
|
+
let(:xml_node) { { key => value } }
|
46
|
+
end
|
data/spec/lib/junklet_spec.rb
CHANGED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../lib/junklet_upgrade_parser'
|
3
|
+
|
4
|
+
|
5
|
+
describe JunkletUpgradeParser do
|
6
|
+
specify { expect(JunkletUpgradeParser).to be }
|
7
|
+
|
8
|
+
let(:parser) { JunkletUpgradeParser.new }
|
9
|
+
|
10
|
+
# Process test files
|
11
|
+
context "with test fixtures" do
|
12
|
+
# TODO: Mothballing upgrader for now. Embedded gives a good
|
13
|
+
# example of how the parser is fascinatingly broken.
|
14
|
+
#%w(block1 mixed_code combined old_skool embedded).each do |name|
|
15
|
+
%w(block1 mixed_code combined old_skool).each do |name|
|
16
|
+
describe "processing #{name}_before.txt -> #{name}_after.txt" do
|
17
|
+
let(:fixture_path) { File.expand_path(File.join(File.dirname(__FILE__), '../fixtures')) }
|
18
|
+
let(:lines) { IO.readlines("#{fixture_path}/#{name}_before.txt") }
|
19
|
+
let(:output_file) { "#{fixture_path}/#{name}_after.txt" }
|
20
|
+
let(:output_lines) { IO.readlines(output_file) }
|
21
|
+
|
22
|
+
specify { expect(parser.upgraded_lines(lines)).to eq(output_lines) }
|
23
|
+
specify { expect(parser.upgraded_lines(lines) * '').to eq(File.read(output_file)) }
|
24
|
+
|
25
|
+
# This dumps a purty colorized diff of what we expected to get
|
26
|
+
# on the left against what we actually got on the right. It's
|
27
|
+
# a very helpful visual aid when the spec is acting up. It's a
|
28
|
+
# fork in the eyeballs* if you just want to see green dots.
|
29
|
+
#
|
30
|
+
# * two forks, if you're into async
|
31
|
+
# it "dumps the file diff (no-op spec)" do
|
32
|
+
# parsed_lines = parser.upgraded_lines(lines)
|
33
|
+
|
34
|
+
# puts '-' * 80
|
35
|
+
# dump_diff(output_lines, parser.upgraded_lines(lines))
|
36
|
+
# puts '-' * 80
|
37
|
+
# puts parser.inspect
|
38
|
+
# end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# TODO: replace this with a hash of line => replacement pairs and a single spec
|
44
|
+
describe '#parse_line' do
|
45
|
+
context 'when line contains no SecureRandom.uuid or SecureRandom.hex calls' do
|
46
|
+
let(:line) { SecureRandom.hex(100) }
|
47
|
+
specify { expect(subject.parse_line(line)).to eq(line) }
|
48
|
+
end
|
49
|
+
|
50
|
+
# context "when line contains SecureRandom.hex(int)" do
|
51
|
+
# let(:line) { ' emit_noise("#{SecureRandom.hex(12)")' }
|
52
|
+
# it { pending "write me you clods" }
|
53
|
+
# end
|
54
|
+
|
55
|
+
# context "when line contains SecureRandom.hex int" do
|
56
|
+
# it { pending "write me you clods" }
|
57
|
+
# end
|
58
|
+
|
59
|
+
[:hex, :uuid].each do |method|
|
60
|
+
context "when line contains SecureRandom.#{method}" do
|
61
|
+
let(:line) { " let(:extra_fields) { Array.new(2) { SecureRandom.#{method} } }" }
|
62
|
+
it "replaces SecureRandom.#{method} with junk" do
|
63
|
+
expect(parser.parse_line(line)).to eq(' let(:extra_fields) { Array.new(2) { junk } }')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "when extra whitespace is present around SecureRandom.#{method}" do
|
68
|
+
let(:line) { " let(:extra_fields) { Array.new(2) { SecureRandom.#{method} } }" }
|
69
|
+
it "replaces SecureRandom.#{method} with junk" do
|
70
|
+
expect(parser.parse_line(line)).to eq(' let(:extra_fields) { Array.new(2) { junk } }')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when line contains SecureRandom.#{method}[range]" do
|
75
|
+
context "and range is [int..int] (e.g. [0..10])" do
|
76
|
+
let(:line) { "question_id: SecureRandom.#{method}[0..10]" }
|
77
|
+
it "replaces SecureRandom.#{method}[0..10] with junk(10)" do
|
78
|
+
expect(parser.parse_line(line)).to eq('question_id: junk(10)')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "and range is of form [n..int]" do
|
83
|
+
let(:line) { "question_id: SecureRandom.#{method}[3..10]" }
|
84
|
+
it "replaces SecureRandom.#{method}[0..10] with junk(7)" do
|
85
|
+
expect(parser.parse_line(line)).to eq('question_id: junk(7)')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "and range is [0..var] (e.g. [0..MAX_QUESTION_ID_LEN-1]" do
|
90
|
+
let(:line) { "SecureRandom.#{method}[0..Mogrifier::NcpdpScriptStandard::MAX_QUESTION_ID_LEN-1]" }
|
91
|
+
it "replaces SecureRandom.#{method}[0..n] with junk(n)" do
|
92
|
+
expect(parser.parse_line(line)).to eq('junk(Mogrifier::NcpdpScriptStandard::MAX_QUESTION_ID_LEN-1)')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
# TODO: three-dot ranges not yet supported due to rarity.
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../../lib/line'
|
3
|
+
|
4
|
+
describe Line do
|
5
|
+
let(:code) { Line.new(" # Here's some code\n") }
|
6
|
+
let(:let) { Line.new(" let(:bob) { 'Bob McRobertson' } \n") }
|
7
|
+
let(:uuid) { Line.new(" let(:uuid) { SecureRandom.uuid }\n") }
|
8
|
+
let(:hex) { Line.new(" let(:hex) { SecureRandom.hex }\n") }
|
9
|
+
let(:junklet) { Line.new(" junklet :reggie\n") }
|
10
|
+
let(:multi) { Line.new(" junklet :john, :paul, :ringo, :the_other_one") }
|
11
|
+
let(:blank) { Line.new("\n") }
|
12
|
+
let(:embedded) { Line.new(' let(:embedded) { "www.#{SecureRandom.uuid}.com" }\n') }
|
13
|
+
|
14
|
+
let(:uuid_arg) { Line.new(' let(:uuid_arg) { SecureRandom.uuid[0..10] }') }
|
15
|
+
let(:hex_arg) { Line.new(' let(:hex_arg) { SecureRandom.hex[0..10] }') }
|
16
|
+
|
17
|
+
specify { code.should be_code }
|
18
|
+
specify { code.should_not be_let }
|
19
|
+
specify { code.should_not be_junklet }
|
20
|
+
specify { code.names.should be_nil }
|
21
|
+
specify { code.convert.should be_nil }
|
22
|
+
|
23
|
+
specify { let.should_not be_code }
|
24
|
+
specify { let.should be_let }
|
25
|
+
specify { let.should_not be_junklet }
|
26
|
+
specify { let.names.should eq([':bob']) }
|
27
|
+
specify { let.convert.should be_nil }
|
28
|
+
|
29
|
+
specify { uuid.should_not be_code }
|
30
|
+
specify { uuid.should_not be_let }
|
31
|
+
specify { uuid.should be_junklet }
|
32
|
+
specify { uuid.convert.should eq(Line.new(" junklet :uuid")) }
|
33
|
+
|
34
|
+
specify { junklet.should_not be_code }
|
35
|
+
specify { junklet.should_not be_let }
|
36
|
+
specify { junklet.should be_junklet }
|
37
|
+
specify { junklet.names.should eq([':reggie']) }
|
38
|
+
specify { junklet.convert.should eq(junklet) }
|
39
|
+
|
40
|
+
specify { multi.should_not be_code }
|
41
|
+
specify { multi.should_not be_let }
|
42
|
+
specify { multi.should be_junklet }
|
43
|
+
specify { multi.names.should eq([':john', ':paul', ':ringo', ':the_other_one']) }
|
44
|
+
specify { multi.convert.should eq(multi) }
|
45
|
+
|
46
|
+
specify { blank.should be_code }
|
47
|
+
specify { blank.should_not be_let }
|
48
|
+
specify { blank.should_not be_junklet }
|
49
|
+
specify { blank.names.should be_nil }
|
50
|
+
specify { blank.convert.should be_nil }
|
51
|
+
|
52
|
+
specify { embedded.should_not be_code }
|
53
|
+
specify { embedded.should be_let }
|
54
|
+
specify { embedded.should_not be_junklet }
|
55
|
+
specify { embedded.names.should eq([':embedded']) }
|
56
|
+
specify { embedded.convert.should be_nil }
|
57
|
+
|
58
|
+
specify { hex.should_not be_code }
|
59
|
+
specify { hex.should_not be_let }
|
60
|
+
specify { hex.should be_junklet }
|
61
|
+
specify { hex.names.should eq([':hex']) }
|
62
|
+
specify { hex.convert.should eq(" junklet :hex") }
|
63
|
+
|
64
|
+
specify { uuid_arg.should_not be_code }
|
65
|
+
specify { uuid_arg.should be_let }
|
66
|
+
specify { uuid_arg.should_not be_junklet }
|
67
|
+
specify { uuid_arg.names.should eq([':uuid_arg']) }
|
68
|
+
specify { uuid_arg.convert.should be_nil }
|
69
|
+
|
70
|
+
specify { hex_arg.should_not be_code }
|
71
|
+
specify { hex_arg.should be_let }
|
72
|
+
specify { hex_arg.should_not be_junklet }
|
73
|
+
specify { hex_arg.names.should eq([':hex_arg']) }
|
74
|
+
specify { hex_arg.convert.should be_nil }
|
75
|
+
|
76
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,45 @@
|
|
1
1
|
# spec_helper.rb
|
2
2
|
|
3
3
|
require_relative '../lib/junklet'
|
4
|
+
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
# Since we've kept rigidly to 80-columns, we can easily
|
8
|
+
# Do a pretty side-by-side diff here. This won't handle
|
9
|
+
# Line deletions/insertions but for same/same diffs it'll
|
10
|
+
# work fine.
|
11
|
+
ESC = 27.chr
|
12
|
+
GREEN = "%c[%sm" % [ESC, 32]
|
13
|
+
RED = "%c[%sm" % [ESC, 31]
|
14
|
+
RESET = "%c[0m" % ESC
|
15
|
+
|
16
|
+
def dump_hline
|
17
|
+
puts(('-' * 80) + '-+-' + ('-' * 80))
|
18
|
+
end
|
19
|
+
|
20
|
+
def dump_captions
|
21
|
+
puts '%-80s | %s' % ["EXPECTED", "GOT"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def dump_header
|
25
|
+
dump_hline
|
26
|
+
dump_captions
|
27
|
+
end
|
28
|
+
|
29
|
+
def dump_footer
|
30
|
+
dump_hline
|
31
|
+
end
|
32
|
+
|
33
|
+
def line_pairs(expected_lines, got_lines)
|
34
|
+
expected_lines.zip(got_lines).map { |words| words.map {|w| w ? w.rstrip : '' } }
|
35
|
+
end
|
36
|
+
|
37
|
+
def dump_diff(expected_lines, got_lines)
|
38
|
+
dump_header
|
39
|
+
|
40
|
+
line_pairs(expected_lines, got_lines).each do |a,b|
|
41
|
+
color_code = a == b ? GREEN : RED
|
42
|
+
puts "#{color_code}%-80s | %s#{RESET}" % [a,b]
|
43
|
+
end
|
44
|
+
dump_footer
|
45
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: junklet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Brady
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: Works like let for rspec, but creates unique random junk data
|
70
84
|
email:
|
71
85
|
- dbrady@covermymeds.com
|
@@ -75,15 +89,29 @@ extra_rdoc_files: []
|
|
75
89
|
files:
|
76
90
|
- .gitignore
|
77
91
|
- .rspec
|
92
|
+
- .ruby-version
|
78
93
|
- Gemfile
|
79
94
|
- Gemfile.lock
|
80
95
|
- LICENSE
|
81
96
|
- README.md
|
82
|
-
- Rakefile
|
83
97
|
- junklet.gemspec
|
84
98
|
- lib/junklet.rb
|
85
99
|
- lib/junklet/version.rb
|
100
|
+
- lib/junklet_upgrade_parser.rb
|
101
|
+
- lib/line.rb
|
102
|
+
- spec/fixtures/block1_after.txt
|
103
|
+
- spec/fixtures/block1_before.txt
|
104
|
+
- spec/fixtures/combined_after.txt
|
105
|
+
- spec/fixtures/combined_before.txt
|
106
|
+
- spec/fixtures/embedded_after.txt
|
107
|
+
- spec/fixtures/embedded_before.txt
|
108
|
+
- spec/fixtures/mixed_code_after.txt
|
109
|
+
- spec/fixtures/mixed_code_before.txt
|
110
|
+
- spec/fixtures/old_skool_after.txt
|
111
|
+
- spec/fixtures/old_skool_before.txt
|
86
112
|
- spec/lib/junklet_spec.rb
|
113
|
+
- spec/lib/junklet_upgrade_parser_spec.rb
|
114
|
+
- spec/lib/line_spec.rb
|
87
115
|
- spec/spec_helper.rb
|
88
116
|
homepage: ''
|
89
117
|
licenses:
|
@@ -110,5 +138,17 @@ signing_key:
|
|
110
138
|
specification_version: 4
|
111
139
|
summary: Easily create junk data for specs
|
112
140
|
test_files:
|
141
|
+
- spec/fixtures/block1_after.txt
|
142
|
+
- spec/fixtures/block1_before.txt
|
143
|
+
- spec/fixtures/combined_after.txt
|
144
|
+
- spec/fixtures/combined_before.txt
|
145
|
+
- spec/fixtures/embedded_after.txt
|
146
|
+
- spec/fixtures/embedded_before.txt
|
147
|
+
- spec/fixtures/mixed_code_after.txt
|
148
|
+
- spec/fixtures/mixed_code_before.txt
|
149
|
+
- spec/fixtures/old_skool_after.txt
|
150
|
+
- spec/fixtures/old_skool_before.txt
|
113
151
|
- spec/lib/junklet_spec.rb
|
152
|
+
- spec/lib/junklet_upgrade_parser_spec.rb
|
153
|
+
- spec/lib/line_spec.rb
|
114
154
|
- spec/spec_helper.rb
|
data/Rakefile
DELETED