contactually-api 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -3
- data/lib/contactually/accounts.rb +2 -11
- data/lib/contactually/contact_groupings.rb +1 -1
- data/lib/contactually/contacts.rb +5 -13
- data/lib/contactually/contents.rb +3 -11
- data/lib/contactually/groupings.rb +6 -14
- data/lib/contactually/notes.rb +4 -12
- data/lib/contactually/representer/account_representer.rb +9 -7
- data/lib/contactually/representer/contact_representer.rb +42 -40
- data/lib/contactually/representer/content_representer.rb +12 -10
- data/lib/contactually/representer/grouping_representer.rb +24 -22
- data/lib/contactually/representer/grouping_statistic_representer.rb +14 -0
- data/lib/contactually/representer/note_representer.rb +9 -7
- data/lib/contactually/representer/task_representer.rb +15 -13
- data/lib/contactually/tasks.rb +38 -1
- data/lib/contactually/utils.rb +44 -0
- data/lib/contactually/version.rb +1 -1
- data/lib/contactually-api.rb +3 -1
- data/spec/fixtures/tasks_index.json +38 -0
- data/spec/groupings_spec.rb +1 -1
- data/spec/tasks_spec.rb +99 -0
- metadata +24 -21
- data/lib/contactually/representer/grouping_statistics_representer.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee398da691add3f2fe14f48f1bfe6df4fd8ccc03
|
4
|
+
data.tar.gz: 07a3ad39c3145dd57d8ea38157de6a2a5f28c18f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 954b718ce25a9ced2f79a4f9763368d1a6c86630ca0bb0f0aa52f45734d65e31547fc7158c122eba2ea92932ad465b1f4fc024dae7ffb9ef26aaf054fe5f4359
|
7
|
+
data.tar.gz: 57c10868f0545d74c9964713552388dfccef93408ed5bbb480340d9b49b85dbd6672762af1712ad390344d978b2b9b359885107c1d53d8dba4e8df348a4cf078
|
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# Contactually-API
|
2
2
|
|
3
|
+
[![Code Climate](https://codeclimate.com/github/railslove/contactually-api/badges/gpa.svg)](https://codeclimate.com/github/railslove/contactually-api)
|
3
4
|
[![Build
|
4
5
|
Status](https://travis-ci.org/railslove/contactually-api.svg?branch=master)](https://travis-ci.org/railslove/contactually-api)
|
5
6
|
|
6
|
-
|
7
|
+
This is a simple API Wrapper for the contactually API. It is not feature complete, as it does not support all available API endpoints yet, but I guess for most use cases this will be fine. Feel free to contribute!
|
7
8
|
|
8
9
|
## Installation
|
9
10
|
|
@@ -34,22 +35,38 @@ The available configuration options are:
|
|
34
35
|
|
35
36
|
Configuration goes as follows:
|
36
37
|
|
38
|
+
```ruby
|
37
39
|
Contactually.configure do |c|
|
38
40
|
c.api_key = "YOURKEY"
|
39
41
|
c.contactually_url = "URL"
|
40
42
|
end
|
43
|
+
```
|
41
44
|
|
42
45
|
#### How to use the gem
|
43
46
|
|
47
|
+
```ruby
|
44
48
|
contactually = Contactually::API.new
|
45
49
|
contacts = contactually.contacts.index
|
50
|
+
# => [#<Contactually::Contact id=1234, ...>, #<Contactually::Contact id=1235, ...>, ...]
|
46
51
|
notes = contactually.notes.index
|
52
|
+
# => [#<Contactually::Note id=2345, ...>, #<Contactually::Note id=2346, ...>, ...]
|
47
53
|
groupings = contactually.groupings.index
|
54
|
+
# => [#<Contactually::Grouping id=3456, ...>, #<Contactually::Grouping id=3457, ...>, ...]
|
48
55
|
|
49
56
|
contact = { contact: { first_name: 'Jane', last_name: 'Doe', ... } }
|
50
57
|
contactually.contacts.create(contact)
|
51
|
-
|
52
|
-
|
58
|
+
# => #<Contactually::Contact id=9876, first_name='Jane', last_name='Doe', ...>
|
59
|
+
```
|
60
|
+
|
61
|
+
Implemented endpoints are:
|
62
|
+
|
63
|
+
* Accounts
|
64
|
+
* Contact Groupings
|
65
|
+
* Contacts
|
66
|
+
* Contents
|
67
|
+
* Groupings
|
68
|
+
* Notes
|
69
|
+
* Tasks
|
53
70
|
|
54
71
|
The API is documented here: [Contactually API Docs](http://developers.contactually.com/docs/)
|
55
72
|
|
@@ -7,25 +7,16 @@ module Contactually
|
|
7
7
|
|
8
8
|
def index(params = {})
|
9
9
|
hash = @master.call('accounts.json', :get, params)
|
10
|
-
accounts_hash_to_objects(hash)
|
10
|
+
Contactually::Utils.accounts_hash_to_objects(hash)
|
11
11
|
end
|
12
12
|
|
13
13
|
def show(id, params = {})
|
14
14
|
hash = @master.call("accounts/#{id}.json", :get, params)
|
15
|
-
|
15
|
+
Contactually::Utils.build_account(hash)
|
16
16
|
end
|
17
17
|
|
18
18
|
def destroy(id, params = {})
|
19
19
|
@master.call("accounts/#{id}.json", :delete, params)
|
20
20
|
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def accounts_hash_to_objects(hash)
|
25
|
-
hash['accounts'].inject([]) do |arr, account|
|
26
|
-
arr << AccountRepresenter.new(Account.new).from_hash(account)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
21
|
end
|
31
22
|
end
|
@@ -6,7 +6,7 @@ module Contactually
|
|
6
6
|
|
7
7
|
def create(id, params = {})
|
8
8
|
hash = @master.call("contacts/#{id}/groupings.json", :post, params)
|
9
|
-
|
9
|
+
Contactually::Utils.build_grouping(hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
def destroy(id, grouping_id, params = {})
|
@@ -6,7 +6,7 @@ module Contactually
|
|
6
6
|
|
7
7
|
def create(params = {})
|
8
8
|
hash = @master.call('contacts.json', :post, params)
|
9
|
-
|
9
|
+
Contactually::Utils.build_contact(hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
def destroy(id, params = {})
|
@@ -19,12 +19,12 @@ module Contactually
|
|
19
19
|
|
20
20
|
def show(id, params = {})
|
21
21
|
hash = @master.call("contacts/#{id}.json", :get, params)
|
22
|
-
|
22
|
+
Contactually::Utils.build_contact(hash)
|
23
23
|
end
|
24
24
|
|
25
25
|
def merge(params = {})
|
26
26
|
hash = @master.call('contacts/merge.json', :post, params)
|
27
|
-
|
27
|
+
Contactually::Utils.build_contact(hash)
|
28
28
|
end
|
29
29
|
|
30
30
|
def tags(id, params = {})
|
@@ -38,20 +38,12 @@ module Contactually
|
|
38
38
|
|
39
39
|
def index(params = {})
|
40
40
|
hash = @master.call('contacts.json', :get, params)
|
41
|
-
contacts_hash_to_objects(hash)
|
41
|
+
Contactually::Utils.contacts_hash_to_objects(hash)
|
42
42
|
end
|
43
43
|
|
44
44
|
def search(params = {})
|
45
45
|
hash = @master.call('contacts/search.json', :get, params)
|
46
|
-
contacts_hash_to_objects(hash)
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def contacts_hash_to_objects(hash)
|
52
|
-
hash['contacts'].inject([]) do |arr, contact|
|
53
|
-
arr << ContactRepresenter.new(Contact.new).from_hash(contact)
|
54
|
-
end
|
46
|
+
Contactually::Utils.contacts_hash_to_objects(hash)
|
55
47
|
end
|
56
48
|
end
|
57
49
|
end
|
@@ -6,12 +6,12 @@ module Contactually
|
|
6
6
|
|
7
7
|
def create(params = {})
|
8
8
|
hash = @master.call('contents.json', :post, params)
|
9
|
-
|
9
|
+
Contactually::Utils.build_content(hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
def index(params = {})
|
13
13
|
hash = @master.call('contents.json', :get, params)
|
14
|
-
contents_hash_to_objects(hash)
|
14
|
+
Contactually::Utils.contents_hash_to_objects(hash)
|
15
15
|
end
|
16
16
|
|
17
17
|
def destroy(id, params = {})
|
@@ -20,19 +20,11 @@ module Contactually
|
|
20
20
|
|
21
21
|
def show(id, params = {})
|
22
22
|
hash = @master.call("contents/#{id}.json", :get, params)
|
23
|
-
|
23
|
+
Contactually::Utils.build_content(hash)
|
24
24
|
end
|
25
25
|
|
26
26
|
def update(id, params = {})
|
27
27
|
@master.call("contents/#{id}.json", :put, params)
|
28
28
|
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def contents_hash_to_objects(hash)
|
33
|
-
hash['contents'].inject([]) do |arr, content|
|
34
|
-
arr << ContentRepresenter.new(Content.new).from_hash(content)
|
35
|
-
end
|
36
|
-
end
|
37
29
|
end
|
38
30
|
end
|
@@ -6,17 +6,17 @@ module Contactually
|
|
6
6
|
|
7
7
|
def create(params = {})
|
8
8
|
hash = @master.call('groupings.json', :post, params)
|
9
|
-
|
9
|
+
Contactually::Utils.build_grouping(hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
def index(params = {})
|
13
13
|
hash = @master.call('groupings.json', :get, params)
|
14
|
-
groupings_hash_to_objects(hash)
|
14
|
+
Contactually::Utils.groupings_hash_to_objects(hash)
|
15
15
|
end
|
16
16
|
|
17
17
|
def minimal_index(params = {})
|
18
18
|
hash = @master.call('groupings/minimal_index.json', :get, params)
|
19
|
-
|
19
|
+
Contactually::Utils.build_grouping(hash)
|
20
20
|
end
|
21
21
|
|
22
22
|
def destroy(id, params = {})
|
@@ -25,25 +25,17 @@ module Contactually
|
|
25
25
|
|
26
26
|
def show(id, params = {})
|
27
27
|
hash = @master.call("groupings/#{id}.json", :get, params)
|
28
|
-
|
28
|
+
Contactually::Utils.build_grouping(hash)
|
29
29
|
end
|
30
30
|
|
31
31
|
def update(id, params = {})
|
32
32
|
hash = @master.call("groupings/#{id}.json", :put, params)
|
33
|
-
|
33
|
+
Contactually::Utils.build_grouping(hash)
|
34
34
|
end
|
35
35
|
|
36
36
|
def statistics(id, params = {})
|
37
37
|
hash = @master.call("groupings/#{id}/statistics.json", :get, params)
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def groupings_hash_to_objects(hash)
|
44
|
-
hash['groupings'].inject([]) do |arr, grouping|
|
45
|
-
arr << GroupingRepresenter.new(Grouping.new).from_hash(grouping)
|
46
|
-
end
|
38
|
+
Contactually::Utils.build_grouping_statistic(hash)
|
47
39
|
end
|
48
40
|
end
|
49
41
|
end
|
data/lib/contactually/notes.rb
CHANGED
@@ -6,17 +6,17 @@ module Contactually
|
|
6
6
|
|
7
7
|
def index(params = {})
|
8
8
|
hash = @master.call('notes.json', :get, params)
|
9
|
-
notes_hash_to_objects(hash)
|
9
|
+
Contactually::Utils.notes_hash_to_objects(hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
def show(id, params = {})
|
13
13
|
hash = @master.call("notes/#{id}.json", :get, params)
|
14
|
-
|
14
|
+
Contactually::Utils.build_note(hash)
|
15
15
|
end
|
16
16
|
|
17
17
|
def create(params = {})
|
18
18
|
hash = @master.call('notes.json', :post, params)
|
19
|
-
|
19
|
+
Contactually::Utils.build_note(hash)
|
20
20
|
end
|
21
21
|
|
22
22
|
def destroy(id, params = {})
|
@@ -25,15 +25,7 @@ module Contactually
|
|
25
25
|
|
26
26
|
def update(id, params = {})
|
27
27
|
hash = @master.call("notes/#{id}.json", :put, params)
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def notes_hash_to_objects(hash)
|
34
|
-
hash['notes'].inject([]) do |arr, note|
|
35
|
-
arr << NoteRepresenter.new(Note.new).from_hash(note)
|
36
|
-
end
|
28
|
+
Contactually::Utils.build_note(hash)
|
37
29
|
end
|
38
30
|
end
|
39
31
|
end
|
@@ -2,12 +2,14 @@ module Contactually
|
|
2
2
|
class Account < OpenStruct
|
3
3
|
end
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
module Representer
|
6
|
+
class AccountRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :id
|
9
|
+
property :username
|
10
|
+
property :remote_id
|
11
|
+
property :type
|
12
|
+
property :disabled_at
|
13
|
+
end
|
12
14
|
end
|
13
15
|
end
|
@@ -2,45 +2,47 @@ module Contactually
|
|
2
2
|
class Contact < OpenStruct
|
3
3
|
end
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
5
|
+
module Representer
|
6
|
+
class ContactRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :id
|
9
|
+
property :user_id
|
10
|
+
property :first_name
|
11
|
+
property :last_name
|
12
|
+
property :full_name
|
13
|
+
property :initials
|
14
|
+
property :title
|
15
|
+
property :company
|
16
|
+
property :email
|
17
|
+
property :avatar
|
18
|
+
property :avatar_url
|
19
|
+
property :last_contacted
|
20
|
+
property :visible
|
21
|
+
property :twitter
|
22
|
+
property :facebook_url
|
23
|
+
property :linkedin_url
|
24
|
+
property :first_contacted
|
25
|
+
property :created_at
|
26
|
+
property :updated_at
|
27
|
+
property :hits
|
28
|
+
property :team_parent_id
|
29
|
+
property :snoozed_at
|
30
|
+
property :snooze_days
|
31
|
+
property :email_addresses
|
32
|
+
property :tags
|
33
|
+
property :contact_status
|
34
|
+
property :team_last_contacted
|
35
|
+
property :team_last_contacted_by
|
36
|
+
property :phone_numbers
|
37
|
+
property :addresses
|
38
|
+
property :social_profiles
|
39
|
+
property :websites
|
40
|
+
property :custom_fields
|
41
|
+
property :sent
|
42
|
+
property :received
|
43
|
+
property :link
|
44
|
+
property :content
|
45
|
+
collection :groupings, extend: GroupingRepresenter, class: Grouping
|
46
|
+
end
|
45
47
|
end
|
46
48
|
end
|
@@ -2,15 +2,17 @@ module Contactually
|
|
2
2
|
class Content < OpenStruct
|
3
3
|
end
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
module Representer
|
6
|
+
class ContentRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :id
|
9
|
+
property :user_id
|
10
|
+
property :url
|
11
|
+
property :title
|
12
|
+
property :description
|
13
|
+
property :article
|
14
|
+
property :original_content_id
|
15
|
+
collection :groupings, extend: GroupingRepresenter, class: Grouping
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
@@ -2,27 +2,29 @@ module Contactually
|
|
2
2
|
class Grouping < OpenStruct
|
3
3
|
end
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
5
|
+
module Representer
|
6
|
+
class GroupingRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :id
|
9
|
+
property :type
|
10
|
+
property :name
|
11
|
+
property :stub
|
12
|
+
property :user_id
|
13
|
+
property :domain_id
|
14
|
+
property :editable
|
15
|
+
property :conversable
|
16
|
+
property :locked
|
17
|
+
property :derived_from_id
|
18
|
+
property :created_at
|
19
|
+
property :updated_at
|
20
|
+
property :has_followups
|
21
|
+
property :num_days_to_followup
|
22
|
+
property :program_id
|
23
|
+
property :objective
|
24
|
+
property :sort_order
|
25
|
+
property :accounts
|
26
|
+
property :number_of_contacts
|
27
|
+
property :goal
|
28
|
+
end
|
27
29
|
end
|
28
30
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Contactually
|
2
|
+
class GroupingStatistic < OpenStruct
|
3
|
+
end
|
4
|
+
|
5
|
+
module Representer
|
6
|
+
class GroupingStatisticRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :messages_sent
|
9
|
+
property :messages_received
|
10
|
+
property :status
|
11
|
+
collection :contacts, extend: ContactRepresenter, class: Contact
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -2,12 +2,14 @@ module Contactually
|
|
2
2
|
class Note < OpenStruct
|
3
3
|
end
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
module Representer
|
6
|
+
class NoteRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :id
|
9
|
+
property :body
|
10
|
+
property :contact_id
|
11
|
+
property :timestamp
|
12
|
+
property :user_id
|
13
|
+
end
|
12
14
|
end
|
13
15
|
end
|
@@ -2,18 +2,20 @@ module Contactually
|
|
2
2
|
class Task < OpenStruct
|
3
3
|
end
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
5
|
+
module Representer
|
6
|
+
class TaskRepresenter < Roar::Decorator
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
property :id
|
9
|
+
property :title
|
10
|
+
property :due_date
|
11
|
+
property :completed_at
|
12
|
+
property :deleted_at
|
13
|
+
property :is_follow_up
|
14
|
+
property :last_contacted
|
15
|
+
property :contact_id
|
16
|
+
property :ignored
|
17
|
+
property :completed_via
|
18
|
+
property :approval_data
|
19
|
+
end
|
18
20
|
end
|
19
21
|
end
|
data/lib/contactually/tasks.rb
CHANGED
@@ -6,7 +6,44 @@ module Contactually
|
|
6
6
|
|
7
7
|
def show(id, params = {})
|
8
8
|
hash = @master.call("tasks/#{id}.json", :get, params)
|
9
|
-
|
9
|
+
Contactually::Utils.build_task(hash)
|
10
|
+
end
|
11
|
+
|
12
|
+
def complete(id, params = {})
|
13
|
+
hash = @master.call("tasks/#{id}/complete.json", :post, params)
|
14
|
+
Contactually::Utils.build_task(hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
def create(params = {})
|
18
|
+
hash = @master.call('tasks.json', :post, params)
|
19
|
+
Contactually::Utils.build_task(hash)
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy(id, params = {})
|
23
|
+
@master.call("tasks/#{id}.json", :delete, params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def generate_followups(params = {})
|
27
|
+
@master.call('tasks/generate_followups.json', :post, params)
|
28
|
+
end
|
29
|
+
|
30
|
+
def ignore(id, params = {})
|
31
|
+
hash = @master.call("tasks/#{id}/ignore.json", :post, params)
|
32
|
+
Contactually::Utils.build_task(hash)
|
33
|
+
end
|
34
|
+
|
35
|
+
def index(params = {})
|
36
|
+
hash = @master.call('tasks.json', :get, params)
|
37
|
+
Contactually::Utils.tasks_hash_to_objects(hash)
|
38
|
+
end
|
39
|
+
|
40
|
+
def snooze(id, params = {})
|
41
|
+
@master.call("tasks/#{id}/snooze.json", :post, params)
|
42
|
+
end
|
43
|
+
|
44
|
+
def update(id, params = {})
|
45
|
+
hash = @master.call("tasks/#{id}.json", :put, params)
|
46
|
+
Contactually::Utils.build_task(hash)
|
10
47
|
end
|
11
48
|
end
|
12
49
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Contactually
|
2
|
+
class Utils
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def method_missing(m, *args)
|
6
|
+
case m
|
7
|
+
when /^(\w*)_hash_to_objects/ then
|
8
|
+
hash_to_objects($1, *args)
|
9
|
+
when /^build_(\w*)/ then
|
10
|
+
build_object($1, *args)
|
11
|
+
else
|
12
|
+
super(m, *args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def respond_to?(m, *args)
|
17
|
+
case m
|
18
|
+
when /^(\w*)_hash_to_objects/ then
|
19
|
+
true
|
20
|
+
when /^build_(\w*)/ then
|
21
|
+
true
|
22
|
+
else
|
23
|
+
super(m, *args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def hash_to_objects(type, hash)
|
30
|
+
representer_class = "Contactually::Representer::#{type.classify}Representer".constantize
|
31
|
+
object_class = "Contactually::#{type.classify}".constantize
|
32
|
+
hash[type].inject([]) do |arr, obj|
|
33
|
+
arr << representer_class.new(object_class.new).from_hash(obj)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_object(type, hash)
|
38
|
+
representer_class = "Contactually::Representer::#{type.classify}Representer".constantize
|
39
|
+
object_class = "Contactually::#{type.classify}".constantize
|
40
|
+
representer_class.new(object_class.new).from_hash(hash)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/contactually/version.rb
CHANGED
data/lib/contactually-api.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/configurable'
|
2
|
+
require 'active_support/inflector'
|
2
3
|
require 'faraday'
|
3
4
|
require 'json'
|
4
5
|
require 'roar/decorator'
|
@@ -6,6 +7,7 @@ require 'roar/representer/json'
|
|
6
7
|
|
7
8
|
require 'contactually/version'
|
8
9
|
require 'contactually/errors'
|
10
|
+
require 'contactually/utils'
|
9
11
|
|
10
12
|
require 'contactually/middleware/error_detector'
|
11
13
|
|
@@ -13,7 +15,7 @@ require 'contactually/representer/grouping_representer'
|
|
13
15
|
require 'contactually/representer/account_representer'
|
14
16
|
require 'contactually/representer/contact_representer'
|
15
17
|
require 'contactually/representer/content_representer'
|
16
|
-
require 'contactually/representer/
|
18
|
+
require 'contactually/representer/grouping_statistic_representer'
|
17
19
|
require 'contactually/representer/note_representer'
|
18
20
|
require 'contactually/representer/task_representer'
|
19
21
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
{
|
2
|
+
"count": 1,
|
3
|
+
"total_count": 1,
|
4
|
+
"tasks": [
|
5
|
+
{
|
6
|
+
"id": 123123,
|
7
|
+
"title": "Lolokopter",
|
8
|
+
"due_date": "2015-10-01T00:00:00Z",
|
9
|
+
"interaction_type": null,
|
10
|
+
"completed_at": null,
|
11
|
+
"deleted_at": null,
|
12
|
+
"is_follow_up": false,
|
13
|
+
"last_contacted": null,
|
14
|
+
"contact_id": 1234,
|
15
|
+
"ignored": null,
|
16
|
+
"completed_via": null,
|
17
|
+
"user_id": 12345,
|
18
|
+
"approval_data": {
|
19
|
+
"approval_type": false,
|
20
|
+
"approval_text": false,
|
21
|
+
"approval_url": false,
|
22
|
+
"approval_template": false,
|
23
|
+
"approval_account_id": false
|
24
|
+
},
|
25
|
+
"contact_program_step_id": null,
|
26
|
+
"unresponded_followup_id": null,
|
27
|
+
"user_bucket": {
|
28
|
+
"id": 12312,
|
29
|
+
"name": "Colleague"
|
30
|
+
}
|
31
|
+
}
|
32
|
+
],
|
33
|
+
"weekly_progress": [
|
34
|
+
0,
|
35
|
+
7
|
36
|
+
],
|
37
|
+
"on_due_date": true
|
38
|
+
}
|
data/spec/groupings_spec.rb
CHANGED
@@ -94,7 +94,7 @@ describe Contactually::Groupings do
|
|
94
94
|
it 'returns statistics object' do
|
95
95
|
json = File.read(File.join(File.dirname(__FILE__), "fixtures/groupings_statistics.json"))
|
96
96
|
allow(@master).to receive(:call).with('groupings/1/statistics.json', :get, { foo: :bar }).and_return(JSON.load(json))
|
97
|
-
expect(subject.statistics(1, { foo: :bar })).to be_kind_of Contactually::
|
97
|
+
expect(subject.statistics(1, { foo: :bar })).to be_kind_of Contactually::GroupingStatistic
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
data/spec/tasks_spec.rb
CHANGED
@@ -33,4 +33,103 @@ describe Contactually::Tasks do
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
describe '#complete' do
|
37
|
+
it 'calls the api with correct params' do
|
38
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
39
|
+
allow(@master).to receive(:call).with('tasks/1/complete.json', :post, { foo: :bar }).and_return(JSON.load(json))
|
40
|
+
subject.complete(1, { foo: :bar })
|
41
|
+
expect(@master).to have_received(:call)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns a task' do
|
45
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
46
|
+
allow(@master).to receive(:call).with('tasks/1/complete.json', :post, { foo: :bar }).and_return(JSON.load(json))
|
47
|
+
expect(subject.complete(1, { foo: :bar })).to be_kind_of Contactually::Task
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#create' do
|
52
|
+
it 'calls the api with correct params' do
|
53
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
54
|
+
allow(@master).to receive(:call).with('tasks.json', :post, { foo: :bar }).and_return(JSON.load(json))
|
55
|
+
subject.create({ foo: :bar })
|
56
|
+
expect(@master).to have_received(:call)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'returns a new task' do
|
60
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
61
|
+
allow(@master).to receive(:call).with('tasks.json', :post, { foo: :bar }).and_return(JSON.load(json))
|
62
|
+
expect(subject.create({ foo: :bar })).to be_kind_of Contactually::Task
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#update' do
|
67
|
+
it 'calls the api with correct params' do
|
68
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
69
|
+
allow(@master).to receive(:call).with('tasks/1.json', :put, { foo: :bar }).and_return(JSON.load(json))
|
70
|
+
subject.update(1, { foo: :bar })
|
71
|
+
expect(@master).to have_received(:call)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'returns a new task' do
|
75
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
76
|
+
allow(@master).to receive(:call).with('tasks/1.json', :put, { foo: :bar }).and_return(JSON.load(json))
|
77
|
+
expect(subject.update(1, { foo: :bar })).to be_kind_of Contactually::Task
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#destroy' do
|
82
|
+
it 'calls the api with correct params' do
|
83
|
+
allow(@master).to receive(:call).with('tasks/1.json', :delete, { foo: :bar }).and_return(JSON.load('{ "deleted": true }'))
|
84
|
+
subject.destroy(1, { foo: :bar })
|
85
|
+
expect(@master).to have_received(:call)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#generate_followups' do
|
90
|
+
it 'calls the api with correct params' do
|
91
|
+
allow(@master).to receive(:call).with('tasks/generate_followups.json', :post, { foo: :bar }).and_return(JSON.load('{ "deleted": true }'))
|
92
|
+
subject.generate_followups({ foo: :bar })
|
93
|
+
expect(@master).to have_received(:call)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#generate_followups' do
|
98
|
+
it 'calls the api with correct params' do
|
99
|
+
allow(@master).to receive(:call).with('tasks/1/snooze.json', :post, { foo: :bar }).and_return(JSON.load('{ "snooze": true }'))
|
100
|
+
subject.snooze(1, { foo: :bar })
|
101
|
+
expect(@master).to have_received(:call)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#ignore' do
|
106
|
+
it 'calls the api with correct params' do
|
107
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
108
|
+
allow(@master).to receive(:call).with('tasks/1/ignore.json', :post, { foo: :bar }).and_return(JSON.load(json))
|
109
|
+
subject.ignore(1, { foo: :bar })
|
110
|
+
expect(@master).to have_received(:call)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'returns a new task' do
|
114
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/task.json"))
|
115
|
+
allow(@master).to receive(:call).with('tasks/1/ignore.json', :post, { foo: :bar }).and_return(JSON.load(json))
|
116
|
+
expect(subject.ignore(1, { foo: :bar })).to be_kind_of Contactually::Task
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe '#index' do
|
121
|
+
it 'calls the api with correct params' do
|
122
|
+
allow(@master).to receive(:call).with('tasks.json', :get, { foo: :bar }).and_return({ 'tasks' => [] })
|
123
|
+
subject.index({ foo: :bar })
|
124
|
+
expect(@master).to have_received(:call)
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'returns tasks from json response' do
|
128
|
+
json = File.read(File.join(File.dirname(__FILE__),"fixtures/tasks_index.json"))
|
129
|
+
allow(@master).to receive(:call).with('tasks.json', :get, {}).and_return(JSON.load(json))
|
130
|
+
expect(subject.index({})).to be_kind_of Array
|
131
|
+
expect(subject.index({})[0]).to be_kind_of Contactually::Task
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
36
135
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: contactually-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johannes Heck
|
@@ -16,84 +16,84 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 4.1
|
19
|
+
version: '4.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 4.1
|
26
|
+
version: '4.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: faraday
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9
|
33
|
+
version: '0.9'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.9
|
40
|
+
version: '0.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: roar
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.12
|
47
|
+
version: '0.12'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.12
|
54
|
+
version: '0.12'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry-byebug
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
61
|
+
version: '2.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
68
|
+
version: '2.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '10'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '10'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '3'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '3'
|
97
97
|
description: This is a simple wrapper for the contactually api. Try it!
|
98
98
|
email:
|
99
99
|
- johannes@railslove.com
|
@@ -118,10 +118,11 @@ files:
|
|
118
118
|
- lib/contactually/representer/contact_representer.rb
|
119
119
|
- lib/contactually/representer/content_representer.rb
|
120
120
|
- lib/contactually/representer/grouping_representer.rb
|
121
|
-
- lib/contactually/representer/
|
121
|
+
- lib/contactually/representer/grouping_statistic_representer.rb
|
122
122
|
- lib/contactually/representer/note_representer.rb
|
123
123
|
- lib/contactually/representer/task_representer.rb
|
124
124
|
- lib/contactually/tasks.rb
|
125
|
+
- lib/contactually/utils.rb
|
125
126
|
- lib/contactually/version.rb
|
126
127
|
- spec/accounts_spec.rb
|
127
128
|
- spec/api_spec.rb
|
@@ -141,6 +142,7 @@ files:
|
|
141
142
|
- spec/fixtures/note_destroy.json
|
142
143
|
- spec/fixtures/notes_index.json
|
143
144
|
- spec/fixtures/task.json
|
145
|
+
- spec/fixtures/tasks_index.json
|
144
146
|
- spec/groupings_spec.rb
|
145
147
|
- spec/notes_spec.rb
|
146
148
|
- spec/spec_helper.rb
|
@@ -157,7 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
157
159
|
requirements:
|
158
160
|
- - ">="
|
159
161
|
- !ruby/object:Gem::Version
|
160
|
-
version: '0'
|
162
|
+
version: '2.0'
|
161
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
164
|
requirements:
|
163
165
|
- - ">="
|
@@ -188,6 +190,7 @@ test_files:
|
|
188
190
|
- spec/fixtures/note_destroy.json
|
189
191
|
- spec/fixtures/notes_index.json
|
190
192
|
- spec/fixtures/task.json
|
193
|
+
- spec/fixtures/tasks_index.json
|
191
194
|
- spec/groupings_spec.rb
|
192
195
|
- spec/notes_spec.rb
|
193
196
|
- spec/spec_helper.rb
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module Contactually
|
2
|
-
class GroupingStatistics < OpenStruct
|
3
|
-
end
|
4
|
-
|
5
|
-
class GroupingStatisticsRepresenter < Roar::Decorator
|
6
|
-
include Roar::Representer::JSON
|
7
|
-
property :messages_sent
|
8
|
-
property :messages_received
|
9
|
-
property :status
|
10
|
-
collection :contacts, extend: ContactRepresenter, class: Contact
|
11
|
-
end
|
12
|
-
end
|