tableau_rest_api 0.1.2

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.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +8 -0
  3. data/Guardfile +21 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +103 -0
  6. data/Rakefile +10 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/fixtures/vcr_cassettes/add_user.yml +223 -0
  10. data/fixtures/vcr_cassettes/add_user_to_group.yml +451 -0
  11. data/fixtures/vcr_cassettes/add_user_to_group_through_site.yml +451 -0
  12. data/fixtures/vcr_cassettes/create_group.yml +224 -0
  13. data/fixtures/vcr_cassettes/create_group_through_site.yml +224 -0
  14. data/fixtures/vcr_cassettes/datasources.yml +234 -0
  15. data/fixtures/vcr_cassettes/datasources_through_site.yml +234 -0
  16. data/fixtures/vcr_cassettes/delete_datasource.yml +334 -0
  17. data/fixtures/vcr_cassettes/delete_group.yml +328 -0
  18. data/fixtures/vcr_cassettes/delete_group_through_site.yml +329 -0
  19. data/fixtures/vcr_cassettes/delete_schedule.yml +276 -0
  20. data/fixtures/vcr_cassettes/delete_site.yml +214 -0
  21. data/fixtures/vcr_cassettes/delete_subscription.yml +329 -0
  22. data/fixtures/vcr_cassettes/delete_workbook.yml +350 -0
  23. data/fixtures/vcr_cassettes/get_datasource.yml +673 -0
  24. data/fixtures/vcr_cassettes/get_workbook.yml +15044 -0
  25. data/fixtures/vcr_cassettes/groups.yml +229 -0
  26. data/fixtures/vcr_cassettes/groups_through_site.yml +230 -0
  27. data/fixtures/vcr_cassettes/projects_through_site.yml +230 -0
  28. data/fixtures/vcr_cassettes/query_workbooks.yml +250 -0
  29. data/fixtures/vcr_cassettes/remove_user_from_group_through_site.yml +440 -0
  30. data/fixtures/vcr_cassettes/remove_user_from_site_through_site.yml +329 -0
  31. data/fixtures/vcr_cassettes/schedules.yml +115 -0
  32. data/fixtures/vcr_cassettes/server_info.yml +53 -0
  33. data/fixtures/vcr_cassettes/signin.yml +57 -0
  34. data/fixtures/vcr_cassettes/signout.yml +102 -0
  35. data/fixtures/vcr_cassettes/sites.yml +118 -0
  36. data/fixtures/vcr_cassettes/subscriptions.yml +226 -0
  37. data/fixtures/vcr_cassettes/switch_site.yml +113 -0
  38. data/fixtures/vcr_cassettes/update_group_through_site.yml +343 -0
  39. data/fixtures/vcr_cassettes/update_user_through_site.yml +333 -0
  40. data/fixtures/vcr_cassettes/users_in_group.yml +339 -0
  41. data/fixtures/vcr_cassettes/users_on_site.yml +230 -0
  42. data/fixtures/vcr_cassettes/users_through_site.yml +230 -0
  43. data/fixtures/vcr_cassettes/workbooks_through_site.yml +250 -0
  44. data/lib/tableau_rest_api.rb +32 -0
  45. data/lib/tableau_rest_api/api_error.rb +7 -0
  46. data/lib/tableau_rest_api/area/schedule_subscription.rb +41 -0
  47. data/lib/tableau_rest_api/area/user_group.rb +72 -0
  48. data/lib/tableau_rest_api/area/workbook_datasource.rb +87 -0
  49. data/lib/tableau_rest_api/client.rb +65 -0
  50. data/lib/tableau_rest_api/helpers/helpers.rb +9 -0
  51. data/lib/tableau_rest_api/resource.rb +42 -0
  52. data/lib/tableau_rest_api/resources/base.rb +24 -0
  53. data/lib/tableau_rest_api/resources/datasource.rb +12 -0
  54. data/lib/tableau_rest_api/resources/group.rb +10 -0
  55. data/lib/tableau_rest_api/resources/project.rb +12 -0
  56. data/lib/tableau_rest_api/resources/schedule.rb +12 -0
  57. data/lib/tableau_rest_api/resources/server.rb +12 -0
  58. data/lib/tableau_rest_api/resources/site.rb +68 -0
  59. data/lib/tableau_rest_api/resources/subscription.rb +10 -0
  60. data/lib/tableau_rest_api/resources/user.rb +12 -0
  61. data/lib/tableau_rest_api/resources/workbook.rb +12 -0
  62. data/lib/tableau_rest_api/util/config.rb +22 -0
  63. data/lib/tableau_rest_api/util/response.rb +11 -0
  64. data/lib/tableau_rest_api/util/token.rb +16 -0
  65. data/lib/tableau_rest_api/util/upload.rb +29 -0
  66. data/lib/tableau_rest_api/version.rb +3 -0
  67. data/tableau_rest_api.gemspec +33 -0
  68. metadata +222 -0
