attached 0.0.7 → 0.0.8

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 (2) hide show
  1. data/lib/attached.rb +35 -5
  2. metadata +2 -2
data/lib/attached.rb CHANGED
@@ -104,15 +104,22 @@ module Attached
104
104
 
105
105
  def validates_attached_size(name, options = {})
106
106
 
107
- message = options[:message] || "size must be between :minimum and :maximum"
107
+ zero = (0.0 / 1.0)
108
+ infi = (1.0 / 0.0)
108
109
 
109
- minimum = options[:minimum] || options[:in] && options[:in].first || (0.0 / 1.0)
110
- maximum = options[:maximum] || options[:in] && options[:in].last || (1.0 / 0.0)
110
+ minimum = options[:minimum] || options[:in] && options[:in].first || zero
111
+ maximum = options[:maximum] || options[:in] && options[:in].last || infi
112
+
113
+ message = options[:message]
114
+ message ||= "size must be specified" if minimum == zero && maximum == infi
115
+ message ||= "size must be a minimum of :minimum" if maximum == infi
116
+ message ||= "size must be a maximum of :maximum" if minimum == zero
117
+ message ||= "size must be between :minimum and :maximum bytes"
111
118
 
112
119
  range = minimum..maximum
113
120
 
114
- message.gsub!(/:minimum/, number_to_human_size(minimum))
115
- message.gsub!(/:maximum/, number_to_human_size(maximum))
121
+ message.gsub!(/:minimum/, number_to_human_size(minimum)) unless minimum == zero
122
+ message.gsub!(/:maximum/, number_to_human_size(maximum)) unless maximum == infi
116
123
 
117
124
  validates_inclusion_of :"#{name}_size", :in => range, :message => message,
118
125
  :if => options[:if], :unless => options[:unless]
@@ -141,6 +148,29 @@ module Attached
141
148
  end
142
149
 
143
150
 
151
+ private
152
+
153
+
154
+ SINGULAR = 1
155
+
156
+ def number_to_human_size(number, options = {})
157
+ return if number == 0.0 / 1.0
158
+ return if number == 1.0 / 0.0
159
+
160
+ base = 1024
161
+ units = ["byte", "kilobyte", "megabyte", "gigabyte", "terabyte", "petabyte"]
162
+
163
+ exponent = (Math.log(number) / Math.log(base)).floor
164
+
165
+ number /= base ** exponent
166
+ unit = units[exponent]
167
+
168
+ number == SINGULAR ? unit.gsub!(/s$/, '') : unit.gsub!(/$/, 's')
169
+
170
+ "#{number} #{unit}"
171
+ end
172
+
173
+
144
174
  end
145
175
 
146
176
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 7
9
- version: 0.0.7
8
+ - 8
9
+ version: 0.0.8
10
10
  platform: ruby
11
11
  authors:
12
12
  - Kevin Sylvestre