analytics-psw 0.1.4 → 0.3.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 +4 -4
- data/README.md +102 -59
- data/lib/analytics-psw/customers.rb +11 -0
- data/lib/analytics-psw/dimension_properties.rb +46 -0
- data/lib/analytics-psw/dimensions.rb +26 -0
- data/lib/analytics-psw/event_types.rb +21 -0
- data/lib/analytics-psw/events.rb +47 -0
- data/lib/analytics-psw/reports.rb +74 -0
- data/lib/analytics-psw/services.rb +29 -0
- data/lib/analytics-psw.rb +192 -125
- data/lib/analytics_report.rb +10 -0
- data/lib/analytics_report_field.rb +25 -0
- metadata +70 -24
- data/lib/analytics_dimension_properties.rb +0 -87
- data/lib/analytics_dimensions.rb +0 -24
- data/lib/analytics_event_types.rb +0 -19
- data/lib/analytics_reports.rb +0 -35
- data/lib/analytics_services.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c76464b815727cb3400f6bfbd23b2428617d8227
|
4
|
+
data.tar.gz: 0f8917692695f60b4f3fd9ffd6da207e30397b37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19412719111259a947b68218d18292b87105f57cb6b2d3118e5933ccccefd0d97cb53eef6ea22f932e8c904a594b48a61d566f9be883de4dc0a28a1ba9fd4f4b
|
7
|
+
data.tar.gz: f59deb6b35004a6131bbeb0eef37fc69ec6deaa0a9feec450a43005ce88be2a6af224fde60775d6feff87634d2989a2ef87a41822f90f1bff5c10195fc261fcc
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Analytics::Psw
|
2
2
|
|
3
|
-
Analytics-psw is a wrapper providing access to the Perceptive Cloud Platform Analytics service
|
3
|
+
Analytics-psw is a wrapper providing access to the Perceptive Cloud Platform Analytics service.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -26,11 +26,11 @@ require 'yaml' #optional, for importing information used to connect to the Analy
|
|
26
26
|
|
27
27
|
``` ruby
|
28
28
|
opts = {}
|
29
|
-
opts['server_url'] = "http://my.server.url" #required
|
30
|
-
opts['service'] = "MyServiceName" #required
|
31
|
-
opts['proxy'] = "http://proxy.server.address" #optional
|
32
|
-
opts['event_types'] = ["event_one", "event_two", "event_three"] #optional
|
33
|
-
opts['dimensions'] = [{"dimension_name" => "string"}, {"dimension_2" => "integer"}] #optional
|
29
|
+
opts['server_url'] = "http://my.server.url" #required No trailing slash needed
|
30
|
+
opts['service'] = "MyServiceName" #required Calling AnalyticsPSW.new searches for your service, or if it isn't found, creates it.
|
31
|
+
opts['proxy'] = "http://proxy.server.address" #optional Not required if you don't use a proxy server or if you set the http_proxy environment variable
|
32
|
+
opts['event_types'] = ["event_one", "event_two", "event_three"] #optional Creates event types to associate with your service if they don't already exist
|
33
|
+
opts['dimensions'] = [{"dimension_name" => "string"}, {"dimension_2" => "integer"}] #optional Creates dimensions to describe your events if they don't already exist
|
34
34
|
|
35
35
|
ap = AnalyticsPSW.new(opts)
|
36
36
|
```
|
@@ -41,7 +41,8 @@ ap = AnalyticsPSW.new(YAML.load_file(analytics_settings.yml))
|
|
41
41
|
```
|
42
42
|
|
43
43
|
### Sample YAML file
|
44
|
-
|
44
|
+
|
45
|
+
``` ruby
|
45
46
|
---
|
46
47
|
server_url: http://127.0.0.1:3000
|
47
48
|
service: my_service
|
@@ -57,61 +58,103 @@ dimensions:
|
|
57
58
|
## Available Methods
|
58
59
|
|
59
60
|
``` ruby
|
60
|
-
ap.record_event(event_type, metadata = {}) #
|
61
|
-
|
62
|
-
ap.query_analytics(query_parameters) #
|
63
|
-
ap.create_report(name, query_parameters) #
|
64
|
-
ap.list_reports #
|
65
|
-
ap.
|
66
|
-
ap.run_report(
|
67
|
-
ap.delete_report(
|
68
|
-
|
69
|
-
ap.
|
70
|
-
|
71
|
-
ap.
|
72
|
-
ap.
|
73
|
-
ap.
|
74
|
-
|
75
|
-
ap.
|
76
|
-
|
77
|
-
ap.
|
78
|
-
|
79
|
-
ap.
|
80
|
-
|
81
|
-
ap.
|
82
|
-
ap.
|
83
|
-
|
84
|
-
ap.
|
85
|
-
|
86
|
-
ap.
|
87
|
-
ap.
|
88
|
-
ap.
|
61
|
+
ap.record_event(event_type, metadata = {}, token=nil) # Send an event to the Analytics service. The event_type must already exist in the Analytics system. 'event_type' can either be a string or symbol
|
62
|
+
|
63
|
+
ap.query_analytics(query_parameters, token=nil) # Send a hashmap query to the Analytics service and return an AnalyticsReport object. Required keys for query_parameters include one or more of :sum, :avg, :stddev, :fields. Optional keys are :customer, :where, :group_by, :order_by, :iterate_by, :limit. Use comma-separated strings for multiple values. The keys :sum, :avg, and :stddev return aggregates that prepend and append the key name with two underscores. For example, the sum aggregate would return as "__SUM__<field_name>".
|
64
|
+
ap.create_report(name, query_parameters, token=nil) # Create a report query to run later. Required keys for query_parameters include one or more of :sum, :avg, :stddev, :fields. Optional keys are :customer, :where, :group_by, :order_by, :iterate_by, :limit. Use comma-separated strings for multiple values.
|
65
|
+
ap.list_reports(token=nil) # List all reports for a service
|
66
|
+
ap.report_criteria(report_name, token=nil) # List the properties for a report. 'report_name' can either be a string or symbol
|
67
|
+
ap.run_report(report_name, where_criteria, token=nil) # Run a stored report and return an AnalyticsReport object. The 'where_criteria' are options 'where' parameters to replace in the stored report when running. 'report_name' can either be a string or symbol
|
68
|
+
ap.delete_report(report_name, token=nil) # Delete a stored report. 'report_name' can either be a string or symbol
|
69
|
+
|
70
|
+
ap.multi_query_analytics(query_parameters_array, token=nil) # Run multiple simultaneous queries. Send an array of hashmaps of query parameters to return an array of AnalyticsReport objects.
|
71
|
+
|
72
|
+
ap.create_service(name, token=nil) # Create a new service. 'name' can either be a string or symbol
|
73
|
+
ap.list_service(token=nil) # List all available services
|
74
|
+
ap.show_service_resource(service_name, token=nil) # List available resources for a service. 'service_name' can either be a string or symbol
|
75
|
+
ap.show_service_metadata(service_name, token=nil) # List the metadata for a service. 'service_name' can either be a string or symbol
|
76
|
+
ap.delete_service(service_name, token=nil) # Delete a service. 'service_name' can either be a string or symbol
|
77
|
+
|
78
|
+
ap.create_event_type(name, description = "", token=nil) # Create an event type for a service. 'name' can either be a string or symbol
|
79
|
+
ap.list_event_types(token=nil) # List all event types for a service
|
80
|
+
ap.show_event_type(event_type_name, token=nil) # List the metadata for an event type. 'event_type_name' can either be a string or symbol
|
81
|
+
|
82
|
+
ap.create_dimension(name, data_type, units = "", description = "", token=nil) # Create a new dimension. Only name and data_type are required. 'name' can either be a string or symbol
|
83
|
+
ap.list_dimensions(token=nil) # List all dimensions for a service
|
84
|
+
ap.show_dimension_resources(dimension_name, token=nil) # List available resources for a dimension. 'dimension_name' can either be a string or symbol
|
85
|
+
ap.show_dimension_metadata(dimension_name, token=nil) # List metadata for a dimension. 'dimension_name' can either be a string or symbol
|
86
|
+
|
87
|
+
ap.create_dimension_properties(dimension_name, dimension_value, property_hash, token=nil) # Add properties to a dimension value. This returns a 409 message if properties already exist. Use this method to add mutable string data to dimensions. For example, add a title to a video by adding a title property to the video's guid.
|
88
|
+
ap.update_dimension_properties(dimension_name, dimension_value, property_hash, token=nil) # Update properties created for a dimension value. The hash replaces all properties currently set.
|
89
|
+
ap.create_or_update_dimension_properties(dimension_name, dimension_value, property_hash, token=nil) # Add properties to a dimension value if they already exist. Updates the properties otherwise. Use this method to add mutable string data to dimensions. For example, add a title to a video by adding a title property to the video's guid.
|
90
|
+
ap.show_dimension_properties(dimension_name, dimension_value, token=nil) # List the properties currently set for a dimension value. The body will be JSON.
|
91
|
+
ap.list_dimension_properties(dimension_name, token=nil) # List all properties for a dimension. This returns a JSON object with an array of JSON/location pairs.
|
92
|
+
```
|
93
|
+
### AnalyticReport object
|
94
|
+
|
95
|
+
AnalyticsReport:
|
96
|
+
``` ruby
|
97
|
+
:status # Return code from the REST call.
|
98
|
+
:rows # An array of hashes containing AnalyticsReportField objects. Each hash is a "row".
|
99
|
+
:error_message # Error returns from persistence layer if query/report was unsuccessful.
|
100
|
+
```
|
101
|
+
|
102
|
+
AnalyticsReportField:
|
103
|
+
``` ruby
|
104
|
+
:name # Name of the field returned
|
105
|
+
:is_aggregate # Boolean used to determine if the :value is an aggregate
|
106
|
+
:value # Value of the field returned. If it's an aggregate, the :value is a hash. Example: { 'sum' => 20, 'avg' => 4, 'stddev' => 1.32 }
|
107
|
+
sum() # Method to return the 'sum' value of the field. If none exists, the method returns zero.
|
108
|
+
avg() # Method to return the 'avg' value of the field. If none exists, the method returns zero.
|
109
|
+
stddev() # Method to return the 'stddev' value of the field. If none exists, the method returns zero.
|
110
|
+
```
|
111
|
+
|
112
|
+
#### Example Code:
|
113
|
+
|
114
|
+
``` ruby
|
115
|
+
report = ap.query_analytics(query_parameters)
|
116
|
+
|
117
|
+
field_value = report.rows[0][:field].value
|
118
|
+
|
119
|
+
report.rows.each do |row|
|
120
|
+
row.each do |field_name, field_object|
|
121
|
+
if field_object.is_aggregate
|
122
|
+
value = field_object.sum
|
123
|
+
else
|
124
|
+
value = field_object.value
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
89
128
|
```
|
90
129
|
|
91
130
|
## Query Parameters
|
92
131
|
|
93
|
-
| Parameter | Values
|
94
|
-
| -------------------|
|
95
|
-
| ` sum ` |` any event or number dimension `
|
96
|
-
| ` avg ` | ` any event or number dimension `
|
97
|
-
| `
|
98
|
-
| `
|
99
|
-
| `
|
100
|
-
| `
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| `
|
104
|
-
|
|
105
|
-
| `
|
106
|
-
|
|
107
|
-
| `
|
108
|
-
|
|
109
|
-
|
|
110
|
-
| `
|
111
|
-
| `
|
112
|
-
|
|
113
|
-
|
114
|
-
|
132
|
+
| Parameter | Values | Examples |
|
133
|
+
| -------------------| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
134
|
+
| ` sum ` |` any event or number dimension ` | ` { "sum" => "plays" } or { "sum" => "plays,process_time" } ` |
|
135
|
+
| ` avg ` | ` any event or number dimension ` | ` { "avg" => "plays" } or { "avg" => "plays,process_time" } ` |
|
136
|
+
| ` stddev ` | ` any event or number dimension ` | ` { "stddev" => "plays" } or { "stddev" => "plays,process_time" } ` |
|
137
|
+
| ` fields ` | ` any mapped dimension ` | ` { "fields" => "user_name } or { "fields" => "user_name,location" } ` |
|
138
|
+
| ` customer ` | ` any customer(s) associated with a service ` | ` { "customer" => "lexmark" } or { "customer" => "lexmark,perceptive" ` |
|
139
|
+
| ` where ` | ` <dimension> <operator> <value> ` | ` { "where" => [ "begin_date gt 2013-12-10", "end_date lt 2013-12-20", "user_name eq bob", "location is null" ] }` |
|
140
|
+
| ` <dimension> ` | ` any mapped dimension ` | |
|
141
|
+
| ` <operator> ` | ` any valid operator ` | |
|
142
|
+
| ` lt ` | ` less than operator ` | ` { "where" => [ "end_date lt 2013-12-10" ] }` |
|
143
|
+
| ` gt ` | ` greater than operator ` | ` { "where" => [ "begin_date gt 2013-12-10" ] }` |
|
144
|
+
| ` eq ` | ` equal to operator ` | ` { "where" => [ "user_name eq bob" ] }` |
|
145
|
+
| ` lte ` | ` less than equal to operator ` | ` { "where" => [ "begin_date gte 2013-12-10" ] }` |
|
146
|
+
| ` gte` | ` greater than equal to operator ` | ` { "where" => [ "end_date lte 2013-12-10" ] }` |
|
147
|
+
| ` in ` | ` in operator for multiple values ` | ` { "where" => [ "user_name in bob,ted,allen" ] }` |
|
148
|
+
| ` is ` | ` is operator for Boolean and null value ` | ` { "where" => [ "awesome is true" ] }` |
|
149
|
+
| ` empty ` | ` no data has been written ` | ` { "where" => [ "username is empty" ] } ` |
|
150
|
+
| ` defined ` | ` data written but could be nil` | ` { "where" => [ "username is defined" ] } ` |
|
151
|
+
| ` is_not ` | ` is not operator for Boolean and null value ` | ` { "where" => [ "awesome is_not null" ] }` |
|
152
|
+
| ` group_by ` | ` any mapped dimension(s) ` | ` { "group_by" => "user_name" } or { "group_by" => "user_name,location" } ` |
|
153
|
+
| ` order_by ` | ` <dimension> <ascending or descending> ` | ` { "order_by" => "user_name ascending" } or { "order_by" => "user_name descending" } ` |
|
154
|
+
| ` iterate_by ` | ` YEAR, MONTH, DAY, or HOUR ` | ` { "iterate_by" => "MONTH" } or { "iterate_by" => "HOUR" } ` |
|
155
|
+
| ` limit ` | ` any integer value ` | ` { "limit" => 10 } ` |
|
156
|
+
|
157
|
+
**Required** `sum`, `avg`, `stddev`, and/or `fields`
|
115
158
|
|
116
159
|
**Optional** `customer`, `where`, `group_by`, `order_by`, and `iterate_by`
|
117
160
|
|
@@ -130,4 +173,4 @@ Note: `iterate_by` always uses the global `event_time` dimension.
|
|
130
173
|
|
131
174
|
## License
|
132
175
|
|
133
|
-
2013 Lexmark International Technology S.A. All rights reserved.
|
176
|
+
2013 Lexmark International Technology S.A. All rights reserved.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module AnalyticsPSW
|
2
|
+
module DimensionProperties
|
3
|
+
|
4
|
+
def list_dimension_properties(dimension_name, token=nil)
|
5
|
+
resp = get_json("#{@service_location}/dimensions/#{dimension_name.to_s}/properties", token)
|
6
|
+
parse_json_response(resp)
|
7
|
+
end
|
8
|
+
|
9
|
+
def show_dimension_properties(dimension_name, dimension_value, token=nil)
|
10
|
+
resp = get_json("#{@service_location}/dimensions/#{dimension_name.to_s}/properties/#{dimension_value.to_s}", token)
|
11
|
+
parse_json_response(resp)
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_dimension_properties(dimension_name, dimension_value, properties = {}, token=nil)
|
15
|
+
metadata = create_dimension_properties_metadata(dimension_value, properties)
|
16
|
+
response = post_json("#{@service_location}/dimensions/#{dimension_name.to_s}/properties/#{dimension_value.to_s}", "dimension_property", metadata, token)
|
17
|
+
parse_json_response(response)
|
18
|
+
end
|
19
|
+
|
20
|
+
def update_dimension_properties(dimension_name, dimension_value, properties = {}, token=nil)
|
21
|
+
metadata = create_dimension_properties_metadata(dimension_value, properties)
|
22
|
+
response = put_json("#{@service_location}/dimensions/#{dimension_name.to_s}/properties/#{dimension_value.to_s}", "dimension_property", metadata, token)
|
23
|
+
parse_json_response(response)
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_or_update_dimension_properties(dimension_name, dimension_value, properties = {}, token=nil)
|
27
|
+
dimension_property_exists?(dimension_name, dimension_value, token) ? update_dimension_properties(dimension_name, dimension_value, properties, token) : create_dimension_properties(dimension_name, dimension_value, properties, token)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def create_dimension_properties_metadata(dimension_value, properties)
|
33
|
+
dimension_properties_body = {'value' => dimension_value, 'properties' => {}}
|
34
|
+
properties.each do |key, value|
|
35
|
+
dimension_properties_body['properties'][key] = value unless value == ""
|
36
|
+
end
|
37
|
+
dimension_properties_body
|
38
|
+
end
|
39
|
+
|
40
|
+
def dimension_property_exists? (dimension_name, dimension_value, token=nil)
|
41
|
+
dim_properties = list_dimension_properties(dimension_name,token)['body']
|
42
|
+
dim_properties[dimension_name].present? && dim_properties[dimension_name] == dimension_value
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module AnalyticsPSW
|
2
|
+
module Dimensions
|
3
|
+
|
4
|
+
def create_dimension(name, data_type, units = "", description = "", token=nil)
|
5
|
+
metadata = create_metadata({:name => name.to_s, :description => description, :data_type => data_type, :units => units})
|
6
|
+
resp = post_json("#{@service_location}/dimensions", "dimension", metadata, token)
|
7
|
+
parse_json_response(resp)
|
8
|
+
end
|
9
|
+
|
10
|
+
def list_dimensions(token=nil)
|
11
|
+
resp = get_json("#{@service_location}/dimensions", token)
|
12
|
+
parse_json_response(resp)
|
13
|
+
end
|
14
|
+
|
15
|
+
def show_dimension_resources(dimension_name, token=nil)
|
16
|
+
resp = get_json("#{@service_location}/dimensions/#{dimension_name.to_s}", token)
|
17
|
+
parse_json_response(resp)
|
18
|
+
end
|
19
|
+
|
20
|
+
def show_dimension_metadata(dimension_name, token=nil)
|
21
|
+
resp = get_json("#{@service_location}/dimensions/#{dimension_name.to_s}/metadata", token)
|
22
|
+
parse_json_response(resp)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module AnalyticsPSW
|
2
|
+
module EventTypes
|
3
|
+
|
4
|
+
def create_event_type(name, description = "", token=nil)
|
5
|
+
metadata = create_metadata({:name => name.to_s, :description => description})
|
6
|
+
resp = post_json("#{@service_location}/event_types", "event_type", metadata, token)
|
7
|
+
parse_json_response(resp)
|
8
|
+
end
|
9
|
+
|
10
|
+
def list_event_types(token=nil)
|
11
|
+
resp = get_json("#{@service_location}/event_types", token)
|
12
|
+
parse_json_response(resp)
|
13
|
+
end
|
14
|
+
|
15
|
+
def show_event_type(event_name, token=nil)
|
16
|
+
resp = get_json("#{@service_location}/event_types/#{event_name.to_s}", token)
|
17
|
+
parse_json_response(resp)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module AnalyticsPSW
|
2
|
+
module Events
|
3
|
+
|
4
|
+
def record_event(event_type, metadata = {}, token=nil)
|
5
|
+
|
6
|
+
if valid_metadata_for_record_event?(event_type, metadata, token)
|
7
|
+
metadata[:event_type] = event_type.to_s
|
8
|
+
parse_json_response(post_json("#{@service_location}/events", "event", metadata, token))
|
9
|
+
else
|
10
|
+
invalid_metadata_response
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def valid_metadata_for_record_event?(event_type, metadata, token)
|
17
|
+
|
18
|
+
event_type_exists?(event_type, token) && dimensions_exist?(metadata, token)
|
19
|
+
end
|
20
|
+
|
21
|
+
def event_type_exists?(current_event_type, token)
|
22
|
+
get_list_of_event_types(token).map {|d| d['name']}.include?(current_event_type)
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_list_of_event_types(token)
|
26
|
+
event_types_response = list_event_types(token)
|
27
|
+
event_types_body = event_types_response['body']
|
28
|
+
event_types_body['event_types']
|
29
|
+
end
|
30
|
+
|
31
|
+
def dimensions_exist?(metadata, token=nil)
|
32
|
+
get_list_of_dimensions(token).map {|d| d['name'] }.to_set.subset?(metadata.keys.to_set)
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_list_of_dimensions(token=nil)
|
36
|
+
dimensions_response = list_dimensions(token)
|
37
|
+
dimensions_body = dimensions_response['body']
|
38
|
+
dimensions_body['dimensions']
|
39
|
+
end
|
40
|
+
|
41
|
+
def invalid_metadata_response
|
42
|
+
{'status' => 422, 'body' => {}, 'error_message' => 'Invalid event type and/or dimensions for service.'}
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'analytics_report'
|
2
|
+
require 'analytics_report_field'
|
3
|
+
|
4
|
+
module AnalyticsPSW
|
5
|
+
module Reports
|
6
|
+
|
7
|
+
def query_analytics(query_parameters, token=nil)
|
8
|
+
raw_report = get_json("#{@service_location}/reports/query.json", token, query_parameters)
|
9
|
+
parsed_report = parse_json_response(raw_report)
|
10
|
+
|
11
|
+
create_analytics_report(parsed_report)
|
12
|
+
end
|
13
|
+
|
14
|
+
def multi_query_analytics(query_parameters, token=nil)
|
15
|
+
raw_reports = multi_get_json("#{@service_location}/reports/query.json", query_parameters, token)
|
16
|
+
|
17
|
+
raw_reports.map do |raw_report|
|
18
|
+
create_analytics_report(raw_report)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_report(name, query_parameters, token=nil)
|
24
|
+
query_parameters[:name] = name.to_s
|
25
|
+
resp = post_json("#{@service_location}/reports", "report", query_parameters, token )
|
26
|
+
parse_json_response(resp)
|
27
|
+
end
|
28
|
+
|
29
|
+
def list_reports(token=nil)
|
30
|
+
resp = get_json("#{@service_location}/reports", token)
|
31
|
+
parse_json_response(resp)
|
32
|
+
end
|
33
|
+
|
34
|
+
def report_criteria(report_name, token=nil)
|
35
|
+
resp = get_json("#{@service_location}/reports/#{report_name.to_s}/criteria", token)
|
36
|
+
parse_json_response(resp)
|
37
|
+
end
|
38
|
+
|
39
|
+
def run_report(report_name, where_criteria = {}, token=nil)
|
40
|
+
raw_report = get_json("#{@service_location}/reports/#{report_name.to_s}/results", token, where_criteria)
|
41
|
+
parsed_report = parse_json_response(raw_report)
|
42
|
+
|
43
|
+
create_analytics_report(parsed_report)
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_report(report_name, token=nil)
|
47
|
+
resp = delete_resource("#{@service_location}/reports/#{report_name.to_s}", token)
|
48
|
+
parse_json_response(resp)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def create_analytics_report(raw_report)
|
54
|
+
analytics_params = {status: raw_report['status']}
|
55
|
+
if analytics_params[:status] == 200
|
56
|
+
analytics_params[:rows] = convert_body_to_rows(raw_report['body'])
|
57
|
+
else
|
58
|
+
analytics_params[:rows] = [{}]
|
59
|
+
analytics_params[:error_message] = raw_report['error_message']
|
60
|
+
end
|
61
|
+
AnalyticsReport.new(analytics_params)
|
62
|
+
end
|
63
|
+
|
64
|
+
def convert_body_to_rows(body)
|
65
|
+
body.map {|row|
|
66
|
+
fields = Hash[row.map {|field, value|
|
67
|
+
field_params = {name: field, value: value, is_aggregate: value.class == Hash}
|
68
|
+
[field.to_sym, AnalyticsReportField.new(field_params)]
|
69
|
+
}]
|
70
|
+
fields
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AnalyticsPSW
|
2
|
+
module Services
|
3
|
+
|
4
|
+
def create_service(name, token=nil)
|
5
|
+
create_service_private(name.to_s, token)
|
6
|
+
end
|
7
|
+
|
8
|
+
def list_services(token=nil)
|
9
|
+
resp = get_json("/services", token)
|
10
|
+
parse_json_response(resp)
|
11
|
+
end
|
12
|
+
|
13
|
+
def show_service_resources(service_name, token=nil)
|
14
|
+
resp = get_json("/services/#{service_name.to_s}", token)
|
15
|
+
parse_json_response(resp)
|
16
|
+
end
|
17
|
+
|
18
|
+
def show_service_metadata(service_name, token=nil)
|
19
|
+
resp = get_json("/services/#{service_name.to_s}/metadata", token)
|
20
|
+
parse_json_response(resp)
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete_service(service_name, token=nil)
|
24
|
+
resp = delete_resource("/services/#{service_name.to_s}", token)
|
25
|
+
parse_json_response(resp)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/analytics-psw.rb
CHANGED
@@ -1,157 +1,224 @@
|
|
1
1
|
require "faraday"
|
2
2
|
require "json"
|
3
|
-
require
|
4
|
-
require
|
5
|
-
|
6
|
-
require "
|
7
|
-
require "
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
3
|
+
require 'eventmachine'
|
4
|
+
require 'em-http'
|
5
|
+
|
6
|
+
require "analytics-psw/reports"
|
7
|
+
require "analytics-psw/services"
|
8
|
+
require "analytics-psw/event_types"
|
9
|
+
require "analytics-psw/events"
|
10
|
+
require "analytics-psw/dimension_properties"
|
11
|
+
require "analytics-psw/dimensions"
|
12
|
+
require "analytics-psw/customers"
|
13
|
+
|
14
|
+
module AnalyticsPSW
|
15
|
+
class Analytics
|
16
|
+
|
17
|
+
API_URL = "/services"
|
18
|
+
JSON_CONTENT_TYPE = "application/json"
|
19
|
+
SUM_CRITERIA_PARAM = "sum"
|
20
|
+
AVG_CRITERIA_PARAM = "avg"
|
21
|
+
|
22
|
+
PARSED_RESPONSE = {
|
23
|
+
body: 'body',
|
24
|
+
location: 'location',
|
25
|
+
status: 'status',
|
26
|
+
error_message: 'error_message'
|
27
|
+
}
|
28
|
+
|
29
|
+
include AnalyticsPSW::Customers,
|
30
|
+
AnalyticsPSW::Reports,
|
31
|
+
AnalyticsPSW::Services,
|
32
|
+
AnalyticsPSW::EventTypes,
|
33
|
+
AnalyticsPSW::Events,
|
34
|
+
AnalyticsPSW::Dimensions,
|
35
|
+
AnalyticsPSW::DimensionProperties
|
36
|
+
|
37
|
+
attr_accessor :service_location
|
38
|
+
attr_reader :conn
|
39
|
+
|
40
|
+
def initialize(opts = {})
|
41
|
+
set_vars_from_opts(opts)
|
42
|
+
@conn = faraday_connection
|
43
|
+
@token = get_token unless @client_id.nil?
|
44
|
+
@service_location = "#{@server_url}#{API_URL}/#{@service_name}"
|
45
|
+
find_or_create_event_types(@event_types) if @event_types
|
46
|
+
find_or_create_dimensions(@dimensions) if @dimensions
|
47
|
+
end
|
32
48
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
49
|
+
private
|
50
|
+
|
51
|
+
def set_vars_from_opts(opts)
|
52
|
+
@server_url = opts["server_url"]
|
53
|
+
@service_name = opts["service"].strip if opts["service"]
|
54
|
+
raise "Please ensure you have provided the appropriate server url and service name" unless @server_url && @service_name && @service_name != ""
|
55
|
+
@server_url = @server_url.chomp("/")
|
56
|
+
@proxy = opts["proxy"]
|
57
|
+
@proxy = "" if @server_url.start_with?("http://127.0.0.1") or @server_url.start_with?("http://localhost")
|
58
|
+
@event_types = opts["event_types"]
|
59
|
+
@dimensions = opts["dimensions"]
|
60
|
+
@client_id = opts["client_id"]
|
61
|
+
@client_secret = opts["client_secret"]
|
62
|
+
end
|
38
63
|
|
64
|
+
def get_token(token=nil)
|
65
|
+
return token unless token.nil?
|
66
|
+
return @token unless @token.nil?
|
67
|
+
@client_id.nil? ? @token : update_token
|
68
|
+
end
|
39
69
|
|
40
|
-
|
70
|
+
def update_token
|
71
|
+
url = "#{@server_url}/oauth/token?client_id=#{@client_id}&client_secret=#{@client_secret}"
|
72
|
+
raw = post_token(:post, url, "token", {})
|
73
|
+
parse_raw = parse_json_response(raw)
|
74
|
+
resp = parse_raw['body']
|
75
|
+
@token = resp['access_token']
|
76
|
+
end
|
41
77
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
78
|
+
def post_token (http_method, url, object_type, metadata)
|
79
|
+
json_object = create_json_object(object_type, metadata)
|
80
|
+
json_block = ->(req) do
|
81
|
+
req.url url
|
82
|
+
req.headers["Content-Type"] = JSON_CONTENT_TYPE
|
83
|
+
req.body = json_object
|
84
|
+
end
|
85
|
+
conn.send(http_method, &json_block)
|
86
|
+
end
|
52
87
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
req.url url
|
57
|
-
req.headers["Content-Type"] = JSON_CONTENT_TYPE
|
58
|
-
req.body = json_object
|
88
|
+
def get_json(url, token=nil, params = {})
|
89
|
+
headers = {'Authorization' => "Bearer #{get_token(token)}"}
|
90
|
+
conn.get(url, params, headers)
|
59
91
|
end
|
60
|
-
end
|
61
92
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
93
|
+
def multi_get_json(service_location, query_parameters, token=nil)
|
94
|
+
results = []
|
95
|
+
|
96
|
+
EventMachine.run do
|
97
|
+
multi = EventMachine::MultiRequest.new
|
98
|
+
|
99
|
+
connection_opts = {}
|
100
|
+
connection_opts = {proxy: {host: @proxy.sub(/^https?\:\/\//, ''), port: 80}} if @proxy.present?
|
101
|
+
|
102
|
+
query_parameters.each_with_index do |param, idx|
|
103
|
+
http = EventMachine::HttpRequest.new(service_location, connection_opts)
|
104
|
+
req = http.get query: param, head: {'Authorization' => "Bearer #{get_token(token)}"}
|
105
|
+
multi.add idx, req
|
106
|
+
end
|
107
|
+
|
108
|
+
multi.callback do
|
109
|
+
response = multi.responses[:callback]
|
110
|
+
error = multi.responses[:errback]
|
111
|
+
EventMachine.stop
|
112
|
+
|
113
|
+
(0..query_parameters.size-1).each do |idx|
|
114
|
+
results += [multi_parse_json_response(response[idx])] if response[idx].present?
|
115
|
+
results += [multi_parse_json_response(error[idx])] if error[idx].present?
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
results
|
68
121
|
end
|
69
|
-
end
|
70
122
|
|
71
|
-
|
72
|
-
|
73
|
-
|
123
|
+
def post_json(url, object_type, metadata, token=nil)
|
124
|
+
http_json(:post, url, object_type, metadata, token)
|
125
|
+
end
|
74
126
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
127
|
+
def put_json(url, object_type, metadata, token=nil)
|
128
|
+
http_json(:put, url, object_type, metadata, token)
|
129
|
+
end
|
79
130
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
131
|
+
def http_json(http_method, url, object_type, metadata, token)
|
132
|
+
json_object = create_json_object(object_type, metadata)
|
133
|
+
json_block = ->(req) do
|
134
|
+
req.url url
|
135
|
+
req.headers["Content-Type"] = JSON_CONTENT_TYPE
|
136
|
+
req.headers["Authorization"]= "Bearer #{get_token(token)}"
|
137
|
+
req.body = json_object
|
138
|
+
end
|
139
|
+
conn.send(http_method, &json_block)
|
84
140
|
end
|
85
|
-
metadata
|
86
|
-
end
|
87
141
|
|
88
|
-
|
89
|
-
|
90
|
-
all_event_types["event_types"].each do |event_type|
|
91
|
-
event_types.delete(event_type["name"]) if event_types.include?(event_type["name"])
|
142
|
+
def create_json_object(object_type, metadata = {})
|
143
|
+
{object_type => metadata}.to_json
|
92
144
|
end
|
93
|
-
|
94
|
-
|
145
|
+
|
146
|
+
def create_metadata(hashmap)
|
147
|
+
hashmap.reject { |k,v| v == "" }
|
95
148
|
end
|
96
|
-
event_types
|
97
|
-
end
|
98
149
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
150
|
+
def find_or_create_event_types(event_types)
|
151
|
+
all_event_types = JSON.parse(get_json("#{@service_location}/event_types.json?access_token=#{get_token}").body)
|
152
|
+
all_event_types["event_types"].each do |event_type|
|
153
|
+
event_types.delete(event_type["name"]) if event_types.include?(event_type["name"])
|
154
|
+
end
|
155
|
+
event_types.each do |event_type|
|
156
|
+
create_event_type(event_type)
|
104
157
|
end
|
158
|
+
event_types
|
105
159
|
end
|
106
|
-
end
|
107
160
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
161
|
+
def find_or_create_dimensions(dimensions)
|
162
|
+
all_dimensions = get_all_dimension_names
|
163
|
+
dimensions.each do |dimension|
|
164
|
+
dimension.each do |name, data_type|
|
165
|
+
create_dimension(name, data_type) unless all_dimensions.include?(name)
|
166
|
+
end
|
167
|
+
end
|
113
168
|
end
|
114
|
-
dimension_names
|
115
|
-
end
|
116
169
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
170
|
+
def get_all_dimension_names
|
171
|
+
dimension_names = []
|
172
|
+
dimensions = JSON.parse(get_json("#{@service_location}/dimensions.json?access_token=#{get_token}").body)
|
173
|
+
dimensions["dimensions"].each do |one_dimension|
|
174
|
+
dimension_names << one_dimension["name"]
|
175
|
+
end
|
176
|
+
dimension_names
|
121
177
|
end
|
122
|
-
service_location
|
123
|
-
end
|
124
178
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
all_services["services"].each do |service|
|
129
|
-
service_location = service if service["name"] == service_name
|
179
|
+
def create_service_private(name, description = "")
|
180
|
+
metadata = create_metadata({name: name, description: description})
|
181
|
+
post_json(API_URL, "service", metadata)
|
130
182
|
end
|
131
|
-
service_location
|
132
|
-
end
|
133
183
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
184
|
+
def parse_json_response(json_response)
|
185
|
+
parsed_response = {}
|
186
|
+
parsed_response[PARSED_RESPONSE[:status]] = json_response.status if json_response.status.present?
|
138
187
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
188
|
+
if [200, 201, 202].include?(json_response.status)
|
189
|
+
parsed_response[PARSED_RESPONSE[:body]] = JSON.parse(json_response.body) if json_response.body.present?
|
190
|
+
parsed_response[PARSED_RESPONSE[:location]] = json_response.headers["location"] if json_response.headers.present? && json_response.headers["location"]
|
191
|
+
else
|
192
|
+
parsed_response[PARSED_RESPONSE[:body]] = {}
|
193
|
+
parsed_response[PARSED_RESPONSE[:error_message]] = json_response.body
|
194
|
+
end
|
146
195
|
|
147
|
-
|
148
|
-
|
149
|
-
end
|
196
|
+
parsed_response
|
197
|
+
end
|
150
198
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
end
|
199
|
+
def multi_parse_json_response(response)
|
200
|
+
parsed_response = {}
|
201
|
+
parsed_response[PARSED_RESPONSE[:status]] = response.response_header.present? ? response.response_header.status : 500
|
155
202
|
|
156
203
|
|
157
|
-
|
204
|
+
if [200, 201, 202].include?(parsed_response[PARSED_RESPONSE[:status]])
|
205
|
+
parsed_response[PARSED_RESPONSE[:body]] = JSON.parse response.response if response.response.present?
|
206
|
+
parsed_response[PARSED_RESPONSE[:location]] = response.headers.location if response.headers.present? && response.headers.location.present?
|
207
|
+
else
|
208
|
+
parsed_response[PARSED_RESPONSE[:body]] = {}
|
209
|
+
parsed_response[PARSED_RESPONSE[:error_message]] = response.error if response.error.present?
|
210
|
+
end
|
211
|
+
parsed_response
|
212
|
+
end
|
213
|
+
|
214
|
+
def delete_resource(url, token=nil)
|
215
|
+
conn.delete (url + "?access_token=#{get_token}")
|
216
|
+
end
|
217
|
+
|
218
|
+
def faraday_connection
|
219
|
+
return Faraday.new(@server_url) if @proxy == nil
|
220
|
+
Faraday.new(@server_url, {proxy: {uri: @proxy}})
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
|
3
|
+
class AnalyticsReportField
|
4
|
+
|
5
|
+
include ActiveModel::Model
|
6
|
+
|
7
|
+
attr_accessor :name, :value, :is_aggregate
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
@value.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def sum
|
14
|
+
@value['sum'].present? ? @value['sum'] : 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def avg
|
18
|
+
@value['avg'].present? ? @value['avg'] : 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def stddev
|
22
|
+
@value['stddev'].present? ? @value['stddev'] : 0
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
metadata
CHANGED
@@ -1,83 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: analytics-psw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Lexmark International Technology S.A
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-core
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.14.8
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.14.8
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 2.14.1
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 2.14.1
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: simplecov
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: faraday
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: eventmachine
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: em-http-request
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
81
123
|
- !ruby/object:Gem::Version
|
82
124
|
version: '0'
|
83
125
|
description: Analytics-psw is a wrapper providing access to the Perceptive Cloud Platform
|
@@ -88,14 +130,18 @@ executables: []
|
|
88
130
|
extensions: []
|
89
131
|
extra_rdoc_files: []
|
90
132
|
files:
|
91
|
-
- lib/analytics-psw.rb
|
92
|
-
- lib/analytics_dimension_properties.rb
|
93
|
-
- lib/analytics_dimensions.rb
|
94
|
-
- lib/analytics_event_types.rb
|
95
|
-
- lib/analytics_reports.rb
|
96
|
-
- lib/analytics_services.rb
|
97
133
|
- LICENSE.txt
|
98
134
|
- README.md
|
135
|
+
- lib/analytics-psw.rb
|
136
|
+
- lib/analytics-psw/customers.rb
|
137
|
+
- lib/analytics-psw/dimension_properties.rb
|
138
|
+
- lib/analytics-psw/dimensions.rb
|
139
|
+
- lib/analytics-psw/event_types.rb
|
140
|
+
- lib/analytics-psw/events.rb
|
141
|
+
- lib/analytics-psw/reports.rb
|
142
|
+
- lib/analytics-psw/services.rb
|
143
|
+
- lib/analytics_report.rb
|
144
|
+
- lib/analytics_report_field.rb
|
99
145
|
homepage:
|
100
146
|
licenses:
|
101
147
|
- 3-Clause BSD
|
@@ -106,17 +152,17 @@ require_paths:
|
|
106
152
|
- lib
|
107
153
|
required_ruby_version: !ruby/object:Gem::Requirement
|
108
154
|
requirements:
|
109
|
-
- -
|
155
|
+
- - ">="
|
110
156
|
- !ruby/object:Gem::Version
|
111
157
|
version: '0'
|
112
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
159
|
requirements:
|
114
|
-
- -
|
160
|
+
- - ">="
|
115
161
|
- !ruby/object:Gem::Version
|
116
162
|
version: '0'
|
117
163
|
requirements: []
|
118
164
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.
|
165
|
+
rubygems_version: 2.2.2
|
120
166
|
signing_key:
|
121
167
|
specification_version: 4
|
122
168
|
summary: Perceptive Cloud Platform Analytics Service Wrapper
|
@@ -1,87 +0,0 @@
|
|
1
|
-
module AnalyticsDimensionProperties
|
2
|
-
|
3
|
-
SERVICE_NAME_PARAM = 'service_name'
|
4
|
-
DIMENSION_NAME_PARAM = 'dimension_name'
|
5
|
-
DIMENSION_PROPERTY_VALUE_PARAM = 'dimension_property_value'
|
6
|
-
|
7
|
-
def list_dimension_properties(dimension_name)
|
8
|
-
response = request_uri_to_dimension_properties(dimension_name)
|
9
|
-
if valid_uri_response?(response)
|
10
|
-
uri = uri_from_uri_response(response)
|
11
|
-
response = get_with_hash(uri)
|
12
|
-
end
|
13
|
-
parse_json_response(response)
|
14
|
-
end
|
15
|
-
|
16
|
-
def show_dimension_properties(dimension_name, dimension_value)
|
17
|
-
response = request_uri_to_dimension_properties(dimension_name, dimension_value)
|
18
|
-
if valid_uri_response?(response)
|
19
|
-
uri = uri_from_uri_response(response)
|
20
|
-
response = get_with_hash(uri)
|
21
|
-
end
|
22
|
-
parse_json_response(response)
|
23
|
-
end
|
24
|
-
|
25
|
-
def create_dimension_properties(dimension_name, dimension_value, properties = {})
|
26
|
-
metadata = create_dimension_properties_metadata(dimension_value, properties)
|
27
|
-
response = request_uri_to_dimension_properties(dimension_name)
|
28
|
-
if valid_uri_response?(response)
|
29
|
-
uri = uri_from_uri_response(response)
|
30
|
-
response = post_json(uri, "dimension_property", metadata)
|
31
|
-
end
|
32
|
-
parse_json_response(response)
|
33
|
-
end
|
34
|
-
|
35
|
-
def update_dimension_properties(dimension_name, dimension_value, properties = {})
|
36
|
-
metadata = create_dimension_properties_metadata(dimension_value, properties)
|
37
|
-
response = request_uri_to_dimension_properties(dimension_name, dimension_value)
|
38
|
-
if valid_uri_response?(response)
|
39
|
-
uri = uri_from_uri_response(response)
|
40
|
-
response = put_json(uri, "dimension_property", metadata)
|
41
|
-
end
|
42
|
-
parse_json_response(response)
|
43
|
-
end
|
44
|
-
|
45
|
-
def create_or_update_dimension_properties(dimension_name, dimension_value, properties = {})
|
46
|
-
response = request_uri_to_dimension_properties(dimension_name, dimension_value)
|
47
|
-
if valid_uri_response?(response)
|
48
|
-
return update_dimension_properties(dimension_name, dimension_value, properties)
|
49
|
-
end
|
50
|
-
create_dimension_properties(dimension_name, dimension_value, properties)
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def create_dimension_properties_metadata(dimension_value, properties)
|
56
|
-
dimension_properties_body = {'value' => dimension_value, 'properties' => {}}
|
57
|
-
properties.each do |key, value|
|
58
|
-
dimension_properties_body['properties'][key] = value unless value == ""
|
59
|
-
end
|
60
|
-
dimension_properties_body
|
61
|
-
end
|
62
|
-
|
63
|
-
def request_uri_to_dimension_properties(dimension_name, dimension_value = nil)
|
64
|
-
uri_path = "#{@server_url}/uris/dimension_property"
|
65
|
-
uri_path_query_params = dimension_property_uri_query_params(dimension_name, dimension_value)
|
66
|
-
get_with_hash(uri_path, uri_path_query_params)
|
67
|
-
end
|
68
|
-
|
69
|
-
def valid_uri_response?(uri_response)
|
70
|
-
uri_response.status == 200
|
71
|
-
end
|
72
|
-
|
73
|
-
def uri_from_uri_response(uri_response)
|
74
|
-
parsed_json_body = JSON.parse(uri_response.body)
|
75
|
-
parsed_json_body['uri']['location']
|
76
|
-
end
|
77
|
-
|
78
|
-
def dimension_property_uri_query_params(dimension_name, dimension_value)
|
79
|
-
query_params = {
|
80
|
-
SERVICE_NAME_PARAM => @service_name,
|
81
|
-
DIMENSION_NAME_PARAM => dimension_name,
|
82
|
-
}
|
83
|
-
query_params[DIMENSION_PROPERTY_VALUE_PARAM] = dimension_value unless dimension_value.nil?
|
84
|
-
query_params
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
data/lib/analytics_dimensions.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module AnalyticsDimensions
|
2
|
-
|
3
|
-
def create_dimension(name, data_type, units = "", description = "")
|
4
|
-
metadata = create_metadata({:name => name, :description => description, :data_type => data_type, :units => units})
|
5
|
-
resp = post_json("#{@service_location}/dimensions", "dimension", metadata)
|
6
|
-
parse_json_response(resp)
|
7
|
-
end
|
8
|
-
|
9
|
-
def list_dimensions
|
10
|
-
resp = get_with_hash("#{@service_location}/dimensions")
|
11
|
-
parse_json_response(resp)
|
12
|
-
end
|
13
|
-
|
14
|
-
def show_dimension_resources(dimension_id)
|
15
|
-
resp = get_with_hash("#{@service_location}/dimensions/#{dimension_id}")
|
16
|
-
parse_json_response(resp)
|
17
|
-
end
|
18
|
-
|
19
|
-
def show_dimension_metadata(dimension_id)
|
20
|
-
resp = get_with_hash("#{@service_location}/dimensions/#{dimension_id}/metadata")
|
21
|
-
parse_json_response(resp)
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module AnalyticsEventTypes
|
2
|
-
|
3
|
-
def create_event_type(name, description = "")
|
4
|
-
metadata = create_metadata({:name => name, :description => description})
|
5
|
-
resp = post_json("#{@service_location}/event_types", "event_type", metadata)
|
6
|
-
parse_json_response(resp)
|
7
|
-
end
|
8
|
-
|
9
|
-
def list_event_types
|
10
|
-
resp = get_with_hash("#{@service_location}/event_types")
|
11
|
-
parse_json_response(resp)
|
12
|
-
end
|
13
|
-
|
14
|
-
def show_event_type(event_type_id)
|
15
|
-
resp = get_with_hash("#{@service_location}/event_types/#{event_type_id}")
|
16
|
-
parse_json_response(resp)
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
data/lib/analytics_reports.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module AnalyticsReports
|
2
|
-
|
3
|
-
def query_analytics(query_parameters)
|
4
|
-
resp = get_with_hash("#{@service_location}/reports/query.json", query_parameters)
|
5
|
-
raise "Problem with your query. Please check the required parameters and try again" if resp.status == 400
|
6
|
-
parse_json_response(resp)
|
7
|
-
end
|
8
|
-
|
9
|
-
def create_report(name, query_parameters)
|
10
|
-
query_parameters[:name] = name
|
11
|
-
resp = post_json("#{@service_location}/reports", "report", query_parameters )
|
12
|
-
parse_json_response(resp)
|
13
|
-
end
|
14
|
-
|
15
|
-
def list_reports
|
16
|
-
resp = get_with_hash("#{@service_location}/reports")
|
17
|
-
parse_json_response(resp)
|
18
|
-
end
|
19
|
-
|
20
|
-
def show_report(report_id)
|
21
|
-
resp = get_with_hash("#{@service_location}/reports/#{report_id}")
|
22
|
-
parse_json_response(resp)
|
23
|
-
end
|
24
|
-
|
25
|
-
def run_report(report_id, where_criteria = {})
|
26
|
-
resp = get_with_hash("#{@service_location}/reports/#{report_id}/results", where_criteria)
|
27
|
-
parse_json_response(resp)
|
28
|
-
end
|
29
|
-
|
30
|
-
def delete_report(report_id)
|
31
|
-
resp = delete_resource("#{@service_location}/reports/#{report_id}")
|
32
|
-
parse_json_response(resp)
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
data/lib/analytics_services.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module AnalyticsServices
|
2
|
-
|
3
|
-
def create_service(name)
|
4
|
-
create_service_private(name)
|
5
|
-
end
|
6
|
-
|
7
|
-
def list_services
|
8
|
-
resp = get_with_hash("/services")
|
9
|
-
parse_json_response(resp)
|
10
|
-
end
|
11
|
-
|
12
|
-
def show_service_resources(service_id)
|
13
|
-
resp = get_with_hash("/services/#{service_id}")
|
14
|
-
parse_json_response(resp)
|
15
|
-
end
|
16
|
-
|
17
|
-
def show_service_metadata(service_id)
|
18
|
-
resp = get_with_hash("/services/#{service_id}/metadata")
|
19
|
-
parse_json_response(resp)
|
20
|
-
end
|
21
|
-
|
22
|
-
def delete_service(service_id)
|
23
|
-
resp = delete_resource("/services/#{service_id}")
|
24
|
-
parse_json_response(resp)
|
25
|
-
end
|
26
|
-
end
|