ruby_raider 0.5.6 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +13 -0
  3. data/Rakefile +12 -0
  4. data/lib/desktop/base_screen.rb +5 -0
  5. data/lib/desktop/installation_screen.rb +137 -0
  6. data/lib/desktop/runner_screen.rb +123 -0
  7. data/lib/generators/automation/automation_examples_generator.rb +36 -0
  8. data/lib/generators/automation/automation_generator.rb +28 -0
  9. data/lib/generators/cucumber/cucumber_examples_generator.rb +17 -0
  10. data/lib/generators/cucumber/cucumber_generator.rb +13 -0
  11. data/lib/generators/generator.rb +2 -2
  12. data/lib/generators/invoke_generators.rb +47 -0
  13. data/lib/generators/menu_generator.rb +24 -27
  14. data/lib/generators/rspec/rspec_examples_generator.rb +17 -0
  15. data/lib/generators/rspec/rspec_generator.rb +9 -0
  16. data/lib/ruby_raider.rb +7 -0
  17. data/ruby_raider.gemspec +2 -1
  18. data/spec/automation_generator_spec.rb +71 -15
  19. data/spec/cucumber_generator_spec.rb +29 -1
  20. data/spec/rspec_generator_spec.rb +21 -1
  21. data/spec/spec_helper.rb +20 -5
  22. metadata +63 -41
  23. data/lib/generators/automation_generator.rb +0 -59
  24. data/lib/generators/cucumber_generator.rb +0 -25
  25. data/lib/generators/rspec_generator.rb +0 -21
  26. /data/lib/generators/{templates/automation → automation/templates}/abstract_component.tt +0 -0
  27. /data/lib/generators/{templates/automation → automation/templates}/abstract_page.tt +0 -0
  28. /data/lib/generators/{templates/automation → automation/templates}/app_page.tt +0 -0
  29. /data/lib/generators/{templates/automation → automation/templates}/appium_caps.tt +0 -0
  30. /data/lib/generators/{templates/automation → automation/templates}/component.tt +0 -0
  31. /data/lib/generators/{templates/automation → automation/templates}/home_page.tt +0 -0
  32. /data/lib/generators/{templates/automation → automation/templates}/login_page.tt +0 -0
  33. /data/lib/generators/{templates/automation → automation/templates}/partials/android_caps.tt +0 -0
  34. /data/lib/generators/{templates/automation → automation/templates}/partials/cross_platform_caps.tt +0 -0
  35. /data/lib/generators/{templates/automation → automation/templates}/partials/element.tt +0 -0
  36. /data/lib/generators/{templates/automation → automation/templates}/partials/home_page_selector.tt +0 -0
  37. /data/lib/generators/{templates/automation → automation/templates}/partials/initialize_selector.tt +0 -0
  38. /data/lib/generators/{templates/automation → automation/templates}/partials/ios_caps.tt +0 -0
  39. /data/lib/generators/{templates/automation → automation/templates}/partials/pdp_page_selector.tt +0 -0
  40. /data/lib/generators/{templates/automation → automation/templates}/partials/require_raider.tt +0 -0
  41. /data/lib/generators/{templates/automation → automation/templates}/partials/selenium_login.tt +0 -0
  42. /data/lib/generators/{templates/automation → automation/templates}/partials/url_methods.tt +0 -0
  43. /data/lib/generators/{templates/automation → automation/templates}/partials/visit_method.tt +0 -0
  44. /data/lib/generators/{templates/automation → automation/templates}/partials/visual_login.tt +0 -0
  45. /data/lib/generators/{templates/automation → automation/templates}/partials/watir_login.tt +0 -0
  46. /data/lib/generators/{templates/automation → automation/templates}/pdp_page.tt +0 -0
  47. /data/lib/generators/{templates/automation → automation/templates}/visual_options.tt +0 -0
  48. /data/lib/generators/{templates/cucumber → cucumber/templates}/env.tt +0 -0
  49. /data/lib/generators/{templates/cucumber → cucumber/templates}/feature.tt +0 -0
  50. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/appium_env.tt +0 -0
  51. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/driver_world.tt +0 -0
  52. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/mobile_steps.tt +0 -0
  53. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/selenium_appium_env.tt +0 -0
  54. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/watir_env.tt +0 -0
  55. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/watir_world.tt +0 -0
  56. /data/lib/generators/{templates/cucumber → cucumber/templates}/partials/web_steps.tt +0 -0
  57. /data/lib/generators/{templates/cucumber → cucumber/templates}/steps.tt +0 -0
  58. /data/lib/generators/{templates/cucumber → cucumber/templates}/world.tt +0 -0
  59. /data/lib/generators/{templates/rspec → rspec/templates}/base_spec.tt +0 -0
  60. /data/lib/generators/{templates/rspec → rspec/templates}/spec.tt +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8c15738eebba5735e6bcfa2af5c1f00e888eb86ca1de8d19bf7bc4603e4fe41
