remote_association 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *swp
2
- spec/config/database.yml
2
+ spec/config/database.yml
3
+ pkg/*
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+
6
+ before_script:
7
+ - "cp spec/config/database.example.yml spec/config/database.yml"
8
+ - "bundle exec rake spec:db:setup"
9
+
10
+ script: bundle exec rake spec
11
+
12
+ branches:
13
+ only:
14
+ - master
data/Gemfile CHANGED
@@ -3,4 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in remote_association.gemspec
4
4
  gemspec
5
5
 
6
- gem "debugger"
6
+ group :test do
7
+ gem "rake"
8
+ end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- remote_association (0.0.1)
4
+ remote_association (0.0.2)
5
5
  activerecord (~> 3.2)
6
6
  activeresource (~> 3.2)
7
7
  activesupport (~> 3.2)
@@ -25,20 +25,13 @@ GEM
25
25
  multi_json (~> 1.0)
26
26
  arel (3.0.2)
27
27
  builder (3.0.0)
28
- columnize (0.3.6)
29
28
  database_cleaner (0.8.0)
30
- debugger (1.2.0)
31
- columnize (>= 0.3.1)
32
- debugger-linecache (~> 1.1.1)
33
- debugger-ruby_core_source (~> 1.1.3)
34
- debugger-linecache (1.1.2)
35
- debugger-ruby_core_source (>= 1.1.1)
36
- debugger-ruby_core_source (1.1.3)
37
29
  diff-lcs (1.1.3)
38
30
  fakeweb (1.3.0)
39
31
  i18n (0.6.0)
40
32
  multi_json (1.3.6)
41
33
  pg (0.14.0)
34
+ rake (0.9.2.2)
42
35
  rspec (2.11.0)
43
36
  rspec-core (~> 2.11.0)
44
37
  rspec-expectations (~> 2.11.0)
@@ -54,8 +47,8 @@ PLATFORMS
54
47
 
55
48
  DEPENDENCIES
56
49
  database_cleaner (~> 0.8)
57
- debugger
58
50
  fakeweb
59
51
  pg (~> 0.14)
52
+ rake
60
53
  remote_association!
61
54
  rspec (~> 2.11)
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
+ [![Build Status](https://secure.travis-ci.org/denyago/remote_association.png?branch=master)](http://travis-ci.org/denyago/remote_association)
2
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/denyago/remote_association)
3
+
1
4
  # Remote Association
2
5
 
3
6
  Add ```has_``` and ```belongs_``` associations to models inherited from ActiveResource::Base
@@ -12,8 +12,6 @@ module ActiveRecord
12
12
  #
13
13
  # Author.scoped.includes_remote(:profile, :avatar)
14
14
  def includes_remote(*args)
15
- keys = self.uniq.pluck(:id)
16
-
17
15
  args.each do |r|
18
16
  settings = klass.activeresource_relations[r.to_sym]
19
17
  raise RemoteAssociation::SettingsNotFoundError, "Can't find settings for #{r} association" if settings.blank?
@@ -22,15 +20,42 @@ module ActiveRecord
22
20
  foregin_key = settings[:foreign_key]
23
21
  ar_class = settings[:class_name ].constantize
24
22
 
23
+ fetch_and_join_for_has_one_remote(ar_accessor, foregin_key, ar_class) if settings[:association_type] == :has_one_remote
24
+ fetch_and_join_for_belongs_to_remote(ar_accessor, foregin_key, ar_class) if settings[:association_type] == :belongs_to_remote
25
+ end
26
+
27
+ set_remote_resources_prefetched
28
+
29
+ self.all
30
+ end
31
+
32
+ private
33
+
34
+ def fetch_and_join_for_has_one_remote(ar_accessor, foregin_key, ar_class)
35
+ keys = self.uniq.pluck(:id)
36
+
25
37
  remote_objects = ar_class.find(:all, :params => { foregin_key => keys })
26
38
 
27
39
  self.each do |u|
28
40
  u.send("#{ar_accessor}=", remote_objects.select {|s| s.send(foregin_key) == u.id })
41
+ end
42
+ end
43
+
44
+ def fetch_and_join_for_belongs_to_remote(ar_accessor, foregin_key, ar_class)
45
+ keys = self.uniq.pluck(foregin_key.to_sym)
46
+
47
+ remote_objects = ar_class.find(:all, :params => { :id => keys })
48
+
49
+ self.each do |u|
50
+ u.send("#{ar_accessor}=", remote_objects.select {|s| u.send(foregin_key) == s.id })
51
+ end
52
+ end
53
+
54
+ def set_remote_resources_prefetched
55
+ self.each do |u|
29
56
  u.instance_variable_set(:@remote_resources_prefetched, true)
30
57
  end
31
58
  end
32
59
 
33
- self.all
34
- end
35
60
  end
36
61
  end
@@ -0,0 +1,67 @@
1
+ module RemoteAssociation
2
+ module BelongsToRemote
3
+ # Specifies a one-to-one association with another class. This method should only be used
4
+ # if this class contains the foreign key. If the other class contains the foreign key,
5
+ # then you should use +has_one_remote+ instead.
6
+ #
7
+ # Methods will be added for retrieval and query for a single associated object, for which
8
+ # this object holds an id:
9
+ #
10
+ # [association]
11
+ # Returns the associated object. +nil+ is returned if none is found.
12
+ # [association=(associate)]
13
+ # Just setter, no saves.
14
+ #
15
+ # (+association+ is replaced with the symbol passed as the first argument, so
16
+ # <tt>belongs_to_remote :author</tt> would add among others <tt>author.nil?</tt>.)
17
+ #
18
+ # === Example
19
+ #
20
+ # A Post class declares <tt>belongs_to_remote :author</tt>, which will add:
21
+ # * <tt>Post#author</tt> (similar to <tt>Author.find(:first, params: { id: [post.author_id]})</tt>)
22
+ # * <tt>Post#author=(author)</tt> (will set @author instance variable of Post# to author value)
23
+ # The declaration can also include an options hash to specialize the behavior of the association.
24
+ #
25
+ # === Options
26
+ #
27
+ # [:class_name]
28
+ # Specify the class name of the association. Use it only if that name can't be inferred
29
+ # from the association name. So <tt>belongs_to_remote :author</tt> will by default be linked to the Author class, but
30
+ # if the real class name is Person, you'll have to specify it with this option.
31
+ # [:foreign_key]
32
+ # Specify the foreign key used for the association. By default this is guessed to be the name
33
+ # of the association with an "_id" suffix. So a class that defines a <tt>belongs_to_remote :person</tt>
34
+ # association will use "person_id" as the default <tt>:foreign_key</tt>. Similarly,
35
+ # <tt>belongs_to_remote :favorite_person, :class_name => "Person"</tt> will use a foreign key
36
+ # of "favorite_person_id".
37
+ #
38
+ # Option examples:
39
+ # belongs_to :firm, :foreign_key => "client_of"
40
+ # belongs_to :author, :class_name => "Person", :foreign_key => "author_id"
41
+ def belongs_to_remote(remote_rel, options ={})
42
+ rel_options = {
43
+ class_name: remote_rel.to_s.classify,
44
+ foreign_key: remote_rel.to_s.foreign_key,
45
+ association_type: :belongs_to_remote
46
+ }.merge(options.symbolize_keys)
47
+
48
+ add_activeresource_relation(remote_rel.to_sym, rel_options)
49
+
50
+ class_eval <<-RUBY, __FILE__, __LINE__+1
51
+
52
+ attr_accessor :#{remote_rel}
53
+
54
+ def #{remote_rel}
55
+ if remote_resources_prefetched?
56
+ @#{remote_rel} ? @#{remote_rel}.first : nil
57
+ else
58
+ @#{remote_rel} ||= #{rel_options[:class_name]}.find(:first, params: { id: [self.#{rel_options[:foreign_key]}]})
59
+ end
60
+ end
61
+
62
+ RUBY
63
+
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,66 @@
1
+ module RemoteAssociation
2
+ module HasOneRemote
3
+ # Specifies a one-to-one association with another class. This method should only be used
4
+ # if this class is a kind of ActiveResource::Base and service for this resource can
5
+ # return some kind of foreign key.
6
+ #
7
+ # Methods will be added for retrieval and query for a single associated object, for which
8
+ # this object holds an id:
9
+ #
10
+ # [association()]
11
+ # Returns the associated object. +nil+ is returned if none is found.
12
+ # [association=(associate)]
13
+ # Just setter, no saves.
14
+ #
15
+ # (+association+ is replaced with the symbol passed as the first argument, so
16
+ # <tt>has_one_remote :author</tt> would add among others <tt>author.nil?</tt>.)
17
+ #
18
+ # === Example
19
+ #
20
+ # A Author class declares <tt>has_one_remote :profile</tt>, which will add:
21
+ # * <tt>Authort#profile</tt> (similar to <tt>Profile.find(:first, params: { author_id: [author.id]})</tt>)
22
+ # * <tt>Author#profile=(profile)</tt> (will set @profile instance variable of Author# to profile value)
23
+ # The declaration can also include an options hash to specialize the behavior of the association.
24
+ #
25
+ # === Options
26
+ #
27
+ # [:class_name]
28
+ # Specify the class name of the association. Use it only if that name can't be inferred
29
+ # from the association name. So <tt>has_one_remote :profile</tt> will by default be linked to the Profile class, but
30
+ # if the real class name is SocialProfile, you'll have to specify it with this option.
31
+ # [:foreign_key]
32
+ # Specify the foreign key used for searching association on remote service. By default this is guessed to be the name
33
+ # of the current class with an "_id" suffix. So a class Author that defines a <tt>has_one_remote :profile</tt>
34
+ # association will use "author_id" as the default <tt>:foreign_key</tt>.
35
+ # This key will be used in :get request. Example: <tt>GET http://example.com/profiles?author_id[]=1</tt>
36
+ #
37
+ # Option examples:
38
+ # has_one_remote :firm, :foreign_key => "client_of"
39
+ # has_one_remote :author, :class_name => "Person", :foreign_key => "author_id"
40
+ def has_one_remote(remote_rel, options ={})
41
+ rel_options = {
42
+ class_name: remote_rel.to_s.classify,
43
+ foreign_key: self.model_name.to_s.foreign_key,
44
+ association_type: :has_one_remote
45
+ }.merge(options.symbolize_keys)
46
+
47
+ add_activeresource_relation(remote_rel.to_sym, rel_options)
48
+
49
+ class_eval <<-RUBY, __FILE__, __LINE__+1
50
+
51
+ attr_accessor :#{remote_rel}
52
+
53
+ def #{remote_rel}
54
+ if remote_resources_prefetched?
55
+ @#{remote_rel} ? @#{remote_rel}.first : nil
56
+ else
57
+ @#{remote_rel} ||= #{rel_options[:class_name]}.find(:first, params: { #{rel_options[:foreign_key]}: [self.id]})
58
+ end
59
+ end
60
+
61
+ RUBY
62
+
63
+ end
64
+
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module RemoteAssociation
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -2,9 +2,12 @@ require "active_record"
2
2
  require "active_support"
3
3
 
4
4
  require "remote_association/version"
5
+ require "remote_association/has_one_remote"
6
+ require "remote_association/belongs_to_remote"
5
7
  require "remote_association/active_record/relation"
6
8
 
7
9
  module RemoteAssociation
10
+
8
11
  # Include this class to hav associations to ActiveResource models
9
12
  #
10
13
  # It will add methods to your class:
@@ -21,66 +24,8 @@ module RemoteAssociation
21
24
  end
22
25
 
23
26
  module ClassMethods
24
- # Specifies a one-to-one association with another class. This method should only be used
25
- # if this class is a kind of ActiveResource::Base and service for this resource can
26
- # return some kind of foreign key.
27
- #
28
- # Methods will be added for retrieval and query for a single associated object, for which
29
- # this object holds an id:
30
- #
31
- # [association()]
32
- # Returns the associated object. +nil+ is returned if none is found.
33
- # [association=(associate)]
34
- # Just setter, no saves.
35
- #
36
- # (+association+ is replaced with the symbol passed as the first argument, so
37
- # <tt>has_one_remote :author</tt> would add among others <tt>author.nil?</tt>.)
38
- #
39
- # === Example
40
- #
41
- # A Author class declares <tt>has_one_remote :profile</tt>, which will add:
42
- # * <tt>Authort#profile</tt> (similar to <tt>Profile.find(:first, params: { author_id: [author.id]})</tt>)
43
- # * <tt>Author#profile=(profile)</tt> (will set @profile instance variable of Author# to profile value)
44
- # The declaration can also include an options hash to specialize the behavior of the association.
45
- #
46
- # === Options
47
- #
48
- # [:class_name]
49
- # Specify the class name of the association. Use it only if that name can't be inferred
50
- # from the association name. So <tt>has_one_remote :profile</tt> will by default be linked to the Profile class, but
51
- # if the real class name is SocialProfile, you'll have to specify it with this option.
52
- # [:foreign_key]
53
- # Specify the foreign key used for searching association on remote service. By default this is guessed to be the name
54
- # of the current class with an "_id" suffix. So a class Author that defines a <tt>has_one_remote :profile</tt>
55
- # association will use "author_id" as the default <tt>:foreign_key</tt>.
56
- # This key will be used in :get request. Example: <tt>GET http://example.com/profiles?author_id[]=1</tt>
57
- #
58
- # Option examples:
59
- # has_one_remote :firm, :foreign_key => "client_of"
60
- # has_one_remote :author, :class_name => "Person", :foreign_key => "author_id"
61
- def has_one_remote(remote_rel, options ={})
62
- rel_options = {
63
- class_name: remote_rel.to_s.classify,
64
- foreign_key: self.model_name.to_s.foreign_key
65
- }.merge(options.symbolize_keys)
66
-
67
- add_activeresource_relation(remote_rel.to_sym, rel_options)
68
-
69
- class_eval <<-RUBY, __FILE__, __LINE__+1
70
-
71
- attr_accessor :#{remote_rel}
72
-
73
- def #{remote_rel}
74
- if remote_resources_prefetched?
75
- @#{remote_rel} ? @#{remote_rel}.first : nil
76
- else
77
- @#{remote_rel} ||= #{rel_options[:class_name]}.find(:first, params: { #{rel_options[:foreign_key]}: [self.id]})
78
- end
79
- end
80
-
81
- RUBY
82
-
83
- end
27
+ include RemoteAssociation::HasOneRemote
28
+ include RemoteAssociation::BelongsToRemote
84
29
 
85
30
  # Adds settings of relation to ActiveResource model.
86
31
  #
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe RemoteAssociation, "method :belongs_to_remote" do
4
+ before(:all) do
5
+ unset_const(:User)
6
+ class User < ActiveResource::Base
7
+ self.site = REMOTE_HOST
8
+ self.element_name = "user"
9
+ end
10
+ @body = [{user: {id: 1, name: "User A"}}].to_json
11
+ @full_body = [
12
+ {user: {id: 1, name: "User A"}},
13
+ {user: {id: 2, name: "User B"}}
14
+ ].to_json
15
+ end
16
+
17
+ before(:each) do
18
+ add_profile(1, 1, "letter A")
19
+ end
20
+
21
+ it "uses it's defaults" do
22
+ unset_const(:Profile)
23
+ class Profile < ActiveRecord::Base
24
+ include RemoteAssociation::Base
25
+ belongs_to_remote :user
26
+ end
27
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/users.json?id%5B%5D=1", body: @body )
28
+
29
+ Profile.first.user.name.should eq('User A')
30
+ end
31
+
32
+ it 'should prefetch remote associations of models with defaults (single request)' do
33
+ add_profile(2, 2, "letter B")
34
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/users.json?id%5B%5D=1&id%5B%5D=2", body: @full_body)
35
+
36
+ profiles = Profile.scoped.includes_remote(:user)
37
+ profiles.first.user.name.should eq('User A')
38
+ profiles.last.user.name.should eq('User B')
39
+ end
40
+
41
+ describe "has options:" do
42
+ it ":class_name - able to choose custom class of association" do
43
+ unset_const(:Profile)
44
+ unset_const(:CustomUser)
45
+ class CustomUser < ActiveResource::Base
46
+ self.site = REMOTE_HOST
47
+ self.element_name = "user"
48
+ end
49
+ class Profile < ActiveRecord::Base
50
+ include RemoteAssociation::Base
51
+ belongs_to_remote :user, class_name: "CustomUser"
52
+ end
53
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/users.json?id%5B%5D=1", body: @body )
54
+ end
55
+ it ":foreign_key - can set key to extract from it's model" do
56
+ unset_const(:Profile)
57
+ class Profile < ActiveRecord::Base
58
+ include RemoteAssociation::Base
59
+ belongs_to_remote :user, foreign_key: :login_id
60
+ def login_id; user_id; end
61
+ end
62
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/users.json?id%5B%5D=1", body: @body)
63
+ end
64
+ after(:each) do
65
+ Profile.first.user.name.should eq('User A')
66
+ end
67
+ end
68
+
69
+
70
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe RemoteAssociation, "method :has_one_remote" do
4
+ before(:all) do
5
+ @body = [{profile: {id: 1, user_id: 1, like: "letter A"}}].to_json
6
+ @full_body = [
7
+ {profile: {id: 1, user_id: 1, like: "letter A"}},
8
+ {profile: {id: 2, user_id: 2, like: "letter B"}}
9
+ ].to_json
10
+ end
11
+
12
+ before(:each) do
13
+ unset_const(:User)
14
+ unset_const(:Profile)
15
+ class User < ActiveRecord::Base
16
+ include RemoteAssociation::Base
17
+ has_one_remote :profile
18
+ end
19
+ class Profile < ActiveResource::Base
20
+ self.site = REMOTE_HOST
21
+ end
22
+
23
+ add_user(1,"User A")
24
+ add_user(2,"User B")
25
+ end
26
+
27
+ it "uses it's defaults" do
28
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1", body: @body )
29
+
30
+ User.first.profile.like.should eq('letter A')
31
+ end
32
+
33
+ it 'should prefetch remote associations of models with defaults (single request)' do
34
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1&user_id%5B%5D=2", body: @full_body)
35
+
36
+ users = User.scoped.includes_remote(:profile)
37
+ users.first.profile.like.should eq('letter A')
38
+ users.last.profile.like.should eq('letter B')
39
+ end
40
+
41
+ describe "has options:" do
42
+ it ":class_name - able to choose custom class of association" do
43
+ unset_const(:User)
44
+ unset_const(:CustomProfile)
45
+ class CustomProfile < ActiveResource::Base
46
+ self.site = REMOTE_HOST
47
+ self.element_name = "profile"
48
+ end
49
+ class User < ActiveRecord::Base
50
+ include RemoteAssociation::Base
51
+ has_one_remote :profile, class_name: "CustomProfile"
52
+ end
53
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1", body: @body )
54
+ end
55
+ it ":foreign_key - can set uri param for search" do
56
+ unset_const(:User)
57
+ class User < ActiveRecord::Base
58
+ include RemoteAssociation::Base
59
+ has_one_remote :profile, foreign_key: :login_id
60
+ end
61
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?login_id%5B%5D=1", body: @body)
62
+ end
63
+ after(:each) do
64
+ User.first.profile.like.should eq('letter A')
65
+ end
66
+ end
67
+ end
@@ -2,14 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe RemoteAssociation do
4
4
  before(:all) do
5
- REMOTE_HOST = "http://127.0.0.1:3000"
6
- PROFILES_JSON = [
5
+ @profiles_json = [
7
6
  {profile: {id: 1, user_id: 1, like: "letter A"}},
8
7
  {profile: {id: 2, user_id: 2, like: "letter B"}}
9
8
  ]
10
9
  end
11
-
12
10
  before(:each) do
11
+ unset_const(:Profile)
12
+ unset_const(:User)
13
13
  class Profile < ActiveResource::Base
14
14
  self.site = REMOTE_HOST
15
15
  end
@@ -22,19 +22,13 @@ describe RemoteAssociation do
22
22
  add_user(2,"User B")
23
23
  end
24
24
 
25
- it 'should prefetch remote associations of models with defaults (single request)' do
26
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1&user_id%5B%5D=2", body: PROFILES_JSON.to_json)
27
-
28
- users = User.scoped.includes_remote(:profile)
29
- users.first.profile.like.should eq('letter A')
30
- users.last.profile.like.should eq('letter B')
31
- end
32
-
33
25
  it 'should raise error if can\'t find settings for included remote' do
34
26
  lambda{ User.scoped.includes_remote(:whatever) }.should raise_error(RemoteAssociation::SettingsNotFoundError, "Can't find settings for whatever association")
35
27
  end
36
28
 
37
29
  it 'should prefetch remote associations of models, passed as args of includes_remote' do
30
+ unset_const(:OtherProfile)
31
+ unset_const(:User)
38
32
  class OtherProfile < ActiveResource::Base
39
33
  self.site = REMOTE_HOST
40
34
  self.element_name = "profile"
@@ -45,8 +39,8 @@ describe RemoteAssociation do
45
39
  has_one_remote :other_profile
46
40
  end
47
41
 
48
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/other_profiles.json?user_id%5B%5D=1&user_id%5B%5D=2", body: PROFILES_JSON.to_json)
49
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1&user_id%5B%5D=2", body: PROFILES_JSON.to_json)
42
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/other_profiles.json?user_id%5B%5D=1&user_id%5B%5D=2", body: @profiles_json.to_json)
43
+ FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1&user_id%5B%5D=2", body: @profiles_json.to_json)
50
44
 
51
45
  users = User.scoped.includes_remote(:profile, :other_profile)
52
46
  users.first.profile.like.should eq('letter A')
@@ -55,43 +49,4 @@ describe RemoteAssociation do
55
49
  users.last.other_profile.like.should eq('letter B')
56
50
  end
57
51
 
58
- it 'should autoload remote associations of each models without prefetching (1+N requiests)' do
59
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1", body: [PROFILES_JSON.first].to_json)
60
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=2", body: [PROFILES_JSON.last].to_json)
61
-
62
- users = User.scoped
63
- users.first.profile.like.should eq('letter A')
64
- users.last.profile.like.should eq('letter B')
65
- end
66
-
67
- describe "method :has_one_remote with options:" do
68
- before(:each) do
69
- @body = [PROFILES_JSON.first].to_json
70
- end
71
- it ":class_name - able to choose custom class of association" do
72
- class CustomProfile < ActiveResource::Base
73
- self.site = REMOTE_HOST
74
- self.element_name = "profile"
75
- end
76
- class User < ActiveRecord::Base
77
- include RemoteAssociation::Base
78
- has_one_remote :profile, class_name: "CustomProfile"
79
- end
80
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?user_id%5B%5D=1", body: @body )
81
- end
82
- it ":foreign_key - can set uri param for search" do
83
- class CustomProfile < ActiveResource::Base
84
- self.site = REMOTE_HOST
85
- self.element_name = "profile"
86
- end
87
- class User < ActiveRecord::Base
88
- include RemoteAssociation::Base
89
- has_one_remote :profile, foreign_key: :login_id
90
- end
91
- FakeWeb.register_uri(:get, "#{REMOTE_HOST}/profiles.json?login_id%5B%5D=1", body: @body)
92
- end
93
- after(:each) do
94
- User.first.profile.like.should eq('letter A')
95
- end
96
- end
97
52
  end
data/spec/spec_helper.rb CHANGED
@@ -36,3 +36,15 @@ ActiveRecord::Base.establish_connection(db_config)
36
36
  def add_user(id, name)
37
37
  ActiveRecord::Base.connection.execute("insert into \"public\".\"users\" (\"id\", \"name\") values ( #{id}, '#{name}');")
38
38
  end
39
+
40
+ def add_profile(id, user_id, like)
41
+ ActiveRecord::Base.connection.execute("insert into \"public\".\"profiles\" (\"id\", \"user_id\", \"like\") values ( #{id}, #{user_id}, '#{like}');")
42
+ end
43
+
44
+ REMOTE_HOST = "http://127.0.0.1:3000"
45
+
46
+ def unset_const(const_name)
47
+ const_name = const_name.to_sym
48
+ const_owner = Module.constants.select { |c| c.to_s.constantize.constants(false).include?(const_name) rescue false }.first.to_s.constantize
49
+ !const_owner.send(:remove_const, const_name) rescue true
50
+ end
@@ -24,6 +24,18 @@ CREATE TABLE "public"."users" (
24
24
  )
25
25
  WITH (OIDS=FALSE);
26
26
  ALTER TABLE "public"."users" OWNER TO "rails";
27
+
28
+ DROP TABLE IF EXISTS "public"."profiles";
29
+
30
+ CREATE TABLE "public"."profiles" (
31
+ "id" int4 NOT NULL,
32
+ "user_id" int4 NOT NULL,
33
+ "like" varchar(255) NOT NULL,
34
+ CONSTRAINT "profiles_pkey" PRIMARY KEY ("id") NOT DEFERRABLE INITIALLY IMMEDIATE
35
+ )
36
+ WITH (OIDS=FALSE);
37
+ ALTER TABLE "public"."profiles" OWNER TO "rails";
38
+
27
39
  SQL
28
40
  )
29
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remote_association
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-23 00:00:00.000000000 Z
12
+ date: 2012-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -132,6 +132,7 @@ extra_rdoc_files: []
132
132
  files:
133
133
  - .gitignore
134
134
  - .rvmrc
135
+ - .travis.yml
135
136
  - Gemfile
136
137
  - Gemfile.lock
137
138
  - LICENSE
@@ -139,9 +140,13 @@ files:
139
140
  - Rakefile
140
141
  - lib/remote_association.rb
141
142
  - lib/remote_association/active_record/relation.rb
143
+ - lib/remote_association/belongs_to_remote.rb
144
+ - lib/remote_association/has_one_remote.rb
142
145
  - lib/remote_association/version.rb
143
146
  - remote_association.gemspec
144
147
  - spec/config/database.example.yml
148
+ - spec/remote_association/belongs_to_remote_spec.rb
149
+ - spec/remote_association/has_one_remote_spec.rb
145
150
  - spec/remote_association/remote_association_spec.rb
146
151
  - spec/spec_helper.rb
147
152
  - spec/tasks/db_setup.rake
@@ -157,12 +162,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
162
  - - ! '>='
158
163
  - !ruby/object:Gem::Version
159
164
  version: '0'
165
+ segments:
166
+ - 0
167
+ hash: 3408694101896139864
160
168
  required_rubygems_version: !ruby/object:Gem::Requirement
161
169
  none: false
162
170
  requirements:
163
171
  - - ! '>='
164
172
  - !ruby/object:Gem::Version
165
173
  version: '0'
174
+ segments:
175
+ - 0
176
+ hash: 3408694101896139864
166
177
  requirements: []
167
178
  rubyforge_project:
168
179
  rubygems_version: 1.8.24
@@ -171,6 +182,8 @@ specification_version: 3
171
182
  summary: Adds relations to ActiveResource models
172
183
  test_files:
173
184
  - spec/config/database.example.yml
185
+ - spec/remote_association/belongs_to_remote_spec.rb
186
+ - spec/remote_association/has_one_remote_spec.rb
174
187
  - spec/remote_association/remote_association_spec.rb
175
188
  - spec/spec_helper.rb
176
189
  - spec/tasks/db_setup.rake