sfdc 2.3.0 → 2.4.0

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: 9db9e563376f75fdd91451086288513ac98ff4bb
4
- data.tar.gz: d5cc200a8a3e6cf90a5b0bfe89699ace0791d9b0
3
+ metadata.gz: b069e7a4c283823fd8d6c1cb4d91655843aeb825
4
+ data.tar.gz: 5f4ee6acdefbea239435a03d000e3ff2f5fbfdb0
5
5
  SHA512:
6
- metadata.gz: 3d1c893e10b0a699b2e05616e8a109a6de09bd455c8f9fb9d6ad89da604d94e943e48bbd32c995464e058d9d7de3167044ea5fa254006ac2d30a329d7269075b
7
- data.tar.gz: 25c0e5d419ed282040c7b5fc1a1dbbb679af0a79c583672ea4fd147be2c2b0071a8cd3f308d64a09827dca2d8dc14fe8c9c5178186556fff07a6f604c9a13b83
6
+ metadata.gz: 7b8ce424aa1aee8e13e61a8b3d79c90f0db1adde39258ff722492d49bc65afcb884352ec617b95db3245399ad238605d1145aed17f6dda7e5b1ec66379ced844
7
+ data.tar.gz: 476893d58baba2e78b4bbfb2ab111ae92fd756cef72115c712dbcdc29baed9844e5156261030085e1a65cbc322601b4ef5d69b004c668dabcfe7fe6c679d874b
data/README.md CHANGED
@@ -422,6 +422,16 @@ end
422
422
 
