restforce 1.5.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of restforce might be problematic. Click here for more details.

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +60 -0
  3. data/.rubocop_todo.yml +117 -0
  4. data/.travis.yml +3 -5
  5. data/CHANGELOG.md +6 -0
  6. data/README.md +2 -0
  7. data/Rakefile +1 -1
  8. data/lib/restforce/abstract_client.rb +1 -1
  9. data/lib/restforce/attachment.rb +1 -3
  10. data/lib/restforce/concerns/api.rb +22 -17
  11. data/lib/restforce/concerns/authentication.rb +4 -3
  12. data/lib/restforce/concerns/base.rb +42 -31
  13. data/lib/restforce/concerns/caching.rb +1 -3
  14. data/lib/restforce/concerns/canvas.rb +0 -2
  15. data/lib/restforce/concerns/connection.rb +18 -12
  16. data/lib/restforce/concerns/picklists.rb +10 -10
  17. data/lib/restforce/concerns/streaming.rb +9 -4
  18. data/lib/restforce/concerns/verbs.rb +0 -2
  19. data/lib/restforce/config.rb +19 -13
  20. data/lib/restforce/data/client.rb +8 -1
  21. data/lib/restforce/mash.rb +6 -10
  22. data/lib/restforce/middleware.rb +3 -1
  23. data/lib/restforce/middleware/authentication.rb +21 -7
  24. data/lib/restforce/middleware/authentication/password.rb +5 -9
  25. data/lib/restforce/middleware/authentication/token.rb +4 -8
  26. data/lib/restforce/middleware/authorization.rb +0 -3
  27. data/lib/restforce/middleware/caching.rb +4 -4
  28. data/lib/restforce/middleware/instance_url.rb +3 -5
  29. data/lib/restforce/middleware/logger.rb +7 -7
  30. data/lib/restforce/middleware/mashify.rb +2 -3
  31. data/lib/restforce/middleware/multipart.rb +15 -8
  32. data/lib/restforce/middleware/raise_error.rb +2 -1
  33. data/lib/restforce/patches/parts.rb +2 -3
  34. data/lib/restforce/signed_request.rb +2 -2
  35. data/lib/restforce/sobject.rb +1 -3
  36. data/lib/restforce/tooling/client.rb +1 -3
  37. data/lib/restforce/upload_io.rb +1 -3
  38. data/lib/restforce/version.rb +1 -1
  39. data/restforce.gemspec +7 -4
  40. data/spec/integration/abstract_client_spec.rb +123 -75
  41. data/spec/integration/data/client_spec.rb +24 -12
  42. data/spec/spec_helper.rb +2 -2
  43. data/spec/support/client_integration.rb +23 -17
  44. data/spec/support/concerns.rb +2 -2
  45. data/spec/support/event_machine.rb +3 -3
  46. data/spec/support/fixture_helpers.rb +16 -12
  47. data/spec/support/middleware.rb +16 -8
  48. data/spec/unit/abstract_client_spec.rb +1 -1
  49. data/spec/unit/attachment_spec.rb +2 -1
  50. data/spec/unit/collection_spec.rb +13 -4
  51. data/spec/unit/concerns/api_spec.rb +15 -13
  52. data/spec/unit/concerns/authentication_spec.rb +20 -17
  53. data/spec/unit/concerns/base_spec.rb +2 -2
  54. data/spec/unit/concerns/caching_spec.rb +2 -2
  55. data/spec/unit/concerns/canvas_spec.rb +3 -3
  56. data/spec/unit/concerns/connection_spec.rb +6 -7
  57. data/spec/unit/concerns/streaming_spec.rb +8 -8
  58. data/spec/unit/config_spec.rb +6 -6
  59. data/spec/unit/data/client_spec.rb +1 -1
  60. data/spec/unit/mash_spec.rb +1 -1
  61. data/spec/unit/middleware/authentication/password_spec.rb +14 -12
  62. data/spec/unit/middleware/authentication/token_spec.rb +12 -10
  63. data/spec/unit/middleware/authentication_spec.rb +15 -11
  64. data/spec/unit/middleware/authorization_spec.rb +1 -1
  65. data/spec/unit/middleware/gzip_spec.rb +1 -1
  66. data/spec/unit/middleware/instance_url_spec.rb +2 -2
  67. data/spec/unit/middleware/mashify_spec.rb +2 -2
  68. data/spec/unit/middleware/raise_error_spec.rb +23 -7
  69. data/spec/unit/sobject_spec.rb +16 -9
  70. data/spec/unit/tooling/client_spec.rb +1 -1
  71. metadata +23 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cea59c76c61a80f9b37c19dd5fcf0dc65724c706
4
- data.tar.gz: 803df3bf79c4f7852dd1b1f604ec394981675ac6
3
+ metadata.gz: b5ecae4e8e7e8b52ae216ad1b0505000eebb2a4f
4
+ data.tar.gz: 27125a8223a2bf25ec80cc0dff6020021a8f0505
5
5
  SHA512:
6
- metadata.gz: dc604478ae597a50c0f7ca90236df153a3065f3adca8527012f28e2904e71e0ccda68adedb372e88f183598d99054776cc4e7d5ba5823af200d77bb1fbf3526b
7
- data.tar.gz: 5b4fb8dff7ea15b51cb6a6e64d7e3d60985eaa46e2fdf7054725c1c3790faaacbdec056757083a47461462a3b0d6362811725dd019e767932d187c70728fc4d1
6
+ metadata.gz: c829bf4711eadbadcb26b5db972a4ecc71d08181e124e64dfaf3663713f0e74d1490eee4617d71d3c29827e2c943319eb2ab5a0b0c26ed4f314ebfcc5cec748f
7
+ data.tar.gz: 90292fda7e4053b90f6de1a4d73ac1df40fa9f4867765fb6082e326de314e27577c1079920f1a04d547dbf1b4f4c9562e695210b842ed3ad294ef8aef131dd2f
@@ -0,0 +1,60 @@
1
+ # For all options see https://github.com/bbatsov/rubocop/tree/master/config
2
+
3
+ inherit_from: .rubocop_todo.yml
4
+
5
+ AllCops:
6
+ RunRailsCops: false
7
+ Include:
8
+ - Rakefile
9
+ Exclude:
10
+ - .*/**/*
11
+
12
+ # Limit lines to 80 characters.
13
+ LineLength:
14
+ Max: 90
15
+
16
+ ClassLength:
17
+ Enabled: false
18
+
19
+ ModuleLength:
20
+ Enabled: false
21
+
22
+ # Avoid methods longer than 30 lines of code
23
+ MethodLength:
24
+ CountComments: false # count full line comments?
25
+ Max: 87
26
+
27
+ # Avoid single-line methods.
28
+ SingleLineMethods:
29
+ AllowIfMethodIsEmpty: true
30
+
31
+ StringLiterals:
32
+ Enabled: false
33
+
34
+ GlobalVars:
35
+ Enabled: false # We use them Redis + StatsD (though maybe we shouldn't?)
36
+
37
+ # Wants underscores in all large numbers. Pain in the ass for things like
38
+ # unix timestamps.
39
+ NumericLiterals:
40
+ Enabled: false
41
+
42
+ # Wants you to use the same argument names for every reduce. This seems kinda
43
+ # naff compared to naming them semantically
44
+ SingleLineBlockParams:
45
+ Enabled: false
46
+
47
+ Style/SignalException:
48
+ EnforcedStyle: 'only_raise'
49
+
50
+ # Use trailing rather than leading dots on multi-line call chains
51
+ Style/DotPosition:
52
+ EnforcedStyle: trailing
53
+
54
+ # Allow non-ASCII characters (e.g. £) in comments
55
+ Style/AsciiComments:
56
+ Enabled: false
57
+
58
+ # Allow method names beginning with capital letters to match Salesforce conventions
59
+ Style/MethodName:
60
+ Enabled: false
@@ -0,0 +1,117 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2015-06-06 22:47:07 +0100 using RuboCop version 0.32.0.
3
+ # The point is for the user to remove these configuration records
4
+ # one by one as the offenses are removed from the code base.
5
+ # Note that changes in the inspected code, or installation of new
6
+ # versions of RuboCop, may require this file to be generated again.
7
+
8
+ # Offense count: 50
9
+ # Cop supports --auto-correct.
10
+ Lint/UnusedBlockArgument:
11
+ Enabled: false
12
+
13
+ # Offense count: 187
14
+ Metrics/AbcSize:
15
+ Max: 61
16
+
17
+ # Offense count: 26
18
+ Metrics/CyclomaticComplexity:
19
+ Max: 10
20
+
21
+ # Offense count: 11
22
+ Metrics/PerceivedComplexity:
23
+ Max: 10
24
+
25
+ # Offense count: 12
26
+ Style/AccessorMethodName:
27
+ Enabled: false
28
+
29
+ # Offense count: 164
30
+ # Cop supports --auto-correct.
31
+ # Configuration parameters: EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle, SupportedLastArgumentHashStyles.
32
+ Style/AlignHash:
33
+ Enabled: false
34
+
35
+ # Offense count: 3
36
+ # Cop supports --auto-correct.
37
+ # Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
38
+ Style/BlockDelimiters:
39
+ Enabled: false
40
+
41
+ # Offense count: 128
42
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
43
+ Style/ClassAndModuleChildren:
44
+ Enabled: false
45
+
46
+ # Offense count: 21
47
+ # Cop supports --auto-correct.
48
+ Style/ClosingParenthesisIndentation:
49
+ Enabled: false
50
+
51
+ # Offense count: 13
52
+ # Cop supports --auto-correct.
53
+ # Configuration parameters: Keywords.
54
+ Style/CommentAnnotation:
55
+ Enabled: false
56
+
57
+ # Offense count: 743
58
+ Style/Documentation:
59
+ Enabled: false
60
+
61
+ # Offense count: 9
62
+ Style/DoubleNegation:
63
+ Enabled: false
64
+
65
+ # Offense count: 109
66
+ # Configuration parameters: MinBodyLength.
67
+ Style/GuardClause:
68
+ Enabled: false
69
+
70
+ # Offense count: 48
71
+ # Cop supports --auto-correct.
72
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
73
+ Style/IndentHash:
74
+ Enabled: false
75
+
76
+ # Offense count: 70
77
+ # Cop supports --auto-correct.
78
+ Style/Lambda:
79
+ Enabled: false
80
+
81
+ # Offense count: 577
82
+ # Cop supports --auto-correct.
83
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
84
+ Style/MultilineOperationIndentation:
85
+ Enabled: false
86
+
87
+ # Offense count: 21
88
+ # Configuration parameters: NamePrefix, NamePrefixBlacklist.
89
+ Style/PredicateName:
90
+ Enabled: false
91
+
92
+ # Offense count: 4
93
+ # Cop supports --auto-correct.
94
+ Style/Proc:
95
+ Enabled: false
96
+
97
+ # Offense count: 173
98
+ # Cop supports --auto-correct.
99
+ Style/RedundantSelf:
100
+ Enabled: false
101
+
102
+ # Offense count: 28
103
+ # Cop supports --auto-correct.
104
+ Style/SingleSpaceBeforeFirstArg:
105
+ Enabled: false
106
+
107
+ # Offense count: 3
108
+ # Cop supports --auto-correct.
109
+ # Configuration parameters: MultiSpaceAllowedForOperators.
110
+ Style/SpaceAroundOperators:
111
+ Enabled: false
112
+
113
+ # Offense count: 5
114
+ # Cop supports --auto-correct.
115
+ # Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, IgnoreClassMethods, Whitelist.
116
+ Style/TrivialAccessors:
117
+ Enabled: false
@@ -1,14 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
- - 1.9.2
5
3
  - 1.9.3
