lebowski 0.1.1 → 0.2.0

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.
Files changed (46) hide show
  1. data/History.md +17 -1
  2. data/Manifest.txt +8 -0
  3. data/README.md +6 -0
  4. data/lib/lebowski/foundation/application.rb +340 -74
  5. data/lib/lebowski/foundation/core.rb +23 -0
  6. data/lib/lebowski/foundation/dom_element.rb +15 -0
  7. data/lib/lebowski/foundation/errors/timeout.rb +5 -0
  8. data/lib/lebowski/foundation/mixins/collection_item_view_support.rb +5 -0
  9. data/lib/lebowski/foundation/mixins/define_paths_support.rb +318 -0
  10. data/lib/lebowski/foundation/mixins/delegate_support.rb +5 -0
  11. data/lib/lebowski/foundation/mixins/frame_application_context_support.rb +37 -0
  12. data/lib/lebowski/foundation/mixins/inline_text_field_support.rb +5 -0
  13. data/lib/lebowski/foundation/mixins/key_check.rb +5 -0
  14. data/lib/lebowski/foundation/mixins/list_item_view_support.rb +5 -0
  15. data/lib/lebowski/foundation/mixins/positioned_element.rb +24 -0
  16. data/lib/lebowski/foundation/mixins/stall_support.rb +5 -0
  17. data/lib/lebowski/foundation/mixins/user_actions.rb +37 -8
  18. data/lib/lebowski/foundation/mixins/wait_actions.rb +5 -0
  19. data/lib/lebowski/foundation/object_array.rb +96 -1
  20. data/lib/lebowski/foundation/proxy_factory.rb +2 -0
  21. data/lib/lebowski/foundation/proxy_object.rb +128 -130
  22. data/lib/lebowski/foundation/views/select_button.rb +69 -0
  23. data/lib/lebowski/foundation/views/view.rb +10 -0
  24. data/lib/lebowski/foundation/views/web.rb +26 -0
  25. data/lib/lebowski/foundation.rb +10 -0
  26. data/lib/lebowski/runtime/errors/remote_control_command_execution_error.rb +5 -0
  27. data/lib/lebowski/runtime/errors/remote_control_command_timeout_error.rb +5 -0
  28. data/lib/lebowski/runtime/errors/remote_control_error.rb +5 -0
  29. data/lib/lebowski/runtime/errors/selenium_server_error.rb +5 -0
  30. data/lib/lebowski/runtime/object_encoder.rb +5 -0
  31. data/lib/lebowski/runtime/sprout_core_driver.rb +5 -0
  32. data/lib/lebowski/runtime/sprout_core_extensions.rb +114 -0
  33. data/lib/lebowski/runtime.rb +5 -0
  34. data/lib/lebowski/scui/mixins/link_support.rb +32 -0
  35. data/lib/lebowski/scui/mixins/node_item_view_support.rb +50 -13
  36. data/lib/lebowski/scui/mixins/terminal_view_support.rb +30 -0
  37. data/lib/lebowski/scui/views/color_well.rb +48 -0
  38. data/lib/lebowski/scui/views/combo_box.rb +90 -87
  39. data/lib/lebowski/scui/views/content_editable.rb +422 -0
  40. data/lib/lebowski/scui/views/date_picker.rb +70 -58
  41. data/lib/lebowski/scui/views/linkit.rb +8 -0
  42. data/lib/lebowski/scui/views/select_field_tab.rb +30 -0
  43. data/lib/lebowski/scui.rb +18 -0
  44. data/lib/lebowski/version.rb +2 -2
  45. data/resources/user-extensions.js +293 -11
  46. metadata +69 -25
data/History.md CHANGED
@@ -1,3 +1,19 @@
1
- # lebowski 0.1.0 2010-06-07
1
+ # lebowski 0.2.0 2010-08-20
2
+
3
+ * Changed Application to MainApplication which is now used to start a main SproutCore application
4
+ * Improved application support in order to communicate with SproutCore apps loaded in iframes and pop-up windows
5
+ * Changed how paths are defined. No longer use define. Now use define_path
6
+ * Changed how path proxies are defined. No longer use proxy. Now use define_proxy
7
+ * Added proxy for SC.SelectButtonView
8
+ * Added proxy for SC.WebView
9
+ * Added proxy for SCUI.SelectFieldTab
10
+ * Added proxy for SCUI.ColorWell
11
+ * Added proxy for SCUI.ContentEditableView
12
+ * Can now supply a string value to the main application browser parameter
13
+ * Added functionality to the PositionedElement mixin
14
+ * Updated the drag and drop user action so that you can specify mouse offsets
15
+ * Updated what value can be passed to the main application browser parameter. Can now supply string values and :chrome
16
+
17
+ # lebowski 0.1.1 2010-06-07
2
18
 
