rsel 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/docs/development.md +8 -3
  2. data/docs/examples.md +119 -0
  3. data/docs/history.md +9 -0
  4. data/docs/index.md +3 -1
  5. data/docs/locators.md +72 -0
  6. data/docs/scoping.md +19 -5
  7. data/docs/todo.md +4 -2
  8. data/docs/usage.md +2 -2
  9. data/lib/rsel/exceptions.rb +1 -1
  10. data/lib/rsel/selenium_test.rb +37 -132
  11. data/lib/rsel/support.rb +138 -0
  12. data/rsel.gemspec +1 -1
  13. data/spec/selenium_test_spec.rb +103 -12
  14. data/spec/spec_helper.rb +1 -10
  15. data/spec/support_spec.rb +48 -0
  16. data/test/app.rb +6 -6
  17. metadata +8 -39
  18. data/vendor/rubyslim-0.1.1/.gitignore +0 -7
  19. data/vendor/rubyslim-0.1.1/README.md +0 -159
  20. data/vendor/rubyslim-0.1.1/Rakefile +0 -21
  21. data/vendor/rubyslim-0.1.1/bin/rubyslim +0 -10
  22. data/vendor/rubyslim-0.1.1/lib/rubyslim/list_deserializer.rb +0 -69
  23. data/vendor/rubyslim-0.1.1/lib/rubyslim/list_executor.rb +0 -12
  24. data/vendor/rubyslim-0.1.1/lib/rubyslim/list_serializer.rb +0 -45
  25. data/vendor/rubyslim-0.1.1/lib/rubyslim/ruby_slim.rb +0 -61
  26. data/vendor/rubyslim-0.1.1/lib/rubyslim/slim_error.rb +0 -3
  27. data/vendor/rubyslim-0.1.1/lib/rubyslim/slim_helper_library.rb +0 -23
  28. data/vendor/rubyslim-0.1.1/lib/rubyslim/socket_service.rb +0 -53
  29. data/vendor/rubyslim-0.1.1/lib/rubyslim/statement.rb +0 -79
  30. data/vendor/rubyslim-0.1.1/lib/rubyslim/statement_executor.rb +0 -174
  31. data/vendor/rubyslim-0.1.1/lib/rubyslim/table_to_hash_converter.rb +0 -32
  32. data/vendor/rubyslim-0.1.1/lib/test_module/library_new.rb +0 -13
  33. data/vendor/rubyslim-0.1.1/lib/test_module/library_old.rb +0 -12
  34. data/vendor/rubyslim-0.1.1/lib/test_module/should_not_find_test_slim_in_here/test_slim.rb +0 -7
  35. data/vendor/rubyslim-0.1.1/lib/test_module/simple_script.rb +0 -9
  36. data/vendor/rubyslim-0.1.1/lib/test_module/test_chain.rb +0 -5
  37. data/vendor/rubyslim-0.1.1/lib/test_module/test_slim.rb +0 -86
  38. data/vendor/rubyslim-0.1.1/lib/test_module/test_slim_with_arguments.rb +0 -23
  39. data/vendor/rubyslim-0.1.1/lib/test_module/test_slim_with_no_sut.rb +0 -5
  40. data/vendor/rubyslim-0.1.1/rubyslim.gemspec +0 -22
  41. data/vendor/rubyslim-0.1.1/spec/instance_creation_spec.rb +0 -40
  42. data/vendor/rubyslim-0.1.1/spec/it8f_spec.rb +0 -8
  43. data/vendor/rubyslim-0.1.1/spec/list_deserializer_spec.rb +0 -66
  44. data/vendor/rubyslim-0.1.1/spec/list_executor_spec.rb +0 -187
  45. data/vendor/rubyslim-0.1.1/spec/list_serialzer_spec.rb +0 -38
  46. data/vendor/rubyslim-0.1.1/spec/method_invocation_spec.rb +0 -127
  47. data/vendor/rubyslim-0.1.1/spec/slim_helper_library_spec.rb +0 -80
  48. data/vendor/rubyslim-0.1.1/spec/socket_service_spec.rb +0 -98
  49. data/vendor/rubyslim-0.1.1/spec/spec_helper.rb +0 -6
  50. data/vendor/rubyslim-0.1.1/spec/statement_executor_spec.rb +0 -50
  51. data/vendor/rubyslim-0.1.1/spec/statement_spec.rb +0 -17
  52. data/vendor/rubyslim-0.1.1/spec/table_to_hash_converter_spec.rb +0 -31
