bewildr 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ require 'cucumber/rake/task'
10
10
 
11
11
  spec = Gem::Specification.new do |s|
12
12
  s.name = 'bewildr'
13
- s.version = '0.1.6'
13
+ s.version = '0.1.7'
14
14
  s.has_rdoc = true
15
15
  s.extra_rdoc_files = ['README.rdoc', 'LICENSE']
16
16
  s.summary = 'Test WPF UI apps with IronRuby'
data/lib/bewildr.rb CHANGED
@@ -19,6 +19,9 @@ CLICKR = Bewildr::Clickr::Clickr.new
19
19
  #load plain old ruby libraries
20
20
  require 'timeout'
21
21
 
22
+ #require ruby extensions
23
+ require 'bewildr/ext/extensions'
24
+
22
25
  #require bewildr classes
23
26
  require 'bewildr/exceptions'
24
27
  require 'bewildr/bewildr_helpers'
@@ -29,7 +32,6 @@ require 'bewildr/windows'
29
32
  require 'bewildr/element'
30
33
 
31
34
  require 'bewildr/control_patterns/window_pattern'
32
- require 'bewildr/control_patterns/invoke_pattern'
33
35
  require 'bewildr/control_patterns/value_pattern'
34
36
  require 'bewildr/control_patterns/toggle_pattern'
35
37
  require 'bewildr/control_patterns/selection_pattern'
@@ -63,8 +63,12 @@ module Bewildr
63
63
  Bewildr::Application.new(System::Diagnostics::Process.start(process_name))
64
64
  end
65
65
 
66
- def self.start_with_settings(settings_hash)
67
- #TODO
66
+ def self.start_with_settings(path_to_exe, settings_hash)
67
+ start_info = System::Diagnostics::ProcessStartInfo.new(path_to_exe)
68
+ unless settings_hash[:args].nil? and settings_hash[:args].size > 0
69
+ start_info.arguments = settings_hash[:args].collect {|arg| arg.to_s}.join(" ")
70
+ end
71
+ Bewildr::Application.new(System::Diagnostics::Process.start(start_info))
68
72
  end
69
73
 
70
74
  def self.attach_to_process_name(process_name)
@@ -1,11 +1,11 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- module ControlPatterns
5
- module InvokePattern
6
- def click
7
- @automation_element.get_current_pattern(System::Windows::Automation::InvokePattern.pattern).invoke
8
- end
9
- end
10
- end
11
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ #module Bewildr
4
+ # module ControlPatterns
5
+ # module InvokePattern
6
+ # def click
7
+ # @automation_element.get_current_pattern(System::Windows::Automation::InvokePattern.pattern).invoke
8
+ # end
9
+ # end
10
+ # end
11
+ #end
@@ -4,10 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module ComboBoxAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::SelectionPattern
9
- base.extend Bewildr::ControlPatterns::SelectionItemPattern
10
-
11
7
  base.instance_eval do
12
8
  def items
13
9
  my_list_items = list_items
@@ -4,9 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module DataGridAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::GridPattern
8
- base.extend Bewildr::ControlPatterns::TablePattern
9
-
10
7
  base.instance_eval do
11
8
  def cell(row, column)
12
9
  get_item(row, column)
@@ -4,18 +4,28 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module DocumentAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::TextPattern
8
-
9
7
  base.instance_eval do
8
+
9
+ def clean_string(input)
10
+ #add special chars as necessary. Ref: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx
11
+ replacements = {
12
+ /\n/ => "{ENTER}"
13
+ }
14
+ cleaned_string = input
15
+ replacements.keys.each {|key| cleaned_string.gsub!(key, replacements[key])}
16
+ cleaned_string
17
+ end
18
+
10
19
  def text
11
20
  get_text
12
21
  end
13
22
 
14
23
  def text=(input)
24
+ cleaned_string = clean_string(input)
15
25
  focus
16
26
  select_all
17
27
  System::Windows::Forms::SendKeys.send_wait("{DEL}")
18
- System::Windows::Forms::SendKeys.send_wait(input)
28
+ System::Windows::Forms::SendKeys.send_wait(cleaned_string)
19
29
  end
20
30
  end
21
31
  end
@@ -4,8 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module ListAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::SelectionPattern
8
-
9
7
  base.instance_eval do
10
8
  def select(input)
11
9
  selectable_elements = get(:type => :list_item, :scope => :children, :how_many => :all)
@@ -4,10 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module MenuAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::SelectionPattern
9
- base.extend Bewildr::ControlPatterns::SelectionItemPattern
10
-
11
7
  base.instance_eval do
12
8
  def root_menu_items
13
9
  get(:type => :menu_item, :scope => :children, :how_many => :all)
@@ -1,18 +1,20 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- module ControlTypeAdditions
5
- module MenuItemAdditions
6
- def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::InvokePattern
9
-
10
- base.instance_eval do
11
- def sub_menus
12
- get(:type => :menu_item, :scope => :children, :how_many => :all)
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ module Bewildr
4
+ module ControlTypeAdditions
5
+ module MenuItemAdditions
6
+ def self.extended(base)
7
+ base.instance_eval do
8
+ def sub_menus
9
+ get(:type => :menu_item, :scope => :children, :how_many => :all)
10
+ end
11
+
12
+ #menu items like 'invoke', not a proper mouse click
13
+ def click
14
+ @automation_element.get_current_pattern(System::Windows::Automation::InvokePattern.pattern).invoke
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -4,8 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module ScrollAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ScrollPattern
8
-
9
7
  base.instance_eval do
10
8
 
11
9
  #required because when a list is displayed, UI Automation only knows
@@ -4,8 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TabAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::SelectionPattern
8
-
9
7
  base.instance_eval do
10
8
  def select(input)
11
9
  raise Bewildr::NoSuchTab unless tab_names.include?(input)
@@ -4,9 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TreeAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::SelectionPattern
9
-
10
7
  base.instance_eval do
11
8
  def root_nodes
12
9
  prepare_element
@@ -4,9 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TreeItemAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::SelectionItemPattern
9
-
10
7
  base.instance_eval do
11
8
  def child_nodes
12
9
  get(:type => :tree_item, :scope => :children)
@@ -4,8 +4,6 @@ module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module WindowAdditions
6
6
  def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::WindowPattern
8
-
9
7
  base.instance_eval do
10
8
  def open?
11
9
  exists?
