aweber 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,9 +1,2 @@
1
1
  source :rubygems
2
- gem "oauth"
3
- gem "json_pure"
4
-
5
- group :development do
6
- gem "fakeweb"
7
- gem "rspec", "2.0.0.beta.22"
8
- gem "yard", "~> 0.6.1"
9
- end
2
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,3 +1,10 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ aweber (1.1.0)
5
+ json_pure
6
+ oauth
7
+
1
8
  GEM
2
9
  remote: http://rubygems.org/
3
10
  specs:
@@ -5,24 +12,23 @@ GEM
5
12
  fakeweb (1.3.0)
6
13
  json_pure (1.4.6)
7
14
  oauth (0.4.4)
8
- rspec (2.0.0.beta.22)
9
- rspec-core (= 2.0.0.beta.22)
10
- rspec-expectations (= 2.0.0.beta.22)
11
- rspec-mocks (= 2.0.0.beta.22)
12
- rspec-core (2.0.0.beta.22)
13
- rspec-expectations (2.0.0.beta.22)
14
- diff-lcs (>= 1.1.2)
15
- rspec-mocks (2.0.0.beta.22)
16
- rspec-core (= 2.0.0.beta.22)
17
- rspec-expectations (= 2.0.0.beta.22)
18
- yard (0.6.3)
15
+ rspec (2.1.0)
16
+ rspec-core (~> 2.1.0)
17
+ rspec-expectations (~> 2.1.0)
18
+ rspec-mocks (~> 2.1.0)
19
+ rspec-core (2.1.0)
20
+ rspec-expectations (2.1.0)
21
+ diff-lcs (~> 1.1.2)
22
+ rspec-mocks (2.1.0)
23
+ yard (0.6.4)
19
24
 
20
25
  PLATFORMS
21
26
  ruby
22
27
 
23
28
  DEPENDENCIES
29
+ aweber!
24
30
  fakeweb
25
31
  json_pure
26
32
  oauth
27
- rspec (= 2.0.0.beta.22)
28
- yard (~> 0.6.1)
33
+ rspec (~> 2.1.0)
34
+ yard (~> 0.6.0)
data/README.textile CHANGED
@@ -10,25 +10,45 @@ h2. Quick Start
10
10
 
11
11
  First, go to "http://labs.aweber.com":http://labs.aweber.com and sign up for a free AWeber Labs account. This is how you register apps and get OAuth keys.
12
12
 
13
- bc. # Register an app and use it's Consumer key and secret:
13
+ bc.. # Register an app and use it's Consumer key and secret:
14
14
  oauth = AWeber::OAuth.new("consumer_key", "consumer_secret")
15
+
15
16
  # Go to the URL the following outputs.
16
17
  oauth.request_token.authorize_url
18
+
17
19
  # Authorize your account and copy the verification code.
18
20
  oauth.authorize_with_verifier("verification_code")
19
- aweber = AWeber::Base.new(oauth)
20
- account = aweber.account
21
- account.lists # Start getting data
22
21
 
23
- Take a look at "examples":http://github.com/aweber/aweber-ruby/tree/master/examples/ for more examples.
22
+ # Grab an AWeber::Base object and get movin'
23
+ aweber = AWeber::Base.new(oauth)
24
+ aweber.account.lists[123456].name
25
+
26
+ p. Take a look at "examples":http://github.com/aweber/aweber-ruby/tree/master/examples/ for more examples.
24
27
 
25
28
  h2. Getting Data
26
29
 
27
30
  Every piece of data from AWeber's API stems from an Account object. From there you access associated resources in the same way you would an ActiveRecord accosication:
28
31
 
29
32
  bc. account.lists #=> #<AWeber::Collection(AWeber::Resource::List)>
30
- account.lists[1] #=> #<AWeber::Resource::List>
31
- account.lists[1].web_forms #=> #<AWeber::Collection(AWeber::Resource::WebForm)>
33
+ account.lists[1] #=> #<AWeber::Resource::List>
34
+
35
+ h2. Modifying Subscribers
36
+
37
+ Currently, only certain attributes of Subscribers are writable:
38
+
39
+ * name
40
+ * misc_notes
41
+ * email (yes email)
42
+ * status
43
+ * last_followup_message_number_sent
44
+ * custom_fields (Hash of key/value pairs)
45
+ * ad_tracking
46
+
47
+ h3. Example
48
+
49
+ bc. subscriber = account.lists[654321].subscribers[123456]
50
+ subscriber.name = "New Name"
51
+ subscriber.save
32
52
 
