subly 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -50,6 +50,17 @@ module Subly
50
50
  def has_active_subscription?(name)
51
51
  self.sublies.active.by_name(name).count > 0
52
52
  end
53
+
54
+ def cancel_active_subscriptions(name)
55
+ self.sublies.active.by_name(name).collect(&:expire_now)
56
+ end
57
+
58
+ def cancel_all_subscriptions(name)
59
+ self.sublies.unexpired.by_name(name).each do |sub|
60
+ #if active, deactivate, else destroy as and end_time greater than start is not valid
61
+ sub.active? ? sub.expire_now : sub.destroy
62
+ end
63
+ end
53
64
  end
54
65
  end
55
66
 
@@ -21,6 +21,11 @@ module Subly
21
21
  scoped(:conditions => ['starts_at <= ? AND ends_at <= ?', now, now])
22
22
  end
23
23
 
24
+ def self.unexpired
25
+ now = Time.zone.now
26
+ scoped(:conditions => ['ends_at > ? OR ends_at IS NULL', now])
27
+ end
28
+
24
29
  def self.for_subscriber(sub)
25
30
  raise ArgumentError('wrong number of arguments (0 for 1)') if sub.blank?
26
31
  scoped(:conditions => ['subscriber_type = ? AND subscriber_id = ?',sub.class.to_s, sub.id])
@@ -43,6 +48,20 @@ module Subly
43
48
  !!(starts_at <= now && (ends_at.nil? || ends_at > now))
44
49
  end
45
50
 
51
+ def expired?
52
+ now = Time.now
53
+ !(ends_at.nil? || ends_at > now)
54
+ end
55
+
56
+ def in_the_future?
57
+ now = Time.now
58
+ !!(starts_at > now && (ends_at.nil? || ends_at > now))
59
+ end
60
+
61
+ def expire_now
62
+ self.update_attribute(:ends_at, Time.now)
63
+ end
64
+
46
65
  private
47
66
  def ends_after_starts
48
67
  if !starts_at.nil? && !ends_at.nil? && (ends_at < starts_at)
@@ -1,3 +1,3 @@
1
1
  module Subly
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -6,7 +6,9 @@ require 'subly'
6
6
  require 'sqlite3'
7
7
 
8
8
  #Time.zone.now doesn't work in test
9
-
9
+ def stub_time_zone
10
+ Time.stub!(:zone).and_return(Time)
11
+ end
10
12
 
11
13
  # Requires supporting files with custom matchers and macros, etc,
12
14
  # in ./support/ and its subdirectories.
@@ -21,8 +21,23 @@ describe Subly::Model do
21
21
  lambda{Subly::Model.create!(:name => 'Foo', :subscriber_type => 'Foo', :subscriber_id => 1, :starts_at => Time.now + 1.minute, :ends_at => Time.now - 1.minute)}.should raise_error
22
22
  end
23
23
 
24
- it "should be active if it stats in the past and ends in the future" do
25
- i = Item.create
24
+ it "should be expire immediately" do
25
+ s = Subly::Model.create(:name => 'Foo', :subscriber_type => 'Item', :subscriber_id => 1, :starts_at => Time.now - 5.minute)
26
+ s.active?.should be_true
27
+ s.expire_now.should be_true
28
+ s.reload
29
+ s.active?.should be_false
30
+ end
31
+
32
+ it "should be active if it starts in the past and ends in the future" do
26
33
  Subly::Model.new(:name => 'Foo', :subscriber_type => 'Item', :subscriber_id => 1, :starts_at => Time.now - 1.minute, :ends_at => Time.now + 1.hour).active?.should be_true
27
34
  end
35
+
36
+ it "should be expired if it ends in the past" do
37
+ Subly::Model.new(:name => 'Foo', :subscriber_type => 'Item', :subscriber_id => 1, :starts_at => Time.now - 5.minute, :ends_at => Time.now - 4.minutes).expired?.should be_true
38
+ end
39
+
40
+ it "should be in_the_future if it starts and ends in the future" do
41
+ Subly::Model.new(:name => 'Foo', :subscriber_type => 'Item', :subscriber_id => 1, :starts_at => Time.now + 5.minute, :ends_at => Time.now + 14.minutes).in_the_future?.should be_true
42
+ end
28
43
  end
