sheets_v4 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +19 -0
- data/README.md +57 -0
- data/examples/README.md +1 -0
- data/examples/set_background_color +54 -0
- data/examples/set_background_color2 +67 -0
- data/lib/sheets_v4/color.rb +171 -6
- data/lib/sheets_v4/credential_creator.rb +93 -0
- data/lib/sheets_v4/validate_api_objects/load_schemas.rb +155 -0
- data/lib/sheets_v4/validate_api_objects/resolve_schema_ref.rb +72 -0
- data/lib/sheets_v4/validate_api_objects/traverse_object_tree.rb +82 -0
- data/lib/sheets_v4/validate_api_objects/validate.rb +86 -0
- data/lib/sheets_v4/validate_api_objects.rb +20 -0
- data/lib/sheets_v4/version.rb +1 -1
- data/lib/sheets_v4.rb +52 -193
- metadata +10 -3
- data/lib/sheets_v4/validate_api_object.rb +0 -132
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea8bb19ec472d573c796d277e420c088273c087aa9ffe4ebbb63df0a2ffb69ae
|
4
|
+
data.tar.gz: 5a2dca82c26a9efdd7584a5c33f4e4d9bfa1f8ac0003cf504d936554e6bb9f7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0676d4dcff6bd008104638a1a593cfcf638ad990d15a6f1a2f71cba44e0a387e5c3e527978cb3fc9e0517ecf9ef35dd8fac2348ac993f58f28147769261d3412
|
7
|
+
data.tar.gz: ab5ae3a72384e45ee10411d1f1a89231ef9092393e686e81b0cb9e7734b216c039589697f2ef5e7d3313b677f5ea022ac8b2135adaa57e7e01c6032a12de0bb0
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,25 @@ Changes for each release are listed in this file.
|
|
4
4
|
|
5
5
|
This project adheres to [Semantic Versioning](https://semver.org/) for its releases.
|
6
6
|
|
7
|
+
## v0.5.0 (2023-10-01)
|
8
|
+
|
9
|
+
[Full Changelog](https://github.com/main-branch/sheets_v4/compare/v0.4.0..v0.5.0)
|
10
|
+
|
11
|
+
Changes since v0.4.0:
|
12
|
+
|
13
|
+
* b403430 Refactor SheetsV4.validate_api_object (#15)
|
14
|
+
|
15
|
+
## v0.4.0 (2023-09-29)
|
16
|
+
|
17
|
+
[Full Changelog](https://github.com/main-branch/sheets_v4/compare/v0.3.0..v0.4.0)
|
18
|
+
|
19
|
+
Changes since v0.3.0:
|
20
|
+
|
21
|
+
* 843c1b5 Add SheetsV4.sheets_service (#13)
|
22
|
+
* 16a73f5 Refactor ValidateApiObject (#12)
|
23
|
+
* 1525cd3 Add a link in the README to the Sheet V4 API Discover Doc (#11)
|
24
|
+
* 6d5bfb3 Improve color api and documentation (#10)
|
25
|
+
|
7
26
|
## v0.3.0 (2023-09-28)
|
8
27
|
|
9
28
|
[Full Changelog](https://github.com/main-branch/sheets_v4/compare/v0.2.0..v0.3.0)
|
data/README.md
CHANGED
@@ -15,6 +15,8 @@ Unofficial helpers for the Google Sheets V4 API
|
|
15
15
|
* [Other Links](#other-links)
|
16
16
|
* [Installation](#installation)
|
17
17
|
* [Usage](#usage)
|
18
|
+
* [Obtaining an authenticated SheetsService](#obtaining-an-authenticated-sheetsservice)
|
19
|
+
* [Colors](#colors)
|
18
20
|
* [Development](#development)
|
19
21
|
* [Creating a Google API Service Account](#creating-a-google-api-service-account)
|
20
22
|
* [Contributing](#contributing)
|
@@ -27,6 +29,7 @@ Unofficial helpers for the Google Sheets V4 API
|
|
27
29
|
* [Google Sheets API Overview](https://developers.google.com/sheets/api)
|
28
30
|
* [Google Sheets API Reference](https://developers.google.com/sheets/api/reference/rest)
|
29
31
|
* [Batch Update Requests](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request)
|
32
|
+
* [Discovery Document for the Sheets API](https://sheets.googleapis.com/$discovery/rest?version=v4)
|
30
33
|
|
31
34
|
### Ruby Implementation of the Sheets API
|
32
35
|
|
@@ -55,6 +58,60 @@ gem install sheets_v4
|
|
55
58
|
|
56
59
|
[Detailed API documenation](https://rubydoc.info/gems/sheets_v4/) is hosted on rubygems.org.
|
57
60
|
|
61
|
+
### Obtaining an authenticated SheetsService
|
62
|
+
|
63
|
+
Typically, to construct an authenticated SheetsService object where the credential
|
64
|
+
is read from a file, the following code is required:
|
65
|
+
|
66
|
+
```Ruby
|
67
|
+
sheets_service = Google::Apis::SheetsV4::SheetsService.new
|
68
|
+
credential = File.read(File.expand_path('~/google-api-credential.json')) do |credential_source|
|
69
|
+
scopes = Google::Apis::SheetsV4::AUTH_SPREADSHEETS
|
70
|
+
options = { json_key_io: credential_source, scope: scopes }
|
71
|
+
Google::Auth::DefaultCredentials.make_creds(options).tap(&:fetch_access_token)
|
72
|
+
end
|
73
|
+
sheets_service.authorization = credential
|
74
|
+
```
|
75
|
+
|
76
|
+
The `SheetsV4.sheets_service` method simplifies this a bit.
|
77
|
+
|
78
|
+
By default, the credential is read from `~/.google-api-credential.json`. In that case,
|
79
|
+
an authenticated SheetsService object can be obtained with one method call:
|
80
|
+
|
81
|
+
```Ruby
|
82
|
+
sheets_service = SheetsV4.sheets_service
|
83
|
+
```
|
84
|
+
|
85
|
+
If the credential is stored elsewhere, pass the credential_source to `SheetsV4.sheets_service`
|
86
|
+
manually. `credential_source` can be a String:
|
87
|
+
|
88
|
+
```Ruby
|
89
|
+
sheets_service = SheetsV4.sheets_service(credential_sourvce: File.read('credential.json'))
|
90
|
+
```
|
91
|
+
|
92
|
+
an IO object:
|
93
|
+
|
94
|
+
```Ruby
|
95
|
+
sheets_service = File.open('credential.json') do |credential_source|
|
96
|
+
SheetsV4.sheets_service(credential_sourvce:)
|
97
|
+
end
|
98
|
+
```
|
99
|
+
|
100
|
+
or an already constructed `Google::Auth::*`` object.
|
101
|
+
|
102
|
+
### Colors
|
103
|
+
|
104
|
+
Color objects (with appropriate :red, :green, :blue values) can be retrieved by name
|
105
|
+
using `SheetsV4.color(:black)` or `SheetsV4::Color.black` (these are equivalent).
|
106
|
+
|
107
|
+
Color names can be listed using `SheetsV4.color_names`.
|
108
|
+
|
109
|
+
The color object returned is a Hash as follows:
|
110
|
+
|
111
|
+
```Ruby
|
112
|
+
SheetsV4::Color.black #=> {:red=>0.0, :green=>0.0, :blue=>0.0}
|
113
|
+
```
|
114
|
+
|
58
115
|
## Development
|
59
116
|
|
60
117
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
data/examples/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
* [ ] Creating a Google API service account [1](https://www.youtube.com/watch?v=sAgWCbGMzTo&list=PL3JVwFmb_BnSee8RFaRPZ3nykuMRlaQp1&index=1)
|
4
4
|
[2](https://www.youtube.com/watch?v=sVURhxyc6jE&list=PL3JVwFmb_BnSee8RFaRPZ3nykuMRlaQp1&index=43)
|
5
5
|
* [ ] Create a SheetsService instance
|
6
|
+
* [X] Set background color
|
6
7
|
* [ ] Creating Google Sheets files [1](https://www.youtube.com/watch?v=JRUxeQ6ZCy0&list=PL3JVwFmb_BnSee8RFaRPZ3nykuMRlaQp1&index=2)
|
7
8
|
* [ ] Writing data to a sheet [1](https://www.youtube.com/watch?v=YF7Ad-7pvks&list=PL3JVwFmb_BnSee8RFaRPZ3nykuMRlaQp1&index=3)
|
8
9
|
* [ ] Reading data from a sheet [1](https://www.youtube.com/watch?v=gkglr8GID5E&list=PL3JVwFmb_BnSee8RFaRPZ3nykuMRlaQp1&index=4)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'sheets_v4'
|
5
|
+
require 'googleauth'
|
6
|
+
|
7
|
+
# Example to show using the SheetsV4 module to set the background color of a cell
|
8
|
+
#
|
9
|
+
# GIVEN the credential file is at ~/.google-api-credential.json
|
10
|
+
# AND the spreadsheet id is 18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY
|
11
|
+
# AND the spreadsheet has a sheet whose id is 0
|
12
|
+
# WHEN the script is run
|
13
|
+
# THEN the sheet whose id is 0 will have the background color names starting at A2
|
14
|
+
# AND the background color of the cells in column B will be set to the color matching the color name in column A
|
15
|
+
|
16
|
+
# Build the requests
|
17
|
+
|
18
|
+
def name_rows
|
19
|
+
SheetsV4.color_names.map do |color_name|
|
20
|
+
{ values: [{ user_entered_value: { string_value: color_name.to_s } }] }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def write_names
|
25
|
+
rows = name_rows
|
26
|
+
fields = 'user_entered_value'
|
27
|
+
start = { sheet_id: 0, row_index: 1, column_index: 0 }
|
28
|
+
{ update_cells: { rows:, fields:, start: } }
|
29
|
+
end
|
30
|
+
|
31
|
+
def background_color_rows
|
32
|
+
SheetsV4.color_names.map { |color_name| SheetsV4.color(color_name) }.map do |color|
|
33
|
+
{ values: [{ user_entered_format: { background_color: color } }] }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_background_colors
|
38
|
+
rows = background_color_rows
|
39
|
+
fields = 'user_entered_format'
|
40
|
+
start = { sheet_id: 0, row_index: 1, column_index: 1 }
|
41
|
+
{ update_cells: { rows:, fields:, start: } }
|
42
|
+
end
|
43
|
+
|
44
|
+
def requests = { requests: [write_names, set_background_colors] }
|
45
|
+
|
46
|
+
# OPTIONAL: validate the requests against the schema before sending them to the API.
|
47
|
+
#
|
48
|
+
# While not necessary, it can be helpful to identify errors since the API will return
|
49
|
+
# an error if the request is invalid but does not tell you where the problem is.
|
50
|
+
#
|
51
|
+
SheetsV4.validate_api_object(schema_name: 'batch_update_spreadsheet_request', object: requests)
|
52
|
+
|
53
|
+
spreadsheet_id = '18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY'
|
54
|
+
SheetsV4.sheets_service.batch_update_spreadsheet(spreadsheet_id, requests)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'sheets_v4'
|
5
|
+
require 'googleauth'
|
6
|
+
|
7
|
+
# Example to show using the SheetsV4 module to set the background color of a cell
|
8
|
+
#
|
9
|
+
# GIVEN the credential file is at ~/.google-api-credential.json
|
10
|
+
# AND the spreadsheet id is 18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY
|
11
|
+
# AND the spreadsheet has a sheet whose id is 0
|
12
|
+
# WHEN the script is run
|
13
|
+
# THEN the sheet whose id is 0 will have the background color names starting at A2
|
14
|
+
# AND the background color of the cells in column B will be set to the color matching the color name in column A
|
15
|
+
|
16
|
+
# Build the requests
|
17
|
+
|
18
|
+
def name_rows
|
19
|
+
SheetsV4.color_names.map do |color_name|
|
20
|
+
Google::Apis::SheetsV4::RowData.new(
|
21
|
+
values: [
|
22
|
+
Google::Apis::SheetsV4::CellData.new(
|
23
|
+
user_entered_value: Google::Apis::SheetsV4::ExtendedValue.new(string_value: color_name.to_s)
|
24
|
+
)
|
25
|
+
]
|
26
|
+
)
|
27
|
+
# { values: [{ user_entered_value: { string_value: color_name.to_s } }] }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def write_names
|
32
|
+
rows = name_rows
|
33
|
+
fields = 'user_entered_value'
|
34
|
+
start = Google::Apis::SheetsV4::GridCoordinate.new(sheet_id: 0, row_index: 1, column_index: 0)
|
35
|
+
Google::Apis::SheetsV4::Request.new(
|
36
|
+
update_cells: Google::Apis::SheetsV4::UpdateCellsRequest.new(rows:, fields:, start:)
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def background_color_rows
|
41
|
+
SheetsV4.color_names.map { |color_name| SheetsV4.color(color_name) }.map do |color|
|
42
|
+
background_color = Google::Apis::SheetsV4::Color.new(**color)
|
43
|
+
user_entered_format = Google::Apis::SheetsV4::CellFormat.new(background_color:)
|
44
|
+
cell_data = Google::Apis::SheetsV4::CellData.new(user_entered_format:)
|
45
|
+
Google::Apis::SheetsV4::RowData.new(values: [cell_data])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def set_background_colors
|
50
|
+
rows = background_color_rows
|
51
|
+
fields = 'user_entered_format'
|
52
|
+
start = Google::Apis::SheetsV4::GridCoordinate.new(sheet_id: 0, row_index: 1, column_index: 1)
|
53
|
+
update_cells = Google::Apis::SheetsV4::UpdateCellsRequest.new(rows:, fields:, start:)
|
54
|
+
Google::Apis::SheetsV4::Request.new(update_cells:)
|
55
|
+
end
|
56
|
+
|
57
|
+
def requests = Google::Apis::SheetsV4::BatchUpdateSpreadsheetRequest.new(requests: [write_names, set_background_colors])
|
58
|
+
|
59
|
+
# OPTIONAL: validate the requests against the schema before sending them to the API.
|
60
|
+
#
|
61
|
+
# While not necessary, it can be helpful to identify errors since the API will return
|
62
|
+
# an error if the request is invalid but does not tell you where the problem is.
|
63
|
+
#
|
64
|
+
SheetsV4.validate_api_object(schema_name: 'batch_update_spreadsheet_request', object: requests.to_h)
|
65
|
+
|
66
|
+
spreadsheet_id = '18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY'
|
67
|
+
SheetsV4.sheets_service.batch_update_spreadsheet(spreadsheet_id, requests)
|
data/lib/sheets_v4/color.rb
CHANGED
@@ -3,30 +3,195 @@
|
|
3
3
|
require 'json_schemer'
|
4
4
|
|
5
5
|
module SheetsV4
|
6
|
-
#
|
6
|
+
# Returns predefined color objects by name
|
7
|
+
#
|
8
|
+
# A method is implemented for each color name. The list of available colors is
|
9
|
+
# given by `SheetsV4.color_names`.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# # Get a color object by name:
|
13
|
+
# SheetsV4::Color.black #=> { "red" => 0.0, "green" => 0.0, "blue" => 0.0 }
|
14
|
+
#
|
15
|
+
# @see SheetsV4.color a method that returns a color object by name
|
16
|
+
# @see SheetsV4.color_names an array of predefined color names
|
17
|
+
#
|
7
18
|
# @api public
|
19
|
+
#
|
8
20
|
class Color
|
9
21
|
class << self
|
10
|
-
# Return a color object for the given name from SheetsV4
|
22
|
+
# Return a color object for the given name from SheetsV4.color_names or call super
|
11
23
|
#
|
12
|
-
# @param method_name [
|
24
|
+
# @param method_name [#to_sym] the name of the color
|
13
25
|
# @param arguments [Array] ignored
|
14
26
|
# @param block [Proc] ignored
|
15
27
|
# @return [Hash] the color object
|
16
28
|
# @api private
|
17
29
|
def method_missing(method_name, *arguments, &)
|
18
|
-
|
30
|
+
COLORS[method_name.to_sym] || super
|
19
31
|
end
|
20
32
|
|
21
33
|
# Return true if the given method name is a color name or call super
|
22
34
|
#
|
23
|
-
# @param method_name [
|
35
|
+
# @param method_name [#to_sym] the name of the color
|
24
36
|
# @param include_private [Boolean] ignored
|
25
37
|
# @return [Boolean] true if the method name is a color name
|
26
38
|
# @api private
|
27
39
|
def respond_to_missing?(method_name, include_private = false)
|
28
|
-
|
40
|
+
COLORS.key?(method_name.to_sym) || super
|
29
41
|
end
|
30
42
|
end
|
43
|
+
|
44
|
+
# Colors to use in the Google Sheets API
|
45
|
+
COLORS = {
|
46
|
+
# Standard Google Sheets colors
|
47
|
+
#
|
48
|
+
black: { red: 0.00000000000, green: 0.00000000000, blue: 0.00000000000 },
|
49
|
+
dark_gray4: { red: 0.26274509804, green: 0.26274509804, blue: 0.26274509804 },
|
50
|
+
dark_gray3: { red: 0.40000000000, green: 0.40000000000, blue: 0.40000000000 },
|
51
|
+
dark_gray2: { red: 0.60000000000, green: 0.60000000000, blue: 0.60000000000 },
|
52
|
+
dark_gray1: { red: 0.71764705882, green: 0.71764705882, blue: 0.71764705882 },
|
53
|
+
gray: { red: 0.80000000000, green: 0.80000000000, blue: 0.80000000000 },
|
54
|
+
light_gray1: { red: 0.85098039216, green: 0.85098039216, blue: 0.85098039216 },
|
55
|
+
light_gray2: { red: 0.93725490196, green: 0.93725490196, blue: 0.93725490196 },
|
56
|
+
light_gray3: { red: 0.95294117647, green: 0.95294117647, blue: 0.95294117647 },
|
57
|
+
white: { red: 1.00000000000, green: 1.00000000000, blue: 1.00000000000 },
|
58
|
+
red_berry: { red: 0.59607843137, green: 0.00000000000, blue: 0.00000000000 },
|
59
|
+
red: { red: 1.00000000000, green: 0.00000000000, blue: 0.00000000000 },
|
60
|
+
orange: { red: 1.00000000000, green: 0.60000000000, blue: 0.00000000000 },
|
61
|
+
yellow: { red: 1.00000000000, green: 1.00000000000, blue: 0.00000000000 },
|
62
|
+
green: { red: 0.00000000000, green: 1.00000000000, blue: 0.00000000000 },
|
63
|
+
cyan: { red: 0.00000000000, green: 1.00000000000, blue: 1.00000000000 },
|
64
|
+
cornflower_blue: { red: 0.29019607843, green: 0.52549019608, blue: 0.90980392157 },
|
65
|
+
blue: { red: 0.00000000000, green: 0.00000000000, blue: 1.00000000000 },
|
66
|
+
purple: { red: 0.60000000000, green: 0.00000000000, blue: 1.00000000000 },
|
67
|
+
magenta: { red: 1.00000000000, green: 0.00000000000, blue: 1.00000000000 },
|
68
|
+
light_red_berry3: { red: 0.90196078431, green: 0.72156862745, blue: 0.68627450980 },
|
69
|
+
light_red3: { red: 0.95686274510, green: 0.80000000000, blue: 0.80000000000 },
|
70
|
+
light_orange3: { red: 0.98823529412, green: 0.89803921569, blue: 0.80392156863 },
|
71
|
+
light_yellow3: { red: 1.00000000000, green: 0.94901960784, blue: 0.80000000000 },
|
72
|
+
light_green3: { red: 0.85098039216, green: 0.91764705882, blue: 0.82745098039 },
|
73
|
+
light_cyan3: { red: 0.81568627451, green: 0.87843137255, blue: 0.89019607843 },
|
74
|
+
light_cornflower_blue3: { red: 0.78823529412, green: 0.85490196078, blue: 0.97254901961 },
|
75
|
+
light_blue3: { red: 0.81176470588, green: 0.88627450980, blue: 0.95294117647 },
|
76
|
+
light_purple3: { red: 0.85098039216, green: 0.82352941176, blue: 0.91372549020 },
|
77
|
+
light_magenta3: { red: 0.91764705882, green: 0.81960784314, blue: 0.86274509804 },
|
78
|
+
light_red_berry2: { red: 0.86666666667, green: 0.49411764706, blue: 0.41960784314 },
|
79
|
+
light_red2: { red: 0.91764705882, green: 0.60000000000, blue: 0.60000000000 },
|
80
|
+
light_orange2: { red: 0.97647058824, green: 0.79607843137, blue: 0.61176470588 },
|
81
|
+
light_yellow2: { red: 1.00000000000, green: 0.89803921569, blue: 0.60000000000 },
|
82
|
+
light_green2: { red: 0.71372549020, green: 0.84313725490, blue: 0.65882352941 },
|
83
|
+
light_cyan2: { red: 0.63529411765, green: 0.76862745098, blue: 0.78823529412 },
|
84
|
+
light_cornflower_blue2: { red: 0.64313725490, green: 0.76078431373, blue: 0.95686274510 },
|
85
|
+
light_blue2: { red: 0.62352941176, green: 0.77254901961, blue: 0.90980392157 },
|
86
|
+
light_purple2: { red: 0.70588235294, green: 0.65490196078, blue: 0.83921568627 },
|
87
|
+
light_magenta2: { red: 0.83529411765, green: 0.65098039216, blue: 0.74117647059 },
|
88
|
+
light_red_berry1: { red: 0.80000000000, green: 0.25490196078, blue: 0.14509803922 },
|
89
|
+
light_red1: { red: 0.87843137255, green: 0.40000000000, blue: 0.40000000000 },
|
90
|
+
light_orange1: { red: 0.96470588235, green: 0.69803921569, blue: 0.41960784314 },
|
91
|
+
light_yellow1: { red: 1.00000000000, green: 0.85098039216, blue: 0.40000000000 },
|
92
|
+
light_green1: { red: 0.57647058824, green: 0.76862745098, blue: 0.49019607843 },
|
93
|
+
light_cyan1: { red: 0.46274509804, green: 0.64705882353, blue: 0.68627450980 },
|
94
|
+
light_cornflower_blue1: { red: 0.42745098039, green: 0.61960784314, blue: 0.92156862745 },
|
95
|
+
light_blue1: { red: 0.43529411765, green: 0.65882352941, blue: 0.86274509804 },
|
96
|
+
light_purple1: { red: 0.55686274510, green: 0.48627450980, blue: 0.76470588235 },
|
97
|
+
light_magenta1: { red: 0.76078431373, green: 0.48235294118, blue: 0.62745098039 },
|
98
|
+
dark_red_berry1: { red: 0.65098039216, green: 0.10980392157, blue: 0.00000000000 },
|
99
|
+
dark_red1: { red: 0.80000000000, green: 0.00000000000, blue: 0.00000000000 },
|
100
|
+
dark_orange1: { red: 0.90196078431, green: 0.56862745098, blue: 0.21960784314 },
|
101
|
+
dark_yellow1: { red: 0.94509803922, green: 0.76078431373, blue: 0.19607843137 },
|
102
|
+
dark_green1: { red: 0.41568627451, green: 0.65882352941, blue: 0.30980392157 },
|
103
|
+
dark_cyan1: { red: 0.27058823529, green: 0.50588235294, blue: 0.55686274510 },
|
104
|
+
dark_cornflower_blue1: { red: 0.23529411765, green: 0.47058823529, blue: 0.84705882353 },
|
105
|
+
dark_blue1: { red: 0.23921568627, green: 0.52156862745, blue: 0.77647058824 },
|
106
|
+
dark_purple1: { red: 0.40392156863, green: 0.30588235294, blue: 0.65490196078 },
|
107
|
+
dark_magenta1: { red: 0.65098039216, green: 0.30196078431, blue: 0.47450980392 },
|
108
|
+
dark_red_berry2: { red: 0.52156862745, green: 0.12549019608, blue: 0.04705882353 },
|
109
|
+
dark_red2: { red: 0.60000000000, green: 0.00000000000, blue: 0.00000000000 },
|
110
|
+
dark_orange2: { red: 0.70588235294, green: 0.37254901961, blue: 0.02352941176 },
|
111
|
+
dark_yellow2: { red: 0.74901960784, green: 0.56470588235, blue: 0.00000000000 },
|
112
|
+
dark_green2: { red: 0.21960784314, green: 0.46274509804, blue: 0.11372549020 },
|
113
|
+
dark_cyan2: { red: 0.07450980392, green: 0.30980392157, blue: 0.36078431373 },
|
114
|
+
dark_cornflower_blue2: { red: 0.06666666667, green: 0.33333333333, blue: 0.80000000000 },
|
115
|
+
dark_blue2: { red: 0.04313725490, green: 0.32549019608, blue: 0.58039215686 },
|
116
|
+
dark_purple2: { red: 0.20784313725, green: 0.10980392157, blue: 0.45882352941 },
|
117
|
+
dark_magenta2: { red: 0.45490196078, green: 0.10588235294, blue: 0.27843137255 },
|
118
|
+
dark_red_berry3: { red: 0.35686274510, green: 0.05882352941, blue: 0.00000000000 },
|
119
|
+
dark_red3: { red: 0.40000000000, green: 0.00000000000, blue: 0.00000000000 },
|
120
|
+
dark_orange3: { red: 0.47058823529, green: 0.24705882353, blue: 0.01568627451 },
|
121
|
+
dark_yellow3: { red: 0.49803921569, green: 0.37647058824, blue: 0.00000000000 },
|
122
|
+
dark_green3: { red: 0.15294117647, green: 0.30588235294, blue: 0.07450980392 },
|
123
|
+
darn_cyan3: { red: 0.04705882353, green: 0.20392156863, blue: 0.23921568627 },
|
124
|
+
dark_cornflower_blue3: { red: 0.10980392157, green: 0.27058823529, blue: 0.52941176471 },
|
125
|
+
dark_blue3: { red: 0.02745098039, green: 0.21568627451, blue: 0.38823529412 },
|
126
|
+
dark_purple3: { red: 0.12549019608, green: 0.07058823529, blue: 0.30196078431 },
|
127
|
+
dark_magenta3: { red: 0.29803921569, green: 0.06666666667, blue: 0.18823529412 },
|
128
|
+
|
129
|
+
# Yahoo brand colors
|
130
|
+
#
|
131
|
+
grape_jelly: { red: 0.37647058824, green: 0.00392156863, blue: 0.82352941176 },
|
132
|
+
hulk_pants: { red: 0.49411764706, green: 0.12156862745, blue: 1.00000000000 },
|
133
|
+
malbec: { red: 0.22352941176, green: 0.00000000000, blue: 0.49019607843 },
|
134
|
+
tumeric: { red: 1.00000000000, green: 0.65490196078, blue: 0.00000000000 },
|
135
|
+
mulah: { red: 0.10196078431, green: 0.77254901961, blue: 0.40392156863 },
|
136
|
+
dory: { red: 0.05882352941, green: 0.41176470588, blue: 1.00000000000 },
|
137
|
+
malibu: { red: 1.00000000000, green: 0.00000000000, blue: 0.50196078431 },
|
138
|
+
sea_foam: { red: 0.06666666667, green: 0.82745098039, blue: 0.80392156863 },
|
139
|
+
tumeric_tint: { red: 0.98039215686, green: 0.86666666667, blue: 0.69411764706 },
|
140
|
+
mulah_tint: { red: 0.73333333333, green: 0.90196078431, blue: 0.77647058824 },
|
141
|
+
dory_tint: { red: 0.66274509804, green: 0.77254901961, blue: 0.98431372549 },
|
142
|
+
malibu_tint: { red: 0.96862745098, green: 0.68235294118, blue: 0.80000000000 },
|
143
|
+
sea_foam_tint: { red: 0.74901960784, green: 0.92549019608, blue: 0.92156862745 },
|
144
|
+
|
145
|
+
# Yahoo health colors
|
146
|
+
#
|
147
|
+
health_green: { red: 0.00000000000, green: 0.69019607843, blue: 0.31372549020 },
|
148
|
+
health_yellow: { red: 1.00000000000, green: 0.65490196078, blue: 0.00000000000 },
|
149
|
+
health_red: { red: 1.00000000000, green: 0.00000000000, blue: 0.00000000000 },
|
150
|
+
|
151
|
+
# Yahoo Fuji design color palette
|
152
|
+
#
|
153
|
+
fuji_color_watermelon: { red: 1.00000000000, green: 0.32156862745, blue: 0.34117647059 },
|
154
|
+
fuji_color_solo_cup: { red: 0.92156862745, green: 0.05882352941, blue: 0.16078431373 },
|
155
|
+
fuji_color_malibu: { red: 1.00000000000, green: 0.00000000000, blue: 0.50196078431 },
|
156
|
+
fuji_color_barney: { red: 0.80000000000, green: 0.00000000000, blue: 0.54901960784 },
|
157
|
+
fuji_color_mimosa: { red: 1.00000000000, green: 0.82745098039, blue: 0.20000000000 },
|
158
|
+
fuji_color_turmeric: { red: 1.00000000000, green: 0.65490196078, blue: 0.00000000000 },
|
159
|
+
fuji_color_cheetos: { red: 0.99215686275, green: 0.38039215686, blue: 0.00000000000 },
|
160
|
+
fuji_color_carrot_juice: { red: 1.00000000000, green: 0.32156862745, blue: 0.05098039216 },
|
161
|
+
fuji_color_mulah: { red: 0.10196078431, green: 0.77254901961, blue: 0.40392156863 },
|
162
|
+
fuji_color_bonsai: { red: 0.00000000000, green: 0.52941176471, blue: 0.31764705882 },
|
163
|
+
fuji_color_spirulina: { red: 0.00000000000, green: 0.62745098039, blue: 0.62745098039 },
|
164
|
+
fuji_color_sea_foam: { red: 0.06666666667, green: 0.82745098039, blue: 0.80392156863 },
|
165
|
+
fuji_color_peeps: { red: 0.49019607843, green: 0.79607843137, blue: 1.00000000000 },
|
166
|
+
fuji_color_sky: { red: 0.07058823529, green: 0.66274509804, blue: 1.00000000000 },
|
167
|
+
fuji_color_dory: { red: 0.05882352941, green: 0.41176470588, blue: 1.00000000000 },
|
168
|
+
fuji_color_scooter: { red: 0.00000000000, green: 0.38823529412, blue: 0.92156862745 },
|
169
|
+
fuji_color_cobalt: { red: 0.00000000000, green: 0.22745098039, blue: 0.73725490196 },
|
170
|
+
fuji_color_denim: { red: 0.10196078431, green: 0.05098039216, blue: 0.67058823529 },
|
171
|
+
fuji_color_blurple: { red: 0.36470588235, green: 0.36862745098, blue: 1.00000000000 },
|
172
|
+
fuji_color_hendrix: { red: 0.97254901961, green: 0.95686274510, blue: 1.00000000000 },
|
173
|
+
fuji_color_thanos: { red: 0.56470588235, green: 0.48627450980, blue: 1.00000000000 },
|
174
|
+
fuji_color_starfish: { red: 0.46666666667, green: 0.34901960784, blue: 1.00000000000 },
|
175
|
+
fuji_color_hulk_pants: { red: 0.49411764706, green: 0.12156862745, blue: 1.00000000000 },
|
176
|
+
fuji_color_grape_jelly: { red: 0.37647058824, green: 0.00392156863, blue: 0.82352941176 },
|
177
|
+
fuji_color_mulberry: { red: 0.31372549020, green: 0.08235294118, blue: 0.69019607843 },
|
178
|
+
fuji_color_malbec: { red: 0.22352941176, green: 0.00000000000, blue: 0.49019607843 },
|
179
|
+
fuji_grayscale_black: { red: 0.00000000000, green: 0.00000000000, blue: 0.00000000000 },
|
180
|
+
fuji_grayscale_midnight: { red: 0.06274509804, green: 0.08235294118, blue: 0.09411764706 },
|
181
|
+
fuji_grayscale_inkwell: { red: 0.11372549020, green: 0.13333333333, blue: 0.15686274510 },
|
182
|
+
fuji_grayscale_batcave: { red: 0.13725490196, green: 0.16470588235, blue: 0.19215686275 },
|
183
|
+
fuji_grayscale_ramones: { red: 0.17254901961, green: 0.21176470588, blue: 0.24705882353 },
|
184
|
+
fuji_grayscale_charcoal: { red: 0.27450980392, green: 0.30588235294, blue: 0.33725490196 },
|
185
|
+
fuji_grayscale_battleship: { red: 0.35686274510, green: 0.38823529412, blue: 0.41568627451 },
|
186
|
+
fuji_grayscale_dolphin: { red: 0.43137254902, green: 0.46666666667, blue: 0.50196078431 },
|
187
|
+
fuji_grayscale_shark: { red: 0.50980392157, green: 0.54117647059, blue: 0.57647058824 },
|
188
|
+
fuji_grayscale_gandalf: { red: 0.59215686275, green: 0.61960784314, blue: 0.65882352941 },
|
189
|
+
fuji_grayscale_bob: { red: 0.69019607843, green: 0.72549019608, blue: 0.75686274510 },
|
190
|
+
fuji_grayscale_pebble: { red: 0.78039215686, green: 0.80392156863, blue: 0.82352941176 },
|
191
|
+
fuji_grayscale_dirty_seagull: { red: 0.87843137255, green: 0.89411764706, blue: 0.91372549020 },
|
192
|
+
fuji_grayscale_grey_hair: { red: 0.94117647059, green: 0.95294117647, blue: 0.96078431373 },
|
193
|
+
fuji_grayscale_marshmallow: { red: 0.96078431373, green: 0.97254901961, blue: 0.98039215686 },
|
194
|
+
fuji_grayscale_white: { red: 1.00000000000, green: 1.00000000000, blue: 1.00000000000 }
|
195
|
+
}.freeze.each_value(&:freeze)
|
31
196
|
end
|
32
197
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json_schemer'
|
4
|
+
|
5
|
+
module SheetsV4
|
6
|
+
# Creates a Google API credential with an access token
|
7
|
+
#
|
8
|
+
class CredentialCreator
|
9
|
+
# Creates a Google API credential with an access token
|
10
|
+
#
|
11
|
+
# This wraps the boiler plate code into one function to make constructing a
|
12
|
+
# credential easy and less error prone.
|
13
|
+
#
|
14
|
+
# @example Constructing a credential from the contents of ~/.credential
|
15
|
+
# credential_source = File.read(File.join(Dir.home, '.credential'))
|
16
|
+
# scope = Google::Apis::SheetsV4::AUTH_SPREADSHEETS
|
17
|
+
# credential = GoogleApisHelpers.credential(credential_source, scope)
|
18
|
+
#
|
19
|
+
# @param [Google::Auth::*, String, IO, nil] credential_source may be one of four things:
|
20
|
+
# (1) a previously created credential that you want to reuse, (2) a credential read
|
21
|
+
# into a string, (3) an IO object with the credential ready to be read, or (4)
|
22
|
+
# if nill, the credential is read from ~/.google-api-credential.json
|
23
|
+
# @param scopes [Object, Array] one or more scopes to access.
|
24
|
+
# @param credential_factory [#make_creds] Used inject the credential_factory for tests
|
25
|
+
#
|
26
|
+
# @return [Object] a credential object with an access token
|
27
|
+
#
|
28
|
+
def self.call(
|
29
|
+
credential_source, scopes, credential_factory = Google::Auth::DefaultCredentials
|
30
|
+
)
|
31
|
+
return credential_source if credential?(credential_source)
|
32
|
+
|
33
|
+
credential_source ||= default_credential_source
|
34
|
+
options = make_creds_options(credential_source, scopes)
|
35
|
+
credential_factory.make_creds(options).tap(&:fetch_access_token)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Reads credential source from `~/.google-api-credential.json`
|
41
|
+
#
|
42
|
+
# @return [String] the credential as a string
|
43
|
+
#
|
44
|
+
# @api private
|
45
|
+
#
|
46
|
+
private_class_method def self.default_credential_source
|
47
|
+
File.read(File.expand_path('~/.google-api-credential.json'))
|
48
|
+
end
|
49
|
+
|
50
|
+
# Constructs creds_options needed to create a credential
|
51
|
+
#
|
52
|
+
# @param [Google::Auth::*, String, #read] credential_source a credential (which
|
53
|
+
# is an object whose class is in the Google::Auth module), a String containing
|
54
|
+
# the credential, or a IO object with the credential ready to be read.
|
55
|
+
#
|
56
|
+
# @return [Hash] returns the cred_options
|
57
|
+
#
|
58
|
+
# @api private
|
59
|
+
#
|
60
|
+
private_class_method def self.make_creds_options(credential_source, scopes)
|
61
|
+
{ json_key_io: to_io(credential_source), scope: scopes }
|
62
|
+
end
|
63
|
+
|
64
|
+
# Wraps a credential_source that is a string in a StringIO
|
65
|
+
#
|
66
|
+
# @param [Google::Auth::*, String, #read] credential_source a credential (which
|
67
|
+
# is an object whose class is in the Google::Auth module), a String containing
|
68
|
+
# the credential, or a IO object with the credential ready to be read.
|
69
|
+
#
|
70
|
+
# @return [IO, StringIO] returns a StringIO object is a String was passed in.
|
71
|
+
#
|
72
|
+
# @api private
|
73
|
+
#
|
74
|
+
private_class_method def self.to_io(credential_source)
|
75
|
+
credential_source.is_a?(String) ? StringIO.new(credential_source) : credential_source
|
76
|
+
end
|
77
|
+
|
78
|
+
# Determines if a credential_source is already a credential
|
79
|
+
#
|
80
|
+
# @param [Google::Auth::*, String, #read] credential_source a credential (which
|
81
|
+
# is an object whose class is in the Google::Auth module), a String containing
|
82
|
+
# the credential, or a IO object with the credential ready to be read.
|
83
|
+
#
|
84
|
+
# @return [Boolean] true if the credential source is an object whose class is in the
|
85
|
+
# Google::Auth module.
|
86
|
+
#
|
87
|
+
# @api private
|
88
|
+
#
|
89
|
+
private_class_method def self.credential?(credential_source)
|
90
|
+
credential_source.class.name.start_with?('Google::Auth::')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|