active_force 0.1.1 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acf8e175727f61a6fc99099804f1759a8539d11f
4
- data.tar.gz: df64cceabf34fba0ff538283ac59b278b91acf98
3
+ metadata.gz: e99615e3d168755a419d7264acc03d5e8d230301
4
+ data.tar.gz: a38eec002c02ced5930ba02da66efbdf833a01a1
5
5
  SHA512:
6
- metadata.gz: 5f32456704f543150f8d8f7ba414adfade927cea8f3abe9ea0d847f43ab1dd3f74644d15e607961759f98538315fd9d7ab72c872c0284eb9012bc0ce97081237
7
- data.tar.gz: c410492b5afdf5e9110415ae1abe3f5869df4806e4d77af708573f335e2fda9143b4bae722a544d64da08f4ad58ec786bc30b344caa90994fc3b6216a2c30642
6
+ metadata.gz: 4bb06e3a6de2e82d2f0aa0f86965a1199ce4be71b66709482954fb0e685ac4765d08bf925d7c0ee5ee015ab5663dc54f584d85a6a15655442b6d230e47e14671
7
+ data.tar.gz: 6ca95ce88edcaf1568c6e4db643b8acdcaea075020f1fc40f1ae6c3ef5e9d3ae0ad278f800a17a726275dbda9bc65b580b862a5e02421f54d41754a690cbf884
data/.travis.yml CHANGED
@@ -1,3 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
3
+ - 2.0.0
4
+ - 2.1.1
5
+ - rbx-2
6
+ matrix:
7
+ allow_failures:
8
+ - rvm: rbx-2
9
+ fast_finish: true
10
+ env:
11
+ - CODECLIMATE_REPO_TOKEN=1c5ed259429e0bfc5412974d69cfba2780962a87ca8c543d684e33fea37f7e71
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in active_force.gemspec
4
+ gem "codeclimate-test-reporter", group: :test, require: nil
4
5
  gemspec
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  [![Gem Version](http://img.shields.io/gem/v/active_force.svg)](http://badge.fury.io/rb/active_force)
2
- [![Code Climate](http://img.shields.io/codeclimate/github/eloyesp/active_force.svg)](https://codeclimate.com/github/eloyesp/active_force)
2
+ [![Build Status](http://img.shields.io/travis/ionia-corporation/active_force.svg)](https://travis-ci.org/ionia-corporation/active_force)
3
+ [![Code Climate](http://img.shields.io/codeclimate/github/ionia-corporation/active_force.svg)](https://codeclimate.com/github/ionia-corporation/active_force)
4
+ [![Dependency Status](http://img.shields.io/gemnasium/ionia-corporation/active_force.svg)](https://gemnasium.com/ionia-corporation/active_force)
5
+ [![Test Coverage](https://codeclimate.com/github/ionia-corporation/active_force/badges/coverage.svg)](https://codeclimate.com/github/ionia-corporation/active_force)
6
+
3
7
 
4
8
  # ActiveForce
5
9
 
@@ -19,6 +23,14 @@ And then execute:
19
23
  Or install it yourself as:
20
24
 
21
25
  $ gem install active_force
26
+
27
+ Rails:
28
+
29
+ ```ruby
30
+ #Add this to initializers/restforce.rb
31
+ Restforce.log = true if Rails.env.development?
32
+ ::Client = Restforce.new
33
+ ```
22
34
 
23
35
  ## Usage
24
36
 
data/active_force.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = "eloyesp@gmail.com"
11
11
  spec.description = %q{Use SalesForce as an ActiveModel}
12
12
  spec.summary = %q{Help you implement models persisting on Sales Force within Rails using RESTForce}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/ionia-corporation/active_force"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -18,10 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.required_ruby_version = '~> 2.0'
22
+
21
23
  spec.add_dependency 'active_attr', '~> 0.8'
22
24
  spec.add_dependency 'restforce', '~> 1.4'
23
25
  spec.add_development_dependency 'bundler', '~> 1.3'
24
- spec.add_development_dependency 'rake'
25
- spec.add_development_dependency 'rspec'
26
- spec.add_development_dependency 'pry'
26
+ spec.add_development_dependency 'rake', '~> 0'
27
+ spec.add_development_dependency 'rspec', '~> 0'
28
+ spec.add_development_dependency 'pry', '~> 0'
27
29
  end
@@ -1,39 +1,24 @@
1
- require 'active_force/query'
1
+ require 'active_force/association/association'
2
+ require 'active_force/association/has_many_association'
3
+ require 'active_force/association/belongs_to_association'
2
4
 
3
5
  module ActiveForce
4
6
  module Association
5
7
  module ClassMethods
6
- def has_many relation_name, options = {}
7
- model = options[:model] || relation_model(relation_name)
8
- association_name = options[:table] || model.table_name || "#{ model }__c"
9
- foreing_key = options[:foreing_key] || default_foreing_key(model, self.name) || table_name
10
8
 
11
- define_method "#{ relation_name }_query" do
12
- query = ActiveForce::Query.new(association_name)
13
- query.fields model.fields
14
- query.where(options[:where]) if options[:where]
15
- query.order(options[:order]) if options[:order]
16
- query.limit(options[:limit]) if options[:limit]
17
- query.where("#{ foreing_key } = '#{ id }'")
18
- query
19
- end
9
+ def has_many relation_name, options = {}
10
+ HasManyAssociation.new(self, relation_name, options)
20
11
  end
21
12
 
22
- def relation_model sym
23
- sym.to_s.singularize.camelcase.constantize
13
+ def belongs_to relation_name, options = {}
14
+ BelongsToAssociation.new(self, relation_name, options)
24
15
  end
25
16
 
26
- def default_foreing_key relation_model, model
27
- relation_model.mappings["#{model.downcase}_id".to_sym]
28
- end
17
+ end
29
18
 
30
- def belongs_to relation_name, options = {}
31
- model = options[:model] || relation_model(relation_name)
32
- foreing_key = options[:foreing_key] || "#{ relation_name }_id".to_sym
33
- define_method "#{ relation_name }" do
34
- model.find(self.send foreing_key)
35
- end
36
- end
19
+ def self.included mod
20
+ mod.extend ClassMethods
37
21
  end
22
+
38
23
  end
39
- end
24
+ end
@@ -0,0 +1,30 @@
1
+ module ActiveForce
2
+ module Association
3
+ class Association
4
+
5
+ attr_accessor :options
6
+
7
+ def initialize parent, relation_name, options
8
+ @parent = parent
9
+ @relation_name = relation_name
10
+ @options = options
11
+ build
12
+ end
13
+
14
+ def relation_model
15
+ @options[:model] || @relation_name.to_s.singularize.camelcase.constantize
16
+ end
17
+
18
+ private
19
+
20
+ def build
21
+ define_relation_method
22
+ end
23
+
24
+ def default_sfdc_foreign_key
25
+ relation_model.mappings["#{ @parent.name.downcase }_id".to_sym]
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveForce
2
+ module Association
3
+
4
+ class BelongsToAssociation < Association
5
+
6
+ def foreign_key
7
+ options[:foreign_key] || "#{ @relation_name }_id".to_sym
8
+ end
9
+
10
+ private
11
+
12
+ def define_relation_method
13
+ association = self
14
+ @parent.send :define_method, @relation_name do
15
+ association.relation_model.find(self.send association.foreign_key)
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveForce
2
+ module Association
3
+ class HasManyAssociation < Association
4
+
5
+ def foreign_key
6
+ @options[:foreign_key] || default_sfdc_foreign_key || @parent.table_name
7
+ end
8
+
9
+ private
10
+
11
+ def build
12
+ super
13
+ define_query_method
14
+ end
15
+
16
+ def define_query_method
17
+ association = self
18
+ @parent.send :define_method, query_method_name do
19
+ query = association.relation_model.query
20
+ query.options association.options
21
+ query.where "#{ association.foreign_key } = '#{ self.id }'"
22
+ end
23
+ end
24
+
25
+ def define_relation_method
26
+ association = self
27
+ @parent.send :define_method, @relation_name do
28
+ association.relation_model.send_query send(association.query_method_name)
29
+ end
30
+ end
31
+
32
+ def query_method_name
33
+ "#{ @relation_name }_query"
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveForce
2
+ module Finders
3
+ module ClassMethods
4
+ def find_by conditions
5
+ query = self.query
6
+ query_conditions(conditions).each do |query_condition|
7
+ query = query.where query_condition
8
+ end
9
+ send_query(query).first
10
+ end
11
+
12
+ private
13
+
14
+ #maps a hash key => value to a string 'key = value'
15
+ def query_conditions conditions
16
+ conditions.map do |key, value|
17
+ "#{ mappings[key] } = #{ enclose_value value }"
18
+ end
19
+ end
20
+
21
+ # encloses the value in quotes if it's a string
22
+ def enclose_value value
23
+ if value.is_a? String
24
+ "'#{value}'"
25
+ else
26
+ value.to_s
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+ def self.included mod
33
+ mod.extend ClassMethods
34
+ end
35
+
36
+ end
37
+ end
@@ -2,8 +2,6 @@ module ActiveForce
2
2
  class Query
3
3
  attr_reader :table
4
4
 
5
- attr_accessor :table_id
6
-
7
5
  def initialize table
8
6
  @table = table
9
7
  @conditions = []
@@ -20,7 +18,7 @@ module ActiveForce
20
18
  end
21
19
 
22
20
  def to_s
23
- query = <<-SOQL.gsub(/\s+/, " ").strip
21
+ <<-SOQL.gsub(/\s+/, " ").strip
24
22
  SELECT
25
23
  #{ @query_fields.uniq.join(', ') }
26
24
  FROM
@@ -30,21 +28,20 @@ module ActiveForce
30
28
  #{ build_limit }
31
29
  #{ build_offset }
32
30
  SOQL
33
- query
34
31
  end
35
32
 
36
33
  def where condition
37
- @conditions << condition
34
+ @conditions << condition if condition
38
35
  self
39
36
  end
40
37
 
41
38
  def order order
42
- @order = order
39
+ @order = order if order
43
40
  self
44
41
  end
45
42
 
46
43
  def limit size
47
- @size = size
44
+ @size = size if size
48
45
  self
49
46
  end
50
47
 
@@ -64,7 +61,14 @@ module ActiveForce
64
61
  def find id
65
62
  where "#{ @table_id } = '#{ id }'"
66
63
  limit 1
67
- self
64
+ end
65
+
66
+ def first
67
+ limit 1
68
+ end
69
+
70
+ def last
71
+ order("Id DESC").limit(1)
68
72
  end
69
73
 
70
74
  def join object_query
@@ -72,11 +76,20 @@ module ActiveForce
72
76
  self
73
77
  end
74
78
 
79
+ def count
80
+ @query_fields = ["count(Id)"]
81
+ self
82
+ end
83
+
84
+ def options args
85
+ where args[:where]
86
+ limit args[:limit]
87
+ order args[:order]
88
+ end
89
+
75
90
  protected
76
91
  def build_where
77
- unless @conditions.empty?
78
- "WHERE #{ @conditions.join(' AND ') }"
79
- end
92
+ "WHERE #{ @conditions.join(' AND ') }" unless @conditions.empty?
80
93
  end
81
94
 
82
95
  def build_limit
@@ -91,4 +104,4 @@ module ActiveForce
91
104
  "OFFSET #{ @offset }" if @offset
92
105
  end
93
106
  end
94
- end
107
+ end
@@ -3,6 +3,7 @@ require 'active_attr'
3
3
  require 'active_attr/dirty'
4
4
  require 'active_force/query'
5
5
  require 'active_force/association'
6
+ require 'active_force/finders'
6
7
  require 'yaml'
7
8
 
8
9
  module ActiveForce
@@ -10,8 +11,7 @@ module ActiveForce
10
11
  include ActiveAttr::Model
11
12
  include ActiveAttr::Dirty
12
13
  include ActiveForce::Association
13
-
14
- extend ClassMethods
14
+ include ActiveForce::Finders
15
15
 
16
16
  STANDARD_TYPES = %w[ Account Contact Opportunity Campaign]
17
17
 
@@ -27,16 +27,8 @@ module ActiveForce
27
27
  end
28
28
  end
29
29
 
30
- def self.has_many relation_name, options = {}
31
- super
32
- model = options[:model] || relation_model(relation_name)
33
- define_method relation_name do
34
- model.send_query(self.send "#{ relation_name }_query".to_sym)
35
- end
36
- end
37
-
38
30
  def self.build sobject
39
- return nil if sobject.nil?
31
+ return unless sobject
40
32
  model = new
41
33
  mappings.each do |attr, sf_field|
42
34
  model[attr] = sobject[sf_field]
@@ -51,12 +43,24 @@ module ActiveForce
51
43
  query
52
44
  end
53
45
 
46
+ def self.first
47
+ send_query(query.first).first
48
+ end
49
+
50
+ def self.last
51
+ send_query(query.last).first
52
+ end
53
+
54
54
  def self.all
55
55
  send_query query
56
56
  end
57
57
 
58
+ def self.count
59
+ sfdc_client.query(query.count).first.expr0
60
+ end
61
+
58
62
  def self.send_query query
59
- Client.query(query.to_s).to_a.map do |mash|
63
+ sfdc_client.query(query.to_s).to_a.map do |mash|
60
64
  build mash
61
65
  end
62
66
  end
@@ -72,7 +76,7 @@ module ActiveForce
72
76
  changed.each do |field|
73
77
  sobject_hash[mappings[field.to_sym]] = read_attribute(field)
74
78
  end
75
- result = Client.update! table_name, sobject_hash
79
+ result = sfdc_client.update! table_name, sobject_hash
76
80
  changed_attributes.clear
77
81
  result
78
82
  end
@@ -96,7 +100,7 @@ module ActiveForce
96
100
  value = read_value field
97
101
  hash[name_in_sfdc] = value if value.present?
98
102
  end
99
- self.id = Client.create! table_name, hash
103
+ self.id = sfdc_client.create! table_name, hash
100
104
  changed_attributes.clear
101
105
  end
102
106
 
@@ -145,10 +149,18 @@ module ActiveForce
145
149
  end
146
150
 
147
151
  def self.picklist field
148
- picks = Client.picklist_values(table_name, mappings[field])
152
+ picks = sfdc_client.picklist_values(table_name, mappings[field])
149
153
  picks.map do |value|
150
154
  [value[:label], value[:value]]
151
155
  end
152
156
  end
157
+
158
+ def self.sfdc_client
159
+ Client
160
+ end
161
+
162
+ def sfdc_client
163
+ self.class.sfdc_client
164
+ end
153
165
  end
154
166
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveForce
2
- VERSION = "0.1.1"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -3,6 +3,23 @@ require 'active_force/association'
3
3
 
4
4
  describe ActiveForce::SObject do
5
5
 
6
+ let :post do
7
+ post = Post.new
8
+ post.stub(:id).and_return "1"
9
+ post
10
+ end
11
+
12
+ let :comment do
13
+ comment = Comment.new
14
+ comment.stub(:id).and_return "1"
15
+ comment.stub(:post_id).and_return "1"
16
+ comment
17
+ end
18
+
19
+ let :client do
20
+ double("sfdc_client")
21
+ end
22
+
6
23
  before do
7
24
  class Post < ActiveForce::SObject
8
25
  self.table_name = "Post__c"
@@ -11,6 +28,8 @@ describe ActiveForce::SObject do
11
28
  class Comment < ActiveForce::SObject
12
29
  self.table_name = "Comment__c"
13
30
  end
31
+
32
+ ActiveForce::SObject.stub(:sfdc_client).and_return client
14
33
  end
15
34
 
16
35
  describe "has_many_query" do
@@ -19,18 +38,19 @@ describe ActiveForce::SObject do
19
38
  class Post < ActiveForce::SObject
20
39
  has_many :comments
21
40
  end
41
+ end
22
42
 
23
- @post = Post.new
24
- @post.stub(:id).and_return("1")
43
+ it "should respond to relation method" do
44
+ expect(post).to respond_to(:comments)
25
45
  end
26
46
 
27
47
  it "should return a Query object" do
28
- @post.comments_query.class.should be ActiveForce::Query
48
+ post.comments_query.class.should be ActiveForce::Query
29
49
  end
30
50
 
31
51
  describe 'to_s' do
32
52
  it "should retrun a OSQL statment" do
33
- @post.comments_query.to_s.should ==
53
+ post.comments_query.to_s.should ==
34
54
  "SELECT Id FROM Comment__c WHERE Post__c = '1'"
35
55
  end
36
56
  end
@@ -39,48 +59,48 @@ describe ActiveForce::SObject do
39
59
  describe 'has_many(options)' do
40
60
 
41
61
  it 'should allow to send a different query table name' do
42
- class Post < ActiveForce::SObject
43
- has_many :comments, { table: 'Comment' }
44
- end
45
- @post = Post.new
46
- @post.stub(:id).and_return("1")
47
- @post.comments_query.to_s.should ==
48
- "SELECT Id FROM Comment WHERE Post__c = '1'"
62
+ Post.has_many :ugly_comments, { model: Comment }
63
+ post.comments_query.to_s.should ==
64
+ "SELECT Id FROM Comment__c WHERE Post__c = '1'"
49
65
  end
50
66
 
51
- it 'should allow to change the foreing key' do
52
- class Post < ActiveForce::SObject
53
- has_many :comments, { foreing_key: 'Post' }
54
- end
55
- @post = Post.new
56
- @post.stub(:id).and_return("1")
57
- @post.comments_query.to_s.should ==
67
+ it 'should allow to change the foreign key' do
68
+ Post.has_many :comments, { foreign_key: 'Post' }
69
+ post.comments_query.to_s.should ==
58
70
  "SELECT Id FROM Comment__c WHERE Post = '1'"
59
71
  end
60
72
 
61
73
  it 'should allow to add a where condition' do
62
- class Post < ActiveForce::SObject
63
- has_many :comments, { where: '1 = 1' }
64
- end
65
- @post = Post.new
66
- @post.stub(:id).and_return("1")
67
- @post.comments_query.to_s.should ==
74
+ Post.has_many :comments, { where: '1 = 1' }
75
+ post.comments_query.to_s.should ==
68
76
  "SELECT Id FROM Comment__c WHERE 1 = 1 AND Post__c = '1'"
69
77
  end
70
78
 
71
- it 'should use a convention name for the foreing key' do
72
- class Comment < ActiveForce::SObject
73
- field :post_id, from: 'PostId'
74
- end
79
+ it 'should use a convention name for the foreign key' do
80
+ Comment.field :post_id, from: 'PostId'
81
+ Post.has_many :comments
82
+ post.comments_query.to_s.should ==
83
+ "SELECT Id FROM Comment__c WHERE PostId = '1'"
84
+ end
85
+ end
75
86
 
76
- class Post < ActiveForce::SObject
77
- has_many :comments
78
- end
87
+ describe "belongs_to" do
79
88
 
80
- @post = Post.new
81
- @post.stub(:id).and_return("1")
82
- @post.comments_query.to_s.should ==
83
- "SELECT Id FROM Comment__c WHERE PostId = '1'"
89
+ before do
90
+ Comment.belongs_to :post
91
+ client.stub(:query).and_return Restforce::Mash.new(id: 1)
92
+ end
93
+
94
+ it "should get the resource it belongs to" do
95
+ expect(comment.post).to be_instance_of(Post)
84
96
  end
97
+
98
+ it "should allow to pass a foreign key as options" do
99
+ Comment.belongs_to :post, foreign_key: :fancy_post_id
100
+ comment.stub(:fancy_post_id).and_return "1"
101
+ client.should_receive(:query).with("SELECT Id FROM Post__c WHERE Id = '1' LIMIT 1")
102
+ comment.post
103
+ end
104
+
85
105
  end
86
- end
106
+ end
@@ -64,4 +64,29 @@ describe ActiveForce::SObject do
64
64
 
65
65
  end
66
66
 
67
+ describe "#count" do
68
+ let(:count_response){ [Restforce::Mash.new(expr0: 1)] }
69
+
70
+ it "responds to count" do
71
+ Whizbang.should respond_to(:count)
72
+ end
73
+
74
+ it "sends the query to the client" do
75
+ Client.should_receive(:query).and_return(count_response)
76
+ expect(Whizbang.count).to eq(1)
77
+ end
78
+
79
+ end
80
+
81
+ describe "#find_by" do
82
+ it "responds to find_by" do
83
+ Whizbang.should respond_to(:find_by)
84
+ end
85
+
86
+ it "should query the client, with the SFDC field names and correctly enclosed values" do
87
+ Client.should_receive(:query).with("SELECT Id FROM Whizbang__c WHERE Id = 123 AND Text_Label = 'foo'")
88
+ Whizbang.find_by id: 123, text: "foo"
89
+ end
90
+ end
91
+
67
92
  end
@@ -81,7 +81,7 @@ describe ActiveForce::Query do
81
81
  end
82
82
 
83
83
  it "should add a order condition in the statment with WHERE and LIMIT" do
84
- @query.where("condition1 = 1").order("name desc").limit(1).to_s.should ==
84
+ @query.where("condition1 = 1").order("name desc").limit(1).to_s.should ==
85
85
  "SELECT Id, name, etc FROM table_name WHERE condition1 = 1 ORDER BY name desc LIMIT 1"
86
86
  end
87
87
  end
@@ -93,9 +93,57 @@ describe ActiveForce::Query do
93
93
  @join.fields ['name', 'etc']
94
94
  end
95
95
 
96
- it 'sould add another select statment on the current select' do
96
+ it 'should add another select statment on the current select' do
97
97
  @query.join(@join).to_s.should ==
98
98
  'SELECT Id, name, etc, (SELECT Id, name, etc FROM join_table_name) FROM table_name'
99
99
  end
100
100
  end
101
- end
101
+
102
+ describe '.first' do
103
+ it 'should return the query for the first record' do
104
+ @query.first.to_s.should ==
105
+ 'SELECT Id, name, etc FROM table_name LIMIT 1'
106
+ end
107
+ end
108
+
109
+ describe '.last' do
110
+ it 'should return the query for the last record' do
111
+ @query.last.to_s.should ==
112
+ 'SELECT Id, name, etc FROM table_name ORDER BY Id DESC LIMIT 1'
113
+ end
114
+ end
115
+
116
+ describe ".count" do
117
+ it "should return the query for getting the row count" do
118
+ @query.count.to_s.should ==
119
+ 'SELECT count(Id) FROM table_name'
120
+ end
121
+
122
+ it "should work with a condition" do
123
+ @query.where("name = 'cool'").count.to_s.should ==
124
+ "SELECT count(Id) FROM table_name WHERE name = 'cool'"
125
+ end
126
+ end
127
+
128
+ describe '.options' do
129
+ it 'should add a where if the option has a where condition' do
130
+ @query.options(where: 'var = 1').to_s.should ==
131
+ "SELECT Id, name, etc FROM table_name WHERE var = 1"
132
+ end
133
+
134
+ it 'should add a limit if the option has a limit condition' do
135
+ @query.options(limit: 1).to_s.should ==
136
+ "SELECT Id, name, etc FROM table_name LIMIT 1"
137
+ end
138
+
139
+ it 'should add a order if the option has a order condition' do
140
+ @query.options(order: 'name desc').to_s.should ==
141
+ "SELECT Id, name, etc FROM table_name ORDER BY name desc"
142
+ end
143
+
144
+ it 'should work with multiples options' do
145
+ @query.options(where: 'var = 1', order: 'name desc', limit: 1).to_s.should ==
146
+ "SELECT Id, name, etc FROM table_name WHERE var = 1 ORDER BY name desc LIMIT 1"
147
+ end
148
+ end
149
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require "codeclimate-test-reporter"
2
+ CodeClimate::TestReporter.start
3
+
1
4
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
+ require 'restforce'
2
6
  require 'active_force'
3
7
  Dir["./spec/support/**/*"].sort.each { |f| require f }
4
8
  require 'pry'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_force
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Espinaco
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-28 00:00:00.000000000 Z
12
+ date: 2014-08-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active_attr
@@ -57,42 +57,42 @@ dependencies:
57
57
  name: rake
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ">="
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rspec
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ">="
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ">="
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: pry
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - ">="
88
+ - - "~>"
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - ">="
95
+ - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  description: Use SalesForce as an ActiveModel
@@ -113,6 +113,10 @@ files:
113
113
  - lib/active_attr/dirty.rb
114
114
  - lib/active_force.rb
115
115
  - lib/active_force/association.rb
116
+ - lib/active_force/association/association.rb
117
+ - lib/active_force/association/belongs_to_association.rb
118
+ - lib/active_force/association/has_many_association.rb
119
+ - lib/active_force/finders.rb
116
120
  - lib/active_force/query.rb
117
121
  - lib/active_force/sobject.rb
118
122
  - lib/active_force/version.rb
@@ -128,7 +132,7 @@ files:
128
132
  - spec/spec_helper.rb
129
133
  - spec/support/fixture_helpers.rb
130
134
  - spec/support/whizbang.rb
131
- homepage: ''
135
+ homepage: https://github.com/ionia-corporation/active_force
132
136
  licenses:
133
137
  - MIT
134
138
  metadata: {}
@@ -138,9 +142,9 @@ require_paths:
138
142
  - lib
139
143
  required_ruby_version: !ruby/object:Gem::Requirement
140
144
  requirements:
141
- - - ">="
145
+ - - "~>"
142
146
  - !ruby/object:Gem::Version
143
- version: '0'
147
+ version: '2.0'
144
148
  required_rubygems_version: !ruby/object:Gem::Requirement
145
149
  requirements:
146
150
  - - ">="