Class: Mongoid::FixtureKit::Util
- Inherits:
-
Object
- Object
- Mongoid::FixtureKit::Util
- Defined in:
- lib/mongoid/fixture_kit/util.rb
Instance Method Summary collapse
- #cache_fixtures(fixtures_map) ⇒ Object
- #cached_fixtures(keys_to_fetch = nil) ⇒ Object
- #collection_documents(fixture_kit) ⇒ Object
- #create_fixtures(fixtures_directory, fixture_kit_names, class_names = {}) ⇒ Object
- #create_or_update_document(model, attributes) ⇒ Object
- #embedded_document_set_default_values(document, attributes) ⇒ Object
- #find_or_create_document(model, fixture_name) ⇒ Object
- #fixture_is_cached?(name) ⇒ Boolean
-
#initialize ⇒ Util
constructor
A new instance of Util.
- #macro_from_relation(relation) ⇒ Object
- #reset_cache ⇒ Object
- #sanitize_new_embedded_documents(document, is_new: false) ⇒ Object
- #update_all_loaded_fixtures(fixtures_map) ⇒ Object
- #update_document(document, attributes) ⇒ Object
Constructor Details
#initialize ⇒ Util
Returns a new instance of Util.
4 5 6 7 |
# File 'lib/mongoid/fixture_kit/util.rb', line 4 def initialize @cached_fixtures = {} @all_loaded_fixtures = {} end |
Instance Method Details
#cache_fixtures(fixtures_map) ⇒ Object
25 26 27 |
# File 'lib/mongoid/fixture_kit/util.rb', line 25 def cache_fixtures(fixtures_map) @cached_fixtures.update(fixtures_map) end |
#cached_fixtures(keys_to_fetch = nil) ⇒ Object
9 10 11 12 13 14 15 |
# File 'lib/mongoid/fixture_kit/util.rb', line 9 def cached_fixtures(keys_to_fetch = nil) if keys_to_fetch @cached_fixtures.values_at(*keys_to_fetch) else @cached_fixtures.values end end |
#collection_documents(fixture_kit) ⇒ Object
169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/mongoid/fixture_kit/util.rb', line 169 def collection_documents(fixture_kit) # allow a standard key to be used for doing defaults in YAML fixture_kit.fixtures.delete('DEFAULTS') # track any join collection we need to insert later documents = {} documents[fixture_kit.class_name] = fixture_kit.fixtures.map do |label, fixture| unmarshall_fixture(label, fixture, fixture_kit.model_class) end documents end |
#create_fixtures(fixtures_directory, fixture_kit_names, class_names = {}) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/mongoid/fixture_kit/util.rb', line 33 def create_fixtures(fixtures_directory, fixture_kit_names, class_names = {}) fixture_kit_names = Array(fixture_kit_names).map(&:to_s) class_names = Mongoid::FixtureKit::ClassCache.new(class_names) files_to_read = fixture_kit_names.reject do |fs_name| fixture_is_cached?(fs_name) end return cached_fixtures(fixture_kit_names) if files_to_read.empty? fixtures_map = {} fixture_kits = files_to_read.map do |fs_name| fixtures_map[fs_name] = Mongoid::FixtureKit.new(fs_name, class_names[fs_name], ::File.join(fixtures_directory, fs_name)) end update_all_loaded_fixtures(fixtures_map) fixture_kits.each do |fixture_kit| collection_documents(fixture_kit).each do |model, documents| model = class_names[model] next unless model documents.each do |attributes| create_or_update_document(model, attributes) end end end cache_fixtures(fixtures_map) cached_fixtures(fixture_kit_names) end |
#create_or_update_document(model, attributes) ⇒ Object
68 69 70 71 72 73 |
# File 'lib/mongoid/fixture_kit/util.rb', line 68 def create_or_update_document(model, attributes) model = model.constantize if model.is_a?(String) document = find_or_create_document(model, attributes['__fixture_name']) update_document(document, attributes) end |
#embedded_document_set_default_values(document, attributes) ⇒ Object
133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/mongoid/fixture_kit/util.rb', line 133 def (document, attributes) (document, is_new: true) attributes.delete('_id') removable_fields = document.fields.select do |k, v| k != '_id' && v.default_val.present? && attributes[k] == document[k] end removable_fields.each do |k, _v| attributes.delete(k) end end |
#find_or_create_document(model, fixture_name) ⇒ Object
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/mongoid/fixture_kit/util.rb', line 145 def find_or_create_document(model, fixture_name) model = model.constantize if model.is_a?(String) document = model.where(__fixture_name: fixture_name).first if document.nil? document = model.new document['__fixture_name'] = fixture_name begin save_document(document) rescue StandardError => e Rails.logger.debug(document.attributes) Rails.logger.debug(e) Rails.logger.debug { "Backtrace:\n\t#{e.backtrace.join("\n\t")}" } end end document end |
#fixture_is_cached?(name) ⇒ Boolean
21 22 23 |
# File 'lib/mongoid/fixture_kit/util.rb', line 21 def fixture_is_cached?(name) @cached_fixtures[name] end |
#macro_from_relation(relation) ⇒ Object
163 164 165 166 167 |
# File 'lib/mongoid/fixture_kit/util.rb', line 163 def macro_from_relation(relation) return relation.macro if defined?(Mongoid::Relations) && relation.instance_of?(Mongoid::Relations::Metadata) relation.class.name.split('::').last.underscore.to_sym end |
#reset_cache ⇒ Object
17 18 19 |
# File 'lib/mongoid/fixture_kit/util.rb', line 17 def reset_cache @cached_fixtures.clear end |
#sanitize_new_embedded_documents(document, is_new: false) ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/mongoid/fixture_kit/util.rb', line 95 def (document, is_new: false) document.relations.each do |name, relation| case macro_from_relation(relation) when :embeds_one if (document.changes[name] && !document.changes[name][1].nil?) || (is_new && document[name]) = document.public_send(relation.name) (, document[name]) end when :embeds_many if (document.changes[name] && !document.changes[name][1].nil?) || (is_new && document[name]) = document.public_send(relation.name) .each_with_index do |, i| (, document[name][i]) end end when :belongs_to if is_new && document.attributes[name] value = document.attributes.delete(name) if value.is_a?(Hash) raise( Mongoid::FixtureKit::FixtureError, 'Unable to create nested document inside an embedded document' ) end doc = find_or_create_document(relation.class_name, value) document.attributes[relation.foreign_key] = doc.id end else # type code here end end end |
#update_all_loaded_fixtures(fixtures_map) ⇒ Object
29 30 31 |
# File 'lib/mongoid/fixture_kit/util.rb', line 29 def update_all_loaded_fixtures(fixtures_map) @all_loaded_fixtures = fixtures_map end |
#update_document(document, attributes) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/mongoid/fixture_kit/util.rb', line 75 def update_document(document, attributes) attributes.delete('_id') if document.attributes.key?('_id') keys = (attributes.keys + document.attributes.keys).uniq keys.each do |key| value = attributes[key] || document[key] if key.include?('_translations') document.public_send("#{key}=", value) elsif attributes[key].instance_of?(Array) || document[key].instance_of?(Array) document[key] = Array(attributes[key]) + Array(document[key]) else document[key] = value end end (document) save_document(document) document end |