3
19
  * Open source beta release
data/Manifest.txt CHANGED
@@ -27,7 +27,9 @@ lib/lebowski/foundation/mixins/delegate_support.rb
27
27
  lib/lebowski/foundation/mixins/collection_item_view_support.rb
28
28
  lib/lebowski/foundation/mixins/list_item_view_support.rb
29
29
  lib/lebowski/foundation/mixins/inline_text_field_support.rb
30
+ lib/lebowski/foundation/mixins/frame_application_context_support.rb
30
31
  lib/lebowski/foundation/mixins/stall_support.rb
32
+ lib/lebowski/foundation/mixins/define_paths_support.rb
31
33
  lib/lebowski/foundation/proxy_object.rb
32
34
  lib/lebowski/foundation/sc_object.rb
33
35
  lib/lebowski/foundation/object_array.rb
@@ -48,6 +50,8 @@ lib/lebowski/foundation/views/collection.rb
48
50
  lib/lebowski/foundation/views/list.rb
49
51
  lib/lebowski/foundation/views/list_item.rb
50
52
  lib/lebowski/foundation/views/grid.rb
53
+ lib/lebowski/foundation/views/web.rb
54
+ lib/lebowski/foundation/views/select_button.rb
51
55
  lib/lebowski/foundation/views/support/simple_item_array.rb
52
56
  lib/lebowski/foundation/panes/pane.rb
53
57
  lib/lebowski/foundation/panes/main.rb
@@ -64,8 +68,12 @@ lib/lebowski/scui.rb
64
68
  lib/lebowski/scui/views/combo_box.rb
65
69
  lib/lebowski/scui/views/date_picker.rb
66
70
  lib/lebowski/scui/views/linkit.rb
71
+ lib/lebowski/scui/views/select_field_tab.rb
72
+ lib/lebowski/scui/views/color_well.rb
73
+ lib/lebowski/scui/views/content_editable.rb
67
74
  lib/lebowski/scui/mixins/node_item_view_support.rb
68
75
  lib/lebowski/scui/mixins/terminal_view_support.rb
76
+ lib/lebowski/scui/mixins/link_support.rb
69
77
  lib/lebowski/spec.rb
70
78
  lib/lebowski/spec/core.rb
71
79
  lib/lebowski/spec/util.rb
data/README.md CHANGED
@@ -144,3 +144,9 @@ be sure to check out the `sc_controls` example app.
144
144
  > that. Quite possibly the laziest in Los Angeles County, which would place him high in the runnin'
145
145
  > for laziest worldwide. But sometimes there's a man, sometimes, there's a man.
146
146
 
147
+ #Contributors
148
+
149
+ Special thanks to the following individuals:
150
+
151
+ * Dessy Daskalov, for contributing lots of code for the SCUI proxies
152
+ * Mike Ramsey, for providing a lot of solid usage, testing, and feedback of the framework
@@ -7,16 +7,227 @@ module Lebowski
7
7
  module Foundation
8
8
 
9
9
  #
10
- # This class represents a SproutCore-based application. In order to interact with the
11
- # actual application you must create an instance of this class and start it. Once
12
- # started, you are then free to access any object or view that has been created by
13
- # the application within the web browser.
10
+ # Represents a SproutCore Application. This is a base class that is derived
11
+ # by other classes. The class provides the common data and behavior that
12
+ # all other classes representing an application must have.
14
13
  #
15
- class Application < Lebowski::Foundation::SCObject
14
+ class Application < Lebowski::Foundation::ProxyObject
16
15
  include Lebowski
17
16
  include Lebowski::Foundation
18
17
  include Lebowski::Foundation::Panes
