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 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