amee-data-abstraction 2.2.1 → 2.2.2

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.1
1
+ 2.2.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{amee-data-abstraction}
8
- s.version = "2.2.1"
8
+ s.version = "2.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["James Hetherington", "Andrew Berkeley", "James Smith", "George Palmer"]
12
- s.date = %q{2011-10-25}
12
+ s.date = %q{2011-11-03}
13
13
  s.description = %q{Part of the AMEEappkit this gem provides a data abstraction layer, decreasing the amount and detail of development required}
14
14
  s.email = %q{help@amee.com}
15
15
  s.extra_rdoc_files = [
@@ -73,7 +73,7 @@ Gem::Specification.new do |s|
73
73
  s.homepage = %q{http://github.com/AMEE/amee-data-abstraction}
74
74
  s.licenses = ["BSD 3-Clause"]
75
75
  s.require_paths = ["lib"]
76
- s.rubygems_version = %q{1.6.2}
76
+ s.rubygems_version = %q{1.5.3}
77
77
  s.summary = %q{Calculation and form building tool hiding details of AMEEconnect}
78
78
 
79
79
  if s.respond_to? :specification_version then
@@ -61,7 +61,7 @@ module AMEE
61
61
  # filename will be based upon the master file with the extension .lock.rb.
62
62
  #
63
63
  def self.regenerate_lock_file(name,output_path=nil)
64
- set = CalculationSet.find(name)
64
+ set = load_set(name, :lock => false)
65
65
  set.generate_lock_file(output_path)
66
66
  end
67
67
 
@@ -86,11 +86,15 @@ module AMEE
86
86
 
87
87
  protected
88
88
 
89
- # Load a calculation set based on a filename or full path.
90
- def self.load_set(name)
91
- CalculationSet.new(name,:file => name) do
92
- instance_eval(File.open(self.config_path).read)
89
+ # Load a calculation set based on a filename or full path. Set
90
+ # <tt>:lock => false</tt> to specify loading directly from master
91
+ # configuration file.
92
+ #
93
+ def self.load_set(name,options={})
94
+ set = CalculationSet.new(name,:file => name) do
95
+ instance_eval(File.open(self.config_path(options)).read)
93
96
  end
97
+ set
94
98
  end
95
99
 
96
100
  # Find the config file assocaited with <tt>name</tt>. The method first checks
@@ -177,10 +181,12 @@ module AMEE
177
181
 
178
182
  # Returns the path to the configuration file for <tt>self</tt>. If a .lock
179
183
  # file exists, this takes precedence, otherwise the master config file
180
- # described by the <tt>#file</tt> attribute is returned.
184
+ # described by the <tt>#file</tt> attribute is returned. This arrangement
185
+ # can be overridden by passing <tt>:lock => false</tt>
181
186
  #
182
- def config_path
183
- lock_file_exists? ? lock_file_path : @file
187
+ def config_path(options={})
188
+ options[:lock] = true unless options[:lock] == false
189
+ lock_file_exists? && options[:lock] ? lock_file_path : @file
184
190
  end
185
191
 
186
192
  # Returns the path to the configuration lock file
@@ -369,7 +369,11 @@ module AMEE
369
369
  # averaging, etc. Otherwise, returns <tt>false</tt>.
370
370
  #
371
371
  def has_numeric_value?
372
- set? and Float(value) rescue false
372
+ is_numeric? && set? && Float(value) rescue false
373
+ end
374
+
375
+ def is_numeric?
376
+ ![:string, :text, :datetime, :time, :date ].include?(type)
373
377
  end
374
378
 
375
379
  # Returns a pretty print string representation of <tt>self</tt>
@@ -424,23 +428,26 @@ module AMEE
424
428
  # my_term.convert_unit(:unit => <Quantify::Unit::SI ... >)
425
429
  #
426
430
  # If <tt>self</tt> does not hold a numeric value or either a unit or per
427
- # unit attribute, <tt.self</tt> is returned.
431
+ # unit attribute, <tt>self</tt> is returned.
428
432
  #
429
433
  def convert_unit(options={})
430
- return self unless has_numeric_value? and (unit or per_unit)
434
+ return self unless is_numeric? && (unit || per_unit)
435
+
431
436
  new = clone
432
- if options[:unit] and unit
433
- new_unit = Unit.for(options[:unit])
434
- Term.validate_dimensional_equivalence?(unit,new_unit)
435
- new.value Quantity.new(new.value,new.unit).to(new_unit).value
436
- new.unit options[:unit]
437
- end
438
- if options[:per_unit] and per_unit
439
- new_per_unit = Unit.for(options[:per_unit])
440
- Term.validate_dimensional_equivalence?(per_unit,new_per_unit)
441
- new.value Quantity.new(new.value,(1/new.per_unit)).to(Unit.for(new_per_unit)).value
442
- new.per_unit options[:per_unit]
437
+ if has_numeric_value?
438
+ if options[:unit] && unit
439
+ new_unit = Unit.for(options[:unit])
440
+ Term.validate_dimensional_equivalence?(unit,new_unit)
441
+ new.value Quantity.new(new.value,new.unit).to(new_unit).value
442
+ end
443
+ if options[:per_unit] && per_unit
444
+ new_per_unit = Unit.for(options[:per_unit])
445
+ Term.validate_dimensional_equivalence?(per_unit,new_per_unit)
446
+ new.value Quantity.new(new.value,(1/new.per_unit)).to(Unit.for(new_per_unit)).value
447
+ end
443
448
  end
449
+ new.unit options[:unit] if options[:unit]
450
+ new.per_unit options[:per_unit] if options[:per_unit]
444
451
  return new
445
452
  end
446
453
 
@@ -67,7 +67,8 @@ Quantify::Unit.configure do
67
67
  "BTU_FiftyNineF",
68
68
  "ton_us",
69
69
  "ton_uk",
70
- "d" ]
70
+ "d",
71
+ "lbmol"]
71
72
 
