paloma 2.0.6 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. data/Changelog.md +3 -75
  2. data/README.md +89 -376
  3. data/TODO.md +1 -13
  4. data/app/views/paloma/_hook.html.erb +31 -0
  5. data/lib/paloma.rb +1 -25
  6. data/lib/paloma/action_controller_extension.rb +72 -38
  7. data/paloma.gemspec +7 -7
  8. data/{spec/test_app → test_app}/.gitignore +0 -0
  9. data/{spec/test_app → test_app}/.rspec +0 -0
  10. data/{spec/test_app → test_app}/Gemfile +1 -2
  11. data/{spec/test_app → test_app}/README.rdoc +0 -0
  12. data/{spec/test_app → test_app}/Rakefile +2 -7
  13. data/test_app/app/assets/images/rails.png +0 -0
  14. data/test_app/app/assets/javascripts/admin/bar.js +2 -0
  15. data/test_app/app/assets/javascripts/application.js +83 -0
  16. data/test_app/app/assets/javascripts/foo.js +2 -0
  17. data/test_app/app/assets/javascripts/main.js +2 -0
  18. data/test_app/app/assets/stylesheets/admin/bar.css +4 -0
  19. data/test_app/app/assets/stylesheets/application.css +13 -0
  20. data/test_app/app/assets/stylesheets/foo.css +4 -0
  21. data/test_app/app/assets/stylesheets/main.css +4 -0
  22. data/test_app/app/controllers/admin/bar_controller.rb +7 -0
  23. data/{spec/test_app → test_app}/app/controllers/application_controller.rb +0 -0
  24. data/test_app/app/controllers/foo_controller.rb +19 -0
  25. data/test_app/app/controllers/main_controller.rb +7 -0
  26. data/test_app/app/helpers/admin/bar_helper.rb +2 -0
  27. data/test_app/app/helpers/application_helper.rb +2 -0
  28. data/test_app/app/helpers/foo_helper.rb +2 -0
  29. data/test_app/app/helpers/main_helper.rb +2 -0
  30. data/{spec/test_app/log → test_app/app/mailers}/.gitkeep +0 -0
  31. data/{spec/test_app/public/favicon.ico → test_app/app/models/.gitkeep} +0 -0
  32. data/test_app/app/views/layouts/application.html.erb +14 -0
  33. data/{spec/test_app → test_app}/config.ru +0 -0
  34. data/{spec/test_app → test_app}/config/application.rb +2 -7
  35. data/{spec/test_app → test_app}/config/boot.rb +0 -0
  36. data/{spec/test_app → test_app}/config/environment.rb +0 -0
  37. data/{spec/test_app → test_app}/config/environments/development.rb +6 -0
  38. data/{spec/test_app → test_app}/config/environments/production.rb +3 -0
  39. data/{spec/test_app → test_app}/config/environments/test.rb +2 -0
  40. data/{spec/test_app → test_app}/config/initializers/backtrace_silencers.rb +0 -0
  41. data/{spec/test_app → test_app}/config/initializers/inflections.rb +0 -0
  42. data/{spec/test_app → test_app}/config/initializers/mime_types.rb +0 -0
  43. data/{spec/test_app → test_app}/config/initializers/secret_token.rb +1 -1
  44. data/{spec/test_app → test_app}/config/initializers/session_store.rb +0 -0
  45. data/{spec/test_app → test_app}/config/initializers/wrap_parameters.rb +4 -0
  46. data/{spec/test_app → test_app}/config/locales/en.yml +0 -0
  47. data/test_app/config/routes.rb +14 -0
  48. data/test_app/db/seeds.rb +7 -0
  49. data/test_app/doc/README_FOR_APP +2 -0
  50. data/test_app/lib/assets/.gitkeep +0 -0
  51. data/test_app/lib/tasks/.gitkeep +0 -0
  52. data/test_app/log/.gitkeep +0 -0
  53. data/{spec/test_app → test_app}/public/404.html +0 -0
  54. data/{spec/test_app → test_app}/public/422.html +0 -0
  55. data/{spec/test_app → test_app}/public/500.html +0 -0
  56. data/test_app/public/favicon.ico +0 -0
  57. data/{spec/test_app → test_app}/public/robots.txt +0 -0
  58. data/{spec/test_app → test_app}/script/rails +0 -0
  59. data/test_app/spec/integration/main_spec.rb +61 -0
  60. data/test_app/spec/javascripts/controller_builder_spec.js +48 -0
  61. data/test_app/spec/javascripts/router_spec.js +121 -0
  62. data/test_app/spec/javascripts/support/jasmine.yml +20 -0
  63. data/{spec/test_app → test_app}/spec/spec_helper.rb +11 -5
  64. data/test_app/test/fixtures/.gitkeep +0 -0
  65. data/test_app/test/functional/.gitkeep +0 -0
  66. data/test_app/test/integration/.gitkeep +0 -0
  67. data/test_app/test/performance/browsing_test.rb +12 -0
  68. data/test_app/test/test_helper.rb +13 -0
  69. data/test_app/test/unit/.gitkeep +0 -0
  70. data/test_app/vendor/assets/javascripts/.gitkeep +0 -0
  71. data/test_app/vendor/assets/stylesheets/.gitkeep +0 -0
  72. data/test_app/vendor/plugins/.gitkeep +0 -0
  73. data/vendor/assets/javascripts/paloma/controller.js +10 -0
  74. data/vendor/assets/javascripts/paloma/controller_builder.js +55 -0
  75. data/vendor/assets/javascripts/paloma/engine.js +61 -0
  76. data/vendor/assets/javascripts/paloma/index.js +6 -0
  77. data/vendor/assets/javascripts/paloma/init.js +1 -0
  78. data/vendor/assets/javascripts/paloma/paloma.js +17 -0
  79. data/vendor/assets/javascripts/paloma/router.js +64 -0
  80. metadata +86 -94
  81. data/app/templates/_filters.js +0 -14
  82. data/app/templates/application/_locals.js +0 -13
  83. data/app/templates/controller/_locals.js +0 -19
  84. data/app/templates/controller/_manifest.js +0 -3
  85. data/app/templates/controller/action.js +0 -23
  86. data/app/templates/index.js +0 -3
  87. data/app/templates/namespace/_locals.js +0 -16
  88. data/app/templates/namespace/_manifest.js +0 -3
  89. data/app/views/paloma/_callback_hook.html.erb +0 -40
  90. data/lib/paloma/action_controller_filters.rb +0 -68
  91. data/lib/paloma/generators/add_generator.rb +0 -136
  92. data/lib/paloma/generators/setup_generator.rb +0 -38
  93. data/lib/paloma/rails/controller_generator.rb +0 -11
  94. data/spec/test_app/app/assets/javascripts/application.js +0 -16
  95. data/spec/test_app/app/assets/javascripts/paloma/_filters.js +0 -130
  96. data/spec/test_app/app/assets/javascripts/paloma/_locals.js +0 -17
  97. data/spec/test_app/app/assets/javascripts/paloma/bar/_filters.js +0 -96
  98. data/spec/test_app/app/assets/javascripts/paloma/bar/_locals.js +0 -1
  99. data/spec/test_app/app/assets/javascripts/paloma/bar/_manifest.js +0 -3
  100. data/spec/test_app/app/assets/javascripts/paloma/bar/another_basic_action.js +0 -5
  101. data/spec/test_app/app/assets/javascripts/paloma/bar/basic_action.js +0 -5
  102. data/spec/test_app/app/assets/javascripts/paloma/bar/different_params.js +0 -4
  103. data/spec/test_app/app/assets/javascripts/paloma/bar/yet_another_basic_action.js +0 -5
  104. data/spec/test_app/app/assets/javascripts/paloma/foo/_filters.js +0 -24
  105. data/spec/test_app/app/assets/javascripts/paloma/foo/_locals.js +0 -21
  106. data/spec/test_app/app/assets/javascripts/paloma/foo/_manifest.js +0 -3
  107. data/spec/test_app/app/assets/javascripts/paloma/foo/basic_action.js +0 -21
  108. data/spec/test_app/app/assets/javascripts/paloma/foo/skip_callback.js +0 -6
  109. data/spec/test_app/app/assets/javascripts/paloma/index.js +0 -6
  110. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/_filters.js +0 -83
  111. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/_manifest.js +0 -2
  112. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/baz/_filters.js +0 -84
  113. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/baz/_locals.js +0 -1
  114. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/baz/_manifest.js +0 -2
  115. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/baz/another_basic_action.js +0 -5
  116. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/baz/basic_action.js +0 -5
  117. data/spec/test_app/app/assets/javascripts/paloma/sample_namespace/baz/yet_another_basic_action.js +0 -5
  118. data/spec/test_app/app/controllers/bar_controller.rb +0 -28
  119. data/spec/test_app/app/controllers/foo_controller.rb +0 -25
  120. data/spec/test_app/app/controllers/sample_namespace/baz_controller.rb +0 -23
  121. data/spec/test_app/app/views/layouts/application.html.erb +0 -12
  122. data/spec/test_app/config/routes.rb +0 -33
  123. data/spec/test_app/spec/generator_helper.rb +0 -87
  124. data/spec/test_app/spec/generators/paloma_generator_spec.rb +0 -199
  125. data/spec/test_app/spec/generators/rails_generator_spec.rb +0 -54
  126. data/spec/test_app/spec/javascripts/callback_spec.rb +0 -64
  127. data/spec/test_app/spec/javascripts/filters_spec.rb +0 -187
  128. data/spec/test_app/spec/javascripts/locals_spec.rb +0 -27
  129. data/spec/test_app/spec/javascripts/params_spec.rb +0 -116
  130. data/spec/test_app/spec/javascripts/skip_filters_spec.rb +0 -58
  131. data/spec/test_app/spec/javascripts/variable_container_spec.rb +0 -21
  132. data/vendor/assets/javascripts/paloma_core.js +0 -296
data/TODO.md CHANGED
@@ -1,13 +1 @@
1
- TODO
2
- =
3
-
4
- Features
5
- -
6
- * Filters (before, after, around, global)
7
- * Setup for coffescript (although I hate coffescript)
8
- * A way to manually trigger callbacks with parameters
9
-
10
- Dev
11
- -
12
- * Documentation
13
- * Enough comments on source code
1
+ # TODO
@@ -0,0 +1,31 @@
1
+ <% id = "#{Time.now.to_i}#{(rand * 1000).ceil}" %>
2
+
3
+ <div class="js-paloma-hook" data-id="<%= id %>">
4
+ <script type="text/javascript">
5
+ (function(){
6
+
7
+ // Do not continue if Paloma not found.
8
+ if (window['Paloma'] === undefined && window['console'] !== undefined){
9
+ console.warn("Paloma not found. Require it in your application.js.");
10
+ return true;
11
+ }
12
+
13
+ // Remove any callback details if any
14
+ $('.js-paloma-hook[data-id!=' + <%= id %> + ']').remove();
15
+
16
+ var requests = <%= requests.to_json.html_safe %>;
17
+
18
+ for (var i = 0, len = requests.length; i < len; i++){
19
+ var request = requests[i];
20
+
21
+ Paloma.engine.request(request['resource'],
22
+ request['action'],
23
+ request['params']);
24
+ }
25
+
26
+
27
+ $(document).ready(function(){ Paloma.engine.start(); });
28
+
29
+ })();
30
+ </script>
31
+ </div>
@@ -1,35 +1,11 @@
1
1
  module Paloma
2
- mattr_accessor :destination, :templates
3
-
4
2
  def self.root
5
3
  @paloma_root ||= "#{File.dirname(__FILE__)}/../"
6
4
  end
7
-
8
-
9
- def self.index_js
10
- @index_js ||= "#{Paloma.destination}/index.js"
11
- end
12
-
13
-
14
- def self.destination
15
- @destination ||= 'app/assets/javascripts/paloma'
16
- end
17
-
18
-
19
- def self.templates
20
- @templates ||= "#{Paloma.root}/app/templates"
21
- end
22
-
23
5
  end
24
6
 
25
- require 'action_controller/railtie'
26
- require 'rails/generators'
27
-
28
7
  # TODO: Rails version checking
29
8
 
30
- require 'paloma/generators/add_generator'
31
- require 'paloma/generators/setup_generator'
32
- require 'paloma/action_controller_filters'
9
+ require 'action_controller/railtie'
33
10
  require 'paloma/action_controller_extension'
34
- require 'paloma/rails/controller_generator'
35
11
  require 'paloma/rails/engine'
@@ -1,51 +1,85 @@
1
1
  module Paloma
2
2
 
3
- # TODO explain!
4
- module ::ActionController::Flash
5
- alias_method :original_redirect_to, :redirect_to
6
- end
7
3
 
4
+ module ActionControllerExtension
8
5
 
6
+ def self.included base
7
+ base.send :include, InstanceMethods
9
8
 
10
- module ActionControllerExtension
11
- def redirect_js_hook options = {}, response_status_and_flash = {}
12
- add_to_callbacks @__paloma_callback__
13
- original_redirect_to options, response_status_and_flash
9
+ base.module_eval do
10
+ prepend_view_path "#{Paloma.root}/app/views/"
11
+
12
+ before_filter :track_paloma_request
13
+ after_filter :append_paloma_hook, :if => :html_is_rendered?
14
+ end
14
15
  end
15
- alias_method :redirect_to, :redirect_js_hook
16
-
17
-
18
- #
19
- # js false
20
- # js :new, :params => {}
21
- # js :controller => '', :action => '', :params => {}
22
- # js :params => {}
23
- #
24
- def js options = {}, extras = {}
25
- callback = {:controller => controller_path, :action => action_name}
26
- params = {}
27
-
28
- if options.is_a? Hash
29
- params = options[:params]
30
- callback = options[:controller].present? && options[:action].present? ?
31
- {:controller => options[:controller], :action => options[:action]} :
32
- callback
33
-
34
- elsif options.is_a? Symbol
35
- params = extras[:params]
36
- callback[:action] = options
37
-
38
- elsif options.is_a? FalseClass
39
- callback = nil
16
+
17
+
18
+
19
+
20
+
21
+ module InstanceMethods
22
+
23
+ #
24
+ # Use on controllers to pass variables to Paloma controller.
25
+ #
26
+ def js params = {}
27
+ return session[:paloma_requests].pop if !params
28
+ session[:paloma_requests].last[:params] = params
29
+ end
30
+
31
+
32
+ #
33
+ # Executed every time a controller action is executed.
34
+ #
35
+ # Keeps track of what Rails controller/action is executed.
36
+ #
37
+ def track_paloma_request
38
+ resource = controller_path.split('/').map(&:titleize).join('/')
39
+
40
+ paloma_request = {:resource => resource,
41
+ :action => self.action_name}
42
+
43
+ session[:paloma_requests] ||= []
44
+ session[:paloma_requests].push paloma_request
40
45
  end
41
46
 
42
- params ||= {}
43
47
 
44
- # Include request details
45
- params[:controller_path] = controller_path
46
- params[:action] = action_name
48
+ #
49
+ # Before rendering html reponses,
50
+ # this is exectued to append Paloma's html hook to the response.
51
+ #
52
+ # The html hook contains the javascript code that
53
+ # will execute the tracked Paloma requests.
54
+ #
55
+ def append_paloma_hook
56
+ return true if session[:paloma_requests].empty?
57
+
58
+ hook = view_context.render(
59
+ :partial => 'paloma/hook',
60
+ :locals => {:requests => session[:paloma_requests]})
61
+
62
+ before_body_end_index = response_body[0].rindex('</body>')
63
+
64
+ # Append the hook after the body tag if it is present.
65
+ if before_body_end_index.present?
66
+ before_body = response_body[0][0, before_body_end_index].html_safe
67
+ after_body = response_body[0][before_body_end_index..-1].html_safe
68
+
69
+ response.body = before_body + hook + after_body
70
+ else
71
+ # If body tag is not present, append hook in the response body
72
+ response.body += hook
73
+ end
74
+
75
+ session[:paloma_requests] = nil
76
+ end
77
+ end
78
+
47
79
 
48
- @__paloma_callback__ = callback.present? ? callback.merge({:params => params}) : nil
80
+ def html_is_rendered?
81
+ not_redirect = self.status != 302
82
+ [nil, 'text/html'].include?(response.content_type) && not_redirect
49
83
  end
50
84
  end
51
85
 
@@ -1,19 +1,19 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'paloma'
3
- s.version = '2.0.6'
3
+ s.version = '3.0.0'
4
4
  s.summary = "Provides an easy way to execute page-specific javascript for Rails."
5
5
  s.description = "Page-specific javascript for Rails done right"
6
- s.authors = ["Karl Paragua", "Bia Esmero"]
6
+ s.authors = ['Karl Paragua']
7
7
  s.email = 'kb.paragua@gmail.com'
8
8
  s.files = `git ls-files`.split("\n")
9
9
  s.homepage = 'https://github.com/kbparagua/paloma'
10
-
10
+
11
11
  s.add_dependency 'jquery-rails'
12
-
13
- s.add_development_dependency 'rails', ['>= 3.1.0']
12
+
13
+ s.add_development_dependency 'rails', ['>= 3.2.0']
14
14
  s.add_development_dependency 'rake', ['>= 0']
15
15
  s.add_development_dependency 'rspec', ['>= 0']
16
16
  s.add_development_dependency 'rspec-rails', ['~> 2.0']
17
- s.add_development_dependency 'generator_spec', ['~> 0.8.7']
18
- s.add_development_dependency 'capybara', ['>= 1.0']
17
+ s.add_development_dependency 'capybara', ['~> 1.0']
18
+ s.add_development_dependency 'jasmine-rails', ['~> 0.4.5']
19
19
  end
File without changes
File without changes
@@ -1,5 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'selenium-webdriver'
4
-
5
- gemspec :path => '../../'
4
+ gemspec :path => '../'
File without changes
@@ -3,14 +3,9 @@
3
3
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
4
 
5
5
  require File.expand_path('../config/application', __FILE__)
6
- require 'rspec/core/rake_task'
7
6
 
8
- RSpec::Core::RakeTask.new('spec:generators') do |spec|
9
- spec.pattern = FileList['spec/generators/*_spec.rb']
10
- end
11
-
12
- RSpec::Core::RakeTask.new('spec:javascripts') do |spec|
13
- spec.pattern = FileList['spec/javascripts/*_spec.rb']
7
+ if ['development', 'test'].include?(Rails.env)
8
+ require 'rspec/core/rake_task'
14
9
  end
15
10
 
16
11
  TestApp::Application.load_tasks
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,83 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require paloma
16
+ //= require_tree .
17
+
18
+
19
+ // Will be manipulated by Paloma controllers.
20
+ window.called = [];
21
+
22
+
23
+
24
+
25
+
26
+ //
27
+ //
28
+ // Routes
29
+ //
30
+ //
31
+ var router = Paloma.router;
32
+
33
+ router.resource('Foo', {controller: 'MyFoo'});
34
+ router.redirect('Foo#new', {to: 'AnotherFoo#build'});
35
+
36
+
37
+
38
+
39
+ //
40
+ //
41
+ // Controllers
42
+ //
43
+ //
44
+ var Main = Paloma.controller('Main');
45
+
46
+ Main.prototype.index = function(){
47
+ window.called.push('Main#index');
48
+ };
49
+
50
+
51
+
52
+ var MyFoo = Paloma.controller('MyFoo');
53
+
54
+ MyFoo.prototype.index = function(){
55
+ window.called.push('MyFoo#index');
56
+ };
57
+
58
+
59
+ MyFoo.prototype.show = function(){
60
+ window.called.push('MyFoo#show');
61
+ window.parameter = this.params.parameter;
62
+ };
63
+
64
+
65
+ MyFoo.prototype.edit = function(){
66
+ window.called.push('MyFoo#edit');
67
+ };
68
+
69
+
70
+
71
+ var AnotherFoo = Paloma.controller('AnotherFoo');
72
+
73
+ AnotherFoo.prototype.build = function(){
74
+ window.called.push('AnotherFoo#build');
75
+ };
76
+
77
+
78
+
79
+ var Bar = Paloma.controller('Admin/Bar');
80
+
81
+ Bar.prototype.show = function(){
82
+ window.called.push('Admin/Bar#show');
83
+ };
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,7 @@
1
+ class Admin::BarController < ApplicationController
2
+
3
+ def show
4
+ render :inline => 'Admin/Bar#show', :layout => 'application'
5
+ end
6
+
7
+ end
@@ -0,0 +1,19 @@
1
+ class FooController < ApplicationController
2
+
3
+ def index
4
+ redirect_to main_index_path
5
+ end
6
+
7
+
8
+ def show
9
+ js :parameter => 'Parameter From Paloma'
10
+ render :inline => '<h1>Foo#show</h1>', :layout => 'application'
11
+ end
12
+
13
+
14
+ def edit
15
+ js false
16
+ render :inline => 'Foo#edit', :layout => 'application'
17
+ end
18
+
19
+ end
@@ -0,0 +1,7 @@
1
+ class MainController < ApplicationController
2
+
3
+ def index
4
+ render :inline => 'Main#index', :layout => 'application'
5
+ end
6
+
7
+ end
@@ -0,0 +1,2 @@
1
+ module Admin::BarHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end