golden_retriever 0.0.1

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