423
423
  You can use Sfdc to decode signed requests from Salesforce. See [the example app](https://gist.github.com/4052312).
424
424
 
425
+ ## Tooling API
426
+
427
+ To use the [Tooling API](http://www.salesforce.com/us/developer/docs/api_toolingpre/api_tooling.pdf),
428
+ call `Sfdc.tooling` instead of `Sfdc.new`:
429
+
430
+ ```ruby
431
+ client = Sfdc.tooling(...)
432
+ ```
433
+
434
+
425
435
  ## Contributing
426
436
 
427
437
  1. Fork it
@@ -1,5 +1,3 @@
1
- require "sfdc/version"
2
-
3
1
  require 'faraday'
4
2
  require 'faraday_middleware'
5
3
  require 'json'
@@ -8,22 +6,54 @@ require 'sfdc/version'
8
6
  require 'sfdc/config'
9
7
 
10
8
  module Sfdc
11
- autoload :SignedRequest, 'sfdc/signed_request'
12
- autoload :Collection, 'sfdc/collection'
13
- autoload :Middleware, 'sfdc/middleware'
14
- autoload :Attachment, 'sfdc/attachment'
15
- autoload :UploadIO, 'sfdc/upload_io'
16
- autoload :SObject, 'sfdc/sobject'
17
- autoload :Client, 'sfdc/client'
18
- autoload :Mash, 'sfdc/mash'
19
-
20
- AuthenticationError = Class.new(StandardError)
21
- UnauthorizedError = Class.new(StandardError)
9
+ autoload :AbstractClient, 'sfdc/abstract_client'
10
+ autoload :SignedRequest, 'sfdc/signed_request'
11
+ autoload :Collection, 'sfdc/collection'
12
+ autoload :Middleware, 'sfdc/middleware'
13
+ autoload :Attachment, 'sfdc/attachment'
14
+ autoload :UploadIO, 'sfdc/upload_io'
15
+ autoload :SObject, 'sfdc/sobject'
16
+ autoload :Client, 'sfdc/client'
17
+ autoload :Mash, 'sfdc/mash'
18
+
19
+ module Concerns
20
+ autoload :Authentication, 'sfdc/concerns/authentication'
21
+ autoload :Connection, 'sfdc/concerns/connection'
22
+ autoload :Picklists, 'sfdc/concerns/picklists'
23
+ autoload :Streaming, 'sfdc/concerns/streaming'
24
+ autoload :Caching, 'sfdc/concerns/caching'
25
+ autoload :Canvas, 'sfdc/concerns/canvas'
26
+ autoload :Verbs, 'sfdc/concerns/verbs'
27
+ autoload :Base, 'sfdc/concerns/base'
28
+ autoload :API, 'sfdc/concerns/api'
29
+ end
30
+
31
+ module Data
32
+ autoload :Client, 'sfdc/data/client'
33
+ end
34
+
35
+ module Tooling
36
+ autoload :Client, 'sfdc/tooling/client'
37
+ end
38
+
39
+ Error = Class.new(StandardError)
40
+ AuthenticationError = Class.new(Error)
41
+ UnauthorizedError = Class.new(Error)
22
42
 
23
43
  class << self
24
- # Alias for Sfdc::Client.new
25
- def new(options = {}, &block)
26
- Sfdc::Client.new(options, &block)
44
+ # Alias for Sfdc::Data::Client.new
45
+ #
46
+ # Shamelessly pulled from https://github.com/pengwynn/octokit/blob/master/lib/octokit.rb
47
+ def new(*args)
48
+ data(*args)
49
+ end
50
+
51
+ def data(*args)
52
+ Sfdc::Data::Client.new(*args)
53
+ end
54
+
55
+ def tooling(*args)
56
+ Sfdc::Tooling::Client.new(*args)
27
57
  end
28
58
 
29
59
  # Helper for decoding signed requests.
@@ -0,0 +1,9 @@
1
+ module Sfdc
2
+ class AbstractClient
3
+ include Sfdc::Concerns::Base
4
+ include Sfdc::Concerns::Connection
5
+ include Sfdc::Concerns::Authentication
6
+ include Sfdc::Concerns::Caching
7
+ include Sfdc::Concerns::API
8
+ end
9
+ end
@@ -1,98 +1,3 @@
1
- require 'sfdc/client/connection'
2
- require 'sfdc/client/authentication'
3
- require 'sfdc/client/streaming'
4
- require 'sfdc/client/picklists'
5
- require 'sfdc/client/caching'
6
- require 'sfdc/client/canvas'
7
- require 'sfdc/client/api'
8
-
9
1
  module Sfdc
10
- class Client
11
- include Sfdc::Client::Connection
12
- include Sfdc::Client::Authentication
13
- include Sfdc::Client::Streaming
14
- include Sfdc::Client::Picklists
15
- include Sfdc::Client::Caching
16
- include Sfdc::Client::Canvas
17
- include Sfdc::Client::API
18
-
19
- # Public: Creates a new client instance
20
- #
21
- # opts - A hash of options to be passed in (default: {}).
22
- # :username - The String username to use (required for password authentication).
23
- # :password - The String password to use (required for password authentication).
24
- # :security_token - The String security token to use (required for password authentication).
25
- #
26
- # :oauth_token - The String oauth access token to authenticate api
27
- # calls (required unless password
28
- # authentication is used).
29
- # :refresh_token - The String refresh token to obtain fresh
30
- # oauth access tokens (required if oauth
31
- # authentication is used).
32
- # :instance_url - The String base url for all api requests
33
- # (required if oauth authentication is used).
34
- #
35
- # :client_id - The oauth client id to use. Needed for both
36
- # password and oauth authentication
37
- # :client_secret - The oauth client secret to use.
38
- #
39
- # :host - The String hostname to use during
40
- # authentication requests (default: 'login.salesforce.com').
41
- #
42
- # :api_version - The String REST api version to use (default: '24.0')
43
- #
44
- # :authentication_retries - The number of times that client
45
- # should attempt to reauthenticate
46
- # before raising an exception (default: 3).
47
- #
48
- # :compress - Set to true to have Salesforce compress the response (default: false).
49
- # :timeout - Faraday connection request read/open timeout. (default: nil).
50
- #
51
- # :proxy_uri - Proxy URI: 'http://proxy.example.com:port' or 'http://user@pass:proxy.example.com:port'
52
- #
53
- # Examples
54
- #
55
- # # Initialize a new client using password authentication:
56
- # Sfdc::Client.new :username => 'user',
57
- # :password => 'pass',
58
- # :security_token => 'security token',
59
- # :client_id => 'client id',
60
- # :client_secret => 'client secret'
61
- #
62
- # # Initialize a new client using oauth authentication:
63
- # Sfdc::Client.new :oauth_token => 'access token',
64
- # :refresh_token => 'refresh token',
65
- # :instance_url => 'https://na1.salesforce.com',
66
- # :client_id => 'client id',
67
- # :client_secret => 'client secret'
68
- #
69
- # # Initialize a new client without using any authentication middleware:
70
- # Sfdc::Client.new :oauth_token => 'access token',
71
- # :instance_url => 'https://na1.salesforce.com'
72
- #
73
- def initialize(opts = {})
74
- raise 'Please specify a hash of options' unless opts.is_a?(Hash)
75
- @options = Hash[Sfdc.configuration.options.map { |option| [option, Sfdc.configuration.send(option)] }]
76
- @options.merge! opts
77
- yield builder if block_given?
78
- end
79
-
80
- def instance_url
81
- authenticate! unless @options[:instance_url]
82
- @options[:instance_url]
83
- end
84
-
85
- # Public: Returns a url to the resource.
86
- #
87
- # resource - A record that responds to to_sparam or a String/Fixnum.
88
- #
89
- # Returns the url to the resource.
90
- def url(resource)
91
- "#{instance_url}/#{(resource.respond_to?(:to_sparam) ? resource.to_sparam : resource)}"
92
- end
93
-
94
- def inspect
95
- "#<#{self.class} @options=#{@options.inspect}>"
96
- end
97
- end
2
+ Client = Data::Client
98
3
  end
@@ -1,9 +1,9 @@
1
- require 'sfdc/client/verbs'
1
+ require 'sfdc/concerns/verbs'
2
2
 
3
3
  module Sfdc
4
- class Client
4
+ module Concerns
5
5
  module API
6
- extend Sfdc::Client::Verbs
6
+ extend Sfdc::Concerns::Verbs
7
7
 
8
8
  # Public: Helper methods for performing arbitrary actions against the API using
9
9
  # various HTTP verbs.
@@ -77,15 +77,6 @@ module Sfdc
77
77
  query('select id from Organization').first['Id']
78
78
  end
79
79
 
80
- # Public: Get the current user's Id.
81
- # client.user_id
82
- def user_id
83
- response = authenticate!
84
- info = get(response.id).body
85
- user_id = info.user_id
86
- return user_id
87
- end
88
-
89
80
  # Public: Executs a SOQL query and returns the result.
90
81
  #
91
82
  # soql - A SOQL expression.
@@ -103,16 +94,6 @@ module Sfdc
103
94
  mashify? ? response.body : response.body['records']
104
95
  end
105
96
 
106
- # Returns SFDC recent items Id.
107
- # Returns Sfdc::SObject
108
- # client.recent.each do |r|
109
- # puts r.Name + ' ' + r.Id
110
- # end
111
- def recent
112
- response = api_get 'recent'
113
- mashify? ? response.body : response.body['records']
114
- end
115
-
116
97
  # Public: Perform a SOSL search
117
98
  #
118
99
  # sosl - A SOSL expression.
@@ -203,7 +184,7 @@ module Sfdc
203
184
  # Raises an exception if an error is returned from Salesforce.
204
185
  def update!(sobject, attrs)
205
186
  id = attrs.delete(attrs.keys.find { |k| k.to_s.downcase == 'id' })
206
- raise 'Id field missing.' unless id
187
+ raise ArgumentError, 'Id field missing from attrs.' unless id
207
188
  api_patch "sobjects/#{sobject}/#{id}", attrs
208
189
  true
209
190
  end
@@ -294,8 +275,16 @@ module Sfdc
294
275
  def find(sobject, id, field=nil)
295
276
  api_get(field ? "sobjects/#{sobject}/#{field}/#{id}" : "sobjects/#{sobject}/#{id}").body
296
277
  end
297
-
298
-
278
+
279
+ # Public: Get the current user's Id.
280
+ # client.user_id
281
+ def user_id
282
+ response = authenticate!
283
+ info = get(response.id).body
284
+ user_id = info.user_id
285
+ return user_id
286
+ end
287
+
299
288
  #################### Chatter items ############################
300
289
  # @client.feeds.each do |f|
301
290
  # puts f.to_hash['id']
@@ -316,7 +305,7 @@ module Sfdc
316
305
  # api_path('sobjects')
317
306
  # # => '/services/data/v24.0/sobjects'
318
307
  def api_path(path)
319
- "/services/data/v#{@options[:api_version]}/#{path}"
308
+ "/services/data/v#{options[:api_version]}/#{path}"
320
309
  end
321
310
 
322
311
  # Internal: Errors that should be rescued from in non-bang methods
@@ -1,11 +1,11 @@
1
1
  module Sfdc
2
- class Client
2
+ module Concerns
3
3
  module Authentication
4
4
 
5
5
  # Public: Force an authentication
6
6
  def authenticate!
7
7
  raise AuthenticationError, 'No authentication middleware present' unless authentication_middleware
8
- middleware = authentication_middleware.new nil, self, @options
8
+ middleware = authentication_middleware.new nil, self, options
9
9
  middleware.authenticate!
10
10
  end
11
11
 
@@ -21,18 +21,18 @@ module Sfdc
21
21
  # Internal: Returns true if username/password (autonomous) flow should be used for
22
22
  # authentication.
23
23
  def username_password?
24
- @options[:username] &&
25
- @options[:password] &&
26
- @options[:client_id] &&
27
- @options[:client_secret]
24
+ options[:username] &&
25
+ options[:password] &&
26
+ options[:client_id] &&
27
+ options[:client_secret]
28
28
  end
29
29
 
30
30
  # Internal: Returns true if oauth token refresh flow should be used for
31
31
  # authentication.
32
32
  def oauth_refresh?
33
- @options[:refresh_token] &&
34
- @options[:client_id] &&
35
- @options[:client_secret]
33
+ options[:refresh_token] &&
34
+ options[:client_id] &&
35
+ options[:client_secret]
36
36
  end
37
37
 
38
38
  end
@@ -0,0 +1,58 @@
1
+ module Sfdc
2
+ module Concerns
3
+ module Base
4
+
5
+ attr_reader :options
6
+
7
+ # Public: Creates a new client instance
8
+ #
9
+ # opts - A hash of options to be passed in (default: {}).
10
+ # :username - The String username to use (required for password authentication).
11
+ # :password - The String password to use (required for password authentication).
12
+ # :security_token - The String security token to use (required for password authentication).
13
+ #
14
+ # :oauth_token - The String oauth access token to authenticate api
15
+ # calls (required unless password
16
+ # authentication is used).
17
+ # :refresh_token - The String refresh token to obtain fresh
18
+ # oauth access tokens (required if oauth
19
+ # authentication is used).
20
+ # :instance_url - The String base url for all api requests
21
+ # (required if oauth authentication is used).
22
+ #
23
+ # :client_id - The oauth client id to use. Needed for both
24
+ # password and oauth authentication
25
+ # :client_secret - The oauth client secret to use.
26
+ #
27
+ # :host - The String hostname to use during
28
+ # authentication requests (default: 'login.salesforce.com').
29
+ #
30
+ # :api_version - The String REST api version to use (default: '24.0')
31
+ #
32
+ # :authentication_retries - The number of times that client
33
+ # should attempt to reauthenticate
34
+ # before raising an exception (default: 3).
35
+ #
36
+ # :compress - Set to true to have Salesforce compress the response (default: false).
37
+ # :timeout - Faraday connection request read/open timeout. (default: nil).
38
+ #
39
+ # :proxy_uri - Proxy URI: 'http://proxy.example.com:port' or 'http://user@pass:proxy.example.com:port'
40
+ def initialize(opts = {})
41
+ raise ArgumentError, 'Please specify a hash of options' unless opts.is_a?(Hash)
42
+ @options = Hash[Sfdc.configuration.options.map { |option| [option, Sfdc.configuration.send(option)] }]
43
+ @options.merge! opts
44
+ yield builder if block_given?
45
+ end
46
+
47
+ def instance_url
48
+ authenticate! unless options[:instance_url]
49
+ options[:instance_url]
50
+ end
51
+
52
+ def inspect
53
+ "#<#{self.class} @options=#{@options.inspect}>"
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,5 @@
1
1
  module Sfdc
2
- class Client
2
+ module Concerns
3
3
  module Caching
4
4
 
5
5
  # Public: Runs the block with caching disabled.
@@ -8,17 +8,17 @@ module Sfdc
8
8
  #
9
9
  # Returns the result of the block
10
10
  def without_caching(&block)
11
- @options[:use_cache] = false
11
+ options[:use_cache] = false
12
12
  block.call
13
13
  ensure
14
- @options.delete(:use_cache)
14
+ options.delete(:use_cache)
15
15
  end
16
16
 
17
17
  private
18
18
 
19
19
  # Internal: Cache to use for the caching middleware
20
20
  def cache
21
- @options[:cache]
21
+ options[:cache]
22
22
  end
23
23
 
24
24
  end
@@ -0,0 +1,12 @@
1
+ module Sfdc
2
+ module Concerns
3
+ module Canvas
4
+
5
+ def decode_signed_request(signed_request)
6
+ raise 'client_secret not set.' unless options[:client_secret]
7
+ SignedRequest.decode(signed_request, options[:client_secret])
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  module Sfdc
2
- class Client
2
+ module Concerns
3
3
  module Connection
4
4
 
5
5
  # Public: The Faraday::Builder instance used for the middleware stack. This
@@ -20,31 +20,31 @@ module Sfdc
20
20
 
21
21
  # Internal: Internal faraday connection where all requests go through
22
22
  def connection
23
- @connection ||= Faraday.new(@options[:instance_url], connection_options) do |builder|
23
+ @connection ||= Faraday.new(options[:instance_url], connection_options) do |builder|
24
24
  # Parses JSON into Hashie::Mash structures.
25
- builder.use Sfdc::Middleware::Mashify, self, @options
25
+ builder.use Sfdc::Middleware::Mashify, self, options
26
26
  # Handles multipart file uploads for blobs.
27
27
  builder.use Sfdc::Middleware::Multipart
28
28
  # Converts the request into JSON.
29
29
  builder.request :json
30
30
  # Handles reauthentication for 403 responses.
31
- builder.use authentication_middleware, self, @options if authentication_middleware
31
+ builder.use authentication_middleware, self, options if authentication_middleware
32
32
  # Sets the oauth token in the headers.
33
- builder.use Sfdc::Middleware::Authorization, self, @options
33
+ builder.use Sfdc::Middleware::Authorization, self, options
34
34
  # Ensures the instance url is set.
35
- builder.use Sfdc::Middleware::InstanceURL, self, @options
35
+ builder.use Sfdc::Middleware::InstanceURL, self, options
36
36
  # Parses returned JSON response into a hash.
37
37
  builder.response :json, :content_type => /\bjson$/
38
38
  # Caches GET requests.
39
- builder.use Sfdc::Middleware::Caching, cache, @options if cache
39
+ builder.use Sfdc::Middleware::Caching, cache, options if cache
40
40
  # Follows 30x redirects.
41
41
  builder.use FaradayMiddleware::FollowRedirects
42
42
  # Raises errors for 40x responses.
43
43
  builder.use Sfdc::Middleware::RaiseError
44
44
  # Log request/responses
45
- builder.use Sfdc::Middleware::Logger, Sfdc.configuration.logger, @options if Sfdc.log?
45
+ builder.use Sfdc::Middleware::Logger, Sfdc.configuration.logger, options if Sfdc.log?
46
46
  # Compress/Decompress the request/response
47
- builder.use Sfdc::Middleware::Gzip, self, @options
47
+ builder.use Sfdc::Middleware::Gzip, self, options
48
48
 
49
49
  builder.adapter adapter
50
50
  end
@@ -57,9 +57,9 @@ module Sfdc
57
57
  # Internal: Faraday Connection options
58
58
  def connection_options
59
59
  { :request => {
60
- :timeout => @options[:timeout],
61
- :open_timeout => @options[:timeout] },
62
- :proxy => @options[:proxy_uri]
60
+ :timeout => options[:timeout],
61
+ :open_timeout => options[:timeout] },
62
+ :proxy => options[:proxy_uri]
63
63
  }
64
64
  end
65
65
 
@@ -1,5 +1,5 @@
1
1
  module Sfdc
2
- class Client
2
+ module Concerns
3
3
  module Picklists
4
4
 
5
5
  # Public: Get the available picklist values for a picklist or multipicklist field.
@@ -1,5 +1,5 @@
1
1
  module Sfdc
2
- class Client
2
+ module Concerns
3
3
  module Streaming
4
4
 
5
5
  # Public: Subscribe to a PushTopic
@@ -14,8 +14,8 @@ module Sfdc
14
14
 
15
15
  # Public: Faye client to use for subscribing to PushTopics
16
16
  def faye
17
- raise 'Instance URL missing. Call .authenticate! first.' unless @options[:instance_url]
18
- @faye ||= Faye::Client.new("#{@options[:instance_url]}/cometd/#{@options[:api_version]}").tap do |client|
17
+ raise 'Instance URL missing. Call .authenticate! first.' unless options[:instance_url]
18
+ @faye ||= Faye::Client.new("#{options[:instance_url]}/cometd/#{options[:api_version]}").tap do |client|
19
19
  client.bind 'transport:down' do
20
20
  Sfdc.log "[COMETD DOWN]"
21
21
  client.set_header 'Authorization', "OAuth #{authenticate!.access_token}"
@@ -1,5 +1,5 @@
1
1
  module Sfdc
2
- class Client
2
+ module Concerns
3
3
  module Verbs
4
4
 
5
5
  # Internal: Define methods to handle a verb.
@@ -31,13 +31,13 @@ module Sfdc
31
31
  # Returns nil.
32
32
  def define_verb(verb)
33
33
  define_method verb do |*args, &block|
34
- retries = @options[:authentication_retries]
34
+ retries = options[:authentication_retries]
35
35
  begin
36
36
  connection.send(verb, *args, &block)
37
37
  rescue Sfdc::UnauthorizedError
38
38
  if retries > 0
39
39
  retries -= 1
40
- connection.url_prefix = @options[:instance_url]
40
+ connection.url_prefix = options[:instance_url]
41
41
  retry
42
42
  end
43
43
  raise
@@ -82,7 +82,7 @@ module Sfdc
82
82
  end
83
83
  end
84
84
 
85
- option :api_version, :default => '27.0'
85
+ option :api_version, :default => '26.0'
86
86
 
87
87
  # The username to use during login.
88
88
  option :username, :default => lambda { ENV['SALESFORCE_USERNAME'] }
@@ -0,0 +1,18 @@
1
+ module Sfdc
2
+ module Data
3
+ class Client < AbstractClient
4
+ include Sfdc::Concerns::Streaming
5
+ include Sfdc::Concerns::Picklists
6
+ include Sfdc::Concerns::Canvas
7
+
8
+ # Public: Returns a url to the resource.
9
+ #
10
+ # resource - A record that responds to to_sparam or a String/Fixnum.
11
+ #
12
+ # Returns the url to the resource.
13
+ def url(resource)
14
+ "#{instance_url}/#{(resource.respond_to?(:to_sparam) ? resource.to_sparam : resource)}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -46,7 +46,7 @@ module Sfdc
46
46
  deep_update(source_hash) if source_hash
47
47
  default ? super(default) : super(&blk)
48
48
  end
49
-
49
+
50
50
  def convert_value(val, duping=false)
51
51
  case val
52
52
  when self.class
@@ -29,7 +29,7 @@ module Sfdc
29
29
 
30
30
  # Internal: The params to post to the OAuth service.
31
31
  def params
32
- raise 'not implemented'
32
+ raise NotImplementedError
33
33
  end
34
34
 
35
35
  # Internal: Faraday connection to use when sending an authentication request.
@@ -14,7 +14,7 @@ module Sfdc
14
14
  def password
15
15
  "#{@options[:password]}#{@options[:security_token]}"
16
16
  end
17
-
17
+
18
18
  end
19
19
 
20
20
  end
@@ -9,7 +9,7 @@ module Sfdc
9
9
  :client_id => @options[:client_id],
10
10
  :client_secret => @options[:client_secret] }
