ruby_raider 0.1.8 → 0.1.9

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.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/files/automation_file_generator.rb +33 -10
  3. data/lib/generators/files/common_file_generator.rb +10 -6
  4. data/lib/generators/files/cucumber_file_generator.rb +4 -4
  5. data/lib/generators/files/helpers_file_generator.rb +17 -10
  6. data/lib/generators/files/rspec_file_generator.rb +8 -7
  7. data/lib/generators/menu_generator.rb +44 -29
  8. data/lib/generators/projects/cucumber_project_generator.rb +18 -10
  9. data/lib/generators/projects/project_generator.rb +14 -0
  10. data/lib/generators/projects/rspec_project_generator.rb +12 -8
  11. data/lib/generators/templates/automation/abstract_page_template.rb +66 -32
  12. data/lib/generators/templates/automation/appium_settings_template.rb +16 -0
  13. data/lib/generators/templates/automation/confirmation_page_template.rb +26 -0
  14. data/lib/generators/templates/automation/home_page_template.rb +26 -0
  15. data/lib/generators/templates/automation/login_page_template.rb +113 -0
  16. data/lib/generators/templates/common/gemfile_template.rb +41 -18
  17. data/lib/generators/templates/helpers/driver_helper_template.rb +37 -7
  18. data/lib/generators/templates/helpers/raider_helper_template.rb +15 -3
  19. data/lib/generators/templates/helpers/spec_helper_template.rb +46 -7
  20. data/lib/generators/templates/rspec/example_spec_template.rb +44 -21
  21. data/ruby_raider.gemspec +1 -1
  22. data/spec/automation_file_generator_spec.rb +52 -27
  23. data/spec/common_file_generator_spec.rb +1 -1
  24. data/spec/cucumber_file_generator_spec.rb +1 -1
  25. data/spec/cucumber_project_generator_spec.rb +1 -1
  26. data/spec/helpers_file_generator_spec.rb +2 -2
  27. data/spec/rspec_file_generator_spec.rb +1 -1
  28. data/spec/rspec_project_generator_spec.rb +53 -32
  29. metadata +6 -3
  30. data/lib/generators/templates/automation/page_template.rb +0 -51
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aed816df5e1abdc73f27322835a3ca84a2f5238a0a7d6c0a9905fe766fe8a78f
4
- data.tar.gz: 041d4cac7ed5dbffa13369b65fa59b275ceaddbdae7b75149e2780eb2befc6e4
3
+ metadata.gz: 4dcbe671c993c24b4869fb0243906a8cd5d4614d7ea4690e0292cdb8c67a0b58
4
+ data.tar.gz: 39018ac4bf1d1148ad6a5308ca251d54de216154f774955c9c0c5c966b836019
5
5
  SHA512:
6
- metadata.gz: 15f03089c0d4b633e647c802baaa93777eb9bfcc259023b63adb81ab6415b89e5488a5d043aa1234957e9570d22f3f82870d5e4d563ade1577d5a82b12eba2b5
7
- data.tar.gz: 2a133387a4d7533f9b654aded174b64c56feb19a6ee2e860953d5c8dbac4c781ff0f86d798db03e31add9ab6eb9abc97a95e3c2c436197d1f6fdcbbf078737e4
6
+ metadata.gz: 0c9ae7dce2543807cf14ed1e51f0d81e015ef40b0e9d791209432cc954d55bb3fe39fe297fb43c4a7a07381431bd069ed4b33de98b30328f161ef25538d5ee6d
7
+ data.tar.gz: caefa842f497505b6dcfc64e1e35cd27ba4f31f41ec11ac635359acae7540296251b9523054e01fe75d3c247373707a8f669b39eaa2fff3130fc2a8a9e5eef15
@@ -1,22 +1,31 @@
1
1
  require_relative 'file_generator'
2
2
  require_relative '../templates/automation/abstract_page_template'
3
3
  require_relative '../templates/automation/abstract_component_template'
4
+ require_relative '../templates/automation/appium_settings_template'
4
5
  require_relative '../templates/automation/component_template'
