saucy 0.10.6 → 0.10.7
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/CHANGELOG.md +4 -0
- data/README.md +8 -1
- data/app/controllers/plans_controller.rb +6 -0
- data/lib/saucy/account.rb +8 -1
- data/spec/controllers/plans_controller_spec.rb +10 -0
- data/spec/models/subscription_spec.rb +27 -0
- data/spec/support/notifications.rb +16 -0
- metadata +31 -12
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -45,7 +45,14 @@ In addition, there are a number of strings such as application name, support url
|
|
45
45
|
|
46
46
|
There is a `saucy:daily` rake task which should be run on a regular basis to send receipts and payment processing problem emails.
|
47
47
|
|
48
|
-
Saucy accounts become "activated" once an initial setup step is complete.
|
48
|
+
Saucy accounts become "activated" once an initial setup step is complete.
|
49
|
+
This could be creating the first bug for a bug tracker, or setting up a client
|
50
|
+
gem for a server API. Once the application detects that the account is
|
51
|
+
activated, it should set "activated" to true on the account. This will prevent
|
52
|
+
followup emails being sent to users that have already set up their accounts.
|
53
|
+
It will also send an "Activated" event to Kissmetrics through Saucy-kiss, if
|
54
|
+
Saucy-kiss is installed.
|
55
|
+
|
49
56
|
|
50
57
|
Development environment
|
51
58
|
-----------------------
|
@@ -3,6 +3,7 @@ class PlansController < ApplicationController
|
|
3
3
|
|
4
4
|
def index
|
5
5
|
@plans = Plan.ordered
|
6
|
+
notify_observers_of_plan_list_view
|
6
7
|
end
|
7
8
|
|
8
9
|
def edit
|
@@ -31,6 +32,11 @@ class PlansController < ApplicationController
|
|
31
32
|
notify_observers("plan_downgraded", from_plan, to_plan) if from_plan.price > to_plan.price
|
32
33
|
end
|
33
34
|
|
35
|
+
def notify_observers_of_plan_list_view
|
36
|
+
Saucy::Notifications.notify_observers("plan_list_viewed",
|
37
|
+
:request => request)
|
38
|
+
end
|
39
|
+
|
34
40
|
def notify_observers(event_name, from_plan, to_plan)
|
35
41
|
Saucy::Notifications.notify_observers(event_name,
|
36
42
|
:account => @account,
|
data/lib/saucy/account.rb
CHANGED
@@ -30,6 +30,7 @@ module Saucy
|
|
30
30
|
:message => "must be only lower case letters and underscores."
|
31
31
|
|
32
32
|
before_create :set_trial_expiration
|
33
|
+
after_save :record_new_activations
|
33
34
|
end
|
34
35
|
|
35
36
|
module InstanceMethods
|
@@ -75,7 +76,13 @@ module Saucy
|
|
75
76
|
else
|
76
77
|
30
|
77
78
|
end
|
78
|
-
self.trial_expires_at = number_free_days.days.from_now(created_at || Time.now)
|
79
|
+
self.trial_expires_at = number_free_days.days.from_now(created_at || Time.zone.now)
|
80
|
+
end
|
81
|
+
|
82
|
+
def record_new_activations
|
83
|
+
if activated_changed? && activated?
|
84
|
+
Saucy::Notifications.notify_observers("activated", :account => self)
|
85
|
+
end
|
79
86
|
end
|
80
87
|
|
81
88
|
def users_count
|
@@ -69,3 +69,13 @@ describe PlansController, "successful update that does not change the plan", :as
|
|
69
69
|
should_not notify_observers("plan_downgraded", :account => account, :request => request, :from_plan => original_plan, :to_plan => original_plan)
|
70
70
|
end
|
71
71
|
end
|
72
|
+
|
73
|
+
describe PlansController, "viewing plan list" do
|
74
|
+
before do
|
75
|
+
get :index
|
76
|
+
end
|
77
|
+
|
78
|
+
it "notifies observers" do
|
79
|
+
should notify_observers("plan_list_viewed", :request => request)
|
80
|
+
end
|
81
|
+
end
|
@@ -497,3 +497,30 @@ describe Account, "with a paid subscription that is past due" do
|
|
497
497
|
subject.next_billing_date.to_s.should == subscription["next_billing_date"].to_s
|
498
498
|
end
|
499
499
|
end
|
500
|
+
|
501
|
+
describe Account, "that is activated" do
|
502
|
+
subject do
|
503
|
+
Factory(:account,
|
504
|
+
:cardholder_name => "Ralph Robot",
|
505
|
+
:billing_email => "ralph@example.com",
|
506
|
+
:card_number => "4111111111111111",
|
507
|
+
:verification_code => "123",
|
508
|
+
:expiration_month => 5,
|
509
|
+
:expiration_year => 2012,
|
510
|
+
:plan => Factory(:paid_plan))
|
511
|
+
end
|
512
|
+
|
513
|
+
it "notifies observers of activations" do
|
514
|
+
subject.activated = true
|
515
|
+
subject.save!
|
516
|
+
should notify_observers("activated", :account => subject)
|
517
|
+
end
|
518
|
+
|
519
|
+
it "notifies observers of activation only once" do
|
520
|
+
2.times do
|
521
|
+
subject.activated = true
|
522
|
+
subject.save!
|
523
|
+
end
|
524
|
+
should notify_observers_once("activated", :account => subject)
|
525
|
+
end
|
526
|
+
end
|
@@ -58,6 +58,22 @@ RSpec::Matchers.define :notify_observers do |event_name, data|
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
RSpec::Matchers.define :notify_observers_once do |event_name, data|
|
62
|
+
match do |ignored_subject|
|
63
|
+
@event = RecordedEvent.new(event_name, data)
|
64
|
+
recorder.events.select{|ev| ev == @event }.size.should == 1
|
65
|
+
end
|
66
|
+
|
67
|
+
failure_message do
|
68
|
+
times_notified = recorder.events.select{|ev| ev == @event }.size
|
69
|
+
"Expected event 1 time:\n#{@event.inspect}\n\nGot event #{times_notified} times"
|
70
|
+
end
|
71
|
+
|
72
|
+
def recorder
|
73
|
+
RecordingObserver.instance
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
61
77
|
RSpec.configure do |config|
|
62
78
|
config.before do
|
63
79
|
Saucy::Notifications.clear_observers
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saucy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 57
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 10
|
8
|
-
-
|
9
|
-
version: 0.10.
|
9
|
+
- 7
|
10
|
+
version: 0.10.7
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- thoughtbot, inc.
|
@@ -19,105 +20,119 @@ autorequire:
|
|
19
20
|
bindir: bin
|
20
21
|
cert_chain: []
|
21
22
|
|
22
|
-
date: 2011-
|
23
|
+
date: 2011-08-12 00:00:00 -04:00
|
23
24
|
default_executable:
|
24
25
|
dependencies:
|
25
26
|
- !ruby/object:Gem::Dependency
|
26
27
|
name: clearance
|
27
28
|
prerelease: false
|
29
|
+
type: :runtime
|
28
30
|
requirement: &id001 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
29
32
|
requirements:
|
30
33
|
- - ~>
|
31
34
|
- !ruby/object:Gem::Version
|
35
|
+
hash: 55
|
32
36
|
segments:
|
33
37
|
- 0
|
34
38
|
- 11
|
35
39
|
- 2
|
36
40
|
version: 0.11.2
|
37
|
-
type: :runtime
|
38
41
|
version_requirements: *id001
|
39
42
|
- !ruby/object:Gem::Dependency
|
40
43
|
name: formtastic
|
41
44
|
prerelease: false
|
45
|
+
type: :runtime
|
42
46
|
requirement: &id002 !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
43
48
|
requirements:
|
44
49
|
- - ">="
|
45
50
|
- !ruby/object:Gem::Version
|
51
|
+
hash: 11
|
46
52
|
segments:
|
47
53
|
- 1
|
48
54
|
- 2
|
49
55
|
version: "1.2"
|
50
|
-
type: :runtime
|
51
56
|
version_requirements: *id002
|
52
57
|
- !ruby/object:Gem::Dependency
|
53
58
|
name: railties
|
54
59
|
prerelease: false
|
60
|
+
type: :runtime
|
55
61
|
requirement: &id003 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
56
63
|
requirements:
|
57
64
|
- - ">="
|
58
65
|
- !ruby/object:Gem::Version
|
66
|
+
hash: 1
|
59
67
|
segments:
|
60
68
|
- 3
|
61
69
|
- 0
|
62
70
|
- 3
|
63
71
|
version: 3.0.3
|
64
|
-
type: :runtime
|
65
72
|
version_requirements: *id003
|
66
73
|
- !ruby/object:Gem::Dependency
|
67
74
|
name: braintree
|
68
75
|
prerelease: false
|
76
|
+
type: :runtime
|
69
77
|
requirement: &id004 !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
70
79
|
requirements:
|
71
80
|
- - ">="
|
72
81
|
- !ruby/object:Gem::Version
|
82
|
+
hash: 19
|
73
83
|
segments:
|
74
84
|
- 2
|
75
85
|
- 6
|
76
86
|
- 2
|
77
87
|
version: 2.6.2
|
78
|
-
type: :runtime
|
79
88
|
version_requirements: *id004
|
80
89
|
- !ruby/object:Gem::Dependency
|
81
90
|
name: sham_rack
|
82
91
|
prerelease: false
|
92
|
+
type: :runtime
|
83
93
|
requirement: &id005 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
84
95
|
requirements:
|
85
96
|
- - "="
|
86
97
|
- !ruby/object:Gem::Version
|
98
|
+
hash: 29
|
87
99
|
segments:
|
88
100
|
- 1
|
89
101
|
- 3
|
90
102
|
- 3
|
91
103
|
version: 1.3.3
|
92
|
-
type: :runtime
|
93
104
|
version_requirements: *id005
|
94
105
|
- !ruby/object:Gem::Dependency
|
95
106
|
name: sinatra
|
96
107
|
prerelease: false
|
108
|
+
type: :runtime
|
97
109
|
requirement: &id006 !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
98
111
|
requirements:
|
99
112
|
- - ">="
|
100
113
|
- !ruby/object:Gem::Version
|
114
|
+
hash: 23
|
101
115
|
segments:
|
102
116
|
- 1
|
103
117
|
- 1
|
104
118
|
- 2
|
105
119
|
version: 1.1.2
|
106
|
-
type: :runtime
|
107
120
|
version_requirements: *id006
|
108
121
|
- !ruby/object:Gem::Dependency
|
109
122
|
name: aruba
|
110
123
|
prerelease: false
|
124
|
+
type: :development
|
111
125
|
requirement: &id007 !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
112
127
|
requirements:
|
113
128
|
- - "="
|
114
129
|
- !ruby/object:Gem::Version
|
130
|
+
hash: 27
|
115
131
|
segments:
|
116
132
|
- 0
|
117
133
|
- 2
|
118
134
|
- 6
|
119
135
|
version: 0.2.6
|
120
|
-
type: :development
|
121
136
|
version_requirements: *id007
|
122
137
|
description: Clearance-based Rails engine for Software as a Service (Saas) that provides account and project management
|
123
138
|
email: support@thoughtbot.com
|
@@ -309,23 +324,27 @@ rdoc_options: []
|
|
309
324
|
require_paths:
|
310
325
|
- lib
|
311
326
|
required_ruby_version: !ruby/object:Gem::Requirement
|
327
|
+
none: false
|
312
328
|
requirements:
|
313
329
|
- - ">="
|
314
330
|
- !ruby/object:Gem::Version
|
331
|
+
hash: 3
|
315
332
|
segments:
|
316
333
|
- 0
|
317
334
|
version: "0"
|
318
335
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
336
|
+
none: false
|
319
337
|
requirements:
|
320
338
|
- - ">="
|
321
339
|
- !ruby/object:Gem::Version
|
340
|
+
hash: 3
|
322
341
|
segments:
|
323
342
|
- 0
|
324
343
|
version: "0"
|
325
344
|
requirements: []
|
326
345
|
|
327
346
|
rubyforge_project:
|
328
|
-
rubygems_version: 1.
|
347
|
+
rubygems_version: 1.6.1
|
329
348
|
signing_key:
|
330
349
|
specification_version: 3
|
331
350
|
summary: Clearance-based Rails engine for SaaS
|