usabilla_api 0.1.0 → 0.1.1

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: 88b288cbe2a7e43ed1477c763db86aceee16180c
4
- data.tar.gz: 76b7f129876ad1399addd376afa6e0b8665b29e6
3
+ metadata.gz: dd858590143870feb277865af77a5df6fb214e0e
4
+ data.tar.gz: f568882361755a2f91b70c314b46f87a3688fb21
5
5
  SHA512:
6
- metadata.gz: 06af446296d47cea9bf84cc2edf7ed716cd97aca470702b4bf48cc0730016a11321c13659d35eaf270ae7af283f318bb8df1ca35473dbfea82fb3cdd0a6b6047
7
- data.tar.gz: 74173951d8452543d72d890393de2100eccad99bf486150fc1f6bd5fbd573c852443da52b0722ce93c42cc23686ae63a520b95527d36dfda0e10701a59bbc27a
6
+ metadata.gz: a1854cec8dd3dbab241540ea6c70f1b58cea8967dabc2d0f74fc8c060e1302ff29bf47813fdbdce23fcf2ecf4d73bc2caa12ff9a22a3bb248d06916c1d105048
7
+ data.tar.gz: 4abad0eca23e5aa09635001b31b80771a3bcaee741afb6ae719266e43605bab0f0b249f8cae85e957905fa089d7e85cb04de8af1440ca3d6816aebd31affdd00
data/README.md ADDED
@@ -0,0 +1,90 @@
1
+ #Installation
2
+
3
+ You can add it to your Gemfile with:
4
+ ```
5
+ gem 'usabilla_api'
6
+ ```
7
+ Run the bundle command to install it.
8
+
9
+ #Configuration
10
+
11
+ ######Add these lines to the appropriate config/environments file
12
+ Access & Secret Key are required
13
+ ```
14
+ UsabillaApi.configuration.access_key = 'YOUR-ACCESS-KEY'
15
+ UsabillaApi.configuration.secret_key = 'YOUR-SECRET-KEY'
16
+ ```
17
+ Change 'YOUR-ACCESS-KEY' & 'YOUR-SECRET-KEY' to appropriate values.
18
+
19
+ Get your access and secret key here: [Usabilla Member API](https://usabilla.com/member/api)
20
+
21
+ You can either return an Object (default) or a the original JSON string.
22
+ ```
23
+ UsabillaApi.configuration.json_response = true
24
+ ```
25
+ Full Usabilla API documentation: [Usabilla API](https://usabilla.com/api)
26
+
27
+ #Usage
28
+
29
+ Simply add one of the following;
30
+ (params = url query paramaters)
31
+
32
+ To get the **buttons** api response
33
+ ```
34
+ UsabillaApi.button(params)
35
+ ```
36
+ To get the **buttons feedback** items api response
37
+ ```
38
+ UsabillaApi.feedback_items(params)
39
+ ```
40
+ To get the **campaign** api response
41
+ ```
42
+ UsabillaApi.campaign(params)
43
+ ```
44
+ To get the **campaign results** api response
45
+ ```
46
+ UsabillaApi.campaign_results(params)
47
+ ```
48
+
49
+ ######Example
50
+ ```
51
+ # Controller /button_controller.rb
52
+ def show
53
+ @buttons = UsabillaApi.button(params)
54
+ end
55
+ ```
56
+ ```
57
+ # View /show.html.rb
58
+ <h2>Buttons</h2>
59
+ <% @buttons.each do |button| %>
60
+ Button ID: <% button.id %>
61
+ Button Name: <% button.name %>
62
+ <% end %>
63
+ ```
64
+
65
+ ######Accepted Query String Parameters
66
+
67
+ Usabilla excepts the following query string parameters as values;
68
+
69
+ Returns the requested subset.
70
+ ```
71
+ ?limit=
72
+ ```
73
+ Returns the requested subset.
74
+ ```
75
+ ?since=
76
+ ```
77
+ Note: Only accepts Unix Timestamps
78
+
79
+ #Contributing
80
+ Feel free to fork or branch and create pull requests with any changes or cool additions!
81
+ Be sure to test any changes and include them in the pull request in order for it to be considered.
82
+
83
+ Thanks!
84
+
85
+
86
+ ######TODO
87
+ * Testing
88
+ * Refactoring
89
+
90
+ *isn't this always the case though?* ~_^
@@ -0,0 +1,29 @@
1
+ require 'json'
2
+
3
+ module UsabillaApi
4
+ module Clients
5
+ class Button
6
+ class << self
7
+
8
+ def retrieve(params)
9
+ request = UsabillaApi.api_client.new(params).get_buttons
10
+ request = UsabillaApi.response.new(JSON.parse(request)).buttons unless return_json_response
11
+ request
12
+ end
13
+
14
+ def feedback(params)
15
+ request = UsabillaApi.api_client.new(params).get_feedback_items
16
+ request = UsabillaApi.response.new(JSON.parse(request)).feedback_items unless return_json_response
17
+ request
18
+ end
19
+
20
+ private
21
+
22
+ def return_json_response
23
+ UsabillaApi.configuration.json_response
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ require 'json'
2
+
3
+ module UsabillaApi
4
+ module Clients
5
+ class Campaign
6
+ class << self
7
+
8
+ def retrieve(params)
9
+ request = UsabillaApi.api_client.new(params).get_campaigns
10
+ request = UsabillaApi.response.new(JSON.parse(request)).campaign unless return_json_response
11
+ request
12
+ end
13
+
14
+ def results(params)
15
+ request = UsabillaApi.api_client.new(params).get_campaign_results
16
+ request = UsabillaApi.response.new(JSON.parse(request)).campaign_results unless return_json_response
17
+ request
18
+ end
19
+
20
+ private
21
+
22
+ def return_json_response
23
+ UsabillaApi.configuration.json_response
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,43 @@
1
+ module UsabillaApi
2
+ class Config
3
+
4
+ def initialize
5
+ set_defaults
6
+ end
7
+
8
+ def set_base_uri(uri)
9
+ @base_uri = uri
10
+ end
11
+
12
+ protected
13
+ #################################################################
14
+
15
+ def set_defaults
16
+ @access_key = nil
17
+ @secret_key = nil
18
+ @http_method = 'GET'
19
+ @host_protocol = 'https://'
20
+ @host = 'data.usabilla.com'
21
+ @base_scope = '/live/website'
22
+ @base_uri = @host_protocol + @host + @base_scope
23
+ @json_response = false
24
+ set_default_api_uris
25
+ set_attr_accessors
26
+ end
27
+
28
+ private
29
+ #################################################################
30
+
31
+ def set_default_api_uris
32
+ @uri_button ||= '/button'
33
+ @uri_feedback_items ||= '/button/:id/feedback'
34
+ @uri_campaign ||= '/campaign'
35
+ @uri_campaign_results ||= '/campaign/:id/results'
36
+ end
37
+
38
+ def set_attr_accessors
39
+ instance_variables.each { |instance_variable| self.class.send :attr_accessor, instance_variable[1..-1].to_sym }
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,30 @@
1
+ module UsabillaApi
2
+ module Convenience
3
+ module ClassMethods
4
+
5
+ def api_client
6
+ UsabillaApi::Client
7
+ end
8
+
9
+ def response
10
+ UsabillaApi::Models::Response
11
+ end
12
+
13
+ def button(params)
14
+ UsabillaApi::Clients::Button.retrieve(params)
15
+ end
16
+
17
+ def feedback_items(params)
18
+ UsabillaApi::Clients::Button.feedback(params)
19
+ end
20
+
21
+ def campaign(params)
22
+ UsabillaApi::Clients::Campaign.retrieve(params)
23
+ end
24
+
25
+ def campaign_results(params)
26
+ UsabillaApi::Clients::Campaign.results(params)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ module UsabillaApi
2
+ module Models
3
+ module Button
4
+ class Item
5
+ attr_accessor :id, :name
6
+
7
+ def initialize(args = {})
8
+ @id = args['id'] || ''
9
+ @name = args['name'] || ''
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ module UsabillaApi
2
+ module Models
3
+ module Campaign
4
+ class Item
5
+ attr_accessor :id, :date, :button_id, :analytics_id, :status, :name, :statistics, :type
6
+
7
+ def initialize(args = {})
8
+ @id = args['id'] || ''
9
+ @date = args['date'] || ''
10
+ @button_id = args['buttonId'] || ''
11
+ @analytics_id = args['analyticsId'] || ''
12
+ @status = args['status'] || ''
13
+ @name = args['name'] || ''
14
+ @statistics = create_statistics(args['statistics']) || []
15
+ @type = args['type'] || ''
16
+ end
17
+
18
+ def create_statistics(hash)
19
+ UsabillaApi::Models::Campaign::Statistics.new(hash)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module UsabillaApi
2
+ module Models
3
+ module Campaign
4
+ class Statistics
5
+
6
+ attr_accessor :views, :completed, :conversion
7
+
8
+ def initialize(args = {})
9
+ @views = args['views'] || nil
10
+ @completed = args['completed'] || nil
11
+ @conversion = args['conversion'] || nil
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ module UsabillaApi
2
+ module Models
3
+ module CampaignResults
4
+ class Item
5
+ attr_accessor :id, :user_agent, :location, :date, :campaign_id, :custom_data, :data, :url, :time
6
+
7
+ def initialize(args = {})
8
+ @id = args['id'] || ''
9
+ @user_agent = args['userAgent'] || ''
10
+ @location = args['location'] || ''
11
+ @date = args['date'] || ''
12
+ @campaign_id = args['campaignId'] || ''
13
+ @custom_data = args['customData'] || []
14
+ @data = args['data'] || []
15
+ @url = args['url'] || ''
16
+ @time = args['time'] || nil
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ module UsabillaApi
2
+ module Models
3
+ module Feedback
4
+ class Item
5
+ attr_accessor :id, :user_agent, :comment, :location, :date, :custom, :email, :image, :labels, :nps, :public_url, :rating, :button_id, :tags, :url
6
+
7
+ def initialize(args = {})
8
+ @id = args['id'] || ''
9
+ @user_agent = args['userAgent'] || ''
10
+ @comment = args['comment'] || ''
11
+ @location = args['location'] || ''
12
+ @date = args['date'] || ''
13
+ @custom = args['custom'] || []
14
+ @email = args['email'] || ''
15
+ @image = args['image'] || ''
16
+ @labels = args['labels'] || []
17
+ @nps = args['nps'] || nil
18
+ @public_url = args['publicUrl'] || []
19
+ @rating = args['rating'] || ''
20
+ @button_id = args['buttonId'] || nil
21
+ @tags = args['tags'] || []
22
+ @url = args['url'] || ''
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ module UsabillaApi
2
+ module Models
3
+ class Response
4
+ attr_accessor :items, :count, :has_more, :last_time_stamp
5
+
6
+ def initialize(args = {})
7
+ @items = args['items'] || Array.new
8
+ @count = args['count'] || 0
9
+ @has_more = args['hasMore'] || false
10
+ @last_time_stamp = args['lastTimestamp'] || nil
11
+ end
12
+
13
+ def buttons
14
+ @items = @items.map {|item| UsabillaApi::Models::Button::Item.new(item)} unless @items.nil?
15
+ end
16
+
17
+ def feedback_items
18
+ @items = @items.map {|item| UsabillaApi::Models::Feedback::Item.new(item)} unless @items.nil?
19
+ end
20
+
21
+ def campaign
22
+ @items = @items.map {|item| UsabillaApi::Models::Campaign::Item.new(item)} unless @items.nil?
23
+ end
24
+
25
+ def campaign_results
26
+ @items = @items.map {|item| UsabillaApi::Models::Campaign::Item.new(item)} unless @items.nil?
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,100 @@
1
+ require 'rest-client'
2
+ require 'openssl'
3
+
4
+ module UsabillaApi
5
+
6
+ class Client
7
+ attr_accessor :http_method, :host, :host_protocol, :access_key, :secret_key, :query_parameters
8
+
9
+ def initialize(params)
10
+ @http_method = UsabillaApi.configuration.http_method
11
+ @host_protocol = UsabillaApi.configuration.host_protocol
12
+ @host = UsabillaApi.configuration.host
13
+ @base_scope = UsabillaApi.configuration.base_scope
14
+ @access_key = UsabillaApi.configuration.access_key
15
+ @secret_key = UsabillaApi.configuration.secret_key
16
+ @query_parameters = params || ''
17
+ @query_id = @query_parameters["id"] || String.new
18
+ end
19
+
20
+ def get_buttons
21
+ send_signed_request(UsabillaApi.configuration.uri_button)
22
+ end
23
+
24
+ def get_feedback_items
25
+ if @query_id.nil? || @query_id.empty?
26
+ raise 'Invalid Button ID'
27
+ end
28
+ uri = sub_query_id(UsabillaApi.configuration.uri_feedback_items)
29
+ send_signed_request(uri)
30
+ end
31
+
32
+ def get_campaigns
33
+ send_signed_request(UsabillaApi.configuration.uri_campaign)
34
+ end
35
+
36
+ def get_campaign_results
37
+ if @query_id.nil? || @query_id.empty?
38
+ raise 'Invalid Campaign ID'
39
+ end
40
+ uri = sub_query_id(UsabillaApi.configuration.uri_campaign_results)
41
+
42
+ send_signed_request(uri)
43
+ end
44
+
45
+ private
46
+
47
+ def send_signed_request(uri)
48
+
49
+ if @access_key.nil? || @secret_key.nil?
50
+ raise 'Invalid Access Key. The Access Key supplied is invalid.'
51
+ end
52
+
53
+ t = DateTime.now
54
+ usbldate = t.strftime('%a, %d %b %Y %H:%M:%S GMT')
55
+ datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope
56
+ long_date = t.strftime('%Y%m%dT%H%M%SZ')
57
+
58
+ query_string = build_query_string(@query_parameters)
59
+ canonical_headers = "date:#{usbldate}\nhost:#{@host}\n"
60
+ signed_headers = 'date;host'
61
+ payload_hash = OpenSSL::Digest::SHA256.new.hexdigest
62
+
63
+ canonical_request = "#{@http_method}\n#{@base_scope + uri}\n#{query_string}\n#{canonical_headers}\n#{signed_headers}\n#{payload_hash}"
64
+
65
+ canonical_request_digest = OpenSSL::Digest::SHA256.new(canonical_request).hexdigest
66
+ algorithm = 'USBL1-HMAC-SHA256'
67
+ credential_scope = "#{datestamp}/usbl1_request"
68
+
69
+ string_to_sign = "#{algorithm}\n#{long_date}\n#{credential_scope}\n#{canonical_request_digest}"
70
+
71
+ signing_key = get_signature_key(@secret_key, datestamp)
72
+ signature = OpenSSL::HMAC.hexdigest('sha256', signing_key, string_to_sign)
73
+
74
+ authorization_header = "#{algorithm} Credential=#{@access_key}/#{credential_scope}, SignedHeaders=#{signed_headers}, Signature=#{signature}"
75
+ headers = {'date' => usbldate, 'Authorization' => authorization_header}
76
+
77
+ # Send the request.
78
+ request_url = uri + '?' + query_string
79
+ response = RestClient.get(UsabillaApi.configuration.base_uri + request_url, headers)
80
+
81
+ # Return Response
82
+ response
83
+
84
+ end
85
+
86
+ def get_signature_key(key, long_date)
87
+ k_date = OpenSSL::HMAC.digest('sha256', 'USBL1' + key, long_date)
88
+ k_signing = OpenSSL::HMAC.digest('sha256', k_date, 'usbl1_request')
89
+ k_signing
90
+ end
91
+
92
+ def sub_query_id(uri)
93
+ uri.gsub(':id', @query_id)
94
+ end
95
+
96
+ def build_query_string(hash)
97
+ hash.to_a.reverse.map { |x| "#{x[0]}=#{x[1]}" }.join("&") unless hash.nil?
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,3 @@
1
+ module UsabillaApi
2
+ VERSION = '0.1.1'
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usabilla_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Molinaro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -44,6 +44,100 @@ dependencies:
44
44
  - - '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: 1.7.7
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '0.8'
54
+ - - '>='
55
+ - !ruby/object:Gem::Version
56
+ version: 0.8.7
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '0.8'
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: 0.8.7
67
+ - !ruby/object:Gem::Dependency
68
+ name: webmock
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ version: '1.9'
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.9.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '1.9'
84
+ - - '>='
85
+ - !ruby/object:Gem::Version
86
+ version: 1.9.0
87
+ - !ruby/object:Gem::Dependency
88
+ name: simplecov
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '0.7'
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.7.1
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '0.7'
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: 0.7.1
107
+ - !ruby/object:Gem::Dependency
108
+ name: rspec
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ version: '2.14'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: '2.14'
121
+ - !ruby/object:Gem::Dependency
122
+ name: rspec-pride
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ~>
126
+ - !ruby/object:Gem::Version
127
+ version: '2.2'
128
+ - - '>='
129
+ - !ruby/object:Gem::Version
130
+ version: 2.2.0
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ~>
136
+ - !ruby/object:Gem::Version
137
+ version: '2.2'
138
+ - - '>='
139
+ - !ruby/object:Gem::Version
140
+ version: 2.2.0
47
141
  description: A Ruby Usabilla API Gem that will allow you to connect to and use the
48
142
  Usabilla API
49
143
  email: Teirson@gmail.com
@@ -51,7 +145,20 @@ executables: []
51
145
  extensions: []
52
146
  extra_rdoc_files: []
53
147
  files:
148
+ - README.md
54
149
  - lib/usabilla_api.rb
150
+ - lib/usabilla_api/clients/button.rb
151
+ - lib/usabilla_api/clients/campaign.rb
152
+ - lib/usabilla_api/config.rb
153
+ - lib/usabilla_api/convenience.rb
154
+ - lib/usabilla_api/models/button/item.rb
155
+ - lib/usabilla_api/models/campaign/item.rb
156
+ - lib/usabilla_api/models/campaign/statistics.rb
157
+ - lib/usabilla_api/models/campaign_results/item.rb
158
+ - lib/usabilla_api/models/feedback/item.rb
159
+ - lib/usabilla_api/models/response.rb
160
+ - lib/usabilla_api/usabilla_api.rb
161
+ - lib/usabilla_api/version.rb
55
162
  homepage: http://rubygems.org/gems/usabilla_api
56
163
  licenses:
57
164
  - MIT