jrb_handler 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.
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+
2
+ source :gemcutter
3
+
4
+ gem "activesupport", ">=3.0.3"
5
+ gem "actionpack", ">=3.0.3"
6
+
7
+ group :development, :test do
8
+ gem "rspec", ">= 2.0"
9
+ gem "rspec-rails", ">= 2.0"
10
+ end
11
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Paul Sadauskas
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,102 @@
1
+ # JRB Templates
2
+
3
+ JRB Templates makes it easy to write JSON web services in Rails. Rather than maintaining two views for the collection and the individual resource, or rendering a third via a partial, you only have to write a single `.jrb` view.
4
+
5
+ ## Installation
6
+
7
+ Either
8
+
9
+ $ gem install jrb_template
10
+
11
+ or add
12
+
13
+ gem jrb_template
14
+
15
+ to your `./Gemfile`
16
+
17
+
18
+ ## Examples
19
+
20
+ Using the new Ruby 1.9 hash format, you can just write something that looks a lot like JSON:
21
+
22
+ # app/views/books/book.json.jrb
23
+ {
24
+ href: book_url(book),
25
+ _type: "Book",
26
+ title: book.title
27
+ author_href: author_url(book.author),
28
+ synopsis: book.summary,
29
+ isbn: format_isbn(book.isbn),
30
+ created_at: book.created_at,
31
+ updated_at: book.updated_at
32
+ }
33
+
34
+
35
+ In Ruby 1.8, you have to use the old hash format, and the order gets jumbled.
36
+
37
+ Then, in your controller:
38
+
39
+ # app/controllers/books_controller.rb
40
+
41
+ class BooksController < ApplicationController
42
+
43
+ def index
44
+ @books = Book.all
45
+
46
+ respond_to do |format|
47
+ format.html
48
+ format.json { render :jrb_collection => @books }
49
+ end
50
+ end
51
+
52
+ def show
53
+ @book = Book.find(params[:id])
54
+
55
+ respond_to do |format|
56
+ format.html
57
+ format.json { render :jrb => @book }
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ *Note: I do not recommend using application/json as the mime type extension. Please see [Versioning REST Web Services][].*
64
+
65
+ Results in the following json:
66
+
67
+ # GET /books
68
+ {
69
+ href: "http://example.com/books",
70
+ count: 1,
71
+ items: [
72
+ {
73
+ href: "http://example.com/books/1
74
+ _type: "Book",
75
+ title: "Death From the Skies!",
76
+ author_href: "http://example.com/authors/plait_philip_c".
77
+ synopsis: " These Are the Ways the World Will End...".
78
+ isbn: "978-0670019977",
79
+ created_at: "2010-12-13T18:44:22Z",
80
+ updated_at: "2010-12-13T18:44:22Z"
81
+ }
82
+ ]
83
+ }
84
+
85
+ # GET /books/1
86
+ {
87
+ href: "http://example.com/books/1
88
+ _type: "Book",
89
+ title: "Death From the Skies!",
90
+ author_href: "http://example.com/authors/plait_philip_c".
91
+ synopsis: " These Are the Ways the World Will End...".
92
+ isbn: "978-0670019977",
93
+ created_at: "2010-12-13T18:44:22Z",
94
+ updated_at: "2010-12-13T18:44:22Z"
95
+ }
96
+
97
+
98
+
99
+
100
+
101
+
102
+ [Versioning REST Web Services]: http://barelyenough.org/blog/2008/05/versioning-rest-web-services/
@@ -0,0 +1,33 @@
1
+
2
+ # -*- encoding: utf-8 -*-
3
+ lib = File.expand_path('../lib/', __FILE__)
4
+ $:.unshift lib unless $:.include?(lib)
5
+
6
+ require "jrb_handler/version"
7
+
8
+ Gem::Specification.new do |s|
9
+ s.name = "jrb_handler"
10
+ s.version = JrbHandler::VERSION
11
+ s.platform = Gem::Platform::RUBY
12
+ s.authors = ["Paul Sadauskas"]
13
+ s.email = ["psadauskas@gmail.com"]
14
+ s.homepage = "http://github.com/paul/jrb_handler"
15
+ s.summary = "A Rails template handler and renderer for JSON"
16
+ s.description = <<-DESC
17
+ Jrb Handler makes it easy to write JSON web services in Rails 3. Keep your views in views, not in your Model#to_json.
18
+ DESC
19
+
20
+ s.required_rubygems_version = ">= 1.3.6"
21
+
22
+ s.add_development_dependency "rspec", ">= 2.0.0"
23
+ s.add_development_dependency "rspec-rails", ">= 2.0.0"
24
+ s.add_development_dependency "bundler"
25
+
26
+ s.add_dependency "activesupport", ">= 3.0.3"
27
+ s.add_dependency "actionpack", ">= 3.0.3"
28
+
29
+ s.files = `git ls-files`.split("\n")
30
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
31
+ s.require_paths = ['lib']
32
+
33
+ end
@@ -0,0 +1,11 @@
1
+
2
+ require 'active_support/time_with_zone'
3
+
4
+ # Personal preference, I like my JSON timestamps in UTC, and xmlschema
5
+ # format, eg "2010-12-13T18:00:00Z"
6
+ class ActiveSupport::TimeWithZone
7
+ def to_json(options = nil)
8
+ utc.xmlschema.to_json
9
+ end
10
+ end
11
+
@@ -0,0 +1,18 @@
1
+
2
+ module JrbHandler
3
+
4
+ end
5
+
6
+ unless respond_to?(:require_relative)
7
+ # Ripped right from 1.9 source
8
+ def require_relative(path)
9
+ require File.join(File.dirname(caller[0]), path.to_str)
10
+ end
11
+ end
12
+
13
+ require_relative 'jrb_handler/template_handler'
14
+ require_relative 'jrb_handler/jrb_partial_renderer'
15
+ require_relative 'jrb_handler/renderers'
16
+
17
+
18
+
@@ -0,0 +1,33 @@
1
+ module JrbHandler
2
+
3
+ # Since I can't get the Rails team interested in making these changes, I have to monkey
4
+ # patch some privatish methods in AV::Partials::PartialRenderer. Works in 3.0.1, but I
5
+ # expect it to break frequently.
6
+ class JrbPartialRenderer < ActionView::Partials::PartialRenderer
7
+
8
+ # Skip rendering the results into a string, just leave it as an array.
9
+ def render_collection
10
+ return nil if @collection.blank?
11
+
12
+ if @options.key?(:spacer_template)
13
+ spacer = find_template(@options[:spacer_template]).render(@view, @locals)
14
+ end
15
+
16
+ result = @template ? collection_with_template : collection_without_template
17
+ # Skip forcing the result into a sting. Everything above this is just like the original method
18
+ #result.join(spacer).html_safe
19
+ end
20
+
21
+ # Tell the template finder we're not a partial, so it doesnt try to find the underscored method
22
+ def find_template(path=@path)
23
+ return path unless path.is_a?(String)
24
+ prefix = @view.controller_path unless path.include?(?/)
25
+
26
+ ##########
27
+ @view.find_template(path, prefix, false)
28
+ ##########
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,31 @@
1
+ module JrbHandler::Renderers
2
+
3
+ EPOCH = Time.utc(2000, 1, 1).iso8601
4
+
5
+ ::ActionController::Renderers.add(:jrb_collection) do |resources, options|
6
+ output = {
7
+ :href => request.url,
8
+ :count => resources.size,
9
+ :items => render(:ssaj1 => resources)
10
+ }
11
+
12
+ output = ActiveSupport::JSON.encode(output, :pretty => !Rails.env.production?)
13
+ self.response_body = output
14
+ end
15
+
16
+ ::ActionController::Renderers.add(:jrb) do |resource, options|
17
+ options[:partial] ||= resource
18
+ #options.delete(:layout)
19
+
20
+ output = JrbPartialRenderer.new(self.view_context, options, nil).render
21
+
22
+ # If we got a set of resources, we're being rendered inside a collection,
23
+ # so just return the results and let the collection renderer handle the rest
24
+ return [] if output.nil?
25
+ return output if output.is_a?(Array)
26
+
27
+ output = ActiveSupport::JSON.encode(output, :pretty => !Rails.env.production?)
28
+ self.response_body = output
29
+ end
30
+
31
+ end
@@ -0,0 +1,16 @@
1
+ module JrbHandler
2
+ class TemplateHandler < ActionView::Template::Handler
3
+ include ActionView::Template::Handlers::Compilable
4
+
5
+ ActionView::Template.register_template_handler(:jrb, self)
6
+
7
+ self.default_format = Mime::JSON
8
+
9
+ def compile(template)
10
+ template.source
11
+ end
12
+
13
+ end
14
+ end
15
+
16
+
@@ -0,0 +1,4 @@
1
+
2
+ module JrbHandler
3
+ VERSION = "1.0.0"
4
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jrb_handler
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Paul Sadauskas
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-13 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 0
31
+ - 0
32
+ version: 2.0.0
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec-rails
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 2
45
+ - 0
46
+ - 0
47
+ version: 2.0.0
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: bundler
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: activesupport
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ segments:
72
+ - 3
73
+ - 0
74
+ - 3
75
+ version: 3.0.3
76
+ type: :runtime
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: actionpack
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ segments:
87
+ - 3
88
+ - 0
89
+ - 3
90
+ version: 3.0.3
91
+ type: :runtime
92
+ version_requirements: *id005
93
+ description: " Jrb Handler makes it easy to write JSON web services in Rails 3. Keep your views in views, not in your Model#to_json.\n"
94
+ email:
95
+ - psadauskas@gmail.com
96
+ executables: []
97
+
98
+ extensions: []
99
+
100
+ extra_rdoc_files: []
101
+
102
+ files:
103
+ - .gitignore
104
+ - Gemfile
105
+ - LICENSE
106
+ - README.markdown
107
+ - jrb_handler.gemspec
108
+ - lib/active_support_extensions.rb
109
+ - lib/jrb_handler.rb
110
+ - lib/jrb_handler/jrb_partial_renderer.rb
111
+ - lib/jrb_handler/renderers.rb
112
+ - lib/jrb_handler/template_handler.rb
113
+ - lib/jrb_handler/version.rb
114
+ has_rdoc: true
115
+ homepage: http://github.com/paul/jrb_handler
116
+ licenses: []
117
+
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ segments:
137
+ - 1
138
+ - 3
139
+ - 6
140
+ version: 1.3.6
141
+ requirements: []
142
+
143
+ rubyforge_project:
144
+ rubygems_version: 1.3.7
145
+ signing_key:
146
+ specification_version: 3
147
+ summary: A Rails template handler and renderer for JSON
148
+ test_files: []
149
+