@@ -17,7 +17,7 @@ describe Subly do
17
17
  end
18
18
 
19
19
  it "subscription should default to active" do
20
- Time.stub!(:zone).and_return(Time)
20
+ stub_time_zone
21
21
  thing_one = Thing.create(:name => 'Thing One', :description => 'foo')
22
22
  thing_one.add_subscription('sub name').should be_true
23
23
  thing_one.reload
@@ -52,12 +52,12 @@ describe Subly do
52
52
  end
53
53
 
54
54
  it "is method should be false if it does not have an active sub" do
55
- Time.stub!(:zone).and_return(Time)
55
+ stub_time_zone
56
56
  Item.new.is_subby?.should be_false
57
57
  end
58
58
 
59
59
  it "is method should be true if it has an active sub" do
60
- Time.stub!(:zone).and_return(Time)
60
+ stub_time_zone
61
61
  item = Item.create(:name => 'foo')
62
62
  item.add_subscription('subby')
63
63
  item.is_subby?.should be_true
@@ -65,11 +65,35 @@ describe Subly do
65
65
 
66
66
  it "should convert duration to time" do
67
67
  time = Time.parse('2001-01-01T010101+0000')
68
- Time.stub!(:zone).and_return(Time)
68
+ stub_time_zone
69
69
  Time.stub!(:now).and_return(time)
70
70
  item = Item.create(:name => 'foo')
71
71
  item.add_subscription('subby', :duration => "1 year")
72
72
  item.is_subby?.should be_true
73
73
  item.sublies.last.ends_at.should == time + 1.year
74
74
  end
75
+
76
+ it "should change the end date of all active subscriptions" do
77
+ stub_time_zone
78
+ thing_one = Thing.create(:name => 'Thing One', :description => 'foo')
79
+ thing_one.add_subscription('sub name',:value => 'sub value').should be_true
80
+ thing_one.add_subscription('sub name',:value => 'sub value', :starts_at => Time.now + 1.month).should be_true
81
+ thing_one.reload
82
+ thing_one.cancel_active_subscriptions('sub name')
83
+ thing_one.sublies.count.should == 2
84
+ thing_one.sublies.unexpired.count.should == 1
85
+ thing_one.sublies.expired.count.should == 1
86
+ end
87
+
88
+ it "should cancel all subscriptions" do
89
+ stub_time_zone
90
+ thing_one = Thing.create(:name => 'Thing One', :description => 'foo')
91
+ thing_one.add_subscription('sub name',:value => 'sub value').should be_true
92
+ thing_one.add_subscription('sub name',:value => 'sub value', :starts_at => Time.now + 1.month).should be_true
93
+ thing_one.reload
94
+ thing_one.cancel_all_subscriptions('sub name')
95
+ thing_one.sublies.count.should == 1
96
+ thing_one.sublies.unexpired.count.should == 0
97
+ thing_one.sublies.expired.count.should == 1
98
+ end
75
99
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ date: 2012-01-09 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
17
- requirement: &2156449020 !ruby/object:Gem::Requirement
17
+ requirement: &2156824500 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 2.3.12
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2156449020
25
+ version_requirements: *2156824500
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec
28
- requirement: &2156448640 !ruby/object:Gem::Requirement
28
+ requirement: &2156824060 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2156448640
36
+ version_requirements: *2156824060
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3
39
- requirement: &2156448120 !ruby/object:Gem::Requirement
39
+ requirement: &2156823560 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2156448120
47
+ version_requirements: *2156823560
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: chronic_duration
50
- requirement: &2156447620 !ruby/object:Gem::Requirement
50
+ requirement: &2156823020 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *2156447620
58
+ version_requirements: *2156823020
59
59
  description: This was purpose built to extend models with subscriptions that were
60
60
  controlled via SalesForce
61
61
  email: