origin 0.0.0.alpha → 1.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/Rakefile +3 -0
  2. data/lib/origin.rb +3 -4
  3. data/lib/origin/extensions.rb +25 -0
  4. data/lib/origin/extensions/array.rb +153 -0
  5. data/lib/origin/extensions/big_decimal.rb +33 -0
  6. data/lib/origin/extensions/boolean.rb +30 -0
  7. data/lib/origin/extensions/date.rb +59 -0
  8. data/lib/origin/extensions/date_time.rb +44 -0
  9. data/lib/origin/extensions/hash.rb +180 -0
  10. data/lib/origin/extensions/nil_class.rb +82 -0
  11. data/lib/origin/extensions/numeric.rb +86 -0
  12. data/lib/origin/extensions/object.rb +182 -0
  13. data/lib/origin/extensions/range.rb +66 -0
  14. data/lib/origin/extensions/regexp.rb +41 -0
  15. data/lib/origin/extensions/set.rb +28 -0
  16. data/lib/origin/extensions/string.rb +100 -0
  17. data/lib/origin/extensions/symbol.rb +74 -0
  18. data/lib/origin/extensions/time.rb +44 -0
  19. data/lib/origin/extensions/time_with_zone.rb +50 -0
  20. data/lib/origin/forwardable.rb +57 -0
  21. data/lib/origin/key.rb +74 -0
  22. data/lib/origin/macroable.rb +23 -0
  23. data/lib/origin/mergeable.rb +226 -0
  24. data/lib/origin/optional.rb +314 -29
  25. data/lib/origin/options.rb +64 -1
  26. data/lib/origin/queryable.rb +55 -12
  27. data/lib/origin/selectable.rb +613 -0
  28. data/lib/origin/selector.rb +140 -1
  29. data/lib/origin/smash.rb +85 -0
  30. data/lib/origin/version.rb +1 -1
  31. metadata +94 -62
  32. data/lib/origin/ext.rb +0 -5
  33. data/lib/origin/ext/array.rb +0 -21
  34. data/lib/origin/ext/hash.rb +0 -38
  35. data/lib/origin/ext/nil.rb +0 -9
  36. data/lib/origin/ext/object.rb +0 -25
  37. data/lib/origin/optional/batch_size.rb +0 -11
  38. data/lib/origin/optional/hint.rb +0 -15
  39. data/lib/origin/optional/limit.rb +0 -11
  40. data/lib/origin/optional/max_scan.rb +0 -11
  41. data/lib/origin/optional/no_timeout.rb +0 -11
  42. data/lib/origin/optional/only.rb +0 -15
  43. data/lib/origin/optional/read.rb +0 -11
  44. data/lib/origin/optional/return_key.rb +0 -11
  45. data/lib/origin/optional/show_disk_loc.rb +0 -11
  46. data/lib/origin/optional/skip.rb +0 -11
  47. data/lib/origin/optional/slice.rb +0 -17
  48. data/lib/origin/optional/snapshot.rb +0 -13
  49. data/lib/origin/optional/transformer.rb +0 -11
  50. data/lib/origin/optional/without.rb +0 -15
  51. data/lib/origin/selection.rb +0 -59
  52. data/lib/origin/selection/all.rb +0 -18
  53. data/lib/origin/selection/and.rb +0 -11
  54. data/lib/origin/selection/between.rb +0 -16
  55. data/lib/origin/selection/elem_match.rb +0 -18
  56. data/lib/origin/selection/exists.rb +0 -18
  57. data/lib/origin/selection/gt.rb +0 -18
  58. data/lib/origin/selection/gte.rb +0 -18
  59. data/lib/origin/selection/in.rb +0 -18
  60. data/lib/origin/selection/key.rb +0 -20
  61. data/lib/origin/selection/lt.rb +0 -18
  62. data/lib/origin/selection/lte.rb +0 -18
  63. data/lib/origin/selection/max_distance.rb +0 -11
  64. data/lib/origin/selection/mod.rb +0 -18
  65. data/lib/origin/selection/ne.rb +0 -18
  66. data/lib/origin/selection/near.rb +0 -18
  67. data/lib/origin/selection/near_sphere.rb +0 -18
  68. data/lib/origin/selection/nin.rb +0 -18
  69. data/lib/origin/selection/nor.rb +0 -11
  70. data/lib/origin/selection/or.rb +0 -11
  71. data/lib/origin/selection/size.rb +0 -18
  72. data/lib/origin/selection/strategies.rb +0 -40
  73. data/lib/origin/selection/strategies/add.rb +0 -18
  74. data/lib/origin/selection/strategies/expanded.rb +0 -15
  75. data/lib/origin/selection/strategies/intersect.rb +0 -22
  76. data/lib/origin/selection/strategies/multi.rb +0 -21
  77. data/lib/origin/selection/strategies/override.rb +0 -19
  78. data/lib/origin/selection/strategies/union.rb +0 -22
  79. data/lib/origin/selection/type.rb +0 -18
  80. data/lib/origin/selection/where.rb +0 -29
  81. data/lib/origin/selection/within_box.rb +0 -18
  82. data/lib/origin/selection/within_circle.rb +0 -18
  83. data/lib/origin/selection/within_spherical_circle.rb +0 -18
@@ -1,5 +1,144 @@
1
1
  # encoding: utf-8
2
2
  module Origin
3
- class Selector < Hash
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
@@ -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
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Origin
3
- VERSION = "0.0.0.alpha"
3
+ VERSION = "1.0.0.alpha"
4
4
  end
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: 0.0.0.alpha
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: 2011-12-18 00:00:00.000000000 Z
12
+ date: 2012-04-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rspec
16
- requirement: &70272334463460 !ruby/object:Gem::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: '2.6'
21
+ version: '3.1'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70272334463460
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: watchr
27
- requirement: &70272334462920 !ruby/object:Gem::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: *70272334462920
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/ext/array.rb
44
- - lib/origin/ext/hash.rb
45
- - lib/origin/ext/nil.rb
46
- - lib/origin/ext/object.rb
47
- - lib/origin/ext.rb
48
- - lib/origin/optional/batch_size.rb
49
- - lib/origin/optional/hint.rb
50
- - lib/origin/optional/limit.rb
51
- - lib/origin/optional/max_scan.rb
52
- - lib/origin/optional/no_timeout.rb
53
- - lib/origin/optional/only.rb
54
- - lib/origin/optional/read.rb
55
- - lib/origin/optional/return_key.rb
56
- - lib/origin/optional/show_disk_loc.rb
57
- - lib/origin/optional/skip.rb
58
- - lib/origin/optional/slice.rb
59
- - lib/origin/optional/snapshot.rb
60
- - lib/origin/optional/transformer.rb
61
- - lib/origin/optional/without.rb
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/selection/all.rb
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.10
154
+ rubygems_version: 1.8.19
123
155
  signing_key:
124
156
  specification_version: 3
125
157
  summary: Simple DSL for MongoDB query generation
@@ -1,5 +0,0 @@
1
- # encoding: utf-8
2
- require "origin/ext/array"
3
- require "origin/ext/hash"
4
- require "origin/ext/nil"
5
- require "origin/ext/object"