couch_scheduler 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/features/couch_publish_integration.feature +8 -8
- data/features/couch_visible_and_couch_publish_integration.feature +18 -8
- data/features/couch_visible_integration.feature +8 -8
- data/features/step_definitions/couch_visible_and_couch_publish_integration.rb +37 -0
- data/lib/couch_scheduler.rb +1 -1
- data/lib/couch_scheduler/couch_publish_and_couch_visible_integration.rb +13 -14
- data/lib/couch_scheduler/couch_publish_integration.rb +11 -14
- data/lib/couch_scheduler/couch_scheduler.rb +1 -1
- data/lib/couch_scheduler/couch_visible_integration.rb +10 -13
- data/lib/couch_scheduler/{time_massager.rb → options.rb} +14 -3
- data/readme.markdown +22 -20
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
@@ -7,14 +7,14 @@ Feature: CouchPublish Integration
|
|
7
7
|
Given an Article model that includes CouchPublish and CouchVisible
|
8
8
|
When I create several published articles scheduled now and in the future
|
9
9
|
And I create several unpublished articles scheduled now and in the future
|
10
|
-
When I call "Article.
|
10
|
+
When I call "Article.by_schedule :published => true"
|
11
11
|
Then I should receive the published documents scheduled now
|
12
|
-
When I call "Article.
|
12
|
+
When I call "Article.by_schedule :unpublished => true"
|
13
13
|
Then I should receive the unpublished documents scheduled now
|
14
14
|
When I wait till the future
|
15
|
-
And I call "Article.
|
15
|
+
And I call "Article.by_schedule :published => true"
|
16
16
|
Then I should receive the published documents scheduled in the future
|
17
|
-
When I call "Article.
|
17
|
+
When I call "Article.by_schedule :unpublished => true"
|
18
18
|
Then I should receive the unpublished documents scheduled in the future
|
19
19
|
|
20
20
|
@focus
|
@@ -24,12 +24,12 @@ Feature: CouchPublish Integration
|
|
24
24
|
And I create 3 published articles schedule in the future
|
25
25
|
And I create 4 unpublished articles scheduled now
|
26
26
|
And I create 7 unpublished articles schedule in the future
|
27
|
-
When I call "Article.
|
27
|
+
When I call "Article.count_schedule :published => true"
|
28
28
|
Then I should receive 2
|
29
|
-
When I call "Article.
|
29
|
+
When I call "Article.count_schedule :unpublished => true"
|
30
30
|
Then I should receive 4
|
31
31
|
When I wait till the future
|
32
|
-
And I call "Article.
|
32
|
+
And I call "Article.count_schedule :published => true"
|
33
33
|
Then I should receive 3
|
34
|
-
When I call "Article.
|
34
|
+
When I call "Article.count_schedule :unpublished => true"
|
35
35
|
Then I should receive 7
|
@@ -6,30 +6,40 @@ Feature: CouchVisible and CouchPublish Integration
|
|
6
6
|
Scenario: Query for shown, published documents within a schedule
|
7
7
|
Given a Slide model that includes CouchVisible, CouchPublish and CouchScheduler
|
8
8
|
When I create several shown, published slides scheduled now and in the future
|
9
|
+
And I create several shown, unpublished slides scheduled now and in the future
|
9
10
|
And I create several hidden, published slides scheduled now and in the future
|
10
|
-
|
11
|
+
And I create several hidden, unpublished slides scheduled now and in the future
|
12
|
+
When I call "Slide.by_schedule :published => true, :shown => true"
|
11
13
|
Then I should receive the shown, published documents scheduled now
|
12
|
-
When I call "Slide.
|
14
|
+
When I call "Slide.by_schedule :published => true, :hidden => true"
|
13
15
|
Then I should receive the hidden, published documents scheduled now
|
14
16
|
When I wait till the future
|
15
|
-
And I call "Slide.
|
17
|
+
And I call "Slide.by_schedule :published => true, :shown => true"
|
16
18
|
Then I should receive the shown, published documents scheduled in the future
|
17
|
-
When I call "Slide.
|
19
|
+
When I call "Slide.by_schedule :published =>true, :hidden => true"
|
18
20
|
Then I should receive the hidden, published documents scheduled in the future
|
19
21
|
|
20
22
|
@focus
|
21
23
|
Scenario: Count of shown and hidden documents within a schedule
|
22
24
|
Given a Slide model that includes CouchVisible, CouchPublish and CouchScheduler
|
23
25
|
When I create 2 shown, published slides scheduled now
|
26
|
+
When I create 6 shown, unpublished slides scheduled now
|
24
27
|
And I create 3 shown, published slides schedule in the future
|
28
|
+
And I create 9 shown, unpublished slides schedule in the future
|
25
29
|
And I create 4 hidden, published slides scheduled now
|
30
|
+
And I create 12 hidden, unpublished slides scheduled now
|
26
31
|
And I create 7 hidden, published slides schedule in the future
|
27
|
-
|
32
|
+
And I create 21 hidden, unpublished slides schedule in the future
|
33
|
+
When I call "Slide.count_schedule :published => true, :shown => true"
|
28
34
|
Then I should receive 2
|
29
|
-
When I call "Slide.
|
35
|
+
When I call "Slide.count_schedule :published => true"
|
36
|
+
Then I should receive 6
|
37
|
+
When I call "Slide.count_schedule"
|
38
|
+
Then I should receive 24
|
39
|
+
When I call "Slide.count_schedule :published =>true, :hidden => true"
|
30
40
|
Then I should receive 4
|
31
41
|
When I wait till the future
|
32
|
-
And I call "Slide.
|
42
|
+
And I call "Slide.count_schedule :published => true, :shown => true"
|
33
43
|
Then I should receive 3
|
34
|
-
When I call "Slide.
|
44
|
+
When I call "Slide.count_schedule :published =>true, :hidden => true"
|
35
45
|
Then I should receive 7
|
@@ -7,14 +7,14 @@ Feature: CouchVisible Integration
|
|
7
7
|
Given an Post model that includes CouchVisible and CouchScheduler
|
8
8
|
When I create several shown posts scheduled now and in the future
|
9
9
|
And I create several hidden posts scheduled now and in the future
|
10
|
-
When I call "Post.
|
10
|
+
When I call "Post.by_schedule :shown => true"
|
11
11
|
Then I should receive the shown documents scheduled now
|
12
|
-
When I call "Post.
|
12
|
+
When I call "Post.by_schedule :hidden => true"
|
13
13
|
Then I should receive the hidden documents scheduled now
|
14
14
|
When I wait till the future
|
15
|
-
And I call "Post.
|
15
|
+
And I call "Post.by_schedule :shown => true"
|
16
16
|
Then I should receive the shown documents scheduled in the future
|
17
|
-
When I call "Post.
|
17
|
+
When I call "Post.by_schedule :hidden => true"
|
18
18
|
Then I should receive the hidden documents scheduled in the future
|
19
19
|
|
20
20
|
@focus
|
@@ -24,12 +24,12 @@ Feature: CouchVisible Integration
|
|
24
24
|
And I create 3 shown posts schedule in the future
|
25
25
|
And I create 4 hidden posts scheduled now
|
26
26
|
And I create 7 hidden posts schedule in the future
|
27
|
-
When I call "Post.
|
27
|
+
When I call "Post.count_schedule :shown => true"
|
28
28
|
Then I should receive 2
|
29
|
-
When I call "Post.
|
29
|
+
When I call "Post.count_schedule :hidden => true"
|
30
30
|
Then I should receive 4
|
31
31
|
When I wait till the future
|
32
|
-
And I call "Post.
|
32
|
+
And I call "Post.count_schedule :shown => true"
|
33
33
|
Then I should receive 3
|
34
|
-
When I call "Post.
|
34
|
+
When I call "Post.count_schedule :hidden => true"
|
35
35
|
Then I should receive 7
|
@@ -16,6 +16,15 @@ When /^I create several shown, published slides scheduled now and in the future$
|
|
16
16
|
5.times { @published_shown_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.show!; a.publish! } }
|
17
17
|
end
|
18
18
|
|
19
|
+
When /^I create several shown, unpublished slides scheduled now and in the future$/ do
|
20
|
+
@unpublished_shown_now = []
|
21
|
+
@unpublished_shown_future = []
|
22
|
+
|
23
|
+
5.times { @unpublished_shown_now << Slide.create(:start => Time.now, :end => 1.day.from_now).tap {|a| a.show!} }
|
24
|
+
5.times { @unpublished_shown_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.show!} }
|
25
|
+
end
|
26
|
+
|
27
|
+
|
19
28
|
When /^I create several hidden, published slides scheduled now and in the future$/ do
|
20
29
|
@published_hidden_now = []
|
21
30
|
@published_hidden_future = []
|
@@ -24,6 +33,14 @@ When /^I create several hidden, published slides scheduled now and in the future
|
|
24
33
|
5.times { @published_hidden_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.hide!; a.publish! } }
|
25
34
|
end
|
26
35
|
|
36
|
+
When /^I create several hidden, unpublished slides scheduled now and in the future$/ do
|
37
|
+
@unpublished_hidden_now = []
|
38
|
+
@unpublished_hidden_future = []
|
39
|
+
|
40
|
+
5.times { @unpublished_hidden_now << Slide.create(:start => Time.now, :end => 1.day.from_now).tap {|a| a.hide! } }
|
41
|
+
5.times { @unpublished_hidden_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.hide! } }
|
42
|
+
end
|
43
|
+
|
27
44
|
Then /^I should receive the shown, published documents scheduled now$/ do
|
28
45
|
@result.collect(&:id).sort.should == @published_shown_now.collect(&:id).sort
|
29
46
|
end
|
@@ -59,3 +76,23 @@ When /^I create (\d+) hidden, published slides schedule in the future$/ do |num|
|
|
59
76
|
@published_hidden_future = []
|
60
77
|
num.to_i.times { @published_hidden_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.hide!; a.publish!}}
|
61
78
|
end
|
79
|
+
|
80
|
+
When /^I create (\d+) shown, unpublished slides scheduled now$/ do |num|
|
81
|
+
@unpublished_shown_future = []
|
82
|
+
num.to_i.times { @unpublished_shown_future << Slide.create(:start => Time.now, :end => 1.day.from_now).tap {|a| a.show!}}
|
83
|
+
end
|
84
|
+
|
85
|
+
When /^I create (\d+) shown, unpublished slides schedule in the future$/ do |num|
|
86
|
+
@unpublished_shown_future = []
|
87
|
+
num.to_i.times { @unpublished_shown_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.show!}}
|
88
|
+
end
|
89
|
+
|
90
|
+
When /^I create (\d+) hidden, unpublished slides scheduled now$/ do |num|
|
91
|
+
@unpublished_hidden_now = []
|
92
|
+
num.to_i.times { @unpublished_hidden_now << Slide.create(:start => Time.now, :end => 1.day.from_now).tap {|a| a.hide!}}
|
93
|
+
end
|
94
|
+
|
95
|
+
When /^I create (\d+) hidden, unpublished slides schedule in the future$/ do |num|
|
96
|
+
@unpublished_hidden_future = []
|
97
|
+
num.to_i.times { @unpublished_hidden_future << Slide.create(:start => 1.day.from_now, :end => 2.days.from_now).tap {|a| a.hide!}}
|
98
|
+
end
|
data/lib/couch_scheduler.rb
CHANGED
@@ -2,25 +2,24 @@ module CouchScheduler
|
|
2
2
|
module CouchVisibleCouchPublishIntegration
|
3
3
|
def self.included(base)
|
4
4
|
base.extend ClassMethods
|
5
|
-
base.view_by :couch_schedule_and_published_and_shown,
|
5
|
+
base.view_by :couch_schedule_and_published_and_shown, :map => Map.new(base, :published, :shown).to_s, :reduce => '_count'
|
6
6
|
base.view_by :couch_schedule_and_published_and_hidden, :map => Map.new(base, :published, :hidden).to_s, :reduce => '_count'
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
by_couch_schedule_and_hidden CouchScheduler::TimeMassager.massage(options)
|
16
|
-
end
|
17
|
-
|
18
|
-
def count_schedule_and_published_and_shown(options={})
|
19
|
-
count_by_map :by_schedule_and_published_and_shown, options
|
20
|
-
end
|
10
|
+
def by_schedule(options={})
|
11
|
+
shown = options[:shown]
|
12
|
+
hidden = options[:hidden]
|
13
|
+
published = options[:published]
|
14
|
+
unpublished = options[:unpublished]
|
21
15
|
|
22
|
-
|
23
|
-
|
16
|
+
if shown == true && published == true
|
17
|
+
by_couch_schedule_and_published_and_shown CouchScheduler::Options.new(options).to_hash
|
18
|
+
elsif hidden == true && published == true
|
19
|
+
by_couch_schedule_and_published_and_hidden CouchScheduler::Options.new(options).to_hash
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
@@ -3,24 +3,21 @@ module CouchScheduler
|
|
3
3
|
def self.included(base)
|
4
4
|
base.extend ClassMethods
|
5
5
|
base.view_by :couch_schedule_and_unpublished, :map => Map.new(base, :unpublished).to_s, :reduce => '_count'
|
6
|
-
base.view_by :couch_schedule_and_published,
|
6
|
+
base.view_by :couch_schedule_and_published, :map => Map.new(base, :published).to_s, :reduce => '_count'
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def by_schedule_and_unpublished(options={})
|
15
|
-
by_couch_schedule_and_unpublished CouchScheduler::TimeMassager.massage(options)
|
16
|
-
end
|
17
|
-
|
18
|
-
def count_schedule_and_published(options={})
|
19
|
-
count_by_map :by_schedule_and_published, options
|
20
|
-
end
|
10
|
+
def by_schedule(options={})
|
11
|
+
published = options[:published]
|
12
|
+
unpublished = options[:unpublished]
|
21
13
|
|
22
|
-
|
23
|
-
|
14
|
+
if published == true || unpublished == false
|
15
|
+
by_couch_schedule_and_published CouchScheduler::Options.new(options).to_hash
|
16
|
+
elsif unpublished == true || published == false
|
17
|
+
by_couch_schedule_and_unpublished CouchScheduler::Options.new(options).to_hash
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
24
21
|
end
|
25
22
|
end
|
26
23
|
end
|
@@ -7,20 +7,17 @@ module CouchScheduler
|
|
7
7
|
end
|
8
8
|
|
9
9
|
module ClassMethods
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def by_schedule_and_hidden(options={})
|
15
|
-
by_couch_schedule_and_hidden CouchScheduler::TimeMassager.massage(options)
|
16
|
-
end
|
17
|
-
|
18
|
-
def count_schedule_and_shown(options={})
|
19
|
-
count_by_map :by_schedule_and_shown, options
|
20
|
-
end
|
10
|
+
def by_schedule(options={})
|
11
|
+
shown = options.delete :shown
|
12
|
+
hidden = options.delete :hidden
|
21
13
|
|
22
|
-
|
23
|
-
|
14
|
+
if shown == true || hidden == false
|
15
|
+
by_couch_schedule_and_shown CouchScheduler::Options.new(options).to_hash
|
16
|
+
elsif hidden == true || shown == false
|
17
|
+
by_couch_schedule_and_hidden CouchScheduler::Options.new(options).to_hash
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
24
21
|
end
|
25
22
|
end
|
26
23
|
end
|
@@ -1,7 +1,14 @@
|
|
1
1
|
module CouchScheduler
|
2
|
-
|
3
|
-
|
2
|
+
class Options
|
3
|
+
def initialize(options)
|
4
|
+
@options = massage options.dup
|
5
|
+
end
|
4
6
|
|
7
|
+
def to_hash
|
8
|
+
@options
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
5
12
|
def massage(options)
|
6
13
|
if !options[:startkey] && !options[:key]
|
7
14
|
options = {:key => format_time(Time.now), :reduce => false}.merge options
|
@@ -11,10 +18,14 @@ module CouchScheduler
|
|
11
18
|
options[option] = format_time options[option] if options[option].kind_of?(Time)
|
12
19
|
end
|
13
20
|
|
21
|
+
options.delete :shown
|
22
|
+
options.delete :hidden
|
23
|
+
options.delete :published
|
24
|
+
options.delete :unpublished
|
25
|
+
|
14
26
|
options
|
15
27
|
end
|
16
28
|
|
17
|
-
private
|
18
29
|
def format_time(t)
|
19
30
|
[t.year, t.month - 1, t.day, 0, 0, 0]
|
20
31
|
end
|
data/readme.markdown
CHANGED
@@ -25,6 +25,7 @@ You can now provide start and end dates for your articles:
|
|
25
25
|
@article.end = 6.days.from_now
|
26
26
|
@article.save
|
27
27
|
|
28
|
+
|
28
29
|
## Validation
|
29
30
|
|
30
31
|
`CouchSchedule` will use `ActiveModel` validation to ensure that your `end` is after your `start`:
|
@@ -34,6 +35,7 @@ You can now provide start and end dates for your articles:
|
|
34
35
|
@article.save #==> false
|
35
36
|
@artile.errors #==> [:end, " must be greater than start"]
|
36
37
|
|
38
|
+
|
37
39
|
## Uses?
|
38
40
|
|
39
41
|
Now what can you do with these start and end dates? One use: publishing.
|
@@ -46,6 +48,8 @@ Let's imagine that you only to display this article on your website between the
|
|
46
48
|
|
47
49
|
@article.within_schedule? #==> false
|
48
50
|
|
51
|
+
### Query (.by_schedule)
|
52
|
+
|
49
53
|
You can also query the databases for all of the articles currently within their schedule via `by_schedule`:
|
50
54
|
|
51
55
|
Article.by_schedule
|
@@ -68,54 +72,52 @@ Like `by_schedule`, `count_schedule` supports all the usual map/reduce options:
|
|
68
72
|
Article.count_schedule :key => 10.days.from_now
|
69
73
|
#==> the count of all articles that are within their start/end dates 10 days from now
|
70
74
|
|
75
|
+
|
71
76
|
## CouchPublish Integration
|
72
77
|
|
73
|
-
If you include `CouchScheduler` into a model that already includes `CouchPublish`, then you
|
78
|
+
If you include `CouchScheduler` into a model that already includes `CouchPublish`, then you can pass `:publish => true` and `:unpublish => true`:
|
74
79
|
|
75
80
|
# with a class definition like this:
|
76
81
|
class Article < CouchRest::Model::Base
|
77
82
|
include CouchPublish
|
78
83
|
include CouchScheduler
|
84
|
+
|
79
85
|
property :title
|
80
86
|
end
|
81
87
|
|
82
88
|
# you can query for all published and currently scheduled documents like this:
|
83
|
-
Article.
|
89
|
+
Article.by_schedule :published => true
|
84
90
|
#==> returns all documents that are published and currently within their schedule
|
85
91
|
|
86
92
|
# you can also query for the unpublished and currently scheduled documents like this:
|
87
|
-
Article.
|
93
|
+
Article.by_schedule :unpublished => true
|
94
|
+
|
95
|
+
You can also pass `:published => true` and `:unpublished => true` to the `count_schedule` method.
|
88
96
|
|
89
|
-
You'll also get `count_schedule_and_published` and `count_schedule_and_unpublished` for free.
|
90
97
|
|
91
98
|
## CouchVisible Integration
|
92
99
|
|
93
100
|
If you include `CouchScheduler` into a model that includes `CouchVisible`, you'll get the following map/reduce functions for free:
|
94
101
|
|
95
|
-
Article.
|
102
|
+
Article.by_schedule :shown => true
|
96
103
|
#==> all articles that are currently within their start and end dates and are shown
|
97
104
|
|
98
|
-
Article.
|
105
|
+
Article.by_schedule :hidden => true
|
99
106
|
#==> all articles that are currently within their start and end dates and are hidden
|
100
107
|
|
101
|
-
Article.
|
102
|
-
Article.
|
103
|
-
|
104
|
-
## CouchPublish/CouchVisible integration
|
108
|
+
Article.count_schedule :shown => true
|
109
|
+
Article.count_schedule :hidden => true
|
105
110
|
|
106
|
-
If you include `CouchScheduler` into a model that includes both `CouchVisible` and `CouchPublish`, you'll get the following map/reduce functions for free:
|
107
111
|
|
108
|
-
|
109
|
-
Article.by_schedule_and_published_and_hidden
|
110
|
-
Article.by_schedule_and_unpublished_and_shown
|
111
|
-
Article.by_schedule_and_unpublished_and_hidden
|
112
|
+
## CouchPublish/CouchVisible integration
|
112
113
|
|
113
|
-
|
114
|
+
If you include `CouchScheduler` into a model that includes both `CouchVisible` and `CouchPublish`, you can pass `:published => true`, `:unpublished => true`, `:shown => true`, `:hidden => true` to your schedule query methods:
|
114
115
|
|
115
|
-
Article.
|
116
|
-
Article.
|
117
|
-
Article.
|
118
|
-
Article.
|
116
|
+
Article.by_schedule :published => true, :shown => true
|
117
|
+
Article.by_schedule :unpublished => true, :hidden => true
|
118
|
+
Article.count_schedule :published => true, :shown => true
|
119
|
+
Article.count_schedule :unpublished => true, :hidden => true
|
120
|
+
|
119
121
|
|
120
122
|
## LICENSE
|
121
123
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couch_scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matt Parker
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-23 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: cucumber
|
@@ -133,7 +133,7 @@ files:
|
|
133
133
|
- lib/couch_scheduler/couch_scheduler.rb
|
134
134
|
- lib/couch_scheduler/couch_visible_integration.rb
|
135
135
|
- lib/couch_scheduler/map.rb
|
136
|
-
- lib/couch_scheduler/
|
136
|
+
- lib/couch_scheduler/options.rb
|
137
137
|
- lib/couch_scheduler.rb
|
138
138
|
- VERSION
|
139
139
|
- readme.markdown
|