unobtainium 0.9.0 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c48a4bbdaf69ce31be6eb42f8a10bd4af462fafb
4
- data.tar.gz: f4f811e06460e1a124769e97dadb0d79de82ba93
3
+ metadata.gz: 7a47708be130d105fbf6be7bbdd7f00406882929
4
+ data.tar.gz: 81128ec3068eb4e880c7b314e6c7cd2e3d7d6c3a
5
5
  SHA512:
6
- metadata.gz: 2582d432e5fc1c6d35cacee66c8eb71ec87437313f1ab3f8706dd457d4925ccb07cac952e535bba1898eb8e1e6b9cb1becaf3e90f2ab36d78c1a2d33e97ab575
7
- data.tar.gz: 9e610ebc5b157cb7828a4be8f7208687b8df5acb2ebd7ee9f023173132dd3a0c4d285d1eaf725ea8f2b13ca6c7c2b0c41c71aec11fca49a41082303081ba8e0b
6
+ metadata.gz: 2ffd14ee0d6b4958e4238a437530726e3ed18d278f8ff462db70d2a58b63f7e2423bee73aa958358fcccd85fd2f673f389d34dceab480464b6d94a0c420305c3
7
+ data.tar.gz: be670c898c0fff253dc79bd3e8ff3841d44ebac6e7b494d6a6d9a7e873c545acb8e32d8a2b0477f4e99b840f6bf31d139a148dc2f44c32ca3bdeb22b82bf0e26
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- unobtainium (0.9.0)
4
+ unobtainium (0.10.0)
5
5
  collapsium (~> 0.8)
6
6
  collapsium-config (~> 0.4)
7
7
  ptools (~> 1.3)
@@ -10,7 +10,7 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- appium_lib (8.1.0)
13
+ appium_lib (8.2.1)
14
14
  awesome_print (~> 1.6)
15
15
  json (~> 1.8)
16
16
  nokogiri (~> 1.6.6)
@@ -28,7 +28,7 @@ GEM
28
28
  nokogiri (~> 1.6)
29
29
  codeclimate-test-reporter (1.0.3)
30
30
  simplecov
31
- collapsium (0.8.0)
31
+ collapsium (0.8.2)
32
32
  collapsium-config (0.4.3)
33
33
  collapsium (~> 0.7)
34
34
  cucumber (2.4.0)
@@ -53,7 +53,7 @@ GEM
53
53
  multi_test (0.1.2)
54
54
  nokogiri (1.6.8.1)
55
55
  mini_portile2 (~> 2.1.0)
56
- parser (2.3.2.0)
56
+ parser (2.3.3.1)
57
57
  ast (~> 2.2)
58
58
  phantomjs (2.1.1.0)
59
59
  powerpack (0.1.1)
@@ -73,7 +73,7 @@ GEM
73
73
  diff-lcs (>= 1.2.0, < 2.0)
74
74
  rspec-support (~> 3.5.0)
75
75
  rspec-support (3.5.0)
76
- rubocop (0.45.0)
76
+ rubocop (0.46.0)
77
77
  parser (>= 2.3.1.1, < 3.0)
78
78
  powerpack (~> 0.1)
79
79
  rainbow (>= 1.99.1, < 3.0)
@@ -108,7 +108,7 @@ DEPENDENCIES
108
108
  phantomjs
109
109
  rake (~> 11.3)
110
110
  rspec (~> 3.5)
111
- rubocop (~> 0.45)
111
+ rubocop (~> 0.46)
112
112
  selenium-webdriver
113
113
  simplecov (~> 0.12)
114
114
  unobtainium!
@@ -7,6 +7,51 @@
7
7
  # All rights reserved.
8
8
  #
9
9
 
10
+ def store_ids(the_driver = driver)
11
+ @driver_ids ||= []
12
+ @driver_ids << the_driver.object_id
13
+
14
+ @driver_impl_ids ||= []
15
+ @driver_impl_ids << the_driver.impl.object_id
16
+ end
17
+
18
+ Given(/^I have no driver IDs stored$/) do
19
+ @driver_ids = []
20
+ @driver_impl_ids = []
21
+ end
22
+
10
23
  Given(/^I navigate to the best website in the world$/) do
11
24
  driver.navigate.to "http://finkhaeuser.de"
