golden_retriever 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/.gitignore +1 -0
- data/README +32 -0
- data/Rakefile +50 -0
- data/lib/golden_retriever.rb +45 -0
- data/test/nested_restful_controller_test.rb +61 -0
- data/test/restful_controller_test.rb +53 -0
- data/test/teststrap.rb +53 -0
- metadata +82 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.*.swp
|
data/README
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Golden Retriever automatically retrieves resources from the database for
|
2
|
+
actions/controllers that follow rest conventions.
|
3
|
+
|
4
|
+
Instructions:
|
5
|
+
|
6
|
+
script/plugin git://github.com/DouglasMeyer/golden_retriever.git
|
7
|
+
And add "require GoldenRetriever" to the controllers for which you want your
|
8
|
+
resources automatically retrieved.
|
9
|
+
|
10
|
+
Example:
|
11
|
+
|
12
|
+
ActionController::Routing::Routes.draw do |map|
|
13
|
+
map.resources :users, :has_many => :posts
|
14
|
+
end
|
15
|
+
|
16
|
+
class PostsController < ApplicationController
|
17
|
+
require GoldenRetriever
|
18
|
+
# In this controller, you'll have access to @user, which is
|
19
|
+
# the same as: User.find(params[:user_id])
|
20
|
+
def index
|
21
|
+
# @posts will be the same as @user.posts
|
22
|
+
render :json => @posts
|
23
|
+
end
|
24
|
+
def show
|
25
|
+
# @post will be the same as @user.posts.find(params[:id])
|
26
|
+
render :json => @post
|
27
|
+
end
|
28
|
+
def new
|
29
|
+
# @post will be the same as @user.posts.build
|
30
|
+
render :json => @post
|
31
|
+
end
|
32
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "golden_retriever"
|
8
|
+
gem.summary = %Q{Retriever fetches your resources for you.}
|
9
|
+
gem.description = %Q{ Restful controllers will have their resources automatically loaded for them.}
|
10
|
+
gem.email = "DouglasYMan@Yahoo.com"
|
11
|
+
gem.homepage = "http://github.com/DouglasMeyer/golden_retriever"
|
12
|
+
gem.authors = ["DouglasMeyer"]
|
13
|
+
gem.add_development_dependency "riot", ">= 0"
|
14
|
+
gem.add_development_dependency "active_support", ">= 2.3.0"
|
15
|
+
# gem.add_development_dependency "yard", ">= 0"
|
16
|
+
end
|
17
|
+
Jeweler::GemcutterTasks.new
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'rake/testtask'
|
23
|
+
#Rake::TestTask.new(:test_non_rails) do |test|
|
24
|
+
# test.libs << 'lib' << 'test'
|
25
|
+
# test.test_files = FileList['test/**/*_test.rb'].exclude("test/rails/**/*_test.rb")
|
26
|
+
# test.verbose = true
|
27
|
+
#end
|
28
|
+
#
|
29
|
+
#Rake::TestTask.new(:test_rails) do |test|
|
30
|
+
# test.libs << 'lib' << 'test'
|
31
|
+
# test.test_files = FileList["test/rails/**/*_test.rb"]
|
32
|
+
# test.verbose = true
|
33
|
+
#end
|
34
|
+
#
|
35
|
+
#task :test => [:check_dependencies, :test_non_rails, :test_rails]
|
36
|
+
Rake::TestTask.new(:test) do |test|
|
37
|
+
test.libs << 'lib' << 'test'
|
38
|
+
test.test_files = FileList['test/**/*_test.rb']
|
39
|
+
test.verbose = true
|
40
|
+
end
|
41
|
+
task :default => :test
|
42
|
+
|
43
|
+
#begin
|
44
|
+
# require 'yard'
|
45
|
+
# YARD::Rake::YardocTask.new
|
46
|
+
#rescue LoadError
|
47
|
+
# task :yardoc do
|
48
|
+
# abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
49
|
+
# end
|
50
|
+
#end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module GoldenRetriever
|
2
|
+
|
3
|
+
def self.included(controller)
|
4
|
+
controller.before_filter :load_resource
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
def load_resource
|
9
|
+
resource_keys = ActionController::Routing::Routes.routes_by_controller[controller_name][action_name][params.keys][0][0].segment_keys.map(&:to_s).grep(/id$/)
|
10
|
+
|
11
|
+
parent = nil
|
12
|
+
resource_keys.each do |key|
|
13
|
+
singular_name = key.match(/^(.*)_id$/).try(:[], 1) || controller_name.singularize
|
14
|
+
object = if parent
|
15
|
+
parent.send(singular_name.pluralize)
|
16
|
+
else
|
17
|
+
singular_name.camelize.constantize
|
18
|
+
end.find params[key]
|
19
|
+
instance_variable_set("@#{singular_name}", object)
|
20
|
+
parent = object
|
21
|
+
end
|
22
|
+
|
23
|
+
if resource_keys.last != 'id'
|
24
|
+
singular_name = controller_name.singularize
|
25
|
+
objects = if parent
|
26
|
+
parent.send(singular_name.pluralize)
|
27
|
+
else
|
28
|
+
singular_name.camelize.constantize.all
|
29
|
+
end
|
30
|
+
instance_variable_set("@#{controller_name}", objects)
|
31
|
+
end
|
32
|
+
|
33
|
+
if %w(new create).include? action_name
|
34
|
+
singular_name = controller_name.singularize
|
35
|
+
objects = if parent
|
36
|
+
parent.send(singular_name.pluralize).build
|
37
|
+
else
|
38
|
+
singular_name.camelize.constantize.new
|
39
|
+
end
|
40
|
+
instance_variable_set("@#{singular_name}", objects)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
class FakeParent
|
4
|
+
def self.find(id)
|
5
|
+
new if id == :fake_parent_id
|
6
|
+
end
|
7
|
+
def fake_posts
|
8
|
+
fake_post = 'fake_posts'
|
9
|
+
class << fake_post
|
10
|
+
def build
|
11
|
+
:build_fake_posts
|
12
|
+
end
|
13
|
+
end
|
14
|
+
fake_post
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "Nested Restful Controller" do
|
19
|
+
setup do
|
20
|
+
class FakePostsController
|
21
|
+
def self.action_name=(name)
|
22
|
+
@@params = HashWithIndifferentAccess.new
|
23
|
+
@@params[:fake_parent_id] = :fake_parent_id
|
24
|
+
@@params[:id] = :fake_post_id if name == 'show'
|
25
|
+
ActionController::Routing::Routes.action_and_params(name, @@params)
|
26
|
+
@@action_name = name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
FakePostsController
|
30
|
+
end
|
31
|
+
|
32
|
+
should "set @fake_parent to FakeParent.find params[:fake_parent_id]" do
|
33
|
+
topic.action_name = 'index'
|
34
|
+
topic.new.tap{|c|
|
35
|
+
c.send :load_resource
|
36
|
+
}.instance_variable_get('@fake_parent').kind_of? FakeParent
|
37
|
+
end
|
38
|
+
|
39
|
+
context "for a collection request" do
|
40
|
+
setup do
|
41
|
+
topic.action_name = 'index'
|
42
|
+
topic.new.tap{|c| c.send :load_resource }
|
43
|
+
end
|
44
|
+
|
45
|
+
should "set @fake_posts to be @fake_parent.fake_posts" do
|
46
|
+
topic.instance_variable_get('@fake_posts')
|
47
|
+
end.equals('fake_posts')
|
48
|
+
end
|
49
|
+
|
50
|
+
context "for a request to :new" do
|
51
|
+
setup do
|
52
|
+
topic.action_name = 'new'
|
53
|
+
topic.new.tap{|c| c.send :load_resource }
|
54
|
+
end
|
55
|
+
|
56
|
+
should "set @fake_post to be @fake_parent.fake_posts.build" do
|
57
|
+
topic.instance_variable_get('@fake_post')
|
58
|
+
end.equals(:build_fake_posts)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'teststrap'
|
2
|
+
|
3
|
+
context "Restful Controller" do
|
4
|
+
setup do
|
5
|
+
class FakePostsController
|
6
|
+
def self.action_name=(name)
|
7
|
+
@@params = HashWithIndifferentAccess.new
|
8
|
+
@@params[:id] = :fake_post_id if name == 'show'
|
9
|
+
ActionController::Routing::Routes.action_and_params(name, @@params)
|
10
|
+
@@action_name = name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
FakePostsController
|
14
|
+
end
|
15
|
+
|
16
|
+
should "add before_filter :load_resource" do
|
17
|
+
topic.before_filter
|
18
|
+
end.equals(:load_resource)
|
19
|
+
|
20
|
+
context "for a collection request" do
|
21
|
+
setup do
|
22
|
+
topic.action_name = 'index'
|
23
|
+
topic.new.tap{|c|
|
24
|
+
c.send :load_resource
|
25
|
+
}.instance_variable_get('@fake_posts')
|
26
|
+
end
|
27
|
+
should "set @fake_posts to FakePost.all" do
|
28
|
+
topic
|
29
|
+
end.equals(:all)
|
30
|
+
end
|
31
|
+
|
32
|
+
context "for a member request" do
|
33
|
+
setup do
|
34
|
+
topic.action_name = 'show'
|
35
|
+
topic.new.tap{|c| c.send :load_resource }
|
36
|
+
end
|
37
|
+
should "set @fake_post to FakePost.find params[:id]" do
|
38
|
+
FakePost.find_id == :fake_post_id and
|
39
|
+
topic.instance_variable_get('@fake_post')
|
40
|
+
end.equals(:find)
|
41
|
+
end
|
42
|
+
|
43
|
+
context "for a :new request" do
|
44
|
+
setup do
|
45
|
+
topic.action_name = 'new'
|
46
|
+
topic.new.tap{|c| c.send :load_resource }
|
47
|
+
end
|
48
|
+
should "set @fake_post to FakePost.new" do
|
49
|
+
topic.instance_variable_get('@fake_post')
|
50
|
+
end.equals(:new)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/test/teststrap.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'riot'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
require 'active_support'
|
6
|
+
|
7
|
+
require 'golden_retriever'
|
8
|
+
|
9
|
+
# -=-=- "fixtures"/helpers
|
10
|
+
module ActionController
|
11
|
+
module Routing
|
12
|
+
class Routes
|
13
|
+
def self.action_and_params(name, params)
|
14
|
+
@@routes_by_controller ||= { 'fake_posts' => {}}
|
15
|
+
@@routes_by_controller['fake_posts'][name] = {
|
16
|
+
params.keys => [[ OpenStruct.new(:segment_keys => params.keys) ]]
|
17
|
+
}
|
18
|
+
end
|
19
|
+
def self.routes_by_controller
|
20
|
+
@@routes_by_controller
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class FakePost
|
27
|
+
class << self
|
28
|
+
def find_id
|
29
|
+
@@id
|
30
|
+
end
|
31
|
+
end
|
32
|
+
def self.all; :all; end
|
33
|
+
def self.find(id)
|
34
|
+
@@id = id
|
35
|
+
:find
|
36
|
+
end
|
37
|
+
def self.new; :new; end
|
38
|
+
end
|
39
|
+
|
40
|
+
class FakePostsController
|
41
|
+
def self.before_filter(name=nil)
|
42
|
+
@@before_filter = name if name
|
43
|
+
@@before_filter
|
44
|
+
end
|
45
|
+
def controller_name; 'fake_posts'; end
|
46
|
+
def self.action_name; @@action_name; end
|
47
|
+
def action_name
|
48
|
+
self.class.action_name
|
49
|
+
end
|
50
|
+
def params; @@params; end
|
51
|
+
include GoldenRetriever
|
52
|
+
end
|
53
|
+
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: golden_retriever
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- DouglasMeyer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-25 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: riot
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: active_support
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.3.0
|
34
|
+
version:
|
35
|
+
description: " Restful controllers will have their resources automatically loaded for them."
|
36
|
+
email: DouglasYMan@Yahoo.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- README
|
46
|
+
- Rakefile
|
47
|
+
- lib/golden_retriever.rb
|
48
|
+
- test/nested_restful_controller_test.rb
|
49
|
+
- test/restful_controller_test.rb
|
50
|
+
- test/teststrap.rb
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://github.com/DouglasMeyer/golden_retriever
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options:
|
57
|
+
- --charset=UTF-8
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: "0"
|
71
|
+
version:
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.3.5
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: Retriever fetches your resources for you.
|
79
|
+
test_files:
|
80
|
+
- test/teststrap.rb
|
81
|
+
- test/nested_restful_controller_test.rb
|
82
|
+
- test/restful_controller_test.rb
|