playwright-rails 0.0.1
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 +7 -0
- data/.github/workflows/main.yml +21 -0
- data/.gitignore +8 -0
- data/.rubocop.yml +647 -0
- data/.tool-versions +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +100 -0
- data/LICENSE.txt +25 -0
- data/README.md +1 -0
- data/Rakefile +11 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/playwright-rails +17 -0
- data/lib/playwright-rails/config.rb +45 -0
- data/lib/playwright-rails/env.rb +14 -0
- data/lib/playwright-rails/finds_bin.rb +16 -0
- data/lib/playwright-rails/initializer_hooks.rb +53 -0
- data/lib/playwright-rails/launches_playwright.rb +63 -0
- data/lib/playwright-rails/manages_transactions.rb +79 -0
- data/lib/playwright-rails/open.rb +14 -0
- data/lib/playwright-rails/railtie.rb +12 -0
- data/lib/playwright-rails/rake.rb +13 -0
- data/lib/playwright-rails/resets_state.rb +20 -0
- data/lib/playwright-rails/run.rb +14 -0
- data/lib/playwright-rails/server/checker.rb +42 -0
- data/lib/playwright-rails/server/middleware.rb +67 -0
- data/lib/playwright-rails/server/puma.rb +31 -0
- data/lib/playwright-rails/server/timer.rb +24 -0
- data/lib/playwright-rails/server.rb +121 -0
- data/lib/playwright-rails/starts_rails_server.rb +34 -0
- data/lib/playwright-rails/tracks_resets.rb +26 -0
- data/lib/playwright-rails/version.rb +3 -0
- data/lib/playwright-rails.rb +11 -0
- data/playwright-rails.gemspec +32 -0
- metadata +162 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module PlaywrightRails
|
2
|
+
class Server
|
3
|
+
class Timer
|
4
|
+
def initialize(expire_in)
|
5
|
+
@start = current
|
6
|
+
@expire_in = expire_in
|
7
|
+
end
|
8
|
+
|
9
|
+
def expired?
|
10
|
+
current - @start >= @expire_in
|
11
|
+
end
|
12
|
+
|
13
|
+
def stalled?
|
14
|
+
@start == current
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def current
|
20
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "uri"
|
4
|
+
require "net/http"
|
5
|
+
require "rack"
|
6
|
+
require_relative "initializer_hooks"
|
7
|
+
require_relative "server/middleware"
|
8
|
+
require_relative "server/checker"
|
9
|
+
require_relative "server/timer"
|
10
|
+
require_relative "server/puma"
|
11
|
+
|
12
|
+
module PlaywrightRails
|
13
|
+
class Server
|
14
|
+
class << self
|
15
|
+
def ports
|
16
|
+
@ports ||= {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :app, :host, :port
|
21
|
+
|
22
|
+
def initialize(app,
|
23
|
+
host:,
|
24
|
+
port:,
|
25
|
+
reportable_errors: [Exception],
|
26
|
+
extra_middleware: [])
|
27
|
+
@app = app
|
28
|
+
@extra_middleware = extra_middleware
|
29
|
+
@server_thread = nil # suppress warnings
|
30
|
+
@host = host
|
31
|
+
@reportable_errors = reportable_errors
|
32
|
+
@port = port
|
33
|
+
@port ||= Server.ports[port_key]
|
34
|
+
@port ||= find_available_port(host)
|
35
|
+
@checker = Checker.new(@host, @port)
|
36
|
+
@initializer_hooks = InitializerHooks.instance
|
37
|
+
end
|
38
|
+
|
39
|
+
def reset_error!
|
40
|
+
middleware.clear_error
|
41
|
+
end
|
42
|
+
|
43
|
+
def error
|
44
|
+
middleware.error
|
45
|
+
end
|
46
|
+
|
47
|
+
def using_ssl?
|
48
|
+
@checker.ssl?
|
49
|
+
end
|
50
|
+
|
51
|
+
def responsive?
|
52
|
+
return false if @server_thread&.join(0)
|
53
|
+
|
54
|
+
res = @checker.request { |http| http.get("/__identify__") }
|
55
|
+
|
56
|
+
return res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
|
57
|
+
rescue SystemCallError, Net::ReadTimeout, OpenSSL::SSL::SSLError
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
def wait_for_pending_requests
|
62
|
+
timer = Timer.new(60)
|
63
|
+
while pending_requests?
|
64
|
+
raise "Requests did not finish in 60 seconds: #{middleware.pending_requests}" if timer.expired?
|
65
|
+
|
66
|
+
sleep 0.01
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def boot
|
71
|
+
unless responsive?
|
72
|
+
Server.ports[port_key] = port
|
73
|
+
|
74
|
+
@server_thread = Thread.new {
|
75
|
+
Puma.create(middleware, port, host)
|
76
|
+
}
|
77
|
+
|
78
|
+
timer = Timer.new(60)
|
79
|
+
until responsive?
|
80
|
+
raise "Rack application timed out during boot" if timer.expired?
|
81
|
+
|
82
|
+
@server_thread.join(0.1)
|
83
|
+
@initializer_hooks.run(:after_server_start)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def middleware
|
93
|
+
@middleware ||= Middleware.new(app, @reportable_errors, @extra_middleware)
|
94
|
+
end
|
95
|
+
|
96
|
+
def port_key
|
97
|
+
app.object_id # as opposed to middleware.object_id if multiple instances
|
98
|
+
end
|
99
|
+
|
100
|
+
def pending_requests?
|
101
|
+
middleware.pending_requests?
|
102
|
+
end
|
103
|
+
|
104
|
+
def find_available_port(host)
|
105
|
+
server = TCPServer.new(host, 0)
|
106
|
+
port = server.addr[1]
|
107
|
+
server.close
|
108
|
+
|
109
|
+
# Workaround issue where some platforms (mac, ???) when passed a host
|
110
|
+
# of '0.0.0.0' will return a port that is only available on one of the
|
111
|
+
# ip addresses that resolves to, but the next binding to that port requires
|
112
|
+
# that port to be available on all ips
|
113
|
+
server = TCPServer.new(host, port)
|
114
|
+
port
|
115
|
+
rescue Errno::EADDRINUSE
|
116
|
+
retry
|
117
|
+
ensure
|
118
|
+
server&.close
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative "tracks_resets"
|
2
|
+
require_relative "server"
|
3
|
+
|
4
|
+
module PlaywrightRails
|
5
|
+
class StartsRailsServer
|
6
|
+
def call(host:, port:, transactional_server:)
|
7
|
+
configure_rails_to_run_our_state_reset_on_every_request!(transactional_server)
|
8
|
+
app = create_rack_app
|
9
|
+
Server.new(app, host: host, port: port).tap do |server|
|
10
|
+
server.boot
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure_rails_to_run_our_state_reset_on_every_request!(transactional_server)
|
15
|
+
Rails.application.executor.to_run do
|
16
|
+
TracksResets.instance.reset_state_if_needed(transactional_server)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_rack_app
|
21
|
+
Rack::Builder.new do
|
22
|
+
map "/playwright_rails_reset_state" do
|
23
|
+
run lambda { |env|
|
24
|
+
TracksResets.instance.reset_needed!
|
25
|
+
[202, {"Content-Type" => "text/plain"}, ["Accepted"]]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
map "/" do
|
29
|
+
run Rails.application
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative "resets_state"
|
2
|
+
|
3
|
+
module PlaywrightRails
|
4
|
+
class TracksResets
|
5
|
+
def self.instance
|
6
|
+
@instance ||= new
|
7
|
+
end
|
8
|
+
|
9
|
+
def reset_needed!
|
10
|
+
@reset_needed = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset_state_if_needed(transactional_server)
|
14
|
+
if @reset_needed
|
15
|
+
ResetsState.new.call(transactional_server: transactional_server)
|
16
|
+
@reset_needed = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@reset_needed = false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "playwright-rails/version"
|
2
|
+
|
3
|
+
module PlaywrightRails
|
4
|
+
end
|
5
|
+
|
6
|
+
require "playwright-rails/launches_playwright"
|
7
|
+
require "playwright-rails/open"
|
8
|
+
require "playwright-rails/run"
|
9
|
+
require "playwright-rails/resets_state"
|
10
|
+
require "playwright-rails/initializer_hooks"
|
11
|
+
require "playwright-rails/railtie" if defined?(Rails)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "playwright-rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "playwright-rails"
|
7
|
+
spec.version = PlaywrightRails::VERSION
|
8
|
+
spec.authors = ["Michael Stock"]
|
9
|
+
spec.email = ["mike@mas2.com"]
|
10
|
+
|
11
|
+
spec.summary = "Helps you write Playwright tests of your Rails app"
|
12
|
+
spec.homepage = "https://github.com/buildrtech/playwright-rails"
|
13
|
+
spec.license = "Nonstandard"
|
14
|
+
|
15
|
+
# Specify which files should be added to the gem when it is released.
|
16
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
17
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
18
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|example)/}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
spec.bindir = "exe"
|
22
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
|
25
|
+
spec.add_dependency "puma", "~> 6"
|
26
|
+
spec.add_dependency "railties", "~> 7"
|
27
|
+
|
28
|
+
spec.add_development_dependency "bundler"
|
29
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
30
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
31
|
+
spec.add_development_dependency "rubocop", "< 2"
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: playwright-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Stock
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-03-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: puma
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: railties
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '7'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '7'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '13.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '13.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "<"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "<"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2'
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- mike@mas2.com
|
100
|
+
executables:
|
101
|
+
- playwright-rails
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".github/workflows/main.yml"
|
106
|
+
- ".gitignore"
|
107
|
+
- ".rubocop.yml"
|
108
|
+
- ".tool-versions"
|
109
|
+
- ".travis.yml"
|
110
|
+
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- LICENSE.txt
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- bin/console
|
116
|
+
- bin/setup
|
117
|
+
- exe/playwright-rails
|
118
|
+
- lib/playwright-rails.rb
|
119
|
+
- lib/playwright-rails/config.rb
|
120
|
+
- lib/playwright-rails/env.rb
|
121
|
+
- lib/playwright-rails/finds_bin.rb
|
122
|
+
- lib/playwright-rails/initializer_hooks.rb
|
123
|
+
- lib/playwright-rails/launches_playwright.rb
|
124
|
+
- lib/playwright-rails/manages_transactions.rb
|
125
|
+
- lib/playwright-rails/open.rb
|
126
|
+
- lib/playwright-rails/railtie.rb
|
127
|
+
- lib/playwright-rails/rake.rb
|
128
|
+
- lib/playwright-rails/resets_state.rb
|
129
|
+
- lib/playwright-rails/run.rb
|
130
|
+
- lib/playwright-rails/server.rb
|
131
|
+
- lib/playwright-rails/server/checker.rb
|
132
|
+
- lib/playwright-rails/server/middleware.rb
|
133
|
+
- lib/playwright-rails/server/puma.rb
|
134
|
+
- lib/playwright-rails/server/timer.rb
|
135
|
+
- lib/playwright-rails/starts_rails_server.rb
|
136
|
+
- lib/playwright-rails/tracks_resets.rb
|
137
|
+
- lib/playwright-rails/version.rb
|
138
|
+
- playwright-rails.gemspec
|
139
|
+
homepage: https://github.com/buildrtech/playwright-rails
|
140
|
+
licenses:
|
141
|
+
- Nonstandard
|
142
|
+
metadata: {}
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options: []
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
requirements: []
|
158
|
+
rubygems_version: 3.3.26
|
159
|
+
signing_key:
|
160
|
+
specification_version: 4
|
161
|
+
summary: Helps you write Playwright tests of your Rails app
|
162
|
+
test_files: []
|