4
- data.tar.gz: b799c4a2639ab0579125936236fcdf619a91a35d6e645bab6baf76fc5ec40c04
3
+ metadata.gz: c5a0388aca21402e7be2b8d5ca425f3041941f3ad881447bce6f90569414403a
4
+ data.tar.gz: 7efeafb1ac1f8ab1549f7105da42a5687ef493681816ecf814778eadfa084549
5
5
  SHA512:
6
- metadata.gz: 8976146e76db3e511ab1dde689079479ca3ae76375cece5868505246fb7a0b9ad5e037c351c1046f7307e37cc18ec0d74f2df410eed91ee5fc1249163f503534
7
- data.tar.gz: 3d6c1a42068b5130356bb3c8afd2cfa7ce88fdedae1f504b786d125b147d95b5b0198abb7fc1d9d68906860c6d5ad5577370f3db1cfe81cc959ed44b9647fb90
6
+ metadata.gz: a307df303d10f89f67a3efc9997d330ec2b29796f6ad29d5f7cddf4197e532a4bb545414a0a00a0503cfaa5bf34e1d936044e3119560157cd31c5b0194d17d55
7
+ data.tar.gz: b6e18d3e3fcb74f2127bea109c66e68302af4baf1def97ca3b6f6d3bc1ee027f642d4bbb7794f491477af7f5b00995abb4ec1b1977cde83687649737e2bb7a1b
@@ -0,0 +1,13 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [ruby_raider]
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ otechie: # Replace with a single Otechie username
12
+ lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
data/Rakefile CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require_relative 'lib/ruby_raider'
4
4
  require_relative 'lib/commands/scaffolding_commands'
5
+ require_relative 'lib/desktop/installation_screen'
6
+ require_relative 'lib/desktop/runner_screen'
5
7
 
6
8
  desc 'Creates a new test project'
7
9
  task :new, [:name] do |_t, args|
@@ -27,3 +29,13 @@ desc 'Download mobile builds'
27
29
  task :builds, [:type] do |_t, args|
