ae_page_objects 5.0.0.tim1 → 6.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dbfd8677597cf0026b13d31f3a468148cedab2df
4
- data.tar.gz: 7385fcd650b5ea30d077e6fd7fcc23c997808fc1
2
+ SHA256:
3
+ metadata.gz: d03326a2bcedb51c1d268690baee1c9adea3c44cada101beaa4f414c22a74946
4
+ data.tar.gz: 80e7c8b74ee935f28e1b80c7c698659d6d9f58b9886d087f10f8e3f2ee191820
5
5
  SHA512:
6
- metadata.gz: d1bd1f9f15668d99c7ed9e9ff604bd54d23b5159d702b01188194b51fcc145614dc960bf242216fd7b7976b909523dc06a226e465cc5b4599c9b2b87d37665b1
7
- data.tar.gz: 2de8621bfc85d7c66306af7c9761e3b0a57692bc307c97e2df1a23f003334867be5dd2cd039d5051c05add08e0e1dd1199972630ce2ddb1dba9ceb0b148d2fa2
6
+ metadata.gz: 4f4f9b6b8042099edbba969631a2c09ac94466cb62ec898d8249c81eac70052a100ca79d400b0aef4fb6e32f40bf06cf93e4fafee641f6241be4d2e66d69de3b
7
+ data.tar.gz: b787fa1e7d7ed7bcc76ddfe44061092b9807a3454188e7d0d4e16550231decfc670f022c4b24cdd186fad7c22c4179e39b3cb310a87793acc3a1c3a5c2b6fb06
@@ -0,0 +1,23 @@
1
+
2
+ # frozen_string_literal: true
3
+
4
+ require_relative 'lib/ae_page_objects/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'ae_page_objects'
8
+ spec.version = AePageObjects::VERSION
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.author = 'AppFolio'
11
+ spec.email = 'opensource@appfolio.com'
12
+ spec.description = 'Capybara Page Objects pattern.'
13
+ spec.summary = spec.description
14
+ spec.homepage = 'https://github.com/appfolio/ae_page_objects'
15
+ spec.license = 'MIT'
16
+ spec.files = Dir['**/*'].select { |f| f[%r{^(lib/|LICENSE.txt|.*gemspec)}] }
17
+ spec.require_paths = ['lib']
18
+ spec.required_ruby_version = Gem::Requirement.new('>= 3')
19
+
20
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
+
22
+ spec.add_dependency('capybara', ['>= 3', '< 4'])
23
+ end
@@ -89,6 +89,11 @@ module AePageObjects
89
89
  def configure(options)
90
90
  @locator = options.delete(:locator)
91
91
  @name = options.delete(:name)
92
+ if options.key?(:wait)
93
+ @wait = options.delete(:wait)
94
+ else
95
+ @wait = true
96
+ end
92
97
 
93
98
  @name = @name.to_s if @name
94
99
  end
@@ -107,20 +112,22 @@ module AePageObjects
107
112
 
108
113
  def scoped_node
109
114
  locator = eval_locator(@locator)
110
- if locator.empty?
111
- parent.node
112
- else
113
- default_options = { minimum: 0 }
114
- if locator.last.is_a?(::Hash)
115
- locator[-1] = default_options.merge(locator.last)
116
- else
117
- locator.push(default_options)
118
- end
119
115
 
120
- node = AePageObjects.wait_until { parent.node.first(*locator) }
121
- node.allow_reload!
122
- node
116
+ return parent.node if locator.empty?
117
+
118
+ default_options = { minimum: 0 }
119
+ if locator.last.is_a?(::Hash)
120
+ default_options.merge!(locator.pop)
121
+ end
122
+
123
+ if @wait
124
+ node = AePageObjects.wait_until { parent.node.first(*locator, **default_options) }
125
+ else
126
+ node = parent.node.first(*locator, **default_options)
127
+ raise LoadingElementFailed, 'Element Not Found' unless node
123
128
  end
129
+ node.allow_reload!
130
+ node
124
131
  rescue AePageObjects::WaitTimeoutError => e
125
132
  raise LoadingElementFailed, e.message
126
133
  end
@@ -15,36 +15,22 @@ module AePageObjects
15
15
  @loaded_element = nil
16
16
  end
17
17
 
18
- def visible?(options = {})
19
- options[:wait] ||= 0
20
- wait_until_visible(options[:wait])
21
- true
22
- rescue ElementNotVisible
23
- false
18
+ def visible?
19
+ reload_element
20
+ @loaded_element&.visible?
24
21
  end
25
22
 
