swamp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +79 -0
  6. data/README.md +5 -0
  7. data/Rakefile +8 -0
  8. data/bin/swamp +20 -0
  9. data/features/specifications/user_scans_a_page_interactively.feature +10 -0
  10. data/features/specifications/user_scans_buttons_in_a_page.feature +43 -0
  11. data/features/specifications/user_scans_fields_in_a_page.feature +38 -0
  12. data/features/specifications/user_scans_input_buttons_in_a_page.feature +28 -0
  13. data/features/specifications/user_scans_links_in_a_page.feature +18 -0
  14. data/features/specifications/user_scans_select_box_elements_in_a_page.feature +28 -0
  15. data/features/specifications/user_starts_swamp.feature +10 -0
  16. data/features/step_definitions/swamp_steps.rb +46 -0
  17. data/features/support/env.rb +2 -0
  18. data/features/support/page_examples/button.html +1 -0
  19. data/features/support/page_examples/button.html~ +0 -0
  20. data/features/support/page_examples/button_without_text.html +1 -0
  21. data/features/support/page_examples/button_without_text_id_and_value.html +1 -0
  22. data/features/support/page_examples/button_without_text_without_id_with_value.html +1 -0
  23. data/features/support/page_examples/checkbox.html +1 -0
  24. data/features/support/page_examples/field.html +1 -0
  25. data/features/support/page_examples/field_without_id.html +1 -0
  26. data/features/support/page_examples/input_submit.html +1 -0
  27. data/features/support/page_examples/input_submit_without_id.html +1 -0
  28. data/features/support/page_examples/link.html +1 -0
  29. data/features/support/page_examples/link.html~ +0 -0
  30. data/features/support/page_examples/link_with_id.html +5 -0
  31. data/features/support/page_examples/radio.html +1 -0
  32. data/features/support/page_examples/select_box_with_id.html +1 -0
  33. data/features/support/page_examples/select_box_with_name_only.html +1 -0
  34. data/features/support/setup.rb +42 -0
  35. data/lib/swamp/base.rb +29 -0
  36. data/lib/swamp/builder.rb +35 -0
  37. data/lib/swamp/button.rb +11 -0
  38. data/lib/swamp/buttons.rb +19 -0
  39. data/lib/swamp/element.rb +23 -0
  40. data/lib/swamp/elements.rb +39 -0
  41. data/lib/swamp/evaluator.rb +20 -0
  42. data/lib/swamp/field.rb +11 -0
  43. data/lib/swamp/fields.rb +21 -0
  44. data/lib/swamp/formatter.rb +51 -0
  45. data/lib/swamp/input_button.rb +11 -0
  46. data/lib/swamp/input_buttons.rb +19 -0
  47. data/lib/swamp/interface.rb +33 -0
  48. data/lib/swamp/link.rb +11 -0
  49. data/lib/swamp/links.rb +15 -0
  50. data/lib/swamp/select_box.rb +11 -0
  51. data/lib/swamp/select_boxes.rb +17 -0
  52. data/lib/swamp/version.rb +3 -0
  53. data/lib/swamp/wrapper.rb +25 -0
  54. data/lib/swamp.rb +26 -0
  55. data/spec/spec_helper.rb +12 -0
  56. data/spec/swamp/builder_spec.rb +36 -0
  57. data/spec/swamp/buttons_spec.rb +93 -0
  58. data/spec/swamp/evaluator_spec.rb +75 -0
  59. data/spec/swamp/fields_spec.rb +88 -0
  60. data/spec/swamp/formatter_spec.rb +59 -0
  61. data/spec/swamp/input_buttons_spec.rb +62 -0
  62. data/spec/swamp/interface_spec.rb +62 -0
  63. data/spec/swamp/links_spec.rb +34 -0
  64. data/spec/swamp/select_boxes_spec.rb +53 -0
  65. data/spec/swamp/wrapper_spec.rb +104 -0
  66. data/swamp.gemspec +31 -0
  67. metadata +274 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 713e7f0bd7a7b052bcd1f90f476fbe4ff2a8a18f
