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 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