18
+ include Lebowski::Foundation::Mixins
19
19
  include Lebowski::Foundation::Mixins::KeyCheck
20
+
21
+ attr_reader :app_context_manager
22
+ attr_reader :parent_app
23
+
24
+ def initialize(params)
25
+ super()
26
+
27
+ if params.nil?
28
+ raise ArgumentError.new "must supply parameters to create application instance"
29
+ end
30
+
31
+ if not params.kind_of?(Hash)
32
+ raise ArgumentError.new "must supply a hash containing parameters"
33
+ end
34
+
35
+ if not params[:parent_app].nil?
36
+ @parent_app = params[:parent_app]
37
+ @app_context_manager = @parent_app.app_context_manager
38
+ @driver = @parent_app.driver
39
+ end
40
+ end
41
+
42
+ def abs_path()
43
+ return nil
44
+ end
45
+
46
+ def root_object(name, expected_type=nil)
47
+ return self['$' + name, expected_type]
48
+ end
49
+
50
+ alias_method :framework, :root_object
51
+
52
+ def main_pane(expected_type=nil)
53
+ return self['$SC.RootResponder.responder.mainPane', expected_type]
54
+ end
55
+
56
+ def key_pane(expected_type=nil)
57
+ return self['$SC.RootResponder.responder.keyPane', expected_type]
58
+ end
59
+
60
+ def responding_panes()
61
+ if @responding_panes.nil?
62
+ @responding_panes = ObjectArray.new self, '$SC.RootResponder.responder.panes'
63
+ end
64
+ return @responding_panes
65
+ end
66
+
67
+ def define_root_object(key, name, expected_type=nil)
68
+ return define(key, '$' + name, expected_type)
69
+ end
70
+
71
+ alias_method :define_framework, :define_root_object
72
+
73
+ def acquire_application_context(app_name)
74
+ if app_name.nil?
75
+ raise ArugmentError.new "app_name can not be nil"
76
+ end
77
+ app_context_manager.switch_application_context_to self, app_name
78
+ end
79
+
80
+ def do_aquire_application_context()
81
+ # no-op
82
+ end
83
+
84
+ def has_current_application_context?()
85
+ return app_context_manager.has_current_application_context?(self)
86
+ end
87
+
88
+ def exec_in_context(app_name, &block)
89
+ if app_name.nil?
90
+ raise ArgumentError.new "app_name can not be nil"
91
+ end
92
+ app_context_manager.exec_in_context self, app_name, &block
93
+ end
94
+
95
+ def exec_driver_in_context(&block)
96
+ app_context_manager.exec_driver_in_context self, &block
97
+ end
98
+
99
+ end
100
+
101
+ #
102
+ # Used to represent a SproutCore application that is contained within
103
+ # a web brower window
104
+ #
105
+ class WindowApplication < Application
106
+
107
+ def initialize(params)
108
+ super(params)
109
+ end
110
+
111
+ #
112
+ # Moves the browser window
113
+ #
114
+ def move_to(x, y)
115
+ exec_driver_in_context do |driver|
116
+ @driver.sc_window_move_to(x,y)
117
+ end
118
+ end
119
+
120
+ #
121
+ # Resizes the browser window
122
+ #
123
+ def resize_to(width, height)
124
+ exec_driver_in_context do |driver|
125
+ driver.sc_window_resize_to(width, height)
126
+ end
127
+ end
128
+
129
+ #
130
+ # Maximizes the browser window
131
+ #
132
+ def maximize()
133
+ exec_driver_in_context do |driver|
134
+ driver.sc_window_maximize
135
+ end
136
+ end
137
+
138
+ end
139
+
140
+ #
141
+ # Used to represent a SproutCore application that is contained within
142
+ # a web browser window that was opened by another window
143
+ #
144
+ class OpenedWindowApplication < WindowApplication
145
+
146
+ attr_reader :locator_type, :locator_value
147
+
148
+ def initialize(params)
149
+ super(params)
150
+
151
+ if params[:parent_app].nil?
152
+ raise ArugmentError.new "parent_app can not be nil"
153
+ end
154
+
155
+ @locator_type = params[:locator_type]
156
+ @locator_value = params[:locator_value]
157
+ end
158
+
159
+ #
160
+ # Used to check if this window is open
161
+ #
162
+ def is_opened?()
163
+ return @driver.is_sc_opened_window?(locator_type, locator_value)
164
+ end
165
+
166
+ #
167
+ # Closes the opened window if it is currently open
168
+ #
169
+ def close()
170
+ return if (not is_opened?)
171
+ driver.sc_close_opened_window locator_type, locator_value
172
+ if has_current_application_context?
173
+ parent_app.reset_application_context
174
+ end
175
+ end
176
+
177
+ def do_acquire_application_context()
178
+ @driver.sc_select_window(locator_type, locator_value)
179
+ end
180
+
181
+ end
182
+
183
+ #
184
+ # Used to represent a SproutCore application that is contained within
185
+ # an IFrame.
186
+ #
187
+ class FrameApplication < Application
188
+
189
+ attr_reader :locator
190
+
191
+ def initialize(params)
192
+ super(params)
193
+
194
+ if params[:parent_app].nil?
195
+ raise ArugmentError.new "parent_app can not be nil"
196
+ end
197
+
198
+ @locator = params[:locator]
199
+ end
200
+
201
+ def do_acquire_application_context()
202
+ parents = []
203
+ current_parent = self.parent_app
204
+ while not current_parent.nil? do
205
+ parents << current_parent
206
+ current_parent = current_parent.parent_app
207
+ end
208
+
209
+ parents = parents.reverse
210
+
211
+ parents.each do |parent|
212
+ if parent.kind_of? FrameApplication
213
+ @driver.select_frame parent.locator
214
+ else
215
+ parent.do_acquire_application_context
216
+ end
217
+ end
218
+
219
+ @driver.select_frame(locator)
220
+ end
221
+
222
+ end
223
+
224
+ #
225
+ # This class represents a SproutCore-based main application. In order to interact with the
226
+ # actual application you must create an instance of this class and start it. Once
227
+ # started, you are then free to access any object or view that has been created by
228
+ # the application within the web browser.
229
+ #
230
+ class MainApplication < WindowApplication
20
231
 
