site_prism 2.6 → 2.7

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: 27fcff1ed1e931ef4062524d0dfcc302cd889dce
4
- data.tar.gz: 14fd216ac58ed422963b2acbd0874ff3993382d9
3
+ metadata.gz: 5cecd18603e2b752a61108228d5d0977ebbd8117
4
+ data.tar.gz: cdbd3e91b71ce10e2f1fa210c76f7e0abe47307a
5
5
  SHA512:
6
- metadata.gz: 232a21ab0d139cc1390708d301ea7b4a24540da96a9b02702b6cfe70e8ffa063dce028c177b843dd6b581747bd3015eaeccc0296cfb1763a99de75e2821be701
7
- data.tar.gz: 63d72784da0d0e39b8c9649f2f7bb78b566403b4394c69aea4fac56f5427921cf72281a0bc93ecdd3b968b5370240aede5f3f38768399dacf0a70c74173682d3
6
+ metadata.gz: bf99da3a4830b9bda41b26f548dbd8694e05e14122464c72503790cc00ff32bfc20c29c8d118726df5a9e264bdcfff33345068141b9e982ff95064c879ddee8d
7
+ data.tar.gz: c21eca71f43629070428a85bf7e7b1661b6a1af2e7d426490ffc4e20dd61ff9355e633a80140795f3296aaad6e0994ad4ff586e28b3e26cad683f8b0355f8013
data/README.md CHANGED
@@ -29,7 +29,7 @@ class SearchResults < SitePrism::Page
29
29
 
30
30
  section :menu, MenuSection, "#gbx3"
31
31
  sections :search_results, SearchResultSection, "#results li"
32
-
32
+
33
33
  def search_result_links
34
34
  search_results.map {|sr| sr.title['href']}
35
35
  end
@@ -57,9 +57,9 @@ end
57
57
 
58
58
  Then /^the home page should contain the menu and the search form$/ do
59
59
  @home.wait_for_menu # menu loads after a second or 2, give it time to arrive
60
- @home.should have_menu
61
- @home.should have_search_field
62
- @home.should have_search_button
60
+ expect(@home).to have_menu
61
+ expect(@home).to have_search_field
62
+ expect(@home).to have_search_button
63
63
  end
64
64
 
65
65
  When /^I search for Sausages$/ do
@@ -69,17 +69,16 @@ end
69
69
 
70
70
  Then /^the search results page is displayed$/ do
71
71
  @results_page = SearchResults.new
72
- @results_page.should be_displayed
72
+ expect(@results_page).to be_displayed
73
73
  end
74
74
 
75
75
  Then /^the search results page contains 10 individual search results$/ do
76
76
  @results_page.wait_for_search_results
77
- @results_page.should have_search_results
78
- @results_page.search_results.size.should == 10
77
+ expect(@results_page).to have_search_results count: 10
79
78
  end
80
79
 
81
80
  Then /^the search results contain a link to the wikipedia sausages page$/ do
82
- @results_page.search_result_links.should include "http://en.wikipedia.org/wiki/Sausage"
81
+ expect(@results_page.search_result_links).to include "http://en.wikipedia.org/wiki/Sausage"
83
82
  end
84
83
  ```
85
84
 
@@ -238,61 +237,87 @@ See https://github.com/sporkmonger/addressable for more details on parameterized
238
237
  ### Verifying that a particular page is displayed
239
238
 
240
239
  Automated tests often need to verify that a particular page is
241
- displayed. Intuitively you'd think that simply checking that the URL
242
- defined using `set_url` is the current page in the browser would be enough, but experience shows that it's
243
- not. It is far more robust to check to see if the browser's current url
244
- matches a regular expression. For example, though `account/1` and `account/2`
245
- are the same page, their URLs are different. To deal with this,
246
- SitePrism provides the ability to set a URL matcher.
240
+ displayed. SitePrism can automatically parse your URL template
241
+ and verify that whatever components your template specifies match the
242
+ currently viewed page. For example, with the following URL template:
247
243
 
248
244
  ```ruby
249
245
  class Account < SitePrism::Page
250
- set_url_matcher /\account\/\d+/
246
+ set_url "/accounts/{id}{?query*}"
251
247
  end
252
248
  ```
253
249
 
254
- Once a URL matcher is set for a page, you can test to see if it is
255
- displayed:
250
+ The following test code would pass:
256
251
 
257
252
  ```ruby
258
253
  @account_page = Account.new
259
- #...
260
- @account_page.displayed? #=> true or false
254
+ @account_page.load(id: 22, query: { token: "ca2786616a4285bc" })
255
+
256
+ expect(@account_page.current_url).to end_with "/accounts/22?token=ca2786616a4285bc"
257
+ expect(@account_page).to be_displayed
261
258
  ```
262
259
 
263
260
  Calling `#displayed?` will return true if the browser's current URL
264
- matches the regular expression for the page and false if it doesn't. So
265
- in the above example (`account/1` and `account/2`), calling
266
- `@account_page.displayed?` will return true for both examples.
261
+ matches the page's template and false if it doesn't.
267
262
 
268
- #### Testing for Page display
263
+ #### Specifying parameter values for templated URLs
269
264
 
270
- SitePrism's `#displayed?` predicate method allows for semantic code in
271
- your test:
265
+ Sometimes you want to verify not just that the current URL matches the
266
+ template, but that you're looking at a specific page matching that
267
+ template.
268
+
269
+ Given the previous example, if you wanted to ensure that the browser had loaded
270
+ account number 22, you could assert the following:
272
271
 
273
272
  ```ruby
274
- Then /^the account page is displayed$/ do
275
- @account_page.should be_displayed
276
- @some_other_page.should_not be_displayed
277
- end
273
+ expect(@account_page).to be_displayed(id: 22)
278
274
  ```
279
275
 
280
- Another example that demonstrates why using regex instead of string
281
- comparison for URL checking is when you want to be able to run your
282
- tests across multiple environments.
276
+ You can even use regular expressions. If, as a contrived example, you wanted to
277
+ ensure that the browser was displaying an account with an id ending with 2, you could
278
+ say:
283
279
 
