aeonscope-btech_rest 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
+