@@ -0,0 +1,138 @@
1
+ #require File.join(File.dirname(__FILE__), 'exceptions')
2
+
3
+ require 'xpath'
4
+
5
+ module Rsel
6
+ # Support functions for Rsel
7
+ module Support
8
+
9
+ # Execute the given block, and return false if it raises an exception.
10
+ # Otherwise, return true.
11
+ #
12
+ # @example
13
+ # return_error_status do
14
+ # # some code that might raise an exception
15
+ # end
16
+ #
17
+ def return_error_status
18
+ begin
19
+ yield
20
+ rescue => e
21
+ #puts e.message
22
+ #puts e.backtrace
23
+ return false
24
+ else
25
+ return true
26
+ end
27
+ end
28
+
29
+ # Convert the given locator to a format accepted by Selenium. If `locator`
30
+ # starts with `id=`, `name=`, `dom=`, `xpath=` `link=` or `css=`, then the
31
+ # locator is returned unchanged. Otherwise, `locator` is assumed to be a
32
+ # plain string, and a Selenium-style `xpath=` locator is returned, matching
33
+ # HTML elements of the given kind, in the given scope. This allows you to
34
+ # use simple human-readable locator strings, or more specific
35
+ # Selenium-style locators.
36
+ #
37
+ # @param [String] locator
38
+ # A Selenium-style locator beginning with `id=`, `name=`, `dom=`,
39
+ # `xpath=`, `link=` or `css=`, or a plain text string that will
40
+ # automatically match on the `id`, `name`, label, value, or text content
41
+ # depending on the value of `kind`.
42
+ # @param [String] kind
43
+ # What kind of locator you're using (link, button, checkbox, field etc.).
44
+ # This must correspond to a method name in `XPath::HTML`. If you're using
45
+ # a raw Selenium-style `locator` string, this argument can be omitted.
46
+ # @param [Hash] scope
47
+ # Keywords to restrict the scope of matching elements. Ignored when
48
+ # a Selenium-style locator is used. See the {#xpath} documentation for
49
+ # allowed options.
50
+ #
51
+ def loc(locator, kind='', scope={})
52
+ if locator.empty?
53
+ raise ArgumentError, "locator is required."
54
+ elsif locator =~ /^(id=|name=|dom=|xpath=|link=|css=)/
55
+ return locator
56
+ else
57
+ return xpath(kind, locator, scope)
58
+ end
59
+ end
60
+
61
+
62
+ # Return a Selenium-style xpath generated by calling `XPath::HTML.<kind>`
63
+ # with the given `locator`. If `scope` options are provided, the xpath is
64
+ # modified accordingly, to match only elements in the given scope.
65
+ #
66
+ # @param [String] kind
67
+ # What kind of locator you're using (link, button, checkbox, field etc.).
68
+ # This must correspond to a method name in `XPath::HTML`.
69
+ # @param [String] locator
70
+ # Name, id, value, label or whatever other locators are accepted by
71
+ # `XPath::HTML.<kind>`
72
+ # @param [Hash] scope
73
+ # Keywords to restrict the scope of matching elements
74
+ # @option scope [String] :within
75
+ # Restrict scope to elements having this id, matching `locator` only if
76
+ # it's contained within an element with this id.
77
+ # @option scope [String] :in_row
78
+ # Restrict scope to a table row containing this text, matching `locator`
79
+ # only if that locator is in the same row as the given text.
80
+ #
81
+ # @example
82
+ # xpath('link', 'Log in')
83
+ # xpath('button', 'Submit')
84
+ # xpath('field', 'First name')
85
+ # xpath('table_row', ['First', 'Last'])
86
+ #
87
+ def xpath(kind, locator, scope={})
88
+ if !XPath::HTML.respond_to?(kind)
89
+ raise ArgumentError, "Unknown kind of locator: '#{kind}'"
90
+ end
91
+ loc_xp = XPath::HTML.send(kind, locator)
92
+ if scope[:within]
93
+ parent = XPath.descendant[XPath.attr(:id).equals(scope[:within])]
94
+ result = apply_scope(parent, loc_xp)
95
+ elsif scope[:in_row]
96
+ row = XPath.descendant(:tr)[XPath.contains(scope[:in_row])]
97
+ result = apply_scope(row, loc_xp)
98
+ else
99
+ result = loc_xp.to_s
100
+ end
101
+ return "xpath=#{result}"
102
+ end
103
+
104
+
105
+ # Restrict the scope of all XPath expressions in `inner` by prepending
106
+ # `container` to each of them, and return new union expression where
107
+ # `inner` matches only if it's a child of `container`.
108
+ #
109
+ def apply_scope(container, inner)
110
+ scoped_expressions = xpath_expressions(inner).collect do |expr|
111
+ container.child(expr)
112
+ end
113
+ return XPath::Union.new(*scoped_expressions).to_s
114
+ end
115
+
116
+
117
+ # Return an array of individual Expressions in the given XPath::Union, or
118
+ # just `[union]` if it has no sub-expressions. This is an ugly recursive
119
+ # hack, designed to allow splitting up unions into their constituents for
120
+ # the purpose of modifying them individually and re-combining them.
121
+ #
122
+ # @param [XPath::Union, XPath::Expression] union
123
+ # The xpath you want to break down into individual expressions
124
+ #
125
+ # @since 0.0.3
126
+ #
127
+ def xpath_expressions(union)
128
+ if union.respond_to?(:expressions)
129
+ return union.expressions.collect do |expr|
130
+ xpath_expressions(expr)
131
+ end.flatten
132
+ else
133
+ return [union]
134
+ end
135
+ end
136
+ end
137
+ end
138
+
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "rsel"
3
- s.version = "0.0.4"
3
+ s.version = "0.0.5"
4
4
  s.summary = "Runs Selenium tests from FitNesse"