26
- def hidden?(options = {})
27
- options[:wait] ||= 0
28
- wait_until_hidden(options[:wait])
29
- true
30
- rescue ElementNotHidden
31
- false
23
+ def hidden?
24
+ !visible?
32
25
  end
33
26
 
34
- def present?(options = {})
35
- options[:wait] ||= 0
36
- wait_until_present(options[:wait])
37
- true
38
- rescue ElementNotPresent
39
- false
27
+ def present?
28
+ reload_element
29
+ !@loaded_element.nil?
40
30
  end
41
31
 
42
- def absent?(options = {})
43
- options[:wait] ||= 0
44
- wait_until_absent(options[:wait])
45
- true
46
- rescue ElementNotAbsent
47
- false
32
+ def absent?
33
+ !present?
48
34
  end
49
35
 
50
36
  def presence
@@ -127,8 +113,19 @@ module AePageObjects
127
113
 
128
114
  private
129
115
 
130
- def load_element
131
- @element_class.new(*@args)
116
+ def load_element(wait: true)
117
+ args = @args.dup
118
+
119
+ options_or_locator = args.pop
120
+ options = if options_or_locator.is_a?(Hash)
121
+ options_or_locator.merge(wait: wait)
122
+ else
123
+ { locator: options_or_locator, wait: wait }
124
+ end
125
+
126
+ args << options
127
+
128
+ @element_class.new(*args)
132
129
  end
133
130
 
134
131
  def implicit_element
@@ -136,7 +133,7 @@ module AePageObjects
136
133
  end
137
134
 
138
135
  def reload_element
139
- @loaded_element = load_element
136
+ @loaded_element = load_element(wait: false)
140
137
  rescue LoadingElementFailed
141
138
  @loaded_element = nil
142
139
  end
@@ -52,7 +52,7 @@ module AePageObjects
52
52
  # wait time set to 0.
53
53
  #
54
54
  Capybara.using_wait_time(0) do
55
- node.all(:xpath, item_xpath, options).size
55
+ node.all(:xpath, item_xpath, **options).size
56
56
  end
57
57
  end
58
58
 
@@ -90,7 +90,6 @@ module AePageObjects
90
90
  }
91
91
 
92
92
  if query_args[1].is_a?(XPath::Expression)
93
- #
94
93
  # Use the { exact: true } setting for XPath selectors that use "XPath.is". For example, given the XPath
95
94
  # XPath.descendant(:div)[XPath.text.is('Example Text')]
96
95
  # the resulting path will be
@@ -98,17 +97,14 @@ module AePageObjects
98
97
  # instead of
99
98
  # .//div[contains(./text(), 'Example Text')]
100
99
  # See https://github.com/jnicklas/capybara#exactness for more information.
101
- #
102
100
  default_options[:exact] = true
103
101
  end
104
102
 
105
103
  if query_args.last.is_a?(::Hash)
106
- query_args[-1] = default_options.merge(query_args.last)
107
- else
108
- query_args.push(default_options)
104
+ default_options.merge!(query_args.pop)
109
105
  end
110
106
 
111
- query = Capybara::Queries::SelectorQuery.new(*query_args)
107
+ query = Capybara::Queries::SelectorQuery.new(*query_args, **default_options)
112
108
 
113
109
  result = query.xpath
114
110
 
@@ -22,12 +22,10 @@ module AePageObjects
22
22
  else
23
23
  default_options = { wait: false }
24
24
  if locator.last.is_a?(::Hash)
25
- locator[-1] = default_options.merge(locator.last)
26
- else
27
- locator.push(default_options)
25
+ default_options.merge!(locator.pop)
28
26
  end
29
27
 
30
- node.all(*locator).any?
28
+ node.all(*locator, **default_options).any?
31
29
  end
32
30
  end
33
31
 
@@ -4,9 +4,7 @@ module AePageObjects
4
4
  class ApplicationRouter < BasicRouter
5
5
 
6
6
  # This whole file is a kludge and probably belongs in an ae_page_objects-rails extension
7
-
8
7
  module Recognizer
9
-
10
8
  class Base
11
9
  def generate_path(named_route, *args)
12
10
  if routes.respond_to?("#{named_route}_path")
@@ -32,7 +30,7 @@ module AePageObjects
32
30
  false
33
31
  end
34
32
 
35
- private
33
+ private
36
34
 
37
35
  def routes
38
36
  raise NotImplementedError, "You must implement routes"
@@ -60,9 +58,8 @@ module AePageObjects
60
58
  ResolvedRoute = Struct.new(:controller, :action)
61
59
  end
62
60
 
63
- class Rails3 < Base
64
-
65
- private
61
+ class Rails6Plus < Base
62
+ private
66
63
 
67
64
  def request_for(url, method)
