prickle 0.0.1 → 0.0.2

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.
data/Gemfile.lock CHANGED
@@ -1,3 +1,9 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ prickle (0.0.1)
5
+ capybara
6
+
1
7
  GEM
2
8
  remote: http://rubygems.org/
3
9
  specs:
@@ -20,6 +26,10 @@ GEM
20
26
  rack
21
27
  rack-test (0.6.1)
22
28
  rack (>= 1.0)
29
+ reek (1.2.8)
30
+ ruby2ruby (~> 1.2)
31
+ ruby_parser (~> 2.0)
32
+ sexp_processor (~> 3.0)
23
33
  rspec (2.8.0)
24
34
  rspec-core (~> 2.8.0)
25
35
  rspec-expectations (~> 2.8.0)
@@ -28,12 +38,18 @@ GEM
28
38
  rspec-expectations (2.8.0)
29
39
  diff-lcs (~> 1.1.2)
30
40
  rspec-mocks (2.8.0)
41
+ ruby2ruby (1.3.1)
42
+ ruby_parser (~> 2.0)
43
+ sexp_processor (~> 3.0)
44
+ ruby_parser (2.3.1)
45
+ sexp_processor (~> 3.0)
31
46
  rubyzip (0.9.6.1)
32
47
  selenium-webdriver (2.19.0)
33
48
  childprocess (>= 0.2.5)
34
49
  ffi (~> 1.0.9)
35
50
  multi_json (~> 1.0.4)
36
51
  rubyzip
52
+ sexp_processor (3.0.10)
37
53
  sinatra (1.3.2)
38
54
  rack (~> 1.3, >= 1.3.6)
39
55
  rack-protection (~> 1.2)
@@ -47,5 +63,7 @@ PLATFORMS
47
63
 
48
64
  DEPENDENCIES
49
65
  capybara
50
- rspec
51
- sinatra
66
+ prickle!
67
+ reek
68
+ rspec (~> 2.8.0)
69
+ sinatra (~> 1.3.2)
data/README.md CHANGED
@@ -8,42 +8,53 @@ To install prickle execute
8
8
  gem install prickle
9
9
  ```
10
10
 
11
- and to configure
11
+ and to configure update your *features/support/env.rb* to include the following:
12
12
 
13
13
  ```ruby
14
- require 'prickle/capybara'
14
+ require 'prickle/capybara' # require
15
+
15
16
 
16
17
  World do
17
- include Capybara::DSL
18
- include Prickle::Capybara #include it after Capybara
18
+ include Capybara::DSL
19
+ include Prickle::Capybara # include Prickle
19
20
  end
20
21
  ```
21
22
 
23
+ ## Waiting for elements to become visible
24
+
25
+ To enable this feature you need to set the *Prickle::Capybara.wait_time* property.
26
+
27
+ ```ruby
28
+ Prickle::Capybara.wait_time = 5
29
+ ```
30
+
31
+ If you only want to extend the wait time for a particular feature, then you need to reset the wait time using *Prickle::Capybara = nil*.
32
+
22
33
  ## Usage
23
34
 
24
35
  ### Find elements by any html tag(s)
25
36
 
26
37
  ```ruby
27
- element(:href => "http://google.com")
28
- element(:name => "blue")
29
- element(:id => "key")
30
- element(:class => "key", :id => "button")
38
+ element(:href => "http://google.com")
39
+ element(:name => "blue")
40
+ element(:id => "key")
41
+ element(:class => "key", :id => "button")
31
42
  ```
32
43
 
33
44
  ### Find elements by type and html tag(s)
34
45
 
35
46
  ```ruby
36
- element(:link,:href => "http://google.com")
37
- element(:input, :name => "blue")
38
- ``
47
+ element(:link, :href => "http://google.com") # you can also use link and paragraph (instead of a and p)
48
+ element(:input, :name => "blue")
49
+ ```
39
50
 
40
51
  ### Apply a search, a click or a text matcher
41
52
 
42
- ``ruby
53
+ ```ruby
43
54
 
44
- element(:name => "flower")*.exists?*
45
- element(:name => "flower")*.click*
46
- element(:name => "flower")*.contains_text? "Roses"*
55
+ element(:name => "flower").exists?
56
+ element(:name => "flower").click
57
+ element(:name => "flower").contains_text? "Roses"
47
58
  ```
48
59
 
49
60
  ## Alternative syntax
@@ -51,20 +62,19 @@ element(:name => "flower")*.contains_text? "Roses"*
51
62
  ### Find
52
63
 
53
64
  ```ruby
