subly 0.2.0 → 0.3.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.
@@ -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: