smartsheet 2.77.0 → 2.77.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +12 -12
- data/.rubocop.yml +4 -4
- data/.travis.yml +26 -15
- data/.yardopts +3 -3
- data/ADVANCED.md +78 -78
- data/CHANGELOG.md +115 -112
- data/Gemfile +6 -6
- data/LICENSE +202 -202
- data/README.md +246 -246
- data/Rakefile +29 -29
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/lib/smartsheet.rb +2 -2
- data/lib/smartsheet/api/body_builder.rb +25 -25
- data/lib/smartsheet/api/endpoint_spec.rb +54 -54
- data/lib/smartsheet/api/faraday_adapter/faraday_net_client.rb +45 -45
- data/lib/smartsheet/api/faraday_adapter/faraday_response.rb +70 -70
- data/lib/smartsheet/api/faraday_adapter/middleware/faraday_error_translator.rb +20 -20
- data/lib/smartsheet/api/faraday_adapter/middleware/response_parser.rb +25 -25
- data/lib/smartsheet/api/file_spec.rb +55 -55
- data/lib/smartsheet/api/header_builder.rb +96 -96
- data/lib/smartsheet/api/request.rb +42 -42
- data/lib/smartsheet/api/request_client.rb +43 -43
- data/lib/smartsheet/api/request_logger.rb +182 -182
- data/lib/smartsheet/api/request_spec.rb +57 -57
- data/lib/smartsheet/api/response_net_client_decorator.rb +54 -54
- data/lib/smartsheet/api/retry_logic.rb +40 -40
- data/lib/smartsheet/api/retry_net_client_decorator.rb +37 -37
- data/lib/smartsheet/api/url_builder.rb +25 -25
- data/lib/smartsheet/client.rb +193 -193
- data/lib/smartsheet/constants.rb +18 -18
- data/lib/smartsheet/endpoints/contacts/contacts.rb +30 -30
- data/lib/smartsheet/endpoints/events/events.rb +20 -20
- data/lib/smartsheet/endpoints/favorites/favorites.rb +159 -159
- data/lib/smartsheet/endpoints/folders/folders.rb +125 -125
- data/lib/smartsheet/endpoints/groups/groups.rb +83 -83
- data/lib/smartsheet/endpoints/home/home.rb +20 -20
- data/lib/smartsheet/endpoints/reports/reports.rb +100 -100
- data/lib/smartsheet/endpoints/reports/reports_share.rb +69 -69
- data/lib/smartsheet/endpoints/search/search.rb +30 -30
- data/lib/smartsheet/endpoints/server_info/server_info.rb +21 -21
- data/lib/smartsheet/endpoints/share/share.rb +58 -58
- data/lib/smartsheet/endpoints/sheets/automation_rules.rb +55 -55
- data/lib/smartsheet/endpoints/sheets/cells.rb +82 -82
- data/lib/smartsheet/endpoints/sheets/columns.rb +66 -66
- data/lib/smartsheet/endpoints/sheets/comments.rb +64 -64
- data/lib/smartsheet/endpoints/sheets/comments_attachments.rb +78 -78
- data/lib/smartsheet/endpoints/sheets/cross_sheet_references.rb +45 -45
- data/lib/smartsheet/endpoints/sheets/discussions.rb +84 -84
- data/lib/smartsheet/endpoints/sheets/discussions_attachments.rb +22 -22
- data/lib/smartsheet/endpoints/sheets/rows.rb +106 -106
- data/lib/smartsheet/endpoints/sheets/rows_attachments.rb +92 -92
- data/lib/smartsheet/endpoints/sheets/sheets.rb +510 -510
- data/lib/smartsheet/endpoints/sheets/sheets_attachments.rb +174 -174
- data/lib/smartsheet/endpoints/sheets/sheets_share.rb +69 -69
- data/lib/smartsheet/endpoints/sights/sights.rb +101 -101
- data/lib/smartsheet/endpoints/sights/sights_share.rb +69 -69
- data/lib/smartsheet/endpoints/templates/templates.rb +29 -29
- data/lib/smartsheet/endpoints/token/token.rb +65 -65
- data/lib/smartsheet/endpoints/update_requests/sent_update_requests.rb +44 -44
- data/lib/smartsheet/endpoints/update_requests/update_requests.rb +74 -74
- data/lib/smartsheet/endpoints/users/alternate_emails.rb +79 -79
- data/lib/smartsheet/endpoints/users/users.rb +77 -77
- data/lib/smartsheet/endpoints/webhooks/webhooks.rb +71 -71
- data/lib/smartsheet/endpoints/workspaces/workspaces.rb +87 -87
- data/lib/smartsheet/endpoints/workspaces/workspaces_share.rb +70 -70
- data/lib/smartsheet/error.rb +69 -69
- data/lib/smartsheet/general_request.rb +74 -74
- data/lib/smartsheet/version.rb +5 -5
- data/smartsheet.gemspec +54 -54
- metadata +3 -4
@@ -1,57 +1,57 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'awrence'
|
3
|
-
|
4
|
-
module Smartsheet
|
5
|
-
module API
|
6
|
-
# Specification for a single API request's arguments
|
7
|
-
class RequestSpec
|
8
|
-
attr_reader :file_spec, :url_args, :params, :header_overrides, :body
|
9
|
-
private :file_spec
|
10
|
-
|
11
|
-
# @param params [Hash{Object=>Object}] URL parameters for the request
|
12
|
-
#
|
13
|
-
# @param header_overrides [Hash{Object=>Object}] HTTP headers to sent in the request; these
|
14
|
-
# override all default headers sent by the SDK and the particular endpoint
|
15
|
-
#
|
16
|
-
# @param body [Object] The body of the HTTP request, to be interpreted based on the endpoint
|
17
|
-
# specification
|
18
|
-
#
|
19
|
-
# @param file_spec [PathFileSpec, ObjectFileSpec] Specification for files, to be used when
|
20
|
-
# an endpoint requires a file upload
|
21
|
-
#
|
22
|
-
# @param **url_args [Hash{Symbol=>Object}] Values that will be used to fill in parameterized
|
23
|
-
# segments of an endpoint path specificaiton
|
24
|
-
def initialize(params: {}, header_overrides: {}, body: nil, file_spec: nil, **url_args)
|
25
|
-
@url_args = url_args
|
26
|
-
@params = params
|
27
|
-
@header_overrides = header_overrides
|
28
|
-
@body = body
|
29
|
-
@file_spec = file_spec
|
30
|
-
end
|
31
|
-
|
32
|
-
def filename
|
33
|
-
file_spec.filename
|
34
|
-
end
|
35
|
-
|
36
|
-
def content_type
|
37
|
-
file_spec.content_type
|
38
|
-
end
|
39
|
-
|
40
|
-
def file_length
|
41
|
-
file_spec.file_length
|
42
|
-
end
|
43
|
-
|
44
|
-
def json_body
|
45
|
-
if body.nil? || body.is_a?(String)
|
46
|
-
body
|
47
|
-
else
|
48
|
-
body.to_camelback_keys.to_json
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def file_body
|
53
|
-
file_spec.upload_io
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
1
|
+
require 'json'
|
2
|
+
require 'awrence'
|
3
|
+
|
4
|
+
module Smartsheet
|
5
|
+
module API
|
6
|
+
# Specification for a single API request's arguments
|
7
|
+
class RequestSpec
|
8
|
+
attr_reader :file_spec, :url_args, :params, :header_overrides, :body
|
9
|
+
private :file_spec
|
10
|
+
|
11
|
+
# @param params [Hash{Object=>Object}] URL parameters for the request
|
12
|
+
#
|
13
|
+
# @param header_overrides [Hash{Object=>Object}] HTTP headers to sent in the request; these
|
14
|
+
# override all default headers sent by the SDK and the particular endpoint
|
15
|
+
#
|
16
|
+
# @param body [Object] The body of the HTTP request, to be interpreted based on the endpoint
|
17
|
+
# specification
|
18
|
+
#
|
19
|
+
# @param file_spec [PathFileSpec, ObjectFileSpec] Specification for files, to be used when
|
20
|
+
# an endpoint requires a file upload
|
21
|
+
#
|
22
|
+
# @param **url_args [Hash{Symbol=>Object}] Values that will be used to fill in parameterized
|
23
|
+
# segments of an endpoint path specificaiton
|
24
|
+
def initialize(params: {}, header_overrides: {}, body: nil, file_spec: nil, **url_args)
|
25
|
+
@url_args = url_args
|
26
|
+
@params = params
|
27
|
+
@header_overrides = header_overrides
|
28
|
+
@body = body
|
29
|
+
@file_spec = file_spec
|
30
|
+
end
|
31
|
+
|
32
|
+
def filename
|
33
|
+
file_spec.filename
|
34
|
+
end
|
35
|
+
|
36
|
+
def content_type
|
37
|
+
file_spec.content_type
|
38
|
+
end
|
39
|
+
|
40
|
+
def file_length
|
41
|
+
file_spec.file_length
|
42
|
+
end
|
43
|
+
|
44
|
+
def json_body
|
45
|
+
if body.nil? || body.is_a?(String)
|
46
|
+
body
|
47
|
+
else
|
48
|
+
body.to_camelback_keys.to_json
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def file_body
|
53
|
+
file_spec.upload_io
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,55 +1,55 @@
|
|
1
|
-
require 'plissken'
|
2
|
-
|
3
|
-
require 'smartsheet/error'
|
4
|
-
|
5
|
-
module Smartsheet
|
6
|
-
module API
|
7
|
-
# Passes requests to the decorated client, and parses responses into expected result types
|
8
|
-
class ResponseNetClientDecorator
|
9
|
-
def initialize(client, json_output: false, logger: MuteRequestLogger.new)
|
10
|
-
@json_output = json_output
|
11
|
-
@client = client
|
12
|
-
@logger = logger
|
13
|
-
end
|
14
|
-
|
15
|
-
def make_request(request)
|
16
|
-
response = begin
|
17
|
-
client.make_request(request)
|
18
|
-
rescue Smartsheet::HttpResponseError => e
|
19
|
-
logger.log_http_error_response(request, e)
|
20
|
-
raise e
|
21
|
-
end
|
22
|
-
|
23
|
-
parse(request, response)
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
attr_reader :json_output, :client, :logger
|
29
|
-
|
30
|
-
def parse(request, response)
|
31
|
-
if response.success?
|
32
|
-
logger.log_successful_response(response)
|
33
|
-
parse_success(response)
|
34
|
-
else
|
35
|
-
logger.log_api_error_response(request, response)
|
36
|
-
parse_failure(response)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def parse_success(response)
|
41
|
-
if json_output
|
42
|
-
response.result.to_json
|
43
|
-
elsif response.result.respond_to? :to_snake_keys
|
44
|
-
response.result.to_snake_keys
|
45
|
-
else
|
46
|
-
response.result
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def parse_failure(response)
|
51
|
-
raise Smartsheet::ApiError.new(response)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
1
|
+
require 'plissken'
|
2
|
+
|
3
|
+
require 'smartsheet/error'
|
4
|
+
|
5
|
+
module Smartsheet
|
6
|
+
module API
|
7
|
+
# Passes requests to the decorated client, and parses responses into expected result types
|
8
|
+
class ResponseNetClientDecorator
|
9
|
+
def initialize(client, json_output: false, logger: MuteRequestLogger.new)
|
10
|
+
@json_output = json_output
|
11
|
+
@client = client
|
12
|
+
@logger = logger
|
13
|
+
end
|
14
|
+
|
15
|
+
def make_request(request)
|
16
|
+
response = begin
|
17
|
+
client.make_request(request)
|
18
|
+
rescue Smartsheet::HttpResponseError => e
|
19
|
+
logger.log_http_error_response(request, e)
|
20
|
+
raise e
|
21
|
+
end
|
22
|
+
|
23
|
+
parse(request, response)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :json_output, :client, :logger
|
29
|
+
|
30
|
+
def parse(request, response)
|
31
|
+
if response.success?
|
32
|
+
logger.log_successful_response(response)
|
33
|
+
parse_success(response)
|
34
|
+
else
|
35
|
+
logger.log_api_error_response(request, response)
|
36
|
+
parse_failure(response)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse_success(response)
|
41
|
+
if json_output
|
42
|
+
response.result.to_json
|
43
|
+
elsif response.result.respond_to? :to_snake_keys
|
44
|
+
response.result.to_snake_keys
|
45
|
+
else
|
46
|
+
response.result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_failure(response)
|
51
|
+
raise Smartsheet::ApiError.new(response)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
55
|
end
|
@@ -1,40 +1,40 @@
|
|
1
|
-
require 'smartsheet/constants'
|
2
|
-
|
3
|
-
module Smartsheet
|
4
|
-
module API
|
5
|
-
# Accepts a callable proc and a predicate, calling the proc repeatedly with backoff until the
|
6
|
-
# provided time limit is reached, or until the predicate applied to the proc's result returns
|
7
|
-
# false.
|
8
|
-
class RetryLogic
|
9
|
-
include Smartsheet::Constants
|
10
|
-
|
11
|
-
def initialize(max_retry_time: DEFAULT_MAX_RETRY_TIME, backoff_method: DEFAULT_BACKOFF_METHOD)
|
12
|
-
@max_retry_time = max_retry_time
|
13
|
-
@backoff_method = backoff_method
|
14
|
-
end
|
15
|
-
|
16
|
-
def run(should_retry, &method_to_run)
|
17
|
-
end_time = Time.now.to_i + max_retry_time
|
18
|
-
|
19
|
-
_run(method_to_run, should_retry, end_time, 0)
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
attr_reader :backoff_method, :max_retry_time
|
25
|
-
|
26
|
-
def _run(method_to_run, should_retry, end_time, iteration)
|
27
|
-
result = method_to_run.call(iteration)
|
28
|
-
|
29
|
-
backoff = backoff_method.call(iteration, result)
|
30
|
-
|
31
|
-
if backoff == :stop || Time.now.to_i + backoff >= end_time || !should_retry.call(result)
|
32
|
-
return result
|
33
|
-
end
|
34
|
-
|
35
|
-
sleep backoff
|
36
|
-
_run(method_to_run, should_retry, end_time, iteration + 1)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
1
|
+
require 'smartsheet/constants'
|
2
|
+
|
3
|
+
module Smartsheet
|
4
|
+
module API
|
5
|
+
# Accepts a callable proc and a predicate, calling the proc repeatedly with backoff until the
|
6
|
+
# provided time limit is reached, or until the predicate applied to the proc's result returns
|
7
|
+
# false.
|
8
|
+
class RetryLogic
|
9
|
+
include Smartsheet::Constants
|
10
|
+
|
11
|
+
def initialize(max_retry_time: DEFAULT_MAX_RETRY_TIME, backoff_method: DEFAULT_BACKOFF_METHOD)
|
12
|
+
@max_retry_time = max_retry_time
|
13
|
+
@backoff_method = backoff_method
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(should_retry, &method_to_run)
|
17
|
+
end_time = Time.now.to_i + max_retry_time
|
18
|
+
|
19
|
+
_run(method_to_run, should_retry, end_time, 0)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :backoff_method, :max_retry_time
|
25
|
+
|
26
|
+
def _run(method_to_run, should_retry, end_time, iteration)
|
27
|
+
result = method_to_run.call(iteration)
|
28
|
+
|
29
|
+
backoff = backoff_method.call(iteration, result)
|
30
|
+
|
31
|
+
if backoff == :stop || Time.now.to_i + backoff >= end_time || !should_retry.call(result)
|
32
|
+
return result
|
33
|
+
end
|
34
|
+
|
35
|
+
sleep backoff
|
36
|
+
_run(method_to_run, should_retry, end_time, iteration + 1)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,38 +1,38 @@
|
|
1
|
-
require 'smartsheet/api/request_logger'
|
2
|
-
|
3
|
-
module Smartsheet
|
4
|
-
module API
|
5
|
-
# Passes requests to the decorated client, retrying the request based on the provided
|
6
|
-
# {RetryLogic} when retry-eligible errors arise
|
7
|
-
class RetryNetClientDecorator
|
8
|
-
SHOULD_RETRY = ->(response) { response.should_retry? }
|
9
|
-
|
10
|
-
attr_reader :client, :retrier, :logger
|
11
|
-
private :client, :retrier, :logger
|
12
|
-
|
13
|
-
def initialize(client, retrier, logger: MuteRequestLogger.new)
|
14
|
-
@client = client
|
15
|
-
@retrier = retrier
|
16
|
-
@logger = logger
|
17
|
-
end
|
18
|
-
|
19
|
-
def make_request(request)
|
20
|
-
total_attempts = 0
|
21
|
-
|
22
|
-
retried_response = retrier.run(SHOULD_RETRY) do |iteration|
|
23
|
-
response = client.make_request(request)
|
24
|
-
|
25
|
-
total_attempts = iteration + 1
|
26
|
-
logger.log_retry_attempt(request, response, total_attempts) if SHOULD_RETRY.call(response)
|
27
|
-
response
|
28
|
-
end
|
29
|
-
|
30
|
-
unless retried_response.success? || total_attempts < 2
|
31
|
-
logger.log_retry_failure(total_attempts)
|
32
|
-
end
|
33
|
-
|
34
|
-
retried_response
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
1
|
+
require 'smartsheet/api/request_logger'
|
2
|
+
|
3
|
+
module Smartsheet
|
4
|
+
module API
|
5
|
+
# Passes requests to the decorated client, retrying the request based on the provided
|
6
|
+
# {RetryLogic} when retry-eligible errors arise
|
7
|
+
class RetryNetClientDecorator
|
8
|
+
SHOULD_RETRY = ->(response) { response.should_retry? }
|
9
|
+
|
10
|
+
attr_reader :client, :retrier, :logger
|
11
|
+
private :client, :retrier, :logger
|
12
|
+
|
13
|
+
def initialize(client, retrier, logger: MuteRequestLogger.new)
|
14
|
+
@client = client
|
15
|
+
@retrier = retrier
|
16
|
+
@logger = logger
|
17
|
+
end
|
18
|
+
|
19
|
+
def make_request(request)
|
20
|
+
total_attempts = 0
|
21
|
+
|
22
|
+
retried_response = retrier.run(SHOULD_RETRY) do |iteration|
|
23
|
+
response = client.make_request(request)
|
24
|
+
|
25
|
+
total_attempts = iteration + 1
|
26
|
+
logger.log_retry_attempt(request, response, total_attempts) if SHOULD_RETRY.call(response)
|
27
|
+
response
|
28
|
+
end
|
29
|
+
|
30
|
+
unless retried_response.success? || total_attempts < 2
|
31
|
+
logger.log_retry_failure(total_attempts)
|
32
|
+
end
|
33
|
+
|
34
|
+
retried_response
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
38
|
end
|
@@ -1,25 +1,25 @@
|
|
1
|
-
require 'smartsheet/constants'
|
2
|
-
|
3
|
-
module Smartsheet
|
4
|
-
module API
|
5
|
-
# Constructs parameterized URLs for accessing the Smartsheet API
|
6
|
-
class UrlBuilder
|
7
|
-
def initialize(endpoint_spec, request_spec, base_url)
|
8
|
-
@segments = endpoint_spec.url_segments
|
9
|
-
@args = request_spec.url_args
|
10
|
-
@base_url = base_url
|
11
|
-
end
|
12
|
-
|
13
|
-
def build
|
14
|
-
segments
|
15
|
-
.collect { |seg| seg.is_a?(Symbol) ? args[seg] : seg }
|
16
|
-
.unshift(base_url)
|
17
|
-
.join('/')
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_accessor :segments, :args, :base_url
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
1
|
+
require 'smartsheet/constants'
|
2
|
+
|
3
|
+
module Smartsheet
|
4
|
+
module API
|
5
|
+
# Constructs parameterized URLs for accessing the Smartsheet API
|
6
|
+
class UrlBuilder
|
7
|
+
def initialize(endpoint_spec, request_spec, base_url)
|
8
|
+
@segments = endpoint_spec.url_segments
|
9
|
+
@args = request_spec.url_args
|
10
|
+
@base_url = base_url
|
11
|
+
end
|
12
|
+
|
13
|
+
def build
|
14
|
+
segments
|
15
|
+
.collect { |seg| seg.is_a?(Symbol) ? args[seg] : seg }
|
16
|
+
.unshift(base_url)
|
17
|
+
.join('/')
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_accessor :segments, :args, :base_url
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/smartsheet/client.rb
CHANGED
@@ -1,193 +1,193 @@
|
|
1
|
-
require 'smartsheet/api/faraday_adapter/faraday_net_client'
|
2
|
-
require 'smartsheet/api/retry_net_client_decorator'
|
3
|
-
require 'smartsheet/api/response_net_client_decorator'
|
4
|
-
require 'smartsheet/api/request_client'
|
5
|
-
require 'smartsheet/api/retry_logic'
|
6
|
-
require 'smartsheet/api/request_logger'
|
7
|
-
require 'smartsheet/general_request'
|
8
|
-
|
9
|
-
require 'smartsheet/endpoints/contacts/contacts'
|
10
|
-
require 'smartsheet/endpoints/events/events'
|
11
|
-
require 'smartsheet/endpoints/favorites/favorites'
|
12
|
-
require 'smartsheet/endpoints/folders/folders'
|
13
|
-
require 'smartsheet/endpoints/groups/groups'
|
14
|
-
require 'smartsheet/endpoints/home/home'
|
15
|
-
require 'smartsheet/endpoints/reports/reports'
|
16
|
-
require 'smartsheet/endpoints/search/search'
|
17
|
-
require 'smartsheet/endpoints/server_info/server_info'
|
18
|
-
require 'smartsheet/endpoints/sheets/sheets'
|
19
|
-
require 'smartsheet/endpoints/sights/sights'
|
20
|
-
require 'smartsheet/endpoints/templates/templates'
|
21
|
-
require 'smartsheet/endpoints/token/token'
|
22
|
-
require 'smartsheet/endpoints/update_requests/update_requests'
|
23
|
-
require 'smartsheet/endpoints/users/users'
|
24
|
-
require 'smartsheet/endpoints/webhooks/webhooks'
|
25
|
-
require 'smartsheet/endpoints/workspaces/workspaces'
|
26
|
-
|
27
|
-
|
28
|
-
module Smartsheet
|
29
|
-
# The entry point to the SDK. API endpoint categories are accessed through this object's readable
|
30
|
-
# attributes.
|
31
|
-
#
|
32
|
-
# @!attribute [r] contacts
|
33
|
-
# @return [Contacts]
|
34
|
-
# @!attribute [r] favorites
|
35
|
-
# @return [Favorites]
|
36
|
-
# @!attribute [r] folders
|
37
|
-
# @return [Folders]
|
38
|
-
# @!attribute [r] groups
|
39
|
-
# @return [Groups]
|
40
|
-
# @!attribute [r] home
|
41
|
-
# @return [Home]
|
42
|
-
# @!attribute [r] reports
|
43
|
-
# @return [Reports]
|
44
|
-
# @!attribute [r] search
|
45
|
-
# @return [Search]
|
46
|
-
# @!attribute [r] server_info
|
47
|
-
# @return [ServerInfo]
|
48
|
-
# @!attribute [r] sheets
|
49
|
-
# @return [Sheets]
|
50
|
-
# @!attribute [r] sights
|
51
|
-
# @return [Sights]
|
52
|
-
# @!attribute [r] templates
|
53
|
-
# @return [Templates]
|
54
|
-
# @!attribute [r] token
|
55
|
-
# @return [Token]
|
56
|
-
# @!attribute [r] update_requests
|
57
|
-
# @return [UpdateRequests]
|
58
|
-
# @!attribute [r] users
|
59
|
-
# @return [Users]
|
60
|
-
# @!attribute [r] webhooks
|
61
|
-
# @return [Webhooks]
|
62
|
-
# @!attribute [r] workspaces
|
63
|
-
# @return [Workspaces]
|
64
|
-
class Client
|
65
|
-
include GeneralRequest
|
66
|
-
include Smartsheet::Constants
|
67
|
-
|
68
|
-
attr_reader :contacts, :events, :favorites, :folders, :groups, :home, :reports, :search, :server_info,
|
69
|
-
:sheets, :sights, :templates, :token, :update_requests, :users, :webhooks,
|
70
|
-
:workspaces
|
71
|
-
|
72
|
-
# @param token [String] access token for the API; if nil or empty, uses environment variable
|
73
|
-
# `SMARTSHEET_ACCESS_TOKEN`
|
74
|
-
# @param logger [Logger] a logger to which request and response info will be recorded
|
75
|
-
# @param log_full_body [Boolean] when true, request and response bodies will not be truncated in
|
76
|
-
# the logs
|
77
|
-
# @param user_agent [String] the name of the application, sent as part of the user agent for
|
78
|
-
# requests; defaults as the name of the application
|
79
|
-
# @param json_output [Boolean] when true, endpoints return raw JSON strings instead of hashes
|
80
|
-
# @param assume_user [String] the email address of the user to impersonate; only available for
|
81
|
-
# admin roles
|
82
|
-
# @param max_retry_time [Fixnum] overrides the maximum number of seconds during which eligible
|
83
|
-
# errors will be retried
|
84
|
-
# @param backoff_method [Proc] overrides the backoff calculation method, accepting the index of
|
85
|
-
# the current retry attempt (0-based) and returning the number of seconds to wait before
|
86
|
-
# retrying the call again, or `:stop` to halt retrying and return the latest error.
|
87
|
-
#
|
88
|
-
# Example - Wait 1 second before the first retry, 2 seconds before
|
89
|
-
# the second, and so on:
|
90
|
-
# ```ruby
|
91
|
-
# ->(x){ x + 1 }
|
92
|
-
# ```
|
93
|
-
#
|
94
|
-
# Example - Try twice, then halt:
|
95
|
-
# ```ruby
|
96
|
-
# ->(x){ if x < 2 then x + 1 else :stop end }
|
97
|
-
# ```
|
98
|
-
# @param base_url [String] overrides the base URL used when constructing API calls; for example,
|
99
|
-
# the default takes the form of `https://api.smartsheet.com/2.0`
|
100
|
-
def initialize(
|
101
|
-
token: nil,
|
102
|
-
logger: nil,
|
103
|
-
log_full_body: false,
|
104
|
-
user_agent: nil,
|
105
|
-
json_output: false,
|
106
|
-
assume_user: nil,
|
107
|
-
max_retry_time: nil,
|
108
|
-
backoff_method: nil,
|
109
|
-
base_url: API_URL
|
110
|
-
)
|
111
|
-
|
112
|
-
request_logger =
|
113
|
-
logger ?
|
114
|
-
API::RequestLogger.new(logger, log_full_body: log_full_body) :
|
115
|
-
API::MuteRequestLogger.new
|
116
|
-
|
117
|
-
token = token_env_var if token.nil? || token.empty?
|
118
|
-
|
119
|
-
app_user_agent = user_agent.nil? ? File.basename($PROGRAM_NAME) : user_agent
|
120
|
-
|
121
|
-
net_client = API::FaradayNetClient.new
|
122
|
-
|
123
|
-
retry_logic = init_retry_logic(max_retry_time, backoff_method)
|
124
|
-
|
125
|
-
retrying_client = API::RetryNetClientDecorator.new(
|
126
|
-
net_client,
|
127
|
-
retry_logic,
|
128
|
-
logger: request_logger
|
129
|
-
)
|
130
|
-
|
131
|
-
response_client = API::ResponseNetClientDecorator.new(
|
132
|
-
retrying_client,
|
133
|
-
json_output: json_output,
|
134
|
-
logger: request_logger
|
135
|
-
)
|
136
|
-
|
137
|
-
@client = API::RequestClient.new(
|
138
|
-
token,
|
139
|
-
response_client,
|
140
|
-
base_url,
|
141
|
-
app_user_agent: app_user_agent,
|
142
|
-
assume_user: assume_user,
|
143
|
-
logger: request_logger
|
144
|
-
)
|
145
|
-
build_categories
|
146
|
-
end
|
147
|
-
|
148
|
-
def inspect
|
149
|
-
methods = (self.public_methods - Object.methods)
|
150
|
-
.sort
|
151
|
-
.map {|m| ':' + m.to_s}
|
152
|
-
.join(', ')
|
153
|
-
|
154
|
-
"#<Smartsheet::Client:#{self.object_id} #{methods}>"
|
155
|
-
end
|
156
|
-
|
157
|
-
private
|
158
|
-
|
159
|
-
attr_reader :client
|
160
|
-
|
161
|
-
def build_categories
|
162
|
-
@contacts = Contacts.new(client)
|
163
|
-
@events = Events.new(client)
|
164
|
-
@favorites = Favorites.new(client)
|
165
|
-
@folders = Folders.new(client)
|
166
|
-
@groups = Groups.new(client)
|
167
|
-
@home = Home.new(client)
|
168
|
-
@reports = Reports.new(client)
|
169
|
-
@search = Search.new(client)
|
170
|
-
@server_info = ServerInfo.new(client)
|
171
|
-
@sheets = Sheets.new(client)
|
172
|
-
@sights = Sights.new(client)
|
173
|
-
@token = Token.new(client)
|
174
|
-
@templates = Templates.new(client)
|
175
|
-
@update_requests = UpdateRequests.new(client)
|
176
|
-
@users = Users.new(client)
|
177
|
-
@webhooks = Webhooks.new(client)
|
178
|
-
@workspaces = Workspaces.new(client)
|
179
|
-
end
|
180
|
-
|
181
|
-
def init_retry_logic(max_retry_time, backoff_method)
|
182
|
-
retry_opts = {}
|
183
|
-
retry_opts[:max_retry_time] = max_retry_time unless max_retry_time.nil?
|
184
|
-
retry_opts[:backoff_method] = backoff_method unless backoff_method.nil?
|
185
|
-
|
186
|
-
API::RetryLogic.new(**retry_opts)
|
187
|
-
end
|
188
|
-
|
189
|
-
def token_env_var
|
190
|
-
ENV['SMARTSHEET_ACCESS_TOKEN']
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
1
|
+
require 'smartsheet/api/faraday_adapter/faraday_net_client'
|
2
|
+
require 'smartsheet/api/retry_net_client_decorator'
|
3
|
+
require 'smartsheet/api/response_net_client_decorator'
|
4
|
+
require 'smartsheet/api/request_client'
|
5
|
+
require 'smartsheet/api/retry_logic'
|
6
|
+
require 'smartsheet/api/request_logger'
|
7
|
+
require 'smartsheet/general_request'
|
8
|
+
|
9
|
+
require 'smartsheet/endpoints/contacts/contacts'
|
10
|
+
require 'smartsheet/endpoints/events/events'
|
11
|
+
require 'smartsheet/endpoints/favorites/favorites'
|
12
|
+
require 'smartsheet/endpoints/folders/folders'
|
13
|
+
require 'smartsheet/endpoints/groups/groups'
|
14
|
+
require 'smartsheet/endpoints/home/home'
|
15
|
+
require 'smartsheet/endpoints/reports/reports'
|
16
|
+
require 'smartsheet/endpoints/search/search'
|
17
|
+
require 'smartsheet/endpoints/server_info/server_info'
|
18
|
+
require 'smartsheet/endpoints/sheets/sheets'
|
19
|
+
require 'smartsheet/endpoints/sights/sights'
|
20
|
+
require 'smartsheet/endpoints/templates/templates'
|
21
|
+
require 'smartsheet/endpoints/token/token'
|
22
|
+
require 'smartsheet/endpoints/update_requests/update_requests'
|
23
|
+
require 'smartsheet/endpoints/users/users'
|
24
|
+
require 'smartsheet/endpoints/webhooks/webhooks'
|
25
|
+
require 'smartsheet/endpoints/workspaces/workspaces'
|
26
|
+
|
27
|
+
|
28
|
+
module Smartsheet
|
29
|
+
# The entry point to the SDK. API endpoint categories are accessed through this object's readable
|
30
|
+
# attributes.
|
31
|
+
#
|
32
|
+
# @!attribute [r] contacts
|
33
|
+
# @return [Contacts]
|
34
|
+
# @!attribute [r] favorites
|
35
|
+
# @return [Favorites]
|
36
|
+
# @!attribute [r] folders
|
37
|
+
# @return [Folders]
|
38
|
+
# @!attribute [r] groups
|
39
|
+
# @return [Groups]
|
40
|
+
# @!attribute [r] home
|
41
|
+
# @return [Home]
|
42
|
+
# @!attribute [r] reports
|
43
|
+
# @return [Reports]
|
44
|
+
# @!attribute [r] search
|
45
|
+
# @return [Search]
|
46
|
+
# @!attribute [r] server_info
|
47
|
+
# @return [ServerInfo]
|
48
|
+
# @!attribute [r] sheets
|
49
|
+
# @return [Sheets]
|
50
|
+
# @!attribute [r] sights
|
51
|
+
# @return [Sights]
|
52
|
+
# @!attribute [r] templates
|
53
|
+
# @return [Templates]
|
54
|
+
# @!attribute [r] token
|
55
|
+
# @return [Token]
|
56
|
+
# @!attribute [r] update_requests
|
57
|
+
# @return [UpdateRequests]
|
58
|
+
# @!attribute [r] users
|
59
|
+
# @return [Users]
|
60
|
+
# @!attribute [r] webhooks
|
61
|
+
# @return [Webhooks]
|
62
|
+
# @!attribute [r] workspaces
|
63
|
+
# @return [Workspaces]
|
64
|
+
class Client
|
65
|
+
include GeneralRequest
|
66
|
+
include Smartsheet::Constants
|
67
|
+
|
68
|
+
attr_reader :contacts, :events, :favorites, :folders, :groups, :home, :reports, :search, :server_info,
|
69
|
+
:sheets, :sights, :templates, :token, :update_requests, :users, :webhooks,
|
70
|
+
:workspaces
|
71
|
+
|
72
|
+
# @param token [String] access token for the API; if nil or empty, uses environment variable
|
73
|
+
# `SMARTSHEET_ACCESS_TOKEN`
|
74
|
+
# @param logger [Logger] a logger to which request and response info will be recorded
|
75
|
+
# @param log_full_body [Boolean] when true, request and response bodies will not be truncated in
|
76
|
+
# the logs
|
77
|
+
# @param user_agent [String] the name of the application, sent as part of the user agent for
|
78
|
+
# requests; defaults as the name of the application
|
79
|
+
# @param json_output [Boolean] when true, endpoints return raw JSON strings instead of hashes
|
80
|
+
# @param assume_user [String] the email address of the user to impersonate; only available for
|
81
|
+
# admin roles
|
82
|
+
# @param max_retry_time [Fixnum] overrides the maximum number of seconds during which eligible
|
83
|
+
# errors will be retried
|
84
|
+
# @param backoff_method [Proc] overrides the backoff calculation method, accepting the index of
|
85
|
+
# the current retry attempt (0-based) and returning the number of seconds to wait before
|
86
|
+
# retrying the call again, or `:stop` to halt retrying and return the latest error.
|
87
|
+
#
|
88
|
+
# Example - Wait 1 second before the first retry, 2 seconds before
|
89
|
+
# the second, and so on:
|
90
|
+
# ```ruby
|
91
|
+
# ->(x){ x + 1 }
|
92
|
+
# ```
|
93
|
+
#
|
94
|
+
# Example - Try twice, then halt:
|
95
|
+
# ```ruby
|
96
|
+
# ->(x){ if x < 2 then x + 1 else :stop end }
|
97
|
+
# ```
|
98
|
+
# @param base_url [String] overrides the base URL used when constructing API calls; for example,
|
99
|
+
# the default takes the form of `https://api.smartsheet.com/2.0`
|
100
|
+
def initialize(
|
101
|
+
token: nil,
|
102
|
+
logger: nil,
|
103
|
+
log_full_body: false,
|
104
|
+
user_agent: nil,
|
105
|
+
json_output: false,
|
106
|
+
assume_user: nil,
|
107
|
+
max_retry_time: nil,
|
108
|
+
backoff_method: nil,
|
109
|
+
base_url: API_URL
|
110
|
+
)
|
111
|
+
|
112
|
+
request_logger =
|
113
|
+
logger ?
|
114
|
+
API::RequestLogger.new(logger, log_full_body: log_full_body) :
|
115
|
+
API::MuteRequestLogger.new
|
116
|
+
|
117
|
+
token = token_env_var if token.nil? || token.empty?
|
118
|
+
|
119
|
+
app_user_agent = user_agent.nil? ? File.basename($PROGRAM_NAME) : user_agent
|
120
|
+
|
121
|
+
net_client = API::FaradayNetClient.new
|
122
|
+
|
123
|
+
retry_logic = init_retry_logic(max_retry_time, backoff_method)
|
124
|
+
|
125
|
+
retrying_client = API::RetryNetClientDecorator.new(
|
126
|
+
net_client,
|
127
|
+
retry_logic,
|
128
|
+
logger: request_logger
|
129
|
+
)
|
130
|
+
|
131
|
+
response_client = API::ResponseNetClientDecorator.new(
|
132
|
+
retrying_client,
|
133
|
+
json_output: json_output,
|
134
|
+
logger: request_logger
|
135
|
+
)
|
136
|
+
|
137
|
+
@client = API::RequestClient.new(
|
138
|
+
token,
|
139
|
+
response_client,
|
140
|
+
base_url,
|
141
|
+
app_user_agent: app_user_agent,
|
142
|
+
assume_user: assume_user,
|
143
|
+
logger: request_logger
|
144
|
+
)
|
145
|
+
build_categories
|
146
|
+
end
|
147
|
+
|
148
|
+
def inspect
|
149
|
+
methods = (self.public_methods - Object.methods)
|
150
|
+
.sort
|
151
|
+
.map {|m| ':' + m.to_s}
|
152
|
+
.join(', ')
|
153
|
+
|
154
|
+
"#<Smartsheet::Client:#{self.object_id} #{methods}>"
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
attr_reader :client
|
160
|
+
|
161
|
+
def build_categories
|
162
|
+
@contacts = Contacts.new(client)
|
163
|
+
@events = Events.new(client)
|
164
|
+
@favorites = Favorites.new(client)
|
165
|
+
@folders = Folders.new(client)
|
166
|
+
@groups = Groups.new(client)
|
167
|
+
@home = Home.new(client)
|
168
|
+
@reports = Reports.new(client)
|
169
|
+
@search = Search.new(client)
|
170
|
+
@server_info = ServerInfo.new(client)
|
171
|
+
@sheets = Sheets.new(client)
|
172
|
+
@sights = Sights.new(client)
|
173
|
+
@token = Token.new(client)
|
174
|
+
@templates = Templates.new(client)
|
175
|
+
@update_requests = UpdateRequests.new(client)
|
176
|
+
@users = Users.new(client)
|
177
|
+
@webhooks = Webhooks.new(client)
|
178
|
+
@workspaces = Workspaces.new(client)
|
179
|
+
end
|
180
|
+
|
181
|
+
def init_retry_logic(max_retry_time, backoff_method)
|
182
|
+
retry_opts = {}
|
183
|
+
retry_opts[:max_retry_time] = max_retry_time unless max_retry_time.nil?
|
184
|
+
retry_opts[:backoff_method] = backoff_method unless backoff_method.nil?
|
185
|
+
|
186
|
+
API::RetryLogic.new(**retry_opts)
|
187
|
+
end
|
188
|
+
|
189
|
+
def token_env_var
|
190
|
+
ENV['SMARTSHEET_ACCESS_TOKEN']
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|