54
- find_by_name "green"
55
-
56
- find_button_by_name "green" #find_<element_tag>_by_name "<name>"
65
+ find_by_name "green"
66
+ find_button_by_name "green" #find_<element_tag>_by_name "<name>"
57
67
  ```
58
68
 
59
- ## Click
69
+ ### Click
60
70
 
61
71
  ```ruby
62
- click_by_name "blue"
63
- click_input_by_name "blue" #click_<element_tag>_by_name "<name>"
64
- ``
72
+ click_by_name "blue"
73
+ click_input_by_name "blue" #click_<element_tag>_by_name "<name>"
74
+ ```
65
75
 
66
76
  ### Match text
67
77
 
68
78
  ```ruby
69
- div_contains_text? "text" #<element_tag>_contains_text? "text"
79
+ div_contains_text? "text" #<element_tag>_contains_text? "text"
70
80
  ```
@@ -1,11 +1,8 @@
1
- require_relative 'capybara/find'
2
- require_relative 'capybara/click'
3
- require_relative 'capybara/match'
4
- require_relative 'capybara/exceptions'
1
+ require_relative 'capybara/element'
5
2
 
6
3
  module Prickle
7
4
  TAGS = { :link => 'a',
8
- :paragraph => 'p'
5
+ :paragraph => 'p'
9
6
  }
10
7
 
11
8
  module Capybara
@@ -15,43 +12,31 @@ module Prickle
15
12
 
16
13
  end
17
14
 
18
- include Prickle::Actions::Find
19
- include Prickle::Actions::Click
20
- include Prickle::Actions::Match
21
-
22
15
  def element type='*', identifier
23
- @identifier = identifier
24
- @type = type
25
- self
16
+ Element.new type, identifier
26
17
  end
27
18
 
28
- private
29
-
30
- def xpath_for identifier
31
- return identifier.each_pair.to_a.map do |key, value|
32
- "@#{key}='#{value}'"
33
- end.join ' and '
19
+ def find_by_name type='*', name
20
+ element(type, :name => name).exists?
34
21
  end
35
22
 
36
- def find_element_by xpath
37
- wait_until(Prickle::Capybara.wait_time) do
38
- find(:xpath, xpath).visible?
39
- end unless Prickle::Capybara.wait_time.nil?
40
-
41
- find(:xpath, xpath)
23
+ def click_by_name name
24
+ find_by_name(name).click
42
25
  end
43
26
 
44
- def type_of element
45
- Prickle::TAGS[element.to_sym] || element
46
- end
27
+ private
47
28
 
48
- def handle_exception &block
49
- begin
50
- block.call
51
- rescue Exception => e
52
- raise Capybara::ElementNotFound.new(@type, @identifier, @text, e) if e.class.to_s == "Capybara::ElementNotFound"
53
- raise
29
+ def method_missing method, *args
30
+ if method =~ /(^.*)_contains_text\?$/
31
+ element($1, :name => args.first).contains_text? args[1]
32
+ elsif method =~ /^click_(.*)_by_name$/
33
+ element($1, :name => args.first).click
34
+ elsif method =~ /^find_(.*)_by_name$/
35
+ element($1, :name => args.first).exists?
36
+ else
37
+ super
54
38
  end
55
39
  end
40
+
56
41
  end
57
42
  end
@@ -2,24 +2,9 @@ module Prickle
2
2
  module Actions
3
3
  module Click
4
4
 
5
- def click_by_name name
6
- find_by_name(name).click
7
- end
8
-
9
5
  def click
10
- find_element_by_identifier(@type, @identifier).click
11
- end
12
-
13
- private
14
-
15
- def method_missing method, *args
16
- if method =~ /^click_(.*)_by_name$/
17
- find_by_name($1, args.first).click
18
- else
19
- super
20
- end
6
+ find_element_by_identifier.click
21
7
  end
22
-
23
8
  end
24
9
  end
25
10
  end
@@ -0,0 +1,53 @@
1
+ require_relative 'find'
2
+ require_relative 'click'
3
+ require_relative 'match'
4
+ require_relative 'exceptions'
5
+
6
+ module Prickle
7
+ module Capybara
8
+ class Element
9
+
10
+ require 'capybara/dsl'
11
+ include ::Capybara::DSL
12
+
13
+ def initialize type="*", identifier
14
+ @identifier = identifier
15
+ @type = type
16
+ self
17
+ end
18
+
19
+ def handle_exception &block
20
+ begin
21
+ block.call
22
+ rescue Exception => e
23
+ raise ElementNotFound, Error.new(@type, @identifier, @text, e).message if e.class.to_s == "Capybara::ElementNotFound"
24
+ raise
25
+ end
26
+ end
27
+
28
+ def identifier
29
+ return @identifier.each_pair.to_a.map do |key, value|
30
+ "@#{key}='#{value}'"
31
+ end.join ' and '
32
+ end
33
+
34
+ def find_element_by xpath
35
+ wait_until(Prickle::Capybara.wait_time) do
36
+ find(:xpath, xpath).visible?
37
+ end unless Prickle::Capybara.wait_time.nil?
38
+
39
+ find(:xpath, xpath)
40
+ end
41
+
42
+ def type_of element
43
+ Prickle::TAGS[element.to_sym] || element
44
+ end
45
+
46
+ include Prickle::Actions::Find
47
+ include Prickle::Actions::Match
48
+ include Prickle::Actions::Click
49
+
50
+ end
51
+
52
+ end
53
+ end
@@ -1,16 +1,39 @@
1
1
  module Prickle
2
2
  module Capybara
3
- class ElementNotFound < Exception
4
3
 
5
- def initialize type, identifier, text, e
6
- element_text = "Element"
7
- element_text = "\e[1m#{type}\e[0m\e[31m" unless type == "*"
8
- text_string = " and text \e[1m#{text}\e[0m\e[31m" unless text.nil?
4
+ class ElementNotFound < Exception; end;
9
5
 
10
- raise "#{element_text} with properties \e[1m#{identifier.to_s}\e[0m\e[31m#{text_string} was not found.\nError: #{e.message}"
6
+ class Error
7
+
8
+ def initialize type, identifier, text, caught_exception
9
+ @element_type = type
10
+ @element_identifier = identifier
11
+ @element_text = text
12
+ @caught_exception = caught_exception
11
13
  end
12
14
 
13
- end
15
+ def message
16
+ "#{element_text} with properties #{identifier} #{text_string} was not found.\n\tError: #{@caught_exception.message}"
17
+ end
18
+
19
+ private
20
+
21
+ def element_text
22
+ return highlight(@element_type) unless @element_type == "*"
23
+ "Element"
24
+ end
14
25
 
26
+ def text_string
27
+ " and text #{highlight(@element_text)}" unless @element_text.nil?
28
+ end
29
+
30
+ def identifier
31
+ highlight(@element_identifier.to_s)
32
+ end
33
+
34
+ def highlight text
35
+ "\e[1m#{text}\e[0m\e[31m"
36
+ end
37
+ end
15
38
  end
16
39
  end
@@ -2,33 +2,8 @@ module Prickle
2
2
  module Actions
3
3
  module Find
4
4
 
5
- def find_by_name type='*', name
6
- find_element_by_identifier type, { :name => name }
7
- end
8
-
9
5
  def exists?
10
- find_element_by_identifier @type, @identifier
11
- end
12
-
13
- private
14
-
15
- def method_missing method, *args
16
- if method =~ /^find_(.*)_by_name$/
17
- find_by_name $1, args.first
18
- else
19
- super
20
- end
21
- end
22
-
23
- def find_by_identifier_xpath element, identifier
24
- "//#{type_of(element)}[#{xpath_for(identifier)}]"
25
- end
26
-
27
- def find_element_by_identifier element, identifier
28
- @type = element; @identifier = identifier
29
- handle_exception do
30
- find_element_by(find_by_identifier_xpath(element, identifier ))
31
- end
6
+ find_element_by_identifier
32
7
  end
33
8
 
34
9
  end
@@ -4,27 +4,29 @@ module Prickle
4
4
 
5
5
  def contains_text? text
6
6
  handle_exception do
7
- find_element_by_name_and_text(@type, @identifier, text)
7
+ find_element_by_identifier_and_text
8
8
  end
9
9
  end
10
10
 
11
- def method_missing method, *args
12
- if method =~ /(^.*)_contains_text\?$/
13
- find_element_by_name_and_text($1, { :name => args.first } , args[1])
14
- else
15
- super
16
- end
11
+ private
12
+
13
+ def xpath_for_identifier
14
+ "//#{type_of(@type)}[#{identifier}]"
17
15
  end
18
16
 
19
- private
17
+ def xpath_for_identifier_and_text
18
+ "//#{type_of(@type)}[#{identifier} and contains(text(), '#{@text}')]"
20
19
 
21
- def find_by_name_and_text_xpath element, identifier, text
22
- "//#{type_of(element)}[#{xpath_for(identifier)} and contains(text(), '#{text}')]"
20
+ end
21
+ def find_element_by_identifier
22
+ handle_exception do
23
+ find_element_by xpath_for_identifier
24
+ end
23
25
  end
24
26
 
25
- def find_element_by_name_and_text element, name, text
27
+ def find_element_by_identifier_and_text
26
28
  handle_exception do
27
- find_element_by(find_by_name_and_text_xpath(element, name, text))
29
+ find_element_by xpath_for_identifier_and_text
28
30
  end
29
31
  end
30
32
 
@@ -0,0 +1,3 @@
1
+ module Prickle
2
+ VERSION = '0.0.2'
3
+ end
data/prickle.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require "prickle/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "prickle"
6
+ s.version = Prickle::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.author = "Despo Pentara"
9
+ s.email = "despo@extractmethod.com"
10
+ s.homepage = "https://github.com/ExtractMethod/prickle"
11
+ s.summary = "A simple DSL wrapped around Capybara for matching elements using html tags."
12
+ s.description = "A simple DSL wrapped around Capybara for matching elements using html tags."
13
+ s.required_ruby_version = '>= 1.9.2'
14
+
15
+ s.licenses = ["MIT"]
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "capybara"
23
+
24
+ s.add_development_dependency "capybara"
25
+ s.add_development_dependency "rspec", "~> 2.8.0"
26
+ s.add_development_dependency "sinatra", "~> 1.3.2"
27
+ s.add_development_dependency "reek"
28
+ end
29
+
@@ -4,6 +4,7 @@ describe Prickle::Capybara do
4
4
  let(:prickly) { Prickly.new }
5
5
 
6
6
  before do
7
+ Capybara.default_driver = :selenium
7
8
  prickly.extend Prickle::Capybara
8
9
  prickly.visit '/'
9
10
  end
data/spec/finders_spec.rb CHANGED
@@ -4,6 +4,7 @@ describe Prickle::Capybara do
4
4
  let(:prickly) { Prickly.new }
5
5
 
6
6
  before do
7
+ Capybara.default_driver = :rack_test
7
8
  prickly.extend Prickle::Capybara
8
9
  prickly.visit '/'
9
10
  end
@@ -60,7 +61,7 @@ describe Prickle::Capybara do
60
61
 
61
62
  context 'DSL' do
62
63
  it 'can find an element' do
63
- prickly.element(:name => 'blue').should == prickly
64
+ prickly.element(:name => 'blue').class.to_s.should == "Prickle::Capybara::Element"
64
65
  end
65
66
 
66
67
  it 'can match text in an element' do
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), "..", "lib", "prickle", "capybara")
2
2
 
3
3
  require 'rspec'
4
- require 'capybara'
5
- require 'capybara/dsl'
6
4
  require 'prickle/capybara'
7
5
 
8
6
  class Prickly
@@ -12,5 +10,4 @@ end
12
10
 
13
11
  require_relative 'stub/app'
14
12
  Capybara.app = Sinatra::Application
15
- Capybara.default_driver = :selenium
16
13
  Capybara.default_wait_time = 0
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: prickle
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Despo Pentara
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-02-10 00:00:00 +00:00
13
+ date: 2012-02-11 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -57,6 +57,17 @@ dependencies:
57
57
  version: 1.3.2
58
58
  type: :development
59
59
  version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: reek
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ type: :development
70
+ version_requirements: *id005
60
71
  description: A simple DSL wrapped around Capybara for matching elements using html tags.
61
72
  email: despo@extractmethod.com
62
73
  executables: []
@@ -72,9 +83,12 @@ files:
72
83
  - README.md
73
84
  - lib/prickle/capybara.rb
74
85
  - lib/prickle/capybara/click.rb
86
+ - lib/prickle/capybara/element.rb
75
87
  - lib/prickle/capybara/exceptions.rb
76
88
  - lib/prickle/capybara/find.rb
77
89
  - lib/prickle/capybara/match.rb
90
+ - lib/prickle/version.rb
91
+ - prickle.gemspec
78
92
  - prickle.png
79
93
  - spec/extended_wait_spec.rb
80
94
  - spec/finders_spec.rb