eyeballs 0.5.10.1 → 0.5.11

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ Thu Oct 28
2
+ - - - - - -
3
+ - Much more robust support for o_O.params
4
+ - Support for this.* within model declarations
5
+ - Support for o_O('model_name') or o_O('controller_name') getter
6
+
7
+
1
8
  Thu Sep 30
2
9
  - - - - - -
3
10
  - Misc bugfixes
data/Gemfile CHANGED
@@ -6,9 +6,10 @@ gem 'activesupport'
6
6
 
7
7
  group :development do
8
8
  gem 'jeweler'
9
+ gem 'rake'
9
10
  end
10
11
 
11
12
  group :test do
12
- gem 'rspec'
13
- gem 'ruby-debug'
13
+ gem 'rspec', '1.3.1'
14
+ gem 'ruby-debug19'
14
15
  end
data/Gemfile.lock CHANGED
@@ -2,6 +2,7 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  activesupport (3.0.0)
5
+ archive-tar-minitar (0.5.2)
5
6
  columnize (0.3.1)
6
7
  gemcutter (0.6.1)
7
8
  git (1.2.5)
@@ -10,14 +11,21 @@ GEM
10
11
  git (>= 1.2.5)
11
12
  rubyforge (>= 2.0.0)
12
13
  json_pure (1.4.6)
13
- linecache (0.43)
14
+ linecache19 (0.5.11)
15
+ ruby_core_source (>= 0.1.4)
14
16
  rack (1.2.1)
15
- rspec (1.3.0)
16
- ruby-debug (0.10.3)
17
- columnize (>= 0.1)
18
- ruby-debug-base (~> 0.10.3.0)
19
- ruby-debug-base (0.10.3)
20
- linecache (>= 0.3)
17
+ rake (0.8.7)
18
+ rspec (1.3.1)
19
+ ruby-debug-base19 (0.11.24)
20
+ columnize (>= 0.3.1)
21
+ linecache19 (>= 0.5.11)
22
+ ruby_core_source (>= 0.1.4)
23
+ ruby-debug19 (0.11.6)
24
+ columnize (>= 0.3.1)
25
+ linecache19 (>= 0.5.11)
26
+ ruby-debug-base19 (>= 0.11.19)
27
+ ruby_core_source (0.1.4)
28
+ archive-tar-minitar (>= 0.5.2)
21
29
  rubyforge (2.0.4)
22
30
  json_pure (>= 1.1.7)
23
31
  sinatra (1.0)
@@ -30,7 +38,8 @@ PLATFORMS
30
38
  DEPENDENCIES
31
39
  activesupport
32
40
  jeweler
33
- rspec
34
- ruby-debug
41
+ rake
42
+ rspec (= 1.3.1)
43
+ ruby-debug19
35
44
  sinatra
36
45
  thor
data/README.md CHANGED
@@ -45,31 +45,35 @@ At a very minimum, you should choose an adapter. There are a few to choose from:
45
45
  - **o\_O.couchdb** - persist records to a local CouchDB instance, for building MVC CouchApps, for example.
46
46
  - **o\_O.rest** - An adapter for persisting models to a backend powered by Rails, or using Rails-style RESTful routing.
47
47
 
48
- Finally, you need a controller. The first release of eyeballs.js includes a controller as part of the jQuery driver. This adapter also depends on jQuery.livequery.
48
+ Finally, you need a controller. The first release of eyeballs.js includes a controller as part of the jQuery driver.
49
49
 
50
50
  You can also use a javascript templating language. Mustache.js fits this need quite nicely.
51
51
 
52
52
  Wrapping that all up, to use eyeballs.js with the Rails adapter and jQuery:
53
53
 
54
54
  <!-- jQuery and livequery -->
55
- <script src="http://jquery.com/src/jquery-latest.js"></script>
56
- <script src="jquery.livequery.js"></script>
55
+ <script src="vendor/javascripts/jquery.1.4.min.js"></script>
56
+ <script src="vendor/jquery/jquery.ba-bbq.min.js"></script>
57
57
 
58
58
  <!-- Mustache for templating -->
59
- <script src="mustache.js"></script>
59
+ <script src="vendor/mustache/mustache.0.3.0.js"></script>
60
60
 
61
61
  <!-- eyeballs.js basic -->
62
- <script src="o_O.js"></script>
63
- <script src="modules/o_O.model.js"></script>
64
- <script src="modules/o_O.validations.js"></script>
62
+ <script src="vendor/eyeballs/o_O.js"></script>
63
+ <script src="vendor/eyeballs/modules/o_O.model.js"></script>
64
+ <script src="vendor/eyeballs/modules/o_O.validations.js"></script>
65
65
 
66
66
  <!-- eyeballs.js jquery driver for controller logic -->