4
+ data.tar.gz: 7ad124d4b613d636732929afdf56fc83404a9634
5
+ SHA512:
6
+ metadata.gz: 70333aa5bcd6183513b20a6c0a55b87197bce65f0d88224929b0679b43127feb66cac1608fd60e85daee6e9f04b88cef15aceccd53247ea796fc81e9b1af3631
7
+ data.tar.gz: 2365c3852f58d9b6952fb200e2d0bb85cfdacc2cbc332d555c90b4be0a4edd9080aeaff8de8e4f2377432a5f07fd309fb1bf3c26383a2986370f4446ded306c9
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - jruby-19mode # JRuby in 1.9 mode
5
+ - rbx-19mode
6
+ before_script:
7
+ - "export DISPLAY=:99.0"
8
+ - "sh -e /etc/init.d/xvfb start"
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fooo.gemspec
4
+ gemspec
5
+
6
+ # gem 'rake'
data/Gemfile.lock ADDED
@@ -0,0 +1,79 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ swamp (0.0.1)
5
+ capybara
6
+ selenium-webdriver
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ builder (3.2.2)
12
+ capybara (2.1.0)
13
+ mime-types (>= 1.16)
14
+ nokogiri (>= 1.3.3)
15
+ rack (>= 1.0.0)
16
+ rack-test (>= 0.5.4)
17
+ xpath (~> 2.0)
18
+ childprocess (0.3.9)
19
+ ffi (~> 1.0, >= 1.0.11)
20
+ coderay (1.0.9)
21
+ cucumber (1.3.8)
22
+ builder (>= 2.1.2)
23
+ diff-lcs (>= 1.1.3)
24
+ gherkin (~> 2.12.1)
25
+ multi_json (>= 1.7.5, < 2.0)
26
+ multi_test (>= 0.0.2)
27
+ diff-lcs (1.2.4)
28
+ ffi (1.9.0)
29
+ gherkin (2.12.1)
30
+ multi_json (~> 1.3)
31
+ json (1.7.7)
32
+ method_source (0.8.2)
33
+ mime-types (1.25)
34
+ mini_portile (0.5.1)
35
+ multi_json (1.8.0)
36
+ multi_test (0.0.2)
37
+ nokogiri (1.6.0)
38
+ mini_portile (~> 0.5.0)
39
+ pry (0.9.12.2)
40
+ coderay (~> 1.0.5)
41
+ method_source (~> 0.8)
42
+ slop (~> 3.4)
43
+ pry-nav (0.2.3)
44
+ pry (~> 0.9.10)
45
+ rack (1.5.2)
46
+ rack-test (0.6.2)
47
+ rack (>= 1.0)
48
+ rake (10.1.0)
49
+ rspec (2.14.1)
50
+ rspec-core (~> 2.14.0)
51
+ rspec-expectations (~> 2.14.0)
52
+ rspec-mocks (~> 2.14.0)
53
+ rspec-core (2.14.5)
54
+ rspec-expectations (2.14.3)
55
+ diff-lcs (>= 1.1.3, < 2.0)
56
+ rspec-mocks (2.14.3)
57
+ rubyzip (0.9.9)
58
+ selenium-webdriver (2.35.1)
59
+ childprocess (>= 0.2.5)
60
+ multi_json (~> 1.0)
61
+ rubyzip (< 1.0.0)
62
+ websocket (~> 1.0.4)
63
+ slop (3.4.6)
64
+ websocket (1.0.7)
65
+ xpath (2.0.0)
66
+ nokogiri (~> 1.3)
67
+
68
+ PLATFORMS
69
+ ruby
70
+
71
+ DEPENDENCIES
72
+ bundler (~> 1.3)
73
+ cucumber
74
+ json
75
+ pry
76
+ pry-nav
77
+ rake
78
+ rspec
79
+ swamp!
data/README.md ADDED
@@ -0,0 +1,5 @@
1
+ [![Build Status](https://travis-ci.org/Juraci/swamp.png?branch=master)](https://travis-ci.org/Juraci/swamp)
2
+ swamp
3
+ =====
4
+
5
+ automatically generates the interfaces for the most common actions that a page can provide
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'cucumber/rake/task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ Cucumber::Rake::Task.new(:cucumber)
7
+
8
+ task :default => [:spec, :cucumber]
data/bin/swamp ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'swamp'
4
+
5
+ fields = Swamp::Fields.new
6
+ buttons = Swamp::Buttons.new
7
+ input_buttons = Swamp::InputButtons.new
8
+ select_boxes = Swamp::SelectBoxes.new
9
+ links = Swamp::Links.new
10
+ meta_collection = [fields, buttons, input_buttons, select_boxes, links]
11
+ wrapper = Swamp::Wrapper.new(meta_collection)
12
+ swamp = Swamp::Interface.new(STDOUT, wrapper)
13
+ swamp.run
14
+
15
+ while input = gets
16
+ if input.chomp == 'exit'
17
+ exit
18
+ end
19
+ swamp.scan(input)
20
+ end
@@ -0,0 +1,10 @@
1
+ Feature: user scans a page interactively
2
+
3
+ As a swamp user
4
+ I want to scan the page interactively
5
+ So I can create the page objects faster
6
+
7
+ Scenario: User scans the current page hiting enter
8
+ Given that swamp already have scanned a page
9
+ When I attempt to hit enter at the terminal
10
+ Then swamp should scan the current page
@@ -0,0 +1,43 @@
1
+ Feature: user scans buttons in a page
2
+
3
+ The user enters an url to a given page, swamp fires up the browser and go to that url
4
+ once the page is loaded swamp start looking for buttons then swamp generates the code
5
+ snippets to interact with those elements using capybara.
6
+
7
+ Background: swamp is running
8
+ Given that swamp is already running
9
+
10
+ Scenario: A button that has text
11
+ Given I enter the url for this page: "button.html"
12
+ When swamp scans that page
13
+ Then swamp should output the following code snippet
14
+ """
15
+ def sign_up
16
+ source.click_button("Sign Up")
17
+ end
18
+ """
19
+
20
+ Scenario: A button that doesn't has text but has id
21
+ Given I enter the url for this page: "button_without_text.html"
22
+ When swamp scans that page
23
+ Then swamp should output the following code snippet
24
+ """
25
+ def search_button
26
+ source.click_button("search-button")
27
+ end
28
+ """
29
+
30
+ Scenario: A button that doesn't has either text or id but has the value attribute
31
+ Given I enter the url for this page: "button_without_text_without_id_with_value.html"
32
+ When swamp scans that page
33
+ Then swamp should output the following code snippet
34
+ """
35
+ def buy_now
36
+ source.click_button("buy-now")
37
+ end
38
+ """
39
+
40
+ Scenario: A button without text id and value
41
+ Given I enter the url for this page: "button_without_text_id_and_value.html"
42
+ When swamp scans that page
43
+ Then swamp should not output any snippet
@@ -0,0 +1,38 @@
1
+ Feature: user scans fields in a page
2
+
3
+ The user enters an url to a given page, swamp fires up the browser and go to that url
4
+ once the page is loaded swamp start looking for fields then swamp generates the code
5
+ snippets to interact with those elements using capybara.
6
+
7
+ Background: swamp is running
8
+ Given that swamp is already running
9
+
10
+ Scenario: A standard field
11
+ Given I enter the url for this page: "field.html"
12
+ When swamp scans that page
13
+ Then swamp should output the following code snippet
14
+ """
15
+ def type_username(input)
16
+ source.fill_in("id_username", with: input)
17
+ end
18
+ """
19
+
20
+ Scenario: A field without the id attribute
21
+ Given I enter the url for this page: "field_without_id.html"
22
+ When swamp scans that page
23
+ Then swamp should output the following code snippet
24
+ """
25
+ def type_username(input)
26
+ source.fill_in("username", with: input)
27
+ end
28
+ """
29
+
30
+ Scenario: A checkbox
31
+ Given I enter the url for this page: "checkbox.html"
32
+ When swamp scans that page
33
+ Then swamp should not output any snippet
34
+
35
+ Scenario: A radio
36
+ Given I enter the url for this page: "radio.html"
37
+ When swamp scans that page
38
+ Then swamp should not output any snippet
@@ -0,0 +1,28 @@
1
+ Feature: user scans submits in a page
2
+
3
+ The user enters an url to a given page, swamp fires up the browser and go to that url
4
+ once the page is loaded swamp start looking for inputs of type submit then swamp generates the code
5
+ snippets to interact with those elements using capybara.
6
+
7
+ Background: swamp is running
8
+ Given that swamp is already running
9
+
10
+ Scenario: A submit that has value and id
11
+ Given I enter the url for this page: "input_submit.html"
12
+ When swamp scans that page
13
+ Then swamp should output the following code snippet
14
+ """
15
+ def log_in
16
+ source.find(:css, "#u_0_b").click
17
+ end
18
+ """
19
+
20
+ Scenario: A submit that has no id
21
+ Given I enter the url for this page: "input_submit_without_id.html"
22
+ When swamp scans that page
23
+ Then swamp should output the following code snippet
24
+ """
25
+ def continue
26
+ source.find(:css, "input.button.g-button.g-button-submit[value='Continue']").click
27
+ end
28
+ """
@@ -0,0 +1,18 @@
1
+ Feature: user scans links in a page
2
+
3
+ The user enters an url to a given page, swamp fires up the browser and go to that url
4
+ once the page is loaded swamp start looking for links elements in that page then swamp
5
+ generates the code snippets to interact with those elements using capybara.
6
+
7
+ Background: swamp is running
8
+ Given that swamp is already running
9
+
10
+ Scenario: A link that has id
11
+ Given I enter the url for this page: "link_with_id.html"
12
+ When swamp scans that page
13
+ Then swamp should output the following code snippet
14
+ """
15
+ def link_forgot_passwd
16
+ source.click_link("link-forgot-passwd")
17
+ end
18
+ """
@@ -0,0 +1,28 @@
1
+ Feature: user scans select box elements in a page
2
+
3
+ The user enters an url to a given page, swamp fires up the browser and go to that url
4
+ once the page is loaded swamp start looking for select box elements in that page then swamp
5
+ generates the code snippets to interact with those elements using capybara.
6
+
7
+ Background: swamp is running
8
+ Given that swamp is already running
9
+
10
+ Scenario: A select box that has id
11
+ Given I enter the url for this page: "select_box_with_id.html"
12
+ When swamp scans that page
13
+ Then swamp should output the following code snippet
14
+ """
15
+ def select_month(option)
16
+ source.select(option, :from => "month")
17
+ end
18
+ """
19
+
20
+ Scenario: A select box that has name only
21
+ Given I enter the url for this page: "select_box_with_name_only.html"
22
+ When swamp scans that page
23
+ Then swamp should output the following code snippet
24
+ """
25
+ def select_region(option)
26
+ source.select(option, :from => "Region")
27
+ end
28
+ """
@@ -0,0 +1,10 @@
1
+ Feature: user starts swamp
2
+
3
+ As a swamp user
4
+ I want to start the application
5
+ So that I can magically create my page-objects
6
+
7
+ Scenario: Start swamp
8
+ Given swamp is not yet running
9
+ When I start it
10
+ Then I should see "Enter the url for the page to be scanned:"
@@ -0,0 +1,46 @@
1
+ Given /^swamp is not yet running$/ do
2
+ end
3
+
4
+ When /^(?:I start it|that swamp is already running)$/ do
5
+ swamp.run
6
+ end
7
+
8
+ Then /^I should see "(.*?)"$/ do |outcome|
9
+ output.messages.should include(outcome)
10
+ end
11
+
12
+ Given /^I enter the url for this page: "(\w+\.html)"$/ do |page|
13
+ path = File.join(File.dirname(__FILE__), '../support/page_examples/', page)
14
+ @url = "file://#{path}"
15
+ end
16
+
17
+ When /^swamp scans that page$/ do
18
+ swamp.scan(@url)
19
+ end
20
+
21
+ Then /^swamp should output the following code snippets?$/ do |string|
22
+ output.messages.should include(string)
23
+ end
24
+
25
+ Then /^swamp should not output any snippet$/ do
26
+ prompt_message = "Enter the url for the page to be scanned:"
27
+ output.messages.length.should == 1
28
+ output.messages.should include(prompt_message)
29
+ end
30
+
31
+ Given /^that swamp already have scanned a page$/ do
32
+ swamp.run
33
+ path = File.join(File.dirname(__FILE__), '../support/page_examples/', "button.html")
34
+ @url = "file://#{path}"
35
+ swamp.scan(@url)
36
+ output.messages.should include("def sign_up\n source.click_button(\"Sign Up\")\nend")
37
+ end
38
+
39
+ When /^I attempt to hit enter at the terminal$/ do
40
+ swamp.scan("\n")
41
+ end
42
+
43
+ Then /^swamp should scan the current page$/ do
44
+ output.messages.length.should == 3
45
+ output.messages.last.should == "def sign_up\n source.click_button(\"Sign Up\")\nend"
46
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH << File.expand_path('../../../lib', __FILE__)
2
+ require 'swamp'
@@ -0,0 +1 @@
1
+ <button type="submit" class="_6j mvm _6wk _6wl signup_button _3ma _6o _6v" name="websubmit" id="u_0_2">Sign Up</button>
File without changes
@@ -0,0 +1 @@
1
+ <button id="search-button" type="submit" class="no-focus search-button" tabindex="-1" value=""><span class="goog-inline-block SPRITE_search_icon_white"></span></button>
@@ -0,0 +1 @@
1
+ <button class="search-input-button" data-bind="css: { 'hasContent': searchQuery }, click: clearSearch "></button></div>
@@ -0,0 +1 @@
1
+ <button class="btn btn-info" data-ga-action="comprar" data-ga-category="revista-digital-detalhes" data-ga-label="revista-digital:caras:1017-maio-2013" data-track-click="true" name="button" type="submit" value="buy-now"></b></button>
@@ -0,0 +1 @@
1
+ <input id="sign-up-terms-and-conditions" name="sign-up-terms-and-conditions" type="checkbox" value="true">
@@ -0,0 +1 @@
1
+ <input type="text" name="username" id="id_username" data-bind="username" class="input-large">
@@ -0,0 +1 @@
1
+ <input type="text" name="username" data-bind="username" class="input-large">
@@ -0,0 +1 @@
1
+ <input value="Log In" tabindex="4" id="u_0_b" type="submit">
@@ -0,0 +1 @@
1
+ <input type="submit" class="button g-button g-button-submit" value="Continue">
@@ -0,0 +1 @@
1
+ <a href="/help/index" class="bold">help</a>
File without changes
@@ -0,0 +1,5 @@
1
+ <li>
2
+ <a id="link-forgot-passwd" href="https://accounts.google.com/RecoverAccount?service=mail&amp;continue=http%3A%2F%2Fmail.google.com%2Fmail%2F" target="_top">
3
+ Can't access your account?
4
+ </a>
5
+ </li>
@@ -0,0 +1 @@
1
+ <input class="radio" type="radio" name="alternativa" id="alternativa1" value="1">
@@ -0,0 +1 @@
1
+ <select name="birthday_month" id="month"><option value="0" selected="1">Month</option><option value="1">Jan</option><option value="2">Feb</option><option value="3">Mar</option><option value="4">Apr</option><option value="5">May</option><option value="6">Jun</option><option value="7">Jul</option><option value="8">Aug</option><option value="9">Sep</option><option value="10">Oct</option><option value="11">Nov</option><option value="12">Dec</option></select>
@@ -0,0 +1 @@
1
+ <dl><dt class="create_key"><label for="server_region">Region</label></dt><dd class="create_value regions"><div><select class="provider-select" data-bind="region" name="Region"><optgroup label="Next Generation Cloud Servers"><option value="compute,cloudServersOpenStack,IAD">Northern Virginia (IAD)</option><option value="compute,cloudServersOpenStack,DFW">Dallas (DFW)</option><option value="compute,cloudServersOpenStack,ORD">Chicago (ORD)</option><option value="compute,cloudServersOpenStack,SYD">Sydney (SYD)</option></optgroup><optgroup label="First Generation Cloud Servers"><option value="compute,cloudServers">Dallas (DFW)</option></optgroup></select><span class="tooltip_toggle"></span></div><div class="region-warning" style="display: none;"><strong><i class="icon_region"></i><span class="region-label">All Regions (Global)</span></strong> will now be shown, which may be slower<span class="tooltip_toggle"></span></div></dd></dl>
@@ -0,0 +1,42 @@
1
+ class Output
2
+ def messages
3
+ @messages ||= []
4
+ end
5
+
6
+ def puts(message)
7
+ messages << message
8
+ end
9
+ end
10
+
11
+ def output
12
+ @output ||= Output.new
13
+ end
14
+
15
+ def buttons
16
+ Swamp::Buttons.new
17
+ end
18
+
19
+ def fields
20
+ Swamp::Fields.new
21
+ end
22
+
23
+ def input_buttons
24
+ Swamp::InputButtons.new
25
+ end
26
+
27
+ def select_boxes
28
+ Swamp::SelectBoxes.new
29
+ end
30
+
31
+ def links
32
+ Swamp::Links.new
33
+ end
34
+
35
+ def wrapper
36
+ meta_collection = [fields, buttons, input_buttons, select_boxes, links]
37
+ Swamp::Wrapper.new(meta_collection)
38
+ end
39
+
40
+ def swamp
41
+ @swamp ||= Swamp::Interface.new(output, wrapper)
42
+ end
data/lib/swamp/base.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'capybara'
2
+
3
+ module Swamp
4
+ class Base
5
+ include Capybara::DSL
6
+
7
+ def initialize
8
+ setup_capybara
9
+ end
10
+
11
+ def setup_capybara
12
+ Capybara.register_driver :firefox do |app|
13
+ Capybara::Selenium::Driver.new(app, :browser => :firefox)
14
+ end
15
+
16
+ Capybara.run_server = false
17
+ Capybara.default_selector = :css
18
+ Capybara.default_driver = :selenium
19
+ Capybara.default_wait_time = 60
20
+
21
+ Capybara.configure do |config|
22
+ config.match = :smart
23
+ config.exact_options = true
24
+ config.ignore_hidden_elements = true
25
+ config.visible_text_only = true
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ module Swamp
2
+ class Builder
3
+ def initialize(element)
4
+ @element = element
5
+ end
6
+
7
+ def build_snippet
8
+ if @element.name
9
+ [method_definition, @element.method_signature, line_break, identation, prefix, @element.accessor, line_break, method_end].join
10
+ else
11
+ [prefix, @element.accessor].join
12
+ end
13
+ end
14
+
15
+ def method_definition
16
+ "def "
17
+ end
18
+
19
+ def method_end
20
+ "end"
21
+ end
22
+
23
+ def prefix
24
+ "source."
25
+ end
26
+
27
+ def identation
28
+ " "
29
+ end
30
+
31
+ def line_break
32
+ "\n"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ module Swamp
2
+ class Button < Element
3
+ def method_signature
4
+ format(@name)
5
+ end
6
+
7
+ def accessor
8
+ "click_button(\"#{@selector}\")"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Swamp
2
+ class Buttons < Elements
3
+ def get
4
+ elements = []
5
+ page.all("button").map do |element|
6
+ if element.visible?
7
+ if has_valid_text?(element)
8
+ elements << Swamp::Button.new(element.text, element.text)
9
+ elsif has_id?(element) and has_valid_id?(element)
10
+ elements << Swamp::Button.new(element["id"], element["id"])
11
+ elsif has_value?(element) and has_valid_value?(element)
12
+ elements << Swamp::Button.new(element["value"], element["value"])
13
+ end
14
+ end
15
+ end
16
+ elements
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ module Swamp
2
+ class Element
3
+ def initialize(name, selector)
4
+ @name = name
5
+ @selector = selector
6
+ end
7
+
8
+ attr_reader :name
9
+ attr_reader :selector
10
+
11
+ def method_signature
12
+ raise NotImplementedError, "Must be implemented by subtypes"
13
+ end
14
+
15
+ def accessor
16
+ raise NotImplementedError, "Must be implemented by subtypes"
17
+ end
18
+
19
+ def format(text)
20
+ Swamp::Formatter.new.format(text)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ module Swamp
2
+ class Elements < Base
3
+ def has_id?(element)
4
+ element['id'] != nil and element['id'] != "" ? true : false
5
+ end
6
+
7
+ def has_name?(element)
8
+ element['name'] != nil and element['name'] != "" ? true : false
9
+ end
10
+
11
+ def has_value?(element)
12
+ element['value'] != nil and element['value'] != "" ? true : false
13
+ end
14
+
15
+ def has_class?(element)
16
+ element['class'] != nil and element['class'] != "" ? true : false
17
+ end
18
+
19
+ def has_valid_text?(element)
20
+ element.text.length >= 3 and has_no_punctuation?(element.text)
21
+ end
22
+
23
+ def has_valid_value?(element)
24
+ element["value"].length >= 3 and has_no_punctuation?(element["value"])
25
+ end
26
+
27
+ def has_no_punctuation?(string)
28
+ string.match(/[.,]/) ? false : true
29
+ end
30
+
31
+ def has_valid_id?(element)
32
+ element["id"].length <= 1 ? false : true
33
+ end
34
+
35
+ def formatter
36
+ @formatter ||= Swamp::Formatter.new
37
+ end
38
+ end
39
+ end