rainforest_ruby_runtime 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +35 -0
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +10 -0
- data/Gemfile +1 -6
- data/README.md +142 -2
- data/Rakefile +26 -5
- data/bin/rainforest_test +47 -2
- data/lib/rainforest_ruby_runtime.rb +4 -5
- data/lib/rainforest_ruby_runtime/drivers/sauce.rb +22 -11
- data/lib/rainforest_ruby_runtime/drivers/selenium.rb +34 -4
- data/lib/rainforest_ruby_runtime/dsl.rb +16 -2
- data/lib/rainforest_ruby_runtime/runner.rb +39 -67
- data/lib/rainforest_ruby_runtime/test.rb +1 -18
- data/lib/rainforest_ruby_runtime/variables/{registery.rb → registry.rb} +6 -6
- data/lib/rainforest_ruby_runtime/variables/scope.rb +1 -1
- data/lib/rainforest_ruby_runtime/version.rb +1 -1
- data/rainforest_ruby_runtime.gemspec +16 -5
- data/sample_tests/empty.rb +1 -1
- data/spec/rainforest_test_spec.rb +89 -0
- data/spec/runner_spec.rb +132 -0
- data/spec/spec_helper.rb +20 -0
- metadata +74 -26
- data/.travis.yml +0 -12
- data/lib/rainforest_ruby_runtime/drivers/browser_stack.rb +0 -42
- data/lib/rainforest_ruby_runtime/drivers/testing_bot.rb +0 -34
- data/test/runner_test.rb +0 -212
- data/test/test_helper.rb +0 -8
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(__dir__, "../lib")
|
2
|
+
|
3
|
+
require 'pry'
|
4
|
+
require 'awesome_print'
|
5
|
+
require 'rainforest_ruby_runtime'
|
6
|
+
require 'rspec'
|
7
|
+
|
8
|
+
ENV['RUNTIME_ENV'] = 'test'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.color = true
|
12
|
+
config.formatter = :documentation
|
13
|
+
|
14
|
+
config.before(show_output: true) do
|
15
|
+
ENV['SHOW_OUTPUT'] = 'true'
|
16
|
+
end
|
17
|
+
config.after(show_output: true) do
|
18
|
+
ENV.delete('SHOW_OUTPUT')
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rainforest_ruby_runtime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Mathieu
|
@@ -9,24 +9,52 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-04-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: pry
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '0'
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: byebug
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: awesome_print
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rspec_junit_formatter
|
30
58
|
requirement: !ruby/object:Gem::Requirement
|
31
59
|
requirements:
|
32
60
|
- - ">="
|
@@ -68,19 +96,19 @@ dependencies:
|
|
68
96
|
- !ruby/object:Gem::Version
|
69
97
|
version: '3.6'
|
70
98
|
- !ruby/object:Gem::Dependency
|
71
|
-
name: rspec
|
99
|
+
name: rspec
|
72
100
|
requirement: !ruby/object:Gem::Requirement
|
73
101
|
requirements:
|
74
|
-
- -
|
102
|
+
- - '='
|
75
103
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
104
|
+
version: 3.5.0
|
77
105
|
type: :runtime
|
78
106
|
prerelease: false
|
79
107
|
version_requirements: !ruby/object:Gem::Requirement
|
80
108
|
requirements:
|
81
|
-
- -
|
109
|
+
- - '='
|
82
110
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
111
|
+
version: 3.5.0
|
84
112
|
- !ruby/object:Gem::Dependency
|
85
113
|
name: capybara
|
86
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,19 +166,33 @@ dependencies:
|
|
138
166
|
- !ruby/object:Gem::Version
|
139
167
|
version: '3.0'
|
140
168
|
- !ruby/object:Gem::Dependency
|
141
|
-
name:
|
169
|
+
name: bundler
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - "~>"
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '1.16'
|
175
|
+
type: :runtime
|
176
|
+
prerelease: false
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - "~>"
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '1.16'
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: rake
|
142
184
|
requirement: !ruby/object:Gem::Requirement
|
143
185
|
requirements:
|
144
186
|
- - "~>"
|
145
187
|
- !ruby/object:Gem::Version
|
146
|
-
version:
|
188
|
+
version: '12.3'
|
147
189
|
type: :runtime
|
148
190
|
prerelease: false
|
149
191
|
version_requirements: !ruby/object:Gem::Requirement
|
150
192
|
requirements:
|
151
193
|
- - "~>"
|
152
194
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
195
|
+
version: '12.3'
|
154
196
|
description: Rainforest Ruby Runtime
|
155
197
|
email:
|
156
198
|
- simon@rainforestqa.com
|
@@ -160,27 +202,26 @@ executables:
|
|
160
202
|
extensions: []
|
161
203
|
extra_rdoc_files: []
|
162
204
|
files:
|
205
|
+
- ".circleci/config.yml"
|
163
206
|
- ".gitignore"
|
164
207
|
- ".ruby-gemset"
|
165
208
|
- ".ruby-version"
|
166
|
-
-
|
209
|
+
- CHANGELOG.md
|
167
210
|
- Gemfile
|
168
211
|
- LICENSE.txt
|
169
212
|
- README.md
|
170
213
|
- Rakefile
|
171
214
|
- bin/rainforest_test
|
172
215
|
- lib/rainforest_ruby_runtime.rb
|
173
|
-
- lib/rainforest_ruby_runtime/drivers/browser_stack.rb
|
174
216
|
- lib/rainforest_ruby_runtime/drivers/sauce.rb
|
175
217
|
- lib/rainforest_ruby_runtime/drivers/selenium.rb
|
176
|
-
- lib/rainforest_ruby_runtime/drivers/testing_bot.rb
|
177
218
|
- lib/rainforest_ruby_runtime/dsl.rb
|
178
219
|
- lib/rainforest_ruby_runtime/empty.rb
|
179
220
|
- lib/rainforest_ruby_runtime/exceptions.rb
|
180
221
|
- lib/rainforest_ruby_runtime/nil_delegator.rb
|
181
222
|
- lib/rainforest_ruby_runtime/runner.rb
|
182
223
|
- lib/rainforest_ruby_runtime/test.rb
|
183
|
-
- lib/rainforest_ruby_runtime/variables/
|
224
|
+
- lib/rainforest_ruby_runtime/variables/registry.rb
|
184
225
|
- lib/rainforest_ruby_runtime/variables/scope.rb
|
185
226
|
- lib/rainforest_ruby_runtime/variables/value.rb
|
186
227
|
- lib/rainforest_ruby_runtime/version.rb
|
@@ -194,13 +235,19 @@ files:
|
|
194
235
|
- sample_tests/simple.rb
|
195
236
|
- sample_tests/step_variables.rb
|
196
237
|
- sample_tests/two_steps.rb
|
197
|
-
-
|
198
|
-
-
|
238
|
+
- spec/rainforest_test_spec.rb
|
239
|
+
- spec/runner_spec.rb
|
240
|
+
- spec/spec_helper.rb
|
199
241
|
homepage: https://www.rainforestqa.com/
|
200
242
|
licenses:
|
201
243
|
- MIT
|
202
244
|
metadata: {}
|
203
|
-
post_install_message:
|
245
|
+
post_install_message: |2
|
246
|
+
Thanks for installing!
|
247
|
+
If you plan to run scripts against Sauce Labs, please run
|
248
|
+
`rainforest_test --prepare-sauce`
|
249
|
+
and set the SAUCE_USERNAME, SAUCE_ACCESS_KEY, and CAPYBARA_DRIVER
|
250
|
+
environment variables.
|
204
251
|
rdoc_options: []
|
205
252
|
require_paths:
|
206
253
|
- lib
|
@@ -216,10 +263,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
263
|
version: '0'
|
217
264
|
requirements: []
|
218
265
|
rubyforge_project:
|
219
|
-
rubygems_version: 2.
|
266
|
+
rubygems_version: 2.6.14.1
|
220
267
|
signing_key:
|
221
268
|
specification_version: 4
|
222
269
|
summary: Rainforest Ruby Runtime
|
223
270
|
test_files:
|
224
|
-
-
|
225
|
-
-
|
271
|
+
- spec/rainforest_test_spec.rb
|
272
|
+
- spec/runner_spec.rb
|
273
|
+
- spec/spec_helper.rb
|
data/.travis.yml
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'selenium/webdriver'
|
2
|
-
|
3
|
-
module RainforestRubyRuntime
|
4
|
-
module Drivers
|
5
|
-
class BrowserStack
|
6
|
-
attr_reader :options
|
7
|
-
|
8
|
-
def initialize(options)
|
9
|
-
@options = options
|
10
|
-
end
|
11
|
-
|
12
|
-
def call
|
13
|
-
url = "https://#{ENV['BROWSER_STACK_USERNAME']}:#{ENV['BROWSER_STACK_PASSWORD']}@hub.browserstack.com/wd/hub"
|
14
|
-
capabilities = ::Selenium::WebDriver::Remote::Capabilities.new browsers.first
|
15
|
-
capabilities['browserstack.debug'] = 'true'
|
16
|
-
|
17
|
-
::Capybara.register_driver :browser_stack do |app|
|
18
|
-
::Capybara::Selenium::Driver.new(app, browser: :remote, url: url, desired_capabilities: capabilities)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def browsers
|
25
|
-
Array(options[:browsers]).map do |browser|
|
26
|
-
{
|
27
|
-
"ie8" => {platform: "WINDOWS", browser: "internet explorer", browser_version: 8},
|
28
|
-
"ie9" => {platform: "WINDOWS", browser: "internet explorer", browser_version: 9},
|
29
|
-
"ie10" => {platform: "WINDOWS", browser: "internet explorer", browser_version: 10},
|
30
|
-
"ie11" => {platform: "WINDOWS", browser: "internet explorer", browser_version: 11},
|
31
|
-
"chrome" => {platform: "WINDOWS", browser: "chrome"},
|
32
|
-
"firefox" => {platform: "WINDOWS", browser: "firefox", browser_version: 30.0},
|
33
|
-
"safari" => {platform: "MAC", browser: "safari", browser_version: 7},
|
34
|
-
}.fetch(browser)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
Capybara.register_driver :browser_stack do |app|
|
42
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module RainforestRubyRuntime
|
2
|
-
module Drivers
|
3
|
-
class TestingBot
|
4
|
-
attr_reader :options
|
5
|
-
|
6
|
-
def initialize(options)
|
7
|
-
@options = options
|
8
|
-
end
|
9
|
-
|
10
|
-
def call
|
11
|
-
::TestingBot.config do |c|
|
12
|
-
c[:desired_capabilities] = browsers
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def browsers
|
19
|
-
Array(options[:browsers]).map do |browser|
|
20
|
-
{
|
21
|
-
"ie8" => {platform: "WINDOWS", browserName: "internet explorer", version: 8, idletimeout: 90},
|
22
|
-
"ie9" => {platform: "WINDOWS", browserName: "internet explorer", version: 9, idletimeout: 90},
|
23
|
-
"ie10" => {platform: "WINDOWS", browserName: "internet explorer", version: 10, idletimeout: 90},
|
24
|
-
"ie11" => {platform: "WINDOWS", browserName: "internet explorer", version: 11, idletimeout: 90},
|
25
|
-
"chrome" => {platform: "XP", browserName: "googlechrome", idletimeout: 90},
|
26
|
-
"firefox" => {platform: "XP", browserName: "firefox", version: 30.0, idletimeout: 90},
|
27
|
-
"safari" => {platform: "MAC", browserName: "safari", version: 7, idletimeout: 90},
|
28
|
-
}.fetch(browser)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
data/test/runner_test.rb
DELETED
@@ -1,212 +0,0 @@
|
|
1
|
-
require_relative './test_helper'
|
2
|
-
|
3
|
-
module RainforestRubyRuntime
|
4
|
-
describe Runner do
|
5
|
-
subject { Runner.new }
|
6
|
-
let(:code) { read_sample "empty" }
|
7
|
-
|
8
|
-
describe "#session_id" do
|
9
|
-
it "returns a session id" do
|
10
|
-
subject.stub(:current_driver, OpenStruct.new(browser: OpenStruct.new(session_id: 'session'))) do
|
11
|
-
subject.session_id.must_equal 'session'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "#run" do
|
17
|
-
describe "with a limited browser set" do
|
18
|
-
subject { Runner.new browsers: %w(chrome) }
|
19
|
-
|
20
|
-
it "applies the correct configuration" do
|
21
|
-
subject.stub(:driver, 'sauce') do
|
22
|
-
subject.run(code)
|
23
|
-
Sauce.get_config.browsers.must_equal [["Windows 7", "Chrome", "35"]]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "for a rainforest test" do
|
29
|
-
let(:code) { read_sample "simple" }
|
30
|
-
|
31
|
-
it "runs the content of the step" do
|
32
|
-
test = subject.run(code)
|
33
|
-
test.must_be_instance_of(Test)
|
34
|
-
$simple_test_was.must_equal :run
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "for another type of test" do
|
39
|
-
it "raises an exception" do
|
40
|
-
-> do
|
41
|
-
subject.run("")
|
42
|
-
end.must_raise(WrongReturnValueError)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "with custom step variables" do
|
47
|
-
let(:code) { read_sample "step_variables" }
|
48
|
-
|
49
|
-
it "makes the variable accessible in the test" do
|
50
|
-
subject.run(code)
|
51
|
-
$step_variable_1_was.wont_be_nil
|
52
|
-
$step_variable_2_was.must_match(/time is: .*/)
|
53
|
-
$step_variable_3_was.must_equal("1")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "#extract_results" do
|
59
|
-
subject { Runner.new.extract_results(code, fake_session_id: :test) }
|
60
|
-
|
61
|
-
describe "a failing spec" do
|
62
|
-
let(:code) { format_step "expect(1).to eq(2)" }
|
63
|
-
it "catches failled rspec assertions" do
|
64
|
-
subject[:message].must_include "expected: 2"
|
65
|
-
subject[:status].must_equal "failed"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "select capybara error" do
|
70
|
-
let(:code) { format_step "raise Capybara::ElementNotFound" }
|
71
|
-
it "catches failled rspec assertions" do
|
72
|
-
subject[:status].must_equal "failed"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe "a passing spec" do
|
77
|
-
let(:code) { format_step "expect(1).to eq(1)" }
|
78
|
-
it "returns a 'passed'" do
|
79
|
-
subject[:status].must_equal "passed"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "a spec raising a runtime error" do
|
84
|
-
let(:code) { format_step "raise 'foo'" }
|
85
|
-
it "returns an 'error'" do
|
86
|
-
subject[:status].must_equal "error"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe "a spec raising a selenium error" do
|
91
|
-
let(:code) { format_step "raise Selenium::WebDriver::Error::WebDriverError" }
|
92
|
-
it "returns an 'error'" do
|
93
|
-
subject[:status].must_equal "error"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
describe "a spec with syntax error" do
|
98
|
-
let(:code) { format_step "if if true; puts true; end;" }
|
99
|
-
it "returns an 'fatal_error'" do
|
100
|
-
subject[:status].must_equal "fatal_error"
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe "a tests that outputs to stdout" do
|
105
|
-
let(:code) { format_step "print 'hello'" }
|
106
|
-
it "captures it and adds it to the payload" do
|
107
|
-
subject[:stdout].must_equal "hello"
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
describe "a tests that errputs to stderr" do
|
112
|
-
let(:code) { format_step "$stderr.print 'hello'" }
|
113
|
-
it "captures it and adds it to the payload" do
|
114
|
-
subject[:stderr].must_equal "hello"
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "a test with predefined values for custom variables" do
|
119
|
-
let(:code) { read_sample "step_variables" }
|
120
|
-
let(:step_variables) do
|
121
|
-
{
|
122
|
-
"my_custom_scope" => {
|
123
|
-
"uuid" => "some_uuid",
|
124
|
-
"time" => "some_time",
|
125
|
-
},
|
126
|
-
"my_other_scope" => {
|
127
|
-
"constant" => "some_constant",
|
128
|
-
}
|
129
|
-
}
|
130
|
-
end
|
131
|
-
let(:runner) { Runner.new(step_variables: step_variables) }
|
132
|
-
|
133
|
-
subject do
|
134
|
-
runner.extract_results(code, fake_session_id: :test)
|
135
|
-
end
|
136
|
-
|
137
|
-
it "uses the passed in variables" do
|
138
|
-
subject[:status].must_equal "passed"
|
139
|
-
$step_variable_1_was.must_equal "some_uuid"
|
140
|
-
$step_variable_2_was.must_equal "some_time"
|
141
|
-
$step_variable_3_was.must_equal "some_constant"
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
describe "callbacks" do
|
147
|
-
let(:callback) do
|
148
|
-
Class.new do
|
149
|
-
attr_reader :before_steps, :before_tests, :after_steps, :after_tests
|
150
|
-
|
151
|
-
def initialize
|
152
|
-
@before_steps = []
|
153
|
-
@after_steps = []
|
154
|
-
@after_tests = []
|
155
|
-
@before_tests = []
|
156
|
-
end
|
157
|
-
|
158
|
-
def before_step(step)
|
159
|
-
@before_steps << step
|
160
|
-
end
|
161
|
-
|
162
|
-
def after_step(step)
|
163
|
-
@after_steps << step
|
164
|
-
end
|
165
|
-
|
166
|
-
def after_test(test)
|
167
|
-
@after_tests << test
|
168
|
-
end
|
169
|
-
|
170
|
-
def before_test(test)
|
171
|
-
@before_tests << test
|
172
|
-
end
|
173
|
-
end.new
|
174
|
-
end
|
175
|
-
|
176
|
-
let(:code) { read_sample "two_steps" }
|
177
|
-
subject { Runner.new callback: callback }
|
178
|
-
|
179
|
-
it "calls the right method on the callback object" do
|
180
|
-
subject.run(code)
|
181
|
-
callback.before_tests.size.must_equal 1
|
182
|
-
callback.after_tests.size.must_equal 1
|
183
|
-
callback.before_steps.size.must_equal 2
|
184
|
-
callback.after_steps.size.must_equal 2
|
185
|
-
|
186
|
-
callback.before_steps.map(&:id).must_equal [1, 2]
|
187
|
-
callback.after_steps.map(&:id).must_equal [1, 2]
|
188
|
-
|
189
|
-
callback.before_steps.map(&:action).must_equal ["action 1", "action 2"]
|
190
|
-
end
|
191
|
-
|
192
|
-
describe "a partially define callback object" do
|
193
|
-
let(:callback) do
|
194
|
-
Class.new do
|
195
|
-
end.new
|
196
|
-
end
|
197
|
-
|
198
|
-
it "should not rise a method missing exception" do
|
199
|
-
subject.run(code)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def read_sample(name)
|
205
|
-
File.read(File.expand_path("../sample_tests/#{name}.rb", __dir__))
|
206
|
-
end
|
207
|
-
|
208
|
-
def format_step(code)
|
209
|
-
read_sample("one_step").gsub("#REPLACE", code)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|