6
4
  - 2.0.0
7
5
  - 2.1.2
8
- - jruby-18mode
6
+ - 2.2.0
9
7
  - jruby-19mode
10
- - ree
11
8
  - rbx-2
12
9
  gemfile:
13
10
  - Gemfile.travis
14
- script: bundle exec rake
11
+ script:
12
+ - bundle exec rubocop
@@ -1,3 +1,9 @@
1
+ ## 2.0.0 (Jun 27, 2015)
2
+
3
+ * Drop support for versions of Ruby earlier than 1.9.3, which were [end-of-lifed](https://www.ruby-lang.org/en/news/2014/07/01/eol-for-1-8-7-and-1-9-2/) long ago
4
+ * Take advantages of Ruby 1.9.3 syntax, and drop old Ruby 1.8 shims
5
+ * Enforce code style with [Rubocop](https://github.com/bbatsov/rubocop)
6
+
1
7
  ## 1.5.3 (Jun 26, 2015)
2
8
 
3
9
  * Fixed a bug with `update!` and `upsert!` mutating provided attributes (@timrogers)
data/README.md CHANGED
@@ -35,6 +35,8 @@ Or install it yourself as:
35
35
 
36
36
  $ gem install restforce
37
37
 
38
+ __As of [version 2.0.0](https://github.com/ejholmes/restforce/blob/master/CHANGELOG.md#200-jun-27-2015), this gem is only compatible with Ruby 1.9.3 and later.__ To use Ruby 1.9.2 and below, you'll need to manually specify that you wish to use version 1.5.3.
39
+
38
40
  ## Usage
39
41
 
40
42
  Restforce is designed with flexibility and ease of use in mind. By default, all API calls will
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
3
 
4
- task :default => [:spec]
4
+ task default: [:spec]
5
5
 
6
6
  require 'rspec/core/rake_task'
7
7
  desc "Run specs"
@@ -6,4 +6,4 @@ module Restforce
6
6
  include Restforce::Concerns::Caching
7
7
  include Restforce::Concerns::API
8
8
  end
9
- end
9
+ end
@@ -1,6 +1,5 @@
1
1
  module Restforce
2
2
  class Attachment < Restforce::SObject
3
-
4
3
  # Public: Returns the body of the attachment.
5
4
  #
6
5
  # Examples
@@ -12,12 +11,11 @@ module Restforce
12
11
  @client.get(super).body
13
12
  end
14
13
 
15
- private
14
+ private
16
15
 
17
16
  def ensure_body
18
17
  return true if self.Body?
19
18
  raise 'You need to query the Body for the record first.'
20
19
  end
21
-
22
20
  end
23
21
  end
@@ -72,7 +72,7 @@ module Restforce
72
72
  # Returns the Hash representation of the describe call.
73
73
  def describe(sobject = nil)
74
74
  if sobject
75
- api_get("sobjects/#{sobject.to_s}/describe").body
75
+ api_get("sobjects/#{sobject}/describe").body
76
76
  else
77
77
  api_get('sobjects').body['sobjects']
78
78
  end
@@ -96,9 +96,9 @@ module Restforce
96
96
  # Returns the Hash representation of the describe_layouts result
97
97
  def describe_layouts(sobject, layout_id = nil)
98
98
  if layout_id
99
- api_get("sobjects/#{sobject.to_s}/describe/layouts/#{layout_id}").body
99
+ api_get("sobjects/#{sobject}/describe/layouts/#{layout_id}").body
100
100
  else
101
- api_get("sobjects/#{sobject.to_s}/describe/layouts").body
101
+ api_get("sobjects/#{sobject}/describe/layouts").body
102
102
  end
103
103
  end
104
104
 
@@ -125,9 +125,10 @@ module Restforce
125
125
  # # => ['Foo Bar Inc.', 'Whizbang Corp']
126
126
  #
127
127
  # Returns a Restforce::Collection if Restforce.configuration.mashify is true.
128
- # Returns an Array of Hash for each record in the result if Restforce.configuration.mashify is false.
128
+ # Returns an Array of Hash for each record in the result if
129
+ # Restforce.configuration.mashify is false.
129
130
  def query(soql)
130
- response = api_get 'query', :q => soql
131
+ response = api_get 'query', q: soql
131
132
  mashify? ? response.body : response.body['records']
132
133
  end
133
134
 
@@ -146,9 +147,10 @@ module Restforce
146
147
  # # => ['GenePoint']
147
148
  #
148
149
  # Returns a Restforce::Collection if Restforce.configuration.mashify is true.
149
- # Returns an Array of Hash for each record in the result if Restforce.configuration.mashify is false.
150
+ # Returns an Array of Hash for each record in the result if
151
+ # Restforce.configuration.mashify is false.
150
152
  def search(sosl)
151
- api_get('search', :q => sosl).body
153
+ api_get('search', q: sosl).body
152
154
  end
153
155
 
154
156
  # Public: Insert a new record.
@@ -262,9 +264,13 @@ module Restforce
262
264
  # Returns the Id of the newly created record if the record was created.
263
265
  # Raises an exception if an error is returned from Salesforce.
264
266
  def upsert!(sobject, field, attrs)
265
- external_id = attrs.fetch(attrs.keys.find { |k, v| k.to_s.downcase == field.to_s.downcase }, nil)
266
- attrs_without_field = attrs.reject { |k, v| k.to_s.downcase == field.to_s.downcase }
267
- response = api_patch "sobjects/#{sobject}/#{field.to_s}/#{external_id}", attrs_without_field
267
+ external_id = attrs.
268
+ fetch(attrs.keys.find { |k, v| k.to_s.downcase == field.to_s.downcase }, nil)
269
+ attrs_without_field = attrs.
270
+ reject { |k, v| k.to_s.downcase == field.to_s.downcase }
271
+ response = api_patch "sobjects/#{sobject}/#{field}/#{external_id}",
272
+ attrs_without_field
273
+
268
274
  (response.body && response.body['id']) ? response.body['id'] : true
269
275
  end
270
276
 
@@ -311,8 +317,9 @@ module Restforce
311
317
  # field - External ID field to use (default: nil).
312
318
  #
313
319
  # Returns the Restforce::SObject sobject record.
314
- def find(sobject, id, field=nil)
315
- api_get(field ? "sobjects/#{sobject}/#{field}/#{id}" : "sobjects/#{sobject}/#{id}").body
320
+ def find(sobject, id, field = nil)
321
+ url = field ? "sobjects/#{sobject}/#{field}/#{id}" : "sobjects/#{sobject}/#{id}"
322
+ api_get(url).body
316
323
  end
317
324
 
318
325
  # Public: Finds a single record and returns select fields.
@@ -324,15 +331,14 @@ module Restforce
324
331
  # is passed, all fields are selected.
325
332
  # field - External ID field to use (default: nil).
326
333
  #
327
- def select(sobject, id, select, field=nil)
334
+ def select(sobject, id, select, field = nil)
328
335
  path = field ? "sobjects/#{sobject}/#{field}/#{id}" : "sobjects/#{sobject}/#{id}"
329
- path << "?fields=#{select.join(",")}" if select && select.any?
336
+ path << "?fields=#{select.join(',')}" if select && select.any?
330
337
 
331
338
  api_get(path).body
332
339
  end
333
340
 
334
-
335
- private
341
+ private
336
342
 
337
343
  # Internal: Returns a path to an api endpoint
338
344
  #
@@ -348,7 +354,6 @@ module Restforce
348
354
  def exceptions
349
355
  [Faraday::Error::ClientError]
350
356
  end
351
-
352
357
  end
353
358
  end
354
359
  end
@@ -1,10 +1,12 @@
1
1
  module Restforce
2
2
  module Concerns
3
3
  module Authentication
4
-
5
4
  # Public: Force an authentication
6
5
  def authenticate!
7
- raise AuthenticationError, 'No authentication middleware present' unless authentication_middleware
6
+ unless authentication_middleware
7
+ raise AuthenticationError, 'No authentication middleware present'
8
+ end
9
+
8
10
  middleware = authentication_middleware.new nil, self, options
9
11
  middleware.authenticate!
10
12
  end
@@ -34,7 +36,6 @@ module Restforce
34
36
  options[:client_id] &&
35
37
  options[:client_secret]
36
38
  end
37
-
38
39
  end
39
40
  end
40
41
  end
@@ -1,50 +1,62 @@
1
1
  module Restforce
2
2
  module Concerns
3
3
  module Base
4
-
5
4
  attr_reader :options
6
5
 
7
6
  # Public: Creates a new client instance
8
7
  #
9
8
  # 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).
9
+ # :username - The String username to use (required for
10
+ # password authentication).
11
+ # :password - The String password to use (required for
12
+ # password authentication).
13
+ # :security_token - The String security token to use (required for
14
+ # password authentication).
13
15
  #
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).
16
+ # :oauth_token - The String oauth access token to authenticate
17
+ # API calls (required unless password
18
+ # authentication is used).
19
+ # :refresh_token - The String refresh token to obtain fresh
20
+ # OAuth access tokens (required if oauth
21
+ # authentication is used).
22
+ # :instance_url - The String base url for all api requests
23
+ # (required if oauth authentication is used).
22
24
  #
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.
25
+ # :client_id - The oauth client id to use. Needed for both
26
+ # password and oauth authentication
27
+ # :client_secret - The oauth client secret to use.
26
28
  #
27
- # :host - The String hostname to use during
28
- # authentication requests (default: 'login.salesforce.com').
29
+ # :host - The String hostname to use during
30
+ # authentication requests
31
+ # (default: 'login.salesforce.com').
29
32
  #
30
- # :api_version - The String REST api version to use (default: '24.0')
33
+ # :api_version - The String REST api version to use
34
+ # (default: '24.0')
31
35
  #
32
- # :authentication_retries - The number of times that client
33
- # should attempt to reauthenticate
34
- # before raising an exception (default: 3).
36
+ # :authentication_retries - The number of times that client
37
+ # should attempt to reauthenticate
38
+ # before raising an exception (default: 3).
35
39
  #
36
- # :compress - Set to true to have Salesforce compress the response (default: false).
37
- # :mashify - Set to false to skip the conversion of Salesforce responses to
38
- # Restforce::Sobjects and Restforce::Collections. (default: nil).
39
- # :timeout - Faraday connection request read/open timeout. (default: nil).
40
+ # :compress - Set to true to have Salesforce compress the
41
+ # response (default: false).
42
+ # :mashify - Set to false to skip the conversion of
43
+ # Salesforce responses to Restforce::Sobjects and
44
+ # Restforce::Collections. (default: nil).
45
+ # :timeout - Faraday connection request read/open timeout.
46
+ # (default: nil).
40
47
  #
41
- # :proxy_uri - Proxy URI: 'http://proxy.example.com:port' or 'http://user@pass:proxy.example.com:port'
48
+ # :proxy_uri - Proxy URI: 'http://proxy.example.com:port' or
49
+ # 'http://user@pass:proxy.example.com:port'
42
50
  #
43
- # :authentication_callback
44
- # - A Proc that is called with the response body after a successful authentication.
51
+ # :authentication_callback - A Proc that is called with the response body
52
+ # after a successful authentication.
45
53
  def initialize(opts = {})
46
54
  raise ArgumentError, 'Please specify a hash of options' unless opts.is_a?(Hash)
47
- @options = Hash[Restforce.configuration.options.map { |option| [option, Restforce.configuration.send(option)] }]
55
+
56
+ @options = Hash[Restforce.configuration.options.map do |option|
57
+ [option, Restforce.configuration.send(option)]
58
+ end]
59
+
48
60
  @options.merge! opts
49
61
  yield builder if block_given?
50
62
  end
@@ -57,7 +69,6 @@ module Restforce
57
69
  def inspect
58
70
  "#<#{self.class} @options=#{@options.inspect}>"
59
71
  end
60
-
61
72
  end
62
73
  end
63
- end
74
+ end