power-bi 2.0.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c07790a47531d65bb2852b54424770b8ada89c21990e1834a4a6df0a5145abf
4
- data.tar.gz: eab66b74310e06fb6e4e46a33d785013323991ff26e03690d79f58bc517ccf96
3
+ metadata.gz: e5aaadec6cec57b22f4780dd2e1f4c64c55872d49f5a17a59326fcff099844dd
4
+ data.tar.gz: 1a6bf8c48a1d17333f58519c5ee23ee9a85025c63110c6cc2f2fe9243566f7ca
5
5
  SHA512:
6
- metadata.gz: 0e2f5fc2425a071970fe1f8f0738b4eb94ebd0b63b9f01b2fa5dd610be967b6a7a398d648611bef4f6f56a373c3af1cf6f9d53c2301de397a2ec3d3d535992d0
7
- data.tar.gz: 82a07144dc3de0b18e48fb603dd6528dddc3d4fd003d86d973f71662435d37ef4e986b73d8857391937211500d52d064728a295378187819726576217a430594
6
+ metadata.gz: 570af0ad49001778d237e4ce712a8120d879cc83d53a9b4a877d2d51ee6fcc3dde4e913cc8a3c42273ce5de45d31d7922308fee03c895fb6fcbce46332b06288
7
+ data.tar.gz: 760813b41e3318fc52871f3adc61f4efcf518f9333f93fcf9295c15b9e61d094518cbd3adbbf7fec0c3c7921239d2082460099fc2adffcd4b60c15067e5946e1
data/README.md CHANGED
@@ -12,9 +12,9 @@ pbi = PowerBI::Tenant.new(->{token = get_token(client, token) ; token.token})
12
12
 
13
13
  # Supported endpoints
14
14
 
15
- Note: where possible we use _lazy evaluation_: we only call the REST API endpoint when really needed. For examples `pbi.workspaces` won't trigger a call, while `pbi.workspaces.count` will trigger a call. And `pbi.workspace('123')`, while `pbi.workspace('123').name` will trigger a call.
15
+ Note: where possible we use _lazy evaluation_: we only call the REST API endpoint when really needed. For examples `pbi.workspaces` won't trigger a call, while `pbi.workspaces.count` will trigger a call. And `pbi.workspace('123')` won't trigger a call, while `pbi.workspace('123').name` will trigger a call.
16
16
 
17
- Note 2: to limit the number of API calls, it is best to directly use the _getters_ iso the index.
17
+ Note 2: to limit the number of API calls, it is best to directly use the _getters_ iso the _lists_.
18
18
 
19
19
  ## Workspaces (aka Groups)
20
20
 
@@ -24,6 +24,8 @@ Note 2: to limit the number of API calls, it is best to directly use the _getter
24
24
  * Upload PBIX to workspace: `ws.upload_pbix('./test.pbix', 'new_datasetname_in_the_service')`
25
25
  * Delete workspace: `workspace.delete`
26
26
  * Add a user to a wokspace: `workspace.add_user('company_0001@fabrikam.com')`
27
+ * Assign a workspace to a capacity: `workspace.assign_to_capacity(capacity)`
28
+ * Unassign a workspace from a capacity: `workspace.unassign_from_capacity`
27
29
 
28
30
  ## Reports
29
31
 
@@ -31,7 +33,8 @@ Note 2: to limit the number of API calls, it is best to directly use the _getter
31
33
  * Get report in a workspace: `workspace.report(id)`
32
34
  * Clone a report from one workspace to another: `report.clone(src_workspace, new_report_name)`
33
35
  * Rebind report to another dataset: `report.rebind(dataset)`
34
- * Export report to file: `report.export_to_file(filenam, format: 'PDF')`
36
+ * Export report to file: `report.export_to_file(filename, format: 'PDF')`
37
+ * Get embed token: `report.embed_token(access_level: 'View', lifetime_in_minutes: 60)`
35
38
 
36
39
  ## Pages
37
40
 
