quantify 1.1.0 → 1.2.0

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.
@@ -20,17 +20,132 @@ module Quantify
20
20
  # prefixes) at any time and either used in place or loaded into the known
21
21
  # system.
22
22
 
23
- # Make the @units instance array readable
24
23
  class << self
25
24
  attr_reader :units
25
+ #attr_reader :symbol_denominator_delimiter, :symbol_unit_delimiter
26
+ #attr_reader :use_symbol_parentheses, :use_symbol_denominator_syntax
26
27
  end
27
28
 
29
+ # Instance variable containing system of known units
30
+ @units = []
31
+
32
+ # Default configuration for unit symbols
33
+ #@use_symbol_denominator_syntax = true
34
+ #@use_symbol_parentheses = false
35
+ #@symbol_denominator_delimiter = "/"
36
+ #@symbol_unit_delimiter = " "
37
+
28
38
  def self.configure(&block)
29
39
  self.class_eval(&block) if block
30
40
  end
31
41
 
32
- # Instance variable containing system of known units
33
- @units = []
42
+ # Set the default string which is used to delimit numerator and denominator
43
+ # strings in compound unit symbol representations. Defaults to "/".
44
+ #
45
+ def self.symbol_denominator_delimiter=(string)
46
+ @symbol_denominator_delimiter = string
47
+ refresh_all_unit_attributes!
48
+ end
49
+
50
+ def self.symbol_denominator_delimiter
51
+ @symbol_denominator_delimiter ||= "/"
52
+ end
53
+
54
+ # Set the default string which is used to delimit unit symbol strings in
55
+ # compound unit symbol representations. Defaults to " ".
56
+ #
57
+ def self.symbol_unit_delimiter=(string)
58
+ @symbol_unit_delimiter = string
59
+ refresh_all_unit_attributes!
60
+ end
61
+
62
+ def self.symbol_unit_delimiter
63
+ @symbol_unit_delimiter ||= " "
64
+ end
65
+
66
+ # Specify whether parentheses should be used to group multiple units in
67
+ # compound unit symbol representations. Set either <tt>true</tt> (e.g.
68
+ # "kg/(t km)") or <tt>false</tt> (e.g. "kg/t km"). Defaults to <tt>false</tt>
69
+ #
70
+ def self.use_symbol_parentheses=(true_or_false)
71
+ @use_symbol_parentheses = true_or_false
72
+ refresh_all_unit_attributes!
73
+ end
74
+
75
+ # Shorthand bang! method for configuring parentheses in compound unit symbol
76
+ # representations
77
+ #
78
+ def self.use_symbol_parentheses!
79
+ @use_symbol_parentheses = true
80
+ end
81
+
82
+ # Returns <tt>true</tt> if parentheses are configured for use within compound
83
+ # unit symbol representations. Otherwise returns <tt>false</tt>.
84
+ #
85
+ def self.use_symbol_parentheses?
86
+ @use_symbol_parentheses.nil? ? false : @use_symbol_parentheses
87
+ end
88
+
89
+ # Shorthand bang! method for configuring denominator structures in compound
90
+ # unit symbol representations (e.g. "kg/t km")
91
+ #
92
+ def self.use_symbol_denominator_syntax!
93
+ self.use_symbol_denominator_syntax = true
94
+ end
95
+
96
+ # Shorthand bang! method for configuring index-only structures in compound
97
+ # unit symbol representations (e.g. "kg t^-1 km^-1")
98
+ #
99
+ def self.use_symbol_indices_only!
100
+ self.use_symbol_denominator_syntax = false
101
+ end
102
+
103
+ # Specify whether denominator structures should be used in compound unit
104
+ # symbol representations. Set either <tt>true</tt> (e.g. "kg/t km") or
105
+ # <tt>false</tt> (e.g. "kg t^-1 km^-1"). Defaults to <tt>true</tt>
106
+ #
107
+ def self.use_symbol_denominator_syntax=(true_or_false)
108
+ @use_symbol_denominator_syntax = true_or_false
109
+ refresh_all_unit_attributes!
110
+ end
111
+
112
+ # Returns <tt>true</tt> if denominator structures are configured for use
113
+ # within compound unit symbol representations. Otherwise returns
114
+ # <tt>false</tt>.
115
+ #
116
+ def self.use_symbol_denominator_syntax?
117
+ @use_symbol_denominator_syntax.nil? ? true : @use_symbol_denominator_syntax
118
+ end
119
+
120
+ # Check whether superscript characters are turned on.
121
+ def self.use_superscript_characters?
122
+ @use_superscript_characters.nil? ? true : @use_superscript_characters
123
+ end
124
+
125
+ # Shorthand method for ::use_superscript_characters=true
126
+ def self.use_superscript_characters!
127
+ self.use_superscript_characters = true
128
+ end
129
+
130
+ # Declare whether superscript characters should be used for unit names, symbols
131
+ # and labels - i.e. "²" and "³" rather than "^2" and "^3". Set to either true or
132
+ # false. If not set, superscript characters are used by default.
133
+ #
134
+ def self.use_superscript_characters=(true_or_false)
135
+ raise Exceptions::InvalidArgumentError,
136
+ "Argument must be true or false" unless true_or_false == true || true_or_false == false
137
+ @use_superscript_characters = true_or_false
138
+ refresh_all_unit_attributes!
139
+ end
140
+
141
+ # Switch all unit identifiers (name, symbol, label) to use the currently
142
+ # configured system for superscripts.
143
+ #
144
+ def self.refresh_all_unit_attributes!
145
+ Unit.units.replace(
146
+ Unit.units.map { |unit| unit.refresh_attributes; unit }
147
+ )
148
+ end
34
149
 
