capybara-experience 0.2 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66f9abbe2b8c449fd5757456f39cf7c376adbf1fb456ed462cb452adf4cb5aa6
4
- data.tar.gz: 4a8c6b7d01a40beaa5653a46693272239dfbb826f7403c8ff16549bf0a3ed6d3
3
+ metadata.gz: 1fa20ed37708148de49cef701b1a01f8bb178e265aa7e90fd5f0669a60850147
4
+ data.tar.gz: a7becb3e8c47766a43bc2aa0a5f5ea327042d1b3860342cc4e21ce42966001be
5
5
  SHA512:
6
- metadata.gz: 3889ec278546633b65a980942773fec6c0f5517812328ed687eeff7056774ada49f3e9fe96f460b18df380c512eb30fdf171bbf87500358887887e6621efb8e4
7
- data.tar.gz: d950c605b5aa346db94b184a56d39f5c12b8f97c6f594a5a2fe2f3a8059fc2588bd7e970d090871b950ee8e06128aea9b341e24ff9de09d8bb260df8ba3c1ee4
6
+ metadata.gz: 299a7d14d66b32ee67f19275bce4ede292e2d29c14faddb0561205fde708a2a8dd65133900dd0dc40eadc0f91f931302fcb72d3d8c198e595f1841f6ae2f1d50
7
+ data.tar.gz: 3c6fae1f8bebef030e7ff554b73a30d022c3553de3b75cc0822645f92332507698800ed5c8076ac37441098b9dfeb6e0f8419eefbc04d135809b552b33e0b5dc
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ Gemfile.lock
@@ -28,4 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "bundler", "~> 2.0"
29
29
  spec.add_development_dependency "rake", "~> 10.0"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
+
32
+ spec.add_runtime_dependency "capybara", "~> 3.0"
31
33
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ require "singleton"
3
+
4
+ module Capybara
5
+ class Experience
6
+ class Pool < Hash
7
+ include Singleton
8
+
9
+ def [](key)
10
+ super(key) || begin
11
+ driver, _session_name, app_object_id = key.split(":")
12
+ take(driver: driver, app_object_id: app_object_id, key: key)
13
+ end
14
+ end
15
+
16
+ def take(driver: Capybara.current_driver, app_object_id: Capybara.app.object_id, key: nil)
17
+ session = idle.find { |s| s.mode == driver && s.app.object_id == app_object_id }
18
+ if session
19
+ idle.delete(session)
20
+ self[key] = delete(session_key(session)) if key
21
+ else
22
+ session = ::Capybara::Session.new(driver.to_sym, Capybara.app)
23
+ key ||= session_key(session)
24
+ self[key] = session
25
+ end
26
+
27
+ session
28
+ end
29
+
30
+ def idle
31
+ @idle ||= []
32
+ end
33
+
34
+ def taken
35
+ values - idle
36
+ end
37
+
38
+ def reset_idle!
39
+ dup.each do |key, session|
40
+ self[session_key(session)] = delete(key)
41
+ end
42
+ @idle = values
43
+
44
+ nil
45
+ end
46
+
47
+ private
48
+
49
+ def session_key(session)
50
+ "#{session.mode}:#{session.object_id}:#{session.app.object_id}"
51
+ end
52
+ end
53
+ end
54
+ end
@@ -29,6 +29,9 @@ module Capybara
29
29
 
30
30
  RSpec.configure do |config|
31
31
  config.include BehaviorDSL
32
+ config.prepend_after :each, type: :feature, js: true do
33
+ Capybara::Experience::Pool.instance.reset_idle!
34
+ end
32
35
  end
33
36
  end
34
37
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  class Experience
3
- VERSION = "0.2"
3
+ VERSION = "0.3.2"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require "capybara/dsl"
3
- require "capybara/experience/session"
3
+ require "capybara/experience/pool"
4
4
 
5
5
  module Capybara
6
6
  class Experience
@@ -23,28 +23,35 @@ module Capybara
23
23
  delegate :driver, to: :page
24
24
 
25
25
  def page
26
- @page ||= Experience::Session.next(driver: driver_name)
26
+ @page ||= Experience::Pool.instance.take(driver: driver_name)
27
+
28
+ Capybara::Screenshot.final_session_name = @page.object_id if defined?(Capybara::Screenshot)
29
+
30
+ @page
27
31
  end
28
32
 
29
33
  def self.wait_for_pending_requests
30
- Experience::Session.pool.taken.each do |session|
34
+ Experience::Pool.taken.each do |session|
31
35
  session.server.try(:wait_for_pending_requests)
32
36
  end
33
37
  end
34
38
 
35
- def save_and_open_screenshot_full(path = nil, options = {})
36
- save_and_open_screenshot(path, options.merge(full: true))
37
- end
39
+ class Error < StandardError; end
38
40
 
39
- def click_with_js(element)
40
- xpath = element.path
41
- execute_script <<~JS
42
- document.evaluate('#{xpath}', document, null, XPathResult.ANY_TYPE, null)
43
- .iterateNext()
44
- .click()
45
- JS
46
- end
41
+ module UnifySessionPool
42
+ def page
43
+ Capybara::Screenshot.final_session_name = Capybara.session_name if defined?(Capybara::Screenshot)
47
44
 
48
- class Error < StandardError; end
45
+ super
46
+ end
47
+
48
+ private
49
+
50
+ def session_pool
51
+ @session_pool ||= Experience::Pool.instance
52
+ end
53
+ end
49
54
  end
55
+
56
+ singleton_class.prepend Experience::UnifySessionPool
50
57
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-experience
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Ong
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '3.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: capybara
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
56
70
  description: Abstractions for Capybara to manage multiple user sessions, encapsulate
57
71
  shared test behavior, and semantically contextualize test code.
58
72
  email:
@@ -73,8 +87,8 @@ files:
73
87
  - capybara-experience.gemspec
74
88
  - lib/capybara-experience.rb
75
89
  - lib/capybara/experience.rb
90
+ - lib/capybara/experience/pool.rb
76
91
  - lib/capybara/experience/rspec.rb
77
- - lib/capybara/experience/session.rb
78
92
  - lib/capybara/experience/version.rb
79
93
  homepage: https://github.com/ryanong/capybara-experience
80
94
  licenses: []
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Capybara
4
- class Experience
5
- module Session
6
- class << self
7
- def next(driver:)
8
- pool.next(driver)
9
- end
10
-
11
- def create(driver)
12
- ::Capybara::Session.new(driver, Capybara.app)
13
- end
14
-
15
- def pool
16
- @pool ||= Pool.new
17
- end
18
- end
19
-
20
- class Pool
21
- attr_accessor :idle, :taken
22
-
23
- def initialize
24
- @idle = []
25
- @taken = []
26
- end
27
-
28
- def next(driver)
29
- take_idle(driver) || create(driver)
30
- end
31
-
32
- def release
33
- taken.each(&:reset!)
34
- idle.concat(taken)
35
- taken.clear
36
- end
37
-
38
- private
39
-
40
- def take_idle(driver)
41
- idle.find { |s| s.mode == driver }.tap do |session|
42
- if session
43
- idle.delete(session)
44
- taken.push(session)
45
- end
46
- end
47
- end
48
-
49
- def create(driver)
50
- ::Capybara::Experience::Session.create(driver).tap do |session|
51
- taken.push(session)
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end