@@ -65,6 +68,13 @@ Note 2: to limit the number of API calls, it is best to directly use the _getter
65
68
  * Create a new gateway datasource: `gateway.gateway_datasource.create(name, credentials, db_server, db_name)`
66
69
  * Delete a new gateway datasource: `gateway_datasource.delete`
67
70
 
71
+ ## Capacities
72
+
73
+ Note: Capacities are Azure creatures, you can't create them in Power BI.
74
+
75
+ * List capacities: `pbi.capacities`
76
+ * Get a capacity: `pbi.capacity(id)`
77
+
68
78
  # Note about gateway credentials
69
79
 
70
80
  Power BI uses an obscure mechanism to encrypt credential exchange between the service and the gateway. The encryption must be done outside this module on a Windows machine based on th public key of the gateway. This is an example C# script:
@@ -0,0 +1,35 @@
1
+ module PowerBI
2
+ class Capacity < Object
3
+
4
+ def initialize(tenant, parent, id = nil)
5
+ super(tenant, id)
6
+ end
7
+
8
+ def get_data(id)
9
+ @tenant.get("/capacities", {'$filter': "id eq #{id}"})[:value].first
10
+ end
11
+
12
+ def data_to_attributes(data)
13
+ {
14
+ id: data[:id],
15
+ display_name: data[:displayName],
16
+ sku: data[:sku],
17
+ state: data[:state],
18
+ region: data[:region],
19
+ capacity_user_access_right: data[:capacityUserAccessRight],
20
+ admins: data[:admins],
21
+ }
22
+ end
23
+
24
+ end
25
+
26
+ class CapacityArray < Array
27
+ def self.get_class
28
+ Capacity
29
+ end
30
+
31
+ def get_data
32
+ @tenant.get("/capacities")[:value]
33
+ end
34
+ end
35
+ end
@@ -79,6 +79,19 @@ module PowerBI
79
79
  File.open(filename, "wb") { |f| f.write(data) }
80
80
  end
81
81
 
82
+ def embed_token(access_level: 'View', lifetime_in_minutes: 60)
83
+ data = @tenant.post("/groups/#{workspace.id}/reports/#{id}/GenerateToken") do |req|
84
+ req.body = {
85
+ accessLevel: access_level,
86
+ lifetimeInMinutes: lifetime_in_minutes
87
+ }.to_json
88
+ end
89
+ {
90
+ token: data[:token],
91
+ expiration: Time.parse(data[:expiration])
92
+ }
93
+ end
94
+
82
95
  end
83
96
 
84
97
  class ReportArray < Array
@@ -1,19 +1,20 @@
1
1
  module PowerBI
2
2
  class Tenant
3
- attr_reader :workspaces, :gateways
3
+ attr_reader :workspaces, :gateways, :capacities
4
4
 
5
5
  def initialize(token_generator, retries: 5, logger: nil)
6
6
  @token_generator = token_generator
7
7
  @workspaces = WorkspaceArray.new(self)
8
8
  @gateways = GatewayArray.new(self)
9
+ @capacities = CapacityArray.new(self)
9
10
  @logger = logger
10
11
 
11
12
  ## WHY RETRIES? ##
12
- # It is noticed that once in a while (~0.1% API calls), the Power BI server returns a 500 (internal server error) withou apparent reason, just retrying works :-)
13
+ # It is noticed that once in a while (~0.1% API calls), the Power BI server returns a 500 (internal server error) without apparent reason, just retrying works :-)
13
14
  ##################