33
53
  h2. Note on Patches/Pull Requests
34
54
 
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'rspec/core/rake_task'
2
2
  RSpec::Core::RakeTask.new(:spec) do |s|
3
- s.rspec_opts = ["--color"]
3
+ s.rspec_opts = ["--fail-fast", "--color"]
4
4
  end
5
5
 
6
6
  require 'yard'
data/aweber.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "aweber"
4
- s.version = "1.0.0"
4
+ s.version = "1.1.0"
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.summary = "Ruby interface to AWeber's API"
7
7
  s.description = "Ruby interface to AWeber's API"
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
49
49
  s.add_dependency "json_pure"
50
50
 
51
51
  s.add_development_dependency "fakeweb"
52
- s.add_development_dependency "rspec", ">= 2.0.0"
53
- s.add_development_dependency "yard", "~> 0.6.1"
52
+ s.add_development_dependency "rspec", "~> 2.1.0"
53
+ s.add_development_dependency "yard", "~> 0.6.0"
54
54
  end
55
55
 
data/lib/aweber/base.rb CHANGED
@@ -8,15 +8,23 @@ module AWeber
8
8
  def account
9
9
  accounts.first.last
10
10
  end
11
-
12
- private
13
-
11
+
14
12
  def get(uri)
15
13
  response = oauth.get(expand(uri))
16
14
  handle_errors(response, uri)
17
15
  parse(response) if response
18
16
  end
19
17
 
18
+ def delete(uri)
19
+ oauth.delete(expand(uri))
20
+ end
21
+
22
+ def put(uri, body={})
23
+ oauth.put(uri, body.to_json, {"Content-Type" => "application/json"})
24
+ end
25
+
26
+ private
27
+
20
28
  def handle_errors(response, uri)
21
29
  if response.is_a? Net::HTTPNotFound
22
30
  raise NotFoundError, "Invalid resource uri.", caller
@@ -32,9 +40,9 @@ module AWeber
32
40
  def expand(uri)
33
41
  parsed = URI.parse(uri)
34
42
  url = []
35
- url << AWeber.api_endpoint unless parsed.host
43
+ url << AWeber.api_endpoint
36
44
  url << API_VERSION unless parsed.path.include? API_VERSION
37
- url << uri
45
+ url << parsed.path
38
46
  File.join(*url)
39
47
  end
40
48
 
@@ -14,9 +14,8 @@ module AWeber
14
14
  extend Forwardable
15
15
  include Comparable
16
16
 
17
- def_delegators :client, :get
18
-
19
17
  class << self
18
+ attr_accessor :writable_attrs
20
19
  # Works the same as +alias_method+, but for attributes created via
21
20
  # +attr*+ methods.
22
21
  #
@@ -24,6 +23,29 @@ module AWeber
24
23
  alias_method alias_, attribute
25
24
  end
26
25
 
26
+ # Defines an attribute that it either read only or writable.
27
+ #
28
+ # == Example:
29
+ #
30
+ # # Read-only
31
+ # api_attr :name
32
+ #
33
+ # # Writable
34
+ # api_attr :name, :writable => true
35
+ #
36
+ # If an attribute is writable it will be sent with the request when
37
+ # +save+ is called.
38
+ #
39
+ def api_attr(attr_, opts={})
40
+ if opts[:writable]
41
+ attr_accessor attr_
42
+ @writable_attrs ||= []
43
+ @writable_attrs << attr_
44
+ else
45
+ attr_reader attr_
46
+ end
47
+ end
48
+
27
49
  def has_one(name)
28
50
  define_method(name) do
29
51
  ivar = instance_variable_get("@#{name}")
@@ -31,7 +53,7 @@ module AWeber
31
53
 
32
54
  resource_link = instance_variable_get("@#{name}_link")
33
55
  klass = AWeber.get_class(:"#{name}s")
34
- collection = klass.new(client, get(resource_link))
56
+ collection = klass.new(client, client.get(resource_link))
35
57
  instance_variable_set("@#{name}", collection)
36
58
  end
37
59
  end
