lib/attached.rb in attached-1.0.4 vs lib/attached.rb in attached-1.0.5
- old
+ new
@@ -1,39 +1,22 @@
+require 'attached/definition'
require 'attached/attachment'
+require 'attached/attatcher'
require 'attached/railtie'
-
module Attached
-
def self.mock!
Fog.mock!
end
-
def self.included(base)
base.extend ClassMethods
- base.class_attribute :attached_options
end
-
- module Definition
- def attachment(*args)
- options = args.extract_options!
-
- args.each do |name|
- column("#{name}_identifier", :string, options)
- column("#{name}_extension", :string, options)
- column("#{name}_size", :integer, options)
- end
- end
- end
-
-
module ClassMethods
-
# Add an attachment to a class.
#
# Options:
#
# * :styles - a hash containing style names followed by parameters passed to processor
@@ -41,74 +24,17 @@
# * :processor - a symbol for a predefined processor or a custom processor class
#
# Usage:
#
# has_attached :video
- # has_attached :video, :storage => :aws
- # has_attached :video, styles => { :mov => { :size => "480p", :format => "mov" } }
+ # has_attached :video, storage: :aws
+ # has_attached :video, styles: { mov: { size: "480p", format: "mov" } }
def has_attached(name, options = {})
-
- include InstanceMethods
-
- self.attached_options ||= {}
- self.attached_options[name] = options
-
- before_save :save_attached
- before_destroy :destroy_attached
-
- define_method name do
- attachment_for(name)
- end
-
- define_method "#{name}=" do |file|
- attachment_for(name).assign(file)
- end
-
- define_method "#{name}?" do
- attachment_for(name).attached?
- end
-
- define_method "#{name}_url=" do |url|
- attachment_for(name).url = url
- end
-
- validates_each(name) do |record, attr, value|
- attachment = record.attachment_for(name)
- attachment.errors.each do |error|
- record.errors.add(name, error)
- end
- end
-
- after_validation do
-
- if self.errors.include?(:"#{name}_size")
- self.errors[:"#{name}_size"].each do |message|
- self.errors.add(name, message)
- end
- self.errors[:"#{name}_size"].clear
- end
-
- if self.errors.include?(:"#{name}_extension")
- self.errors[:"#{name}_extension"].each do |message|
- self.errors.add(name, message)
- end
- self.errors[:"#{name}_extension"].clear
- end
-
- if self.errors.include?(:"#{name}_identifier")
- self.errors[:"#{name}_identifier"].each do |message|
- self.errors.add(name, message)
- end
- self.errors[:"#{name}_identifier"].clear
- end
-
- end
-
+ Attatcher.define(self, name, options)
end
-
# Validates an attached size in a specified range or minimum and maximum.
#
# Options:
#
# * :message - string to be displayed with :minimum and :maximum variables
@@ -116,13 +42,13 @@
# * :maximum - integer for the maximum byte size of teh attached
# * :in - range of bytes for file
#
# Usage:
#
- # validates_attached_size :avatar, :range => 10.megabytes .. 20.megabytes
- # validates_attached_size :avatar, :minimum => 10.megabytes, :maximum => 20.megabytes
- # validates_attached_size :avatar, :message => "size must be between :minimum and :maximum bytes"
+ # validates_attached_size :avatar, range: 10.megabytes .. 20.megabytes
+ # validates_attached_size :avatar, minimum: 10.megabytes, maximum: 20.megabytes
+ # validates_attached_size :avatar, message: "size must be between :minimum and :maximum bytes"
def validates_attached_size(name, options = {})
zero = (0.0 / 1.0)
infi = (1.0 / 0.0)
@@ -139,69 +65,65 @@
range = minimum..maximum
message.gsub!(/:minimum/, number_to_size(minimum)) unless minimum == zero
message.gsub!(/:maximum/, number_to_size(maximum)) unless maximum == infi
- validates_inclusion_of :"#{name}_size", :in => range, :message => message,
- :if => options[:if], :unless => options[:unless]
+ validates_inclusion_of :"#{name}_size", in: range, message: message,
+ if: options[:if], unless: options[:unless]
end
-
# Validates an attached extension in a specified set.
#
# Options:
#
# * :in - allowed values for attached
#
# Usage:
#
- # validates_attached_extension :avatar, :is => 'png'
- # validates_attached_extension :avatar, :in => %w(png jpg)
- # validates_attached_extension :avatar, :in => [:png, :jpg]
- # validates_attached_extension :avatar, :in => %w(png jpg), :message => "extension must be :in"
- # validates_attached_extension :avatar, :in => %w(png jpg), :message => "extension must be :in"
+ # validates_attached_extension :avatar, is: 'png'
+ # validates_attached_extension :avatar, in: %w(png jpg)
+ # validates_attached_extension :avatar, in: [:png, :jpg]
+ # validates_attached_extension :avatar, in: %w(png jpg), message: "extension must be :in"
+ # validates_attached_extension :avatar, in: %w(png jpg), message: "extension must be :in"
def validates_attached_extension(name, options = {})
message = options[:message]
message ||= "extension is invalid"
options[:in] ||= [options[:is]] if options[:is]
range = options[:in].map { |element| ".#{element}" }
- validates_inclusion_of :"#{name}_extension", :in => range, :message => message,
- :if => options[:if], :unless => options[:unless]
+ validates_inclusion_of :"#{name}_extension", in: range, message: message,
+ if: options[:if], unless: options[:unless]
end
-
# Validates that an attachment is included.
#
# Options:
#
# * :message - string to be displayed
#
# Usage:
#
# validates_attached_presence :avatar
- # validates_attached_presence :avatar, :message => "must be attached"
+ # validates_attached_presence :avatar, message: "must be attached"
def validates_attached_presence(name, options = {})
message = options[:message]
message ||= "must be attached"
- validates_presence_of :"#{name}_identifier", :message => message,
- :if => options[:if], :unless => options[:unless]
+ validates_presence_of :"#{name}_identifier", message: message,
+ if: options[:if], unless: options[:unless]
end
-
private
-
# Convert a number to a human readable size.
#
# Usage:
#
# number_to_size(1) # 1 byte
@@ -211,13 +133,13 @@
def number_to_size(number, options = {})
return if number == 0.0 / 1.0
return if number == 1.0 / 0.0
- singular = options['singular'] || 1
- base = options['base'] || 1024
- units = options['units'] || ["byte", "kilobyte", "megabyte", "gigabyte", "terabyte", "petabyte"]
+ singular = options[:singular] || 1
+ base = options[:base] || 1024
+ units = options[:units] || ["byte", "kilobyte", "megabyte", "gigabyte", "terabyte", "petabyte"]
exponent = (Math.log(number) / Math.log(base)).floor
number /= base ** exponent
unit = units[exponent]
@@ -225,58 +147,8 @@
number == singular ? unit.gsub!(/s$/, '') : unit.gsub!(/$/, 's')
"#{number} #{unit}"
end
-
end
-
-
- module InstanceMethods
-
-
- # Create or access attachment.
- #
- # Usage:
- #
- # attachment_for :avatar
-
- def attachment_for(name)
- @_attached_attachments ||= {}
- @_attached_attachments[name] ||= Attachment.new(name, self, self.class.attached_options[name])
- end
-
-
- # Log and save all attached (using specified storage).
- #
- # Usage:
- #
- # before_save :save_attached
-
- def save_attached
- logger.info "[attached] save attached"
-
- self.class.attached_options.each do |name, options|
- attachment_for(name).save
- end
- end
-
-
- # Log and destroy all attached (using specified storage).
- #
- # Usage:
- #
- # before_save :destroy_attached
-
- def destroy_attached
- logger.info "[attached] destroy attached"
-
- self.class.attached_options.each do |name, options|
- attachment_for(name).destroy
- end
- end
-
-
- end
-
end
\ No newline at end of file