mongoid_misc 0.0.1

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.
Files changed (42) hide show
  1. data/Rakefile +10 -0
  2. data/lib/carrierwave_ext/fixes.rb +12 -0
  3. data/lib/carrierwave_ext/micelaneous.rb +26 -0
  4. data/lib/carrierwave_ext/mongoid_embedded.rb +37 -0
  5. data/lib/carrierwave_ext/spec.rb +25 -0
  6. data/lib/carrierwave_ext.rb +17 -0
  7. data/lib/mongo_ext/spec.rb +11 -0
  8. data/lib/mongo_ext/upsert.rb +12 -0
  9. data/lib/mongo_ext.rb +3 -0
  10. data/lib/mongo_migration/adapters/mongoid.rb +9 -0
  11. data/lib/mongo_migration/definition.rb +19 -0
  12. data/lib/mongo_migration/migration.rb +71 -0
  13. data/lib/mongo_migration/tasks.rb +19 -0
  14. data/lib/mongo_migration.rb +14 -0
  15. data/lib/mongoid_misc/attribute_cache.rb +16 -0
  16. data/lib/mongoid_misc/attribute_convertors.rb +71 -0
  17. data/lib/mongoid_misc/belongs_to_with_counter_cache.rb +43 -0
  18. data/lib/mongoid_misc/gems.rb +16 -0
  19. data/lib/mongoid_misc/hacks.rb +43 -0
  20. data/lib/mongoid_misc/micelaneous.rb +91 -0
  21. data/lib/mongoid_misc/simple_finders.rb +44 -0
  22. data/lib/mongoid_misc/spec.rb +37 -0
  23. data/lib/mongoid_misc/support.rb +13 -0
  24. data/lib/mongoid_misc.rb +38 -0
  25. data/readme.md +85 -0
  26. data/spec/carrierwave_ext/mount_uploader_spec/plane.jpg +0 -0
  27. data/spec/carrierwave_ext/mount_uploader_spec/plane2.jpg +0 -0
  28. data/spec/carrierwave_ext/mount_uploader_spec.rb +158 -0
  29. data/spec/carrierwave_ext/spec_helper.rb +7 -0
  30. data/spec/carrierwave_ext/uploader_spec/ship.jpg +0 -0
  31. data/spec/carrierwave_ext/uploader_spec//321/204/320/260/320/270/314/206/320/273 /321/201 /320/277/321/200/320/276/320/261/320/265/320/273/320/260/320/274/320/270.txt" +1 -0
  32. data/spec/carrierwave_ext/uploader_spec.rb +61 -0
  33. data/spec/mongo_ext/spec_helper.rb +4 -0
  34. data/spec/mongo_ext/upsert_spec.rb +20 -0
  35. data/spec/mongo_migration/basic_spec.rb +110 -0
  36. data/spec/mongo_migration/spec_helper.rb +5 -0
  37. data/spec/mongoid_misc/attribute_convertors_spec.rb +70 -0
  38. data/spec/mongoid_misc/belongs_to_with_counter_cache_spec.rb +41 -0
  39. data/spec/mongoid_misc/micelaneous_spec.rb +92 -0
  40. data/spec/mongoid_misc/simple_finders_spec.rb +56 -0
  41. data/spec/mongoid_misc/spec_helper.rb +4 -0
  42. metadata +208 -0
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'rake_ext'
2
+
3
+ project(
4
+ name: "mongoid_misc",
5
+ gem: true,
6
+ summary: "Extensions for Mongoid",
7
+
8
+ author: "Alexey Petrushin",
9
+ homepage: "http://github.com/alexeypetrushin/mongoid_misc"
10
+ )
@@ -0,0 +1,12 @@
1
+ CarrierWave::SanitizedFile.class_eval do
2
+ def sanitize_regexp
3
+ /[^[:word:]\.\-\+\s_]/i
4
+ end
5
+ end
6
+
7
+ CarrierWave::Uploader::Cache.class_eval do
8
+ def original_filename=(filename)
9
+ raise CarrierWave::InvalidParameter, "invalid filename" unless filename =~ /\A[[:word:]\.\-\+\s_]+\z/i
10
+ @original_filename = filename
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ #
2
+ # Changing filename format from <version>_<filename_with_extension> to <name>.<version>.<extension>
3
+ #
4
+ CarrierWave::Uploader::Versions.class_eval do
5
+ def full_filename(for_file)
6
+ name = super
7
+ if version_name
8
+ ext = File.extname name
9
+ base = File.basename name, ext
10
+ "#{base}.#{version_name}#{ext}"
11
+ else
12
+ name
13
+ end
14
+ end
15
+
16
+ def full_original_filename
17
+ name = super
18
+ if version_name
19
+ ext = File.extname name
20
+ base = File.basename name, ext
21
+ "#{base}.#{version_name}#{ext}"
22
+ else
23
+ name
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ #
2
+ # Because of Mongoid doesn't fires some events on embedded documents
3
+ # (it has 'smart' callback system and doesn't fires :save/:destroy if document don't really saved/destroyed)
4
+ # we need to do it manually.
5
+ #
6
+
7
+ Mongoid::Document.class_eval do
8
+ def each_embedded association_name, &b
9
+ Array(send(association_name)).each &b
10
+ end
11
+ end
12
+
13
+ module CarrierWave::MongoidEmbedded
14
+ extend ActiveSupport::Concern
15
+
16
+ module ClassMethods
17
+ def mount_embedded_uploader association_name, column
18
+ after_save do |doc|
19
+ doc.each_embedded(association_name) do |embedded|
20
+ embedded.send "store_#{column}!"
21
+ end
22
+ end
23
+
24
+ before_save do |doc|
25
+ doc.each_embedded(association_name) do |embedded|
26
+ embedded.send "write_#{column}_identifier"
27
+ end
28
+ end
29
+
30
+ after_destroy do |doc|
31
+ doc.each_embedded(association_name) do |embedded|
32
+ embedded.send "remove_#{column}!"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ require 'mongoid_misc/spec'
2
+
3
+ module CarrierWaveExtSpecHelper
4
+ TEST_PATH, TEST_CACHE_PATH = '/tmp/spec_fs', '/tmp/spec_fs_cache'
5
+
6
+ def with_files
7
+ before do
8
+ CarrierWave.configure do |config|
9
+ config.storage = :file
10
+ config.enable_processing = false
11
+
12
+ config.cache_dir = TEST_CACHE_PATH
13
+ config.root = TEST_PATH
14
+ end
15
+ end
16
+
17
+ before do
18
+ [TEST_PATH, TEST_CACHE_PATH].each{|p| FileUtils.rm_r(p) if File.exist?(p)}
19
+ end
20
+ before do
21
+ [TEST_PATH, TEST_CACHE_PATH].each{|p| FileUtils.rm_r(p) if File.exist?(p)}
22
+ end
23
+ end
24
+ end
25
+ rspec.extend CarrierWaveExtSpecHelper
@@ -0,0 +1,17 @@
1
+ require 'carrierwave'
2
+ require 'carrierwave/validations/active_model'
3
+ require 'carrierwave/orm/mongoid'
4
+
5
+ %w(
6
+ fixes
7
+ micelaneous
8
+ mongoid_embedded
9
+ ).each{|f| require "carrierwave_ext/#{f}"}
10
+
11
+ CarrierWave::Uploader::Base.class_eval do
12
+ def name; model.send("#{mounted_as}_filename") end
13
+ end
14
+
15
+ Mongoid::Document.class_eval do
16
+ include CarrierWave::MongoidEmbedded
17
+ end
@@ -0,0 +1,11 @@
1
+ rspec do
2
+ def clear_mongo_database name = 'test'
3
+ connection = Mongo::Connection.new
4
+ db = connection.db(name)
5
+ db.collection_names.each do |name|
6
+ next if name =~ /^system\./
7
+ db.collection(name).drop
8
+ end
9
+ db
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ #
2
+ # upsert
3
+ #
4
+ Mongo::Collection.class_eval do
5
+ def upsert! query, opt
6
+ # opt.size.must == 1
7
+ # opt.must_be.a Hash
8
+ # opt.values.first.must_be.a Hash
9
+
10
+ update(query, opt, {upsert: true, safe: true})
11
+ end
12
+ end
data/lib/mongo_ext.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'mongo'
2
+
3
+ require 'mongo_ext/upsert'
@@ -0,0 +1,9 @@
1
+ class Mongo::Migration::Mongoid
2
+ def logger
3
+ Mongoid.logger
4
+ end
5
+
6
+ def database name
7
+ name == :default ? Mongoid.master : Mongoid.databases[name.to_s]
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ class Mongo::Migration::Definition
2
+ def upgrade &block
3
+ if block
4
+ @upgrade = block
5
+ else
6
+ @upgrade
7
+ end
8
+ end
9
+ alias_method :up, :upgrade
10
+
11
+ def downgrade &block
12
+ if block
13
+ @downgrade = block
14
+ else
15
+ @downgrade
16
+ end
17
+ end
18
+ alias_method :down, :downgrade
19
+ end
@@ -0,0 +1,71 @@
1
+ class Mongo::Migration
2
+ attr_accessor :adapter
3
+
4
+ def initialize adapter = nil
5
+ @adapter = adapter
6
+ end
7
+
8
+ def define version, database_name = :default, &block
9
+ raise "version should be an Integer! (but you provided '#{version}' instad)!" unless version.is_a? Integer
10
+ definition = Definition.new
11
+ block.call definition
12
+ definitions[database_name][version] = definition
13
+ end
14
+
15
+ def update version, database_name = :default
16
+ db = adapter.database database_name
17
+
18
+ if metadata(db)['version'] == version
19
+ adapter.logger.info "Database '#{database_name}' already is of #{version} version, no migration needed"
20
+ return false
21
+ else
22
+ adapter.logger.info "Migration for '#{database_name}', updating to #{version}"
23
+ end
24
+
25
+ increase_db_version database_name, db while metadata(db)['version'] < version
26
+ decrease_db_version database_name, db while metadata(db)['version'] > version
27
+ true
28
+ end
29
+
30
+ def metadata db
31
+ col = db.collection 'db_metadata'
32
+ col.find_one || {'version' => 0}
33
+ end
34
+
35
+ def definitions
36
+ @definitions ||= Hash.new{|h, k| h[k] = []}
37
+ end
38
+
39
+ protected
40
+ def increase_db_version database_name, db
41
+ m = metadata(db)
42
+ migration = definitions[database_name][m['version'] + 1]
43
+ raise "No upgrade for version #{m['version'] + 1} of '#{database_name}' Database!" unless migration and migration.up
44
+
45
+ migration.up.call db
46
+
47
+ m['version'] += 1
48
+ update_metadata db, m
49
+
50
+ adapter.logger.info "Database '#{database_name}' upgraded to version #{m['version']}."
51
+ end
52
+
53
+ def decrease_db_version database_name, db
54
+ m = metadata(db)
55
+ migration = definitions[database_name][m['version']]
56
+ raise "No downgrade for version #{m['version']} of '#{database_name}' Database!" unless migration and migration.down
57
+
58
+ migration.down.call db
59
+
60
+ m['version'] -= 1
61
+ update_metadata db, m
62
+
63
+ adapter.logger.info "Database '#{database_name}' downgraded to version #{m['version']}."
64
+ end
65
+
66
+
67
+ def update_metadata db, metadata
68
+ col = db.collection 'db_metadata'
69
+ col.save metadata.to_hash
70
+ end
71
+ end
@@ -0,0 +1,19 @@
1
+ namespace :db do
2
+ desc "Migrate Database"
3
+ task migrate: :migration_evnironment do
4
+ require 'mongo_migration'
5
+
6
+ database_name = (ENV['d'] || ENV['database'] || :default).to_sym
7
+ version = ENV['v'] || ENV['version']
8
+
9
+ if version.blank?
10
+ size = Mongo.migration.definitions[database_name].size
11
+ highest_defined_version = size == 0 ? 0 : size - 1
12
+ version = highest_defined_version
13
+ else
14
+ version = version.to_i
15
+ end
16
+
17
+ Mongo.migration.update version, database_name
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'mongo_ext'
2
+
3
+ class Mongo::Migration; end
4
+
5
+ %w(
6
+ definition
7
+ migration
8
+ ).each{|f| require "mongo_migration/#{f}"}
9
+
10
+ Mongo.class_eval do
11
+ class << self
12
+ attr_accessor :migration
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Mongoid::AttributeCache
2
+ extend ActiveSupport::Concern
3
+
4
+ def cache
5
+ @cache ||= {}
6
+ end
7
+
8
+ def clear_cache
9
+ @cache = {}
10
+ end
11
+
12
+ def reload
13
+ @cache.clear if @cache
14
+ super
15
+ end
16
+ end
@@ -0,0 +1,71 @@
1
+ module Mongoid::AttributeConvertors
2
+ extend ActiveSupport::Concern
3
+
4
+ CONVERTORS = {
5
+ line: {
6
+ from_string: -> s {(s || "").split(',').collect{|s| s.strip}},
7
+ to_string: -> v {v.join(', ')}
8
+ },
9
+ column: {
10
+ from_string: -> s {(s || "").split("\n").collect{|s| s.strip}},
11
+ to_string: -> v {v.join("\n")}
12
+ },
13
+ yaml: {
14
+ from_string: -> s {YAML.load s rescue {}},
15
+ to_string: -> v {
16
+ # Mongoid uses it's internal Hash that doesn't support to_yaml
17
+ hash = {}; v.each{|k, v| hash[k] = v}
18
+ hash.to_yaml.strip
19
+ }
20
+ },
21
+ json: {
22
+ from_string: -> s {JSON.parse s rescue {}},
23
+ to_string: -> v {
24
+ # Mongoid uses it's internal Hash that doesn't support to_yaml
25
+ hash = {}; v.each{|k, v| hash[k] = v}
26
+ hash.to_json.strip
27
+ }
28
+ }
29
+ }
30
+
31
+ module ClassMethods
32
+ # supporf for :as_string option
33
+ def field name, options = {}
34
+ if converter_name = options[:as_string]
35
+ available_as_string name, converter_name
36
+ attr_protected "#{name}_as_string".to_sym if options[:protected]
37
+ end
38
+
39
+ super
40
+ end
41
+
42
+ def available_as_string name, converter_name
43
+ converter = CONVERTORS[converter_name]
44
+ raise "unknown converter name :#{converter_name} for :#{name} field!" unless converter
45
+
46
+ from_string, to_string = converter[:from_string], converter[:to_string]
47
+ name_as_string = "#{name}_as_string".to_sym
48
+ define_method name_as_string do
49
+ cache[name_as_string] ||= to_string.call(send(name))
50
+ end
51
+
52
+ define_method "#{name_as_string}=" do |value|
53
+ cache.delete name_as_string
54
+ self.send "#{name}=", from_string.call(value)
55
+ end
56
+ end
57
+
58
+ def available_as_yaml name
59
+ raise "delimiter not specified for :#{name} field!" unless delimiter
60
+ method = "#{name}_as_string"
61
+ define_method method do
62
+ self.send(name).join(delimiter)
63
+ end
64
+ define_method "#{method}=" do |value|
65
+ value = (value || "").split(delimiter.strip).collect{|s| s.strip}
66
+ self.send "#{name}=", value
67
+ end
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,43 @@
1
+ module Mongoid::BelongsToWithCounterCache
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ #
6
+ # CounterCache
7
+ # belongs_to :item, counter_cashe: true
8
+ #
9
+ def belongs_to name, options = {}, &block
10
+ add_counter_cache name, options if options.delete(:counter_cache)
11
+ super
12
+ end
13
+
14
+ protected
15
+ def add_counter_cache name, options
16
+ name = name.to_s
17
+ association_field = "#{name}_id"
18
+ cache_attribute_field = "#{self.alias.pluralize.underscore}_count"
19
+ cache_class = if class_name = options[:class_name]
20
+ class_name.constantize
21
+ else
22
+ name.classify.constantize
23
+ end
24
+ raise "field :#{cache_attribute_field} not defined on :#{cache_class}!" unless cache_class.fields.include? cache_attribute_field
25
+ increase_method_name = "increase_#{cache_class.alias.underscore}_#{self.alias.pluralize.underscore}_counter"
26
+ decrease_method_name = "decrease_#{cache_class.alias.underscore}_#{self.alias.pluralize.underscore}_counter"
27
+
28
+ define_method increase_method_name do
29
+ cache_class.upsert!({id: self.send(association_field)}, :$inc => {cache_attribute_field => 1})
30
+ end
31
+ protected increase_method_name
32
+
33
+ define_method decrease_method_name do
34
+ cache_class.upsert!({id: self.send(association_field)}, :$inc => {cache_attribute_field => -1})
35
+ end
36
+ protected decrease_method_name
37
+
38
+ after_create increase_method_name
39
+ after_destroy decrease_method_name
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,16 @@
1
+ # dependencies for core gems
2
+ gem 'i18n', '0.5.0'
3
+ gem 'activesupport', '3.0.7'
4
+ gem 'activemodel', '3.0.7'
5
+ gem 'bson', '1.3.1'
6
+ gem 'bson_ext', '1.3.1'
7
+ gem 'mongo', '1.3.0'
8
+ gem 'will_paginate', '2.3.15'
9
+
10
+ gem 'mini_magick', '3.2.1'
11
+ gem 'subexec', '0.0.4'
12
+
13
+ # core gems
14
+ gem 'mongoid', '2.0.2'
15
+
16
+ gem 'carrierwave', '0.5.4'
@@ -0,0 +1,43 @@
1
+ #
2
+ # Allow to specify different model name than class name
3
+ #
4
+ ActiveModel::Name.class_eval do
5
+ def initialize klass, name = nil
6
+ name ||= klass.name
7
+
8
+ super name
9
+
10
+ @klass = klass
11
+ @singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze
12
+ @plural = ActiveSupport::Inflector.pluralize(@singular).freeze
13
+ @element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze
14
+ @human = ActiveSupport::Inflector.humanize(@element).freeze
15
+ @collection = ActiveSupport::Inflector.tableize(self).freeze
16
+ @partial_path = "#{@collection}/#{@element}".freeze
17
+ @i18n_key = ActiveSupport::Inflector.underscore(self).tr('/', '.').to_sym
18
+ end
19
+ end
20
+
21
+
22
+ #
23
+ # Mongoid uses Proxy over Mongo::Collection, so we need to define all extra method on this proxy by hands
24
+ #
25
+ %w(upsert!).each do |name|
26
+ Mongoid::Collection.send(:define_method, name){|*args| master.collection.send(name, *args)}
27
+ end
28
+
29
+
30
+ #
31
+ # Default value on the :foreign_key
32
+ #
33
+ Mongoid::Relations::Metadata.class_eval do
34
+ def foreign_key_default_with_options
35
+ self[:default] || foreign_key_default_without_options
36
+ end
37
+ alias_method_chain :foreign_key_default, :options
38
+ end
39
+
40
+
41
+ #
42
+ # dynamic default scope
43
+ #
@@ -0,0 +1,91 @@
1
+ module Mongoid::Micelaneous
2
+ extend ActiveSupport::Concern
3
+
4
+ def upsert! *args
5
+ self.class.upsert!({id: id}, *args)
6
+ end
7
+
8
+ def exist?
9
+ self.class.where(_id: id).count > 0
10
+ end
11
+ alias_method :exists?, :exist?
12
+
13
+ def dom_id
14
+ new_record? ? "new_#{self.class.name.underscore}" : to_param
15
+ end
16
+
17
+ def first! *a
18
+ super || raise(Mongoid::Errors::DocumentNotFound.new(self, a))
19
+ end
20
+
21
+ def set_protected_attributes attribute_names, attributes
22
+ attribute_names.each do |name|
23
+ send "#{name}=", attributes[name] if attributes.include? name
24
+ end
25
+ end
26
+
27
+ def t *a
28
+ I18n.t *a
29
+ end
30
+
31
+ module ClassMethods
32
+ # #
33
+ # # Database aliases
34
+ # #
35
+ # def set_database_alias als
36
+ # name = Mongoid.database_aliases[als] || raise("unknown database alias '#{als}'!")
37
+ # set_database name
38
+ # end
39
+
40
+
41
+ #
42
+ # model_name
43
+ #
44
+ def model_name *args
45
+ if args.empty?
46
+ @model_name ||= ::ActiveModel::Name.new self, self.alias
47
+ else
48
+ @model_name = ::ActiveModel::Name.new self, args.first
49
+ end
50
+ end
51
+
52
+
53
+ #
54
+ # Sequentiall :all for big collection
55
+ #
56
+ def all_sequentially &block
57
+ page, per_page = 1, 5
58
+ begin
59
+ results = paginate(page: page, per_page: per_page, order: '_id asc')
60
+ results.each{|o| block.call o}
61
+ page += 1
62
+ end until results.blank? or results.size < per_page
63
+ end
64
+
65
+
66
+ #
67
+ # shortcut for upsert
68
+ #
69
+ def upsert! query, *args
70
+ query[:_id] = query.delete :id if query.include? :id
71
+ collection.upsert! query, *args
72
+ end
73
+
74
+
75
+ def to_param
76
+ (id || '').to_s
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+
83
+ # #
84
+ # # Database aliases
85
+ # #
86
+ # module Mongoid
87
+ # def self.database_aliases; @database_aliases ||= {} end
88
+ # def self.set_database_aliases aliases
89
+ # database_aliases.merge! aliases
90
+ # end
91
+ # end
@@ -0,0 +1,44 @@
1
+ module Mongoid::SimpleFinders
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def method_missing clause, *a, &b
6
+ if clause =~ /^([a-z]_by_[a-z_])|(by_[a-z_])/
7
+ clause = clause.to_s
8
+
9
+ bang = clause =~ /!$/
10
+ clause = clause[0..-2] if bang
11
+
12
+ finder, field = if clause =~ /^by_/
13
+ ['first', clause.sub(/by_/, '')]
14
+ else
15
+ clause.split(/_by_/, 2)
16
+ end
17
+ finder = 'first' if finder == 'find'
18
+
19
+ raise "You can't use bang version with :#{finder}!" if bang and finder != 'first'
20
+
21
+ raise "invalid arguments for finder (#{a})!" unless a.size == 1
22
+ field_value = a.first
23
+
24
+ where(field => field_value).send(finder) ||
25
+ (bang && raise(Mongoid::Errors::DocumentNotFound.new(self, field_value)))
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ #
32
+ # find_by_id, special case
33
+ #
34
+ def find_by_id id
35
+ where(_id: id).first
36
+ end
37
+ alias_method :by_id, :find_by_id
38
+
39
+ def find_by_id! id
40
+ find_by_id(id) || raise(Mongoid::Errors::DocumentNotFound.new(self, id))
41
+ end
42
+ alias_method :by_id!, :find_by_id!
43
+ end
44
+ end
@@ -0,0 +1,37 @@
1
+ require 'mongo_ext/spec'
2
+
3
+ #
4
+ # disabling :set_database, all tests will use the same :test database.
5
+ #
6
+ Mongoid::MultiDatabase::ClassMethods.class_eval do
7
+ alias_method :_set_database, :set_database
8
+ def set_database database_name; end
9
+ end
10
+
11
+
12
+ # #
13
+ # # disabpling :set_database_alias
14
+ # #
15
+ # Mongoid::Micelaneous::ClassMethods.class_eval do
16
+ # alias_method :_set_database_alias, :set_database_alias
17
+ # def set_database_alias alias_name; end
18
+ # end
19
+
20
+
21
+ #
22
+ # Configuring Mongoid to use :test database and clearing database before each test
23
+ #
24
+ rspec do
25
+ def self.with_mongoid
26
+ before :all do
27
+ Mongoid.configure do |config|
28
+ connection = Mongo::Connection.new
29
+ config.master = connection.db('test')
30
+ end
31
+ end
32
+
33
+ before do
34
+ clear_mongo_database
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ unless Class.method_defined? :alias
2
+ Class.class_eval do
3
+ def alias name = nil
4
+ if name
5
+ # name.must_be.a String
6
+ # name.must_not_be.blank
7
+ @alias = name.to_s
8
+ else
9
+ @alias ||= self.name.split('::').last
10
+ end
11
+ end
12
+ end
13
+ end