ractive_campaign 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -4
- data/README.md +44 -7
- data/lib/active_campaign/api_attributes.rb +6 -17
- data/lib/active_campaign/api_http.rb +7 -1
- data/lib/active_campaign/models/account.rb +7 -0
- data/lib/active_campaign/models/address.rb +7 -0
- data/lib/active_campaign/models/contact.rb +41 -28
- data/lib/active_campaign/models/contact_tag.rb +35 -2
- data/lib/active_campaign/models/model.rb +12 -8
- data/lib/active_campaign/models/note.rb +7 -0
- data/lib/active_campaign/models/tag.rb +1 -7
- data/lib/active_campaign/version.rb +1 -1
- data/lib/active_campaign.rb +0 -1
- metadata +5 -37
- data/lib/active_campaign/api_errors.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1f97cdac78234978c3b5e8d87359883ba8844d646fd7ed2d0c41a50168537f4
|
4
|
+
data.tar.gz: 55f1c00eb4a214570eb4a9d97c43e62e0d396f725769b81a62f096d111902315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a86d70655730f310016ba26ea518d0e53f461479de71cd9dd72e214c07c72b86983ed499b641eb3cb866d28724bdd88513464442e5cdd4244d5f076ac1fa7c86
|
7
|
+
data.tar.gz: 5b76063e260e6df6d49854111b74f4192352d3ed2b0c3d81326644519510d64194def26f22da60bd8661966a78be0d83155288bc124d7a006d70e8dc8e0a6ead
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ractive_campaign (0.1.
|
4
|
+
ractive_campaign (0.1.1)
|
5
5
|
activemodel (~> 6.1.4)
|
6
|
-
activesupport (~> 6.1.4)
|
7
6
|
dry-configurable (~> 0.7.0)
|
8
7
|
faraday (~> 1.8.0)
|
9
8
|
faraday_middleware (~> 1.2.0)
|
10
|
-
oj (>= 3.0, < 4.0)
|
11
9
|
|
12
10
|
GEM
|
13
11
|
remote: https://rubygems.org/
|
@@ -62,7 +60,6 @@ GEM
|
|
62
60
|
method_source (1.0.0)
|
63
61
|
minitest (5.14.4)
|
64
62
|
multipart-post (2.1.1)
|
65
|
-
oj (3.13.9)
|
66
63
|
parallel (1.21.0)
|
67
64
|
parser (3.0.2.0)
|
68
65
|
ast (~> 2.4.1)
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# RactiveCampaign
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Simple wrapper for ActiveCampaign API v3
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,13 +20,52 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
### Config
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# config/initializers/ractive_campaign.rb
|
27
|
+
|
28
|
+
ActiveCampaign.configure do |config|
|
29
|
+
config.api_url = ENV["AC_API_URL"] # ex.: https://mystartup.api-us1.com/api/3
|
30
|
+
config.api_key = ENV["AC_API_KEY"]
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
### Examples
|
35
|
+
|
36
|
+
#### Contact
|
26
37
|
|
27
|
-
|
38
|
+
```ruby
|
39
|
+
# new
|
40
|
+
harry = ActiveCampaign::Contact.new firstName: "Harry", lastName: "Potter", email: "potter.hurray@hogwash.com"
|
41
|
+
harry.save
|
28
42
|
|
29
|
-
|
43
|
+
# create
|
44
|
+
hermione = ActiveCampaign::Contact.new firstName: "Hermione", lastName: "Granger", email: "mione@drtooth.com"
|
45
|
+
|
46
|
+
# update
|
47
|
+
ron = ActiveCampaign::Contact.create email: "ron1988@hogwash.com", lastName: "Weasley"
|
48
|
+
ron.firstName = "Ron"
|
49
|
+
ron.save
|
50
|
+
```
|
30
51
|
|
31
|
-
|
52
|
+
#### Tag
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
ActiveCampaign::Contact.create tag: "hogwarts"
|
56
|
+
```
|
57
|
+
|
58
|
+
#### Contact tags
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
harry = ActiveCampaign::Contact.find_by email: "potter.hurray@hogwash.com"
|
62
|
+
|
63
|
+
# add a contact tag
|
64
|
+
harry.add_tag "hogwargs"
|
65
|
+
|
66
|
+
# remove a tag
|
67
|
+
harry.remove_tag "hogwarts"
|
68
|
+
```
|
32
69
|
|
33
70
|
## Contributing
|
34
71
|
|
@@ -4,20 +4,6 @@ module ActiveCampaign
|
|
4
4
|
module Attributes # :nodoc:
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
attr_accessor :all_attrs
|
8
|
-
|
9
|
-
DEFAULT_ATTRS = %i[
|
10
|
-
id
|
11
|
-
cdate
|
12
|
-
created_timestamp
|
13
|
-
updated_timestamp
|
14
|
-
created_utc_timestamp
|
15
|
-
updated_utc_timestamp
|
16
|
-
created_by
|
17
|
-
updated_by
|
18
|
-
links
|
19
|
-
].freeze
|
20
|
-
|
21
7
|
def only_changes_to_params
|
22
8
|
return nil unless changed?
|
23
9
|
|
@@ -29,7 +15,7 @@ module ActiveCampaign
|
|
29
15
|
end
|
30
16
|
|
31
17
|
def to_params
|
32
|
-
iv = instance_variables -
|
18
|
+
iv = instance_variables - %i[@mutations_from_database @mutations_before_last_save]
|
33
19
|
|
34
20
|
{
|
35
21
|
self.class.root_element => iv.map { |v| [v.to_s.delete("@"), instance_variable_get(v)] }.to_h
|
@@ -39,6 +25,7 @@ module ActiveCampaign
|
|
39
25
|
module ClassMethods # :nodoc:
|
40
26
|
def define_attributes(*attrs)
|
41
27
|
attrs.each do |attr|
|
28
|
+
# ActiveModel's define_attribute_methods
|
42
29
|
define_attribute_methods attr
|
43
30
|
|
44
31
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
@@ -63,6 +50,8 @@ module ActiveCampaign
|
|
63
50
|
end
|
64
51
|
|
65
52
|
def instantiate_record(klass, data)
|
53
|
+
define_attributes(*data.keys)
|
54
|
+
|
66
55
|
record = klass.new data
|
67
56
|
record.clear_changes_information
|
68
57
|
record
|
@@ -75,11 +64,11 @@ module ActiveCampaign
|
|
75
64
|
end
|
76
65
|
|
77
66
|
def endpoint
|
78
|
-
name.demodulize.
|
67
|
+
name.demodulize.camelize(:lower).pluralize
|
79
68
|
end
|
80
69
|
|
81
70
|
def root_element
|
82
|
-
name.demodulize.
|
71
|
+
name.demodulize.camelize(:lower).to_sym
|
83
72
|
end
|
84
73
|
|
85
74
|
def root_elements
|
@@ -10,11 +10,17 @@ module ActiveCampaign
|
|
10
10
|
HTTP_METHODS.each do |method|
|
11
11
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
12
12
|
def #{method}(path, params={})
|
13
|
+
root = params.delete(:_root)
|
14
|
+
|
13
15
|
send(:'#{method}_raw', path, params) do |parsed_data, response|
|
14
16
|
return {} unless [200, 201].include?(parsed_data[:status_code])
|
15
17
|
return {} unless parsed_data[:data].present?
|
16
18
|
|
17
|
-
data =
|
19
|
+
data = if root
|
20
|
+
parsed_data[:data][root.to_sym]
|
21
|
+
else
|
22
|
+
parsed_data[:data].first.last
|
23
|
+
end
|
18
24
|
|
19
25
|
if data.is_a?(Array)
|
20
26
|
new_records data
|
@@ -1,36 +1,49 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveCampaign
|
4
|
-
|
4
|
+
#
|
5
|
+
# @example Contacts
|
6
|
+
#
|
7
|
+
# ActiveCampaign::Contact.find(1)
|
8
|
+
# ActiveCampaign::Contact.find_by email: "contact-1@mail.com"
|
9
|
+
# ActiveCampaign::Contact.find(1).destroy
|
10
|
+
# ActiveCampaign::Contact.find(1).contact_tags
|
11
|
+
#
|
12
|
+
class Contact < Model
|
5
13
|
define_attributes :email,
|
6
14
|
:phone,
|
7
15
|
:firstName,
|
8
|
-
:lastName
|
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
|
-
|
16
|
+
:lastName
|
17
|
+
|
18
|
+
# @example Find contact's tags.
|
19
|
+
#
|
20
|
+
# ActiveCampaign::Contact.find(1).contact_tags
|
21
|
+
# ActiveCampaign::Contact.find(1).contact_tags.last.destroy
|
22
|
+
#
|
23
|
+
def contact_tags
|
24
|
+
ContactTag.get "#{self.class.endpoint}/#{id}/contactTags"
|
25
|
+
end
|
26
|
+
|
27
|
+
# @example Apply a tag to a contact.
|
28
|
+
#
|
29
|
+
# ActiveCampaign::Contact.find(1).add_tag "tag-name"
|
30
|
+
#
|
31
|
+
def add_tag(tag)
|
32
|
+
tag_id = Tag.find_by(tag: tag)&.id
|
33
|
+
|
34
|
+
ActiveCampaign::ContactTag.create contact: id, tag: tag_id if tag_id
|
35
|
+
end
|
36
|
+
|
37
|
+
# @example Remove a tag from a contact.
|
38
|
+
#
|
39
|
+
# ActiveCampaign::Contact.find(1).remove_tag "tag-name"
|
40
|
+
#
|
41
|
+
def remove_tag(tag)
|
42
|
+
tag_id = Tag.find_by(tag: tag)&.id
|
43
|
+
|
44
|
+
contact_tag = contact_tags.filter_map { |ct| ct if ct.tag == tag_id }.last
|
45
|
+
|
46
|
+
contact_tag&.destroy
|
47
|
+
end
|
35
48
|
end
|
36
49
|
end
|
@@ -1,7 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveCampaign
|
4
|
-
|
5
|
-
|
4
|
+
#
|
5
|
+
# @example ContactTags
|
6
|
+
#
|
7
|
+
# contact = ActiveCampaign::Contact.find(email: "contact-email@mail.com")
|
8
|
+
# tag = ActiveCampaign::Tag.find_by(tag: "tag-name")
|
9
|
+
#
|
10
|
+
# ActiveCampaing::ContactTag.create contact: contact, tag: tag
|
11
|
+
#
|
12
|
+
class ContactTag < Model
|
13
|
+
define_attributes :contact, :tag
|
14
|
+
|
15
|
+
def create
|
16
|
+
self.tag = extract_id_from_tag(tag)
|
17
|
+
self.contact = extract_id_from_contact(contact)
|
18
|
+
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def extract_id_from_tag(tag)
|
25
|
+
case tag
|
26
|
+
when ::ActiveCampaign::Tag then tag.id
|
27
|
+
else
|
28
|
+
tag
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def extract_id_from_contact(contact)
|
33
|
+
case contact
|
34
|
+
when ::ActiveCampaign::Contact then contact.id
|
35
|
+
else
|
36
|
+
contact
|
37
|
+
end
|
38
|
+
end
|
6
39
|
end
|
7
40
|
end
|
@@ -8,23 +8,23 @@ module ActiveCampaign
|
|
8
8
|
include ActiveCampaign::ApiHttp
|
9
9
|
include ActiveCampaign::Attributes
|
10
10
|
|
11
|
-
define_attributes(*DEFAULT_ATTRS)
|
12
|
-
|
13
11
|
class << self
|
14
12
|
def all
|
15
13
|
get endpoint
|
16
14
|
end
|
17
15
|
|
18
16
|
def filter(args = {})
|
19
|
-
|
17
|
+
query = args.map { |k, v| "filters[#{k}]=#{v}" }.join "&"
|
18
|
+
|
19
|
+
get "#{endpoint}?#{query}"
|
20
20
|
end
|
21
21
|
|
22
22
|
def find_by(args = {})
|
23
|
-
filter(args
|
23
|
+
filter(args).last
|
24
24
|
end
|
25
25
|
|
26
26
|
def find(id)
|
27
|
-
get "#{endpoint}/#{id}"
|
27
|
+
get "#{endpoint}/#{id}", { _root: root_element }
|
28
28
|
end
|
29
29
|
|
30
30
|
def save(**args)
|
@@ -37,7 +37,7 @@ module ActiveCampaign
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def save
|
40
|
-
return update if id.present?
|
40
|
+
return update if defined?(id) && id.present?
|
41
41
|
|
42
42
|
create
|
43
43
|
end
|
@@ -47,17 +47,21 @@ module ActiveCampaign
|
|
47
47
|
|
48
48
|
result = self.class.put "#{self.class.endpoint}/#{id}", only_changes_to_params
|
49
49
|
|
50
|
+
assign_attributes result.to_params.first.last
|
51
|
+
|
50
52
|
changes_applied
|
51
53
|
|
52
|
-
|
54
|
+
self
|
53
55
|
end
|
54
56
|
|
55
57
|
def create
|
56
58
|
result = self.class.post self.class.endpoint, to_params
|
57
59
|
|
60
|
+
assign_attributes result.to_params.first.last
|
61
|
+
|
58
62
|
changes_applied
|
59
63
|
|
60
|
-
|
64
|
+
self
|
61
65
|
end
|
62
66
|
|
63
67
|
def destroy
|
@@ -2,12 +2,6 @@
|
|
2
2
|
|
3
3
|
module ActiveCampaign
|
4
4
|
class Tag < Model # :nodoc:
|
5
|
-
define_attributes :
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def find_by(tag:)
|
9
|
-
filter({ tags: { tag: tag } }.to_query).last
|
10
|
-
end
|
11
|
-
end
|
5
|
+
define_attributes :tag, :tagType, :description
|
12
6
|
end
|
13
7
|
end
|
data/lib/active_campaign.rb
CHANGED
@@ -12,7 +12,6 @@ require "active_support/inflector"
|
|
12
12
|
require "active_campaign/version"
|
13
13
|
require "active_campaign/parser"
|
14
14
|
require "active_campaign/api_attributes"
|
15
|
-
require "active_campaign/api_errors"
|
16
15
|
require "active_campaign/api"
|
17
16
|
require "active_campaign/api_http"
|
18
17
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ractive_campaign
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wedson Lima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 6.1.4
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 6.1.4
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 6.1.4
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: dry-configurable
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,26 +66,6 @@ dependencies:
|
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: 1.2.0
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: oj
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '3.0'
|
90
|
-
- - "<"
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version: '4.0'
|
93
|
-
type: :runtime
|
94
|
-
prerelease: false
|
95
|
-
version_requirements: !ruby/object:Gem::Requirement
|
96
|
-
requirements:
|
97
|
-
- - ">="
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
version: '3.0'
|
100
|
-
- - "<"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '4.0'
|
103
69
|
description: Active Campaign - API v3
|
104
70
|
email:
|
105
71
|
- wedson.sousa.lima@gmail.com
|
@@ -121,12 +87,14 @@ files:
|
|
121
87
|
- lib/active_campaign.rb
|
122
88
|
- lib/active_campaign/api.rb
|
123
89
|
- lib/active_campaign/api_attributes.rb
|
124
|
-
- lib/active_campaign/api_errors.rb
|
125
90
|
- lib/active_campaign/api_http.rb
|
91
|
+
- lib/active_campaign/models/account.rb
|
92
|
+
- lib/active_campaign/models/address.rb
|
126
93
|
- lib/active_campaign/models/contact.rb
|
127
94
|
- lib/active_campaign/models/contact_tag.rb
|
128
95
|
- lib/active_campaign/models/list.rb
|
129
96
|
- lib/active_campaign/models/model.rb
|
97
|
+
- lib/active_campaign/models/note.rb
|
130
98
|
- lib/active_campaign/models/tag.rb
|
131
99
|
- lib/active_campaign/parser.rb
|
132
100
|
- lib/active_campaign/version.rb
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActiveCampaign
|
4
|
-
class Error < RuntimeError # :nodoc:
|
5
|
-
def initialize(response = nil, exception = nil)
|
6
|
-
super
|
7
|
-
|
8
|
-
self.response = response
|
9
|
-
@exception = exception
|
10
|
-
end
|
11
|
-
|
12
|
-
def message
|
13
|
-
if response.nil?
|
14
|
-
super
|
15
|
-
else
|
16
|
-
<<~MESSAGE
|
17
|
-
STATUS: #{response.status}
|
18
|
-
URL: #{env.url}
|
19
|
-
REQUEST HEADERS: #{env.request_headers}
|
20
|
-
RESPONSE_HEADERS: #{env.response_headers}
|
21
|
-
REQUEST_BODY: #{env.request_body}\n\n"
|
22
|
-
RESPONSE_BODY: #{response.body}\n\n"
|
23
|
-
MESSAGE
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def env
|
30
|
-
@env ||= response.env
|
31
|
-
end
|
32
|
-
|
33
|
-
attr_accessor :response
|
34
|
-
end
|
35
|
-
|
36
|
-
class ClientError < Error
|
37
|
-
end
|
38
|
-
|
39
|
-
class UnauthorizedError < ClientError
|
40
|
-
end
|
41
|
-
|
42
|
-
class ResourceNotFound < ClientError
|
43
|
-
end
|
44
|
-
|
45
|
-
class UnprocessableEntityError < ClientError
|
46
|
-
end
|
47
|
-
end
|