Class: GeneralUnits::Base::Measurement

Inherits:
Object
  • Object
show all
Defined in:
lib/general_units/units/base/measurement.rb

Direct Known Subclasses

Length, Volume, Weight

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(amount = 0, unit) ⇒ Measurement

Returns a new instance of Measurement.



9
10
11
12
13
14
# File 'lib/general_units/units/base/measurement.rb', line 9

def initialize(amount = 0, unit)
  if unit = valid_unit?(unit)
    @amount = amount.try(:to_d)||0.to_d
    @unit = unit
  end
end

Instance Attribute Details

#amountObject (readonly)

Returns the value of attribute amount.



6
7
8
# File 'lib/general_units/units/base/measurement.rb', line 6

def amount
  @amount
end

#unitObject (readonly)

Returns the value of attribute unit.



6
7
8
# File 'lib/general_units/units/base/measurement.rb', line 6

def unit
  @unit
end

Class Method Details

.i18n_class_keyObject



20
21
22
# File 'lib/general_units/units/base/measurement.rb', line 20

def self.i18n_class_key
  "#{i18n_scope_key}.#{name.demodulize.underscore}"
end

.i18n_format_key(format = nil) ⇒ Object



24
25
26
# File 'lib/general_units/units/base/measurement.rb', line 24

def self.i18n_format_key(format = nil)
  [i18n_class_key, :formats, format].compact.join(".")
end

.i18n_key(*args) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/general_units/units/base/measurement.rb', line 28

def self.i18n_key(*args)
  key = args.first
  options = args.extract_options!
  options[:locale] ||= I18n.locale
  begin
    I18n.t("#{i18n_format_key(options[:format])}.#{key}", options.merge(:raise => true))
  rescue
    begin
      I18n.t("#{i18n_class_key}.#{key}", options.merge(:raise => true))
    rescue
      I18n.t("#{i18n_scope_key}.#{key}", options)
    end
  end
end

.i18n_scope_keyObject



16
17
18
# File 'lib/general_units/units/base/measurement.rb', line 16

def self.i18n_scope_key
  'general_units'
end

.select_units(*args) ⇒ Object

SELECT UNITS START ###



197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/general_units/units/base/measurement.rb', line 197

def self.select_units(*args)
  options = args.extract_options!
  systems = Array(options[:system]).map(&:to_sym)
  only = Array(options[:only]).map(&:to_sym)
  except = Array(options[:except]).map(&:to_sym)
  list = (Array(args.first) if args.first)||self.units
  if systems.present?
    list = list.select {|u| u.system.in?(systems)}
  end
  if only.present?
    list = list.select {|u| u.code.in?(only)}
  end
  if except.present?
    list = list.select {|u| !u.code.in?(except)}
  end
  list
end

Instance Method Details

#%(val) ⇒ Object



162
163
164
# File 'lib/general_units/units/base/measurement.rb', line 162

def %(val)
  modulo(val)
end

#*(other_object) ⇒ Object



125
126
127
# File 'lib/general_units/units/base/measurement.rb', line 125

def *(other_object)
  self.class.new(amount * valid_amount(other_object), unit)
end

#+(other_object) ⇒ Object



117
118
119
# File 'lib/general_units/units/base/measurement.rb', line 117

def +(other_object)
  self.class.new(amount + valid_amount(other_object), unit)
end

#-(other_object) ⇒ Object



121
122
123
# File 'lib/general_units/units/base/measurement.rb', line 121

def -(other_object)
  self.class.new(amount - valid_amount(other_object), unit)
end

#-@Object



73
74
75
# File 'lib/general_units/units/base/measurement.rb', line 73

def -@
  self.class.new(-amount, unit)
end

#/(other_object) ⇒ Object



129
130
131
# File 'lib/general_units/units/base/measurement.rb', line 129

def /(other_object)
  self.class.new(amount / valid_amount(other_object), unit)
end

#<(other_object) ⇒ Object



97
98
99
# File 'lib/general_units/units/base/measurement.rb', line 97

def <(other_object)
  amount < valid_amount(other_object)
end

#<=(other_object) ⇒ Object



105
106
107
# File 'lib/general_units/units/base/measurement.rb', line 105

def <=(other_object)
  amount <= valid_amount(other_object)
end

#<=>(other_object) ⇒ Object



