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.
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"