67
- <script src="drivers/jquery/modules/o_O.controller.js"></script>
68
- <script src="drivers/jquery/modules/o_O.support.js"></script>
69
- <script src="drivers/jquery/modules/o_O.routes.js"></script>
67
+ <script src="vendor/eyeballs/drivers/jquery/modules/o_O.controller.js"></script>
68
+ <script src="vendor/eyeballs/drivers/jquery/modules/o_O.support.js"></script>
69
+ <script src="vendor/eyeballs/drivers/jquery/modules/o_O.routes.js"></script>
70
70
 
71
71
  <!-- REST adapter -->
72
- <script src="drivers/jquery/adapters/o_O.rest.js"></script>
72
+ <script src="vendor/eyeballs/drivers/jquery/adapters/o_O.rest.js"></script>
73
+
74
+ <!-- Configuration -->
75
+ <script src="config/initializer.js"></script>
76
+ <script src="config/routes.js"></script>
73
77
 
74
78
  Badabing, badaboom! You're now ready to start creating some models and controllers.
75
79
 
@@ -106,7 +110,7 @@ Models
106
110
 
107
111
  You define a model by passing a name and function to the eyeballs ( o_O ) function (pronounced 'eep eep'). As inspired by Rails, model definitions are capitalised. Note, however, that the new prefix is not used.
108
112
 
109
- o_O('Post', function(post){ })
113
+ o_O('Post', function(){ })
110
114
 
111
115
  You can now initialize an individual post:
112
116
 
@@ -117,8 +121,8 @@ Not very exciting.
117
121
 
118
122
  However, if you're familiar with Rails, you'll be familiar with the wonderful syntax for adding validations to your models. eyeballs.js lets you add validations to your models as follows:
119
123
 
