mongoid_alphadog 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,95 @@
1
+ Mongoid_Alphadog
2
+ ===================
3
+
4
+ A simple little gem that makes it easy to fetch a case-insensitive alphabetized list of Mongoid documents.
5
+
6
+ Problem
7
+ -------
8
+
9
+ By design, MongoDB does not sort case-insensitive when sorting string fields. So objects with names like this:
10
+
11
+ ['aardvark', 'Archie', 'banana', 'Checkers']
12
+
13
+ ... will come out like this if you do order_by(:name)
14
+
15
+ ['aardvark', 'banana', 'Archie', 'Checkers']
16
+
17
+ That's probably not what you're expecting, especially when using this on the front-end of your app.
18
+
19
+ Mongoid_Alphadog makes it easier and cleaner to solve this in your app using the oft-recommended workaround of a lowercased field.
20
+
21
+ Requirements
22
+ ------------
23
+
24
+ - MongoDB
25
+ - Mongoid
26
+
27
+ Installation
28
+ ------------
29
+
30
+ Add mongoid_alphadog to your Gemfile:
31
+
32
+ gem 'mongoid_alphadog'
33
+
34
+ Alphabetizing a Single Field
35
+ ----------------------------
36
+
37
+ Set up your mongoid document class for alphabetizing on a single field:
38
+
39
+ class Item
40
+ include Mongoid::Document
41
+ include Mongoid::Alphadog
42
+
43
+ field :name, type: String
44
+
45
+ alphabetize_on :name
46
+ end
47
+
48
+ By default, you will get a free scope that you can use to quickly return your Items in a naturally-alphabetized (A to Z) order:
49
+
50
+ Item.alphabetized_by(:name)
51
+
52
+ This is, of course, a Mongoid Criteria object, as you might expect, so you can do all the normal stuff:
53
+
54
+ Item.where(:color => 'red').alphabetized_by(:name).limit(10)
55
+
56
+ ... will return 10 Items that have a color of 'red' alphabetized by name ascending (A to Z)
57
+
58
+ If you need your results ordered the other way, for now you'll just have to do it manually with _order_by_. Alphadog creates the following field on your document:
59
+
60
+ <OriginalFieldName>_loweralpha
61
+
62
+ So if you wanted, say, the Items from above to be ordered from Z to A, you would do this:
63
+
64
+ Item.order_by([[:name_loweralpha, :desc]])
65
+
66
+ Alphabetizing Multiple Fields
67
+ -----------------------------
68
+
69
+ Alphadog can handle multiple fields in a document too!
70
+
71
+ class User
72
+ include Mongoid::Document
73
+ include Mongoid::Alphadog
74
+
75
+ field :first_name, type: String
76
+ field :last_name, type: String
77
+ field :favorite_color, type: String
78
+
79
+ alphabetize_on :first_name, :last_name, :favorite_color
80
+ end
81
+
82
+ The _alphabetized_by_ scope can handle multi-field ordering:
83
+
84
+ User.alphabetized_by(:first_name, :last_name, :favorite_color)
85
+
86
+ Again, this will do all of the fields in :asc order (A to Z). If you want to do it differently, you'll have to build up your own _order_by_
87
+
88
+ User.order_by([[:first_name_loweralpha, :desc], [:last_name_loweralpha, :asc], [:favorite_color_loweralpha, :desc]])
89
+
90
+ Indexes
91
+ -------
92
+
93
+ Mongoid_Alphadog automatically adds indexes on the XXX_loweralpha fields. Make sure to generate your mongodb indexes by whichever means you prefer.
94
+
95
+
@@ -0,0 +1,34 @@
1
+ module Mongoid
2
+ module Alphadog
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+
7
+ def alphabetize_on(*fields)
8
+ return false unless fields.present?
9
+ fields.map(&:to_s).each { |f|
10
+ symbol = "#{f}_loweralpha".to_sym
11
+ field(symbol, type: String)
12
+ index(symbol)
13
+ meth = "set_#{f}_loweralpha".to_sym
14
+ class_eval <<-RUBY
15
+ before_save do
16
+ self.send("#{symbol}=".to_sym, self.send(f.to_sym).downcase)
17
+ end
18
+ RUBY
19
+ }
20
+
21
+ instance_eval do
22
+ scope :alphabetized_by, lambda { |*alpha_fields|
23
+ aorder = alpha_fields.map do |alpha|
24
+ [[alpha.to_s, 'loweralpha'].join('_').to_sym, :asc]
25
+ end
26
+ order_by(aorder)
27
+ }
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module MongoidAlphadog
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.version = MongoidAlphadog::VERSION
8
8
  s.authors = ["Matt Patterson", "Lone Star Internet"]
9
9
  s.email = ["mpatterson@lone-star.net"]
10
- s.homepage = "http://lone-star.net"
10
+ s.homepage = "https://github.com/LoneStarInternet/mongoid_alphadog"
11
11
  s.summary = %q{Case-insensitive alphabetizing for Mongoid document models}
12
12
  s.description = %q{A simple little gem that makes it easy to handle case-insensitive alphabetizing for Mongoid document models}
13
13
 
@@ -0,0 +1,8 @@
1
+ class Item
2
+ include Mongoid::Document
3
+ include Mongoid::Alphadog
4
+
5
+ field :name, type: String
6
+
7
+ alphabetize_on :name
8
+ end
@@ -0,0 +1,10 @@
1
+ class User
2
+ include Mongoid::Document
3
+ include Mongoid::Alphadog
4
+
5
+ field :first_name, type: String
6
+ field :last_name, type: String
7
+ field :favorite_color, type: String
8
+
9
+ alphabetize_on :first_name, :last_name, :favorite_color
10
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Mongoid::Alphadog, "with 1 field provided" do
4
+
5
+ it "should include :name_loweralpha field" do
6
+ Item.fields['name_loweralpha'].should_not be_nil
7
+ end
8
+
9
+ it "should include index on name_loweralpha" do
10
+ Item.index_options[:name_loweralpha].should_not be_nil
11
+ end
12
+
13
+ %w[ Rabbit xylophone antelope ].each do |name|
14
+ let name.to_s.downcase do
15
+ Item.create(:name => name)
16
+ end
17
+ end
18
+
19
+ it "should set the loweralpha field properly" do
20
+ rabbit.name_loweralpha.should == 'rabbit'
21
+ xylophone.name_loweralpha.should == 'xylophone'
22
+ antelope.name_loweralpha.should == 'antelope'
23
+ end
24
+
25
+ it "should produce the right results with the alphabetized_by scope" do
26
+ provided = %w[ Rabbit Aardvark xylophone fairy Zebra antelope ]
27
+ expected = %w[ Aardvark antelope fairy Rabbit xylophone Zebra ]
28
+ provided.each { |name| Item.create(:name => name) }
29
+ Item.alphabetized_by(:name).map(&:name).should == expected
30
+ end
31
+
32
+ end
33
+
34
+ describe Mongoid::Alphadog, "with multiple fields provided" do
35
+
36
+ it "should include three loweralpha fields" do
37
+ User.fields['first_name_loweralpha'].should_not be_nil
38
+ User.fields['last_name_loweralpha'].should_not be_nil
39
+ User.fields['favorite_color_loweralpha'].should_not be_nil
40
+ end
41
+
42
+ it "should include indexes" do
43
+ User.index_options[:first_name_loweralpha].should_not be_nil
44
+ User.index_options[:last_name_loweralpha].should_not be_nil
45
+ User.index_options[:favorite_color_loweralpha].should_not be_nil
46
+ end
47
+
48
+ it "should set the loweralpha fields properly" do
49
+ user = User.create(:first_name => 'John', :last_name => 'Doe', :favorite_color => 'orange')
50
+ user.first_name.should == 'John'
51
+ user.first_name_loweralpha.should == 'john'
52
+ user.last_name_loweralpha.should == 'doe'
53
+ user.favorite_color_loweralpha.should == 'orange'
54
+ end
55
+
56
+ it "should produce the right results with the alphabetized_by scope" do
57
+ user1 = User.create(:first_name => 'John', :last_name => 'Doe', :favorite_color => 'orange')
58
+ user2 = User.create(:first_name => 'Mary', :last_name => 'Doe', :favorite_color => 'red')
59
+ user3 = User.create(:first_name => 'Steve', :last_name => 'Jobs', :favorite_color => 'orange')
60
+ user4 = User.create(:first_name => 'Arnold', :last_name => 'Bodybuilder', :favorite_color => 'blue')
61
+ user5 = User.create(:first_name => 'frank', :last_name => 'jobs', :favorite_color => 'blue')
62
+ user6 = User.create(:first_name => 'Frank', :last_name => 'Imitator', :favorite_color => 'green')
63
+ results = User.alphabetized_by(:first_name, :last_name, :favorite_color).map(&:first_name)
64
+ results.should == %w[ Arnold Frank frank John Mary Steve ]
65
+ end
66
+
67
+ end
@@ -0,0 +1,32 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'rubygems'
5
+ require "mongoid"
6
+ require "rspec"
7
+ require "database_cleaner"
8
+
9
+ require File.expand_path("../../lib/mongoid/alphadog", __FILE__)
10
+
11
+ MODELS = File.join(File.dirname(__FILE__), "models")
12
+
13
+ Dir["#{File.dirname(__FILE__)}/models/*.rb"].each { |f| require f }
14
+
15
+ Mongoid.config.master = Mongo::Connection.new.db("mongoid-alphadog-spec")
16
+ Mongoid.logger = Logger.new($stdout)
17
+
18
+ DatabaseCleaner.orm = "mongoid"
19
+
20
+ RSpec.configure do |config|
21
+ config.before(:all) do
22
+ DatabaseCleaner.strategy = :truncation
23
+ end
24
+
25
+ config.before(:each) do
26
+ DatabaseCleaner.start
27
+ end
28
+
29
+ config.after(:each) do
30
+ DatabaseCleaner.clean
31
+ end
32
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_alphadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ date: 2012-02-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: mongoid
17
- requirement: &2161839500 !ruby/object:Gem::Requirement
17
+ requirement: &2153771000 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 2.0.2
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2161839500
25
+ version_requirements: *2153771000
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rdoc
28
- requirement: &2161838980 !ruby/object:Gem::Requirement
28
+ requirement: &2153770420 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 2.5.11
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2161838980
36
+ version_requirements: *2153770420
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: bson_ext
39
- requirement: &2161838420 !ruby/object:Gem::Requirement
39
+ requirement: &2153769940 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.3.1
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2161838420
47
+ version_requirements: *2153769940
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec-core
50
- requirement: &2161837400 !ruby/object:Gem::Requirement
50
+ requirement: &2153769460 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: 2.6.3
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2161837400
58
+ version_requirements: *2153769460
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rspec
61
- requirement: &2161836560 !ruby/object:Gem::Requirement
61
+ requirement: &2153768920 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: 2.6.0
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2161836560
69
+ version_requirements: *2153768920
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: database_cleaner
72
- requirement: &2161835800 !ruby/object:Gem::Requirement
72
+ requirement: &2153768440 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 0.6.7
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2161835800
80
+ version_requirements: *2153768440
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: bundler
83
- requirement: &2161835320 !ruby/object:Gem::Requirement
83
+ requirement: &2153767920 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ~>
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 1.0.0
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *2161835320
91
+ version_requirements: *2153767920
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: jeweler
94
- requirement: &2161834840 !ruby/object:Gem::Requirement
94
+ requirement: &2153767400 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ~>
@@ -99,7 +99,7 @@ dependencies:
99
99
  version: 1.6.0
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *2161834840
102
+ version_requirements: *2153767400
103
103
  description: A simple little gem that makes it easy to handle case-insensitive alphabetizing
104
104
  for Mongoid document models
105
105
  email:
@@ -110,11 +110,17 @@ extra_rdoc_files: []
110
110
  files:
111
111
  - .gitignore
112
112
  - Gemfile
113
+ - README.markdown
113
114
  - Rakefile
115
+ - lib/mongoid/alphadog.rb
114
116
  - lib/mongoid_alphadog.rb
115
117
  - lib/mongoid_alphadog/version.rb
116
118
  - mongoid_alphadog.gemspec
117
- homepage: http://lone-star.net
119
+ - spec/models/item.rb
120
+ - spec/models/user.rb
121
+ - spec/mongoid_alphadog_spec.rb
122
+ - spec/spec_helper.rb
123
+ homepage: https://github.com/LoneStarInternet/mongoid_alphadog
118
124
  licenses: []
119
125
  post_install_message:
120
126
  rdoc_options: []
@@ -128,7 +134,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
128
134
  version: '0'
129
135
  segments:
130
136
  - 0
131
- hash: 2933158099428333489
137
+ hash: 1901341022087321056
132
138
  required_rubygems_version: !ruby/object:Gem::Requirement
133
139
  none: false
134
140
  requirements:
@@ -137,11 +143,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
143
  version: '0'
138
144
  segments:
139
145
  - 0
140
- hash: 2933158099428333489
146
+ hash: 1901341022087321056
141
147
  requirements: []
142
148
  rubyforge_project: mongoid_alphadog
143
149
  rubygems_version: 1.8.10
144
150
  signing_key:
145
151
  specification_version: 3
146
152
  summary: Case-insensitive alphabetizing for Mongoid document models
147
- test_files: []
153
+ test_files:
154
+ - spec/models/item.rb
155
+ - spec/models/user.rb
156
+ - spec/mongoid_alphadog_spec.rb
157
+ - spec/spec_helper.rb