21
232
  SAFARI = '*safari'
22
233
  FIREFOX = '*firefox'
@@ -35,8 +246,7 @@ module Lebowski
35
246
  :port,
36
247
  :base_url,
37
248
  :session_id,
38
- :browser,
39
- :app_is_loaded_flag
249
+ :browser
40
250
 
41
251
  #
42
252
  # Creates an Application instance that will allow you to interact with a
@@ -64,15 +274,7 @@ module Lebowski
64
274
  # :app_name => "HelloWorldApp"
65
275
  #
66
276
  def initialize(params)
67
- super()
68
-
69
- if params.nil?
70
- raise ArgumentError.new "must supply parameters to create application instance"
71
- end
72
-
73
- if not params.kind_of?(Hash)
74
- raise ArgumentError.new "must supply a hash containing parameters"
75
- end
277
+ super(params)
76
278
 
77
279
  @host = get_selenium_server_host(params)
78
280
  @port = get_selenium_server_port(params)
@@ -85,7 +287,6 @@ module Lebowski
85
287
  raise ArgumentError.new "Application name is required - :app_name" if @app_name.nil?
86
288
 
87
289
  @rel_path = @app_name
88
- @app_is_loaded_flag = get_app_is_loaded_flag(params)
89
290
  @timeout_in_seconds = get_timeout_in_second(params)
90
291
  @base_url = get_application_base_url(params)
91
292
  @session_id = get_session_id(params)
@@ -98,6 +299,9 @@ module Lebowski
98
299
  :timeout_in_second => @timeout_in_seconds
99
300
 
100
301
  @started = false
302
+
303
+ @app_context_manager = Support::ApplicationContextManager.new self
304
+ @parent_app = nil
101
305
  end
102
306
 
103
307
  #
@@ -147,7 +351,6 @@ module Lebowski
147
351
  raise TimeoutError.new err_message
148
352
  end
149
353
  end
150
-
151
354
  end
152
355
 
153
356
  def end()
@@ -167,42 +370,23 @@ module Lebowski
167
370
  return @started
168
371
  end
169
372
 
170
- def window()
171
- @window = Window.new(@driver) if @window.nil?
172
- return @window
373
+ def reset_application_context()
374
+ acquire_application_context app_name
173
375
  end
