emerson 0.0.6 → 0.0.7
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.
    
        data/.gitignore
    CHANGED
    
    
    
        data/lib/emerson/version.rb
    CHANGED
    
    
| 
         @@ -21,7 +21,7 @@ 
     | 
|
| 
       21 
21 
     | 
    
         
             
              }
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
              // Current version of the library. Keep in sync with `package.json`.
         
     | 
| 
       24 
     | 
    
         
            -
              Emerson.VERSION = '0.0. 
     | 
| 
      
 24 
     | 
    
         
            +
              Emerson.VERSION = '0.0.7';
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
              // Reference the base lib (one of jQuery, Zepto or Ender) as $.
         
     | 
| 
       27 
27 
     | 
    
         
             
              var $ = Emerson.base = (root.jQuery || root.Zepto || root.ender);
         
     | 
| 
         @@ -79,12 +79,12 @@ 
     | 
|
| 
       79 
79 
     | 
    
         
             
                  var as_trait = element.add(element.find(selectors.traits)).filter(selectors.traits);
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
                  _.each(as_view, function(html) {
         
     | 
| 
       82 
     | 
    
         
            -
                    var element = $(html);
         
     | 
| 
      
 82 
     | 
    
         
            +
                    var element = $(html); // why jQuery here, if $sub() in a moment?
         
     | 
| 
       83 
83 
     | 
    
         
             
                    attach.call(element, views, [element.data(attrs.view)]);
         
     | 
| 
       84 
84 
     | 
    
         
             
                  });
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         
             
                  _.each(as_trait, function(html) {
         
     | 
| 
       87 
     | 
    
         
            -
                    var element = $(html);
         
     | 
| 
      
 87 
     | 
    
         
            +
                    var element = $(html); // why jQuery here, if $sub() in a moment?
         
     | 
| 
       88 
88 
     | 
    
         
             
                    attach.call(element, traits, element.data(attrs.traits).split(/\s+/), true);
         
     | 
| 
       89 
89 
     | 
    
         
             
                  });
         
     | 
| 
       90 
90 
     | 
    
         
             
                });
         
     | 
| 
         @@ -97,21 +97,68 @@ 
     | 
|
| 
       97 
97 
     | 
    
         
             
              // --------------------------------------------------------------------------
         
     | 
| 
       98 
98 
     | 
    
         | 
| 
       99 
99 
     | 
    
         
             
              // ### View constructor.
         
     | 
| 
       100 
     | 
    
         
            -
              //
         
     | 
| 
       101 
100 
     | 
    
         
             
              // View instances are "subclasses" of the base lib object, decorated with our
         
     | 
| 
       102 
101 
     | 
    
         
             
              // View.prototype and the provided definition.
         
     | 
| 
       103 
102 
     | 
    
         
             
              function View() {}
         
     | 
| 
       104 
103 
     | 
    
         | 
| 
       105 
     | 
    
         
            -
              // View  
     | 
| 
      
 104 
     | 
    
         
            +
              // ### View setup definition.
         
     | 
| 
       106 
105 
     | 
    
         
             
              _.extend(View, {
         
     | 
| 
       107 
106 
     | 
    
         
             
                setup : {
         
     | 
| 
       108 
107 
     | 
    
         
             
                  initialize : function() {},
         
     | 
| 
      
 108 
     | 
    
         
            +
                  connected  : false,
         
     | 
| 
       109 
109 
     | 
    
         
             
                  subscribe  : {}
         
     | 
| 
       110 
110 
     | 
    
         
             
                }
         
     | 
| 
       111 
111 
     | 
    
         
             
              });
         
     | 
| 
       112 
112 
     | 
    
         | 
| 
       113 
     | 
    
         
            -
              // View  
     | 
| 
       114 
     | 
    
         
            -
               
     | 
| 
      
 113 
     | 
    
         
            +
              // ### View prototype definition.
         
     | 
| 
      
 114 
     | 
    
         
            +
              // **TODO**: Add specs for #connect & #outlet.
         
     | 
| 
      
 115 
     | 
    
         
            +
              //
         
     | 
| 
      
 116 
     | 
    
         
            +
              //   * `connect` specifies which, if any, `outlets` should be registered as
         
     | 
| 
      
 117 
     | 
    
         
            +
              //     methods on the instance.
         
     | 
| 
      
 118 
     | 
    
         
            +
              //
         
     | 
| 
      
 119 
     | 
    
         
            +
              //         false       - do not connect any outlets (default)
         
     | 
| 
      
 120 
     | 
    
         
            +
              //         true        - connect all outlets
         
     | 
| 
      
 121 
     | 
    
         
            +
              //         [outlet(s)] - connect the named outlets.
         
     | 
