contactually-api 0.0.1 → 0.0.2
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 +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
|
+
[](https://codeclimate.com/github/railslove/contactually-api)
|
3
4
|
[](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
|