@@ -1,225 +1,197 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- class Element
5
- attr_reader :automation_element
6
- attr_reader :control_type
7
-
8
- def initialize(input)
9
- @automation_element = input
10
- case input
11
- when System::Windows::Automation::AutomationElement
12
- set_control_type
13
- build_element
14
- when nil then @control_type = :non_existent
15
- else raise Bewildr::BewildrInternalError, "Can only initialize an element with a nil or a Sys::Win::Auto::AE[C], not a #{input.class}"
16
- end
17
- end
18
-
19
- def name
20
- existence_check
21
- @automation_element.current.name.to_s
22
- end
23
-
24
- def automation_id
25
- existence_check
26
- @automation_element.current.automation_id.to_s
27
- end
28
-
29
- def exists?
30
- return false if @control_type == :non_existent
31
- begin
32
- @automation_element.current.bounding_rectangle
33
- return true
34
- rescue System::Windows::Automation::ElementNotAvailableException, TypeError => e
35
- return false
36
- end
37
- end
38
- alias :exist? :exists?
39
-
40
- def contains?(condition_hash)
41
- get(condition_hash).exists?
42
- end
43
- alias :contain? :contains?
44
-
45
- def existence_check
46
- raise Bewildr::ElementDoesntExist unless exists?
47
- end
48
- private :existence_check
49
-
50
- def enabled?
51
- existence_check
52
- @automation_element.current.is_enabled
53
- end
54
-
55
- def wait_for_existence_of(condition_hash)
56
- Timeout.timeout(30) do
57
- sleep 0.1 until contains?(condition_hash)
58
- end
59
- get(condition_hash)
60
- end
61
-
62
- def wait_for_non_existence_of(condition_hash)
63
- Timeout.timeout(30) do
64
- sleep 0.1 unless contains?(condition_hash)
65
- end
66
- end
67
-
68
- def focus
69
- @automation_element.set_focus
70
- end
71
-
72
- def scrollable?
73
- return false unless @automation_element.get_supported_patterns.collect {|pattern| pattern.programmatic_name.to_s }.include?("ScrollPatternIdentifiers.Pattern")
74
- vertically_scrollable
75
- end
76
-
77
- def prepare_element
78
- load_all_items_hack if scrollable?
79
- end
80
-
81
- #:id => "id"
82
- #:name => "bob"
83
- #:type => :button
84
- #:scope => :children / :descendants
85
- #:how_many => :first / :all
86
- def get(condition_hash)
87
- existence_check
88
- condition = Finder.condition_for(condition_hash)
89
- scope = Finder.scope_for(condition_hash)
90
- how_many = Finder.how_many_for(condition_hash)
91
-
92
- result = @automation_element.send how_many, scope, condition
93
- case result
94
- when System::Windows::Automation::AutomationElement, nil then return Bewildr::Element.new(result)
95
- when System::Windows::Automation::AutomationElementCollection
96
- c_array_list = System::Collections::ArrayList.new(result)
97
- element_array = c_array_list.to_array.to_a
98
- case
99
- when element_array.size == 0 then return Bewildr::Element.new(nil)
100
- #when element_array.size == 1 then return Bewildr::Element.new(element_array.first)
101
- when element_array.size > 0 then return element_array.collect {|element| Bewildr::Element.new(element) }
102
- end
103
- end
104
- end
105
-
106
- #add "children/child" and "descendants/descendant" methods
107
-
108
- def children
109
- get({:scope => :children}).collect {|element| Bewildr::Element.new(element)}
110
- end
111
-
112
- def click
113
- CLICKR.click(clickable_point)
114
- end
115
-
116
- def double_click
117
- CLICKR.double_click(clickable_point)
118
- end
119
-
120
- def right_click
121
- CLICKR.right_click(clickable_point)
122
- end
123
-
124
- def clickable_point
125
- existence_check
126
- Timeout.timeout(30) do
127
- current_clickable_point = nil
128
- begin
129
- current_clickable_point = @automation_element.get_clickable_point
130
- rescue System::Windows::Automation::NoClickablePointException
131
- retry
132
- end
133
- return current_clickable_point
134
- end
135
- end
136
-
137
- private
138
-
139
- def set_control_type
140
- @control_type = Bewildr::ControlType.symbol_for_enum(@automation_element.current.control_type)
141
- end
142
-
143
- #list of control types comes from http://msdn.microsoft.com/en-us/library/ms750574.aspx
144
- def build_element
145
- case @control_type
146
- when :button
147
- when :calendar
148
- when :check_box
149
- extend Bewildr::ControlPatterns::TogglePattern
150
- when :combo_box
151
- extend Bewildr::ControlTypeAdditions::ComboBoxAdditions
152
- when :custom
153
- build_custom_control_type
154
- when :data_grid
155
- extend Bewildr::ControlTypeAdditions::DataGridAdditions
156
- when :data_item
157
- when :document
158
- extend Bewildr::ControlTypeAdditions::DocumentAdditions
159
- when :edit
160
- extend Bewildr::ControlPatterns::ValuePattern
161
- when :group
162
- when :header
163
- when :header_item
164
- when :hyperlink
165
- extend Bewildr::ControlTypeAdditions::TextAdditions
166
- when :image
167
- when :list
168
- extend Bewildr::ControlTypeAdditions::ListAdditions
169
- when :list_item
170
- extend Bewildr::ControlPatterns::SelectionItemPattern
171
- when :menu
172
- extend Bewildr::ControlTypeAdditions::MenuAdditions
173
- when :menu_bar
174
- when :menu_item
175
- extend Bewildr::ControlTypeAdditions::MenuItemAdditions
176
- when :pane
177
- when :progress_bar
178
- extend Bewildr::ControlPatterns::RangeValuePattern
179
- when :radio_button
180
- extend Bewildr::ControlPatterns::SelectionItemPattern
181
- when :scroll_bar
182
- when :seperator
183
- when :slider
184
- extend Bewildr::ControlPatterns::RangeValuePattern
185
- when :spinner
186
- when :split_button
187
- when :status_bar
188
- when :tab
189
- extend Bewildr::ControlTypeAdditions::TabAdditions
190
- when :tab_item
191
- extend Bewildr::ControlPatterns::SelectionItemPattern
192
- when :table
193
- when :text
194
- extend Bewildr::ControlTypeAdditions::TextAdditions
195
- when :thumb
196
- when :title_bar
197
- when :tool_bar
198
- when :tool_tip
199
- when :tree
200
- extend Bewildr::ControlTypeAdditions::TreeAdditions
201
- when :tree_item
202
- extend Bewildr::ControlTypeAdditions::TreeItemAdditions
203
- when :window
204
- extend Bewildr::ControlTypeAdditions::WindowAdditions
205
- end
206
-
207
- #add scrolling capability if relevant - TODO: this ugliness will be fixed later
208
- if @automation_element.get_supported_patterns.collect {|pattern| pattern.programmatic_name.to_s }.include?("ScrollPatternIdentifiers.Pattern")
209
- extend Bewildr::ControlTypeAdditions::ScrollAdditions
210
- end
211
- end
212
-
213
- #TODO: replace build_element to use something similar to what's below, but
214
- #make it smarter
215
-
216
- def build_custom_control_type
217
- @automation_element.get_supported_patterns.each do |supported_pattern|
218
- case supported_pattern.programmatic_name.to_s
219
- when "ValuePatternIdentifiers.Pattern" then extend Bewildr::ControlPatterns::ValuePattern
220
- when "TableItemPatternIdentifiers.Pattern" then extend Bewildr::ControlPatterns::TableItemPattern
221
- end
222
- end
223
- end
224
- end
225
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ module Bewildr
4
+ class Element
5
+ attr_reader :automation_element
6
+ attr_reader :control_type
7
+
8
+ def initialize(input)
9
+ @automation_element = input
10
+ case input
11
+ when System::Windows::Automation::AutomationElement
12
+ set_control_type
13
+ build_element
14
+ include_additions
15
+ when nil then @control_type = :non_existent
16
+ else raise Bewildr::BewildrInternalError, "Can only initialize an element with a nil or a Sys::Win::Auto::AE[C], not a #{input.class}"
17
+ end
18
+ end
19
+
20
+ def name
21
+ existence_check
22
+ @automation_element.current.name.to_s
23
+ end
24
+
25
+ def automation_id
26
+ existence_check
27
+ @automation_element.current.automation_id.to_s
28
+ end
29
+
30
+ def exists?
31
+ return false if @control_type == :non_existent
32
+ begin
33
+ @automation_element.current.bounding_rectangle
34
+ return true
35
+ rescue System::Windows::Automation::ElementNotAvailableException, TypeError => e
36
+ return false
37
+ end
38
+ end
39
+ alias :exist? :exists?
40
+
41
+ def contains?(condition_hash)
42
+ get(condition_hash).exists?
43
+ end
44
+ alias :contain? :contains?
45
+
46
+ def enabled?
47
+ existence_check
48
+ @automation_element.current.is_enabled
49
+ end
50
+
51
+ def wait_for_existence_of(condition_hash)
52
+ Timeout.timeout(30) do
53
+ sleep 0.1 until contains?(condition_hash)
54
+ end
55
+ get(condition_hash)
56
+ end
57
+
58
+ def wait_for_non_existence_of(condition_hash)
59
+ Timeout.timeout(30) do
60
+ sleep 0.1 unless contains?(condition_hash)
61
+ end
62
+ end
63
+
64
+ def focus
65
+ @automation_element.set_focus
66
+ end
67
+
68
+ def scrollable?
69
+ return false unless @automation_element.get_supported_patterns.collect {|pattern| pattern.programmatic_name.to_s }.include?("ScrollPatternIdentifiers.Pattern")
70
+ vertically_scrollable
71
+ end
72
+
73
+ #:id => "id"
74
+ #:name => "bob"
75
+ #:type => :button
76
+ #:scope => :children / :descendants
77
+ #:how_many => :first / :all
78
+ def get(condition_hash)
79
+ existence_check
80
+ condition = Finder.condition_for(condition_hash)
81
+ scope = Finder.scope_for(condition_hash)
82
+ how_many = Finder.how_many_for(condition_hash)
83
+
84
+ result = @automation_element.send how_many, scope, condition
85
+ case result
86
+ when System::Windows::Automation::AutomationElement, nil then return Bewildr::Element.new(result)
87
+ when System::Windows::Automation::AutomationElementCollection
88
+ c_array_list = System::Collections::ArrayList.new(result)
89
+ element_array = c_array_list.to_array.to_a
90
+ case
91
+ when element_array.size == 0 then return Bewildr::Element.new(nil)
92
+ when element_array.size > 0 then return element_array.collect {|element| Bewildr::Element.new(element) }
93
+ end
94
+ end
95
+ end
96
+
97
+ #add "children/child" and "descendants/descendant" methods
98
+
99
+ def root?
100
+ @automation_element == System::Windows::Automation::AutomationElement.root_element
101
+ end
102
+
103
+ def parent
104
+ return nil if root?
105
+ walker = System::Windows::Automation::TreeWalker.RawViewWalker
106
+ potential_parent = walker.get_parent(@automation_element)
107
+ Bewildr::Element.new(potential_parent)
108
+ end
109
+
110
+ def has_children?
111
+ walker = System::Windows::Automation::TreeWalker.RawViewWalker
112
+ !walker.get_first_child(@automation_element).nil?
113
+ end
114
+
115
+ def children
116
+ return [] unless has_children?
117
+ walker = System::Windows::Automation::TreeWalker.ControlViewWalker #RawViewWalker
118
+ bewildred_children = []
119
+ child = walker.get_first_child(@automation_element)
120
+ while !child.nil? do
121
+ bewildred_children << Bewildr::Element.new(child)
122
+ child = walker.get_next_sibling(child)
123
+ end
124
+ bewildred_children
125
+ end
126
+
127
+ def click
128
+ CLICKR.click(clickable_point)
129
+ end
130
+
131
+ def double_click
132
+ CLICKR.double_click(clickable_point)
133
+ end
134
+
135
+ def right_click
136
+ CLICKR.right_click(clickable_point)
137
+ end
138
+
139
+ private
140
+
141
+ def existence_check
142
+ raise Bewildr::ElementDoesntExist unless exists?
143
+ end
144
+
145
+ def clickable_point
146
+ existence_check
147
+ Timeout.timeout(30) do
148
+ current_clickable_point = nil
149
+ begin
150
+ current_clickable_point = @automation_element.get_clickable_point
151
+ rescue System::Windows::Automation::NoClickablePointException
152
+ retry
153
+ end
154
+ return current_clickable_point
155
+ end
156
+ end
157
+
158
+ def prepare_element
159
+ load_all_items_hack if scrollable?
160
+ end
161
+
162
+ def set_control_type
163
+ @control_type = Bewildr::ControlType.symbol_for_enum(@automation_element.current.control_type)
164
+ end
165
+
166
+ def build_element
167
+ @automation_element.get_supported_patterns.each do |pattern|
168
+ pattern_name = pattern.programmatic_name.to_s.gsub(/Identifiers\.Pattern/, "")
169
+ potential_pattern = Bewildr::ControlPatterns.submodules.select {|mod| mod.name =~ /#{pattern_name}$/}.first
170
+ extend(potential_pattern) unless potential_pattern.nil?
171
+ end
172
+ end
173
+
174
+ #list of control types comes from http://msdn.microsoft.com/en-us/library/ms750574.aspx
175
+ def include_additions
176
+ case @control_type
177
+ when :combo_box then extend Bewildr::ControlTypeAdditions::ComboBoxAdditions
178
+ when :data_grid then extend Bewildr::ControlTypeAdditions::DataGridAdditions
179
+ when :document then extend Bewildr::ControlTypeAdditions::DocumentAdditions
180
+ when :hyperlink then extend Bewildr::ControlTypeAdditions::TextAdditions
181
+ when :list then extend Bewildr::ControlTypeAdditions::ListAdditions
182
+ when :menu then extend Bewildr::ControlTypeAdditions::MenuAdditions
183
+ when :menu_item then extend Bewildr::ControlTypeAdditions::MenuItemAdditions
184
+ when :tab then extend Bewildr::ControlTypeAdditions::TabAdditions
185
+ when :text then extend Bewildr::ControlTypeAdditions::TextAdditions
186
+ when :tree then extend Bewildr::ControlTypeAdditions::TreeAdditions
187
+ when :tree_item then extend Bewildr::ControlTypeAdditions::TreeItemAdditions
188
+ when :window then extend Bewildr::ControlTypeAdditions::WindowAdditions
189
+ end
190
+
191
+ #add scrolling capability if relevant - TODO: this ugliness will be fixed later
192
+ if @automation_element.get_supported_patterns.collect {|pattern| pattern.programmatic_name.to_s }.include?("ScrollPatternIdentifiers.Pattern")
193
+ extend Bewildr::ControlTypeAdditions::ScrollAdditions
194
+ end
195
+ end
196
+ end
197
+ end
Binary file
@@ -0,0 +1,10 @@
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ #the following taken from: http://www.natontesting.com/2010/06/30/how-to-get-the-submodules-of-a-ruby-module/
4
+
5
+ #adds the submodules method to modules - returns a list of submodules in the module's namespace
6
+ class Module
7
+ def submodules
8
+ constants.collect {|const_name| const_get(const_name)}.select {|const| const.class == Module}
9
+ end
10
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bewildr
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
  - 1
9
- - 6
10
- version: 0.1.6
9
+ - 7
10
+ version: 0.1.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nat Ritmeyer
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-20 00:00:00 +01:00
18
+ date: 2010-11-27 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -63,6 +63,7 @@ files:
63
63
  - lib/bewildr/element.rb
64
64
  - lib/bewildr/exceptions.rb
65
65
  - lib/bewildr/ext/BewildrClickr.dll
66
+ - lib/bewildr/ext/extensions.rb
66
67
  - lib/bewildr/finder.rb
67
68
  - lib/bewildr/windows.rb
68
69
  - lib/bewildr.rb