mundo-pepino 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ == 0.2.1 2010-4-16
2
+ * Two minor changes:
3
+ * Capybara extensions automagically loaded if Capybara is present
4
+ * Capybara/Webrat dependency managed at run time
5
+
1
6
  == 0.2.0 2010-3-5
2
7
 
3
8
  * Two great features by Paco Guzman (thanks Paco!!!)
@@ -6,6 +6,7 @@ README_es.markdown
6
6
  init.rb
7
7
  lib/mundo_pepino.rb
8
8
  lib/mundo_pepino/base.rb
9
+ lib/mundo_pepino/capybara/extensions.rb
9
10
  lib/mundo_pepino/config.rb
10
11
  lib/mundo_pepino/en_US.rb
11
12
  lib/mundo_pepino/en_US/definitions.rb
@@ -34,7 +34,6 @@ For other languages, before start your own implementation, it'd be nice if you:
34
34
  * **sources**: git://github.com/nando/mundo-pepino.git
35
35
  * **todo**: [github issues](http://github.com/nando/mundo-pepino/issues)
36
36
  * **list**: [google group](http://groups.google.es/group/mundo-pepino)
37
- * **build**: [run-code-run](http://runcoderun.com/nando/mundo-pepino)
38
37
  * **gem**: mundo-pepino
39
38
 
40
39
  ## Definitions
@@ -22,7 +22,6 @@ Por otro lado, cuando el idioma utilizado no es inglés es necesario evitar las
22
22
  * **fuentes**: git://github.com/nando/mundo-pepino.git
23
23
  * **cosillas**: [github issues](http://github.com/nando/mundo-pepino/issues)
24
24
  * **lista**: [google group](http://groups.google.es/group/mundo-pepino)
25
- * **ic**: [run-code-run](http://runcoderun.com/nando/mundo-pepino)
26
25
  * **gema**: mundo-pepino
27
26
 
28
27
  ## Toma de contacto
@@ -495,14 +494,13 @@ Como plugin (ver dependencias más abajo):
495
494
  script/plugin install git://github.com/nando/mundo-pepino.git
496
495
 
497
496
  ### Dependencias
498
- Si instalamos la gema junto con ella deberían quedar instaladas todas sus dependencias.
497
+ Si instalamos la gema junto con ella deberían quedar instaladas todas sus dependencias excepto Capybara y/o Webrat (ver más abajo).
499
498
 
500
499
  Si instalamos mundo-pepino como plugin debemos tener instaladas las gemas o plugins de **cucumber**, **cucumber-rails**, **webrat**, **rspec** y **rspec-rails**. Por ejemplo, para instalar todas ellas como plugins:
501
500
 
502
501
  gem install term-ansicolor treetop diff-lcs nokogiri # dependencias de Cucumber
503
502
  script/plugin install git://github.com/aslakhellesoy/cucumber.git
504
503
  script/plugin install git://github.com/aslakhellesoy/cucumber-rails.git
505
- script/plugin install git://github.com/brynary/webrat.git
506
504
  script/plugin install git://github.com/dchelimsky/rspec.git
507
505
  script/plugin install git://github.com/dchelimsky/rspec-rails.git
508
506
 
@@ -519,6 +517,11 @@ Como plugin (ver dependencias más abajo):
519
517
  * instalar el módulo ruby-locale,
520
518
  * o redefinir la función strftime para lograr dicho comportamiento.
521
519
 
520
+ #### [Capybara](http://github.com/jnicklas/capybara/) o [Webrat](http://github.com/brynary/webrat/)
521
+ Para manejar los pasos que hacen referencia a interacciones del usuario con el navegador MundoPepino depende de Capybara o Webrat. Es necesario tener instalada alguna de dichas gemas y que además el entorno de Cucumber las cargue convenientemente (tal y como hace en el `env.rb` que genera `generate cucumber`).
522
+
523
+ La gema de MundoPepino no depende directamente de ninguna de dichas gemas y maneja esta dependencia en tiempo de ejecución, quejándose cuando lanzamos los tests sin que ninguna de ellas esté cargada en el entorno.
524
+
522
525
  #### [FixtureReplacement](http://replacefixtures.rubyforge.org/)
523
526
 
524
527
  De fábrica MundoPepino utiliza ActiveRecord para incorporar a la BBDD los datos que soliciten los escenarios.
@@ -530,7 +533,7 @@ Para ello por un lado tenemos que instalar el plugin:
530
533
  script/plugin install http://thmadb.com/public_svn/plugins/fixture_replacement2/
531
534
  script/generate fixture_replacement
532
535
 
533
- ...y por otro, al final de `env.rb` (que el generador de cucumber deja dentro del directorio `features/support`) tenemos que incluir FixtureReplacement como módulo de nuestro *mundo pepino* (más sobre esto en [A Whole New World](http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world)):
536
+ ...y por otro, al final de `mundo_pepino_es_ES.rb` tenemos que incluir FixtureReplacement como módulo de nuestro *mundo pepino* (más sobre esto en [A Whole New World](http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world)):
534
537
 
535
538
  class MiMundo < MundoPepino
536
539
  include FixtureReplacement
@@ -539,7 +542,6 @@ Para ello por un lado tenemos que instalar el plugin:
539
542
  World do
540
543
  MiMundo.new
541
544
  end
542
-
543
545
  #### [FactoryGirl](http://github.com/thoughtbot/factory_girl/)
544
546
 
545
547
  Otra opción es utilizar FactoryGirl
@@ -557,7 +559,7 @@ También se debe incluir un fichero donde se definan las factories a utilizar en
557
559
 
558
560
  #### Selección de un mes en formularios
559
561
 
560
- Para los pasos que hacen referencia a la selección de un mes en una fecha la implementación actual (de Webrat) busca en nuestro HTML un mes cuyo nombre sea el devuelto por **strftime('%B')** en una instancia de Time creada a partir de la fecha facilitada. En Ruby, si no hacemos nada para remediarlo, esto es sinónimo del nombre del mes de dicha fecha en inglés.
562
+ Para los pasos que hacen referencia a la selección de un mes en una fecha la implementación actual (de Webrat y la extensión de MP para Capybara) busca en nuestro HTML un mes cuyo nombre sea el devuelto por **strftime('%B')** en una instancia de Time creada a partir de la fecha facilitada. En Ruby, si no hacemos nada para remediarlo, esto es sinónimo del nombre del mes de dicha fecha en inglés.
561
563
 
562
564
  La opción más simple para resolver este problema es redefinir `strftime` para que devuelva el nombre del mes en el locale de la aplicación. Por ejemplo:
563
565
 
@@ -11,6 +11,14 @@ require 'mundo_pepino/config'
11
11
 
12
12
  require 'string-mapper'
13
13
 
14
+ if defined?(Capybara)
15
+ require 'mundo_pepino/capybara/extensions'
16
+ else
17
+ unless defined?(Webrat)
18
+ raise "MundoPepino depends on Capybara or Webrat. Please load any of them and try again. Thanks!"
19
+ end
20
+ end
21
+
14
22
  World(MundoPepino)
15
23
 
16
24
  module MundoPepino
@@ -0,0 +1,130 @@
1
+ module Capextensions
2
+
3
+ DATE_TIME_SUFFIXES = {
4
+ :year => '1i',
5
+ :month => '2i',
6
+ :day => '3i',
7
+ :hour => '4i',
8
+ :minute => '5i'
9
+ }
10
+
11
+ def click_link_within(selector, link_text)
12
+ within(:css, selector) do
13
+ click_link link_text
14
+ end
15
+ end
16
+
17
+ def select_date(date_to_select, options={})
18
+ date = date_to_select.is_a?(Date) || date_to_select.is_a?(Time) ?
19
+ date_to_select : Date.parse(date_to_select)
20
+
21
+ if options[:id_prefix].blank?
22
+ if options[:from].blank?
23
+ source = locate(:xpath, Capybara::XPath.append("//select[contains(@id, '_#{DATE_TIME_SUFFIXES[:year]}')]"))
24
+ id_prefix = source.node.attributes["id"].value[/(.*?)_#{DATE_TIME_SUFFIXES[:year]}$/, 1]
25
+ else
26
+ msg = "cannot select option, no select box with id, name, or label '#{options[:from]}' found"
27
+ begin
28
+ label = locate(:xpath, Capybara::XPath.append("//label[text()='#{options[:from]}']"), msg)
29
+ id_prefix = label.node.attributes["for"].value
30
+ rescue Capybara::ElementNotFound
31
+ begin
32
+ previous_exception = $!
33
+ label = locate(:xpath, Capybara::XPath.append("//label[text()='#{options[:from].capitalize}']"), msg)
34
+ id_prefix = label.node.attributes["for"].value
35
+ rescue
36
+ raise "#{previous_exception}\nand\n#{$!}"
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ id_prefix ||= options[:id_prefix]
43
+
44
+ select date.year, :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:year]}"
45
+ select date.strftime('%B'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:month]}"
46
+ select date.day, :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:day]}"
47
+ end
48
+
49
+ def select_time(time_to_select, options ={})
50
+ time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
51
+
52
+ if options[:id_prefix].blank?
53
+ if options[:from].blank?
54
+ source = locate(:xpath, Capybara::XPath.append("//select[contains(@id, '_#{DATE_TIME_SUFFIXES[:hour]}')]"))
55
+ id_prefix = source.node.attributes["id"].value[/(.*?)_#{DATE_TIME_SUFFIXES[:hour]}$/, 1]
56
+ else
57
+ msg = "cannot select option, no select box with id, name, or label '#{options[:from]}' found"
58
+ begin
59
+ label = locate(:xpath, Capybara::XPath.append("//label[text()='#{options[:from]}']"), msg)
60
+ id_prefix = label.node.attributes["for"].value
61
+ rescue Capybara::ElementNotFound
62
+ begin
63
+ previous_exception = $!
64
+ label = locate(:xpath, Capybara::XPath.append("//label[text()='#{options[:from].capitalize}']"), msg)
65
+ id_prefix = label.node.attributes["for"].value
66
+ rescue
67
+ raise "#{previous_exception}\nand\n#{$!}"
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ id_prefix ||= options[:id_prefix]
74
+
75
+ select time.hour.to_s.rjust(2, '0'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:hour]}"
76
+ select time.min.to_s.rjust(2, '0'), :from => "#{id_prefix}_#{DATE_TIME_SUFFIXES[:minute]}"
77
+ end
78
+
79
+ def select_datetime(time_to_select, options={})
80
+ time = time_to_select.is_a?(Time) ? time_to_select : Time.parse(time_to_select)
81
+
82
+ if options[:from]
83
+ msg = "cannot select option, no select box with id, name, or label '#{options[:from]}' found"
84
+ begin
85
+ label = locate(:xpath, Capybara::XPath.append("//label[text()='#{options[:from]}']"), msg)
86
+ id_prefix = label.node.attributes["for"].value
87
+ rescue Capybara::ElementNotFound
88
+ begin
89
+ previous_exception = $!
90
+ label = locate(:xpath, Capybara::XPath.append("//label[text()='#{options[:from].capitalize}']"), msg)
91
+ id_prefix = label.node.attributes["for"].value
92
+ rescue
93
+ raise "#{previous_exception}\nand\n#{$!}"
94
+ end
95
+ end
96
+ end
97
+
98
+ options[:id_prefix] ||= (options[:from] ? id_prefix : nil)
99
+
100
+ select_date time, options
101
+ select_time time, options
102
+ end
103
+
104
+ # Maybe this methos should be defined in the other order, capybara is the default?
105
+ def response(*args, &block)
106
+ page(*args, &block)
107
+ end
108
+
109
+ def have_tag(*args, &block)
110
+ text = args[1]
111
+ unless text.blank?
112
+ have_css(args.first, :text => text)
113
+ else
114
+ have_css(args.first)
115
+ end
116
+ end
117
+
118
+ def have_selector(path, options = {})
119
+ # content key to text key
120
+ content = options.delete(:content)
121
+ options[:text] = content unless content.nil?
122
+ have_css(path, options)
123
+ end
124
+
125
+ def contain(content)
126
+ have_text(content)
127
+ end
128
+ end
129
+
130
+ World(Capextensions)
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  # MundoPepino's step definitions in es_ES
2
3
  # Creación simple con nombre opcional
3
4
  Dado /^(?:que tenemos )?(#{_numero_}) (?!.+ #{_cuyo_})(.+?)(?: (?:llamad[oa]s? )?['"](.+)["'])?$/i do |numero, modelo, nombre|
@@ -274,14 +275,13 @@ Entonces /^(#{_veo_o_no_}) marcad[ao] (?:la casilla|el checkbox)? ?(.+)$/ do |sh
274
275
  end
275
276
 
276
277
  Entonces /^(#{_veo_o_no_}) (?:una|la) tabla (?:(["'].+?['"]|[^ ]+) )?con (?:el|los) (?:siguientes? )?(?:valore?s?|contenidos?):$/ do |should, table_id, valores|
277
- table_id = "##{table_id.to_unquoted}" if table_id
278
+ table_id = "[@id = '#{table_id.to_unquoted}']" if table_id
278
279
  shouldified = shouldify(should)
279
- #TODO For capybara page instead response and have_css instead have_selector
280
- response.send shouldified, have_selector("table#{table_id}")
280
+ response.send shouldified, have_xpath("//table#{table_id}")
281
281
 
282
- if have_selector("table#{table_id} tbody").matches?(response)
282
+ if have_xpath("//table#{table_id}/tbody").matches?(response)
283
283
  start_row = 1
284
- tbody = "tbody"
284
+ tbody = "/tbody"
285
285
  else
286
286
  start_row = 2
287
287
  tbody = ""
@@ -289,8 +289,8 @@ Entonces /^(#{_veo_o_no_}) (?:una|la) tabla (?:(["'].+?['"]|[^ ]+) )?con (?:el|l
289
289
 
290
290
  valores.raw[1..-1].each_with_index do |row, i|
291
291
  row.each_with_index do |cell, j|
292
- response.send shouldified,
293
- have_selector("table#{table_id} #{tbody} tr:nth-child(#{i+start_row})>td:nth-child(#{j+1})") { |td|
292
+ response.send shouldified,
293
+ have_xpath("//table#{table_id}#{tbody}/tr[position() = #{i+start_row} ]/td[position() = #{j+1}]") { |td|
294
294
  td.inner_text.should =~ /#{cell == '.*' ? cell : Regexp.escape((cell||"").to_translated)}/
295
295
  }
296
296
  end
@@ -303,14 +303,14 @@ Entonces /^(#{_veo_o_no_}) un formulario con (?:el|los) (?:siguientes? )?(?:camp
303
303
  elementos.raw[1..-1].each do |row|
304
304
  label, type = row[0].to_translated, row[1]
305
305
  case type
306
- when "submit":
306
+ when "submit" then
307
307
  with_tag "input[type='submit'][value='#{label}']"
308
- when "radio":
308
+ when "radio" then
309
309
  with_tag('div') do
310
310
  with_tag "label", label
311
311
  with_tag "input[type='radio']"
312
312
  end
313
- when "select", "textarea":
313
+ when "select", "textarea" then
314
314
  field_labeled(label).element.name.should == type
315
315
  else
316
316
  field_labeled(label).element.attributes['type'].to_s.should == type
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MundoPepino
2
3
  class << self
3
4
  include Matchers::Fragments
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MundoPepino
2
3
  module Matchers
3
4
  module Fragments
@@ -2,7 +2,7 @@ module MundoPepino #:nodoc:
2
2
  class VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 0
5
+ TINY = 1
6
6
  PATCH = nil # Set to nil for official release
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mundo-pepino
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Fernando Garc\xC3\xADa Samblas"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-05 00:00:00 +01:00
12
+ date: 2010-04-16 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,16 +42,6 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: 0.3.0
44
44
  version:
45
- - !ruby/object:Gem::Dependency
46
- name: webrat
47
- type: :runtime
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: 0.7.0
54
- version:
55
45
  - !ruby/object:Gem::Dependency
56
46
  name: rspec
57
47
  type: :runtime
@@ -121,6 +111,7 @@ files:
121
111
  - init.rb
122
112
  - lib/mundo_pepino.rb
123
113
  - lib/mundo_pepino/base.rb
114
+ - lib/mundo_pepino/capybara/extensions.rb
124
115
  - lib/mundo_pepino/config.rb
125
116
  - lib/mundo_pepino/en_US.rb
126
117
  - lib/mundo_pepino/en_US/definitions.rb