120
- o_O('Post', function(post){
121
- post.validates_presence_of('title')
124
+ o_O('Post', function(){
125
+ this.validates_presence_of('title')
122
126
  })
123
127
 
124
128
  Now, when you initialize a new Post, you can validate it, nice and easy:
@@ -133,8 +137,8 @@ and so on, so forth. This will be very familiar to those who use Rails.
133
137
 
134
138
  You can also add your own validations, again, similar to how Rails does things:
135
139
 
136
- o_O('Post', function(post){
137
- post.validates(function(post){
140
+ o_O('Post', function(){
141
+ this.validates(function(post){
138
142
  if(post.title != 'Awesome')
139
143
  {
140
144
  post.errors.push({message: 'Not Awesome Enough'})
@@ -161,8 +165,8 @@ When you want to find things:
161
165
 
162
166
  And if you want to add your own methods:
163
167
 
164
- o_O('Post', function(post){
165
- post.methods.title_downcased: function(){
168
+ o_O('Post', function(){
169
+ this.methods.title_downcased: function(){
166
170
  this.title.toLowerCase();
167
171
  }
168
172
  })
@@ -298,9 +302,9 @@ Imagine a simple app for posting reviews. It will comprise a "Review" model, "Re
298
302
 
299
303
  `models/review.js` looks like this:
300
304
 
301
- o_O('Review', function(review){
302
- review.validates_presence_of('title');
303
- review.validates_presence_of('content');
305
+ o_O('Review', function(){
306
+ this.validates_presence_of('title');
307
+ this.validates_presence_of('content');
304
308
  });
305
309
 
306
310
  This defines the Review model, allowing us to initialize and save Review objects, while ensuring `title` and `content` are included.
data/Rakefile CHANGED
@@ -27,7 +27,7 @@ begin
27
27
  require 'jeweler'
28
28
  Jeweler::Tasks.new do |s|
29
29
  s.name = "eyeballs"
30
- s.version = "0.5.10.1"
30
+ s.version = "0.5.11"
31
31
  s.author = "Paul Campbell"
32
32
  s.email = "paul@rslw.com"
33
33
  s.homepage = "http://www.github.com/paulca/eyeballs.js"
@@ -0,0 +1,18 @@
1
+ /*
2
+ * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
3
+ * http://benalman.com/projects/jquery-bbq-plugin/
4
+ *
5
+ * Copyright (c) 2010 "Cowboy" Ben Alman
6
+ * Dual licensed under the MIT and GPL licenses.
7
+ * http://benalman.com/about/license/
8
+ */
9
+ (function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
10
+ /*
11
+ * jQuery hashchange event - v1.2 - 2/11/2010
12
+ * http://benalman.com/projects/jquery-hashchange-plugin/
13
+ *
14
+ * Copyright (c) 2010 "Cowboy" Ben Alman
15
+ * Dual licensed under the MIT and GPL licenses.
16
+ * http://benalman.com/about/license/
17
+ */
18
+ (function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
data/eyeballs.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{eyeballs}
8
- s.version = "0.5.10.1"
8
+ s.version = "0.5.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Paul Campbell"]
12
- s.date = %q{2010-09-30}
12
+ s.date = %q{2010-10-28}
13
13
  s.default_executable = %q{eyeballs}
14
14
  s.email = %q{paul@rslw.com}
15
15
  s.executables = ["eyeballs"]
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
27
27
  "bin/eyeballs",
28
28
  "config.ru",
29
29
  "dist/jquery/jquery-1.4.2.min.js",
30
- "dist/jquery/jquery.ba-hashchange.js",
30
+ "dist/jquery/jquery.ba-bbq.min.js",
31
31
  "dist/mustache/mustache.0.3.0.js",
32
32
  "eyeballs.gemspec",
33
33
  "lib/eyeballs.rb",
@@ -64,10 +64,10 @@ Gem::Specification.new do |s|
64
64
  "test/unit/test_controller.html",
65
65
  "test/unit/test_dom.html",
66
66
  "test/unit/test_dom_with_callbacks.html",
67
- "test/unit/test_form.html",
68
67
  "test/unit/test_localstorage.html",
69
68
  "test/unit/test_model.html",
70
69
  "test/unit/test_model_with_callbacks.html",
70
+ "test/unit/test_params.html",
71
71
  "test/unit/test_rest.html",
72
72
  "test/unit/test_routing.html"
73
73
  ]
@@ -19,6 +19,7 @@ module Eyeballs
19
19
  directory "templates/app_root", new_app_path
20
20
  copy_file 'dist/jquery/jquery-1.4.2.min.js', "#{new_app_path}/vendor/jquery/jquery-1.4.2.min.js"
21
21
  copy_file 'dist/mustache/mustache.0.3.0.js', "#{new_app_path}/vendor/mustache/mustache.0.3.0.js"
22
+ copy_file 'dist/jquery/jquery.ba-bbq.min.js', "#{new_app_path}/vendor/jquery/jquery.ba-bbq.min.js"
22
23
  directory "src", "#{new_app_path}/vendor/eyeballs/"
23
24
  template "templates/initializer.js", "#{new_app_path}/config/initializer.js"
24
25
  end
@@ -3,11 +3,6 @@ require 'spec_helper'
3
3
  describe Eyeballs::AppGenerator do
4
4
 
5
5
  describe "generate a simple app" do
6
- before(:all) do
7
- create_test_root
8
- FileUtils.cd(test_root)
9
- Eyeballs::AppGenerator.start('test')
10
- end
11
6
  let(:app_dir) { file('test', 'app') }
12
7
  let(:model_dir) { file('test', 'app', 'models') }
13
8
  let(:controller_dir) { file('test', 'app', 'controllers') }
@@ -19,12 +14,18 @@ describe Eyeballs::AppGenerator do
19
14
  let(:mustache_dir) { file('test', 'vendor', 'mustache') }
20
15
 
21
16
  let(:jquery_file) { file('test', 'vendor', 'jquery', 'jquery-1.4.2.min.js') }
22
- let(:livequery_file) { file('test', 'vendor', 'jquery', 'jquery.livequery.js') }
17
+ let(:bbq_file) { file('test', 'vendor', 'jquery', 'jquery.ba-bbq.min.js') }
23
18
  let(:mustache_file) { file('test', 'vendor', 'mustache', 'mustache.0.3.0.js') }
24
19
  let(:index_file) { file('test', 'index.html') }
25
20
  let(:initializer_file) { file('test', 'config', 'initializer.js')}
26
21
  let(:routes_file) { file('test', 'config', 'routes.js')}
27
22
 
23
+ before(:all) do
24
+ create_test_root
25
+ FileUtils.cd(test_root)
26
+ Eyeballs::AppGenerator.start(['test'])
27
+ end
28
+
28
29
  it "should create the test root" do
29
30
  File.exists?(test_root).should be_true
30
31
  end
@@ -43,7 +44,7 @@ describe Eyeballs::AppGenerator do
43
44
 
44
45
  it "should create the app files" do
45
46
  jquery_file.should exist
46
- livequery_file.should_not exist
47
+ bbq_file.should exist
47
48
  mustache_file.should exist
48
49
  index_file.should exist
49
50
  initializer_file.should exist
@@ -6,7 +6,7 @@ describe Eyeballs::AppGenerator do
6
6
  create_test_root
7
7
  FileUtils.mkdir(test_root + '/public')
8
8
  FileUtils.cd(test_root)
9
- Eyeballs::AppGenerator.start('test')
9
+ Eyeballs::AppGenerator.start(['test'])
10
10
  end
11
11
  let(:app_dir) { file('public', 'javascripts', 'app') }
12
12
 
@@ -120,7 +120,6 @@ o_O.routes = {
120
120
  update_hash_parts();
121
121
  if(o_O.routes.urls.indexOf(hash) >= 0)
122
122
  {
123
- console.log(compute_params()())
124
123
  o_O.routes.rules[hash].action(compute_params());
125
124
  }
126
125
  else
@@ -8,18 +8,33 @@ o_O.find_attributes = function(template, callback){
8
8
  return object;
9
9
  }
10
10
 
11
- o_O.params = function(form){
12
- return o_O.find_attributes(form, function(field){
13
- if(field.is('[type=radio]'))
14
- {
15
- return $('[data-attribute=' + field.attr('data-attribute') + ']:checked').val()
16
- }
17
- else
18
- {
19
- return field.val();
20
- }
21
- });
11
+ o_O.params_from_form = function(form){
12
+ return $.deparam(form.serialize());
13
+ }
14
+
15
+ o_O.params = function(param, new_value){
16
+ if(new_value != void(0))
17
+ {
18
+ o_O.params.collection[param] = new_value;
19
+ return new_value;
20
+ }
21
+ if(typeof param === 'string')
22
+ {
23
+ return o_O.params.collection[param];
22
24
  }
25
+ return o_O.params.collection;
26
+ }
27
+
28
+ o_O.params.collection = {}
29
+
30
+ $(function(){
31
+ $('body').delegate('form', 'submit', function(){
32
+ for(param in o_O.params_from_form($(this)))
33
+ {
34
+ o_O.params(param, o_O.params_from_form($(this))[param]);
35
+ }
36
+ })
37
+ })
23
38
 
24
39
  o_O.render = function(template, data, options){
25
40
  o_O.get_template(template, data, function(data, template){
@@ -42,6 +57,14 @@ o_O.render = function(template, data, options){
42
57
  {
43
58
  $(options.html).html(rendered);
44
59
  }
60
+ if(options.before)
61
+ {
62
+ $(options.html).before(rendered);
63
+ }
64
+ if(options.after)
65
+ {
66
+ $(options.html).after(rendered);
67
+ }
45
68
  }
46
69
  });
47
70
  }
@@ -54,7 +54,7 @@ o_O.model = {
54
54
  }
55
55
  }
56
56
 
57
- var config = callback(class_methods);
57
+ var config = callback.apply(class_methods, [class_methods]);
58
58
  instance_methods = {
59
59
  adapter: o_O.model.adapter,
60
60
  destroy: function(callback){
data/src/o_O.js CHANGED
@@ -5,7 +5,11 @@ var o_O = function(){
5
5
 
6
6
  bind_to = (object_to_bind_to) ? object_to_bind_to : o_O.config.default_bind_to();
7
7
 
8
- if(typeof arguments[1] === 'object')
8
+ if(arguments.length === 1)
9
+ {
10
+ return bind_to[arguments[0]]
11
+ }
12
+ else if(typeof arguments[1] === 'object')
9
13
  {
10
14
  var controller_name = arguments[0];
11
15
  bind_to[controller_name] = o_O.controller.initialize(controller_name, arguments[1]);
@@ -29,6 +29,7 @@
29
29
  </div>
30
30
  </body>
31
31
  <script src="<%= prefix %>vendor/jquery/jquery-1.4.2.min.js"></script>
32
+ <script src="<%= prefix %>vendor/jquery/jquery.ba-bbq.min.js"></script>
32
33
  <script src="<%= prefix %>vendor/mustache/mustache.0.3.0.js"></script>
33
34
  <script src="<%= prefix %>vendor/eyeballs/o_O.js"></script>
34
35
  <script src="<%= prefix %>vendor/eyeballs/modules/o_O.model.js"></script>
@@ -3,7 +3,6 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
6
  <script src="../../src/o_O.js"></script>
8
7
  <script src="../../src/modules/o_O.model.js"></script>
9
8
  <script src="../../src/modules/o_O.validations.js"></script>
@@ -3,7 +3,6 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
6
  <script src="../../src/o_O.js"></script>
8
7
  <script src="../../src/modules/o_O.model.js"></script>
9
8
  <script src="../../src/modules/o_O.validations.js"></script>
@@ -120,6 +119,5 @@
120
119
  <h2 id="qunit-banner"></h2>
121
120
  <h2 id="qunit-userAgent"></h2>
122
121
  <ol id="qunit-tests"></ol>
123
- </div>
124
122
  </body>
125
123
  </html>
@@ -3,7 +3,6 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
6
  <script src="../../src/o_O.js"></script>
8
7
  <script src="../../src/modules/o_O.model.js"></script>
9
8
  <script src="../../src/modules/o_O.validations.js"></script>
@@ -3,7 +3,6 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
6
  <script src="../../src/o_O.js"></script>
8
7
  <script src="../../src/modules/o_O.model.js"></script>
9
8
  <script src="../../src/modules/o_O.validations.js"></script>
@@ -17,20 +16,20 @@
17
16
 
18
17
  o_O.model.adapter = o_O.dom;
19
18
 
20
- o_O('Review', function(that){
21
- that.validates_presence_of('title');
22
- that.validates_presence_of('content');
23
- that.validates_length_of('title', {min: 5, max: 15});
24
- that.validates(function(review){
19
+ o_O('Review', function(){
20
+ this.validates_presence_of('title');
21
+ this.validates_presence_of('content');
22
+ this.validates_length_of('title', {min: 5, max: 15});
23
+ this.validates(function(review){
25
24
  if(review.score != 99 && review.test === true)
26
25
  {
27
26
  review.errors.push({message: 'Score should be 99'})
28
27
  }
29
28
  })
30
- that.methods.title_numbered = function(){
29
+ this.methods.title_numbered = function(){
31
30
  return '1. ' + this.title;
32
31
  }
33
- return that;
32
+ return this;
34
33
  });
35
34
 
36
35
  var MyApp = {};
@@ -44,6 +43,11 @@
44
43
  var test_model = MyApp.TestModel.initialize({title: 'Delicious'})
45
44
  equals(test_model.title, 'Delicious', 'should just work as normal')
46
45
  })
46
+
47
+ test('functional syntax', 1, function(){
48
+ var test_model = o_O('Review').initialize({title: 'Delicious'})
49
+ equals(test_model.title, 'Delicious', 'should just work as normal')
50
+ })
47
51
 
48
52
  test('serialization',1, function(){
49
53
  var myReview = Review.initialize({title: 'Groovy'})
@@ -3,7 +3,6 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
6
  <script src="../../src/o_O.js"></script>
8
7
  <script src="../../src/modules/o_O.model.js"></script>
9
8
  <script src="../../src/modules/o_O.validations.js"></script>
@@ -146,7 +145,6 @@
146
145
  <h2 id="qunit-banner"></h2>
147
146
  <h2 id="qunit-userAgent"></h2>
148
147
  <ol id="qunit-tests"></ol>
149
- </div>
150
148
 
151
149
  <div data-id="thing"></div>
152
150
  </body>
@@ -0,0 +1,71 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html>
4
+ <head>
5
+ <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
+ <script src="../../dist/jquery/jquery.ba-bbq.min.js"></script>
7
+ <script src="../../src/o_O.js"></script>
8
+ <script src="../../src/modules/o_O.model.js"></script>
9
+ <script src="../../src/modules/o_O.validations.js"></script>
10
+ <script src="../../src/drivers/jquery/adapters/o_O.dom.js"></script>
11
+ <script src="../../src/drivers/jquery/modules/o_O.controller.js"></script>
12
+ <script src="../../src/drivers/jquery/modules/o_O.support.js"></script>
13
+ <link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />
14
+ <script type="text/javascript" src="qunit.js"></script>
15
+
16
+ <script>
17
+
18
+ $(document).ready(function(){
19
+
20
+ o_O('Review', function(that){
21
+ that.validates_presence_of('title');
22
+ that.validates_presence_of('content');
23
+ return that;
24
+ });
25
+
26
+ o_O('TestController', {
27
+ create: function(){
28
+
29
+ }
30
+ })
31
+
32
+ module("Forms");
33
+
34
+ test('getting form attributes', function(){
35
+ equals(o_O.params_from_form($('form#test-form')).title, 'Biscuit', 'form attributes should come in nicely')
36
+ equals(o_O.params_from_form($('form#test-form')).selection, "1", 'should work with checkboxes')
37
+ equals(o_O.params_from_form($('form#test-form')).thing['title'], "Thing's Title", 'should work with checkboxes')
38
+ });
39
+
40
+ test('params should be empty', function(){
41
+ equals(typeof o_O.params(), 'object')
42
+ })
43
+
44
+ test('setting a param', function(){
45
+ o_O.params('thing', 'new value')
46
+ equals(o_O.params('thing'), 'new value')
47
+ })
48
+
49
+ test('submitting a form', function(){
50
+ $("form#test-form").trigger('submit')
51
+ equals(o_O.params('title'), 'Biscuit');
52
+ equals(o_O.params('thing')['title'], "Thing's Title");
53
+ })
54
+
55
+ });
56
+ </script>
57
+
58
+ </head>
59
+ <body>
60
+ <h1 id="qunit-header">Form Tests</h1>
61
+ <h2 id="qunit-banner"></h2>
62
+ <h2 id="qunit-userAgent"></h2>
63
+ <ol id="qunit-tests"></ol>
64
+ <form id="test-form" data-bind="test#create">
65
+ <input type="text" name="title" type="text" value="Biscuit">
66
+ <input type="radio" name="selection" value="1" checked>
67
+ <input type="radio" name="selection" value="-1">
68
+ <input type="text" name="thing[title]" value="Thing's Title"></input>
69
+ </form>
70
+ </body>
71
+ </html>
@@ -3,7 +3,6 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
6
 
8
7
  <script src="../../src/o_O.js"></script>
9
8
  <script src="../../src/modules/o_O.model.js"></script>
@@ -3,7 +3,7 @@
3
3
  <html>
4
4
  <head>
5
5
  <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.ba-hashchange.js"></script>
6
+ <script src="../../dist/jquery/jquery.ba-bbq.js"></script>
7
7
  <script src="../../src/o_O.js"></script>
8
8
  <script src="../../src/modules/o_O.model.js"></script>
9
9
  <script src="../../src/modules/o_O.validations.js"></script>
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eyeballs
3
3
  version: !ruby/object:Gem::Version
4
- hash: 77
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 5
9
- - 10
10
- - 1
11
- version: 0.5.10.1
9
+ - 11
10
+ version: 0.5.11
12
11
  platform: ruby
13
12
  authors:
14
13
  - Paul Campbell
@@ -16,7 +15,7 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2010-09-30 00:00:00 +01:00
18
+ date: 2010-10-28 00:00:00 +01:00
20
19
  default_executable: eyeballs
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
@@ -66,7 +65,7 @@ files:
66
65
  - bin/eyeballs
67
66
  - config.ru
68
67
  - dist/jquery/jquery-1.4.2.min.js
69
- - dist/jquery/jquery.ba-hashchange.js
68
+ - dist/jquery/jquery.ba-bbq.min.js
70
69
  - dist/mustache/mustache.0.3.0.js
71
70
  - eyeballs.gemspec
72
71
  - lib/eyeballs.rb
@@ -103,10 +102,10 @@ files:
103
102
  - test/unit/test_controller.html
104
103
  - test/unit/test_dom.html
105
104
  - test/unit/test_dom_with_callbacks.html
106
- - test/unit/test_form.html
107
105
  - test/unit/test_localstorage.html
108
106
  - test/unit/test_model.html
109
107
  - test/unit/test_model_with_callbacks.html
108
+ - test/unit/test_params.html
110
109
  - test/unit/test_rest.html
111
110
  - test/unit/test_routing.html
112
111
  - spec/app_generator_spec.rb
@@ -1,245 +0,0 @@
1
-
2
- /*!
3
- * jQuery hashchange event - v1.2 - 2/11/2010
4
- * http://benalman.com/projects/jquery-hashchange-plugin/
5
- *
6
- * Copyright (c) 2010 "Cowboy" Ben Alman
7
- * Dual licensed under the MIT and GPL licenses.
8
- * http://benalman.com/about/license/
9
- */
10
-
11
- // Script: jQuery hashchange event
12
- //
13
- // *Version: 1.2, Last updated: 2/11/2010*
14
- //
15
- // Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
16
- // GitHub - http://github.com/cowboy/jquery-hashchange/
17
- // Source - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
18
- // (Minified) - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (1.1kb)
19
- //
20
- // About: License
21
- //
22
- // Copyright (c) 2010 "Cowboy" Ben Alman,
23
- // Dual licensed under the MIT and GPL licenses.
24
- // http://benalman.com/about/license/
25
- //
26
- // About: Examples
27
- //
28
- // This working example, complete with fully commented code, illustrate one way
29
- // in which this plugin can be used.
30
- //
31
- // hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
32
- //
33
- // About: Support and Testing
34
- //
35
- // Information about what version or versions of jQuery this plugin has been
36
- // tested with, what browsers it has been tested in, and where the unit tests
37
- // reside (so you can test it yourself).
38
- //
39
- // jQuery Versions - 1.3.2, 1.4.1, 1.4.2pre
40
- // Browsers Tested - Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.1.
41
- // Unit Tests - http://benalman.com/code/projects/jquery-hashchange/unit/
42
- //
43
- // About: Known issues
44
- //
45
- // While this jQuery hashchange event implementation is quite stable and robust,
46
- // there are a few unfortunate browser bugs surrounding expected hashchange
47
- // event-based behaviors, independent of any JavaScript window.onhashchange
48
- // abstraction. See the following examples for more information:
49
- //
50
- // Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
51
- // Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
52
- // WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
53
- // Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
54
- //
55
- // About: Release History
56
- //
57
- // 1.2 - (2/11/2010) Fixed a bug where coming back to a page using this plugin
58
- // from a page on another domain would cause an error in Safari 4. Also,
59
- // IE6/7 Iframe is now inserted after the body (this actually works),
60
- // which prevents the page from scrolling when the event is first bound.
61
- // Event can also now be bound before DOM ready, but it won't be usable
62
- // before then in IE6/7.
63
- // 1.1 - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
64
- // where browser version is incorrectly reported as 8.0, despite
65
- // inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
66
- // 1.0 - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
67
- // window.onhashchange functionality into a separate plugin for users
68
- // who want just the basic event & back button support, without all the
69
- // extra awesomeness that BBQ provides. This plugin will be included as
70
- // part of jQuery BBQ, but also be available separately.
71
-
72
- (function($,window,undefined){
73
- '$:nomunge'; // Used by YUI compressor.
74
-
75
- // Method / object references.
76
- var fake_onhashchange,
77
- jq_event_special = $.event.special,
78
-
79
- // Reused strings.
80
- str_location = 'location',
81
- str_hashchange = 'hashchange',
82
- str_href = 'href',
83
-
84
- // IE6/7 specifically need some special love when it comes to back-button
85
- // support, so let's do a little browser sniffing..
86
- browser = $.browser,
87
- mode = document.documentMode,
88
- is_old_ie = browser.msie && ( mode === undefined || mode < 8 ),
89
-
90
- // Does the browser support window.onhashchange? Test for IE version, since
91
- // IE8 incorrectly reports this when in "IE7" or "IE8 Compatibility View"!
92
- supports_onhashchange = 'on' + str_hashchange in window && !is_old_ie;
93
-
94
- // Get location.hash (or what you'd expect location.hash to be) sans any
95
- // leading #. Thanks for making this necessary, Firefox!
96
- function get_fragment( url ) {
97
- url = url || window[ str_location ][ str_href ];
98
- return url.replace( /^[^#]*#?(.*)$/, '$1' );
99
- };
100
-
101
- // Property: jQuery.hashchangeDelay
102
- //
103
- // The numeric interval (in milliseconds) at which the <hashchange event>
104
- // polling loop executes. Defaults to 100.
105
-
106
- $[ str_hashchange + 'Delay' ] = 100;
107
-
108
- // Event: hashchange event
109
- //
110
- // Fired when location.hash changes. In browsers that support it, the native
111
- // window.onhashchange event is used (IE8, FF3.6), otherwise a polling loop is
112
- // initialized, running every <jQuery.hashchangeDelay> milliseconds to see if
113
- // the hash has changed. In IE 6 and 7, a hidden Iframe is created to allow
114
- // the back button and hash-based history to work.
115
- //
116
- // Usage:
117
- //
118
- // > $(window).bind( 'hashchange', function(e) {
119
- // > var hash = location.hash;
120
- // > ...
121
- // > });
122
- //
123
- // Additional Notes:
124
- //
125
- // * The polling loop and Iframe are not created until at least one callback
126
- // is actually bound to 'hashchange'.
127
- // * If you need the bound callback(s) to execute immediately, in cases where
128
- // the page 'state' exists on page load (via bookmark or page refresh, for
129
- // example) use $(window).trigger( 'hashchange' );
130
- // * The event can be bound before DOM ready, but since it won't be usable
131
- // before then in IE6/7 (due to the necessary Iframe), recommended usage is
132
- // to bind it inside a $(document).ready() callback.
133
-
134
- jq_event_special[ str_hashchange ] = $.extend( jq_event_special[ str_hashchange ], {
135
-
136
- // Called only when the first 'hashchange' event is bound to window.
137
- setup: function() {
138
- // If window.onhashchange is supported natively, there's nothing to do..
139
- if ( supports_onhashchange ) { return false; }
140
-
141
- // Otherwise, we need to create our own. And we don't want to call this
142
- // until the user binds to the event, just in case they never do, since it
143
- // will create a polling loop and possibly even a hidden Iframe.
144
- $( fake_onhashchange.start );
145
- },
146
-
147
- // Called only when the last 'hashchange' event is unbound from window.
148
- teardown: function() {
149
- // If window.onhashchange is supported natively, there's nothing to do..
150
- if ( supports_onhashchange ) { return false; }
151
-
152
- // Otherwise, we need to stop ours (if possible).
153
- $( fake_onhashchange.stop );
154
- }
155
-
156
- });
157
-
158
- // fake_onhashchange does all the work of triggering the window.onhashchange
159
- // event for browsers that don't natively support it, including creating a
160
- // polling loop to watch for hash changes and in IE 6/7 creating a hidden
161
- // Iframe to enable back and forward.
162
- fake_onhashchange = (function(){
163
- var self = {},
164
- timeout_id,
165
- iframe,
166
- set_history,
167
- get_history;
168
-
169
- // Initialize. In IE 6/7, creates a hidden Iframe for history handling.
170
- function init(){
171
- // Most browsers don't need special methods here..
172
- set_history = get_history = function(val){ return val; };
173
-
174
- // But IE6/7 do!
175
- if ( is_old_ie ) {
176
-
177
- // Create hidden Iframe after the end of the body to prevent initial
178
- // page load from scrolling unnecessarily.
179
- iframe = $('<iframe src="javascript:0"/>').hide().insertAfter( 'body' )[0].contentWindow;
180
-
181
- // Get history by looking at the hidden Iframe's location.hash.
182
- get_history = function() {
183
- return get_fragment( iframe.document[ str_location ][ str_href ] );
184
- };
185
-
186
- // Set a new history item by opening and then closing the Iframe
187
- // document, *then* setting its location.hash.
188
- set_history = function( hash, history_hash ) {
189
- if ( hash !== history_hash ) {
190
- var doc = iframe.document;
191
- doc.open().close();
192
- doc[ str_location ].hash = '#' + hash;
193
- }
194
- };
195
-
196
- // Set initial history.
197
- set_history( get_fragment() );
198
- }
199
- };
200
-
201
- // Start the polling loop.
202
- self.start = function() {
203
- // Polling loop is already running!
204
- if ( timeout_id ) { return; }
205
-
206
- // Remember the initial hash so it doesn't get triggered immediately.
207
- var last_hash = get_fragment();
208
-
209
- // Initialize if not yet initialized.
210
- set_history || init();
211
-
212
- // This polling loop checks every $.hashchangeDelay milliseconds to see if
213
- // location.hash has changed, and triggers the 'hashchange' event on
214
- // window when necessary.
215
- (function loopy(){
216
- var hash = get_fragment(),
217
- history_hash = get_history( last_hash );
218
-
219
- if ( hash !== last_hash ) {
220
- set_history( last_hash = hash, history_hash );
221
-
222
- $(window).trigger( str_hashchange );
223
-
224
- } else if ( history_hash !== last_hash ) {
225
- window[ str_location ][ str_href ] = window[ str_location ][ str_href ].replace( /#.*/, '' ) + '#' + history_hash;
226
- }
227
-
228
- timeout_id = setTimeout( loopy, $[ str_hashchange + 'Delay' ] );
229
- })();
230
- };
231
-
232
- // Stop the polling loop, but only if an IE6/7 Iframe wasn't created. In
233
- // that case, even if there are no longer any bound event handlers, the
234
- // polling loop is still necessary for back/next to work at all!
235
- self.stop = function() {
236
- if ( !iframe ) {
237
- timeout_id && clearTimeout( timeout_id );
238
- timeout_id = 0;
239
- }
240
- };
241
-
242
- return self;
243
- })();
244
-
245
- })(jQuery,this);
@@ -1,47 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
- "http://www.w3.org/TR/html4/loose.dtd">
3
- <html>
4
- <head>
5
- <script src="../../dist/jquery/jquery-1.4.2.min.js"></script>
6
- <script src="../../dist/jquery/jquery.livequery.js"></script>
7
- <script src="../../src/o_O.js"></script>
8
- <script src="../../src/modules/o_O.model.js"></script>
9
- <script src="../../src/modules/o_O.validations.js"></script>
10
- <script src="../../src/drivers/jquery/adapters/o_O.dom.js"></script>
11
- <script src="../../src/drivers/jquery/modules/o_O.controller.js"></script>
12
- <script src="../../src/drivers/jquery/modules/o_O.support.js"></script>
13
- <link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />
14
- <script type="text/javascript" src="qunit.js"></script>
15
-
16
- <script>
17
- var Review = o_O(function(that){
18
- that.validates_presence_of('title');
19
- that.validates_presence_of('content');
20
- return that;
21
- });
22
-
23
- $(document).ready(function(){
24
-
25
- module("Forms");
26
-
27
- test('getting form attributes', 2, function(){
28
- equals(o_O.params($('form#test-form')).title, 'Biscuit', 'form attributes should come in nicely')
29
- equals(o_O.params($('form#test-form')).selection, "1", 'should work with checkboxes')
30
- });
31
-
32
- });
33
- </script>
34
-
35
- </head>
36
- <body>
37
- <h1 id="qunit-header">Form Tests</h1>
38
- <h2 id="qunit-banner"></h2>
39
- <h2 id="qunit-userAgent"></h2>
40
- <ol id="qunit-tests"></ol>
41
- <form id="test-form">
42
- <input type="title" data-attribute="title" type="text" value="Biscuit">
43
- <input type="radio" data-attribute="selection" value="1" checked>
44
- <input type="radio" data-attribute="selection" value="-1">
45
- </form>
46
- </body>
47
- </html>