@@ -57,16 +79,16 @@ module AWeber
57
79
 
58
80
  resource_link = instance_variable_get("@#{name}_collection_link")
59
81
  klass = AWeber.get_class(name)
60
- collection = Collection.new(client, klass, get(resource_link))
82
+ collection = Collection.new(client, klass, client.get(resource_link))
61
83
  instance_variable_set("@#{name}", collection)
62
84
  end
63
85
  end
64
86
  end
65
87
 
66
- attr_reader :id
67
- attr_reader :http_etag
68
- attr_reader :self_link
69
- attr_reader :resource_type_link
88
+ api_attr :id
89
+ api_attr :http_etag
90
+ api_attr :self_link
91
+ api_attr :resource_type_link
70
92
 
71
93
  alias_attribute :etag, :http_etag
72
94
  alias_attribute :link, :self_link
@@ -78,6 +100,22 @@ module AWeber
78
100
  instance_variable_set("@#{key}", value) if respond_to? key
79
101
  end
80
102
  end
103
+
104
+ def delete
105
+ client.delete(@self_link)
106
+ end
107
+
108
+ def save
109
+ body = writable_attrs.inject({}) do |body, attr_|
110
+ body[attr_] = send(attr_)
111
+ body
112
+ end
113
+ client.put(self_link, body)
114
+ end
115
+
116
+ def writable_attrs
117
+ self.class.writable_attrs ||= {}
118
+ end
81
119
 
82
120
  def <=>(other)
83
121
  @id <=> other.id
@@ -1,8 +1,8 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class Account < Resource
4
- attr_reader :lists_collection_link
5
- attr_reader :integrations_collection_link
4
+ api_attr :lists_collection_link
5
+ api_attr :integrations_collection_link
6
6
 
7
7
  has_many :lists
8
8
  has_many :integrations
@@ -1,23 +1,23 @@
1
1
  module AWeber
2
2
  module Resources
3
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
4
+ api_attr :click_tracking_enabled
5
+ api_attr :content_type
6
+ api_attr :is_archived
7
+ api_attr :scheduled_at
8
+ api_attr :sent_at
9
+ api_attr :spam_assassin_score
10
+ api_attr :subject
11
+ api_attr :total_clicks
12
+ api_attr :total_opens
13
+ api_attr :total_sent
14
+ api_attr :total_spam_complaints
15
+ api_attr :total_undelivered
16
+ api_attr :total_unsubscribes
17
+ api_attr :twitter_account_link
18
18
 
19
- attr_reader :links_collection_link
20
- attr_reader :messages_collection_link
19
+ api_attr :links_collection_link
20
+ api_attr :messages_collection_link
21
21
 
22
22
  has_many :links
23
23
  has_many :messages
@@ -1,9 +1,9 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class Click < Resource
4
- attr_reader :event_time
5
- attr_reader :is_earliest
6
- attr_reader :subscriber_link
4
+ api_attr :event_time
5
+ api_attr :is_earliest
6
+ api_attr :subscriber_link
7
7
 
8
8
  has_one :subscriber
9
9
 
@@ -1,21 +1,21 @@
1
1
  module AWeber
2
2
  module Resources
3
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
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
19
 
20
20
  has_many :links
21
21
  has_many :messages
@@ -1,8 +1,8 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class Integration < Resource
4
- attr_reader :login
5
- attr_reader :service_name
4
+ api_attr :login
5
+ api_attr :service_name
6
6
  end
7
7
  end
8
8
  end
@@ -1,10 +1,10 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class Link < Resource
4
- attr_reader :total_clicks
5
- attr_reader :total_unique_clicks
6
- attr_reader :url
7
- attr_reader :clicks_collection_link
4
+ api_attr :total_clicks
5
+ api_attr :total_unique_clicks
6
+ api_attr :url
7
+ api_attr :clicks_collection_link
8
8
 
9
9
  has_many :clicks
10
10
  end
@@ -4,12 +4,12 @@ module AWeber
4
4
  FOLLOWUP_TYPE_LINK = File.join(AWeber.api_url, "#followup_campaign")
5
5
  BROADCAST_TYPE_LINK = File.join(AWeber.api_url, "#broadcast_campaign")
6
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
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
13
 
14
14
  has_many :subscribers
15
15
  has_many :web_forms
