sheets_v4 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +11 -0
- data/README.md +57 -0
- data/examples/README.md +1 -0
- data/examples/set_background_color +52 -0
- data/lib/sheets_v4/color.rb +171 -6
- data/lib/sheets_v4/credential_creator.rb +93 -0
- data/lib/sheets_v4/validate_api_object.rb +43 -1
- data/lib/sheets_v4/version.rb +1 -1
- data/lib/sheets_v4.rb +50 -191
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6357385eeb33468356dd974f8fda49f92e09b30b9911a825c562509bf5f70dd
|
4
|
+
data.tar.gz: a289b95495fd49e8221a89e037168aaae903ca40af2f9167cff60c75c0f28acc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59b81fbfa525ee8f5810d1aeeb3d6168dfffe0ffd1a8c19792d8f27548cdb1b2106748a30f499f8619bd83cd73d773c5647f0b7fd57640c990af2eb7e9d5fd7b
|
7
|
+
data.tar.gz: '09ffa389430c102e6e4df4370bc42f2e8769399f78cabbfe61441372ed6bf4a87378a124a3c17fe0c7f53a73255fae7f153cd08df67e93589c5bcbb49360166e'
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,17 @@ 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.4.0 (2023-09-29)
|
8
|
+
|
9
|
+
[Full Changelog](https://github.com/main-branch/sheets_v4/compare/v0.3.0..v0.4.0)
|
10
|
+
|
11
|
+
Changes since v0.3.0:
|
12
|
+
|
13
|
+
* 843c1b5 Add SheetsV4.sheets_service (#13)
|
14
|
+
* 16a73f5 Refactor ValidateApiObject (#12)
|
15
|
+
* 1525cd3 Add a link in the README to the Sheet V4 API Discover Doc (#11)
|
16
|
+
* 6d5bfb3 Improve color api and documentation (#10)
|
17
|
+
|
7
18
|
## v0.3.0 (2023-09-28)
|
8
19
|
|
9
20
|
[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,52 @@
|
|
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
|
+
# SheetsV4.validate_api_object(
|
47
|
+
# schema_name: 'BatchUpdateSpreadsheetRequest', object: request,
|
48
|
+
# logger: Logger.new(STDOUT, level: Logger::ERROR)
|
49
|
+
# )
|
50
|
+
|
51
|
+
spreadsheet_id = '18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY'
|
52
|
+
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
|
@@ -121,12 +121,54 @@ module SheetsV4
|
|
121
121
|
def call(ref)
|
122
122
|
schema_name = ref.path[1..]
|
123
123
|
logger.debug { "Reading schema #{schema_name}" }
|
124
|
-
schema_object =
|
124
|
+
schema_object = self.class.api_object_schemas[schema_name]
|
125
125
|
raise "Schema for #{ref} not found" unless schema_object
|
126
126
|
|
127
127
|
schema_object.to_h.tap do |schema|
|
128
128
|
schema['unevaluatedProperties'] = false
|
129
129
|
end
|
130
130
|
end
|
131
|
+
|
132
|
+
# A hash of schemas keyed by the schema name loaded from the Google Discovery API
|
133
|
+
#
|
134
|
+
# @example
|
135
|
+
# SheetsV4.api_object_schemas #=> { 'PersonSchema' => { 'type' => 'object', ... } ... }
|
136
|
+
#
|
137
|
+
# @return [Hash<String, Object>] a hash of schemas keyed by schema name
|
138
|
+
#
|
139
|
+
def self.api_object_schemas
|
140
|
+
schema_load_semaphore.synchronize { @api_object_schemas ||= load_api_object_schemas }
|
141
|
+
end
|
142
|
+
|
143
|
+
# Validate
|
144
|
+
# A mutex used to synchronize access to the schemas so they are only loaded
|
145
|
+
# once.
|
146
|
+
#
|
147
|
+
@schema_load_semaphore = Thread::Mutex.new
|
148
|
+
|
149
|
+
class << self
|
150
|
+
# A mutex used to synchronize access to the schemas so they are only loaded once
|
151
|
+
#
|
152
|
+
# @return [Thread::Mutex]
|
153
|
+
#
|
154
|
+
# @api private
|
155
|
+
#
|
156
|
+
attr_reader :schema_load_semaphore
|
157
|
+
end
|
158
|
+
|
159
|
+
# Load the schemas from the Google Discovery API
|
160
|
+
#
|
161
|
+
# @return [Hash<String, Object>] a hash of schemas keyed by schema name
|
162
|
+
#
|
163
|
+
# @api private
|
164
|
+
#
|
165
|
+
def self.load_api_object_schemas
|
166
|
+
source = 'https://sheets.googleapis.com/$discovery/rest?version=v4'
|
167
|
+
resp = Net::HTTP.get_response(URI.parse(source))
|
168
|
+
data = resp.body
|
169
|
+
JSON.parse(data)['schemas'].tap do |schemas|
|
170
|
+
schemas.each { |_name, schema| schema['unevaluatedProperties'] = false }
|
171
|
+
end
|
172
|
+
end
|
131
173
|
end
|
132
174
|
end
|
data/lib/sheets_v4/version.rb
CHANGED
data/lib/sheets_v4.rb
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
|
3
3
|
require_relative 'sheets_v4/version'
|
4
4
|
require_relative 'sheets_v4/color'
|
5
|
+
require_relative 'sheets_v4/credential_creator'
|
5
6
|
require_relative 'sheets_v4/validate_api_object'
|
6
7
|
|
8
|
+
require 'google/apis/sheets_v4'
|
7
9
|
require 'json'
|
8
10
|
require 'logger'
|
9
11
|
require 'net/http'
|
@@ -13,6 +15,38 @@ require 'net/http'
|
|
13
15
|
# @api public
|
14
16
|
#
|
15
17
|
module SheetsV4
|
18
|
+
# Create a new Google::Apis::SheetsV4::SheetsService object
|
19
|
+
#
|
20
|
+
# Simplifies creating and configuring a the credential.
|
21
|
+
#
|
22
|
+
# @example using the crednetial in `~/.google-api-credential`
|
23
|
+
# SheetsV4.sheets_service
|
24
|
+
#
|
25
|
+
# @example using a credential passed in as a string
|
26
|
+
# credential_source = File.read(File.join(Dir.home, '.credential'))
|
27
|
+
# SheetsV4.sheets_service(credential_source:
|
28
|
+
#
|
29
|
+
# @param credential_source [nil, String, IO, Google::Auth::*] may
|
30
|
+
# be either an already constructed credential, the credential read into a String or
|
31
|
+
# an open file with the credential ready to be read. Passing `nil` will result
|
32
|
+
# in the credential being read from `~/.google-api-credential.json`.
|
33
|
+
#
|
34
|
+
# @param scopes [Object, Array] one or more scopes to access.
|
35
|
+
#
|
36
|
+
# @param credential_creator [#credential] Used to inject the credential creator for
|
37
|
+
# testing.
|
38
|
+
#
|
39
|
+
# @return a new SheetsService instance
|
40
|
+
#
|
41
|
+
def self.sheets_service(credential_source: nil, scopes: nil, credential_creator: SheetsV4::CredentialCreator)
|
42
|
+
credential_source ||= File.read(File.expand_path('~/.google-api-credential.json'))
|
43
|
+
scopes ||= [Google::Apis::SheetsV4::AUTH_SPREADSHEETS]
|
44
|
+
|
45
|
+
Google::Apis::SheetsV4::SheetsService.new.tap do |service|
|
46
|
+
service.authorization = credential_creator.call(credential_source, scopes)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
16
50
|
# Validate the object using the named JSON schema
|
17
51
|
#
|
18
52
|
# The JSON schemas are loaded from the Google Disocvery API. The schemas names are
|
@@ -35,208 +69,33 @@ module SheetsV4
|
|
35
69
|
ValidateApiObject.new(logger).call(schema_name, object)
|
36
70
|
end
|
37
71
|
|
38
|
-
#
|
39
|
-
#
|
40
|
-
# @example
|
41
|
-
# SheetsV4.api_object_schemas #=> { 'PersonSchema' => { 'type' => 'object', ... } ... }
|
42
|
-
#
|
43
|
-
# @return [Hash<String, Object>] a hash of schemas keyed by schema name
|
72
|
+
# Given the name of the color, return a Google Sheets API color object
|
44
73
|
#
|
45
|
-
|
46
|
-
schema_load_semaphore.synchronize { @api_object_schemas ||= load_api_object_schemas }
|
47
|
-
end
|
48
|
-
|
49
|
-
# Validate
|
50
|
-
# A mutex used to synchronize access to the schemas so they are only loaded
|
51
|
-
# once.
|
52
|
-
#
|
53
|
-
@schema_load_semaphore = Thread::Mutex.new
|
54
|
-
|
55
|
-
# A mutex used to synchronize access to the schemas so they are only loaded once
|
74
|
+
# Available color names are listed using `SheetsV4.color_names`.
|
56
75
|
#
|
57
|
-
#
|
76
|
+
# The object returned is frozen. If you want a color you can change (for instance,
|
77
|
+
# to adjust the `alpha` attribute), you must clone the object returned.
|
58
78
|
#
|
59
|
-
# @
|
79
|
+
# @example
|
80
|
+
# SheetsV4::Color.color(:red) #=> { "red": 1.0, "green": 0.0, "blue": 0.0 }
|
60
81
|
#
|
61
|
-
|
62
|
-
|
63
|
-
# Load the schemas from the Google Discovery API
|
82
|
+
# @param name [#to_sym] the name of the color requested
|
64
83
|
#
|
65
|
-
# @return [Hash
|
84
|
+
# @return [Hash] The color requested e.g. `{ "red": 1.0, "green": 0.0, "blue": 0.0 }`
|
66
85
|
#
|
67
|
-
# @api
|
86
|
+
# @api public
|
68
87
|
#
|
69
|
-
def self.
|
70
|
-
|
71
|
-
resp = Net::HTTP.get_response(URI.parse(source))
|
72
|
-
data = resp.body
|
73
|
-
JSON.parse(data)['schemas'].tap do |schemas|
|
74
|
-
schemas.each { |_name, schema| schema['unevaluatedProperties'] = false }
|
75
|
-
end
|
88
|
+
def self.color(name)
|
89
|
+
SheetsV4::Color::COLORS[name.to_sym] || raise("Color #{name} not found")
|
76
90
|
end
|
77
91
|
|
78
|
-
#
|
92
|
+
# List the names of the colors available to use in the Google Sheets API
|
79
93
|
#
|
80
94
|
# @example
|
81
|
-
# SheetsV4::Color.
|
95
|
+
# SheetsV4::Color.color_names #=> [:black, :white, :red, :green, :blue, :yellow, :magenta, :cyan, ...]
|
82
96
|
#
|
83
|
-
# @
|
84
|
-
# @return [Hash] the color object
|
97
|
+
# @return [Array<Symbol>] the names of the colors available
|
85
98
|
# @api public
|
86
|
-
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
# Colors to use in the Google Sheets API
|
91
|
-
COLORS = {
|
92
|
-
# Standard Google Sheets colors
|
93
|
-
|
94
|
-
black: { red: 0.000000000, green: 0.000000000, blue: 0.000000000 },
|
95
|
-
dark_gray4: { red: 0.262745098, green: 0.262745098, blue: 0.262745098 },
|
96
|
-
dark_gray3: { red: 0.400000000, green: 0.400000000, blue: 0.400000000 },
|
97
|
-
dark_gray2: { red: 0.600000000, green: 0.600000000, blue: 0.600000000 },
|
98
|
-
dark_gray1: { red: 0.717647059, green: 0.717647059, blue: 0.717647059 },
|
99
|
-
gray: { red: 0.800000000, green: 0.800000000, blue: 0.800000000 },
|
100
|
-
light_gray1: { red: 0.850980392, green: 0.850980392, blue: 0.850980392 },
|
101
|
-
light_gray2: { red: 0.937254902, green: 0.937254902, blue: 0.937254902 },
|
102
|
-
light_gray3: { red: 0.952941176, green: 0.952941176, blue: 0.952941176 },
|
103
|
-
white: { red: 1.000000000, green: 1.000000000, blue: 1.000000000 },
|
104
|
-
red_berry: { red: 0.596078431, green: 0.000000000, blue: 0.000000000 },
|
105
|
-
red: { red: 1.000000000, green: 0.000000000, blue: 0.000000000 },
|
106
|
-
orange: { red: 1.000000000, green: 0.600000000, blue: 0.000000000 },
|
107
|
-
yellow: { red: 1.000000000, green: 1.000000000, blue: 0.000000000 },
|
108
|
-
green: { red: 0.000000000, green: 1.000000000, blue: 0.000000000 },
|
109
|
-
cyan: { red: 0.000000000, green: 1.000000000, blue: 1.000000000 },
|
110
|
-
cornflower_blue: { red: 0.290196078, green: 0.525490196, blue: 0.909803922 },
|
111
|
-
blue: { red: 0.000000000, green: 0.000000000, blue: 1.000000000 },
|
112
|
-
purple: { red: 0.600000000, green: 0.000000000, blue: 1.000000000 },
|
113
|
-
magenta: { red: 1.000000000, green: 0.000000000, blue: 1.000000000 },
|
114
|
-
light_red_berry3: { red: 0.901960784, green: 0.721568627, blue: 0.686274510 },
|
115
|
-
light_red3: { red: 0.956862745, green: 0.800000000, blue: 0.800000000 },
|
116
|
-
light_orange3: { red: 0.988235294, green: 0.898039216, blue: 0.803921569 },
|
117
|
-
light_yellow3: { red: 1.000000000, green: 0.949019608, blue: 0.800000000 },
|
118
|
-
light_green3: { red: 0.850980392, green: 0.917647059, blue: 0.827450980 },
|
119
|
-
light_cyan3: { red: 0.815686275, green: 0.878431373, blue: 0.890196078 },
|
120
|
-
light_cornflower_blue3: { red: 0.788235294, green: 0.854901961, blue: 0.972549020 },
|
121
|
-
light_blue3: { red: 0.811764706, green: 0.886274510, blue: 0.952941176 },
|
122
|
-
light_purple3: { red: 0.850980392, green: 0.823529412, blue: 0.913725490 },
|
123
|
-
light_magenta3: { red: 0.917647059, green: 0.819607843, blue: 0.862745098 },
|
124
|
-
light_red_berry2: { red: 0.866666667, green: 0.494117647, blue: 0.419607843 },
|
125
|
-
light_red2: { red: 0.917647059, green: 0.600000000, blue: 0.600000000 },
|
126
|
-
light_orange2: { red: 0.976470588, green: 0.796078431, blue: 0.611764706 },
|
127
|
-
light_yellow2: { red: 1.000000000, green: 0.898039216, blue: 0.600000000 },
|
128
|
-
light_green2: { red: 0.713725490, green: 0.843137255, blue: 0.658823529 },
|
129
|
-
light_cyan2: { red: 0.635294118, green: 0.768627451, blue: 0.788235294 },
|
130
|
-
light_cornflower_blue2: { red: 0.643137255, green: 0.760784314, blue: 0.956862745 },
|
131
|
-
light_blue2: { red: 0.623529412, green: 0.772549020, blue: 0.909803922 },
|
132
|
-
light_purple2: { red: 0.705882353, green: 0.654901961, blue: 0.839215686 },
|
133
|
-
light_magenta2: { red: 0.835294118, green: 0.650980392, blue: 0.741176471 },
|
134
|
-
light_red_berry1: { red: 0.800000000, green: 0.254901961, blue: 0.145098039 },
|
135
|
-
light_red1: { red: 0.878431373, green: 0.400000000, blue: 0.400000000 },
|
136
|
-
light_orange1: { red: 0.964705882, green: 0.698039216, blue: 0.419607843 },
|
137
|
-
light_yellow1: { red: 1.000000000, green: 0.850980392, blue: 0.400000000 },
|
138
|
-
light_green1: { red: 0.576470588, green: 0.768627451, blue: 0.490196078 },
|
139
|
-
light_cyan1: { red: 0.462745098, green: 0.647058824, blue: 0.686274510 },
|
140
|
-
light_cornflower_blue1: { red: 0.427450980, green: 0.619607843, blue: 0.921568627 },
|
141
|
-
light_blue1: { red: 0.435294118, green: 0.658823529, blue: 0.862745098 },
|
142
|
-
light_purple1: { red: 0.556862745, green: 0.486274510, blue: 0.764705882 },
|
143
|
-
light_magenta1: { red: 0.760784314, green: 0.482352941, blue: 0.627450980 },
|
144
|
-
dark_red_berry1: { red: 0.650980392, green: 0.109803922, blue: 0.000000000 },
|
145
|
-
dark_red1: { red: 0.800000000, green: 0.000000000, blue: 0.000000000 },
|
146
|
-
dark_orange1: { red: 0.901960784, green: 0.568627451, blue: 0.219607843 },
|
147
|
-
dark_yellow1: { red: 0.945098039, green: 0.760784314, blue: 0.196078431 },
|
148
|
-
dark_green1: { red: 0.415686275, green: 0.658823529, blue: 0.309803922 },
|
149
|
-
dark_cyan1: { red: 0.270588235, green: 0.505882353, blue: 0.556862745 },
|
150
|
-
dark_cornflower_blue1: { red: 0.235294118, green: 0.470588235, blue: 0.847058824 },
|
151
|
-
dark_blue1: { red: 0.239215686, green: 0.521568627, blue: 0.776470588 },
|
152
|
-
dark_purple1: { red: 0.403921569, green: 0.305882353, blue: 0.654901961 },
|
153
|
-
dark_magenta1: { red: 0.650980392, green: 0.301960784, blue: 0.474509804 },
|
154
|
-
dark_red_berry2: { red: 0.521568627, green: 0.125490196, blue: 0.047058824 },
|
155
|
-
dark_red2: { red: 0.600000000, green: 0.000000000, blue: 0.000000000 },
|
156
|
-
dark_orange2: { red: 0.705882353, green: 0.372549020, blue: 0.023529412 },
|
157
|
-
dark_yellow2: { red: 0.749019608, green: 0.564705882, blue: 0.000000000 },
|
158
|
-
dark_green2: { red: 0.219607843, green: 0.462745098, blue: 0.113725490 },
|
159
|
-
dark_cyan2: { red: 0.074509804, green: 0.309803922, blue: 0.360784314 },
|
160
|
-
dark_cornflower_blue2: { red: 0.066666667, green: 0.333333333, blue: 0.800000000 },
|
161
|
-
dark_blue2: { red: 0.043137255, green: 0.325490196, blue: 0.580392157 },
|
162
|
-
dark_purple2: { red: 0.207843137, green: 0.109803922, blue: 0.458823529 },
|
163
|
-
dark_magenta2: { red: 0.454901961, green: 0.105882353, blue: 0.278431373 },
|
164
|
-
dark_red_berry3: { red: 0.356862745, green: 0.058823529, blue: 0.000000000 },
|
165
|
-
dark_red3: { red: 0.400000000, green: 0.000000000, blue: 0.000000000 },
|
166
|
-
dark_orange3: { red: 0.470588235, green: 0.247058824, blue: 0.015686275 },
|
167
|
-
dark_yellow3: { red: 0.498039216, green: 0.376470588, blue: 0.000000000 },
|
168
|
-
dark_green3: { red: 0.152941176, green: 0.305882353, blue: 0.074509804 },
|
169
|
-
darn_cyan3: { red: 0.047058824, green: 0.203921569, blue: 0.239215686 },
|
170
|
-
dark_cornflower_blue3: { red: 0.109803922, green: 0.270588235, blue: 0.529411765 },
|
171
|
-
dark_blue3: { red: 0.027450980, green: 0.215686275, blue: 0.388235294 },
|
172
|
-
dark_purple3: { red: 0.125490196, green: 0.070588235, blue: 0.301960784 },
|
173
|
-
dark_magenta3: { red: 0.298039216, green: 0.066666667, blue: 0.188235294 },
|
174
|
-
|
175
|
-
# Yahoo brand colors
|
176
|
-
|
177
|
-
grape_jelly: { red: 0.376470588, green: 0.003921569, blue: 0.823529412 },
|
178
|
-
hulk_pants: { red: 0.494117647, green: 0.121568627, blue: 1.000000000 },
|
179
|
-
malbec: { red: 0.223529412, green: 0.000000000, blue: 0.490196078 },
|
180
|
-
tumeric: { red: 1.000000000, green: 0.654901961, blue: 0.000000000 },
|
181
|
-
mulah: { red: 0.101960784, green: 0.772549020, blue: 0.403921569 },
|
182
|
-
dory: { red: 0.058823529, green: 0.411764706, blue: 1.000000000 },
|
183
|
-
malibu: { red: 1.000000000, green: 0.000000000, blue: 0.501960784 },
|
184
|
-
sea_foam: { red: 0.066666667, green: 0.827450980, blue: 0.803921569 },
|
185
|
-
tumeric_tint: { red: 0.980392157, green: 0.866666667, blue: 0.694117647 },
|
186
|
-
mulah_tint: { red: 0.733333333, green: 0.901960784, blue: 0.776470588 },
|
187
|
-
dory_tint: { red: 0.662745098, green: 0.772549020, blue: 0.984313725 },
|
188
|
-
malibu_tint: { red: 0.968627451, green: 0.682352941, blue: 0.800000000 },
|
189
|
-
sea_foam_tint: { red: 0.749019608, green: 0.925490196, blue: 0.921568627 },
|
190
|
-
|
191
|
-
# Yahoo health colors
|
192
|
-
|
193
|
-
health_green: { red: 0.000000000, green: 0.690196078, blue: 0.313725490 },
|
194
|
-
health_yellow: { red: 1.000000000, green: 0.654901961, blue: 0.000000000 },
|
195
|
-
health_red: { red: 1.000000000, green: 0.000000000, blue: 0.000000000 },
|
196
|
-
|
197
|
-
# Yahoo Fuji design color palette
|
198
|
-
|
199
|
-
fuji_color_watermelon: { red: 1.000000000, green: 0.321568627, blue: 0.341176471 },
|
200
|
-
fuji_color_solo_cup: { red: 0.921568627, green: 0.058823529, blue: 0.160784314 },
|
201
|
-
fuji_color_malibu: { red: 1.000000000, green: 0.000000000, blue: 0.501960784 },
|
202
|
-
fuji_color_barney: { red: 0.800000000, green: 0.000000000, blue: 0.549019608 },
|
203
|
-
fuji_color_mimosa: { red: 1.000000000, green: 0.827450980, blue: 0.200000000 },
|
204
|
-
fuji_color_turmeric: { red: 1.000000000, green: 0.654901961, blue: 0.000000000 },
|
205
|
-
fuji_color_cheetos: { red: 0.992156863, green: 0.380392157, blue: 0.000000000 },
|
206
|
-
fuji_color_carrot_juice: { red: 1.000000000, green: 0.321568627, blue: 0.050980392 },
|
207
|
-
fuji_color_mulah: { red: 0.101960784, green: 0.772549020, blue: 0.403921569 },
|
208
|
-
fuji_color_bonsai: { red: 0.000000000, green: 0.529411765, blue: 0.317647059 },
|
209
|
-
fuji_color_spirulina: { red: 0.000000000, green: 0.627450980, blue: 0.627450980 },
|
210
|
-
fuji_color_sea_foam: { red: 0.066666667, green: 0.827450980, blue: 0.803921569 },
|
211
|
-
fuji_color_peeps: { red: 0.490196078, green: 0.796078431, blue: 1.000000000 },
|
212
|
-
fuji_color_sky: { red: 0.070588235, green: 0.662745098, blue: 1.000000000 },
|
213
|
-
fuji_color_dory: { red: 0.058823529, green: 0.411764706, blue: 1.000000000 },
|
214
|
-
fuji_color_scooter: { red: 0.000000000, green: 0.388235294, blue: 0.921568627 },
|
215
|
-
fuji_color_cobalt: { red: 0.000000000, green: 0.227450980, blue: 0.737254902 },
|
216
|
-
fuji_color_denim: { red: 0.101960784, green: 0.050980392, blue: 0.670588235 },
|
217
|
-
fuji_color_blurple: { red: 0.364705882, green: 0.368627451, blue: 1.000000000 },
|
218
|
-
fuji_color_hendrix: { red: 0.972549020, green: 0.956862745, blue: 1.000000000 },
|
219
|
-
fuji_color_thanos: { red: 0.564705882, green: 0.486274510, blue: 1.000000000 },
|
220
|
-
fuji_color_starfish: { red: 0.466666667, green: 0.349019608, blue: 1.000000000 },
|
221
|
-
fuji_color_hulk_pants: { red: 0.494117647, green: 0.121568627, blue: 1.000000000 },
|
222
|
-
fuji_color_grape_jelly: { red: 0.376470588, green: 0.003921569, blue: 0.823529412 },
|
223
|
-
fuji_color_mulberry: { red: 0.313725490, green: 0.082352941, blue: 0.690196078 },
|
224
|
-
fuji_color_malbec: { red: 0.223529412, green: 0.000000000, blue: 0.490196078 },
|
225
|
-
fuji_grayscale_black: { red: 0.000000000, green: 0.000000000, blue: 0.000000000 },
|
226
|
-
fuji_grayscale_midnight: { red: 0.062745098, green: 0.082352941, blue: 0.094117647 },
|
227
|
-
fuji_grayscale_inkwell: { red: 0.113725490, green: 0.133333333, blue: 0.156862745 },
|
228
|
-
fuji_grayscale_batcave: { red: 0.137254902, green: 0.164705882, blue: 0.192156863 },
|
229
|
-
fuji_grayscale_ramones: { red: 0.172549020, green: 0.211764706, blue: 0.247058824 },
|
230
|
-
fuji_grayscale_charcoal: { red: 0.274509804, green: 0.305882353, blue: 0.337254902 },
|
231
|
-
fuji_grayscale_battleship: { red: 0.356862745, green: 0.388235294, blue: 0.415686275 },
|
232
|
-
fuji_grayscale_dolphin: { red: 0.431372549, green: 0.466666667, blue: 0.501960784 },
|
233
|
-
fuji_grayscale_shark: { red: 0.509803922, green: 0.541176471, blue: 0.576470588 },
|
234
|
-
fuji_grayscale_gandalf: { red: 0.592156863, green: 0.619607843, blue: 0.658823529 },
|
235
|
-
fuji_grayscale_bob: { red: 0.690196078, green: 0.725490196, blue: 0.756862745 },
|
236
|
-
fuji_grayscale_pebble: { red: 0.780392157, green: 0.803921569, blue: 0.823529412 },
|
237
|
-
fuji_grayscale_dirty_seagull: { red: 0.878431373, green: 0.894117647, blue: 0.913725490 },
|
238
|
-
fuji_grayscale_grey_hair: { red: 0.941176471, green: 0.952941176, blue: 0.960784314 },
|
239
|
-
fuji_grayscale_marshmallow: { red: 0.960784314, green: 0.972549020, blue: 0.980392157 },
|
240
|
-
fuji_grayscale_white: { red: 1.000000000, green: 1.000000000, blue: 1.000000000 }
|
241
|
-
}.freeze
|
99
|
+
#
|
100
|
+
def self.color_names = SheetsV4::Color::COLORS.keys
|
242
101
|
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.4.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-09-
|
11
|
+
date: 2023-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler-audit
|
@@ -257,8 +257,10 @@ files:
|
|
257
257
|
- README.md
|
258
258
|
- Rakefile
|
259
259
|
- examples/README.md
|
260
|
+
- examples/set_background_color
|
260
261
|
- lib/sheets_v4.rb
|
261
262
|
- lib/sheets_v4/color.rb
|
263
|
+
- lib/sheets_v4/credential_creator.rb
|
262
264
|
- lib/sheets_v4/validate_api_object.rb
|
263
265
|
- lib/sheets_v4/version.rb
|
264
266
|
homepage: https://github.com/main-branch/sheets_v4
|