quantify 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.0
1
+ 3.1.0
@@ -22,7 +22,17 @@ class String
22
22
  end
23
23
 
24
24
  def starts_with_number?
25
- (/\A([\d\s.,]+)/i).match(self) ? true : false
25
+ (/\A#{Unit::NUMBER_REGEX}/i).match(self) ? true : false
26
+ end
27
+
28
+ def starts_with_valid_unit_term?
29
+ return false unless
30
+ term = /\A#{Unit.unit_label_regex}#{Unit::INDEX_REGEX}?/.match(self) ||
31
+ /\A#{Unit.unit_symbol_regex}#{Unit::INDEX_REGEX}?/.match(self) ||
32
+ /\A#{Unit.unit_name_regex}#{Unit::INDEX_REGEX}?/.match(self) ||
33
+ /\A#{Unit::UNIT_DENOMINATOR_REGEX}/.match(self) ||
34
+ /\A(#{Unit::UNIT_PREFIX_TERMS_REGEX}|#{Unit::UNIT_SUFFIX_TERMS_REGEX})/i.match(self)
35
+ return term[0]
26
36
  end
27
37
 
28
38
  def to_quantity
@@ -1,8 +1,6 @@
1
1
 
2
2
  ActiveSupport::Inflector.inflections do |inflect|
3
3
 
4
- inflect.uncountable %w( clo hertz lux siemens )
5
-
6
4
  inflect.plural /(metre)/i, '\1s'
7
5
  inflect.singular /(metre)s?/i, '\1'
8
6
 
@@ -27,9 +25,11 @@ ActiveSupport::Inflector.inflections do |inflect|
27
25
  inflect.plural /(gallon)/i, '\1s'
28
26
  inflect.singular /(gallon)s?/i, '\1'
29
27
 
28
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
30
29
  inflect.plural /(horsepower)/i, '\1'
31
30
  inflect.singular /(horsepower)/i, '\1'
32
31
 
32
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
33
33
  inflect.plural /(hundredweight)/i, '\1'
34
34
  inflect.singular /(hundredweight)/i, '\1'
35
35
 
@@ -48,6 +48,10 @@ ActiveSupport::Inflector.inflections do |inflect|
48
48
  inflect.plural /(pound)/i, '\1s'
49
49
  inflect.singular /(pound)s?/i, '\1'
50
50
 
51
+ # This inflection is defined after that of 'pound' so that 'pound mole' is inflected appropriately
52
+ inflect.plural /(mole)/i, '\1s'
53
+ inflect.singular /(mole)s?/i, '\1'
54
+
51
55
  inflect.plural /(ton)/i, '\1s'
52
56
  inflect.singular /(ton)s?/i, '\1'
53
57
 
@@ -56,7 +60,27 @@ ActiveSupport::Inflector.inflections do |inflect|
56
60
 
57
61
  inflect.plural /(stone)/i, '\1s'
58
62
  inflect.singular /(stone)s?/i, '\1'
59
-
63
+
64
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
65
+ inflect.plural /(gauss)/i, '\1'
66
+ inflect.singular /(gauss)/i, '\1'
67
+
68
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
69
+ inflect.plural /(clo)/i, '\1'
70
+ inflect.singular /(clo)/i, '\1'
71
+
72
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
73
+ inflect.plural /(hertz)/i, '\1'
74
+ inflect.singular /(hertz)/i, '\1'
75
+
76
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
77
+ inflect.plural /(lux)/i, '\1'
78
+ inflect.singular /(lux)/i, '\1'
79
+
80
+ # 'uncountable' but required regex inflection definition for cases where combined with prefix
81
+ inflect.plural /(siemens)/i, '\1'
82
+ inflect.singular /(siemens)/i, '\1'
83
+
60
84
  inflect.irregular 'footcandle', 'footcandles'
61
85
  inflect.irregular 'kilowatt hour', 'kilowatt hours'
62
86
 
@@ -41,8 +41,6 @@ module Quantify
41
41
  #
42
42
  # 16.Gg #=> Quantity (gigagrams)
43
43
 
44
-
45
-
46
44
  # Parse a string and return a Quantity object based upon the value and
47
45
  # subseqent unit name, symbol or JScience label. Returns an array containing
48
46
  # quantity objects for each quantity recognised.
@@ -53,7 +51,7 @@ module Quantify
53
51
  # Isolate number from subsequent string
54
52
  value, string = word, words[index+1..-1].join(" ")
55
53
  # Shift any trailing non-numeric characters to start of string.
56
- value, string = $1, "#{$2} #{string}" if (/([\d\s.,]+)([^\d\s.,\^]+(\^[\d\.-]*)?)/i).match(word)
54
+ value, string = $1, "#{$2} #{string}" if (Unit::QUANTITY_REGEX).match(word)
57
55
  # Parse string for unit references
58
56
  unit = Unit.parse(string, :iterative => true) || Unit.dimensionless
59
57
  # Instantiate quantity using value and unit
@@ -77,7 +75,7 @@ module Quantify
77
75
  !new_unit.is_compound_unit?
78
76
  return false
79
77
  end
80
-
78
+
81
79
  public
82
80
 
83
81
  attr_accessor :value, :unit
@@ -150,40 +148,7 @@ module Quantify
150
148
  nil # raise? or ...
151
149
  end
152
150
  end
153
-
154
- # Conversion where both units (including compound units) are of precisely
155
- # equivalent dimensions, i.e. direct alternatives for one another. Where
156
- # previous unit is a compound unit, new unit must be cancelled by all original
157
- # base units
158
- #
159
- def convert_to_equivalent_unit!(new_unit)
160
- old_unit = @unit
161
- self.multiply!(Unit.ratio new_unit, old_unit)
162
- old_base_units = old_unit.base_units.map { |base| base.unit } if old_unit.is_compound_unit?
163
- self.cancel_base_units!(*old_base_units || old_unit)
164
- end
165
-
166
- def conversion_with_scalings!(new_unit)
167
- @value = (((@value + @unit.scaling) * @unit.factor) / new_unit.factor) - new_unit.scaling
168
- @unit = new_unit
169
- return self
170
- end
171
-
172
- # Conversion where self is a compound unit, and new unit is not an alternative
173
- # to the whole compound but IS an alternative to one or more of the base units,
174
- # e.g.,
175
- #
176
- # Unit.kilowatt_hour.to :second #=> 'kilowatt second'
177
- #
178
- def convert_compound_unit_to_non_equivalent_unit!(new_unit)
179
- @unit.base_units.select do |base|
180
- base.unit.is_alternative_for? new_unit
181
- end.inject(self) do |quantity,base|
182
- factor = Unit.ratio(new_unit**base.index, base.unit**base.index)
183
- quantity.multiply!(factor).cancel_base_units!(base.unit)
184
- end
185
- end
186
-
151
+
187
152
  # Converts a quantity to the equivalent quantity using only SI units
188
153
  def to_si
189
154
  if @unit.is_compound_unit?
@@ -192,49 +157,7 @@ module Quantify
192
157
  self.to(@unit.si_unit)
193
158
  end
194
159
  end
195
-
196
- def convert_compound_unit_to_si!
197
- until @unit.is_base_quantity_si_unit? do
198
- unit = @unit.base_units.find do |base|
199
- !base.is_base_quantity_si_unit?
200
- end.unit
201
- self.convert_compound_unit_to_non_equivalent_unit!(unit.si_unit)
202
- end
203
- return self
204
- end
205
-
206
- # Quantities must be of the same dimension in order to operate. If they are
207
- # represented by different units (but represent the same physical quantity)
208
- # the second quantity is converted into the unit belonging to the first unit
209
- # and the addition is completed
210
- #
211
- def add_or_subtract!(operator,other)
212
- if other.is_a? Quantity
213
- other = other.to(@unit) if other.unit.is_alternative_for?(@unit)
214
- if @unit.is_equivalent_to? other.unit
215
- @value = @value.send operator, other.value
216
- return self
217
- else
218
- raise Quantify::Exceptions::InvalidObjectError "Cannot add or subtract Quantities with different dimensions"
219
- end
220
- else
221
- raise Quantify::Exceptions::InvalidObjectError "Cannot add or subtract non-Quantity objects"
222
- end
223
- end
224
-
225
- def multiply_or_divide!(operator,other)
226
- if other.kind_of? Numeric
227
- @value = @value.send(operator,other)
228
- return self
229
- elsif other.kind_of? Quantity
230
- @unit = @unit.send(operator,other.unit).or_equivalent
231
- @value = @value.send(operator,other.value)
232
- return self
233
- else
234
- raise Quantify::Exceptions::InvalidArgumentError "Cannot multiply or divide a Quantity by a non-Quantity or non-Numeric object"
235
- end
236
- end
237
-
160
+
238
161
  def pow!(power)
239
162
  raise Exceptions::InvalidArgumentError, "Argument must be an integer" unless power.is_a? Integer
240
163
  @value = @value ** power
@@ -331,8 +254,82 @@ module Quantify
331
254
  range.include? self
332
255
  end
333
256
 
334
- protected :convert_compound_unit_to_si!, :add_or_subtract!, :multiply_or_divide!
257
+ protected
258
+
259
+ # Quantities must be of the same dimension in order to operate. If they are
260
+ # represented by different units (but represent the same physical quantity)
261
+ # the second quantity is converted into the unit belonging to the first unit
262
+ # and the addition is completed
263
+ #
264
+ def add_or_subtract!(operator,other)
265
+ if other.is_a? Quantity
266
+ other = other.to(@unit) if other.unit.is_alternative_for?(@unit)
267
+ if @unit.is_equivalent_to? other.unit
268
+ @value = @value.send operator, other.value
269
+ return self
270
+ else
271
+ raise Quantify::Exceptions::InvalidObjectError, "Cannot add or subtract Quantities with different dimensions"
272
+ end
273
+ else
274
+ raise Quantify::Exceptions::InvalidObjectError, "Cannot add or subtract non-Quantity objects"
275
+ end
276
+ end
277
+
278
+ def multiply_or_divide!(operator,other)
279
+ if other.kind_of? Numeric
280
+ @value = @value.send(operator,other)
281
+ return self
282
+ elsif other.kind_of? Quantity
283
+ @unit = @unit.send(operator,other.unit).or_equivalent
284
+ @value = @value.send(operator,other.value)
285
+ return self
286
+ else
287
+ raise Quantify::Exceptions::InvalidArgumentError, "Cannot multiply or divide a Quantity by a non-Quantity or non-Numeric object"
288
+ end
289
+ end
290
+
291
+ # Conversion where both units (including compound units) are of precisely
292
+ # equivalent dimensions, i.e. direct alternatives for one another. Where
293
+ # previous unit is a compound unit, new unit must be cancelled by all original
294
+ # base units
295
+ #
296
+ def convert_to_equivalent_unit!(new_unit)
297
+ old_unit = @unit
298
+ self.multiply!(Unit.ratio new_unit, old_unit)
299
+ old_base_units = old_unit.base_units.map { |base| base.unit } if old_unit.is_compound_unit?
300
+ self.cancel_base_units!(*old_base_units || old_unit)
301
+ end
302
+
303
+ def conversion_with_scalings!(new_unit)
304
+ @value = (((@value + @unit.scaling) * @unit.factor) / new_unit.factor) - new_unit.scaling
305
+ @unit = new_unit
306
+ return self
307
+ end
335
308
 
309
+ # Conversion where self is a compound unit, and new unit is not an alternative
310
+ # to the whole compound but IS an alternative to one or more of the base units,
311
+ # e.g.,
312
+ #
313
+ # Unit.kilowatt_hour.to :second #=> 'kilowatt second'
314
+ #
315
+ def convert_compound_unit_to_non_equivalent_unit!(new_unit)
316
+ @unit.base_units.select do |base|
317
+ base.unit.is_alternative_for? new_unit
318
+ end.inject(self) do |quantity,base|
319
+ factor = Unit.ratio(new_unit**base.index, base.unit**base.index)
320
+ quantity.multiply!(factor).cancel_base_units!(base.unit)
321
+ end
322
+ end
323
+
324
+ def convert_compound_unit_to_si!
325
+ until @unit.is_base_quantity_si_unit? do
326
+ unit = @unit.base_units.find do |base|
327
+ !base.is_base_quantity_si_unit?
328
+ end.unit
329
+ self.convert_compound_unit_to_non_equivalent_unit!(unit.si_unit)
330
+ end
331
+ return self
332
+ end
336
333
 
337
334
  # Enables shorthand for reciprocal of quantity, e.g.
338
335
  #
@@ -17,6 +17,14 @@ module Quantify
17
17
  def self.construct_and_load(unit,&block)
18
18
  self.construct(unit, &block).load
19
19
  end
20
+
21
+ def self.initialize_prefixed_version(prefix,unit)
22
+ prefix, unit = Prefix.for(prefix), Unit.for(unit)
23
+ raise Exceptions::InvalidArgumentError, "Prefix is not known" if prefix.nil?
24
+ raise Exceptions::InvalidArgumentError, "Unit is not known" if unit.nil?
25
+ raise Exceptions::InvalidArgumentError, "Cannot add prefix where one already exists: #{unit.prefix.name}" if unit.prefix
26
+ self.new &self.block_for_prefixed_version(prefix,unit)
27
+ end
20
28
 
21
29
  # Mass load prefixed units. First argument is a single or array of units.
22
30
  # Second argument is a single or array of prefixes. All specfied units will
@@ -36,9 +44,9 @@ module Quantify
36
44
  # unit becomes a representation of the compound - without explicitly holding
37
45
  # the base units, e.g.
38
46
  #
39
- # Unit::Base.define(Unit.m**2).name #=> "square metre"
47
+ # Unit::Base.construct(Unit.m**2).name #=> "square metre"
40
48
  #
41
- # Unit::Base.define(Unit**3) do |unit|
49
+ # Unit::Base.construct(Unit.m**3) do |unit|
42
50
  # unit.name = "metres cubed"
43
51
  # end.name #=> "metres cubed"
44
52
  #
@@ -65,6 +73,7 @@ module Quantify
65
73
 
66
74
  attr_reader :name, :symbol, :label, :factor, :dimensions
67
75
  attr_reader :acts_as_alternative_unit, :acts_as_equivalent_unit
76
+ attr_accessor :base_unit, :prefix
68
77
 
69
78
  # Create a new Unit::Base instance.
70
79
  #
@@ -104,10 +113,13 @@ module Quantify
104
113
  self.factor = 1.0
105
114
  self.symbol = nil
106
115
  self.label = nil
116
+ self.name = nil
117
+ self.base_unit = nil
118
+ self.prefix = nil
107
119
  if options.is_a? Hash
108
- self.dimensions = options[:dimensions] || options[:physical_quantity]
109
- self.name = options[:name]
120
+ self.dimensions = options[:dimensions] || options[:physical_quantity] if options[:dimensions] || options[:physical_quantity]
110
121
  self.factor = options[:factor] if options[:factor]
122
+ self.name = options[:name] if options[:name]
111
123
  self.symbol = options[:symbol] if options[:symbol]
112
124
  self.label = options[:label] if options[:label]
113
125
  end
@@ -303,9 +315,7 @@ module Quantify
303
315
 
304
316
  # Determine if the unit is a prefixed unit
305
317
  def is_prefixed_unit?
306
- return true if valid_prefixes.size > 0 &&
307
- self.name =~ /\A(#{valid_prefixes.map {|p| p.name}.join("|")})/
308
- return false
318
+ self.prefix ? true : false
309
319
  end
310
320
 
311
321
  # Determine if the unit is one of the units against which all other units
@@ -428,31 +438,6 @@ module Quantify
428
438
  @dimensions.is_a? Dimensions
429
439
  end
430
440
 
431
- # Returns an array representing the valid prefixes for the unit described
432
- # by self
433
- #
434
- # If no argument is given, the array holds instances of Prefix::Base (or
435
- # subclasses; SI, NonSI...). Alternatively only the names or symbols of each
436
- # prefix can be returned by providing the appropriate prefix attribute as a
437
- # symbolized argument, e.g.
438
- #
439
- # Unit.m.valid_prefixes #=> [ #<Quantify::Prefix: .. >,
440
- # #<Quantify::Prefix: .. >,
441
- # ... ]
442
- #
443
- # Unit.m.valid_prefixes :name #=> [ "deca", "hecto", "kilo",
444
- # "mega", "giga", "tera"
445
- # ... ]
446
- #
447
- # Unit.m.valid_prefixes :symbol #=> [ "da", "h", "k", "M", "G",
448
- # "T", "P" ... ]
449
- #
450
- def valid_prefixes(by=nil)
451
- return [] if is_compound_unit? && has_multiple_base_units?
452
- return Unit::Prefix.si_prefixes.map(&by).to_a if is_si_unit?
453
- return Unit::Prefix.non_si_prefixes.map(&by).to_a if is_non_si_unit?
454
- end
455
-
456
441
  # Multiply two units together. This results in the generation of a compound
457
442
  # unit.
458
443
  #
@@ -513,15 +498,7 @@ module Quantify
513
498
  # of self, complete with modified name, symbol, factor, etc..
514
499
  #
515
500
  def with_prefix(name_or_symbol)
516
- raise Exceptions::InvalidArgumentError, "No valid prefixes exist for unit: #{self.name}" if valid_prefixes.empty?
517
- raise Exceptions::InvalidArgumentError, "Cannot add prefix where one already exists: #{self.name}" if @name =~ /\A(#{valid_prefixes(:name).join("|")})/
518
-
519
- prefix = Unit::Prefix.for(name_or_symbol,valid_prefixes)
520
- if !prefix.nil?
521
- self.class.new(options_for_prefixed_version(prefix))
522
- else
523
- raise Exceptions::InvalidArgumentError, "Prefix unit is not known: #{prefix}"
524
- end
501
+ self.class.initialize_prefixed_version(name_or_symbol,self)
525
502
  end
526
503
 
527
504
  # Return an array of new unit instances based upon self, together with the
@@ -558,16 +535,6 @@ module Quantify
558
535
  end
559
536
 
560
537
  private
561
-
562
- def options_for_prefixed_version(prefix)
563
- options = {}
564
- options[:name] = "#{prefix.name}#{@name}"
565
- options[:symbol] = "#{prefix.symbol}#{@symbol}"
566
- options[:label] = "#{prefix.symbol}#{@label}"
567
- options[:factor] = prefix.factor * @factor
568
- options[:physical_quantity] = @dimensions
569
- return options
570
- end
571
538
 
572
539
  # Clone self and explicitly clone the associated Dimensions object located
573
540
  # at @dimensions.
@@ -581,6 +548,18 @@ module Quantify
581
548
  super
582
549
  instance_variable_set("@dimensions", @dimensions.clone)
583
550
  end
551
+
552
+ def self.block_for_prefixed_version(prefix,unit)
553
+ return Proc.new do |new_unit|
554
+ new_unit.base_unit = unit.clone
555
+ new_unit.prefix = prefix
556
+ new_unit.dimensions = unit.dimensions.clone
557
+ new_unit.name = "#{prefix.name}#{unit.name}"
558
+ new_unit.factor = prefix.factor * unit.factor
559
+ new_unit.symbol = "#{prefix.symbol}#{unit.symbol}"
560
+ new_unit.label = "#{prefix.symbol}#{unit.label}"
561
+ end
562
+ end
584
563
 
585
564
  # Provides syntactic sugar for several methods. E.g.
586
565
  #
@@ -597,8 +576,6 @@ module Quantify
597
576
  return self.with_prefix(prefix)
598
577
  elsif method.to_s =~ /(alternatives_by_)(.*)/ && self.respond_to?($2.to_sym)
599
578
  return self.alternatives($2.to_sym)
600
- elsif method.to_s =~ /(valid_prefixes_by_)(.*)/ && Prefix::Base.instance_methods.include?($2.to_s)
601
- return self.valid_prefixes($2.to_sym)
602
579
  end
603
580
  super
604
581
  end
@@ -19,7 +19,14 @@ module Quantify
19
19
  #
20
20
  # The Compound class provides support for arbitrarily defined compound units
21
21
  # which don't have well-established names.
22
-
22
+
23
+ def self.initialize_prefixed_version(prefix,compound)
24
+ if compound.has_multiple_base_units?
25
+ raise Exceptions::InvalidArgumentError, "Cannot apply prefix to compound unit with multiple base units: #{self.name}"
26
+ end
27
+ super
28
+ end
29
+
23
30
  attr_reader :base_units, :acts_as_equivalent_unit
24
31
 
25
32
  # Initialize a compound unit by providing an array containing a represenation
@@ -34,7 +41,7 @@ module Quantify
34
41
  # 3. a sub-array of size 2 containing an instance of Unit::Base and an
35
42
  # explicit index
36
43
  #
37
- def initialize(*units)
44
+ def initialize(*units,&block)
38
45
  @base_units = CompoundBaseUnitList.new
39
46
  units.each do |unit|
40
47
  if unit.is_a? CompoundBaseUnit
@@ -50,6 +57,7 @@ module Quantify
50
57
  end
51
58
  @acts_as_alternative_unit = true
52
59
  @acts_as_equivalent_unit = false
60
+ block.call(self) if block_given?
53
61
  consolidate_numerator_and_denominator_units!
54
62
  end
55
63
 
@@ -180,23 +188,24 @@ module Quantify
180
188
  @base_units.rationalize_numerator_and_denominator!(*units)
181
189
  initialize_attributes
182
190
  end
183
-
191
+
184
192
  private
185
193
 
186
194
  def initialize_attributes
187
195
  self.dimensions = @base_units.dimensions
188
- self.name = @base_units.name
189
- self.symbol = @base_units.symbol
190
- self.factor = @base_units.factor
191
- self.label = @base_units.label
196
+ self.name = @base_units.name
197
+ self.symbol = @base_units.symbol
198
+ self.factor = @base_units.factor
199
+ self.label = @base_units.label
192
200
  return self
193
201
  end
194
-
195
- def options_for_prefixed_version(prefix)
196
- raise Exceptions::InvalidArgumentError, "No valid prefixes exist for unit: #{self.name}" if has_multiple_base_units?
197
- base = @base_units.first
202
+
203
+ def self.block_for_prefixed_version(prefix,compound)
204
+ base = compound.base_units.first
198
205
  base.unit = base.unit.with_prefix(prefix)
199
- return base
206
+ return Proc.new do |compound|
207
+ compound.base_units << base
208
+ end
200
209
  end
201
210
 
202
211
  def initialize_copy(source)
@@ -22,10 +22,10 @@ module Quantify
22
22
  @prefixes
23
23
  end
24
24
 
25
- def self.for(name_or_symbol,collection=nil)
25
+ def self.for(name_or_symbol)
26
26
  return name_or_symbol.clone if name_or_symbol.is_a? Quantify::Unit::Prefix::Base
27
27
  if name_or_symbol.is_a?(String) || name_or_symbol.is_a?(Symbol)
28
- if prefix = (collection.nil? ? @prefixes : collection).find do |prefix|
28
+ if prefix = @prefixes.find do |prefix|
29
29
  prefix.name == name_or_symbol.remove_underscores.downcase ||
30
30
  prefix.symbol == name_or_symbol.remove_underscores
31
31
  end
@@ -64,7 +64,7 @@ module Quantify
64
64
  elsif prefix = self.for(method)
65
65
  return prefix
66
66
  else
67
- raise NoMethodError, "Undefined method `#{method}` for #{self}:#{self.class}"
67
+ super
68
68
  end
69
69
  end
70
70
 
@@ -4,7 +4,7 @@ module Quantify
4
4
  module Unit
5
5
 
6
6
  extend ExtendedMethods
7
-
7
+
8
8
  # The Unit module contains functionality for defining and handling
9
9
  # representations of physical units.
10
10
  #
@@ -19,7 +19,24 @@ module Quantify
19
19
  # prefixes specified in config.rb. New units can be defined (with or without
20
20
  # prefixes) at any time and either used in place or loaded into the known
21
21
  # system.
22
+
23
+ NUMBER_REGEX = /([\d\s.,]+)/i
24
+
25
+ UNIT_DENOMINATOR_REGEX = /(\/|per)/i
26
+
27
+ ORDINAL_SUFFIXES_REGEX = /(st|nd|rd|th)\b/i
28
+
29
+ UNIT_PREFIX_TERMS_REGEX = /\A(square|cubic)\b/i
30
+
31
+ INDEX_REGEX = /\^?([\d\.-]*)/
22
32
 
33
+ WORD_WITH_INDEX_REGEX = /([^\d\s.,\^]+)#{INDEX_REGEX}?/i
34
+
35
+ UNIT_SUFFIX_TERMS_REGEX = /\A(squared|cubed|to the \d+(#{ORDINAL_SUFFIXES_REGEX}) power)\b/i
36
+
37
+ QUANTITY_REGEX = /#{Unit::NUMBER_REGEX}(#{Quantify::Unit::WORD_WITH_INDEX_REGEX})/i
38
+
39
+
23
40
  class << self
24
41
  attr_reader :units
25
42
  end
@@ -221,6 +238,13 @@ module Quantify
221
238
  return nil
222
239
  end
223
240
 
241
+ def self.match(name_symbol_or_label)
242
+ return name_symbol_or_label.clone if name_symbol_or_label.is_a? Unit::Base
243
+ Unit.match_known_unit_or_prefixed_variant(:label, name_symbol_or_label) or
244
+ Unit.match_known_unit_or_prefixed_variant(:name, name_symbol_or_label) or
245
+ Unit.match_known_unit_or_prefixed_variant(:symbol, name_symbol_or_label)
246
+ end
247
+
224
248
  # Parse complex strings into unit.
225
249
  #
226
250
  def self.parse(string, options={})
@@ -230,21 +254,43 @@ module Quantify
230
254
  return units.first.unit if units.size == 1 && units.first.index == 1
231
255
  return Unit::Compound.new(*units)
232
256
  end
257
+
258
+ # This returns the suite of units which represents THE SI units for each of
259
+ # the base dimensions, i.e. metre, kilogram, second, etc. but not prefixed
260
+ # versions of the same unit
261
+ #
262
+ def self.base_quantity_si_units
263
+ @units.select {|unit| unit.is_base_quantity_si_unit? }
264
+ end
265
+
266
+ # This can be replicated by method missing approach, but explicit method provided
267
+ # given importance in #match (and #for) methods regexen
268
+ #
269
+ def self.non_prefixed_units
270
+ @units.select {|unit| !unit.is_prefixed_unit? }
271
+ end
233
272
 
234
- def self.match(name_symbol_or_label)
235
- return name_symbol_or_label.clone if name_symbol_or_label.is_a? Unit::Base
236
- Unit.match_known_unit_or_prefixed_variant(:label, name_symbol_or_label) or
237
- Unit.match_known_unit_or_prefixed_variant(:name, name_symbol_or_label) or
238
- Unit.match_known_unit_or_prefixed_variant(:symbol, name_symbol_or_label)
273
+ # This can be replicated by method missing approach, but explicit method provided
274
+ # given importance in #match (and #for) methods regexen
275
+ #
276
+ def self.si_non_prefixed_units
277
+ @units.select {|unit| unit.is_si_unit? && !unit.is_prefixed_unit? }
239
278
  end
240
279
 
280
+ # This can be replicated by method missing approach, but explicit method provided
281
+ # given importance in #match (and #for) methods regexen
282
+ #
283
+ def self.non_si_non_prefixed_units
284
+ @units.select {|unit| unit.is_non_si_unit? && !unit.is_prefixed_unit? }
285
+ end
286
+
241
287
  protected
242
-
288
+
243
289
  def self.match_known_unit_or_prefixed_variant(attribute, string_or_symbol)
244
290
  Unit.match_known_unit(attribute, string_or_symbol) or
245
291
  Unit.match_prefixed_variant(attribute, string_or_symbol)
246
292
  end
247
-
293
+
248
294
  def self.match_known_unit(attribute, string_or_symbol)
249
295
  string_or_symbol = Unit.format_unit_attribute(attribute, string_or_symbol)
250
296
  @units.find do |unit|
@@ -256,46 +302,52 @@ module Quantify
256
302
  end
257
303
  end.clone rescue nil
258
304
  end
259
-
305
+
260
306
  def self.match_prefixed_variant(attribute, string_or_symbol)
261
307
  string_or_symbol = Unit.format_unit_attribute(attribute, string_or_symbol)
262
- if string_or_symbol =~ /\A(#{units_for_regex(Unit::Prefix,:si_prefixes,attribute)})(#{units_for_regex(Unit,:si_non_prefixed_units,attribute)})\z/ ||
263
- string_or_symbol =~ /\A(#{units_for_regex(Unit::Prefix,:non_si_prefixes,attribute)})(#{units_for_regex(Unit,:non_si_non_prefixed_units,attribute)})\z/
308
+ if string_or_symbol =~ /\A(#{Unit.terms_for_regex(Unit::Prefix,:prefixes,attribute)})(#{Unit.terms_for_regex(Unit,:non_prefixed_units,attribute)})\z/
264
309
  return Unit.for($2).with_prefix($1).clone
265
310
  end
266
311
  return nil
267
312
  end
268
-
313
+
269
314
  def self.simple_parse(string)
270
- if string.scan(/(\/|per)/).size > 1
315
+ if string.scan(UNIT_DENOMINATOR_REGEX).size > 1
271
316
  raise Exceptions::InvalidArgumentError, "Malformed unit: multiple uses of '/' or 'per'"
272
317
  end
273
318
  units = []
274
- numerator, per, denominator = string.split(/(\/|per)/)
319
+ numerator, per, denominator = string.split(UNIT_DENOMINATOR_REGEX)
275
320
  units += Unit.parse_numerator_units(numerator)
276
321
  units += Unit.parse_denominator_units(denominator) unless denominator.nil?
277
322
  return units
278
323
  end
279
-
324
+
280
325
  def self.iterative_parse(string)
281
326
  units=[]
282
- current_set = "numerator_units"
283
- while unit = Unit.unit_label_regex.match(string) || unit = Unit.unit_symbol_regex.match(string) ||
284
- unit = Unit.unit_name_regex.match(string) || unit = Unit.unit_denominator_regex.match(string) do
285
- if unit[0] =~ Unit.unit_denominator_regex
286
- current_set = "denominator_units"
327
+ is_denominator = false
328
+ current_exponent = nil
329
+ while term = string.starts_with_valid_unit_term? do
330
+ if term =~ /^#{UNIT_PREFIX_TERMS_REGEX}$/
331
+ current_exponent = Unit.exponent_term_to_number(term)
332
+ elsif term =~ /^#{UNIT_SUFFIX_TERMS_REGEX}$/
333
+ units.last.index *= Unit.exponent_term_to_number(term)
334
+ elsif term =~ /^#{UNIT_DENOMINATOR_REGEX}/
335
+ is_denominator = true
287
336
  else
288
- units += Unit.send("parse_#{current_set}".to_sym, unit[0])
337
+ unit = Unit.send("parse_#{is_denominator ? 'denominator' : 'numerator'}_units".to_sym, term).first
338
+ unit.index *= current_exponent if current_exponent
339
+ units << unit
340
+ current_exponent = nil
289
341
  end
290
342
  # Remove matched pattern from string for next iteration
291
- match_length = unit[0].size
343
+ match_length = term.size
292
344
  string = string[match_length, string.length-match_length].strip
293
345
  end
294
346
  return units
295
347
  end
296
348
 
297
349
  def self.parse_unit_and_index(string)
298
- string.scan(/([^0-9\^]+)\^?([\d\.-]*)?/i)
350
+ string.scan(WORD_WITH_INDEX_REGEX)
299
351
  index = ($2.nil? || $2.empty? ? 1 : $2.to_i)
300
352
  unit = Unit.match($1.to_s)
301
353
  if unit.is_a? Compound
@@ -304,7 +356,7 @@ module Quantify
304
356
  return CompoundBaseUnit.new($1.to_s, index)
305
357
  end
306
358
  end
307
-
359
+
308
360
  def self.parse_numerator_units(string)
309
361
  # If no middot then names parsed by whitespace
310
362
  if string =~ /·/
@@ -316,14 +368,14 @@ module Quantify
316
368
  Unit.parse_unit_and_index(substring)
317
369
  end.flatten
318
370
  end
319
-
371
+
320
372
  def self.parse_denominator_units(string)
321
373
  Unit.parse_numerator_units(string).map do |unit|
322
374
  unit.index *= -1
323
375
  unit
324
376
  end
325
377
  end
326
-
378
+
327
379
  # standardize query strings or symbols into canonical form for unit names,
328
380
  # symbols and labels
329
381
  #
@@ -334,64 +386,24 @@ module Quantify
334
386
  else string_or_symbol.to_s
335
387
  end
336
388
  Unit.use_superscript_characters? ?
337
- string_or_symbol.with_superscript_characters : string_or_symbol.without_superscript_characters
389
+ string_or_symbol.with_superscript_characters : string_or_symbol.without_superscript_characters
338
390
  end
339
391
 
340
- # This returns the suite of units which represents THE SI units for each of
341
- # the base dimensions, i.e. metre, kilogram, second, etc. but not prefixed
342
- # versions of the same unit
343
- #
344
- def self.base_quantity_si_units
345
- @units.select {|unit| unit.is_base_quantity_si_unit? }
346
- end
347
-
348
- # This can be replicated by method missing approach, but explicit method provided
349
- # given importance in #match (and #for) methods regexen
350
- #
351
- def self.si_non_prefixed_units
352
- @units.select {|unit| unit.is_si_unit? && !unit.is_prefixed_unit? }
353
- end
354
-
355
- # This can be replicated by method missing approach, but explicit method provided
356
- # given importance in #match (and #for) methods regexen
357
- #
358
- def self.non_si_non_prefixed_units
359
- @units.select {|unit| unit.is_non_si_unit? && !unit.is_prefixed_unit? }
360
- end
361
-
362
392
  # Return a list of unit names which are multi-word
363
393
  def self.multi_word_unit_names
364
- @units.map {|unit| unit.name if unit.name.word_count > 1 }.compact
394
+ Unit.units.map {|unit| unit.name if unit.name.word_count > 1 }.compact
365
395
  end
366
-
396
+
367
397
  # Return a list of pluralised unit names which are multi-word
368
398
  def self.multi_word_unit_pluralized_names
369
399
  multi_word_unit_names.map {|name| name.pluralize }
370
400
  end
371
-
401
+
372
402
  # Return a list of unit symbols which are multi-word
373
403
  def self.multi_word_unit_symbols
374
- @units.map {|unit| unit.symbol if unit.symbol.word_count > 1 }.compact
375
- end
376
-
377
- # might want to try atomic groupings, but must get units in size order perhaps first
378
- def self.unit_label_regex
379
- /\A((#{Unit.units_for_regex(Unit::Prefix,:non_si_prefixes,:label)})?((#{Unit.units_for_regex(Unit,:non_si_non_prefixed_units,:label)})\b)|(#{Unit.units_for_regex(Unit::Prefix,:si_prefixes,:label)})?((#{Unit.units_for_regex(Unit,:si_non_prefixed_units,:label)})\b))(\^[\d\.-]*)?/
380
- end
381
-
382
- def self.unit_symbol_regex
383
- /\A((#{Unit.units_for_regex(Unit::Prefix,:si_prefixes,:symbol)})?((#{Unit.units_for_regex(Unit,:si_non_prefixed_units,:symbol)})\b)|(#{Unit.units_for_regex(Unit::Prefix,:non_si_prefixes,:symbol)})?((#{Unit.units_for_regex(Unit,:non_si_non_prefixed_units,:symbol)})\b))(\^[\d\.-]*)?/
404
+ Unit.units.map {|unit| unit.symbol if unit.symbol.word_count > 1 }.compact
384
405
  end
385
-
386
- def self.unit_name_regex
387
- # Specifically case insensitive
388
- /\A((#{Unit.units_for_regex(Unit::Prefix,:non_si_prefixes,:name)})?((#{Unit.units_for_regex(Unit,:non_si_non_prefixed_units,:pluralized_name)}|#{Unit.units_for_regex(Unit,:non_si_non_prefixed_units,:name)})\b)|(#{Unit.units_for_regex(Unit::Prefix,:si_prefixes,:name)})?((#{Unit.units_for_regex(Unit,:si_non_prefixed_units,:pluralized_name)}|#{Unit.units_for_regex(Unit,:si_non_prefixed_units,:name)})\b))(\^[\d\.-]*)?/i
389
- end
390
-
391
- def self.unit_denominator_regex
392
- /\A(\/|per)/i
393
- end
394
-
406
+
395
407
  # Underscore any parts of string which represent multi-word unit identifiers
396
408
  # so that units can be parsed on whitespace
397
409
  #
@@ -401,14 +413,34 @@ module Quantify
401
413
  end
402
414
  string
403
415
  end
404
-
416
+
417
+ def self.exponent_term_to_number(term)
418
+ return 2 if /square(d)?/i.match(term)
419
+ return 3 if /cub(ic|ed)/i.match(term)
420
+ end
421
+
405
422
  # Returns a list of "|" separated unit identifiers for use as regex
406
423
  # alternatives. Lists are constructed by calling
407
- def self.units_for_regex(klass,method,attribute)
424
+ def self.terms_for_regex(klass,method,attribute)
408
425
  list = klass.send(method).map { |item| item.send(attribute).gsub("/","\\/").gsub("^","\\^") }
409
426
  list.map! { |item| item.downcase } if attribute == :name
427
+ list.reject! { |item| item == "" }
410
428
  list.sort {|x, y| y.size <=> x.size }.join("|")
411
429
  end
412
-
430
+
431
+ def self.unit_label_regex
432
+ /(#{Unit.terms_for_regex(Unit::Prefix,:prefixes,:label)})??((#{Unit.terms_for_regex(Unit,:non_prefixed_units,:label)})\b)/
433
+ end
434
+
435
+ def self.unit_symbol_regex
436
+ /(#{Unit.terms_for_regex(Unit::Prefix,:prefixes,:symbol)})??((#{Unit.terms_for_regex(Unit,:non_prefixed_units,:symbol)})\b)/
437
+ end
438
+
439
+ def self.unit_name_regex
440
+ # Specifically case insensitive
441
+ # Double '?' (i.e. '??') makes prefix matching lazy, e.g. "centimetres of mercury" is matched fully rather than as 'centimetres'
442
+ /(#{Unit.terms_for_regex(Unit::Prefix,:prefixes,:name)})??((#{Unit.terms_for_regex(Unit,:non_prefixed_units,:pluralized_name)}|#{Unit.terms_for_regex(Unit,:non_prefixed_units,:name)})\b)/i
443
+ end
444
+
413
445
  end
414
446
  end
data/quantify.gemspec CHANGED
@@ -4,14 +4,14 @@
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
- s.name = %q{quantify}
8
- s.version = "3.0.0"
7
+ s.name = "quantify"
8
+ s.version = "3.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Andrew Berkeley"]
12
- s.date = %q{2011-11-08}
13
- s.description = %q{A gem to support physical quantities and unit conversions}
14
- s.email = %q{andrew.berkeley.is@googlemail.com}
12
+ s.date = "2011-12-21"
13
+ s.description = "A gem to support physical quantities and unit conversions"
14
+ s.email = "andrew.berkeley.is@googlemail.com"
15
15
  s.extra_rdoc_files = [
16
16
  "README"
17
17
  ]
@@ -30,7 +30,6 @@ Gem::Specification.new do |s|
30
30
  "lib/quantify/dimensions.rb",
31
31
  "lib/quantify/exception.rb",
32
32
  "lib/quantify/inflections.rb",
33
- "lib/quantify/parser.rb",
34
33
  "lib/quantify/quantify.rb",
35
34
  "lib/quantify/quantity.rb",
36
35
  "lib/quantify/unit/base_unit.rb",
@@ -47,16 +46,15 @@ Gem::Specification.new do |s|
47
46
  "quantify.gemspec",
48
47
  "spec/compound_unit_spec.rb",
49
48
  "spec/dimension_spec.rb",
50
- "spec/quantify_spec.rb",
51
49
  "spec/quantity_spec.rb",
52
50
  "spec/string_spec.rb",
53
51
  "spec/unit_spec.rb"
54
52
  ]
55
- s.homepage = %q{https://github.com/spatchcock/quantify}
53
+ s.homepage = "https://github.com/spatchcock/quantify"
56
54
  s.licenses = ["MIT"]
57
55
  s.require_paths = ["lib"]
58
- s.rubygems_version = %q{1.5.3}
59
- s.summary = %q{Support for handling physical quantities, unit conversions, etc}
56
+ s.rubygems_version = "1.8.10"
57
+ s.summary = "Support for handling physical quantities, unit conversions, etc"
60
58
 
61
59
  if s.respond_to? :specification_version then
62
60
  s.specification_version = 3
@@ -285,22 +285,7 @@ describe Unit do
285
285
 
286
286
  end
287
287
 
288
- describe "adding prefixes" do
289
-
290
- it "should have no valid prefixes with multiple base units" do
291
- (Unit.kg*Unit.m*Unit.m/Unit.s/Unit.s).valid_prefixes.should be_empty
292
- end
293
-
294
- it "should return SI prefixes with single SI unit" do
295
- prefixes = (Unit.kg**3).valid_prefixes
296
- prefixes.should_not be_empty
297
- prefixes.first.should be_a Unit::Prefix::SI
298
- end
299
-
300
- it "should return SI prefixes with single SI unit" do
301
- prefixes = (Unit.lb**3).valid_prefixes
302
- prefixes.should be_empty # no NonSI prefixes defined
303
- end
288
+ describe "adding prefixes" do
304
289
 
305
290
  it "should refuse to add prefix to multi-unit compound unit" do
306
291
  lambda{(Unit.kg*Unit.m*Unit.m/Unit.s/Unit.s).with_prefix(:giga)}.should raise_error
@@ -89,6 +89,16 @@ describe Quantity do
89
89
  quantities[1].unit.pluralized_name.should == 'kilograms per tonne kilometre'
90
90
  quantities[1].unit.symbol.should == 'kg/t km'
91
91
  end
92
+
93
+ it "should create a valid instance from complex string with compound per unit and no spaces" do
94
+ quantities = Quantity.parse "We sent some freight 6000 nautical miles by ship and the emissions rate was 10 kg/t km"
95
+ quantities.first.value.should == 6000
96
+ quantities.first.unit.name.should == 'nautical mile'
97
+ quantities.first.unit.symbol.should == 'nmi'
98
+ quantities[1].value.should == 10
99
+ quantities[1].unit.pluralized_name.should == 'kilograms per tonne kilometre'
100
+ quantities[1].unit.symbol.should == 'kg/t km'
101
+ end
92
102
 
93
103
  it "should create valid instances from complex string" do
94
104
  quantities = Quantity.parse "I travelled 220 miles driving my car and using 0.13 UK gallons per mile of diesel"
@@ -153,6 +163,34 @@ describe Quantity do
153
163
  quantities[1].unit.pluralized_name.should == 'square metres'
154
164
  quantities[1].unit.symbol.should == 'm²'
155
165
  end
166
+
167
+ it "should create valid instance from string with 'square' prefix descriptor" do
168
+ quantities = Quantity.parse "25 square feet"
169
+ quantities.first.value.should == 25
170
+ quantities.first.unit.name.should == 'square foot'
171
+ quantities.first.unit.symbol.should == 'ft²'
172
+ end
173
+
174
+ it "should create valid instance from string with 'cubic' prefix descriptor" do
175
+ quantities = Quantity.parse "25 cubic feet"
176
+ quantities.first.value.should == 25
177
+ quantities.first.unit.name.should == 'cubic foot'
178
+ quantities.first.unit.symbol.should == 'ft³'
179
+ end
180
+
181
+ it "should create valid instance from string with 'squared' suffix descriptor" do
182
+ quantities = Quantity.parse "25 feet squared"
183
+ quantities.first.value.should == 25
184
+ quantities.first.unit.name.should == 'square foot'
185
+ quantities.first.unit.symbol.should == 'ft²'
186
+ end
187
+
188
+ it "should create valid instance from string with 'cubed' suffix descriptor" do
189
+ quantities = Quantity.parse "25 feet cubed"
190
+ quantities.first.value.should == 25
191
+ quantities.first.unit.name.should == 'cubic foot'
192
+ quantities.first.unit.symbol.should == 'ft³'
193
+ end
156
194
 
157
195
  it "should create valid instances from complex string with no spaces" do
158
196
  quantities = Quantity.parse "I sprayed 500L of fertilizer across 6000m^2 of farmland"
data/spec/unit_spec.rb CHANGED
@@ -241,7 +241,7 @@ describe Unit do
241
241
  lambda{Unit.M}.should raise_error
242
242
 
243
243
  Unit.Gg.name.should eql 'gigagram'
244
- lambda{Unit.GG}.should raise_error
244
+ Unit.GG.name.should eql 'gigagauss'
245
245
  end
246
246
 
247
247
  it "should NOT ignore case when initialising units by label" do
@@ -319,10 +319,6 @@ describe Unit do
319
319
  unit.factor.should == 1000
320
320
  end
321
321
 
322
- it "dynamic unit retrieval with name and invalid prefix should throw error" do
323
- lambda{Unit.megafoot}.should raise_error
324
- end
325
-
326
322
  it "dynamic unit retrieval with symbol should be successful" do
327
323
  Unit.m.name.should == 'metre'
328
324
  Unit.ft.symbol.should == 'ft'
@@ -342,7 +338,6 @@ describe Unit do
342
338
 
343
339
  it "dynamic unit retrieval with symbol and invalid prefix should raise error" do
344
340
  lambda{Unit.MMm}.should raise_error
345
- lambda{Unit.Gft}.should raise_error
346
341
  lambda{Unit.centimetre.with_prefix :kilo}.should raise_error
347
342
  end
348
343
 
@@ -1060,12 +1055,12 @@ describe Unit do
1060
1055
  lambda{Unit.kilometre.with_prefix :giga}.should raise_error
1061
1056
  end
1062
1057
 
1063
- it "should add prefix with explcit method" do
1058
+ it "should add prefix with explicit method" do
1064
1059
  Unit.metre.with_prefix(:c).name.should == 'centimetre'
1065
- end
1060
+ end
1066
1061
 
1067
- it "trying to add invalid prefix should raise error" do
1068
- lambda{Unit.ft.with_prefix(:kilo)}.should raise_error
1062
+ it "should pluralise uncountable unit with prefix correctly" do
1063
+ Unit.siemens.with_prefix(:kilo).name.should == 'kilosiemens'
1069
1064
  end
1070
1065
 
1071
1066
  end
@@ -1075,6 +1070,7 @@ describe Unit do
1075
1070
  it "should represent the pound mole correctly" do
1076
1071
  unit = Unit.lbmol
1077
1072
  unit.name.should eql 'pound mole'
1073
+ unit.pluralized_name.should eql 'pound moles'
1078
1074
  Unit.ratio(Unit.mol,unit).value.should eql 453.59237
1079
1075
  unit.alternatives_by_name.should eql ['mole']
1080
1076
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quantify
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 3.0.0
10
+ version: 3.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andrew Berkeley
@@ -15,12 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-08 00:00:00 +00:00
19
- default_executable:
18
+ date: 2011-12-21 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- name: activesupport
23
- version_requirements: &id001 !ruby/object:Gem::Requirement
21
+ requirement: &id001 !ruby/object:Gem::Requirement
24
22
  none: false
25
23
  requirements:
26
24
  - - ~>
@@ -30,12 +28,12 @@ dependencies:
30
28
  - 3
31
29
  - 0
32
30
  version: "3.0"
31
+ version_requirements: *id001
32
+ name: activesupport
33
33
  prerelease: false
34
34
  type: :runtime
35
- requirement: *id001
36
35
  - !ruby/object:Gem::Dependency
37
- name: i18n
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
36
+ requirement: &id002 !ruby/object:Gem::Requirement
39
37
  none: false
40
38
  requirements:
41
39
  - - ">="
@@ -44,12 +42,12 @@ dependencies:
44
42
  segments:
45
43
  - 0
46
44
  version: "0"
45
+ version_requirements: *id002
46
+ name: i18n
47
47
  prerelease: false
48
48
  type: :runtime
49
- requirement: *id002
50
49
  - !ruby/object:Gem::Dependency
51
- name: bundler
52
- version_requirements: &id003 !ruby/object:Gem::Requirement
50
+ requirement: &id003 !ruby/object:Gem::Requirement
53
51
  none: false
54
52
  requirements:
55
53
  - - ~>
@@ -60,12 +58,12 @@ dependencies:
60
58
  - 0
61
59
  - 0
62
60
  version: 1.0.0
61
+ version_requirements: *id003
62
+ name: bundler
63
63
  prerelease: false
64
64
  type: :development
65
- requirement: *id003
66
65
  - !ruby/object:Gem::Dependency
67
- name: jeweler
68
- version_requirements: &id004 !ruby/object:Gem::Requirement
66
+ requirement: &id004 !ruby/object:Gem::Requirement
69
67
  none: false
70
68
  requirements:
71
69
  - - ~>
@@ -76,12 +74,12 @@ dependencies:
76
74
  - 6
77
75
  - 4
78
76
  version: 1.6.4
77
+ version_requirements: *id004
78
+ name: jeweler
79
79
  prerelease: false
80
80
  type: :development
81
- requirement: *id004
82
81
  - !ruby/object:Gem::Dependency
83
- name: rspec
84
- version_requirements: &id005 !ruby/object:Gem::Requirement
82
+ requirement: &id005 !ruby/object:Gem::Requirement
85
83
  none: false
86
84
  requirements:
87
85
  - - ~>
@@ -92,12 +90,12 @@ dependencies:
92
90
  - 6
93
91
  - 0
94
92
  version: 2.6.0
93
+ version_requirements: *id005
94
+ name: rspec
95
95
  prerelease: false
96
96
  type: :development
97
- requirement: *id005
98
97
  - !ruby/object:Gem::Dependency
99
- name: rcov
100
- version_requirements: &id006 !ruby/object:Gem::Requirement
98
+ requirement: &id006 !ruby/object:Gem::Requirement
101
99
  none: false
102
100
  requirements:
103
101
  - - ">="
@@ -106,12 +104,12 @@ dependencies:
106
104
  segments:
107
105
  - 0
108
106
  version: "0"
107
+ version_requirements: *id006
108
+ name: rcov
109
109
  prerelease: false
110
110
  type: :development
111
- requirement: *id006
112
111
  - !ruby/object:Gem::Dependency
113
- name: rdoc
114
- version_requirements: &id007 !ruby/object:Gem::Requirement
112
+ requirement: &id007 !ruby/object:Gem::Requirement
115
113
  none: false
116
114
  requirements:
117
115
  - - ">="
@@ -120,9 +118,10 @@ dependencies:
120
118
  segments:
121
119
  - 0
122
120
  version: "0"
121
+ version_requirements: *id007
122
+ name: rdoc
123
123
  prerelease: false
124
124
  type: :development
125
- requirement: *id007
126
125
  description: A gem to support physical quantities and unit conversions
127
126
  email: andrew.berkeley.is@googlemail.com
128
127
  executables: []
@@ -146,7 +145,6 @@ files:
146
145
  - lib/quantify/dimensions.rb
147
146
  - lib/quantify/exception.rb
148
147
  - lib/quantify/inflections.rb
149
- - lib/quantify/parser.rb
150
148
  - lib/quantify/quantify.rb
151
149
  - lib/quantify/quantity.rb
152
150
  - lib/quantify/unit/base_unit.rb
@@ -163,11 +161,9 @@ files:
163
161
  - quantify.gemspec
164
162
  - spec/compound_unit_spec.rb
165
163
  - spec/dimension_spec.rb
166
- - spec/quantify_spec.rb
167
164
  - spec/quantity_spec.rb
168
165
  - spec/string_spec.rb
169
166
  - spec/unit_spec.rb
170
- has_rdoc: true
171
167
  homepage: https://github.com/spatchcock/quantify
172
168
  licenses:
173
169
  - MIT
@@ -197,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
193
  requirements: []
198
194
 
199
195
  rubyforge_project:
200
- rubygems_version: 1.5.3
196
+ rubygems_version: 1.8.10
201
197
  signing_key:
202
198
  specification_version: 3
203
199
  summary: Support for handling physical quantities, unit conversions, etc
@@ -1,7 +0,0 @@
1
-
2
- module Quantify
3
- module Parser
4
-
5
-
6
- end
7
- end
@@ -1,6 +0,0 @@
1
- require 'quantify'
2
- include Quantify
3
-
4
- describe Quantify do
5
-
6
- end