junklet 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +1 -1
- data/README.md +8 -0
- data/lib/junklet.rb +17 -5
- data/lib/junklet/version.rb +1 -1
- data/spec/lib/junklet_spec.rb +5 -0
- metadata +1 -4
- data/lib/junklet_upgrade_parser.rb +0 -151
- data/spec/lib/junklet_upgrade_parser_spec.rb +0 -99
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MTJlN2QwZTEyOGU1OThhMzBmYzMwY2RhYTAzM2E1NzQzNWJhNGM4MQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MjA3MDU1MDhlNzE4YmI2NGJlN2RmYmZjNGU2ZDIxMjIzMmQzMDIxNw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTg2NTc3MzJmNTBiYmM4OGI4NTZjZGU0MDA3MDgzNjg1NWY4ZDY5MDlmMGQ5
|
10
|
+
Mjc0MGRjYjY0ZWE2N2E1M2ZiM2E1MmVhOTBlYjk3NjdhZWQ4NGQ0YTk5YzQw
|
11
|
+
MDBjZDQxYmI0YzE2NGVkN2RiMmNlY2YwMTFkY2JkMzJmZmU1MGY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OWNhZDNlNjQ0NmZlNDdmNDg1N2U3YWZlOWMzMjIyNmUzZGY5ZGM0NDJhOWIx
|
14
|
+
OWZiYzk4ZDRjYmRkNTNlZTg0YjM5YmQxZGFlMDgwMGI5N2ZmODZkNGFmODI3
|
15
|
+
YmE5MTZhY2E5ZTAyMjc3NmZlNzYzYWExZDcwOTcwYWEzOTI5NGU=
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -135,6 +135,14 @@ junk(:int) # returns a random, positive ruby Fixnum between 0 and
|
|
135
135
|
junk(:int, min: 5, max: 9) # returns a number from 5 to 9
|
136
136
|
junk(:int, max: 1) # returns 0 or 1
|
137
137
|
|
138
|
+
# If you just know how many digits you need, use size:
|
139
|
+
|
140
|
+
junk(:int, size: 3) # generates number between 100 and 999
|
141
|
+
|
142
|
+
# min and max can further constrain size (but not expand it):
|
143
|
+
junk(:int, size: 3, min: 425) # number from 425 to 999
|
144
|
+
junk(:int, size: 3, max: 425) # number from 100 to 425
|
145
|
+
|
138
146
|
junk(:bool) # returns true or false
|
139
147
|
|
140
148
|
junk([:a, :b, :c]) # samples from the Array
|
data/lib/junklet.rb
CHANGED
@@ -78,11 +78,23 @@ module RSpec
|
|
78
78
|
# available here?
|
79
79
|
case type
|
80
80
|
when :int
|
81
|
-
#
|
82
|
-
#
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
# min,max cooperate with size to further constrain it. So
|
82
|
+
# size: 2, min: 30 would be min 30, max 99.
|
83
|
+
if opts[:size]
|
84
|
+
sized_min = 10**(opts[:size]-1)
|
85
|
+
sized_max = 10**opts[:size]-1
|
86
|
+
end
|
87
|
+
explicit_min = opts[:min] || 0
|
88
|
+
explicit_max = (opts[:max] || 2**62-2) + 1
|
89
|
+
|
90
|
+
if sized_min
|
91
|
+
min = [sized_min, explicit_min].max
|
92
|
+
max = [sized_max, explicit_max].min
|
93
|
+
else
|
94
|
+
min = sized_min || explicit_min
|
95
|
+
max = sized_max || explicit_max
|
96
|
+
end
|
97
|
+
|
86
98
|
min,max = max,min if min>max
|
87
99
|
|
88
100
|
generator = -> { rand(max-min) + min }
|
data/lib/junklet/version.rb
CHANGED
data/spec/lib/junklet_spec.rb
CHANGED
@@ -111,6 +111,11 @@ describe Junklet do
|
|
111
111
|
specify { expect([0,1]).to include(coin) }
|
112
112
|
end
|
113
113
|
|
114
|
+
context "with size" do
|
115
|
+
let(:digit) { junk :int, size: 1 }
|
116
|
+
specify { expect(digit).to be < 10 }
|
117
|
+
end
|
118
|
+
|
114
119
|
context "with exclude proc" do
|
115
120
|
let(:junk_evens) { junk :int, min: 0, max: 10, exclude: ->(x) { x % 2 == 1 } }
|
116
121
|
specify { expect(junk_evens % 2).to eq(0) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: junklet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Brady
|
@@ -97,7 +97,6 @@ files:
|
|
97
97
|
- junklet.gemspec
|
98
98
|
- lib/junklet.rb
|
99
99
|
- lib/junklet/version.rb
|
100
|
-
- lib/junklet_upgrade_parser.rb
|
101
100
|
- lib/line.rb
|
102
101
|
- spec/fixtures/block1_after.txt
|
103
102
|
- spec/fixtures/block1_before.txt
|
@@ -110,7 +109,6 @@ files:
|
|
110
109
|
- spec/fixtures/old_skool_after.txt
|
111
110
|
- spec/fixtures/old_skool_before.txt
|
112
111
|
- spec/lib/junklet_spec.rb
|
113
|
-
- spec/lib/junklet_upgrade_parser_spec.rb
|
114
112
|
- spec/lib/line_spec.rb
|
115
113
|
- spec/spec_helper.rb
|
116
114
|
homepage: ''
|
@@ -149,6 +147,5 @@ test_files:
|
|
149
147
|
- spec/fixtures/old_skool_after.txt
|
150
148
|
- spec/fixtures/old_skool_before.txt
|
151
149
|
- spec/lib/junklet_spec.rb
|
152
|
-
- spec/lib/junklet_upgrade_parser_spec.rb
|
153
150
|
- spec/lib/line_spec.rb
|
154
151
|
- spec/spec_helper.rb
|
@@ -1,151 +0,0 @@
|
|
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
|
@@ -1,99 +0,0 @@
|
|
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
|