mongo_record 0.4.2

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/tests/test_sql.rb ADDED
@@ -0,0 +1,176 @@
1
+ # Copyright 2009 10gen, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ $LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '../lib')
16
+ require 'rubygems'
17
+ require 'test/unit'
18
+ require 'mongo_record/sql'
19
+
20
+ class SQLTest < Test::Unit::TestCase
21
+
22
+ include MongoRecord::SQL
23
+
24
+ def assert_done(t)
25
+ assert !t.more?
26
+ assert_nil t.next_token
27
+ end
28
+
29
+ def test_tokenizer
30
+ t = Tokenizer.new('clicked = 1')
31
+ assert_equal 'clicked', t.next_token
32
+ assert_equal '=', t.next_token
33
+ assert_equal 1, t.next_token
34
+ assert_done t
35
+
36
+ t = Tokenizer.new('clicked=1 ')
37
+ assert_equal 'clicked', t.next_token
38
+ assert_equal '=', t.next_token
39
+ assert_equal 1, t.next_token
40
+ assert !t.more?
41
+ assert_done t
42
+
43
+ t = Tokenizer.new('clicked2=1 ')
44
+ assert_equal 'clicked2', t.next_token
45
+ assert_equal '=', t.next_token
46
+ assert_equal 1, t.next_token
47
+ assert_done t
48
+
49
+ t = Tokenizer.new('clicked=1 and foo = 5')
50
+ assert_equal 'clicked', t.next_token
51
+ assert_equal '=', t.next_token
52
+ assert_equal 1, t.next_token
53
+ assert_equal 'and', t.next_token
54
+ assert_equal 'foo', t.next_token
55
+ assert_equal '=', t.next_token
56
+ assert_equal 5, t.next_token
57
+ assert_done t
58
+
59
+ t = Tokenizer.new("name = 'foo'")
60
+ assert_equal 'name', t.next_token
61
+ assert_equal '=', t.next_token
62
+ assert_equal 'foo', t.next_token
63
+ assert_done t
64
+
65
+ t = Tokenizer.new("name = \"bar\"")
66
+ assert_equal 'name', t.next_token
67
+ assert_equal '=', t.next_token
68
+ assert_equal 'bar', t.next_token
69
+ assert_done t
70
+
71
+ t = Tokenizer.new("name = 'foo''bar'")
72
+ assert_equal 'name', t.next_token
73
+ assert_equal '=', t.next_token
74
+ assert_equal "foo'bar", t.next_token
75
+ assert_done t
76
+
77
+ t = Tokenizer.new("age <= 42")
78
+ assert_equal 'age', t.next_token
79
+ assert_equal '<=', t.next_token
80
+ assert_equal 42, t.next_token
81
+ assert_done t
82
+
83
+ t = Tokenizer.new("age <> 42")
84
+ assert_equal 'age', t.next_token
85
+ assert_equal '<>', t.next_token
86
+ assert_equal 42, t.next_token
87
+ assert_done t
88
+ end
89
+
90
+ def test_strip_table_name
91
+ w = Parser.parse_where("user.name = 'foo'", true)
92
+ assert_equal 'foo', w['name']
93
+ w = Parser.parse_where("schema.table.column = 'foo'", true)
94
+ assert_equal 'foo', w['column']
95
+
96
+ w = Parser.parse_where("user.name = 'foo'")
97
+ assert_equal 'foo', w['user.name']
98
+ w = Parser.parse_where("schema.table.column = 'foo'")
99
+ assert_equal 'foo', w['schema.table.column']
100
+ end
101
+
102
+ def test_arrays
103
+ w = Parser.parse_where("name in (1, 2, 42)")
104
+ a = w['name'][:$in]
105
+ assert_equal Array, a.class
106
+ assert_equal 3, a.length
107
+ assert_equal 1, a[0]
108
+ assert_equal 2, a[1]
109
+ assert_equal 42, a[2]
110
+ end
111
+
112
+ def test_regex
113
+ p = Parser.new('')
114
+ assert_equal /foo/i, p.regexp_from_string('%foo%')
115
+ assert_equal /^foo/i, p.regexp_from_string('foo%')
116
+ assert_equal /foo$/i, p.regexp_from_string('%foo')
117
+ assert_equal /^foo$/i, p.regexp_from_string('foo')
118
+ end
119
+
120
+ def test_parser
121
+ w = Parser.parse_where('clicked = 1 ')
122
+ assert_equal 1, w['clicked']
123
+
124
+ w = Parser.parse_where('clicked = 1 and z = 3')
125
+ assert_equal 1, w['clicked']
126
+ assert_equal 3, w['z']
127
+
128
+ w = Parser.parse_where("name = 'foo'")
129
+ assert_equal 'foo', w['name']
130
+
131
+ w = Parser.parse_where("name like '%foo%'")
132
+ assert_equal /foo/i, w['name']
133
+ w = Parser.parse_where("name like 'foo%'")
134
+ assert_equal /^foo/i, w['name']
135
+
136
+ w = Parser.parse_where("foo <> 'bar'")
137
+ assert_equal 'bar', w['foo'][:$ne]
138
+ w = Parser.parse_where("foo != 'bar'")
139
+ assert_equal 'bar', w['foo'][:$ne]
140
+
141
+ w = Parser.parse_where("foo in (1, 2, 'a')")
142
+ assert_equal "1, 2, a", w['foo'][:$in].join(', ')
143
+
144
+ w = Parser.parse_where("foo in ('a', 'b', 'c')")
145
+ assert_equal "a, b, c", w['foo'][:$in].join(', ')
146
+
147
+ w = Parser.parse_where("name = 'the word '' or '' anywhere (surrounded by spaces) used to throw an error'")
148
+ assert_equal "the word ' or ' anywhere (surrounded by spaces) used to throw an error", w['name']
149
+
150
+ w = Parser.parse_where("foo between 1 and 3")
151
+ assert_equal 1, w['foo'][:$gte]
152
+ assert_equal 3, w['foo'][:$lte]
153
+
154
+ w = Parser.parse_where("foo between 3 and 1")
155
+ assert_equal 1, w['foo'][:$gte]
156
+ assert_equal 3, w['foo'][:$lte]
157
+
158
+ w = Parser.parse_where("foo between 'a' and 'Z'")
159
+ assert_equal 'Z', w['foo'][:$gte] # 'Z' is < 'a'
160
+ assert_equal 'a', w['foo'][:$lte]
161
+
162
+ w = Parser.parse_where("foo between 'Z' and 'a'")
163
+ assert_equal 'Z', w['foo'][:$gte]
164
+ assert_equal 'a', w['foo'][:$lte]
165
+
166
+ sql = "name = 'foo' or name = 'bar'"
167
+ err = "sql parser can't handle ors yet: #{sql}"
168
+ begin
169
+ w = Parser.parse_where(sql)
170
+ fail("expected to see \"#{err}\" error")
171
+ rescue => ex
172
+ assert_equal err, ex.to_s
173
+ end
174
+ end
175
+
176
+ end
data/tests/track2.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'mongo_record/base'
2
+
3
+ class Track2 < MongoRecord::Base
4
+ collection_name :tracks
5
+ fields :artist, :album, :song, :track
6
+ def to_s
7
+ "artist: #{artist}, album: #{album}, song: #{song}, track: #{track ? track.to_i : nil}"
8
+ end
9
+ end
data/tests/track3.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'mongo_record/base'
2
+
3
+ class Track3 < MongoRecord::Base
4
+ collection_name :tracks
5
+ fields :artist, :album, :song, :track
6
+ def to_s
7
+ "artist: #{artist}, album: #{album}, song: #{song}, track: #{track ? track.to_i : nil}"
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongo_record
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
5
+ platform: ruby
6
+ authors:
7
+ - Jim Menard
8
+ - Mike Dirolf
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-10-05 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: mongo
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0.15"
25
+ version:
26
+ description: MongoRecord is an ActiveRecord-like framework for the 10gen Mongo database. For more information about Mongo, see http://www.mongodb.org.
27
+ email: mongodb-user@googlegroups.com
28
+ executables: []
29
+
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - README.rdoc
34
+ files:
35
+ - examples/tracks.rb
36
+ - lib/mongo_record.rb
37
+ - lib/mongo_record/base.rb
38
+ - lib/mongo_record/convert.rb
39
+ - lib/mongo_record/log_device.rb
40
+ - lib/mongo_record/sql.rb
41
+ - lib/mongo_record/subobject.rb
42
+ - README.rdoc
43
+ - Rakefile
44
+ - mongo-activerecord-ruby.gemspec
45
+ - LICENSE
46
+ has_rdoc: true
47
+ homepage: http://www.mongodb.org
48
+ licenses: []
49
+
50
+ post_install_message:
51
+ rdoc_options:
52
+ - --main
53
+ - README.rdoc
54
+ - --inline-source
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.3.5
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: ActiveRecord-like models for the 10gen Mongo DB
76
+ test_files:
77
+ - tests/address.rb
78
+ - tests/course.rb
79
+ - tests/student.rb
80
+ - tests/class_in_module.rb
81
+ - tests/test_log_device.rb
82
+ - tests/test_mongo.rb
83
+ - tests/test_sql.rb
84
+ - tests/track2.rb
85
+ - tests/track3.rb