5
5
  s.description = <<-EOS
6
6
  Rsel provides a Slim fixture for running Selenium tests, with
@@ -1,6 +1,15 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
2
 
3
3
  describe Rsel::SeleniumTest do
4
+ before(:all) do
5
+ @st = Rsel::SeleniumTest.new('http://localhost:8070/')
6
+ @st.open_browser
7
+ end
8
+
9
+ after(:all) do
10
+ @st.close_browser
11
+ end
12
+
4
13
  context "initialization" do
5
14
  before(:each) do
6
15
  @st.visit("/")
@@ -37,6 +46,18 @@ describe Rsel::SeleniumTest do
37
46
  @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
38
47
  end
39
48
  end
49
+
50
+ context "checkbox with id=" do
51
+ it "exists" do
52
+ @st.enable_checkbox("id=like_cheese").should be_true
53
+ end
54
+ end
55
+
56
+ context "checkbox with xpath=" do
57
+ it "exists" do
58
+ @st.enable_checkbox("xpath=//input[@id='like_cheese']").should be_true
59
+ end
60
+ end
40
61
  end
41
62
 
42
63
  context "fails when" do
@@ -77,6 +98,18 @@ describe Rsel::SeleniumTest do
77
98
  @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
78
99
  end
79
100
  end
101
+
102
+ context "checkbox with id=" do
103
+ it "exists" do
104
+ @st.disable_checkbox("id=like_cheese").should be_true
105
+ end
106
+ end
107
+
108
+ context "checkbox with xpath=" do
109
+ it "exists" do
110
+ @st.disable_checkbox("xpath=//input[@id='like_cheese']").should be_true
111
+ end
112
+ end
80
113
  end
81
114
 
82
115
  context "fails when" do
@@ -338,18 +371,33 @@ describe Rsel::SeleniumTest do
338
371
  context "#dropdown_equals" do
339
372
  context "passes when" do
340
373
  it "option is selected in the dropdown" do
341
- @st.select_from_dropdown("Short", "Height")
342
- @st.dropdown_equals("Height", "Short").should be_true
374
+ ["Short", "Average", "Tall"].each do |height|
375
+ @st.select_from_dropdown(height, "Height")
376
+ @st.dropdown_equals("Height", height).should be_true
377
+ end
378
+ end
343
379
 
