aweber 1.0.0
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.
- data/Gemfile +9 -0
- data/Gemfile.lock +28 -0
- data/LICENSE +20 -0
- data/README.textile +45 -0
- data/Rakefile +9 -0
- data/aweber.gemspec +55 -0
- data/examples/with_access_token.rb +17 -0
- data/examples/your_account.rb +26 -0
- data/lib/aweber.rb +67 -0
- data/lib/aweber/base.rb +49 -0
- data/lib/aweber/collection.rb +110 -0
- data/lib/aweber/oauth.rb +69 -0
- data/lib/aweber/resource.rb +93 -0
- data/lib/aweber/resources.rb +14 -0
- data/lib/aweber/resources/account.rb +14 -0
- data/lib/aweber/resources/broadcast.rb +29 -0
- data/lib/aweber/resources/click.rb +13 -0
- data/lib/aweber/resources/followup.rb +24 -0
- data/lib/aweber/resources/integration.rb +8 -0
- data/lib/aweber/resources/link.rb +12 -0
- data/lib/aweber/resources/list.rb +86 -0
- data/lib/aweber/resources/message.rb +20 -0
- data/lib/aweber/resources/open.rb +10 -0
- data/lib/aweber/resources/subscriber.rb +26 -0
- data/lib/aweber/resources/tracked_event.rb +13 -0
- data/lib/aweber/resources/web_form.rb +14 -0
- data/lib/aweber/resources/web_form_split_test.rb +11 -0
- data/lib/aweber/resources/web_form_split_test_component.rb +20 -0
- data/spec/base_spec.rb +23 -0
- data/spec/collection_spec.rb +40 -0
- data/spec/fixtures/account.json +8 -0
- data/spec/fixtures/accounts.json +13 -0
- data/spec/fixtures/campaign.json +23 -0
- data/spec/fixtures/campaigns.json +106 -0
- data/spec/fixtures/click.json +9 -0
- data/spec/fixtures/clicks.json +14 -0
- data/spec/fixtures/integration.json +8 -0
- data/spec/fixtures/integrations.json +45 -0
- data/spec/fixtures/link.json +10 -0
- data/spec/fixtures/links.json +75 -0
- data/spec/fixtures/list.json +11 -0
- data/spec/fixtures/lists.json +38 -0
- data/spec/fixtures/message.json +12 -0
- data/spec/fixtures/messages.json +29 -0
- data/spec/fixtures/open.json +8 -0
- data/spec/fixtures/opens.json +21 -0
- data/spec/fixtures/subscriber.json +16 -0
- data/spec/fixtures/subscribers.json +69 -0
- data/spec/fixtures/tracked_event.json +8 -0
- data/spec/fixtures/tracked_events.json +21 -0
- data/spec/fixtures/web_form.json +14 -0
- data/spec/fixtures/web_form_split_test.json +9 -0
- data/spec/fixtures/web_form_split_test_component.json +16 -0
- data/spec/fixtures/web_form_split_test_components.json +37 -0
- data/spec/fixtures/web_form_split_tests.json +41 -0
- data/spec/fixtures/web_forms.json +229 -0
- data/spec/oauth_spec.rb +96 -0
- data/spec/resource_spec.rb +61 -0
- data/spec/resources/account_spec.rb +13 -0
- data/spec/resources/campaign_spec.rb +14 -0
- data/spec/resources/click_spec.rb +14 -0
- data/spec/resources/integration_spec.rb +13 -0
- data/spec/resources/link_spec.rb +15 -0
- data/spec/resources/list_spec.rb +26 -0
- data/spec/resources/message_spec.rb +17 -0
- data/spec/resources/open_spec.rb +13 -0
- data/spec/resources/subscriber_spec.rb +25 -0
- data/spec/resources/tracked_event_spec.rb +14 -0
- data/spec/resources/web_form_spec.rb +19 -0
- data/spec/resources/web_form_split_test_component_spec.rb +20 -0
- data/spec/resources/web_form_split_test_spec.rb +14 -0
- data/spec/spec_helper.rb +52 -0
- metadata +247 -0
data/lib/aweber/oauth.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
module AWeber
|
2
|
+
class OAuth
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
def_delegators :access_token, :get, :post, :put, :delete
|
6
|
+
|
7
|
+
attr_accessor :callback_url
|
8
|
+
|
9
|
+
def initialize(consumer_token, consumer_secret, options={})
|
10
|
+
@consumer_token = consumer_token
|
11
|
+
@consumer_secret = consumer_secret
|
12
|
+
@callback_url = options[:callback_url]
|
13
|
+
end
|
14
|
+
|
15
|
+
def consumer
|
16
|
+
@consumer ||= ::OAuth::Consumer.new(@consumer_token, @consumer_secret, {
|
17
|
+
:site => AWeber.auth_endpoint,
|
18
|
+
:request_token_path => "/#{AWeber::AUTH_VERSION}/oauth/request_token",
|
19
|
+
:authorize_path => "/#{AWeber::AUTH_VERSION}/oauth/authorize",
|
20
|
+
:access_token_path => "/#{AWeber::AUTH_VERSION}/oauth/access_token",
|
21
|
+
:scheme => :query_string
|
22
|
+
})
|
23
|
+
end
|
24
|
+
|
25
|
+
# Retrieve a Request Token or simply return it, if it already exists.
|
26
|
+
#
|
27
|
+
# @param [Hash] options OAuth parameters. +:oauth_callback+ for example
|
28
|
+
#
|
29
|
+
def request_token(options={})
|
30
|
+
@request_token ||= consumer.get_request_token(options)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Get an Access Token from a Request Token using the
|
34
|
+
# +verifier+ code.
|
35
|
+
#
|
36
|
+
# @param [String] verifier Verification code retrieved from
|
37
|
+
# user authentication
|
38
|
+
#
|
39
|
+
def authorize_with_verifier(verifier)
|
40
|
+
token = request_token.get_access_token(:oauth_verifier => verifier)
|
41
|
+
@access_token_key = token.token
|
42
|
+
@access_token_secret = token.secret
|
43
|
+
access_token
|
44
|
+
end
|
45
|
+
|
46
|
+
def access_token
|
47
|
+
@access_token ||= ::OAuth::AccessToken.new(consumer, @access_token_key,
|
48
|
+
@access_token_secret)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Authorize with an Access Token key and secret you've previously
|
52
|
+
# retrieved via a user authentication.
|
53
|
+
#
|
54
|
+
# @param [String] access_token_key Access Token key
|
55
|
+
# @param [String] access_token_secret Access Token secret
|
56
|
+
#
|
57
|
+
def authorize_with_access(access_token_key, access_token_secret)
|
58
|
+
@access_token_key = access_token_key
|
59
|
+
@access_token_secret = access_token_secret
|
60
|
+
end
|
61
|
+
|
62
|
+
# Remove any active token instances and start over
|
63
|
+
#
|
64
|
+
def clear_tokens
|
65
|
+
@request_token = nil
|
66
|
+
@access_token = nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module AWeber
|
2
|
+
# Base class for all entries. All resources have the following attributes:
|
3
|
+
#
|
4
|
+
# - +id+
|
5
|
+
# - +http_etag+ (aliased as +etag+)
|
6
|
+
# - +self_link+ (aliased as +link+)
|
7
|
+
# - +resource_type_link+ (aliased as +resource_type+)
|
8
|
+
#
|
9
|
+
# Resources also have attributes based on their the type of resource it is.
|
10
|
+
# To see a full list of attributes per resource, visit
|
11
|
+
# http://labs.aweber.com/docs/reference/1.0/reference.
|
12
|
+
#
|
13
|
+
class Resource
|
14
|
+
extend Forwardable
|
15
|
+
include Comparable
|
16
|
+
|
17
|
+
def_delegators :client, :get
|
18
|
+
|
19
|
+
class << self
|
20
|
+
# Works the same as +alias_method+, but for attributes created via
|
21
|
+
# +attr*+ methods.
|
22
|
+
#
|
23
|
+
def alias_attribute(alias_, attribute)
|
24
|
+
alias_method alias_, attribute
|
25
|
+
end
|
26
|
+
|
27
|
+
def has_one(name)
|
28
|
+
define_method(name) do
|
29
|
+
ivar = instance_variable_get("@#{name}")
|
30
|
+
return ivar if ivar
|
31
|
+
|
32
|
+
resource_link = instance_variable_get("@#{name}_link")
|
33
|
+
klass = AWeber.get_class(:"#{name}s")
|
34
|
+
collection = klass.new(client, get(resource_link))
|
35
|
+
instance_variable_set("@#{name}", collection)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Creates a lazy loaded method which will retrieve and create a
|
40
|
+
# collection of +name+ of objects.
|
41
|
+
#
|
42
|
+
# @param [Symbol] name name of the collection method
|
43
|
+
# @return [AWeber::Collection] Collection of +name+ objects
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
# class Account
|
47
|
+
# attr_reader :lists_collection_link
|
48
|
+
# collection :lists
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# #=> Account.new(...).lists #=> <AWeber::Collection>
|
52
|
+
#
|
53
|
+
def has_many(name)
|
54
|
+
define_method(name) do
|
55
|
+
ivar = instance_variable_get("@#{name}")
|
56
|
+
return ivar if ivar
|
57
|
+
|
58
|
+
resource_link = instance_variable_get("@#{name}_collection_link")
|
59
|
+
klass = AWeber.get_class(name)
|
60
|
+
collection = Collection.new(client, klass, get(resource_link))
|
61
|
+
instance_variable_set("@#{name}", collection)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
attr_reader :id
|
67
|
+
attr_reader :http_etag
|
68
|
+
attr_reader :self_link
|
69
|
+
attr_reader :resource_type_link
|
70
|
+
|
71
|
+
alias_attribute :etag, :http_etag
|
72
|
+
alias_attribute :link, :self_link
|
73
|
+
alias_attribute :resource_type, :resource_type_link
|
74
|
+
|
75
|
+
def initialize(client, data={})
|
76
|
+
@client = client
|
77
|
+
data.each do |key, value|
|
78
|
+
instance_variable_set("@#{key}", value) if respond_to? key
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def <=>(other)
|
83
|
+
@id <=> other.id
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def client
|
89
|
+
@client
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "aweber/resources/account"
|
2
|
+
require "aweber/resources/broadcast"
|
3
|
+
require "aweber/resources/click"
|
4
|
+
require "aweber/resources/followup"
|
5
|
+
require "aweber/resources/link"
|
6
|
+
require "aweber/resources/list"
|
7
|
+
require "aweber/resources/message"
|
8
|
+
require "aweber/resources/open"
|
9
|
+
require "aweber/resources/subscriber"
|
10
|
+
require "aweber/resources/tracked_event"
|
11
|
+
require "aweber/resources/integration"
|
12
|
+
require "aweber/resources/web_form"
|
13
|
+
require "aweber/resources/web_form_split_test"
|
14
|
+
require "aweber/resources/web_form_split_test_component"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Account < Resource
|
4
|
+
attr_reader :lists_collection_link
|
5
|
+
attr_reader :integrations_collection_link
|
6
|
+
|
7
|
+
has_many :lists
|
8
|
+
has_many :integrations
|
9
|
+
|
10
|
+
alias_attribute :etag, :http_etag
|
11
|
+
alias_attribute :uri, :self_link
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Broadcast < Resource
|
4
|
+
attr_reader :click_tracking_enabled
|
5
|
+
attr_reader :content_type
|
6
|
+
attr_reader :is_archived
|
7
|
+
attr_reader :scheduled_at
|
8
|
+
attr_reader :sent_at
|
9
|
+
attr_reader :spam_assassin_score
|
10
|
+
attr_reader :subject
|
11
|
+
attr_reader :total_clicks
|
12
|
+
attr_reader :total_opens
|
13
|
+
attr_reader :total_sent
|
14
|
+
attr_reader :total_spam_complaints
|
15
|
+
attr_reader :total_undelivered
|
16
|
+
attr_reader :total_unsubscribes
|
17
|
+
attr_reader :twitter_account_link
|
18
|
+
|
19
|
+
attr_reader :links_collection_link
|
20
|
+
attr_reader :messages_collection_link
|
21
|
+
|
22
|
+
has_many :links
|
23
|
+
has_many :messages
|
24
|
+
|
25
|
+
alias_attribute :is_archived?, :is_archived
|
26
|
+
alias_attribute :is_click_tracking_enabled?, :click_tracking_enabled
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Followup < Resource
|
4
|
+
attr_reader :click_tracking_enabled
|
5
|
+
attr_reader :content_type
|
6
|
+
attr_reader :message_interval
|
7
|
+
attr_reader :message_number
|
8
|
+
attr_reader :spam_assassin_score
|
9
|
+
attr_reader :subject
|
10
|
+
attr_reader :total_clicked
|
11
|
+
attr_reader :total_opened
|
12
|
+
attr_reader :total_sent
|
13
|
+
attr_reader :total_spam_complaints
|
14
|
+
attr_reader :total_undelivered
|
15
|
+
attr_reader :total_unsubscribes
|
16
|
+
|
17
|
+
attr_reader :links_collection_link
|
18
|
+
attr_reader :messages_collection_link
|
19
|
+
|
20
|
+
has_many :links
|
21
|
+
has_many :messages
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class List < Resource
|
4
|
+
FOLLOWUP_TYPE_LINK = File.join(AWeber.api_url, "#followup_campaign")
|
5
|
+
BROADCAST_TYPE_LINK = File.join(AWeber.api_url, "#broadcast_campaign")
|
6
|
+
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
attr_reader :campaigns_collection_link
|
10
|
+
attr_reader :subscribers_collection_link
|
11
|
+
attr_reader :web_forms_collection_link
|
12
|
+
attr_reader :web_form_split_tests_collection_link
|
13
|
+
|
14
|
+
has_many :subscribers
|
15
|
+
has_many :web_forms
|
16
|
+
has_many :web_form_split_tests
|
17
|
+
|
18
|
+
def initialize(*args)
|
19
|
+
super(*args)
|
20
|
+
@campaigns = {}
|
21
|
+
@followups = nil
|
22
|
+
@broadcasts = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def campaigns
|
26
|
+
return @campaigns unless @campaigns == {}
|
27
|
+
create_followups
|
28
|
+
create_broadcasts
|
29
|
+
populate_campaigns
|
30
|
+
@campaigns
|
31
|
+
end
|
32
|
+
|
33
|
+
def broadcasts
|
34
|
+
campaigns if @broadcasts.nil?
|
35
|
+
@broadcasts
|
36
|
+
end
|
37
|
+
|
38
|
+
def followups
|
39
|
+
campaigns if @followups.nil?
|
40
|
+
@followups
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def create_followups
|
46
|
+
followups = _entries.select { |entry| is_followup? entry }
|
47
|
+
@followups = Collection.new(client, Followup, {
|
48
|
+
"entries" => followups,
|
49
|
+
"total_size" => followups.length,
|
50
|
+
"resource_type_link" => FOLLOWUP_TYPE_LINK
|
51
|
+
})
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_broadcasts
|
55
|
+
broadcasts = _entries.select { |entry| is_broadcast? entry }
|
56
|
+
@broadcasts = Collection.new(client, Broadcast, {
|
57
|
+
"entries" => broadcasts,
|
58
|
+
"total_size" => broadcasts.length,
|
59
|
+
"resource_type_link" => BROADCAST_TYPE_LINK
|
60
|
+
})
|
61
|
+
end
|
62
|
+
|
63
|
+
def populate_campaigns
|
64
|
+
@followups.each { |id, followup| @campaigns[id] = followup }
|
65
|
+
@broadcasts.each { |id, broadcast| @campaigns[id] = broadcast }
|
66
|
+
end
|
67
|
+
|
68
|
+
def is_followup?(entry)
|
69
|
+
entry["resource_type_link"].split("#").last =~ /^followup/
|
70
|
+
end
|
71
|
+
|
72
|
+
def is_broadcast?(entry)
|
73
|
+
entry["resource_type_link"].split("#").last =~ /^broadcast/
|
74
|
+
end
|
75
|
+
|
76
|
+
def _campaigns
|
77
|
+
@_campaigns ||= get(@campaigns_collection_link)
|
78
|
+
end
|
79
|
+
|
80
|
+
def _entries
|
81
|
+
_campaigns["entries"]
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Message < Resource
|
4
|
+
attr_reader :event_time
|
5
|
+
attr_reader :last_opened
|
6
|
+
attr_reader :total_opens
|
7
|
+
|
8
|
+
attr_reader :subscriber_link
|
9
|
+
attr_reader :tracked_events_collection_link
|
10
|
+
attr_reader :opens_collection_link
|
11
|
+
|
12
|
+
has_one :subscriber
|
13
|
+
|
14
|
+
has_many :tracked_events
|
15
|
+
has_many :opens
|
16
|
+
|
17
|
+
alias_attribute :events, :tracked_events
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Subscriber < Resource
|
4
|
+
attr_reader :ad_tracking
|
5
|
+
attr_reader :email
|
6
|
+
attr_reader :ip_address
|
7
|
+
attr_reader :is_verified
|
8
|
+
attr_reader :last_followup_sent_at
|
9
|
+
attr_reader :misc_notes
|
10
|
+
attr_reader :name
|
11
|
+
attr_reader :status
|
12
|
+
attr_reader :subscribed_at
|
13
|
+
attr_reader :subscription_method
|
14
|
+
attr_reader :subscription_url
|
15
|
+
attr_reader :unsubscribed_at
|
16
|
+
attr_reader :verified_at
|
17
|
+
|
18
|
+
attr_reader :last_followup_sent_link
|
19
|
+
|
20
|
+
has_one :last_followup_sent
|
21
|
+
|
22
|
+
alias_attribute :is_verified?, :is_verified
|
23
|
+
alias_attribute :notes, :misc_notes
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|