mark_mapper 0.0.1

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 (211) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.rdoc +39 -0
  4. data/examples/attr_accessible.rb +24 -0
  5. data/examples/attr_protected.rb +24 -0
  6. data/examples/cache_key.rb +26 -0
  7. data/examples/custom_types.rb +26 -0
  8. data/examples/identity_map.rb +30 -0
  9. data/examples/identity_map/automatic.rb +2 -0
  10. data/examples/keys.rb +42 -0
  11. data/examples/modifiers/set.rb +27 -0
  12. data/examples/plugins.rb +40 -0
  13. data/examples/querying.rb +39 -0
  14. data/examples/sample_app.rb +43 -0
  15. data/examples/scopes.rb +56 -0
  16. data/examples/validating/embedded_docs.rb +31 -0
  17. data/lib/mark_mapper.rb +125 -0
  18. data/lib/mark_mapper/config.rb +90 -0
  19. data/lib/mark_mapper/connection.rb +60 -0
  20. data/lib/mark_mapper/criteria_hash.rb +194 -0
  21. data/lib/mark_mapper/document.rb +46 -0
  22. data/lib/mark_mapper/embedded_document.rb +32 -0
  23. data/lib/mark_mapper/exceptions.rb +33 -0
  24. data/lib/mark_mapper/extensions/array.rb +27 -0
  25. data/lib/mark_mapper/extensions/boolean.rb +45 -0
  26. data/lib/mark_mapper/extensions/date.rb +29 -0
  27. data/lib/mark_mapper/extensions/duplicable.rb +86 -0
  28. data/lib/mark_mapper/extensions/float.rb +18 -0
  29. data/lib/mark_mapper/extensions/hash.rb +26 -0
  30. data/lib/mark_mapper/extensions/integer.rb +27 -0
  31. data/lib/mark_mapper/extensions/kernel.rb +11 -0
  32. data/lib/mark_mapper/extensions/nil_class.rb +18 -0
  33. data/lib/mark_mapper/extensions/object.rb +30 -0
  34. data/lib/mark_mapper/extensions/object_id.rb +18 -0
  35. data/lib/mark_mapper/extensions/set.rb +20 -0
  36. data/lib/mark_mapper/extensions/string.rb +31 -0
  37. data/lib/mark_mapper/extensions/symbol.rb +87 -0
  38. data/lib/mark_mapper/extensions/time.rb +29 -0
  39. data/lib/mark_mapper/locale/en.yml +5 -0
  40. data/lib/mark_mapper/middleware/identity_map.rb +41 -0
  41. data/lib/mark_mapper/normalizers/criteria_hash_key.rb +17 -0
  42. data/lib/mark_mapper/normalizers/criteria_hash_value.rb +66 -0
  43. data/lib/mark_mapper/normalizers/fields_value.rb +26 -0
  44. data/lib/mark_mapper/normalizers/hash_key.rb +19 -0
  45. data/lib/mark_mapper/normalizers/integer.rb +19 -0
  46. data/lib/mark_mapper/normalizers/options_hash_value.rb +83 -0
  47. data/lib/mark_mapper/normalizers/sort_value.rb +55 -0
  48. data/lib/mark_mapper/options_hash.rb +103 -0
  49. data/lib/mark_mapper/pagination.rb +6 -0
  50. data/lib/mark_mapper/pagination/collection.rb +32 -0
  51. data/lib/mark_mapper/pagination/paginator.rb +46 -0
  52. data/lib/mark_mapper/plugins.rb +22 -0
  53. data/lib/mark_mapper/plugins/accessible.rb +61 -0
  54. data/lib/mark_mapper/plugins/active_model.rb +18 -0
  55. data/lib/mark_mapper/plugins/associations.rb +96 -0
  56. data/lib/mark_mapper/plugins/associations/base.rb +98 -0
  57. data/lib/mark_mapper/plugins/associations/belongs_to_association.rb +63 -0
  58. data/lib/mark_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +35 -0
  59. data/lib/mark_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
  60. data/lib/mark_mapper/plugins/associations/collection.rb +29 -0
  61. data/lib/mark_mapper/plugins/associations/embedded_collection.rb +44 -0
  62. data/lib/mark_mapper/plugins/associations/in_array_proxy.rb +133 -0
  63. data/lib/mark_mapper/plugins/associations/many_association.rb +63 -0
  64. data/lib/mark_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
  65. data/lib/mark_mapper/plugins/associations/many_documents_proxy.rb +142 -0
  66. data/lib/mark_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
  67. data/lib/mark_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
  68. data/lib/mark_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
  69. data/lib/mark_mapper/plugins/associations/one_as_proxy.rb +22 -0
  70. data/lib/mark_mapper/plugins/associations/one_association.rb +48 -0
  71. data/lib/mark_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
  72. data/lib/mark_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
  73. data/lib/mark_mapper/plugins/associations/one_proxy.rb +95 -0
  74. data/lib/mark_mapper/plugins/associations/proxy.rb +138 -0
  75. data/lib/mark_mapper/plugins/associations/single_association.rb +46 -0
  76. data/lib/mark_mapper/plugins/caching.rb +21 -0
  77. data/lib/mark_mapper/plugins/callbacks.rb +42 -0
  78. data/lib/mark_mapper/plugins/clone.rb +24 -0
  79. data/lib/mark_mapper/plugins/counter_cache.rb +97 -0
  80. data/lib/mark_mapper/plugins/dirty.rb +61 -0
  81. data/lib/mark_mapper/plugins/document.rb +41 -0
  82. data/lib/mark_mapper/plugins/dumpable.rb +22 -0
  83. data/lib/mark_mapper/plugins/dynamic_querying.rb +45 -0
  84. data/lib/mark_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
  85. data/lib/mark_mapper/plugins/embedded_callbacks.rb +81 -0
  86. data/lib/mark_mapper/plugins/embedded_document.rb +53 -0
  87. data/lib/mark_mapper/plugins/equality.rb +23 -0
  88. data/lib/mark_mapper/plugins/identity_map.rb +144 -0
  89. data/lib/mark_mapper/plugins/indexable.rb +86 -0
  90. data/lib/mark_mapper/plugins/inspect.rb +16 -0
  91. data/lib/mark_mapper/plugins/keys.rb +470 -0
  92. data/lib/mark_mapper/plugins/keys/key.rb +134 -0
  93. data/lib/mark_mapper/plugins/keys/static.rb +45 -0
  94. data/lib/mark_mapper/plugins/logger.rb +18 -0
  95. data/lib/mark_mapper/plugins/modifiers.rb +140 -0
  96. data/lib/mark_mapper/plugins/pagination.rb +16 -0
  97. data/lib/mark_mapper/plugins/partial_updates.rb +77 -0
  98. data/lib/mark_mapper/plugins/persistence.rb +79 -0
  99. data/lib/mark_mapper/plugins/protected.rb +45 -0
  100. data/lib/mark_mapper/plugins/querying.rb +173 -0
  101. data/lib/mark_mapper/plugins/querying/decorated_markmapper_query.rb +75 -0
  102. data/lib/mark_mapper/plugins/rails.rb +79 -0
  103. data/lib/mark_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
  104. data/lib/mark_mapper/plugins/sci.rb +82 -0
  105. data/lib/mark_mapper/plugins/scopes.rb +28 -0
  106. data/lib/mark_mapper/plugins/serialization.rb +109 -0
  107. data/lib/mark_mapper/plugins/timestamps.rb +29 -0
  108. data/lib/mark_mapper/plugins/touch.rb +18 -0
  109. data/lib/mark_mapper/plugins/userstamps.rb +18 -0
  110. data/lib/mark_mapper/plugins/validations.rb +96 -0
  111. data/lib/mark_mapper/query.rb +278 -0
  112. data/lib/mark_mapper/railtie.rb +52 -0
  113. data/lib/mark_mapper/railtie/database.rake +65 -0
  114. data/lib/mark_mapper/translation.rb +10 -0
  115. data/lib/mark_mapper/version.rb +4 -0
  116. data/lib/rails/generators/mark_mapper/config/config_generator.rb +37 -0
  117. data/lib/rails/generators/mark_mapper/config/templates/marklogic.yml +19 -0
  118. data/lib/rails/generators/mark_mapper/model/model_generator.rb +40 -0
  119. data/lib/rails/generators/mark_mapper/model/templates/model.rb +17 -0
  120. data/spec/config/mark_mapper.yml +6 -0
  121. data/spec/examples_spec.rb +25 -0
  122. data/spec/functional/accessible_spec.rb +198 -0
  123. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +64 -0
  124. data/spec/functional/associations/belongs_to_proxy_spec.rb +255 -0
  125. data/spec/functional/associations/in_array_proxy_spec.rb +349 -0
  126. data/spec/functional/associations/many_documents_as_proxy_spec.rb +230 -0
  127. data/spec/functional/associations/many_documents_proxy_spec.rb +968 -0
  128. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +238 -0
  129. data/spec/functional/associations/many_embedded_proxy_spec.rb +288 -0
  130. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +302 -0
  131. data/spec/functional/associations/one_as_proxy_spec.rb +489 -0
  132. data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +207 -0
  133. data/spec/functional/associations/one_embedded_proxy_spec.rb +100 -0
  134. data/spec/functional/associations/one_proxy_spec.rb +406 -0
  135. data/spec/functional/associations_spec.rb +48 -0
  136. data/spec/functional/caching_spec.rb +75 -0
  137. data/spec/functional/callbacks_spec.rb +330 -0
  138. data/spec/functional/counter_cache_spec.rb +235 -0
  139. data/spec/functional/dirty_spec.rb +316 -0
  140. data/spec/functional/document_spec.rb +310 -0
  141. data/spec/functional/dumpable_spec.rb +24 -0
  142. data/spec/functional/dynamic_querying_spec.rb +75 -0
  143. data/spec/functional/embedded_document_spec.rb +316 -0
  144. data/spec/functional/equality_spec.rb +20 -0
  145. data/spec/functional/extensions_spec.rb +16 -0
  146. data/spec/functional/identity_map_spec.rb +483 -0
  147. data/spec/functional/keys_spec.rb +339 -0
  148. data/spec/functional/logger_spec.rb +20 -0
  149. data/spec/functional/modifiers_spec.rb +446 -0
  150. data/spec/functional/options_hash_spec.rb +41 -0
  151. data/spec/functional/pagination_spec.rb +89 -0
  152. data/spec/functional/partial_updates_spec.rb +530 -0
  153. data/spec/functional/protected_spec.rb +199 -0
  154. data/spec/functional/querying_spec.rb +984 -0
  155. data/spec/functional/rails_spec.rb +55 -0
  156. data/spec/functional/sci_spec.rb +374 -0
  157. data/spec/functional/scopes_spec.rb +204 -0
  158. data/spec/functional/static_keys_spec.rb +153 -0
  159. data/spec/functional/timestamps_spec.rb +97 -0
  160. data/spec/functional/touch_spec.rb +125 -0
  161. data/spec/functional/userstamps_spec.rb +46 -0
  162. data/spec/functional/validations_spec.rb +416 -0
  163. data/spec/quality_spec.rb +51 -0
  164. data/spec/spec_helper.rb +150 -0
  165. data/spec/support/matchers.rb +15 -0
  166. data/spec/support/models.rb +256 -0
  167. data/spec/symbol_operator_spec.rb +70 -0
  168. data/spec/symbol_spec.rb +9 -0
  169. data/spec/unit/associations/base_spec.rb +146 -0
  170. data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
  171. data/spec/unit/associations/many_association_spec.rb +64 -0
  172. data/spec/unit/associations/one_association_spec.rb +48 -0
  173. data/spec/unit/associations/proxy_spec.rb +103 -0
  174. data/spec/unit/clone_spec.rb +79 -0
  175. data/spec/unit/config_generator_spec.rb +24 -0
  176. data/spec/unit/criteria_hash_spec.rb +218 -0
  177. data/spec/unit/document_spec.rb +251 -0
  178. data/spec/unit/dynamic_finder_spec.rb +125 -0
  179. data/spec/unit/embedded_document_spec.rb +676 -0
  180. data/spec/unit/equality_spec.rb +38 -0
  181. data/spec/unit/exceptions_spec.rb +12 -0
  182. data/spec/unit/extensions_spec.rb +368 -0
  183. data/spec/unit/identity_map_middleware_spec.rb +134 -0
  184. data/spec/unit/inspect_spec.rb +47 -0
  185. data/spec/unit/key_spec.rb +276 -0
  186. data/spec/unit/keys_spec.rb +155 -0
  187. data/spec/unit/mark_mapper_spec.rb +37 -0
  188. data/spec/unit/model_generator_spec.rb +45 -0
  189. data/spec/unit/normalizers/criteria_hash_key_spec.rb +37 -0
  190. data/spec/unit/normalizers/criteria_hash_value_spec.rb +200 -0
  191. data/spec/unit/normalizers/fields_value_spec.rb +45 -0
  192. data/spec/unit/normalizers/hash_key_spec.rb +15 -0
  193. data/spec/unit/normalizers/integer_spec.rb +24 -0
  194. data/spec/unit/normalizers/options_hash_value_spec.rb +99 -0
  195. data/spec/unit/normalizers/sort_value_spec.rb +98 -0
  196. data/spec/unit/options_hash_spec.rb +64 -0
  197. data/spec/unit/pagination/collection_spec.rb +30 -0
  198. data/spec/unit/pagination/paginator_spec.rb +118 -0
  199. data/spec/unit/pagination_spec.rb +11 -0
  200. data/spec/unit/plugins_spec.rb +89 -0
  201. data/spec/unit/query_spec.rb +837 -0
  202. data/spec/unit/rails_compatibility_spec.rb +40 -0
  203. data/spec/unit/rails_reflect_on_association_spec.rb +118 -0
  204. data/spec/unit/rails_spec.rb +188 -0
  205. data/spec/unit/serialization_spec.rb +169 -0
  206. data/spec/unit/serializers/json_serializer_spec.rb +218 -0
  207. data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
  208. data/spec/unit/time_zones_spec.rb +44 -0
  209. data/spec/unit/translation_spec.rb +27 -0
  210. data/spec/unit/validations_spec.rb +588 -0
  211. metadata +307 -0
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+ module MarkMapper
3
+ module Extensions
4
+ module ObjectId
5
+ def to_marklogic(value)
6
+ MarkMapper.to_object_id(value)
7
+ end
8
+
9
+ def from_marklogic(value)
10
+ value
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ class ObjectId
17
+ extend MarkMapper::Extensions::ObjectId
18
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: UTF-8
2
+ require 'set'
3
+
4
+ module MarkMapper
5
+ module Extensions
6
+ module Set
7
+ def to_marklogic(value)
8
+ value.to_a
9
+ end
10
+
11
+ def from_marklogic(value)
12
+ (value || []).to_set
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ class Set
19
+ extend MarkMapper::Extensions::Set
20
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ module MarkMapper
3
+ module Extensions
4
+ module String
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def to_marklogic(value)
9
+ value && value.to_s
10
+ end
11
+
12
+ def from_marklogic(value)
13
+ value && value.to_s
14
+ end
15
+
16
+ def xs_type
17
+ "string"
18
+ end
19
+
20
+ end
21
+
22
+ def _mark_mapper_deep_copy_
23
+ self.dup
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ class String
30
+ include MarkMapper::Extensions::String
31
+ end
@@ -0,0 +1,87 @@
1
+ # encoding: UTF-8
2
+ module MarkMapper
3
+ module Extensions
4
+ module SymbolClassMethods
5
+ def to_marklogic(value)
6
+ value && value.to_s.to_sym
7
+ end
8
+
9
+ def from_marklogic(value)
10
+ value && value.to_s.to_sym
11
+ end
12
+ end
13
+
14
+ module SymbolnstanceMethods
15
+ def gt
16
+ SymbolOperator.new(self, 'gt')
17
+ end
18
+
19
+ def lt
20
+ SymbolOperator.new(self, 'lt')
21
+ end
22
+
23
+ def ge
24
+ SymbolOperator.new(self, 'ge')
25
+ end
26
+
27
+ def le
28
+ SymbolOperator.new(self, 'le')
29
+ end
30
+
31
+ def eq
32
+ SymbolOperator.new(self, 'eq')
33
+ end
34
+
35
+ def ne
36
+ SymbolOperator.new(self, 'ne')
37
+ end
38
+
39
+ def asc
40
+ SymbolOperator.new(self, 'asc')
41
+ end
42
+
43
+ def desc
44
+ SymbolOperator.new(self, 'desc')
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ class SymbolOperator
51
+ include Comparable
52
+
53
+ attr_reader :field, :operator
54
+
55
+ def initialize(field, operator)
56
+ @field, @operator = field, operator
57
+ end unless method_defined?(:initialize)
58
+
59
+ def <=>(other)
60
+ if field == other.field
61
+ operator <=> other.operator
62
+ else
63
+ field.to_s <=> other.field.to_s
64
+ end
65
+ end
66
+
67
+ def hash
68
+ field.hash + operator.hash
69
+ end
70
+
71
+ def eql?(other)
72
+ self == other
73
+ end
74
+
75
+ def ==(other)
76
+ other.class == self.class && field == other.field && operator == other.operator
77
+ end
78
+
79
+ # def to_sym
80
+ # field
81
+ # end
82
+ end
83
+
84
+ class Symbol
85
+ extend MarkMapper::Extensions::SymbolClassMethods
86
+ include MarkMapper::Extensions::SymbolnstanceMethods
87
+ end
@@ -0,0 +1,29 @@
1
+ require 'active_support/core_ext/time/zones'
2
+
3
+ # encoding: UTF-8
4
+ module MarkMapper
5
+ module Extensions
6
+ module Time
7
+ def to_marklogic(value)
8
+ if !value || '' == value
9
+ nil
10
+ else
11
+ time_class = ::Time.zone || ::Time
12
+ time = value.is_a?(::Time) ? value : time_class.parse(value.to_s, time_class.now)
13
+ end
14
+ end
15
+
16
+ def from_marklogic(value)
17
+ to_marklogic(value)
18
+ end
19
+
20
+ def xs_type
21
+ "dateTime"
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ class Time
28
+ extend MarkMapper::Extensions::Time
29
+ end
@@ -0,0 +1,5 @@
1
+ en:
2
+ mark_mapper:
3
+ errors:
4
+ messages:
5
+ taken: "has already been taken"
@@ -0,0 +1,41 @@
1
+ module MarkMapper
2
+ module Middleware
3
+ # Usage:
4
+ #
5
+ # config.middleware.insert_after \
6
+ # ActionDispatch::Callbacks,
7
+ # MarkMapper::Middleware::IdentityMap
8
+ #
9
+ # You have to insert after callbacks so the entire request is wrapped.
10
+ class IdentityMap
11
+ class Body
12
+ extend Forwardable
13
+ def_delegator :@target, :each
14
+
15
+ def initialize(target, original)
16
+ @target = target
17
+ @original = original
18
+ end
19
+
20
+ def close
21
+ @target.close if @target.respond_to?(:close)
22
+ ensure
23
+ MarkMapper::Plugins::IdentityMap.enabled = @original
24
+ MarkMapper::Plugins::IdentityMap.clear
25
+ end
26
+ end
27
+
28
+ def initialize(app)
29
+ @app = app
30
+ end
31
+
32
+ def call(env)
33
+ MarkMapper::Plugins::IdentityMap.clear
34
+ enabled = MarkMapper::Plugins::IdentityMap.enabled
35
+ MarkMapper::Plugins::IdentityMap.enabled = true
36
+ status, headers, body = @app.call(env)
37
+ [status, headers, Body.new(body, enabled)]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ module MarkMapper
2
+ module Normalizers
3
+ class CriteriaHashKey
4
+ # Public: Returns key normalized for MarkLogic
5
+ #
6
+ # key - The key to normalize
7
+ #
8
+ # Returns key as Symbol if possible, else key with no changes
9
+ def call(key)
10
+ key = key.to_sym if key.respond_to?(:to_sym)
11
+ return call(key.field) if key.respond_to?(:field)
12
+ return :_id if key == :id
13
+ key
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,66 @@
1
+ module MarkMapper
2
+ module Normalizers
3
+ class CriteriaHashValue
4
+
5
+ # Internal: Used by normalized_value to determine if we need to run the
6
+ # value through another criteria hash to normalize it.
7
+ NestingOperators = [:$or, :$and, :$nor]
8
+
9
+ def initialize(criteria_hash)
10
+ @criteria_hash = criteria_hash
11
+ end
12
+
13
+ # Public: Returns value normalized for MarkLogic
14
+ #
15
+ # parent_key - The parent key if nested, otherwise same as key
16
+ # key - The key we are currently normalizing
17
+ # value - The value that should be normalized
18
+ #
19
+ # Returns value normalized for MarkLogic
20
+ def call(parent_key, key, value)
21
+ case value
22
+ when Array, Set
23
+ if nesting_operator?(key)
24
+ value.map { |v| criteria_hash_class.new(v, options).to_hash }
25
+ elsif parent_key == key && !modifier?(key) && !value.empty?
26
+ # we're not nested and not the value for a symbol operator
27
+ {:$eq => value.to_a}
28
+ else
29
+ # we are a value for a symbol operator or nested hash
30
+ value.to_a
31
+ end
32
+ when Time
33
+ value.utc
34
+ when String
35
+ value
36
+ when Hash
37
+ value.each { |k, v| value[k] = call(key, k, v) }
38
+ value
39
+ when Regexp
40
+ Regexp.new(value)
41
+ else
42
+ value
43
+ end
44
+ end
45
+
46
+ # Private: Returns class of provided criteria hash
47
+ def criteria_hash_class
48
+ @criteria_hash.class
49
+ end
50
+
51
+ # Private: Returns options of provided criteria hash
52
+ def options
53
+ @criteria_hash.options
54
+ end
55
+
56
+ # Private: Returns true or false if key is a nesting operator
57
+ def nesting_operator?(key)
58
+ NestingOperators.include?(key)
59
+ end
60
+
61
+ def modifier?(key)
62
+ MarkMapper.modifier?(key)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,26 @@
1
+ module MarkMapper
2
+ module Normalizers
3
+ class FieldsValue
4
+
5
+ # Public: Given a value returns it normalized for MarkLogic's fields option
6
+ def call(value)
7
+ return nil if value.respond_to?(:empty?) && value.empty?
8
+
9
+ case value
10
+ when Array
11
+ if value.size == 1 && value.first.is_a?(Hash)
12
+ value.first
13
+ else
14
+ value.flatten
15
+ end
16
+ when Symbol
17
+ [value]
18
+ when String
19
+ value.split(',').map { |v| v.strip }
20
+ else
21
+ value
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ module MarkMapper
2
+ module Normalizers
3
+ class HashKey
4
+
5
+ def initialize(keys)
6
+ @keys = keys
7
+ end
8
+
9
+ # Public: Normalizes an options hash key
10
+ #
11
+ # key - The key to normalize
12
+ #
13
+ # Returns a Symbol.
14
+ def call(key)
15
+ @keys.fetch key.to_sym, key
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module MarkMapper
2
+ module Normalizers
3
+ class Integer
4
+
5
+ # Public: Returns value coerced to integer or nil
6
+ #
7
+ # value - The value to normalize to an integer
8
+ #
9
+ # Returns an Integer or nil
10
+ def call(value)
11
+ if value.nil?
12
+ nil
13
+ else
14
+ value.to_i
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,83 @@
1
+ require 'mark_mapper/normalizers/integer'
2
+ require 'mark_mapper/normalizers/fields_value'
3
+ require 'mark_mapper/normalizers/sort_value'
4
+
5
+ module MarkMapper
6
+ module Normalizers
7
+ class OptionsHashValue
8
+
9
+ # Public: Initialize an OptionsHashValue.
10
+ #
11
+ # args - The hash of arguments (default: {})
12
+ # :key_normalizer - The key normalizer to use, must respond to call
13
+ # :value_normalizers - Hash where key is name of options hash key
14
+ # to normalize and value is what should be used
15
+ # to normalize the value accordingly (must respond
16
+ # to call). Allows adding normalizers for new keys
17
+ # and overriding existing default normalizers.
18
+ #
19
+ #
20
+ # Examples
21
+ #
22
+ # MarkMapper::Normalizers::OptionsHashValue.new({
23
+ # :key_normalizer => lambda { |key| key}, # key normalizer must responds to call
24
+ # :value_normalizers => {
25
+ # :new_key => lambda { |key| key.to_s.upcase }, # add normalizer for :new_key
26
+ # :fields => lambda { |key| key }, # override normalizer for fields to one that does nothing
27
+ # }
28
+ # })
29
+ #
30
+ # Returns the duplicated String.
31
+ def initialize(args = {})
32
+ @key_normalizer = args.fetch(:key_normalizer) {
33
+ raise ArgumentError, "Missing required key :key_normalizer"
34
+ }
35
+
36
+ @value_normalizers = {
37
+ :fields => default_fields_value_normalizer,
38
+ :sort => default_sort_value_normalizer,
39
+ :limit => default_limit_value_normalizer,
40
+ :skip => default_skip_value_normalizer,
41
+ }
42
+
43
+ if (value_normalizers = args[:value_normalizers])
44
+ @value_normalizers.update(value_normalizers)
45
+ end
46
+ end
47
+
48
+ # Public: Returns value normalized for MarkLogic
49
+ #
50
+ # key - The name of the key whose value is being normalized
51
+ # value - The value to normalize
52
+ #
53
+ # Returns value normalized for MarkLogic.
54
+ def call(key, value)
55
+ if (value_normalizer = @value_normalizers[key])
56
+ value_normalizer.call(value)
57
+ else
58
+ value
59
+ end
60
+ end
61
+
62
+ # Private
63
+ def default_fields_value_normalizer
64
+ Normalizers::FieldsValue.new
65
+ end
66
+
67
+ # Private
68
+ def default_sort_value_normalizer
69
+ Normalizers::SortValue.new(:key_normalizer => Normalizers::HashKey.new({:id => :_id}))
70
+ end
71
+
72
+ # Private
73
+ def default_limit_value_normalizer
74
+ Normalizers::Integer.new
75
+ end
76
+
77
+ # Private
78
+ def default_skip_value_normalizer
79
+ Normalizers::Integer.new
80
+ end
81
+ end
82
+ end
83
+ end