5
- require_relative '../templates/automation/page_template'
6
+ require_relative '../templates/automation/confirmation_page_template'
7
+ require_relative '../templates/automation/login_page_template'
8
+ require_relative '../templates/automation/home_page_template'
6
9
 
7
10
  module RubyRaider
8
11
  class AutomationFileGenerator < FileGenerator
9
12
  class << self
10
- def generate_automation_files(name, automation, framework)
11
- generate_example_page(automation, name)
13
+ def generate_automation_files(automation, name, framework)
14
+ generate_login_page(automation, name)
12
15
  generate_abstract_page(automation, framework, name)
13
- generate_example_component(name)
14
- generate_abstract_component(framework, name)
16
+ if %w[selenium watir].include?(automation)
17
+ generate_example_component(name)
18
+ generate_abstract_component(framework, name)
19
+ else
20
+ generate_home_page(name)
21
+ generate_confirmation_page(name)
22
+ generate_appium_settings(name)
23
+ end
15
24
  end
16
25
 
17
- def generate_example_page(automation, name)
26
+ def generate_login_page(automation, name)
18
27
  generate_file('login_page.rb', "#{name}/page_objects/pages",
19
- PageTemplate.new(automation: automation, name: name).parsed_body)
28
+ LoginPageTemplate.new(automation: automation, name: name).parsed_body)
20
29
  end
21
30
 
22
31
  def generate_abstract_page(automation, framework, name)
@@ -24,15 +33,29 @@ module RubyRaider
24
33
  AbstractPageTemplate.new(automation: automation, framework: framework, name: name).parsed_body)
25
34
  end
26
35
 
36
+ def generate_home_page(name)
37
+ generate_file('home_page.rb', "#{name}/page_objects/pages",
38
+ HomePageTemplate.new.parsed_body)
39
+ end
40
+
41
+ def generate_confirmation_page(name)
42
+ generate_file('confirmation_page.rb', "#{name}/page_objects/pages",
43
+ ConfirmationPageTemplate.new.parsed_body)
44
+ end
45
+
27
46
  def generate_example_component(name)
28
- generate_file('header_component.rb',"#{name}/page_objects/components",
29
- ComponentTemplate.new.parsed_body)
47
+ generate_file('header_component.rb', "#{name}/page_objects/components",
48
+ ComponentTemplate.new.parsed_body)
30
49
  end
31
50
 
32
51
  def generate_abstract_component(framework, name)