35
150
  # Load a new unit into they system of known units
36
151
  def self.load(unit)
@@ -168,7 +283,7 @@ module Quantify
168
283
  when :name then string_or_symbol.remove_underscores.singularize.downcase
169
284
  else string_or_symbol.to_s
170
285
  end
171
- Quantify.use_superscript_characters? ?
286
+ Unit.use_superscript_characters? ?
172
287
  string_or_symbol.with_superscript_characters : string_or_symbol.without_superscript_characters
173
288
  end
174
289
 
data/lib/quantify.rb CHANGED
@@ -22,6 +22,7 @@ require 'quantify/unit/unit'
22
22
  require 'quantify/unit/base_unit'
23
23
  require 'quantify/unit/si_unit'
24
24
  require 'quantify/unit/non_si_unit'
25
+ require 'quantify/unit/compound_base_unit_list'
25
26
  require 'quantify/unit/compound_base_unit'
26
27
  require 'quantify/unit/compound_unit'
27
28
  require 'quantify/quantity'
data/quantify.gemspec ADDED
@@ -0,0 +1,90 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{quantify}
8
+ s.version = "1.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Andrew Berkeley"]
12
+ s.date = %q{2011-08-04}
13
+ s.description = %q{A gem to support physical quantities and unit conversions}
14
+ s.email = %q{andrew.berkeley.is@googlemail.com}
15
+ s.extra_rdoc_files = [
16
+ "README"
17
+ ]
18
+ s.files = [
19
+ ".rvmrc",
20
+ "COPYING",
21
+ "Gemfile",
22
+ "README",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/quantify.rb",
26
+ "lib/quantify/config.rb",
27
+ "lib/quantify/core_extensions/numeric.rb",
28
+ "lib/quantify/core_extensions/string.rb",
29
+ "lib/quantify/core_extensions/symbol.rb",
30
+ "lib/quantify/dimensions.rb",
31
+ "lib/quantify/exception.rb",
32
+ "lib/quantify/inflections.rb",
33
+ "lib/quantify/quantify.rb",
34
+ "lib/quantify/quantity.rb",
35
+ "lib/quantify/unit/base_unit.rb",
36
+ "lib/quantify/unit/compound_base_unit.rb",
37
+ "lib/quantify/unit/compound_base_unit_list.rb",
38
+ "lib/quantify/unit/compound_unit.rb",
39
+ "lib/quantify/unit/non_si_unit.rb",
40
+ "lib/quantify/unit/prefix/base_prefix.rb",
41
+ "lib/quantify/unit/prefix/non_si_prefix.rb",
42
+ "lib/quantify/unit/prefix/prefix.rb",
43
+ "lib/quantify/unit/prefix/si_prefix.rb",
44
+ "lib/quantify/unit/si_unit.rb",
45
+ "lib/quantify/unit/unit.rb",
46
+ "quantify.gemspec",
47
+ "spec/compound_unit_spec.rb",
48
+ "spec/dimension_spec.rb",
49
+ "spec/quantify_spec.rb",
50
+ "spec/quantity_spec.rb",
51
+ "spec/string_spec.rb",
52
+ "spec/unit_spec.rb"
53
+ ]
54
+ s.homepage = %q{https://github.com/spatchcock/quantify}
55
+ s.licenses = ["MIT"]
56
+ s.require_paths = ["lib"]
57
+ s.rubygems_version = %q{1.6.0}
58
+ s.summary = %q{Support for handling physical quantities, unit conversions, etc}
59
+
60
+ if s.respond_to? :specification_version then
61
+ s.specification_version = 3
62
+
63
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
64
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
65
+ s.add_runtime_dependency(%q<i18n>, [">= 0"])
66
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
67
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
68
+ s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
69
+ s.add_development_dependency(%q<rcov>, [">= 0"])
70
+ s.add_development_dependency(%q<rspec_spinner>, ["= 1.1.3"])
71
+ else
72
+ s.add_dependency(%q<activesupport>, [">= 0"])
73
+ s.add_dependency(%q<i18n>, [">= 0"])
74
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
75
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
76
+ s.add_dependency(%q<rspec>, ["= 1.3.0"])
77
+ s.add_dependency(%q<rcov>, [">= 0"])
78
+ s.add_dependency(%q<rspec_spinner>, ["= 1.1.3"])
79
+ end
80
+ else
81
+ s.add_dependency(%q<activesupport>, [">= 0"])
82
+ s.add_dependency(%q<i18n>, [">= 0"])
83
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
84
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
85
+ s.add_dependency(%q<rspec>, ["= 1.3.0"])
86
+ s.add_dependency(%q<rcov>, [">= 0"])
87
+ s.add_dependency(%q<rspec_spinner>, ["= 1.1.3"])
88
+ end
89
+ end
90
+
@@ -3,6 +3,79 @@ include Quantify
3
3
 
4
4
  describe Unit do
5
5
 
6
+ describe "compound unit symbols" do
7
+
8
+ after :all do
9
+ Unit.use_symbol_denominator_syntax!
10
+ Unit.use_symbol_parentheses = false
11
+ end
12
+
13
+ it "should use denominator syntax by default" do
14
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
15
+ unit.symbol.should == "m² s kg/m³ s"
16
+ Unit.metre_per_second.symbol.should eql "m/s"
17
+ end
18
+
19
+ it "should use indices only with bang! method" do
20
+ Unit.use_symbol_indices_only!
21
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
22
+ unit.symbol.should == "m² s kg s^-1 m^-3"
23
+ Unit.metre_per_second.symbol.should eql "m s^-1"
24
+ end
25
+
26
+ it "should use denominator syntax with bang! method" do
27
+ Unit.use_symbol_denominator_syntax!
28
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
29
+ unit.symbol.should == "m² s kg/m³ s"
30
+ Unit.metre_per_second.symbol.should eql "m/s"
31
+ end
32
+
33
+ it "should use indices only with setter method" do
34
+ Unit.use_symbol_denominator_syntax = false
35
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
36
+ unit.symbol.should == "m² s kg s^-1 m^-3"
37
+ Unit.metre_per_second.symbol.should eql "m s^-1"
38
+ end
39
+
40
+ it "should use denominator syntax with setter method" do
41
+ Unit.use_symbol_denominator_syntax = true
42
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
43
+ unit.symbol.should == "m² s kg/m³ s"
44
+ Unit.metre_per_second.symbol.should eql "m/s"
45
+ end
46
+
47
+ it "should use parentheses with setter method" do
48
+ Unit.use_symbol_parentheses = true
49
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
50
+ unit.symbol.should == "(m² s kg)/(m³ s)"
51
+ unit = Unit.m*Unit.m/(Unit.m*Unit.m*Unit.m*Unit.s)
52
+ unit.symbol.should == "m²/(m³ s)"
53
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m)
54
+ unit.symbol.should == "(m² s kg)/m³"
55
+ end
56
+
57
+ it "should not use parentheses with setter method" do
58
+ Unit.use_symbol_parentheses = false
59
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
60
+ unit.symbol.should == "m² s kg/m³ s"
61
+ unit = Unit.m*Unit.m/(Unit.m*Unit.m*Unit.m*Unit.s)
62
+ unit.symbol.should == "m²/m³ s"
63
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m)
64
+ unit.symbol.should == "m² s kg/m³"
65
+ end
66
+
67
+ it "should use parentheses with bang! method" do
68
+ Unit.use_symbol_parentheses!
69
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
70
+ unit.symbol.should == "(m² s kg)/(m³ s)"
71
+ unit = Unit.m*Unit.m/(Unit.m*Unit.m*Unit.m*Unit.s)
72
+ unit.symbol.should == "m²/(m³ s)"
73
+ unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m)
74
+ unit.symbol.should == "(m² s kg)/m³"
75
+ end
76
+
77
+ end
78
+
6
79
  describe "compound unit naming algorithms" do
7
80
 
8
81
  it "should return pluralised unit name" do
@@ -56,7 +129,7 @@ describe Unit do
56
129
  describe "specific compound unit operations" do
57
130
 
58
131
  it "should find equivalent unit for compound unit" do
59
- (Unit.m*Unit.m).equivalent_known_unit.name.should == 'square metre'
132
+ (Unit.kg*Unit.m*Unit.m/Unit.s/Unit.s).equivalent_known_unit.name.should == 'joule'
60
133
  (Unit.km*Unit.lb).equivalent_known_unit.should == nil
61
134
  end
62
135
 
@@ -68,28 +141,28 @@ describe Unit do
68
141
 
69
142
  it "should consolidate across all base units" do
70
143
  unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
71
- unit.symbol.should == "m² s kg s^-1 m^-3"
144
+ unit.symbol.should == "m² s kg/m³ s"
72
145
  unit.base_units.size.should == 5
73
146
  unit.consolidate_base_units!
74
- unit.symbol.should == "kg m^-1"
147
+ unit.symbol.should == "kg/m"
75
148
  unit.base_units.size.should == 2
76
149
  end
77
150
 
78
151
  it "should cancel base units with one argument which is a symbol" do
79
152
  unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
80
- unit.symbol.should == "m² s kg s^-1 m^-3"
153
+ unit.symbol.should == "m² s kg/m³ s"
81
154
  unit.base_units.size.should == 5
82
155
  unit.cancel_base_units! :m
83
- unit.symbol.should == "s kg m^-1 s^-1"
156
+ unit.symbol.should == "s kg/m s"
84
157
  unit.base_units.size.should == 4
85
158
  end
86
159
 
87
160
  it "should cancel base units with multiple arguments including unit objects and strings" do
88
161
  unit = Unit.m*Unit.m*Unit.s*Unit.kg/(Unit.m*Unit.m*Unit.m*Unit.s)
89
- unit.symbol.should == "m² s kg s^-1 m^-3"
162
+ unit.symbol.should == "m² s kg/m³ s"
90
163
  unit.base_units.size.should == 5
91
164
  unit.cancel_base_units! Unit.m, 's'
92
- unit.symbol.should == "kg m^-1"
165
+ unit.symbol.should == "kg/m"
93
166
  unit.base_units.size.should == 2
94
167
  end
95
168
 
@@ -108,7 +181,7 @@ describe Unit do
108
181
  base1 = Unit::CompoundBaseUnit.new Unit.h, -1
109
182
  base2 = Unit::CompoundBaseUnit.new Unit.mi
110
183
  compound_unit = Unit::Compound.new base1, base2
111
- compound_unit.symbol.should == "mi h^-1"
184
+ compound_unit.symbol.should == "mi/h"
112
185
  end
113
186
 
114
187
  it "should initialize compound unit with multiple individual units" do
@@ -136,7 +209,7 @@ describe Unit do
136
209
  base1 = [Unit.h, -1]
137
210
  base2 = [Unit.m, 2]
138
211
  compound_unit = Unit::Compound.new base1, base2
139
- compound_unit.symbol.should == "m² h^-1"
212
+ compound_unit.symbol.should == "m²/h"
140
213
  end
141
214
 
142
215
  it "should initialize compound unit with variable arguments" do
@@ -189,17 +262,55 @@ describe Unit do
189
262
  unit = Unit.yard*Unit.foot
190
263
  unit.rationalize_base_units!.label.should eql 'yd²'
191
264
  unit = Unit.metre*Unit.centimetre/Unit.inch
192
- unit.rationalize_base_units!(:full).label.should eql 'm²/m'
265
+ unit.rationalize_base_units!.label.should eql 'm²/m'
193
266
  unit.consolidate_base_units!.label.should eql 'm'
194
267
  end
195
268
 
196
269
  it "should rationalize base units with specified unit" do
197
270
  unit = Unit.yard*Unit.foot
198
- unit.rationalize_base_units!(:partial,:yd).label.should eql 'yd²'
271
+ unit.rationalize_numerator_and_denominator_units!(:yd).label.should eql 'yd²'
199
272
  unit = Unit.metre*Unit.centimetre/Unit.inch
200
- unit.rationalize_base_units!(:full,:m).label.should eql 'm²/m'
201
- unit.consolidate_base_units!.label.should eql 'm'
273
+ unit.rationalize_base_units!(:cm).label.should eql 'cm²/cm'
274
+ unit.consolidate_base_units!.label.should eql 'cm'
275
+ end
276
+
277
+ it "should rationalize only numerator and denominator base units" do
278
+ unit = Unit.yard*Unit.foot
279
+ unit.rationalize_numerator_and_denominator_units!.label.should eql 'yd²'
280
+ unit = Unit.metre*Unit.centimetre/Unit.inch
281
+ unit.rationalize_numerator_and_denominator_units!.label.should eql 'm²/in'
282
+ unit.consolidate_base_units!.label.should eql 'm²/in'
202
283
  end
203
284
 
204
285
  end
286
+
287
+ describe "adding prefixes" do
288
+
289
+ it "should have no valid prefixes with multiple base units" do
290
+ (Unit.kg*Unit.m*Unit.m/Unit.s/Unit.s).valid_prefixes.should be_empty
291
+ end
292
+
293
+ it "should return SI prefixes with single SI unit" do
294
+ prefixes = (Unit.kg**3).valid_prefixes
295
+ prefixes.should_not be_empty
296
+ prefixes.first.should be_a Unit::Prefix::SI
297
+ end
298
+
299
+ it "should return SI prefixes with single SI unit" do
300
+ prefixes = (Unit.lb**3).valid_prefixes
301
+ prefixes.should be_empty # no NonSI prefixes defined
302
+ end
303
+
304
+ it "should refuse to add prefix to multi-unit compound unit" do
305
+ lambda{(Unit.kg*Unit.m*Unit.m/Unit.s/Unit.s).with_prefix(:giga)}.should raise_error
306
+ end
307
+
308
+ it "should prefix a single unit compound unit" do
309
+ unit = (Unit.m**2).with_prefix(:kilo)
310
+ unit.name.should eql "square kilometre"
311
+ unit.factor.should == 1000000
312
+ end
313
+
314
+
315
+ end
205
316
  end
@@ -3,18 +3,4 @@ include Quantify
3
3
 
4
4
  describe Quantify do
5
5
 
6
- it "should initialize superscript format" do
7
- Quantify.use_superscript_characters?.should be_true
8
- end
9
-
10
- it "should set superscript usage to true" do
11
- Quantify.use_superscript_characters=true
12
- Quantify.use_superscript_characters?.should be_true
13
- end
14
-
15
- it "should set superscript usage to false" do
16
- Quantify.use_superscript_characters=false
17
- Quantify.use_superscript_characters?.should be_false
18
- end
19
-
20
6
  end
@@ -154,7 +154,7 @@ describe Quantity do
154
154
  speed.class.should == Quantity
155
155
  speed.value.should be_close 27.1143792976291, 0.00000001
156
156
  speed.to_s(:name).should == "27.1143792976291 miles per hour"
157
- speed.to_s.should == "27.1143792976291 mi h^-1"
157
+ speed.to_s.should == "27.1143792976291 mi/h"
158
158
  end
159
159
 
160
160
  it "coerce method should handle inverted syntax" do
@@ -185,7 +185,7 @@ describe Quantity do
185
185
 
186
186
  it "should convert compound units correctly" do
187
187
  speed = Quantity.new 100, (Unit.km/Unit.h)
188
- speed.to_mi.round(2).to_s.should == "62.14 mi h^-1"
188
+ speed.to_mi.round(2).to_s.should == "62.14 mi/h"
189
189
  end
190
190
 
191
191
  it "should convert to SI unit correctly" do
@@ -224,9 +224,9 @@ describe Quantity do
224
224
  unit = 50.ft ** -1
225
225
  unit.to_s.should == "0.02 ft^-1"
226
226
  unit = (10.m/1.s)**2
227
- unit.to_s.should == "100.0 m² s^-2"
227
+ unit.to_s.should == "100.0 m²/s²"
228
228
  unit = (10.m/1.s)**-1
229
- unit.to_s.should == "0.1 s m^-1"
229
+ unit.to_s.should == "0.1 s/m"
230
230
  lambda{ ((10.m/1.s)** 0.5) }.should raise_error
231
231
  end
232
232
 
@@ -234,8 +234,8 @@ describe Quantity do
234
234
  (50.ft.pow! 2).to_s.should == "2500.0 ft²"
235
235
  (50.ft.pow! 3).to_s.should == "125000.0 ft³"
236
236
  (50.ft.pow! -1).to_s.should == "0.02 ft^-1"
237
- ((10.m/1.s).pow! 2).to_s.should == "100.0 m² s^-2"
238
- ((10.m/1.s).pow! -1).to_s.should == "0.1 s m^-1"
237
+ ((10.m/1.s).pow! 2).to_s.should == "100.0 m²/s²"
238
+ ((10.m/1.s).pow! -1).to_s.should == "0.1 s/m"
239
239
  lambda{ ((10.m/1.s).pow! 0.5) }.should raise_error
240
240
  end
241
241