174
376
 
175
- def abs_path()
176
- return nil
377
+ def define_app_name(name)
378
+ define_path name
177
379
  end
178
380
 
179
- def root_object(name, expected_type=nil)
180
- return self['$' + name, expected_type]
381
+ def opened_windows()
382
+ @opened_windows = Support::OpenedWindows.new(self) if @opened_windows.nil?
383
+ return @opened_windows
181
384
  end
182
385
 
183
- alias_method :framework, :root_object
184
-
185
- def main_pane(expected_type=nil)
186
- return self['$SC.RootResponder.responder.mainPane', expected_type]
386
+ def do_acquire_application_context()
387
+ @driver.sc_select_main_window
187
388
  end
188
389
 
189
- def key_pane(expected_type=nil)
190
- return self['$SC.RootResponder.responder.keyPane', expected_type]
191
- end
192
-
193
- def responding_panes()
194
- if @responding_panes.nil?
195
- @responding_panes = ObjectArray.new self, '$SC.RootResponder.responder.panes'
196
- end
197
- return @responding_panes
198
- end
199
-
200
- def define_root_object(key, name, expected_type=nil)
201
- return define(key, '$' + name, expected_type)
202
- end
203
-
204
- alias_method :define_framework, :define_root_object
205
-
206
390
  private
207
391
 
208
392
  def get_selenium_client(params)
@@ -250,11 +434,16 @@ module Lebowski
250
434
  return client.browser_string if (not client.nil?)
251
435
 
252
436
  browser = params[:browser]
437
+
438
+ return browser if browser.kind_of?(String)
439
+
253
440
  case (browser)
254
441
  when :firefox
255
442
  return FIREFOX
256
443
  when :safari
257
444
  return SAFARI
445
+ when :chrome
446
+ return CHROME
258
447
  else
259
448
  return DEFAULT_BROWSER
260
449
  end
@@ -268,10 +457,6 @@ module Lebowski
268
457
  return params[:app_name]
269
458
  end
270
459
 
271
- def get_app_is_loaded_flag(params)
272
- return params[:app_is_loaded_flag]
273
- end
274
-
275
460
  def get_timeout_in_second(params)
276
461
  return DEFAULT_TIMEOUT_IN_SECONDS if params[:timeout_in_seconds].nil?
277
462
  return params[:timeout_in_seconds].to_i
@@ -279,34 +464,115 @@ module Lebowski
279
464
 
280
465
  end
281
466
 
282
- #
283
- # Represents the browser window the application has been loaded into
284
- #
285
- class Window
286
-
287
- def initialize(driver)
288
- @driver = driver
289
- end
467
+ module Support
290
468
 
291
469
  #
292
- # Moves the browser window
470
+ # Application context manager is used to handle the switching between SproutCore
471
+ # applications and keeping track of what application currently posses the current
472
+ # context that all operations act upon
293
473
  #
294
- def move_to(x, y)
295
- @driver.sc_window_move_to(x,y)
296
- end
297
-
298
- #
299
- # Resizes the browser window
300
- #
301
- def resize_to(width, height)
302
- @driver.sc_window_resize_to(width, height)
474
+ class ApplicationContextManager
475
+ include Lebowski::Foundation
476
+
477
+ attr_reader :main_app
478
+
479
+ def initialize(main_app)
480
+ @main_app = main_app
481
+ @driver = main_app.driver
482
+ @current_application_context = { :app => main_app, :app_name => main_app.app_name }
483
+ end
484
+
485
+ def switch_application_context_to(app, app_name=nil)
486
+ if not app.kind_of? Application
487
+ raise ArgumentInvalidTypeError.new "app", app, "class < Application"
488
+ end
489
+
490
+ if not app.__eql? main_app
491
+ if main_app.path_defined? app_name
492
+ root = main_app.defined_path app_name
493
+ app.root_defined_path_part = root
494
+ else
495
+ app.root_defined_path_part = main_app.root_defined_path_part
496
+ end
497
+ end
498
+
499
+ app.do_acquire_application_context
500
+
501
+ @driver.update_sc_application_context(app_name) if not app_name.nil?
502
+ @current_application_context = { :app => app, :app_name => app_name }
503
+ end
504
+
505
+ def has_current_application_context?(app)
506
+ return app.__eql?(@current_application_context[:app])
507
+ end
508
+
509
+ def exec_in_context(app, app_name=nil, &block)
510
+ previous_app_context = @current_application_context.clone
511
+ switch_application_context_to app, app_name
512
+ yield app
513
+ switch_application_context_to previous_app_context[:app], previous_app_context[:app_name]
514
+ end
515
+
516
+ def exec_driver_in_context(app, &block)
517
+ previous_app_context = nil
518
+ if not has_current_application_context?(app)
519
+ previous_app_context = @current_application_context.clone
520
+ switch_application_context_to app
521
+ end
522
+
523
+ yield @driver
524
+
525
+ if not previous_app_context.nil?
526
+ switch_application_context_to previous_app_context[:app], previous_app_context[:app_name]
527
+ end
528
+ end
529
+
303
530
  end