33
- generate_file('abstract_component.rb',"#{name}/page_objects/abstract",
52
+ generate_file('abstract_component.rb', "#{name}/page_objects/abstract",
34
53
  AbstractComponentTemplate.new(framework: framework).parsed_body)
35
54
  end
55
+
56
+ def generate_appium_settings(name)
57
+ generate_file('appium.txt', name.to_s, AppiumSettingsTemplate.new.parsed_body)
58
+ end
36
59
  end
37
60
  end
38
61
  end
@@ -7,11 +7,14 @@ require_relative 'file_generator'
7
7
  module RubyRaider
8
8
  class CommonFileGenerator < FileGenerator
9
9
  class << self
10
- def generate_common_files(name, framework)
11
- generate_config_file(name)
12
- generate_rake_file(name)
10
+ def generate_common_files(automation, name, framework)
11
+ if %w[selenium watir].include?(automation)
12
+ generate_config_file(name)
13
+ generate_rake_file(name)
14
+ end
15
+
13
16
  generate_readme_file(name)
14
- generate_gemfile(framework, name)
17
+ generate_gemfile(automation, framework, name)
15
18
  end
16
19
 
17
20
  def generate_readme_file(name)
@@ -26,8 +29,9 @@ module RubyRaider
26
29
  generate_file('Rakefile', name.to_s, RakeFileTemplate.new.parsed_body)
27
30
  end
28
31
 
29
- def generate_gemfile(framework, name)
30
- generate_file('Gemfile',name.to_s, GemfileTemplate.new(framework: framework).parsed_body)
32
+ def generate_gemfile(automation, framework, name)
33
+ generate_file('Gemfile',name.to_s,
34
+ GemfileTemplate.new(automation: automation, framework: framework).parsed_body)
31
35
  end
32
36
  end
33
37
  end
@@ -6,10 +6,10 @@ require_relative 'file_generator'
6
6
  module RubyRaider
7
7
  class CucumberFileGenerator < FileGenerator
8
8
  class << self
9
- def generate_cucumber_files(name, automation)
10
- AutomationFileGenerator.generate_automation_files(name, automation, 'framework')
11
- CommonFileGenerator.generate_common_files(name, 'cucumber')
12
- HelpersFileGenerator.generate_helper_files(name, automation, 'cucumber')
9
+ def generate_cucumber_files(automation, name)
10
+ AutomationFileGenerator.generate_automation_files(automation, name, 'framework')
11
+ CommonFileGenerator.generate_common_files(automation, name, 'cucumber')
12
+ HelpersFileGenerator.generate_helper_files(automation, name, 'cucumber')
13
13
  generate_env_file(automation, name)
14
14
  generate_example_feature(name)
15
15
  generate_example_steps(name)
@@ -11,19 +11,13 @@ require_relative 'file_generator'
11
11
  module RubyRaider
12
12
  class HelpersFileGenerator < FileGenerator
13
13
  class << self
14
- def generate_helper_files(name, automation, framework)
14
+ def generate_helper_files(automation, name, framework)
15
15
  path = framework == 'rspec' ? "#{name}/helpers" : "#{name}/features/support/helpers"
16
16
  generate_raider_helper(automation, framework, path)
17
17
  generate_allure_helper(framework, path)
18
18
  generate_pom_helper(path)
19
19
  generate_spec_helper(automation, path) if framework == 'rspec'
20
- if automation == 'watir'
21
- generate_watir_helper(path)
22
- generate_browser_helper(path)
23
- else
24
- generate_selenium_helper(path)
25
- generate_driver_helper(path)
26
- end
20
+ select_helpers(automation, path)
27
21
  end
28
22
 
29
23
  def generate_raider_helper(automation, framework, path)
@@ -55,8 +49,21 @@ module RubyRaider
55
49
  generate_file('selenium_helper.rb', path, SeleniumHelperTemplate.new.parsed_body)
56
50
  end
57
51
 
58
- def generate_driver_helper(path)
59
- generate_file('driver_helper.rb', path, DriverHelperTemplate.new.parsed_body)
52
+ def generate_driver_helper(automation, path)
53
+ generate_file('driver_helper.rb', path, DriverHelperTemplate.new(automation: automation).parsed_body)
54
+ end
55
+
56
+ def select_helpers(automation, path)
57
+ case automation
58
+ when 'watir'
59
+ generate_watir_helper(path)
60
+ generate_browser_helper(path)
61
+ when 'selenium'
62
+ generate_selenium_helper(path)
63
+ generate_driver_helper(automation, path)
64
+ else
65
+ generate_driver_helper(automation, path)
66
+ end
60
67
  end
61
68
  end
62
69
  end
@@ -8,16 +8,17 @@ require_relative 'helpers_file_generator'
8
8
  module RubyRaider
9
9
  class RspecFileGenerator < FileGenerator
10
10
  class << self
11
- def generate_rspec_files(name, automation)
12
- AutomationFileGenerator.generate_automation_files(name, automation, 'rspec')
13
- CommonFileGenerator.generate_common_files(name, 'rspec')
14
- HelpersFileGenerator.generate_helper_files(name, automation, 'rspec')
11
+ def generate_rspec_files(automation, name)
12
+ AutomationFileGenerator.generate_automation_files(automation, name,'rspec')
13
+ CommonFileGenerator.generate_common_files(automation, name, 'rspec')
14
+ HelpersFileGenerator.generate_helper_files(automation, name, 'rspec')
15
15
  generate_base_spec(name)
16
- generate_example_spec(name)
16
+ generate_example_spec(automation, name)
17
17
  end
18
18
 
19
- def generate_example_spec(name)
20
- generate_file('login_page_spec.rb', "#{name}/spec", ExampleSpecTemplate.new.parsed_body)
19
+ def generate_example_spec(automation, name)
20
+ generate_file('login_page_spec.rb', "#{name}/spec",
21
+ ExampleSpecTemplate.new(automation: automation).parsed_body)
21
22
  end
22
23
 
23
24
  def generate_base_spec(name)
@@ -4,41 +4,56 @@ require_relative '../generators/projects/rspec_project_generator'
4
4
 
5
5
  module RubyRaider
6
6
  class MenuGenerator
7
- def self.generate_choice_menu(project_name)
8
- cli = HighLine.new
9
- cli.choose do |menu|
10
- menu.prompt = 'Please select your automation framework'
11
- menu.choice(:Selenium) { choose_test_framework('selenium', project_name) }
12
- menu.choice(:Watir) { choose_test_framework('watir', project_name) }
13
- menu.choice(:Quit, 'Exit program.') { exit }
7
+ class << self
8
+ def generate_choice_menu(project_name)
9
+ @cli = HighLine.new
10
+ @cli.choose do |menu|
11
+ menu.prompt = 'Please select your automation framework'
12
+ menu.choice('Selenium') { choose_test_framework('selenium', project_name) }
13
+ menu.choice('Watir') { choose_test_framework('watir', project_name) }
14
+ menu.choice('Appium') { choose_test_framework('appium', project_name) }
15
+ menu.choice('Quit') { exit }
16
+ end
14
17
  end
15
- end
16
18
 
17
- def self.choose_test_framework(automation, project_name)
18
- system('clear') || system('cls')
19
- sleep 0.3
20
- cli = HighLine.new
21
- framework = ''
22
- cli.choose do |menu|
23
- menu.prompt = 'Please select your test framework'
24
- menu.choice(:Rspec) do
25
- framework = 'rspec'
26
- set_framework(automation, framework, project_name)
19
+ def choose_test_framework(automation, project_name)
20
+ system('clear') || system('cls')
21
+ sleep 0.3
22
+ automation = automation == 'appium' ? choose_mobile_platform : automation
23
+ framework = ''
24
+ @cli.choose do |menu|
25
+ menu.prompt = 'Please select your test framework'
26
+ menu.choice('Rspec') { framework = 'rspec'; set_framework(automation, framework, project_name) }
27
+ menu.choice('Cucumber') do
28
+ if %w[selenium watir].include? automation
29
+ framework = 'cucumber'
30
+ set_framework(automation, framework, project_name)
31
+ else
32
+ pp 'We will support iOS with cucumber on the next release'
33
+ exit
34
+ end
35
+ end
36
+ menu.choice('Quit') { exit }
27
37
  end
28
- menu.choice(:Cucumber) do
29
- framework = 'cucumber'
30
- set_framework(automation, framework, project_name)
38
+ @cli.say("You have chosen to use #{framework} with #{automation}")
39
+ end
40
+
41
+ def set_framework(automation, framework, project_name)
42
+ if framework == 'rspec'
43
+ RspecProjectGenerator.generate_rspec_project(automation, project_name)
44
+ else
45
+ CucumberProjectGenerator.generate_cucumber_project(automation, project_name)
31
46
  end
32
- menu.choice(:Quit, 'Exit program.') { exit }
33
47
  end
34
- cli.say("You have chosen to use #{framework} with #{automation}")
35
- end
36
48
 
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)
49
+ def choose_mobile_platform
50
+ @cli.choose do |menu|
51
+ menu.prompt = 'Please select your mobile platform'
52
+ menu.choice('iOS') { 'appium_ios' }
53
+ menu.choice('Android') { pp 'Android appium is coming soon. Thank you for the interest'; exit }
54
+ menu.choice('Cross Platform') { pp 'Cross platform appium is coming soon. Thank you for the interest'; exit }
55
+ menu.choice('Quit') { exit }
56
+ end
42
57
  end