87
88
89
90
91
# File 'lib/general_units/units/base/measurement.rb', line 87

def <=>(other_object)
  amount <=> valid_amount(other_object)
rescue NoMethodError
  raise ArgumentError, "Comparison of #{self.class} with #{val.inspect} failed"
end

#==(other_object) ⇒ Object



77
78
79
80
81
# File 'lib/general_units/units/base/measurement.rb', line 77

def ==(other_object)
  amount == valid_amount(other_object)
rescue NoMethodError
  false
end

#>(other_object) ⇒ Object



93
94
95
# File 'lib/general_units/units/base/measurement.rb', line 93

def >(other_object)
  amount > valid_amount(other_object)
end

#>=(other_object) ⇒ Object



101
102
103
# File 'lib/general_units/units/base/measurement.rb', line 101

def >=(other_object)
  amount >= valid_amount(other_object)
end

#absObject



178
179
180
# File 'lib/general_units/units/base/measurement.rb', line 178

def abs
  self.class.new(amount.abs, unit)
end

#attributesObject



47
48
49
# File 'lib/general_units/units/base/measurement.rb', line 47

def attributes
  {:amount => amount, :unit => unit}
end

#coerce(other) ⇒ Object



190
191
192
# File 'lib/general_units/units/base/measurement.rb', line 190

def coerce(other)
  [self, other]
end

#div(value) ⇒ Object



133
134
135
# File 'lib/general_units/units/base/measurement.rb', line 133

def div(value)
  amount.div(value)
end

#divmod(val) ⇒ Object



137
138
139
140
141
142
143
# File 'lib/general_units/units/base/measurement.rb', line 137

def divmod(val)
  if val.is_a?(self.class)
    divmod_object(val)
  else
    divmod_other(val)
  end
end

#eql?(other_object) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/general_units/units/base/measurement.rb', line 83

def eql?(other_object)
  self == other_object
end

#i18n_delimeter(options = {}) ⇒ Object



43
44
45
# File 'lib/general_units/units/base/measurement.rb', line 43

def i18n_delimeter(options = {})
  self.class.i18n_key(:delimeter, options)
end

#inspectObject



62
63
64
# File 'lib/general_units/units/base/measurement.rb', line 62

def inspect
  "<#{self.class.name} amount=#{to_f} unit=#{unit.code}>"
end

#measurementObject



69
70
71
# File 'lib/general_units/units/base/measurement.rb', line 69

def measurement
  self.class.name.split("::").last.underscore
end

#modulo(val) ⇒ Object



158
159
160
# File 'lib/general_units/units/base/measurement.rb', line 158

def modulo(val)
  divmod(val)[1]
end

#negative?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'lib/general_units/units/base/measurement.rb', line 113

def negative?
  self < 0
end

#nonzero?Boolean

Returns:

  • (Boolean)


186
187
188
# File 'lib/general_units/units/base/measurement.rb', line 186

def nonzero?
  amount != 0 ? self : nil
end

#positive?Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/general_units/units/base/measurement.rb', line 109

def positive?
  self > 0
end

#remainder(val) ⇒ Object



166
167
168
169
170
171
172
173
174
175
176
# File 'lib/general_units/units/base/measurement.rb', line 166

def remainder(val)
  if val.is_a?(self.class) && unit != val.unit
    val = val.convert_to(unit)
  end

  if (amount < 0 && val < 0) || (amount > 0 && val > 0)
    self.modulo(val)
  else
    self.modulo(val) - (val.is_a?(self.class) ? val : self.class.new(val, unit))
  end
end

#rounded(round = nil) ⇒ Object



58
59
60
# File 'lib/general_units/units/base/measurement.rb', line 58

def rounded(round = nil)
  to_f.divmod(1).last == 0 ? to_f.round(0) : to_f.round(round||2)
end

#to_s(*args) ⇒ Object



51
52
53
54
55
56
# File 'lib/general_units/units/base/measurement.rb', line 51

def to_s(*args)
  options = args.extract_options!
  value = "#{rounded(options[:round])}".gsub(".", i18n_delimeter(options))
  unit_string = unit.to_s({:count => rounded(options[:round]), :format => :short}.merge(options))
  "#{value} #{unit_string}"
end

#zero?Boolean

Returns:

  • (Boolean)


182
183
184
# File 'lib/general_units/units/base/measurement.rb', line 182

def zero?
  amount == 0
end