analytics-psw 0.1.2 → 0.1.3

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: 9690e2147d8783257c8dac2434b4aaeefc43e685
4
- data.tar.gz: ac1356c8a0a8eda726162ee4140d48a3a143c570
3
+ metadata.gz: d4fa2b78f7161b203949aaec9147366adac7386d
4
+ data.tar.gz: 0751907236b4d8818631a3d05abaa7e921f17ee2
5
5
  SHA512:
6
- metadata.gz: 4910eea5494ffd59db4dbb55df02172ed2b8fc366116d576b60fda4de474401be469cafb189fe4a6b4c9094bb176b6b2605bd5a727d727e126d64e6faec9bc63
7
- data.tar.gz: 14776571c8758a048240c65d56025638ee1807a67e73d035eb99de42cd4c885cc003dd2b360c1a7706d0fd82768e66f4fd1d97e65aee603a48741ad5aed90f53
6
+ metadata.gz: 5ceb1eda25f11c5d400f64f89f062673c68b8d9e188a7dc2d3a9ac6767201b8f5f943e50f81b9c3ccf2962673f82c901b498cc2936abfeb0c5b6cb5a338ec5ea
7
+ data.tar.gz: 89e882fa97e60d5b6f037eb6134698820c8f8b3d8b9625e0ee2a73f0fe5b473e761637762ce9754f3058a46f700bcb7a3dea839691eed052006ad5995918423e
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jordan Keyes
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # Analytics::Psw
2
+
3
+ Analytics-psw is a wrapper providing access to the Perceptive Cloud Platform Analytics service
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'analytics-psw'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install analytics-psw
18
+
19
+ ## Usage
20
+
21
+ ``` ruby
22
+ require 'analytics-psw'
23
+ require 'yaml' #optional, for importing information used to connect to the Analytics service
24
+ ```
25
+ ###Options in .rb file
26
+
27
+ ``` ruby
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
34
+
35
+ ap = AnalyticsPSW.new(opts)
36
+ ```
37
+
38
+ ### Options in separate .yml file
39
+ ``` ruby
40
+ ap = AnalyticsPSW.new(YAML.load_file(analytics_settings.yml))
41
+ ```
42
+
43
+ ### Sample YAML file
44
+ ```
45
+ ---
46
+ server_url: http://127.0.0.1:3000
47
+ service: my_service
48
+ event_types:
49
+ - event_one
50
+ - event_two
51
+
52
+ dimensions:
53
+ - dimension_one: string
54
+ - dimension_two: integer
55
+ ```
56
+
57
+ ## Available Methods
58
+
59
+ ``` 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.
89
+ ```
90
+
91
+ ## Query Parameters
92
+
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`
115
+
116
+ **Optional** `customer`, `where`, `group_by`, `order_by`, and `iterate_by`
117
+
118
+ Note: `iterate_by` always uses the global `event_time` dimension.
119
+
120
+ **Examples**
121
+ ``` ruby
122
+ { "sum" => "plays", "customer" => "lexmark", "where" => [ "begin_date gt 2013-12-10", "end_date lt 2013-12-20"], "group_by" => "location", "order_by" => "location descending" }
123
+ { "sum" => "plays,download", "avg" => "process_time", "where" => [ "location in kentucky,kansas,california"], "group_by" => "location", "order_by" => "location descending" }
124
+ { "fields" => "location,user_name", "company" => "lexmark"}
125
+ { "avg" => "plays", "customer" => "lexmark", "where" => [ "event_time gt 2013-12-10", "event_time lt 2013-12-20"], "iterate_by" => "DAY", "order_by" => "event_time descending" }
126
+
127
+ ```
128
+
129
+
130
+
131
+ ## License
132
+
133
+ 2013 Lexmark International Technology S.A. All rights reserved.
@@ -0,0 +1,87 @@
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
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,19 @@
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
@@ -0,0 +1,35 @@
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
@@ -0,0 +1,26 @@
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
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: analytics-psw
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordan Keyes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-20 00:00:00.000000000 Z
11
+ date: 2014-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -89,6 +89,13 @@ extensions: []
89
89
  extra_rdoc_files: []
90
90
  files:
91
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
+ - LICENSE.txt
98
+ - README.md
92
99
  homepage:
93
100
  licenses:
94
101
  - 3-Clause BSD