geordi 5.2.3 → 6.0.0
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/.github/workflows/test.yml +6 -6
- data/.rspec +2 -0
- data/CHANGELOG.md +33 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +15 -4
- data/README.md +30 -58
- data/exe/dumple +7 -0
- data/geordi.gemspec +3 -2
- data/lib/geordi/chromedriver_updater.rb +7 -7
- data/lib/geordi/cli.rb +6 -6
- data/lib/geordi/commands/branch.rb +12 -0
- data/lib/geordi/commands/commit.rb +1 -1
- data/lib/geordi/commands/cucumber.rb +7 -38
- data/lib/geordi/commands/delete_dumps.rb +26 -28
- data/lib/geordi/commands/docker.rb +7 -1
- data/lib/geordi/commands/drop_databases.rb +0 -2
- data/lib/geordi/commands/dump.rb +3 -0
- data/lib/geordi/commands/remove_executable_flags.rb +2 -1
- data/lib/geordi/commands/rspec.rb +4 -1
- data/lib/geordi/cucumber.rb +4 -100
- data/lib/geordi/db_cleaner.rb +5 -5
- data/lib/geordi/docker.rb +71 -4
- data/lib/geordi/dump_loader.rb +1 -1
- data/lib/geordi/gitpt.rb +156 -70
- data/lib/geordi/interaction.rb +5 -3
- data/lib/geordi/remote.rb +2 -1
- data/lib/geordi/settings.rb +38 -38
- data/lib/geordi/version.rb +1 -1
- metadata +8 -9
- data/exe/launchy_browser +0 -15
- data/lib/geordi/commands/_setup_vnc.rb +0 -64
- data/lib/geordi/commands/firefox.rb +0 -32
- data/lib/geordi/commands/vnc.rb +0 -18
- data/lib/geordi/firefox_for_selenium.rb +0 -200
data/exe/launchy_browser
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# This script is a part of Geordi. It is used by the cucumber command to have
|
4
|
-
# launchy open error pages from tests in the users browser, as apposed to
|
5
|
-
# opening it within VNC.
|
6
|
-
|
7
|
-
# For unknown reasons, #require cannot find 'geordi/cucumber', so we need to
|
8
|
-
# require it this way. Hours have been spent trying to require 'geordi/cucumber'.
|
9
|
-
require File.expand_path('../../lib/geordi/cucumber', __FILE__)
|
10
|
-
Geordi::Cucumber.new.restore_env
|
11
|
-
|
12
|
-
require 'rubygems'
|
13
|
-
require 'launchy'
|
14
|
-
|
15
|
-
Launchy.open(ARGV.first)
|
@@ -1,64 +0,0 @@
|
|
1
|
-
desc '-setup-vnc', 'Setup VNC for running Selenium tests there', hide: true
|
2
|
-
def _setup_vnc
|
3
|
-
`clear`
|
4
|
-
|
5
|
-
Interaction.note 'This script will help you install a VNC server and a VNC viewer.'
|
6
|
-
puts
|
7
|
-
puts Util.strip_heredoc <<-TEXT
|
8
|
-
With those you will be able to use our cucumber script without being
|
9
|
-
disturbed by focus-stealing Selenium windows. Instead, they will open
|
10
|
-
inside a VNC session.
|
11
|
-
|
12
|
-
You can still inspect everything with:
|
13
|
-
TEXT
|
14
|
-
Interaction.note_cmd 'geordi vnc'
|
15
|
-
puts
|
16
|
-
Interaction.note 'Please open a second shell to execute instructions.'
|
17
|
-
Interaction.prompt 'Continue ...'
|
18
|
-
|
19
|
-
Interaction.announce 'Setup VNC server'
|
20
|
-
|
21
|
-
vnc_server_installed = system('which vncserver > /dev/null 2>&1')
|
22
|
-
if vnc_server_installed
|
23
|
-
Interaction.success 'It appears you already have a VNC server installed. Good job!'
|
24
|
-
else
|
25
|
-
puts 'Please run:'
|
26
|
-
Interaction.note_cmd 'sudo apt-get install tightvncserver'
|
27
|
-
puts 'In case this package is not available, you may try vnc4server instead.'
|
28
|
-
Interaction.prompt 'Continue ...'
|
29
|
-
|
30
|
-
puts
|
31
|
-
|
32
|
-
Interaction.note 'We will now set a password for your VNC server.'
|
33
|
-
puts Util.strip_heredoc <<-TEXT
|
34
|
-
When running our cucumber script, this password will be used while also
|
35
|
-
restricting access to the local machine. However, if you start a vncserver
|
36
|
-
without our cucumber script, keep in mind that a user with this password
|
37
|
-
can connect to your machine.
|
38
|
-
|
39
|
-
TEXT
|
40
|
-
puts 'Please run:'
|
41
|
-
Interaction.note_cmd 'vncpasswd'
|
42
|
-
Interaction.warn 'Enter a secure password!'
|
43
|
-
Interaction.prompt 'Continue ...'
|
44
|
-
end
|
45
|
-
|
46
|
-
Interaction.announce 'Setup VNC viewer'
|
47
|
-
|
48
|
-
vnc_viewer_installed = system('which vncviewer > /dev/null 2>&1')
|
49
|
-
if vnc_viewer_installed
|
50
|
-
Interaction.success 'It appears you already have a VNC viewer installed. Good job!'
|
51
|
-
else
|
52
|
-
puts 'Please run:'
|
53
|
-
Interaction.note_cmd 'sudo apt-get install xtightvncviewer'
|
54
|
-
Interaction.prompt 'Continue ...'
|
55
|
-
end
|
56
|
-
|
57
|
-
puts
|
58
|
-
puts Util.strip_heredoc <<-TEXT
|
59
|
-
All done. Our cucumber script will now automatically run Selenium features
|
60
|
-
in VNC.
|
61
|
-
TEXT
|
62
|
-
|
63
|
-
Interaction.success 'Happy cuking!'
|
64
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
desc 'firefox COMMAND', 'Run a command with VNC and test browser set up (alias: chrome)'
|
2
|
-
long_desc <<-LONGDESC
|
3
|
-
Example: `geordi firefox b cucumber` or `geordi firefox --setup 24.0`
|
4
|
-
|
5
|
-
Useful when you need Firefox for Selenium or the VNC set up, but can't use the
|
6
|
-
`geordi cucumber` command. This command is aliased `chrome` for users running
|
7
|
-
Selenium in Chrome.
|
8
|
-
LONGDESC
|
9
|
-
|
10
|
-
option :setup, banner: 'FIREFOX_VERSION',
|
11
|
-
desc: 'Install a special test runner Firefox with the given version'
|
12
|
-
|
13
|
-
def firefox(*command)
|
14
|
-
if options.setup
|
15
|
-
Interaction.fail 'Firefox version required (e.g. --setup 24.0)' if options.setup == 'setup'
|
16
|
-
|
17
|
-
require 'geordi/firefox_for_selenium'
|
18
|
-
Geordi::FirefoxForSelenium.install(options.setup)
|
19
|
-
|
20
|
-
else
|
21
|
-
require 'geordi/cucumber'
|
22
|
-
|
23
|
-
Cucumber.new.setup_vnc
|
24
|
-
FirefoxForSelenium.setup_firefox
|
25
|
-
|
26
|
-
puts
|
27
|
-
Interaction.note_cmd command.join(' ')
|
28
|
-
system *command # Util.run! would reset the Firefox PATH
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
map 'chrome' => 'firefox'
|
data/lib/geordi/commands/vnc.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
desc 'vnc', 'Show the hidden VNC window'
|
2
|
-
long_desc <<-LONGDESC
|
3
|
-
Example: `geordi vnc` or `geordi vnc --setup`
|
4
|
-
|
5
|
-
Launch a VNC session to the hidden screen where `geordi cucumber` runs Selenium
|
6
|
-
tests.
|
7
|
-
LONGDESC
|
8
|
-
|
9
|
-
option :setup, type: :boolean, desc: 'Guide through the setup of VNC'
|
10
|
-
|
11
|
-
def vnc
|
12
|
-
if options.setup
|
13
|
-
invoke_geordi :_setup_vnc
|
14
|
-
else
|
15
|
-
require 'geordi/cucumber'
|
16
|
-
Geordi::Cucumber.new.launch_vnc_viewer
|
17
|
-
end
|
18
|
-
end
|
@@ -1,200 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
require 'tempfile'
|
3
|
-
require File.expand_path('interaction', __dir__)
|
4
|
-
|
5
|
-
module Geordi
|
6
|
-
module FirefoxForSelenium
|
7
|
-
|
8
|
-
FIREFOX_FOR_SELENIUM_BASE_PATH = Pathname.new('~/bin/firefoxes').expand_path
|
9
|
-
FIREFOX_FOR_SELENIUM_PROFILE_NAME = 'firefox-for-selenium'.freeze
|
10
|
-
FIREFOX_VERSION_FILE = Pathname.new('.firefox-version')
|
11
|
-
|
12
|
-
def self.install(version)
|
13
|
-
Installer.new(version).run
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.path_from_config
|
17
|
-
version = FIREFOX_VERSION_FILE.exist? && File.read(FIREFOX_VERSION_FILE).strip
|
18
|
-
|
19
|
-
if version && (version != 'system')
|
20
|
-
unless FirefoxForSelenium.binary(version).exist?
|
21
|
-
Interaction.warn "Firefox #{version} not found"
|
22
|
-
|
23
|
-
Interaction.note Util.strip_heredoc(<<-INSTRUCTIONS)
|
24
|
-
Install it with
|
25
|
-
geordi firefox --setup #{version}
|
26
|
-
INSTRUCTIONS
|
27
|
-
|
28
|
-
Interaction.prompt('Run tests anyway?', 'n', /y|yes/) || Interaction.fail('Cancelled.')
|
29
|
-
end
|
30
|
-
|
31
|
-
path(version)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.path(version)
|
36
|
-
FIREFOX_FOR_SELENIUM_BASE_PATH.join(version)
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.binary(version, name = 'firefox')
|
40
|
-
path(version).join(name)
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.setup_firefox
|
44
|
-
path = path_from_config
|
45
|
-
|
46
|
-
if path
|
47
|
-
ENV['PATH'] = "#{path}:#{ENV['PATH']}"
|
48
|
-
Interaction.note 'Firefox for Selenium set up'
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
class Installer
|
54
|
-
|
55
|
-
def initialize(version)
|
56
|
-
@version = version
|
57
|
-
end
|
58
|
-
|
59
|
-
def run
|
60
|
-
say_hello
|
61
|
-
check_if_run_before
|
62
|
-
download_firefox
|
63
|
-
create_separate_profile # do this before the patching because the patched binary calls firefox with a profile that does not yet exist
|
64
|
-
patch_old_firefox
|
65
|
-
configure_old_firefox
|
66
|
-
kkthxbb
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def execute_command(cmd)
|
73
|
-
system(cmd) || raise("Error while executing command: #{cmd}")
|
74
|
-
end
|
75
|
-
|
76
|
-
def run_firefox_for_selenium(args = '')
|
77
|
-
execute_command("PATH=#{path}:$PATH firefox #{args}")
|
78
|
-
end
|
79
|
-
|
80
|
-
def path
|
81
|
-
FirefoxForSelenium.path(@version)
|
82
|
-
end
|
83
|
-
|
84
|
-
def download_url
|
85
|
-
"https://ftp.mozilla.org/pub/firefox/releases/#{@version}/"
|
86
|
-
end
|
87
|
-
|
88
|
-
def binary
|
89
|
-
FirefoxForSelenium.binary(@version)
|
90
|
-
end
|
91
|
-
|
92
|
-
def original_binary
|
93
|
-
FirefoxForSelenium.binary(@version, 'firefox-original')
|
94
|
-
end
|
95
|
-
|
96
|
-
def say_hello
|
97
|
-
execute_command('clear')
|
98
|
-
|
99
|
-
puts Util.strip_heredoc(<<-HELLO)
|
100
|
-
Whenever Firefox updates, Selenium breaks. This is annoying. This
|
101
|
-
script will help you create an unchanging version of Firefox for your
|
102
|
-
Selenium tests.
|
103
|
-
|
104
|
-
In particular, this new copy of Firefox will have the following
|
105
|
-
properties:
|
106
|
-
|
107
|
-
- It won't update itself with a newer version
|
108
|
-
- It can co-exist with your regular Firefox installation (which you can
|
109
|
-
update at will)
|
110
|
-
- It will use a profile separate from the one you use for regular
|
111
|
-
Firefox browsing
|
112
|
-
- It will not try to re-use existing Firefox windows
|
113
|
-
- It will automatically be used for your Selenium scenarios if you run
|
114
|
-
your Cucumber using the cuc binary from the geordi gem.
|
115
|
-
- It will live in #{path}
|
116
|
-
HELLO
|
117
|
-
|
118
|
-
Interaction.prompt "Press ENTER when you're ready to begin."
|
119
|
-
end
|
120
|
-
|
121
|
-
def check_if_run_before
|
122
|
-
if original_binary.exist?
|
123
|
-
Interaction.note 'This version seems to be already installed.'
|
124
|
-
Interaction.prompt 'Press ENTER to continue anyway or press CTRL+C to abort.'
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def download_firefox
|
129
|
-
path.mkpath
|
130
|
-
|
131
|
-
puts Util.strip_heredoc(<<-INSTRUCTION)
|
132
|
-
Please download an old version of Firefox from: #{download_url}
|
133
|
-
Unpack it with: tar xjf firefox-#{@version}.tar.bz2 -C #{path} --strip-components=1
|
134
|
-
Now #{path.join('firefox')} should be the firefox binary, not a directory.
|
135
|
-
INSTRUCTION
|
136
|
-
Interaction.prompt 'Continue?'
|
137
|
-
|
138
|
-
File.file?(binary) || raise("Could not find #{binary}")
|
139
|
-
end
|
140
|
-
|
141
|
-
def create_separate_profile
|
142
|
-
Interaction.note "Creating a separate profile named '#{FIREFOX_FOR_SELENIUM_PROFILE_NAME}' so your own profile will be safe..."
|
143
|
-
# don't use the patched firefox binary for this, we don't want to give
|
144
|
-
# a -p option here
|
145
|
-
execute_command("PATH=#{path}:$PATH firefox -no-remote -CreateProfile #{FIREFOX_FOR_SELENIUM_PROFILE_NAME}")
|
146
|
-
puts
|
147
|
-
end
|
148
|
-
|
149
|
-
def patch_old_firefox
|
150
|
-
Interaction.note "Patching #{binary} so it uses the new profile and never re-uses windows from other Firefoxes..."
|
151
|
-
execute_command("mv #{binary} #{original_binary}")
|
152
|
-
execute_command("mv #{binary}-bin #{original_binary}-bin")
|
153
|
-
patched_binary = Tempfile.new('firefox')
|
154
|
-
patched_binary.write Util.strip_heredoc(<<-PATCH)
|
155
|
-
#!/usr/bin/env ruby
|
156
|
-
exec('#{original_binary}', '-no-remote', '-P', '#{FIREFOX_FOR_SELENIUM_PROFILE_NAME}', *ARGV)
|
157
|
-
PATCH
|
158
|
-
patched_binary.close
|
159
|
-
execute_command("mv #{patched_binary.path} #{binary}")
|
160
|
-
execute_command("chmod +x #{binary}")
|
161
|
-
puts
|
162
|
-
end
|
163
|
-
|
164
|
-
def configure_old_firefox
|
165
|
-
puts Util.strip_heredoc(<<-INSTRUCTION)
|
166
|
-
You will now have to do some manual configuration.
|
167
|
-
|
168
|
-
This script will open the patched copy of Firefox when you press ENTER.
|
169
|
-
Please perform the following steps manually:
|
170
|
-
|
171
|
-
- IMPORTANT: Quickly disable all automatic updates under Edit /
|
172
|
-
Preferences / Advanced / Update
|
173
|
-
- Disable the default browser check when Firefox launches
|
174
|
-
- Check that the version number is correct (#{@version})
|
175
|
-
- You should not see your bookmarks, add-ons, plugins from your regular
|
176
|
-
Firefox profile
|
177
|
-
INSTRUCTION
|
178
|
-
|
179
|
-
Interaction.prompt 'Will open the patched copy of Firefox now'
|
180
|
-
run_firefox_for_selenium
|
181
|
-
end
|
182
|
-
|
183
|
-
def kkthxbb
|
184
|
-
Interaction.success "Congratulations, you're done!"
|
185
|
-
|
186
|
-
puts
|
187
|
-
puts Util.strip_heredoc(<<-INSTRUCTION)
|
188
|
-
Your patched copy of Firefox will be used when you run Cucumber using
|
189
|
-
the cucumber script that comes with the geordi gem. If you cannot use
|
190
|
-
`geordi cucumber`, but still need the test browser set up, you can use:
|
191
|
-
|
192
|
-
geordi firefox <any command>
|
193
|
-
|
194
|
-
Enjoy!
|
195
|
-
INSTRUCTION
|
196
|
-
end
|
197
|
-
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|