active_repository 0.2.6 → 0.2.7

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.
@@ -24,14 +24,13 @@ Gem::Specification.new do |gem|
24
24
  "Gemfile",
25
25
  "spec/active_repository/base_spec.rb",
26
26
  "spec/active_repository/associations_spec.rb",
27
- "spec/active_repository/sql_query_executor_spec.rb",
28
27
  "spec/support/shared_examples.rb",
29
- "spec/support/sql_query_shared_examples.rb",
30
28
  "spec/spec_helper.rb"
31
29
  ]
32
30
 
33
31
  gem.add_runtime_dependency(%q<active_hash>, [">= 0.9.12"])
34
32
  gem.add_runtime_dependency(%q<activemodel>, [">= 3.2.6"])
33
+ gem.add_runtime_dependency(%q<sql_query_executor>, [">= 0.0.1"])
35
34
  gem.add_development_dependency(%q<rspec>, [">= 2.2.0"])
36
35
  gem.add_development_dependency(%q<activerecord>, [">= 3.2.6"])
37
36
  gem.add_development_dependency(%q<mongoid>, [">= 3.0.11"])
@@ -1,7 +1,7 @@
1
1
  require 'active_repository/associations'
2
2
  require 'active_repository/uniqueness'
3
3
  require 'active_repository/write_support'
4
- require 'active_repository/sql_query_executor'
4
+ require 'sql_query_executor'
5
5
  require 'active_repository/finders'
6
6
  require 'active_repository/writers'
7
7
  require 'active_repository/adapters/persistence_adapter'
@@ -138,7 +138,8 @@ module ActiveRepository
138
138
 
139
139
  if repository?
140
140
  args = args.first if args.try(:first).is_a?(Array)
141
- super(ActiveHash::SQLQueryExecutor.args_to_query(args))
141
+ query_executor = SqlQueryExecutor::Base.new(all)
142
+ query_executor.where(args)
142
143
  else
143
144
  objects = PersistenceAdapter.where(self, sanitize_args(args)).map do |object|
144
145
  self.serialize!(object.attributes)
@@ -188,7 +189,10 @@ module ActiveRepository
188
189
  # Updates attributes from self with the attributes from the parameters
189
190
  def serialize!(attributes)
190
191
  unless attributes.nil?
191
- self.attributes = attributes
192
+ attributes.each do |key, value|
193
+ key = "id" if key == "_id"
194
+ self.send("#{key}=", (value.dup rescue value))
195
+ end
192
196
  end
193
197
 
194
198
  self.dup
@@ -1,3 +1,3 @@
1
1
  module ActiveRepository
2
- VERSION = "0.2.6"
2
+ VERSION = "0.2.7"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  require 'active_hash'
2
- require 'active_repository/sql_query_executor'
2
+ require 'sql_query_executor'
3
3
 
4
4
  # Changes made in order to make write support in ActiveHash.
5
5
 
@@ -16,7 +16,7 @@ describe ActiveRepository, "Base" do
16
16
  Object.send :remove_const, :Country
17
17
  end
18
18
 
19
- context "in_memory" do
19
+ context "in_memory", :in_memory do
20
20
  before do
21
21
  Country.fields :name, :monarch, :language, :created_at, :updated_at
22
22
  Country.set_model_class(Country)
@@ -60,7 +60,7 @@ describe ActiveRepository, "Base" do
60
60
  it_behaves_like '.delete_all'
61
61
  end
62
62
 
63
- context "active_record" do
63
+ context "active_record", :active_record do
64
64
  before do
65
65
  Country.fields :name, :monarch, :language, :created_at, :updated_at
66
66
 
@@ -121,7 +121,7 @@ describe ActiveRepository, "Base" do
121
121
  it_behaves_like '.delete_all'
122
122
  end
123
123
 
124
- context "mongoid" do
124
+ context "mongoid", :mongoid do
125
125
  before do
126
126
  Country.fields :name, :monarch, :language, :created_at, :updated_at
127
127
 
@@ -135,7 +135,7 @@ describe ActiveRepository, "Base" do
135
135
  field :name
136
136
  field :monarch
137
137
  field :language
138
- field :_id, type: Integer, default: -> { CountryModel.last ? CountryModel.last.id + 1 : 1 }
138
+ field :id, type: Integer
139
139
  field :updated_at
140
140
  field :created_at
141
141
  end
data/spec/spec_helper.rb CHANGED
@@ -2,3 +2,7 @@ require 'rspec'
2
2
  require 'rspec/autorun'
3
3
  require 'coveralls'
4
4
  Coveralls.wear!
5
+
6
+ RSpec.configure do |c|
7
+ c.treat_symbols_as_metadata_keys_with_true_values = true
8
+ end
@@ -563,7 +563,7 @@ shared_examples ".create" do
563
563
 
564
564
  country2 = Country.new :name => "bar"
565
565
  country2.save
566
- country2.id.should == ((country1.id.class.name == "BSON::ObjectId") ? country2.id : country1.id + 1)
566
+ country2.id.should == ((country1.id.class.name == "Moped::BSON::ObjectId") ? country2.id : country1.id + 1)
567
567
  end
568
568
 
569
569
  it "adds the new object to the data collection" do
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_repository
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Caio Torres
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-09-07 00:00:00.000000000 Z
12
+ date: 2014-01-18 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: active_hash
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ! '>='
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: activemodel
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
@@ -34,13 +38,31 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ! '>='
39
44
  - !ruby/object:Gem::Version
40
45
  version: 3.2.6
46
+ - !ruby/object:Gem::Dependency
47
+ name: sql_query_executor
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.0.1
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.1
41
62
  - !ruby/object:Gem::Dependency
42
63
  name: rspec
43
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
44
66
  requirements:
45
67
  - - ! '>='
46
68
  - !ruby/object:Gem::Version
@@ -48,6 +70,7 @@ dependencies:
48
70
  type: :development
49
71
  prerelease: false
50
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
51
74
  requirements:
52
75
  - - ! '>='
53
76
  - !ruby/object:Gem::Version
@@ -55,6 +78,7 @@ dependencies:
55
78
  - !ruby/object:Gem::Dependency
56
79
  name: activerecord
57
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
58
82
  requirements:
59
83
  - - ! '>='
60
84
  - !ruby/object:Gem::Version
@@ -62,6 +86,7 @@ dependencies:
62
86
  type: :development
63
87
  prerelease: false
64
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
65
90
  requirements:
66
91
  - - ! '>='
67
92
  - !ruby/object:Gem::Version
@@ -69,6 +94,7 @@ dependencies:
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: mongoid
71
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
72
98
  requirements:
73
99
  - - ! '>='
74
100
  - !ruby/object:Gem::Version
@@ -76,6 +102,7 @@ dependencies:
76
102
  type: :development
77
103
  prerelease: false
78
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
79
106
  requirements:
80
107
  - - ! '>='
81
108
  - !ruby/object:Gem::Version
@@ -83,6 +110,7 @@ dependencies:
83
110
  - !ruby/object:Gem::Dependency
84
111
  name: rake
85
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
86
114
  requirements:
87
115
  - - ! '>='
88
116
  - !ruby/object:Gem::Version
@@ -90,6 +118,7 @@ dependencies:
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
93
122
  requirements:
94
123
  - - ! '>='
95
124
  - !ruby/object:Gem::Version
@@ -97,6 +126,7 @@ dependencies:
97
126
  - !ruby/object:Gem::Dependency
98
127
  name: coveralls
99
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
100
130
  requirements:
101
131
  - - ! '>='
102
132
  - !ruby/object:Gem::Version
@@ -104,6 +134,7 @@ dependencies:
104
134
  type: :development
105
135
  prerelease: false
106
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
107
138
  requirements:
108
139
  - - ! '>='
109
140
  - !ruby/object:Gem::Version
@@ -111,6 +142,7 @@ dependencies:
111
142
  - !ruby/object:Gem::Dependency
112
143
  name: sqlite3
113
144
  requirement: !ruby/object:Gem::Requirement
145
+ none: false
114
146
  requirements:
115
147
  - - ! '>='
116
148
  - !ruby/object:Gem::Version
@@ -118,6 +150,7 @@ dependencies:
118
150
  type: :development
119
151
  prerelease: false
120
152
  version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
121
154
  requirements:
122
155
  - - ! '>='
123
156
  - !ruby/object:Gem::Version
@@ -139,7 +172,6 @@ files:
139
172
  - lib/active_repository/associations.rb
140
173
  - lib/active_repository/base.rb
141
174
  - lib/active_repository/finders.rb
142
- - lib/active_repository/sql_query_executor.rb
143
175
  - lib/active_repository/uniqueness.rb
144
176
  - lib/active_repository/version.rb
145
177
  - lib/active_repository/write_support.rb
@@ -148,40 +180,36 @@ files:
148
180
  - Gemfile
149
181
  - spec/active_repository/base_spec.rb
150
182
  - spec/active_repository/associations_spec.rb
151
- - spec/active_repository/sql_query_executor_spec.rb
152
183
  - spec/support/shared_examples.rb
153
- - spec/support/sql_query_shared_examples.rb
154
184
  - spec/spec_helper.rb
155
185
  homepage: http://github.com/efreesen/active_repository
156
186
  licenses:
157
187
  - GPL
158
- metadata: {}
159
188
  post_install_message:
160
189
  rdoc_options: []
161
190
  require_paths:
162
191
  - lib
163
192
  required_ruby_version: !ruby/object:Gem::Requirement
193
+ none: false
164
194
  requirements:
165
195
  - - ! '>='
166
196
  - !ruby/object:Gem::Version
167
197
  version: '0'
168
198
  required_rubygems_version: !ruby/object:Gem::Requirement
199
+ none: false
169
200
  requirements:
170
201
  - - ! '>='
171
202
  - !ruby/object:Gem::Version
172
203
  version: '0'
173
204
  requirements: []
174
205
  rubyforge_project:
175
- rubygems_version: 2.0.3
206
+ rubygems_version: 1.8.23
176
207
  signing_key:
177
- specification_version: 4
208
+ specification_version: 3
178
209
  summary: An implementation of repository pattern that can connect with any ORM
179
210
  test_files:
180
211
  - Gemfile
181
212
  - spec/active_repository/base_spec.rb
182
213
  - spec/active_repository/associations_spec.rb
183
- - spec/active_repository/sql_query_executor_spec.rb
184
214
  - spec/support/shared_examples.rb
185
- - spec/support/sql_query_shared_examples.rb
186
215
  - spec/spec_helper.rb
187
- has_rdoc:
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MGU1NzgzYmJjNzk1OWFkY2M0ZjYwMWFiOTBmNjJjYzY4MDBlMjk5OQ==
5
- data.tar.gz: !binary |-
6
- OGJkZDk3ZGUyNDBmOWY4NGU0MmU2ZTE5Y2M5ZDYxNWYxYzY3YTI2ZQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- NGZmZjQ3ZmIzY2Q1Y2Q3ZmQ1NTVlNzQyNTU4MDUxNzgzNzdiOGExMjAxMDdi
10
- NzViZWI4MjNjZTAxZTNkOWRkNWZlMDcxZmExNDQ0OGU1MWQyODdlNTAzNDNm
11
- MmMxODhhOTMyMTAwMmEzNWExYjAzNjIxMjRhYWYzNjU4Nzk0M2U=
12
- data.tar.gz: !binary |-
13
- YjEwYmRiNDMwMzBiYmI1NWQ0Y2VhMTE2YzliMzZkOTY0YmE2MDAzZjhlNzZl
14
- NzUyMjBlMjVmNTgxNzljNzUzZDdiY2NjMTYxMDMwYmM1M2I4NjJiZDU1M2Jj
15
- ZmVlYTViYjlhZTg3MjFkZjJlYzA5ZTA5YjBjNDNhYTkwZTJlOWI=
@@ -1,170 +0,0 @@
1
- # Simulates a SQL where clause to filter objects from the database
2
- module ActiveHash #:nodoc:
3
- class SQLQueryExecutor #:nodoc:
4
- class << self #:nodoc:
5
- # Prepares query by replacing all ? by it's real values in #args
6
- def args_to_query(args)
7
- return args.first if args.size == 1
8
-
9
- query = args.first
10
- param = args.delete_at(1)
11
-
12
- param = convert_param(param)
13
-
14
- args[0] = query.sub("?", param)
15
-
16
- args_to_query(args)
17
- end
18
-
19
- # Recursive method that divides the query in sub queries, executes each part individually
20
- # and finally relates its results as specified in the query.
21
- def execute(klass, query)
22
- query = query.gsub(/\[.*?\]/) { |substr| substr.gsub(' ', '') }
23
-
24
- @operator, @sub_query, @objects = process_first(klass, query, query.split(" ")[1].downcase)
25
-
26
- @operator.nil? ? @objects : @objects.send(@operator, execute(klass, @sub_query)).sort_by{ |o| o.id }
27
- end
28
-
29
- private
30
- # Splits the first sub query from the rest of the query and returns it.
31
- def divide_query
32
- array = @query.split(" ")
33
- case @operator
34
- when "between"
35
- array[0..5]
36
- when "is"
37
- size = array[2] == "not" ? 4 : 3
38
- array[0..size]
39
- else
40
- array[0..3]
41
- end
42
- end
43
-
44
- # Replaces white spaces for underscores inside quotes in order to avoid getting parameters
45
- # split into separate components of the query.
46
- def convert_attrs(field, *attrs)
47
- attrs.each_with_index do |attribute, i|
48
- attribute = attribute.gsub("_", " ") rescue attribute
49
- attrs[i] = field.is_a?(Integer) ? attribute.to_i : attribute
50
- end
51
-
52
- field = field.is_a?(Integer) ? field : field.to_s
53
-
54
- [field, attrs].flatten
55
- end
56
-
57
- # Returns converted #param based on its Class, so it can be used on the query
58
- def convert_param(param)
59
- case param.class.name
60
- when "String"
61
- param = "'#{param}'"
62
- when "Date"
63
- param = "'#{param.strftime("%Y-%m-%d")}'"
64
- when "Time"
65
- param = "'#{param.strftime("%Y-%m-%d %H:%M:%S %z")}'"
66
- else
67
- param = param.to_s
68
- end
69
- end
70
-
71
- # Execute SQL between filter
72
- def execute_between(klass, sub_query)
73
- klass.all.select do |o|
74
- field = sub_query.first.gsub('(', '')
75
- field, first_attr, second_attr = convert_attrs(o.send(field), sub_query[2], sub_query[4])
76
-
77
- (field >= first_attr && field <= second_attr)
78
- end
79
- end
80
-
81
- # Executes SQL is filter
82
- def execute_is(klass, sub_query)
83
- klass.all.select do |o|
84
- field = o.send(sub_query.first).blank?
85
-
86
- sub_query.size == 3 ? field : !field
87
- end
88
- end
89
-
90
- # Executes SQL is filter
91
- def execute_in(klass, sub_query)
92
- klass.all.select do |o|
93
- field = o.send(sub_query.first)
94
- values = sub_query[2].gsub(/\(|\[|\]|\)/, '').split(/,|, /)
95
-
96
- values.include?(field.to_s)
97
- end
98
- end
99
-
100
- # Executes the #sub_quey defined operator filter
101
- def execute_operator(klass, sub_query)
102
- klass.all.select do |o|
103
- query = sub_query.first
104
-
105
- if query
106
- field, attribute = convert_attrs(o.send(query.gsub(/[\(\)]/, "")), sub_query[2])
107
-
108
- field.blank? ? false : field.send(@operator, attribute)
109
- else
110
- false
111
- end
112
- end
113
- end
114
-
115
- # Executes the #sub_query
116
- def execute_sub_query(klass, sub_query)
117
- case @operator
118
- when "between"
119
- execute_between(klass, sub_query)
120
- when "is"
121
- execute_is(klass, sub_query)
122
- when "in"
123
- execute_in(klass, sub_query)
124
- else
125
- execute_operator(klass, sub_query)
126
- end
127
- end
128
-
129
- # Converts SQL where clause sub query operator to its Ruby Array counterpart
130
- def get_operator(attributes)
131
- operator = attributes.size >= 4 ? attributes.last : nil
132
-
133
- case operator.try(:downcase)
134
- when "or" then "+"
135
- when "and" then "&"
136
- else nil
137
- end
138
- end
139
-
140
- # Processes the first sub query in query
141
- def process_first(klass, query, operator)
142
- @operator = (operator == "=" ? "==" : (operator == '<>' ? '!=' : operator))
143
- @query = sanitize_query(query)
144
- sub_query = divide_query
145
-
146
- binding_operator = get_operator(sub_query)
147
-
148
- objects = execute_sub_query(klass, sub_query)
149
-
150
- query_array = query.split(' ')
151
-
152
- sub_query = query_array[sub_query.size..query_array.size].join(' ')
153
-
154
- [binding_operator, sub_query, objects]
155
- end
156
-
157
- # Removes all accents and other non default characters
158
- def sanitize_query(query)
159
- new_query = query
160
- params = query.scan(/([\"'])(.*?)\1/)
161
-
162
- params.each do |quote, param|
163
- new_query = new_query.gsub(quote,"").gsub(param, param.gsub(" ", "_"))
164
- end
165
-
166
- new_query
167
- end
168
- end
169
- end
170
- end
@@ -1,81 +0,0 @@
1
- require 'spec_helper'
2
- require 'support/sql_query_shared_examples'
3
-
4
- require 'active_repository'
5
- require "active_record"
6
-
7
- describe ActiveRepository, "Base" do
8
-
9
- before do
10
- class Country < ActiveRepository::Base
11
- end
12
- end
13
-
14
- after do
15
- Object.send :remove_const, :Country
16
- end
17
-
18
- context "in_memory" do
19
- before do
20
- Country.fields :name, :monarch, :language, :founded_at
21
- Country.set_model_class(Country)
22
- Country.set_save_in_memory(true)
23
-
24
- Country.create(:id => 1, :name => "US", :language => 'English')
25
- Country.create(:id => 2, :name => "Canada", :language => 'English', :monarch => "The Crown of England")
26
- Country.create(:id => 3, :name => "Mexico", :language => 'Spanish')
27
- Country.create(:id => 4, :name => "UK", :language => 'English', :monarch => "The Crown of England")
28
- Country.create(:id => 5, :name => "Brazil", :founded_at => Time.parse('1500-04-22 13:34:25'))
29
- end
30
-
31
- describe ".where" do
32
- it_behaves_like '='
33
- it_behaves_like '>'
34
- it_behaves_like '>='
35
- it_behaves_like '<'
36
- it_behaves_like '<='
37
- it_behaves_like 'between'
38
- it_behaves_like 'is'
39
- end
40
- end
41
-
42
- context "active_record" do
43
- before do
44
- Country.fields :name, :monarch, :language, :founded_at
45
-
46
- class CountryModel < ActiveRecord::Base
47
- self.table_name = 'countries'
48
- establish_connection :adapter => "sqlite3", :database => ":memory:"
49
- connection.create_table(:countries, :force => true) do |t|
50
- t.string :name
51
- t.string :monarch
52
- t.string :language
53
- t.datetime :founded_at
54
- end
55
- end
56
-
57
- Country.set_model_class(CountryModel)
58
- Country.set_save_in_memory(false)
59
-
60
- Country.create(:id => 1, :name => "US", :language => 'English')
61
- Country.create(:id => 2, :name => "Canada", :language => 'English', :monarch => "The Crown of England")
62
- Country.create(:id => 3, :name => "Mexico", :language => 'Spanish')
63
- Country.create(:id => 4, :name => "UK", :language => 'English', :monarch => "The Crown of England")
64
- Country.create(:id => 5, :name => "Brazil", :founded_at => Time.parse('1500-04-22 13:34:25'))
65
- end
66
-
67
- after do
68
- Object.send :remove_const, :CountryModel
69
- end
70
-
71
- describe ".where" do
72
- it_behaves_like '='
73
- it_behaves_like '>'
74
- it_behaves_like '>='
75
- it_behaves_like '<'
76
- it_behaves_like '<='
77
- it_behaves_like 'between'
78
- it_behaves_like 'is'
79
- end
80
- end
81
- end
@@ -1,325 +0,0 @@
1
- require 'set'
2
-
3
- shared_examples "=" do
4
- context "when attribute is string" do
5
- it "matches a record" do
6
- record = Country.where("name = 'US'")
7
- record.count.should == 1
8
- record.first.id.should == 1
9
- record.first.name.should == 'US'
10
- end
11
-
12
- it "doesn't match any record" do
13
- record = Country.where("name = 'Argentina'")
14
- record.count.should == 0
15
- record.should == []
16
- end
17
- end
18
-
19
- context "when attribute is integer" do
20
- it "matches a record" do
21
- record = Country.where("id = 1")
22
- record.count.should == 1
23
- record.first.id.should == 1
24
- record.first.name.should == 'US'
25
- end
26
-
27
- it "doesn't match any record" do
28
- record = Country.where("id = 43")
29
- record.count.should == 0
30
- record.should == []
31
- end
32
- end
33
-
34
- context "when attribute is datetime" do
35
- it "matches a record" do
36
- record = Country.where("founded_at = ?", Time.parse('1500-04-22 13:34:25'))
37
- record.count.should == 1
38
- record.first.id.should == 5
39
- record.first.name.should == 'Brazil'
40
- end
41
-
42
- it "doesn't match any record" do
43
- record = Country.where("id = ?", Time.parse('1500-09-07 13:34:25'))
44
- record.count.should == 0
45
- record.should == []
46
- end
47
- end
48
- end
49
-
50
- shared_examples ">" do
51
- context "when attribute is a string" do
52
- it "matches a record" do
53
- records = Country.where("name > 'T'")
54
- records.count.should == 2
55
- records.first.id.should == 1
56
- records.should == [Country.find(1), Country.find(4)]
57
- end
58
-
59
- it "doesn't match any record" do
60
- record = Country.where("name > 'Z'")
61
- record.count.should == 0
62
- record.should == []
63
- end
64
- end
65
-
66
- context "when attribute is integer" do
67
- it "matches a record" do
68
- records = Country.where("id > 3")
69
- records.count.should == 2
70
- records.first.id.should == 4
71
- records.should == [Country.find(4), Country.find(5)]
72
- end
73
-
74
- it "doesn't match any record" do
75
- record = Country.where("id > 5")
76
- record.count.should == 0
77
- record.should == []
78
- end
79
- end
80
-
81
- context "when attribute is datetime" do
82
- it "matches a record" do
83
- record = Country.where("founded_at > ?", Time.parse('1500-04-20 13:34:25'))
84
- record.count.should == 1
85
- record.first.id.should == 5
86
- record.first.name.should == 'Brazil'
87
- end
88
-
89
- it "doesn't match any record" do
90
- record = Country.where("founded_at > ?", Time.parse('1500-04-23 13:34:25'))
91
- record.count.should == 0
92
- record.should == []
93
- end
94
- end
95
- end
96
-
97
- shared_examples ">=" do
98
- context "when attribute is a string" do
99
- it "matches a record" do
100
- records = Country.where("name >= 'U'")
101
- records.count.should == 2
102
- records.first.id.should == 1
103
- records.should == [Country.find(1), Country.find(4)]
104
- end
105
-
106
- it "doesn't match any record" do
107
- record = Country.where("name >= 'Z'")
108
- record.count.should == 0
109
- record.should == []
110
- end
111
- end
112
-
113
- context "when attribute is integer" do
114
- it "matches a record" do
115
- records = Country.where("id >= 4")
116
- records.count.should == 2
117
- records.first.id.should == 4
118
- records.should == [Country.find(4), Country.find(5)]
119
- end
120
-
121
- it "doesn't match any record" do
122
- record = Country.where("id >= 6")
123
- record.count.should == 0
124
- record.should == []
125
- end
126
- end
127
-
128
- context "when attribute is datetime" do
129
- it "matches a record" do
130
- record = Country.where("founded_at >= ?", Time.parse('1500-04-22 13:34:25'))
131
- record.count.should == 1
132
- record.first.id.should == 5
133
- record.first.name.should == 'Brazil'
134
- end
135
-
136
- it "doesn't match any record" do
137
- record = Country.where("founded_at >= ?", Time.parse('1500-04-23 13:34:25'))
138
- record.count.should == 0
139
- record.should == []
140
- end
141
- end
142
- end
143
-
144
- shared_examples "<" do
145
- context "when attribute is a string" do
146
- it "matches a record" do
147
- records = Country.where("name < 'C'")
148
- records.count.should == 1
149
- records.first.id.should == 5
150
- records.should == [Country.find(5)]
151
- end
152
-
153
- it "doesn't match any record" do
154
- record = Country.where("name < 'B'")
155
- record.count.should == 0
156
- record.should == []
157
- end
158
- end
159
-
160
- context "when attribute is integer" do
161
- it "matches a record" do
162
- records = Country.where("id < 3")
163
- records.count.should == 2
164
- records.first.id.should == 1
165
- records.should == [Country.find(1), Country.find(2)]
166
- end
167
-
168
- it "doesn't match any record" do
169
- record = Country.where("id < 1")
170
- record.count.should == 0
171
- record.should == []
172
- end
173
- end
174
-
175
- context "when attribute is datetime" do
176
- it "matches a record" do
177
- record = Country.where("founded_at < ?", Time.parse('1500-04-22 13:34:26'))
178
- record.count.should == 1
179
- record.first.id.should == 5
180
- record.first.name.should == 'Brazil'
181
- end
182
-
183
- it "doesn't match any record" do
184
- record = Country.where("founded_at < ?", Time.parse('1500-04-22 13:34:25'))
185
- record.count.should == 0
186
- record.should == []
187
- end
188
- end
189
- end
190
-
191
- shared_examples "<=" do
192
- context "when attribute is a string" do
193
- it "matches a record" do
194
- records = Country.where("name <= 'Brb'")
195
- records.count.should == 1
196
- records.first.id.should == 5
197
- records.should == [Country.find(5)]
198
- end
199
-
200
- it "doesn't match any record" do
201
- record = Country.where("name <= 'A'")
202
- record.count.should == 0
203
- record.should == []
204
- end
205
- end
206
-
207
- context "when attribute is integer" do
208
- it "matches a record" do
209
- records = Country.where("id <= 2")
210
- records.count.should == 2
211
- records.first.id.should == 1
212
- records.should == [Country.find(1), Country.find(2)]
213
- end
214
-
215
- it "doesn't match any record" do
216
- record = Country.where("id <= 0")
217
- record.count.should == 0
218
- record.should == []
219
- end
220
- end
221
-
222
- context "when attribute is datetime" do
223
- it "matches a record" do
224
- record = Country.where("founded_at <= ?", Time.parse('1500-04-22 13:34:25'))
225
- record.count.should == 1
226
- record.first.id.should == 5
227
- record.first.name.should == 'Brazil'
228
- end
229
-
230
- it "doesn't match any record" do
231
- record = Country.where("founded_at <= ?", Time.parse('1500-04-22 13:34:24'))
232
- record.count.should == 0
233
- record.should == []
234
- end
235
- end
236
- end
237
-
238
- shared_examples "between" do
239
- context "when attribute is a string" do
240
- it "matches a record" do
241
- records = Country.where("name between 'A' and 'C'")
242
- records.count.should == 1
243
- records.first.id.should == 5
244
- records.should == [Country.find(5)]
245
- end
246
-
247
- it "doesn't match any record" do
248
- record = Country.where("name between 'K' and 'M'")
249
- record.count.should == 0
250
- record.should == []
251
- end
252
- end
253
-
254
- context "when attribute is integer" do
255
- it "matches a record" do
256
- records = Country.where("id between 1 and 2")
257
- records.count.should == 2
258
- records.first.id.should == 1
259
- records.should == [Country.find(1), Country.find(2)]
260
- end
261
-
262
- it "doesn't match any record" do
263
- record = Country.where("id between 6 and 10")
264
- record.count.should == 0
265
- record.should == []
266
- end
267
- end
268
-
269
- context "when attribute is datetime" do
270
- it "matches a record" do
271
- record = Country.where("founded_at between ? and ?", Time.parse('1500-04-22 13:34:24'), Time.parse('1500-04-22 13:34:26'))
272
- record.count.should == 1
273
- record.first.id.should == 5
274
- record.first.name.should == 'Brazil'
275
- end
276
-
277
- it "doesn't match any record" do
278
- record = Country.where("founded_at between ? and ?", Time.parse('1500-04-22 13:34:26'), Time.parse('1500-09-22 13:34:25'))
279
- record.count.should == 0
280
- record.should == []
281
- end
282
- end
283
- end
284
-
285
- shared_examples "is" do
286
- it "attribute is condition" do
287
- records = Country.where("founded_at is null")
288
- records.count.should == 4
289
- records.first.id.should == 1
290
- records.should == [Country.find(1), Country.find(2), Country.find(3), Country.find(4)]
291
- end
292
-
293
- it "attribute is not condition" do
294
- id = Country.last.id
295
- records = Country.where("founded_at is not null")
296
- records.count.should == 1
297
- records.first.id.should == id
298
- records.should == [Country.find(id)]
299
- end
300
- end
301
-
302
- shared_examples "and" do
303
- it "attribute and condition" do
304
- records = Country.where("language = 'English' and monarch = 'The Crown of England'")
305
- records.count.should == 2
306
- records.first.id.should == 2
307
- records.should == [Country.find(2), Country.find(4)]
308
- end
309
-
310
- it "integer attribute and condition" do
311
- records = Country.where("id = 2 and language = 'English'")
312
- records.count.should == 2
313
- records.first.id.should == 2
314
- records.should == [Country.find(2), Country.find(4)]
315
- end
316
- end
317
-
318
- shared_examples "or" do
319
- it "attribute or condition" do
320
- records = Country.where("language = 'English' or language = 'Spanish'")
321
- records.count.should == 4
322
- records.first.id.should == 1
323
- records.should == [Country.find(1), Country.find(2), Country.find(3), Country.find(4)]
324
- end
325
- end