lebowski 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.md CHANGED
@@ -1,19 +1,26 @@
1
- # lebowski 0.2.0 2010-08-20
1
+ # lebowski 0.2.1 October 6, 2010
2
2
 
3
- * Changed Application to MainApplication which is now used to start a main SproutCore application
3
+ * Fixed MainApplication object's define_root_object method
4
+ * Added functionality to check if a SproutCore bundle has been loaded
5
+ * Updated framework to handle cases when an object crossed application context boundaries
6
+ * replace select_field method with select_button on the SelectFieldTabView proxy
7
+
8
+ # lebowski 0.2.0 August 20, 2010
9
+
10
+ * Now use MainApplication to start a main SproutCore application
4
11
  * Improved application support in order to communicate with SproutCore apps loaded in iframes and pop-up windows
5
12
  * Changed how paths are defined. No longer use define. Now use define_path
6
13
  * Changed how path proxies are defined. No longer use proxy. Now use define_proxy
14
+ * Now performs lazy loading of proxies that are accessed through defined paths and defined proxies
7
15
  * Added proxy for SC.SelectButtonView
8
16
  * Added proxy for SC.WebView
9
17
  * Added proxy for SCUI.SelectFieldTab
10
18
  * Added proxy for SCUI.ColorWell
11
19
  * Added proxy for SCUI.ContentEditableView
12
- * Can now supply a string value to the main application browser parameter
13
20
  * Added functionality to the PositionedElement mixin
14
21
  * 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
22
+ * Updated what values can be passed to the main application browser parameter. Can now supply string values and :chrome
16
23
 
17
- # lebowski 0.1.1 2010-06-07
24
+ # lebowski 0.1.1 May 7, 2010
18
25
 
19
26
  * Open source beta release
@@ -64,8 +64,12 @@ module Lebowski
64
64
  return @responding_panes
65
65
  end
66
66
 
67
+ def bundle_loaded?(bundle)
68
+ return @driver.is_sc_bundle_loaded(bundle)
69
+ end
70
+
67
71
  def define_root_object(key, name, expected_type=nil)
68
- return define(key, '$' + name, expected_type)
72
+ return define_path(key, '$' + name, expected_type)
69
73
  end
70
74
 
71
75
  alias_method :define_framework, :define_root_object
@@ -240,12 +240,17 @@ module Lebowski
240
240
  # DEPRECATED
241
241
  def proxy(klass, rel_path)
242
242
  puts "DEPRECATED: proxy is deprecated. use define_proxy instead"
243
+ puts "... klass = #{klass}"
244
+ puts "... rel_path = #{rel_path}"
243
245
  define_proxy(klass, rel_path)
244
246
  end
245
247
 
246
248
  # DEPRECATED
247
249
  def define(path, rel_path=nil, expected_type=nil)
248
250
  puts "DEPRECATED: define is deprecated. use define_path instead"
251
+ puts "... path = #{path}"
252
+ puts "... rel_path = #{rel_path}"
253
+ puts "... expected_type = #{expected_type}"
249
254
  define_path(path, rel_path, expected_type)
250
255
  end
251
256
 
@@ -365,6 +365,10 @@ module Lebowski
365
365
 
366
366
  # Selenium User Extension Utility Function Selenium Calls
367
367
 
368
+ def is_sc_bundle_loaded(bundle)
369
+ return __boolean_command("isScBundleLoaded", [bundle])
370
+ end
371
+
368
372
  def get_sc_object_array_index_lookup(scpath, lookup_params)
369
373
  encoded_params = ObjectEncoder.encode_hash(lookup_params)
370
374
  return __number_array_command("getScObjectArrayIndexLookup", [scpath, encoded_params])
@@ -13,9 +13,9 @@ module Lebowski
13
13
  class SelectFieldTabView < Lebowski::Foundation::Views::View
14
14
  representing_sc_class 'SCUI.SelectFieldTab'
15
15
 
16
- def select_field
17
- @select_field = child_views.find_first(SelectFieldView) if @select_field.nil?
18
- return @select_field
16
+ def select_button
17
+ @select_button = child_views.find_first(SelectButtonView) if @select_button.nil?
18
+ return @select_button
19
19
  end
20
20
 
21
21
  def container
@@ -13,6 +13,12 @@ module Lebowski
13
13
 
14
14
  return false if @args.length == 0
15
15
 
