buzzrb 0.4.1 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2028c5b5d0a40e237c0e329d459a14dcd51f32b238af6d3def30cd26f6b11f94
4
- data.tar.gz: 176213d9064087d7068d19842064536efcf88494d0fa041b961d4dd4cceddce9
3
+ metadata.gz: f2b0def7e301a26ceeaee2e000224b6c92962af3296e7ce18859ac69f32a314e
4
+ data.tar.gz: dfba2184f95d0395dc42b90b130162815d335d729fec0995d2e9cf018222fcd2
5
5
  SHA512:
6
- metadata.gz: 5ee311629160203785bd975a143dd7b4ce600b77946c70301ee4ddfbebee09fa39929dddb0f6c4d96ea7437ed9dd273f54c93b7a474bab5bc6d3336a9565df12
7
- data.tar.gz: 15531566ffea5bf3b43b8db8816e99736347a50956ed9e7f8af81d6d0595db0b3880e6aa0aa232a01bd2c6a50bc06b47c3d46fc087d40bc6f357a43f91c89c49
6
+ metadata.gz: cee5da98edc7e203d740f76945c5ce469af645f55f04e5c2795f82fda80d883bada6a8cbbd6ce14cc99299bcf9b340e93f148586cd686d16920e76cc4d68bc58
7
+ data.tar.gz: 77438264221d2d174ee6dcaad5f7a9ccdf8e0d4cb166079362d0bd2a3fd35a67a12277c290a5e008bc2cd3066b917f702c82b3ecdf9299fe4c228efa07c290c4
data/lib/buzz/error.rb CHANGED
@@ -31,4 +31,7 @@ module Buzz
31
31
 
32
32
  class ServerError < Error
33
33
  end
34
+
35
+ class QueryTimeoutError < Error
36
+ end
34
37
  end
@@ -2,6 +2,9 @@
2
2
 
3
3
  module Buzz
4
4
  module Resources
5
+ # Beeswax Report Builder 2.0. Queries are async: POST run-query returns a
6
+ # task_id, then GET async-results until 200 (204 means still running).
7
+ # https://api-docs.freewheel.tv/advertiser/v2.0/docs/reporting
5
8
  class Reporting
6
9
  attr_reader :client
7
10
 
@@ -9,28 +12,64 @@ module Buzz
9
12
  @client = client
10
13
  end
11
14
 
12
- # Query performance data (spend, impressions, clicks, etc.)
13
- def query(dimensions: [], metrics: [], **params)
14
- body = {dimensions: dimensions, metrics: metrics}.merge(params)
15
- response = client.post("/rest/v2/report-data", body)
16
- response.data["results"]
15
+ def run_query(view:, fields:, filters: {}, result_format: "json", query_timezone: nil, **params)
16
+ body = {view: view, fields: Array(fields)}
17
+ body[:filters] = filters if filters && !filters.empty?
18
+ body[:result_format] = result_format if result_format
19
+ body[:query_timezone] = query_timezone if query_timezone
20
+ body.merge!(params)
21
+
22
+ response = client.post("/rest/v2/reporting/run-query", body)
23
+ task_id = response.data.is_a?(Hash) ? response.data["task_id"] : nil
24
+ raise Error.new("run-query did not return a task_id", status: response.status, body: response.data) if task_id.nil? || task_id.to_s.empty?
25
+
26
+ task_id
27
+ end
28
+
29
+ def async_results(task_id)
30
+ client.get("/rest/v2/reporting/async-results/#{task_id}")
17
31
  end
18
32
 
19
- # CRUD on saved report definitions
20
- def list(params = {})
21
- Paginator.new(client, "/rest/v2/reports", params)
33
+ def query(view:, fields:, filters: {}, result_format: "json", query_timezone: nil, timeout: 300, interval: 1, **params)
34
+ task_id = run_query(view: view, fields: fields, filters: filters, result_format: result_format, query_timezone: query_timezone, **params)
35
+ wait_for_results(task_id, timeout: timeout, interval: interval)
22
36
  end
23
37
 
24
- def find(id)
25
- client.get("/rest/v2/reports/#{id}").data
38
+ def reports
39
+ client.get("/rest/v2/reporting/reports").data
26
40
  end
27
41
 
28
- def create(attributes = {})
29
- client.post("/rest/v2/reports", attributes).data
42
+ def report(name)
43
+ client.get("/rest/v2/reporting/reports/#{name}").data
30
44
  end
31
45
 
32
- def delete(id)
33
- client.delete("/rest/v2/reports/#{id}").data
46
+ private
47
+
48
+ def wait_for_results(task_id, timeout:, interval:)
49
+ started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
50
+
51
+ loop do
52
+ response = async_results(task_id)
53
+ return extract_rows(response.data) if response.status == 200
54
+
55
+ elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
56
+ if elapsed >= timeout
57
+ raise QueryTimeoutError.new(
58
+ "Reporting query #{task_id} did not complete within #{timeout}s",
59
+ status: response.status,
60
+ body: response.data
61
+ )
62
+ end
63
+
64
+ sleep interval
65
+ end
66
+ end
67
+
68
+ def extract_rows(data)
69
+ return data if data.is_a?(Array)
70
+ return data["results"] if data.is_a?(Hash) && data.key?("results")
71
+
72
+ data
34
73
  end
35
74
  end
36
75
  end
data/lib/buzz/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Buzz
4
- VERSION = "0.4.1"
4
+ VERSION = "0.5.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: buzzrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - swlkr
@@ -96,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  requirements: []
99
- rubygems_version: 3.7.2
99
+ rubygems_version: 3.6.9
100
100
  specification_version: 4
101
101
  summary: Ruby client for the Buzz/Freewheel Advertiser API v2.0
102
102
  test_files: []