| 
      
 122 
     | 
    
         
            +
              //
         
     | 
| 
      
 123 
     | 
    
         
            +
              //   * `outlet` returns descendent element(s) with matching a `data-outlet`
         
     | 
| 
      
 124 
     | 
    
         
            +
              //     attribute.  This may be used for a given outlet whether or not it has
         
     | 
| 
      
 125 
     | 
    
         
            +
              //     been "connected".  Outlets are useful as a means of allowing for View
         
     | 
| 
      
 126 
     | 
    
         
            +
              //     and Trait definitions with somewhat flexible DOM.  Rather than using
         
     | 
| 
      
 127 
     | 
    
         
            +
              //     specific selectors (or polluting the `class` attribute), the DOM for
         
     | 
| 
      
 128 
     | 
    
         
            +
              //     a given instance indicates which nodes should match for the View.
         
     | 
| 
      
 129 
     | 
    
         
            +
              _.extend(View.prototype, {
         
     | 
| 
      
 130 
     | 
    
         
            +
                connect : function(config) {
         
     | 
| 
      
 131 
     | 
    
         
            +
                  var self    = this;
         
     | 
| 
      
 132 
     | 
    
         
            +
                  var outlets = this.find('[data-outlet]');
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
                  if(config === true) {
         
     | 
| 
      
 135 
     | 
    
         
            +
                    _.each(outlets, function(subject) {
         
     | 
| 
      
 136 
     | 
    
         
            +
                      var outlet = $(subject);
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
                      self[outlet.data('outlet')] = function() {
         
     | 
| 
      
 139 
     | 
    
         
            +
                        return outlet;
         
     | 
| 
      
 140 
     | 
    
         
            +
                      };
         
     | 
| 
      
 141 
     | 
    
         
            +
                    });
         
     | 
| 
      
 142 
     | 
    
         
            +
                  }
         
     | 
| 
      
 143 
     | 
    
         
            +
                  else if($.isArray(config)) {
         
     | 
| 
      
 144 
     | 
    
         
            +
                    _.each(config, function(key) {
         
     | 
| 
      
 145 
     | 
    
         
            +
                      var outlet = self.find('[data-outlet="' + key + '"]');
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                      if(outlet.length) {
         
     | 
| 
      
 148 
     | 
    
         
            +
                        self[key] = function() {
         
     | 
| 
      
 149 
     | 
    
         
            +
                          return outlet;
         
     | 
| 
      
 150 
     | 
    
         
            +
                        };
         
     | 
| 
      
 151 
     | 
    
         
            +
                      }
         
     | 
| 
      
 152 
     | 
    
         
            +
                    });
         
     | 
| 
      
 153 
     | 
    
         
            +
                  }
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
                  return this;
         
     | 
| 
      
 156 
     | 
    
         
            +
                },
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                outlet : function(key) {
         
     | 
| 
      
 159 
     | 
    
         
            +
                  return this.find('[data-outlet="' + key + '"]');
         
     | 
| 
      
 160 
     | 
    
         
            +
                }
         
     | 
| 
      
 161 
     | 
    
         
            +
              });
         
     | 
| 
       115 
162 
     | 
    
         | 
| 
       116 
163 
     | 
    
         | 
| 
       117 
164 
     | 
    
         
             
              // Internal Implementation
         
     | 
| 
         @@ -195,7 +242,7 @@ 
     | 
|
| 
       195 
242 
     | 
    
         
             
                var id   = eid(this[0]);
         
     | 
| 
       196 
243 
     | 
    
         | 
| 
       197 