72
73
  uneeded_units = []
73
74
 
@@ -106,6 +106,30 @@ describe CalculationSet do
106
106
  set = CalculationSet.find('transport')
107
107
  end
108
108
 
109
+ it "should load set from master file" do
110
+ CalculationSet.load_set('transport')
111
+ CalculationSet.sets[:transport].should be_a CalculationSet
112
+ end
113
+
114
+ it "should use lock file if exists" do
115
+ set = CalculationSet.load_set('transport')
116
+ set.should be_a CalculationSet
117
+ set.generate_lock_file
118
+ set.lock_file_exists?.should be_true
119
+ set.file.should eql "#{Rails.root}/config/calculations/transport.rb"
120
+ set.config_path.should eql "#{Rails.root}/config/calculations/transport.lock.rb"
121
+ end
122
+
123
+ it "should use master config file if instructed" do
124
+ set = CalculationSet.load_set('transport')
125
+ set.should be_a CalculationSet
126
+ set.generate_lock_file
127
+ set.lock_file_exists?.should be_true
128
+ set.file.should eql "#{Rails.root}/config/calculations/transport.rb"
129
+ set.config_path.should eql "#{Rails.root}/config/calculations/transport.lock.rb"
130
+ set.config_path(:lock => false).should eql "#{Rails.root}/config/calculations/transport.rb"
131
+ end
132
+
109
133
  it "should generate set from file name using find method" do
110
134
  CalculationSet.sets[:transport].should be_nil
111
135
  set = CalculationSet.find('transport')
@@ -239,9 +239,17 @@ describe Term do
239
239
  Term.new {path :hello; value 12; default_unit :kg}.has_numeric_value?.should be_true
240
240
  end
241
241
 
242
+ it "string should be recognised as numeric if type not explicitly declared" do
243
+ Term.new {path :hello; value "12"; default_unit :kg}.has_numeric_value?.should be_true
244
+ end
245
+
242
246
  it "should be recognised as non numeric" do
243
247
  Term.new {path :hello; value 'bob'; default_unit :kg}.has_numeric_value?.should be_false
244
248
  end
249
+
250
+ it "string should be recognised as non numeric if type declared" do
251
+ Term.new {path :hello; value '12'; default_unit :kg; type :string}.has_numeric_value?.should be_false
252
+ end
245
253
 
246
254
  it "should convert the input to a String if the type is specified as such" do
247
255
  Term.new {type :string; value 54}.value.should == "54"
@@ -287,7 +295,7 @@ describe Term do
287
295
  end
288
296
 
289
297
  it "should return self if not a numeric unit" do
290
- @term = Term.new { value 'plane'; unit :kg }
298
+ @term = Term.new { value 'plane'; unit :kg; type :string }
291
299
  @term.unit.label.should eql 'kg'
292
300
  @term.value.should eql 'plane'
293
301
  new_term = @term.convert_unit(:unit => :t)
@@ -356,6 +364,68 @@ describe Term do
356
364
  new_term.value.should eql 1.2000
357
365
  end
358
366
 
367
+ it "should convert unit if value empty" do
368
+ @term = Term.new { unit :kg }
369
+ @term.unit.symbol.should eql 'kg'
370
+ @term.value.should eql nil
371
+ new_term = @term.convert_unit(:unit => :t)
372
+ new_term.unit.symbol.should eql 't'
373
+ new_term.value.should eql nil
374
+ end
375
+
376
+ it "should convert per unit if value empty" do
377
+ @term = Term.new { unit :kg; per_unit :min }
378
+ @term.unit.symbol.should eql 'kg'
379
+ @term.per_unit.symbol.should eql 'min'
380
+ @term.value.should eql nil
381
+ new_term = @term.convert_unit(:per_unit => :h)
382
+ new_term.unit.symbol.should eql 'kg'
383
+ new_term.per_unit.symbol.should eql 'h'
384
+ new_term.value.should eql nil
385
+ end
386
+
387
+ it "should convert unit and per unit if value empty" do
388
+ @term = Term.new { unit :kg; per_unit :min }
389
+ @term.unit.symbol.should eql 'kg'
390
+ @term.per_unit.symbol.should eql 'min'
391
+ @term.value.should eql nil
392
+ new_term = @term.convert_unit( :unit => :t, :per_unit => :h )
393
+ new_term.unit.symbol.should eql 't'
394
+ new_term.per_unit.symbol.should eql 'h'
395
+ new_term.value.should eql nil
396
+ end
397
+
398
+ it "should convert unit if value 0" do
399
+ @term = Term.new { value 0; unit :kg }
400
+ @term.unit.symbol.should eql 'kg'
401
+ @term.value.should eql 0
402
+ new_term = @term.convert_unit(:unit => :t)
403
+ new_term.unit.symbol.should eql 't'
404
+ new_term.value.should eql 0.0
405
+ end
406
+
407
+ it "should convert per unit if value 0" do
408
+ @term = Term.new { value 0; unit :kg; per_unit :min }
409
+ @term.unit.symbol.should eql 'kg'
410
+ @term.per_unit.symbol.should eql 'min'
411
+ @term.value.should eql 0
412
+ new_term = @term.convert_unit(:per_unit => :h)
413
+ new_term.unit.symbol.should eql 'kg'
414
+ new_term.per_unit.symbol.should eql 'h'
415
+ new_term.value.should eql 0.0
416
+ end
417
+
418
+ it "should convert unit and per unit if value 0" do
419
+ @term = Term.new { value 0; unit :kg; per_unit :min }
420
+ @term.unit.symbol.should eql 'kg'
421
+ @term.per_unit.symbol.should eql 'min'
422
+ @term.value.should eql 0
423
+ new_term = @term.convert_unit( :unit => :t, :per_unit => :h )
424
+ new_term.unit.symbol.should eql 't'
425
+ new_term.per_unit.symbol.should eql 'h'
426
+ new_term.value.should eql 0.0
427
+ end
428
+
359
429
  it "should raise error if trying to convert to non dimensionally equivalent unit" do
360
430
  @term = Term.new { value 20; unit :kg; per_unit :min }
361
431
  @term.unit.symbol.should eql 'kg'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amee-data-abstraction
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
8
  - 2
9
- - 1
10
- version: 2.2.1
9
+ - 2
10
+ version: 2.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - James Hetherington
@@ -18,13 +18,12 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-10-25 00:00:00 +01:00
21
+ date: 2011-11-03 00:00:00 +00:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
25
- prerelease: false
26
- type: :runtime
27
- requirement: &id001 !ruby/object:Gem::Requirement
25
+ name: amee
26
+ version_requirements: &id001 !ruby/object:Gem::Requirement
28
27
  none: false
29
28
  requirements:
30
29
  - - ~>
@@ -35,12 +34,12 @@ dependencies:
35
34
  - 1
36
35
  - 5
37
36
  version: 4.1.5
38
- name: amee
39
- version_requirements: *id001
40
- - !ruby/object:Gem::Dependency
41
37
  prerelease: false
42
38
  type: :runtime
43
- requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirement: *id001
40
+ - !ruby/object:Gem::Dependency
41
+ name: uuidtools
42
+ version_requirements: &id002 !ruby/object:Gem::Requirement
44
43
  none: false
45
44
  requirements:
46
45
  - - "="
@@ -51,12 +50,12 @@ dependencies:
51
50
  - 1
52
51
  - 2
53
52
  version: 2.1.2
54
- name: uuidtools
55
- version_requirements: *id002
56
- - !ruby/object:Gem::Dependency
57
53
  prerelease: false
58
54
  type: :runtime
59
- requirement: &id003 !ruby/object:Gem::Requirement
55
+ requirement: *id002
56
+ - !ruby/object:Gem::Dependency
57
+ name: quantify
58
+ version_requirements: &id003 !ruby/object:Gem::Requirement
60
59
  none: false
61
60
  requirements:
62
61
  - - ~>
@@ -67,12 +66,12 @@ dependencies:
67
66
  - 0
68
67
  - 0
69
68
  version: 2.0.0
70
- name: quantify
71
- version_requirements: *id003
72
- - !ruby/object:Gem::Dependency
73
69
  prerelease: false
74
- type: :development
75
- requirement: &id004 !ruby/object:Gem::Requirement
70
+ type: :runtime
71
+ requirement: *id003
72
+ - !ruby/object:Gem::Dependency
73
+ name: bundler
74
+ version_requirements: &id004 !ruby/object:Gem::Requirement
76
75
  none: false
77
76
  requirements:
78
77
  - - ~>
@@ -83,12 +82,12 @@ dependencies:
83
82
  - 0
84
83
  - 0
85
84
  version: 1.0.0
86
- name: bundler
87
- version_requirements: *id004
88
- - !ruby/object:Gem::Dependency
89
85
  prerelease: false
90
86
  type: :development
91
- requirement: &id005 !ruby/object:Gem::Requirement
87
+ requirement: *id004
88
+ - !ruby/object:Gem::Dependency
89
+ name: jeweler
90
+ version_requirements: &id005 !ruby/object:Gem::Requirement
92
91
  none: false
93
92
  requirements:
94
93
  - - ~>
@@ -99,12 +98,12 @@ dependencies:
99
98
  - 6
100
99
  - 4
101
100
  version: 1.6.4
102
- name: jeweler
103
- version_requirements: *id005
104
- - !ruby/object:Gem::Dependency
105
101
  prerelease: false
106
102
  type: :development
107
- requirement: &id006 !ruby/object:Gem::Requirement
103
+ requirement: *id005
104
+ - !ruby/object:Gem::Dependency
105
+ name: rspec
106
+ version_requirements: &id006 !ruby/object:Gem::Requirement
108
107
  none: false
109
108
  requirements:
110
109
  - - "="
@@ -115,12 +114,12 @@ dependencies:
115
114
  - 6
116
115
  - 0
117
116
  version: 2.6.0
118
- name: rspec
119
- version_requirements: *id006
120
- - !ruby/object:Gem::Dependency
121
117
  prerelease: false
122
118
  type: :development
123
- requirement: &id007 !ruby/object:Gem::Requirement
119
+ requirement: *id006
120
+ - !ruby/object:Gem::Dependency
121
+ name: flexmock
122
+ version_requirements: &id007 !ruby/object:Gem::Requirement
124
123
  none: false
125
124
  requirements:
126
125
  - - ">"
@@ -131,12 +130,12 @@ dependencies:
131
130
  - 8
132
131
  - 6
133
132
  version: 0.8.6
134
- name: flexmock
135
- version_requirements: *id007
136
- - !ruby/object:Gem::Dependency
137
133
  prerelease: false
138
134
  type: :development
139
- requirement: &id008 !ruby/object:Gem::Requirement
135
+ requirement: *id007
136
+ - !ruby/object:Gem::Dependency
137
+ name: rcov
138
+ version_requirements: &id008 !ruby/object:Gem::Requirement
140
139
  none: false
141
140
  requirements:
142
141
  - - ">="
@@ -145,12 +144,12 @@ dependencies:
145
144
  segments:
146
145
  - 0
147
146
  version: "0"
148
- name: rcov
149
- version_requirements: *id008
150
- - !ruby/object:Gem::Dependency
151
147
  prerelease: false
152
148
  type: :development
153
- requirement: &id009 !ruby/object:Gem::Requirement
149
+ requirement: *id008
150
+ - !ruby/object:Gem::Dependency
151
+ name: rdoc
152
+ version_requirements: &id009 !ruby/object:Gem::Requirement
154
153
  none: false
155
154
  requirements:
156
155
  - - ">="
@@ -159,8 +158,9 @@ dependencies:
159
158
  segments:
160
159
  - 0
161
160
  version: "0"
162
- name: rdoc
163
- version_requirements: *id009
161
+ prerelease: false
162
+ type: :development
163
+ requirement: *id009
164
164
  description: Part of the AMEEappkit this gem provides a data abstraction layer, decreasing the amount and detail of development required
165
165
  email: help@amee.com
166
166
  executables: []
@@ -253,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
253
  requirements: []
254
254
 
255
255
  rubyforge_project:
256
- rubygems_version: 1.6.2
256
+ rubygems_version: 1.5.3
257
257
  signing_key:
258
258
  specification_version: 3
259
259
  summary: Calculation and form building tool hiding details of AMEEconnect