usabilla_api 0.1.0 → 0.1.1

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