11
11
  end
12
-
12
+
13
13
  end
14
14
 
15
15
  end
@@ -13,7 +13,7 @@ module Sfdc
13
13
  def token
14
14
  @options[:oauth_token]
15
15
  end
16
-
16
+
17
17
  end
18
18
 
19
19
  end
@@ -12,7 +12,7 @@ module Sfdc
12
12
  def url_prefix_set?
13
13
  !!(connection.url_prefix && connection.url_prefix.host)
14
14
  end
15
-
15
+
16
16
  end
17
17
 
18
18
  end
@@ -13,6 +13,6 @@ module Sfdc
13
13
  def body
14
14
  @env[:body]
15
15
  end
16
-
16
+
17
17
  end
18
18
  end
@@ -27,7 +27,7 @@ module Sfdc
27
27
  return nil if signature != hmac
28
28
  JSON.parse(Base64.decode64(payload))
29
29
  end
30
-
30
+
31
31
  private
32
32
  attr_reader :client_secret, :signature, :payload
33
33
 
@@ -57,7 +57,7 @@ module Sfdc
57
57
 
58
58
  def ensure_id
59
59
  return true if self.Id?
60
- raise 'You need to query the Id for the record first.'
60
+ raise ArgumentError, 'You need to query the Id for the record first.'
61
61
  end