43
58
  end
44
59
  end
@@ -4,22 +4,30 @@ require_relative 'project_generator'
4
4
  module RubyRaider
5
5
  class CucumberProjectGenerator < ProjectGenerator
6
6
  class << self
7
- def generate_cucumber_project(name, automation: 'watir')
8
- cucumber_folder_structure(name)
9
- CucumberFileGenerator.generate_cucumber_files(name, automation)
7
+ def generate_cucumber_project(automation, name)
8
+ cucumber_folder_structure(automation, name)
9
+ CucumberFileGenerator.generate_cucumber_files(automation, name)
10
10
  ProjectGenerator.install_gems(name)
11
11
  end
12
12
 
13
- def cucumber_folder_structure(name)
14
- Dir.mkdir name.to_s
15
- folders = %w[features config page_objects allure-results]
13
+ def cucumber_folder_structure(automation, name)
14
+ create_project_folder(name)
15
+ create_base_folders(automation, name)
16
+ create_features_child_folders(name)
17
+ Dir.mkdir "#{name}/features/support/helpers"
18
+ create_po_child_folders(automation, name)
19
+ Dir.mkdir "#{name}/allure-results/screenshots"
20
+ end
21
+
22
+ def create_base_folders(automation, name)
23
+ folders = %w[features page_objects allure-results]
16
24
  create_children_folders("#{name}", folders)
