chubasaweber 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/Gemfile +2 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/README.textile +65 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/aweber.gemspec +53 -0
- data/chubasaweber.gemspec +144 -0
- data/examples/with_access_token.rb +17 -0
- data/examples/your_account.rb +26 -0
- data/lib/aweber.rb +66 -0
- data/lib/aweber/base.rb +57 -0
- data/lib/aweber/collection.rb +110 -0
- data/lib/aweber/oauth.rb +69 -0
- data/lib/aweber/resource.rb +131 -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 +28 -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/lib/chubasaweber.rb +66 -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 +80 -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 +33 -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
- data/test/helper.rb +10 -0
- data/test/test_chubasaweber.rb +7 -0
- metadata +181 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Followup < Resource
|
4
|
+
api_attr :click_tracking_enabled
|
5
|
+
api_attr :content_type
|
6
|
+
api_attr :message_interval
|
7
|
+
api_attr :message_number
|
8
|
+
api_attr :spam_assassin_score
|
9
|
+
api_attr :subject
|
10
|
+
api_attr :total_clicked
|
11
|
+
api_attr :total_opened
|
12
|
+
api_attr :total_sent
|
13
|
+
api_attr :total_spam_complaints
|
14
|
+
api_attr :total_undelivered
|
15
|
+
api_attr :total_unsubscribes
|
16
|
+
|
17
|
+
api_attr :links_collection_link
|
18
|
+
api_attr :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
|
+
api_attr :name
|
8
|
+
|
9
|
+
api_attr :campaigns_collection_link
|
10
|
+
api_attr :subscribers_collection_link
|
11
|
+
api_attr :web_forms_collection_link
|
12
|
+
api_attr :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 ||= client.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
|
+
api_attr :event_time
|
5
|
+
api_attr :last_opened
|
6
|
+
api_attr :total_opens
|
7
|
+
|
8
|
+
api_attr :subscriber_link
|
9
|
+
api_attr :tracked_events_collection_link
|
10
|
+
api_attr :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,28 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class Subscriber < Resource
|
4
|
+
api_attr :name, :writable => true
|
5
|
+
api_attr :misc_notes, :writable => true
|
6
|
+
api_attr :email, :writable => true
|
7
|
+
api_attr :status, :writable => true
|
8
|
+
api_attr :custom_fields, :writable => true
|
9
|
+
api_attr :ad_tracking, :writable => true
|
10
|
+
api_attr :last_followup_message_number_sent, :writable => true
|
11
|
+
|
12
|
+
api_attr :ip_address
|
13
|
+
api_attr :is_verified
|
14
|
+
api_attr :last_followup_sent_at
|
15
|
+
api_attr :subscribed_at
|
16
|
+
api_attr :subscription_method
|
17
|
+
api_attr :subscription_url
|
18
|
+
api_attr :unsubscribed_at
|
19
|
+
api_attr :verified_at
|
20
|
+
api_attr :last_followup_sent_link
|
21
|
+
|
22
|
+
has_one :last_followup_sent
|
23
|
+
|
24
|
+
alias_attribute :is_verified?, :is_verified
|
25
|
+
alias_attribute :notes, :misc_notes
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class WebForm < Resource
|
4
|
+
api_attr :conversion_percentage
|
5
|
+
api_attr :is_active
|
6
|
+
api_attr :name
|
7
|
+
api_attr :total_displays
|
8
|
+
api_attr :total_submissions
|
9
|
+
api_attr :total_unique_displays
|
10
|
+
api_attr :type
|
11
|
+
api_attr :unique_conversion_percentage
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module AWeber
|
2
|
+
module Resources
|
3
|
+
class WebFormSplitTestComponent < Resource
|
4
|
+
api_attr :conversion_percentage
|
5
|
+
api_attr :is_active
|
6
|
+
api_attr :name
|
7
|
+
api_attr :total_displays
|
8
|
+
api_attr :total_submissions
|
9
|
+
api_attr :total_unique_displays
|
10
|
+
api_attr :type
|
11
|
+
api_attr :unique_conversion_percentage
|
12
|
+
api_attr :web_form_link
|
13
|
+
api_attr :weight
|
14
|
+
|
15
|
+
has_one :web_form
|
16
|
+
|
17
|
+
alias_attribute :is_active?, :is_active
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/chubasaweber.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
require "oauth"
|
3
|
+
|
4
|
+
module AWeber
|
5
|
+
API_VERSION = "1.0".freeze
|
6
|
+
AUTH_VERSION = "1.0".freeze
|
7
|
+
|
8
|
+
# Used for +has_many+ and +has_one+ relationships.
|
9
|
+
#
|
10
|
+
INFLECTIONS = {
|
11
|
+
:accounts => :Account,
|
12
|
+
:clicks => :Click,
|
13
|
+
:links => :Link,
|
14
|
+
:lists => :List,
|
15
|
+
:messages => :Message,
|
16
|
+
:opens => :Open,
|
17
|
+
:subscribers => :Subscriber,
|
18
|
+
:tracked_events => :TrackedEvent,
|
19
|
+
:integrations => :Integration,
|
20
|
+
:web_forms => :WebForm,
|
21
|
+
:components => :WebFormSplitTestComponent,
|
22
|
+
:web_form_split_tests => :WebFormSplitTest,
|
23
|
+
:last_followup_sents => :Followup
|
24
|
+
}
|
25
|
+
|
26
|
+
class << self
|
27
|
+
# @param [String] Base URL of the API server
|
28
|
+
#
|
29
|
+
attr_accessor :api_endpoint
|
30
|
+
|
31
|
+
# @param [String] Base URL of the Auth server
|
32
|
+
#
|
33
|
+
attr_accessor :auth_endpoint
|
34
|
+
|
35
|
+
def api_url
|
36
|
+
File.join api_endpoint, API_VERSION
|
37
|
+
end
|
38
|
+
|
39
|
+
def auth_url
|
40
|
+
File.join auth_endpoint, AUTH_VERSION
|
41
|
+
end
|
42
|
+
|
43
|
+
# Retrieves the Resource class based on the
|
44
|
+
# +INFLECTIONS+ map and +name+.
|
45
|
+
#
|
46
|
+
# @param [Symbol] name Collection name
|
47
|
+
#
|
48
|
+
def get_class(name)
|
49
|
+
Resources.const_get(INFLECTIONS[name])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
@api_endpoint = "https://api.aweber.com"
|
54
|
+
@auth_endpoint = "https://auth.aweber.com"
|
55
|
+
|
56
|
+
class OAuthError < Exception; end
|
57
|
+
class NotFoundError < Exception; end
|
58
|
+
class UnknownRequestError < Exception; end
|
59
|
+
end
|
60
|
+
|
61
|
+
$LOAD_PATH << File.dirname(__FILE__) unless $LOAD_PATH.include?(File.dirname(__FILE__))
|
62
|
+
require "aweber/oauth"
|
63
|
+
require "aweber/base"
|
64
|
+
require "aweber/resource"
|
65
|
+
require "aweber/resources"
|
66
|
+
require "aweber/collection"
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe AWeber::Base do
|
4
|
+
before :each do
|
5
|
+
@oauth = AWeber::OAuth.new("token", "secret")
|
6
|
+
@aweber = AWeber::Base.new(@oauth)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have an account" do
|
10
|
+
@aweber.account.should be_an AWeber::Resources::Account
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should expand uris to full paths" do
|
14
|
+
resp = @oauth.get("https://api.aweber.com/1.0/accounts")
|
15
|
+
@oauth.should_receive(:get).with("https://api.aweber.com/1.0/accounts").and_return(resp)
|
16
|
+
@aweber.account
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should delegate to the oauth object" do
|
20
|
+
@oauth.should_receive(:get).with("https://api.aweber.com/1.0/foo")
|
21
|
+
@aweber.send(:get, "/foo")
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe AWeber::Collection do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@oauth = AWeber::OAuth.new("token", "secret")
|
7
|
+
@aweber = AWeber::Base.new(@oauth)
|
8
|
+
data = ActiveSupport::JSON.decode(fixture("lists.json"))
|
9
|
+
@lists = AWeber::Collection.new(@aweber, AWeber::Resources::List, data)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should create classes from the one passed into initialize" do
|
13
|
+
@lists[1].should be_an AWeber::Resources::List
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be iterable" do
|
17
|
+
@lists.should respond_to :each
|
18
|
+
@lists.map { |id, l| id }.should be_an Array
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be accessible via id in normal Hash form" do
|
22
|
+
@lists[1].id.should == 1
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should retrieve more resources, if needed, when being iterated over" do
|
26
|
+
list_ids = @lists.map{ |id, list| list }
|
27
|
+
list_ids.length.should == 3
|
28
|
+
list_ids.all? { |e| e.is_a? AWeber::Resources::List }.should == true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should return single entries with dynamic find_by methods" do
|
32
|
+
@lists.find_by_id(1).should be_an AWeber::Resources::List
|
33
|
+
@lists.find_by_id(1).id.should == 1
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return Hashes of entries when find_by methods match many" do
|
37
|
+
lists = @lists.find_by_resource_type_link("https://api.aweber.com/1.0/#list")
|
38
|
+
lists.length.should == 3
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
{
|
2
|
+
"http_etag": "\"356a192b7913b04c54574d18c28d46e6395428ab-ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
3
|
+
"lists_collection_link": "https://api.aweber.com/1.0/accounts/1/lists",
|
4
|
+
"self_link": "https://api.aweber.com/1.0/accounts/1",
|
5
|
+
"resource_type_link": "https://api.aweber.com/1.0/#account",
|
6
|
+
"id": 1,
|
7
|
+
"integrations_collection_link": "https://api.aweber.com/1.0/accounts/1/integrations"
|
8
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"total_size": 1,
|
3
|
+
"start": 0,
|
4
|
+
"resource_type_link": "https://api.aweber.com/1.0/#accounts",
|
5
|
+
"entries": [{
|
6
|
+
"http_etag": "\"356a192b7913b04c54574d18c28d46e6395428ab-ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
|
7
|
+
"lists_collection_link": "https://api.aweber.com/1.0/accounts/1/lists",
|
8
|
+
"self_link": "https://api.aweber.com/1.0/accounts/1",
|
9
|
+
"resource_type_link": "https://api.aweber.com/1.0/#account",
|
10
|
+
"id": 1,
|
11
|
+
"integrations_collection_link": "https://api.aweber.com/1.0/accounts/1/integrations"
|
12
|
+
}]
|
13
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"click_tracking_enabled": 0,
|
3
|
+
"sent_date": null,
|
4
|
+
"is_archived": true,
|
5
|
+
"spam_assassin_score": null,
|
6
|
+
"http_etag": "\"14a1a033beff462b137a8222f595af4622875d44-ccadae5b53f02d3db0cc83ca57ae75ac804b2b98\"",
|
7
|
+
"total_undeliverable": null,
|
8
|
+
"twitter_account_link": null,
|
9
|
+
"total_opens": 0,
|
10
|
+
"links_collection_link": "http://api.apitest.lab/1.0/accounts/1/lists/1/campaigns/b2/links",
|
11
|
+
"total_clicks": 0,
|
12
|
+
"published_to_archive": null,
|
13
|
+
"messages_collection_link": "http://api.apitest.lab/1.0/accounts/1/lists/1/campaigns/b2/messages",
|
14
|
+
"send_date": "2010-22-12T22:15:00-07:00",
|
15
|
+
"content_type": "HTML",
|
16
|
+
"total_sent": 0,
|
17
|
+
"self_link": "http://api.apitest.lab/1.0/accounts/1/lists/1/campaigns/b2",
|
18
|
+
"subject": "Something about stuff.",
|
19
|
+
"resource_type_link": "http://api.apitest.lab/1.0/#broadcast_campaign",
|
20
|
+
"id": 2,
|
21
|
+
"total_unsubscribes": 0,
|
22
|
+
"total_spam_complaints": null
|
23
|
+
}
|