couch_scheduler 0.0.1 → 0.1.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/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
|