25
+ Dir.mkdir "#{name}/config" if %w[selenium watir].include?(automation)
26
+ end
27
+
28
+ def create_features_child_folders(name)
17
29
  folders = %w[step_definitions support]
18
30
  create_children_folders("#{name}/features", folders)
19
- Dir.mkdir "#{name}/features/support/helpers"
20
- folders = %w[abstract pages components]
21
- create_children_folders("#{name}/page_objects", folders)
22
- Dir.mkdir "#{name}/allure-results/screenshots"
23
31
  end
24
32
  end
25
33
  end
@@ -8,6 +8,20 @@ module RubyRaider
8
8
  def install_gems(name)
9
9
  system "cd #{name} && gem install bundler && bundle install"
10
10
  end
11
+
12
+ def create_project_folder(name)
13
+ Dir.mkdir name.to_s
14
+ end
15
+
16
+ def create_base_folders
17
+ raise 'Please specify the base folders for the projects'
18
+ end
19
+
20
+ def create_po_child_folders(automation, name)
21
+ folders = %w[pages abstract]
22
+ create_children_folders("#{name}/page_objects", folders)
23
+ Dir.mkdir "#{name}/page_objects/components" if %w[selenium watir].include?(automation)
24
+ end
11
25
  end
12
26
  end
13
27
  end
@@ -4,18 +4,22 @@ require_relative '../files/rspec_file_generator'
4
4
  module RubyRaider
5
5
  class RspecProjectGenerator < ProjectGenerator
6
6
  class << self
7
- def generate_rspec_project(name, automation: 'watir')
8
- rspec_folder_structure(name)
9
- RspecFileGenerator.generate_rspec_files(name, automation)
7
+ def generate_rspec_project(automation, name)
8
+ rspec_folder_structure(automation, name)
9
+ RspecFileGenerator.generate_rspec_files(automation, name)
10
10
  ProjectGenerator.install_gems(name)
11
11
  end
12
12
 
13
- def rspec_folder_structure(name)
14
- Dir.mkdir name.to_s
15
- folders = %w[config data page_objects helpers spec]
13
+ def rspec_folder_structure(automation, name)
14
+ create_project_folder(name)
15
+ create_base_folders(automation, name)
16
+ create_po_child_folders(automation, name)
17
+ end
18
+
19
+ def create_base_folders(automation, name)
20
+ folders = %w[data page_objects helpers spec]
16
21
  create_children_folders(name, folders)
17
- pages = %w[pages components abstract]
18
- create_children_folders("#{name}/page_objects", pages)
22
+ Dir.mkdir "#{name}/config" if %w[selenium watir].include?(automation)
19
23
  end
20
24
  end
21
25
  end
@@ -1,48 +1,82 @@
1
1
  require_relative '../template'
2
2
 
3
3
  class AbstractPageTemplate < Template
4
- def body
5
- browser = "def browser
6
- Raider::BrowserHelper.browser
7
- end"
8
- driver = "def driver
4
+
5
+ def raider
6
+ if @framework == 'rspec'
7
+ "require_relative '../../helpers/raider'\n"
8
+ else
9
+ "require_relative '../../features/support/helpers/raider'\n"
10
+ end
11
+ end
12
+
13
+ def helper_selector
14
+ if @automation == 'watir'
15
+ <<~EOF
16
+
17
+ def browser
18
+ Raider::BrowserHelper.browser
19
+ end
20
+
21
+ EOF
22
+ else
23
+ <<-EOF
24
+
25
+ def driver
9
26
  Raider::DriverHelper.driver
