gazer 0.3.10 → 0.3.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/lib/gzr/command.rb +9 -5
- data/lib/gzr/commands/alert/cat.rb +2 -2
- data/lib/gzr/commands/alert/ls.rb +2 -2
- data/lib/gzr/commands/alert/notifications.rb +2 -2
- data/lib/gzr/commands/attribute/cat.rb +3 -3
- data/lib/gzr/commands/attribute/create.rb +2 -2
- data/lib/gzr/commands/attribute/get_group_value.rb +4 -4
- data/lib/gzr/commands/attribute/import.rb +3 -3
- data/lib/gzr/commands/attribute/ls.rb +3 -3
- data/lib/gzr/commands/attribute/rm.rb +4 -4
- data/lib/gzr/commands/attribute/set_group_value.rb +4 -4
- data/lib/gzr/commands/connection/dialects.rb +4 -4
- data/lib/gzr/commands/connection/ls.rb +2 -2
- data/lib/gzr/commands/connection/test.rb +2 -2
- data/lib/gzr/commands/dashboard/import.rb +30 -30
- data/lib/gzr/commands/dashboard/mv.rb +1 -1
- data/lib/gzr/commands/folder/cat.rb +3 -3
- data/lib/gzr/commands/folder/create.rb +3 -3
- data/lib/gzr/commands/folder/export.rb +2 -2
- data/lib/gzr/commands/folder/ls.rb +3 -4
- data/lib/gzr/commands/folder/rm.rb +3 -3
- data/lib/gzr/commands/folder/top.rb +4 -4
- data/lib/gzr/commands/folder/tree.rb +11 -11
- data/lib/gzr/commands/group/ls.rb +3 -3
- data/lib/gzr/commands/group/member_groups.rb +3 -3
- data/lib/gzr/commands/group/member_users.rb +3 -3
- data/lib/gzr/commands/look/cat.rb +1 -1
- data/lib/gzr/commands/look/import.rb +5 -5
- data/lib/gzr/commands/look/mv.rb +1 -1
- data/lib/gzr/commands/look/rm.rb +1 -1
- data/lib/gzr/commands/model/ls.rb +4 -4
- data/lib/gzr/commands/model/set/ls.rb +2 -2
- data/lib/gzr/commands/permission/ls.rb +2 -2
- data/lib/gzr/commands/permission/set/ls.rb +2 -2
- data/lib/gzr/commands/plan/cat.rb +3 -3
- data/lib/gzr/commands/plan/disable.rb +3 -3
- data/lib/gzr/commands/plan/enable.rb +3 -3
- data/lib/gzr/commands/plan/failures.rb +12 -7
- data/lib/gzr/commands/plan/import.rb +5 -5
- data/lib/gzr/commands/plan/ls.rb +5 -5
- data/lib/gzr/commands/plan/run.rb +2 -2
- data/lib/gzr/commands/project/branch.rb +4 -4
- data/lib/gzr/commands/project/ls.rb +3 -3
- data/lib/gzr/commands/role/cat.rb +2 -2
- data/lib/gzr/commands/role/group_add.rb +2 -2
- data/lib/gzr/commands/role/group_ls.rb +3 -3
- data/lib/gzr/commands/role/group_rm.rb +2 -2
- data/lib/gzr/commands/role/ls.rb +3 -3
- data/lib/gzr/commands/role/user_add.rb +2 -2
- data/lib/gzr/commands/role/user_ls.rb +3 -3
- data/lib/gzr/commands/role/user_rm.rb +2 -2
- data/lib/gzr/commands/user/cat.rb +5 -3
- data/lib/gzr/commands/user/delete.rb +2 -1
- data/lib/gzr/commands/user/disable.rb +2 -1
- data/lib/gzr/commands/user/enable.rb +2 -1
- data/lib/gzr/commands/user/ls.rb +22 -11
- data/lib/gzr/commands/user/me.rb +6 -2
- data/lib/gzr/commands/user.rb +2 -0
- data/lib/gzr/modules/alert.rb +30 -17
- data/lib/gzr/modules/attribute.rb +24 -22
- data/lib/gzr/modules/connection.rb +10 -25
- data/lib/gzr/modules/dashboard.rb +86 -44
- data/lib/gzr/modules/folder.rb +20 -28
- data/lib/gzr/modules/group.rb +8 -10
- data/lib/gzr/modules/look.rb +23 -21
- data/lib/gzr/modules/model/set.rb +6 -6
- data/lib/gzr/modules/model.rb +14 -7
- data/lib/gzr/modules/permission/set.rb +2 -2
- data/lib/gzr/modules/permission.rb +2 -4
- data/lib/gzr/modules/plan.rb +36 -36
- data/lib/gzr/modules/project.rb +26 -21
- data/lib/gzr/modules/role.rb +48 -36
- data/lib/gzr/modules/session.rb +2 -2
- data/lib/gzr/modules/user.rb +52 -43
- data/lib/gzr/version.rb +1 -1
- metadata +2 -2
@@ -29,9 +29,13 @@ module Gzr
|
|
29
29
|
def query_dashboard(dashboard_id)
|
30
30
|
data = nil
|
31
31
|
begin
|
32
|
-
data = @sdk.dashboard(dashboard_id)
|
33
|
-
data
|
34
|
-
data
|
32
|
+
data = @sdk.dashboard(dashboard_id).to_attrs
|
33
|
+
data[:dashboard_filters]&.sort! { |a,b| a.row <=> b.row }
|
34
|
+
data[:dashboard_layouts]&.sort_by! { |v| (v[:active] ? 0 : 1) }
|
35
|
+
rescue LookerSDK::Error => e
|
36
|
+
say_error "dashboard #{dashboard_id} not found"
|
37
|
+
say_error e
|
38
|
+
raise
|
35
39
|
rescue LookerSDK::Error => e
|
36
40
|
say_error "Error querying dashboard(#{dashboard_id})"
|
37
41
|
say_error e
|
@@ -41,15 +45,17 @@ module Gzr
|
|
41
45
|
end
|
42
46
|
|
43
47
|
def delete_dashboard(dash)
|
44
|
-
data = nil
|
45
48
|
begin
|
46
|
-
|
49
|
+
@sdk.delete_dashboard(dash)
|
50
|
+
rescue LookerSDK::Error => e
|
51
|
+
say_error "dashboard #{dash} not found"
|
52
|
+
say_error e
|
53
|
+
raise
|
47
54
|
rescue LookerSDK::Error => e
|
48
55
|
say_error "Error deleting dashboard(#{dash})"
|
49
56
|
say_error e
|
50
57
|
raise
|
51
58
|
end
|
52
|
-
data
|
53
59
|
end
|
54
60
|
|
55
61
|
def search_dashboards_by_slug(slug, folder_id=nil)
|
@@ -57,9 +63,9 @@ module Gzr
|
|
57
63
|
begin
|
58
64
|
req = { :slug => slug }
|
59
65
|
req[:folder_id] = folder_id if folder_id
|
60
|
-
data = @sdk.search_dashboards(req)
|
66
|
+
data = @sdk.search_dashboards(req).collect { |e| e.to_attrs }
|
61
67
|
req[:deleted] = true
|
62
|
-
data = @sdk.search_dashboards(req) if data.empty?
|
68
|
+
data = @sdk.search_dashboards(req).collect { |e| e.to_attrs } if data.empty?
|
63
69
|
rescue LookerSDK::Error => e
|
64
70
|
say_error "Error search_dashboards_by_slug(#{JSON.pretty_generate(req)})"
|
65
71
|
say_error e
|
@@ -73,9 +79,9 @@ module Gzr
|
|
73
79
|
begin
|
74
80
|
req = { :title => title }
|
75
81
|
req[:folder_id] = folder_id if folder_id
|
76
|
-
data = @sdk.search_dashboards(req)
|
82
|
+
data = @sdk.search_dashboards(req).collect { |e| e.to_attrs }
|
77
83
|
req[:deleted] = true
|
78
|
-
data = @sdk.search_dashboards(req) if data.empty?
|
84
|
+
data = @sdk.search_dashboards(req).collect { |e| e.to_attrs } if data.empty?
|
79
85
|
rescue LookerSDK::Error => e
|
80
86
|
say_error "Error search_dashboards_by_title(#{JSON.pretty_generate(req)})"
|
81
87
|
say_error e
|
@@ -85,11 +91,12 @@ module Gzr
|
|
85
91
|
end
|
86
92
|
|
87
93
|
def create_dashboard(dash)
|
94
|
+
data = nil
|
88
95
|
begin
|
89
|
-
data = @sdk.create_dashboard(dash)
|
96
|
+
data = @sdk.create_dashboard(dash).to_attrs
|
90
97
|
say_error data.inspect if data.respond_to?(:message)
|
91
|
-
data
|
92
|
-
data
|
98
|
+
data[:dashboard_filters]&.sort! { |a,b| a.row <=> b.row }
|
99
|
+
data[:dashboard_layouts]&.sort_by! { |v| (v[:active] ? 0 : 1) }
|
93
100
|
rescue LookerSDK::Error => e
|
94
101
|
say_error "Error creating dashboard(#{JSON.pretty_generate(dash)})"
|
95
102
|
say_error e
|
@@ -99,9 +106,14 @@ module Gzr
|
|
99
106
|
end
|
100
107
|
|
101
108
|
def update_dashboard(dash_id,dash)
|
109
|
+
data = nil
|
102
110
|
begin
|
103
|
-
data = @sdk.update_dashboard(dash_id,dash)
|
104
|
-
data
|
111
|
+
data = @sdk.update_dashboard(dash_id,dash).to_attrs
|
112
|
+
data[:dashboard_filters]&.sort! { |a,b| a.row <=> b.row }
|
113
|
+
rescue LookerSDK::NotFound => e
|
114
|
+
say_error "dashboard #{dash_id} not found"
|
115
|
+
say_error e
|
116
|
+
raise
|
105
117
|
rescue LookerSDK::Error => e
|
106
118
|
say_error "Error updating dashboard(#{dash_id},#{JSON.pretty_generate(dash)})"
|
107
119
|
say_error e
|
@@ -112,139 +124,162 @@ module Gzr
|
|
112
124
|
|
113
125
|
def create_dashboard_element(dash_elem)
|
114
126
|
begin
|
115
|
-
|
127
|
+
@sdk.create_dashboard_element(dash_elem).to_attrs
|
116
128
|
rescue LookerSDK::Error => e
|
117
129
|
say_error "Error creating dashboard_element(#{JSON.pretty_generate(dash_elem)})"
|
118
130
|
say_error e
|
119
131
|
raise
|
120
132
|
end
|
121
|
-
data
|
122
133
|
end
|
123
134
|
|
124
135
|
def update_dashboard_element(id,dash_elem)
|
125
136
|
begin
|
126
|
-
|
137
|
+
@sdk.update_dashboard_element(id,dash_elem).to_attrs
|
138
|
+
rescue LookerSDK::NotFound => e
|
139
|
+
say_error "dashboard_element #{id} not found"
|
140
|
+
say_error e
|
141
|
+
raise
|
127
142
|
rescue LookerSDK::Error => e
|
128
143
|
say_error "Error updating dashboard_element(#{id},#{JSON.pretty_generate(dash_elem)})"
|
129
144
|
say_error e
|
130
145
|
raise
|
131
146
|
end
|
132
|
-
data
|
133
147
|
end
|
134
148
|
|
135
149
|
def delete_dashboard_element(id)
|
136
150
|
begin
|
137
|
-
|
151
|
+
@sdk.delete_dashboard_element(id)
|
152
|
+
rescue LookerSDK::NotFound => e
|
153
|
+
say_error "dashboard_element #{id} not found"
|
154
|
+
say_error e
|
155
|
+
raise
|
138
156
|
rescue LookerSDK::Error => e
|
139
157
|
say_error "Error deleting dashboard_element(#{id})})"
|
140
158
|
say_error e
|
141
159
|
raise
|
142
160
|
end
|
143
|
-
data
|
144
161
|
end
|
145
162
|
|
146
163
|
def get_dashboard_layout(id)
|
147
164
|
begin
|
148
|
-
|
165
|
+
@sdk.dashboard_layout(id).to_attrs
|
166
|
+
rescue LookerSDK::NotFound => e
|
167
|
+
say_error "dashboard_layout #{id} not found"
|
168
|
+
say_error e
|
169
|
+
raise
|
149
170
|
rescue LookerSDK::Error => e
|
150
171
|
say_error "Error getting dashboard_layout(#{id})"
|
151
172
|
say_error e
|
152
173
|
raise
|
153
174
|
end
|
154
|
-
data
|
155
175
|
end
|
156
176
|
|
157
177
|
def create_dashboard_layout(dash_layout)
|
158
178
|
begin
|
159
|
-
|
179
|
+
@sdk.create_dashboard_layout(dash_layout).to_attrs
|
160
180
|
rescue LookerSDK::Error => e
|
161
181
|
say_error "Error creating dashboard_layout(#{JSON.pretty_generate(dash_layout)})"
|
162
182
|
say_error e
|
163
183
|
raise
|
164
184
|
end
|
165
|
-
data
|
166
185
|
end
|
167
186
|
|
168
187
|
def update_dashboard_layout(id,dash_layout)
|
169
188
|
begin
|
170
|
-
|
189
|
+
@sdk.update_dashboard_layout(id,dash_layout).to_attrs
|
190
|
+
rescue LookerSDK::NotFound => e
|
191
|
+
say_error "dashboard_layout #{id} not found"
|
192
|
+
say_error e
|
193
|
+
raise
|
171
194
|
rescue LookerSDK::Error => e
|
172
195
|
say_error "Error updating dashboard_layout(#{id},#{JSON.pretty_generate(dash_layout)})"
|
173
196
|
say_error e
|
174
197
|
raise
|
175
198
|
end
|
176
|
-
data
|
177
199
|
end
|
178
200
|
|
179
201
|
def delete_dashboard_layout(id)
|
180
202
|
begin
|
181
|
-
|
203
|
+
@sdk.delete_dashboard_layout(id)
|
204
|
+
rescue LookerSDK::NotFound => e
|
205
|
+
say_error "dashboard_layout #{id} not found"
|
206
|
+
say_error e
|
207
|
+
raise
|
182
208
|
rescue LookerSDK::Error => e
|
183
209
|
say_error "Error deleting dashboard_layout(#{id})"
|
184
210
|
say_error e
|
185
211
|
raise
|
186
212
|
end
|
187
|
-
data
|
188
213
|
end
|
189
214
|
|
190
215
|
def get_all_dashboard_layout_components(id)
|
191
216
|
begin
|
192
|
-
|
193
|
-
|
217
|
+
@sdk.dashboard_layout_dashboard_layout_components(id).collect { |e| e.to_attrs }
|
218
|
+
rescue LookerSDK::NotFound => e
|
219
|
+
say_error "dashboard_layout #{id} not found"
|
220
|
+
say_error e
|
221
|
+
raise
|
194
222
|
rescue LookerSDK::Error => e
|
195
223
|
say_error "Error getting dashboard_layout_dashboard_layout_components(#{id})"
|
196
224
|
say_error e
|
197
225
|
raise
|
198
226
|
end
|
199
|
-
data
|
200
227
|
end
|
201
228
|
|
202
229
|
def update_dashboard_layout_component(id,component)
|
203
230
|
begin
|
204
|
-
|
231
|
+
@sdk.update_dashboard_layout_component(id,component).to_attrs
|
232
|
+
rescue LookerSDK::NotFound => e
|
233
|
+
say_error "dashboard_layout #{id} not found"
|
234
|
+
say_error e
|
235
|
+
raise
|
205
236
|
rescue LookerSDK::Error => e
|
206
237
|
say_error "Error updating dashboard_layout_component(#{id},#{JSON.pretty_generate(component)})"
|
207
238
|
say_error e
|
208
239
|
raise
|
209
240
|
end
|
210
|
-
data
|
211
241
|
end
|
212
242
|
|
213
243
|
def create_dashboard_filter(dash_filter)
|
214
244
|
begin
|
215
|
-
|
245
|
+
@sdk.create_dashboard_filter(dash_filter).to_attrs
|
216
246
|
rescue LookerSDK::Error => e
|
217
247
|
say_error "Error creating dashboard_filter(#{JSON.pretty_generate(dash_filter)})"
|
218
248
|
say_error e
|
219
249
|
raise
|
220
250
|
end
|
221
|
-
data
|
222
251
|
end
|
223
252
|
|
224
253
|
def update_dashboard_filter(id,dash_filter)
|
225
254
|
begin
|
226
|
-
|
255
|
+
@sdk.update_dashboard_filter(id,dash_filter).to_attrs
|
256
|
+
rescue LookerSDK::NotFound => e
|
257
|
+
say_error "dashboard_filter #{id} not found"
|
258
|
+
say_error e
|
259
|
+
raise
|
227
260
|
rescue LookerSDK::Error => e
|
228
261
|
say_error "Error updating dashboard_filter(#{id},#{JSON.pretty_generate(dash_filter)})"
|
229
262
|
say_error e
|
230
263
|
raise
|
231
264
|
end
|
232
|
-
data
|
233
265
|
end
|
234
266
|
|
235
267
|
def delete_dashboard_filter(id)
|
236
268
|
begin
|
237
|
-
|
269
|
+
@sdk.delete_dashboard_filter(id)
|
270
|
+
rescue LookerSDK::NotFound => e
|
271
|
+
say_error "dashboard_filter #{id} not found"
|
272
|
+
say_error e
|
273
|
+
raise
|
238
274
|
rescue LookerSDK::Error => e
|
239
275
|
say_error "Error deleting dashboard_filter(#{id})})"
|
240
276
|
say_error e
|
241
277
|
raise
|
242
278
|
end
|
243
|
-
data
|
244
279
|
end
|
245
280
|
|
246
281
|
def cat_dashboard(dashboard_id)
|
247
|
-
data = query_dashboard(dashboard_id)
|
282
|
+
data = query_dashboard(dashboard_id)
|
248
283
|
data[:dashboard_elements].each_index do |i|
|
249
284
|
element = data[:dashboard_elements][i]
|
250
285
|
find_vis_config_reference(element) do |vis_config|
|
@@ -253,12 +288,11 @@ module Gzr
|
|
253
288
|
end
|
254
289
|
end
|
255
290
|
alerts = search_alerts(fields: 'id,dashboard_element_id', group_by: 'dashboard', all_owners: true)
|
256
|
-
alerts.map!{|v| v.to_attrs}
|
257
291
|
say_warning alerts if @options[:debug]
|
258
292
|
data[:dashboard_elements].each do |e|
|
259
293
|
alerts_found = alerts.select { |a| a[:dashboard_element_id] == e[:id]}
|
260
294
|
say_warning "Found alerts #{alerts_found}" if @options[:debug]
|
261
|
-
alerts_entries = alerts_found.map { |a| get_alert(a[:id])
|
295
|
+
alerts_entries = alerts_found.map { |a| get_alert(a[:id]) }
|
262
296
|
say_warning "Looked up alerts entries #{alerts_entries}" if @options[:debug]
|
263
297
|
e[:alerts] = alerts_entries
|
264
298
|
end
|
@@ -357,7 +391,11 @@ module Gzr
|
|
357
391
|
|
358
392
|
def import_lookml_dashboard(id,folder)
|
359
393
|
begin
|
360
|
-
return @sdk.import_lookml_dashboard(id,folder)
|
394
|
+
return @sdk.import_lookml_dashboard(id,folder).to_attrs
|
395
|
+
rescue LookerSDK::NotFound => e
|
396
|
+
say_error "lookml_dashboard #{id} not found"
|
397
|
+
say_error e
|
398
|
+
raise
|
361
399
|
rescue LookerSDK::Error => e
|
362
400
|
say_error "Error import_lookml_dashboard(#{id},#{folder})"
|
363
401
|
say_error e
|
@@ -368,6 +406,10 @@ module Gzr
|
|
368
406
|
def sync_lookml_dashboard(id)
|
369
407
|
begin
|
370
408
|
return @sdk.sync_lookml_dashboard(id, {})
|
409
|
+
rescue LookerSDK::NotFound => e
|
410
|
+
say_error "lookml_dashboard #{id} not found"
|
411
|
+
say_error e
|
412
|
+
raise
|
371
413
|
rescue LookerSDK::Error => e
|
372
414
|
say_error "Error sync_lookml_dashboard(#{id})"
|
373
415
|
say_error e
|
data/lib/gzr/modules/folder.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# The MIT License (MIT)
|
2
2
|
|
3
|
-
# Copyright (c)
|
3
|
+
# Copyright (c) 2023 Mike DeAngelo Google, Inc.
|
4
4
|
|
5
5
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
6
|
# this software and associated documentation files (the "Software"), to deal in
|
@@ -31,38 +31,35 @@ module Gzr
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def create_folder(name, parent_id)
|
34
|
-
data = nil
|
35
34
|
begin
|
36
35
|
req = {:name => name, :parent_id => parent_id}
|
37
|
-
|
36
|
+
@sdk.create_folder(req).to_attrs
|
38
37
|
rescue LookerSDK::Error => e
|
39
38
|
say_error "Error creating folder(#{JSON.pretty_generate(req)})"
|
40
39
|
say_error e
|
41
40
|
raise
|
42
41
|
end
|
43
|
-
data
|
44
42
|
end
|
45
43
|
|
46
44
|
def search_folders(name,fields=nil)
|
47
|
-
data = nil
|
48
45
|
begin
|
49
46
|
req = {:name => name}
|
50
47
|
req[:fields] = fields if fields
|
51
|
-
|
48
|
+
@sdk.search_folders(req).collect { |e| e.to_attrs }
|
49
|
+
rescue LookerSDK::NotFound => e
|
50
|
+
[]
|
52
51
|
rescue LookerSDK::Error => e
|
53
52
|
say_error "Error querying search_folders(#{JSON.pretty_generate(req)})"
|
54
53
|
say_error e
|
55
54
|
raise
|
56
55
|
end
|
57
|
-
data
|
58
56
|
end
|
59
57
|
|
60
58
|
def query_folder(id,fields=nil)
|
61
|
-
data = nil
|
62
59
|
begin
|
63
60
|
req = {}
|
64
61
|
req[:fields] = fields if fields
|
65
|
-
|
62
|
+
@sdk.folder(id, req).to_attrs
|
66
63
|
rescue LookerSDK::NotFound
|
67
64
|
return nil
|
68
65
|
rescue LookerSDK::Error => e
|
@@ -70,7 +67,6 @@ module Gzr
|
|
70
67
|
say_error e
|
71
68
|
raise
|
72
69
|
end
|
73
|
-
data
|
74
70
|
end
|
75
71
|
|
76
72
|
def process_args(args)
|
@@ -78,7 +74,7 @@ module Gzr
|
|
78
74
|
|
79
75
|
begin
|
80
76
|
user = query_me("home_folder_id")
|
81
|
-
folder_ids << user
|
77
|
+
folder_ids << user[:home_folder_id]
|
82
78
|
end unless args && args.length > 0 && !(args[0].nil?)
|
83
79
|
|
84
80
|
if args[0] == 'lookml'
|
@@ -87,26 +83,26 @@ module Gzr
|
|
87
83
|
folder_ids << args[0].to_i
|
88
84
|
elsif args[0] == "~" then
|
89
85
|
user = query_me("personal_folder_id")
|
90
|
-
folder_ids << user
|
86
|
+
folder_ids << user[:personal_folder_id]
|
91
87
|
elsif args[0] =~ /^~[0-9]+$/ then
|
92
88
|
user = query_user(args[0].sub('~',''), "personal_folder_id")
|
93
|
-
folder_ids << user
|
89
|
+
folder_ids << user[:personal_folder_id]
|
94
90
|
elsif args[0] =~ /^~.+@.+$/ then
|
95
91
|
search_results = search_users( { :email=>args[0].sub('~','') },"personal_folder_id" )
|
96
|
-
folder_ids += search_results.map { |r| r
|
92
|
+
folder_ids += search_results.map { |r| r[:personal_folder_id] }
|
97
93
|
elsif args[0] =~ /^~.+$/ then
|
98
94
|
first_name, last_name = args[0].sub('~','').split(' ')
|
99
95
|
search_results = search_users( { :first_name=>first_name, :last_name=>last_name },"personal_folder_id" )
|
100
|
-
folder_ids += search_results.map { |r| r
|
96
|
+
folder_ids += search_results.map { |r| r[:personal_folder_id] }
|
101
97
|
else
|
102
98
|
search_results = search_folders(args[0],"id")
|
103
|
-
folder_ids += search_results.map { |r| r
|
99
|
+
folder_ids += search_results.map { |r| r[:id] }
|
104
100
|
|
105
101
|
# The built in Shared folder is only availabe by
|
106
102
|
# searching for Home. https://github.com/looker/helltool/issues/34994
|
107
103
|
if args[0] == 'Shared' then
|
108
104
|
search_results = search_folders('Home',"id,is_shared_root")
|
109
|
-
folder_ids += search_results.select { |r| r
|
105
|
+
folder_ids += search_results.select { |r| r[:is_shared_root] }.map { |r| r[:id] }
|
110
106
|
end
|
111
107
|
end if args && args.length > 0 && !args[0].nil?
|
112
108
|
|
@@ -114,47 +110,43 @@ module Gzr
|
|
114
110
|
end
|
115
111
|
|
116
112
|
def all_folders(fields=nil)
|
117
|
-
data = nil
|
118
113
|
begin
|
119
114
|
req = {}
|
120
115
|
req[:fields] = fields if fields
|
121
|
-
|
116
|
+
@sdk.all_folders(req).collect { |e| e.to_attrs }
|
122
117
|
rescue LookerSDK::Error => e
|
123
118
|
say_error "Error querying all_folders(#{JSON.pretty_generate(req)})"
|
124
119
|
say_error e
|
125
120
|
raise
|
126
121
|
end
|
127
|
-
data
|
128
122
|
end
|
129
123
|
|
130
124
|
def query_folder_children(folder_id, fields=nil)
|
131
|
-
data = nil
|
132
125
|
req = {}
|
133
126
|
req[:fields] = fields if fields
|
134
127
|
begin
|
135
|
-
|
128
|
+
@sdk.folder_children(folder_id, req).collect { |e| e.to_attrs }
|
136
129
|
rescue LookerSDK::NotFound
|
137
|
-
return
|
130
|
+
return []
|
138
131
|
rescue LookerSDK::Error => e
|
139
132
|
say_error "Error querying folder_children(#{folder_id}, #{JSON.pretty_generate(req)})"
|
140
133
|
say_error e
|
141
134
|
raise
|
142
135
|
end
|
143
|
-
data
|
144
136
|
end
|
145
137
|
|
146
138
|
def delete_folder(folder_id)
|
147
|
-
data = nil
|
148
139
|
begin
|
149
|
-
|
140
|
+
@sdk.delete_folder(folder_id)
|
150
141
|
rescue LookerSDK::NotFound
|
151
|
-
|
142
|
+
say_error "folder #{folder_id} not found"
|
143
|
+
say_error e
|
144
|
+
raise
|
152
145
|
rescue LookerSDK::Error => e
|
153
146
|
say_error "Error deleting folder #{folder_id}"
|
154
147
|
say_error e
|
155
148
|
raise
|
156
149
|
end
|
157
|
-
data
|
158
150
|
end
|
159
151
|
end
|
160
152
|
end
|
data/lib/gzr/modules/group.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# The MIT License (MIT)
|
2
2
|
|
3
|
-
# Copyright (c)
|
3
|
+
# Copyright (c) 2023 Mike DeAngelo Google, Inc.
|
4
4
|
|
5
5
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
6
|
# this software and associated documentation files (the "Software"), to deal in
|
@@ -35,7 +35,7 @@ module Gzr
|
|
35
35
|
loop do
|
36
36
|
begin
|
37
37
|
req[:page] = page
|
38
|
-
scratch_data = @sdk.all_groups(req)
|
38
|
+
scratch_data = @sdk.all_groups(req).collect { |e| e.to_attrs }
|
39
39
|
rescue LookerSDK::ClientError => e
|
40
40
|
say_error "Unable to get all_groups(#{JSON.pretty_generate(req)})"
|
41
41
|
say_error e
|
@@ -52,9 +52,8 @@ module Gzr
|
|
52
52
|
req = { }
|
53
53
|
req[:fields] = fields if fields
|
54
54
|
|
55
|
-
data = Array.new
|
56
55
|
begin
|
57
|
-
|
56
|
+
@sdk.all_group_groups(group_id,req).collect { |e| e.to_attrs }
|
58
57
|
rescue LookerSDK::NotFound => e
|
59
58
|
return []
|
60
59
|
rescue LookerSDK::ClientError => e
|
@@ -62,7 +61,6 @@ module Gzr
|
|
62
61
|
say_error e
|
63
62
|
raise
|
64
63
|
end
|
65
|
-
data
|
66
64
|
end
|
67
65
|
|
68
66
|
def query_group_users(group_id,fields=nil,sorts=nil)
|
@@ -77,7 +75,7 @@ module Gzr
|
|
77
75
|
loop do
|
78
76
|
begin
|
79
77
|
req[:page] = page
|
80
|
-
scratch_data = @sdk.all_group_users(group_id,req)
|
78
|
+
scratch_data = @sdk.all_group_users(group_id,req).collect { |e| e.to_attrs }
|
81
79
|
rescue LookerSDK::ClientError => e
|
82
80
|
say_error "Unable to get all_group_users(#{group_id},#{JSON.pretty_generate(req)})"
|
83
81
|
say_error e
|
@@ -93,9 +91,9 @@ module Gzr
|
|
93
91
|
def search_groups(name)
|
94
92
|
req = {:name => name }
|
95
93
|
begin
|
96
|
-
return @sdk.search_groups(req)
|
94
|
+
return @sdk.search_groups(req).collect { |e| e.to_attrs }
|
97
95
|
rescue LookerSDK::NotFound => e
|
98
|
-
return
|
96
|
+
return []
|
99
97
|
rescue LookerSDK::ClientError => e
|
100
98
|
say_error "Unable to search_groups(#{JSON.pretty_generate(req)})"
|
101
99
|
say_error e
|
@@ -107,7 +105,7 @@ module Gzr
|
|
107
105
|
req = Hash.new
|
108
106
|
req[:fields] = fields if fields
|
109
107
|
begin
|
110
|
-
return @sdk.group(id,req)
|
108
|
+
return @sdk.group(id,req).to_attrs
|
111
109
|
rescue LookerSDK::NotFound => e
|
112
110
|
return nil
|
113
111
|
rescue LookerSDK::ClientError => e
|
@@ -121,7 +119,7 @@ module Gzr
|
|
121
119
|
req = Hash.new
|
122
120
|
req[:value] = value
|
123
121
|
begin
|
124
|
-
return @sdk.update_user_attribute_group_value(group_id,attr_id, req)
|
122
|
+
return @sdk.update_user_attribute_group_value(group_id,attr_id, req).to_attrs
|
125
123
|
rescue LookerSDK::ClientError => e
|
126
124
|
say_error "Unable to update_user_attribute_group_value(#{group_id},#{attr_id},#{JSON.pretty_generate(req)})"
|
127
125
|
say_error e
|
data/lib/gzr/modules/look.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# The MIT License (MIT)
|
2
2
|
|
3
|
-
# Copyright (c)
|
3
|
+
# Copyright (c) 2023 Mike DeAngelo Google, Inc.
|
4
4
|
|
5
5
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
6
|
# this software and associated documentation files (the "Software"), to deal in
|
@@ -24,15 +24,17 @@
|
|
24
24
|
module Gzr
|
25
25
|
module Look
|
26
26
|
def query_look(look_id)
|
27
|
-
data = nil
|
28
27
|
begin
|
29
|
-
|
28
|
+
@sdk.look(look_id).to_attrs
|
29
|
+
rescue LookerSDK::NotFoud => e
|
30
|
+
say_error "look(#{look_id}) not found"
|
31
|
+
say_error e
|
32
|
+
raise
|
30
33
|
rescue LookerSDK::Error => e
|
31
34
|
say_error "Error querying look(#{look_id})"
|
32
35
|
say_error e
|
33
36
|
raise
|
34
37
|
end
|
35
|
-
data
|
36
38
|
end
|
37
39
|
|
38
40
|
def search_looks_by_slug(slug, folder_id=nil)
|
@@ -40,9 +42,9 @@ module Gzr
|
|
40
42
|
begin
|
41
43
|
req = { :slug => slug }
|
42
44
|
req[:folder_id] = folder_id if folder_id
|
43
|
-
data = @sdk.search_looks(req)
|
45
|
+
data = @sdk.search_looks(req).collect { |l| l.to_attrs }
|
44
46
|
req[:deleted] = true
|
45
|
-
data = @sdk.search_looks(req) if data.empty?
|
47
|
+
data = @sdk.search_looks(req).collect { |l| l.to_attrs } if data.empty?
|
46
48
|
rescue LookerSDK::Error => e
|
47
49
|
say_error "Error search_looks_by_slug(#{JSON.pretty_generate(req)})"
|
48
50
|
say_error e
|
@@ -56,9 +58,9 @@ module Gzr
|
|
56
58
|
begin
|
57
59
|
req = { :title => title }
|
58
60
|
req[:folder_id] = folder_id if folder_id
|
59
|
-
data = @sdk.search_looks(req)
|
61
|
+
data = @sdk.search_looks(req).collect { |l| l.to_attrs }
|
60
62
|
req[:deleted] = true
|
61
|
-
data = @sdk.search_looks(req) if data.empty?
|
63
|
+
data = @sdk.search_looks(req).collect { |l| l.to_attrs } if data.empty?
|
62
64
|
rescue LookerSDK::Error => e
|
63
65
|
say_error "Error search_looks_by_title(#{JSON.pretty_generate(req)})"
|
64
66
|
say_error e
|
@@ -70,36 +72,36 @@ module Gzr
|
|
70
72
|
def create_look(look)
|
71
73
|
begin
|
72
74
|
look[:public] = false unless look[:public]
|
73
|
-
|
75
|
+
@sdk.create_look(look).to_attrs
|
74
76
|
rescue LookerSDK::Error => e
|
75
77
|
say_error "Error creating look(#{JSON.pretty_generate(look)})"
|
76
78
|
say_error e
|
77
79
|
raise
|
78
80
|
end
|
79
|
-
data
|
80
81
|
end
|
81
82
|
|
82
83
|
def update_look(id,look)
|
83
84
|
begin
|
84
|
-
|
85
|
+
@sdk.update_look(id,look).to_attrs
|
86
|
+
rescue LookerSDK::NotFound => e
|
87
|
+
say_error "look(#{id}) not found"
|
88
|
+
say_error e
|
89
|
+
raise
|
85
90
|
rescue LookerSDK::Error => e
|
86
91
|
say_error "Error updating look(#{id},#{JSON.pretty_generate(look)})"
|
87
92
|
say_error e
|
88
93
|
raise
|
89
94
|
end
|
90
|
-
data
|
91
95
|
end
|
92
96
|
|
93
97
|
def delete_look(look_id)
|
94
|
-
data = nil
|
95
98
|
begin
|
96
|
-
|
99
|
+
@sdk.delete_look(look_id)
|
97
100
|
rescue LookerSDK::Error => e
|
98
101
|
say_error "Error deleting look(#{look_id})"
|
99
102
|
say_error e
|
100
103
|
raise
|
101
104
|
end
|
102
|
-
data
|
103
105
|
end
|
104
106
|
|
105
107
|
def upsert_look(user_id, query_id, folder_id, source, output: $stdout)
|
@@ -123,8 +125,8 @@ module Gzr
|
|
123
125
|
same_slug = (slug_used&.fetch(:id,nil) == existing_look&.fetch(:id,nil))
|
124
126
|
|
125
127
|
if slug_used && !same_slug then
|
126
|
-
say_warning "slug #{slug_used
|
127
|
-
say_warning("That look is in the 'Trash' but not fully deleted yet", output: output) if slug_used
|
128
|
+
say_warning "slug #{slug_used[:slug]} already used for look #{slug_used[:title]} in folder #{slug_used[:folder_id]}", output: output
|
129
|
+
say_warning("That look is in the 'Trash' but not fully deleted yet", output: output) if slug_used[:deleted]
|
128
130
|
say_warning "look will be imported with new slug", output: output
|
129
131
|
end
|
130
132
|
|
@@ -133,14 +135,14 @@ module Gzr
|
|
133
135
|
raise Gzr::CLI::Error, "Look #{source[:title]} already exists in folder #{folder_id}\nDelete it before trying to upate another Look to have that title."
|
134
136
|
end
|
135
137
|
raise Gzr::CLI::Error, "Look #{existing_look[:title]} with slug #{existing_look[:slug]} already exists in folder #{folder_id}\nUse --force if you want to overwrite it" unless @options[:force]
|
136
|
-
say_ok "Modifying existing Look #{existing_look
|
138
|
+
say_ok "Modifying existing Look #{existing_look[:id]} #{existing_look[:title]} in folder #{folder_id}", output: output
|
137
139
|
new_look = source.select do |k,v|
|
138
140
|
(keys_to_keep('update_look') - [:space_id,:folder_id,:user_id,:query_id,:slug]).include? k
|
139
141
|
end
|
140
142
|
new_look[:slug] = source[:slug] if source[:slug] && !slug_used
|
141
143
|
new_look[:deleted] = false if existing_look[:deleted]
|
142
144
|
new_look[:query_id] = query_id
|
143
|
-
return update_look(existing_look
|
145
|
+
return update_look(existing_look[:id],new_look)
|
144
146
|
else
|
145
147
|
new_look = source.select do |k,v|
|
146
148
|
(keys_to_keep('create_look') - [:space_id,:folder_id,:user_id,:query_id,:slug]).include? k
|
@@ -191,14 +193,14 @@ module Gzr
|
|
191
193
|
end
|
192
194
|
|
193
195
|
def cat_look(look_id)
|
194
|
-
data = query_look(look_id)
|
196
|
+
data = query_look(look_id)
|
195
197
|
find_vis_config_reference(data) do |vis_config|
|
196
198
|
find_color_palette_reference(vis_config) do |o,default_colors|
|
197
199
|
rewrite_color_palette!(o,default_colors)
|
198
200
|
end
|
199
201
|
end
|
200
202
|
|
201
|
-
data[:scheduled_plans] = query_scheduled_plans_for_look(@look_id,"all")
|
203
|
+
data[:scheduled_plans] = query_scheduled_plans_for_look(@look_id,"all") if @options[:plans]
|
202
204
|
data
|
203
205
|
end
|
204
206
|
|