short_circuit 0.1.0 → 1.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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +54 -31
  4. data/lib/short_circuit.rb +5 -3
  5. data/lib/short_circuit/presentable.rb +1 -0
  6. data/lib/short_circuit/presenter.rb +8 -7
  7. data/lib/short_circuit/version.rb +1 -1
  8. data/spec/dummy/README.rdoc +15 -248
  9. data/spec/dummy/Rakefile +0 -1
  10. data/spec/dummy/app/assets/javascripts/application.js +3 -5
  11. data/spec/dummy/app/controllers/application_controller.rb +3 -1
  12. data/spec/dummy/app/views/layouts/application.html.erb +2 -2
  13. data/spec/dummy/bin/bundle +3 -0
  14. data/spec/dummy/bin/rails +4 -0
  15. data/spec/dummy/bin/rake +4 -0
  16. data/spec/dummy/config.ru +1 -1
  17. data/spec/dummy/config/application.rb +6 -37
  18. data/spec/dummy/config/boot.rb +4 -9
  19. data/spec/dummy/config/environment.rb +2 -2
  20. data/spec/dummy/config/environments/development.rb +11 -19
  21. data/spec/dummy/config/environments/production.rb +40 -27
  22. data/spec/dummy/config/environments/test.rb +13 -14
  23. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  24. data/spec/dummy/config/initializers/inflections.rb +6 -5
  25. data/spec/dummy/config/initializers/secret_token.rb +7 -2
  26. data/spec/dummy/config/initializers/session_store.rb +0 -5
  27. data/spec/dummy/config/initializers/wrap_parameters.rb +6 -6
  28. data/spec/dummy/config/locales/en.yml +20 -2
  29. data/spec/dummy/config/routes.rb +22 -24
  30. data/spec/dummy/log/test.log +0 -37
  31. data/spec/dummy/public/404.html +43 -11
  32. data/spec/dummy/public/422.html +43 -11
  33. data/spec/dummy/public/500.html +43 -11
  34. data/spec/short_circuit/presentable_spec.rb +53 -16
  35. data/spec/short_circuit/presenter_spec.rb +54 -0
  36. data/spec/spec_helper.rb +9 -17
  37. metadata +19 -52
  38. data/Rakefile +0 -21
  39. data/lib/active_record_extension.rb +0 -13
  40. data/lib/tasks/short_circuit_tasks.rake +0 -4
  41. data/spec/dummy/log/development.log +0 -1
  42. data/spec/dummy/script/rails +0 -6
@@ -1,19 +1,20 @@
1
1
  Dummy::Application.routes.draw do
2
- # The priority is based upon order of creation:
3
- # first created -> highest priority.
2
+ # The priority is based upon order of creation: first created -> highest priority.
3
+ # See how all your routes lay out with "rake routes".
4
4
 
5
- # Sample of regular route:
6
- # match 'products/:id' => 'catalog#view'
7
- # Keep in mind you can assign values other than :controller and :action
5
+ # You can have the root of your site routed with "root"
6
+ # root 'welcome#index'
7
+
8
+ # Example of regular route:
9
+ # get 'products/:id' => 'catalog#view'
8
10
 
9
- # Sample of named route:
10
- # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
11
- # This route can be invoked with purchase_url(:id => product.id)
11
+ # Example of named route that can be invoked with purchase_url(id: product.id)
12
+ # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
12
13
 
13
- # Sample resource route (maps HTTP verbs to controller actions automatically):
14
+ # Example resource route (maps HTTP verbs to controller actions automatically):
14
15
  # resources :products
15
16
 
16
- # Sample resource route with options:
17
+ # Example resource route with options:
17
18
  # resources :products do
18
19
  # member do
19
20
  # get 'short'
@@ -25,34 +26,31 @@ Dummy::Application.routes.draw do
25
26
  # end
26
27
  # end
27
28
 
28
- # Sample resource route with sub-resources:
29
+ # Example resource route with sub-resources:
29
30
  # resources :products do
30
31
  # resources :comments, :sales
31
32
  # resource :seller
32
33
  # end
33
34
 
34
- # Sample resource route with more complex sub-resources
35
+ # Example resource route with more complex sub-resources:
35
36
  # resources :products do
36
37
  # resources :comments
37
38
  # resources :sales do
38
- # get 'recent', :on => :collection
39
+ # get 'recent', on: :collection
39
40
  # end
40
41
  # end
41
42
 
42
- # Sample resource route within a namespace:
43
+ # Example resource route with concerns:
44
+ # concern :toggleable do
45
+ # post 'toggle'
46
+ # end
47
+ # resources :posts, concerns: :toggleable
48
+ # resources :photos, concerns: :toggleable
49
+
50
+ # Example resource route within a namespace:
43
51
  # namespace :admin do
