responders 0.4.8 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ == 0.5
2
+
3
+ * Added Railtie and better Rails 3 support
4
+
1
5
  == 0.4
2
6
 
3
7
  * Added Responders::FlashResponder.flash_keys and default to [ :notice, :alert ]
@@ -1,4 +1,4 @@
1
- Copyright 2009 Plataforma Tecnologia. http://blog.plataformatec.com.br
1
+ Copyright 2010 Plataforma Tecnologia. http://blog.plataformatec.com.br
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,8 +1,9 @@
1
1
  == Responders
2
2
 
3
- A set of responders modules to dry up your Rails application. This branch (v0.4) is meant
4
- to be used with Rails 2.3 with Inherited Resources. Check the master branch for Rails 3
5
- version.
3
+ A set of responders modules to dry up your Rails 3 app. If you are interested in the version
4
+ to be used with Rails 2.3 together with Inherited Resources, please check this branch instead:
5
+
6
+ http://github.com/plataformatec/responders/tree/v0.4
6
7
 
7
8
  * FlashResponder - Sets the flash based on the controller action and resource status.
8
9
  For instance, if you do: respond_with(@post) on a POST request and the resource @post
@@ -12,12 +13,11 @@ version.
12
13
  flash:
13
14
  actions:
14
15
  create:
15
- notice: "{{resource_name}} was successfully created."
16
+ notice: "{resource_name} was successfully created"
16
17
  update:
17
- notice: "{{resource_name}} was successfully updated."
18
+ notice: "{resource_name} was successfully updated"
18
19
  destroy:
19
- notice: "{{resource_name}} was successfully destroyed."
20
- alert: "{{resource_name}} could not be destroyed."
20
+ alert: "{resource_name} could not be destroyed"
21
21
 
22
22
  In case the resource contains errors, you should use the failure key on I18n. This is
23
23
  useful to dry up flash messages from your controllers. If you need a specific message
@@ -29,7 +29,11 @@ version.
29
29
  notice: "Your post was created and will be published soon"
30
30
 
31
31
  This responder is activated in all non get requests. By default it will use the keys
32
- :notice and :alert, but they can be changed as well:
32
+ :notice and :alert, but they can be changed in your application:
33
+
34
+ config.responders.flash_keys = [ :success, :failure ]
35
+
36
+ Or:
33
37
 
34
38
  Responders::FlashResponder.flash_keys = [ :success, :failure ]
35
39
 
@@ -37,9 +41,29 @@ version.
37
41
  allows clients to easily query the server if a resource changed and if the client tries
38
42
  to retrieve a resource that has not been modified, it returns not_modified status.
39
43
 
40
- == Installation
44
+ == Configuring your own responder
45
+
46
+ The first step is instal responders gem and configure it in your application:
47
+
48
+ sudo gem install responders
49
+
50
+ Responders only provides a set of modules, to use them, you have to create your own
51
+ responder. This can be done in an initializer for example:
52
+
53
+ class AppResponder < ActionController::Responder
54
+ include Responders::FlashResponder
55
+ include Responders::HttpCacheResponder
56
+ end
57
+
58
+ Or, for your convenience, just do:
59
+
60
+ rails generate responders_install
61
+
62
+ == Generator
41
63
 
42
- sudo gem install responders --version=0.4.5
64
+ This gem also includes a responders controller generator, so your scaffold can be customized
65
+ to use respond_with instead of default respond_to blocks. Installing this gem automatically
66
+ sets the generator.
43
67
 
44
68
  == Bugs and Feedback
45
69
 
data/Rakefile CHANGED
@@ -29,7 +29,7 @@ begin
29
29
  require 'jeweler'
30
30
  Jeweler::Tasks.new do |s|
31
31
  s.name = "responders"
32
- s.version = Responders::VERSION.dup
32
+ s.version = Responders::VERSION
33
33
  s.summary = "A set of Rails 3 responders to dry up your application"
34
34
  s.email = "contact@plataformatec.com.br"
35
35
  s.homepage = "http://github.com/plataformatec/responders"
@@ -0,0 +1,11 @@
1
+ Description:
2
+ Stubs out a scaffolded controller and its views. Different from rails
3
+ scaffold_controller, it uses respond_with instead of respond_to blocks.
4
+ Pass the model name, either CamelCased or under_scored. The controller
5
+ name is retrieved as a pluralized version of the model name.
6
+
7
+ To create a controller within a module, specify the model name as a
8
+ path like 'parent_module/controller_name'.
9
+
10
+ This generates a controller class in app/controllers and invokes helper,
11
+ template engine and test framework generators.
@@ -0,0 +1,17 @@
1
+ require 'generators/rails/scaffold_controller/scaffold_controller_generator'
2
+
3
+ module Rails
4
+ module Generators
5
+ class RespondersControllerGenerator < ScaffoldControllerGenerator
6
+ def self.source_root
7
+ @_source_root ||= File.expand_path("templates", File.dirname(__FILE__))
8
+ end
9
+
10
+ protected
11
+
12
+ def flash?
13
+ !ApplicationController.responder.ancestors.include?(Responders::FlashResponder)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,53 @@
1
+ class <%= controller_class_name %>Controller < ApplicationController
2
+ <% unless options[:singleton] -%>
3
+ # GET /<%= table_name %>
4
+ # GET /<%= table_name %>.xml
5
+ def index
6
+ @<%= table_name %> = <%= orm_class.all(class_name) %>
7
+ respond_with(@<%= table_name %>)
8
+ end
9
+ <% end -%>
10
+
11
+ # GET /<%= table_name %>/1
12
+ # GET /<%= table_name %>/1.xml
13
+ def show
14
+ @<%= file_name %> = <%= orm_class.find(class_name, "params[:id]") %>
15
+ respond_with(@<%= file_name %>)
16
+ end
17
+
18
+ # GET /<%= table_name %>/new
19
+ # GET /<%= table_name %>/new.xml
20
+ def new
21
+ @<%= file_name %> = <%= orm_class.build(class_name) %>
22
+ respond_with(@<%= file_name %>)
23
+ end
24
+
25
+ # GET /<%= table_name %>/1/edit
26
+ def edit
27
+ @<%= file_name %> = <%= orm_class.find(class_name, "params[:id]") %>
28
+ end
29
+
30
+ # POST /<%= table_name %>
31
+ # POST /<%= table_name %>.xml
32
+ def create
33
+ @<%= file_name %> = <%= orm_class.build(class_name, "params[:#{file_name}]") %>
34
+ <%= "flash[:notice] = '#{class_name} was successfully created.' if " if flash? %>@<%= orm_instance.save %>
35
+ respond_with(@<%= file_name %>)
36
+ end
37
+
38
+ # PUT /<%= table_name %>/1
39
+ # PUT /<%= table_name %>/1.xml
40
+ def update
41
+ @<%= file_name %> = <%= orm_class.find(class_name, "params[:id]") %>
42
+ <%= "flash[:notice] = '#{class_name} was successfully updated.' if " if flash? %>@<%= orm_instance.update_attributes("params[:#{file_name}]") %>
43
+ respond_with(@<%= file_name %>)
44
+ end
45
+
46
+ # DELETE /<%= table_name %>/1
47
+ # DELETE /<%= table_name %>/1.xml
48
+ def destroy
49
+ @<%= file_name %> = <%= orm_class.find(class_name, "params[:id]") %>
50
+ @<%= orm_instance.destroy %>
51
+ respond_with(@<%= file_name %>)
52
+ end
53
+ end
@@ -0,0 +1,23 @@
1
+ class RespondersInstallGenerator < Rails::Generators::Base
2
+ def self.source_root
3
+ @_source_root ||= File.expand_path("..", __FILE__)
4
+ end
5
+
6
+ desc "Creates an initializer with default responder configuration and copy locale file"
7
+
8
+ def create_responder_initializer
9
+ create_file "config/initializers/responders.rb", <<-FILE
10
+ class ApplicationResponder
11
+ include Responders::FlashResponder
12
+ include Responders::HttpCacheResponder
13
+ end
14
+
15
+ ApplicationController.respond_to :html
16
+ ApplicationController.responder = ApplicationResponder
17
+ FILE
18
+ end
19
+
20
+ def copy_locale
21
+ copy_file "../responders/locales/en.yml", "config/locales/responders.en.yml"
22
+ end
23
+ end
@@ -1,4 +1,20 @@
1
1
  module Responders