68
65
  ::Rails.application.routes.request_class.new(env_for(url, method))
@@ -77,7 +74,8 @@ module AePageObjects
77
74
  end
78
75
 
79
76
  def normalize_url(url)
80
- Rack::Mount::Utils.normalize_path(url) unless url =~ %r{://}
77
+ require 'action_dispatch/journey'
78
+ ActionDispatch::Journey::Router::Utils.normalize_path(url) unless url =~ %r{://}
81
79
  end
82
80
 
83
81
  def router
@@ -93,25 +91,6 @@ module AePageObjects
93
91
  end
94
92
  end
95
93
  end
96
-
97
- class Rails32 < Rails3
98
-
99
- private
100
-
101
- def normalize_url(url)
102
- Journey::Router::Utils.normalize_path(url) unless url =~ %r{://}
103
- end
104
- end
105
-
106
- class Rails4Plus < Rails32
107
-
108
- private
109
-
110
- def normalize_url(url)
111
- require 'action_dispatch/journey'
112
- ActionDispatch::Journey::Router::Utils.normalize_path(url) unless url =~ %r{://}
113
- end
114
- end
115
94
  end
116
95
 
117
96
  def path_recognizes_url?(path, url)
@@ -133,16 +112,12 @@ module AePageObjects
133
112
  private
134
113
 
135
114
  def recognizer
136
- @recognizer ||= case ::Rails.version
137
- when /\A3\.[01]/
138
- Recognizer::Rails3.new
139
- when /\A3\.2/
140
- Recognizer::Rails32.new
141
- when /\A(4\.[012]|5\.0)/
142
- Recognizer::Rails4Plus.new
115
+ @recognizer ||= case ::Rails.gem_version
116
+ when Gem::Requirement.new('>= 6.0', '< 8.0')
117
+ Recognizer::Rails6Plus.new
143
118
  else
144
119
  warn "[WARNING]: AePageObjects is not tested against Rails #{::Rails.version} and may behave in an undefined manner."
145
- Recognizer::Rails4Plus.new
120
+ Recognizer::Rails6Plus.new
146
121
  end
147
122
  end
148
123
  end
@@ -1,3 +1,3 @@
1
1
  module AePageObjects
2
- VERSION = '5.0.0.tim1'.freeze
2
+ VERSION = '6.0.0.pre1'.freeze
3
3
  end
metadata CHANGED
@@ -1,36 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ae_page_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.tim1
4
+ version: 6.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
- - AppFolio Engineering
8
- autorequire:
7
+ - AppFolio
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-20 00:00:00.000000000 Z
11
+ date: 2023-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '3'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3'
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '3.0'
27
- description: Capybara Page Objects pattern
28
- email:
29
- - engineering@appfolio.com
32
+ version: '4'
33
+ description: Capybara Page Objects pattern.
34
+ email: opensource@appfolio.com
30
35
  executables: []
31
36
  extensions: []
32
37
  extra_rdoc_files: []
33
38
  files:
39
+ - ae_page_objects.gemspec
34
40
  - lib/ae_page_objects.rb
35
41
  - lib/ae_page_objects/core/basic_router.rb
36
42
  - lib/ae_page_objects/core/dsl.rb
@@ -60,11 +66,12 @@ files:
60
66
  - lib/ae_page_objects/util/internal_helpers.rb
61
67
  - lib/ae_page_objects/util/wait_time_manager.rb
62
68
  - lib/ae_page_objects/version.rb
63
- homepage: http://github.com/appfolio/ae_page_objects
69
+ homepage: https://github.com/appfolio/ae_page_objects
64
70
  licenses:
65
71
  - MIT
66
- metadata: {}
67
- post_install_message:
72
+ metadata:
73
+ allowed_push_host: https://rubygems.org
74
+ post_install_message:
68
75
  rdoc_options: []
69
76
  require_paths:
70
77
  - lib
@@ -72,16 +79,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
72
79
  requirements:
73
80
  - - ">="
74
81
  - !ruby/object:Gem::Version
75
- version: 2.2.5
82
+ version: '3'
76
83
  required_rubygems_version: !ruby/object:Gem::Requirement
77
84
  requirements:
78
85
  - - ">"
79
86
  - !ruby/object:Gem::Version
80
87
  version: 1.3.1
81
88
  requirements: []
82
- rubyforge_project:
83
- rubygems_version: 2.5.2
84
- signing_key:
89
+ rubygems_version: 3.4.6
90
+ signing_key:
85
91
  specification_version: 4
86
- summary: Capybara Page Objects pattern
92
+ summary: Capybara Page Objects pattern.
87
93
  test_files: []