origin 0.0.0.alpha → 1.0.0.alpha
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/Rakefile +3 -0
- data/lib/origin.rb +3 -4
- data/lib/origin/extensions.rb +25 -0
- data/lib/origin/extensions/array.rb +153 -0
- data/lib/origin/extensions/big_decimal.rb +33 -0
- data/lib/origin/extensions/boolean.rb +30 -0
- data/lib/origin/extensions/date.rb +59 -0
- data/lib/origin/extensions/date_time.rb +44 -0
- data/lib/origin/extensions/hash.rb +180 -0
- data/lib/origin/extensions/nil_class.rb +82 -0
- data/lib/origin/extensions/numeric.rb +86 -0
- data/lib/origin/extensions/object.rb +182 -0
- data/lib/origin/extensions/range.rb +66 -0
- data/lib/origin/extensions/regexp.rb +41 -0
- data/lib/origin/extensions/set.rb +28 -0
- data/lib/origin/extensions/string.rb +100 -0
- data/lib/origin/extensions/symbol.rb +74 -0
- data/lib/origin/extensions/time.rb +44 -0
- data/lib/origin/extensions/time_with_zone.rb +50 -0
- data/lib/origin/forwardable.rb +57 -0
- data/lib/origin/key.rb +74 -0
- data/lib/origin/macroable.rb +23 -0
- data/lib/origin/mergeable.rb +226 -0
- data/lib/origin/optional.rb +314 -29
- data/lib/origin/options.rb +64 -1
- data/lib/origin/queryable.rb +55 -12
- data/lib/origin/selectable.rb +613 -0
- data/lib/origin/selector.rb +140 -1
- data/lib/origin/smash.rb +85 -0
- data/lib/origin/version.rb +1 -1
- metadata +94 -62
- data/lib/origin/ext.rb +0 -5
- data/lib/origin/ext/array.rb +0 -21
- data/lib/origin/ext/hash.rb +0 -38
- data/lib/origin/ext/nil.rb +0 -9
- data/lib/origin/ext/object.rb +0 -25
- data/lib/origin/optional/batch_size.rb +0 -11
- data/lib/origin/optional/hint.rb +0 -15
- data/lib/origin/optional/limit.rb +0 -11
- data/lib/origin/optional/max_scan.rb +0 -11
- data/lib/origin/optional/no_timeout.rb +0 -11
- data/lib/origin/optional/only.rb +0 -15
- data/lib/origin/optional/read.rb +0 -11
- data/lib/origin/optional/return_key.rb +0 -11
- data/lib/origin/optional/show_disk_loc.rb +0 -11
- data/lib/origin/optional/skip.rb +0 -11
- data/lib/origin/optional/slice.rb +0 -17
- data/lib/origin/optional/snapshot.rb +0 -13
- data/lib/origin/optional/transformer.rb +0 -11
- data/lib/origin/optional/without.rb +0 -15
- data/lib/origin/selection.rb +0 -59
- data/lib/origin/selection/all.rb +0 -18
- data/lib/origin/selection/and.rb +0 -11
- data/lib/origin/selection/between.rb +0 -16
- data/lib/origin/selection/elem_match.rb +0 -18
- data/lib/origin/selection/exists.rb +0 -18
- data/lib/origin/selection/gt.rb +0 -18
- data/lib/origin/selection/gte.rb +0 -18
- data/lib/origin/selection/in.rb +0 -18
- data/lib/origin/selection/key.rb +0 -20
- data/lib/origin/selection/lt.rb +0 -18
- data/lib/origin/selection/lte.rb +0 -18
- data/lib/origin/selection/max_distance.rb +0 -11
- data/lib/origin/selection/mod.rb +0 -18
- data/lib/origin/selection/ne.rb +0 -18
- data/lib/origin/selection/near.rb +0 -18
- data/lib/origin/selection/near_sphere.rb +0 -18
- data/lib/origin/selection/nin.rb +0 -18
- data/lib/origin/selection/nor.rb +0 -11
- data/lib/origin/selection/or.rb +0 -11
- data/lib/origin/selection/size.rb +0 -18
- data/lib/origin/selection/strategies.rb +0 -40
- data/lib/origin/selection/strategies/add.rb +0 -18
- data/lib/origin/selection/strategies/expanded.rb +0 -15
- data/lib/origin/selection/strategies/intersect.rb +0 -22
- data/lib/origin/selection/strategies/multi.rb +0 -21
- data/lib/origin/selection/strategies/override.rb +0 -19
- data/lib/origin/selection/strategies/union.rb +0 -22
- data/lib/origin/selection/type.rb +0 -18
- data/lib/origin/selection/where.rb +0 -29
- data/lib/origin/selection/within_box.rb +0 -18
- data/lib/origin/selection/within_circle.rb +0 -18
- data/lib/origin/selection/within_spherical_circle.rb +0 -18
data/lib/origin/selector.rb
CHANGED
@@ -1,5 +1,144 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Origin
|
3
|
-
|
3
|
+
|
4
|
+
# The selector is a special kind of hash that knows how to serialize values
|
5
|
+
# coming into it as well as being alias and locale aware for key names.
|
6
|
+
class Selector < Smash
|
7
|
+
|
8
|
+
def merge!(other)
|
9
|
+
other.each_pair do |key, value|
|
10
|
+
store(key, value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Store the value in the selector for the provided key. The selector will
|
15
|
+
# handle all necessary serialization and localization in this step.
|
16
|
+
#
|
17
|
+
# @example Store a value in the selector.
|
18
|
+
# selector.store(:key, "testing")
|
19
|
+
#
|
20
|
+
# @param [ String, Symbol ] key The name of the attribute.
|
21
|
+
# @param [ Object ] value The value to add.
|
22
|
+
#
|
23
|
+
# @return [ Object ] The stored object.
|
24
|
+
#
|
25
|
+
# @since 1.0.0
|
26
|
+
def store(key, value)
|
27
|
+
name, serializer = storage_pair(key)
|
28
|
+
if multi_selection?(name)
|
29
|
+
super(name, evolve_multi(value))
|
30
|
+
else
|
31
|
+
super(normalized_key(name, serializer), evolve(serializer, value))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
alias :[]= :store
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Evolves a multi-list selection, like an $and or $or criterion, and
|
39
|
+
# performs the necessary serialization.
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
#
|
43
|
+
# @example Evolve the multi-selection.
|
44
|
+
# selector.evolve_multi([{ field: "value" }])
|
45
|
+
#
|
46
|
+
# @param [ Array<Hash> ] The multi-selection.
|
47
|
+
#
|
48
|
+
# @return [ Array<Hash> ] The serialized values.
|
49
|
+
#
|
50
|
+
# @since 1.0.0
|
51
|
+
def evolve_multi(value)
|
52
|
+
value.map do |val|
|
53
|
+
Hash[val.map do |key, _value|
|
54
|
+
name = key.to_s
|
55
|
+
serializer = serializers[name]
|
56
|
+
[ normalized_key(name, serializer), evolve(serializer, _value) ]
|
57
|
+
end]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Evolve a single key selection with various types of values.
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
#
|
65
|
+
# @example Evolve a simple selection.
|
66
|
+
# selector.evolve(field, 5)
|
67
|
+
#
|
68
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
69
|
+
# @param [ Object ] value The value to serialize.
|
70
|
+
#
|
71
|
+
# @return [ Object ] The serialized object.
|
72
|
+
#
|
73
|
+
# @since 1.0.0
|
74
|
+
def evolve(serializer, value)
|
75
|
+
case value
|
76
|
+
when Hash
|
77
|
+
evolve_hash(serializer, value)
|
78
|
+
when Array
|
79
|
+
evolve_array(serializer, value)
|
80
|
+
else
|
81
|
+
(serializer || value.class).evolve(value)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Evolve a single key selection with array values.
|
86
|
+
#
|
87
|
+
# @api private
|
88
|
+
#
|
89
|
+
# @example Evolve a simple selection.
|
90
|
+
# selector.evolve(field, [ 1, 2, 3 ])
|
91
|
+
#
|
92
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
93
|
+
# @param [ Array<Object> ] value The array to serialize.
|
94
|
+
#
|
95
|
+
# @return [ Object ] The serialized array.
|
96
|
+
#
|
97
|
+
# @since 1.0.0
|
98
|
+
def evolve_array(serializer, value)
|
99
|
+
value.map! do |_value|
|
100
|
+
evolve(serializer, _value)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Evolve a single key selection with hash values.
|
105
|
+
#
|
106
|
+
# @api private
|
107
|
+
#
|
108
|
+
# @example Evolve a simple selection.
|
109
|
+
# selector.evolve(field, { "$gt" => 5 })
|
110
|
+
#
|
111
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
112
|
+
# @param [ Hash ] value The hash to serialize.
|
113
|
+
#
|
114
|
+
# @return [ Object ] The serialized hash.
|
115
|
+
#
|
116
|
+
# @since 1.0.0
|
117
|
+
def evolve_hash(serializer, value)
|
118
|
+
value.each_pair do |operator, _value|
|
119
|
+
if operator =~ /exists|type|size/
|
120
|
+
value[operator] = _value
|
121
|
+
else
|
122
|
+
value[operator] = evolve(serializer, _value)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Determines if the selection is a multi-select, like an $and or $or
|
128
|
+
# selection.
|
129
|
+
#
|
130
|
+
# @api private
|
131
|
+
#
|
132
|
+
# @example Is the selection a multi-select?
|
133
|
+
# selector.multi_selection?("$and")
|
134
|
+
#
|
135
|
+
# @param [ String ] key The key to check.
|
136
|
+
#
|
137
|
+
# @return [ true, false ] If the key is for a multi-select.
|
138
|
+
#
|
139
|
+
# @since 1.0.0
|
140
|
+
def multi_selection?(key)
|
141
|
+
key =~ /\$and|\$or/
|
142
|
+
end
|
4
143
|
end
|
5
144
|
end
|
data/lib/origin/smash.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Origin
|
3
|
+
|
4
|
+
# This is a smart hash for use with options and selectors.
|
5
|
+
class Smash < Hash
|
6
|
+
|
7
|
+
# @attribute [r] aliases The aliases.
|
8
|
+
# @attribute [r] serializers The serializers.
|
9
|
+
attr_reader :aliases, :serializers
|
10
|
+
|
11
|
+
# Perform a deep copy of the smash.
|
12
|
+
#
|
13
|
+
# @example Perform a deep copy.
|
14
|
+
# smash.__deep_copy__
|
15
|
+
#
|
16
|
+
# @return [ Smash ] The copied hash.
|
17
|
+
#
|
18
|
+
# @since 1.0.0
|
19
|
+
def __deep_copy__
|
20
|
+
self.class.new(aliases, serializers) do |copy|
|
21
|
+
each_pair do |key, value|
|
22
|
+
copy.store(key, value.__deep_copy__)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Initialize the new selector.
|
28
|
+
#
|
29
|
+
# @example Initialize the new selector.
|
30
|
+
# Origin::Smash.new(aliases, serializers)
|
31
|
+
#
|
32
|
+
# @param [ Hash ] aliases A hash of mappings from aliases to the actual
|
33
|
+
# field names in the database.
|
34
|
+
# @param [ Hash ] serializers An optional hash of objects that are
|
35
|
+
# responsible for serializing values. The keys of the hash must be
|
36
|
+
# strings that match the field name, and the values must respond to
|
37
|
+
# #localized? and #evolve(object).
|
38
|
+
#
|
39
|
+
# @since 1.0.0
|
40
|
+
def initialize(aliases = {}, serializers = {})
|
41
|
+
@aliases, @serializers = aliases, serializers
|
42
|
+
yield(self) if block_given?
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
# Get the normalized value for the key. If localization is in play the
|
48
|
+
# current locale will be appended to the key in MongoDB dot notation.
|
49
|
+
#
|
50
|
+
# @api private
|
51
|
+
#
|
52
|
+
# @example Get the normalized key name.
|
53
|
+
# smash.normalized_key("field", serializer)
|
54
|
+
#
|
55
|
+
# @param [ String ] name The name of the field.
|
56
|
+
# @param [ Object ] serializer The optional field serializer.
|
57
|
+
#
|
58
|
+
# @return [ String ] The normalized key.
|
59
|
+
#
|
60
|
+
# @since 1.0.0
|
61
|
+
def normalized_key(name, serializer)
|
62
|
+
serializer && serializer.localized? ? "#{name}.#{::I18n.locale}" : name
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get the pair of objects needed to store the value in a hash by the
|
66
|
+
# provided key. This is the database field name and the serializer.
|
67
|
+
#
|
68
|
+
# @api private
|
69
|
+
#
|
70
|
+
# @example Get the name and serializer.
|
71
|
+
# smash.storage_pair("id")
|
72
|
+
#
|
73
|
+
# @param [ Symbol, String ] key The key provided to the selection.
|
74
|
+
#
|
75
|
+
# @return [ Array<String, Object> ] The name of the db field and
|
76
|
+
# serializer.
|
77
|
+
#
|
78
|
+
# @since 1.0.0
|
79
|
+
def storage_pair(key)
|
80
|
+
field = key.to_s
|
81
|
+
name = aliases[field] || field
|
82
|
+
[ name, serializers[name] ]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/lib/origin/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0.alpha
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,30 +9,88 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement:
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '3.1'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.1'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement:
|
31
|
+
name: guard-rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0.6'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.6'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: i18n
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.6'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
57
|
none: false
|
29
58
|
requirements:
|
30
59
|
- - ~>
|
31
60
|
- !ruby/object:Gem::Version
|
32
61
|
version: '0.6'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.8'
|
33
70
|
type: :development
|
34
71
|
prerelease: false
|
35
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.8'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: tzinfo
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.3.22
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.3.22
|
36
94
|
description: Origin is a simple DSL for generating MongoDB selectors and options
|
37
95
|
email:
|
38
96
|
- durran@gmail.com
|
@@ -40,62 +98,33 @@ executables: []
|
|
40
98
|
extensions: []
|
41
99
|
extra_rdoc_files: []
|
42
100
|
files:
|
43
|
-
- lib/origin/
|
44
|
-
- lib/origin/
|
45
|
-
- lib/origin/
|
46
|
-
- lib/origin/
|
47
|
-
- lib/origin/
|
48
|
-
- lib/origin/
|
49
|
-
- lib/origin/
|
50
|
-
- lib/origin/
|
51
|
-
- lib/origin/
|
52
|
-
- lib/origin/
|
53
|
-
- lib/origin/
|
54
|
-
- lib/origin/
|
55
|
-
- lib/origin/
|
56
|
-
- lib/origin/
|
57
|
-
- lib/origin/
|
58
|
-
- lib/origin/
|
59
|
-
- lib/origin/
|
60
|
-
- lib/origin/
|
61
|
-
- lib/origin/
|
101
|
+
- lib/origin/extensions/array.rb
|
102
|
+
- lib/origin/extensions/big_decimal.rb
|
103
|
+
- lib/origin/extensions/boolean.rb
|
104
|
+
- lib/origin/extensions/date.rb
|
105
|
+
- lib/origin/extensions/date_time.rb
|
106
|
+
- lib/origin/extensions/hash.rb
|
107
|
+
- lib/origin/extensions/nil_class.rb
|
108
|
+
- lib/origin/extensions/numeric.rb
|
109
|
+
- lib/origin/extensions/object.rb
|
110
|
+
- lib/origin/extensions/range.rb
|
111
|
+
- lib/origin/extensions/regexp.rb
|
112
|
+
- lib/origin/extensions/set.rb
|
113
|
+
- lib/origin/extensions/string.rb
|
114
|
+
- lib/origin/extensions/symbol.rb
|
115
|
+
- lib/origin/extensions/time.rb
|
116
|
+
- lib/origin/extensions/time_with_zone.rb
|
117
|
+
- lib/origin/extensions.rb
|
118
|
+
- lib/origin/forwardable.rb
|
119
|
+
- lib/origin/key.rb
|
120
|
+
- lib/origin/macroable.rb
|
121
|
+
- lib/origin/mergeable.rb
|
62
122
|
- lib/origin/optional.rb
|
63
123
|
- lib/origin/options.rb
|
64
124
|
- lib/origin/queryable.rb
|
65
|
-
- lib/origin/
|
66
|
-
- lib/origin/selection/and.rb
|
67
|
-
- lib/origin/selection/between.rb
|
68
|
-
- lib/origin/selection/elem_match.rb
|
69
|
-
- lib/origin/selection/exists.rb
|
70
|
-
- lib/origin/selection/gt.rb
|
71
|
-
- lib/origin/selection/gte.rb
|
72
|
-
- lib/origin/selection/in.rb
|
73
|
-
- lib/origin/selection/key.rb
|
74
|
-
- lib/origin/selection/lt.rb
|
75
|
-
- lib/origin/selection/lte.rb
|
76
|
-
- lib/origin/selection/max_distance.rb
|
77
|
-
- lib/origin/selection/mod.rb
|
78
|
-
- lib/origin/selection/ne.rb
|
79
|
-
- lib/origin/selection/near.rb
|
80
|
-
- lib/origin/selection/near_sphere.rb
|
81
|
-
- lib/origin/selection/nin.rb
|
82
|
-
- lib/origin/selection/nor.rb
|
83
|
-
- lib/origin/selection/or.rb
|
84
|
-
- lib/origin/selection/size.rb
|
85
|
-
- lib/origin/selection/strategies/add.rb
|
86
|
-
- lib/origin/selection/strategies/expanded.rb
|
87
|
-
- lib/origin/selection/strategies/intersect.rb
|
88
|
-
- lib/origin/selection/strategies/multi.rb
|
89
|
-
- lib/origin/selection/strategies/override.rb
|
90
|
-
- lib/origin/selection/strategies/union.rb
|
91
|
-
- lib/origin/selection/strategies.rb
|
92
|
-
- lib/origin/selection/type.rb
|
93
|
-
- lib/origin/selection/where.rb
|
94
|
-
- lib/origin/selection/within_box.rb
|
95
|
-
- lib/origin/selection/within_circle.rb
|
96
|
-
- lib/origin/selection/within_spherical_circle.rb
|
97
|
-
- lib/origin/selection.rb
|
125
|
+
- lib/origin/selectable.rb
|
98
126
|
- lib/origin/selector.rb
|
127
|
+
- lib/origin/smash.rb
|
99
128
|
- lib/origin/version.rb
|
100
129
|
- lib/origin.rb
|
101
130
|
- Rakefile
|
@@ -111,6 +140,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
140
|
- - ! '>='
|
112
141
|
- !ruby/object:Gem::Version
|
113
142
|
version: '0'
|
143
|
+
segments:
|
144
|
+
- 0
|
145
|
+
hash: 2248080599464192453
|
114
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
147
|
none: false
|
116
148
|
requirements:
|
@@ -119,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
151
|
version: 1.3.6
|
120
152
|
requirements: []
|
121
153
|
rubyforge_project: origin
|
122
|
-
rubygems_version: 1.8.
|
154
|
+
rubygems_version: 1.8.19
|
123
155
|
signing_key:
|
124
156
|
specification_version: 3
|
125
157
|
summary: Simple DSL for MongoDB query generation
|