sheets_v4 0.3.0 → 0.5.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 +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
|