chubasaweber 0.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/.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
|
+
}
|