Skip to content

Commit

Permalink
refs mongoid#177 added rake task to set slug for legacy data and test…
Browse files Browse the repository at this point in the history
… cases

refs mongoid#177 RuboCop fixes

updated README and removed class variable
  • Loading branch information
Anuja Joshi committed Nov 4, 2015
1 parent 59fced3 commit ea52ad8
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 0 deletions.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,16 @@ post = Post.find '50b1386a0482939864000001' # Finds by bson ids
```
[Examine slug.rb](lib/mongoid/slug.rb) for all available options.

To set slugs for existing records run following rake task:

```ruby
rake mongoid_slug:set
```
You can pass model names as an option for which you want to set slugs:

```ruby
rake mongoid_slug:set[Model1,Model2]
```
Custom Slug Generation
-------

Expand Down
7 changes: 7 additions & 0 deletions lib/mongoid/slug.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@
require 'mongoid/slug/unique_slug'
require 'mongoid/slug/slug_id_strategy'
require 'mongoid-compatibility'
require 'mongoid/slug/railtie' if defined?(Rails)

module Mongoid
# Slugs your Mongoid model.
module Slug
extend ActiveSupport::Concern
@classes = []

class << self
attr_accessor :classes
end

included do
cattr_accessor :reserved_words,
Expand All @@ -22,6 +28,7 @@ module Slug

# field :_slugs, type: Array, default: [], localize: false
# alias_attribute :slugs, :_slugs
Mongoid::Slug.classes << self
end

module ClassMethods
Expand Down
9 changes: 9 additions & 0 deletions lib/mongoid/slug/railtie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module Mongoid
module Slug
class Railtie < Rails::Railtie
rake_tasks do
Dir[File.join(File.dirname(__FILE__), '../../tasks/*.rake')].each { |f| load f }
end
end
end
end
16 changes: 16 additions & 0 deletions lib/tasks/mongoid_slug.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace :mongoid_slug do
desc 'Goes though all documents and sets slug if not already set'
task set: :environment do |_, args|
::Rails.application.eager_load! if defined?(Rails)
unless Mongoid::Slug.classes.blank?
models = args.extras
klasses = Mongoid::Slug.classes
klasses = (klasses.map(&:to_s) & models.map(&:classify)).map(&:constantize) unless models.blank?
klasses.each do |klass|
# set slug for objects having blank slug
klass.each { |object| object.set_slug! unless object.slugs? }
end
end
p 'Completed mongoid_slug:set'
end
end
5 changes: 5 additions & 0 deletions spec/models/uninitalized_slug_first.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UninitalizedSlugFirst
include Mongoid::Document
field :_id, type: Integer
field :name, type: String
end
5 changes: 5 additions & 0 deletions spec/models/uninitalized_slug_second.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UninitalizedSlugSecond
include Mongoid::Document
field :_id, type: Integer
field :name, type: String
end
5 changes: 5 additions & 0 deletions spec/models/uninitalized_slug_third.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class UninitalizedSlugThird
include Mongoid::Document
field :_id, type: Integer
field :name, type: String
end
52 changes: 52 additions & 0 deletions spec/tasks/mongoid_slug_rake_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
require 'spec_helper'
require 'rake'

describe 'mongoid_slug:set' do
before :all do
load File.expand_path('../../../lib/tasks/mongoid_slug.rake', __FILE__)
Rake::Task.define_task(:environment)
end

context 'when models parameter is passed' do
let!(:uninitalized_slug1) { UninitalizedSlugFirst.create(id: 455, name: 'uninitalized_slug1') }
let!(:uninitalized_slug2) { UninitalizedSlugSecond.create(id: 456, name: 'uninitalized_slug2') }

it 'Goes though all documents of passed models and sets slug if not already set' do
class UninitalizedSlugFirst
include Mongoid::Slug
slug :name
end

class UninitalizedSlugSecond
include Mongoid::Slug
slug :name
end

expect(uninitalized_slug1.slugs).to be_nil
expect(uninitalized_slug2.slugs).to be_nil

Rake::Task['mongoid_slug:set'].reenable
Rake::Task['mongoid_slug:set'].invoke('UninitalizedSlugFirst')

expect(uninitalized_slug1.reload.slugs).to eq(['uninitalized-slug1'])
expect(uninitalized_slug2.reload.slugs).to eq []
end
end

context 'when models parameter is not passed' do
let!(:uninitalized_slug3) { UninitalizedSlugThird.create(id: 70, name: 'uninitalized_slug3') }

it 'Goes though all documents and sets slug if not already set' do
class UninitalizedSlugThird
include Mongoid::Slug
slug :name
end
expect(uninitalized_slug3.slugs).to be_nil

Rake::Task['mongoid_slug:set'].reenable
Rake::Task['mongoid_slug:set'].invoke

expect(uninitalized_slug3.reload.slugs).to eq(['uninitalized-slug3'])
end
end
end

0 comments on commit ea52ad8

Please sign in to comment.