14
15
  @retry_options = {
15
16
  max: retries,
16
- exceptions: [Errno::ETIMEDOUT, Timeout::Error, Faraday::TimeoutError, Faraday::RetriableResponse],
17
+ exceptions: [Errno::ETIMEDOUT, Timeout::Error, Faraday::TimeoutError, Faraday::RetriableResponse, Faraday::ConnectionFailed],
17
18
  methods: [:get, :post, :patch, :delete],
18
19
  retry_statuses: [500], # internal server error
19
20
  interval: 0.2,
@@ -37,6 +38,10 @@ module PowerBI
37
38
  Gateway.new(self, nil, id)
38
39
  end
39
40
 
41
+ def capacity(id)
42
+ Capacity.new(self, nil, id)
43
+ end
44
+
40
45
  def get(url, params = {})
41
46
  t0 = Time.now
42
47
  conn = Faraday.new do |f|
data/lib/power-bi/user.rb CHANGED
@@ -18,7 +18,7 @@ module PowerBI
18
18
  end
19
19
 
20
20
  def delete
21
- @tenant.delete("/groups/#{@workspace.id}/users/#{@email_address}")
21
+ @tenant.delete("/groups/#{@workspace.id}/users/#{email_address}")
22
22
  @workspace.users.reload
23
23
  end
24
24
 
@@ -3,6 +3,7 @@ module PowerBI
3
3
  attr_reader :reports, :datasets, :users
4
4
 
5
5
  class UploadError < PowerBI::Error ; end
6
+ class CapacityAssignmentError < PowerBI::Error ; end
6
7
 
7
8
  def initialize(tenant, parent, id = nil)
8
9
  super(tenant, id)
@@ -61,6 +62,41 @@ module PowerBI
61
62
  Dataset.new(@tenant, self, id)
62
63
  end
63
64
 
65
+ def assign_to_capacity(capacity, timeout: 30)
66
+ _assign_to_capacity(capacity.id, timeout: timeout)
67
+ end
68
+
69
+ def unassign_from_capacity(timeout: 30)
70
+ _assign_to_capacity('00000000-0000-0000-0000-000000000000', timeout: timeout)
71
+ end
72
+
73
+ private
74
+
75
+ def _assign_to_capacity(capacity_id, timeout: 30)
76
+ @tenant.post("/groups/#{@id}/AssignToCapacity") do |req|
77
+ req.body = {
78
+ capacityId: capacity_id,
79
+ }.to_json
80
+ end
81
+
82
+ success = false
83
+ iterations = 0
84
+ status_history = ''
85
+ old_status = ''
86
+ while !success
87
+ sleep 0.5
88
+ iterations += 1
89
+ raise CapacityAssignmentError.new("(Un)assignment did not succeed after #{timeout} seconds. Status history:#{status_history}") if iterations > (2 * timeout)
90
+ new_status = @tenant.get("/groups/#{@id}/CapacityAssignmentStatus")[:status].to_s
91
+ success = (new_status == "CompletedSuccessfully")
92
+ if new_status != old_status
93
+ status_history += "\nStatus change after #{iterations/2}s: '#{old_status}' --> '#{new_status}'"
94
+ old_status = new_status
95
+ end
96
+ end
97
+ self.reload
98
+ end
99
+
64
100
  end
65
101
 
66
102
  class WorkspaceArray < Array
data/lib/power-bi.rb CHANGED
@@ -23,4 +23,5 @@ require_relative "power-bi/refresh"
23
23
  require_relative "power-bi/gateway"
24
24
  require_relative "power-bi/gateway_datasource"
25
25
  require_relative "power-bi/page"
26
- require_relative "power-bi/user"
26
+ require_relative "power-bi/user"
27
+ require_relative "power-bi/capacity"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: power-bi
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lode Cools
@@ -90,6 +90,7 @@ files:
90
90
  - README.md
91
91
  - lib/power-bi.rb
92
92
  - lib/power-bi/array.rb
93
+ - lib/power-bi/capacity.rb
93
94
  - lib/power-bi/dataset.rb
94
95
  - lib/power-bi/datasource.rb
95
96
  - lib/power-bi/gateway.rb
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
122
  - !ruby/object:Gem::Version
122
123
  version: '0'
123
124
  requirements: []
124
- rubygems_version: 3.1.6
125
+ rubygems_version: 3.4.6
125
126
  signing_key:
126
127
  specification_version: 4
127
128
  summary: Ruby wrapper for the Power BI API