delighted 1.0.0.beta → 1.0.0.beta2
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 +4 -4
- data/README.md +1 -1
- data/lib/delighted.rb +16 -2
- data/lib/delighted/client.rb +1 -9
- data/lib/delighted/operations/all.rb +4 -8
- data/lib/delighted/operations/create.rb +5 -4
- data/lib/delighted/operations/retrieve.rb +7 -9
- data/lib/delighted/resource.rb +1 -21
- data/lib/delighted/resources/metrics.rb +0 -1
- data/lib/delighted/resources/person.rb +0 -1
- data/lib/delighted/resources/survey_responses.rb +0 -1
- data/lib/delighted/utils.rb +17 -1
- data/lib/delighted/version.rb +1 -1
- data/test/delighted_test.rb +4 -8
- data/test/test_helper.rb +5 -0
- metadata +2 -4
- data/lib/delighted/operations.rb +0 -8
- data/lib/delighted/resource_interface.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3328aa5e8d5da9e0aa18d14b249638e8fa18fbab
|
4
|
+
data.tar.gz: ed423baff436f425bdbc72a531bd337ae890b84a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f63f19f6995a497ff70d0cd0265cfaef551cc4617a2640ff88e2803095c0f71b35f1609fc8cb91759920335f61abff8d608ef0d78f3e18bb4f5bb13fb23272a5
|
7
|
+
data.tar.gz: cc0421d791025dfcc08564b5efcc1bc46095790cc7eae3faee3812b9e11a2e34ba66eb85b9e8a0831787535b0f55847070e1f99fcfa63ba0bfcba758bf492517
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Delighted API client for Ruby [](https://travis-ci.org/delighted/delighted-ruby)
|
2
2
|
|
3
3
|
|
4
|
-
Official Ruby client for the [Delighted
|
4
|
+
Official Ruby client for the [Delighted](https://delightedapp.com) API.
|
5
5
|
|
6
6
|
For installation and usage instructions, please [sign in to your Delighted account](https://delightedapp.com/signin) and follow the API documentation under Settings.
|
7
7
|
|
data/lib/delighted.rb
CHANGED
@@ -3,13 +3,13 @@ require 'uri'
|
|
3
3
|
require 'cgi'
|
4
4
|
require 'multi_json'
|
5
5
|
require 'set'
|
6
|
+
require 'thread'
|
6
7
|
|
7
8
|
require 'delighted/utils'
|
8
9
|
require 'delighted/json'
|
9
10
|
|
10
11
|
require 'delighted/enumerable_resource_collection'
|
11
12
|
require 'delighted/resource'
|
12
|
-
require 'delighted/operations'
|
13
13
|
require 'delighted/operations/all'
|
14
14
|
require 'delighted/operations/create'
|
15
15
|
require 'delighted/operations/retrieve'
|
@@ -19,7 +19,21 @@ require 'delighted/resources/person'
|
|
19
19
|
require 'delighted/resources/survey_responses'
|
20
20
|
|
21
21
|
require 'delighted/errors'
|
22
|
-
require 'delighted/resource_interface'
|
23
22
|
require 'delighted/http_response'
|
24
23
|
require 'delighted/http_adapter'
|
25
24
|
require 'delighted/client'
|
25
|
+
|
26
|
+
module Delighted
|
27
|
+
@mutex = Mutex.new
|
28
|
+
|
29
|
+
class << self
|
30
|
+
attr_accessor :api_key, :api_base_url, :http_adapter
|
31
|
+
attr_writer :shared_client
|
32
|
+
|
33
|
+
def shared_client
|
34
|
+
@mutex.synchronize do
|
35
|
+
@shared_client ||= Client.new(:api_key => api_key, :api_base_url => api_base_url, :http_adapter => http_adapter)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/delighted/client.rb
CHANGED
@@ -4,19 +4,11 @@ module Delighted
|
|
4
4
|
DEFAULT_HTTP_ADAPTER = HTTPAdapter.new
|
5
5
|
|
6
6
|
def initialize(opts = {})
|
7
|
-
@api_key = opts[:api_key] or raise ArgumentError, "You must
|
7
|
+
@api_key = opts[:api_key] or raise ArgumentError, "You must provide an API key by setting Delighted.api_key = '123abc' or passing { :api_key => '123abc' } when instantiating Delighted::Client.new"
|
8
8
|
@api_base_url = opts[:api_base_url] || DEFAULT_API_BASE_URL
|
9
9
|
@http_adapter = opts[:http_adapter] || DEFAULT_HTTP_ADAPTER
|
10
10
|
end
|
11
11
|
|
12
|
-
Resource.resources.each do |resource|
|
13
|
-
class_eval <<-END, __FILE__, __LINE__
|
14
|
-
def #{resource.interface_name}
|
15
|
-
@#{resource.interface_name} ||= ResourceInterface.new(self, #{resource.name})
|
16
|
-
end
|
17
|
-
END
|
18
|
-
end
|
19
|
-
|
20
12
|
def get_json(path, params = {})
|
21
13
|
headers = default_headers.dup.merge('Accept' => 'application/json')
|
22
14
|
|
@@ -2,20 +2,16 @@ module Delighted
|
|
2
2
|
module Operations
|
3
3
|
module All
|
4
4
|
def self.included(klass)
|
5
|
-
klass.extend(
|
6
|
-
Operations.add_operations(klass, OperationClassMethods)
|
5
|
+
klass.extend(ClassMethods)
|
7
6
|
end
|
8
7
|
|
9
|
-
module
|
10
|
-
def all(
|
8
|
+
module ClassMethods
|
9
|
+
def all(opts = {}, client = Delighted.shared_client)
|
10
|
+
opts = Utils.serialize_values(opts)
|
11
11
|
json = client.get_json(path, opts)
|
12
12
|
EnumerableResourceCollection.new(json.map { |attributes| new(attributes) })
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
16
|
-
module AuxiliaryClassMethods
|
17
|
-
# pagination, enumerable stuff etc.
|
18
|
-
end
|
19
15
|
end
|
20
16
|
end
|
21
17
|
end
|
@@ -2,12 +2,13 @@ module Delighted
|
|
2
2
|
module Operations
|
3
3
|
module Create
|
4
4
|
def self.included(klass)
|
5
|
-
|
5
|
+
klass.extend(ClassMethods)
|
6
6
|
end
|
7
7
|
|
8
|
-
module
|
9
|
-
def create(
|
10
|
-
params = Utils.
|
8
|
+
module ClassMethods
|
9
|
+
def create(attributes = {}, client = Delighted.shared_client)
|
10
|
+
params = Utils.hash_without_key(attributes, :id)
|
11
|
+
params = Utils.serialize_values(params)
|
11
12
|
json = client.post_json(path, params)
|
12
13
|
new(json)
|
13
14
|
end
|
@@ -3,22 +3,19 @@ module Delighted
|
|
3
3
|
module Retrieve
|
4
4
|
def self.included(klass)
|
5
5
|
if klass.singleton_resource?
|
6
|
-
|
6
|
+
klass.extend(Singleton::ClassMethods)
|
7
7
|
else
|
8
|
-
klass.extend(Pluralton::
|
9
|
-
Operations.add_operations(klass, Pluralton::OperationClassMethods)
|
8
|
+
klass.extend(Pluralton::ClassMethods)
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
13
12
|
module Pluralton
|
14
|
-
module
|
15
|
-
def retrieve(
|
13
|
+
module ClassMethods
|
14
|
+
def retrieve(id, client = Delighted.shared_client)
|
16
15
|
json = client.get_json(path(id))
|
17
16
|
new(json)
|
18
17
|
end
|
19
|
-
end
|
20
18
|
|
21
|
-
module AuxiliaryClassMethods
|
22
19
|
def path(id = nil)
|
23
20
|
id ? "#{@path}/#{id}" : @path
|
24
21
|
end
|
@@ -26,8 +23,9 @@ module Delighted
|
|
26
23
|
end
|
27
24
|
|
28
25
|
module Singleton
|
29
|
-
module
|
30
|
-
def retrieve(
|
26
|
+
module ClassMethods
|
27
|
+
def retrieve(opts = {}, client = Delighted.shared_client)
|
28
|
+
opts = Utils.serialize_values(opts)
|
31
29
|
json = client.get_json(path, opts)
|
32
30
|
new(json)
|
33
31
|
end
|
data/lib/delighted/resource.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
module Delighted
|
2
2
|
class Resource
|
3
3
|
class << self
|
4
|
-
def interface_name=(interface_name)
|
5
|
-
@interface_name = interface_name
|
6
|
-
end
|
7
|
-
|
8
|
-
def interface_name
|
9
|
-
@interface_name
|
10
|
-
end
|
11
|
-
|
12
4
|
def path=(path)
|
13
5
|
@path = path
|
14
6
|
end
|
@@ -24,18 +16,6 @@ module Delighted
|
|
24
16
|
def singleton_resource?
|
25
17
|
!!@singleton_resource
|
26
18
|
end
|
27
|
-
|
28
|
-
def operations
|
29
|
-
@operations ||= Set.new
|
30
|
-
end
|
31
|
-
|
32
|
-
def resources
|
33
|
-
@resources ||= Set.new
|
34
|
-
end
|
35
|
-
|
36
|
-
def inherited(klass)
|
37
|
-
resources << klass
|
38
|
-
end
|
39
19
|
end
|
40
20
|
|
41
21
|
undef :id if method_defined?(:id)
|
@@ -45,7 +25,7 @@ module Delighted
|
|
45
25
|
def initialize(attributes = {})
|
46
26
|
@id = attributes[:id]
|
47
27
|
define_id_reader if @id
|
48
|
-
@attributes = Utils.
|
28
|
+
@attributes = Utils.hash_without_key(attributes, :id)
|
49
29
|
define_attribute_accessors(@attributes.keys)
|
50
30
|
end
|
51
31
|
|
data/lib/delighted/utils.rb
CHANGED
@@ -4,7 +4,7 @@ module Delighted
|
|
4
4
|
class << object; self; end
|
5
5
|
end
|
6
6
|
|
7
|
-
def self.
|
7
|
+
def self.hash_without_key(hash, key)
|
8
8
|
hash.reject { |k,v| k == key }.inject({}) { |memo,(k,v)| memo[k] = v; memo }
|
9
9
|
end
|
10
10
|
|
@@ -38,6 +38,22 @@ module Delighted
|
|
38
38
|
object
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
def self.serialize_values(object)
|
43
|
+
case object
|
44
|
+
when Time, Date
|
45
|
+
object.to_i
|
46
|
+
when Hash
|
47
|
+
object.inject({}) { |memo,(k,v)|
|
48
|
+
memo[k] = serialize_values(v)
|
49
|
+
memo
|
50
|
+
}
|
51
|
+
when Array
|
52
|
+
object.map { |v| serialize_values(v) }
|
53
|
+
else
|
54
|
+
object
|
55
|
+
end
|
56
|
+
end
|
41
57
|
end
|
42
58
|
end
|
43
59
|
|
data/lib/delighted/version.rb
CHANGED
data/test/delighted_test.rb
CHANGED
@@ -14,8 +14,7 @@ class Delighted::MetricsTest < Delighted::TestCase
|
|
14
14
|
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ :nps => 10 }))
|
15
15
|
mock_http_adapter.expects(:request).with(:get, uri, headers).once.returns(response)
|
16
16
|
|
17
|
-
|
18
|
-
metrics = client.metrics.retrieve
|
17
|
+
metrics = Delighted::Metrics.retrieve
|
19
18
|
assert_kind_of Delighted::Metrics, metrics
|
20
19
|
assert_equal({ :nps => 10 }, metrics.to_hash)
|
21
20
|
assert_equal 10, metrics.nps
|
@@ -31,8 +30,7 @@ class Delighted::PeopleTest < Delighted::TestCase
|
|
31
30
|
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ :id => '123', :email => 'foo@bar.com' }))
|
32
31
|
mock_http_adapter.expects(:request).with(:post, uri, headers, data).once.returns(response)
|
33
32
|
|
34
|
-
|
35
|
-
person = client.people.create(:email => 'foo@bar.com')
|
33
|
+
person = Delighted::Person.create(:email => 'foo@bar.com')
|
36
34
|
assert_kind_of Delighted::Person, person
|
37
35
|
assert_equal({ :email => 'foo@bar.com' }, person.to_hash)
|
38
36
|
assert_equal 'foo@bar.com', person.email
|
@@ -48,8 +46,7 @@ class Delighted::SurveyResponseTest < Delighted::TestCase
|
|
48
46
|
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ :id => '456', :person => '123', :score => 10 }))
|
49
47
|
mock_http_adapter.expects(:request).with(:post, uri, headers, data).once.returns(response)
|
50
48
|
|
51
|
-
|
52
|
-
survey_response = client.survey_responses.create(:person => '123', :score => 10)
|
49
|
+
survey_response = Delighted::SurveyResponse.create(:person => '123', :score => 10)
|
53
50
|
assert_kind_of Delighted::SurveyResponse, survey_response
|
54
51
|
assert_equal({ :person => '123', :score => 10 }, survey_response.to_hash)
|
55
52
|
assert_equal '123', survey_response.person
|
@@ -63,8 +60,7 @@ class Delighted::SurveyResponseTest < Delighted::TestCase
|
|
63
60
|
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump([{ :id => '123', :comment => 'One' }, { :id => '456', :comment => 'Two' }]))
|
64
61
|
mock_http_adapter.expects(:request).with(:get, uri, headers).once.returns(response)
|
65
62
|
|
66
|
-
|
67
|
-
survey_responses = client.survey_responses.all
|
63
|
+
survey_responses = Delighted::SurveyResponse.all
|
68
64
|
assert_kind_of Delighted::EnumerableResourceCollection, survey_responses
|
69
65
|
assert_kind_of Delighted::SurveyResponse, survey_responses[0]
|
70
66
|
assert_equal({ :comment => 'One' }, survey_responses[0].to_hash)
|
data/test/test_helper.rb
CHANGED
@@ -5,6 +5,11 @@ require 'mocha/setup'
|
|
5
5
|
class Delighted::TestCase < Minitest::Test
|
6
6
|
include Mocha
|
7
7
|
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
Delighted.shared_client = Delighted::Client.new(:api_key => '123abc', :http_adapter => mock_http_adapter)
|
11
|
+
end
|
12
|
+
|
8
13
|
def mock_http_adapter
|
9
14
|
@mock ||= mock
|
10
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delighted
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Dodwell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -87,12 +87,10 @@ files:
|
|
87
87
|
- lib/delighted/http_adapter.rb
|
88
88
|
- lib/delighted/http_response.rb
|
89
89
|
- lib/delighted/json.rb
|
90
|
-
- lib/delighted/operations.rb
|
91
90
|
- lib/delighted/operations/all.rb
|
92
91
|
- lib/delighted/operations/create.rb
|
93
92
|
- lib/delighted/operations/retrieve.rb
|
94
93
|
- lib/delighted/resource.rb
|
95
|
-
- lib/delighted/resource_interface.rb
|
96
94
|
- lib/delighted/resources/metrics.rb
|
97
95
|
- lib/delighted/resources/person.rb
|
98
96
|
- lib/delighted/resources/survey_responses.rb
|
data/lib/delighted/operations.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Delighted
|
2
|
-
class ResourceInterface
|
3
|
-
def initialize(client, resource)
|
4
|
-
@resource = resource # more helpful inspect
|
5
|
-
|
6
|
-
Utils.eigenclass(self).instance_eval do
|
7
|
-
resource.operations.each do |operation|
|
8
|
-
define_method(operation) do |*args, &block|
|
9
|
-
resource.send(operation, *args.unshift(client), &block)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_s
|
16
|
-
inspect
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|