orm_adapter_activeresource 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ ENV['RAILS_ENV'] = 'test'
3
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../../../Gemfile', __FILE__)
4
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
5
+ require 'rails/all'
6
+ Bundler.require(:default, Rails.env) if defined?(Bundler)
7
+
8
+ class Rails::Application::Configuration
9
+ def database_configuration
10
+ {'test' => {'adapter' => 'sqlite3', 'database' => '/tmp/orm_adapter_test.sqlite'}}
11
+ end
12
+ end
13
+
14
+ ActiveSupport.on_load(:before_initialize) do
15
+ ActiveRecord::Migration.suppress_messages do
16
+ ActiveRecord::Schema.define(:version => 0) do
17
+ create_table(:users, :force => true) {|t| t.string :name; t.integer :rating; }
18
+ create_table(:notes, :force => true) {|t| t.belongs_to :owner, :polymorphic => true }
19
+ end
20
+ end
21
+ end
22
+
23
+ module ActiveResourceServer
24
+ class Application < Rails::Application
25
+ config.active_support.deprecation = :log
26
+ config.secret_token = ActiveSupport::SecureRandom.hex(30)
27
+ config.logger = Logger.new ::Rails.root.to_s + "/server.log"
28
+
29
+ initializer 'routes' do |app|
30
+ app.routes.draw do
31
+ resources :users
32
+ resources :notes
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ require File.expand_path('../models', __FILE__)
39
+ require File.expand_path('../controllers', __FILE__)
40
+
41
+ ActiveResourceServer::Application.initialize!
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'orm_adapter/example_app_shared'
3
+
4
+ module ActiveResourceOrmSpec
5
+ class User < ActiveResource::Base
6
+ self.site = "http://localhost:31777/"
7
+ schema do
8
+ string 'name'
9
+ integer 'rating'
10
+ end
11
+ def notes; Note.find(:all, :params => {:owner_id => id}) || []; end
12
+ end
13
+
14
+ class Note < ActiveResource::Base
15
+ self.site = "http://localhost:31777/"
16
+ schema do
17
+ integer 'owner_id'
18
+ end
19
+ def owner; User.find(owner_id); end
20
+ end
21
+
22
+ # here be the specs!
23
+ describe OrmAdapter::ActiveResource do
24
+ before(:all) do
25
+ @server_pid = fork do
26
+ begin
27
+ server_dir = File.expand_path(__FILE__ + '/../activeresource_server')
28
+ server_log = server_dir + '/server.log'
29
+ FileUtils.rm(server_log) rescue nil
30
+ $stdout.reopen('/dev/null', 'w')
31
+ $stderr.reopen('/dev/null', 'w')
32
+ exec('bundle exec rackup -p 31777 ' + server_dir + '/config.ru > ' + server_log + ' 2>&1')
33
+ rescue => e
34
+ puts e.inspect
35
+ end
36
+ end
37
+ sleep 5
38
+ end
39
+ after(:all) do
40
+ Process.kill "KILL", @server_pid
41
+ Process.waitpid @server_pid
42
+ Process.kill "KILL", (@server_pid + 1)
43
+ end
44
+
45
+ before do
46
+ User.find(:all).each {|u| u.destroy }
47
+ Note.find(:all).each {|n| n.destroy }
48
+ end
49
+
50
+ describe "the OrmAdapter class" do
51
+ subject { ActiveResource::Base::OrmAdapter }
52
+
53
+ specify "#model_classes should return all model classes" do
54
+ subject.model_classes.should include(User, Note)
55
+ end
56
+ end
57
+
58
+ it_should_behave_like "example app with orm_adapter" do
59
+ let(:user_class) { User }
60
+ let(:note_class) { Note }
61
+
62
+ def create_model(klass, attrs = {})
63
+ klass.create(attrs)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe OrmAdapter::Base do
4
+ subject { OrmAdapter::Base.new(Object) }
5
+
6
+ describe "#extract_conditions_and_order!" do
7
+ let(:conditions) { {:foo => 'bar'} }
8
+ let(:order) { [[:foo, :asc]] }
9
+
10
+ it "(<conditions>) should return [<conditions>, []]" do
11
+ subject.send(:extract_conditions_and_order!, conditions).should == [conditions, []]
12
+ end
13
+
14
+ it "(:conditions => <conditions>) should return [<conditions>, []]" do
15
+ subject.send(:extract_conditions_and_order!, :conditions => conditions).should == [conditions, []]
16
+ end
17
+
18
+ it "(:order => <order>) should return [{}, <order>]" do
19
+ subject.send(:extract_conditions_and_order!, :order => order).should == [{}, order]
20
+ end
21
+
22
+ it "(:conditions => <conditions>, :order => <order>) should return [<conditions>, <order>]" do
23
+ subject.send(:extract_conditions_and_order!, :conditions => conditions, :order => order).should == [conditions, order]
24
+ end
25
+
26
+ describe "#normalize_order" do
27
+ specify "(nil) returns []" do
28
+ subject.send(:normalize_order, nil).should == []
29
+ end
30
+
31
+ specify ":foo returns [[:foo, :asc]]" do
32
+ subject.send(:normalize_order, :foo).should == [[:foo, :asc]]
33
+ end
34
+
35
+ specify "[:foo] returns [[:foo, :asc]]" do
36
+ subject.send(:normalize_order, [:foo]).should == [[:foo, :asc]]
37
+ end
38
+
39
+ specify "[:foo, :desc] returns [[:foo, :desc]]" do
40
+ subject.send(:normalize_order, [:foo, :desc]).should == [[:foo, :desc]]
41
+ end
42
+
43
+ specify "[:foo, [:bar, :asc], [:baz, :desc], :bing] returns [[:foo, :asc], [:bar, :asc], [:baz, :desc], [:bing, :asc]]" do
44
+ subject.send(:normalize_order, [:foo, [:bar, :asc], [:baz, :desc], :bing]).should == [[:foo, :asc], [:bar, :asc], [:baz, :desc], [:bing, :asc]]
45
+ end
46
+
47
+ specify "[[:foo, :wtf]] raises ArgumentError" do
48
+ lambda { subject.send(:normalize_order, [[:foo, :wtf]]) }.should raise_error(ArgumentError)
49
+ end
50
+
51
+ specify "[[:foo, :asc, :desc]] raises ArgumentError" do
52
+ lambda { subject.send(:normalize_order, [[:foo, :asc, :desc]]) }.should raise_error(ArgumentError)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,183 @@
1
+ # to test your new orm_adapter, make an example app that matches the functionality
2
+ # found in the existing specs for example, look at spec/orm_adapter/adapters/active_record_spec.rb
3
+ #
4
+ # Then you can execute this shared spec as follows:
5
+ #
6
+ # it_should_behave_like "execute app with orm_adapter" do
7
+ # let(:user_class) { User }
8
+ # let(:note_class) { Note }
9
+ #
10
+ # # optionaly define the following functions if the ORM does not support
11
+ # # this syntax - this should NOT use the orm_adapter, because we're testing that
12
+ # def create_model(klass, attrs = {})
13
+ # klass.create!(attrs)
14
+ # end
15
+ #
16
+ # def reload_model(model)
17
+ # model.class.find(model.id)
18
+ # end
19
+ # end
20
+ #
21
+ shared_examples_for "example app with orm_adapter" do
22
+
23
+ def create_model(klass, attrs = {})
24
+ klass.create!(attrs)
25
+ end
26
+
27
+ def reload_model(model)
28
+ model.class.find(model.id)
29
+ end
30
+
31
+ describe "an ORM class" do
32
+ subject { note_class }
33
+
34
+ it "#to_adapter should return an adapter instance" do
35
+ subject.to_adapter.should be_a(OrmAdapter::Base)
36
+ end
37
+
38
+ it "#to_adapter should return an adapter for the receiver" do
39
+ subject.to_adapter.klass.should == subject
40
+ end
41
+
42
+ it "#to_adapter should be cached" do
43
+ subject.to_adapter.object_id.should == subject.to_adapter.object_id
44
+ end
45
+ end
46
+
47
+ describe "adapter instance" do
48
+ let(:note_adapter) { note_class.to_adapter }
49
+ let(:user_adapter) { user_class.to_adapter }
50
+
51
+ describe "#get!(id)" do
52
+ it "should return the instance with id if it exists" do
53
+ user = create_model(user_class)
54
+ user_adapter.get!(user.id).should == user
55
+ end
56
+
57
+ it "should allow to_key like arguments" do
58
+ user = create_model(user_class)
59
+ user_adapter.get!(user.to_key).should == user
60
+ end
61
+
62
+ it "should raise an error if there is no instance with that id" do
63
+ lambda { user_adapter.get!("non-exitent id") }.should raise_error
64
+ end
65
+ end
66
+
67
+ describe "#get(id)" do
68
+ it "should return the instance with id if it exists" do
69
+ user = create_model(user_class)
70
+ user_adapter.get(user.id).should == user
71
+ end
72
+
73
+ it "should allow to_key like arguments" do
74
+ user = create_model(user_class)
75
+ user_adapter.get(user.to_key).should == user
76
+ end
77
+
78
+ it "should return nil if there is no instance with that id" do
79
+ user_adapter.get("non-exitent id").should be_nil
80
+ end
81
+ end
82
+
83
+ describe "#find_first" do
84
+ describe "(conditions)" do
85
+ it "should return first model matching conditions, if it exists" do
86
+ user = create_model(user_class, :name => "Fred")
87
+ user_adapter.find_first(:name => "Fred").should == user
88
+ end
89
+
90
+ it "should return nil if no conditions match" do
91
+ user_adapter.find_first(:name => "Betty").should == nil
92
+ end
93
+
94
+ it "when conditions contain associated object, should return first model if it exists" do
95
+ user = create_model(user_class)
96
+ user2 = create_model(user_class)
97
+ note = create_model(note_class, :owner => user2)
98
+ note2 = create_model(note_class, :owner => user)
99
+ note_adapter.find_first(:owner => user).should == note2
100
+ end
101
+ end
102
+
103
+ describe "(:order => <order array>)" do
104
+ it "should return first model in specified order" do
105
+ user1 = create_model(user_class, :name => "Fred", :rating => 1)
106
+ user2 = create_model(user_class, :name => "Fred", :rating => 2)
107
+ user_adapter.find_first(:order => [:name, [:rating, :desc]]).should == user2
108
+ end
109
+ end
110
+
111
+ describe "(:conditions => <conditions hash>, :order => <order array>)" do
112
+ it "should return first model matching conditions, in specified order" do
113
+ user1 = create_model(user_class, :name => "Fred", :rating => 1)
114
+ user2 = create_model(user_class, :name => "Fred", :rating => 2)
115
+ user_adapter.find_first(:conditions => {:name => "Fred"}, :order => [:rating, :desc]).should == user2
116
+ end
117
+ end
118
+ end
119
+
120
+ describe "#find_all" do
121
+ describe "(conditions)" do
122
+ it "should return only models matching conditions" do
123
+ user1 = create_model(user_class, :name => "Fred")
124
+ user2 = create_model(user_class, :name => "Fred")
125
+ user3 = create_model(user_class, :name => "Betty")
126
+ user_adapter.find_all(:name => "Fred").should == [user1, user2]
127
+ end
128
+
129
+ it "should return empty array if no conditions match" do
130
+ user_adapter.find_all(:name => "Fred").should == []
131
+ end
132
+
133
+ it "when conditions contain associated object, should return first model if it exists" do
134
+ user1, user2 = create_model(user_class), create_model(user_class)
135
+ note1 = create_model(note_class, :owner => user1)
136
+ note2 = create_model(note_class, :owner => user2)
137
+ note_adapter.find_all(:owner => user2).should == [note2]
138
+ end
139
+ end
140
+
141
+ describe "(:order => <order array>)" do
142
+ it "should return all models in specified order" do
143
+ user1 = create_model(user_class, :name => "Fred", :rating => 1)
144
+ user2 = create_model(user_class, :name => "Fred", :rating => 2)
145
+ user3 = create_model(user_class, :name => "Betty", :rating => 1)
146
+ user_adapter.find_all(:order => [:name, [:rating, :desc]]).should == [user3, user2, user1]
147
+ end
148
+ end
149
+
150
+ describe "(:conditions => <conditions hash>, :order => <order array>)" do
151
+ it "should return only models matching conditions, in specified order" do
152
+ user1 = create_model(user_class, :name => "Fred", :rating => 1)
153
+ user2 = create_model(user_class, :name => "Fred", :rating => 2)
154
+ user3 = create_model(user_class, :name => "Betty", :rating => 1)
155
+ user_adapter.find_all(:conditions => {:name => "Fred"}, :order => [:rating, :desc]).should == [user2, user1]
156
+ end
157
+ end
158
+ end
159
+
160
+ describe "#create!(attributes)" do
161
+ it "should create a model with the passed attributes" do
162
+ user = user_adapter.create!(:name => "Fred")
163
+ reload_model(user).name.should == "Fred"
164
+ end
165
+
166
+ it "should raise error when create fails" do
167
+ lambda { user_adapter.create!(:user => create_model(note_class)) }.should raise_error
168
+ end
169
+
170
+ it "when attributes contain an associated object, should create a model with the attributes" do
171
+ user = create_model(user_class)
172
+ note = note_adapter.create!(:owner => user)
173
+ reload_model(note).owner.should == user
174
+ end
175
+
176
+ it "when attributes contain an has_many assoc, should create a model with the attributes" do
177
+ notes = [create_model(note_class), create_model(note_class)]
178
+ user = user_adapter.create!(:notes => notes)
179
+ reload_model(user).notes.should == notes
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe OrmAdapter do
4
+ subject { OrmAdapter }
5
+
6
+ describe "when a new adapter is created (by inheriting form OrmAdapter::Base)" do
7
+ let!(:adapter) { Class.new(OrmAdapter::Base) }
8
+
9
+ its(:adapters) { should include(adapter) }
10
+
11
+ describe "and the adapter has a model class" do
12
+ let(:model) { Class.new }
13
+
14
+ before { adapter.stub!(:model_classes).and_return([model]) }
15
+
16
+ its(:model_classes) { should include(model) }
17
+ end
18
+
19
+ after { OrmAdapter.adapters.delete(adapter) }
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'rspec'
3
+
4
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
5
+
6
+ require 'orm_adapter_activeresource'
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: orm_adapter_activeresource
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lukas Fittl
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-07 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: orm_adapter
16
+ requirement: &2153624600 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.7
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2153624600
25
+ description: Extends orm_adapter with support for ActiveResource
26
+ email: lukas@fittl.com
27
+ executables: []
28
+ extensions: []
29
+ extra_rdoc_files: []
30
+ files:
31
+ - .gitignore
32
+ - Gemfile
33
+ - Rakefile
34
+ - lib/orm_adapter/adapters/activeresource.rb
35
+ - lib/orm_adapter_activeresource.rb
36
+ - orm_adapter_activeresource.gemspec
37
+ - spec/orm_adapter/adapters/activeresource_server/config.ru
38
+ - spec/orm_adapter/adapters/activeresource_server/controllers.rb
39
+ - spec/orm_adapter/adapters/activeresource_server/models.rb
40
+ - spec/orm_adapter/adapters/activeresource_server/server.log
41
+ - spec/orm_adapter/adapters/activeresource_server/server.rb
42
+ - spec/orm_adapter/adapters/activeresource_spec.rb
43
+ - spec/orm_adapter/base_spec.rb
44
+ - spec/orm_adapter/example_app_shared.rb
45
+ - spec/orm_adapter_spec.rb
46
+ - spec/spec_helper.rb
47
+ homepage: http://github.com/lfittl/orm_adapter_activeresource
48
+ licenses: []
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: 1.3.6
65
+ requirements: []
66
+ rubyforge_project: orm_adapter_activeresource
67
+ rubygems_version: 1.8.15
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Extends the orm_adapter ORM abstraction layer with support for Rails' ActiveResource
71
+ REST-based ORM.
72
+ test_files:
73
+ - spec/orm_adapter/adapters/activeresource_server/config.ru
74
+ - spec/orm_adapter/adapters/activeresource_server/controllers.rb
75
+ - spec/orm_adapter/adapters/activeresource_server/models.rb
76
+ - spec/orm_adapter/adapters/activeresource_server/server.log
77
+ - spec/orm_adapter/adapters/activeresource_server/server.rb
78
+ - spec/orm_adapter/adapters/activeresource_spec.rb
79
+ - spec/orm_adapter/base_spec.rb
80
+ - spec/orm_adapter/example_app_shared.rb
81
+ - spec/orm_adapter_spec.rb
82
+ - spec/spec_helper.rb