284
280
  ```ruby
285
- class Login < SitePrism::Page
286
- set_url "#{$test_environment}.example.com/login" #=> global var used for demonstration purposes only!!!
287
- set_url_matcher /(?:dev|test|www)\.example\.com\/login/
281
+ expect(@account_page).to be_displayed(id: /2\z/)
282
+ ```
283
+
284
+ #### Accessing specific matches from a templated URL in your tests
285
+
286
+ If passing options to `displayed?` isn't powerful enough to meet your
287
+ needs, you can directly access and assert on the `url_matches` found
288
+ when comparing your page's URL template to the current_url:
289
+
290
+ ```ruby
291
+ @account_page = Account.new
292
+ @account_page.load(id: 22, query: { token: "ca2786616a4285bc", color: 'irrelevant' })
293
+
294
+ expect(@account_page).to be_displayed(id: 22)
295
+ expect(@account_page.url_matches['query']['token']).to eq "ca2786616a4285bc"
296
+ ```
297
+
298
+ #### Falling back to basic regexp matchers
299
+
300
+ If SitePrism's built-in URL matching is not sufficient for your needs
301
+ you can override and use SitePrism's previous support for regular expression-based
302
+ URL matchers by it by calling `set_url_matcher`:
303
+
304
+ ```ruby
305
+ class Account < SitePrism::Page
306
+ set_url_matcher %r{/accounts/\d+}
288
307
  end
289
308
  ```
290
309
 
291
- The above example would work for `dev.example.com/login`,
292
- `test.example.com/login` and `www.example.com/login`; now your tests
293
- aren't limited to one environment but can verify that they are on the
294
- correct page regardless of the environment the tests are being executed
295
- against.
310
+ #### Testing for Page display
311
+
312
+ SitePrism's `#displayed?` predicate method allows for semantic code in
313
+ your test:
314
+
315
+ ```ruby
316
+ Then /^the account page is displayed$/ do
317
+ expect(@account_page).to be_displayed
318
+ expect(@some_other_page).not_to be_displayed
319
+ end
320
+ ```
296
321
 
297
322
  ### Getting the Current Page's URL
298
323
 
@@ -306,7 +331,7 @@ end
306
331
  @account = Account.new
307
332
  #...
308
333
  @account.current_url #=> "http://www.example.com/account/123"
309
- @account.current_url.should include "example.com/account/"
334
+ expect(@account.current_url).to include "example.com/account/"
310
335
  ```
311
336
 
312
337
  ### Page Title
@@ -336,7 +361,7 @@ end
336
361
  @account = Account.new
337
362
  #...
338
363
  @account.secure? #=> true/false
339
- @account.should be_secure
364
+ expect(@account).to be_secure
340
365
  ```
341
366
 
342
367
  ## Elements
@@ -412,14 +437,14 @@ end
412
437
 
413
438
  ```ruby
414
439
  Then /^the search field exists$/ do
415
- @home.should have_search_field
440
+ expect(@home).to have_search_field
416
441
  end
417
442
  ```
418
443
 
419
444
  #### Testing that an element does not exist
420
445
 
421
446
  To test that an element does not exist on the page, it is not possible to just call
422
- `#should_not have_search_field`. SitePrism supplies the `#has_no_<element>?` method
447
+ `#not_to have_search_field`. SitePrism supplies the `#has_no_<element>?` method
423
448
  that should be used to test for non-existence. Using the above example:
424
449
 
425
450
  ```ruby
@@ -432,7 +457,7 @@ that should be used to test for non-existence. Using the above example:
432
457
 
433
458
  ```ruby
434
459
  Then /^the search field exists$/ do
435
- @home.should have_no_search_field #NB: NOT => @home.should_not_ have_search_field
460
+ expect(@home).to have_no_search_field #NB: NOT => expect(@home).not_to_ have_search_field
436
461
  end
437
462
  ```
438
463
 
@@ -575,9 +600,9 @@ arrays:
575
600
 
576
601
  ```ruby
577
602
  @friends_page.names.each {|name| puts name.text}
