gazer 0.3.10 → 0.3.11
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/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
|
|