44
52
  # # Directs /admin/products/* to Admin::ProductsController
45
53
  # # (app/controllers/admin/products_controller.rb)
46
54
  # resources :products
47
55
  # end
48
-
49
- # You can have the root of your site routed with "root"
50
- # just remember to delete public/index.html.
51
- # root :to => 'welcome#index'
52
-
53
- # See how all your routes lay out with "rake routes"
54
-
55
- # This is a legacy wild controller route that's not recommended for RESTful applications.
56
- # Note: This route will make all actions in every controller accessible via GET requests.
57
- # match ':controller(/:action(/:id))(.:format)'
58
56
  end
@@ -1,37 +0,0 @@
1
- Connecting to database specified by database.yml
2
- Connecting to database specified by database.yml
3
- Connecting to database specified by database.yml
4
- Connecting to database specified by database.yml
5
- Connecting to database specified by database.yml
6
- Connecting to database specified by database.yml
7
- Connecting to database specified by database.yml
8
- Connecting to database specified by database.yml
9
- Connecting to database specified by database.yml
10
- Connecting to database specified by database.yml
11
- Connecting to database specified by database.yml
12
- Connecting to database specified by database.yml
13
- Connecting to database specified by database.yml
14
- Connecting to database specified by database.yml
15
- Connecting to database specified by database.yml
16
- Connecting to database specified by database.yml
17
- Connecting to database specified by database.yml
18
- Connecting to database specified by database.yml
19
- Connecting to database specified by database.yml
20
- Connecting to database specified by database.yml
21
- Connecting to database specified by database.yml
22
- Connecting to database specified by database.yml
23
- Connecting to database specified by database.yml
24
- Connecting to database specified by database.yml
25
- Connecting to database specified by database.yml
26
- Connecting to database specified by database.yml
27
- Connecting to database specified by database.yml
28
- Connecting to database specified by database.yml
29
- Connecting to database specified by database.yml
30
- Connecting to database specified by database.yml
31
- Connecting to database specified by database.yml
32
- Connecting to database specified by database.yml
33
- Connecting to database specified by database.yml
34
- Connecting to database specified by database.yml
35
- Connecting to database specified by database.yml
36
- Connecting to database specified by database.yml
37
- Connecting to database specified by database.yml
@@ -2,17 +2,48 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>The page you were looking for doesn't exist (404)</title>
5
- <style type="text/css">
6
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
- div.dialog {
8
- width: 25em;
9
- padding: 0 4em;
10
- margin: 4em auto 0 auto;
11
- border: 1px solid #ccc;
12
- border-right-color: #999;
13
- border-bottom-color: #999;
14
- }
15
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
16
47
  </style>
17
48
  </head>
18
49
 
@@ -22,5 +53,6 @@
22
53
  <h1>The page you were looking for doesn't exist.</h1>
23
54
  <p>You may have mistyped the address or the page may have moved.</p>
24
55
  </div>
56
+ <p>If you are the application owner check the logs for more information.</p>
25
57
  </body>
26
58
  </html>
@@ -2,17 +2,48 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>The change you wanted was rejected (422)</title>
5
- <style type="text/css">
6
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
- div.dialog {
8
- width: 25em;
9
- padding: 0 4em;
10
- margin: 4em auto 0 auto;
11
- border: 1px solid #ccc;
12
- border-right-color: #999;
13
- border-bottom-color: #999;
14
- }
15
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
16
47
  </style>
17
48
  </head>
18
49
 
@@ -22,5 +53,6 @@
22
53
  <h1>The change you wanted was rejected.</h1>
23
54
  <p>Maybe you tried to change something you didn't have access to.</p>
24
55
  </div>
56
+ <p>If you are the application owner check the logs for more information.</p>
25
57
  </body>
26
58
  </html>
@@ -2,17 +2,48 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>We're sorry, but something went wrong (500)</title>
5
- <style type="text/css">
6
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
- div.dialog {
8
- width: 25em;
9
- padding: 0 4em;
10
- margin: 4em auto 0 auto;
11
- border: 1px solid #ccc;
12
- border-right-color: #999;
13
- border-bottom-color: #999;
14
- }
15
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
16
47
  </style>
17
48
  </head>
18
49
 
@@ -21,5 +52,6 @@
21
52
  <div class="dialog">
22
53
  <h1>We're sorry, but something went wrong.</h1>
23
54
  </div>
55
+ <p>If you are the application owner check the logs for more information.</p>
24
56
  </body>
25
57
  </html>
