analytics-psw 0.1.4 → 0.3.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
  SHA1:
3
- metadata.gz: e095a0444b7d07efda86c02b10b581db447a3224
4
- data.tar.gz: ec4d661156ee26a7649913c26a38ca6b79cb394e
3
+ metadata.gz: c76464b815727cb3400f6bfbd23b2428617d8227
4
+ data.tar.gz: 0f8917692695f60b4f3fd9ffd6da207e30397b37
5
5
  SHA512:
6
- metadata.gz: 2fc5fb7e114172a7ce96d8eab4648fd26929e84b299e15e5c2dd0383b430cff34df1f3d5a07e1dd2a969770661c866a225460a9e38c720727f1bfcb4b8f503e8
7
- data.tar.gz: 185449144eccc24d09d06bb516aceb6396958d8d38d5b199bcdea709f01b135b59481b1688dc9de463ba7dd3429447a37e88d95b14be3c4e921f6a9ae018b8fe
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. No trailing slash needed
30
- opts['service'] = "MyServiceName" #required. Calling AnalyticsPSW.new will search for your service, and if it isn't found, create 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, will create event types to associate with your service if they don't already exist
33
- opts['dimensions'] = [{"dimension_name" => "string"}, {"dimension_2" => "integer"}] #optional, will create dimensions to describe your events if they don't already exist
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 = {}) # sends an event to the Analytics service. Event_type must exist on the Analytics system
61
-
62
- ap.query_analytics(query_parameters) # sends a hashmap query to the Analytics service. Possible keys include: required: one or more of :sum, :avg, :fields, optional: :customer, :where, :group_by, :order_by, :iterage_by. Use comma-separated strings if multiple values are needed
63
- ap.create_report(name, query_parameters) # create a report query to be ran later. 'query_parameters' same as above.
64
- ap.list_reports # list all reports for a service
65
- ap.show_report(report_id) # list the properties for a report
66
- ap.run_report(report_id, where_criteria) # run a stored report. 'where_criteria' are options 'where' paramters to replace in the stored report when running.
67
- ap.delete_report(report_id) # delete a stored report
68
-
69
- ap.create_service(name) # creates a new service
70
- ap.list_service # list all available services
71
- ap.show_service_resource(service_id) # list available resources for a service
72
- ap.show_service_metadata(service_id) # list the properties of a service
73
- ap.delete_service(service_id) # delete a report
74
-
75
- ap.create_event_type(name, description = "") # creates an event type for the service being used
76
- ap.list_event_types #list all event types for a service
77
- ap.show_event_type(event_type_id) # list properties of an event type
78
-
79
- ap.create_dimension(name, data_type, units = "", description = "") # creates a new dimension (field that describes an event, but isn't tied to any one event). Only name and data_type are required.
80
- ap.list_dimensions # list all dimensions for a service
81
- ap.show_dimension_resources(dimension_id) # list available resources for a dimension
82
- ap.show_dimension_metadata(dimension_id) # list metadata for a dimension
83
-
84
- ap.create_dimension_properties(dimension_name, dimension_value, property_hash) # adds properties to a dimension value. This will return status=409 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.
85
- ap.update_dimension_properties(dimension_name, dimension_value, property_hash) # updates properties created for a dimension value. The hash replaces all properties currently set.
86
- ap.create_or_update_dimension_properties(dimension_name, dimension_value, property_hash) # adds propertie to a dimension value if they already exist. Updates the properties otherwise. This will return status=409 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.
87
- ap.show_dimension_properties(dimension_name, dimension_value) # get the properties currently set for a dimension value. The body will be json.
88
- ap.list_dimension_properties(dimension_name) # list all values that have properties set. This will return a json object with an array of json/location pairs.
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 | Examples |
94
- | -------------------| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
95
- | ` sum ` |` any event or number dimension ` | ` { "sum" => "plays" } or { "sum" => "plays,process_time" } ` |
96
- | ` avg ` | ` any event or number dimension ` | ` { "avg" => "plays" } or { "avg" => "plays,process_time" } ` |
97
- | ` fields ` | ` any mapped dimension ` | ` { "fields" => "user_name } or { "fields" => "user_name,location" } ` |
98
- | ` customer ` | ` any customer associated with a service ` | ` { "customer" => "lexmark" } ` |
99
- | ` where ` | ` <dimension> <operator> <value> ` | ` { "where" => [ "begin_date gt 2013-12-10", "end_date lt 2013-12-20", "user_name eq bob", "location is null" ] }` |
100
- | ` - <dimension> ` | ` any mapped dimension ` | |
101
- | ` - <operator> ` | ` any valid operator ` | |
102
- | ` - - ls ` | ` less than operator ` | ` { "where" => [ "end_date lt 2013-12-10" ] }` |
103
- | ` - - gt ` | ` greater than operator ` | ` { "where" => [ "begin_date gt 2013-12-10" ] }` |
104
- | ` - - eq ` | ` equal to operator ` | ` { "where" => [ "user_name eq bob" ] }` |
105
- | ` - - lte ` | ` less than equal to operator ` | ` { "where" => [ "begin_date gte 2013-12-10" ] }` |
106
- | ` - - gte` | ` greater than equal to operator ` | ` { "where" => [ "end_date lte 2013-12-10" ] }` |
107
- | ` - - in ` | ` in operator for multiple values ` | ` { "where" => [ "user_name in bob,ted,allen" ] }` |
108
- | ` - - is ` | ` is operator for boolean and null value ` | ` { "where" => [ "awesome is true" ] }` |
109
- | ` group_by ` | ` any mapped dimension(s) ` | ` { "group_by" => "user_name" } or { "group_by" => "user_name,location" } ` |
110
- | ` order_by ` | ` <dimension> <ascending or descending> ` | ` { "order_by" => "user_name ascending" } or { "order_by" => "user_name descending" } ` |
111
- | ` iterate_by ` | ` YEAR, MONTH, DAY, or HOUR ` | ` { "iterate_by" => "MONTH" } or { "iterate_by" => "HOUR" } ` |
112
- | ` limit ` | ` any integer value ` | ` { "limit" => 10 } ` |
113
-
114
- **Required** `sum`, `avg`, and/or `fields`
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
+ | &nbsp;&nbsp;&nbsp;` <dimension> ` | ` any mapped dimension ` | |
141
+ | &nbsp;&nbsp;&nbsp;` <operator> ` | ` any valid operator ` | |
142
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` lt ` | ` less than operator ` | ` { "where" => [ "end_date lt 2013-12-10" ] }` |
143
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` gt ` | ` greater than operator ` | ` { "where" => [ "begin_date gt 2013-12-10" ] }` |
144
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` eq ` | ` equal to operator ` | ` { "where" => [ "user_name eq bob" ] }` |
145
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` lte ` | ` less than equal to operator ` | ` { "where" => [ "begin_date gte 2013-12-10" ] }` |
146
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` gte` | ` greater than equal to operator ` | ` { "where" => [ "end_date lte 2013-12-10" ] }` |
147
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` in ` | ` in operator for multiple values ` | ` { "where" => [ "user_name in bob,ted,allen" ] }` |
148
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` is ` | ` is operator for Boolean and null value ` | ` { "where" => [ "awesome is true" ] }` |
149
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` empty ` | ` no data has been written ` | ` { "where" => [ "username is empty" ] } ` |
150
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` defined ` | ` data written but could be nil` | ` { "where" => [ "username is defined" ] } ` |
151
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;` 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,11 @@
1
+ module AnalyticsPSW
2
+ module Customers
3
+
4
+ def list_customers (token=nil)
5
+ resp = get_json("#{@service_location}/customers", token)
6
+ parse_json_response(resp)
7
+ end
8
+
9
+ end
10
+ end
11
+
@@ -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 "analytics_reports"
4
- require "analytics_services"
5
- require "analytics_event_types"
6
- require "analytics_dimension_properties"
7
- require "analytics_dimensions"
8
-
9
- class AnalyticsPSW
10
-
11
- API_URL = "/services"
12
- JSON_CONTENT_TYPE = "application/json"
13
- SUM_CRITERIA_PARAM = "sum"
14
- AVG_CRITERIA_PARAM = "avg"
15
-
16
- PARSED_RESPONSE_STATUS = 'status'
17
- PARSED_RESPONSE_BODY = 'body'
18
- PARSED_RESPONSE_LOCATION = 'location'
19
-
20
- include AnalyticsReports, AnalyticsServices, AnalyticsEventTypes, AnalyticsDimensions, AnalyticsDimensionProperties
21
-
22
- attr_accessor :service_location
23
-
24
- def initialize(opts = {})
25
- set_vars_from_opts(opts)
26
- @conn = faraday_connection
27
- service = find_or_create_service(@service_name)
28
- @service_location = service["location"] if service
29
- find_or_create_event_types(@event_types) if @event_types
30
- find_or_create_dimensions(@dimensions) if @dimensions
31
- end
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
- def record_event(event_type, metadata = {})
34
- metadata[:event_type] = event_type
35
- resp = post_json("#{@service_location}/events", "event", metadata)
36
- parse_json_response(resp)
37
- end
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
- private
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
- def set_vars_from_opts(opts)
43
- @server_url = opts["server_url"]
44
- @service_name = opts["service"].strip if opts["service"]
45
- raise "Please ensure you have provided the appropriate server url and service name" unless @server_url && @service_name && @service_name != ""
46
- @server_url = @server_url.chomp("/")
47
- @proxy = opts["proxy"]
48
- @proxy = "" if @server_url.start_with?("http://127.0.0.1") or @server_url.start_with?("http://localhost")
49
- @event_types = opts["event_types"]
50
- @dimensions = opts["dimensions"]
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
- def post_json(url, object_type, metadata)
54
- json_object = create_json_object(object_type, metadata)
55
- @conn.post do |req|
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
- def put_json(url, object_type, metadata)
63
- json_object = create_json_object(object_type, metadata)
64
- @conn.put do |req|
65
- req.url url
66
- req.headers["Content-Type"] = JSON_CONTENT_TYPE
67
- req.body = json_object
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
- def get_with_hash(url, hash_object = {})
72
- @conn.get url, hash_object
73
- end
123
+ def post_json(url, object_type, metadata, token=nil)
124
+ http_json(:post, url, object_type, metadata, token)
125
+ end
74
126
 
75
- def create_json_object(object_type, metadata = {})
76
- json_object= {object_type => metadata}
77
- json_object.to_json
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
- def create_metadata(hashmap)
81
- metadata = {}
82
- hashmap.each do |key, value|
83
- metadata[key] = value unless value == ""
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
- def find_or_create_event_types(event_types)
89
- all_event_types = JSON.parse(get_with_hash("#{@service_location}/event_types.json").body)
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
- event_types.each do |event_type|
94
- create_event_type(event_type)
145
+
146
+ def create_metadata(hashmap)
147
+ hashmap.reject { |k,v| v == "" }
95
148
  end
96
- event_types
97
- end
98
149
 
99
- def find_or_create_dimensions(dimensions)
100
- all_dimensions = get_all_dimension_names
101
- dimensions.each do |dimension|
102
- dimension.each do |name, data_type|
103
- create_dimension(name, data_type) unless all_dimensions.include?(name)
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
- def get_all_dimension_names
109
- dimension_names = []
110
- dimensions = JSON.parse(get_with_hash("#{@service_location}/dimensions.json").body)
111
- dimensions["dimensions"].each do |one_dimension|
112
- dimension_names << one_dimension["name"]
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
- def find_or_create_service(service_name)
118
- service_location = find_service_location(service_name)
119
- if !service_location
120
- service_location = create_service_private(service_name)
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
- def find_service_location(service_name)
126
- service_location = nil
127
- all_services = JSON.parse(get_with_hash("#{API_URL}.json").body)
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
- def create_service_private(name, description = "")
135
- metadata = create_metadata({:name => name, :description => description})
136
- post_json(API_URL, "service", metadata)
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
- def parse_json_response(json_response)
140
- parsed_response = {}
141
- parsed_response[PARSED_RESPONSE_STATUS] = json_response.status if json_response.status
142
- parsed_response[PARSED_RESPONSE_BODY] = json_response.body if json_response.body && json_response.body.strip != ""
143
- parsed_response[PARSED_RESPONSE_LOCATION] = json_response.headers["location"] if json_response.headers && json_response.headers["location"]
144
- parsed_response
145
- end
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
- def delete_resource(url)
148
- @conn.delete url
149
- end
196
+ parsed_response
197
+ end
150
198
 
151
- def faraday_connection
152
- return Faraday.new(@server_url) if @proxy == nil
153
- Faraday.new(@server_url, {:proxy => {:uri => @proxy}})
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
- end
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,10 @@
1
+ require 'active_model'
2
+
3
+ class AnalyticsReport
4
+
5
+ include ActiveModel::Model
6
+
7
+ # :rows is an array of hashes where each hash is a row containing AnalyticsReportField objects
8
+ attr_accessor :status, :rows, :error_message
9
+
10
+ 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.1.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
- - Jordan Keyes
7
+ - Lexmark International Technology S.A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-21 00:00:00.000000000 Z
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: '0'
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: '0'
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.1.11
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
@@ -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
@@ -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
@@ -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