304
-
305
- #
306
- # Maximizes the browser window
307
- #
308
- def maximize()
309
- @driver.sc_window_maximize
531
+
532
+ class OpenedWindows
533
+
534
+ def initialize(parent_app)
535
+ @parent_app = parent_app
536
+ @driver = parent_app.driver
537
+ end
538
+
539
+ def window_with_location?(value)
540
+ return @driver.is_sc_opened_window?(:location, value)
541
+ end
542
+
543
+ def window_with_name?(value)
544
+ return @driver.is_sc_opened_window?(:name, value)
545
+ end
546
+
547
+ def window_with_title?(value)
548
+ return @driver.is_sc_opened_window?(:title, value)
549
+ end
550
+
551
+ def find_by_location(value)
552
+ return find_opened_window(:location, value)
553
+ end
554
+
555
+ def find_by_name(value)
556
+ return find_opened_window(:name, value)
557
+ end
558
+
559
+ def find_by_title(value)
560
+ return find_opened_window(:title, value)
561
+ end
562
+
563
+ private
564
+
565
+ def find_opened_window(locator_type, locator_value)
566
+ if @driver.is_sc_opened_window?(locator_type, locator_value)
567
+ return OpenedWindowApplication.new({
568
+ :locator_type => locator_type,
569
+ :locator_value => locator_value,
570
+ :parent_app => @parent_app
571
+ })
572
+ end
573
+ return nil
574
+ end
575
+
310
576
  end
311
577
 
312
578
  end
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Foundation
3
8
 
@@ -54,6 +59,24 @@ module Lebowski
54
59
  raise ArgumentInvalidTypeError.new name, value, Lebowski::Foundation::Views::View
55
60
  end
56
61
  end
62
+
63
+ def self.get_root_application_object(proxy)
64
+ if proxy.nil?
65
+ raise ArgumentInvalidTypeError.new "proxy", proxy, Lebowski::Foundation::ProxyObject
66
+ end
67
+
68
+ current_proxy = proxy
69
+ while not current_proxy.nil? do
70
+ return current_proxy if current_proxy.kind_of?(Lebowski::Foundation::Application)
71
+ current_proxy = current_proxy.parent
72
+ end
73
+
74
+ return nil
75
+ end
76
+
77
+ def get_root_application_object()
78
+ return Util.get_root_application_object(self)
79
+ end
57
80
 
58
81
  end
59
82
 
@@ -99,6 +99,21 @@ module Lebowski
99
99
  return @driver.get_sc_core_query_element_attribute(@handle, @index, val)
100
100
  end
101
101
 
102
+ # @override Lebowski::Foundation::Mixins::PositionedElement#position
103
+ def position()
104
+ return @driver.get_sc_element_window_position(action_target, *action_locator_args)
105
+ end
106
+
107
+ # @override Lebowski::Foundation::Mixins::PositionedElement#width
108
+ def width()
109
+ return @driver.get_sc_element_width(action_target, *action_locator_args)
110
+ end
111
+
112
+ # @override Lebowski::Foundation::Mixins::PositionedElement#height
113
+ def height()
114
+ return @driver.get_sc_element_height(action_target, *action_locator_args)
115
+ end
116
+
102
117
  #
103
118
  # If the method can not be found then assume we are trying to get the value
104
119
  # of an attribute on the element.
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Foundation
3
8
 
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Foundation
3
8
  module Mixins