twitter-flight-rails 0.0.2 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Twitter Flight framework for Rails
2
2
 
3
- This asset gem packages the [twitter flight](https://github.com/twitter/flight/) framework for the Rails asset pipeline.
3
+ This asset gem packages the [twitter flight](https://github.com/twitter/flight/) framework for Rails.
4
4
 
5
5
  ## Installation
6
6
 
@@ -12,34 +12,45 @@ Add this line to your application's Gemfile:
12
12
 
13
13
  gem 'twitter-flight-rails', :git => "git@github.com:yourabi/twitter-flight-rails.git"
14
14
 
15
+ You'll also want to add the following dependencies to your Gemfile (see the dependencies section for more details)
16
+
17
+ gem 'requirejs-rails'
18
+
19
+ gem 'es5-shim-rails'
15
20
 
16
21
  And then execute:
17
22
 
18
23
  $ bundle
19
24
 
20
- Or install it yourself as:
25
+ ## Dependencies
21
26
 
22
- $ gem install twitter-flight-rails
27
+ Twitter flight depdends on ES5-shim, jQuery and an AMD implementation like require.js.
23
28
 
24
- ## Usage
29
+ One possible Rails/Require.js integration is [requirejs-rails](https://github.com/jwhitley/requirejs-rails) ... you'll probably want to read their documentation and follow their initial setup instructions.
25
30
 
26
- To start using the twitter flight fraemwork in your rails app enable it via the asset pipeline (app/assets/javascripts/application.js).
31
+ [ES5-shim](https://github.com/kriskowal/es5-shim) is used to polyfill ES5 support for older browsers and [JQuery](http://jquery.com) for DOM manipulation API. This is provided by the [es5-shim-rails](https://github.com/yourabi/es5-shim-rails) gem.
27
32
 
28
- Add the folllwing:
33
+ ## Usage
34
+
35
+ Eventually you'll end up using require.js to include jquery, es5-shim, flight and your own compnents using something like this
29
36
 
30
37
  ```js
38
+ // here "root" is a file that contains your own components under app/assets/javascripts/root.js and accessed at /assets/root.js
39
+ require(['jquery', 'es5-shim/shims/es5-shim', 'es5-shim/shims/es5-sham', 'twitter/flight/', 'root'], function($) {
31
40
 
32
- //= require twitter/flight
41
+ // this is your own boot.js file in app/assets/javascripts/boot.js accessed at /assets/boot.js
42
+ require(['boot'], function(initialize) {
43
+ initialize();
44
+ });
33
45
 
34
- ```
46
+ });
35
47
 
36
- Currently this version tracks flight master [commit e07b90c78d](https://github.com/twitter/flight/commit/e07b90c78d416549455354cbcd3e7f8a001c4fdf) and may support release tags in the future.
48
+ ```
37
49
 
38
- ## Dependencies
50
+ ## Changelog
39
51
 
40
- Flight uses [ES5-shim](https://github.com/kriskowal/es5-shim) to polyfill ES5 support for older browsers and [JQuery](http://jquery.com) for DOM manipulation API.
52
+ Currently this version tracks [flight v1.0.2](https://github.com/twitter/flight/tree/v1.0.2) with a few bugs backported from master ($.browser reference in jQuery 1.9) and paths tweaked slightly.
41
53
 
42
- Note: as of version 0.0.2 the es5-shim dependency is not handled.
43
54
 
44
55
  ## Contributing
45
56
 
@@ -1,7 +1,7 @@
1
1
  module Twitter
2
2
  module Flight
3
3
  module Rails
4
- VERSION = "0.0.2"
4
+ VERSION = "1.0.2"
5
5
  end
6
6
  end
7
7
  end
@@ -14,12 +14,10 @@ Gem::Specification.new do |gem|
14
14
 
15
15
  gem.add_dependency 'railties', '>= 3.1'
16
16
  gem.add_dependency 'actionpack', '>= 3.1'
17
- gem.add_dependency 'jquery-rails'
18
-
17
+ gem.add_dependency 'jquery-rails', '>= 2.2.1'
18
+
19
19
  gem.add_development_dependency 'rails', '>= 3.1'
20
20
 
21
21
  gem.files = `git ls-files`.split($/)
22
- # gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
23
- # gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
24
22
  gem.require_paths = ["lib"]
25
23
  end
@@ -17,6 +17,9 @@ define(
17
17
 
18
18
  function(advice, utils, compose, registry) {
19
19
 
20
+ var functionNameRegEx = /function (.*?)\s?\(/;
21
+ var spaceCommaRegEx = /\s\,/g;
22
+
20
23
  function teardownInstance(instanceInfo){
21
24
  instanceInfo.events.slice().forEach(function(event) {
22
25
  var args = [event.type];
@@ -43,6 +46,17 @@ define(
43
46
  });
44
47
  }
45
48
 
49
+ function checkSerializable(type, data) {
50
+ try {
51
+ window.postMessage(data, '*');
52
+ } catch(e) {
53
+ console.log('unserializable data for event',type,':',data);
54
+ throw new Error(
55
+ ["The event", type, "on component", this.describe, "was triggered with non-serializable data"].join(" ")
56
+ );
57
+ }
58
+ }
59
+
46
60
  //common mixin allocates basic functionality - used by all component prototypes
47
61
  //callback context is bound to component
48
62
  function withBaseComponent() {
@@ -50,33 +64,43 @@ define(
50
64
  // delegate trigger, bind and unbind to an element
51
65
  // if $element not supplied, use component's node
52
66
  // other arguments are passed on
67
+ // event can be either a string specifying the type
68
+ // of the event, or a hash specifying both the type
69
+ // and a default function to be called.
53
70
  this.trigger = function() {
54
- var $element, type, data;
71
+ var $element, type, data, event, defaultFn;
55
72
  var args = utils.toArray(arguments);
73
+ var lastArg = args[args.length - 1];
56
74
 
57
- if (typeof args[args.length - 1] != "string") {
75
+ if (typeof lastArg != "string" && !(lastArg && lastArg.defaultBehavior)) {
58
76
  data = args.pop();
59
77
  }
60
78
 
61
79
  $element = (args.length == 2) ? $(args.shift()) : this.$node;
62
- type = args[0];
80
+ event = args[0];
81
+
82
+ if (event.defaultBehavior) {
83
+ defaultFn = event.defaultBehavior;
84
+ event = $.Event(event.type);
85
+ }
86
+
87
+ type = event.type || event;
63
88
 
64
89
  if (window.DEBUG && window.postMessage) {
65
- try {
66
- window.postMessage(data, '*');
67
- } catch(e) {
68
- console.log('unserializable data for event',type,':',data);
69
- throw new Error(
70
- ["The event", event.type, "on component", this.describe, "was triggered with non-serializable data"].join(" ")
71
- );
72
- }
90
+ checkSerializable.call(this, type, data);
73
91
  }
74
92
 
75
93
  if (typeof this.attr.eventData === 'object') {
76
94
  data = $.extend(true, {}, this.attr.eventData, data);
77
95
  }
78
96
 
79
- return $element.trigger(type, data);
97
+ var returnVal = $element.trigger((event || type), data);
98
+
99
+ if (defaultFn && !event.isDefaultPrevented()) {
100
+ (this[defaultFn] || defaultFn).call(this);
101
+ }
102
+
103
+ return returnVal;
80
104
  };
81
105
 
82
106
  this.on = function() {
@@ -92,7 +116,14 @@ define(
92
116
  originalCb = args.pop();
93
117
  }
94
118
 
95
- callback = originalCb && originalCb.bind(this);
119
+ $element = (args.length == 2) ? $(args.shift()) : this.$node;
120
+ type = args[0];
121
+
122
+ if (typeof originalCb != 'function' && typeof originalCb != 'object') {
123
+ throw new Error("Unable to bind to '" + type + "' because the given callback is not a function or an object");
124
+ }
125
+
126
+ callback = originalCb.bind(this);
96
127
  callback.target = originalCb;
97
128
 
98
129
  // if the original callback is already branded by jQuery's guid, copy it to the context-bound version
@@ -100,13 +131,6 @@ define(
100
131
  callback.guid = originalCb.guid;
101
132
  }
102
133
 
103
- $element = (args.length == 2) ? $(args.shift()) : this.$node;
104
- type = args[0];
105
-
106
- if (typeof callback == 'undefined') {
107
- throw new Error("Unable to bind to '" + type + "' because the given callback is undefined");
108
- }
109
-
110
134
  $element.on(type, callback);
111
135
 
112
136
  // get jquery's guid from our bound fn, so unbinding will work
@@ -177,13 +201,14 @@ define(
177
201
 
178
202
  Component.toString = function() {
179
203
  var prettyPrintMixins = mixins.map(function(mixin) {
180
- if ($.browser.msie) {
181
- var m = mixin.toString().match(/function (.*?)\s?\(/);
204
+ if (mixin.name == null) {
205
+ //function name property not supported by this browser, use regex
206
+ var m = mixin.toString().match(functionNameRegEx);
182
207
  return (m && m[1]) ? m[1] : "";
183
208
  } else {
184
209
  return mixin.name;
185
210
  }
186
- }).join(', ').replace(/\s\,/g,'');//weed out no-named mixins
211
+ }).join(', ').replace(spaceCommaRegEx,'');//weed out no-named mixins
187
212
 
188
213
  return prettyPrintMixins;
189
214
  };
@@ -10,7 +10,7 @@ define(
10
10
 
11
11
  [
12
12
  './utils',
13
- '../tools/debug/debug'
13
+ 'twitter/flight/tools/debug/debug'
14
14
  ],
15
15
 
16
16
  function(util, debug) {
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+
3
+ define(
4
+
5
+ [
6
+ '../../registry',
7
+ '../../utils'
8
+ ],
9
+
10
+ function(registry, utils) {
11
+
12
+ var logFilter;
13
+
14
+ //******************************************************************************************
15
+ // Search object model
16
+ //******************************************************************************************
17
+
18
+ function traverse(util, searchTerm, options) {
19
+ var options = options || {};
20
+ var obj = options.obj || window;
21
+ var path = options.path || ((obj==window) ? "window" : "");
22
+ var props = Object.keys(obj);
23
+ props.forEach(function(prop) {
24
+ if ((tests[util] || util)(searchTerm, obj, prop)){
25
+ console.log([path, ".", prop].join(""), "->",["(", typeof obj[prop], ")"].join(""), obj[prop]);
26
+ }
27
+ if(Object.prototype.toString.call(obj[prop])=="[object Object]" && (obj[prop] != obj) && path.split(".").indexOf(prop) == -1) {
28
+ traverse(util, searchTerm, {obj: obj[prop], path: [path,prop].join(".")});
29
+ }
30
+ });
31
+ }
32
+
33
+ function search(util, expected, searchTerm, options) {
34
+ if (!expected || typeof searchTerm == expected) {
35
+ traverse(util, searchTerm, options);
36
+ } else {
37
+ console.error([searchTerm, 'must be', expected].join(' '))
38
+ }
39
+ }
40
+
41
+ var tests = {
42
+ 'name': function(searchTerm, obj, prop) {return searchTerm == prop},
43
+ 'nameContains': function(searchTerm, obj, prop) {return prop.indexOf(searchTerm)>-1},
44
+ 'type': function(searchTerm, obj, prop) {return obj[prop] instanceof searchTerm},
45
+ 'value': function(searchTerm, obj, prop) {return obj[prop] === searchTerm},
46
+ 'valueCoerced': function(searchTerm, obj, prop) {return obj[prop] == searchTerm}
47
+ }
48
+
49
+ function byName(searchTerm, options) {search('name', 'string', searchTerm, options);};
50
+ function byNameContains(searchTerm, options) {search('nameContains', 'string', searchTerm, options);};
51
+ function byType(searchTerm, options) {search('type', 'function', searchTerm, options);};
52
+ function byValue(searchTerm, options) {search('value', null, searchTerm, options);};
53
+ function byValueCoerced(searchTerm, options) {search('valueCoerced', null, searchTerm, options);};
54
+ function custom(fn, options) {traverse(fn, null, options);};
55
+
56
+ //******************************************************************************************
57
+ // Event logging
58
+ //******************************************************************************************
59
+ var logLevel = 'all';
60
+ logFilter = {actions: logLevel, eventNames: logLevel}; //no filter by default
61
+
62
+ function filterEventLogsByAction(/*actions*/) {
63
+ var actions = [].slice.call(arguments, 0);
64
+
65
+ logFilter.eventNames.length || (logFilter.eventNames = 'all');
66
+ logFilter.actions = actions.length ? actions : 'all';
67
+ }
68
+
69
+ function filterEventLogsByName(/*eventNames*/) {
70
+ var eventNames = [].slice.call(arguments, 0);
71
+
72
+ logFilter.actions.length || (logFilter.actions = 'all');
73
+ logFilter.eventNames = eventNames.length ? eventNames : 'all';
74
+ }
75
+
76
+ function hideAllEventLogs() {
77
+ logFilter.actions = [];
78
+ logFilter.eventNames = [];
79
+ }
80
+
81
+ function showAllEventLogs() {
82
+ logFilter.actions = 'all';
83
+ logFilter.eventNames = 'all';
84
+ }
85
+
86
+ return {
87
+
88
+ enable: function(enable) {
89
+ this.enabled = !!enable;
90
+
91
+ if (enable && window.console) {
92
+ console.info('Booting in DEBUG mode');
93
+ console.info('You can filter event logging with DEBUG.events.logAll/logNone/logByName/logByAction');
94
+ }
95
+
96
+ window.DEBUG = this;
97
+ },
98
+
99
+ find: {
100
+ byName: byName,
101
+ byNameContains: byNameContains,
102
+ byType: byType,
103
+ byValue: byValue,
104
+ byValueCoerced: byValueCoerced,
105
+ custom: custom
106
+ },
107
+
108
+ events: {
109
+ logFilter: logFilter,
110
+
111
+ // Accepts any number of action args
112
+ // e.g. DEBUG.events.logByAction("on", "off")
113
+ logByAction: filterEventLogsByAction,
114
+
115
+ // Accepts any number of event name args (inc. regex or wildcards)
116
+ // e.g. DEBUG.events.logByName(/ui.*/, "*Thread*");
117
+ logByName: filterEventLogsByName,
118
+
119
+ logAll: showAllEventLogs,
120
+ logNone: hideAllEventLogs
121
+ }
122
+ };
123
+ }
124
+ );
125
+
@@ -1 +1 @@
1
- //= require_directory twitter/flight
1
+ //=require_directory ./flight
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter-flight-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-12 00:00:00.000000000 Z
12
+ date: 2013-02-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 2.2.1
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 2.2.1
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: rails
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -98,6 +98,7 @@ files:
98
98
  - vendor/assets/javascripts/twitter/flight/index.js
99
99
  - vendor/assets/javascripts/twitter/flight/logger.js
100
100
  - vendor/assets/javascripts/twitter/flight/registry.js
101
+ - vendor/assets/javascripts/twitter/flight/tools/debug/debug.js
101
102
  - vendor/assets/javascripts/twitter/flight/utils.js
102
103
  homepage: https://github.com/yourabi/twitter-flight-rails
103
104
  licenses: []