578
- @friends_page.names.map {|name| name.text}.should == ["Alice", "Bob", "Fred"]
579
- @friends_page.names.size.should == 3
580
- @friends_page.should have(3).names
603
+ expect(@friends_page.names.map {|name| name.text}.to eq ["Alice", "Bob", "Fred"]
604
+ expect(@friends_page.names.size).to eq 3
605
+ expect(@friends_page).to have(3).names
581
606
  ```
582
607
 
583
608
  #### Testing for the existence of the element collection
@@ -604,7 +629,7 @@ end
604
629
 
605
630
  ```ruby
606
631
  Then /^there should be some names listed on the page$/ do
607
- @friends_page.should have_names
632
+ expect(@friends_page).to have_names
608
633
  end
609
634
  ```
610
635
 
@@ -641,7 +666,7 @@ to wait for:
641
666
  Like the individual elements, calling the `elements` method will create
642
667
  two methods: `wait_until_<elements_name>_visible` and
643
668
  `wait_until_<elements_name>_invisible`. Calling these methods will cause
644
- your test to wait for the elements to become visible or invisibe. Using
669
+ your test to wait for the elements to become visible or invisible. Using
645
670
  the above example:
646
671
 
647
672
  ```ruby
@@ -674,7 +699,7 @@ present in the browser, false if they're not all there.
674
699
  # and...
675
700
 
676
701
  Then /^the friends page contains all the expected elements$/ do
677
- @friends_page.should be_all_there
702
+ expect(@friends_page).to be_all_there
678
703
  end
679
704
 
680
705
  ```
@@ -760,7 +785,7 @@ selector that will be used to find the root element of the section; this
760
785
  root node becomes the 'scope' of the section.
761
786
 
762
787
  The following shows that though the same section can appear on multiple
763
- pages, it can take a different root node:
788
+ pages, it can take a different root node:
764
789
 
765
790
  ```ruby
766
791
  # define the section that appears on both pages
@@ -826,10 +851,10 @@ end
826
851
 
827
852
  ```ruby
828
853
  Then /^the home page menu contains a link to the various search functions$/ do
829
- @home.menu.should have_search
830
- @home.menu.search['href'].should include "google.com"
831
- @home.menu.should have_images
832
- @home.menu.should have_maps
854
+ expect(@home.menu).to have_search
855
+ expect(@home.menu.search['href']).to include "google.com"
856
+ expect(@home.menu).to have_images
857
+ expect(@home.menu).to have_maps
833
858
  end
834
859
  ```
835
860
 
@@ -917,8 +942,8 @@ end
917
942
  Again, this allows pretty test code:
918
943
 
919
944
  ```ruby
920
- @home.should have_menu
921
- @home.should_not have_menu
945
+ expect(@home).to have_menu
946
+ expect(@home).not_to have_menu
922
947
  ```
923
948
 
924
949
  #### Waiting for a section to exist
@@ -981,7 +1006,7 @@ sections within sections within sections within sections!
981
1006
 
982
1007
  ```ruby
983
1008
 
984
- # define a page that contains an area that contains a section for both logging in and registration, then modelling each of the sub sections seperately
1009
+ # define a page that contains an area that contains a section for both logging in and registration, then modelling each of the sub sections separately
985
1010
 
986
1011
  class Login < SitePrism::Section
987
1012
  element :username, "#username"
@@ -1010,8 +1035,8 @@ Then /^I sign in$/ do
1010
1035
  @home = Home.new
1011
1036
  @home.load
1012
1037
  @home.wait_for_login_and_registration
1013
- @home.should have_login_and_registration
1014
- @home.login_and_registration.should have_username
1038
+ expect(@home).to have_login_and_registration
1039
+ expect(@home.login_and_registration).to have_username
1015
1040
  @home.login_and_registration.login.username.set "bob"
1016
1041
  @home.login_and_registration.login.password.set "p4ssw0rd"
1017
1042
  @home.login_and_registration.login.sign_in.click
@@ -1022,8 +1047,8 @@ end
1022
1047
  When /^I enter my name into the home page's registration form$/ do
1023
1048
  @home = Home.new
1024
1049
  @home.load
1025
- @home.login_and_registration.should have_first_name
1026
- @home.login_and_registration.should have_last_name
1050
+ expect(@home.login_and_registration).to have_first_name
1051
+ expect(@home.login_and_registration).to have_last_name
1027
1052
  @home.login_and_registration.first_name.set "Bob"
1028
1053
  # ...
1029
1054
  end
@@ -1049,7 +1074,7 @@ as an ordinary section:
1049
1074
 
1050
1075
  ```ruby
1051
1076
  @home = Home.new
1052
- @home.menu.should have_title
1077
+ expect(@home.menu).to have_title
1053
1078
  ```
1054
1079
 
1055
1080
  ### Section Collections
@@ -1097,10 +1122,10 @@ end
1097
1122
 
1098
1123
  ```ruby
1099
1124
  Then /^there are lots of search_results$/ do
1100
- @results_page.search_results.size.should == 10
1125
+ expect(@results_page.search_results.size).to eq 10
1101
1126
  @results_page.search_results.each do |search_result|
1102
- search_result.should have_title
1103
- search_result.blurb.text.should_not be_nil
1127
+ expect(search_result).to have_title
1128
+ expect(search_result.blurb.text).not_to be_nil
1104
1129
  end
1105
1130
  end
1106
1131
  ```
@@ -1121,7 +1146,7 @@ define a single anonymous section:
1121
1146
 
1122
1147
  ```ruby
1123
1148
  class SearchResults < SitePrism::Page
1124
- sections :search_results, SearchResultSection, "#results li" do
1149
+ sections :search_results, "#results li" do
1125
1150
  element :title, "a.title"
1126
1151
  element :blurb, "span.result-decription"
1127
1152
  end
@@ -1159,7 +1184,7 @@ end
1159
1184
 
1160
1185
  ```ruby
1161
1186
  Then /^there are search results on the page$/ do
1162
- @results.page.should have_search_results
1187
+ expect(@results.page).to have_search_results
1163
1188
  end
1164
1189
  ```
1165
1190
 
@@ -1217,7 +1242,7 @@ the page has not finished loading the element(s):
1217
1242
  ```ruby
1218
1243
  @results_page = SearchResults.new
1219
1244
  # ...
1220
- @results_page.search_results.size.should == 25 # This may fail!
1245
+ expect(@results_page.search_results.size).to == 25 # This may fail!
1221
1246
  ```
1222
1247
 
1223
1248
  The above query can be rewritten to utilize the Capybara :count option when querying for
@@ -1239,7 +1264,7 @@ into our page and section classes:
1239
1264
 
1240
1265
  ```ruby
1241
1266
  Then /^there are search results on the page$/ do
1242
- @results.page.should have_search_results :count => 25
1267
+ expect(@results.page).to have_search_results :count => 25
1243
1268
  end
1244
1269
  ```
1245
1270
 
@@ -1267,6 +1292,30 @@ The following element methods allow Capybara options to be passed as arguments t
1267
1292
  @results_page.wait_until_<element_or_section_name>_invisible :text => "Some ajaxy text disappears!"
1268
1293
  ```
1269
1294
 
1295
+ ## Test views with Page objects
1296
+
1297
+ It's possible to use the same page objects of integration tests for view tests, too,
1298
+ just pass the rendered HTML to the ```load``` method:
1299
+
1300
+ ```ruby
1301
+ require 'spec_helper'
1302
+
1303
+ describe 'admin/things/index' do
1304
+ let(:list_page) { AdminThingsListPage.new }
1305
+ let(:thing) { build(:thing, some_attribute: 'some attribute') }
1306
+
1307
+ it 'contains the things we expect' do
1308
+ assign(:things, [thing])
1309
+
1310
+ render template: 'admin/things/index'
1311
+
1312
+ list_page.load(rendered)
1313
+
1314
+ expect(list_page.rows.first.some_attribute).to have_text('some attribute')
1315
+ end
1316
+ end
1317
+ ```
1318
+
1270
1319
  ## IFrames
1271
1320
 
1272
1321
  SitePrism allows you to interact with iframes. An iframe is declared as
@@ -1311,7 +1360,7 @@ the above example, here's how it's done:
1311
1360
  @page = PageContainingIframe.new
1312
1361
  # ...
1313
1362
  @page.has_my_iframe? #=> true
1314
- @page.should have_my_iframe
1363
+ expect(@page).to have_my_iframe
1315
1364
  ```
1316
1365
 
1317
1366
  ### Waiting for an iframe
@@ -1416,12 +1465,12 @@ all over the place. Here's an example of this common problem:
1416
1465
  @home.search_field.set "Sausages"
1417
1466
  @home.search_field.search_button.click
1418
1467
  @results_page = SearchResults.new # <-- noise
1419
- @results_page.should have_search_result_items
1468
+ expect(@results_page).to have_search_result_items
1420
1469
  ```
1421
1470
 
1422
1471
  The annoyance (and, later, maintenance nightmare) is having to create
1423
1472
  `@home` and `@results_page`. It would be better to not have to create
1424
- instances of pages all over your tests.
1473
+ instances of pages all over your tests.
1425
1474
 
1426
1475
  The way I've dealt with this problem is to create a class containing
1427
1476
  methods that return instances of the pages. Eg:
@@ -1471,7 +1520,7 @@ When /^I search for Sausages$/ do
1471
1520
  end
1472
1521
 
1473
1522
  Then /^I am on the results page$/ do
1474
- @app.results_page.should be_displayed
1523
+ expect(@app.results_page).to be_displayed
1475
1524
  end
1476
1525
 
1477
1526
  # etc...
@@ -1480,4 +1529,3 @@ end
1480
1529
  The only thing that needs instantiating is the App class - from then on
1481
1530
  pages don't need to be initialized, they are now returned by methods on
1482
1531
  @app. Maintenance win!
1483
-
data/lib/site_prism.rb CHANGED
@@ -7,7 +7,8 @@ module SitePrism
7
7
  autoload :Page, 'site_prism/page'
8
8
  autoload :Section, 'site_prism/section'
9
9
  autoload :Waiter, 'site_prism/waiter'
10
-
10
+ autoload :AddressableUrlMatcher, 'site_prism/addressable_url_matcher'
11
+
11
12
  class << self
12
13
  attr_accessor :use_implicit_waits
13
14
 
@@ -18,6 +19,5 @@ module SitePrism
18
19
 
19
20
  private
20
21
 
21
- @@use_implicit_waits = false
22
+ @use_implicit_waits = false
22
23
  end
23
-
@@ -0,0 +1,136 @@
1
+ require 'digest'
2
+ require 'base64'
3
+
4
+ module SitePrism
5
+ class AddressableUrlMatcher
6
+ COMPONENT_NAMES = %w(scheme user password host port path query fragment).map(&:to_sym).freeze
7
+ COMPONENT_PREFIXES = {
8
+ query: '?',
9
+ fragment: '#'
10
+ }.freeze
11
+
12
+ attr_reader :pattern
13
+
14
+ def initialize(pattern)
15
+ @pattern = pattern
16
+ end
17
+
18
+ # @return the hash of extracted mappings from parsing the provided URL according to our pattern,
19
+ # or nil if the URL doesn't conform to the matcher template.
20
+ def mappings(url)
21
+ uri = Addressable::URI.parse(url)
22
+ result = {}
23
+ COMPONENT_NAMES.each do |component|
24
+ component_result = component_matches(component, uri)
25
+ result = component_result ? result.merge!(component_result) : nil
26
+ break unless result
27
+ end
28
+ result
29
+ end
30
+
31
+ # Determine whether URL matches our pattern, and optionally whether the extracted mappings match
32
+ # a hash of expected values. You can specify values as strings, numbers or regular expressions.
33
+ def matches?(url, expected_mappings = {})
34
+ actual_mappings = mappings(url)
35
+ if actual_mappings
36
+ expected_mappings.empty? ? true : all_expected_mappings_match?(expected_mappings, actual_mappings)
37
+ else
38
+ false
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def all_expected_mappings_match?(expected_mappings, actual_mappings)
45
+ expected_mappings.all? do |key, expected_value|
46
+ actual_value = actual_mappings[key.to_s]
47
+ case expected_value
48
+ when Numeric
49
+ actual_value == expected_value.to_s
50
+ when Regexp
51
+ actual_value.match(expected_value)
52
+ else
53
+ expected_value == actual_value
54
+ end
55
+ end
56
+ end
57
+
58
+ # Memoizes the extracted component templates
59
+ def component_templates
60
+ @component_templates ||= extract_component_templates
61
+ end
62
+
63
+ def extract_component_templates
64
+ COMPONENT_NAMES.each_with_object({}) do |component, component_templates|
65
+ component_url = to_substituted_uri.public_send(component).to_s
66
+
67
+ next unless component_url && component_url != ''
68
+
69
+ reverse_substitutions.each_pair do |substituted_value, template_value|
70
+ component_url = component_url.sub(substituted_value, template_value)
71
+ end
72
+
73
+ component_templates[component] = Addressable::Template.new(component_url.to_s)
74
+ end.freeze
75
+ end
76
+
77
+ # Returns empty hash if the template omits the component, a set of substitutions if the
78
+ # provided URI component matches the template component, or nil if the match fails.
79
+ def component_matches(component, uri)
80
+ extracted_mappings = {}
81
+ component_template = component_templates[component]
82
+ if component_template
83
+ component_url = uri.public_send(component).to_s
84
+ unless (extracted_mappings = component_template.extract(component_url))
85
+ # to support Addressable's expansion of queries, ensure it's parsing the fragment as appropriate (e.g. {?params*})
86
+ prefix = COMPONENT_PREFIXES[component]
87
+ return nil unless prefix && (extracted_mappings = component_template.extract(prefix + component_url))
88
+ end
89
+ end
90
+ extracted_mappings
91
+ end
92
+
93
+ # Convert the pattern into an Addressable URI by substituting the template slugs with nonsense strings.
94
+ def to_substituted_uri
95
+ url = pattern
96
+ substitutions.each_pair do |slug, value|
97
+ url = url.sub(slug, value)
98
+ end
99
+ begin
100
+ Addressable::URI.parse(url)
101
+ rescue Addressable::URI::InvalidURIError
102
+ raise SitePrism::InvalidUrlMatcher, 'Could not automatically match your URL. Note: templated port numbers are not currently supported.'
103
+ end
104
+ end
105
+
106
+ def substitutions
107
+ @substitutions ||= slugs.each_with_index.reduce({}) do |memo, slugindex|
108
+ slug, index = slugindex
109
+ memo.merge(slug => slug_prefix(slug) + substitution_value(index))
110
+ end
111
+ end
112
+
113
+ def reverse_substitutions
114
+ @reverse_substitutions ||= slugs.each_with_index.reduce({}) do |memo, slugindex|
115
+ slug, index = slugindex
116
+ memo.merge(slug_prefix(slug) + substitution_value(index) => slug, substitution_value(index) => slug)
117
+ end
118
+ end
119
+
120
+ def slugs
121
+ pattern.scan(/\{[^}]+\}/)
122
+ end
123
+
124
+ # If a slug begins with non-alpha characters, it may denote the start of a new component (e.g. query or fragment).
125
+ # We emit this prefix as part of the substituted slug so that Addressable's URI parser can see it as such.
126
+ def slug_prefix(slug)
127
+ matches = slug.match(/\A\{([^A-Za-z]+)/)
128
+ matches && matches[1] || ''
129
+ end
130
+
131
+ # Generate a repeatable 5 character uniform alphabetical nonsense string to allow parsing as a URI
132
+ def substitution_value(index)
133
+ Base64.urlsafe_encode64(Digest::SHA1.digest(index.to_s)).gsub(/[^A-Za-z]/, '')[0..5]
134
+ end
135
+ end
136
+ end
@@ -1,8 +1,9 @@
1
- module SitePrism::ElementChecker
2
- def all_there?
3
- Capybara.using_wait_time(0) do
4
- self.class.mapped_items.all? {|element| send "has_#{element}?" }
1
+ module SitePrism
2
+ module ElementChecker
3
+ def all_there?
4
+ Capybara.using_wait_time(0) do
5
+ self.class.mapped_items.all? { |element| send "has_#{element}?" }
6
+ end
5
7
  end
6
8
  end
7
9
  end
8
-
@@ -1,178 +1,185 @@
1
- module SitePrism::ElementContainer
2
-
3
- def element(element_name, *find_args)
4
- build element_name, *find_args do
5
- define_method element_name.to_s do |*runtime_args|
6
- find_first *find_args, *runtime_args
1
+ module SitePrism
2
+ module ElementContainer
3
+ attr_reader :mapped_items
4
+
5
+ def element(element_name, *find_args)
6
+ build element_name, *find_args do
7
+ define_method element_name.to_s do |*runtime_args, &element_block|
8
+ self.class.raise_if_block(self, element_name.to_s, !element_block.nil?)
9
+ find_first(*find_args, *runtime_args)
10
+ end
7
11
  end
8
12
  end
9
- end
10
13
 
11
- def elements(collection_name, *find_args)
12
- build collection_name, *find_args do
13
- define_method collection_name.to_s do |*runtime_args|
14
- find_all *find_args, *runtime_args
14
+ def elements(collection_name, *find_args)
15
+ build collection_name, *find_args do
16
+ define_method collection_name.to_s do |*runtime_args, &element_block|
17
+ self.class.raise_if_block(self, collection_name.to_s, !element_block.nil?)
18
+ find_all(*find_args, *runtime_args)
19
+ end
15
20
  end
16
21
  end
17
- end
18
- alias :collection :elements
19
-
20
- def section(section_name, *args, &block)
21
- section_class, find_args = extract_section_options args, &block
22
- build section_name, *find_args do
23
- define_method section_name do | *runtime_args |
24
- section_class.new self, find_first(*find_args, *runtime_args)
22
+ alias_method :collection, :elements
23
+
24
+ def section(section_name, *args, &block)
25
+ section_class, find_args = extract_section_options args, &block
26
+ build section_name, *find_args do
27
+ define_method section_name do |*runtime_args, &element_block|
28
+ self.class.raise_if_block(self, section_name.to_s, !element_block.nil?)
29
+ section_class.new self, find_first(*find_args, *runtime_args)
30
+ end
25
31
  end
26
32
  end
27
- end
28
33
 
29
- def sections(section_collection_name, *args, &block)
30
- section_class, find_args = extract_section_options args, &block
31
- build section_collection_name, *find_args do
32
- define_method section_collection_name do |*runtime_args|
33
- find_all(*find_args, *runtime_args).collect do |element|
34
- section_class.new self, element
34
+ def sections(section_collection_name, *args, &block)
35
+ section_class, find_args = extract_section_options args, &block
36
+ build section_collection_name, *find_args do
37
+ define_method section_collection_name do |*runtime_args, &element_block|
38
+ self.class.raise_if_block(self, section_collection_name.to_s, !element_block.nil?)
39
+ find_all(*find_args, *runtime_args).map do |element|
40
+ section_class.new self, element
41
+ end
35
42
  end
36
43
  end
37
44
  end
38
- end
39
45
 
40
- def iframe(iframe_name, iframe_page_class, selector)
41
- element_selector = deduce_iframe_element_selector(selector)
42
- scope_selector = deduce_iframe_scope_selector(selector)
43
- add_to_mapped_items iframe_name
44
- create_existence_checker iframe_name, element_selector
45
- create_nonexistence_checker iframe_name, element_selector
46
- create_waiter iframe_name, element_selector
47
- define_method iframe_name do |&block|
48
- within_frame scope_selector do
49
- block.call iframe_page_class.new
46
+ def iframe(iframe_name, iframe_page_class, selector)
47
+ element_selector = deduce_iframe_element_selector(selector)
48
+ scope_selector = deduce_iframe_scope_selector(selector)
49
+ add_to_mapped_items iframe_name
50
+ create_existence_checker iframe_name, element_selector
51
+ create_nonexistence_checker iframe_name, element_selector
52
+ create_waiter iframe_name, element_selector
53
+ define_method iframe_name do |&block|
54
+ within_frame scope_selector do
55
+ block.call iframe_page_class.new
56
+ end
50
57
  end
51
58
  end
52
- end
53
59
 
54
- def add_to_mapped_items(item)
55
- @mapped_items ||= []
56
- @mapped_items << item.to_s
57
- end
60
+ def add_to_mapped_items(item)
61
+ @mapped_items ||= []
62
+ @mapped_items << item.to_s
63
+ end
58
64
 
59
- def mapped_items
60
- @mapped_items
61
- end
65
+ def raise_if_block(obj, name, has_block)
66
+ return unless has_block
67
+ fail SitePrism::UnsupportedBlock, "#{obj.class}##{name} does not accept blocks, did you mean to define a (i)frame?"
68
+ end
62
69
 
63
- private
70
+ private
64
71
 
65
- def build(name, *find_args)
66
- if find_args.empty?
67
- create_no_selector name
68
- else
69
- add_to_mapped_items name
70
- yield
72
+ def build(name, *find_args)
73
+ if find_args.empty?
74
+ create_no_selector name
75
+ else
76
+ add_to_mapped_items name
77
+ yield
78
+ end
79
+ add_helper_methods name, *find_args
71
80
  end
72
- add_helper_methods name, *find_args
73
- end
74
81
 
75
- def add_helper_methods(name, *find_args)
76
- create_existence_checker name, *find_args
77
- create_nonexistence_checker name, *find_args
78
- create_waiter name, *find_args
79
- create_visibility_waiter name, *find_args
80
- create_invisibility_waiter name, *find_args
81
- end
82
+ def add_helper_methods(name, *find_args)
83
+ create_existence_checker name, *find_args
84
+ create_nonexistence_checker name, *find_args
85
+ create_waiter name, *find_args
86
+ create_visibility_waiter name, *find_args
87
+ create_invisibility_waiter name, *find_args
88
+ end
82
89
 
83
- def create_helper_method(proposed_method_name, *find_args)
84
- if find_args.empty?
85
- create_no_selector proposed_method_name
86
- else
87
- yield
90
+ def create_helper_method(proposed_method_name, *find_args)
91
+ if find_args.empty?
92
+ create_no_selector proposed_method_name
93
+ else
94
+ yield
95
+ end
88
96
  end
89
- end
90
97
 
91
- def create_existence_checker(element_name, *find_args)
92
- method_name = "has_#{element_name.to_s}?"
93
- create_helper_method method_name, *find_args do
94
- define_method method_name do |*runtime_args|
95
- wait_time = SitePrism.use_implicit_waits ? Capybara.default_wait_time : 0
96
- Capybara.using_wait_time wait_time do
97
- element_exists? *find_args, *runtime_args
98
+ def create_existence_checker(element_name, *find_args)
99
+ method_name = "has_#{element_name}?"
100
+ create_helper_method method_name, *find_args do
101
+ define_method method_name do |*runtime_args|
102
+ wait_time = SitePrism.use_implicit_waits ? Capybara.default_wait_time : 0
103
+ Capybara.using_wait_time wait_time do
104
+ element_exists?(*find_args, *runtime_args)
105
+ end
98
106
  end
99
107
  end
100
108
  end
101
- end
102
109
 
103
- def create_nonexistence_checker(element_name, *find_args)
104
- method_name = "has_no_#{element_name.to_s}?"
105
- create_helper_method method_name, *find_args do
106
- define_method method_name do |*runtime_args|
107
- wait_time = SitePrism.use_implicit_waits ? Capybara.default_wait_time : 0
108
- Capybara.using_wait_time wait_time do
109
- element_does_not_exist? *find_args, *runtime_args
110
+ def create_nonexistence_checker(element_name, *find_args)
111
+ method_name = "has_no_#{element_name}?"
112
+ create_helper_method method_name, *find_args do
113
+ define_method method_name do |*runtime_args|
114
+ wait_time = SitePrism.use_implicit_waits ? Capybara.default_wait_time : 0
115
+ Capybara.using_wait_time wait_time do
116
+ element_does_not_exist?(*find_args, *runtime_args)
117
+ end
110
118
  end
111
119
  end
112
120
  end
113
- end
114
121
 
115
- def create_waiter(element_name, *find_args)
116
- method_name = "wait_for_#{element_name.to_s}"
117
- create_helper_method method_name, *find_args do
118
- define_method method_name do |timeout = nil, *runtime_args|
119
- timeout = timeout.nil? ? Capybara.default_wait_time : timeout
120
- Capybara.using_wait_time timeout do
121
- element_exists? *find_args, *runtime_args
122
+ def create_waiter(element_name, *find_args)
123
+ method_name = "wait_for_#{element_name}"
124
+ create_helper_method method_name, *find_args do
125
+ define_method method_name do |timeout = nil, *runtime_args|
126
+ timeout = timeout.nil? ? Capybara.default_wait_time : timeout
127
+ Capybara.using_wait_time timeout do
128
+ element_exists?(*find_args, *runtime_args)
129
+ end
122
130
  end
123
131
  end
124
132
  end
125
- end
126
133
 
127
- def create_visibility_waiter(element_name, *find_args)
128
- method_name = "wait_until_#{element_name.to_s}_visible"
129
- create_helper_method method_name, *find_args do
130
- define_method method_name do |timeout = Capybara.default_wait_time, *runtime_args|
131
- Timeout.timeout timeout, SitePrism::TimeOutWaitingForElementVisibility do
132
- Capybara.using_wait_time 0 do
133
- sleep 0.05 while not element_exists? *find_args, *runtime_args, visible: true
134
+ def create_visibility_waiter(element_name, *find_args)
135
+ method_name = "wait_until_#{element_name}_visible"
136
+ create_helper_method method_name, *find_args do
137
+ define_method method_name do |timeout = Capybara.default_wait_time, *runtime_args|
138
+ Timeout.timeout timeout, SitePrism::TimeOutWaitingForElementVisibility do
139
+ Capybara.using_wait_time 0 do
140
+ sleep 0.05 until element_exists?(*find_args, *runtime_args, visible: true)
141
+ end
134
142
  end
135
143
  end
136
144
  end
137
145
  end
138
- end
139
146
 
140
- def create_invisibility_waiter(element_name, *find_args)
141
- method_name = "wait_until_#{element_name.to_s}_invisible"
142
- create_helper_method method_name, *find_args do
143
- define_method method_name do |timeout = Capybara.default_wait_time, *runtime_args|
144
- Timeout.timeout timeout, SitePrism::TimeOutWaitingForElementInvisibility do
145
- Capybara.using_wait_time 0 do
146
- sleep 0.05 while element_exists? *find_args, *runtime_args, visible: true
147
+ def create_invisibility_waiter(element_name, *find_args)
148
+ method_name = "wait_until_#{element_name}_invisible"
149
+ create_helper_method method_name, *find_args do
150
+ define_method method_name do |timeout = Capybara.default_wait_time, *runtime_args|
151
+ Timeout.timeout timeout, SitePrism::TimeOutWaitingForElementInvisibility do
152
+ Capybara.using_wait_time 0 do
153
+ sleep 0.05 while element_exists?(*find_args, *runtime_args, visible: true)
154
+ end
147
155
  end
148
156
  end
149
157
  end
150
158
  end
151
- end
152
159
 
153
- def create_no_selector(method_name)
154
- define_method method_name do
155
- raise SitePrism::NoSelectorForElement.new("#{self.class.name} => :#{method_name} needs a selector")
160
+ def create_no_selector(method_name)
161
+ define_method method_name do
162
+ fail SitePrism::NoSelectorForElement.new, "#{self.class.name} => :#{method_name} needs a selector"
163
+ end
156
164
  end
157
- end
158
165
 
159
- def deduce_iframe_scope_selector(selector)
160
- selector.is_a?(Integer) ? selector : selector.split("#").last
161
- end
166
+ def deduce_iframe_scope_selector(selector)
167
+ selector.is_a?(Integer) ? selector : selector.split('#').last
168
+ end
162
169
 
163
- def deduce_iframe_element_selector(selector)
164
- selector.is_a?(Integer) ? "iframe:nth-of-type(#{selector + 1})" : selector
165
- end
170
+ def deduce_iframe_element_selector(selector)
171
+ selector.is_a?(Integer) ? "iframe:nth-of-type(#{selector + 1})" : selector
172
+ end
166
173
 
167
- def extract_section_options(args, &block)
168
- if args.first.is_a? Class
169
- section_class = args.shift
170
- elsif block_given?
171
- section_class = Class.new SitePrism::Section, &block
172
- else
173
- raise ArgumentError.new "You should provide section class either as a block, or as the second argument"
174
+ def extract_section_options(args, &block)
175
+ if args.first.is_a? Class
176
+ section_class = args.shift
177
+ elsif block_given?
178
+ section_class = Class.new SitePrism::Section, &block
179
+ else
180
+ fail ArgumentError, 'You should provide section class either as a block, or as the second argument'
181
+ end
182
+ return section_class, args
174
183
  end
175
- return section_class, args
176
184
  end
177
185
  end
178
-
@@ -1,9 +1,10 @@
1
1
  module SitePrism
2
2
  class NoUrlForPage < StandardError; end
3
3
  class NoUrlMatcherForPage < StandardError; end
4
+ class InvalidUrlMatcher < StandardError; end
4
5
  class NoSelectorForElement < StandardError; end
5
6
  class TimeoutException < StandardError; end
6
7
  class TimeOutWaitingForElementVisibility < StandardError; end
7
8
  class TimeOutWaitingForElementInvisibility < StandardError; end
9
+ class UnsupportedBlock < StandardError; end
8
10
  end
9
-
@@ -4,28 +4,54 @@ module SitePrism
4
4
  include ElementChecker
5
5
  extend ElementContainer
6
6
 
7
- def load(expansion = {})
8
- expanded_url = url(expansion)
9
- raise SitePrism::NoUrlForPage if expanded_url.nil?
10
- visit expanded_url
7
+ def page
8
+ @page || Capybara.current_session
11
9
  end
12
10
 
13
- def displayed?(seconds = Waiter.default_wait_time)
14
- raise SitePrism::NoUrlMatcherForPage if url_matcher.nil?
11
+ def load(expansion_or_html = {})
12
+ if expansion_or_html.is_a? String
13
+ @page = Capybara.string(expansion_or_html)
14
+ else
15
+ expanded_url = url(expansion_or_html)
16
+ fail SitePrism::NoUrlForPage if expanded_url.nil?
17
+ visit expanded_url
18
+ end
19
+ end
20
+
21
+ def displayed?(*args)
22
+ expected_mappings = args.last.is_a?(::Hash) ? args.pop : {}
23
+ seconds = args.length > 0 ? args.first : Waiter.default_wait_time
24
+ fail SitePrism::NoUrlMatcherForPage if url_matcher.nil?
15
25
  begin
16
- Waiter.wait_until_true(seconds) do
17
- !(page.current_url =~ url_matcher).nil?
18
- end
19
- rescue SitePrism::TimeoutException=>e
20
- return false
26
+ Waiter.wait_until_true(seconds) { url_matches?(expected_mappings) }
27
+ rescue SitePrism::TimeoutException
28
+ false
21
29
  end
22
30
  end
23
31
 
24
- def self.set_url page_url
32
+ def url_matches(seconds = Waiter.default_wait_time)
33
+ return unless displayed?(seconds)
34
+
35
+ if url_matcher.is_a?(Regexp)
36
+ regexp_backed_matches
37
+ else
38
+ template_backed_matches
39
+ end
40
+ end
41
+
42
+ def regexp_backed_matches
43
+ url_matcher.match(page.current_url)
44
+ end
45
+
46
+ def template_backed_matches
47
+ matcher_template.mappings(page.current_url)
48
+ end
49
+
50
+ def self.set_url(page_url)
25
51
  @url = page_url.to_s
26
52
  end
27
53
 
28
- def self.set_url_matcher page_url_matcher
54
+ def self.set_url_matcher(page_url_matcher)
29
55
  @url_matcher = page_url_matcher
30
56
  end
31
57
 
@@ -34,7 +60,7 @@ module SitePrism
34
60
  end
35
61
 
36
62
  def self.url_matcher
37
- @url_matcher
63
+ @url_matcher || url
38
64
  end
39
65
 
40
66
  def url(expansion = {})
@@ -52,21 +78,42 @@ module SitePrism
52
78
 
53
79
  private
54
80
 
55
- def find_first *find_args
56
- find *find_args
81
+ def find_first(*find_args)
82
+ find(*find_args)
57
83
  end
58
84
 
59
- def find_all *find_args
60
- all *find_args
85
+ def find_all(*find_args)
86
+ all(*find_args)
61
87
  end
62
88
 
63
- def element_exists? *find_args
64
- has_selector? *find_args
89
+ def element_exists?(*find_args)
90
+ has_selector?(*find_args)
65
91
  end
66
92
 
67
- def element_does_not_exist? *find_args
68
- has_no_selector? *find_args
93
+ def element_does_not_exist?(*find_args)
94
+ has_no_selector?(*find_args)
95
+ end
96
+
97
+ def url_matches?(expected_mappings = {})
98
+ if url_matcher.is_a?(Regexp)
99
+ url_matches_by_regexp?
100
+ elsif url_matcher.respond_to?(:to_str)
101
+ url_matches_by_template?(expected_mappings)
102
+ else
103
+ fail SitePrism::InvalidUrlMatcher
104
+ end
105
+ end
106
+
107
+ def url_matches_by_regexp?
108
+ !regexp_backed_matches.nil?
109
+ end
110
+
111
+ def url_matches_by_template?(expected_mappings)
112
+ matcher_template.matches?(page.current_url, expected_mappings)
113
+ end
114
+
115
+ def matcher_template
116
+ @addressable_url_matcher ||= AddressableUrlMatcher.new(url_matcher)
69
117
  end
70
118
  end
71
119
  end
72
-
@@ -6,7 +6,7 @@ module SitePrism
6
6
 
7
7
  attr_reader :root_element, :parent
8
8
 
9
- def initialize parent, root_element
9
+ def initialize(parent, root_element)
10
10
  @parent, @root_element = parent, root_element
11
11
  end
12
12
 
@@ -14,16 +14,16 @@ module SitePrism
14
14
  root_element.visible?
15
15
  end
16
16
 
17
- def execute_script input
17
+ def execute_script(input)
18
18
  Capybara.current_session.execute_script input
19
19
  end
20
20
 
21
- def evaluate_script input
21
+ def evaluate_script(input)
22
22
  Capybara.current_session.evaluate_script input
23
23
  end
24
24
 
25
25
  def parent_page
26
- candidate_page = self.parent
26
+ candidate_page = parent
27
27
  until candidate_page.is_a?(SitePrism::Page)
28
28
  candidate_page = candidate_page.parent
29
29
  end
@@ -32,25 +32,20 @@ module SitePrism
32
32
 
33
33
  private
34
34
 
35
- def find_first *find_args
36
- root_element.find *find_args
35
+ def find_first(*find_args)
36
+ root_element.find(*find_args)
37
37
  end
38
38
 
39
- def find_all *find_args
40
- root_element.all *find_args
39
+ def find_all(*find_args)
40
+ root_element.all(*find_args)
41
41
  end
42
42
 
43
- def element_exists? *find_args
44
- unless root_element.nil?
45
- root_element.has_selector? *find_args
46
- end
43
+ def element_exists?(*find_args)
44
+ root_element.has_selector?(*find_args) unless root_element.nil?
47
45
  end
48
46
 
49
- def element_does_not_exist? *find_args
50
- unless root_element.nil?
51
- root_element.has_no_selector? *find_args
52
- end
47
+ def element_does_not_exist?(*find_args)
48
+ root_element.has_no_selector?(*find_args) unless root_element.nil?
53
49
  end
54
50
  end
55
51
  end
56
-
@@ -1,4 +1,3 @@
1
1
  module SitePrism
2
- VERSION = "2.6"
2
+ VERSION = '2.7'
3
3
  end
4
-
@@ -1,21 +1,17 @@
1
1
  module SitePrism
2
2
  class Waiter
3
- def self.wait_until_true(wait_time_seconds=default_wait_time)
3
+ def self.wait_until_true(wait_time_seconds = default_wait_time)
4
4
  start_time = Time.now
5
5
  loop do
6
6
  return true if yield
7
7
  break unless Time.now - start_time <= wait_time_seconds
8
8
  sleep(0.05)
9
9
  end
10
- raise SitePrism::TimeoutException.new, "Timed out while waiting for block to return true."
10
+ fail SitePrism::TimeoutException, 'Timed out while waiting for block to return true'
11
11
  end
12
12
 
13
13
  def self.default_wait_time
14
- @@default_wait_time
14
+ Capybara.default_wait_time
15
15
  end
16
-
17
- private
18
-
19
- @@default_wait_time = Capybara.default_wait_time
20
16
  end
21
- end
17
+ end
metadata CHANGED
@@ -1,61 +1,67 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: site_prism
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.6'
4
+ version: '2.7'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nat Ritmeyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-11 00:00:00.000000000 Z
11
+ date: 2015-04-23 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
19
  version: '2.1'
20
- - - <
20
+ - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '3.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - '>='
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: '2.1'
30
- - - <
30
+ - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: addressable
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ~>
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: 2.3.3
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3.0'
40
43
  type: :runtime
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
43
46
  requirements:
44
- - - ~>
47
+ - - ">="
45
48
  - !ruby/object:Gem::Version
46
49
  version: 2.3.3
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: rspec
49
55
  requirement: !ruby/object:Gem::Requirement
50
56
  requirements:
51
- - - <
57
+ - - "<"
52
58
  - !ruby/object:Gem::Version
53
59
  version: '4.0'
54
60
  type: :development
55
61
  prerelease: false
56
62
  version_requirements: !ruby/object:Gem::Requirement
57
63
  requirements:
58
- - - <
64
+ - - "<"
59
65
  - !ruby/object:Gem::Version
60
66
  version: '4.0'
61
67
  description: SitePrism gives you a simple, clean and semantic DSL for describing your
@@ -65,6 +71,10 @@ executables: []
65
71
  extensions: []
66
72
  extra_rdoc_files: []
67
73
  files:
74
+ - LICENSE
75
+ - README.md
76
+ - lib/site_prism.rb
77
+ - lib/site_prism/addressable_url_matcher.rb
68
78
  - lib/site_prism/element_checker.rb
69
79
  - lib/site_prism/element_container.rb
70
80
  - lib/site_prism/exceptions.rb
@@ -72,9 +82,6 @@ files:
72
82
  - lib/site_prism/section.rb
73
83
  - lib/site_prism/version.rb
74
84
  - lib/site_prism/waiter.rb
75
- - lib/site_prism.rb
76
- - LICENSE
77
- - README.md
78
85
  homepage: http://github.com/natritmeyer/site_prism
79
86
  licenses:
80
87
  - BSD3
@@ -85,17 +92,17 @@ require_paths:
85
92
  - lib
86
93
  required_ruby_version: !ruby/object:Gem::Requirement
87
94
  requirements:
88
- - - '>='
95
+ - - ">="
89
96
  - !ruby/object:Gem::Version
90
97
  version: 1.9.3
91
98
  required_rubygems_version: !ruby/object:Gem::Requirement
92
99
  requirements:
93
- - - '>='
100
+ - - ">="
94
101
  - !ruby/object:Gem::Version
95
102
  version: '0'
96
103
  requirements: []
97
104
  rubyforge_project:
98
- rubygems_version: 2.0.3
105
+ rubygems_version: 2.4.5
99
106
  signing_key:
100
107
  specification_version: 4
101
108
  summary: A Page Object Model DSL for Capybara