presenter-pattern 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -4,8 +4,8 @@ lib/presenter-pattern.rb
4
4
  lib/presenter-pattern/railtie.rb
5
5
  presenter-pattern.gemspec
6
6
  rails/init.rb
7
- test/no_querying_view_test.rb
8
- test/only_data_in_view_test.rb
7
+ test/bad_controller_test.rb
8
+ test/foos_controller_test.rb
9
9
  test/setup_test.rb
10
10
  test/test_helper.rb
11
11
  Manifest
data/Rakefile CHANGED
@@ -2,12 +2,12 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
4
 
5
- Echoe.new('presenter-pattern', '0.2.1') do |p|
5
+ Echoe.new('presenter-pattern', '0.3.0') do |p|
6
6
  p.description = "Enables and enforces the presenter pattern in rails"
7
7
  p.url = "https://github.com/jleven/presenter-pattern"
8
8
  p.author = "Josh Leven"
9
9
  p.email = "josh.leven@gmail.com"
10
- p.ignore_pattern = /^(tmp|pkg|doc|test\/rails_app)|(\.svn|CVS|\.bzr|\.DS|\.git)$/
10
+ p.ignore_pattern = /^(tmp|pkg|doc|test\/rails_app|Gemfile)|(\.svn|CVS|\.bzr|\.DS|\.git)$/
11
11
  p.development_dependencies = []
12
12
  end
13
13
 
@@ -1,9 +1,70 @@
1
1
  require 'presenter-pattern/railtie'
2
2
 
3
+
4
+ # PresenterPattern::API enables and enforces very simple api controllers.
5
+ # Essentially, your controller has the settings:
6
+ # layout nil
7
+ # responds_to *formats <--- formats is specified in step 1 below
8
+ #
9
+ # and each action ends with an implicit:
10
+ # responds_with <return_value_from_action>
11
+ #
12
+ #
13
+ # 1. In your controller, include PresenterPattern::API, passing in the formats your api
14
+ # will support using the bracket operator (defaults to :xml and :json)
15
+ #
16
+ # e.g. include PresenterPattern::API[:html, :json]
17
+ #
18
+ # 2. Each action must return the data you wish for your api to return.
19
+ # Do NOT call render from within your actions.
20
+ #
21
+
22
+
3
23
  module PresenterPattern
4
- def protected_instance_variables
5
- return instance_variable_names - ["@data"] if respond_to?(:instance_variable_names)
6
- super
24
+ module API
25
+ class NoExplicitRender < RuntimeError; end
26
+
27
+ def self.[](*formats)
28
+ custom_api = self.dup
29
+ custom_api.class_eval do
30
+ define_singleton_method :included do |host_class|
31
+ host_class.layout nil
32
+ host_class.respond_to *formats
33
+ end
34
+ end
35
+ custom_api
36
+ end
37
+
38
+ def self.included(host_class)
39
+ host_class.layout nil
40
+ host_class.respond_to :xml, :json
41
+ end
42
+
43
+ # enforces simple api response
44
+ #
45
+ # each action must return the data meant for their response
46
+ #
47
+ # - overwrites ActionController::Metal::ImplicitRender
48
+ def send_action(method_name, *args)
49
+ #call the action, and store return value
50
+ @__rval = self.send(method_name, *args)
51
+
52
+ #fail if action calls 'render'
53
+ raise NoExplicitRender, "Controllers implementing the PresenterPattern::API must not call any render methods" if response_body
54
+
55
+ #always follow responder pattern passing in the action's return value
56
+ respond_with @__rval, (@respond_with_opts || {})
57
+ end
58
+
59
+ def respond_opts(options)
60
+ @respond_with_opts ||= {}
61
+ @respond_with_opts.merge! options
62
+ end
63
+
64
+ #only the @__rval variable (set in send_action) is passed through to the view
65
+ def view_assigns
66
+ {"data" => @__rval}
67
+ end
7
68
  end
8
69
  end
9
70
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{presenter-pattern}
5
- s.version = "0.2.1"
5
+ s.version = "0.3.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Josh Leven"]
@@ -10,14 +10,14 @@ Gem::Specification.new do |s|
10
10
  s.description = %q{Enables and enforces the presenter pattern in rails}
11
11
  s.email = %q{josh.leven@gmail.com}
12
12
  s.extra_rdoc_files = ["README.rdoc", "lib/presenter-pattern.rb", "lib/presenter-pattern/railtie.rb"]