28
30
  ScaffoldingCommands.new.invoke(:download_builds, nil, %W[#{args.type}])
29
31
  end
32
+
33
+ desc 'Open the desktop app'
34
+ task :open do
35
+ InstallationScreen.new.launch
36
+ end
37
+
38
+ desc 'Open the run screen'
39
+ task :runner do
40
+ RunnerScreen.new.launch
41
+ end
@@ -0,0 +1,5 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ class BaseScreen
4
+ include Glimmer
5
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_screen'
4
+ require_relative '../generators/invoke_generators'
5
+
6
+ class InstallationScreen < BaseScreen
7
+ include InvokeGenerators
8
+
9
+ attr_accessor :entry_text
10
+
11
+ def launch
12
+ window('Ruby Raider', 800, 600) do
13
+ margined true
14
+ tab do
15
+ tab_item('Installer') do
16
+ vertical_box do
17
+ vertical_box do
18
+ stretchy false
19
+ label('Project Name') do
20
+ stretchy false
21
+ end
22
+
23
+ entry do
24
+ stretchy false # Smart default option for appending to horizontal_box
25
+ text <=> [self, :entry_text, { after_write: lambda { |text|
26
+ @project_name = text
27
+ $stdout.flush
28
+ } }] # bidirectional data-binding between text property and entry_text attribute, printing after write to model.
29
+ end
30
+ end
31
+
32
+ vertical_box do
33
+ stretchy false
34
+
35
+ @radio = radio_buttons do
36
+ stretchy false
37
+
38
+ items 'Web', 'Mobile'
39
+ selected_item 'Web'
40
+ on_selected do |buttons|
41
+ if buttons.selected_item == 'Web'
42
+ @mobile_automation.hide
43
+ @platforms.hide
44
+ @web_automation.show
45
+ else
46
+ @web_automation.hide
47
+ @mobile_automation.show
48
+ @platforms.show
49
+ end
50
+ end
51
+ end
52
+
53
+ @mobile_automation = combobox do
54
+ stretchy false
55
+ visible false
56
+ items 'Appium'
57
+ selected_item 'Appium'
58
+ end
59
+
60
+ @web_automation = combobox do
61
+ stretchy false
62
+ visible true
63
+ items 'Selenium', 'Watir'
64
+ selected_item 'Selenium'
65
+ end
66
+
67
+ @platforms = combobox do
68
+ stretchy false
69
+ visible false
70
+ items 'Android', 'iOS', 'Cross-Platform'
71
+ selected_item 'iOS'
72
+ end
73
+
74
+ @framework = combobox do
75
+ stretchy false
76
+ visible true
77
+ items 'Cucumber', 'Rspec'
78
+ selected_item 'Cucumber'
79
+
80
+ on_selected do |items|
81
+ if items.selected_item == 'Rspec' && @radio.selected_item != 'Mobile'
82
+ @visual_checkbox.show
83
+ else
84
+ @visual_checkbox.hide
85
+ end
86
+ end
87
+ end
88
+
89
+ @visual_checkbox = checkbox('Applitools integration') do
90
+ stretchy false
91
+ visible false
92
+ end
93
+
94
+ @example_checkbox = checkbox('Add example files') do
95
+ stretchy false
96
+ visible true
97
+ end
98
+
99
+ button('Create Project') do
100
+ stretchy false
101
+ on_clicked do
102
+ automation = if @web_automation.visible?
103
+ @web_automation.selected_item
104
+ else
105
+ @mobile_automation.selected_item
106
+ end
107
+ structure = {
108
+ automation: automation,
109
+ examples: @example_checkbox.checked,
110
+ framework: @framework.selected_item,
111
+ generators: %w[Automation Common Helpers],
112
+ name: @project_name,
113
+ visual: @visual_checkbox.checked
114
+ }
115
+ generate_framework(structure)
116
+ @installation_box.text = if File.directory?(@project_name)
117
+ "Your project has been created, close this window, go to the folder #{@project_name} and run 'raider open'"
118
+ else
119
+ 'There was a problem creating your project try again'
120
+ end
121
+ end
122
+ end
123
+ end
124
+ vertical_box do
125
+ stretchy false
126
+ @installation_box = multiline_entry do
127
+ stretchy false
128
+ text 'Your installation result will appear here...'
129
+ $stdout.flush
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end.show
136
+ end
137
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+ require 'yaml'
5
+ require_relative 'base_screen'
6
+
7
+ class RunnerScreen < BaseScreen
8
+ attr_accessor :contacts
9
+
10
+ CONFIG_ITEM = Struct.new(:attribute, :value)
11
+ CAP = Struct.new(:attribute, :value)
12
+
13
+ if File.directory?('spec')
14
+ @folder = 'spec'
15
+ @framework = 'rspec'
16
+ @extension = '*_spec.rb'
17
+ else
18
+ @folder = 'features'
19
+ @framework = 'cucumber'
20
+ @extension = '*.features'
21
+ end
22
+
23
+ window('Ruby Raider', 1200, 800) do
24
+ margined true
25
+ vertical_box do
26
+ grid do
27
+ stretchy false
28
+
29
+ button('▶') do
30
+ left 0
31
+ on_clicked do
32
+ output = Open3.popen3("#{@framework} #{@tests.selected_item}") do |_stdin, stdout, _stderr|
33
+ stdout.read
34
+ end
35
+ system "rspec #{@tests.selected_item}"
36
+ @results.text = output
37
+ end
38
+ end
39
+ button('■') do
40
+ left 1
41
+ on_clicked do
42
+ pp 'The stop feature will be implemented in a later release'
43
+ end
44
+ end
45
+
46
+ @tests = combobox do
47
+ left 2
48
+ files = Dir.glob(File.join(@folder, @extension))
49
+ items files
50
+ selected_item files.first
51
+ @file = File.open(files.first)
52
+
53
+ on_selected do |items|
54
+ @results.text = ''
55
+ path = items.selected_item
56
+ @file = File.open(path)
57
+ @text_box.text = @file.read
58
+ end
59
+ end
60
+
61
+ button('Open Dashboard') do
62
+ left 3
63
+ halign :end
64
+ on_clicked do
65
+ system 'allure serve allure-reports'
66
+ end
67
+ end
68
+ end
69
+
70
+ tab do
71
+ stretchy true
72
+
73
+ tab_item('Tests') do
74
+ horizontal_box do
75
+ @text_box = multiline_entry do
76
+ text @file.read
77
+
78
+ on_changed do |e|
79
+ File.write(@tests.selected_item, e.text)
80
+ $stdout.flush # for Windows
81
+ end
82
+ end
83
+
84
+ @results = multiline_entry do
85
+ text ''
86
+ end
87
+ end
88
+ end
89
+
90
+ tab_item('Configuration') do
91
+ @config = YAML.load_file('config/config.yml')
92
+ config_items = @config.map { |key, value| CONFIG_ITEM.new(key, value) }
93
+ vertical_box do
94
+ refined_table(
95
+ model_array: config_items,
96
+ table_columns: {
97
+ 'Attribute' => :text,
98
+ 'Value' => { text: { editable: true } }
99
+ },
100
+ table_editable: true,
101
+ per_page: 20
102
+ )
103
+ end
104
+ end
105
+ tab_item('Capabilities') do
106
+ caps = File.exist?('config/capabilities.yml') ? YAML.load_file('config/capabilities.yml') : []
107
+ caps = caps.map { |key, value| CAP.new(key, value) }
108
+ vertical_box do
109
+ refined_table(
110
+ model_array: caps,
111
+ table_columns: {
112
+ 'Attribute' => :text,
113
+ 'Value' => { text: { editable: true } }
114
+ },
115
+ table_editable: true,
116
+ per_page: 20
117
+ )
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end.show
123
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../generator'
4
+
5
+ class AutomationExamplesGenerator < Generator
6
+ def generate_login_page
7
+ return unless (@_initializer.first & %w[android ios cross_platform]).empty?
8
+
9
+ template('login_page.tt', "#{name}/page_objects/pages/login_page.rb")
10
+ end
11
+
12
+ def generate_home_page
13
+ return if (@_initializer.first & %w[android ios cross_platform]).empty?
14
+
15
+ template('home_page.tt', "#{name}/page_objects/pages/home_page.rb")
16
+ end
17
+
18
+ def generate_pdp_page
19
+ return if (@_initializer.first & %w[android ios cross_platform]).empty?
20
+
21
+ template('pdp_page.tt', "#{name}/page_objects/pages/pdp_page.rb")
22
+ end
23
+
24
+ def generate_header_component
25
+ return unless (@_initializer.first & %w[android ios cross_platform]).empty?
26
+ return if @_initializer.first.last
27
+
28
+ template('component.tt', "#{name}/page_objects/components/header_component.rb")
29
+ end
30
+
31
+ def generate_app_page
32
+ return unless @_initializer.first.last
33
+
34
+ template('app_page.tt', "#{name}/page_objects/pages/app_page.rb")
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../generator'
4
+
5
+ class AutomationGenerator < Generator
6
+ def generate_abstract_page
7
+ template('abstract_page.tt', "#{name}/page_objects/abstract/abstract_page.rb")
8
+ end
9
+
10
+ def generate_abstract_component
11
+ return unless (@_initializer.first & %w[android ios cross_platform]).empty?
12
+ return if @_initializer.first.last
13
+
14
+ template('abstract_component.tt', "#{name}/page_objects/abstract/abstract_component.rb")
15
+ end
16
+
17
+ def generate_appium_settings
18
+ return if (@_initializer.first & %w[android ios cross_platform]).empty?
19
+
20
+ template('appium_caps.tt', "#{name}/config/capabilities.yml")
21
+ end
22
+
23
+ def generate_visual_options
24
+ return unless @_initializer.first.last
25
+
26
+ template('visual_options.tt', "#{name}/config/options.yml")
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../generator'
4
+
5
+ class CucumberExamplesGenerator < Generator
6
+ def generate_feature
7
+ template('feature.tt', "#{name}/features/#{template_name}.feature")
8
+ end
9
+
10
+ def generate_steps
11
+ template('steps.tt', "#{name}/features/step_definitions/#{template_name}_steps.rb")
12
+ end
13
+
14
+ def template_name
15
+ @template_name ||= (@_initializer.first & %w[android ios cross_platform]).empty? ? 'login' : 'home'
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../generator'
4
+
5
+ class CucumberGenerator < Generator
6
+ def generate_env_file
7
+ template('env.tt', "#{name}/features/support/env.rb")
8
+ end
9
+
10
+ def generate_world
11
+ template('world.tt', "#{name}/world.rb")
12
+ end
13
+ end
@@ -10,7 +10,7 @@ class Generator < Thor::Group
10
10
  argument :name
11
11
  argument :visual_automation, optional: true
12
12
 
13
- def self.source_root
14
- "#{File.dirname(__FILE__)}/templates"
13
+ def self.source_paths
14
+ %W[#{File.dirname(__FILE__)}/automation/templates #{File.dirname(__FILE__)}/cucumber/templates #{File.dirname(__FILE__)}/rspec/templates #{File.dirname(__FILE__)}/templates]
15
15
  end
16
16
  end
@@ -0,0 +1,47 @@
1
+ require_relative 'automation/automation_generator'
2
+ require_relative 'automation/automation_examples_generator'
3
+ require_relative 'common_generator'
4
+ require_relative 'cucumber/cucumber_generator'
5
+ require_relative 'cucumber/cucumber_examples_generator'
6
+ require_relative 'helper_generator'
7
+ require_relative 'rspec/rspec_generator'
8
+ require_relative 'rspec/rspec_examples_generator'
9
+
10
+ module InvokeGenerators
11
+ def generate_framework(structure = {})
12
+ generators = %w[Automation Common Helpers]
13
+ add_generator(generators, structure[:framework].capitalize)
14
+ generators = add_examples(generators) if structure[:examples]
15
+ generators.each do |generator|
16
+ invoke_generator({
17
+ automation: structure[:automation],
18
+ framework: structure[:framework],
19
+ generator: generator,
20
+ name: structure[:name],
21
+ visual: structure[:visual]
22
+ })
23
+ end
24
+ end
25
+
26
+ def add_generator(generators, *gens)
27
+ gens.each { |generator| generators.push generator }
28
+ end
29
+
30
+ def add_examples(generators)
31
+ if generators.include?('Cucumber')
32
+ generators.push('CucumberExamples')
33
+ else
34
+ generators.push('RspecExamples')
35
+ end
36
+
37
+ generators.push('AutomationExamples')
38
+ end
39
+
40
+ def invoke_generator(structure = {})
41
+ Object.const_get("#{structure[:generator]}Generator")
42
+ .new([structure[:automation],
43
+ structure[:framework],
44
+ structure[:name],
45
+ structure[:visual]]).invoke_all
46
+ end
47
+ end
@@ -1,19 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'tty-prompt'
4
- require_relative 'automation_generator'
5
- require_relative 'common_generator'
6
- require_relative 'cucumber_generator'
7
- require_relative 'helper_generator'
8
- require_relative 'rspec_generator'
4
+ require_relative '../generators/invoke_generators'
9
5
 
10
6
  class MenuGenerator
11
- attr_reader :prompt, :name, :generators
7
+ attr_reader :prompt, :name
8
+
9
+ include InvokeGenerators
12
10
 
13
11
  def initialize(project_name)
14
12
  @prompt = TTY::Prompt.new
15
13
  @name = project_name
16
- @generators = %w[Automation Common Helpers]
17
14
  end
18
15
 
19
16
  def generate_choice_menu
@@ -27,7 +24,7 @@ class MenuGenerator
27
24
 
28
25
  def choose_visual_automation
29
26
  prompt.select('Do you want to add visual automation with applitools?') do |menu|
30
- menu.choice :Yes, -> { true }
27
+ menu.choice :Yes, -> { true }
31
28
  menu.choice :No, -> { false }
32
29
  menu.choice :Quit, -> { exit }
33
30
  end
@@ -39,8 +36,15 @@ class MenuGenerator
39
36
  select_test_framework(automation)
40
37
  end
41
38
 
42
- def set_up_framework(automation, framework, visual_automation)
43
- generate_framework(automation, framework, visual_automation)
39
+ def set_up_framework(automation, framework, visual_automation, with_examples)
40
+ structure = {
41
+ automation: automation,
42
+ framework: framework,
43
+ name: @name,
44
+ visual: visual_automation,
45
+ examples: with_examples
46
+ }
47
+ generate_framework(structure)
44
48
  system "cd #{name} && gem install bundler && bundle install"
45
49
  end
46
50
 
@@ -53,35 +57,28 @@ class MenuGenerator
53
57
  end
54
58
  end
55
59
 
56
- def generate_framework(automation, framework, visual_automation)
57
- add_generator framework.capitalize
58
- generators.each { |generator| invoke_generator(automation, framework, generator, visual_automation) }
59
- end
60
-
61
- protected
62
-
63
- def add_generator(*opts)
64
- opts.each { |opt| @generators.push opt }
65
- end
66
-
67
60
  private
68
61
 
69
- def framework_choice(framework, automation_type)
62
+ def framework_choice(framework, automation_type, with_examples: true)
70
63
  visual_automation = choose_visual_automation if %w[selenium watir].include?(automation_type) && framework == 'Rspec'
71
64
 
72
- set_up_framework(automation_type, framework.downcase, visual_automation)
65
+ set_up_framework(automation_type, framework.downcase, visual_automation, with_examples)
73
66
  prompt.say("You have chosen to use #{framework} with #{automation_type}")
74
67
  end
75
68
 
76
69
  def select_test_framework(automation)
77
70
  prompt.select('Please select your test framework') do |menu|
78
- menu.choice :Cucumber, -> { framework_choice('Cucumber', automation) }
79
- menu.choice :Rspec, -> { framework_choice('Rspec', automation) }
71
+ menu.choice :Cucumber, -> { select_example_files('Cucumber', automation) }
72
+ menu.choice :Rspec, -> { select_example_files('Rspec', automation) }
80
73
  menu.choice :Quit, -> { exit }
81
74
  end
82
75
  end
83
76
 
84
- def invoke_generator(automation, framework, generator, visual_automation)
85
- Object.const_get("#{generator}Generator").new([automation, framework, name, visual_automation]).invoke_all
77
+ def select_example_files(framework, automation)
78
+ prompt.select('Would you like to create example files?') do |menu|
79
+ menu.choice :Yes, -> { framework_choice(framework, automation) }
80
+ menu.choice :No, -> { framework_choice(framework, automation, with_examples: false) }
81
+ menu.choice :Quit, -> { exit }
82
+ end
86
83
  end
87
84
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../generator'
4
+
5
+ class RspecExamplesGenerator < Generator
6
+ def generate_login_spec
7
+ return unless (@_initializer.first & %w[android ios cross_platform]).empty?
8
+
9
+ template('spec.tt', "#{name}/spec/login_page_spec.rb")
10
+ end
11
+
12
+ def generate_pdp_spec
13
+ return if (@_initializer.first & %w[android ios cross_platform]).empty?
14
+
15
+ template('spec.tt', "#{name}/spec/pdp_page_spec.rb")
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../generator'
4
+
5
+ class RspecGenerator < Generator
6
+ def generate_base_spec
7
+ template('base_spec.tt', "#{name}/spec/base_spec.rb")
8
+ end
9
+ end
data/lib/ruby_raider.rb CHANGED
@@ -3,6 +3,8 @@
3
3
  require_relative '../lib/commands/open_ai_commands'
4
4
  require_relative '../lib/commands/scaffolding_commands'
5
5
  require_relative '../lib/commands/utility_commands'
6
+ require_relative '../lib/desktop/installation_screen'
7
+ require_relative '../lib/desktop/runner_screen'
6
8
 
7
9
  module RubyRaider
8
10
  class Raider < Thor
@@ -14,6 +16,11 @@ module RubyRaider
14
16
 
15
17
  map '-n' => 'new'
16
18
 
19
+ desc 'open', 'It opens the Ruby Raider desktop app'
20
+ def open
21
+ InstallationScreen.new.launch
22
+ end
23
+
17
24
  desc 'version', 'It shows the version of Ruby Raider you are currently using'
18
25
  def version
19
26
  spec = Gem::Specification.find_by_name('ruby_raider')
data/ruby_raider.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'ruby_raider'
5
- s.version = '0.5.6'
5
+ s.version = '0.5.7'
6
6
  s.summary = 'A gem to make setup and start of UI automation projects easier'
7
7
  s.description = 'This gem has everything you need to start working with test automation'
8
8
  s.authors = ['Agustin Pequeno']
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency 'rubocop-rspec', '~> 2.9.0'
23
23
 
24
24
  s.add_runtime_dependency 'faraday', '~> 2.7'
25
+ s.add_runtime_dependency 'glimmer-dsl-libui', '~> 0.7.3'
25
26
  s.add_runtime_dependency 'ruby-openai', '~> 3.5'
26
27
  s.add_runtime_dependency 'thor', '~> 1.2.1'
27
28
  s.add_runtime_dependency 'tty-prompt', '~> 0.23.1'