16
+ #
17
+ # Note: If the method name is "test" then trying to invoke
18
+ # a method with name "test" on the given object will always
19
+ # fail whenever __send__ is used. There appears to be an
20
+ # actual method called test that belongs to a Ruby object.
21
+ #
16
22
  method_name = obj_property(@expected)
17
23
 
18
24
  ret_val = nil
@@ -15,6 +15,11 @@ module Spec
15
15
  # try other default pattern matchers
16
16
  #
17
17
  def method_missing(sym, *args, &block)
18
+ #
19
+ # Note: Be sure that the symbol does not contain the word "test". test
20
+ # is a private method on Ruby objects and will cause the Be and Has
21
+ # matches to fail.
22
+ #
18
23
  return Lebowski::Spec::Matchers::Be.new(sym, *args) if sym.to_s =~ /^be_/
19
24
  return Lebowski::Spec::Matchers::Has.new(sym, *args) if sym.to_s =~ /^have_/
20
25
  return Lebowski::Spec::Operators::That.new(sym, *args) if sym.to_s =~ /^that_/
@@ -7,7 +7,7 @@ module Lebowski # :nodoc:
7
7
  module VERSION # :nodoc:
8
8
  MAJOR = 0
9
9
  MINOR = 2
10
- TINY = 0
10
+ TINY = 1
11
11
  PRE = nil
12
12
 
13
13
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -42,7 +42,15 @@ var ScExt = {};
42
42
  Checks if the given value is indeed an SC.Object
43
43
  */
44
44
  ScExt.isScObject = function(obj) {
45
- return (obj && typeof(obj) === "object" && obj.kindOf && obj.kindOf($SC.Object));
45
+ return $SC.typeOf(obj) === $SC.T_OBJECT;
46
+ };
47
+
48
+ /**
49
+ Checks if the given value is either an instance of SC.Object or a JS hash object
50
+ */
51
+ ScExt.isObject = function(obj) {
52
+ var type = $SC.typeOf(obj);
53
+ return type === $SC.T_OBJECT || type === $SC.T_HASH;
46
54
  };
47
55
 
48
56
  /**
@@ -163,6 +171,27 @@ ScExt.typeOfArrayContent = function(array) {
163
171
  */
