mynyml-rack-respond_to 0.9

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright © 2009 Martin Aumont (mynyml)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README ADDED
@@ -0,0 +1,48 @@
1
+ SUMMARY
2
+
3
+ Rack convenience middleware that allows triggering different actions based on
4
+ requested format. Standalone version of the equivalent Rails functionality.
5
+
6
+ INSTALLATION
7
+
8
+ sudo gem install mynyml-rack-respond_to --source=http://gems.github.com/
9
+
10
+ USAGE
11
+
12
+ require 'rubygems'
13
+ require 'rack'
14
+ require 'rack/respond_to'
15
+
16
+ class App
17
+ include Rack::RespondTo
18
+
19
+ def call(env)
20
+ # simply pass in the env if another middleware already added
21
+ # the format to env['request.format']
22
+ #Rack::RespondTo.env = env
23
+
24
+ # otherwise, you can assign it directly
25
+ Rack::RespondTo.format = 'html'
26
+
27
+ body = respond_to do |format|
28
+ format.html { '<em>html</em>' }
29
+ format.xml { '<body>xml</body>' }
30
+ end
31
+
32
+ content_type = Rack::RespondTo.mime_type
33
+ [200, {'Content-Type' => content_type}, [body]]
34
+ end
35
+ end
36
+
37
+ run App.new
38
+
39
+ TIP
40
+
41
+ To fully extract the requested format, use:
42
+
43
+ Rack::AcceptFormat (sudo gem install rack-rack-contrib --source=http://gems.github.com/)
44
+ Rack::AbstractFormat (sudo gem install mynyml-rack-abstract-format --source=http://gems.github.com/)
45
+
46
+ These will allow using only <tt>Rack::RespondTo.env = env</tt> to set up ResondTo.
47
+
48
+ See examples/recommended_use.ru for a complete example.
data/Rakefile ADDED
@@ -0,0 +1,66 @@
1
+ # --------------------------------------------------
2
+ # based on thin's Rakefile (http://github.com/macournoyer/thin)
3
+ # --------------------------------------------------
4
+ require 'rake/gempackagetask'
5
+ require 'rake/rdoctask'
6
+ require 'pathname'
7
+ require 'yaml'
8
+
9
+ RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
10
+ WIN = (RUBY_PLATFORM =~ /mswin|cygwin/)
11
+ SUDO = (WIN ? "" : "sudo")
12
+
13
+ def gem
14
+ RUBY_1_9 ? 'gem19' : 'gem'
15
+ end
16
+
17
+ def all_except(res)
18
+ Dir['**/*'].reject do |path|
19
+ Array(res).any? {|re| path.match(re) }
20
+ end
21
+ end
22
+
23
+ spec = Gem::Specification.new do |s|
24
+ s.name = 'rack-respond_to'
25
+ s.version = '0.9'
26
+ s.summary = "Rack middleware port of Rails's respond_to feature"
27
+ s.description = "Rack middleware port of Rails's respond_to feature"
28
+ s.author = "Martin Aumont"
29
+ s.email = 'mynyml@gmail.com'
30
+ s.homepage = ''
31
+ s.has_rdoc = true
32
+ s.require_path = "lib"
33
+ s.files = all_except([/doc/, /pkg/])
34
+ end
35
+
36
+ Rake::GemPackageTask.new(spec) do |p|
37
+ p.gem_spec = spec
38
+ end
39
+
40
+ desc "Remove package products"
41
+ task :clean => :clobber_package
42
+
43
+ desc "Update the gemspec for GitHub's gem server"
44
+ task :gemspec do
45
+ Pathname("#{spec.name}.gemspec").open('w') {|f| f << YAML.dump(spec) }
46
+ end
47
+
48
+ desc "Install gem"
49
+ task :install => [:clobber, :package] do
50
+ sh "#{SUDO} #{gem} install pkg/#{spec.full_name}.gem"
51
+ end
52
+
53
+ desc "Uninstall gem"
54
+ task :uninstall => :clean do
55
+ sh "#{SUDO} #{gem} uninstall -v #{spec.version} -x #{spec.name}"
56
+ end
57
+
58
+ desc "Generate rdoc documentation."
59
+ Rake::RDocTask.new("rdoc") { |rdoc|
60
+ rdoc.rdoc_dir = 'doc/rdoc'
61
+ rdoc.title = "Simple Router - Document"
62
+ rdoc.options << '--line-numbers' << '--inline-source'
63
+ rdoc.options << '--charset' << 'utf-8'
64
+ rdoc.rdoc_files.include('README')
65
+ rdoc.rdoc_files.include('lib/**/*.rb')
66
+ }
@@ -0,0 +1,38 @@
1
+ # install required dependencies:
2
+ #
3
+ # $sudo gem install rack-rack-contrib --source=http://gems.github.com/
4
+ # $sudo gem install mynyml-rack-abstract-format --source=http://gems.github.com/
5
+ #
6
+ # and run me with:
7
+ # $rackup examples/recommended_use.ru -p 8080
8
+ #
9
+ require 'rubygems'
10
+ require 'rack'
11
+ require 'rack/contrib' # for Rack::AcceptFormat
12
+ require 'rack/abstract_format'
13
+ require 'rack/respond_to'
14
+
15
+ class App
16
+ include Rack::RespondTo
17
+
18
+ def call(env)
19
+ Rack::RespondTo.env = env
20
+ request = Rack::Request.new(env)
21
+
22
+ body = case request.path_info
23
+ when '/foo'
24
+ respond_to do |format|
25
+ format.html { '<em>html</em>' }
26
+ format.xml { '<body>xml</body>' }
27
+ end
28
+ end
29
+
30
+ content_type = Rack::RespondTo.mime_type
31
+ [200, {'Content-Type' => content_type}, [body]]
32
+ end
33
+ end
34
+
35
+ use Rack::AcceptFormat
36
+ use Rack::AbstractFormat
37
+ run App.new
38
+
@@ -0,0 +1,36 @@
1
+ # run me with:
2
+ # $rackup examples/simple_app.ru -p 8080
3
+ #
4
+ require 'pathname'
5
+ root = Pathname(__FILE__).dirname.parent.expand_path
6
+ $:.unshift(root.join('lib'))
7
+
8
+ require 'rubygems'
9
+ require 'rack'
10
+ require 'rack/respond_to'
11
+
12
+ class App
13
+ include Rack::RespondTo
14
+
15
+ def call(env)
16
+ # simply pass in the env if another middleware already added
17
+ # the format to env['request.format']
18
+ #Rack::RespondTo.env = env
19
+
20
+ # otherwise, you can assign it directly
21
+ Rack::RespondTo.format = 'html'
22
+
23
+ body = case env['PATH_INFO']
24
+ when '/'
25
+ respond_to do |format|
26
+ format.html { '<em>html</em>' }
27
+ format.xml { '<body>xml</body>' }
28
+ end
29
+ end
30
+
31
+ content_type = Rack::RespondTo.mime_type
32
+ [200, {'Content-Type' => content_type}, [body]]
33
+ end
34
+ end
35
+
36
+ run App.new
@@ -0,0 +1,82 @@
1
+ module Rack
2
+
3
+ # Based on Rails's API, and sinatra-respond_to (http://github.com/cehoffman/sinatra-respond_to)
4
+ #
5
+ # See examples/ directory for code examples.
6
+ module RespondTo
7
+ class << self
8
+ # Assign the environment directly if it contains the format in
9
+ # env['request.format']. This is useful in conjunction with other
10
+ # middlewares that store the format in the env key.
11
+ attr_accessor :env
12
+
13
+ # If used completely standalone, you can assign the request format directly.
14
+ #
15
+ # RespondTo.format = 'xml'
16
+ attr_writer :format
17
+
18
+ # Requested format
19
+ def format
20
+ (@format || self.env['request.format']).to_s.strip.downcase.sub(/^\./,'')
21
+ end
22
+
23
+ def included(base) #:nodoc:
24
+ base.extend(ClassMethods)
25
+ base.class_eval do
26
+ include InstanceMethods
27
+ end
28
+ end
29
+
30
+ # Convenience method that returns the mime type of the given format
31
+ # (similar to Rack::Mime.mime_type).
32
+ #
33
+ # If format argument is omitted, will return the mime type for
34
+ # RespondTo.format (i.e. equivelent to RespondTo.mime_type(RespondTo.format)).
35
+ # Useful for setting content type:
36
+ #
37
+ # ===== Example
38
+ #
39
+ # [200, {'Content-Type' => Rack::RespondTo.mime_type}, [body]]
40
+ def mime_type(format = nil)
41
+ format ||= self.format
42
+ ext = format.sub(/^\./,'').insert(0,'.')
43
+ Rack::Mime.mime_type(ext)
44
+ end
45
+ end
46
+
47
+ module InstanceMethods
48
+ # Delegates to the equivalent class method.
49
+ def respond_to(&block)
50
+ self.class.respond_to(&block)
51
+ end
52
+ end
53
+
54
+ module ClassMethods
55
+ # Allows defining different actions and returns the one which corresponds
56
+ # to the current RespondTo.format.
57
+ #
58
+ # ===== Example
59
+ #
60
+ # RespondTo.format = 'html'
61
+ #
62
+ # respond_to do |format|
63
+ # format.html { '<em>html</em>' }
64
+ # format.xml { '<content>xml</content>' }
65
+ # end
66
+ # #=> '<em>html</em>'
67
+ #
68
+ def respond_to(&block)
69
+ format = Format.new
70
+ block.call(format)
71
+ handler = format[RespondTo.mime_type]
72
+ handler.nil? ? nil : handler.call
73
+ end
74
+ end
75
+
76
+ class Format < Hash #:nodoc:
77
+ def method_missing(format, *args, &handler)
78
+ self[RespondTo.mime_type(format.to_s)] = handler
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-respond_to
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.9"
5
+ platform: ruby
6
+ authors:
7
+ - Martin Aumont
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-22 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Rack middleware port of Rails's respond_to feature
17
+ email: mynyml@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - test
27
+ - test/test_respond_to.rb
28
+ - test/test_helper.rb
29
+ - examples
30
+ - examples/simple_app.ru
31
+ - examples/recommended_use.ru
32
+ - lib
33
+ - lib/rack
34
+ - lib/rack/respond_to.rb
35
+ - rack-respond_to.gemspec
36
+ - LICENSE
37
+ - README
38
+ has_rdoc: true
39
+ homepage: ""
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options: []
44
+
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.3.3
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Rack middleware port of Rails's respond_to feature
66
+ test_files: []
67
+
@@ -0,0 +1,20 @@
1
+ require 'pathname'
2
+ require 'test/unit'
3
+ require 'rubygems'
4
+ require 'rack'
5
+ begin
6
+ require 'ruby-debug'
7
+ rescue LoadError, RuntimeError
8
+ end
9
+
10
+ root = Pathname(__FILE__).dirname.parent.expand_path
11
+ $:.unshift(root.join('lib'))
12
+
13
+ require 'rack/respond_to'
14
+
15
+ class Test::Unit::TestCase
16
+ def self.test(name, &block)
17
+ name = :"test_#{name.gsub(/\s/,'_')}"
18
+ define_method(name, &block)
19
+ end
20
+ end
@@ -0,0 +1,86 @@
1
+ require 'test/test_helper'
2
+
3
+ class App
4
+ include Rack::RespondTo
5
+ end
6
+
7
+ class TestRespondTo < Test::Unit::TestCase
8
+
9
+ def setup
10
+ Rack::RespondTo.format = nil
11
+ end
12
+
13
+ ## api
14
+
15
+ test "format accessor" do
16
+ Rack::RespondTo.format = 'xml'
17
+ end
18
+
19
+ test "env accessor" do
20
+ Rack::RespondTo.env = {}
21
+ end
22
+
23
+ test "mixin injects respond_to class method" do
24
+ assert App.respond_to?(:respond_to)
25
+ end
26
+
27
+ test "mixin injects respond_to instance method" do
28
+ assert App.new.respond_to?(:respond_to)
29
+ end
30
+
31
+ ## format
32
+
33
+ test "format is extracted from env" do
34
+ Rack::RespondTo.env = {'request.format' => 'xml'}
35
+ assert_equal 'xml', Rack::RespondTo.format
36
+ end
37
+
38
+ test "explicitly specified format takes precedence of env's" do
39
+ Rack::RespondTo.env = {'request.format' => 'xml'}
40
+ Rack::RespondTo.format = 'html'
41
+ assert_equal 'html', Rack::RespondTo.format
42
+ end
43
+
44
+ test "format is normalized" do
45
+ Rack::RespondTo.format = '.html'
46
+ assert_equal 'html', Rack::RespondTo.format
47
+
48
+ Rack::RespondTo.format = :html
49
+ assert_equal 'html', Rack::RespondTo.format
50
+
51
+ Rack::RespondTo.format = ' html '
52
+ assert_equal 'html', Rack::RespondTo.format
53
+
54
+ Rack::RespondTo.format = 'HTML'
55
+ assert_equal 'html', Rack::RespondTo.format
56
+ end
57
+
58
+ ## respond_to
59
+
60
+ test "respond_to returns block for requested format" do
61
+ Rack::RespondTo.format = 'xml'
62
+ response = App.respond_to do |format|
63
+ format.xml { 'xml' }
64
+ format.txt { 'txt' }
65
+ end
66
+ assert_equal 'xml', response
67
+ end
68
+
69
+ test "respond_to returns nil when no format matches" do
70
+ Rack::RespondTo.format = 'html'
71
+ response = App.respond_to do |format|
72
+ format.xml { 'xml' }
73
+ format.txt { 'txt' }
74
+ end
75
+ assert_equal nil, response
76
+ end
77
+
78
+ test "respond_to handles synonymous formats" do
79
+ Rack::RespondTo.format = 'htm' # htm should trigger both htm and html
80
+ response = App.respond_to do |format|
81
+ format.html { 'html' }
82
+ format.json { 'json' }
83
+ end
84
+ assert_equal 'html', response
85
+ end
86
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mynyml-rack-respond_to
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.9"
5
+ platform: ruby
6
+ authors:
7
+ - Martin Aumont
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-21 21:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Rack middleware port of Rails's respond_to feature
17
+ email: mynyml@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - test
27
+ - test/test_respond_to.rb
28
+ - test/test_helper.rb
29
+ - examples
30
+ - examples/simple_app.ru
31
+ - examples/recommended_use.ru
32
+ - lib
33
+ - lib/rack
34
+ - lib/rack/respond_to.rb
35
+ - rack-respond_to.gemspec
36
+ - LICENSE
37
+ - README
38
+ has_rdoc: true
39
+ homepage: ""
40
+ post_install_message:
41
+ rdoc_options: []
42
+
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ requirements: []
58
+
59
+ rubyforge_project:
60
+ rubygems_version: 1.2.0
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Rack middleware port of Rails's respond_to feature
64
+ test_files: []
65
+