2
2
  autoload :FlashResponder, 'responders/flash_responder'
3
3
  autoload :HttpCacheResponder, 'responders/http_cache_responder'
4
+
5
+ class Railtie < ::Rails::Railtie
6
+ railtie_name :responders
7
+
8
+ config.generators.scaffold_controller = :responders_controller
9
+
10
+ # Add load paths straight to I18n, so engines and application can overwrite it.
11
+ require 'active_support/i18n'
12
+ I18n.load_path << File.expand_path('../responders/locales/en.yml', __FILE__)
13
+
14
+ initializer "responders.flash_responder" do
15
+ if config.responders.flash_keys
16
+ Responders::FlashResponder.flash_keys = config.responders.flash_keys
17
+ end
18
+ end
19
+ end
4
20
  end
@@ -64,8 +64,6 @@ module Responders
64
64
  #
65
65
  # respond_with(@user, :notice => "Hooray! Welcome!", :alert => "Woot! You failed.")
66
66
  #
67
- # * :flash_now - Sets the flash message using flash.now. Accepts true, :on_failure or :on_sucess.
68
- #
69
67
  # == Configure status keys
70
68
  #
71
69
  # As said previously, FlashResponder by default use :notice and :alert
@@ -82,30 +80,24 @@ module Responders
82
80
 
83
81
  def initialize(controller, resources, options={})
84
82
  super
85
- @flash = options.delete(:flash)
86
- @notice = options.delete(:notice)
87
- @alert = options.delete(:alert)
88
- @flash_now = options.delete(:flash_now)
83
+ @flash = options.delete(:flash)
84
+ @notice = options.delete(:notice)
85
+ @alert = options.delete(:alert)
89
86
  end
90
87
 
91
88
  def to_html
92
- set_flash_message! if set_flash_message?
93
89
  super
94
- end
95
-
96
- def to_js
97
90
  set_flash_message! if set_flash_message?
98
- to_format
99
91
  end
100
92
 
101
93
  protected
102
94
 
103
95
  def set_flash_message!
104
96
  if has_errors?
105
- set_flash(:alert, @alert)
97
+ controller.flash[:alert] ||= @alert if @alert
106
98
  status = Responders::FlashResponder.flash_keys.last
107
99
  else
108
- set_flash(:notice, @notice)
100
+ controller.flash[:notice] ||= @notice if @notice
109
101
  status = Responders::FlashResponder.flash_keys.first
110
102
  end
111
103
 
@@ -113,18 +105,7 @@ module Responders
113
105
 
114
106
  options = mount_i18n_options(status)
115
107
  message = ::I18n.t options[:default].shift, options
116
- set_flash(status, message)
117
- end
118
-
119
- def set_flash(key, value)
120
- return if value.blank?
121
- flash = controller.flash
122
- flash = flash.now if set_flash_now?
123
- flash[key] ||= value
124
- end
125
-
126
- def set_flash_now?
127
- (@flash_now == true) || (has_errors? ? @flash_now == :on_failure : @flash_now == :on_success) || (format == :js)
108
+ controller.flash[status] = message unless message.blank?
128
109
  end
