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
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/
|
5
|
+
require_relative 'sheets_v4/credential_creator'
|
6
|
+
require_relative 'sheets_v4/validate_api_objects'
|
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
|
@@ -32,211 +66,36 @@ module SheetsV4
|
|
32
66
|
# @return [void]
|
33
67
|
#
|
34
68
|
def self.validate_api_object(schema_name:, object:, logger: Logger.new(nil))
|
35
|
-
|
69
|
+
SheetsV4::ValidateApiObjects::Validate.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.5.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-
|
11
|
+
date: 2023-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler-audit
|
@@ -257,9 +257,16 @@ files:
|
|
257
257
|
- README.md
|
258
258
|
- Rakefile
|
259
259
|
- examples/README.md
|
260
|
+
- examples/set_background_color
|
261
|
+
- examples/set_background_color2
|
260
262
|
- lib/sheets_v4.rb
|
261
263
|
- lib/sheets_v4/color.rb
|
262
|
-
- lib/sheets_v4/
|
264
|
+
- lib/sheets_v4/credential_creator.rb
|
265
|
+
- lib/sheets_v4/validate_api_objects.rb
|
266
|
+
- lib/sheets_v4/validate_api_objects/load_schemas.rb
|
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
|
263
270
|
- lib/sheets_v4/version.rb
|
264
271
|
homepage: https://github.com/main-branch/sheets_v4
|
265
272
|
licenses:
|
@@ -1,132 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json_schemer'
|
4
|
-
|
5
|
-
module SheetsV4
|
6
|
-
# Validate objects against a Google Sheets API request object schema
|
7
|
-
#
|
8
|
-
# @api public
|
9
|
-
#
|
10
|
-
class ValidateApiObject
|
11
|
-
# Create a new validator
|
12
|
-
#
|
13
|
-
# By default, a nil logger is used. This means that no messages are logged.
|
14
|
-
#
|
15
|
-
# @example
|
16
|
-
# logger = Logger.new(STDOUT, :level => Logger::INFO)
|
17
|
-
# validator = SheetsV4::ValidateApiObject.new(logger)
|
18
|
-
#
|
19
|
-
# @param logger [Logger] the logger to use
|
20
|
-
#
|
21
|
-
def initialize(logger = Logger.new(nil))
|
22
|
-
@logger = logger
|
23
|
-
end
|
24
|
-
|
25
|
-
# The logger to use internally
|
26
|
-
#
|
27
|
-
# Validation errors are logged at the error level. Other messages are logged
|
28
|
-
# at the debug level.
|
29
|
-
#
|
30
|
-
# @example
|
31
|
-
# logger = Logger.new(STDOUT, :level => Logger::INFO)
|
32
|
-
# validator = SheetsV4::ValidateApiObject.new(logger)
|
33
|
-
# validator.logger == logger # => true
|
34
|
-
# validator.logger.debug { "Debug message" }
|
35
|
-
#
|
36
|
-
# @return [Logger]
|
37
|
-
#
|
38
|
-
attr_reader :logger
|
39
|
-
|
40
|
-
# Validate the object using the JSON schema named schema_name
|
41
|
-
#
|
42
|
-
# @example
|
43
|
-
# schema_name = 'BatchUpdateSpreadsheetRequest'
|
44
|
-
# object = { 'requests' => [] }
|
45
|
-
# validator = SheetsV4::ValidateApiObject.new
|
46
|
-
# validator.call(schema_name, object)
|
47
|
-
#
|
48
|
-
# @param schema_name [String] the name of the schema to validate against
|
49
|
-
# @param object [Object] the object to validate
|
50
|
-
#
|
51
|
-
# @raise [RuntimeError] if the object does not conform to the schema
|
52
|
-
#
|
53
|
-
# @return [void]
|
54
|
-
#
|
55
|
-
def call(schema_name, object)
|
56
|
-
logger.debug { "Validating #{object} against #{schema_name}" }
|
57
|
-
|
58
|
-
schema = { '$ref' => schema_name }
|
59
|
-
schemer = JSONSchemer.schema(schema, ref_resolver:)
|
60
|
-
errors = schemer.validate(object)
|
61
|
-
raise_error!(schema_name, object, errors) if errors.any?
|
62
|
-
|
63
|
-
logger.debug { "Object #{object} conforms to #{schema_name}" }
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
# The resolver to use to resolve JSON schema references
|
69
|
-
# @return [SchemaRefResolver]
|
70
|
-
# @api private
|
71
|
-
def ref_resolver = @ref_resolver ||= SchemaRefResolver.new(logger)
|
72
|
-
|
73
|
-
# Raise an error when the object does not conform to the schema
|
74
|
-
# @return [void]
|
75
|
-
# @raise [RuntimeError]
|
76
|
-
# @api private
|
77
|
-
def raise_error!(schema_name, object, errors)
|
78
|
-
error = errors.first['error']
|
79
|
-
error_message = "Object #{object} does not conform to #{schema_name}: #{error}"
|
80
|
-
logger.error(error_message)
|
81
|
-
raise error_message
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# Resolve JSON schema references to Google Sheets API schemas
|
86
|
-
#
|
87
|
-
# Uses the Google Discovery API to get the schemas. This is an implementation
|
88
|
-
# detail used to interact with JSONSchemer.
|
89
|
-
#
|
90
|
-
# @api private
|
91
|
-
#
|
92
|
-
class SchemaRefResolver
|
93
|
-
# Create a new schema resolver
|
94
|
-
#
|
95
|
-
# @param logger [Logger] the logger to use
|
96
|
-
#
|
97
|
-
# @api private
|
98
|
-
#
|
99
|
-
def initialize(logger)
|
100
|
-
@logger = logger
|
101
|
-
end
|
102
|
-
|
103
|
-
# The logger to use internally
|
104
|
-
#
|
105
|
-
# Currently, only info messages are logged.
|
106
|
-
#
|
107
|
-
# @return [Logger]
|
108
|
-
#
|
109
|
-
# @api private
|
110
|
-
#
|
111
|
-
attr_reader :logger
|
112
|
-
|
113
|
-
# Resolve a JSON schema reference
|
114
|
-
#
|
115
|
-
# @param ref [String] the reference to resolve usually in the form "#/definitions/schema_name"
|
116
|
-
#
|
117
|
-
# @return [Hash] the schema object as a hash
|
118
|
-
#
|
119
|
-
# @api private
|
120
|
-
#
|
121
|
-
def call(ref)
|
122
|
-
schema_name = ref.path[1..]
|
123
|
-
logger.debug { "Reading schema #{schema_name}" }
|
124
|
-
schema_object = SheetsV4.api_object_schemas[schema_name]
|
125
|
-
raise "Schema for #{ref} not found" unless schema_object
|
126
|
-
|
127
|
-
schema_object.to_h.tap do |schema|
|
128
|
-
schema['unevaluatedProperties'] = false
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|