13
- s.files = ["README.rdoc", "Rakefile", "lib/presenter-pattern.rb", "lib/presenter-pattern/railtie.rb", "presenter-pattern.gemspec", "rails/init.rb", "test/no_querying_view_test.rb", "test/only_data_in_view_test.rb", "test/setup_test.rb", "test/test_helper.rb", "Manifest"]
13
+ s.files = ["README.rdoc", "Rakefile", "lib/presenter-pattern.rb", "lib/presenter-pattern/railtie.rb", "presenter-pattern.gemspec", "rails/init.rb", "test/bad_controller_test.rb", "test/foos_controller_test.rb", "test/setup_test.rb", "test/test_helper.rb", "Manifest"]
14
14
  s.homepage = %q{https://github.com/jleven/presenter-pattern}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Presenter-pattern", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{presenter-pattern}
18
18
  s.rubygems_version = %q{1.7.2}
19
19
  s.summary = %q{Enables and enforces the presenter pattern in rails}
20
- s.test_files = ["test/no_querying_view_test.rb", "test/only_data_in_view_test.rb", "test/setup_test.rb", "test/test_helper.rb"]
20
+ s.test_files = ["test/bad_controller_test.rb", "test/foos_controller_test.rb", "test/setup_test.rb", "test/test_helper.rb"]
21
21
 
22
22
  if s.respond_to? :specification_version then
23
23
  s.specification_version = 3
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class BadControllerTest < ActionController::TestCase
4
+ tests BadController
5
+
6
+ def setup
7
+ super
8
+ @name = "Hello World!"
9
+ @foo = Foo.create :name => @name
10
+ end
11
+
12
+ def test_data_variable_in_view
13
+ get :good, :id => @foo.id
14
+ assert_response :success
15
+ assert_equal @name, @response.body
16
+ end
17
+
18
+ def test_only_data_variable_in_view
19
+ get :no_vars, :id => @foo.id
20
+ assert_equal "", @response.body
21
+ end
22
+
23
+ def test_empty_action
24
+ get :empty
25
+ assert_response :success
26
+ end
27
+
28
+ def test_query_in_view_fails
29
+ assert_raise(ActionView::Template::Error) do
30
+ get :query
31
+ end
32
+ end
33
+
34
+ def test_no_explicit_render
35
+ assert_raise(PresenterPattern::API::NoExplicitRender) do
36
+ get :explicit
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ class FoosControllerTest < ActionController::TestCase
4
+ tests FoosController
5
+
6
+ def setup
7
+ super
8
+ @name = "Name"
9
+ @foo = Foo.create :name => @name
10
+ end
11
+
12
+ def test_index
13
+ get :index
14
+ assert_response :success
15
+ assert_equal @name, @response.body
16
+ end
17
+
18
+ def test_show
19
+ get :show, :id => @foo.id
20
+ assert_response :success
21
+ assert_equal @name, @response.body
22
+ end
23
+
24
+ def test_new
25
+ get :new
26
+ assert_response :success
27
+ assert_equal "", @response.body
28
+ end
29
+
30
+ def test_create_success
31
+ post :create, :foo => @foo.attributes, :format => :json
32
+ assert_response :success
33
+ assert_equal @foo.to_json, @response.body
34
+ end
35
+
36
+ def test_create_failure
37
+ post :create, :foo => {}, :format => :json
38
+ assert_response :unprocessable_entity
39
+ assert_equal "{\"name\":[\"can't be blank\"]}", @response.body
40
+ end
41
+
42
+ def test_create_failure_ajax
43
+ xhr :post, :create, :foo => {}, :format => :json
44
+ assert_response :unprocessable_entity
45
+ assert_equal "{\"name\":[\"can't be blank\"]}", @response.body
46
+ end
47
+
48
+ def test_respond_opts
49
+ get :edit, :id => @foo.id, :format => :json
50
+ assert_response 206
51
+ assert_equal @foo.to_json, @response.body
52
+ end
53
+
54
+ def test_destroy
55
+ assert_difference('Foo.count', -1) do
56
+ delete :destroy, :id => @foo.id, :format => :json
57
+ end
58
+ assert_response :success
59
+ assert_equal "{}", @response.body
60
+ end
61
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: presenter-pattern
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -26,8 +26,8 @@ files:
26
26
  - lib/presenter-pattern/railtie.rb
27
27
  - presenter-pattern.gemspec
28
28
  - rails/init.rb
29
- - test/no_querying_view_test.rb
30
- - test/only_data_in_view_test.rb
29
+ - test/bad_controller_test.rb
30
+ - test/foos_controller_test.rb
31
31
  - test/setup_test.rb
32
32
  - test/test_helper.rb
33
33
  - Manifest
@@ -62,7 +62,7 @@ signing_key:
62
62
  specification_version: 3
63
63
  summary: Enables and enforces the presenter pattern in rails
64
64
  test_files:
65
- - test/no_querying_view_test.rb
66
- - test/only_data_in_view_test.rb
65
+ - test/bad_controller_test.rb
66
+ - test/foos_controller_test.rb
67
67
  - test/setup_test.rb
68
68
  - test/test_helper.rb
@@ -1,22 +0,0 @@
1
- require 'test_helper'
2
-
3
- class NoQueryingViewTest < ActionController::TestCase
4
- tests FoosController
5
-
6
- def setup
7
- super
8
- @foo = Foo.create :name => "name"
9
- end
10
-
11
- def test_thin_views_are_successful
12
- get :show, :id => @foo.id
13
- assert_response :success
14
- end
15
-
16
- def test_thick_views_fail
17
- assert_raise(ActionView::Template::Error) do
18
- get :index
19
- end
20
- end
21
-
22
- end
@@ -1,23 +0,0 @@
1
- require 'test_helper'
2
-
3
- class OnlyDataInViewTest < ActionController::TestCase
4
- tests FoosController
5
-
6
- def setup
7
- super
8
- @name = "Hello World!"
9
- @foo = Foo.create :name => @name
10
- end
11
-
12
- def test_data_variable_in_view
13
- get :show, :id => @foo.id
14
- assert_response :success
15
- assert_equal @name, @response.body
16
- end
17
-
18
- def test_only_data_variable_in_view
19
- get :edit, :id => @foo.id
20
- assert_equal "", @response.body
21
- end
22
-
23
- end