129
110
 
130
111
  def set_flash_message? #:nodoc:
@@ -132,8 +113,8 @@ module Responders
132
113
  end
133
114
 
134
115
  def mount_i18n_options(status) #:nodoc:
135
- resource_name = if resource.class.respond_to?(:human_name)
136
- resource.class.human_name
116
+ resource_name = if resource.class.respond_to?(:model_name)
117
+ resource.class.model_name.human
137
118
  else
138
119
  resource.class.name.underscore.humanize
139
120
  end
@@ -141,7 +122,7 @@ module Responders
141
122
  options = {
142
123
  :default => flash_defaults_by_namespace(status),
143
124
  :resource_name => resource_name,
144
- :resource_sym => resource_name.downcase
125
+ :downcase_resource_name => resource_name.downcase
145
126
  }
146
127
 
147
128
  if controller.respond_to?(:interpolation_options, true)
@@ -33,8 +33,7 @@ module Responders
33
33
  end
34
34
 
35
35
  def do_http_cache?
36
- get? && @http_cache != false && ActionController::Base.perform_caching &&
37
- !new_record? && controller.response.last_modified.nil? && resource.respond_to?(:updated_at)
36
+ get? && @http_cache != false && !new_record? && controller.response.last_modified.nil?
38
37
  end
39
38
 
40
39
  def new_record?
@@ -0,0 +1,10 @@
1
+ en:
2
+ flash:
3
+ actions:
4
+ create:
5
+ notice: '{{resource_name}} was successfully created.'
6
+ update:
7
+ notice: '{{resource_name}} was successfully updated.'
8
+ destroy:
9
+ notice: '{{resource_name}} was successfully destroyed.'
10
+ alert: '{{resource_name}} could not be destroyed.'
@@ -1,3 +1,3 @@
1
1
  module Responders
2
- VERSION = "0.4.8".freeze
2
+ VERSION = "0.5.0".freeze
3
3
  end
@@ -16,10 +16,9 @@ end
16
16
  class AddressesController < ApplicationController
17
17
  before_filter :set_resource
18
18
  self.responder = FlashResponder
19
- respond_to :js, :only => :create
20
19
 
21
20
  def action
22
- options = params.slice(:flash, :flash_now)
21
+ options = params.slice(:flash)
23
22
  flash[:success] = "Flash is set" if params[:set_flash]
24
23
  respond_with(@resource, options)
25
24
  end
@@ -108,32 +107,6 @@ class FlashResponderTest < ActionController::TestCase
108
107
  assert_equal "Resource with block created with success", flash[:success]
109
108
  end
110
109
 
111
- def test_sets_now_flash_message_on_javascript_requests
112
- @now = {}
113
- @controller.flash.expects(:now).returns(@now)
114
- post :create, :format => :js
115
- assert_equal "Resource created with success", @now[:success]
116
- end
117
-
118
- def test_sets_flash_message_can_be_set_to_now
119
- @now = {}
120
- @controller.flash.expects(:now).returns(@now)
121
- post :create, :flash_now => true
122
- assert_equal "Resource created with success", @now[:success]
123
- end
124
-
125
- def test_sets_flash_message_can_be_set_to_now_only_on_success
126
- @now = {}
127
- @controller.flash.expects(:now).returns(@now)
128
- post :create, :flash_now => :on_success
129
- assert_equal "Resource created with success", @now[:success]
130
- end
131
-
132
- def test_sets_flash_message_can_be_set_to_now_only_on_failure
133
- @controller.flash.expects(:now).never
134
- post :create, :flash_now => :on_failure
135
- end
136
-
137
110
  def test_sets_message_based_on_notice_key
138
111
  Responders::FlashResponder.flash_keys = [ :notice, :alert ]
139
112
  post :another
@@ -94,9 +94,9 @@ class HttpCacheResponderTest < ActionController::TestCase
94
94
  assert_equal 200, @response.status