344
- @st.select_from_dropdown("Average", "Height")
345
- @st.dropdown_equals("Height", "Average").should be_true
380
+ it "option is selected in the dropdown, within scope" do
381
+ ["Short", "Average", "Tall"].each do |height|
382
+ @st.select_from_dropdown(height, "Height", :within => "spouse_form")
383
+ @st.dropdown_equals("Height", height, :within => "spouse_form").should be_true
384
+ end
385
+ end
346
386
 
347
- @st.select_from_dropdown("Tall", "Height")
348
- @st.dropdown_equals("Height", "Tall").should be_true
387
+ it "option is selected in the dropdown, in table row" do
388
+ @st.visit("/table")
389
+ ["Male", "Female"].each do |gender|
390
+ @st.select_from_dropdown(gender, "Gender", :in_row => "Eric")
391
+ @st.dropdown_equals("Gender", gender, :in_row => "Eric")
392
+ end
349
393
  end
350
394
  end
351
395
 
352
396
  context "fails when" do
397
+ it "no such dropdown exists" do
398
+ @st.dropdown_equals("Eggs", "Over easy").should be_false
399
+ end
400
+
353
401
  it "dropdown exists, but the option is not selected" do
354
402
  @st.select_from_dropdown("Short", "Height")
355
403
  @st.dropdown_equals("Height", "Average").should be_false
@@ -364,8 +412,17 @@ describe Rsel::SeleniumTest do
364
412
  @st.dropdown_equals("Height", "Average").should be_false
365
413
  end
366
414
 
367
- it "no such dropdown exists" do
368
- @st.dropdown_equals("Eggs", "Over easy").should be_false
415
+ it "dropdown exists, and option is selected, but not in scope" do
416
+ @st.select_from_dropdown("Tall", "Height", :within => "person_form")
417
+ @st.select_from_dropdown("Short", "Height", :within => "spouse_form")
418
+ @st.dropdown_equals("Height", "Tall", :within => "spouse_form").should be_false
419
+ end
420
+
421
+ it "dropdown exists, and option is selected, but not in table row" do
422
+ @st.visit("/table")
423
+ @st.select_from_dropdown("Female", "Gender", :in_row => "Eric")
424
+ @st.select_from_dropdown("Male", "Gender", :in_row => "Marcus")
425
+ @st.dropdown_equals("Gender", "Female", :in_row => "Marcus").should be_false
369
426
  end
370
427
  end
371
428
  end
@@ -604,13 +661,26 @@ describe Rsel::SeleniumTest do
604
661
  end
605
662
 
606
663
  it "field exists, but not within scope" do
607
- @st.type_into_field("Long story", "Life story", :within => 'spouse_form').should be_false
664
+ @st.type_into_field("Long story", "Life story",
665
+ :within => 'spouse_form').should be_false
608
666
  end
609
667
  end
610
668
  end
611
669
 
612
670
  describe "#field_contains" do
613
671
  context "passes when" do
672
+ context "text field with label" do
673
+ it "equals the text" do
674
+ @st.fill_in_with("First name", "Marcus")
675
+ @st.field_contains("First name", "Marcus").should be_true
676
+ end
677
+
678
+ it "contains the text" do
679
+ @st.fill_in_with("First name", "Marcus")
680
+ @st.field_contains("First name", "Marc").should be_true
681
+ end
682
+ end
683
+
614
684
  context "textarea with label" do
615
685
  it "contains the text" do
616
686
  @st.fill_in_with("Life story", "Blah dee blah")
@@ -620,6 +690,13 @@ describe Rsel::SeleniumTest do
620
690
  end
621
691
 
622
692
  context "fails when" do
693
+ context "text field with label" do
694
+ it "does not contain the text" do
695
+ @st.fill_in_with("First name", "Marcus")
696
+ @st.field_contains("First name", "Eric").should be_false
697
+ end
698
+ end
699
+
623
700
  context "textarea with label" do
624
701
  it "does not contain the text" do
625
702
  @st.fill_in_with("Life story", "Blah dee blah")
