coolerator.vision 0.2.4 → 0.2.5
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/VERSION +1 -1
- data/coolerator.vision.gemspec +2 -2
- data/public/javascripts/vendor/coolerator/coolerator.base.js +0 -1
- data/public/javascripts/vendor/coolerator/coolerator.filter.js +87 -37
- data/public/javascripts/vendor/coolerator/coolerator.view.js +49 -51
- data/spec/javascripts/vendor/coolerator/coolerator.filter_spec.js +261 -7
- data/spec/javascripts/vendor/coolerator/coolerator.view_spec.js +355 -58
- metadata +2 -2
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.2. | 
| 1 | 
            +
            0.2.5
         | 
    
        data/coolerator.vision.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{coolerator.vision}
         | 
| 8 | 
            -
              s.version = "0.2. | 
| 8 | 
            +
              s.version = "0.2.5"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Corey Innis"]
         | 
| 12 | 
            -
              s.date = %q{2009-11- | 
| 12 | 
            +
              s.date = %q{2009-11-16}
         | 
| 13 13 | 
             
              s.description = %q{A Rails plugin}
         | 
| 14 14 | 
             
              s.email = %q{corey@coolerator.net}
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| @@ -1,57 +1,107 @@ | |
| 1 1 | 
             
            (function($) {
         | 
| 2 2 | 
             
              $.extend(Coolerator, {
         | 
| 3 3 | 
             
                Filters : {
         | 
| 4 | 
            -
                   | 
| 5 | 
            -
             | 
| 4 | 
            +
                  count : function count() {
         | 
| 5 | 
            +
                    return __count__;
         | 
| 6 | 
            +
                  },
         | 
| 6 7 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
                     | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 8 | 
            +
                  clear : function clear() {
         | 
| 9 | 
            +
                    __database__ = {};
         | 
| 10 | 
            +
                    __count__    = 0;
         | 
| 11 | 
            +
                  },
         | 
| 11 12 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 13 | 
            +
                  prepare : function prepare() {
         | 
| 14 | 
            +
                    if(2 !== arguments.length) {
         | 
| 15 | 
            +
                      throw("InvalidArgumentException");
         | 
| 16 | 
            +
                    }
         | 
| 15 17 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
                    var  | 
| 18 | 
            +
                    var view  = arguments[0];
         | 
| 19 | 
            +
                    var scope = arguments[1];
         | 
| 18 20 |  | 
| 19 | 
            -
                    if('object'  | 
| 20 | 
            -
                       | 
| 21 | 
            +
                    if('object' !== typeof view || 'string' !== typeof scope) {
         | 
| 22 | 
            +
                      throw("InvalidArgumentException");
         | 
| 23 | 
            +
                    }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    $.each(view, function prepare_views(name, content) {
         | 
| 26 | 
            +
                      view[name] = $(content);
         | 
| 27 | 
            +
                    });
         | 
| 21 28 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                         | 
| 26 | 
            -
                      };
         | 
| 29 | 
            +
                    var filters = retrieve(scope);
         | 
| 30 | 
            +
                    function before() {
         | 
| 31 | 
            +
                      $.each(filters, function(i, filter) {
         | 
| 32 | 
            +
                        filter.before(view);
         | 
| 33 | 
            +
                      });
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                      return { after : after };
         | 
| 27 36 | 
             
                    }
         | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 37 | 
            +
             | 
| 38 | 
            +
                    function after() {
         | 
| 39 | 
            +
                      $.each(filters, function(i, filter) {
         | 
| 40 | 
            +
                        filter.after(view);
         | 
| 41 | 
            +
                      });
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      return { before : before };
         | 
| 30 44 | 
             
                    }
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    return {
         | 
| 47 | 
            +
                      before : before,
         | 
| 48 | 
            +
                      after  : after
         | 
| 49 | 
            +
                    };
         | 
| 31 50 | 
             
                  }
         | 
| 51 | 
            +
                },
         | 
| 32 52 |  | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
                     | 
| 37 | 
            -
                     | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 53 | 
            +
                Filter : function Filter() {
         | 
| 54 | 
            +
                  var scopes = arguments.length ? arguments : ['*'];
         | 
| 55 | 
            +
                  var filter = {
         | 
| 56 | 
            +
                    before : no_op,
         | 
| 57 | 
            +
                    after  : no_op
         | 
| 58 | 
            +
                  }
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  $.each(scopes, function(i, scope) {
         | 
| 61 | 
            +
                    store(scope, filter);
         | 
| 40 62 | 
             
                  });
         | 
| 41 | 
            -
                }
         | 
| 42 | 
            -
              });
         | 
| 43 63 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
                    this.before = fn;
         | 
| 64 | 
            +
                  function before(fn) {
         | 
| 65 | 
            +
                    filter.before = fn;
         | 
| 66 | 
            +
                    return { after : after };
         | 
| 48 67 | 
             
                  }
         | 
| 49 | 
            -
                },
         | 
| 50 68 |  | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
                     | 
| 69 | 
            +
                  function after(fn) {
         | 
| 70 | 
            +
                    filter.after = fn;
         | 
| 71 | 
            +
                    return { before : before };
         | 
| 54 72 | 
             
                  }
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  return {
         | 
| 75 | 
            +
                    before : before,
         | 
| 76 | 
            +
                    after  : after
         | 
| 77 | 
            +
                  };
         | 
| 55 78 | 
             
                }
         | 
| 56 79 | 
             
              });
         | 
| 80 | 
            +
             | 
| 81 | 
            +
             | 
| 82 | 
            +
              // private...................................................................
         | 
| 83 | 
            +
             | 
| 84 | 
            +
              var __count__    = 0;
         | 
| 85 | 
            +
              var __database__ = {};
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              function no_op() {}
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              function store(scope, filter) {
         | 
| 90 | 
            +
                if('object' === typeof scope) {
         | 
| 91 | 
            +
                  filter = scope;
         | 
| 92 | 
            +
                  scope  = '*';
         | 
| 93 | 
            +
                }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                __database__[scope] = __database__[scope] || [];
         | 
| 96 | 
            +
                __database__[scope].push(filter);
         | 
| 97 | 
            +
                __count__ += 1;
         | 
| 98 | 
            +
              }
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              function retrieve(scope) {
         | 
| 101 | 
            +
                if('*' === scope) {
         | 
| 102 | 
            +
                  return __database__['*'] || [];
         | 
| 103 | 
            +
                }
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                return $.merge(__database__['*'] || [], __database__[scope] || []);
         | 
| 106 | 
            +
              }
         | 