10
- end"
27
+ end
28
+
29
+
30
+ EOF
31
+ end
32
+ end
11
33
 
12
- visit = @automation == 'watir' ? 'browser.goto full_url(page.first)' : 'driver.navigate.to full_url(page.first)'
13
- raider = if @framework == 'rspec'
14
- "require_relative '../../helpers/raider'"
15
- else
16
- "require_relative '../../features/support/helpers/raider'"
17
- end
34
+ def visit
35
+ if %w[selenium watir].include?(@automation)
36
+ <<-EOF
18
37
 
19
- <<~EOF
20
- require 'rspec'
21
- #{raider}
22
38
 
23
- class AbstractPage
39
+ def visit(*page)
40
+ #{@automation == 'selenium' ? 'driver.navigate.to full_url(page.first)' : 'browser.goto full_url(page.first)'}
41
+ end
24
42
 
25
- include RSpec::Matchers
26
- extend Raider::PomHelper
43
+ EOF
44
+ end
45
+ end
27
46
 
28
- #{@automation == 'watir' ? browser : driver}
47
+ def url_methods
48
+ methods = <<-EOF
49
+
29
50
 
30
- def visit(*page)
31
- #{visit}
32
- end
51
+ def full_url(*page)
52
+ "#\{base_url}#\{url(*page)}"
53
+ end
33
54
 
34
- def full_url(*page)
35
- "#\{base_url}#\{url(*page)}"
36
- end
55
+ def base_url
56
+ 'https://automationteststore.com/'
57
+ end
37
58
 
38
- def base_url
39
- 'https://automationteststore.com/'
40
- end
59
+ def url(_page)
60
+ raise 'Url must be defined on child pages'
61
+ end
62
+ EOF
63
+
64
+
65
+ methods if %w[selenium watir].include?(@automation)
66
+ end
67
+
68
+ def body
69
+ <<~EOF.gsub(/\n{2}\s{4}/, '')
70
+ require 'rspec'
71
+ #{raider}
72
+ class AbstractPage
41
73
 
42
- def url(_page)
43
- raise 'Url must be defined on child pages'
44
- end
45
- end
74
+ include RSpec::Matchers
75
+ extend Raider::PomHelper
76
+ #{helper_selector}
77
+ #{visit}
78
+ #{url_methods}
79
+ end
46
80
  EOF
47
81
  end
48
82
  end
@@ -0,0 +1,16 @@
1
+ require_relative '../template'
2
+
3
+ class AppiumSettingsTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ [caps]
7
+ platformName = "iOS"
8
+ platformVersion = "15.4"
9
+ deviceName = "iPhone SE (3rd generation)"
10
+ app = "TheApp.app"
11
+
12
+ [appium_lib]
13
+ server_url = "http://127.0.0.1:4723/wd/hub"
14
+ EOF
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../template'
2
+
3
+ class ConfirmationPageTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require_relative '../abstract/abstract_page'
7
+
8
+ class ConfirmationPage < AbstractPage
9
+
10
+ #Values
11
+
12
+ def login_message
13
+ driver.wait { message_element }.text
14
+ end
15
+
16
+ private
17
+
18
+ # Elements
19
+
20
+ def message_element
21
+ driver.find_element(accessibility_id: 'You are logged in as alice')
22
+ end
23
+ end
24
+ EOF
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../template'
2
+
3
+ class HomePageTemplate < Template
4
+ def body
5
+ <<~EOF
6
+ require_relative '../abstract/abstract_page'
7
+
8
+ class HomePage < AbstractPage
9
+
10
+ #Actions
11
+
12
+ def go_to_login
13
+ driver.wait { login_button_navigator }.click
14
+ end
15
+
16
+ private
17
+
18
+ # Elements
19
+
20
+ def login_button_navigator
21
+ driver.find_element(accessibility_id: 'Login Screen')
22
+ end
23
+ end
24
+ EOF
25
+ end
26
+ end