@@ -632,7 +709,15 @@ describe Rsel::SeleniumTest do
632
709
  describe "#field_equals" do
633
710
  context "passes when" do
634
711
  context "text field with label" do
635
- # TODO
712
+ it "equals the text" do
713
+ @st.fill_in_with("First name", "Ken")
714
+ @st.field_equals("First name", "Ken").should be_true
715
+ end
716
+
717
+ it "equals the text, and is within scope" do
718
+ @st.fill_in_with("First name", "Eric", :within => "person_form")
719
+ @st.field_equals("First name", "Eric", :within => "person_form")
720
+ end
636
721
  end
637
722
 
638
723
  context "textarea with label" do
@@ -642,7 +727,10 @@ describe Rsel::SeleniumTest do
642
727
  end
643
728
 
644
729
  it "equals the text, and is within scope" do
645
- # TODO
730
+ @st.fill_in_with("Life story", "Blah dee blah",
731
+ :within => "person_form")
732
+ @st.field_equals("Life story", "Blah dee blah",
733
+ :within => "person_form").should be_true
646
734
  end
647
735
 
648
736
  it "equals the text, and is in table row" do
@@ -653,7 +741,10 @@ describe Rsel::SeleniumTest do
653
741
 
654
742
  context "fails when" do
655
743
  context "text field with label" do
656
- # TODO
744
+ it "does not exactly equal the text" do
745
+ @st.fill_in_with("First name", "Marcus")
746
+ @st.field_equals("First name", "Marc").should be_false
747
+ end
657
748
  end
658
749
 
659
750
  context "textarea with label" do
@@ -6,16 +6,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test', 'app'))
6
6
 
7
7
  RSpec.configure do |config|
8
8
  config.include Rsel
9
-
10
- config.before(:all) do
11
- @st = Rsel::SeleniumTest.new('http://localhost:8070/')
12
- @st.open_browser
13
- end
14
-
15
- config.after(:all) do
16
- @st.close_browser
17
- end
18
-
9
+ config.include Rsel::Support
19
10
  end
20
11
 
21
12
 
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
+
3
+ describe Rsel::Support do
4
+ describe "#loc" do
5
+ it "returns Selenium-style locators unchanged" do
6
+ locators = [
7
+ "id=foo_bar",
8
+ "name=foo_bar",
9
+ "xpath=//input[@id='foo_bar']",
10
+ "css=div#foo_bar",
11
+ ]
12
+ locators.each do |locator|
13
+ loc(locator).should == locator
14
+ end
15
+ end
16
+
17
+ it "returns Rsel-style locators as Selenium xpaths" do
18
+ locators = [
19
+ "First name",
20
+ "first_name",
21
+ ]
22
+ locators.each do |locator|
23
+ loc(locator, 'field').should =~ /^xpath=/
24
+ end
25
+ end
26
+
27
+ it "requires a non-empty locator" do
28
+ lambda do
29
+ loc('')
30
+ end.should raise_error
31
+ end
32
+
33
+ it "requires element kind for Rsel-style locators" do
34
+ lambda do
35
+ loc('foo')
36
+ end.should raise_error
37
+ end
38
+ end
39
+
40
+ describe "#xpath" do
41
+ it "requires a valid kind" do
42
+ lambda do
43
+ xpath('junk', 'hello')
44
+ end.should raise_error
45
+ end
46
+ end
47
+ end
48
+
@@ -14,12 +14,12 @@ class TestApp < Sinatra::Base
14
14
  end
15
15
 
16
16
  get '/:view' do |view|
17
- erb view.to_sym
18
- end
19
-
20
- # Allow shutting down the app with a request
21
- get '/shutdown' do
22
- Process.kill('KILL', Process.pid)
17
+ # Allow shutting down the app with a request
18
+ if view == 'shutdown'
19
+ Process.kill('KILL', Process.pid)
20
+ else
21
+ erb view.to_sym
22
+ end
23
23
  end
24
24
  end
25
25
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsel
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Marcus French
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-07-25 00:00:00 -06:00
20
+ date: 2011-07-31 00:00:00 -06:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -155,18 +155,22 @@ files:
155
155
  - Rakefile
156
156
  - docs/custom.md
