spreedly 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,10 @@
1
+ === 1.3.1
2
+
3
+ * Handle new error reporting when creating a subscriber.
4
+ * Use a more sane way of setting attributes in the mock, and make plans have a
5
+ plan type [seancribbs].
6
+ * Allow optional arguments to be passed when creating subscribers [jaknowlden].
7
+
1
8
  === 1.3.0 / 2009-06-04
2
9
 
3
10
  * Properly handle invalid Subscriber lookup [karnowski].
@@ -6,6 +6,7 @@ TODO
6
6
  lib/spreedly.rb
7
7
  lib/spreedly/common.rb
8
8
  lib/spreedly/mock.rb
9
+ lib/spreedly/test_hacks.rb
9
10
  lib/spreedly/version.rb
10
11
  test/spreedly_gem_test.rb
11
12
  test/test_site.yml
data/README.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  = Spreedly-Gem
2
2
 
3
- * Docs[http://terralien.com/static/projects/spreedly-gem/]
3
+ * http://terralien.com/static/projects/spreedly-gem/
4
4
  * Source[http://github.com/terralien/spreedly-gem]
5
5
 
6
6
  == DESCRIPTION:
data/Rakefile CHANGED
@@ -3,14 +3,12 @@ require './lib/spreedly/version.rb'
3
3
 
4
4
  ENV["COPYFILE_DISABLE"] = "true" # Lose all the fugly ._ files when tar'ing
5
5
 
6
- hoe = nil
7
- Hoe.new('spreedly', Spreedly::VERSION) do |project|
8
- hoe = project
9
- project.rubyforge_name = 'terralien'
10
- project.developer('Nathaniel Talbott', 'nathaniel@terralien.com')
11
- project.test_globs = ["test/**/*_test.rb"]
12
- project.extra_deps = ["mechanize"]
13
- project.extra_dev_deps = ["thoughtbot-shoulda"]
6
+ hoe = Hoe.spec('spreedly') do
7
+ developer('Nathaniel Talbott', 'nathaniel@terralien.com')
8
+ self.rubyforge_name = 'terralien'
9
+ self.test_globs = ["test/**/*_test.rb"]
10
+ self.extra_deps << ["mechanize"]
11
+ self.extra_dev_deps << ["thoughtbot-shoulda"]
14
12
  end
15
13
 
16
14
  def remove_task(*task_names)
@@ -101,14 +101,25 @@ module Spreedly
101
101
  # Creates a new subscriber on Spreedly. The subscriber will NOT
102
102
  # be active - they have to pay or you have to comp them for that
103
103
  # to happen.
104
- def self.create!(id, email=nil, screen_name=nil)
105
- result = Spreedly.post('/subscribers.xml', :body =>
106
- Spreedly.to_xml_params(:subscriber => {:customer_id => id, :email => email, :screen_name => screen_name}))
104
+ #
105
+ # Usage:
106
+ # Spreedly.Subscriber.create!(id, email)
107
+ # Spreedly.Subscriber.create!(id, email, screen_name)
108
+ # Spreedly.Subscriber.create!(id, :email => email, :screen_name => screen_name)
109
+ # Spreedly.Subscriber.create!(id, email, screen_name, :billing_first_name => first_name)
110
+ def self.create!(id, *args)
111
+ optional_attrs = args.last.is_a?(::Hash) ? args.pop : {}
112
+ email, screen_name = args
113
+ subscriber = {:customer_id => id, :email => email, :screen_name => screen_name}.merge(optional_attrs)
114
+ result = Spreedly.post('/subscribers.xml', :body => Spreedly.to_xml_params(:subscriber => subscriber))
107
115
  case result.code.to_s
108
116
  when /2../
109
117
  new(result['subscriber'])
110
118
  when '403'
111
- raise "Could not create subscriber: no id passed OR already exists."
119
+ raise "Could not create subscriber: already exists."
120
+ when '422'
121
+ errors = [*result['errors']].collect{|e| e.last}
122
+ raise "Could not create subscriber: #{errors.join(', ')}"
112
123
  else
113
124
  raise "Could not create subscriber: result code #{result.code}."
114
125
  end
@@ -117,7 +128,7 @@ module Spreedly
117
128
  # Looks a subscriber up by id.
118
129
  def self.find(id)
119
130
  xml = Spreedly.get("/subscribers/#{id}.xml")
120
- (xml.nil? ? nil : new(xml['subscriber']))
131
+ (xml.nil? || xml.empty? ? nil : new(xml['subscriber']))
121
132
  end
122
133
 
123
134
  # Returns all the subscribers in your site.
@@ -161,7 +172,7 @@ module Spreedly
161
172
  def activate_free_trial(plan_id)
162
173
  result = Spreedly.post("/subscribers/#{id}/subscribe_to_free_trial.xml", :body =>
163
174
  Spreedly.to_xml_params(:subscription_plan => {:id => plan_id}))
164
- case result.code
175
+ case result.code.to_s
165
176
  when /2../
166
177
  when '404'
167
178
  raise "Could not active free trial for subscriber: subscriber or subscription plan no longer exists."
@@ -178,7 +189,7 @@ module Spreedly
178
189
  # usage: @subscriber.stop_auto_renew
179
190
  def stop_auto_renew
180
191
  result = Spreedly.post("/subscribers/#{id}/stop_auto_renew.xml")
181
- case result.code
192
+ case result.code.to_s
182
193
  when /2../
183
194
  when '404'
184
195
  raise "Could not stop auto renew for subscriber: subscriber does not exist."
@@ -205,4 +216,4 @@ module Spreedly
205
216
  (plan_type == 'free_trial')
206
217
  end
207
218
  end
208
- end
219
+ end
@@ -21,4 +21,4 @@ module Spreedly
21
21
  def self.edit_subscriber_url(token)
22
22
  "https://spreedly.com/#{site_name}/subscriber_accounts/#{token}"
23
23
  end
24
- end
24
+ end
@@ -23,8 +23,8 @@ module Spreedly
23
23
  end
24
24
 
25
25
  def initialize(params={})
26
- @attributes = params.inject({}){|a,(k,v)| a[k.to_sym] = v; a}
27
- self.class.attributes.each{|k,v| @attributes[k] = v.call}
26
+ @attributes = self.class.attributes.inject({}){|a,(k,v)| a[k.to_sym] = v.call; a}
27
+ params.each {|k,v| @attributes[k.to_sym] = v }
28
28
  end
29
29
 
30
30
  def id
@@ -58,8 +58,10 @@ module Spreedly
58
58
  @subscribers = nil
59
59
  end
60
60
 
61
- def self.create!(id, email=nil, screen_name=nil) # :nodoc: all
62
- sub = new({:customer_id => id, :email => email, :screen_name => screen_name})
61
+ def self.create!(id, *args) # :nodoc: all
62
+ optional_attrs = args.last.is_a?(::Hash) ? args.pop : {}
63
+ email, screen_name = args
64
+ sub = new({:customer_id => id, :email => email, :screen_name => screen_name}.merge(optional_attrs))
63
65
 
64
66
  if subscribers[sub.id]
65
67
  raise "Could not create subscriber: already exists."
@@ -88,7 +90,7 @@ module Spreedly
88
90
  def initialize(params={})
89
91
  super
90
92
  if !id || id == ''
91
- raise "Could not create subscriber: no id passed OR already exists."
93
+ raise "Could not create subscriber: Customer ID can't be blank."
92
94
  end
93
95
  end
94
96
 
@@ -114,8 +116,9 @@ module Spreedly
114
116
  raise "Could not activate free trial for subscriber: validation failed. missing subscription plan id" unless plan_id
115
117
  raise "Could not active free trial for subscriber: subscriber or subscription plan no longer exists." unless self.class.find(id) && SubscriptionPlan.find(plan_id)
116
118
  raise "Could not activate free trial for subscriber: subscription plan either 1) isn't a free trial, 2) the subscriber is not eligible for a free trial, or 3) the subscription plan is not enabled." if on_trial?
117
- @attributes[:active] = true
118
119
  @attributes[:on_trial] = true
120
+ plan = SubscriptionPlan.find(plan_id)
121
+ comp(plan.duration_quantity, plan.duration_units, plan.feature_level)
119
122
  end
120
123
 
121
124
  def stop_auto_renew
@@ -124,12 +127,18 @@ module Spreedly
124
127
  end
125
128
 
126
129
  def subscribe(plan_id)
127
- @attributes[:active] = true
128
130
  @attributes[:recurring] = true
131
+ plan = SubscriptionPlan.find(plan_id)
132
+ comp(plan.duration_quantity, plan.duration_units, plan.feature_level)
129
133
  end
130
134
  end
131
135
 
132
136
  class SubscriptionPlan < Resource
137
+ self.attributes = {
138
+ :plan_type => proc{'regular'},
139
+ :feature_level => proc{''}
140
+ }
141
+
133
142
  def self.all
134
143
  plans.values
135
144
  end
@@ -140,9 +149,9 @@ module Spreedly
140
149
 
141
150
  def self.plans
142
151
  @plans ||= {
143
- 1 => new(:id => 1, :name => 'Default mock plan'),
144
- 2 => new(:id => 2, :name => 'Test Free Trial Plan', :plan_type => 'free_trial'),
145
- 3 => new(:id => 3, :name => 'Test Regular Plan'),
152
+ 1 => new(:id => 1, :name => 'Default mock plan', :duration_quantity => 1, :duration_units => 'days'),
153
+ 2 => new(:id => 2, :name => 'Test Free Trial Plan', :plan_type => 'free_trial', :duration_quantity => 1, :duration_units => 'days'),
154
+ 3 => new(:id => 3, :name => 'Test Regular Plan', :duration_quantity => 1, :duration_units => 'days'),
146
155
  }
147
156
  end
148
157
 
@@ -0,0 +1,24 @@
1
+ require 'mechanize'
2
+
3
+ module Spreedly
4
+ class Subscriber
5
+ # This method is *strictly* for use when testing, and will
6
+ # probably only work against a test Spreedly site anyhow.
7
+ def subscribe(plan_id)
8
+ agent = WWW::Mechanize.new
9
+ page = agent.get(Spreedly.subscribe_url(id, plan_id))
10
+ page = page.forms.first.submit
11
+ form = page.forms.first
12
+ form['credit_card[first_name]'] = 'Joe'
13
+ form['credit_card[last_name]'] = 'Bob'
14
+ form['subscriber[email]'] = 'joe@example.com'
15
+ form['credit_card[number]'] = '4222222222222'
16
+ form['credit_card[card_type]'] = 'visa'
17
+ form['credit_card[verification_value]'] = '234'
18
+ form['credit_card[month]'] = '1'
19
+ form['credit_card[year]'] = '2024'
20
+ page = form.click_button
21
+ raise "Subscription didn't got through" unless page.title == "Thank you!"
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Spreedly
2
- VERSION = "1.3.0"
2
+ VERSION = "1.3.1"
3
3
  end
@@ -34,12 +34,29 @@ class SpreedlyGemTest < Test::Unit::TestCase
34
34
  assert subscribers.size == 1
35
35
  assert_equal two.id, subscribers.first.id
36
36
  end
37
+
38
+ context "adding a subscriber" do
39
+ should "generate a token" do
40
+ subscriber = Spreedly::Subscriber.create!('joe')
41
+ assert_not_nil subscriber.token
42
+ assert_equal subscriber.token, Spreedly::Subscriber.find('joe').token
43
+ end
37
44
 
38
- should "add a subscriber" do
39
- subscriber = Spreedly::Subscriber.create!('joe')
40
- assert_not_nil subscriber.token
41
- assert_equal subscriber.token, Spreedly::Subscriber.find('joe').token
42
- end
45
+ should "accept email address as an argument" do
46
+ subscriber = Spreedly::Subscriber.create!('joe', 'a@b.cd')
47
+ assert_equal 'a@b.cd', Spreedly::Subscriber.find('joe').email
48
+ end
49
+
50
+ should "accept screen name as an argument" do
51
+ subscriber = Spreedly::Subscriber.create!('joe', 'a@b.cd', 'tuna')
52
+ assert_equal 'tuna', Spreedly::Subscriber.find('joe').screen_name
53
+ end
54
+
55
+ should "accept optional arguments: like billing first name" do
56
+ subscriber = Spreedly::Subscriber.create!('joe', {:billing_first_name => 'Joe'})
57
+ assert_equal 'Joe', Spreedly::Subscriber.find('joe').billing_first_name
58
+ end
59
+ end # adding a subscriber
43
60
 
44
61
  should "get a subscriber" do
45
62
  id = create_subscriber.id
@@ -71,7 +88,7 @@ class SpreedlyGemTest < Test::Unit::TestCase
71
88
  ex = assert_raise(RuntimeError) do
72
89
  create_subscriber('')
73
90
  end
74
- assert_match(/no id/i, ex.message)
91
+ assert_match(/customer id can't be blank/i, ex.message)
75
92
  end
76
93
 
77
94
  should "create with additional params" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spreedly
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathaniel Talbott
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-04 00:00:00 -04:00
12
+ date: 2009-09-11 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -40,9 +40,11 @@ dependencies:
40
40
  requirements:
41
41
  - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: 1.12.2
43
+ version: 2.3.3
44
44
  version:
45
- description: The Spreedly gem provides a convenient Ruby wrapper for the goodness that is the http://spreedly.com API. Created by Terralien[http://terralien.com].
45
+ description: |-
46
+ The Spreedly gem provides a convenient Ruby wrapper for the goodness that is
47
+ the http://spreedly.com API. Created by Terralien[http://terralien.com].
46
48
  email:
47
49
  - nathaniel@terralien.com
48
50
  executables: []
@@ -62,6 +64,7 @@ files:
62
64
  - lib/spreedly.rb
63
65
  - lib/spreedly/common.rb
64
66
  - lib/spreedly/mock.rb
67
+ - lib/spreedly/test_hacks.rb
65
68
  - lib/spreedly/version.rb
66
69
  - test/spreedly_gem_test.rb
67
70
  - test/test_site.yml
@@ -122,7 +125,9 @@ files:
122
125
  - vendor/httparty/website/css/common.css
123
126
  - vendor/httparty/website/index.html
124
127
  has_rdoc: true
125
- homepage: Docs[http://terralien.com/static/projects/spreedly-gem/]
128
+ homepage: http://terralien.com/static/projects/spreedly-gem/
129
+ licenses: []
130
+
126
131
  post_install_message:
127
132
  rdoc_options:
128
133
  - --main
@@ -144,9 +149,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
149
  requirements: []
145
150
 
146
151
  rubyforge_project: terralien
147
- rubygems_version: 1.3.1
152
+ rubygems_version: 1.3.5
148
153
  signing_key:
149
- specification_version: 2
154
+ specification_version: 3
150
155
  summary: The Spreedly gem provides a convenient Ruby wrapper for the goodness that is the http://spreedly.com API
151
156
  test_files:
152
157
  - test/spreedly_gem_test.rb