@@ -74,7 +74,7 @@ module AWeber
74
74
  end
75
75
 
76
76
  def _campaigns
77
- @_campaigns ||= get(@campaigns_collection_link)
77
+ @_campaigns ||= client.get(@campaigns_collection_link)
78
78
  end
79
79
 
80
80
  def _entries
@@ -1,13 +1,13 @@
1
1
  module AWeber
2
2
  module Resources
3
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
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
11
 
12
12
  has_one :subscriber
13
13
 
@@ -1,8 +1,8 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class Open < Resource
4
- attr_reader :event_time
5
- attr_reader :subscriber_link
4
+ api_attr :event_time
5
+ api_attr :subscriber_link
6
6
 
7
7
  has_one :subscriber
8
8
  end
@@ -1,21 +1,23 @@
1
1
  module AWeber
2
2
  module Resources
3
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
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
17
11
 
18
- attr_reader :last_followup_sent_link
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
19
21
 
20
22
  has_one :last_followup_sent
21
23
 
@@ -1,9 +1,9 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class TrackedEvent < Resource
4
- attr_reader :event_time
5
- attr_reader :type
6
- attr_reader :subscriber_link
4
+ api_attr :event_time
5
+ api_attr :type
6
+ api_attr :subscriber_link
7
7
 
8
8
  has_one :subscriber
9
9
 
@@ -1,14 +1,14 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class WebForm < Resource
4
- attr_reader :conversion_percentage
5
- attr_reader :is_active
6
- attr_reader :name
7
- attr_reader :total_displays
8
- attr_reader :total_submissions
9
- attr_reader :total_unique_displays
10
- attr_reader :type
11
- attr_reader :unique_conversion_percentage
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
12
  end
13
13
  end
14
14
  end
@@ -1,9 +1,9 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class WebFormSplitTest < Resource
4
- attr_reader :components_collection_link
5
- attr_reader :is_active
6
- attr_reader :name
4
+ api_attr :components_collection_link
5
+ api_attr :is_active
6
+ api_attr :name
7
7
 
8
8
  has_many :components
9
9
  end
@@ -1,16 +1,16 @@
1
1
  module AWeber
2
2
  module Resources
3
3
  class WebFormSplitTestComponent < Resource
4
- attr_reader :conversion_percentage
5
- attr_reader :is_active
6
- attr_reader :name
7
- attr_reader :total_displays
8
- attr_reader :total_submissions
9
- attr_reader :total_unique_displays
10
- attr_reader :type
11
- attr_reader :unique_conversion_percentage
12
- attr_reader :web_form_link
13
- attr_reader :weight
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
14
 
15
15
  has_one :web_form
16
16
 
@@ -0,0 +1,38 @@
1
+ {
2
+ "total_size": 6,
3
+ "start": 4,
4
+ "resource_type_link": "https://api.aweber.com/1.0/#list-page-resource",
5
+ "entries": [{
6
+ "campaigns_collection_link": "/accounts/1/lists/4565456/campaigns",
7
+ "name": "asdsa456464",
8
+ "web_form_split_tests_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/4565456/web_form_split_tests",
9
+ "subscribers_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/4565456/subscribers",
10
+ "id": 4565456,
11
+ "http_etag": "\"4ab41e60d14ea138a4522b3d2896942b7335c13c - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
12
+ "self_link": "https://api.aweber.com/1.0/accounts/1/lists/4565456",
13
+ "resource_type_link": "https://api.aweber.com/1.0/#list",
14
+ "web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/4565456/web_forms"
15
+ },
16
+ {
17
+ "campaigns_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/8975612/campaigns",
18
+ "name": "default8975612",
19
+ "web_form_split_tests_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/8975612/web_form_split_tests",
20
+ "subscribers_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/8975612/subscribers",
21
+ "id": 8975612,
22
+ "http_etag": "\"685c00e3983add5e4efb5ca3bc7294e247f6e9fe - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
23
+ "self_link": "https://api.aweber.com/1.0/accounts/1/lists/8975612",
24
+ "resource_type_link": "https://api.aweber.com/1.0/#list",
25
+ "web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/8975612/web_forms"
26
+ },
27
+ {
28
+ "campaigns_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/12357254/campaigns",
29
+ "name": "default123572549",
30
+ "web_form_split_tests_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/12357254/web_form_split_tests",
31
+ "subscribers_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/12357254/subscribers",
32
+ "id": 12357254,
33
+ "http_etag": "\"0aaa38a50287df08ccb74c7f13fca8679aab688a - ca5feee2b7fbb6febfca8af5541541ea960aaedb\"",
34
+ "self_link": "https://api.aweber.com/1.0/accounts/1/lists/12357254",
35
+ "resource_type_link": "https://api.aweber.com/1.0/#list",
36
+ "web_forms_collection_link": "https://api.aweber.com/1.0/accounts/1/lists/12357254/web_forms"
37
+ }]
38
+ }
@@ -2,6 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  class FakeResource < AWeber::Resource
4
4
  attr_accessor :foo