157
157
  - docs/development.md
158
+ - docs/examples.md
158
159
  - docs/history.md
159
160
  - docs/index.md
160
161
  - docs/install.md
162
+ - docs/locators.md
161
163
  - docs/scoping.md
162
164
  - docs/todo.md
163
165
  - docs/usage.md
164
166
  - lib/rsel.rb
165
167
  - lib/rsel/exceptions.rb
166
168
  - lib/rsel/selenium_test.rb
169
+ - lib/rsel/support.rb
167
170
  - rsel.gemspec
168
171
  - spec/selenium_test_spec.rb
169
172
  - spec/spec_helper.rb
173
+ - spec/support_spec.rb
170
174
  - test/app.rb
171
175
  - test/config.ru
172
176
  - test/views/about.erb
@@ -177,41 +181,6 @@ files:
177
181
  - test/views/index.erb
178
182
  - test/views/table.erb
179
183
  - test/views/thanks.erb
180
- - vendor/rubyslim-0.1.1/.gitignore
181
- - vendor/rubyslim-0.1.1/README.md
182
- - vendor/rubyslim-0.1.1/Rakefile
183
- - vendor/rubyslim-0.1.1/bin/rubyslim
184
- - vendor/rubyslim-0.1.1/lib/rubyslim/list_deserializer.rb
185
- - vendor/rubyslim-0.1.1/lib/rubyslim/list_executor.rb
186
- - vendor/rubyslim-0.1.1/lib/rubyslim/list_serializer.rb
187
- - vendor/rubyslim-0.1.1/lib/rubyslim/ruby_slim.rb
188
- - vendor/rubyslim-0.1.1/lib/rubyslim/slim_error.rb
189
- - vendor/rubyslim-0.1.1/lib/rubyslim/slim_helper_library.rb
190
- - vendor/rubyslim-0.1.1/lib/rubyslim/socket_service.rb
191
- - vendor/rubyslim-0.1.1/lib/rubyslim/statement.rb
192
- - vendor/rubyslim-0.1.1/lib/rubyslim/statement_executor.rb
193
- - vendor/rubyslim-0.1.1/lib/rubyslim/table_to_hash_converter.rb
194
- - vendor/rubyslim-0.1.1/lib/test_module/library_new.rb
195
- - vendor/rubyslim-0.1.1/lib/test_module/library_old.rb
196
- - vendor/rubyslim-0.1.1/lib/test_module/should_not_find_test_slim_in_here/test_slim.rb
197
- - vendor/rubyslim-0.1.1/lib/test_module/simple_script.rb
198
- - vendor/rubyslim-0.1.1/lib/test_module/test_chain.rb
199
- - vendor/rubyslim-0.1.1/lib/test_module/test_slim.rb
200
- - vendor/rubyslim-0.1.1/lib/test_module/test_slim_with_arguments.rb
201
- - vendor/rubyslim-0.1.1/lib/test_module/test_slim_with_no_sut.rb
202
- - vendor/rubyslim-0.1.1/rubyslim.gemspec
203
- - vendor/rubyslim-0.1.1/spec/instance_creation_spec.rb
204
- - vendor/rubyslim-0.1.1/spec/it8f_spec.rb
205
- - vendor/rubyslim-0.1.1/spec/list_deserializer_spec.rb
206
- - vendor/rubyslim-0.1.1/spec/list_executor_spec.rb
207
- - vendor/rubyslim-0.1.1/spec/list_serialzer_spec.rb
208
- - vendor/rubyslim-0.1.1/spec/method_invocation_spec.rb
209
- - vendor/rubyslim-0.1.1/spec/slim_helper_library_spec.rb
210
- - vendor/rubyslim-0.1.1/spec/socket_service_spec.rb
211
- - vendor/rubyslim-0.1.1/spec/spec_helper.rb
212
- - vendor/rubyslim-0.1.1/spec/statement_executor_spec.rb
213
- - vendor/rubyslim-0.1.1/spec/statement_spec.rb
214
- - vendor/rubyslim-0.1.1/spec/table_to_hash_converter_spec.rb
215
184
  has_rdoc: true
216
185
  homepage: http://github.com/a-e/rsel
217
186
  licenses: []