| 57 107 | 
             
            })(jQuery);
         | 
| @@ -1,85 +1,83 @@ | |
| 1 1 | 
             
            (function($) {
         | 
| 2 | 
            +
              var __database__ = {
         | 
| 3 | 
            +
                collections : {},
         | 
| 4 | 
            +
                instances   : {}
         | 
| 5 | 
            +
              };
         | 
| 6 | 
            +
             | 
| 2 7 | 
             
              $.extend(Coolerator, {
         | 
| 3 | 
            -
                Views : { | 
| 8 | 
            +
                Views : {
         | 
| 9 | 
            +
                  get : function get(classifier) {
         | 
| 10 | 
            +
                    if( ! classifier || /\s+/.test(classifier)) {
         | 
| 11 | 
            +
                      throw("InvalidArgumentException");
         | 
| 12 | 
            +
                    }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    return __database__.collections[classifier];
         | 
| 15 | 
            +
                  }
         | 
| 16 | 
            +
                },
         | 
| 4 17 |  | 
| 5 18 | 
             
                View : function View(classifier) {
         | 
| 19 | 
            +
                  if( ! classifier || /\s+/.test(classifier)) {
         | 
| 20 | 
            +
                    throw("InvalidArgumentException");
         | 
| 21 | 
            +
                  }
         | 
| 22 | 
            +
             | 
| 6 23 | 
             
                  this.classifier = classifier;
         | 
| 7 24 |  | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 25 | 
            +
                  __database__.collections[this.classifier] = this;
         | 
| 26 | 
            +
                  __database__.instances  [this.classifier] = {
         | 
| 27 | 
            +
                    content : function content(builder, attributes) {
         | 
| 28 | 
            +
                      var html_attributes = attributes.classifier ? { 'class' : attributes.classifier } : {};
         | 
| 12 29 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 30 | 
            +
                      with(builder) {
         | 
| 31 | 
            +
                        div(html_attributes);
         | 
| 32 | 
            +
                      }
         | 
| 33 | 
            +
                    },
         | 
| 17 34 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
                          }
         | 
| 35 | 
            +
                    methods : {
         | 
| 36 | 
            +
                      initialize : function initialize() {
         | 
| 37 | 
            +
                        if(this.content) {
         | 
| 38 | 
            +
                          this.html(this.content);
         | 
| 23 39 | 
             
                        }
         | 
| 24 40 | 
             
                      }
         | 
| 25 41 | 
             
                    }
         | 
| 26 | 
            -
                  } | 
| 27 | 
            -
             | 
| 28 | 
            -
                  Coolerator.Views[classifier] = this;
         | 
| 42 | 
            +
                  };
         | 
| 29 43 | 
             
                }
         | 
| 30 44 | 
             
              });
         | 
| 31 45 |  | 
| 32 46 | 
             
              $.extend(Coolerator.View.prototype, {
         | 
| 33 | 
            -
                 | 
| 47 | 
            +
                subscribe : function subscribe(fn) {
         | 
| 48 | 
            +
                  Coolerator.Registrar.subscribe(this, fn);
         | 
| 49 | 
            +
                },
         | 
| 34 50 |  | 
| 35 51 | 
             
                extend : function extend(extension) {
         | 
| 36 | 
            -
                  var  | 
| 52 | 
            +
                  var instance = extension.instance || {};
         | 
| 53 | 
            +
                  var existing = __database__.instances[this.classifier];
         | 
| 54 | 
            +
                  delete extension.instance;
         | 
| 37 55 |  | 
| 38 | 
            -
                  $.each( | 
| 39 | 
            -
                     | 
| 40 | 
            -
             | 
| 56 | 
            +
                  $.each(instance.methods || {}, function(name, fn) {
         | 
| 57 | 
            +
                    var superb = existing.methods[name];
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    if(superb) {
         | 
| 41 60 | 
             
                      function sup() {
         | 
| 42 61 | 
             
                        var args = $.makeArray(arguments);
         | 
| 43 62 | 
             
                        superb.apply(args.shift(), args);
         | 
| 44 63 | 
             
                      }
         | 
| 64 | 
            +
             | 
| 45 65 | 
             
                      $.extend(fn, { 'super' : sup });
         | 
| 46 66 | 
             
                    }
         | 
| 47 67 | 
             
                  });
         | 
| 48 68 |  | 
| 49 | 
            -
                  $.extend(true, this. | 
| 50 | 
            -
                   | 
| 51 | 
            -
                    $.extend(true, this, extension.collection.methods, extension.collection.configuration);
         | 
| 52 | 
            -
                  }
         | 
| 53 | 
            -
                },
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                subscribe : function subscribe(callback) {
         | 
| 56 | 
            -
                  var self = this;
         | 
| 57 | 
            -
                  callback = callback.toString().match(Coolerator.REGEX.FUNCTION_BODY)[1];
         | 
| 58 | 
            -
                  callback = new Function('registrar', 'with(registrar) { ' + callback + ' } ;');
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                  Coolerator.Registrar.subscribe(self, callback);
         | 
| 69 | 
            +
                  $.extend(true, __database__.instances[this.classifier], instance);
         | 
| 70 | 
            +
                  $.extend(true, this, extension);
         | 
| 61 71 | 
             
                },
         | 
| 62 72 |  | 
| 63 73 | 
             
                build : function build(attributes) {
         | 
| 64 | 
            -
                   | 
| 65 | 
            -
                    return this.cache.instance;
         | 
| 66 | 
            -
                  }
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                  var result = Prez.build(this.instance, $.extend({ collection: this, classifier : this.classifier }, (attributes || {})));
         | 
| 69 | 
            -
             | 
| 70 | 
            -
                  // TODO: consider making a call to view.subscribe
         | 
| 71 | 
            -
                  function subscribe(callback) {
         | 
| 72 | 
            -
                    if(callback) {
         | 
| 73 | 
            -
                      callback = callback.toString().match(Coolerator.REGEX.FUNCTION_BODY)[1];
         | 
| 74 | 
            -
                      callback = new Function('registrar', 'with(registrar) { ' + callback + ' } ;');
         | 
| 75 | 
            -
                      Coolerator.Registrar.subscribe(result, callback);
         | 
| 76 | 
            -
                    }
         | 
| 77 | 
            -
                  }
         | 
| 74 | 
            +
                  // TODO: provide a template cacheing mechanism.
         | 
| 78 75 |  | 
| 79 | 
            -
                   | 
| 76 | 
            +
                  var instance = __database__.instances[this.classifier];
         | 
| 77 | 
            +
                  var result   = Prez.build(instance, $.extend({ classifier : this.classifier }, (attributes || {})));
         | 
| 80 78 |  | 
| 81 | 
            -
                  if( | 
| 82 | 
            -
                     | 
| 79 | 
            +
                  if(result.subscribe) {
         | 
| 80 | 
            +
                    Coolerator.Registrar.subscribe(result, result.subscribe);
         | 
| 83 81 | 
             
                  }
         | 
| 84 82 |  | 
| 85 83 | 
             
                  return result;
         | 
| @@ -1,20 +1,274 @@ | |
| 1 1 | 
             
            //= require <support/spec_helper>
         | 
| 2 2 |  | 
| 3 3 | 
             
            Screw.Unit(function(c) { with(c) {
         | 
| 4 | 
            +
              after(function() {
         | 
| 5 | 
            +
                Coolerator.Filters.clear();
         | 
| 6 | 
            +
              });
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              describe("an example", function() {
         | 
| 9 | 
            +
                before(function() {
         | 
| 10 | 
            +
                  Coolerator.Filter('scope/one', 'scope/two')
         | 
| 11 | 
            +
                    .before(function(view) {
         | 
| 12 | 
            +
                      $.each(view, function(key, partial) {
         | 
| 13 | 
            +
                        partial.css('border', 'yellow');
         | 
| 14 | 
            +
                      });
         | 
| 15 | 
            +
                    })
         | 
| 16 | 
            +
                    .after(function(view) {
         | 
| 17 | 
            +
                      $.each(view, function(key, partial) {
         | 
| 18 | 
            +
                        partial.css('border', 'green');
         | 
| 19 | 
            +
                      });
         | 
| 20 | 
            +
                    });
         | 
| 21 | 
            +
                });
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                it("behaves", function() {
         | 
| 24 | 
            +
                  var templates = { show : '<div>content</div>' };
         | 
| 25 | 
            +
                  var filters   = Coolerator.Filters.prepare(templates, 'scope/one');
         | 
| 26 | 
            +
                  expect(templates.show.jquery).to_not(be_undefined);
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  filters.before();
         | 
| 29 | 
            +
                  expect(templates.show.css('border')).to(match, 'yellow');
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  filters.after();
         | 
| 32 | 
            +
                  expect(templates.show.css('border')).to(match, 'green');
         | 
| 33 | 
            +
                });
         | 
| 34 | 
            +
              });
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              describe("Coolerator.Filters", function() {
         | 
| 37 | 
            +
                it("is added to the Coolerator namespace", function() {
         | 
| 38 | 
            +
                  expect(typeof Coolerator.Filters).to(equal, 'object');
         | 
| 39 | 
            +
                });
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                describe("methods", function() {
         | 
| 42 | 
            +
                  describe(".count", function() {
         | 
| 43 | 
            +
                    before(function() {
         | 
| 44 | 
            +
                      Coolerator.Filter({});
         | 
| 45 | 
            +
                      Coolerator.Filter({ scope : 'scope 1' });
         | 
| 46 | 
            +
                      Coolerator.Filter({ scope : 'scope 1' });
         | 
| 47 | 
            +
                      Coolerator.Filter({ scope : 'scope 2' });
         | 
| 48 | 
            +
                    });
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    it("returns the count of filters, regardless of scope", function() {
         | 
| 51 | 
            +
                      expect(Coolerator.Filters.count()).to(equal, 4);
         | 
| 52 | 
            +
                    });
         | 
| 53 | 
            +
                  });
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  describe(".clear", function() {
         | 
| 56 | 
            +
                    before(function() {
         | 
| 57 | 
            +
                      Coolerator.Filter({ label : 'clear' });
         | 
| 58 | 
            +
                    });
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    it("sets 'count' to 0", function() {
         | 
| 61 | 
            +
                      expect(Coolerator.Filters.count()).to(equal, 1);
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                      Coolerator.Filters.clear();
         | 
| 64 | 
            +
                      expect(Coolerator.Filters.count()).to(equal, 0);
         | 
| 65 | 
            +
                    });
         | 
| 66 | 
            +
                  });
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  describe(".prepare", function() {
         | 
| 69 | 
            +
                    var view;
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    before(function() {
         | 
| 72 | 
            +
                      view = { show : '<div>content</div>' };
         | 
| 73 | 
            +
                    });
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    describe("argument handling", function() {
         | 
| 76 | 
            +
                      var filters;
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                      context("with appropriate arguments", function() {
         | 
| 79 | 
            +
                        before(function() {
         | 
| 80 | 
            +
                          filters = Coolerator.Filters.prepare(view, '*');
         | 
| 81 | 
            +
                        });
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                        it("converts the view 'partials' to jQuery objects", function() {
         | 
| 84 | 
            +
                          expect(view.show.jquery).to_not(be_undefined);
         | 
| 85 | 
            +
                        });
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                        describe("the returned filter helper", function() {
         | 
| 88 | 
            +
                          it("defines #before", function() {
         | 
| 89 | 
            +
                            expect(filters.before).to_not(throw_exception);
         | 
| 90 | 
            +
                          });
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                          it("defines #after", function() {
         | 
| 93 | 
            +
                            expect(filters.after).to_not(throw_exception);
         | 
| 94 | 
            +
                          });
         | 
| 95 | 
            +
                        });
         | 
| 96 | 
            +
                      });
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                      context("with fewer than two", function() {
         | 
| 99 | 
            +
                        before(function() {
         | 
| 100 | 
            +
                          fn = function fn() {
         | 
| 101 | 
            +
                            Coolerator.Filters.prepare({});
         | 
| 102 | 
            +
                          };
         | 
| 103 | 
            +
                        });
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                        it("throws an exception", function() {
         | 
| 106 | 
            +
                          expect(fn).to(throw_exception);
         | 
| 107 | 
            +
                        });
         | 
| 108 | 
            +
                      });
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                      context("with more than two", function() {
         | 
| 111 | 
            +
                        before(function() {
         | 
| 112 | 
            +
                          fn = function fn() {
         | 
| 113 | 
            +
                            Coolerator.Filters.prepare({}, 'scope', 'something else');
         | 
| 114 | 
            +
                          };
         | 
| 115 | 
            +
                        });
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                        it("throws an exception", function() {
         | 
| 118 | 
            +
                          expect(fn).to(throw_exception);
         | 
| 119 | 
            +
                        });
         | 
| 120 | 
            +
                      });
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                      context("with an undefined 'view'", function() {
         | 
| 123 | 
            +
                        before(function() {
         | 
| 124 | 
            +
                          fn = function fn() {
         | 
| 125 | 
            +
                            Coolerator.Filters.prepare(undefined, 'scope');
         | 
| 126 | 
            +
                          };
         | 
| 127 | 
            +
                        });
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                        it("throws an exception", function() {
         | 
| 130 | 
            +
                          expect(fn).to(throw_exception);
         | 
| 131 | 
            +
                        });
         | 
| 132 | 
            +
                      });
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                      context("with an undefined 'scope'", function() {
         | 
| 135 | 
            +
                        before(function() {
         | 
| 136 | 
            +
                          fn = function fn() {
         | 
| 137 | 
            +
                            Coolerator.Filters.prepare({ show : '<div>content</div>' }, undefined);
         | 
| 138 | 
            +
                          };
         | 
| 139 | 
            +
                        });
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                        it("throws an exception", function() {
         | 
| 142 | 
            +
                          expect(fn).to(throw_exception);
         | 
| 143 | 
            +
                        });
         | 
| 144 | 
            +
                      });
         | 
| 145 | 
            +
                    });
         | 
| 146 | 
            +
                  });
         | 
| 147 | 
            +
                });
         | 
| 148 | 
            +
              });
         | 
| 149 | 
            +
             | 
| 4 150 | 
             
              describe("Coolerator.Filter", function() {
         | 
| 151 | 
            +
                var filter;
         | 
| 152 | 
            +
             | 
| 5 153 | 
             
                it("is added to the Coolerator namespace", function() {
         | 
| 6 154 | 
             
                  expect(typeof Coolerator.Filter).to(equal, 'function');
         | 
| 7 155 | 
             
                });
         | 
| 8 156 |  | 
| 9 | 
            -
                 | 
| 10 | 
            -
                   | 
| 11 | 
            -
                     | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 157 | 
            +
                describe("the returned object", function() {
         | 
| 158 | 
            +
                  before(function() {
         | 
| 159 | 
            +
                    filter = Coolerator.Filter();
         | 
| 160 | 
            +
                  });
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  it("is defined", function() {
         | 
| 163 | 
            +
                    expect(filter).to_not(be_undefined);
         | 
| 164 | 
            +
                  });
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                  it("defines #before", function() {
         | 
| 167 | 
            +
                    expect(filter.before).to_not(be_undefined);
         | 
| 168 | 
            +
                  });
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                  it("defines #after", function() {
         | 
| 171 | 
            +
                    expect(filter.after).to_not(be_undefined);
         | 
| 172 | 
            +
                  });
         | 
| 173 | 
            +
                });
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                describe("argument handling", function() {
         | 
| 176 | 
            +
                  var called;
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                  before(function() {
         | 
| 179 | 
            +
                    called = {
         | 
| 180 | 
            +
                      before : false,
         | 
| 181 | 
            +
                      after  : false
         | 
| 182 | 
            +
                    }
         | 
| 183 | 
            +
                  });
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                  context("called with no scope", function() {
         | 
| 186 | 
            +
                    before(function() {
         | 
| 187 | 
            +
                      Coolerator.Filter()
         | 
| 188 | 
            +
                        .before(function(view) {
         | 
| 189 | 
            +
                          called.before = true;
         | 
| 190 | 
            +
                        })
         | 
| 191 | 
            +
                        .after(function(view) {
         | 
| 192 | 
            +
                          called.after = true;
         | 
| 193 | 
            +
                        });
         | 
| 194 | 
            +
                    });
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                    it("adds the filter to the 'global' scope", function() {
         | 
| 197 | 
            +
                      Coolerator.Filters.prepare({}, '*')
         | 
| 198 | 
            +
                        .before()
         | 
| 199 | 
            +
                        .after();
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                      expect(called.before).to(be_true);
         | 
| 202 | 
            +
                      expect(called.after ).to(be_true);
         | 
| 14 203 | 
             
                    });
         | 
| 204 | 
            +
                  });
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                  context("called with a single scope", function() {
         | 
| 207 | 
            +
                    before(function() {
         | 
| 208 | 
            +
                      Coolerator.Filter('one')
         | 
| 209 | 
            +
                        .before(function(view) {
         | 
| 210 | 
            +
                          called.before = true;
         | 
| 211 | 
            +
                        })
         | 
| 212 | 
            +
                        .after(function(view) {
         | 
| 213 | 
            +
                          called.after = true;
         | 
| 214 | 
            +
                        });
         | 
| 215 | 
            +
                    });
         | 
| 216 | 
            +
             | 
| 217 | 
            +
                    it("adds the filter to the provided scope", function() {
         | 
| 218 | 
            +
                      Coolerator.Filters.prepare({}, 'one')
         | 
| 219 | 
            +
                        .before()
         | 
| 220 | 
            +
                        .after();
         | 
| 221 | 
            +
             | 
| 222 | 
            +
                      expect(called.before).to(be_true);
         | 
| 223 | 
            +
                      expect(called.after ).to(be_true);
         | 
| 224 | 
            +
                    });
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                    it("does not add the filter to the global scope", function() {
         | 
| 227 | 
            +
                      Coolerator.Filters.prepare({}, '*')
         | 
| 228 | 
            +
                        .before()
         | 
| 229 | 
            +
                        .after();
         | 
| 230 | 
            +
             | 
| 231 | 
            +
                      expect(called.before).to(be_false);
         | 
| 232 | 
            +
                      expect(called.after ).to(be_false);
         | 
| 233 | 
            +
                    });
         | 
| 234 | 
            +
                  });
         | 
| 235 | 
            +
             | 
| 236 | 
            +
                  context("called with multiple scopes", function() {
         | 
| 237 | 
            +
                    before(function() {
         | 
| 238 | 
            +
                      Coolerator.Filter('one', 'two')
         | 
| 239 | 
            +
                        .before(function(view) {
         | 
| 240 | 
            +
                          called.before = true;
         | 
| 241 | 
            +
                        })
         | 
| 242 | 
            +
                        .after(function(view) {
         | 
| 243 | 
            +
                          called.after = true;
         | 
| 244 | 
            +
                        });
         | 
| 245 | 
            +
                    });
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                    it("adds the filter to the first provided scope", function() {
         | 
| 248 | 
            +
                      Coolerator.Filters.prepare({}, 'one')
         | 
| 249 | 
            +
                        .before()
         | 
| 250 | 
            +
                        .after();
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                      expect(called.before).to(be_true);
         | 
| 253 | 
            +
                      expect(called.after ).to(be_true);
         | 
| 254 | 
            +
                    });
         | 
| 255 | 
            +
             | 
| 256 | 
            +
                    it("adds the filter to the first provided scope", function() {
         | 
| 257 | 
            +
                      Coolerator.Filters.prepare({}, 'two')
         | 
| 258 | 
            +
                        .before()
         | 
| 259 | 
            +
                        .after();
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                      expect(called.before).to(be_true);
         | 
| 262 | 
            +
                      expect(called.after ).to(be_true);
         | 
| 263 | 
            +
                    });
         | 
| 264 | 
            +
             | 
| 265 | 
            +
                    it("does not add the filter to the global scope", function() {
         | 
| 266 | 
            +
                      Coolerator.Filters.prepare({}, '*')
         | 
| 267 | 
            +
                        .before()
         | 
| 268 | 
            +
                        .after();
         | 
| 15 269 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
                      expect( | 
| 270 | 
            +
                      expect(called.before).to(be_false);
         | 
| 271 | 
            +
                      expect(called.after ).to(be_false);
         | 
| 18 272 | 
             
                    });
         | 
| 19 273 | 
             
                  });
         | 
| 20 274 | 
             
                });
         | 
| @@ -3,96 +3,393 @@ | |
| 3 3 | 
             
            Screw.Unit(function(c) { with(c) {
         | 
| 4 4 | 
             
              describe("Coolerator.Views", function() {
         | 
| 5 5 | 
             
                it("is added to the Coolerator namespace", function() {
         | 
| 6 | 
            -
                  expect(Coolerator.Views). | 
| 6 | 
            +
                  expect(typeof Coolerator.Views).to(equal, 'object');
         | 
| 7 7 | 
             
                });
         | 
| 8 8 |  | 
| 9 | 
            -
                describe(" | 
| 10 | 
            -
                   | 
| 11 | 
            -
                     | 
| 12 | 
            -
             | 
| 9 | 
            +
                describe("methods", function() {
         | 
| 10 | 
            +
                  describe(".get", function() {
         | 
| 11 | 
            +
                    context("with 'classifier' defined appropriately", function() {
         | 
| 12 | 
            +
                      context("when there is a match", function() {
         | 
| 13 | 
            +
                        it("returns the view", function() {
         | 
| 14 | 
            +
                          var view = new Coolerator.View('defined');
         | 
| 15 | 
            +
                          expect(Coolerator.Views.get('defined')).to(equal, view);
         | 
| 16 | 
            +
                        });
         | 
| 17 | 
            +
                      });
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                      context("when there is no match", function() {
         | 
| 20 | 
            +
                        it("returns undefined", function() {
         | 
| 21 | 
            +
                          expect(Coolerator.Views.get('undefined')).to(be_undefined);
         | 
| 22 | 
            +
                        });
         | 
| 23 | 
            +
                      });
         | 
| 24 | 
            +
                    });
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    context("with 'classifier' as falsy", function() {
         | 
| 27 | 
            +
                      var fn;
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      it("throws an exception (with undefined)", function() {
         | 
| 30 | 
            +
                        fn = function fn() {
         | 
| 31 | 
            +
                          Coolerator.Views.get();
         | 
| 32 | 
            +
                        }
         | 
| 33 | 
            +
                        expect(fn).to(throw_exception);
         | 
| 34 | 
            +
                      });
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      it("throws an exception (with null)", function() {
         | 
| 37 | 
            +
                        fn = function fn() {
         | 
| 38 | 
            +
                          Coolerator.Views.get(null);
         | 
| 39 | 
            +
                        }
         | 
| 40 | 
            +
                        expect(fn).to(throw_exception);
         | 
| 41 | 
            +
                      });
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      it("throws an exception (with empty string)", function() {
         | 
| 44 | 
            +
                        fn = function fn() {
         | 
| 45 | 
            +
                          Coolerator.Views.get('');
         | 
| 46 | 
            +
                        }
         | 
| 47 | 
            +
                        expect(fn).to(throw_exception);
         | 
| 48 | 
            +
                      });
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                      it("throws an exception (with 0)", function() {
         | 
| 51 | 
            +
                        fn = function fn() {
         | 
| 52 | 
            +
                          Coolerator.Views.get(0);
         | 
| 53 | 
            +
                        }
         | 
| 54 | 
            +
                        expect(fn).to(throw_exception);
         | 
| 55 | 
            +
                      });
         | 
| 56 | 
            +
                    });
         | 
| 13 57 | 
             
                  });
         | 
| 14 58 | 
             
                });
         | 
| 15 59 | 
             
              });
         | 
| 16 60 |  | 
| 17 61 | 
             
              describe("Coolerator.View", function() {
         | 
| 18 62 | 
             
                it("is added to the Coolerator namespace", function() {
         | 
| 19 | 
            -
                  expect(Coolerator.View). | 
| 63 | 
            +
                  expect(typeof Coolerator.View).to(equal, 'function');
         | 
| 20 64 | 
             
                });
         | 
| 21 65 |  | 
| 22 | 
            -
                describe(" | 
| 23 | 
            -
                   | 
| 24 | 
            -
                    var fn = function() {
         | 
| 25 | 
            -
                      var view = new Coolerator.View('one');
         | 
| 66 | 
            +
                describe("constructor", function() {
         | 
| 67 | 
            +
                  var fn;
         | 
| 26 68 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 69 | 
            +
                  context("with 'classifier' defined appropriately", function() {
         | 
| 70 | 
            +
                    var view;
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    before(function() {
         | 
| 73 | 
            +
                      view = new Coolerator.View('valid');
         | 
| 74 | 
            +
                    });
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    describe("the returned object", function() {
         | 
| 77 | 
            +
                      it("is a Coolerator.View instance", function() {
         | 
| 78 | 
            +
                        expect(view.constructor.name).to(equal, 'View');
         | 
| 31 79 | 
             
                      });
         | 
| 32 | 
            -
                    };
         | 
| 33 80 |  | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 81 | 
            +
                      it("defines 'classifier' as an attribute", function() {
         | 
| 82 | 
            +
                        expect(view.classifier).to(equal, 'valid');
         | 
| 83 | 
            +
                      });
         | 
| 84 | 
            +
                    });
         | 
| 37 85 |  | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 86 | 
            +
                    describe("updates to Coolerator.Views", function() {
         | 
| 87 | 
            +
                      it("stores the new view", function() {
         | 
| 88 | 
            +
                        expect(Coolerator.Views.get('valid')).to(equal, view);
         | 
| 89 | 
            +
                      });
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                      it("overwrites an existing view of the same classifier", function() {
         | 
| 92 | 
            +
                        var over = new Coolerator.View('valid');
         | 
| 41 93 |  | 
| 94 | 
            +
                        expect(Coolerator.Views.get('valid') == over).to(be_true);
         | 
| 95 | 
            +
                        expect(Coolerator.Views.get('valid') == view).to(be_false);
         | 
| 96 | 
            +
                      });
         | 
| 97 | 
            +
                    });
         | 
| 98 | 
            +
                  });
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                  context("with 'classifier' defined with space(s)", function() {
         | 
| 42 101 | 
             
                    before(function() {
         | 
| 43 | 
            -
                       | 
| 44 | 
            -
             | 
| 102 | 
            +
                      fn = function fn() {
         | 
| 103 | 
            +
                        return new Coolerator.View('with spaces');
         | 
| 104 | 
            +
                      }
         | 
| 105 | 
            +
                    });
         | 
| 45 106 |  | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 107 | 
            +
                    it("throws an exception", function() {
         | 
| 108 | 
            +
                      expect(fn).to(throw_exception);
         | 
| 109 | 
            +
                    });
         | 
| 110 | 
            +
                  });
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  context("with 'classifier' defined as falsy", function() {
         | 
| 113 | 
            +
                    it("throws an exception (with undefined)", function() {
         | 
| 114 | 
            +
                      fn = function fn() {
         | 
| 115 | 
            +
                        return new Coolerator.View();
         | 
| 116 | 
            +
                      }
         | 
| 117 | 
            +
                      expect(fn).to(throw_exception);
         | 
| 118 | 
            +
                    });
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    it("throws an exception (with null)", function() {
         | 
| 121 | 
            +
                      fn = function fn() {
         | 
| 122 | 
            +
                        return new Coolerator.View(null);
         | 
| 123 | 
            +
                      }
         | 
| 124 | 
            +
                      expect(fn).to(throw_exception);
         | 
| 53 125 | 
             
                    });
         | 
| 54 126 |  | 
| 55 | 
            -
                    it(" | 
| 56 | 
            -
                       | 
| 57 | 
            -
             | 
| 127 | 
            +
                    it("throws an exception (with empty string)", function() {
         | 
| 128 | 
            +
                      fn = function fn() {
         | 
| 129 | 
            +
                        return new Coolerator.View('');
         | 
| 130 | 
            +
                      }
         | 
| 131 | 
            +
                      expect(fn).to(throw_exception);
         | 
| 132 | 
            +
                    });
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                    it("throws an exception (with 0)", function() {
         | 
| 135 | 
            +
                      fn = function fn() {
         | 
| 136 | 
            +
                        return new Coolerator.View(0);
         | 
| 137 | 
            +
                      }
         | 
| 138 | 
            +
                      expect(fn).to(throw_exception);
         | 
| 58 139 | 
             
                    });
         | 
| 59 140 | 
             
                  });
         | 
| 141 | 
            +
                });
         | 
| 60 142 |  | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 143 | 
            +
                describe("methods", function() {
         | 
| 144 | 
            +
                  var view;
         | 
| 63 145 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 146 | 
            +
                  before(function() {
         | 
| 147 | 
            +
                    view = new Coolerator.View('subscript');
         | 
| 148 | 
            +
                  });
         | 
| 66 149 |  | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 150 | 
            +
                  describe("#subscribe", function() {
         | 
| 151 | 
            +
                    context("given a function", function() {
         | 
| 152 | 
            +
                      it("executes the function with 'this' as the view", function() {
         | 
| 153 | 
            +
                        view.subscribe(function() {
         | 
| 154 | 
            +
                          expect(this).to(equal, view);
         | 
| 155 | 
            +
                        });
         | 
| 156 | 
            +
                      });
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                      it("executes the function with a Coolerator.Registar subscription", function() {
         | 
| 159 | 
            +
                        view.subscribe(function(subscription) { with(subscription) {
         | 
| 160 | 
            +
                          expect(on ).to_not(be_undefined);
         | 
| 161 | 
            +
                          expect(use).to_not(be_undefined);
         | 
| 162 | 
            +
                        }});
         | 
| 163 | 
            +
                      });
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                      it("[PENDING] executes the function after executing #extend, so other fields are available", function() {
         | 
| 166 | 
            +
                        // this does work, but it relies on jQuery's document ready event which makes it hard to test here.
         | 
| 167 | 
            +
                      });
         | 
| 168 | 
            +
                    });
         | 
| 169 | 
            +
                  });
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  describe("#extend", function() {
         | 
| 172 | 
            +
                    context("given an extension with non-instance arguments", function() {
         | 
| 173 | 
            +
                      it("extends the 'collection' object (the view)", function() {
         | 
| 174 | 
            +
                        function func() {};
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                        view.extend({
         | 
| 177 | 
            +
                          conf : 'config',
         | 
| 178 | 
            +
                          func : func
         | 
| 179 | 
            +
                        });
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                        expect(view.conf).to(equal, 'config');
         | 
| 182 | 
            +
                        expect(view.func).to(equal, func);
         | 
| 183 | 
            +
                      });
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                      it("does not 'step on' other views", function() {
         | 
| 186 | 
            +
                        var view1 = new Coolerator.View('one');
         | 
| 187 | 
            +
                        var view2 = new Coolerator.View('two');
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                        view1.extend({
         | 
| 190 | 
            +
                          foo : function foo() {
         | 
| 191 | 
            +
                            return 'foo on view one';
         | 
| 192 | 
            +
                          }
         | 
| 193 | 
            +
                        });
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                        view2.extend({
         | 
| 196 | 
            +
                          foo : function foo() {
         | 
| 197 | 
            +
                            return 'foo on view two';
         | 
| 198 | 
            +
                          }
         | 
| 199 | 
            +
                        });
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                        expect(view1.foo()).to(equal, 'foo on view one');
         | 
| 202 | 
            +
                        expect(view2.foo()).to(equal, 'foo on view two');
         | 
| 203 | 
            +
                      });
         | 
| 204 | 
            +
                    });
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                    context("given an extension with an instance argument", function() {
         | 
| 207 | 
            +
                      it("does not extend the 'collection' object", function() {
         | 
| 208 | 
            +
                        view.extend({
         | 
| 209 | 
            +
                          instance : {
         | 
| 210 | 
            +
                            methods : {}
         | 
| 211 | 
            +
                          }
         | 
| 212 | 
            +
                        });
         | 
| 213 | 
            +
             | 
| 214 | 
            +
                        expect(view.instance).to(be_undefined);
         | 
| 215 | 
            +
                      });
         | 
| 216 | 
            +
             | 
| 217 | 
            +
                      it("extends built instances", function() {
         | 
| 218 | 
            +
                        view.extend({
         | 
| 219 | 
            +
                          instance : {
         | 
| 220 | 
            +
                            content : function content(builder) {
         | 
| 221 | 
            +
                              builder.div('content');
         | 
| 222 | 
            +
                            },
         | 
| 223 | 
            +
             | 
| 224 | 
            +
                            methods : {
         | 
| 225 | 
            +
                              label : function label() {
         | 
| 226 | 
            +
                                return 'an instance';
         | 
| 227 | 
            +
                              }
         | 
| 72 228 | 
             
                            }
         | 
| 73 229 | 
             
                          }
         | 
| 74 | 
            -
                        }
         | 
| 230 | 
            +
                        });
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                        expect(view.build().label()).to(equal, 'an instance');
         | 
| 75 233 | 
             
                      });
         | 
| 76 234 |  | 
| 77 | 
            -
                       | 
| 235 | 
            +
                      it("does not 'step on' other views", function() {
         | 
| 236 | 
            +
                        var view1 = new Coolerator.View('one');
         | 
| 237 | 
            +
                        var view2 = new Coolerator.View('two');
         | 
| 78 238 |  | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 239 | 
            +
                        view1.extend({
         | 
| 240 | 
            +
                          instance : {
         | 
| 241 | 
            +
                            methods : {
         | 
| 242 | 
            +
                              foo : function foo() {
         | 
| 243 | 
            +
                                return 'foo on view one';
         | 
| 244 | 
            +
                              }
         | 
| 245 | 
            +
                            }
         | 
| 246 | 
            +
                          }
         | 
| 247 | 
            +
                        });
         | 
| 88 248 |  | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 249 | 
            +
                        view2.extend({
         | 
| 250 | 
            +
                          instance : {
         | 
| 251 | 
            +
                            methods : {
         | 
| 252 | 
            +
                              foo : function foo() {
         | 
| 253 | 
            +
                                return 'foo on view two';
         | 
| 254 | 
            +
                              }
         | 
| 255 | 
            +
                            }
         | 
| 256 | 
            +
                          }
         | 
| 257 | 
            +
                        });
         | 
| 258 | 
            +
             | 
| 259 | 
            +
                        expect(view1.build().foo()).to(equal, 'foo on view one');
         | 
| 260 | 
            +
                        expect(view2.build().foo()).to(equal, 'foo on view two');
         | 
| 261 | 
            +
                      });
         | 
| 262 | 
            +
             | 
| 263 | 
            +
                      describe("content (for the builder)", function() {
         | 
| 264 | 
            +
                        it("is defaulted to a simple <div />", function() {
         | 
| 265 | 
            +
                          view.extend({
         | 
| 266 | 
            +
                            instance : {}
         | 
| 267 | 
            +
                          });
         | 
| 268 | 
            +
             | 
| 269 | 
            +
                          var wrapper = $('<div></div>');
         | 
| 270 | 
            +
                              wrapper.html(view.build());
         | 
| 271 | 
            +
                          expect(wrapper.html()).to(equal, '<div class="subscript"></div>');
         | 
| 272 | 
            +
                        });
         | 
| 273 | 
            +
             | 
| 274 | 
            +
                        describe("overwriting", function() {
         | 
| 275 | 
            +
                          it("is allowed", function() {
         | 
| 276 | 
            +
                            view.extend({
         | 
| 277 | 
            +
                              instance : {
         | 
| 278 | 
            +
                                content : function content(builder) {
         | 
| 279 | 
            +
                                  with(builder) {
         | 
| 280 | 
            +
                                    div({ id : 'custom' });
         | 
| 281 | 
            +
                                  }
         | 
| 282 | 
            +
                                }
         | 
| 283 | 
            +
                              }
         | 
| 284 | 
            +
                            });
         | 
| 285 | 
            +
             | 
| 286 | 
            +
                            var wrapper = $('<div></div>');
         | 
| 287 | 
            +
                                wrapper.html(view.build());
         | 
| 288 | 
            +
                            expect(wrapper.html()).to(equal, '<div id="custom"></div>');
         | 
| 289 | 
            +
                          });
         | 
| 290 | 
            +
                        });
         | 
| 291 | 
            +
                      });
         | 
| 292 | 
            +
             | 
| 293 | 
            +
                      describe("methods", function() {
         | 
| 294 | 
            +
                        describe("#initialize", function() {
         | 
| 295 | 
            +
                          it("is called automatically", function() {
         | 
| 296 | 
            +
                            var called = false;
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                            view.extend({
         | 
| 299 | 
            +
                              instance : {
         | 
| 300 | 
            +
                                methods : {
         | 
| 301 | 
            +
                                  initialize : function initialize() {
         | 
| 302 | 
            +
                                    called = true;
         | 
| 303 | 
            +
                                  }
         | 
| 304 | 
            +
                                }
         | 
| 305 | 
            +
                              }
         | 
| 306 | 
            +
                            });
         | 
| 307 | 
            +
             | 
| 308 | 
            +
                            view.build();
         | 
| 309 | 
            +
                            expect(called).to(be_true);
         | 
| 310 | 
            +
                          });
         | 
| 311 | 
            +
             | 
| 312 | 
            +
                          it("is defaulted to (optionally) write provided content to the instance", function() {
         | 
| 313 | 
            +
                            view.extend({
         | 
| 314 | 
            +
                              instance : {}
         | 
| 315 | 
            +
                            });
         | 
| 316 | 
            +
             | 
| 317 | 
            +
                            expect(view.build().html()).to(equal, '');
         | 
| 318 | 
            +
                            expect(view.build({ content : 'hello there' }).html()).to(equal, 'hello there');
         | 
| 319 | 
            +
                          });
         | 
| 320 | 
            +
             | 
| 321 | 
            +
                          describe("overwriting", function() {
         | 
| 322 | 
            +
                            before(function() {
         | 
| 323 | 
            +
                              view.extend({
         | 
| 324 | 
            +
                                instance : {
         | 
| 325 | 
            +
                                  methods : {
         | 
| 326 | 
            +
                                    initialize : function initialize() {
         | 
| 327 | 
            +
                                      this.html('overwritten');
         | 
| 328 | 
            +
                                    }
         | 
| 329 | 
            +
                                  }
         | 
| 330 | 
            +
                                }
         | 
| 331 | 
            +
                              });
         | 
| 332 | 
            +
                            });
         | 
| 333 | 
            +
             | 
| 334 | 
            +
                            it("is allowed", function() {
         | 
| 335 | 
            +
                              var instance = view.build();
         | 
| 336 | 
            +
                              expect(instance.html()).to(equal, 'overwritten');
         | 
| 337 | 
            +
                            });
         | 
| 338 | 
            +
             | 
| 339 | 
            +
                            it("provides a mechanism for calling #super", function() {
         | 
| 340 | 
            +
                              var instance = view.build();
         | 
| 341 | 
            +
                              expect(typeof instance.initialize.super).to(equal, 'function');
         | 
| 342 | 
            +
                            });
         | 
| 343 | 
            +
                          });
         | 
| 344 | 
            +
                        });
         | 
| 345 | 
            +
             | 
| 346 | 
            +
                        describe("#subscribe", function() {
         | 
| 347 | 
            +
                          it("is called automatically, with 'this' as the instance and a Coolerator.Registar subscription as an argument", function() {
         | 
| 348 | 
            +
                            var called = false;
         | 
| 349 | 
            +
                            var callee = null;
         | 
| 350 | 
            +
             | 
| 351 | 
            +
                            view.extend({
         | 
| 352 | 
            +
                              instance : {
         | 
| 353 | 
            +
                                methods : {
         | 
| 354 | 
            +
                                  subscribe : function subscribe(subscription) {
         | 
| 355 | 
            +
                                    called = true;
         | 
| 356 | 
            +
                                    callee = this;
         | 
| 357 | 
            +
             | 
| 358 | 
            +
                                    with(subscription) {
         | 
| 359 | 
            +
                                      expect(on ).to_not(be_undefined);
         | 
| 360 | 
            +
                                      expect(use).to_not(be_undefined);
         | 
| 361 | 
            +
                                    }
         | 
| 362 | 
            +
                                  }
         | 
| 363 | 
            +
                                }
         | 
| 364 | 
            +
                              }
         | 
| 365 | 
            +
                            });
         | 
| 366 | 
            +
             | 
| 367 | 
            +
                            var instance = view.build();
         | 
| 368 | 
            +
                            expect(called).to(be_true);
         | 
| 369 | 
            +
                            expect(callee).to(equal, instance);
         | 
| 370 | 
            +
                          });
         | 
| 371 | 
            +
                        });
         | 
| 372 | 
            +
                      });
         | 
| 91 373 | 
             
                    });
         | 
| 374 | 
            +
                  });
         | 
| 375 | 
            +
             | 
| 376 | 
            +
                  describe("#build", function() {
         | 
| 377 | 
            +
                    it("returns an 'instance' of the view", function() {
         | 
| 378 | 
            +
                      view.extend({
         | 
| 379 | 
            +
                        instance : {
         | 
| 380 | 
            +
                          content : function content(builder) {
         | 
| 381 | 
            +
                            builder.div('content');
         | 
| 382 | 
            +
                          },
         | 
| 383 | 
            +
             | 
| 384 | 
            +
                          methods : {
         | 
| 385 | 
            +
                            label : function label() {
         | 
| 386 | 
            +
                              return 'an instance';
         | 
| 387 | 
            +
                            }
         | 
| 388 | 
            +
                          }
         | 
| 389 | 
            +
                        }
         | 
| 390 | 
            +
                      });
         | 
| 92 391 |  | 
| 93 | 
            -
             | 
| 94 | 
            -
                      expect(instance1.foo()).to(equal, "foo an instance of view1");
         | 
| 95 | 
            -
                      expect(instance2.foo()).to(equal, "foo an instance of view2");
         | 
| 392 | 
            +
                      expect(view.build().label()).to(equal, 'an instance');
         | 
| 96 393 | 
             
                    });
         | 
| 97 394 | 
             
                  });
         | 
| 98 395 | 
             
                });
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: coolerator.vision
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - Corey Innis
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2009-11- | 
| 12 | 
            +
            date: 2009-11-16 00:00:00 -05:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         |