site_prism 5.0.beta → 5.0

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
2
  SHA256:
3
- metadata.gz: 919e215261486aca371a708b7b06826e54941a29cf1580ebca68e2dea4cfbc0a
4
- data.tar.gz: ecd938940c5546287ffbbf182aece2d6aacf96b454738f33a73b114c09803f19
3
+ metadata.gz: 3036f6b2266855a0a4d08a3c72b44b08d1ce6f423ca72e5dbe5b539cb90b1216
4
+ data.tar.gz: 1314d67df7aeb3c9d70478e5b884aec2cfb7b4216c58cf9841d4d6dc8b7bc9f5
5
5
  SHA512:
6
- metadata.gz: ebb6eb3adbe1cb9663160d4347a5c3189c333937b4cb49649bf998a397cd634be4d4b557d5dc6ad5e5415d7eee8f297a8b05e8b894d19fe98cb3a9ff7a602657
7
- data.tar.gz: e63ee2fd016759f69c943de5ea7e477151c1333af5c25aef8a10834426db5e14fa1790accf5069726c405ae9ec33dd2a96d9877ad75cfb558b85b284e4e1875d
6
+ metadata.gz: 057576ee2b44eb40824344eeef80243e4fbbe8b30df7ab8e6b011053f652b0257065472103b16ed6a4ce094ed3ad608cf8c72dcb8e11c0e3e4f3daa2aaa9ef38
7
+ data.tar.gz: c9ef4c0ac315e0664f0089cd13a75e8566e7be3f553e85a7f2d17ef1bce7943762074b478767790bb44497968fc6ee0919440a1e613ed6a27f0efde585e19f24
data/README.md CHANGED
@@ -29,8 +29,8 @@ We have a brief set of setup docs [HERE](https://github.com/site-prism/site_pris
29
29
 
30
30
  ## Supported Rubies / Browsers
31
31
 
32
- SitePrism is built and tested to work on Ruby 2.6 - 3.1.
33
- If you are using SitePrism with Ruby 2.5-2.7 it is highly advisable to upgrade to a more modern
32
+ SitePrism is built and tested to work on Ruby 2.7 - 3.2.
33
+ If you are using SitePrism with Ruby 2.7 it is highly advisable to upgrade to a more modern
34
34
  Ruby (v3+), if for any other reason, to get a performance improvement!
35
35
 
36
36
  SitePrism should run on all major browsers. The gem's integration tests are run on Chrome and Firefox.
@@ -66,7 +66,7 @@ class SearchResults < SitePrism::Page
66
66
  end
67
67
  end
68
68
 
69
- # define sections used on multiple pages or multiple times on one page
69
+ # Define sections that are used on multiple pages or multiple times on one page
70
70
 
71
71
  class Menu < SitePrism::Section
72
72
  element :search, 'a.search'
@@ -79,7 +79,7 @@ class SearchResults < SitePrism::Section
79
79
  element :blurb, 'span.result-description'
80
80
  end
81
81
 
82
- # now for some tests
82
+ # Then we can write some tests
83
83
 
84
84
  When('I navigate to the google home page') do
85
85
  @home = Home.new
@@ -88,6 +88,7 @@ end
88
88
 
89
89
  Then('the home page should contain the menu and the search form') do
90
90
  @home.wait_until_menu_visible(wait: 5)
91
+
91
92
  expect(@home).to have_menu
92
93
  expect(@home).to have_search_field
93
94
  expect(@home).to have_search_button
@@ -100,11 +101,13 @@ end
100
101
 
101
102
  Then('the search results page is displayed') do
102
103
  @results_page = SearchResults.new
104
+
103
105
  expect(@results_page).to be_displayed
104
106
  end
105
107
 
106
108
  Then('the search results page contains 10 individual search results') do
107
109
  @results_page.wait_until_search_results_visible(wait: 5)
110
+
108
111
  expect(@results_page).to have_search_results(count: 10)
109
112
  end
110
113
 
@@ -113,8 +116,6 @@ Then('the search results contain a link to the wikipedia sausages page') do
113
116
  end
114
117
  ```
115
118
 
116
- Now for the details...
117
-
118
119
  ## Setup
119
120
 
120
121
  ### Installation
@@ -166,19 +167,15 @@ And again, as above, a sample driver is no different to a normal driver instanti
166
167
 
167
168
  ## Introduction to the Page Object Model
168
169
 
169
- The Page Object Model is a test automation pattern that aims to create
170
- an abstraction of your site's user interface that can be used in tests.
171
- The most common way to do this is to model each page as a class, and
172
- to then use instances of those classes in your tests.
170
+ The Page Object Model is a test automation pattern that aims to create an abstraction of your sites user
171
+ interface that can be used in tests. The most common way to do this is to model each page as a class and
172
+ then to use instances of those classes in your tests.
173
173
 
174
- If a class represents a page then each element of the page is
175
- represented by a method that, when called, returns a reference to that
176
- element that can then be acted upon (clicked, type in some text), or
177
- queried (is it enabled? / visible?).
174
+ If a class represents a page then each element of the page is represented by a method that, when called, returns a
175
+ reference to that element that can then be acted upon (clicked, type in some text), or queried (is it enabled? / visible?).
178
176
 
179
- SitePrism is based around this concept, but goes further as you'll see
180
- below by also allowing modelling of repeated sections that appear on
181
- multiple pages, or many times on a page using the concept of sections.
177
+ SitePrism is based around this concept, but goes further as you'll see below by also allowing modelling of
178
+ repeated sections that appear on multiple pages, or many times on a page using the concept of sections.
182
179
 
183
180
  ## Pages
184
181
 
@@ -216,9 +213,8 @@ class Home < SitePrism::Page
216
213
  end
217
214
  ```
218
215
 
219
- Note that setting a URL is **optional** - you only need to set a url if you want to be able to
220
- navigate directly to that page. It makes sense to set the URL for a page model of a
221
- home page or a login page, but probably not a search results page.
216
+ Note that setting a URL is **optional** - you only need to set a url if you want to be able to navigate directly to that page.
217
+ It makes sense to set the URL for a page model of a home page or a login page, but probably not a search results page.
222
218
 
223
219
  #### Parametrized URLs
224
220
 
@@ -281,10 +277,9 @@ navigate to the URL set against that page's class.
281
277
 
282
278
  ### Verifying that a particular page is displayed
283
279
 
284
- Automated tests often need to verify that a particular page is
285
- displayed. SitePrism can automatically parse your URL template
286
- and verify that whatever components your template specifies match the
287
- currently viewed page. For example, with the following URL template:
280
+ Automated tests often need to verify that a particular page is displayed. SitePrism can automatically parse
281
+ your templated URL and verify that whatever components your template specifies match the currently viewed page.
282
+ For example, with the following URL template:
288
283
 
289
284
  ```ruby
290
285
  class Account < SitePrism::Page
@@ -302,10 +297,9 @@ expect(@account_page.current_url).to end_with('/accounts/22?token=ca2786616a4285
302
297
  expect(@account_page).to be_displayed
303
298
  ```
304
299
 
305
- Calling `#displayed?` will return true if the browser's current URL
306
- matches the page's template and false if it doesn't. It will wait for
307
- `Capybara.default_max_wait_time` seconds or you can pass an explicit
308
- wait time in seconds as the first argument like this:
300
+ Calling `#displayed?` will return true if the browser's current URL matches the page's template and false if
301
+ it doesn't. It will wait for `Capybara.default_max_wait_time` seconds or you can pass an explicit wait time in
302
+ seconds as the first argument like this:
309
303
 
310
304
  ```ruby
311
305
  @account_page.displayed?(10) # wait up to 10 seconds for display
@@ -346,9 +340,8 @@ expect(@account_page.url_matches.dig('query', 'token')).to eq('ca2786616a4285bc'
346
340
 
347
341
  #### Falling back to basic regexp matchers
348
342
 
349
- If SitePrism's built-in URL matching is not sufficient for your needs
350
- you can override and use SitePrism's previous support for regular expression-based
351
- URL matchers by it by calling `set_url_matcher`:
343
+ If SitePrism's built-in URL matching is not sufficient for your needs you can override and use SitePrism's
344
+ support for regular expression-based URL matchers by it by calling `set_url_matcher`:
352
345
 
353
346
  ```ruby
354
347
  class Account < SitePrism::Page
@@ -377,6 +370,7 @@ end
377
370
 
378
371
  @account = Account.new
379
372
  @account.current_url #=> "http://www.example.com/account/123"
373
+
380
374
  expect(@account.current_url).to include('example.com/account/')
381
375
  ```
382
376
 
@@ -394,10 +388,9 @@ end
394
388
 
395
389
  ### HTTP vs. HTTPS
396
390
 
397
- You can easily tell if the page is secure or not by checking to see if
398
- the current URL begins with 'https' or not. SitePrism provides the
399
- `secure?` method that will return true if the current url begins with
400
- 'https' and false if it doesn't. For example:
391
+ You can easily tell if the page is secure or not by checking to see if the current URL begins with 'https' or not.
392
+ SitePrism provides the `#secure?` method that will return true if the current url begins with 'https' and false if it doesn't.
393
+ For example:
401
394
 
402
395
  ```ruby
403
396
  class Account < SitePrism::Page
@@ -405,16 +398,15 @@ end
405
398
 
406
399
  @account = Account.new
407
400
  @account.secure? #=> true/false
401
+
408
402
  expect(@account).to be_secure
409
403
  ```
410
404
 
411
405
  ## Elements
412
406
 
413
- Pages are made up of elements (text fields, buttons, combo boxes, etc),
414
- either individual elements or groups of them. Examples of individual
415
- elements would be a search field or a company logo image; examples of
416
- element collections would be items in any sort of list, eg: menu items,
417
- images in a carousel, etc.
407
+ Pages are made up of elements (text fields, buttons, combo boxes, etc), either individual elements or groups of
408
+ them. Examples of individual elements would be a search field or a company logo image; examples of element collections would
409
+ be items in any sort of list, eg: menu items,images in a carousel, etc.
418
410
 
419
411
  ### Individual Elements
420
412
 
@@ -508,18 +500,16 @@ Using the above example:
508
500
 
509
501
  ```ruby
510
502
  Then('the search field exists')do
511
- expect(@home).to have_no_search_field #NB: NOT => expect(@home).not_to have_search_field
503
+ expect(@home).to have_no_search_field #NB: NOT THE SAME AS => expect(@home).not_to have_search_field
512
504
  end
513
505
  ```
514
506
 
515
507
  #### Waiting for an element to become visible
516
508
 
517
- A method that gets added by calling `element` is the
518
- `wait_until_<element_name>_visible` method.
509
+ A method that gets added by calling `element` is the `wait_until_<element_name>_visible` method.
519
510
  This method delegates to [Capybara::Node::Matchers#has_selector?](https://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Matchers#has_selector%3F-instance_method).
520
- Calling this method will cause the test to wait for Capybara's default wait time for the element
521
- to become visible. You can customise the wait time by supplying a number
522
- of seconds to wait in-line or configuring the default wait time.
511
+ Calling this method will cause the test to wait for Capybara's default wait time for the element to become visible. You can customise
512
+ the wait time by supplying a number of seconds to wait in-line or configuring the default wait time.
523
513
 
524
514
  ```ruby
525
515
  @home.wait_until_search_field_visible # using the default wait time set
@@ -529,12 +519,10 @@ of seconds to wait in-line or configuring the default wait time.
529
519
 
530
520
  #### Waiting for an element to become invisible
531
521
 
532
- Another method added by calling `element` is the
533
- `wait_until_<element_name>_invisible` method.
522
+ Another method added by calling `element` is the `wait_until_<element_name>_invisible` method.
534
523
  This method delegates to [Capybara::Node::Matchers#has_no_selector?](https://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Matchers#has_no_selector%3F-instance_method).
535
- Calling this method will cause the test to wait for Capybara's default
536
- wait time for the element to become invisible. You can as with the visibility
537
- waiter, customise the wait time in the same way.
524
+ Calling this method will cause the test to wait for Capybara's default wait time for the element to become invisible.
525
+ You can (as with the visibility waiter), customise the wait time in the same way.
538
526
 
539
527
  ```ruby
540
528
  @home.wait_until_search_field_invisible # using the default wait time set
@@ -544,9 +532,8 @@ waiter, customise the wait time in the same way.
544
532
 
545
533
  #### CSS Selectors vs. XPath Expressions
546
534
 
547
- While the above examples all use CSS selectors to find elements, it is
548
- possible to use XPath expressions too. In SitePrism, everywhere that you
549
- can use a CSS selector, you can use an XPath expression.
535
+ While the above examples all use CSS selectors to find elements, it is possible to use XPath expressions too.
536
+ In SitePrism, everywhere that you can use a CSS selector, you can use an XPath expression (Standard Capybara logic).
550
537
 
551
538
  An example:
552
539
 
@@ -1686,6 +1673,25 @@ When('I log in') do
1686
1673
  end
1687
1674
  ```
1688
1675
 
1676
+ ## Shadow Root
1677
+
1678
+ SitePrism allows you to interact with Shadow Roots too.
1679
+
1680
+ ### Creating an Shadow Root
1681
+
1682
+ You can use the `section` methods and provide the arguments. Specify the reference name for the Shadow Root,
1683
+ the CSS selector to locate it, and add the `:shadow_root` option. For example:
1684
+
1685
+ ```ruby
1686
+ class Home < SitePrism::Page
1687
+ section :foo, '.foo', shadow_root: true do
1688
+ element :bar, '.bar'
1689
+ end
1690
+ end
1691
+ ```
1692
+
1693
+ NB: By default `shadow_root` will be set to false
1694
+
1689
1695
  ## SitePrism Configuration
1690
1696
 
1691
1697
  SitePrism can be configured to change its behaviour.
@@ -4,7 +4,7 @@ module SitePrism
4
4
  # [SitePrism::Deprecator]
5
5
  class Deprecator
6
6
  class << self
7
- # @return SitePrism.logger.warn(msg)
7
+ # @return [SitePrism.logger.warn(msg)]
8
8
  #
9
9
  # Tells the user that they are using old functionality, which needs removing in the
10
10
  # next major version
@@ -15,22 +15,7 @@ module SitePrism
15
15
  warn("#{old} is being deprecated and should no longer be used.")
16
16
  end
17
17
 
18
- warn("#{old} will be removed in SitePrism v5. You have been warned!")
19
- end
20
-
21
- # @return SitePrism.logger.debug(msg)
22
- #
23
- # Tells the user that they are using functionality which is non-optimal
24
- # The functionality should usually provide a reason for it being poor, as well as an
25
- # optional way of upgrading to something different
26
- #
27
- # NB: As this is bubbled up at debug level, often users will not see this. So it will
28
- # never be a candidate for removal directly
29
- def soft_deprecate(old, reason, new = nil)
30
- debug("The #{old} method is changing, as is SitePrism, and is now advised to be changed.")
31
- debug("REASON: #{reason}.")
32
- debug('Moving forwards into SitePrism v5, the default behaviour will change.')
33
- debug("We advise you change to using #{new}") if new
18
+ warn("#{old} will be removed in SitePrism v6. You have been warned!")
34
19
  end
35
20
 
36
21
  private
@@ -38,10 +23,6 @@ module SitePrism
38
23
  def warn(msg)
39
24
  SitePrism.logger.warn(msg)
40
25
  end
41
-
42
- def debug(msg)
43
- SitePrism.logger.debug(msg)
44
- end
45
26
  end
46
27
  end
47
28
  end
@@ -15,35 +15,37 @@ module SitePrism
15
15
  #
16
16
  module Builder
17
17
  # Return a list of all mapped items on a SitePrism class instance (Page or Section)
18
- # If legacy is set to false (Default) -> @return [Hash]
19
- # If legacy is set to true (Old behaviour) -> @return [Array]
20
- def mapped_items(legacy: false)
21
- return legacy_mapped_items if legacy
22
-
18
+ #
19
+ # @return [Hash]
20
+ def mapped_items
23
21
  @mapped_items ||= { element: [], elements: [], section: [], sections: [], iframe: [] }
24
22
  end
25
23
 
26
24
  private
27
25
 
28
26
  def build(type, name, *find_args)
29
- raise InvalidDSLNameError if ENV.fetch('SITEPRISM_DSL_VALIDATION_ENABLED', 'true') == 'true' && invalid?(name)
27
+ invalid_element_name if invalid_element_name?(name)
28
+ blank_element(name) if find_args.empty?
30
29
 
31
- if find_args.empty?
32
- create_error_method(name)
33
- else
34
- map_item(type, name)
35
- yield
36
- end
30
+ mapped_items[type] << name.to_sym
31
+ yield
37
32
  add_helper_methods(name, type, *find_args)
38
33
  end
39
34
 
40
- def create_error_method(name)
41
- SitePrism::Deprecator.deprecate(
42
- 'DSL definition with no find_args',
43
- 'DSL definition with at least 1 find_arg'
44
- )
45
- SitePrism.logger.error("#{name} has come from an item with no locators.")
46
- define_method(name) { raise SitePrism::InvalidElementError }
35
+ def invalid_element_name
36
+ raise InvalidDSLNameError, dsl_name_error
37
+ end
38
+
39
+ def invalid_element_name?(name)
40
+ !dsl_validation_disabled? && name_invalid?(name)
41
+ end
42
+
43
+ def dsl_validation_disabled?
44
+ SitePrism.dsl_validation_disabled || ENV.key?('SITEPRISM_DSL_VALIDATION_DISABLED')
45
+ end
46
+
47
+ def blank_element(name)
48
+ raise SitePrism::InvalidElementError, "#{name} has come from an item with no locators."
47
49
  end
48
50
 
49
51
  def add_helper_methods(name, _type, *find_args)
@@ -99,26 +101,11 @@ module SitePrism
99
101
  end
100
102
 
101
103
  def create_helper_method(proposed_method_name, *find_args)
102
- return create_error_method(proposed_method_name) if find_args.empty?
104
+ return blank_element(proposed_method_name) if find_args.empty?
103
105
 
104
106
  yield
105
107
  end
106
108
 
107
- def legacy_mapped_items
108
- @legacy_mapped_items ||= begin
109
- SitePrism::Deprecator.deprecate(
110
- '.mapped_items structure (internally), on a class',
111
- 'the new .mapped_items structure'
112
- )
113
- []
114
- end
115
- end
116
-
117
- def map_item(type, name)
118
- mapped_items(legacy: true) << { type => name }
119
- mapped_items[type] << name.to_sym
120
- end
121
-
122
109
  def extract_section_options(args, &block)
123
110
  if args.first.is_a?(Class)
124
111
  klass = args.shift
@@ -13,21 +13,31 @@ module SitePrism
13
13
 
14
14
  def _find(*find_args)
15
15
  kwargs = find_args.pop
16
- to_capybara_node.find(*find_args, **kwargs)
16
+ shadow_root = kwargs.delete(:shadow_root) { false }
17
+ check_capybara_version_if_creating_shadow_root if shadow_root
18
+ to_capybara_node.find(*find_args, **kwargs).tap do |element|
19
+ break element.shadow_root if shadow_root
20
+ end
17
21
  end
18
22
 
19
23
  def _all(*find_args)
20
24
  kwargs = find_args.pop
21
- to_capybara_node.all(*find_args, **kwargs)
25
+ shadow_root = kwargs.delete(:shadow_root) { false }
26
+ check_capybara_version_if_creating_shadow_root if shadow_root
27
+ to_capybara_node.all(*find_args, **kwargs).tap do |element|
28
+ break element.map(&:shadow_root) if shadow_root
29
+ end
22
30
  end
23
31
 
24
32
  def element_exists?(*find_args)
25
33
  kwargs = find_args.pop
34
+ kwargs.delete(:shadow_root)
26
35
  to_capybara_node.has_selector?(*find_args, **kwargs)
27
36
  end
28
37
 
29
38
  def element_does_not_exist?(*find_args)
30
39
  kwargs = find_args.pop
40
+ kwargs.delete(:shadow_root)
31
41
  to_capybara_node.has_no_selector?(*find_args, **kwargs)
32
42
  end
33
43
 
@@ -63,6 +73,13 @@ module SitePrism
63
73
  options.merge!(runtime_args.pop) if runtime_args.last.is_a? Hash
64
74
  options[:wait] = Capybara.default_max_wait_time unless options.key?(:wait)
65
75
  end
76
+
77
+ def check_capybara_version_if_creating_shadow_root
78
+ minimum_version = '3.37.0'
79
+ raise SitePrism::UnsupportedGemVersionError unless Capybara::VERSION >= minimum_version
80
+
81
+ SitePrism.logger.error("Shadow root support requires Capybara version >= #{minimum_version}. You are using #{Capybara::VERSION}.")
82
+ end
66
83
  end
67
84
  end
68
85
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module SitePrism
4
4
  module DSL
5
- # [SitePrism::DSL::Validators]
5
+ # [SitePrism::DSL::Validator]
6
6
  #
7
7
  # This is the new validator module which will check all DSL items against a whitelist
8
8
  # for any entries which break specific rules
@@ -10,7 +10,9 @@ module SitePrism
10
10
  # @api private
11
11
  #
12
12
  module Validator
13
- def invalid?(name)
13
+ attr_accessor :dsl_name_error
14
+
15
+ def name_invalid?(name)
14
16
  prefix_invalid?(name) ||
15
17
  suffix_invalid?(name) ||
16
18
  characters_invalid?(name) ||
@@ -20,25 +22,25 @@ module SitePrism
20
22
  private
21
23
 
22
24
  def prefix_invalid?(name)
23
- return unless prefix_blacklist.any? { |prefix| name.start_with?(prefix) }
25
+ return false unless prefix_blacklist.any? { |prefix| name.start_with?(prefix) }
24
26
 
25
27
  log_failure(name, 'prefix')
26
28
  end
27
29
 
28
30
  def suffix_invalid?(name)
29
- return unless suffix_blacklist.any? { |prefix| name.end_with?(prefix) }
31
+ return false unless suffix_blacklist.any? { |prefix| name.end_with?(prefix) }
30
32
 
31
33
  log_failure(name, 'suffix')
32
34
  end
33
35
 
34
36
  def characters_invalid?(name)
35
- return if name.match?(regex_permission)
37
+ return false if name.match?(regex_permission)
36
38
 
37
39
  log_failure(name, 'character(s)')
38
40
  end
39
41
 
40
42
  def blacklisted?(name)
41
- return unless blacklisted_names.include?(name)
43
+ return false unless blacklisted_names.include?(name)
42
44
 
43
45
  log_failure(name, 'name (blacklisted entry)')
44
46
  end
@@ -76,7 +78,7 @@ module SitePrism
76
78
  end
77
79
 
78
80
  def log_failure(name, type)
79
- SitePrism.logger.error("DSL item: #{name} has an invalid #{type}")
81
+ self.dsl_name_error = "DSL item: #{name} has an invalid #{type}"
80
82
  SitePrism.logger.debug(debug_error(type))
81
83
  end
82
84
 
@@ -13,7 +13,7 @@ module SitePrism
13
13
  # for how the definition of "every item" is derived.
14
14
  #
15
15
  # Example
16
- # @my_page.class.mapped_items
16
+ # `@my_page.class.mapped_items`
17
17
  # {
18
18
  # element => [:button_one, :button_two],
19
19
  # elements => [:button_collection_one, :button_collection_two],
@@ -21,7 +21,7 @@ module SitePrism
21
21
  # sections => [:search_result],
22
22
  # iframe => []
23
23
  # }
24
- # @my_page.all_there?
24
+ # `@my_page.all_there?`
25
25
  # => true - If the items above are all present
26
26
  #
27
27
  # Note that #elements_to_check will check the hash of mapped_items
@@ -50,4 +50,7 @@ module SitePrism
50
50
 
51
51
  # DSL items are not permitted to be named in certain ways
52
52
  class InvalidDSLNameError < AttributeValidationError; end
53
+
54
+ # The version of the target gem is unsupported, so using that feature is not possible
55
+ class UnsupportedGemVersionError < SitePrismError; end
53
56
  end
@@ -13,10 +13,8 @@ module SitePrism
13
13
  base.extend(ClassMethods)
14
14
  end
15
15
 
16
- # In certain circumstances, we cache that the page has already
17
- # been confirmed to be loaded so that actions which
18
- # call `loaded?` a second time do not need to perform
19
- # the load_validation queries against the page a second time.
16
+ # In certain circumstances, we cache that the page or section has already been "loaded" so that actions which
17
+ # call `loaded?` a second time do not need to perform the load_validation queries against the page a second time.
20
18
  attr_accessor :loaded, :load_error
21
19
 
22
20
  # Executes the given block after the page is loaded.
@@ -27,8 +25,7 @@ module SitePrism
27
25
  # inside another when_loaded block.
28
26
  previously_loaded = loaded
29
27
 
30
- # Within the block, check (and cache) loaded?, to see whether the
31
- # page has indeed loaded according to the rules defined by the user.
28
+ # Within the block, check (and cache) loaded?, to see whether the page has indeed loaded according to the rules defined by the user.
32
29
  self.loaded = loaded?
33
30
 
34
31
  # If the page hasn't loaded. Then crash and return the error message.
@@ -68,13 +65,12 @@ module SitePrism
68
65
  end
69
66
 
70
67
  # [SitePrism::Loadable::ClassMethods]
71
- # This exposes all of the DSL definitions users will use when generating "loadables"
68
+ # This exposes all of the DSL definitions users will use when generating "Loadables"
72
69
  #
73
- # A "Loadable" is a definition whereby the page object once loaded must pass a boolean check
74
- # These loadables are typically provided using the method `load_validation`
70
+ # A "Loadable" is a definition whereby the page/section object once loaded must pass a boolean check
71
+ # These Loadables are typically provided using the method `load_validation`
75
72
  module ClassMethods
76
- # The list of load_validations.
77
- # They will be executed in the order they are defined.
73
+ # The list of load_validations. They are executed in the order they are defined.
78
74
  #
79
75
  # @return [Array]
80
76
  def load_validations
@@ -85,21 +81,15 @@ module SitePrism
85
81
  end
86
82
  end
87
83
 
88
- # Appends a load validation block to the page class.
84
+ # Appends a load validation block to the page/section class.
89
85
  #
90
- # When `loaded?` is called, these blocks are instance_eval'd
91
- # against the current page instance.
92
- # This allows users to wait for specific events to occur on
93
- # the page or certain elements to be loaded before performing
94
- # any actions on the page.
86
+ # When `loaded?` is called, these blocks are instance_eval'd against the current page instance. This allows users to wait for
87
+ # specific events to occur on the page or certain elements to be loaded before performing any actions on the page.
95
88
  #
96
- # @param block [&block] A block which returns true if the page
97
- # loaded successfully, or false if it did not.
98
- # This block can contain up to 2 elements in an array
99
- # The first is the physical validation test to be truthily evaluated.
89
+ # @param block [&block] A block which returns true if the page loaded successfully, or false if it did not.
90
+ # This block can contain up to 2 elements in an array -> The first is the physical validation test to be truthily evaluated.
100
91
  #
101
- # If this does not pass, then the 2nd item (if defined), is output
102
- # as an error message to the +FailedLoadValidationError+ that is thrown
92
+ # If this does not pass, then the 2nd item (if defined), is output as an error message on the +FailedLoadValidationError+
103
93
  #
104
94
  # @return [Proc]
105
95
  def load_validation(&block)
@@ -10,7 +10,7 @@ module SitePrism
10
10
  def create(output = $stdout)
11
11
  logger = ::Logger.new(output)
12
12
  logger.progname = 'SitePrism'
13
- logger.level = :UNKNOWN
13
+ logger.level = :WARN
14
14
  logger.formatter = proc do |severity, time, progname, msg|
15
15
  "#{time.strftime('%F %T')} - #{severity} - #{progname} - #{msg}\n"
16
16
  end
@@ -36,7 +36,7 @@ module SitePrism
36
36
  # The specific url matcher that is used to validate the page is loaded.
37
37
  # When one hasn't been previously set, use the url that was set as a direct Regexp exact matcher
38
38
  #
39
- # @return [Regexp]
39
+ # @return [Regexp || String]
40
40
  def url_matcher
41
41
  @url_matcher ||= url
42
42
  end
@@ -170,6 +170,7 @@ module SitePrism
170
170
  end
171
171
 
172
172
  def load_html_string(string)
173
+ SitePrism::Deprecator.deprecate('Using an input fragment (Loading partials using html strings).')
173
174
  @page = Capybara.string(string)
174
175
  yield to_capybara_node if block_given?
175
176
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SitePrism
4
- VERSION = '5.0.beta'
4
+ VERSION = '5.0'
5
5
  end
data/lib/site_prism.rb CHANGED
@@ -22,6 +22,11 @@ require 'site_prism/waiter'
22
22
  # [SitePrism]
23
23
  module SitePrism
24
24
  class << self
25
+ # SitePrism will enforce strict validation on all generated DSL items i.e. `element`
26
+ # The validations are found inside the SitePrism::DSL::Validator module
27
+ # NB: To ensure no unwanted validation issues, this must be disabled BEFORE any page / section code is autoloaded
28
+ attr_accessor :dsl_validation_disabled
29
+
25
30
  def configure
26
31
  yield self
27
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: site_prism
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.beta
4
+ version: '5.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Hill
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-10-19 00:00:00.000000000 Z
12
+ date: 2023-12-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -49,22 +49,22 @@ dependencies:
49
49
  name: site_prism-all_there
50
50
  requirement: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ">"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2'
55
55
  - - "<"
56
56
  - !ruby/object:Gem::Version
57
- version: '4'
57
+ version: '5'
58
58
  type: :runtime
59
59
  prerelease: false
60
60
  version_requirements: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - ">="
62
+ - - ">"
63
63
  - !ruby/object:Gem::Version
64
64
  version: '2'
65
65
  - - "<"
66
66
  - !ruby/object:Gem::Version
67
- version: '4'
67
+ version: '5'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: automation_helpers
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -119,14 +119,14 @@ dependencies:
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
- version: 1.53.0
122
+ version: 1.57.1
123
123
  type: :development
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - "~>"
128
128
  - !ruby/object:Gem::Version
129
- version: 1.53.0
129
+ version: 1.57.1
130
130
  - !ruby/object:Gem::Dependency
131
131
  name: rubocop-performance
132
132
  requirement: !ruby/object:Gem::Requirement
@@ -147,14 +147,14 @@ dependencies:
147
147
  requirements:
148
148
  - - "~>"
149
149
  - !ruby/object:Gem::Version
150
- version: 2.23.2
150
+ version: 2.25.0
151
151
  type: :development
152
152
  prerelease: false
153
153
  version_requirements: !ruby/object:Gem::Requirement
154
154
  requirements:
155
155
  - - "~>"
156
156
  - !ruby/object:Gem::Version
157
- version: 2.23.2
157
+ version: 2.25.0
158
158
  - !ruby/object:Gem::Dependency
159
159
  name: selenium-webdriver
160
160
  requirement: !ruby/object:Gem::Requirement
@@ -230,9 +230,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
230
230
  version: '2.7'
231
231
  required_rubygems_version: !ruby/object:Gem::Requirement
232
232
  requirements:
233
- - - ">"
233
+ - - ">="
234
234
  - !ruby/object:Gem::Version
235
- version: 1.3.1
235
+ version: '0'
236
236
  requirements: []
237
237
  rubygems_version: 3.2.3
238
238
  signing_key: