gazer 0.2.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +35 -0
- data/Gemfile.lock +150 -0
- data/LICENSE.txt +20 -0
- data/README.md +527 -0
- data/Rakefile +27 -0
- data/bin/console +35 -0
- data/bin/setup +30 -0
- data/exe/gzr +40 -0
- data/gzr.gemspec +67 -0
- data/lib/gzr.rb +25 -0
- data/lib/gzr/cli.rb +86 -0
- data/lib/gzr/command.rb +251 -0
- data/lib/gzr/commands/.gitkeep +1 -0
- data/lib/gzr/commands/connection.rb +69 -0
- data/lib/gzr/commands/connection/dialects.rb +72 -0
- data/lib/gzr/commands/connection/ls.rb +72 -0
- data/lib/gzr/commands/dashboard.rb +75 -0
- data/lib/gzr/commands/dashboard/cat.rb +67 -0
- data/lib/gzr/commands/dashboard/import.rb +256 -0
- data/lib/gzr/commands/dashboard/rm.rb +47 -0
- data/lib/gzr/commands/group.rb +87 -0
- data/lib/gzr/commands/group/ls.rb +73 -0
- data/lib/gzr/commands/group/member_groups.rb +74 -0
- data/lib/gzr/commands/group/member_users.rb +74 -0
- data/lib/gzr/commands/look.rb +75 -0
- data/lib/gzr/commands/look/cat.rb +55 -0
- data/lib/gzr/commands/look/import.rb +62 -0
- data/lib/gzr/commands/look/rm.rb +47 -0
- data/lib/gzr/commands/model.rb +51 -0
- data/lib/gzr/commands/model/ls.rb +72 -0
- data/lib/gzr/commands/plan.rb +149 -0
- data/lib/gzr/commands/plan/cat.rb +52 -0
- data/lib/gzr/commands/plan/disable.rb +49 -0
- data/lib/gzr/commands/plan/enable.rb +49 -0
- data/lib/gzr/commands/plan/failures.rb +98 -0
- data/lib/gzr/commands/plan/import.rb +69 -0
- data/lib/gzr/commands/plan/ls.rb +102 -0
- data/lib/gzr/commands/plan/rm.rb +47 -0
- data/lib/gzr/commands/plan/run.rb +58 -0
- data/lib/gzr/commands/query.rb +49 -0
- data/lib/gzr/commands/query/runquery.rb +102 -0
- data/lib/gzr/commands/role.rb +163 -0
- data/lib/gzr/commands/role/cat.rb +52 -0
- data/lib/gzr/commands/role/group_add.rb +51 -0
- data/lib/gzr/commands/role/group_ls.rb +76 -0
- data/lib/gzr/commands/role/group_rm.rb +51 -0
- data/lib/gzr/commands/role/ls.rb +75 -0
- data/lib/gzr/commands/role/rm.rb +47 -0
- data/lib/gzr/commands/role/user_add.rb +51 -0
- data/lib/gzr/commands/role/user_ls.rb +76 -0
- data/lib/gzr/commands/role/user_rm.rb +51 -0
- data/lib/gzr/commands/space.rb +137 -0
- data/lib/gzr/commands/space/cat.rb +53 -0
- data/lib/gzr/commands/space/create.rb +50 -0
- data/lib/gzr/commands/space/export.rb +117 -0
- data/lib/gzr/commands/space/ls.rb +97 -0
- data/lib/gzr/commands/space/rm.rb +56 -0
- data/lib/gzr/commands/space/top.rb +62 -0
- data/lib/gzr/commands/space/tree.rb +79 -0
- data/lib/gzr/commands/subcommandbase.rb +41 -0
- data/lib/gzr/commands/user.rb +111 -0
- data/lib/gzr/commands/user/cat.rb +52 -0
- data/lib/gzr/commands/user/disable.rb +47 -0
- data/lib/gzr/commands/user/enable.rb +47 -0
- data/lib/gzr/commands/user/ls.rb +82 -0
- data/lib/gzr/commands/user/me.rb +66 -0
- data/lib/gzr/modules/connection.rb +52 -0
- data/lib/gzr/modules/dashboard.rb +215 -0
- data/lib/gzr/modules/filehelper.rb +81 -0
- data/lib/gzr/modules/group.rb +93 -0
- data/lib/gzr/modules/look.rb +162 -0
- data/lib/gzr/modules/model.rb +40 -0
- data/lib/gzr/modules/plan.rb +216 -0
- data/lib/gzr/modules/role.rb +128 -0
- data/lib/gzr/modules/session.rb +203 -0
- data/lib/gzr/modules/space.rb +160 -0
- data/lib/gzr/modules/user.rb +114 -0
- data/lib/gzr/templates/.gitkeep +1 -0
- data/lib/gzr/templates/connection/dialects/.gitkeep +1 -0
- data/lib/gzr/templates/connection/ls/.gitkeep +1 -0
- data/lib/gzr/templates/dashboard/cat/.gitkeep +1 -0
- data/lib/gzr/templates/dashboard/import/.gitkeep +1 -0
- data/lib/gzr/templates/dashboard/rm/.gitkeep +1 -0
- data/lib/gzr/templates/group/ls/.gitkeep +1 -0
- data/lib/gzr/templates/group/member_groups/.gitkeep +1 -0
- data/lib/gzr/templates/group/member_users/.gitkeep +1 -0
- data/lib/gzr/templates/look/cat/.gitkeep +1 -0
- data/lib/gzr/templates/look/import/.gitkeep +1 -0
- data/lib/gzr/templates/look/rm/.gitkeep +1 -0
- data/lib/gzr/templates/model/ls/.gitkeep +1 -0
- data/lib/gzr/templates/plan/cat/.gitkeep +1 -0
- data/lib/gzr/templates/plan/disable/.gitkeep +1 -0
- data/lib/gzr/templates/plan/enable/.gitkeep +1 -0
- data/lib/gzr/templates/plan/failures/.gitkeep +1 -0
- data/lib/gzr/templates/plan/import/.gitkeep +1 -0
- data/lib/gzr/templates/plan/ls/.gitkeep +1 -0
- data/lib/gzr/templates/plan/rm/.gitkeep +1 -0
- data/lib/gzr/templates/plan/run/.gitkeep +1 -0
- data/lib/gzr/templates/query/run/.gitkeep +1 -0
- data/lib/gzr/templates/role/cat/.gitkeep +1 -0
- data/lib/gzr/templates/role/group_add/.gitkeep +1 -0
- data/lib/gzr/templates/role/group_ls/.gitkeep +1 -0
- data/lib/gzr/templates/role/group_rm/.gitkeep +1 -0
- data/lib/gzr/templates/role/ls/.gitkeep +1 -0
- data/lib/gzr/templates/role/rm/.gitkeep +1 -0
- data/lib/gzr/templates/role/user_add/.gitkeep +1 -0
- data/lib/gzr/templates/role/user_ls/.gitkeep +1 -0
- data/lib/gzr/templates/role/user_rm/.gitkeep +1 -0
- data/lib/gzr/templates/space/cat/.gitkeep +1 -0
- data/lib/gzr/templates/space/create/.gitkeep +1 -0
- data/lib/gzr/templates/space/export/.gitkeep +1 -0
- data/lib/gzr/templates/space/ls/.gitkeep +1 -0
- data/lib/gzr/templates/space/rm/.gitkeep +1 -0
- data/lib/gzr/templates/space/top/.gitkeep +1 -0
- data/lib/gzr/templates/space/tree/.gitkeep +1 -0
- data/lib/gzr/templates/user/cat/.gitkeep +1 -0
- data/lib/gzr/templates/user/disable/.gitkeep +1 -0
- data/lib/gzr/templates/user/enable/.gitkeep +1 -0
- data/lib/gzr/templates/user/ls/.gitkeep +1 -0
- data/lib/gzr/templates/user/me/.gitkeep +1 -0
- data/lib/gzr/version.rb +24 -0
- metadata +325 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Mike DeAngelo Looker Data Sciences, Inc.
|
4
|
+
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
# frozen_string_literal: true
|
23
|
+
|
24
|
+
module Gzr
|
25
|
+
module Connection
|
26
|
+
|
27
|
+
def query_all_connections(fields=nil)
|
28
|
+
data = nil
|
29
|
+
begin
|
30
|
+
data = @sdk.all_connections(fields ? {:fields=>fields} : nil )
|
31
|
+
rescue LookerSDK::Error => e
|
32
|
+
say_error "Error querying all_connections({:fields=>\"#{fields}\"})"
|
33
|
+
say_error e.message
|
34
|
+
raise
|
35
|
+
end
|
36
|
+
data
|
37
|
+
end
|
38
|
+
|
39
|
+
def query_all_dialects(fields=nil)
|
40
|
+
data = nil
|
41
|
+
begin
|
42
|
+
data = @sdk.all_dialect_infos(fields ? {:fields=>fields} : nil )
|
43
|
+
rescue LookerSDK::Error => e
|
44
|
+
say_error "Error querying all_dialect_infos({:fields=>\"#{fields}\"})"
|
45
|
+
say_error e.message
|
46
|
+
raise
|
47
|
+
end
|
48
|
+
data
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,215 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Mike DeAngelo Looker Data Sciences, Inc.
|
4
|
+
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
# frozen_string_literal: true
|
23
|
+
|
24
|
+
module Gzr
|
25
|
+
module Dashboard
|
26
|
+
def query_dashboard(dashboard_id)
|
27
|
+
data = nil
|
28
|
+
begin
|
29
|
+
data = @sdk.dashboard(dashboard_id)
|
30
|
+
data&.dashboard_filters&.sort! { |a,b| a.row <=> b.row }
|
31
|
+
data&.dashboard_layouts&.sort_by! { |v| (v.active ? 0 : 1) }
|
32
|
+
rescue LookerSDK::Error => e
|
33
|
+
say_error "Error querying dashboard(#{dashboard_id})"
|
34
|
+
say_error e.message
|
35
|
+
raise
|
36
|
+
end
|
37
|
+
data
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_dashboard(dash)
|
41
|
+
data = nil
|
42
|
+
begin
|
43
|
+
data = @sdk.delete_dashboard(dash)
|
44
|
+
rescue LookerSDK::Error => e
|
45
|
+
say_error "Error deleting dashboard(#{dash})"
|
46
|
+
say_error e.message
|
47
|
+
raise
|
48
|
+
end
|
49
|
+
data
|
50
|
+
end
|
51
|
+
|
52
|
+
def search_dashboards_by_slug(slug, space_id=nil)
|
53
|
+
data = nil
|
54
|
+
begin
|
55
|
+
req = { :slug => slug }
|
56
|
+
req[:space_id] = space_id if space_id
|
57
|
+
data = @sdk.search_dashboards(req)
|
58
|
+
rescue LookerSDK::Error => e
|
59
|
+
say_error "Error search_dashboards_by_slug(#{JSON.pretty_generate(req)})"
|
60
|
+
say_error e.message
|
61
|
+
raise
|
62
|
+
end
|
63
|
+
data
|
64
|
+
end
|
65
|
+
|
66
|
+
def search_dashboards_by_title(title, space_id=nil)
|
67
|
+
data = nil
|
68
|
+
begin
|
69
|
+
req = { :title => title }
|
70
|
+
req[:space_id] = space_id if space_id
|
71
|
+
data = @sdk.search_dashboards(req)
|
72
|
+
rescue LookerSDK::Error => e
|
73
|
+
say_error "Error search_dashboards_by_title(#{JSON.pretty_generate(req)})"
|
74
|
+
say_error e.message
|
75
|
+
raise
|
76
|
+
end
|
77
|
+
data
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_dashboard(dash)
|
81
|
+
begin
|
82
|
+
data = @sdk.create_dashboard(dash)
|
83
|
+
data&.dashboard_filters&.sort! { |a,b| a.row <=> b.row }
|
84
|
+
data&.dashboard_layouts&.sort_by! { |v| (v.active ? 0 : 1) }
|
85
|
+
rescue LookerSDK::Error => e
|
86
|
+
say_error "Error creating dashboard(#{JSON.pretty_generate(dash)})"
|
87
|
+
say_error e.message
|
88
|
+
raise
|
89
|
+
end
|
90
|
+
data
|
91
|
+
end
|
92
|
+
|
93
|
+
def update_dashboard(dash_id,dash)
|
94
|
+
begin
|
95
|
+
data = @sdk.update_dashboard(dash_id,dash)
|
96
|
+
data&.dashboard_filters&.sort! { |a,b| a.row <=> b.row }
|
97
|
+
rescue LookerSDK::Error => e
|
98
|
+
say_error "Error updating dashboard(#{dash_id},#{JSON.pretty_generate(dash)})"
|
99
|
+
say_error e.message
|
100
|
+
raise
|
101
|
+
end
|
102
|
+
data
|
103
|
+
end
|
104
|
+
|
105
|
+
def create_dashboard_element(dash_elem)
|
106
|
+
begin
|
107
|
+
data = @sdk.create_dashboard_element(dash_elem)
|
108
|
+
rescue LookerSDK::Error => e
|
109
|
+
say_error "Error creating dashboard_element(#{JSON.pretty_generate(dash_elem)})"
|
110
|
+
say_error e.message
|
111
|
+
raise
|
112
|
+
end
|
113
|
+
data
|
114
|
+
end
|
115
|
+
|
116
|
+
def update_dashboard_element(id,dash_elem)
|
117
|
+
begin
|
118
|
+
data = @sdk.update_dashboard_element(id,dash_elem)
|
119
|
+
rescue LookerSDK::Error => e
|
120
|
+
say_error "Error updating dashboard_element(#{id},#{JSON.pretty_generate(dash_elem)})"
|
121
|
+
say_error e.message
|
122
|
+
raise
|
123
|
+
end
|
124
|
+
data
|
125
|
+
end
|
126
|
+
|
127
|
+
def delete_dashboard_element(id)
|
128
|
+
begin
|
129
|
+
data = @sdk.delete_dashboard_element(id)
|
130
|
+
rescue LookerSDK::Error => e
|
131
|
+
say_error "Error deleting dashboard_element(#{id})})"
|
132
|
+
say_error e.message
|
133
|
+
raise
|
134
|
+
end
|
135
|
+
data
|
136
|
+
end
|
137
|
+
|
138
|
+
def create_dashboard_layout(dash_layout)
|
139
|
+
begin
|
140
|
+
data = @sdk.create_dashboard_layout(dash_layout)
|
141
|
+
rescue LookerSDK::Error => e
|
142
|
+
say_error "Error creating dashboard_layout(#{JSON.pretty_generate(dash_layout)})"
|
143
|
+
say_error e.message
|
144
|
+
raise
|
145
|
+
end
|
146
|
+
data
|
147
|
+
end
|
148
|
+
|
149
|
+
def update_dashboard_layout(id,dash_layout)
|
150
|
+
begin
|
151
|
+
data = @sdk.update_dashboard_layout(id,dash_layout)
|
152
|
+
rescue LookerSDK::Error => e
|
153
|
+
say_error "Error updating dashboard_layout(#{id},#{JSON.pretty_generate(dash_layout)})"
|
154
|
+
say_error e.message
|
155
|
+
raise
|
156
|
+
end
|
157
|
+
data
|
158
|
+
end
|
159
|
+
|
160
|
+
def delete_dashboard_layout(id)
|
161
|
+
begin
|
162
|
+
data = @sdk.delete_dashboard_layout(id)
|
163
|
+
rescue LookerSDK::Error => e
|
164
|
+
say_error "Error deleting dashboard_layout(#{id})"
|
165
|
+
say_error e.message
|
166
|
+
raise
|
167
|
+
end
|
168
|
+
data
|
169
|
+
end
|
170
|
+
|
171
|
+
def update_dashboard_layout_component(id,component)
|
172
|
+
begin
|
173
|
+
data = @sdk.update_dashboard_layout_component(id,component)
|
174
|
+
rescue LookerSDK::Error => e
|
175
|
+
say_error "Error updating dashboard_layout_component(#{id},#{JSON.pretty_generate(component)})"
|
176
|
+
say_error e.message
|
177
|
+
raise
|
178
|
+
end
|
179
|
+
data
|
180
|
+
end
|
181
|
+
|
182
|
+
def create_dashboard_filter(dash_filter)
|
183
|
+
begin
|
184
|
+
data = @sdk.create_dashboard_filter(dash_filter)
|
185
|
+
rescue LookerSDK::Error => e
|
186
|
+
say_error "Error creating dashboard_filter(#{JSON.pretty_generate(dash_filter)})"
|
187
|
+
say_error e.message
|
188
|
+
raise
|
189
|
+
end
|
190
|
+
data
|
191
|
+
end
|
192
|
+
|
193
|
+
def update_dashboard_filter(id,dash_filter)
|
194
|
+
begin
|
195
|
+
data = @sdk.update_dashboard_filter(id,dash_filter)
|
196
|
+
rescue LookerSDK::Error => e
|
197
|
+
say_error "Error updating dashboard_filter(#{id},#{JSON.pretty_generate(dash_filter)})"
|
198
|
+
say_error e.message
|
199
|
+
raise
|
200
|
+
end
|
201
|
+
data
|
202
|
+
end
|
203
|
+
|
204
|
+
def delete_dashboard_filter(id)
|
205
|
+
begin
|
206
|
+
data = @sdk.delete_dashboard_filter(id)
|
207
|
+
rescue LookerSDK::Error => e
|
208
|
+
say_error "Error deleting dashboard_filter(#{id})})"
|
209
|
+
say_error e.message
|
210
|
+
raise
|
211
|
+
end
|
212
|
+
data
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Mike DeAngelo Looker Data Sciences, Inc.
|
4
|
+
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
# frozen_string_literal: true
|
23
|
+
|
24
|
+
require 'pathname'
|
25
|
+
require 'rubygems/package'
|
26
|
+
|
27
|
+
module Gzr
|
28
|
+
module FileHelper
|
29
|
+
def write_file(file_name=nil,base_dir=nil,path=nil,output=$stdout)
|
30
|
+
f = nil
|
31
|
+
if base_dir.respond_to?(:mkdir)&& base_dir.respond_to?(:add_file) then
|
32
|
+
if path then
|
33
|
+
@archived_paths ||= Array.new
|
34
|
+
base_dir.mkdir(path.to_path, 0755) unless @archived_paths.include?(path.to_path)
|
35
|
+
@archived_paths << path.to_path
|
36
|
+
end
|
37
|
+
fn = Pathname.new(file_name.gsub('/',"\u{2215}"))
|
38
|
+
fn = path + fn if path
|
39
|
+
base_dir.add_file(fn.to_path, 0644) do |tf|
|
40
|
+
yield tf
|
41
|
+
end
|
42
|
+
return
|
43
|
+
end
|
44
|
+
|
45
|
+
base = Pathname.new(File.expand_path(base_dir)) if base_dir
|
46
|
+
begin
|
47
|
+
p = Pathname.new(path) if path
|
48
|
+
p.descend do |path_part|
|
49
|
+
test_dir = base + Pathname.new(path_part)
|
50
|
+
Dir.mkdir(test_dir) unless (test_dir.exist? && test_dir.directory?)
|
51
|
+
end if p
|
52
|
+
file = Pathname.new(file_name.gsub('/',"\u{2215}")) if file_name
|
53
|
+
file = p + file if p
|
54
|
+
file = base + file if base
|
55
|
+
f = File.open(file, "wt") if file
|
56
|
+
end if base
|
57
|
+
|
58
|
+
return ( f || output ) unless block_given?
|
59
|
+
begin
|
60
|
+
yield ( f || output )
|
61
|
+
ensure
|
62
|
+
f.close if f
|
63
|
+
end
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def read_file(file_name)
|
68
|
+
file = nil
|
69
|
+
data_hash = nil
|
70
|
+
begin
|
71
|
+
file = (file_name.kind_of? StringIO) ? file_name : File.open(file_name)
|
72
|
+
data_hash = JSON.parse(file.read,{:symbolize_names => true})
|
73
|
+
ensure
|
74
|
+
file.close if file
|
75
|
+
end
|
76
|
+
return (data_hash || {}) unless block_given?
|
77
|
+
|
78
|
+
yield data_hash || {}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Mike DeAngelo Looker Data Sciences, Inc.
|
4
|
+
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
# frozen_string_literal: true
|
23
|
+
|
24
|
+
module Gzr
|
25
|
+
module Group
|
26
|
+
def query_all_groups(fields=nil, sorts=nil)
|
27
|
+
req = {
|
28
|
+
:per_page=>128
|
29
|
+
}
|
30
|
+
req[:fields] = fields if fields
|
31
|
+
req[:sorts] = sorts if sorts
|
32
|
+
|
33
|
+
data = Array.new
|
34
|
+
page = 1
|
35
|
+
loop do
|
36
|
+
begin
|
37
|
+
req[:page] = page
|
38
|
+
scratch_data = @sdk.all_groups(req)
|
39
|
+
rescue LookerSDK::ClientError => e
|
40
|
+
say_error "Unable to get all_groups(#{JSON.pretty_generate(req)})"
|
41
|
+
say_error e.message
|
42
|
+
raise
|
43
|
+
end
|
44
|
+
break if scratch_data.length == 0
|
45
|
+
page += 1
|
46
|
+
data += scratch_data
|
47
|
+
end
|
48
|
+
data
|
49
|
+
end
|
50
|
+
|
51
|
+
def query_group_groups(group_id,fields=nil)
|
52
|
+
req = { }
|
53
|
+
req[:fields] = fields if fields
|
54
|
+
|
55
|
+
data = Array.new
|
56
|
+
begin
|
57
|
+
data = @sdk.all_group_groups(group_id,req)
|
58
|
+
rescue LookerSDK::NotFound => e
|
59
|
+
return []
|
60
|
+
rescue LookerSDK::ClientError => e
|
61
|
+
say_error "Unable to get all_group_groups(#{group_id},#{JSON.pretty_generate(req)})"
|
62
|
+
say_error e.message
|
63
|
+
raise
|
64
|
+
end
|
65
|
+
data
|
66
|
+
end
|
67
|
+
|
68
|
+
def query_group_users(group_id,fields=nil,sorts=nil)
|
69
|
+
req = {
|
70
|
+
:per_page=>128
|
71
|
+
}
|
72
|
+
req[:fields] = fields if fields
|
73
|
+
req[:sorts] = sorts if sorts
|
74
|
+
|
75
|
+
data = Array.new
|
76
|
+
page = 1
|
77
|
+
loop do
|
78
|
+
begin
|
79
|
+
req[:page] = page
|
80
|
+
scratch_data = @sdk.all_group_users(group_id,req)
|
81
|
+
rescue LookerSDK::ClientError => e
|
82
|
+
say_error "Unable to get all_group_users(#{group_id},#{JSON.pretty_generate(req)})"
|
83
|
+
say_error e.message
|
84
|
+
raise
|
85
|
+
end
|
86
|
+
break if scratch_data.length == 0
|
87
|
+
page += 1
|
88
|
+
data += scratch_data
|
89
|
+
end
|
90
|
+
data
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Mike DeAngelo Looker Data Sciences, Inc.
|
4
|
+
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
# this software and associated documentation files (the "Software"), to deal in
|
7
|
+
# the Software without restriction, including without limitation the rights to
|
8
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
# subject to the following conditions:
|
11
|
+
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
# frozen_string_literal: true
|
23
|
+
|
24
|
+
module Gzr
|
25
|
+
module Look
|
26
|
+
def query_look(look_id)
|
27
|
+
data = nil
|
28
|
+
begin
|
29
|
+
data = @sdk.look(look_id)
|
30
|
+
rescue LookerSDK::Error => e
|
31
|
+
say_error "Error querying look(#{look_id})"
|
32
|
+
say_error e.message
|
33
|
+
raise
|
34
|
+
end
|
35
|
+
data
|
36
|
+
end
|
37
|
+
|
38
|
+
def search_looks_by_slug(slug, space_id=nil)
|
39
|
+
data = nil
|
40
|
+
begin
|
41
|
+
req = { :slug => slug }
|
42
|
+
req[:space_id] = space_id if space_id
|
43
|
+
data = @sdk.search_looks(req)
|
44
|
+
rescue LookerSDK::Error => e
|
45
|
+
say_error "Error search_looks_by_slug(#{JSON.pretty_generate(req)})"
|
46
|
+
say_error e.message
|
47
|
+
raise
|
48
|
+
end
|
49
|
+
data
|
50
|
+
end
|
51
|
+
|
52
|
+
def search_looks_by_title(title, space_id=nil)
|
53
|
+
data = nil
|
54
|
+
begin
|
55
|
+
req = { :title => title }
|
56
|
+
req[:space_id] = space_id if space_id
|
57
|
+
data = @sdk.search_looks(req)
|
58
|
+
rescue LookerSDK::Error => e
|
59
|
+
say_error "Error search_looks_by_title(#{JSON.pretty_generate(req)})"
|
60
|
+
say_error e.message
|
61
|
+
raise
|
62
|
+
end
|
63
|
+
data
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_look(look)
|
67
|
+
begin
|
68
|
+
data = @sdk.create_look(look)
|
69
|
+
rescue LookerSDK::Error => e
|
70
|
+
say_error "Error creating look(#{JSON.pretty_generate(look)})"
|
71
|
+
say_error e.message
|
72
|
+
raise
|
73
|
+
end
|
74
|
+
data
|
75
|
+
end
|
76
|
+
|
77
|
+
def update_look(id,look)
|
78
|
+
begin
|
79
|
+
data = @sdk.update_look(id,look)
|
80
|
+
rescue LookerSDK::Error => e
|
81
|
+
say_error "Error updating look(#{id},#{JSON.pretty_generate(look)})"
|
82
|
+
say_error e.message
|
83
|
+
raise
|
84
|
+
end
|
85
|
+
data
|
86
|
+
end
|
87
|
+
|
88
|
+
def delete_look(look_id)
|
89
|
+
data = nil
|
90
|
+
begin
|
91
|
+
data = @sdk.delete_look(look_id)
|
92
|
+
rescue LookerSDK::Error => e
|
93
|
+
say_error "Error deleting look(#{look_id})"
|
94
|
+
say_error e.message
|
95
|
+
raise
|
96
|
+
end
|
97
|
+
data
|
98
|
+
end
|
99
|
+
|
100
|
+
def upsert_look(user_id, query_id, space_id, source_look)
|
101
|
+
existing_look = search_looks_by_title(source_look[:title], space_id).fetch(0,nil)
|
102
|
+
slug_used = search_looks_by_slug(source_look[:slug]).fetch(0,nil) if source_look[:slug]
|
103
|
+
|
104
|
+
if slug_used then
|
105
|
+
if existing_look then
|
106
|
+
if !(existing_look.space_id == slug_used.space_id && existing_look.title == slug_used.title) then
|
107
|
+
say_warning "slug #{slug_used.slug} already used for look #{slug_used.title} in space #{slug_used.space_id}"
|
108
|
+
say_warning "look will be imported with new slug"
|
109
|
+
end
|
110
|
+
else
|
111
|
+
say_warning "slug #{slug_used.slug} already used for look #{slug_used.title} in space #{slug_used.space_id}"
|
112
|
+
say_warning "look will be imported with new slug"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
if existing_look then
|
117
|
+
if @options[:force] then
|
118
|
+
say_ok "Modifying existing Look #{source_look[:title]} in space #{space_id}"
|
119
|
+
new_look = source_look.select do |k,v|
|
120
|
+
(keys_to_keep('update_look') - [:space_id,:user_id,:query_id,:slug]).include? k
|
121
|
+
end
|
122
|
+
new_look[:slug] = source_look[:slug] unless slug_used
|
123
|
+
new_look[:query_id] = query_id
|
124
|
+
return update_look(existing_look.id,new_look)
|
125
|
+
else
|
126
|
+
raise Gzr::CLI::Error, "Look #{source_look[:title]} already exists in space #{space_id}\nUse --force if you want to overwrite it"
|
127
|
+
end
|
128
|
+
else
|
129
|
+
new_look = source_look.select do |k,v|
|
130
|
+
(keys_to_keep('create_look') - [:space_id,:user_id,:query_id,:slug]).include? k
|
131
|
+
end
|
132
|
+
new_look[:slug] = source_look[:slug] unless slug_used
|
133
|
+
new_look[:query_id] = query_id
|
134
|
+
new_look[:user_id] = user_id
|
135
|
+
new_look[:space_id] = space_id
|
136
|
+
|
137
|
+
return create_look(new_look)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def create_fetch_query(source_query)
|
142
|
+
new_query = source_query.select do |k,v|
|
143
|
+
(keys_to_keep('create_query') - [:client_id]).include? k
|
144
|
+
end
|
145
|
+
return create_query(new_query)
|
146
|
+
end
|
147
|
+
|
148
|
+
def create_merge_result(merge_result)
|
149
|
+
new_merge_result = merge_result.select do |k,v|
|
150
|
+
(keys_to_keep('create_merge_query') - [:client_id,:source_queries]).include? k
|
151
|
+
end
|
152
|
+
new_merge_result[:source_queries] = merge_result[:source_queries].map do |query|
|
153
|
+
new_query = {}
|
154
|
+
new_query[:query_id] = create_fetch_query(query[:query]).id
|
155
|
+
new_query[:name] = query[:name]
|
156
|
+
new_query[:merge_fields] = query[:merge_fields]
|
157
|
+
new_query
|
158
|
+
end
|
159
|
+
return create_merge_query(new_merge_result)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|