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.
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/validate_api_object'
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
- ValidateApiObject.new(logger).call(schema_name, object)
69
+ SheetsV4::ValidateApiObjects::Validate.new(logger:).call(schema_name:, object:)
36
70
  end
37
71
 
38
- # A hash of schemas keyed by the schema name loaded from the Google Discovery API
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
- def self.api_object_schemas
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
- # @return [Thread::Mutex]
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
- # @api private
79
+ # @example
80
+ # SheetsV4::Color.color(:red) #=> { "red": 1.0, "green": 0.0, "blue": 0.0 }
60
81
  #
61
- def self.schema_load_semaphore = @schema_load_semaphore
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<String, Object>] a hash of schemas keyed by schema name
84
+ # @return [Hash] The color requested e.g. `{ "red": 1.0, "green": 0.0, "blue": 0.0 }`
66
85
  #
67
- # @api private
86
+ # @api public
68
87
  #
69
- def self.load_api_object_schemas
70
- source = 'https://sheets.googleapis.com/$discovery/rest?version=v4'
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
- # Return a color object for the given name from SheetsV4::COLORS
92
+ # List the names of the colors available to use in the Google Sheets API
79
93
  #
80
94
  # @example
81
- # SheetsV4::Color.color(:red) #=> { "red": 1.0, "green": 0.0, "blue": 0.0 }
95
+ # SheetsV4::Color.color_names #=> [:black, :white, :red, :green, :blue, :yellow, :magenta, :cyan, ...]
82
96
  #
83
- # @param name [Symbol] the name of the color
84
- # @return [Hash] the color object
97
+ # @return [Array<Symbol>] the names of the colors available
85
98
  # @api public
86
- def self.color(name)
87
- SheetsV4::COLORS[name.to_sym]
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.3.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-09-29 00:00:00.000000000 Z
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/validate_api_object.rb
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