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,52 @@
1
+ require "mark_mapper"
2
+ require "rails"
3
+ require "active_model/railtie"
4
+
5
+ # Need the action_dispatch railtie to have action_dispatch.rescu_responses initialized correctly
6
+ require "action_dispatch/railtie"
7
+
8
+ module MarkMapper
9
+ # = MarkMapper Railtie
10
+ class Railtie < Rails::Railtie
11
+
12
+ config.mark_mapper = ActiveSupport::OrderedOptions.new
13
+
14
+ # Rescue responses similar to ActiveRecord.
15
+ # For rails 3.0 and 3.1
16
+ if Rails.version < "3.2"
17
+ ActionDispatch::ShowExceptions.rescue_responses['MarkMapper::DocumentNotFound'] = :not_found
18
+ ActionDispatch::ShowExceptions.rescue_responses['MarkMapper::InvalidKey'] = :unprocessable_entity
19
+ ActionDispatch::ShowExceptions.rescue_responses['MarkMapper::InvalidScheme'] = :unprocessable_entity
20
+ ActionDispatch::ShowExceptions.rescue_responses['MarkMapper::NotSupported'] = :unprocessable_entity
21
+ else
22
+ # For rails 3.2 and 4.0
23
+ config.action_dispatch.rescue_responses.merge!(
24
+ 'MarkMapper::DocumentNotFound' => :not_found,
25
+ 'MarkMapper::InvalidKey' => :unprocessable_entity,
26
+ 'MarkMapper::InvalidScheme' => :unprocessable_entity,
27
+ 'MarkMapper::NotSupported' => :unprocessable_entity
28
+ )
29
+ end
30
+
31
+ rake_tasks do
32
+ load "mark_mapper/railtie/database.rake"
33
+ end
34
+
35
+ initializer "mark_mapper.set_configs" do |app|
36
+ ActiveSupport.on_load(:mark_mapper) do
37
+ app.config.mark_mapper.each do |k,v|
38
+ send "#{k}=", v
39
+ end
40
+ end
41
+ end
42
+
43
+ # This sets the database configuration and establishes the connection.
44
+ initializer "mark_mapper.initialize_database" do |app|
45
+ config_file = Rails.root.join('config/marklogic.yml')
46
+ if config_file.file?
47
+ config = YAML.load(ERB.new(config_file.read).result)
48
+ MarkMapper.setup(config, Rails.env, :logger => Rails.logger)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,65 @@
1
+ namespace :db do
2
+ unless Rake::Task.task_defined?("db:drop")
3
+ desc 'Drops all the collections for the database for the current Rails.env'
4
+ task :drop => :environment do
5
+ MarkMapper.database.collections.select {|c| c.name !~ /\Asystem\./ }.each(&:drop)
6
+ end
7
+ end
8
+
9
+ unless Rake::Task.task_defined?("db:seed")
10
+ # if another ORM has defined db:seed, don't run it twice.
11
+ desc 'Load the seed data from db/seeds.rb'
12
+ task :seed => :environment do
13
+ seed_file = File.join(Rails.root, 'db', 'seeds.rb')
14
+ load(seed_file) if File.exist?(seed_file)
15
+ end
16
+ end
17
+
18
+ unless Rake::Task.task_defined?("db:setup")
19
+ desc 'Create the database, and initialize with the seed data'
20
+ task :setup => [ 'db:create', 'db:seed' ]
21
+ end
22
+
23
+ unless Rake::Task.task_defined?("db:reseed")
24
+ desc 'Delete data and seed'
25
+ task :reseed => [ 'db:drop', 'db:seed' ]
26
+ end
27
+
28
+ unless Rake::Task.task_defined?("db:create")
29
+ task :create => :environment do
30
+ # noop
31
+ end
32
+ end
33
+
34
+ unless Rake::Task.task_defined?("db:migrate")
35
+ task :migrate => :environment do
36
+ # noop
37
+ end
38
+ end
39
+
40
+ unless Rake::Task.task_defined?("db:schema:load")
41
+ namespace :schema do
42
+ task :load do
43
+ # noop
44
+ end
45
+ end
46
+ end
47
+
48
+ unless Rake::Task.task_defined?("db:test:prepare")
49
+ namespace :test do
50
+ task :prepare => :environment do
51
+ MarkMapper.connect('test')
52
+ MarkMapper.database.collections.select {|c| c.name !~ /system/ }.each(&:drop)
53
+ MarkMapper.connect(Rails.env)
54
+ end
55
+ end
56
+ end
57
+
58
+ desc 'Load indexes from db/indexes.rb'
59
+ task :index => :environment do
60
+ indexes = File.join(Rails.root, 'db', 'indexes.rb')
61
+ load(indexes) if File.exist?(indexes)
62
+ end
63
+ end
64
+
65
+ task 'test:prepare' => 'db:test:prepare'
@@ -0,0 +1,10 @@
1
+ # encoding: UTF-8
2
+ module MarkMapper
3
+ module Translation
4
+ include ActiveModel::Translation
5
+
6
+ def i18n_scope
7
+ :mark_mapper
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ # encoding: UTF-8
2
+ module MarkMapper
3
+ Version = '0.0.1'
4
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ module MarkMapper
4
+ module Generators
5
+ class ConfigGenerator < Rails::Generators::Base
6
+ desc 'creates the MarkMapper configuration at config/marklogic.yml'
7
+
8
+ argument :database_name, :type => :string, :optional => true
9
+
10
+ def self.source_root
11
+ @source_root ||= File.expand_path('../templates', __FILE__)
12
+ end
13
+
14
+ def create_config_file
15
+ template 'marklogic.yml', File.join('config', 'marklogic.yml')
16
+ end
17
+
18
+ protected
19
+
20
+ def app_name
21
+ @app_name ||= defined_app_const_base? ? defined_app_name : File.basename(destination_root)
22
+ end
23
+
24
+ def defined_app_name
25
+ defined_app_const_base.underscore
26
+ end
27
+
28
+ def defined_app_const_base
29
+ Rails.respond_to?(:application) && defined?(Rails::Application) &&
30
+ Rails.application.is_a?(Rails::Application) && Rails.application.class.name.sub(/::Application$/, '')
31
+ end
32
+
33
+ alias :defined_app_const_base? :defined_app_const_base
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ defaults: &defaults
2
+ host: 127.0.0.1
3
+ port: 27017
4
+
5
+ development:
6
+ <<: *defaults
7
+ database: <%= database_name || app_name %>_development
8
+
9
+ test:
10
+ <<: *defaults
11
+ database: <%= database_name || app_name %>_test
12
+ w: 0
13
+
14
+ # set these environment variables on your prod server
15
+ production:
16
+ <<: *defaults
17
+ database: <%= database_name || app_name %>
18
+ username: <%%= ENV['MARKLOGIC_USERNAME'] %>
19
+ password: <%%= ENV['MARKLOGIC_PASSWORD'] %>
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module MarkMapper
4
+ module Generators
5
+ class ModelGenerator < Rails::Generators::NamedBase
6
+ desc 'Creates a markmapper model'
7
+
8
+ argument :name, :type => :string
9
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
10
+
11
+ check_class_collision
12
+
13
+ class_option :timestamps, :type => :boolean
14
+ class_option :parent, :type => :string, :desc => "The parent class for the generated model"
15
+
16
+ def self.source_root
17
+ @source_root ||= File.expand_path("../templates", __FILE__)
18
+ end
19
+
20
+ def create_model_file
21
+ template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
22
+ end
23
+
24
+ hook_for :test_framework
25
+
26
+ protected
27
+
28
+ def parent_class_name
29
+ options[:parent]
30
+ end
31
+
32
+ # Rails 3.0.X compatibility
33
+ unless methods.include?(:module_namespacing)
34
+ def module_namespacing(&block)
35
+ yield if block
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,17 @@
1
+ <%- module_namespacing do -%>
2
+ <%- if parent_class_name.present? -%>
3
+ class <%= class_name %> < <%= parent_class_name.classify %>
4
+ <%- else -%>
5
+ class <%= class_name %>
6
+ include MarkMapper::Document
7
+ <%- end -%>
8
+
9
+ <%- attributes.each do |attribute| -%>
10
+ key :<%= attribute.name %>, <%= attribute.type.to_s.camelcase %>
11
+ <% end -%>
12
+ <%- if options[:timestamps] -%>
13
+ timestamps!
14
+ <%- end -%>
15
+
16
+ end
17
+ <%- end -%>
@@ -0,0 +1,6 @@
1
+ test:
2
+ app_name: markmapper-application-test
3
+ host: <%=ENV["MARKMAPPER_SPEC_HOST"]%>
4
+ port: <%=ENV["MARKMAPPER_SPEC_PORT"]%>
5
+ username: <%=ENV["MARKMAPPER_SPEC_USER"]%>
6
+ password: <%=ENV["MARKMAPPER_SPEC_PASSWORD"]%>
@@ -0,0 +1,25 @@
1
+ describe "The Examples" do
2
+
3
+ before do
4
+ @previous = MarkMapper::Plugins::IdentityMap.enabled
5
+ end
6
+
7
+ after do
8
+ MarkMapper::Plugins::IdentityMap.enabled = @previous
9
+ end
10
+
11
+ file = File.dirname(__FILE__) + "/../examples/**/*.rb"
12
+ puts file
13
+ Dir[file].each do |f|
14
+ it "should run #{f}" do
15
+
16
+ expect {
17
+
18
+ Object.send(:remove_const, :User) if Object.constants.include?(:User)
19
+
20
+ require f
21
+ }.to_not raise_error
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,198 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Accessible" do
4
+ context 'A document with accessible attributes' do
5
+ before do
6
+ @doc_class = Doc do
7
+ key :name, String
8
+ key :admin, Boolean, :default => false
9
+
10
+ attr_accessible :name
11
+ end
12
+
13
+ @doc = @doc_class.create(:name => 'Steve Sloan')
14
+ end
15
+
16
+ it 'should have accessible attributes class method' do
17
+ @doc_class.accessible_attributes.should == [:name].to_set
18
+ end
19
+
20
+ it "should default accessible attributes to nil" do
21
+ Doc().accessible_attributes.should be_nil
22
+ end
23
+
24
+ it "should have accessible_attributes instance method" do
25
+ @doc.accessible_attributes.should equal(@doc_class.accessible_attributes)
26
+ end
27
+
28
+ it "should raise error if there are protected attributes" do
29
+ doc = Doc('Post')
30
+ doc.attr_protected :admin
31
+ lambda { doc.attr_accessible :name }.
32
+ should raise_error(/Declare either attr_protected or attr_accessible for Post/)
33
+ end
34
+
35
+ it "should know if using accessible attributes" do
36
+ @doc_class.accessible_attributes?.should be(true)
37
+ Doc().accessible_attributes?.should be(false)
38
+ end
39
+
40
+ it "should assign inaccessible attribute through accessor" do
41
+ @doc.admin = true
42
+ @doc.admin.should be_truthy
43
+ end
44
+
45
+ it "should ignore inaccessible attribute on #initialize" do
46
+ doc = @doc_class.new(:name => 'John', :admin => true)
47
+ doc.admin.should be_falsey
48
+ doc.name.should == 'John'
49
+ end
50
+
51
+ it "should not ignore inaccessible attributes on #initialize from the database" do
52
+ doc = @doc_class.new(:name => 'John')
53
+ doc.admin = true
54
+ doc.save!
55
+
56
+ doc = @doc_class.first(:name => 'John')
57
+ doc.admin.should be_truthy
58
+ doc.name.should == 'John'
59
+ end
60
+
61
+ it "should not ignore inaccessible attributes on #reload" do
62
+ doc = @doc_class.new(:name => 'John')
63
+ doc.admin = true
64
+ doc.save!
65
+
66
+ doc.reload
67
+ doc.admin.should be_truthy
68
+ doc.name.should == 'John'
69
+ end
70
+
71
+ it "should not ignore inaccessible attribute on #update_attribute" do
72
+ @doc.update_attribute('admin', true)
73
+ @doc.admin.should be_truthy
74
+ end
75
+
76
+ it "should ignore inaccessible attribute on #update_attributes" do
77
+ @doc.update_attributes(:name => 'Ren Hoek', :admin => true)
78
+ @doc.name.should == 'Ren Hoek'
79
+ @doc.admin.should be_falsey
80
+ end
81
+
82
+ it "should ignore inaccessible attribute on #update_attributes!" do
83
+ @doc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
84
+ @doc.name.should == 'Stimpson J. Cat'
85
+ @doc.admin.should be_falsey
86
+ end
87
+
88
+ it "should ignore inaccessible attribute on #attributes=" do
89
+ @doc.attributes = {:name => 'Ren Hoek', :admin => true}
90
+ @doc.name.should == 'Ren Hoek'
91
+ @doc.admin.should be_falsey
92
+ end
93
+
94
+ it "should be indifferent to whether the accessible keys are strings or symbols" do
95
+ @doc.update_attributes!("name" => 'Stimpson J. Cat', "admin" => true)
96
+ @doc.name.should == 'Stimpson J. Cat'
97
+ @doc.admin.should be_falsey
98
+ end
99
+
100
+ it "should accept nil as constructor's argument without raising exception" do
101
+ lambda { @doc_class.new(nil) }.should_not raise_error
102
+ end
103
+
104
+ it "should ignore all attributes if called with no args" do
105
+ @doc_class = Doc do
106
+ key :name
107
+ attr_accessible
108
+ end
109
+
110
+ @doc_class.new(:name => 'Steve Sloan').name.should be_nil
111
+ end
112
+ end
113
+
114
+ context "Single collection inherited accessible attributes" do
115
+ before do
116
+ class ::GrandParent
117
+ include MarkMapper::Document
118
+ attr_accessible :name
119
+ key :name, String
120
+ key :site_id, ObjectId
121
+ end
122
+ GrandParent.collection.remove
123
+
124
+ class ::Child < ::GrandParent
125
+ attr_accessible :position
126
+ key :position, Integer
127
+ end
128
+
129
+ class ::GrandChild < ::Child; end
130
+
131
+ class ::OtherChild < ::GrandParent
132
+ attr_accessible :favorite_color
133
+ key :favorite_color, String
134
+ key :blog_id, ObjectId
135
+ end
136
+ end
137
+
138
+ after do
139
+ Object.send :remove_const, 'GrandParent' if defined?(::GrandParent)
140
+ Object.send :remove_const, 'Child' if defined?(::Child)
141
+ Object.send :remove_const, 'GrandChild' if defined?(::GrandChild)
142
+ Object.send :remove_const, 'OtherChild' if defined?(::OtherChild)
143
+ end
144
+
145
+ it "should share keys down the inheritance trail" do
146
+ GrandParent.accessible_attributes.should == [:name].to_set
147
+ Child.accessible_attributes.should == [:name, :position].to_set
148
+ GrandChild.accessible_attributes.should == [:name, :position].to_set
149
+ OtherChild.accessible_attributes.should == [:name, :favorite_color].to_set
150
+ end
151
+ end
152
+
153
+ context "An embedded document with accessible attributes" do
154
+ before do
155
+ @doc_class = Doc('Project')
156
+ @edoc_class = EDoc('Person') do
157
+ key :name, String
158
+ key :admin, Boolean, :default => false
159
+
160
+ attr_accessible :name
161
+ end
162
+ @doc_class.many :people, :class => @edoc_class
163
+
164
+ @doc = @doc_class.create(:title => 'MarkMapper')
165
+ @edoc = @edoc_class.new(:name => 'Steve Sloan')
166
+ @doc.people << @edoc
167
+ end
168
+
169
+ it "should have accessible attributes class method" do
170
+ @edoc_class.accessible_attributes.should == [:name].to_set
171
+ end
172
+
173
+ it "should default accessible attributes to nil" do
174
+ EDoc().accessible_attributes.should be_nil
175
+ end
176
+
177
+ it "should have accessible attributes instance method" do
178
+ @edoc.accessible_attributes.should equal(@edoc_class.accessible_attributes)
179
+ end
180
+
181
+ it "should assign inaccessible attribute through accessor" do
182
+ @edoc.admin = true
183
+ @edoc.admin.should be_truthy
184
+ end
185
+
186
+ it "should ignore inaccessible attribute on #update_attributes" do
187
+ @edoc.update_attributes(:name => 'Ren Hoek', :admin => true)
188
+ @edoc.name.should == 'Ren Hoek'
189
+ @edoc.admin.should be_falsey
190
+ end
191
+
192
+ it "should ignore inaccessible attribute on #update_attributes!" do
193
+ @edoc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
194
+ @edoc.name.should == 'Stimpson J. Cat'
195
+ @edoc.admin.should be_falsey
196
+ end
197
+ end
198
+ end