sheets_v4 0.6.0 → 0.8.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 +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +99 -1
- data/Rakefile +3 -0
- data/examples/README.md +1 -0
- data/lib/sheets_v4/{validate_api_objects → api_object_validation}/load_schemas.rb +7 -7
- data/lib/sheets_v4/{validate_api_objects → api_object_validation}/resolve_schema_ref.rb +6 -6
- data/lib/sheets_v4/{validate_api_objects → api_object_validation}/traverse_object_tree.rb +2 -2
- data/lib/sheets_v4/api_object_validation/validate_api_object.rb +87 -0
- data/lib/sheets_v4/api_object_validation.rb +20 -0
- data/lib/sheets_v4/color.rb +0 -1
- data/lib/sheets_v4/convert_dates_and_times.rb +243 -0
- data/lib/sheets_v4/{credential_creator.rb → create_credential.rb} +2 -2
- data/lib/sheets_v4/google_extensions/sheet.rb +32 -0
- data/lib/sheets_v4/google_extensions/sheets_service.rb +99 -0
- data/lib/sheets_v4/google_extensions/spreadsheet.rb +24 -0
- data/lib/sheets_v4/google_extensions.rb +42 -0
- data/lib/sheets_v4/validate_api_objects/{validate.rb → validate_api_object.rb} +7 -6
- data/lib/sheets_v4/validate_api_objects.rb +6 -6
- data/lib/sheets_v4/version.rb +1 -1
- data/lib/sheets_v4.rb +225 -95
- metadata +14 -7
@@ -0,0 +1,32 @@
|
|
1
|
+
# Copyright (c) 2022 Yahoo
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'google/apis/sheets_v4'
|
5
|
+
require 'googleauth'
|
6
|
+
|
7
|
+
module SheetsV4
|
8
|
+
module GoogleExtensions
|
9
|
+
# The SheetsService class implements handling credentials on top of the
|
10
|
+
# Google::Apis::SheetsV4::SheetsService class.
|
11
|
+
#
|
12
|
+
# @api public
|
13
|
+
#
|
14
|
+
module Sheet
|
15
|
+
# The sheets_service object used to create this sheet
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# sheets_service = sheet.sheets_service
|
19
|
+
#
|
20
|
+
# @return [Google::Apis::SheetsV4::SheetsService]
|
21
|
+
attr_reader :sheets_service
|
22
|
+
|
23
|
+
# The spreadsheet object that contains this sheet
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# spreadsheet = sheet.spreadsheet
|
27
|
+
#
|
28
|
+
# @return [Google::Apis::SheetsV4::Spreadsheet]
|
29
|
+
attr_reader :spreadsheet
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# Copyright (c) 2022 Yahoo
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module SheetsV4
|
5
|
+
module GoogleExtensions
|
6
|
+
# This module extends the `Google::Apis::SheetsV4::SheetsService` class to add
|
7
|
+
# attributes to the `Google::Apis::SheetsV4::Spreadsheet` and `Google::Apis::SheetsV4::Sheet`
|
8
|
+
# classes that reference the `SheetsService` instance used to retrieve them.
|
9
|
+
#
|
10
|
+
# Similarly, an attribute is added to the `Google::Apis::SheetsV4::Sheet` class
|
11
|
+
# that references the `Google::Apis::SheetsV4::Spreadsheet` instance that contains it.
|
12
|
+
#
|
13
|
+
# This allows getting the `SheetsService` object from a spreadsheet or sheet object,
|
14
|
+
# making it unnecessary to pass the `SheetsService` object around with the spreadsheet
|
15
|
+
# and its sheets.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# require 'sheets_v4/google_extensions'
|
19
|
+
# sheets_service = SheetsV4::SheetsService.new
|
20
|
+
# spreadsheet = sheets_service.get_spreadsheet('1nT_q0TrQzC3dLZXuI3K9V5P3mArBVZpVd_vRsOpvcyk')
|
21
|
+
#
|
22
|
+
# spreadsheet.sheets_service == sheets_service # => true
|
23
|
+
# spreadsheet.sheets.each do |sheet|
|
24
|
+
# sheet.sheets_service == sheets_service # => true
|
25
|
+
# sheet.spreadsheet == spreadsheet # => true
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# @api public
|
29
|
+
#
|
30
|
+
module SheetsService
|
31
|
+
# Replace the prepending class's `get_spreadsheet` implementation
|
32
|
+
#
|
33
|
+
# When this module is prepended to a class, class's `get_spreadsheet` method
|
34
|
+
# is replaced wity `new_get_spreadsheet` method from this module. The class's
|
35
|
+
# original `get_spreadsheet` method is renamed to `original_get_spreadsheet`.
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# Google::Apis::SheetsV4::SheetsService.prepend(
|
39
|
+
# SheetsV4::GoogleExtensions::SheetsService
|
40
|
+
# )
|
41
|
+
#
|
42
|
+
# @return [void]
|
43
|
+
#
|
44
|
+
# @private
|
45
|
+
#
|
46
|
+
def self.prepended(prepended_to_class)
|
47
|
+
prepended_to_class.send(:alias_method, :original_get_spreadsheet, :get_spreadsheet)
|
48
|
+
prepended_to_class.send(:remove_method, :get_spreadsheet)
|
49
|
+
prepended_to_class.send(:alias_method, :get_spreadsheet, :new_get_spreadsheet)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @!method get_spreadsheet(spreadsheet_id, include_grid_data, ranges, fields, quota_user, options, &block)
|
53
|
+
#
|
54
|
+
# @api public
|
55
|
+
#
|
56
|
+
# Gets an existing spreadsheet
|
57
|
+
#
|
58
|
+
# Creates a spreadsheet object by calling the original
|
59
|
+
# Google::Apis::SheetsV4::SheetsService#get_spreadsheet method and then does
|
60
|
+
# the following:
|
61
|
+
#
|
62
|
+
# * Sets the `sheets_service` attribute for the returned spreadsheet.
|
63
|
+
# * Sets the `sheets_service` and `spreadsheet` attributes all the sheets contained in the spreadsheet.
|
64
|
+
#
|
65
|
+
# See the documentation for Google::Apis::SheetsV4::SheetsService#get_spreadsheet for
|
66
|
+
# details on the parameters and return value.
|
67
|
+
#
|
68
|
+
# @example Get a spreadsheet object and output new attributes:
|
69
|
+
# require 'sheets_v4'
|
70
|
+
# require 'sheets_v4/google_extensions'
|
71
|
+
#
|
72
|
+
# sheets_service = SheetsV4::SheetsService.new
|
73
|
+
# spreadsheet_id = '1nT_q0TrQzC3dLZXuI3K9V5P3mArBVZpVd_vRsOpvcyk'
|
74
|
+
#
|
75
|
+
# spreadsheet = sheets_service.get_spreadsheet(spreadsheet_id)
|
76
|
+
#
|
77
|
+
# @return [Google::Apis::SheetsV4::Spreadsheet] the spreadsheet whose ID is `spreadsheet_id`
|
78
|
+
|
79
|
+
# Replaces the `get_spreadsheet` method implementation in the prepended class
|
80
|
+
#
|
81
|
+
# @example
|
82
|
+
# spreadsheet = sheets_service.new_get_spreadsheet(spreadsheet_id)
|
83
|
+
#
|
84
|
+
# @private
|
85
|
+
#
|
86
|
+
# @return [Google::Apis::SheetsV4::Spreadsheet]
|
87
|
+
#
|
88
|
+
def new_get_spreadsheet(...)
|
89
|
+
original_get_spreadsheet(...)&.tap do |spreadsheet|
|
90
|
+
spreadsheet.instance_variable_set(:@sheets_service, self)
|
91
|
+
spreadsheet.sheets.each do |sheet|
|
92
|
+
sheet.instance_variable_set(:@sheets_service, self)
|
93
|
+
sheet.instance_variable_set(:@spreadsheet, spreadsheet)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Copyright (c) 2022 Yahoo
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'google/apis/sheets_v4'
|
5
|
+
require 'googleauth'
|
6
|
+
|
7
|
+
module SheetsV4
|
8
|
+
module GoogleExtensions
|
9
|
+
# The SheetsService class implements handling credentials on top of the
|
10
|
+
# Google::Apis::SheetsV4::SheetsService class.
|
11
|
+
#
|
12
|
+
# @api public
|
13
|
+
#
|
14
|
+
module Spreadsheet
|
15
|
+
# The sheets_service object used to create this spreadsheet
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# sheets_service = spreadsheet.sheets_service
|
19
|
+
#
|
20
|
+
# @return [Google::Apis::SheetsV4::SheetsService]
|
21
|
+
attr_reader :sheets_service
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SheetsV4
|
4
|
+
# The Google extensions are additions directly to Google::Apis::SheetsV4 classes
|
5
|
+
#
|
6
|
+
# These additions are optional and provide convenience methods and attributes
|
7
|
+
# that simplify use of the Google Sheets API.
|
8
|
+
#
|
9
|
+
# To use these extensions, require the `sheets_v4/google_extensions` file.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# require 'sheets_v4/google_extensions'
|
13
|
+
#
|
14
|
+
module GoogleExtensions; end
|
15
|
+
end
|
16
|
+
|
17
|
+
require_relative 'google_extensions/sheets_service'
|
18
|
+
require_relative 'google_extensions/spreadsheet'
|
19
|
+
require_relative 'google_extensions/sheet'
|
20
|
+
|
21
|
+
# @private
|
22
|
+
module Google
|
23
|
+
module Apis
|
24
|
+
# Add SheetsV4 extensions to Google::Apis::SheetsV4 classes
|
25
|
+
module SheetsV4
|
26
|
+
# Add SheetsV4 extensions to Google::Apis::SheetsV4::SheetsService
|
27
|
+
class SheetsService
|
28
|
+
prepend ::SheetsV4::GoogleExtensions::SheetsService
|
29
|
+
end
|
30
|
+
|
31
|
+
# Add SheetsV4 extensions to Google::Apis::SheetsV4::Spreadsheet
|
32
|
+
class Spreadsheet
|
33
|
+
prepend ::SheetsV4::GoogleExtensions::Spreadsheet
|
34
|
+
end
|
35
|
+
|
36
|
+
# Add SheetsV4 extensions to Google::Apis::SheetsV4::Sheet
|
37
|
+
class Sheet
|
38
|
+
prepend ::SheetsV4::GoogleExtensions::Sheet
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,21 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'active_support'
|
3
4
|
require 'active_support/inflector'
|
4
5
|
require 'json_schemer'
|
5
6
|
|
6
7
|
module SheetsV4
|
7
|
-
module
|
8
|
+
module ApiObjectValidation
|
8
9
|
# Validate objects against a Google Sheets API request object schema
|
9
10
|
#
|
10
11
|
# @api public
|
11
12
|
#
|
12
|
-
class
|
13
|
+
class ValidateApiObject
|
13
14
|
# Create a new validator
|
14
15
|
#
|
15
16
|
# By default, a nil logger is used. This means that no messages are logged.
|
16
17
|
#
|
17
18
|
# @example
|
18
|
-
# validator = SheetsV4::
|
19
|
+
# validator = SheetsV4::ApiObjectValidation::ValidateApiObject.new
|
19
20
|
#
|
20
21
|
# @param logger [Logger] the logger to use
|
21
22
|
#
|
@@ -30,7 +31,7 @@ module SheetsV4
|
|
30
31
|
#
|
31
32
|
# @example
|
32
33
|
# logger = Logger.new(STDOUT, :level => Logger::INFO)
|
33
|
-
# validator = SheetsV4::
|
34
|
+
# validator = SheetsV4::ApiObjectValidation::ValidateApiObject.new(logger)
|
34
35
|
# validator.logger == logger # => true
|
35
36
|
# validator.logger.debug { "Debug message" }
|
36
37
|
#
|
@@ -43,7 +44,7 @@ module SheetsV4
|
|
43
44
|
# @example
|
44
45
|
# schema_name = 'batch_update_spreadsheet_request'
|
45
46
|
# object = { 'requests' => [] }
|
46
|
-
# validator = SheetsV4::
|
47
|
+
# validator = SheetsV4::ApiObjectValidation::ValidateApiObject.new
|
47
48
|
# validator.call(schema_name:, object:)
|
48
49
|
#
|
49
50
|
# @param schema_name [String] the name of the schema to validate against
|
@@ -69,7 +70,7 @@ module SheetsV4
|
|
69
70
|
# The resolver to use to resolve JSON schema references
|
70
71
|
# @return [ResolveSchemaRef]
|
71
72
|
# @api private
|
72
|
-
def ref_resolver = @ref_resolver ||= SheetsV4::
|
73
|
+
def ref_resolver = @ref_resolver ||= SheetsV4::ApiObjectValidation::ResolveSchemaRef.new(logger:)
|
73
74
|
|
74
75
|
# Raise an error when the object does not conform to the schema
|
75
76
|
# @return [void]
|
@@ -7,14 +7,14 @@ module SheetsV4
|
|
7
7
|
# logger = Logger.new(STDOUT, :level => Logger::ERROR)
|
8
8
|
# schema_name = 'batch_update_spreadsheet_request'
|
9
9
|
# object = { 'requests' => [] }
|
10
|
-
# SheetsV4::
|
10
|
+
# SheetsV4::ApiObjectValidation::ValidateApiObject.new(logger:).call(schema_name:, object:)
|
11
11
|
#
|
12
12
|
# @api public
|
13
13
|
#
|
14
|
-
module
|
14
|
+
module ApiObjectValidation; end
|
15
15
|
end
|
16
16
|
|
17
|
-
require_relative '
|
18
|
-
require_relative '
|
19
|
-
require_relative '
|
20
|
-
require_relative '
|
17
|
+
require_relative 'api_object_validation/load_schemas'
|
18
|
+
require_relative 'api_object_validation/resolve_schema_ref'
|
19
|
+
require_relative 'api_object_validation/traverse_object_tree'
|
20
|
+
require_relative 'api_object_validation/validate_api_object'
|
data/lib/sheets_v4/version.rb
CHANGED
data/lib/sheets_v4.rb
CHANGED
@@ -2,9 +2,14 @@
|
|
2
2
|
|
3
3
|
require_relative 'sheets_v4/version'
|
4
4
|
require_relative 'sheets_v4/color'
|
5
|
-
require_relative 'sheets_v4/
|
6
|
-
require_relative 'sheets_v4/
|
5
|
+
require_relative 'sheets_v4/convert_dates_and_times'
|
6
|
+
require_relative 'sheets_v4/create_credential'
|
7
|
+
require_relative 'sheets_v4/api_object_validation'
|
7
8
|
|
9
|
+
require 'active_support'
|
10
|
+
require 'active_support/values/time_zone'
|
11
|
+
require 'active_support/core_ext/numeric/time'
|
12
|
+
require 'active_support/core_ext/string/zones'
|
8
13
|
require 'google/apis/sheets_v4'
|
9
14
|
require 'json'
|
10
15
|
require 'logger'
|
@@ -15,102 +20,227 @@ require 'net/http'
|
|
15
20
|
# @api public
|
16
21
|
#
|
17
22
|
module SheetsV4
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
credential_source
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
23
|
+
class << self
|
24
|
+
# Create a new Google::Apis::SheetsV4::SheetsService object
|
25
|
+
#
|
26
|
+
# Simplifies creating and configuring a the credential.
|
27
|
+
#
|
28
|
+
# @example using the credential in `~/.google-api-credential`
|
29
|
+
# SheetsV4.sheets_service
|
30
|
+
#
|
31
|
+
# @example using a credential passed in as a string
|
32
|
+
# credential_source = File.read(File.expand_path('~/.google-api-credential.json'))
|
33
|
+
# SheetsV4.sheets_service(credential_source:)
|
34
|
+
#
|
35
|
+
# @example using a credential passed in as an IO
|
36
|
+
# credential_source = File.open(File.expand_path('~/.google-api-credential.json'))
|
37
|
+
# SheetsV4.sheets_service(credential_source:)
|
38
|
+
#
|
39
|
+
# @param credential_source [nil, String, IO, Google::Auth::*] may
|
40
|
+
# be either an already constructed credential, the credential read into a String or
|
41
|
+
# an open file with the credential ready to be read. Passing `nil` will result
|
42
|
+
# in the credential being read from `~/.google-api-credential.json`.
|
43
|
+
#
|
44
|
+
# @param scopes [Object, Array] one or more scopes to access.
|
45
|
+
#
|
46
|
+
# @param credential_creator [#credential] Used to inject the credential creator for
|
47
|
+
# testing.
|
48
|
+
#
|
49
|
+
# @return a new SheetsService instance
|
50
|
+
#
|
51
|
+
def sheets_service(credential_source: nil, scopes: nil, credential_creator: SheetsV4::CreateCredential)
|
52
|
+
credential_source ||= File.read(File.expand_path('~/.google-api-credential.json'))
|
53
|
+
scopes ||= [Google::Apis::SheetsV4::AUTH_SPREADSHEETS]
|
54
|
+
|
55
|
+
Google::Apis::SheetsV4::SheetsService.new.tap do |service|
|
56
|
+
service.authorization = credential_creator.call(credential_source, scopes)
|
57
|
+
end
|
51
58
|
end
|
52
|
-
end
|
53
59
|
|
54
|
-
|
55
|
-
#
|
56
|
-
# The JSON schemas are loaded from the Google Disocvery API. The schemas names are
|
57
|
-
# returned by `SheetsV4.api_object_schema_names`.
|
58
|
-
#
|
59
|
-
# @example
|
60
|
-
# schema_name = 'batch_update_spreadsheet_request'
|
61
|
-
# object = { 'requests' => [] }
|
62
|
-
# SheetsV4.validate_api_object(schema_name:, object:)
|
63
|
-
#
|
64
|
-
# @param schema_name [String] the name of the schema to validate against
|
65
|
-
# @param object [Object] the object to validate
|
66
|
-
# @param logger [Logger] the logger to use for logging error, info, and debug message
|
67
|
-
#
|
68
|
-
# @raise [RuntimeError] if the object does not conform to the schema
|
69
|
-
#
|
70
|
-
# @return [void]
|
71
|
-
#
|
72
|
-
def self.validate_api_object(schema_name:, object:, logger: Logger.new(nil))
|
73
|
-
SheetsV4::ValidateApiObjects::Validate.new(logger:).call(schema_name:, object:)
|
74
|
-
end
|
60
|
+
# @!group Validation
|
75
61
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
SheetsV4
|
85
|
-
|
62
|
+
# Validate the object using the named JSON schema
|
63
|
+
#
|
64
|
+
# The JSON schemas are loaded from the Google Disocvery API. The schemas names are
|
65
|
+
# returned by `SheetsV4.api_object_schema_names`.
|
66
|
+
#
|
67
|
+
# @example
|
68
|
+
# schema_name = 'batch_update_spreadsheet_request'
|
69
|
+
# object = { 'requests' => [] }
|
70
|
+
# SheetsV4.validate_api_object(schema_name:, object:)
|
71
|
+
#
|
72
|
+
# @param schema_name [String] the name of the schema to validate against
|
73
|
+
# @param object [Object] the object to validate
|
74
|
+
# @param logger [Logger] the logger to use for logging error, info, and debug message
|
75
|
+
#
|
76
|
+
# @raise [RuntimeError] if the object does not conform to the schema
|
77
|
+
#
|
78
|
+
# @return [void]
|
79
|
+
#
|
80
|
+
def validate_api_object(schema_name:, object:, logger: Logger.new(nil))
|
81
|
+
SheetsV4::ApiObjectValidation::ValidateApiObject.new(logger:).call(schema_name:, object:)
|
82
|
+
end
|
86
83
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
84
|
+
# List the names of the schemas available to use in the Google Sheets API
|
85
|
+
#
|
86
|
+
# @example List the name of the schemas available
|
87
|
+
# SheetsV4.api_object_schema_names #=> ["add_banding_request", "add_banding_response", ...]
|
88
|
+
#
|
89
|
+
# @return [Array<String>] the names of the schemas available
|
90
|
+
#
|
91
|
+
def api_object_schema_names(logger: Logger.new(nil))
|
92
|
+
SheetsV4::ApiObjectValidation::LoadSchemas.new(logger:).call.keys.sort
|
93
|
+
end
|
94
|
+
|
95
|
+
# @!group Colors
|
96
|
+
|
97
|
+
# Given the name of the color, return a Google Sheets API color object
|
98
|
+
#
|
99
|
+
# Available color names are listed using `SheetsV4.color_names`.
|
100
|
+
#
|
101
|
+
# The object returned is frozen. If you want a color you can change (for instance,
|
102
|
+
# to adjust the `alpha` attribute), you must clone the object returned.
|
103
|
+
#
|
104
|
+
# @example
|
105
|
+
# SheetsV4::Color.color(:red) #=> { "red": 1.0, "green": 0.0, "blue": 0.0 }
|
106
|
+
#
|
107
|
+
# @param name [#to_sym] the name of the color requested
|
108
|
+
#
|
109
|
+
# @return [Hash] The color requested e.g. `{ "red": 1.0, "green": 0.0, "blue": 0.0 }`
|
110
|
+
#
|
111
|
+
def color(name)
|
112
|
+
SheetsV4::Color::COLORS[name.to_sym] || raise("Color #{name} not found")
|
113
|
+
end
|
114
|
+
|
115
|
+
# List the names of the colors available to use in the Google Sheets API
|
116
|
+
#
|
117
|
+
# @example
|
118
|
+
# SheetsV4::Color.color_names #=> [:black, :white, :red, :green, :blue, :yellow, :magenta, :cyan, ...]
|
119
|
+
#
|
120
|
+
# @return [Array<Symbol>] the names of the colors available
|
121
|
+
#
|
122
|
+
def color_names = SheetsV4::Color::COLORS.keys
|
123
|
+
|
124
|
+
# @!group Date and DateTime Conversions
|
125
|
+
|
126
|
+
# @!attribute [rw] default_spreadsheet_tz
|
127
|
+
#
|
128
|
+
# Set the default time zone for date and time conversions
|
129
|
+
#
|
130
|
+
# Valid time zone names are those listed in one of these two sources:
|
131
|
+
# * `ActiveSupport::TimeZone.all.map { |tz| tz.tzinfo.name }`
|
132
|
+
# * `ActiveSupport::TimeZone.all.map(&:name)`
|
133
|
+
#
|
134
|
+
# If you want to set the timezone to the time zone of the system's local time,
|
135
|
+
# you could use the [timezone_local gem](https://rubygems.org/gems/timezone_local).
|
136
|
+
#
|
137
|
+
# @example
|
138
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
139
|
+
#
|
140
|
+
# @example Set the time zone to the system's local time
|
141
|
+
# require 'timezone_local'
|
142
|
+
# SheetsV4.default_spreadsheet_tz = TimeZone::Local.get.name
|
143
|
+
#
|
144
|
+
# @return [void]
|
145
|
+
#
|
146
|
+
def default_spreadsheet_tz
|
147
|
+
@default_spreadsheet_tz || raise('default_spreadsheet_tz not set')
|
148
|
+
end
|
106
149
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
150
|
+
def default_spreadsheet_tz=(time_zone)
|
151
|
+
raise "Invalid time zone '#{time_zone}'" unless ActiveSupport::TimeZone.new(time_zone)
|
152
|
+
|
153
|
+
@default_date_and_time_converter = nil unless @default_spreadsheet_tz == time_zone
|
154
|
+
@default_spreadsheet_tz = time_zone
|
155
|
+
end
|
156
|
+
|
157
|
+
# The default converter for dates and times
|
158
|
+
# @return [SheetsV4::ConvertDatesAndTimes]
|
159
|
+
# @api private
|
160
|
+
def default_date_and_time_converter
|
161
|
+
@default_date_and_time_converter ||= SheetsV4::ConvertDatesAndTimes.new(default_spreadsheet_tz)
|
162
|
+
end
|
163
|
+
|
164
|
+
# Convert a Ruby Date object to a Google Sheet date value
|
165
|
+
#
|
166
|
+
# Uses the time zone given by `SheetsV4.default_spreadsheet_tz`.
|
167
|
+
#
|
168
|
+
# @example with a Date object
|
169
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
170
|
+
# date = Date.parse('2021-05-17')
|
171
|
+
# SheetsV4.date_to_gs(date) #=> 44333
|
172
|
+
#
|
173
|
+
# @example with a DateTime object
|
174
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
175
|
+
# date_time = DateTime.parse('2021-05-17 11:36:00 UTC')
|
176
|
+
# SheetsV4.date_to_gs(date_time) #=> 44333
|
177
|
+
#
|
178
|
+
# @param date [DateTime, Date, nil] the date to convert
|
179
|
+
#
|
180
|
+
# @return [Float, String] the value to sstore in a Google Sheet cell
|
181
|
+
# Returns a Float if date is not nil; otherwise, returns an empty string
|
182
|
+
#
|
183
|
+
def date_to_gs(date)
|
184
|
+
default_date_and_time_converter.date_to_gs(date)
|
185
|
+
end
|
186
|
+
|
187
|
+
# Convert a Google Sheets date value to a Ruby Date object
|
188
|
+
#
|
189
|
+
# @example with a date value
|
190
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
191
|
+
# gs_value = 44333
|
192
|
+
# SheetsV4.gs_to_date(gs_value) #=> #<Date: 2021-05-17 ...>
|
193
|
+
#
|
194
|
+
# @example with a date and time value
|
195
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
196
|
+
# gs_value = 44333.191666666666
|
197
|
+
# SheetsV4.gs_to_date(gs_value) #=> #<Date: 2021-05-17 ...>
|
198
|
+
#
|
199
|
+
# @param gs_value [Float, "", nil] the value from the Google Sheets cell
|
200
|
+
#
|
201
|
+
# @return [Date, nil] the value represented by gs_date
|
202
|
+
#
|
203
|
+
# Returns a Date object if a Float was given; otherwise, returns nil if an
|
204
|
+
# empty string or nil was given.
|
205
|
+
#
|
206
|
+
def gs_to_date(gs_value)
|
207
|
+
default_date_and_time_converter.gs_to_date(gs_value)
|
208
|
+
end
|
209
|
+
|
210
|
+
# Convert a Ruby DateTime object to a Google Sheets value
|
211
|
+
#
|
212
|
+
# @example
|
213
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
214
|
+
# date_time = DateTime.parse('2021-05-17 11:36:00 UTC')
|
215
|
+
# SheetsV4.datetime_to_gs(date_time) #=> 44333.191666666666
|
216
|
+
#
|
217
|
+
# @param datetime [DateTime, nil] the date and time to convert
|
218
|
+
#
|
219
|
+
# @return [Float, String] the value to store in a Google Sheet cell
|
220
|
+
# Returns a Float if datetime is not nil; otherwise, returns an empty string.
|
221
|
+
#
|
222
|
+
def datetime_to_gs(datetime)
|
223
|
+
default_date_and_time_converter.datetime_to_gs(datetime)
|
224
|
+
end
|
225
|
+
|
226
|
+
# Convert a Google Sheets date time value to a DateTime object
|
227
|
+
#
|
228
|
+
# Time is rounded to the nearest second. The DateTime object returned is in
|
229
|
+
# the time zone given by `SheetsV4.default_spreadsheet_tz`.
|
230
|
+
#
|
231
|
+
# @example
|
232
|
+
# SheetsV4.default_spreadsheet_tz = 'America/Los_Angeles'
|
233
|
+
# gs_value = 44333.191666666666
|
234
|
+
# SheetsV4.gs_to_datetime(gs_value) #=> #<DateTime: 2021-05-17T04:35:59-07:00 ...>
|
235
|
+
#
|
236
|
+
# @param gs_value [Float, "", nil] the value from the Google Sheets cell
|
237
|
+
#
|
238
|
+
# @return [DateTime, nil] the value represented by gs_datetime
|
239
|
+
# Returns a DateTime object if a Float was given; otherwise, returns nil if an
|
240
|
+
# empty string or nil was given.
|
241
|
+
#
|
242
|
+
def gs_to_datetime(gs_value)
|
243
|
+
default_date_and_time_converter.gs_to_datetime(gs_value)
|
244
|
+
end
|
245
|
+
end
|
116
246
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sheets_v4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Couball
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler-audit
|
@@ -260,13 +260,20 @@ files:
|
|
260
260
|
- examples/set_background_color
|
261
261
|
- examples/set_background_color2
|
262
262
|
- lib/sheets_v4.rb
|
263
|
+
- lib/sheets_v4/api_object_validation.rb
|
264
|
+
- lib/sheets_v4/api_object_validation/load_schemas.rb
|
265
|
+
- lib/sheets_v4/api_object_validation/resolve_schema_ref.rb
|
266
|
+
- lib/sheets_v4/api_object_validation/traverse_object_tree.rb
|
267
|
+
- lib/sheets_v4/api_object_validation/validate_api_object.rb
|
263
268
|
- lib/sheets_v4/color.rb
|
264
|
-
- lib/sheets_v4/
|
269
|
+
- lib/sheets_v4/convert_dates_and_times.rb
|
270
|
+
- lib/sheets_v4/create_credential.rb
|
271
|
+
- lib/sheets_v4/google_extensions.rb
|
272
|
+
- lib/sheets_v4/google_extensions/sheet.rb
|
273
|
+
- lib/sheets_v4/google_extensions/sheets_service.rb
|
274
|
+
- lib/sheets_v4/google_extensions/spreadsheet.rb
|
265
275
|
- lib/sheets_v4/validate_api_objects.rb
|
266
|
-
- lib/sheets_v4/validate_api_objects/
|
267
|
-
- lib/sheets_v4/validate_api_objects/resolve_schema_ref.rb
|
268
|
-
- lib/sheets_v4/validate_api_objects/traverse_object_tree.rb
|
269
|
-
- lib/sheets_v4/validate_api_objects/validate.rb
|
276
|
+
- lib/sheets_v4/validate_api_objects/validate_api_object.rb
|
270
277
|
- lib/sheets_v4/version.rb
|
271
278
|
homepage: https://github.com/main-branch/sheets_v4
|
272
279
|
licenses:
|