62
62
 
63
63
  end
@@ -0,0 +1,13 @@
1
+ module Sfdc
2
+ module Tooling
3
+ class Client < AbstractClient
4
+
5
+ private
6
+
7
+ def api_path(path)
8
+ super("tooling/#{path}")
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Sfdc
2
- VERSION = "2.3.0"
2
+ VERSION = '2.4.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sfdc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruce Yue
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir:
10
10
  - bin
11
11
  cert_chain: []
12
- date: 2013-04-27 00:00:00.000000000 Z
12
+ date: 2013-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -116,18 +116,21 @@ executables: []
116
116
  extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
+ - lib/sfdc/abstract_client.rb
119
120
  - lib/sfdc/attachment.rb
120
- - lib/sfdc/client/api.rb
121
- - lib/sfdc/client/authentication.rb
122
- - lib/sfdc/client/caching.rb
123
- - lib/sfdc/client/canvas.rb
124
- - lib/sfdc/client/connection.rb
125
- - lib/sfdc/client/picklists.rb
126
- - lib/sfdc/client/streaming.rb
127
- - lib/sfdc/client/verbs.rb
128
121
  - lib/sfdc/client.rb
129
122
  - lib/sfdc/collection.rb
123
+ - lib/sfdc/concerns/api.rb
124
+ - lib/sfdc/concerns/authentication.rb
125
+ - lib/sfdc/concerns/base.rb
126
+ - lib/sfdc/concerns/caching.rb
127
+ - lib/sfdc/concerns/canvas.rb
128
+ - lib/sfdc/concerns/connection.rb
129
+ - lib/sfdc/concerns/picklists.rb
130
+ - lib/sfdc/concerns/streaming.rb
131
+ - lib/sfdc/concerns/verbs.rb
130
132
  - lib/sfdc/config.rb
133
+ - lib/sfdc/data/client.rb
131
134
  - lib/sfdc/mash.rb
132
135
  - lib/sfdc/middleware/authentication/password.rb
133
136
  - lib/sfdc/middleware/authentication/token.rb
@@ -143,6 +146,7 @@ files:
143
146
  - lib/sfdc/middleware.rb
144
147
  - lib/sfdc/signed_request.rb
145
148
  - lib/sfdc/sobject.rb
149
+ - lib/sfdc/tooling/client.rb
146
150
  - lib/sfdc/upload_io.rb
147
151
  - lib/sfdc/version.rb
148
152
  - lib/sfdc.rb
@@ -1,12 +0,0 @@
1
- module Sfdc
2
- class Client
3
- module Canvas
4
-
5
- def decode_signed_request(signed_request)
6
- raise 'client_secret not set' unless @options[:client_secret]
7
- SignedRequest.decode(signed_request, @options[:client_secret])
8
- end
9
-
10
- end
11
- end
12
- end