jelly 0.5.9 → 0.6.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/Rakefile CHANGED
@@ -25,7 +25,7 @@ end
25
25
  begin
26
26
  require 'jeweler'
27
27
  Jeweler::Tasks.new do |gemspec|
28
- gemspec.name = "jelly"
28
+ gemspec.name = ENV["GEM_PREFIX"] ? "#{ENV["GEM_PREFIX"]}-jelly" : "jelly"
29
29
  gemspec.summary = "a sweet unobtrusive javascript framework for jQuery and Rails"
30
30
  gemspec.description = "Jelly provides a set of tools and conventions for creating rich ajax/javascript web applications with jQuery and Ruby on Rails."
31
31
  gemspec.email = "opensource@pivotallabs.com"
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- :minor: 5
3
- :patch: 9
2
+ :minor: 6
3
+ :patch: 5
4
4
  :build:
5
5
  :major: 0
@@ -11,87 +11,84 @@
11
11
  *
12
12
  */
13
13
 
14
- if(!window.Jelly) Jelly = new Object();
15
- Jelly.all = {};
16
-
17
- Jelly.add = function(name) {
18
- var page = new Jelly.Page(name);
19
- for(var i=1; i < arguments.length; i++) {
20
- $.extend(page, arguments[i]);
21
- }
22
- return page;
23
- };
24
-
25
- var page;
26
- Jelly.activatePage = function(controllerName, actionName) {
27
- page = Jelly.all[controllerName] || new Jelly.Page(controllerName);
28
- $(document).ready(function(){
29
- Jelly._activatePage(actionName);
14
+ if (!window.Jelly) Jelly = new Object();
15
+ Jelly.init = function() {
16
+ this.components = [];
17
+ Jelly.Pages.init();
18
+ $(document).ready(function() {
19
+ Jelly.Components.init();
30
20
  });
31
21
  };
32
22
 
33
- Jelly._activatePage = function(actionName){
34
- Jelly.initComponents();
35
- if(page.all) page.all();
36
- if(page[actionName]) page[actionName].call(page);
37
- page.loaded = true;
38
- };
39
-
40
- Jelly.initComponents = function() {
41
- $.protify(page.components).each(function(componentAndArgs) {
42
- var component = componentAndArgs[0];
43
- var args = componentAndArgs[1] || [];
44
- if(component.init) component.init.apply(component, args);
45
- });
23
+ Jelly.attach = function(component, args) {
24
+ this.components.push([component, args]);
46
25
  };
47
26
 
48
27
  Jelly.notifyObservers = function(params) {
49
28
  var context = params.on ? eval(params.on) : page;
50
- if(context[params.method]) {
29
+ if (context[params.method]) {
51
30
  context[params.method].apply(context, params.arguments);
52
31
  }
53
- $.protify(page.components).each(function(componentAndArgs) {
32
+ $.protify(Jelly.components).each(function(componentAndArgs) {
54
33
  var component = componentAndArgs[0];
55
- if(component[params.method]) {
34
+ if (component[params.method] && component != context) {
56
35
  component[params.method].apply(component, params.arguments);
57
36
  }
58
37
  });
59
38
  };
60
39
 
40
+ Jelly.Components = {
41
+ init: function() {
42
+ $.protify(Jelly.components).each(function(componentAndArgs) {
43
+ var component = componentAndArgs[0];
44
+ var args = componentAndArgs[1] || [];
45
+ if (component.init) component.init.apply(component, args);
46
+ });
47
+ }
48
+ };
49
+
50
+ Jelly.Pages = {
51
+ init: function() {
52
+ this.all = {};
53
+ Jelly.all = this.all; // Deprecated
54
+ },
55
+
56
+ add: function(name) {
57
+ var page = new Jelly.Page(name);
58
+ for (var i = 1; i < arguments.length; i++) {
59
+ $.extend(page, arguments[i]);
60
+ }
61
+ return page;
62
+ }
63
+ };
64
+ Jelly.add = Jelly.Pages.add; // Deprecated
65
+
61
66
  Jelly.Page = function(name) {
67
+ this.documentHref = Jelly.Location.documentHref;
68
+
62
69
  this.name = name;
63
70
  this.components = [];
64
- Jelly.all[name] = this;
71
+ Jelly.Pages.all[name] = this;
65
72
  };
66
-
67
73
  Jelly.Page.prototype.loaded = false;
68
74
  Jelly.Page.prototype.all = function() {
69
75
  };
70
- Jelly.Page.prototype.documentHref = function() {
71
- return document.location.href;
72
- };
73
- Jelly.Page.prototype.on_redirect = function(location){
74
- top.location.href = location;
76
+
77
+ Jelly.Page.init = function(controllerName, actionName) {
78
+ var page = Jelly.Pages.all[controllerName] || new Jelly.Page(controllerName);
79
+ window.page = page;
80
+ if (page.all) page.all();
81
+ if (page[actionName]) page[actionName].call(page);
82
+ page.loaded = true;
75
83
  };
76
84
 
77
- Jelly.Page.prototype.attach = function(component, args) {
78
- var methodNames = [];
79
- for(var methodName in component.pageMixin) {
80
- methodNames.push(methodName);
85
+ Jelly.Location = {
86
+ init: function() {
87
+ },
88
+
89
+ on_redirect: function(location) {
90
+ top.location.href = location;
81
91
  }
82
- var self = this;
83
- $.protify(methodNames).each(function(methodName) {
84
- // TODO: is anybody using these before_/after_ hooks? if not, delete them and use components as observers
85
- self[methodName] = function() {
86
- if(this['before_' + methodName]) {
87
- this['before_' + methodName].apply(this, arguments);
88
- }
89
- var returnValue = component.pageMixin[methodName].apply(this, arguments);
90
- if(this['after_' + methodName]) {
91
- this['after_' + methodName].apply(this, arguments);
92
- }
93
- return returnValue;
94
- };
95
- });
96
- page.components.push([component, args]);
97
92
  };
93
+
94
+ Jelly.init();
data/jelly.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{jelly}
8
- s.version = "0.5.9"
8
+ s.version = "0.6.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Pivotal Labs, Inc"]
12
- s.date = %q{2009-10-30}
12
+ s.date = %q{2009-11-19}
13
13
  s.description = %q{Jelly provides a set of tools and conventions for creating rich ajax/javascript web applications with jQuery and Ruby on Rails.}
14
14
  s.email = %q{opensource@pivotallabs.com}
15
15
  s.extra_rdoc_files = [
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  "install.rb",
31
31
  "jelly.gemspec",
32
32
  "lib/jelly.rb",
33
+ "lib/jelly/common.rb",
33
34
  "lib/jelly/jelly_controller.rb",
34
35
  "lib/jelly/jelly_helper.rb",
35
36
  "tasks/jelly_tasks.rake",
@@ -42,23 +43,24 @@ Gem::Specification.new do |s|
42
43
  s.summary = %q{a sweet unobtrusive javascript framework for jQuery and Rails}
43
44
  s.test_files = [
44
45
  "spec/controllers/jelly_controller_spec.rb",
45
- "spec/spec_helper.rb",
46
- "spec/rails_root/test/performance/browsing_test.rb",
47
- "spec/rails_root/test/test_helper.rb",
46
+ "spec/helpers/jelly_helper_spec.rb",
48
47
  "spec/rails_root/app/controllers/application_controller.rb",
49
48
  "spec/rails_root/app/helpers/application_helper.rb",
49
+ "spec/rails_root/config/boot.rb",
50
50
  "spec/rails_root/config/environment.rb",
51
- "spec/rails_root/config/environments/production.rb",
52
51
  "spec/rails_root/config/environments/development.rb",
52
+ "spec/rails_root/config/environments/production.rb",
53
53
  "spec/rails_root/config/environments/test.rb",
54
- "spec/rails_root/config/routes.rb",
55
- "spec/rails_root/config/boot.rb",
56
54
  "spec/rails_root/config/initializers/backtrace_silencers.rb",
57
- "spec/rails_root/config/initializers/new_rails_defaults.rb",
58
- "spec/rails_root/config/initializers/mime_types.rb",
59
55
  "spec/rails_root/config/initializers/inflections.rb",
56
+ "spec/rails_root/config/initializers/mime_types.rb",
57
+ "spec/rails_root/config/initializers/new_rails_defaults.rb",
60
58
  "spec/rails_root/config/initializers/session_store.rb",
61
- "spec/helpers/jelly_helper_spec.rb"
59
+ "spec/rails_root/config/routes.rb",
60
+ "spec/rails_root/test/performance/browsing_test.rb",
61
+ "spec/rails_root/test/test_helper.rb",
62
+ "spec/spec_helper.rb",
63
+ "spec/spec_suite.rb"
62
64
  ]
63
65
 
64
66
  if s.respond_to? :specification_version then
data/lib/jelly.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  raise "Jelly must be used in a Rails environment." unless defined?(ActionController)
2
2
 
3
+ require 'jelly/common'
3
4
  require 'jelly/jelly_controller'
4
5
  require 'jelly/jelly_helper'
5
6
 
@@ -0,0 +1,7 @@
1
+ module Jelly
2
+ module Common
3
+ def jelly_callback_hash(method, *arguments)
4
+ {"method" => method, "arguments" => arguments}
5
+ end
6
+ end
7
+ end
@@ -1,5 +1,6 @@
1
1
  module JellyController
2
2
  protected
3
+ include Jelly::Common
3
4
 
4
5
  def jelly_callback(callback_base_name = @action_name, options = {}, &block)
5
6
  render :inline => jelly_callback_erb("on_#{callback_base_name}", options, block)
@@ -13,7 +14,7 @@ module JellyController
13
14
  <%= begin
14
15
  args = @block ? instance_eval(&@block) : []
15
16
  args = [args] unless args.is_a?(Array)
16
- {"method" => @callback_name, "arguments" => args}.reverse_merge(@options).to_json
17
+ jelly_callback_hash(@callback_name, *args).reverse_merge(@options).to_json
17
18
  end %>
18
19
  ERB
19
20
  request.xhr? ? erb : "<textarea>#{erb}</textarea>"
@@ -1,15 +1,21 @@
1
1
  module JellyHelper
2
+ include Jelly::Common
2
3
 
3
4
  def application_jelly_files(jelly_files_path_from_javascripts = '', rails_root = RAILS_ROOT)
4
- Dir["#{rails_root}/public/javascripts/#{jelly_files_path_from_javascripts}/pages/**/*.js"].map do |path|
5
+ rails_root = File.expand_path(rails_root)
6
+ (
7
+ Dir[File.expand_path("#{rails_root}/public/javascripts/#{jelly_files_path_from_javascripts}/components/**/*.js")] +
8
+ Dir[File.expand_path("#{rails_root}/public/javascripts/#{jelly_files_path_from_javascripts}/pages/**/*.js")]
9
+ ).map do |path|
5
10
  path.gsub("#{rails_root}/public/javascripts/", "").gsub(/\.js$/, "")
6
11
  end
7
12
  end
8
13
 
9
14
  def spread_jelly
15
+ attach_javascript_component("Jelly.Location")
16
+ attach_javascript_component("Jelly.Page", controller.controller_path.camelcase, controller.action_name)
10
17
  javascript_tag <<-JS
11
18
  window._token = '#{form_authenticity_token}'
12
- Jelly.activatePage('#{controller.controller_path.camelcase}', '#{controller.action_name}');
13
19
  #{@content_for_javascript}
14
20
  $(document).ready(function() {
15
21
  #{@content_for_javascript_on_ready}
@@ -23,7 +29,7 @@ module JellyHelper
23
29
 
24
30
  def attach_javascript_component(component_name, *args)
25
31
  @jelly_attached_components ||= []
26
- key = "page.attach(#{component_name}, #{args.to_json});"
32
+ key = "Jelly.attach(#{component_name}, #{args.to_json});"
27
33
  unless @jelly_attached_components.include? key
28
34
  @jelly_attached_components << key
29
35
  content_for(:javascript, key)
@@ -32,7 +38,7 @@ module JellyHelper
32
38
 
33
39
  def attach_javascript_component_on_ready(component_name, *args)
34
40
  @jelly_attached_components_on_ready ||= []
35
- key = "page.attach(#{component_name}, #{args.to_json});"
41
+ key = "Jelly.attach(#{component_name}, #{args.to_json});"
36
42
  unless @jelly_attached_components_on_ready.include? key
37
43
  @jelly_attached_components_on_ready << key
38
44
  content_for(:javascript_on_ready, key)
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
2
2
 
3
3
  describe ApplicationController do
4
4
 
@@ -1,24 +1,39 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb')
2
2
 
3
- describe "JellyHelper" do
3
+ describe JellyHelper do
4
4
 
5
- describe "#init_specific_javascript" do
6
- it "should create a javascript include tag to initialize the Page object" do
5
+ describe "#spread_jelly" do
6
+ before do
7
7
  stub_controller = mock(Object, :controller_path => 'my_fun_controller', :action_name => 'super_good_action')
8
8
  helper.should_receive(:controller).any_number_of_times.and_return(stub_controller)
9
9
  helper.should_receive(:form_authenticity_token).and_return('areallysecuretoken')
10
+ end
11
+
12
+ it "should create a javascript include tag that attaches the Jelly.Location and Jelly.Page components" do
10
13
  output = helper.spread_jelly
11
14
  output.should include('<script type="text/javascript">')
12
- output.should include("Jelly.activatePage('MyFunController', 'super_good_action');")
15
+ output.should include("Jelly.attach(Jelly.Location, #{[].to_json});")
16
+ output.should include("Jelly.attach(Jelly.Page, #{['MyFunController', 'super_good_action'].to_json});")
13
17
  end
14
18
  end
15
19
 
16
20
  describe "#application_jelly_files" do
17
- it "returns the javascript files in the given path" do
18
- my_rails_root = File.join(File.dirname(__FILE__), '/../fixtures')
19
- files = helper.application_jelly_files("foo", my_rails_root)
20
- files.should_not be_empty
21
- files.should =~ ['foo/pages/lions', 'foo/pages/tigers', 'foo/pages/bears']
21
+ context "when passing in a jelly path" do
22
+ it "returns the javascript files in /javascipts/:jelly_path/pages and /javascipts/:jelly_path/components" do
23
+ my_rails_root = File.join(File.dirname(__FILE__), '/../fixtures')
24
+ files = helper.application_jelly_files("foo", my_rails_root)
25
+ files.should_not be_empty
26
+ files.should =~ ['foo/components/paw', 'foo/components/teeth', 'foo/pages/lions', 'foo/pages/tigers', 'foo/pages/bears']
27
+ end
28
+ end
29
+
30
+ context "when not passing in a jelly path" do
31
+ it "returns the javascript files in /javascipts/pages and /javascipts/components" do
32
+ my_rails_root = File.join(File.dirname(__FILE__), '/../fixtures')
33
+ files = helper.application_jelly_files("", my_rails_root)
34
+ files.should_not be_empty
35
+ files.should =~ ['components/component1', 'pages/page1']
36
+ end
22
37
  end
23
38
  end
24
39
 
@@ -30,23 +45,23 @@ describe "JellyHelper" do
30
45
  helper.clear_jelly_attached()
31
46
  end
32
47
 
33
- it "fails to add multiple calls to page.attach for the same component" do
48
+ it "fails to add multiple calls to Jelly.attach for the same component" do
34
49
  helper.attach_javascript_component("MyComponent", 'arg1', 'arg2', 'arg3')
35
50
  helper.attach_javascript_component("MyComponent", 'arg1', 'arg2', 'arg3')
36
51
  helper.attach_javascript_component("MyComponent", 'arg1', 'arg2', 'arg5')
37
- assigns[:content_for_javascript].should == 'page.attach(MyComponent, ["arg1","arg2","arg3"]);page.attach(MyComponent, ["arg1","arg2","arg5"]);'
52
+ assigns[:content_for_javascript].should == 'Jelly.attach(MyComponent, ["arg1","arg2","arg3"]);Jelly.attach(MyComponent, ["arg1","arg2","arg5"]);'
38
53
  end
39
54
 
40
- it "adds a call to page.attach in the javascript content" do
55
+ it "adds a call to Jelly.attach in the javascript content" do
41
56
  helper.attach_javascript_component("MyComponent", 'arg1', 'arg2', 'arg3')
42
57
  expected_args = ['arg1','arg2','arg3'].to_json
43
- assigns[:content_for_javascript].should == "page.attach(MyComponent, #{expected_args});"
58
+ assigns[:content_for_javascript].should == "Jelly.attach(MyComponent, #{expected_args});"
44
59
  end
45
60
 
46
- it "adds a call to page.attach in the javascript_on_ready content" do
61
+ it "adds a call to Jelly.attach in the javascript_on_ready content" do
47
62
  helper.attach_javascript_component_on_ready("MyComponent", 'arg1', 'arg2', 'arg3')
48
63
  expected_args = ['arg1','arg2','arg3'].to_json
49
- assigns[:content_for_javascript_on_ready].should == "page.attach(MyComponent, #{expected_args});"
64
+ assigns[:content_for_javascript_on_ready].should == "Jelly.attach(MyComponent, #{expected_args});"
50
65
  end
51
66
 
52
67
  end
@@ -1,7 +1,7 @@
1
1
  # Be sure to restart your server when you modify this file
2
2
 
3
3
  # Specifies gem version of Rails to use when vendor/rails is not present
4
- RAILS_GEM_VERSION = '2.3.3' unless defined? RAILS_GEM_VERSION
4
+ RAILS_GEM_VERSION = '2.3.4' unless defined? RAILS_GEM_VERSION
5
5
 
6
6
  # Bootstrap the Rails environment, frameworks, and default configuration
7
7
  require File.join(File.dirname(__FILE__), 'boot')
data/spec/spec_helper.rb CHANGED
@@ -4,10 +4,26 @@ ENV["RAILS_ENV"] ||= 'test'
4
4
  ENV['RAILS_ROOT'] ||= File.dirname(__FILE__) + '/rails_root'
5
5
  require File.expand_path(File.join(ENV['RAILS_ROOT'], 'config/environment.rb'))
6
6
  require 'rubygems'
7
+ gem "test-unit"
8
+ require 'test/unit'
9
+
10
+ class Test::Unit::TestCase
11
+ class << self
12
+ def inherited(sub_class)
13
+ super
14
+ DESCENDANTS << sub_class
15
+ end
16
+ alias_method :inherited_without_test_unit_gem_inherited_fix, :inherited
17
+ alias_method :inherited, :inherited_without_test_unit_gem_inherited_fix
18
+ end
19
+ end
20
+
7
21
  require 'spec'
8
22
  require 'spec/rails'
23
+ require 'spec/autorun'
9
24
 
10
- require File.dirname(__FILE__) + "/../lib/jelly"
25
+ $LOAD_PATH.unshift(File.expand_path("#{File.dirname(__FILE__)}/../lib"))
26
+ require "jelly"
11
27
 
12
28
  Spec::Runner.configure do |configuration|
13
29
  end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/{controllers,helpers}/**/*_spec.rb"].each do |file|
2
+ require file
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jelly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.9
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pivotal Labs, Inc
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-03 00:00:00 -08:00
12
+ date: 2009-11-19 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,6 +45,7 @@ files:
45
45
  - install.rb
46
46
  - jelly.gemspec
47
47
  - lib/jelly.rb
48
+ - lib/jelly/common.rb
48
49
  - lib/jelly/jelly_controller.rb
49
50
  - lib/jelly/jelly_helper.rb
50
51
  - tasks/jelly_tasks.rake
@@ -96,3 +97,4 @@ test_files:
96
97
  - spec/rails_root/test/performance/browsing_test.rb
97
98
  - spec/rails_root/test/test_helper.rb
98
99
  - spec/spec_helper.rb
100
+ - spec/spec_suite.rb