244 
     | 
    
         
             
                _.each(_.flatten(keys), function(key) {
         
     | 
| 
       198 
     | 
    
         
            -
                  var mode, match, built, init, events, set;
         
     | 
| 
      
 245 
     | 
    
         
            +
                  var mode, match, built, init, events, set, setup;
         
     | 
| 
       199 
246 
     | 
    
         | 
| 
       200 
247 
     | 
    
         
             
                  if(mode_p && (match = /^([^(]+)\((.+)\)/.exec(key))) {
         
     | 
| 
       201 
248 
     | 
    
         
             
                    key  = match[1];
         
     | 
| 
         @@ -208,17 +255,17 @@ 
     | 
|
| 
       208 
255 
     | 
    
         
             
                    return; // do not re-apply.
         
     | 
| 
       209 
256 
     | 
    
         
             
                  }
         
     | 
| 
       210 
257 
     | 
    
         | 
| 
       211 
     | 
    
         
            -
                  // Build an instance,  
     | 
| 
      
 258 
     | 
    
         
            +
                  // Build an instance, connect outlets, bind events, init and record.
         
     | 
| 
       212 
259 
     | 
    
         
             
                  if(def = library[key]) {
         
     | 
| 
       213 
     | 
    
         
            -
                     
     | 
| 
       214 
     | 
    
         
            -
                     
     | 
| 
       215 
     | 
    
         
            -
                     
     | 
| 
      
 260 
     | 
    
         
            +
                    setup = def.setup;
         
     | 
| 
      
 261 
     | 
    
         
            +
                    built = def(self, self.context);
         
     | 
| 
      
 262 
     | 
    
         
            +
                    built.connect(setup.connected);
         
     | 
| 
       216 
263 
     | 
    
         | 
| 
       217 
     | 
    
         
            -
                    _.each( 
     | 
| 
      
 264 
     | 
    
         
            +
                    _.each(setup.subscribe, function(handler, key) {
         
     | 
| 
       218 
265 
     | 
    
         
             
                      bind(built, key, handler);
         
     | 
| 
       219 
266 
     | 
    
         
             
                    });
         
     | 
| 
       220 
267 
     | 
    
         | 
| 
       221 
     | 
    
         
            -
                     
     | 
| 
      
 268 
     | 
    
         
            +
                    setup.initialize.call(built, mode);
         
     | 
| 
       222 
269 
     | 
    
         
             
                    set.push(id);
         
     | 
| 
       223 
270 
     | 
    
         
             
                  }
         
     | 
| 
       224 
271 
     | 
    
         
             
                });
         
     | 
| 
         @@ -231,17 +278,20 @@ 
     | 
|
| 
       231 
278 
     | 
    
         
             
              //
         
     | 
| 
       232 
279 
     | 
    
         
             
              //     Emerson.view(key, {
         
     | 
| 
       233 
280 
     | 
    
         
             
              //       subscribe : {
         
     | 
| 
       234 
     | 
    
         
            -
              //         'click'       : handler, 
     | 
| 
       235 
     | 
    
         
            -
              //         'click focus' : handler, 
     | 
| 
       236 
     | 
    
         
            -
              //         'selector'    : { 
     | 
| 
      
 281 
     | 
    
         
            +
              //         'click'       : handler,     // simple
         
     | 
| 
      
 282 
     | 
    
         
            +
              //         'click focus' : handler,     // multiple event types
         
     | 
| 
      
 283 
     | 
    
         
            +
              //         'selector'    : {            // specific child target
         
     | 
| 
       237 
284 
     | 
    
         
             
              //           'click'     : handler,
         
     | 
| 
       238 
285 
     | 
    
         
             
              //           'focus'     : handler
         
     | 
| 
       239 
286 
     | 
    
         
             
              //         },
         
     | 
| 
       240 
     | 
    
         
            -
              //         document      : { 
     | 
| 
       241 
     | 
    
         
            -
              //           'click'     : handler 
     | 
| 
       242 
     | 
    
         
            -
              //           'selector'  : { 
     | 
| 
      
 287 
     | 
    
         
            +
              //         document      : {            // bind document, for events
         
     | 
| 
      
 288 
     | 
    
         
            +
              //           'click'     : handler      // fired outside of the view
         
     | 
| 
      
 289 
     | 
    
         
            +
              //           'selector'  : {
         
     | 
| 
       243 
290 
     | 
    
         
             
              //             'click'   : handler
         
     | 
| 
       244 
     | 
    
         
            -
              //           } 
     | 
| 
      
 291 
     | 
    
         
            +
              //           }
         
     | 
| 
      
 292 
     | 
    
         
            +
              //         },
         
     | 
| 
      
 293 
     | 
    
         
            +
              //         'outlet:name' : {            // a custom key to specify a
         
     | 
| 
      
 294 
     | 
    
         
            +
              //           'click' : handler          // defined outlet as the scope
         
     | 
| 
       245 
295 
     | 
    
         
             
              //         }
         
     | 
| 
       246 
296 
     | 
    
         
             
              //       }
         
     | 
| 
       247 
297 
     | 
    
         
             
              //     });
         
     | 
| 
         @@ -251,31 +301,38 @@ 
     | 
|
| 
       251 
301 
     | 
    
         
             
              // event argument is unadultered, allowing access to the full set of targets
         
     | 
| 
       252 
302 
     | 
    
         
             
              // as defined by the baselib (e.g., jQuery).
         
     | 
| 
       253 
303 
     | 
    
         
             
              //
         
     | 
| 
       254 
     | 
    
         
            -
              //  
     | 
| 
       255 
     | 
    
         
            -
              // 
     | 
| 
       256 
     | 
    
         
            -
              //  
     | 
| 
      
 304 
     | 
    
         
            +
              // **Special notes regarding document-bound handlers**:
         
     | 
| 
      
 305 
     | 
    
         
            +
              //
         
     | 
| 
      
 306 
     | 
    
         
            +
              // Binding an event like `click` (without selector scope) to the document
         
     | 
| 
      
 307 
     | 
    
         
            +
              // would likely be a bad idea.  A more useful (and less costly) use case
         
     | 
| 
      
 308 
     | 
    
         
            +
              // would be a sort of pub/sub.  For example, view "A" could trigger an event
         
     | 
| 
      
 309 
     | 
    
         
            +
              // indicating that it has rendered a new instance, to which "B" (elsewhere)
         
     | 
| 
      
 310 
     | 
    
         
            +
              // would listen in order to update, say, a count of instances of "A".
         
     | 
| 
       257 
311 
     | 
    
         
             
              //
         
     | 
| 
       258 
     | 
    
         
            -
              //  
     | 
| 
       259 
     | 
    
         
            -
              //  
     | 
| 
       260 
     | 
    
         
            -
               
     | 
| 
       261 
     | 
    
         
            -
              function bind(instance, key, handler, selector) {
         
     | 
| 
      
 312 
     | 
    
         
            +
              // Additionally, event handlers bound to the document will not be cleaned
         
     | 
| 
      
 313 
     | 
    
         
            +
              // up when the associated view instance is removed.
         
     | 
| 
      
 314 
     | 
    
         
            +
              function bind(instance, key, handler, selector, binder) {
         
     | 
| 
       262 
315 
     | 
    
         
             
                if($.isPlainObject(handler)) {
         
     | 
| 
       263 
     | 
    
         
            -
                   
     | 
| 
       264 
     | 
    
         
            -
                     
     | 
| 
       265 
     | 
    
         
            -
             
     | 
| 
       266 
     | 
    
         
            -
                }
         
     | 
| 
       267 
     | 
    
         
            -
                else {
         
     | 
| 
       268 
     | 
    
         
            -
                  if(selector === 'document') {
         
     | 
| 
       269 
     | 
    
         
            -
                    $(document).on(key, function() {
         
     | 
| 
       270 
     | 
    
         
            -
                      return handler.apply(instance, arguments);
         
     | 
| 
      
 316 
     | 
    
         
            +
                  if(key === 'document') {
         
     | 
| 
      
 317 
     | 
    
         
            +
                    _.each(handler, function(subhandler, subkey) {
         
     | 
| 
      
 318 
     | 
    
         
            +
                      bind(instance, subkey, subhandler, undefined, $(document));
         
     | 
| 
       271 
319 
     | 
    
         
             
                    });
         
     | 
| 
       272 
320 
     | 
    
         
             
                  }
         
     | 
| 
       273 
321 
     | 
    
         
             
                  else {
         
     | 
| 
       274 
     | 
    
         
            -
                     
     | 
| 
       275 
     | 
    
         
            -
                       
     | 
| 
      
 322 
     | 
    
         
            +
                    _.each(handler, function(subhandler, subkey) {
         
     | 
| 
      
 323 
     | 
    
         
            +
                      bind(instance, subkey, subhandler, key, binder);
         
     | 
| 
       276 
324 
     | 
    
         
             
                    });
         
     | 
| 
       277 
325 
     | 
    
         
             
                  }
         
     | 
| 
       278 
326 
     | 
    
         
             
                }
         
     | 
| 
      
 327 
     | 
    
         
            +
                else {
         
     | 
| 
      
 328 
     | 
    
         
            +
                  if(/^outlet/.test(selector)) {
         
     | 
| 
      
 329 
     | 
    
         
            +
                    selector = '[data-outlet="' + selector.split(':')[1] + '"]';
         
     | 
| 
      
 330 
     | 
    
         
            +
                  }
         
     | 
| 
      
 331 
     | 
    
         
            +
             
     | 
| 
      
 332 
     | 
    
         
            +
                  (binder || instance).on(key, selector, function() { // selector may be undefined
         
     | 
| 
      
 333 
     | 
    
         
            +
                    return handler.apply(instance, arguments);
         
     | 
| 
      
 334 
     | 
    
         
            +
                  });
         
     | 
| 
      
 335 
     | 
    
         
            +
                }
         
     | 
| 
       279 
336 
     | 
    
         
             
              }
         
     | 
| 
       280 
337 
     | 
    
         | 
| 
       281 
338 
     | 
    
         
             
              // ### $sub
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: emerson
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.7
         
     | 
| 
       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: 2012-05- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2012-05-16 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       14 
14 
     | 
    
         
             
            description: transcendent views
         
     | 
| 
       15 
15 
     | 
    
         
             
            email:
         
     |