5
+ api_attr :name, :writable => true
5
6
  alias_attribute :bar, :foo
6
7
  has_many :lists
7
8
  end
@@ -58,4 +59,22 @@ describe AWeber::Resource do
58
59
  fake1.should_not == fake3
59
60
  end
60
61
 
62
+ it "should be deleted" do
63
+ fake = FakeResource.new(@aweber, JSON.parse(fixture("account.json")))
64
+ @oauth.should_receive(:delete).with(fake.link)
65
+ fake.delete
66
+ end
67
+
68
+ it "should declare writable attributes" do
69
+ resource = FakeResource.new(@aweber)
70
+ resource.writable_attrs.include?(:name).should be_true
71
+ end
72
+
73
+ it "should send a JSON respresentation of the object on save" do
74
+ resource = FakeResource.new(@aweber)
75
+ @oauth.should_receive(:put).with(resource.link, "{\"name\":\"Bob\"}")
76
+ resource.name = "Bob"
77
+ resource.save
78
+ end
79
+
61
80
  end
@@ -22,4 +22,12 @@ describe AWeber::Resources::Subscriber do
22
22
  it { should respond_to :subscription_url }
23
23
  it { should respond_to :unsubscribed_at }
24
24
  it { should respond_to :verified_at }
25
+
26
+ its(:writable_attrs) { should include :name }
27
+ its(:writable_attrs) { should include :misc_notes }
28
+ its(:writable_attrs) { should include :email }
29
+ its(:writable_attrs) { should include :status }
30
+ its(:writable_attrs) { should include :custom_fields }
31
+ its(:writable_attrs) { should include :ad_tracking }
32
+ its(:writable_attrs) { should include :last_followup_message_number_sent }
25
33
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
+ - 1
7
8
  - 0
8
- - 0
9
- version: 1.0.0
9
+ version: 1.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - AWeber Communications, Inc.
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-24 00:00:00 -05:00
17
+ date: 2011-01-13 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -62,13 +62,13 @@ dependencies:
62
62
  requirement: &id004 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
- - - ">="
65
+ - - ~>
66
66
  - !ruby/object:Gem::Version
67
67
  segments:
68
68
  - 2
69
+ - 1
69
70
  - 0
70
- - 0
71
- version: 2.0.0
71
+ version: 2.1.0
72
72
  type: :development
73
73
  version_requirements: *id004
74
74
  - !ruby/object:Gem::Dependency
@@ -82,8 +82,8 @@ dependencies:
82
82
  segments:
83
83
  - 0
84
84
  - 6
85
- - 1
86
- version: 0.6.1
85
+ - 0
86
+ version: 0.6.0
87
87
  type: :development
88
88
  version_requirements: *id005
89
89
  description: Ruby interface to AWeber's API
@@ -138,6 +138,7 @@ files:
138
138
  - spec/fixtures/links.json
139
139
  - spec/fixtures/list.json
140
140
  - spec/fixtures/lists.json
141
+ - spec/fixtures/lists_page_2.json
141
142
  - spec/fixtures/message.json
142
143
  - spec/fixtures/messages.json
143
144
  - spec/fixtures/open.json
@@ -215,6 +216,7 @@ test_files:
215
216
  - spec/fixtures/links.json
216
217
  - spec/fixtures/list.json
217
218
  - spec/fixtures/lists.json
219
+ - spec/fixtures/lists_page_2.json
218
220
  - spec/fixtures/message.json
219
221
  - spec/fixtures/messages.json
220
222
  - spec/fixtures/open.json