mongoid_publishable 1.0.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/.autotest +1 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +57 -0
- data/Rakefile +2 -0
- data/lib/mongoid/publishable.rb +52 -0
- data/lib/mongoid/publishable/version.rb +5 -0
- data/lib/mongoid_publishable.rb +1 -0
- data/mongoid_publishable.gemspec +21 -0
- data/readme.md +48 -0
- data/spec/mongoid/publishable_spec.rb +94 -0
- data/spec/spec_helper.rb +22 -0
- metadata +81 -0
data/.autotest
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'autotest/growl'
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in mongoid_publishable.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'database_cleaner'
|
7
|
+
gem 'rspec'
|
8
|
+
gem 'autotest'
|
9
|
+
gem 'autotest-growl'
|
10
|
+
gem 'mongoid', '2.0.0.rc.8'
|
11
|
+
gem 'bson_ext'
|
12
|
+
gem 'mongoid-rspec'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
mongoid_publishable (0.9.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ZenTest (4.5.0)
|
10
|
+
activemodel (3.0.5)
|
11
|
+
activesupport (= 3.0.5)
|
12
|
+
builder (~> 2.1.2)
|
13
|
+
i18n (~> 0.4)
|
14
|
+
activesupport (3.0.5)
|
15
|
+
autotest (4.4.6)
|
16
|
+
ZenTest (>= 4.4.1)
|
17
|
+
autotest-growl (0.2.9)
|
18
|
+
bson (1.2.4)
|
19
|
+
bson_ext (1.2.4)
|
20
|
+
builder (2.1.2)
|
21
|
+
database_cleaner (0.6.6)
|
22
|
+
diff-lcs (1.1.2)
|
23
|
+
i18n (0.5.0)
|
24
|
+
mongo (1.2.4)
|
25
|
+
bson (>= 1.2.4)
|
26
|
+
mongoid (2.0.0.rc.8)
|
27
|
+
activemodel (~> 3.0)
|
28
|
+
mongo (~> 1.2)
|
29
|
+
tzinfo (~> 0.3.22)
|
30
|
+
will_paginate (~> 3.0.pre)
|
31
|
+
mongoid-rspec (1.4.1)
|
32
|
+
mongoid (~> 2.0.0.rc.7)
|
33
|
+
mongoid-rspec
|
34
|
+
rspec (~> 2)
|
35
|
+
rspec (2.5.0)
|
36
|
+
rspec-core (~> 2.5.0)
|
37
|
+
rspec-expectations (~> 2.5.0)
|
38
|
+
rspec-mocks (~> 2.5.0)
|
39
|
+
rspec-core (2.5.1)
|
40
|
+
rspec-expectations (2.5.0)
|
41
|
+
diff-lcs (~> 1.1.2)
|
42
|
+
rspec-mocks (2.5.0)
|
43
|
+
tzinfo (0.3.25)
|
44
|
+
will_paginate (3.0.pre2)
|
45
|
+
|
46
|
+
PLATFORMS
|
47
|
+
ruby
|
48
|
+
|
49
|
+
DEPENDENCIES
|
50
|
+
autotest
|
51
|
+
autotest-growl
|
52
|
+
bson_ext
|
53
|
+
database_cleaner
|
54
|
+
mongoid (= 2.0.0.rc.8)
|
55
|
+
mongoid-rspec
|
56
|
+
mongoid_publishable!
|
57
|
+
rspec
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Publishable
|
3
|
+
def self.included(base)
|
4
|
+
base.field :published_at, :type => DateTime, :default => nil
|
5
|
+
base.extend ClassMethods
|
6
|
+
base.send :include, InstanceMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def scheduled
|
11
|
+
where(:published_at => {'$gt' => Time.now}).asc(:published_at)
|
12
|
+
end
|
13
|
+
|
14
|
+
def published
|
15
|
+
where(:published_at => {'$lte' => Time.now}).desc(:published_at)
|
16
|
+
end
|
17
|
+
|
18
|
+
def drafts
|
19
|
+
where(:published_at => nil).desc(:published_at)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
def is_scheduled?
|
25
|
+
return true if self.published_at && self.published_at > Time.now
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
29
|
+
def is_published?
|
30
|
+
return true if self.published_at && self.published_at <= Time.now
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
def is_draft?
|
35
|
+
return true if self.published_at.nil?
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
def schedule!(time)
|
40
|
+
update_attributes(:published_at => time)
|
41
|
+
end
|
42
|
+
|
43
|
+
def publish!
|
44
|
+
update_attributes(:published_at => Time.now)
|
45
|
+
end
|
46
|
+
|
47
|
+
def unpublish!
|
48
|
+
update_attributes(:published_at => nil)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'mongoid/publishable')
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "mongoid/publishable/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "mongoid_publishable"
|
7
|
+
s.version = Mongoid::Publishable::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Nicholas Bruning"]
|
10
|
+
s.email = ["nicholas@bruning.com.au"]
|
11
|
+
s.homepage = "http://github.com/thetron/mongoid_publishable"
|
12
|
+
s.summary = %q{Add publishable behaviours to mongoid models.}
|
13
|
+
s.description = %q{This gem adds some fields, scopes and methods to simplify and declutter your models that need to be drafted and published.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "mongoid_publishable"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
data/readme.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Mongoid Publishable
|
2
|
+
|
3
|
+
Make no mistakes - this is a simple gem. Turned out
|
4
|
+
[we](http://involved.com.au) use this sort of behaviour _a lot_ on our
|
5
|
+
projects, so just broke out into a gem for simplicity.
|
6
|
+
|
7
|
+
## What does it do?
|
8
|
+
|
9
|
+
The gem add some fields, scopes and methods to your models which you
|
10
|
+
want to be able to publish and unpublish. You know, things like blog
|
11
|
+
posts and junk like that.
|
12
|
+
|
13
|
+
## Getting started
|
14
|
+
|
15
|
+
Add the gem to your Gemfile:
|
16
|
+
|
17
|
+
gem 'mongoid_publishable'
|
18
|
+
|
19
|
+
And update your bundle:
|
20
|
+
|
21
|
+
$ bundle update
|
22
|
+
|
23
|
+
## Installation
|
24
|
+
|
25
|
+
In your model just add the following line, like you would with any
|
26
|
+
other mongoid model extension:
|
27
|
+
|
28
|
+
include Mongoid::Publishable
|
29
|
+
|
30
|
+
## Putting it to good use
|
31
|
+
|
32
|
+
Your models will now have a `published_at` date as well as these
|
33
|
+
instance methods (they should be self-explanatory):
|
34
|
+
|
35
|
+
is_scheduled?
|
36
|
+
is_published?
|
37
|
+
is_draft?
|
38
|
+
schedule!(date_time)
|
39
|
+
publish!
|
40
|
+
unpublish!
|
41
|
+
|
42
|
+
Additionally, you get a couple of scopes to help find what you're
|
43
|
+
looking for:
|
44
|
+
|
45
|
+
ModelName.scheduled # returns all scheduled models (published_at is
|
46
|
+
in the future)
|
47
|
+
ModelName.published # returns all published models
|
48
|
+
ModelName.drafts # returns all unpublished models
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
|
3
|
+
class Post
|
4
|
+
include Mongoid::Document
|
5
|
+
include Mongoid::Publishable
|
6
|
+
field :title
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Mongoid::Publishable do
|
10
|
+
before :each do
|
11
|
+
@draft = Post.create(:published_at => nil)
|
12
|
+
@published = Post.create(:published_at => Time.now - 5.minutes)
|
13
|
+
@scheduled = Post.create(:published_at => Time.now + 12.hours)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should have a date and timestamp to represent publish state" do
|
17
|
+
Post.should have_field(:published_at).of_type(DateTime).with_default_value_of(nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be published if the published date is in the past" do
|
21
|
+
@published.is_draft?.should equal false
|
22
|
+
@published.is_published?.should equal true
|
23
|
+
@published.is_scheduled?.should equal false
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be a draft if the published date is not set" do
|
27
|
+
@draft.is_draft?.should == true
|
28
|
+
@draft.is_published?.should == false
|
29
|
+
@draft.is_scheduled?.should == false
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be scheduled if the published date is in the future" do
|
33
|
+
@scheduled.is_draft?.should == false
|
34
|
+
@scheduled.is_published?.should == false
|
35
|
+
@scheduled.is_scheduled?.should == true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be publishable" do
|
39
|
+
@draft.should respond_to :publish!
|
40
|
+
@draft.publish!
|
41
|
+
@draft.is_published?.should equal true
|
42
|
+
@draft.published_at.to_i.should <= Time.now.to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be unpublishable" do
|
46
|
+
@published.should respond_to :unpublish!
|
47
|
+
@published.unpublish!
|
48
|
+
@published.is_draft?.should equal true
|
49
|
+
@published.published_at.should be nil
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be scheduleable" do
|
53
|
+
@draft.should respond_to :schedule!
|
54
|
+
future = (Time.now + 12.hours).to_datetime
|
55
|
+
@draft.schedule!(future)
|
56
|
+
@draft.is_scheduled?.should equal true
|
57
|
+
@draft.published_at.to_i.should == future.to_i
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return all draft models" do
|
61
|
+
Post.drafts.count.should equal 1
|
62
|
+
Post.drafts.first.should == @draft
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return all published models" do
|
66
|
+
Post.published.count.should equal 1
|
67
|
+
Post.published.first.should == @published
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return all scheduled models" do
|
71
|
+
Post.scheduled.count.should equal 1
|
72
|
+
Post.scheduled.first.should == @scheduled
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should return published posts in descending date order" do
|
76
|
+
@draft.publish!
|
77
|
+
@scheduled.publish!
|
78
|
+
last_stamp = Time.now
|
79
|
+
Post.published.each do |post|
|
80
|
+
post.published_at.should <= last_stamp
|
81
|
+
last_stamp = post.published_at
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should return scheduled posts in ascending date order" do
|
86
|
+
@draft.schedule!(Time.now + 1.hour)
|
87
|
+
@published.schedule!(Time.now + 5.days)
|
88
|
+
last_stamp = Time.now
|
89
|
+
Post.scheduled.each do |post|
|
90
|
+
post.published_at.should > last_stamp
|
91
|
+
last_stamp = post.published_at
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
$: << File.expand_path("../../lib", __FILE__)
|
2
|
+
|
3
|
+
require 'database_cleaner'
|
4
|
+
require 'mongoid'
|
5
|
+
require 'mongoid-rspec'
|
6
|
+
require 'mongoid_publishable'
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.include Mongoid::Matchers
|
10
|
+
config.before(:suite) do
|
11
|
+
DatabaseCleaner.strategy = :truncation
|
12
|
+
end
|
13
|
+
|
14
|
+
config.after(:each) do
|
15
|
+
DatabaseCleaner.clean
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Mongoid.configure do |config|
|
20
|
+
config.master = Mongo::Connection.new.db("mongoid_publishable_test")
|
21
|
+
end
|
22
|
+
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mongoid_publishable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Nicholas Bruning
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-26 00:00:00 +11:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: This gem adds some fields, scopes and methods to simplify and declutter your models that need to be drafted and published.
|
23
|
+
email:
|
24
|
+
- nicholas@bruning.com.au
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- .autotest
|
33
|
+
- .gitignore
|
34
|
+
- .rspec
|
35
|
+
- Gemfile
|
36
|
+
- Gemfile.lock
|
37
|
+
- Rakefile
|
38
|
+
- lib/mongoid/publishable.rb
|
39
|
+
- lib/mongoid/publishable/version.rb
|
40
|
+
- lib/mongoid_publishable.rb
|
41
|
+
- mongoid_publishable.gemspec
|
42
|
+
- readme.md
|
43
|
+
- spec/mongoid/publishable_spec.rb
|
44
|
+
- spec/spec_helper.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: http://github.com/thetron/mongoid_publishable
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
rubyforge_project: mongoid_publishable
|
75
|
+
rubygems_version: 1.3.7
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: Add publishable behaviours to mongoid models.
|
79
|
+
test_files:
|
80
|
+
- spec/mongoid/publishable_spec.rb
|
81
|
+
- spec/spec_helper.rb
|