lib/joint.rb in joint-0.5.1 vs lib/joint.rb in joint-0.5.2
- old
+ new
@@ -1,152 +1,40 @@
require 'set'
require 'mime/types'
require 'wand'
module Joint
- autoload :Version, 'joint/version'
-
def self.configure(model)
model.class_inheritable_accessor :attachment_names
model.attachment_names = Set.new
model.send(:include, model.attachment_accessor_module)
end
- module ClassMethods
- def attachment_accessor_module
- @attachment_accessor_module ||= Module.new
+ def self.name(file)
+ if file.respond_to?(:original_filename)
+ file.original_filename
+ else
+ File.basename(file.path)
end
-
- def attachment(name, options = {})
- options.symbolize_keys!
- name = name.to_sym
-
- self.attachment_names << name
-
- after_save :save_attachments
- after_save :destroy_nil_attachments
- before_destroy :destroy_all_attachments
-
- key :"#{name}_id", ObjectId
- key :"#{name}_name", String
- key :"#{name}_size", Integer
- key :"#{name}_type", String
-
- validates_presence_of(name) if options[:required]
-
- attachment_accessor_module.module_eval <<-EOC
- def #{name}
- @#{name} ||= AttachmentProxy.new(self, :#{name})
- end
-
- def #{name}?
- !nil_attachments.include?(:#{name}) && send(:#{name}_id?)
- end
-
- def #{name}=(file)
- if file.nil?
- nil_attachments << :#{name}
- assigned_attachments.delete(:#{name})
- else
- send("#{name}_id=", BSON::ObjectId.new) if send("#{name}_id").nil?
- send("#{name}_size=", File.size(file))
- send("#{name}_type=", Wand.wave(file.path, :original_filename => Joint.file_name(file)))
- send("#{name}_name=", Joint.file_name(file))
- assigned_attachments[:#{name}] = file
- nil_attachments.delete(:#{name})
- end
- end
- EOC
- end
end
- module InstanceMethods
- def grid
- @grid ||= Mongo::Grid.new(database)
+ def self.size(file)
+ if file.respond_to?(:size)
+ file.size
+ else
+ File.size(file)
end
-
- private
- def assigned_attachments
- @assigned_attachments ||= {}
- end
-
- def nil_attachments
- @nil_attachments ||= Set.new
- end
-
- # IO must respond to read and rewind
- def save_attachments
- assigned_attachments.each_pair do |name, io|
- next unless io.respond_to?(:read)
- io.rewind if io.respond_to?(:rewind)
- grid.delete(send(name).id)
- grid.put(io.read, {
- :_id => send(name).id,
- :filename => send(name).name,
- :content_type => send(name).type,
- })
- end
- assigned_attachments.clear
- end
-
- def destroy_nil_attachments
- # currently MM does not send sets to instance as well
- nil_attachments.each do |name|
- grid.delete(send(name).id)
- send(:"#{name}_id=", nil)
- send(:"#{name}_size=", nil)
- send(:"#{name}_type=", nil)
- send(:"#{name}_name=", nil)
- set({
- :"#{name}_id" => nil,
- :"#{name}_size" => nil,
- :"#{name}_type" => nil,
- :"#{name}_name" => nil,
- })
- end
-
- nil_attachments.clear
- end
-
- def destroy_all_attachments
- self.class.attachment_names.map { |name| grid.delete(send(name).id) }
- end
end
- class AttachmentProxy
- def initialize(instance, name)
- @instance, @name = instance, name
+ def self.type(file)
+ if file.respond_to?(:content_type)
+ file.content_type
+ else
+ Wand.wave(file.path, :original_filename => Joint.name(file))
end
-
- def id
- @instance.send("#{@name}_id")
- end
-
- def name
- @instance.send("#{@name}_name")
- end
-
- def size
- @instance.send("#{@name}_size")
- end
-
- def type
- @instance.send("#{@name}_type")
- end
-
- def nil?
- !@instance.send("#{@name}?")
- end
-
- def grid_io
- @grid_io ||= @instance.grid.get(id)
- end
-
- def method_missing(method, *args, &block)
- grid_io.send(method, *args, &block)
- end
end
-
- def self.file_name(file)
- file.respond_to?(:original_filename) ? file.original_filename : File.basename(file.path)
- end
end
+
+require 'joint/class_methods'
+require 'joint/instance_methods'
+require 'joint/attachment_proxy'
+require 'joint/io'