25
+ store_ids
26
+ end
27
+
28
+ When(/^I navigate to the best website in the world again$/) do
29
+ driver.navigate.to "http://finkhaeuser.de"
30
+ store_ids
31
+ end
32
+
33
+ Then(/^I expect the driver in each case to be the same$/) do
34
+ if not @driver_ids[0] == @driver_ids[1]
35
+ raise "Driver instance changed!"
36
+ end
37
+ if not @driver_impl_ids[0] == @driver_impl_ids[1]
38
+ raise "Driver implementation instance changed!"
39
+ end
40
+ end
41
+
42
+ When(
43
+ /^I navigate to the best website in the world with another driver instance$/
44
+ ) do
45
+ new_driver = driver(:headless, desired_capabilities: { something: :new })
46
+ new_driver.navigate.to "http://finkhaeuser.de"
47
+ store_ids(new_driver)
48
+ end
49
+
50
+ Then(/^I expect to have two driver instances$/) do
51
+ if @driver_ids[0] == @driver_ids[1]
52
+ raise "Driver instance the same!"
53
+ end
54
+ if @driver_impl_ids[0] == @driver_impl_ids[1]
55
+ raise "Driver implementation instance the same!"
56
+ end
12
57
  end
@@ -1,4 +1,17 @@
1
1
  Feature: World
2
2
 
3
+ Background:
4
+ Given I have no driver IDs stored
5
+
3
6
  Scenario: Driver and configuration loading
4
7
  Given I navigate to the best website in the world
8
+
9
+ Scenario: Driver re-use
10
+ Given I navigate to the best website in the world
11
+ When I navigate to the best website in the world again
12
+ Then I expect the driver in each case to be the same
13
+
14
+ Scenario: Multiple drivers
15
+ Given I navigate to the best website in the world
16
+ When I navigate to the best website in the world with another driver instance
17
+ Then I expect to have two driver instances
@@ -8,5 +8,5 @@
8
8
  #
9
9
  module Unobtainium
10
10
  # The current release version
11
- VERSION = "0.9.0".freeze
11
+ VERSION = "0.10.0".freeze
12
12
  end
@@ -72,6 +72,52 @@ module Unobtainium
72
72
  # Returns a driver instance with the given options. If no options are
73
73
  # provided, options from the global configuration are used.
74
74
  def driver(label = nil, options = nil)
75
+ # Resolve unique options
76
+ label, options = resolve_options(label, options)
77
+
78
+ # Create a key for the label and options. This should always
79
+ # return the same key for the same label and options.
80
+ key = options['unobtainium_instance_id']
81
+ if key.nil?
82
+ key = identifier('driver', label, options)
83
+ end
84
+
85
+ # Only create a driver with this exact configuration once. Unfortunately
86
+ # We'll have to bind the destructor to whatever configuration exists at
87
+ # this point in time, so we have to create a proc here - whether the Driver
88
+ # gets created or not.
89
+ at_end = config.fetch("at_end", "quit")
90
+ dtor = proc do |the_driver|
91
+ # :nocov:
92
+ if the_driver.nil?
93
+ return
94
+ end
95
+
96
+ # We'll rescue Exception here because we really want all destructors
97
+ # to run.
98
+ # rubocop:disable Lint/RescueException
99
+ begin
100
+ meth = at_end.to_sym
101
+ the_driver.send(meth)
102
+ rescue Exception => err
103
+ puts "Exception in destructor: [#{err.class}] #{err}"
104
+ end
105
+ # rubocop:enable Lint/RescueException
106
+ # :nocov:
107
+ end
108
+ return ::Unobtainium::Runtime.instance.store_with_if(key, dtor) do
109
+ ::Unobtainium::Driver.create(label, options)
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ ##
116
+ # World's own option resolution ensures that the same options always get
117
+ # resolved the same, by storing anything resolved from Driver in the Runtime
118
+ # instance (i.e. asking the Driver only once per unique set of label and
119
+ # options).
120
+ def resolve_options(label, options)
75
121
  # Make sure we have a label for the driver
76
122
  if label.nil?
77
123
  label = config["driver"]
@@ -106,35 +152,21 @@ module Unobtainium
106
152
  options.delete("base")
107
153
  end
108
154
 