@@ -0,0 +1,250 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://tableau.lvh.me/api/2.6/auth/signin
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"credentials":{"name":"<TABLEAU_USERNAME>","password":"<TABLEAU_PASSWORD>","site":{"contentUrl":""}}}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ User-Agent:
15
+ - rest-client/2.0.2 (linux-gnu x86_64) ruby/2.3.3p222
16
+ Content-Type:
17
+ - application/json
18
+ Content-Length:
19
+ - '94'
20
+ Host:
21
+ - tableau.lvh.me
22
+ response:
23
+ status:
24
+ code: 200
25
+ message: OK
26
+ headers:
27
+ Date:
28
+ - Mon, 26 Jun 2017 10:50:21 GMT
29
+ Server:
30
+ - Tableau
31
+ Content-Type:
32
+ - application/json;charset=utf-8
33
+ Vary:
34
+ - Accept-Encoding
35
+ Content-Encoding:
36
+ - gzip
37
+ P3p:
38
+ - CP="NON"
39
+ X-Ua-Compatible:
40
+ - IE=Edge
41
+ X-Content-Type-Options:
42
+ - nosniff
43
+ X-Xss-Protection:
44
+ - 1; mode=block
45
+ Content-Length:
46
+ - '195'
47
+ body:
48
+ encoding: ASCII-8BIT
49
+ string: !binary |-
50
+ H4sIAAAAAAAAAz2MvQ6CMBgA3+WbbdIf/uqGoAwatUYTdTGlFENQMC1KCPLu
51
+ wuJ0y931oIzOdNUU8mFh3oMtGj2xyGAORBKcuylHmPIUOUw7SHoUI99nGfE4
52
+ ZixQMANVV824OJnH2MAwg7fV5j+hKSGcU44ylrvIyXGAJFcEUYyVdlju+0E6
53
+ RU1d6mr02/3ldgnPndDdcRG+2mW0NUJ8n+uKtvaDD/F9USdMRNe4tbsk2JRH
54
+ Ks1KwDD8AFV7PaPNAAAA
55
+ http_version:
56
+ recorded_at: Mon, 26 Jun 2017 10:50:24 GMT
57
+ - request:
58
+ method: get
59
+ uri: https://tableau.lvh.me/api/2.6/sites
60
+ body:
61
+ encoding: US-ASCII
62
+ string: ''
63
+ headers:
64
+ Accept:
65
+ - application/json
66
+ Accept-Encoding:
67
+ - gzip, deflate
68
+ User-Agent:
69
+ - rest-client/2.0.2 (linux-gnu x86_64) ruby/2.3.3p222
70
+ Content-Type:
71
+ - application/json
72
+ X-Tableau-Auth:
73
+ - wPY_YAXyQeyTBApwECNrQQ|mKn2wsv0RDgBoG3QCZDwsOG8LkT2arFQ
74
+ Host:
75
+ - tableau.lvh.me
76
+ response:
77
+ status:
78
+ code: 200
79
+ message: OK
80
+ headers:
81
+ Date:
82
+ - Mon, 26 Jun 2017 10:50:21 GMT
83
+ Server:
84
+ - Tableau
85
+ Content-Type:
86
+ - application/json;charset=utf-8
87
+ Vary:
88
+ - Accept-Encoding
89
+ Content-Encoding:
90
+ - gzip
91
+ P3p:
92
+ - CP="NON"
93
+ X-Ua-Compatible:
94
+ - IE=Edge
95
+ X-Content-Type-Options:
96
+ - nosniff
97
+ X-Xss-Protection:
98
+ - 1; mode=block
99
+ Content-Length:
100
+ - '521'
101
+ body:
102
+ encoding: ASCII-8BIT
103
+ string: !binary |-
104
+ H4sIAAAAAAAAA92VS2sbMRDHv0rYcwb0Wj1yM22hhz4OaeihlKDHyBHY67CS
105
+ A23wd++oCZjY8SmH4t52/n/NSPoxo30c7v2yTL6VzTRcPfYIv2zXAefhauDD
106
+ 5V/huvzGHjJGQts0v1o8+LLyYdVlO+wuh1oa1l6gfwxXPx6HknqK5yyPwQET
107
+ LoCSqMBrwcAYmbh2TEobqebk173Se8x+u2okxM3UcGo384pkin1al+nzJvVV
108
+ 7568xZRuKs6V3Np833RYxFYekIQZH0qlG30stW3mXx+mflQ6T5u3uHc/lXVp
109
+ lCbGXmMbapxLwK/tjqoepCy3WNsiRqx7J/tVJSv6eIff/bze3r9I2l0+M7DC
110
+ SAzKgDZRgRrFCJ55A6OMiRtnMaPZM/hGG10TQ3FIwXv/T0E8X/ctJLSVNqGK
111
+ gFlJUMEKcIxZUFp6HS1qpdUxCXlIgjqt1WdEZ82D5ei1zQo4z5k6w3CaDgqF
112
+ cNl46WhoXuGhT/HQ584jcO6iiCPEmCIoZyUElT1oDCJIF6RIYc9jcdGJlGl5
113
+ 0akcjctte3Jv65N71mTYGJNmHIFj0tQp0kCI0oIMMmiT2IjcveyUV6F0JP8J
114
+ D0QntQMv6GGlHtH0khgEpmLOIotAP5ljHqdwnDuNFBTnnJ7UrCwDpZwGO6oR
115
+ Riu7TkOF+YjGCRjnyuLnbvcHHjntMMwIAAA=
116
+ http_version:
117
+ recorded_at: Mon, 26 Jun 2017 10:50:24 GMT
118
+ - request:
119
+ method: post
120
+ uri: https://tableau.lvh.me/api/2.6/auth/signin
121
+ body:
122
+ encoding: UTF-8
123
+ string: '{"credentials":{"name":"<TABLEAU_USERNAME>","password":"<TABLEAU_PASSWORD>","site":{"contentUrl":""}}}'
124
+ headers:
125
+ Accept:
126
+ - application/json
127
+ Accept-Encoding:
128
+ - gzip, deflate
129
+ User-Agent:
130
+ - rest-client/2.0.2 (linux-gnu x86_64) ruby/2.3.3p222
131
+ Content-Type:
132
+ - application/json
133
+ X-Tableau-Auth:
134
+ - wPY_YAXyQeyTBApwECNrQQ|mKn2wsv0RDgBoG3QCZDwsOG8LkT2arFQ
135
+ Content-Length:
136
+ - '94'
137
+ Host:
138
+ - tableau.lvh.me
139
+ response:
140
+ status:
141
+ code: 200
142
+ message: OK
143
+ headers:
144
+ Date:
145
+ - Mon, 26 Jun 2017 10:50:22 GMT
146
+ Server:
147
+ - Tableau
148
+ Content-Type:
149
+ - application/json;charset=utf-8
150
+ Vary:
151
+ - Accept-Encoding
152
+ Content-Encoding:
153
+ - gzip
154
+ P3p:
155
+ - CP="NON"
156
+ X-Ua-Compatible:
157
+ - IE=Edge
158
+ X-Content-Type-Options:
159
+ - nosniff
160
+ X-Xss-Protection:
161
+ - 1; mode=block
162
+ Content-Length:
163
+ - '193'
164
+ body:
165
+ encoding: ASCII-8BIT
166
+ string: !binary |-
167
+ H4sIAAAAAAAAAz3MuQ6CQBSF4Xe5NZPMAgxjp9EYiHEJEWxnjYRNWWIUfXex
168
+ sTrN+b8JdGeNbYZCVj0sJuiLwf62MLAAIgl2gRIIU6GQz6yPZEgx4pwZEgrM
169
+ WKTBA902w0ycu2pu4OPB2Nvuj1BFiBBUIMNcgHyHIySFJohirK3PHOeR+kVD
170
+ W9pm/i/dMXo97/v0lOP9rcvi3aVWj3eWPXnCVVGWJt2sctuM9fYeq0N+fTCZ
171
+ rGfi8wW5CskzzQAAAA==
172
+ http_version:
173
+ recorded_at: Mon, 26 Jun 2017 10:50:25 GMT
174
+ - request:
175
+ method: get
176
+ uri: https://tableau.lvh.me/api/2.6/sites/1a10f5b9-029b-43e4-a620-773d1690338c/workbooks
177
+ body:
178
+ encoding: US-ASCII
179
+ string: ''
180
+ headers:
181
+ Accept:
182
+ - application/json
183
+ Accept-Encoding:
184
+ - gzip, deflate
185
+ User-Agent:
186
+ - rest-client/2.0.2 (linux-gnu x86_64) ruby/2.3.3p222
187
+ Content-Type:
188
+ - application/json
189
+ X-Tableau-Auth:
190
+ - AfP8zyqNSQW0NprVILXmbw|VVy7J7bikkdSEBWenumGqIbOWhw3aJDb
191
+ Host:
192
+ - tableau.lvh.me
193
+ response:
194
+ status:
195
+ code: 200
196
+ message: OK
197
+ headers:
198
+ Date:
199
+ - Mon, 26 Jun 2017 10:50:22 GMT
200
+ Server:
201
+ - Tableau
202
+ Content-Type:
203
+ - application/json;charset=utf-8
204
+ Vary:
205
+ - Accept-Encoding
206
+ Content-Encoding:
207
+ - gzip
208
+ P3p:
209
+ - CP="NON"
210
+ X-Ua-Compatible:
211
+ - IE=Edge
212
+ X-Content-Type-Options:
213
+ - nosniff
214
+ X-Xss-Protection:
215
+ - 1; mode=block
216
+ Content-Length:
217
+ - '1194'
218
+ body:
219
+ encoding: ASCII-8BIT
220
+ string: !binary |-
221
+ H4sIAAAAAAAAA82YS2/bRhDHvwqhUwtkgX0/eFMQoIfERRA7lxQ9zL4c1ZJo
222
+ kFRcO/B376ykWLQsurHbAwEfzNn/7gx/nJ2d1ffZNVwu1tAvmvWs/l6e0u+b
223
+ lU/trJ6x2Zut4Xxxl8ojpWjomx6W82+wWIJfbs1qdv9mdtO0V75prrqyyo+H
224
+ Wf0HLtk2f6XQF/siop4anXQQhnjglkhvDbHWAFHBGaqCdiIH9LOGVVn9oniB
225
+ TXUOq+tl6oqr5mZdwtsvxz1jznFHosiKyEwtARcY4ZSGJEU2xvoyq4fLEhv+
226
+ t50mHQeuwZEEWmMUUhAfUiZcacMhCs1jPkRxvrlObdc3bUJbaNZ9Wvef2+Xx
227
+ SPe1ucGA0c+sbzdbyx5dmdYm6FOc9yVoyjShhjBxwWmtTC3sF5RsruNjCeOE
228
+ qguma+5qSb/ge0yVJ0ssBxUTiarwFNljFFkQLgIH55IEgEMUn9IlJhwsj2kO
229
+ 7K9laWsmXs1SgPWaScToRCCMJU1Ac0Z0FtI54SQId3iLdynDZtn/bwwN59ri
230
+ TOJ5BCKlQO9RcOJdyExLzSWLB+8fFt9She8IxxDLwN7+MoiFkL5gtBa8VvoE
231
+ RIMECdMFIlW1mCREoEbEGB3RCjAEHZCfVZp4QYXWUjHl6MH727QOX1fQXi3W
232
+ l8ccj8ZGWUoxBtMVmMzVio1m5IOETxEmjVJSZEhYipJIhgvYwCPutexcpsoz
233
+ 7w/ez+YXlX8GKI77n2TKR5AyWXhxTD41hpThJpe1xD83RaRWam21FySahEgl
234
+ HkHeh0wsBYulXNPA8mOkgAXxtl+Eropp1ZyA+iDYj79k1+OWZtu6qMqWHtv1
235
+ O4mtJa/ZJBNVCsspHjSYIDQTSb0lTiPVpJJRIUaewR68vz+XjxK1+mWxrvCF
236
+ LtvUdb8eE0b1ULxY/1A+WxT0CGuOGcwxN2t+qig8SJC12H6O6bGmPFjHjCZR
237
+ ZjymGChinQMSPIXAODDDBxk8b6+qD7+9rd5B99U30MZjvCjA8eHwi/OX45Fk
238
+ aoqF9FQbtZOYkuKC1nSSTK13zDKNp1b0FJs4ITB/sZhZpxNQS7mgA+/v0211
239
+ jiukSlZnGMaCzAPg5r+tLtpN1z9bhHHudqp8NHE772eL8+hn2DJWrmby+c+w
240
+ l0zvM0BQoDLPhFkjMLVlIg67CZLRMwRJnfHp4P3j57N59XHxaV6lv/ft9BHs
241
+ oiiCwfgLqfLS12K/hZlbKu8pqjuJqYtqkkcetrPYgdlEvJF45HkFxHmFC3AD
242
+ 1rDITR60ZA99bUUq6DqssyvkWfWp68c6XXLQ7WUvpsx5qblCbxuxU5TFnjI2
243
+ FkJM+SamlQhKREuswPNQBmw1LOYvMVQEQ7NUMetDFLl50lHsTAOCGZbdvyLU
244
+ W4SiXGZPXsCOJCOJOg2ElGvlvJXY9vqIPRp+fB+TIDklp1IUBi+5hyg8tMcI
245
+ d6bXIZQ1NTUfqaBDychBNg2E5eeVIBwWG2o4ZiGlxEmTCI8xeOOCSCwNEd49
246
+ RXj33xCqUzeEI4mdMkKFZZMZZOYlTXgYBewJLMUCqhkEzUFRyoYb+QnCnem1
247
+ CDkeJyMt6lBSauGf9/f/ABbHJgpJFAAA
248
+ http_version:
249
+ recorded_at: Mon, 26 Jun 2017 10:50:25 GMT
250
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,32 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+ require 'aspector'
4
+ require 'timerizer'
5
+ require 'securerandom'
6
+
7
+ require 'tableau_rest_api/version'
8
+ require 'tableau_rest_api/client'
9
+ require 'tableau_rest_api/area/user_group'
10
+ require 'tableau_rest_api/area/workbook_datasource'
11
+ require 'tableau_rest_api/area/schedule_subscription'
12
+ require 'tableau_rest_api/resource'
13
+ require 'tableau_rest_api/api_error'
14
+ require 'tableau_rest_api/util/config'
15
+ require 'tableau_rest_api/util/response'
16
+ require 'tableau_rest_api/util/upload'
17
+ require 'tableau_rest_api/util/token'
18
+ require 'tableau_rest_api/helpers/helpers'
19
+ require 'tableau_rest_api/resources/base'
20
+ require 'tableau_rest_api/resources/site'
21
+ require 'tableau_rest_api/resources/user'
22
+ require 'tableau_rest_api/resources/group'
23
+ require 'tableau_rest_api/resources/datasource'
24
+ require 'tableau_rest_api/resources/project'
25
+ require 'tableau_rest_api/resources/workbook'
26
+ require 'tableau_rest_api/resources/subscription'
27
+ require 'tableau_rest_api/resources/schedule'
28
+ require 'tableau_rest_api/resources/server'
29
+
30
+ # Tableau API wrapper lib
31
+ module TableauRestApi
32
+ end
@@ -0,0 +1,7 @@
1
+ module TableauRestApi
2
+ class ApiError < StandardError
3
+ def initialize(error)
4
+ super(error)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,41 @@
1
+ module TableauRestApi
2
+ module ScheduleSubscription
3
+ aspector do
4
+ before :subscriptions, :login
5
+ before :query_subscription, :login
6
+ before :create_subscription, :login
7
+ before :delete_subscription, :login
8
+ before :schedules, :login
9
+ end
10
+
11
+ def subscriptions(site_id)
12
+ url = build_url ['sites', site_id, 'subscriptions']
13
+ (get url).subscriptions.subscription.to_a.map { |sub| Subscription.new(sub) }
14
+ end
15
+
16
+ def query_subscription(site_id, sub_id)
17
+ url = build_url ['sites', site_id, 'subscriptions', sub_id]
18
+ Subscription.new((get url).subscription)
19
+ end
20
+
21
+ def create_subscription(site_id, subscription)
22
+ url = build_url ['sites', site_id, 'subscriptions']
23
+ Subscription.new((post url, subscription).subscription)
24
+ end
25
+
26
+ def delete_subscription(site_id, subscription_id)
27
+ url = build_url ['sites', site_id, 'subscriptions', subscription_id]
28
+ delete url
29
+ end
30
+
31
+ def delete_schedule(schedule_id)
32
+ url = build_url ['schedules', schedule_id]
33
+ delete url
34
+ end
35
+
36
+ def schedules
37
+ url = build_url 'schedules'
38
+ (get url).schedules.schedule.to_a.map { |schedule| Schedule.new(schedule) }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,72 @@
1
+ module TableauRestApi
2
+ module UserGroup
3
+ aspector do
4
+ before :users_on_site,:login
5
+ before :groups, :login
6
+ before :users_in_group, :login
7
+ before :add_user_to_site, :login
8
+ before :add_user_to_group, :login
9
+ before :create_group, :login
10
+ before :delete_group, :login
11
+ before :remove_user_from_group, :login
12
+ before :remove_user_from_site, :login
13
+ before :update_user, :login
14
+ before :update_group, :login
15
+ end
16
+
17
+ def users_on_site(site_id)
18
+ url = build_url ['sites', site_id, 'users']
19
+ (get url).users.user.to_a.map { |user| User.new(user) }
20
+ end
21
+
22
+ def groups(site_id)
23
+ url = build_url ['sites', site_id, 'groups']
24
+ (get url).groups.group.to_a.map { |group| Group.new(group) }
25
+ end
26
+
27
+ def users_in_group(site_id, group_id)
28
+ url = build_url ['sites', site_id, 'groups', group_id, 'users']
29
+ (get url).users.user.to_a.map { |user| User.new(user) }
30
+ end
31
+
32
+ def add_user_to_site(site_id, user)
33
+ url = build_url ['sites', site_id, 'users']
34
+ User.new((post url, { :user => user }).user)
35
+ end
36
+
37
+ def add_user_to_group(site_id, group_id, user_id)
38
+ url = build_url ['sites', site_id, 'groups', group_id, 'users']
39
+ User.new((post url, { :user => { :id => user_id } }).user)
40
+ end
41
+
42
+ def create_group(site_id, group)
43
+ url = build_url ['sites', site_id, 'groups']
44
+ Group.new((post url, { :group => { :name => group } }).group)
45
+ end
46
+
47
+ def delete_group(site_id, group_id)
48
+ url = build_url ['sites', site_id, 'groups', group_id]
49
+ delete url
50
+ end
51
+
52
+ def remove_user_from_group(site_id, group_id, user_id)
53
+ url = build_url ['sites', site_id, 'groups', group_id, 'users', user_id]
54
+ delete url
55
+ end
56
+
57
+ def remove_user_from_site(site_id, user_id)
58
+ url = build_url ['sites', site_id, 'users', user_id]
59
+ delete url
60
+ end
61
+
62
+ def update_user(site_id, user)
63
+ url = build_url ['sites', site_id, 'users', user[:id]]
64
+ User.new((put url, { :user => user }).user)
65
+ end
66
+
67
+ def update_group(site_id, group)
68
+ url = build_url ['sites', site_id, 'groups', group[:id]]
69
+ Group.new((put url, { :group => group }).group)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,87 @@
1
+ module TableauRestApi
2
+ module WorkbookDatasource
3
+ aspector do
4
+ before :query_workbooks, :login
5
+ before :get_workbook, :login
6
+ before :datasources, :login
7
+ before :get_datasource, :login
8
+ before :update_workbook, :login
9
+ before :update_datasource, :login
10
+ before :update_project, :login
11
+ before :query_projects, :login
12
+ before :publish_workbook, :login
13
+ before :publish_datasource, :login
14
+ before :delete_workbook, :login
15
+ before :delete_datasource, :login
16
+ end
17
+
18
+ def query_workbooks(site_id)
19
+ url = build_url ['sites', site_id, 'workbooks']
20
+ (get url).workbooks.workbook.to_a.map { |workbook| Workbook.new(workbook) }
21
+ end
22
+
23
+ def datasources(site_id)
24
+ url = build_url ['sites', site_id, 'datasources']
25
+ (get url).datasources.datasource.to_a.map { |ds| Datasource.new(ds) }
26
+ end
27
+
28
+ def get_workbook(site_id, workbook_id)
29
+ url = build_url ['sites', site_id, 'workbooks', workbook_id, 'content']
30
+ RestClient.get url, header
31
+ end
32
+
33
+ def get_datasource(site_id, datasource_id)
34
+ url = build_url ['sites', site_id, 'datasources', datasource_id, 'content']
35
+ RestClient.get url, header
36
+ end
37
+
38
+ def update_workbook(site_id, workbook_id, workbook)
39
+ url = build_url ['sites', site_id, 'workbooks', workbook_id]
40
+ Workbook.new((put url, workbook).workbook)
41
+ end
42
+
43
+ def update_datasource(site_id, datasource_id, datasource)
44
+ url = build_url ['sites', site_id, 'datasources', datasource_id]
45
+ Datasource.new((put url, datasource).datasource)
46
+ end
47
+
48
+ def update_project(site_id, project_id, project)
49
+ url = build_url ['sites', site_id, 'projects', project_id]
50
+ Project.new((put url, project).project)
51
+ end
52
+
53
+ def query_projects(site_id)
54
+ url = build_url ['sites', site_id, 'projects']
55
+ (get url).projects.project.to_a.map { |project| Project.new(project) }
56
+ end
57
+
58
+ def delete_workbook(site_id, workbook_id)
59
+ url = build_url ['sites', site_id, 'workbooks', workbook_id]
60
+ delete url
61
+ end
62
+
63
+ def delete_datasource(site_id, datasource_id)
64
+ url = build_url ['sites', site_id, 'datasources', datasource_id]
65
+ delete url
66
+ end
67
+
68
+ def delete_project(site_id, project_id)
69
+ url = build_url ['sites', site_id, 'projects', project_id]
70
+ delete url
71
+ end
72
+
73
+ def publish_workbook(site_id, metadata, payload)
74
+ url = build_url ['sites', site_id, 'workbooks']
75
+ boundary = SecureRandom.uuid
76
+ request = Upload.new(metadata, payload, boundary).build
77
+ Workbook.new((post url, request, boundary).workbook)
78
+ end
79
+
80
+ def publish_datasource(site_id, metadata, payload)
81
+ url = build_url ['sites', site_id, 'datasources']
82
+ boundary = SecureRandom.uuid
83
+ request = Upload.new(metadata, payload, boundary).build(:datasource)
84
+ Datasource.new((post url, request, boundary).datasource)
85
+ end
86
+ end
87
+ end