164
172
  ScExt.PathParser = {
165
173
 
174
+ /**
175
+ In order to identify an object of a specific type, we check properties on
176
+ the object instead of using the standard SC.kindOf or obj.kindOf function.
177
+ Why? Because there are potential cases where the object you are trying to
178
+ identify the type of comes from a different application context instead of
179
+ the current application context that $SC and $App currently refer to. For instance,
180
+ the app context is refering to an SC app within an iframe but some objects
181
+ within that app context are actually coming from the parent window that the iframe
182
+ is contained within. This means an object is crossing an app context.
183
+
184
+ Passing around different app contexts becomes tricky, especially for these
185
+ types of corner cases. Therefore it is just easier to check for specific
186
+ properties on an object to identify its type. We just have to make sure the
187
+ property to use is unique enough.
188
+ */
189
+ _identifiers: {
190
+ 'SC.Object': 'isObject',
191
+ 'SC.View': 'isView',
192
+ 'SC.CollectionView': 'itemViewForContentIndex'
193
+ },
194
+
166
195
  _isArrayIndex: function (val) {
167
196
  return isNaN(parseInt(val, 0)) === false;
168
197
  },
@@ -265,6 +294,19 @@ ScExt.PathParser = {
265
294
  return objPathChain;
266
295
  },
267
296
 
297
+ /**
298
+ Will return the value associated with the given SC property path. If the
299
+ path evaluates to nothing then null will be returned. Example:
300
+
301
+ getPath('path.to.some.property')
302
+
303
+ In cases where you want to confirm that the value returned is an object
304
+ of a specific type, you can pass in the type as a string, such as 'SC.Object'.
305
+ if the type is not matched then null is returned. Example:
306
+
307
+ getPath('path.to.object', 'SC.Object')
308
+
309
+ */
268
310
  getPath: function(path, scClass) {
269
311
  var chain = this.computeObjectChain(path);
270
312
  if (chain.length === 0 ) return null;
@@ -272,7 +314,8 @@ ScExt.PathParser = {
272
314
 
273
315
  if (!scClass) return pathValue;
274
316
 
275
- if (ScExt.isScObject(pathValue) && pathValue.kindOf(scClass)) {
317
+ var identifier = this._identifiers[scClass];
318
+ if (ScExt.isObject(pathValue) && identifier && pathValue[identifier] !== undefined) {
276
319
  return pathValue;
277
320
  } else {
278
321
  return null;
@@ -1063,7 +1106,7 @@ Selenium.prototype._getScOpenedWindow = function(locatorType, locatorValue) {
1063
1106
  to an actual SC view object.
1064
1107
  */
1065
1108
  Selenium.prototype.doScViewScrollToVisible = function(path) {
1066
- var view = $ScPath.getPath(path, $SC.View);
1109
+ var view = $ScPath.getPath(path, 'SC.View');
1067
1110
  if (!view) return;
1068
1111
  ScExt.viewScrollToVisible(view);
1069
1112
  };
@@ -1299,7 +1342,7 @@ Selenium.prototype.getScTypeOfArrayContent = function(path) {
1299
1342
  Returns a SproutCore object's GUID
1300
1343
  */
1301
1344
  Selenium.prototype.getScGuid = function(path) {
1302
- var value = $ScPath.getPath(path, $SC.Object);
1345
+ var value = $ScPath.getPath(path, 'SC.Object');
1303
1346
  var guid = $SC.guidFor(value);
1304
1347
  return guid;
1305
1348
  };
@@ -1308,7 +1351,7 @@ Selenium.prototype.getScGuid = function(path) {
1308
1351
  Returns a SproutCore object's type
1309
1352
  */
1310
1353
  Selenium.prototype.getScObjectClassName = function(path) {
1311
- var obj = $ScPath.getPath(path, $SC.Object);
1354
+ var obj = $ScPath.getPath(path, 'SC.Object');
1312
1355
  if (!obj) return "";
1313
1356
  var className = $SC._object_className(obj.constructor);
1314
1357
  return (className === 'Anonymous') ? "" : className;
@@ -1318,7 +1361,7 @@ Selenium.prototype.getScObjectClassName = function(path) {
1318
1361
  Checks if a SproutCore object is a kind of type
1319
1362
  */
1320
1363
  Selenium.prototype.isScObjectKindOfClass = function(path, className) {
1321
- var obj = $ScPath.getPath(path, $SC.Object);
1364
+ var obj = $ScPath.getPath(path, 'SC.Object');
1322
1365
  if (!obj) return false;
1323
1366
 
1324
1367
  var klass = ScExt.string2ScClass(className);
@@ -1332,7 +1375,7 @@ Selenium.prototype.isScObjectKindOfClass = function(path, className) {
1332
1375
  object derives from.
1333
1376
  */
1334
1377
  Selenium.prototype.getScObjectClassNames = function(path) {
1335
- var obj = $ScPath.getPath(path, $SC.Object);
1378
+ var obj = $ScPath.getPath(path, 'SC.Object');
1336
1379
  var classNames = ScExt.getScObjectClassNames(obj);
1337
1380
  return classNames;
1338
1381
  };
@@ -1360,7 +1403,7 @@ Selenium.prototype.getScLocalizedString = function(str) {
1360
1403
  DOM elements into a string.
1361
1404
  */
1362
1405
  Selenium.prototype.getScViewLayer = function(path) {
1363
- var view = $ScPath.getPath(path, $SC.View);
1406
+ var view = $ScPath.getPath(path, 'SC.View');
1364
1407
  if (!view) return "";
1365
1408
  return view.get('layer').outerHTML;
1366
1409
  };
@@ -1369,7 +1412,7 @@ Selenium.prototype.getScViewLayer = function(path) {
1369
1412
  Gets a SproutCore view's frame
1370
1413
  */
1371
1414
  Selenium.prototype.getScViewFrame = function(path) {
1372
- var view = $ScPath.getPath(path, $SC.View);
1415
+ var view = $ScPath.getPath(path, 'SC.View');
1373
1416
  if (!view) return "";
1374
1417
  var frame = view.get('frame');
1375
1418
  if (!frame) return null;
@@ -1403,6 +1446,10 @@ Selenium.prototype.getCssSelectorCount = function(selector) {
1403
1446
  return result;
1404
1447
  };
1405
1448
 
1449
+ Selenium.prototype.isScBundleLoaded = function(bundle) {
1450
+ return $SC.bundleIsLoaded(bundle);
1451
+ };
1452
+
1406
1453
  /////// SC Core Query Specific Selenium Calls /////////////////
1407
1454
 
1408
1455
  /**
@@ -1420,7 +1467,7 @@ Selenium.prototype.getCssSelectorCount = function(selector) {
1420
1467
  otherwise -1 is returned
1421
1468
  */
1422
1469
  Selenium.prototype.getScCoreQuery = function(path, selector) {
1423
- var view = $ScPath.getPath(path, $SC.View);
1470
+ var view = $ScPath.getPath(path, 'SC.View');
1424
1471
  if (!view) return -1;
1425
1472
 
1426
1473
  var cq = null;
@@ -1585,13 +1632,13 @@ Selenium.prototype.getElementChildNodesCount = function(selector, elemIndex) {
1585
1632
  /////// SC Collection View Specific Selenium Calls /////////////////
1586
1633
 
1587
1634
  Selenium.prototype.getScCollectionViewContentGroupIndexes = function(path) {
1588
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1635
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1589
1636
  if (!collectionView) return [];
1590
1637
  return ScExt.CollectionView.getContentGroupIndexes(collectionView);
1591
1638
  };
1592
1639
 
1593
1640
  Selenium.prototype.getScCollectionViewContentSelectedIndexes = function(path) {
1594
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1641
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1595
1642
  if (!collectionView) return [];
1596
1643
  var selectionSet = collectionView.get('selection');
1597
1644
  if (!selectionSet) return [];
@@ -1600,31 +1647,31 @@ Selenium.prototype.getScCollectionViewContentSelectedIndexes = function(path) {
1600
1647
  };
1601
1648
 
1602
1649
  Selenium.prototype.getScCollectionViewContentNowShowingIndexes = function(path) {
1603
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1650
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1604
1651
  if (!collectionView) return [];
1605
1652
  return ScExt.indexSet2Array(collectionView.get('nowShowing'));
1606
1653
  };
1607
1654
 
1608
1655
  Selenium.prototype.getScCollectionViewContentIsGroup = function(path, index) {
1609
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1656
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1610
1657
  if (!collectionView) -1;
1611
1658
  return ScExt.CollectionView.getContentIsGroup(collectionView, parseInt(index, 0));
1612
1659
  };
1613
1660
 
1614
1661
  Selenium.prototype.getScCollectionViewContentIsSelected = function(path, index) {
1615
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1662
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1616
1663
  if (!collectionView) -1;
1617
1664
  return ScExt.CollectionView.getContentIsSelected(collectionView, parseInt(index, 0));
1618
1665
  };
1619
1666
 
1620
1667
  Selenium.prototype.getScCollectionViewContentDisclosureState = function(path, index) {
1621
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1668
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1622
1669
  if (!collectionView) -1;
1623
1670
  return ScExt.CollectionView.getContentDisclosureState(collectionView, parseInt(index, 0));
1624
1671
  };
1625
1672
 
1626
1673
  Selenium.prototype.getScCollectionViewContentOutlineLevel = function(path, index) {
1627
- var collectionView = $ScPath.getPath(path, $SC.CollectionView);
1674
+ var collectionView = $ScPath.getPath(path, 'SC.CollectionView');
1628
1675
  if (!collectionView) -1;
1629
1676
  return ScExt.CollectionView.getContentOutlineLevel(collectionView, parseInt(index, 0));
1630
1677
  };
@@ -1658,7 +1705,7 @@ Selenium.prototype.getScCollectionViewContentOutlineLevel = function(path, index
1658
1705
  */
1659
1706
  PageBot.prototype.locateElementByScPath = function(path) {
1660
1707
 
1661
- var obj = $ScPath.getPath(path, $SC.View);
1708
+ var obj = $ScPath.getPath(path, 'SC.View');
1662
1709
  if (!obj) return null;
1663
1710
 
1664
1711
  // Return the view's layer. The layer is the root DOM element of the view
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lebowski
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
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Cohen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-20 00:00:00 -04:00
18
+ date: 2010-10-06 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -195,7 +195,7 @@ licenses: []
195
195
  post_install_message: |
196
196
  **************************************************
197
197
 
198
- Thank you for installing lebowski-0.2.0
198
+ Thank you for installing lebowski-0.2.1
199
199
 
200
200
  Please be sure to read the README.md and History.md
201
201
  for useful information on how to use this framework
@@ -238,6 +238,6 @@ rubyforge_project: lebowski
238
238
  rubygems_version: 1.3.7
239
239
  signing_key:
240
240
  specification_version: 3
241
- summary: lebowski 0.2.0
241
+ summary: lebowski 0.2.1
242
242
  test_files: []
243
243