aeonscope-btech_rest 0.2.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.
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,5 @@
1
+ v0.1.0 Initial version.
2
+ v0.2.0 Fixed a bug where a resource with no namespace(s) would result in double slashed prefixes (i.e. "//").
3
+ Added a resource breadcrumb helper.
4
+ Added unobtrusive jQuery support.
5
+
data/LICENSE.rdoc ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008, 2009 Berserk Technologies
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.
data/README.rdoc ADDED
@@ -0,0 +1,114 @@
1
+ = Overview
2
+
3
+ Easily adhere to DRY principals and add default REST functionality to your controllers. This means you can write code
4
+ like this:
5
+
6
+ class Posts < ApplicationController
7
+ include BTech::Rest
8
+ end
9
+
10
+ ...and you will automatically have the following REST actions:
11
+
12
+ * index
13
+ * show
14
+ * new
15
+ * edit
16
+ * create
17
+ * update
18
+ * destroy
19
+
20
+ How is that for being DRY[http://en.wikipedia.org/wiki/DRY]? Read on to learn more.
21
+
22
+ = License
23
+
24
+ Copyright (c) 2008-2009 {Berserk Technologies}[http://www.berserktech.com].
25
+ See the included LICENSE[link:files/LICENSE_rdoc.html] file for more info.
26
+
27
+ = History
28
+
29
+ See the CHANGELOG[link:files/CHANGELOG_rdoc.html] file for more info.
30
+
31
+ = Requirements
32
+
33
+ 1. Knowledge of the {Representational State Transfer (REST)}[http://en.wikipedia.com/wiki/REST]. Download and read {RESTful Rails}[http://www.b-simple.de/documents] if you need further info.
34
+ 2. mislav-will_paginate[http://github.com/mislav/will_paginate/tree/master] gem. This is automatically installed/updated for you unless the correct version is detected.
35
+
36
+ = Installation
37
+
38
+ Type the following from the command line to install:
39
+
40
+ * <b>MacOS/Linux</b>: sudo gem install btech_rest
41
+ * *Windows*: gem install btech_rest
42
+
43
+ Type the following from the command line to setup:
44
+
45
+ * script/generate rest_setup
46
+
47
+ = Usage
48
+
49
+ As mentioned in the overview, simply add the following line of code to your controller(s) to make them RESTful:
50
+
51
+ include BTech::Rest
52
+
53
+ Example:
54
+
55
+ class Posts < ApplicationController
56
+ include BTech::Rest
57
+ end
58
+
59
+ To customize the RESTful behavior of your controller, use any combination of these three macros:
60
+
61
+ * belongs_to[link:classes/BTech/Rest/ClassMethods.html] - Enables resource nesting where a controller can belong to a parent controller (i.e. http://www.example.com/posts/1/comments/2). This behavior is similar to the ActiveRecord belongs_to[http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to/] macro.
62
+ * resource_options[link:classes/BTech/Rest/ClassMethods.html] - Allows you to customize the default behavior of your controller(s). There is a lot you can do with this, so follow the link and read the method comments to learn more.
63
+ * disabled_actions[link:classes/BTech/Rest/ClassMethods.html] - Allows you to disable any of the default REST actions. Follow the link to learn more.
64
+
65
+ Example:
66
+
67
+ class Comments < ApplicationController
68
+ include BTech::Rest
69
+ belongs_to :posts
70
+ resource_options :label => "My Wicked Comments"
71
+ disabled_actions :show, :destroy
72
+ end
73
+
74
+ Here is the breakdown, line-by-line, of the example shown above:
75
+
76
+ 1. Enables restful behavior.
77
+ 2. Identifies the controller as a nested resource of posts.
78
+ 3. Instead of using the default label "Comments", a customized label of "My Wicked Comments" is used instead.
79
+ 4. The "show" and "destroy" actions are disabled which means only the following actions will work: index, new, edit, create, and update.
80
+
81
+ Using the post and comment controller relationship as defined above, we can break this relationship down even further.
82
+ The post (parent) resource would have the following values (in this case, all default values):
83
+
84
+ * +parent_key+ = N/A
85
+ * +parent_value+ = N/A
86
+ * +parent_resource_method+ = N/A
87
+ * +name+ = "posts"
88
+ * +label+ = "Posts"
89
+ * +controller+ = PostsController
90
+ * +model+ = Post
91
+ * +record+ = #<Post id: 1, label: "Test", content: "Test", created_at: "2008-10-31 23:59:28", updated_at: "2008-10-31 23:59:28">
92
+ * +namespaces+ = []
93
+ * +show_partial+ = "/posts/show"
94
+ * +new_or_edit_partial+ = "/posts/new_or_edit"
95
+
96
+ The comment (child) resource would have the following values:
97
+
98
+ * +parent_key+ = post_id
99
+ * +parent_value+ = 1
100
+ * +parent_resource_method+ = N/A
101
+ * +name+ = "comments"
102
+ * +label+ = "My Wicked Comments"
103
+ * +controller+ = CommentsController
104
+ * +model+ = Comment
105
+ * +record+ = #<Post id: 1, post_id: nil, label: "Test", content: "Test", created_at: "2008-10-31 23:59:28", updated_at: "2008-10-31 23:59:28">
106
+ * +namespaces+ = []
107
+ * +show_partial+ = "/comments/show"
108
+ * +new_or_edit_partial+ = "/comments/new_or_edit"
109
+
110
+ = Contact/Feedback/Issues
111
+
112
+ * {Berserk Technologies}[http://www.berserktech.com] - Company web site.
113
+ * Aeonscope[http://www.aeonscope.net] - Personal web site.
114
+ * Twitter[http://www.twitter.com/Aeonscope] - Short bursts of insight and/or noise.
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 2
3
+ :patch: 0
4
+ :major: 0
data/lib/actions.rb ADDED
@@ -0,0 +1,195 @@
1
+ module BTech
2
+ module Rest
3
+ module Actions
4
+ # Default index action. Feel free to override.
5
+ def index
6
+ build_resources
7
+ if @resources.size > 1
8
+ # Records for a nested resource (act on the second-to-last parent).
9
+ parent = @resources[@resources.size - 2][:record]
10
+ @records = parent.instance_eval("#{@resources.last[:parent_resource_method] || @resources.last[:name]}").paginate :page => params[:page], :per_page => 10
11
+ else
12
+ # Records for single resource.
13
+ @records = @resources.last[:model].paginate :page => params[:page], :per_page => 10
14
+ end
15
+ end
16
+
17
+ # Default show action. Feel free to override.
18
+ def show
19
+ build_resources
20
+ render :partial => @resources.last[:show_partial], :layout => true, :locals => {:record => @record, :resources => @resources}
21
+ end
22
+
23
+ # Default new action. Feel free to override.
24
+ def new
25
+ build_resources
26
+ render_new_or_edit
27
+ end
28
+
29
+ # Default edit action. Feel free to override.
30
+ def edit
31
+ build_resources
32
+ render_new_or_edit
33
+ end
34
+
35
+ # Default create action. Feel free to override.
36
+ def create
37
+ build_resources
38
+ if @record.update_attributes params[:record]
39
+ redirect_to build_resource_url(@resources)
40
+ else
41
+ render_new_or_edit
42
+ end
43
+ end
44
+
45
+ # Default update action. Feel free to override.
46
+ def update
47
+ build_resources
48
+ if @record.update_attributes params[:record]
49
+ redirect_to build_resource_url(@resources)
50
+ else
51
+ render_new_or_edit
52
+ end
53
+ end
54
+
55
+ # Default destroy action. Feel free to override.
56
+ def destroy
57
+ build_resources
58
+ @record.destroy
59
+ @resources.last.delete :record
60
+ redirect_to build_resource_url(@resources)
61
+ end
62
+
63
+ protected
64
+
65
+ # Convenience method for rendering the new or edit partial.
66
+ def render_new_or_edit
67
+ render :partial => @resources.last[:new_or_edit_partial], :layout => true, :locals => {:record => @record, :resources => @resources}
68
+ end
69
+
70
+ # Builds the RESTful parent URL based on an array of resources.
71
+ def build_parent_url resources = []
72
+ namespaces = resources.last[:namespaces]
73
+ url = namespaces && !namespaces.empty? ? '/' + resources.last[:namespaces].join('/') : nil
74
+ if resources.size > 1
75
+ resources.slice(0...resources.size - 1).each do |resource|
76
+ url = [url, resource[:name], resource[:parent_id]].join('/')
77
+ end
78
+ end
79
+ url
80
+ end
81
+
82
+ # A convenience method for builing RESTful URLs based on an array of resources with the
83
+ # option to override the default action. This is also defined as a helper method (see base.rb).
84
+ def build_resource_url resources = [], action = :index
85
+ name = resources.last[:name]
86
+ id = resources.last[:record].id if resources.last[:record]
87
+ parent_url = build_parent_url(resources)
88
+ url = parent_url ? [parent_url, name].join('/') : '/' + name
89
+ case action
90
+ when :show then url = [url, id].compact.join('/')
91
+ when :new then url = [url, "new"].compact.join('/')
92
+ when :edit then url = [url, id, "edit"].compact.join('/')
93
+ when :update then url = [url, id].compact.join('/') if name == name.pluralize
94
+ when :destroy then url = [url, id].compact.join('/') if name == name.pluralize
95
+ end
96
+ logger.debug "Resource URL: #{url}"
97
+ url
98
+ end
99
+
100
+ private
101
+
102
+ # Builds all resources for the controller(s).
103
+ def build_resources
104
+ @resources ||= []
105
+ if @resources.empty?
106
+ controller_name = self.class.name
107
+ add_resource controller_name, @resources
108
+ @resources.reverse!
109
+ end
110
+ # Convenience for holding the current record and for form manipulation.
111
+ @record = @resources.last[:record]
112
+ end
113
+
114
+ # Convenience method for answering back a properly camelized controller name.
115
+ def camelize_controller_name name
116
+ name = name.capitalize.gsub "controller", "Controller"
117
+ name += "Controller" unless name.include? "Controller"
118
+ name
119
+ end
120
+
121
+ # Answers the child or parent controller namespaces (array) and name (string).
122
+ # Accepts the following argruments:
123
+ # * *full_name* - The fully namespaced controller (i.e. PostsController) or parent name (i.e. protected_pages).
124
+ # Usage:
125
+ # * Input: Public::PostsController, Output: [Public], "PostsController"
126
+ # * Input: member_manage_posts, Output: [Member, Manage], "PostsController"
127
+ # * Input: posts, Output: nil, "PostsController"
128
+ def get_controller_namespaces_and_name full_name
129
+ if full_name
130
+ delimiter = full_name.include?("Controller") ? "::" : '_'
131
+ if full_name.include? delimiter
132
+ namespaces = full_name.split delimiter
133
+ name = camelize_controller_name namespaces.pop
134
+ return namespaces.collect(&:capitalize), name
135
+ else
136
+ return nil, camelize_controller_name(full_name)
137
+ end
138
+ end
139
+ end
140
+
141
+ # Recursively walks the controller belongs_to hierarchy (if any) adding new resources along the way.
142
+ def add_resource controller_name, resources
143
+ logger.debug "Adding resource '#{controller_name}' to resources (size = #{resources.size})."
144
+ resource = configure_resource controller_name
145
+ if resource
146
+ resources << resource
147
+ # Recursively add parents (if any).
148
+ if resource[:controller].methods.include? "parent_resource"
149
+ add_resource resource[:controller].parent_resource, resources
150
+ end
151
+ end
152
+ end
153
+
154
+ # Configures a resource via belongs_to name refrence in controller. By default the controller and model
155
+ # are assumed to use the same root name regardless of singular or plural context.
156
+ def configure_resource controller_name
157
+ namespaces, name = get_controller_namespaces_and_name controller_name
158
+ controller = [namespaces, name].compact.join("::").constantize
159
+ name = name.chomp("Controller").underscore
160
+ parent_key = name.singularize + "_id"
161
+ resource = controller.resource_options || {}
162
+ resource.reverse_merge! :parent_key => parent_key,
163
+ :parent_id => params[parent_key],
164
+ :name => name,
165
+ :controller => controller,
166
+ :label => name.capitalize,
167
+ :namespaces => (namespaces.collect(&:downcase) if namespaces),
168
+ :show_partial => '/' + [namespaces, name, "show"].compact.join('/').downcase,
169
+ :new_or_edit_partial => '/' + [namespaces, name, "new_or_edit"].compact.join('/').downcase
170
+ begin
171
+ resource.reverse_merge! :model => name.singularize.camelize.constantize
172
+ rescue NameError
173
+ logger.warn "Unable to constantize: " + name
174
+ end
175
+ add_record resource
176
+ end
177
+
178
+ # Adds the current record to the resource based on position in chain.
179
+ def add_record resource
180
+ if resource[:model]
181
+ if params.include? resource[:parent_key]
182
+ # Nested parent.
183
+ resource[:record] = resource[:model].find resource[:parent_id] if resource[:parent_id]
184
+ else
185
+ # Single resource and/or end of nested chain.
186
+ resource[:record] = params[:id] ? resource[:model].find(params[:id]) : resource[:model].new
187
+ end
188
+ else
189
+ logger.error "Invalid model. Check that your controller and model are of the same name, otherwise specify the model as a resource option."
190
+ end
191
+ resource
192
+ end
193
+ end
194
+ end
195
+ end
data/lib/btech_rest.rb ADDED
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + "/class_methods.rb"
2
+ require File.dirname(__FILE__) + "/actions.rb"
3
+ require File.dirname(__FILE__) + "/resource_helper.rb"
4
+
5
+ module BTech
6
+ module Rest
7
+ def self.included base
8
+ base.extend ClassMethods
9
+ base.helper "resource"
10
+ base.helper_method :build_resource_url
11
+ end
12
+ include Actions
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ module BTech
2
+ module Rest
3
+ module ClassMethods
4
+ # Allows an object to belong to a parent object, thus creating a nested hierarchy. This behaves in a similar
5
+ # fashion to the belongs_to ActiveRecord macro. Accepts the following parameters:
6
+ # * *parent* - The parent symbol (including namespaces delimited by underscores). Be sure to reflect singular or plural forms on the name. Example: Public::PostsController, Result: :public_posts
7
+ def belongs_to parent
8
+ @parent_resource = parent.to_s
9
+ class_eval "class << self; attr_accessor :parent_resource end"
10
+ end
11
+
12
+ # Allows one to specify the various options for a resource. The following options are accepted:
13
+ # * *parent_key* - The ID key of the parent resource (for nested resources only). Defaults to: <belongs_to name>_id
14
+ # * *parent_value* - The ID value of the parent resource (for nested resources only). Defaults to the record id.
15
+ # * *parent_resource_method* - The instance method to call for acquiring child resource(s) of the parent (for nested resources only). Example: A post with many comments would be post.comments. Defaults to child resource name.
16
+ # * *name* - The resource name. Defaults to the controller name.
17
+ # * *label* - The resource label. Defaults to the controller name with capitalization.
18
+ # * *controller* - The controller class. Defaults to the current class. You should not need to change this.
19
+ # * *model* - The model class. Defaults to a model of the same name as the controller (minus namespace, suffix, and pluralization of course).
20
+ # * *record* - The record (new or found) related to the resource.
21
+ # * *namespaces* - The namespaces (if any) for routing. Defaults to whatever namespace your controller is using.
22
+ # * *show_partial* - The show partial. Defaults to "/<namspace(s)>/<controller name>/_show".
23
+ # * *new_or_edit_partial* - The new or edit partial. Defaults to "/<namspace(s)>/<controller name>/_new_or_edit".
24
+ def resource_options options = {}
25
+ @resource_options = options
26
+ class_eval "class << self; attr_reader :resource_options end"
27
+ end
28
+
29
+ # Allows one to disable any number of default actions. Accepts the following parameters:
30
+ # * *actions* - A variable list of REST action symbols you wish to disable. You may use any of the following: index, show, new, create, edit, update, and/or destroy.
31
+ def disabled_actions *actions
32
+ actions.uniq!
33
+ actions.each {|action| undef_method(action)}
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,78 @@
1
+ module ResourceHelper
2
+ # Displays breadcrumb navigation based on an array of hashes. Each resource
3
+ # hash is expected to have the following keys:
4
+ # * *id* - The resource ID (a.k.a the model ID).
5
+ # * *label* - The link label for display, otherwise the name is used instead.
6
+ # * *name* - The name of the resource (a.k.a. the controller). Also used as the link lable unless a label has been given.
7
+ # An optional hash of key/values can be supplied, here is what is allowed:
8
+ # * *separator* - The breadcrumb separator link, defaults to: '>'
9
+ def resource_breadcrumbs resources = [], options = {}
10
+ # Set defaults.
11
+ breadcrumbs = []
12
+ options.reverse_merge! :separator => "&raquo;"
13
+ # Process resources.
14
+ if resources.size > 0
15
+ url = '/' + resources.first[:namespaces].join('/')
16
+ parent_id = nil
17
+ resources.each do |resource|
18
+ url = [url, parent_id, resource[:name].pluralize].compact.join('/')
19
+ parent_id = resource[:parent_id]
20
+ breadcrumbs << link_to(resource[:label], url)
21
+ end
22
+ end
23
+ content_for :breadcrumbs, content_tag(:div, :id => "breadcrumbs") {breadcrumbs.compact.join(" #{options[:separator]} ")}
24
+ end
25
+
26
+ # Builds the submit path for a new or edit form based on current controller action. This assumes
27
+ # that the new/create and edit/update forms are always submitted to the same URL. Accepts the following parameters:
28
+ # * *resources* - The array of resource hashes.
29
+ # * *html_options* - The html options for a form (same as form_for[http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for] html options).
30
+ def build_resource_form_submit resources = [], html_options = {}
31
+ case params[:action]
32
+ # New/create flow.
33
+ when "new" then return :url => build_resource_url(resources, :create), :html => html_options
34
+ # Validate/create flow.
35
+ when "create" then return :url => build_resource_url(resources, :create), :html => html_options
36
+ # Edit/update flow.
37
+ when "edit" then return :url => build_resource_url(resources, :update), :html => html_options.merge({:method => :put})
38
+ # Validate/update flow.
39
+ when "update" then return :url => build_resource_url(resources, :update), :html => html_options.merge({:method => :put})
40
+ end
41
+ end
42
+
43
+ # Builds a more descriptive label based on the current controller action. Accepts the following parameters:
44
+ # * *label* - The action label.
45
+ def build_action_label label
46
+ [params[:action].capitalize, label.singularize].compact.join ' '
47
+ end
48
+
49
+ # Shows an unobtrusive jQuery link where the UJS event is attached to the link via the "destroy" class.
50
+ # If JavaScript is disabled then the _show_ action will be called instead of the _destroy_ action. Accepts
51
+ # the following hash arguments:
52
+ # * *parent_id* - The ID of the parent element for which the link is a child of. Example: post_1. *NOTE:* The parent ID take precidence over the link ID if defined.
53
+ # * *id* - The link ID. Example: post_1_link. *NOTE:* The link ID _must_ include the parent ID.
54
+ # * *label* - The link label. Defaults to "Delete".
55
+ # * *url* - The REST destroy URL. Example: /posts/1. *NOTE:* The proper HTTP POST request will be handled by the JavaScript.
56
+ def show_destroy_link options = {}
57
+ options.reverse_merge! :label => "Delete", :class => "destroy"
58
+ options[:id] = options[:parent_id] + "_link" if options[:parent_id]
59
+ content_tag :a, options[:label], :href => options[:url], :id => options[:id], :class => options[:class]
60
+ end
61
+
62
+ # Shows an unobtrusive jQuery link based on an array of resource hashes. See the show_destroy_link above
63
+ # for further details. Accepts the following arguments:
64
+ # * *resources* - The array of resource hashes.
65
+ def show_destroy_resource_link resources
66
+ show_destroy_link :parent_id => resources.last[:parent_id], :url => build_resource_url(resources, :destroy)
67
+ end
68
+
69
+ # Shows edit and delete links for resources. *NOTE*: Normally the record being edited is not known when
70
+ # resources are first assembled. Make sure to add the record to the last resource prior to calling this
71
+ # method for correct results. Accepts the following parameters:
72
+ # * *resources* - The array of resource hashes.
73
+ def show_edit_and_destroy_resource_links resources
74
+ html = link_to "Edit", build_resource_url(resources, :edit)
75
+ html += " | "
76
+ html += show_destroy_resource_link resources
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class Btech::RestTest < Test::Unit::TestCase
4
+ should "execute some intelligent tests" do
5
+ flunk "yo, there are no tests here, WTF!?!"
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'btech_rest'
8
+
9
+ class Test::Unit::TestCase
10
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aeonscope-btech_rest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Brooke Kuhlmann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-05 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mislav-will_paginate
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.7
24
+ version:
25
+ description:
26
+ email: aeonscope@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ - LICENSE.rdoc
34
+ files:
35
+ - CHANGELOG.rdoc
36
+ - LICENSE.rdoc
37
+ - README.rdoc
38
+ - VERSION.yml
39
+ - lib/actions.rb
40
+ - lib/btech_rest.rb
41
+ - lib/class_methods.rb
42
+ - lib/resource_helper.rb
43
+ - test/btech_rest_test.rb
44
+ - test/test_helper.rb
45
+ has_rdoc: true
46
+ homepage: http://github.com/aeonscope/btech-rest
47
+ post_install_message:
48
+ rdoc_options:
49
+ - CHANGELOG.rdoc
50
+ - --inline-source
51
+ - --charset=UTF-8
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: 1.8.6
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.2.0
70
+ signing_key:
71
+ specification_version: 2
72
+ summary: Easily adhere to DRY principals and add default REST functionality to your controllers.
73
+ test_files: []
74
+