@@ -1,29 +1,66 @@
1
- require_relative '../spec_helper'
2
-
1
+ require 'spec_helper'
2
+
3
3
  module ShortCircuit
4
4
  describe Presentable do
5
- before :each do
6
- @model = TestModel.new('foo', 'bar')
5
+ before do
6
+ mock_model('TestModel')
7
+ TestModel.any_instance.stub(:test_method).and_return('Test Method')
8
+ TestModel.send(:include, Presentable)
9
+ stub_const('TestModelPresenter', Presenter)
7
10
  end
8
11
 
9
- it "should have a presenter" do
10
- @model.presenter.should be_an_instance_of TestModelPresenter
11
- end
12
+ let(:model) { TestModel.new }
12
13
 
13
- it "should present model attributes" do
14
- @model.present(:foo).should eql 'Foo'
15
- end
14
+ describe '#presenter' do
15
+ subject(:presenter) { model.presenter }
16
16
 
17
- it "should delegate model attributes" do
18
- @model.present(:bar).should eql 'bar'
17
+ it 'returns the correct presenter' do
18
+ expect(presenter).to be_a(Presenter)
19
+ expect(presenter).to be_a(TestModelPresenter)
20
+ end
19
21
  end
20
22
 
21
- it "should fail silently by default" do
22
- expect { @model.present(:not_a_method) }.not_to raise_error NoMethodError
23
+ describe '#present' do
24
+ context 'when the method exists' do
25
+ let(:method) { :test_method }
26
+
27
+ it 'calls the presenter method' do
28
+ expect(model.presenter).to receive(:send)
29
+ model.present(method)
30
+ end
31
+ end
32
+
33
+ context 'when the method does not exist' do
34
+ let(:method) { :fake_method }
35
+
36
+ it 'does not throw an error' do
37
+ expect{model.present(method)}.to_not raise_error
38
+ end
39
+
40
+ it 'calls the error_response method' do
41
+ expect(model.presenter).to receive(:error_response)
42
+ model.present(method)
43
+ end
44
+ end
23
45
  end
24
46
 
25
- it "should throw errors when using bang method" do
26
- expect { @model.present!(:not_a_method) }.to raise_error NoMethodError
47
+ describe '#present!' do
48
+ context 'when the method exists' do
49
+ let(:method) { :test_method }
50
+
51
+ it 'calls the presenter method' do
52
+ expect(model.presenter).to receive(:send)
53
+ model.present!(method)
54
+ end
55
+ end
56
+
57
+ context 'when the method does not exist' do
58
+ let(:method) { :fake_method }
59
+
60
+ it 'throws an error' do
61
+ expect{model.present!(method)}.to raise_error(NoMethodError)
62
+ end
63
+ end
27
64
  end
28
65
  end
29
66
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ module ShortCircuit
4
+ describe Presenter do
5
+ let(:presentable_object) { mock_model('TestModel', test_method: 'Test Method') }
6
+
7
+ let(:presenter) { Presenter.new(presentable_object) }
8
+
9
+ it 'delegates missing method calls to controller helpers' do
10
+ expect(ApplicationController.helpers).to receive(:fake_method)
11
+ presenter.send(:fake_method)
12
+ end
13
+
14
+ it 'delegates missing method calls to url helpers' do
15
+ expect(presenter.url_helpers).to receive(:fake_method)
16
+ presenter.send(:fake_method)
17
+ end
18
+
19
+ it 'delegates missing method calls to presentable object' do
20
+ expect(presenter.__getobj__).to receive(:fake_method)
21
+ presenter.send(:fake_method)
22
+
23
+ expect(presenter.test_method).to eq(presentable_object.test_method)
24
+ end
25
+
26
+ describe '#initialize' do
27
+ it 'sets presentable_object' do
28
+ expect(presenter.__getobj__).to eq(presentable_object)
29
+ end
30
+
31
+ it 'set an instance variable for presentable_object' do
32
+ expect(presenter.instance_variable_get("@#{presentable_object.class.to_s.underscore}")).to eq(presentable_object)
33
+ end
34
+ end
35
+
36
+ describe '#url_helpers' do
37
+ subject(:url_helpers) { presenter.url_helpers }
38
+
39
+ it 'returns url_helpers' do
40
+ expect(url_helpers).to_not be_nil
41
+ expect(url_helpers).to respond_to(:url_for)
42
+ end
43
+ end
44
+
45
+ describe '#error_response' do
46
+ subject(:error_response) { presenter.error_response('error', :method) }
47
+
48
+ it 'returns a blank response' do
49
+ expect(error_response).to be_empty
50
+ end
51
+ end
52
+
53
+ end
54
+ end