95
95
  end
96
96
 
97
- def test_collection_does_not_trigger_http_cache
97
+ def test_collection_chooses_the_latest_timestamp
98
98
  get :collection
99
- assert_equal nil, @response.headers["Last-Modified"]
99
+ assert_equal Time.utc(2009).httpdate, @response.headers["Last-Modified"]
100
100
  assert_match /xml/, @response.body
101
101
  assert_equal 200, @response.status
102
102
  end
@@ -108,6 +108,11 @@ class HttpCacheResponderTest < ActionController::TestCase
108
108
  assert_equal 200, @response.status
109
109
  end
110
110
 
111
+ def test_it_does_not_set_body_etag
112
+ get :collection
113
+ assert_nil @response.headers["ETag"]
114
+ end
115
+
111
116
  def test_does_not_set_cache_for_new_records
112
117
  get :new_record
113
118
  assert_nil @response.headers["Last-Modified"]
@@ -20,13 +20,14 @@ RAILS_ROOT = "anywhere"
20
20
 
21
21
  require 'active_support'
22
22
  require 'action_controller'
23
- require 'action_controller/test_case'
23
+ require 'action_dispatch/middleware/flash'
24
+
25
+ require 'rails/railtie'
24
26
 
25
27
  class ApplicationController < ActionController::Base
26
28
  respond_to :html, :xml
27
29
  end
28
30
 
29
- # Add IR to load path and load the main file
30
31
  $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
31
32
  require 'responders'
32
33
 
metadata CHANGED
@@ -1,13 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: responders
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease:
6
- segments:
7
- - 0
8
- - 4
9
- - 8
10
- version: 0.4.8
4
+ version: 0.5.0
11
5
  platform: ruby
12
6
  authors:
13
7
  - "Jos\xC3\xA9 Valim"
@@ -15,7 +9,7 @@ autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
11
 
18
- date: 2011-05-07 00:00:00 +02:00
12
+ date: 2010-02-07 00:00:00 +01:00
19
13
  default_executable:
20
14
  dependencies: []
21
15
 
@@ -32,44 +26,40 @@ files:
32
26
  - MIT-LICENSE
33
27
  - README.rdoc
34
28
  - Rakefile
29
+ - lib/generators/rails/USAGE
30
+ - lib/generators/rails/responders_controller_generator.rb
31
+ - lib/generators/rails/templates/controller.rb
32
+ - lib/generators/responders_install_generator.rb
35
33
  - lib/responders.rb
36
34
  - lib/responders/flash_responder.rb
37
35
  - lib/responders/http_cache_responder.rb
36
+ - lib/responders/locales/en.yml
38
37
  - lib/responders/version.rb
39
- - test/flash_responder_test.rb
40
- - test/http_cache_responder_test.rb
41
- - test/test_helper.rb
42
38
  has_rdoc: true
43
39
  homepage: http://github.com/plataformatec/responders
44
40
  licenses: []
45
41
 
46
42
  post_install_message:
47
- rdoc_options: []
48
-
43
+ rdoc_options:
44
+ - --charset=UTF-8
49
45
  require_paths:
50
46
  - lib
51
47
  required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
48
  requirements:
54
49
  - - ">="
55
50
  - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
51
  version: "0"
52
+ version:
60
53
  required_rubygems_version: !ruby/object:Gem::Requirement
61
- none: false
62
54
  requirements:
63
55
  - - ">="
64
56
  - !ruby/object:Gem::Version
65
- hash: 3
66
- segments:
67
- - 0
68
57
  version: "0"
58
+ version:
69
59
  requirements: []
70
60
 
71
61
  rubyforge_project:
72
- rubygems_version: 1.5.3
62
+ rubygems_version: 1.3.5
73
63
  signing_key:
74
64
  specification_version: 3
75
65
  summary: A set of Rails 3 responders to dry up your application