109
- # The driver may modify the options; if so, we should let it do that
110
- # here. That way our key (below) is based on the expanded options.
111
- label, options, _ = ::Unobtainium::Driver.resolve_options(label, options)
112
-
113
- # Create a key for the label and options. This should always
114
- # return the same key for the same label and options.
115
- key = options['unobtainum_instance_id']
116
- if key.nil?
117
- key = identifier('driver', label, options)
155
+ # Do we have options already resolved?
156
+ option_key = identifier('options', label, options)
157
+ begin
158
+ stored_opts = ::Unobtainium::Runtime.instance.fetch(option_key)
159
+ options = ::Collapsium::UberHash.new(options)
160
+ options.recursive_merge!(stored_opts)
161
+ rescue KeyError
162
+ label, options, _ = ::Unobtainium::Driver.resolve_options(label, options)
118
163
  end
119
164
 
120
- # Only create a driver with this exact configuration once. Unfortunately
121
- # We'll have to bind the destructor to whatever configuration exists at
122
- # this point in time, so we have to create a proc here - whether the Driver
123
- # gets created or not.
124
- at_end = config.fetch("at_end", "quit")
125
- dtor = proc do |the_driver|
126
- # :nocov:
127
- if the_driver.nil?
128
- return
129
- end
165
+ # The driver may modify the options; if so, we should let it do that
166
+ # here. That way our key (below) is based on the expanded options.
167
+ ::Unobtainium::Runtime.instance.store(option_key, options)
130
168
 
131
- meth = at_end.to_sym
132
- the_driver.send(meth)
133
- # :nocov:
134
- end
135
- return ::Unobtainium::Runtime.instance.store_with_if(key, dtor) do
136
- ::Unobtainium::Driver.create(label, options)
137
- end
169
+ return label, options
138
170
  end
139
171
  end # module World
140
172
  end # module Unobtainium
data/spec/driver_spec.rb CHANGED
@@ -13,8 +13,7 @@ module TestModule
13
13
  end
14
14
  end # class << self
15
15
 
16
- def my_module_func
17
- end
16
+ def my_module_func; end
18
17
  end # module TestModule
19
18
 
20
19
  module NonMatchingTestModule
@@ -25,8 +24,7 @@ module NonMatchingTestModule
25
24
  end
26
25
  end # class << self
27
26
 
28
- def does_not_exist
29
- end
27
+ def does_not_exist; end
30
28
  end # module NonMatchingTestModule
31
29
 
32
30
  module FakeModule
@@ -137,6 +137,16 @@ describe ::Unobtainium::Drivers::Phantom do
137
137
  expect(resolved['unobtainium_instance_id']).not_to be_nil
138
138
  end
139
139
 
140
+ context "defaults" do
141
+ it "generates the same ID and port if no input is given" do
142
+ _, resolved1 = tester.resolve_options(:phantomjs, nil)
143
+ expect(resolved1['phantomjs.generated_port']).to eql 9134
144
+
145
+ _, resolved2 = tester.resolve_options(:phantomjs, nil)
146
+ expect(resolved2['phantomjs.generated_port']).to eql 9134
147
+ end
148
+ end
149
+
140
150
  it "generates new IDs for new options" do
141
151
  opts = ::Collapsium::UberHash.new(
142
152
  phantomjs: {
data/spec/mock_driver.rb CHANGED
@@ -4,6 +4,8 @@ class Mock
4
4
  def initialize(opts)
5
5
  @passed_options = opts
6
6
  end
7
+
8
+ def quit; end
7
9
  end
8
10
 
9
11
  # rubocop:disable Style/GuardClause
data/unobtainium.gemspec CHANGED
@@ -44,7 +44,7 @@ Gem::Specification.new do |spec|
44
44
  "'phantomjs'"
45
45
 
46
46
  spec.add_development_dependency "bundler", "~> 1.12"
47
- spec.add_development_dependency "rubocop", "~> 0.45"
47
+ spec.add_development_dependency "rubocop", "~> 0.46"
48
48
  spec.add_development_dependency "rake", "~> 11.3"
49
49
  spec.add_development_dependency "rspec", "~> 3.5"
50
50
  spec.add_development_dependency "simplecov", "~> 0.12"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unobtainium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Finkhaeuser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-23 00:00:00.000000000 Z
11
+ date: 2016-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.45'
33
+ version: '0.46'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.45'
40
+ version: '0.46'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement