paloma 3.0.2 → 4.0.0

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.
@@ -0,0 +1,38 @@
1
+ module Paloma
2
+ class Controller
3
+
4
+ attr_accessor :resource, :action, :params
5
+
6
+
7
+
8
+ def initialize
9
+ self.clear_request
10
+ end
11
+
12
+
13
+ def clear_request
14
+ self.resource = nil
15
+ self.action = nil
16
+ self.params = {}
17
+
18
+ true
19
+ end
20
+
21
+
22
+ def request
23
+ {:resource => self.resource, :action => self.action, :params => self.params}
24
+ end
25
+
26
+
27
+ def has_request?
28
+ self.resource.present? && self.action.present?
29
+ end
30
+
31
+
32
+ def has_no_request?
33
+ !self.has_request?
34
+ end
35
+
36
+
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ module Paloma
2
+ class Utilities
3
+
4
+ def self.get_resource controller_path
5
+ controller_path.split('/').map(&:titleize).join('/').gsub(' ', '')
6
+ end
7
+
8
+
9
+ def self.interpret_route route_string = nil
10
+ raise 'Empty route cannot be interpreted' if route_string.blank?
11
+
12
+ parts = route_string.split '#'
13
+
14
+ resource = parts.first
15
+ resource = resource.blank? ? nil : resource
16
+
17
+ action = parts.length != 1 ? parts.last : nil
18
+
19
+ {:resource => resource, :action => action}
20
+ end
21
+
22
+ end
23
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'paloma'
3
- s.version = '3.0.2'
3
+ s.version = '4.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
6
  s.authors = ['Karl Paragua']
@@ -16,78 +16,31 @@
16
16
  //= require_tree .
17
17
 
18
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
19
 
39
20
  //
40
21
  //
41
22
  // Controllers
42
23
  //
43
24
  //
44
- var Main = Paloma.controller('Main');
45
-
46
- Main.prototype.index = function(){
47
- window.called.push('Main#index');
48
- };
49
25
 
26
+ var Main = Paloma.controller('Main');
27
+ Main.prototype.index = function(){};
28
+ Main.prototype.otherAction = function(){};
29
+ Main.prototype.prevent = function(){};
30
+ Main.prototype.basic_params = function(){};
50
31
 
51
32
 
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
- };
84
-
33
+ var OtherMain = Paloma.controller('OtherMain');
34
+ OtherMain.prototype.show = function(){};
35
+ OtherMain.prototype.otherAction = function(){};
85
36
 
86
37
 
87
38
 
39
+ var Foos = Paloma.controller('Admin/Foos');
40
+ Foos.prototype.index = function(){};
41
+ Foos.prototype.otherAction = function(){};
88
42
 
89
- var MultipleNames = Paloma.controller('MultipleNames');
90
43
 
91
- MultipleNames.prototype.index = function(){
92
- window.called.push('MultipleNames#index')
93
- };
44
+ var NotFoos = Paloma.controller('NotAdmin/Foos');
45
+ NotFoos.prototype.show = function(){};
46
+ NotFoos.prototype.otherAction = function(){};
@@ -0,0 +1,29 @@
1
+ class Admin::FoosController < ApplicationController
2
+
3
+ # Default behavior
4
+ def index
5
+ render :inline => 'Admin/Foos#index', :layout => 'application'
6
+ end
7
+
8
+
9
+ # Override controller
10
+ def show
11
+ js 'NotAdmin/Foos', :x => 99
12
+ render :inline => 'Admin/Foos#show', :layout => 'application'
13
+ end
14
+
15
+
16
+ # Override action
17
+ def new
18
+ js '#otherAction', :x => 99
19
+ render :inline => 'Admin/Foos#new', :layout => 'application'
20
+ end
21
+
22
+
23
+ # Override controller/action
24
+ def edit
25
+ js 'NotAdmin/Foos#otherAction', :x => 99
26
+ render :inline => 'Admin/Foos#edit', :layout => 'application'
27
+ end
28
+
29
+ end
@@ -1,10 +1,52 @@
1
1
  class MainController < ApplicationController
2
2
 
3
+ # Default behavior
3
4
  def index
4
5
  render :inline => 'Main#index', :layout => 'application'
5
6
  end
6
7
 
7
8
 
9
+ # Override controller
10
+ def show
11
+ js 'OtherMain', :x => 1
12
+ render :inline => 'Main#show', :layout => 'application'
13
+ end
14
+
15
+
16
+ # Override action
17
+ def new
18
+ js :otherAction, :x => 1
19
+ render :inline => 'Main#new', :layout => 'application'
20
+ end
21
+
22
+
23
+ # Override controller/action
24
+ def edit
25
+ js 'OtherMain#otherAction', :x => 1
26
+ render :inline => 'Main#edit', :layout => 'application'
27
+ end
28
+
29
+
30
+ # Stop paloma from execution
31
+ def prevent
32
+ js false
33
+ render :inline => 'Main#prevent', :layout => 'application'
34
+ end
35
+
36
+
37
+ def basic_params
38
+ js :x => 1, :y => 2
39
+ render :inline => 'Main#basic_params', :layout => 'application'
40
+ end
41
+
42
+
43
+
44
+
45
+
46
+ #
47
+ # Non-HTML response
48
+ #
49
+
8
50
  def json_response
9
51
  render :json => {:x => 1}
10
52
  end
@@ -5,7 +5,9 @@ TestApp::Application.routes.draw do
5
5
  root :to => 'main#index'
6
6
 
7
7
  resources :main, :controller => 'Main' do
8
- member do
8
+ collection do
9
+ get :prevent
10
+ get :basic_params
9
11
  get :json_response
10
12
  get :js_response
11
13
  get :xml_response
@@ -13,12 +15,8 @@ TestApp::Application.routes.draw do
13
15
  end
14
16
  end
15
17
 
16
- resources :foo, :controller => 'Foo'
17
18
 
18
19
  namespace :admin do
19
- resources :bar, :controller => 'Bar'
20
+ resources :foos
20
21
  end
21
-
22
-
23
- resources :multiple_names
24
22
  end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ #
4
+ #
5
+ # All examples are using namespaces
6
+ #
7
+ #
8
+
9
+ feature 'executing Paloma controller', :js => true do
10
+
11
+
12
+ context 'default behavior' do
13
+ it 'executes the same namespace/controller/action' do
14
+ visit admin_foos_path
15
+
16
+ expect(request).to eq({
17
+ 'controller' => 'Admin/Foos',
18
+ 'action' => 'index',
19
+ 'params' => {}})
20
+ end
21
+ end
22
+
23
+
24
+ context 'override default controller' do
25
+ it 'executes the specified controller' do
26
+ visit admin_foo_path(1)
27
+
28
+ expect(request).to eq({
29
+ 'controller' => 'NotAdmin/Foos',
30
+ 'action' => 'show',
31
+ 'params' => {'x' => 99}})
32
+ end
33
+ end
34
+
35
+
36
+ context 'override default action' do
37
+ it 'executes the specified action' do
38
+ visit new_admin_foo_path
39
+
40
+ expect(request).to eq({
41
+ 'controller' => 'Admin/Foos',
42
+ 'action' => 'otherAction',
43
+ 'params' => {'x' => 99}})
44
+ end
45
+ end
46
+
47
+
48
+ context 'override default controller/action' do
49
+ it 'executes the specified controller/action' do
50
+ visit edit_admin_foo_path(1)
51
+
52
+ expect(request).to eq({
53
+ 'controller' => 'NotAdmin/Foos',
54
+ 'action' => 'otherAction',
55
+ 'params' => {'x' => 99}})
56
+ end
57
+ end
58
+
59
+
60
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ #
4
+ #
5
+ # All examples are not using namespaces.
6
+ #
7
+ #
8
+
9
+ feature 'executing Paloma controller', :js => true do
10
+
11
+ #
12
+ #
13
+ # Basic
14
+ # All except for basic_params and index action will pass :x => 1 parameter
15
+ #
16
+ #
17
+
18
+ context 'default behavior' do
19
+ it 'executes the same controller/action' do
20
+ visit main_index_path
21
+
22
+ expect(request).to eq({
23
+ 'controller' => 'Main',
24
+ 'action' => 'index',
25
+ 'params' => {}})
26
+ end
27
+ end
28
+
29
+
30
+ context 'override default controller' do
31
+ it 'executes the specified controller' do
32
+ visit main_path(1)
33
+
34
+ expect(request).to eq({
35
+ 'controller' => 'OtherMain',
36
+ 'action' => 'show',
37
+ 'params' => {'x' => 1}})
38
+ end
39
+ end
40
+
41
+
42
+ context 'override default action' do
43
+ it 'executes the specified action' do
44
+ visit new_main_path
45
+
46
+ expect(request).to eq({
47
+ 'controller' => 'Main',
48
+ 'action' => 'otherAction',
49
+ 'params' => {'x' => 1}})
50
+ end
51
+ end
52
+
53
+
54
+ context 'override default controller/action' do
55
+ it 'executes the specified controller/action' do
56
+ visit edit_main_path(1)
57
+
58
+ expect(request).to eq({
59
+ 'controller' => 'OtherMain',
60
+ 'action' => 'otherAction',
61
+ 'params' => {'x' => 1}})
62
+ end
63
+ end
64
+
65
+
66
+ context 'parameter passed' do
67
+ it 'passes the parameter' do
68
+ visit basic_params_main_index_path
69
+
70
+ expect(request['params']).to eq({'x' => 1, 'y' => 2})
71
+ end
72
+ end
73
+
74
+
75
+
76
+
77
+
78
+ #
79
+ #
80
+ # Prevent Paloma
81
+ #
82
+ #
83
+
84
+ shared_examples 'no paloma' do
85
+ it 'does not add paloma hook' do
86
+ expect(page.has_selector?('.js-paloma-hook')).to be_false
87
+ end
88
+ end
89
+
90
+
91
+ context 'js(false)' do
92
+ before { visit prevent_main_index_path }
93
+
94
+ include_examples 'no paloma'
95
+
96
+ it 'prevents execution of Paloma controller' do
97
+ expect(request).to be_nil
98
+ end
99
+ end
100
+
101
+ context 'json response' do
102
+ before { visit json_response_main_index_path }
103
+ include_examples 'no paloma'
104
+ end
105
+
106
+ context 'js response' do
107
+ before { visit js_response_main_index_path }
108
+ include_examples 'no paloma'
109
+ end
110
+
111
+ context 'xml response' do
112
+ before { visit xml_response_main_index_path }
113
+ include_examples 'no paloma'
114
+ end
115
+
116
+ context 'file response' do
117
+ before { visit file_response_main_index_path }
118
+ include_examples 'no paloma'
119
+ end
120
+
121
+
122
+ end