ruby_raider 0.1.1 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/Gemfile +5 -0
- data/README.md +17 -3
- data/bin/raider +0 -0
- data/lib/generators/files/automation_file_generator.rb +137 -0
- data/lib/generators/files/common_file_generator.rb +29 -1
- data/lib/generators/files/cucumber_file_generator.rb +81 -0
- data/lib/generators/files/helpers_file_generator.rb +107 -26
- data/lib/generators/files/rspec_file_generator.rb +9 -12
- data/lib/generators/menu_generator.rb +17 -7
- data/lib/generators/projects/cucumber_project_generator.rb +15 -5
- data/lib/generators/projects/rspec_project_generator.rb +2 -5
- data/lib/ruby_raider.rb +3 -3
- data/ruby_raider.gemspec +4 -3
- data/spec/{watir_file_generator_spec.rb → automation_file_generator_spec.rb} +2 -2
- metadata +28 -15
- data/.idea/.gitignore +0 -8
- data/.idea/modules.xml +0 -8
- data/.idea/ruby_raider.iml +0 -20
- data/lib/generators/files/watir_file_generator.rb +0 -144
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1862a69fc2192fafab5d76cacff2bfa956bfdec819c04897f80d689672962655
|
|
4
|
+
data.tar.gz: 190c50a7c66fbde69c04f2c35d6756a8737cbb529e15e5227163c99f8893c06f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz: '
|
|
6
|
+
metadata.gz: 5acde20915a1ecfa077e30b7aebe197e207c8216e85339be9f01e7985d989450698965eae5d0019aa49f6098bdca42a5e7ecd7e3652a274410e142bcd1f942fc
|
|
7
|
+
data.tar.gz: '08a74887fa8efb62838305aedcf99240b7c234789af3f3ec1dbb098b0a59404feb2a998146234736b41a4847ad163ceea44d88b34d0f611f73b92e64395ca2ad'
|
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/README.md
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
# ruby_raider
|
|
2
2
|
This is a gem to make setup and start of UI automation projects easier
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
after you can select the automation framework of your choice and the test framework of your choice.
|
|
4
|
+
Just do:
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
**gem install ruby_raider**
|
|
7
|
+
|
|
8
|
+
then do:
|
|
9
|
+
|
|
10
|
+
**raider [name_of_project]**
|
|
11
|
+
|
|
12
|
+
and you will have a new project in the folder you are in
|
|
13
|
+
|
|
14
|
+
Currently we only support:
|
|
15
|
+
|
|
16
|
+
* Gerating a Selenium with Rspec framework
|
|
17
|
+
* Gerating a Watir with Rspec framework
|
|
8
18
|
|
|
9
19
|
We have only tested this in mac and linux, so it works in both platforms.
|
|
20
|
+
|
|
21
|
+
If you wanna follow the development progress
|
|
22
|
+
|
|
23
|
+
https://trello.com/b/Nj7UPy0w/ruby-raider
|
data/bin/raider
CHANGED
|
File without changes
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
require_relative 'file_generator'
|
|
2
|
+
|
|
3
|
+
module RubyRaider
|
|
4
|
+
class AutomationFileGenerator < FileGenerator
|
|
5
|
+
def self.generate_automation_files(name, automation, framework)
|
|
6
|
+
generate_file('abstract_page.rb', "#{name}/page_objects/abstract", abstract_page(automation, framework))
|
|
7
|
+
generate_file('abstract_component.rb', "#{name}/page_objects/abstract", abstract_component(framework))
|
|
8
|
+
generate_file('login_page.rb', "#{name}/page_objects/pages", example_page(automation))
|
|
9
|
+
generate_file('header_component.rb', "#{name}/page_objects/components", example_component)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.example_page(automation)
|
|
13
|
+
element = automation == 'watir' ? 'browser.element' : 'driver.find_element'
|
|
14
|
+
page_file = ERB.new <<~EOF
|
|
15
|
+
require_relative '../abstract/abstract_page'
|
|
16
|
+
require_relative '../components/header_component'
|
|
17
|
+
|
|
18
|
+
class LoginPage < AbstractPage
|
|
19
|
+
|
|
20
|
+
using #{automation == 'watir' ? 'Raider::WatirHelper' : 'Raider::SeleniumHelper'}
|
|
21
|
+
|
|
22
|
+
def url(_page)
|
|
23
|
+
'index.php?rt=account/login'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Actions
|
|
27
|
+
|
|
28
|
+
def login(username, password)
|
|
29
|
+
username_field.send_keys username
|
|
30
|
+
password_field.send_keys password
|
|
31
|
+
login_button.click_when_present
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Components
|
|
35
|
+
|
|
36
|
+
def header
|
|
37
|
+
HeaderComponent.new(#{element}(class: 'menu_text'))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
# Elements
|
|
43
|
+
|
|
44
|
+
def username_field
|
|
45
|
+
#{element}(id: 'loginFrm_loginname')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def password_field
|
|
49
|
+
#{element}(id: 'loginFrm_password')
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def login_button
|
|
53
|
+
#{element}(xpath: "//button[@title='Login']")
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
EOF
|
|
57
|
+
page_file.result(binding)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.abstract_page(automation, framework)
|
|
61
|
+
browser = "def browser
|
|
62
|
+
Raider::BrowserHelper.browser
|
|
63
|
+
end"
|
|
64
|
+
driver = "def driver
|
|
65
|
+
Raider::DriverHelper.driver
|
|
66
|
+
end"
|
|
67
|
+
visit = automation == 'watir' ? 'browser.goto full_url(page.first)' : 'driver.navigate.to full_url(page.first)'
|
|
68
|
+
raider = if framework == 'rspec'
|
|
69
|
+
"require_relative '../../helpers/raider'"
|
|
70
|
+
else
|
|
71
|
+
"require_relative '../../features/support/helpers/raider'"
|
|
72
|
+
end
|
|
73
|
+
abstract_file = ERB.new <<~EOF
|
|
74
|
+
require 'rspec'
|
|
75
|
+
#{raider}
|
|
76
|
+
|
|
77
|
+
class AbstractPage
|
|
78
|
+
|
|
79
|
+
include RSpec::Matchers
|
|
80
|
+
extend Raider::PomHelper
|
|
81
|
+
|
|
82
|
+
#{automation == 'watir' ? browser : driver}
|
|
83
|
+
|
|
84
|
+
def visit(*page)
|
|
85
|
+
#{visit}
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def full_url(*page)
|
|
89
|
+
"#\{base_url}#\{url(*page)}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def base_url
|
|
93
|
+
'https://automationteststore.com/'
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def url(_page)
|
|
97
|
+
raise 'Url must be defined on child pages'
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
EOF
|
|
101
|
+
abstract_file.result(binding)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def self.example_component
|
|
105
|
+
page_file = ERB.new <<~EOF
|
|
106
|
+
require_relative '../abstract/abstract_component'
|
|
107
|
+
|
|
108
|
+
class HeaderComponent < AbstractComponent
|
|
109
|
+
|
|
110
|
+
def customer_name
|
|
111
|
+
@component.text
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
EOF
|
|
115
|
+
page_file.result(binding)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def self.abstract_component(framework)
|
|
119
|
+
raider = if framework == 'rspec'
|
|
120
|
+
"require_relative '../../helpers/raider'"
|
|
121
|
+
else
|
|
122
|
+
"require_relative '../../features/support/helpers/raider'"
|
|
123
|
+
end
|
|
124
|
+
abstract_file = ERB.new <<~EOF
|
|
125
|
+
#{raider}
|
|
126
|
+
|
|
127
|
+
class AbstractComponent
|
|
128
|
+
|
|
129
|
+
def initialize(component)
|
|
130
|
+
@component = component
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
EOF
|
|
134
|
+
abstract_file.result(binding)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -2,10 +2,11 @@ require_relative 'file_generator'
|
|
|
2
2
|
|
|
3
3
|
module RubyRaider
|
|
4
4
|
class CommonFileGenerator < FileGenerator
|
|
5
|
-
def self.generate_common_files(name)
|
|
5
|
+
def self.generate_common_files(name, framework)
|
|
6
6
|
generate_file('config.yml', "#{name}/config", config_file)
|
|
7
7
|
generate_file('Rakefile', name.to_s, rake_file)
|
|
8
8
|
generate_file('Readme.md', name.to_s, readme_file)
|
|
9
|
+
generate_file('Gemfile', name.to_s, gemfile_template((framework)))
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def self.readme_file
|
|
@@ -130,5 +131,32 @@ module RubyRaider
|
|
|
130
131
|
EOF
|
|
131
132
|
rake_file.result(binding)
|
|
132
133
|
end
|
|
134
|
+
|
|
135
|
+
def self.gemfile_template(framework)
|
|
136
|
+
if framework == 'cucumber'
|
|
137
|
+
allure_cucumber = "gem 'allure-cucumber'"
|
|
138
|
+
rspec = "gem 'rspec'"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
gemfile = ERB.new <<~EOF
|
|
142
|
+
# frozen_string_literal: true
|
|
143
|
+
|
|
144
|
+
source 'https://rubygems.org'
|
|
145
|
+
|
|
146
|
+
gem 'activesupport'
|
|
147
|
+
gem 'allure-rspec'
|
|
148
|
+
gem 'allure-ruby-commons'
|
|
149
|
+
#{allure_cucumber}
|
|
150
|
+
gem 'parallel_split_test'
|
|
151
|
+
gem 'parallel_tests'
|
|
152
|
+
gem 'rake'
|
|
153
|
+
gem '#{framework}'
|
|
154
|
+
#{rspec}
|
|
155
|
+
gem 'selenium-webdriver'
|
|
156
|
+
gem 'watir'
|
|
157
|
+
gem 'webdrivers'
|
|
158
|
+
EOF
|
|
159
|
+
gemfile.result(binding)
|
|
160
|
+
end
|
|
133
161
|
end
|
|
134
162
|
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require_relative 'file_generator'
|
|
2
|
+
|
|
3
|
+
module RubyRaider
|
|
4
|
+
class CucumberFileGenerator < FileGenerator
|
|
5
|
+
def self.generate_cucumber_files(name, automation)
|
|
6
|
+
CommonFileGenerator.generate_common_files(name, 'cucumber')
|
|
7
|
+
HelpersFileGenerator.generate_helper_files(name, automation, 'cucumber')
|
|
8
|
+
generate_file('login.feature', "#{name}/features", example_feature)
|
|
9
|
+
generate_file('login_steps.rb', "#{name}/features/step_definitions", example_steps)
|
|
10
|
+
generate_file('env.rb', "#{name}/features/support", env(automation))
|
|
11
|
+
AutomationFileGenerator.generate_automation_files(name, automation, 'framework')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.example_feature
|
|
15
|
+
gemfile = ERB.new <<~EOF
|
|
16
|
+
Feature: Login Page
|
|
17
|
+
|
|
18
|
+
Scenario: A user can login
|
|
19
|
+
Given I'm a registered user on the login page
|
|
20
|
+
When I login with my credentials
|
|
21
|
+
Then I can see the main page
|
|
22
|
+
|
|
23
|
+
EOF
|
|
24
|
+
gemfile.result(binding)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.example_steps
|
|
28
|
+
gemfile = ERB.new <<~EOF
|
|
29
|
+
require_relative '../../page_objects/pages/login_page'
|
|
30
|
+
|
|
31
|
+
Given("I'm a registered user on the login page") do
|
|
32
|
+
LoginPage.visit
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
When('I login with my credentials') do
|
|
36
|
+
LoginPage.login('aguspe', '12341234')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
When('I can see the main page') do
|
|
40
|
+
expect(LoginPage.header.customer_name).to eq 'Welcome back Agustin'
|
|
41
|
+
end
|
|
42
|
+
EOF
|
|
43
|
+
gemfile.result(binding)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.env(automation)
|
|
47
|
+
if automation == 'watir'
|
|
48
|
+
helper = 'helpers/browser_helper'
|
|
49
|
+
browser = 'Raider::BrowserHelper.new_browser'
|
|
50
|
+
get_browser = 'browser = Raider::BrowserHelper.new_browser'
|
|
51
|
+
screenshot = 'browser.screenshot.save("allure-results/screenshots/#{scenario.name}.png")'
|
|
52
|
+
quit = 'browser.quit'
|
|
53
|
+
else
|
|
54
|
+
helper = 'helpers/driver_helper'
|
|
55
|
+
browser = 'Raider::DriverHelper.new_driver'
|
|
56
|
+
get_browser = 'driver = Raider::DriverHelper.driver'
|
|
57
|
+
screenshot = 'driver.save_screenshot("allure-results/screenshots/#{scenario.name}.png")'
|
|
58
|
+
quit = 'driver.quit'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
gemfile = ERB.new <<~EOF
|
|
62
|
+
require 'active_support/all'
|
|
63
|
+
require_relative 'helpers/allure_helper'
|
|
64
|
+
require_relative '#{helper}'
|
|
65
|
+
|
|
66
|
+
Before do
|
|
67
|
+
Raider::AllureHelper.configure
|
|
68
|
+
#{browser}
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
After do |scenario|
|
|
72
|
+
#{get_browser}
|
|
73
|
+
#{screenshot}
|
|
74
|
+
Raider::AllureHelper.add_screenshot(scenario.name)
|
|
75
|
+
#{quit}
|
|
76
|
+
end
|
|
77
|
+
EOF
|
|
78
|
+
gemfile.result(binding)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -2,56 +2,73 @@ require_relative 'file_generator'
|
|
|
2
2
|
|
|
3
3
|
module RubyRaider
|
|
4
4
|
class HelpersFileGenerator < FileGenerator
|
|
5
|
-
def self.generate_helper_files(name)
|
|
6
|
-
|
|
7
|
-
generate_file('
|
|
8
|
-
generate_file('
|
|
9
|
-
generate_file('pom_helper.rb',
|
|
10
|
-
generate_file('
|
|
11
|
-
|
|
5
|
+
def self.generate_helper_files(name, automation, framework)
|
|
6
|
+
path = framework == 'rspec' ? "#{name}/helpers" : "#{name}/features/support/helpers"
|
|
7
|
+
generate_file('raider.rb', path, generate_raider_helper(automation, framework))
|
|
8
|
+
generate_file('allure_helper.rb', path, generate_allure_helper(framework))
|
|
9
|
+
generate_file('pom_helper.rb', path, generate_pom_helper)
|
|
10
|
+
generate_file('spec_helper.rb', path, generate_spec_helper((automation))) if framework == 'rspec'
|
|
11
|
+
if automation == 'watir'
|
|
12
|
+
generate_file('watir_helper.rb', path, generate_watir_helper)
|
|
13
|
+
generate_file('browser_helper.rb', path, generate_browser_helper)
|
|
14
|
+
else
|
|
15
|
+
generate_file('selenium_helper.rb', path, generate_selenium_helper)
|
|
16
|
+
generate_file('driver_helper.rb', path, generate_driver_helper)
|
|
17
|
+
end
|
|
12
18
|
end
|
|
13
19
|
|
|
14
|
-
def self.generate_raider_helper
|
|
20
|
+
def self.generate_raider_helper(automation, framework)
|
|
15
21
|
spec = ERB.new <<~EOF
|
|
16
22
|
module Raider
|
|
17
|
-
require_relative 'spec_helper'
|
|
18
|
-
require_relative '
|
|
23
|
+
#{"require_relative 'spec_helper'" if framework == 'rspec'}
|
|
24
|
+
require_relative '#{automation}_helper'
|
|
19
25
|
require_relative 'pom_helper'
|
|
20
|
-
require_relative 'browser_helper'
|
|
26
|
+
require_relative '#{automation == 'watir' ? 'browser_helper' : 'driver_helper'}'
|
|
21
27
|
require_relative 'allure_helper'
|
|
22
28
|
end
|
|
23
29
|
EOF
|
|
30
|
+
|
|
24
31
|
spec.result(binding)
|
|
25
32
|
end
|
|
26
33
|
|
|
27
|
-
def self.generate_allure_helper
|
|
34
|
+
def self.generate_allure_helper(framework)
|
|
35
|
+
if framework == 'cucumber'
|
|
36
|
+
gems = "require 'allure-cucumber'"
|
|
37
|
+
allure = 'AllureCucumber'
|
|
38
|
+
else
|
|
39
|
+
gems = "require 'allure-ruby-commons'
|
|
40
|
+
require 'allure-rspec'"
|
|
41
|
+
allure = 'AllureRspec'
|
|
42
|
+
end
|
|
28
43
|
spec = ERB.new <<~EOF
|
|
29
|
-
|
|
30
|
-
require 'allure-rspec'
|
|
44
|
+
#{gems}
|
|
31
45
|
|
|
32
46
|
module Raider
|
|
33
47
|
module AllureHelper
|
|
34
48
|
class << self
|
|
35
49
|
|
|
36
50
|
def configure
|
|
37
|
-
|
|
51
|
+
#{allure}.configure do |config|
|
|
38
52
|
config.results_directory = 'allure-results'
|
|
39
53
|
config.clean_results_directory = true
|
|
40
54
|
end
|
|
41
55
|
end
|
|
42
56
|
|
|
43
|
-
def add_screenshot(
|
|
57
|
+
def add_screenshot(screenshot_name)
|
|
44
58
|
Allure.add_attachment(
|
|
45
59
|
name: name,
|
|
46
|
-
source: File.open(
|
|
60
|
+
source: "File.open(allure-results/screenshots/\#{screenshot_name}.png)",
|
|
47
61
|
type: Allure::ContentType::PNG,
|
|
48
62
|
test_case: true
|
|
49
63
|
)
|
|
50
64
|
end
|
|
51
65
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
66
|
+
#{
|
|
67
|
+
if framework == 'rspec'
|
|
68
|
+
'def formatter
|
|
69
|
+
AllureRspecFormatter
|
|
70
|
+
end'
|
|
71
|
+
end }
|
|
55
72
|
end
|
|
56
73
|
end
|
|
57
74
|
end
|
|
@@ -78,6 +95,7 @@ module RubyRaider
|
|
|
78
95
|
end
|
|
79
96
|
end
|
|
80
97
|
end
|
|
98
|
+
|
|
81
99
|
EOF
|
|
82
100
|
spec.result(binding)
|
|
83
101
|
end
|
|
@@ -105,12 +123,12 @@ module RubyRaider
|
|
|
105
123
|
spec.result(binding)
|
|
106
124
|
end
|
|
107
125
|
|
|
108
|
-
def self.generate_spec_helper
|
|
126
|
+
def self.generate_spec_helper(automation)
|
|
109
127
|
spec = ERB.new <<~EOF
|
|
110
128
|
require 'active_support/all'
|
|
111
129
|
require 'rspec'
|
|
112
130
|
require_relative 'allure_helper'
|
|
113
|
-
require_relative 'browser_helper'
|
|
131
|
+
require_relative '#{automation == 'watir' ? 'browser_helper' : 'driver_helper'}'
|
|
114
132
|
|
|
115
133
|
module Raider
|
|
116
134
|
module SpecHelper
|
|
@@ -120,16 +138,16 @@ module RubyRaider
|
|
|
120
138
|
RSpec.configure do |config|
|
|
121
139
|
config.formatter = AllureHelper.formatter
|
|
122
140
|
config.before(:each) do
|
|
123
|
-
BrowserHelper.new_browser
|
|
141
|
+
#{automation == 'watir' ? 'BrowserHelper.new_browser' : 'DriverHelper.new_driver'}
|
|
124
142
|
end
|
|
125
143
|
|
|
126
144
|
config.after(:each) do
|
|
127
|
-
browser = BrowserHelper.browser
|
|
145
|
+
#{automation == 'watir' ? 'browser = BrowserHelper.browser' : 'driver = DriverHelper.driver'}
|
|
128
146
|
example_name = self.class.descendant_filtered_examples.first.description
|
|
129
147
|
status = self.class.descendant_filtered_examples.first.execution_result.status
|
|
130
|
-
browser.save_screenshot("allure-results/screenshots/#\{example_name}.png") if status == :failed
|
|
148
|
+
#{automation == 'watir' ? 'browser' : 'driver'}.save_screenshot("allure-results/screenshots/#\{example_name}.png") if status == :failed
|
|
131
149
|
AllureHelper.add_screenshot example_name if status == :failed
|
|
132
|
-
browser.quit
|
|
150
|
+
#{automation == 'watir' ? 'browser.quit' : 'driver.quit'}
|
|
133
151
|
end
|
|
134
152
|
end
|
|
135
153
|
end
|
|
@@ -159,5 +177,68 @@ module RubyRaider
|
|
|
159
177
|
EOF
|
|
160
178
|
spec.result(binding)
|
|
161
179
|
end
|
|
180
|
+
|
|
181
|
+
def self.generate_selenium_helper
|
|
182
|
+
spec = ERB.new <<~EOF
|
|
183
|
+
require 'selenium-webdriver'
|
|
184
|
+
require_relative 'driver_helper'
|
|
185
|
+
|
|
186
|
+
module Raider
|
|
187
|
+
module SeleniumHelper
|
|
188
|
+
def click_when_present
|
|
189
|
+
# This is an example of an implicit wait in selenium
|
|
190
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 15)
|
|
191
|
+
wait.until { present? }
|
|
192
|
+
click
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def select_by(key, value)
|
|
196
|
+
# Creates new Select object to use the select by method
|
|
197
|
+
dropdown = Selenium::WebDriver::Support::Select.new self
|
|
198
|
+
dropdown.select_by(key, value)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def hover
|
|
202
|
+
# Using actions to move the mouse over an element
|
|
203
|
+
DriverHelper.driver.action.move_to(self).perform
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# How to perform right click through the context click method
|
|
207
|
+
def right_click
|
|
208
|
+
DriverHelper.driver.action.context_click(self).perform
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Here we are opening the selenium class and adding our custom method
|
|
213
|
+
class Selenium::WebDriver::Element
|
|
214
|
+
include SeleniumHelper
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
EOF
|
|
219
|
+
spec.result(binding)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def self.generate_driver_helper
|
|
223
|
+
spec = ERB.new <<~EOF
|
|
224
|
+
require 'selenium-webdriver'
|
|
225
|
+
require 'watir'
|
|
226
|
+
require 'webdrivers'
|
|
227
|
+
require 'yaml'
|
|
228
|
+
|
|
229
|
+
module Raider
|
|
230
|
+
module DriverHelper
|
|
231
|
+
class << self
|
|
232
|
+
attr_reader :driver
|
|
233
|
+
|
|
234
|
+
def new_driver
|
|
235
|
+
@driver = Selenium::WebDriver.for :chrome
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
EOF
|
|
241
|
+
spec.result(binding)
|
|
242
|
+
end
|
|
162
243
|
end
|
|
163
244
|
end
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
require_relative 'common_file_generator'
|
|
2
2
|
require_relative 'file_generator'
|
|
3
3
|
require_relative 'helpers_file_generator'
|
|
4
|
-
require_relative '
|
|
4
|
+
require_relative 'automation_file_generator'
|
|
5
5
|
|
|
6
6
|
module RubyRaider
|
|
7
7
|
class RspecFileGenerator < FileGenerator
|
|
8
8
|
def self.generate_rspec_files(name, automation)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
generate_file('base_spec.rb', "#{name}/spec", generate_base_spec)
|
|
15
|
-
else
|
|
16
|
-
pp 'here goes selenium'
|
|
17
|
-
end
|
|
9
|
+
CommonFileGenerator.generate_common_files(name, 'rspec')
|
|
10
|
+
HelpersFileGenerator.generate_helper_files(name, automation, 'rspec')
|
|
11
|
+
generate_file('login_page_spec.rb', "#{name}/spec", generate_example_spec)
|
|
12
|
+
generate_file('base_spec.rb', "#{name}/spec", generate_base_spec)
|
|
13
|
+
AutomationFileGenerator.generate_automation_files(name, automation, 'rspec')
|
|
18
14
|
end
|
|
19
15
|
|
|
20
16
|
def self.generate_example_spec
|
|
@@ -32,13 +28,14 @@ module RubyRaider
|
|
|
32
28
|
describe 'A user can' do
|
|
33
29
|
it 'login with the right credentials', :JIRA_123 do
|
|
34
30
|
LoginPage.login('aguspe', '12341234')
|
|
35
|
-
expect(LoginPage.customer_name).to eq 'Welcome back Agustin'
|
|
31
|
+
expect(LoginPage.header.customer_name).to eq 'Welcome back Agustin'
|
|
36
32
|
end
|
|
37
33
|
end
|
|
38
34
|
|
|
39
35
|
describe 'A user cannot' do
|
|
40
36
|
it 'login with the wrong credentials', :JIRA_123 do
|
|
41
|
-
|
|
37
|
+
LoginPage.login('aguspe', 'wrongPassword')
|
|
38
|
+
expect(LoginPage.header.customer_name).to be_empty
|
|
42
39
|
end
|
|
43
40
|
end
|
|
44
41
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'highline'
|
|
2
|
+
require_relative '../generators/projects/cucumber_project_generator'
|
|
2
3
|
require_relative '../generators/projects/rspec_project_generator'
|
|
3
4
|
|
|
4
5
|
module RubyRaider
|
|
@@ -7,8 +8,8 @@ module RubyRaider
|
|
|
7
8
|
cli = HighLine.new
|
|
8
9
|
cli.choose do |menu|
|
|
9
10
|
menu.prompt = 'Please select your automation framework'
|
|
10
|
-
menu.choice(:Selenium) { '
|
|
11
|
-
menu.choice(:Watir) {choose_test_framework('watir', project_name) }
|
|
11
|
+
menu.choice(:Selenium) { choose_test_framework('selenium', project_name) }
|
|
12
|
+
menu.choice(:Watir) { choose_test_framework('watir', project_name) }
|
|
12
13
|
menu.choice(:Quit, 'Exit program.') { exit }
|
|
13
14
|
end
|
|
14
15
|
end
|
|
@@ -20,16 +21,25 @@ module RubyRaider
|
|
|
20
21
|
framework = ''
|
|
21
22
|
cli.choose do |menu|
|
|
22
23
|
menu.prompt = 'Please select your test framework'
|
|
23
|
-
menu.choice(:Rspec)
|
|
24
|
-
|
|
24
|
+
menu.choice(:Rspec) do
|
|
25
|
+
framework = 'rspec'
|
|
26
|
+
set_framework(automation, framework, project_name)
|
|
27
|
+
end
|
|
28
|
+
menu.choice(:Cucumber) do
|
|
29
|
+
framework = 'cucumber'
|
|
30
|
+
set_framework(automation, framework, project_name)
|
|
31
|
+
end
|
|
25
32
|
menu.choice(:Quit, 'Exit program.') { exit }
|
|
26
33
|
end
|
|
27
34
|
cli.say("You have chosen to use #{framework} with #{automation}")
|
|
28
35
|
end
|
|
29
36
|
|
|
30
|
-
def self.
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
def self.set_framework(automation, framework, project_name)
|
|
38
|
+
if framework == 'rspec'
|
|
39
|
+
RspecProjectGenerator.generate_rspec_project(project_name, automation: automation)
|
|
40
|
+
else
|
|
41
|
+
CucumberProjectGenerator.generate_cucumber_project(project_name, automation: automation)
|
|
42
|
+
end
|
|
33
43
|
end
|
|
34
44
|
end
|
|
35
45
|
end
|
|
@@ -1,14 +1,24 @@
|
|
|
1
|
+
require_relative '../files/cucumber_file_generator'
|
|
1
2
|
require_relative 'project_generator'
|
|
2
3
|
|
|
3
4
|
module RubyRaider
|
|
4
|
-
class CucumberProjectGenerator
|
|
5
|
-
def
|
|
5
|
+
class CucumberProjectGenerator < ProjectGenerator
|
|
6
|
+
def self.generate_cucumber_project(name, automation: 'watir')
|
|
7
|
+
cucumber_folder_structure(name)
|
|
8
|
+
CucumberFileGenerator.generate_cucumber_files(name, automation)
|
|
9
|
+
ProjectGenerator.install_gems(name)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.cucumber_folder_structure(name)
|
|
6
13
|
Dir.mkdir name.to_s
|
|
7
|
-
|
|
8
|
-
folders
|
|
14
|
+
folders = %w[features config page_objects allure-results]
|
|
15
|
+
create_children_folders("#{name}", folders)
|
|
16
|
+
folders = %w[step_definitions support]
|
|
9
17
|
create_children_folders("#{name}/features", folders)
|
|
10
18
|
Dir.mkdir "#{name}/features/support/helpers"
|
|
11
|
-
|
|
19
|
+
folders = %w[abstract pages components]
|
|
20
|
+
create_children_folders("#{name}/page_objects", folders)
|
|
21
|
+
Dir.mkdir "#{name}/allure-results/screenshots"
|
|
12
22
|
end
|
|
13
23
|
end
|
|
14
24
|
end
|
|
@@ -5,7 +5,8 @@ module RubyRaider
|
|
|
5
5
|
class RspecProjectGenerator < ProjectGenerator
|
|
6
6
|
def self.generate_rspec_project(name, automation: 'watir')
|
|
7
7
|
rspec_folder_structure(name)
|
|
8
|
-
|
|
8
|
+
RspecFileGenerator.generate_rspec_files(name, automation)
|
|
9
|
+
ProjectGenerator.install_gems(name)
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def self.rspec_folder_structure(name)
|
|
@@ -15,9 +16,5 @@ module RubyRaider
|
|
|
15
16
|
pages = %w[pages components abstract]
|
|
16
17
|
create_children_folders("#{name}/page_objects", pages)
|
|
17
18
|
end
|
|
18
|
-
|
|
19
|
-
def self.rspec_files(name, automation)
|
|
20
|
-
RspecFileGenerator.generate_rspec_files(name, automation)
|
|
21
|
-
end
|
|
22
19
|
end
|
|
23
20
|
end
|
data/lib/ruby_raider.rb
CHANGED
|
@@ -5,7 +5,7 @@ require_relative 'generators/projects/rspec_project_generator'
|
|
|
5
5
|
|
|
6
6
|
module RubyRaider
|
|
7
7
|
extend self
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
def generate_project(project_name)
|
|
9
|
+
MenuGenerator.generate_choice_menu(project_name)
|
|
10
|
+
end
|
|
11
11
|
end
|
data/ruby_raider.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = 'ruby_raider'
|
|
3
|
-
s.version = '0.1.
|
|
3
|
+
s.version = '0.1.5'
|
|
4
4
|
s.summary = 'A gem to make setup and start of UI automation projects easier'
|
|
5
5
|
s.description = 'This gem contents everything you need to start doing web automation in one simple package'
|
|
6
6
|
s.authors = ['Agustin Pequeno']
|
|
@@ -12,7 +12,8 @@ Gem::Specification.new do |s|
|
|
|
12
12
|
s.files = `git ls-files -z`.split("\x0")
|
|
13
13
|
s.bindir = 'bin'
|
|
14
14
|
s.executables << 'raider'
|
|
15
|
-
s.add_development_dependency '
|
|
15
|
+
s.add_development_dependency 'rake', '~> 13.0.6'
|
|
16
|
+
s.add_development_dependency 'rspec', '~> 3.11.0'
|
|
16
17
|
|
|
17
|
-
s.add_runtime_dependency 'highline'
|
|
18
|
+
s.add_runtime_dependency 'highline', '~> 2.0.3'
|
|
18
19
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
require_relative '../lib/generators/files/
|
|
1
|
+
require_relative '../lib/generators/files/automation_file_generator'
|
|
2
2
|
require_relative 'spec_helper'
|
|
3
3
|
|
|
4
|
-
describe RubyRaider::
|
|
4
|
+
describe RubyRaider::AutomationFileGenerator do
|
|
5
5
|
it 'creates a login page file' do
|
|
6
6
|
expect(File.exist?("#{@project_name}/page_objects/pages/login_page.rb")).to be_truthy
|
|
7
7
|
end
|
metadata
CHANGED
|
@@ -1,43 +1,57 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruby_raider
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Agustin Pequeno
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-03-
|
|
11
|
+
date: 2022-03-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rake
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 13.0.6
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 13.0.6
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: rspec
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
16
30
|
requirements:
|
|
17
|
-
- - "
|
|
31
|
+
- - "~>"
|
|
18
32
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
33
|
+
version: 3.11.0
|
|
20
34
|
type: :development
|
|
21
35
|
prerelease: false
|
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
37
|
requirements:
|
|
24
|
-
- - "
|
|
38
|
+
- - "~>"
|
|
25
39
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
40
|
+
version: 3.11.0
|
|
27
41
|
- !ruby/object:Gem::Dependency
|
|
28
42
|
name: highline
|
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
|
30
44
|
requirements:
|
|
31
|
-
- - "
|
|
45
|
+
- - "~>"
|
|
32
46
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
47
|
+
version: 2.0.3
|
|
34
48
|
type: :runtime
|
|
35
49
|
prerelease: false
|
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
51
|
requirements:
|
|
38
|
-
- - "
|
|
52
|
+
- - "~>"
|
|
39
53
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
54
|
+
version: 2.0.3
|
|
41
55
|
description: This gem contents everything you need to start doing web automation in
|
|
42
56
|
one simple package
|
|
43
57
|
email: agustin.pe94@gmail.com
|
|
@@ -47,30 +61,29 @@ extensions: []
|
|
|
47
61
|
extra_rdoc_files: []
|
|
48
62
|
files:
|
|
49
63
|
- ".gitignore"
|
|
50
|
-
-
|
|
51
|
-
- ".idea/modules.xml"
|
|
52
|
-
- ".idea/ruby_raider.iml"
|
|
64
|
+
- Gemfile
|
|
53
65
|
- README.md
|
|
54
66
|
- Rakefile
|
|
55
67
|
- bin/raider
|
|
68
|
+
- lib/generators/files/automation_file_generator.rb
|
|
56
69
|
- lib/generators/files/common_file_generator.rb
|
|
70
|
+
- lib/generators/files/cucumber_file_generator.rb
|
|
57
71
|
- lib/generators/files/file_generator.rb
|
|
58
72
|
- lib/generators/files/helpers_file_generator.rb
|
|
59
73
|
- lib/generators/files/rspec_file_generator.rb
|
|
60
|
-
- lib/generators/files/watir_file_generator.rb
|
|
61
74
|
- lib/generators/menu_generator.rb
|
|
62
75
|
- lib/generators/projects/cucumber_project_generator.rb
|
|
63
76
|
- lib/generators/projects/project_generator.rb
|
|
64
77
|
- lib/generators/projects/rspec_project_generator.rb
|
|
65
78
|
- lib/ruby_raider.rb
|
|
66
79
|
- ruby_raider.gemspec
|
|
80
|
+
- spec/automation_file_generator_spec.rb
|
|
67
81
|
- spec/common_file_generator_spec.rb
|
|
68
82
|
- spec/helpers_file_generator_spec.rb
|
|
69
83
|
- spec/menu_generator_spec.rb
|
|
70
84
|
- spec/rspec_file_generator_spec.rb
|
|
71
85
|
- spec/rspec_project_generator_spec.rb
|
|
72
86
|
- spec/spec_helper.rb
|
|
73
|
-
- spec/watir_file_generator_spec.rb
|
|
74
87
|
homepage: http://github.com/aguspe/ruby_raider
|
|
75
88
|
licenses:
|
|
76
89
|
- MIT
|
data/.idea/.gitignore
DELETED
data/.idea/modules.xml
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="ProjectModuleManager">
|
|
4
|
-
<modules>
|
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/ruby_raider.iml" filepath="$PROJECT_DIR$/.idea/ruby_raider.iml" />
|
|
6
|
-
</modules>
|
|
7
|
-
</component>
|
|
8
|
-
</project>
|
data/.idea/ruby_raider.iml
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="RUBY_MODULE" version="4">
|
|
3
|
-
<component name="ModuleRunConfigurationManager">
|
|
4
|
-
<shared />
|
|
5
|
-
</component>
|
|
6
|
-
<component name="NewModuleRootManager">
|
|
7
|
-
<content url="file://$MODULE_DIR$">
|
|
8
|
-
<sourceFolder url="file://$MODULE_DIR$/features" isTestSource="true" />
|
|
9
|
-
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
|
|
10
|
-
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
|
|
11
|
-
</content>
|
|
12
|
-
<orderEntry type="jdk" jdkName="RVM: ruby-3.0.0" jdkType="RUBY_SDK" />
|
|
13
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
14
|
-
</component>
|
|
15
|
-
<component name="RakeTasksCache">
|
|
16
|
-
<option name="myRootTask">
|
|
17
|
-
<RakeTaskImpl id="rake" />
|
|
18
|
-
</option>
|
|
19
|
-
</component>
|
|
20
|
-
</module>
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
require_relative 'file_generator'
|
|
2
|
-
|
|
3
|
-
module RubyRaider
|
|
4
|
-
class WatirFileGenerator < FileGenerator
|
|
5
|
-
def self.generate_watir_files(name)
|
|
6
|
-
generate_file('abstract_page.rb', "#{name}/page_objects/abstract", abstract_page)
|
|
7
|
-
generate_file('abstract_component.rb', "#{name}/page_objects/abstract", abstract_component)
|
|
8
|
-
generate_file('login_page.rb', "#{name}/page_objects/pages", example_page)
|
|
9
|
-
generate_file('header_component.rb', "#{name}/page_objects/components", example_component)
|
|
10
|
-
generate_file('Gemfile', name.to_s, gemfile_template)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def self.gemfile_template
|
|
14
|
-
gemfile = ERB.new <<~EOF
|
|
15
|
-
# frozen_string_literal: true
|
|
16
|
-
|
|
17
|
-
source 'https://rubygems.org'
|
|
18
|
-
|
|
19
|
-
gem 'activesupport'
|
|
20
|
-
gem 'allure-rspec'
|
|
21
|
-
gem 'allure-ruby-commons'
|
|
22
|
-
gem 'parallel_split_test'
|
|
23
|
-
gem 'parallel_tests'
|
|
24
|
-
gem 'rake'
|
|
25
|
-
gem 'rspec'
|
|
26
|
-
gem 'selenium-webdriver'
|
|
27
|
-
gem 'watir'
|
|
28
|
-
gem 'webdrivers'
|
|
29
|
-
EOF
|
|
30
|
-
gemfile.result(binding)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def self.example_page
|
|
34
|
-
page_file = ERB.new <<~EOF
|
|
35
|
-
require_relative '../abstract/abstract_page'
|
|
36
|
-
require_relative '../components/header_component'
|
|
37
|
-
|
|
38
|
-
class LoginPage < BasePage
|
|
39
|
-
|
|
40
|
-
using Raider::WatirHelper
|
|
41
|
-
|
|
42
|
-
def url(_page)
|
|
43
|
-
'index.php?rt=account/login'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Actions
|
|
47
|
-
|
|
48
|
-
def login(username, password)
|
|
49
|
-
username_field.set username
|
|
50
|
-
password_field.set password
|
|
51
|
-
login_button.click_when_present
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
# Elements
|
|
57
|
-
|
|
58
|
-
def username_field
|
|
59
|
-
browser.text_field(id: 'loginFrm_loginname')
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def password_field
|
|
63
|
-
browser.text_field(id: 'loginFrm_password')
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def login_button
|
|
67
|
-
browser.button(visible_text: 'Login')
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
EOF
|
|
71
|
-
page_file.result(binding)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def self.abstract_page
|
|
75
|
-
abstract_file = ERB.new <<~EOF
|
|
76
|
-
require 'rspec'
|
|
77
|
-
require_relative '../components/header_component'
|
|
78
|
-
require_relative '../../helpers/raider'
|
|
79
|
-
|
|
80
|
-
class BasePage
|
|
81
|
-
|
|
82
|
-
include HeaderComponent
|
|
83
|
-
include RSpec::Matchers
|
|
84
|
-
extend Raider::PomHelper
|
|
85
|
-
|
|
86
|
-
def browser
|
|
87
|
-
Raider::BrowserHelper.browser
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def visit(*page)
|
|
91
|
-
browser.goto full_url(page.first)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def full_url(*page)
|
|
95
|
-
"#\{base_url}#\{url(*page)}"
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def base_url
|
|
99
|
-
'https://automationteststore.com/'
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def url(_page)
|
|
103
|
-
raise 'Url must be defined on child pages'
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
EOF
|
|
107
|
-
abstract_file.result(binding)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def self.example_component
|
|
111
|
-
page_file = ERB.new <<~EOF
|
|
112
|
-
require_relative '../abstract/abstract_component'
|
|
113
|
-
|
|
114
|
-
module HeaderComponent
|
|
115
|
-
|
|
116
|
-
include BaseComponent
|
|
117
|
-
|
|
118
|
-
def customer_name
|
|
119
|
-
sleep 2
|
|
120
|
-
customer_menu.text
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
private
|
|
124
|
-
|
|
125
|
-
# Elements
|
|
126
|
-
|
|
127
|
-
def customer_menu
|
|
128
|
-
browser.element(id: 'customer_menu_top')
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
EOF
|
|
132
|
-
page_file.result(binding)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def self.abstract_component
|
|
136
|
-
abstract_file = ERB.new <<~EOF
|
|
137
|
-
require_relative '../../helpers/raider'
|
|
138
|
-
|
|
139
|
-
module BaseComponent; end
|
|
140
|
-
EOF
|
|
141
|
-
abstract_file.result(binding)
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
end
|