mark_mapper 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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