subly 0.1.2 → 0.2.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.
data/lib/subly.rb CHANGED
@@ -38,10 +38,9 @@ module Subly
38
38
 
39
39
  module InstanceMethods
40
40
  def add_subscription(name, args = {})
41
- value = args[:value] || nil
42
- start_date = args[:start_date] || Time.now
43
- end_date = args[:end_date] || nil
44
- self.sublies.create(:name => name, :value => value, :starts_at => start_date, :ends_at => end_date)
41
+ args[:starts_at] ||= Time.now
42
+ args[:name] = name
43
+ self.sublies.create(args)
45
44
  end
46
45
 
47
46
  def has_subscription?(name)
@@ -54,4 +53,4 @@ module Subly
54
53
  end
55
54
  end
56
55
 
57
- ActiveRecord::Base.send :extend, Subly
56
+ ActiveRecord::Base.send :extend, Subly
data/lib/subly/model.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  module Subly
2
2
  class Model < ActiveRecord::Base
3
+ require 'chronic_duration'
3
4
  set_table_name 'subly_models'
4
5
 
5
6
  belongs_to :subscriber, :polymorphic => true
6
7
 
8
+ before_validation :convert_duration
9
+
7
10
  validates_presence_of :subscriber_type
8
11
  validates_presence_of :subscriber_id, :unless => Proc.new { |subly| subly.subscriber_type.nil? }
9
12
  validate :ends_after_starts
@@ -27,11 +30,31 @@ module Subly
27
30
  scoped(:conditions => {:name => name})
28
31
  end
29
32
 
33
+ def duration=(duration)
34
+ @duration = duration
35
+ end
36
+
37
+ def duration
38
+ @duration
39
+ end
40
+
41
+ def active?
42
+ now = Time.now
43
+ !!(starts_at <= now && (ends_at.nil? || ends_at > now))
44
+ end
45
+
30
46
  private
31
47
  def ends_after_starts
32
48
  if !starts_at.nil? && !ends_at.nil? && (ends_at < starts_at)
33
49
  raise "ends_at must be after starts_at"
34
50
  end
35
51
  end
52
+
53
+ def convert_duration
54
+ unless duration.blank?
55
+ self.starts_at = Time.zone.now if self.starts_at.blank?
56
+ self.ends_at = self.starts_at + ::ChronicDuration.parse(self.duration.to_s).seconds
57
+ end
58
+ end
36
59
  end
37
- end
60
+ end
data/lib/subly/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Subly
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -15,6 +15,8 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
15
15
  #ActiveRecord::Schema.verbose = false
16
16
  ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
17
17
 
18
+ ActiveRecord::Base.logger = Logger.new('/dev/null')
19
+
18
20
  ActiveRecord::Base.configurations = true
19
21
  ActiveRecord::Schema.define(:version => 1) do
20
22
  create_table :items do |t|
@@ -43,4 +45,4 @@ ActiveRecord::Schema.define(:version => 1) do
43
45
  add_index :subly_models, [:subscriber_type,:subscriber_id], :name => 'subscriber_idx'
44
46
  add_index :subly_models, :starts_at, :name => 'starts_idx'
45
47
  add_index :subly_models, :ends_at, :name => 'ends_idx'
46
- end
48
+ end
@@ -20,4 +20,9 @@ describe Subly::Model do
20
20
  it "subscription should not be created when ends before starts" 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
+
24
+ it "should be active if it stats in the past and ends in the future" do
25
+ i = Item.create
26
+ 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
+ end
23
28
  end
data/spec/subly_spec.rb CHANGED
@@ -11,7 +11,7 @@ end
11
11
  describe Subly do
12
12
  it "should add a subscription" do
13
13
  thing_one = Thing.create(:name => 'Thing One', :description => 'foo')
14
- thing_one.add_subscription('sub name','sub value').should be_true
14
+ thing_one.add_subscription('sub name',:value => 'sub value').should be_true
15
15
  thing_one.reload
16
16
  thing_one.sublies.count.should == 1
17
17
  end
@@ -26,7 +26,7 @@ describe Subly do
26
26
 
27
27
  it "has_subscription should return true even for expired subscription" do
28
28
  thing_one = Thing.create(:name => 'Thing One', :description => 'foo')
29
- thing_one.add_subscription('sub name', :start_date => Time.now - 1.day, :end_date => Time.now - 2.hours).should be_true
29
+ thing_one.add_subscription('sub name', :starts_at => Time.now - 1.day, :ends_at => Time.now - 2.hours).should be_true
30
30
  thing_one.reload
31
31
  thing_one.has_subscription?('sub name').should be_true
32
32
  end
@@ -42,7 +42,7 @@ describe Subly do
42
42
  it "should find models with even expired subscriptions" do
43
43
  Thing.delete_all
44
44
  thing_one = Thing.create(:name => 'Thing One', :description => 'foo')
45
- thing_one.add_subscription('sub name', :start_date => Time.now - 1.day, :end_date => Time.now - 2.hours).should be_true
45
+ thing_one.add_subscription('sub name', :starts_at => Time.now - 1.day, :ends_at => Time.now - 2.hours).should be_true
46
46
  Thing.with_subscription('sub name').should == [thing_one]
47
47
  thing_one.destroy
48
48
  end
@@ -62,4 +62,14 @@ describe Subly do
62
62
  item.add_subscription('subby')
63
63
  item.is_subby?.should be_true
64
64
  end
65
+
66
+ it "should convert duration to time" do
67
+ time = Time.parse('2001-01-01T010101+0000')
68
+ Time.stub!(:zone).and_return(Time)
69
+ Time.stub!(:now).and_return(time)
70
+ item = Item.create(:name => 'foo')
71
+ item.add_subscription('subby', :duration => "1 year")
72
+ item.is_subby?.should be_true
73
+ item.sublies.last.ends_at.should == time + 1.year
74
+ end
65
75
  end
data/subly.gemspec CHANGED
@@ -20,4 +20,6 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency "rspec"
21
21
  s.add_development_dependency "sqlite3"
22
22
 
23
+ s.add_dependency "chronic_duration"
24
+
23
25
  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.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-12-20 00:00:00.000000000Z
13
+ date: 2012-01-09 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
17
- requirement: &2156236100 !ruby/object:Gem::Requirement
17
+ requirement: &2156449020 !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: *2156236100
25
+ version_requirements: *2156449020
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec
28
- requirement: &2156235620 !ruby/object:Gem::Requirement
28
+ requirement: &2156448640 !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: *2156235620
36
+ version_requirements: *2156448640
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3
39
- requirement: &2156235100 !ruby/object:Gem::Requirement
39
+ requirement: &2156448120 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,7 +44,18 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2156235100
47
+ version_requirements: *2156448120
48
+ - !ruby/object:Gem::Dependency
49
+ name: chronic_duration
50
+ requirement: &2156447620 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *2156447620
48
59
  description: This was purpose built to extend models with subscriptions that were
49
60
  controlled via SalesForce
50
61
  email: