mongoid 7.0.5 → 7.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/LICENSE +1 -0
- data/README.md +2 -1
- data/lib/mongoid.rb +1 -0
- data/lib/mongoid/attributes.rb +28 -20
- data/lib/mongoid/attributes/dynamic.rb +15 -14
- data/lib/mongoid/config/environment.rb +21 -8
- data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
- data/lib/mongoid/criteria/queryable/selectable.rb +2 -3
- data/lib/mongoid/matchable.rb +14 -15
- data/lib/mongoid/matchable/all.rb +4 -3
- data/lib/mongoid/matchable/default.rb +71 -24
- data/lib/mongoid/version.rb +2 -1
- data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
- data/spec/integration/matchable_spec.rb +680 -0
- data/spec/lite_spec_helper.rb +4 -1
- data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
- data/spec/mongoid/attributes_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
- data/spec/mongoid/document_fields_spec.rb +88 -0
- data/spec/mongoid/matchable/default_spec.rb +9 -2
- data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
- data/spec/support/expectations.rb +17 -3
- metadata +457 -442
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef857ba0b8faece9cb5bb46f2d1cb6e50fa1e2b52e6870c22cec4c5a3e73b98d
|
4
|
+
data.tar.gz: 030fbeeabf03434eb695eef129dd7abc1304419b550937ae225c2edd33824570
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e05da048526dece6963bfc5d33bb8e2db2ae3e26d37c9aa39949b9f69d16a93e33780bc7ce9244b23df11eb70e77d86cd95dfcd4426f864f3eb3429c0883033
|
7
|
+
data.tar.gz: dbb8f110097c0184d6de55630aac584722944d345723cca7ecaf76719548798970e992ba051beeb9b3ed801a49b4a2b1397a04717597620ab0183967091b368a
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -31,7 +31,8 @@ Please see the [MongoDB website](http://docs.mongodb.org/ecosystem/tutorial/ruby
|
|
31
31
|
License
|
32
32
|
-------
|
33
33
|
|
34
|
-
Copyright (c) 2009-
|
34
|
+
Copyright (c) 2009-2016 Durran Jordan
|
35
|
+
Copyright (c) 2015-2020 MongoDB, Inc.
|
35
36
|
|
36
37
|
Permission is hereby granted, free of charge, to any person obtaining
|
37
38
|
a copy of this software and associated documentation files (the
|
data/lib/mongoid.rb
CHANGED
data/lib/mongoid/attributes.rb
CHANGED
@@ -157,21 +157,21 @@ module Mongoid
|
|
157
157
|
#
|
158
158
|
# @since 1.0.0
|
159
159
|
def write_attribute(name, value)
|
160
|
-
|
161
|
-
if attribute_writable?(
|
160
|
+
field_name = database_field_name(name)
|
161
|
+
if attribute_writable?(field_name)
|
162
162
|
_assigning do
|
163
|
-
validate_attribute_value(
|
164
|
-
localized = fields[
|
163
|
+
validate_attribute_value(field_name, value)
|
164
|
+
localized = fields[field_name].try(:localized?)
|
165
165
|
attributes_before_type_cast[name.to_s] = value
|
166
|
-
typed_value = typed_value_for(
|
167
|
-
unless attributes[
|
168
|
-
attribute_will_change!(
|
166
|
+
typed_value = typed_value_for(field_name, value)
|
167
|
+
unless attributes[field_name] == typed_value || attribute_changed?(field_name)
|
168
|
+
attribute_will_change!(field_name)
|
169
169
|
end
|
170
170
|
if localized
|
171
|
-
attributes[
|
172
|
-
attributes[
|
171
|
+
attributes[field_name] ||= {}
|
172
|
+
attributes[field_name].merge!(typed_value)
|
173
173
|
else
|
174
|
-
attributes[
|
174
|
+
attributes[field_name] = typed_value
|
175
175
|
end
|
176
176
|
typed_value
|
177
177
|
end
|
@@ -337,20 +337,28 @@ module Mongoid
|
|
337
337
|
|
338
338
|
private
|
339
339
|
|
340
|
-
# Validates an attribute value
|
341
|
-
# the value is valid for given a field.
|
342
|
-
# For now, only Hash and Array fields are validated.
|
340
|
+
# Validates an attribute value as being assignable to the specified field.
|
343
341
|
#
|
344
|
-
#
|
345
|
-
#
|
342
|
+
# For now, only Hash and Array fields are validated, and the value is
|
343
|
+
# being checked to be of an appropriate type (i.e. either Hash or Array,
|
344
|
+
# respectively, or nil).
|
345
|
+
#
|
346
|
+
# This method takes the name of the field as stored in the document
|
347
|
+
# in the database, not (necessarily) the Ruby method name used to read/write
|
348
|
+
# the said field.
|
349
|
+
#
|
350
|
+
# @param [ String, Symbol ] field_name The name of the field.
|
351
|
+
# @param [ Object ] value The value to be validated.
|
346
352
|
#
|
347
353
|
# @since 3.0.10
|
348
|
-
def validate_attribute_value(
|
349
|
-
return
|
354
|
+
def validate_attribute_value(field_name, value)
|
355
|
+
return if value.nil?
|
356
|
+
field = fields[field_name]
|
357
|
+
return unless field
|
350
358
|
validatable_types = [ Hash, Array ]
|
351
|
-
if validatable_types.include?
|
352
|
-
unless value.is_a?
|
353
|
-
raise Mongoid::Errors::InvalidValue.new(
|
359
|
+
if validatable_types.include?(field.type)
|
360
|
+
unless value.is_a?(field.type)
|
361
|
+
raise Mongoid::Errors::InvalidValue.new(field.type, value.class)
|
354
362
|
end
|
355
363
|
end
|
356
364
|
end
|
@@ -38,12 +38,13 @@ module Mongoid
|
|
38
38
|
# @since 4.0.0
|
39
39
|
def define_dynamic_reader(name)
|
40
40
|
return unless name.valid_method_name?
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
|
42
|
+
class_eval do
|
43
|
+
define_method(name) do
|
44
|
+
attribute_will_change!(name)
|
45
|
+
read_raw_attribute(name)
|
45
46
|
end
|
46
|
-
|
47
|
+
end
|
47
48
|
end
|
48
49
|
|
49
50
|
# Define a reader method for a dynamic attribute before type cast.
|
@@ -57,12 +58,12 @@ module Mongoid
|
|
57
58
|
#
|
58
59
|
# @since 4.0.0
|
59
60
|
def define_dynamic_before_type_cast_reader(name)
|
60
|
-
class_eval
|
61
|
-
|
62
|
-
attribute_will_change!(
|
63
|
-
read_attribute_before_type_cast(
|
61
|
+
class_eval do
|
62
|
+
define_method("#{name}_before_type_cast") do
|
63
|
+
attribute_will_change!(name)
|
64
|
+
read_attribute_before_type_cast(name)
|
64
65
|
end
|
65
|
-
|
66
|
+
end
|
66
67
|
end
|
67
68
|
|
68
69
|
# Define a writer method for a dynamic attribute.
|
@@ -78,11 +79,11 @@ module Mongoid
|
|
78
79
|
def define_dynamic_writer(name)
|
79
80
|
return unless name.valid_method_name?
|
80
81
|
|
81
|
-
class_eval
|
82
|
-
|
83
|
-
write_attribute(
|
82
|
+
class_eval do
|
83
|
+
define_method("#{name}=") do |value|
|
84
|
+
write_attribute(name, value)
|
84
85
|
end
|
85
|
-
|
86
|
+
end
|
86
87
|
end
|
87
88
|
|
88
89
|
# If the attribute is dynamic, add a field for it with a type of object
|
@@ -6,35 +6,48 @@ module Mongoid
|
|
6
6
|
module Environment
|
7
7
|
extend self
|
8
8
|
|
9
|
-
# Get the name of the environment that
|
10
|
-
#
|
11
|
-
#
|
9
|
+
# Get the name of the environment that Mongoid is running under.
|
10
|
+
#
|
11
|
+
# Uses the following sources in order:
|
12
|
+
# - If +::Rails+ is defined, +Rails.env+.
|
13
|
+
# - If +::Sinatra+ is defined, +Sinatra::Base.environment+.
|
14
|
+
# - +RACK_ENV+
|
15
|
+
# - +MONGOID_ENV*
|
12
16
|
#
|
13
17
|
# @example Get the env name.
|
14
18
|
# Environment.env_name
|
15
19
|
#
|
16
|
-
# @raise [ Errors::NoEnvironment ] If
|
20
|
+
# @raise [ Errors::NoEnvironment ] If environment name cannot be
|
21
|
+
# determined because none of the sources was set.
|
17
22
|
#
|
18
23
|
# @return [ String ] The name of the current environment.
|
19
24
|
#
|
20
25
|
# @since 2.3.0
|
26
|
+
# @api public
|
21
27
|
def env_name
|
22
|
-
|
23
|
-
|
24
|
-
|
28
|
+
if defined?(::Rails)
|
29
|
+
return ::Rails.env
|
30
|
+
end
|
31
|
+
if defined?(::Sinatra)
|
32
|
+
return ::Sinatra::Base.environment.to_s
|
33
|
+
end
|
34
|
+
ENV["RACK_ENV"] || ENV["MONGOID_ENV"] or raise Errors::NoEnvironment
|
25
35
|
end
|
26
36
|
|
27
37
|
# Load the yaml from the provided path and return the settings for the
|
28
|
-
# current environment.
|
38
|
+
# specified environment, or for the current Mongoid environment.
|
29
39
|
#
|
30
40
|
# @example Load the yaml.
|
31
41
|
# Environment.load_yaml("/work/mongoid.yml")
|
32
42
|
#
|
33
43
|
# @param [ String ] path The location of the file.
|
44
|
+
# @param [ String | Symbol ] environment Optional environment name to
|
45
|
+
# override the current Mongoid environment.
|
34
46
|
#
|
35
47
|
# @return [ Hash ] The settings.
|
36
48
|
#
|
37
49
|
# @since 2.3.0
|
50
|
+
# @api private
|
38
51
|
def load_yaml(path, environment = nil)
|
39
52
|
env = environment ? environment.to_s : env_name
|
40
53
|
YAML.load(ERB.new(File.new(path).read).result)[env]
|
@@ -45,7 +45,7 @@ module Mongoid
|
|
45
45
|
use(:__union__)
|
46
46
|
end
|
47
47
|
|
48
|
-
#
|
48
|
+
# Clear the current strategy and negating flag, used after cloning.
|
49
49
|
#
|
50
50
|
# @example Reset the strategies.
|
51
51
|
# mergeable.reset_strategies!
|
@@ -54,7 +54,8 @@ module Mongoid
|
|
54
54
|
#
|
55
55
|
# @since 1.0.0
|
56
56
|
def reset_strategies!
|
57
|
-
self.strategy
|
57
|
+
self.strategy = nil
|
58
|
+
self.negating = nil
|
58
59
|
end
|
59
60
|
|
60
61
|
private
|
@@ -167,7 +168,7 @@ module Mongoid
|
|
167
168
|
# @example Add the criterion.
|
168
169
|
# mergeable.__override__([ 1, 2 ], "$in")
|
169
170
|
#
|
170
|
-
# @param [ Hash ] criterion The criteria.
|
171
|
+
# @param [ Hash | Criteria ] criterion The criteria.
|
171
172
|
# @param [ String ] operator The MongoDB operator.
|
172
173
|
#
|
173
174
|
# @return [ Mergeable ] The new mergeable.
|
@@ -225,7 +226,7 @@ module Mongoid
|
|
225
226
|
# @api private
|
226
227
|
#
|
227
228
|
# @example Add criterion with a strategy.
|
228
|
-
# mergeable.with_strategy(:__union__, [ 1, 2, 3 ], "$in")
|
229
|
+
# mergeable.with_strategy(:__union__, {field_name: [ 1, 2, 3 ]}, "$in")
|
229
230
|
#
|
230
231
|
# @param [ Symbol ] strategy The name of the strategy method.
|
231
232
|
# @param [ Object ] criterion The criterion to add.
|
@@ -434,7 +434,7 @@ module Mongoid
|
|
434
434
|
# @since 1.0.0
|
435
435
|
def not(*criterion)
|
436
436
|
if criterion.empty?
|
437
|
-
tap { |query| query.negating = true }
|
437
|
+
dup.tap { |query| query.negating = true }
|
438
438
|
else
|
439
439
|
__override__(criterion.first, "$not")
|
440
440
|
end
|
@@ -630,8 +630,6 @@ module Mongoid
|
|
630
630
|
# Take the provided criterion and store it as a selection in the query
|
631
631
|
# selector.
|
632
632
|
#
|
633
|
-
# @api private
|
634
|
-
#
|
635
633
|
# @example Store the selection.
|
636
634
|
# selectable.selection({ field: "value" })
|
637
635
|
#
|
@@ -640,6 +638,7 @@ module Mongoid
|
|
640
638
|
# @return [ Selectable ] The cloned selectable.
|
641
639
|
#
|
642
640
|
# @since 1.0.0
|
641
|
+
# @api private
|
643
642
|
def selection(criterion = nil)
|
644
643
|
clone.tap do |query|
|
645
644
|
if criterion
|
data/lib/mongoid/matchable.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require "mongoid/matchable/default"
|
3
3
|
require "mongoid/matchable/all"
|
4
4
|
require "mongoid/matchable/and"
|
5
|
+
require "mongoid/matchable/elem_match"
|
5
6
|
require "mongoid/matchable/eq"
|
6
7
|
require "mongoid/matchable/exists"
|
7
8
|
require "mongoid/matchable/gt"
|
@@ -11,15 +12,14 @@ require "mongoid/matchable/lt"
|
|
11
12
|
require "mongoid/matchable/lte"
|
12
13
|
require "mongoid/matchable/ne"
|
13
14
|
require "mongoid/matchable/nin"
|
14
|
-
require "mongoid/matchable/or"
|
15
15
|
require "mongoid/matchable/nor"
|
16
|
-
require "mongoid/matchable/
|
17
|
-
require "mongoid/matchable/elem_match"
|
16
|
+
require "mongoid/matchable/or"
|
18
17
|
require "mongoid/matchable/regexp"
|
18
|
+
require "mongoid/matchable/size"
|
19
19
|
|
20
20
|
module Mongoid
|
21
21
|
|
22
|
-
# This module contains all the behavior for
|
22
|
+
# This module contains all the behavior for Ruby implementations of MongoDB
|
23
23
|
# selectors.
|
24
24
|
#
|
25
25
|
# @since 4.0.0
|
@@ -31,8 +31,8 @@ module Mongoid
|
|
31
31
|
# @since 1.0.0
|
32
32
|
MATCHERS = {
|
33
33
|
"$all" => All,
|
34
|
-
"$elemMatch" => ElemMatch,
|
35
34
|
"$and" => And,
|
35
|
+
"$elemMatch" => ElemMatch,
|
36
36
|
"$eq" => Eq,
|
37
37
|
"$exists" => Exists,
|
38
38
|
"$gt" => Gt,
|
@@ -42,8 +42,8 @@ module Mongoid
|
|
42
42
|
"$lte" => Lte,
|
43
43
|
"$ne" => Ne,
|
44
44
|
"$nin" => Nin,
|
45
|
-
"$or" => Or,
|
46
45
|
"$nor" => Nor,
|
46
|
+
"$or" => Or,
|
47
47
|
"$size" => Size,
|
48
48
|
}.with_indifferent_access.freeze
|
49
49
|
|
@@ -64,13 +64,13 @@ module Mongoid
|
|
64
64
|
value.each do |item|
|
65
65
|
if item[0].to_s == "$not".freeze
|
66
66
|
item = item[1]
|
67
|
-
return false if matcher(
|
67
|
+
return false if matcher(key, item)._matches?(item)
|
68
68
|
else
|
69
|
-
return false unless matcher(
|
69
|
+
return false unless matcher(key, Hash[*item])._matches?(Hash[*item])
|
70
70
|
end
|
71
71
|
end
|
72
72
|
else
|
73
|
-
return false unless matcher(
|
73
|
+
return false unless matcher(key, value)._matches?(value)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
true
|
@@ -81,20 +81,18 @@ module Mongoid
|
|
81
81
|
# Get the matcher for the supplied key and value. Will determine the class
|
82
82
|
# name from the key.
|
83
83
|
#
|
84
|
-
# @api private
|
85
|
-
#
|
86
84
|
# @example Get the matcher.
|
87
85
|
# document.matcher(:title, { "$in" => [ "test" ] })
|
88
86
|
#
|
89
|
-
# @param [ Document ] document The document to check.
|
90
87
|
# @param [ Symbol, String ] key The field name.
|
91
88
|
# @param [ Object, Hash ] value The value or selector.
|
92
89
|
#
|
93
90
|
# @return [ Matcher ] The matcher.
|
94
91
|
#
|
95
92
|
# @since 2.0.0.rc.7
|
96
|
-
|
97
|
-
|
93
|
+
# @api private
|
94
|
+
def matcher(key, value)
|
95
|
+
Matchable.matcher(self, key, value)
|
98
96
|
end
|
99
97
|
|
100
98
|
class << self
|
@@ -105,7 +103,7 @@ module Mongoid
|
|
105
103
|
# @api private
|
106
104
|
#
|
107
105
|
# @example Get the matcher.
|
108
|
-
#
|
106
|
+
# Matchable.matcher(document, :title, { "$in" => [ "test" ] })
|
109
107
|
#
|
110
108
|
# @param [ Document ] document The document to check.
|
111
109
|
# @param [ Symbol, String ] key The field name.
|
@@ -149,6 +147,7 @@ module Mongoid
|
|
149
147
|
# @return [ Object ] The value of the attribute.
|
150
148
|
#
|
151
149
|
# @since 2.2.1
|
150
|
+
# @api private
|
152
151
|
def extract_attribute(document, key)
|
153
152
|
if (key_string = key.to_s) =~ /.+\..+/
|
154
153
|
key_string.split('.').inject(document.send(:as_attributes)) do |_attribs, _key|
|
@@ -10,11 +10,12 @@ module Mongoid
|
|
10
10
|
# @example Do the values match?
|
11
11
|
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
|
-
# @param [ Hash ]
|
13
|
+
# @param [ Hash ] condition The condition to evaluate. This must be
|
14
|
+
# a one-element hash like {'$gt' => 1}.
|
14
15
|
#
|
15
16
|
# @return [ true, false ] If the values match.
|
16
|
-
def _matches?(
|
17
|
-
first =
|
17
|
+
def _matches?(condition)
|
18
|
+
first = condition_value(condition)
|
18
19
|
return false if first.is_a?(Array) && first.empty?
|
19
20
|
|
20
21
|
attribute_array = Array.wrap(@attribute)
|
@@ -20,52 +20,99 @@ module Mongoid
|
|
20
20
|
@attribute, @document = attribute, document
|
21
21
|
end
|
22
22
|
|
23
|
-
#
|
24
|
-
#
|
23
|
+
# Checks whether the attribute matches the value, using the default
|
24
|
+
# MongoDB matching logic (i.e., when no operator is specified in the
|
25
|
+
# criteria).
|
25
26
|
#
|
26
|
-
#
|
27
|
-
#
|
27
|
+
# If attribute and value are both of basic types like string or number,
|
28
|
+
# this method returns true if and only if the attribute equals the value.
|
28
29
|
#
|
29
|
-
#
|
30
|
+
# Value can also be of a type like Regexp or Range which defines
|
31
|
+
# more complex matching/inclusion behavior via the === operator.
|
32
|
+
# If so, and attribute is still of a basic type like string or number,
|
33
|
+
# this method returns true if and only if the value's === operator
|
34
|
+
# returns true for the attribute. For example, this method returns true
|
35
|
+
# if attribute is a string and value is a Regexp and attribute matches
|
36
|
+
# the value, of if attribute is a number and value is a Range and
|
37
|
+
# the value includes the attribute.
|
30
38
|
#
|
31
|
-
#
|
39
|
+
# If attribute is an array and value is not an array, the checks just
|
40
|
+
# described (i.e. the === operator invocation) are performed on each item
|
41
|
+
# of the attribute array. If any of the items in the attribute match
|
42
|
+
# the value according to the value type's === operator, this method
|
43
|
+
# returns true.
|
44
|
+
#
|
45
|
+
# If attribute and value are both arrays, this method returns true if and
|
46
|
+
# only if the arrays are equal (including the order of the elements).
|
47
|
+
#
|
48
|
+
# @param [ Object ] value The value to check.
|
49
|
+
#
|
50
|
+
# @return [ true, false ] True if attribute matches the value, false if not.
|
32
51
|
#
|
33
52
|
# @since 1.0.0
|
34
53
|
def _matches?(value)
|
35
|
-
attribute.is_a?(Array) && !value.is_a?(Array)
|
54
|
+
if attribute.is_a?(Array) && !value.is_a?(Array)
|
55
|
+
attribute.any? { |_attribute| value === _attribute }
|
56
|
+
else
|
57
|
+
value === attribute
|
58
|
+
end
|
36
59
|
end
|
37
60
|
|
38
61
|
protected
|
39
62
|
|
40
|
-
#
|
63
|
+
# Given a condition, which is a one-element hash consisting of an
|
64
|
+
# operator and a value like {'$gt' => 1}, return the value.
|
41
65
|
#
|
42
|
-
# @example Get the
|
43
|
-
# matcher.
|
66
|
+
# @example Get the condition value.
|
67
|
+
# matcher.condition_value({'$gt' => 1})
|
68
|
+
# # => 1
|
44
69
|
#
|
45
|
-
# @param [ Hash ]
|
70
|
+
# @param [ Hash ] condition The condition.
|
46
71
|
#
|
47
|
-
# @return [ Object ] The
|
72
|
+
# @return [ Object ] The value of the condition.
|
48
73
|
#
|
49
74
|
# @since 1.0.0
|
50
|
-
def
|
51
|
-
|
75
|
+
def condition_value(condition)
|
76
|
+
unless condition.is_a?(Hash)
|
77
|
+
raise ArgumentError, 'Condition must be a hash'
|
78
|
+
end
|
79
|
+
|
80
|
+
unless condition.length == 1
|
81
|
+
raise ArgumentError, 'Condition must have one element'
|
82
|
+
end
|
83
|
+
|
84
|
+
condition.values.first
|
52
85
|
end
|
53
86
|
|
54
|
-
#
|
87
|
+
# Determines whether the attribute value stored in this matcher
|
88
|
+
# satisfies the provided condition using the provided operator.
|
89
|
+
#
|
90
|
+
# For example, given an instance of Gt matcher with the @attribute of
|
91
|
+
# 2, the matcher is set up to answer whether the attribute is
|
92
|
+
# greater than some input value. This input value is provided in
|
93
|
+
# the condition, which could be {"$gt" => 1}, and the operator is
|
94
|
+
# provided (somewhat in a duplicate fashion) in the operator argument,
|
95
|
+
# in this case :>.
|
55
96
|
#
|
56
|
-
# @example
|
57
|
-
# matcher.
|
97
|
+
# @example
|
98
|
+
# matcher = Matchable::Gt.new(2)
|
99
|
+
# matcher.determine({'$gt' => 1}, :>)
|
100
|
+
# # => true
|
58
101
|
#
|
59
|
-
# @param [
|
60
|
-
#
|
102
|
+
# @param [ Hash ] condition The condition to evaluate. This must be
|
103
|
+
# a one-element hash; the key is ignored, and the value is passed
|
104
|
+
# as the argument to the operator.
|
105
|
+
# @param [ Symbol, String ] operator The comparison operator or method.
|
106
|
+
# The operator is invoked on the attribute stored in the matcher
|
107
|
+
# instance.
|
61
108
|
#
|
62
|
-
# @return [ true, false ]
|
109
|
+
# @return [ true, false ] Result of condition evaluation.
|
63
110
|
#
|
64
111
|
# @since 1.0.0
|
65
|
-
def determine(
|
66
|
-
attribute.__array__.any?
|
67
|
-
attr
|
68
|
-
|
112
|
+
def determine(condition, operator)
|
113
|
+
attribute.__array__.any? do |attr|
|
114
|
+
attr && attr.send(operator, condition_value(condition))
|
115
|
+
end
|
69
116
|
end
|
70
117
|
end
|
71
118
|
end
|