simple_rest 0.0.1

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.
data/README.rdoc ADDED
@@ -0,0 +1,141 @@
1
+ = Simple Rest
2
+
3
+ * http://github.com/niquola/simple_rest
4
+
5
+ == DESCRIPTION
6
+
7
+ ActionControllers helper methods for restful response handling
8
+ Just DRY respond_to do |format|; ...; end;
9
+ Support for jsonp and pdf
10
+
11
+
12
+ == INSTALL:
13
+
14
+ in config/environment.rb
15
+
16
+ config.gem 'simple_rest'
17
+
18
+ then
19
+
20
+ sudo rake gems:install
21
+
22
+ To handle uncatched exceptios restfully add this to ApplicationController
23
+
24
+ class ApplicationController < ApplicationController::Base
25
+ rescue_exceptions_restfully
26
+ end
27
+
28
+ == USAGE
29
+
30
+ Example:
31
+
32
+ def action
33
+ #fetch result
34
+ options = {:status=>:ok,:serialize_opts=>some options will be passed to to_json or to_xml}
35
+ simple_rest result,options
36
+ end
37
+
38
+ See more in tests
39
+
40
+ == TEST EXAMPLES:
41
+
42
+
43
+ ActionController::Routing::Routes.draw do |map|
44
+ map.connect ':controller/:action/:id.:format'
45
+ map.connect ':controller/:action.:format'
46
+ map.connect ':controller/:action/:id'
47
+ end
48
+
49
+ class MyController < ActionController::Base
50
+ rescue_exceptions_restfully
51
+
52
+ class MyException< Exception
53
+ end
54
+
55
+ rescue_from MyException do |exception|
56
+ simple_rest({:message=>exception.to_s},{:status=>500})
57
+ end
58
+
59
+ def index
60
+ result = {:field=>'value'}
61
+ simple_rest result
62
+ end
63
+
64
+ def action_with_error
65
+ raise MyException.new("Some error")
66
+ end
67
+
68
+ def action_with_uncatched_error
69
+ raise Exception.new("Some error")
70
+ end
71
+ end
72
+
73
+ class MyControllerTest < ActionController::TestCase
74
+ def test_methods_mixed
75
+ assert(MyController.new.respond_to?(:simple_rest))
76
+ end
77
+
78
+ def test_js_format
79
+ get :index, :format => 'js'
80
+ resp = @response.body
81
+ assert(resp)
82
+ resp_obj = nil
83
+ assert_nothing_raised(Exception) {
84
+ resp_obj = ActiveSupport::JSON.decode(resp)
85
+ }
86
+ assert_not_nil(resp_obj)
87
+ assert_equal('value', resp_obj['field'])
88
+ end
89
+
90
+ def test_jsonp_format
91
+ get :index, :format => 'jsonp'
92
+ resp = @response.body
93
+ assert(resp)
94
+ resp_obj = nil
95
+ assert_nothing_raised(Exception) {
96
+ resp_obj = ActiveSupport::JSON.decode(resp)
97
+ }
98
+ assert_not_nil(resp_obj)
99
+ assert_not_nil(resp_obj['status'])
100
+ assert_equal(200,resp_obj['status'])
101
+ assert_equal('value',resp_obj['data']['field'])
102
+ end
103
+
104
+ def test_xml_format
105
+ get :index, :format => 'xml'
106
+ resp_obj = nil
107
+ assert_nothing_raised(Exception) {
108
+ resp_obj = html_document
109
+ }
110
+ assert_not_nil(resp_obj)
111
+ #FIXME: add more asserts
112
+ end
113
+
114
+ def test_jsonp_exception
115
+ get :action_with_error, :format => 'jsonp'
116
+ resp = @response.body
117
+ resp_obj = nil
118
+ assert_nothing_raised(Exception) {
119
+ resp_obj = ActiveSupport::JSON.decode(resp)
120
+ }
121
+ assert_not_nil(resp_obj)
122
+ assert_not_nil(resp_obj['data']['message'])
123
+ assert_equal(500,resp_obj['status'])
124
+ end
125
+
126
+ def test_rescue_exceptions_restfully
127
+ get :action_with_uncatched_error, :format => 'jsonp'
128
+ resp = @response.body
129
+ resp_obj = nil
130
+ assert_nothing_raised(Exception) {
131
+ resp_obj = ActiveSupport::JSON.decode(resp)
132
+ }
133
+ assert_not_nil(resp_obj)
134
+ assert_not_nil(resp_obj['data']['message'])
135
+ assert_equal(500,resp_obj['status'])
136
+ assert_response(:ok)
137
+
138
+ get :action_with_uncatched_error, :format => 'js'
139
+ assert_response(500)
140
+ end
141
+ end
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/gempackagetask'
6
+
7
+ desc 'Default: run unit tests.'
8
+ task :default => :test
9
+
10
+ desc 'Test the dojo_on_rails plugin.'
11
+ Rake::TestTask.new(:test) do |t|
12
+ t.libs << 'test'
13
+ t.test_files = FileList['test/*_test.rb']
14
+ t.verbose = true
15
+ end
16
+
17
+ desc 'Generate rdoc'
18
+ Rake::RDocTask.new(:rdoc) do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'Simple Rest'
21
+ rdoc.options << '--line-numbers' << '--inline-source'
22
+ rdoc.rdoc_files.include('README.rdoc')
23
+ rdoc.rdoc_files.include('lib/**/*.rb')
24
+ end
25
+
26
+ PKG_FILES = FileList[ '[a-zA-Z]*', 'lib/**/*', 'test/**/*' ]
27
+
28
+ spec = Gem::Specification.new do |s|
29
+ s.name = "simple_rest"
30
+ s.version = "0.0.1"
31
+ s.author = "niquola,smecsia"
32
+ s.email = "niquola@gmail.com,smecsia@gmail"
33
+ #s.homepage = ""
34
+ s.platform = Gem::Platform::RUBY
35
+ s.summary = "ActionControllers helpers for restful rails"
36
+ s.add_dependency('rails', '>= 2.3.5')
37
+ s.files = PKG_FILES.to_a
38
+ s.require_path = "lib"
39
+ s.has_rdoc = false
40
+ s.extra_rdoc_files = ["README.rdoc"]
41
+ end
42
+
43
+ desc 'Turn this plugin into a gem.'
44
+ Rake::GemPackageTask.new(spec) do |pkg|
45
+ pkg.gem_spec = spec
46
+ end
@@ -0,0 +1,25 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ module SimpleRest
4
+ VERSION = '0.0.1'
5
+ autoload :ActionControllerMethods, 'simple_rest/action_controller_methods'
6
+ class << self
7
+ def enable
8
+ ActionController::Base.send :include, ActionControllerMethods
9
+ enable_mime_types
10
+ end
11
+
12
+ def enable_mime_types
13
+ unless defined? Mime::PDF
14
+ Mime::Type.register("application/pdf", :pdf)
15
+ end
16
+ unless defined? Mime::JSONP
17
+ Mime::Type.register("text/javascript", :jsonp)
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ if defined? ActionController
24
+ SimpleRest.enable if defined? ActionController
25
+ end
@@ -0,0 +1,61 @@
1
+ module SimpleRest
2
+ module ActionControllerMethods
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def rescue_exceptions_restfully
9
+ rescue_from Exception do |exception|
10
+ simple_rest({:message=>exception.to_s},{:status=>500})
11
+ end
12
+ end
13
+ end
14
+
15
+ def simple_rest(data, opts={})
16
+ status= opts[:status] || :ok
17
+ serial_opts= opts[:serialize_opts] || {}
18
+ respond_to do |format|
19
+ format.js { render :json => data.to_json(serial_opts),:status=>status}
20
+ format.html { render}
21
+ format.yaml { render :partial=> 'shared/inspect',:content_type =>'text/html',:locals => { :data => data } ,:status=>status }
22
+ format.xml { render :xml => data.to_xml(serial_opts),:status=>status}
23
+ format.pdf { render (opts[:pdf_opts] || {}).merge(:layout=>false) }
24
+ format.jsonp { render_jsonp(data,opts) }
25
+ end
26
+ end
27
+
28
+ def render_jsonp(data, options={})
29
+ text = build_jsonp_message(data,options)
30
+ render({:content_type => :js, :text => text}.merge(options.merge(:status=>:ok)))
31
+ end
32
+
33
+ def build_jsonp_message(data,options)
34
+ message = {:status=>options[:status] || 200, :data=>data}
35
+ json=message.to_json(options)
36
+ callback, variable = params[:callback], params[:variable]
37
+ response =
38
+ begin
39
+ if callback && variable
40
+ "var #{variable} = #{json};\n#{callback}(#{variable});"
41
+ elsif variable
42
+ "var #{variable} = #{json};"
43
+ elsif callback
44
+ "#{callback}(#{json});"
45
+ else
46
+ json
47
+ end
48
+ end
49
+ end
50
+
51
+ def store_location
52
+ session[:return_to] = request.request_uri
53
+ end
54
+
55
+ def redirect_back_or_default(default)
56
+ redirect_to(session[:return_to] || default)
57
+ session[:return_to] = nil
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,102 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ ActionController::Routing::Routes.draw do |map|
4
+ map.connect ':controller/:action/:id.:format'
5
+ map.connect ':controller/:action.:format'
6
+ map.connect ':controller/:action/:id'
7
+ end
8
+
9
+ class MyController < ActionController::Base
10
+ rescue_exceptions_restfully
11
+
12
+ class MyException< Exception
13
+ end
14
+
15
+ rescue_from MyException do |exception|
16
+ simple_rest({:message=>exception.to_s},{:status=>500})
17
+ end
18
+
19
+ def index
20
+ result = {:field=>'value'}
21
+ simple_rest result
22
+ end
23
+
24
+ def action_with_error
25
+ raise MyException.new("Some error")
26
+ end
27
+
28
+ def action_with_uncatched_error
29
+ raise Exception.new("Some error")
30
+ end
31
+ end
32
+
33
+ class MyControllerTest < ActionController::TestCase
34
+ def test_methods_mixed
35
+ assert(MyController.new.respond_to?(:simple_rest))
36
+ end
37
+
38
+ def test_js_format
39
+ get :index, :format => 'js'
40
+ resp = @response.body
41
+ assert(resp)
42
+ resp_obj = nil
43
+ assert_nothing_raised(Exception) {
44
+ resp_obj = ActiveSupport::JSON.decode(resp)
45
+ }
46
+ assert_not_nil(resp_obj)
47
+ assert_equal('value', resp_obj['field'])
48
+ end
49
+
50
+ def test_jsonp_format
51
+ get :index, :format => 'jsonp'
52
+ resp = @response.body
53
+ assert(resp)
54
+ resp_obj = nil
55
+ assert_nothing_raised(Exception) {
56
+ resp_obj = ActiveSupport::JSON.decode(resp)
57
+ }
58
+ assert_not_nil(resp_obj)
59
+ assert_not_nil(resp_obj['status'])
60
+ assert_equal(200,resp_obj['status'])
61
+ assert_equal('value',resp_obj['data']['field'])
62
+ end
63
+
64
+ def test_xml_format
65
+ get :index, :format => 'xml'
66
+ resp_obj = nil
67
+ assert_nothing_raised(Exception) {
68
+ resp_obj = html_document
69
+ }
70
+ assert_not_nil(resp_obj)
71
+ #FIXME: add more asserts
72
+ end
73
+
74
+ def test_jsonp_exception
75
+ get :action_with_error, :format => 'jsonp'
76
+ resp = @response.body
77
+ resp_obj = nil
78
+ assert_nothing_raised(Exception) {
79
+ resp_obj = ActiveSupport::JSON.decode(resp)
80
+ }
81
+ assert_not_nil(resp_obj)
82
+ assert_not_nil(resp_obj['data']['message'])
83
+ assert_equal(500,resp_obj['status'])
84
+ end
85
+
86
+ def test_rescue_exceptions_restfully
87
+ get :action_with_uncatched_error, :format => 'jsonp'
88
+ resp = @response.body
89
+ resp_obj = nil
90
+ assert_nothing_raised(Exception) {
91
+ resp_obj = ActiveSupport::JSON.decode(resp)
92
+ }
93
+ assert_not_nil(resp_obj)
94
+ assert_not_nil(resp_obj['data']['message'])
95
+ assert_equal(500,resp_obj['status'])
96
+ assert_response(:ok)
97
+
98
+ get :action_with_uncatched_error, :format => 'js'
99
+ assert_response(500)
100
+
101
+ end
102
+ end
@@ -0,0 +1,12 @@
1
+ def path(path)
2
+ File.join(File.dirname(__FILE__),path)
3
+ end
4
+
5
+ $:.unshift(path('../lib'))
6
+ require 'rubygems'
7
+ require "test/unit"
8
+ require 'active_support'
9
+ require 'active_support/test_case'
10
+ require 'action_controller'
11
+ require 'simple_rest'
12
+
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_rest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - niquola,smecsia
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-03-04 00:00:00 +03:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.5
24
+ version:
25
+ description:
26
+ email: niquola@gmail.com,smecsia@gmail
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ files:
34
+ - Rakefile
35
+ - README.rdoc
36
+ - lib/simple_rest/action_controller_methods.rb
37
+ - lib/simple_rest.rb
38
+ - test/simple_rest_test.rb
39
+ - test/test_helper.rb
40
+ has_rdoc: true
41
+ homepage:
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project:
64
+ rubygems_version: 1.3.5
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: ActionControllers helpers for restful rails
68
+ test_files: []
69
+