alchemist 0.1.1 → 0.1.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/Rakefile +1 -1
- data/lib/alchemist.rb +81 -5
- metadata +2 -2
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ PKG_FILES = %w(Rakefile) +
|
|
6
6
|
|
7
7
|
gem_spec = Gem::Specification.new do |gem_spec|
|
8
8
|
gem_spec.name = 'alchemist'
|
9
|
-
gem_spec.version = '0.1.
|
9
|
+
gem_spec.version = '0.1.2'
|
10
10
|
gem_spec.summary = 'Conversions... like you\'ve never seen them before!'
|
11
11
|
gem_spec.description = 'Conversions... like you\'ve never seen them before!!'
|
12
12
|
gem_spec.email = 'matt@toastyapps.com'
|
data/lib/alchemist.rb
CHANGED
@@ -244,19 +244,20 @@ module Alchemist
|
|
244
244
|
},
|
245
245
|
:temperature => {
|
246
246
|
:kelvin => 1.0, :K => 1.0,
|
247
|
+
|
247
248
|
:celsius => [Proc.new{ |t| t + 273.15 }, Proc.new{ |t| t - 273.15 }], :centrigrade => [Proc.new{ |t| t + 273.15 }, Proc.new{ |t| t - 273.15 }],
|
248
249
|
:degree_celsius => [Proc.new{ |t| t + 273.15 }, Proc.new{ |t| t - 273.15 }], :degree_centrigrade => [Proc.new{ |t| t + 273.15 }, Proc.new{ |t| t - 273.15 }],
|
249
250
|
:degrees_celsius => [Proc.new{ |t| t + 273.15 }, Proc.new{ |t| t - 273.15 }], :degrees_centrigrade => [Proc.new{ |t| t + 273.15 }, Proc.new{ |t| t - 273.15 }],
|
250
|
-
:fahrenheit => [Proc.new{ |t| t * (5.0/9.0)
|
251
|
-
:degree_fahrenheit => [Proc.new{ |t| t * (5.0/9.0)
|
252
|
-
:degrees_fahrenheit => [Proc.new{ |t| t * (5.0/9.0)
|
251
|
+
:fahrenheit => [Proc.new{ |t| (t + 459.67) * (5.0/9.0) }, Proc.new{ |t| t * (9.0/5.0) - 459.67 }],
|
252
|
+
:degree_fahrenheit => [Proc.new{ |t| (t + 459.67) * (5.0/9.0) }, Proc.new{ |t| t * (9.0/5.0) - 459.67 }],
|
253
|
+
:degrees_fahrenheit => [Proc.new{ |t| (t + 459.67) * (5.0/9.0) }, Proc.new{ |t| t * (9.0/5.0) - 459.67 }],
|
253
254
|
:rankine => 1.8, :rankines => 1.8
|
254
255
|
},
|
255
256
|
:time => {
|
256
257
|
:second => 1.0, :seconds => 1.0, :s => 1.0,
|
257
258
|
:minute => 60.0, :minutes => 60.0, :min => 60.0,
|
258
259
|
:sidereal_minute => 5.983617, :sidereal_minutes => 5.983617,
|
259
|
-
:hour => 3600.0, :hours => 3600.0, :hr => 3600.0,
|
260
|
+
:hour => 3600.0, :hours => 3600.0, :hr => 3600.0, :h => 3600.0,
|
260
261
|
:sidereal_hour => 3.590170e+3, :sidereal_hours => 3.590170e+3,
|
261
262
|
:day => 86400.0, :days => 86400.0,
|
262
263
|
:sidereal_day => 8.616409e+4, :sidereal_days => 8.616409e+4,
|
@@ -343,9 +344,69 @@ module Alchemist
|
|
343
344
|
@@operator_actions
|
344
345
|
end
|
345
346
|
|
347
|
+
class CompoundNumericConversion
|
348
|
+
attr_accessor :numerators, :denominators
|
349
|
+
def initialize(numerator)
|
350
|
+
@coefficient = 1 #* numerator.to_f
|
351
|
+
@numerators = [numerator]
|
352
|
+
@denominators = []
|
353
|
+
end
|
354
|
+
def *(value)
|
355
|
+
case value
|
356
|
+
when Numeric
|
357
|
+
@coefficient *= value
|
358
|
+
self
|
359
|
+
when Alchemist::NumericConversion
|
360
|
+
@numerators << value
|
361
|
+
return consolidate
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
def consolidate
|
366
|
+
@numerators.each_with_index do |numerator, n|
|
367
|
+
@denominators.each_with_index do |denominator, d|
|
368
|
+
next if numerator.is_a?(Numeric)
|
369
|
+
next if denominator.is_a?(Numeric)
|
370
|
+
if (Conversions[numerator.unit_name] & Conversions[denominator.unit_name]).length > 0
|
371
|
+
value = numerator / denominator
|
372
|
+
@numerators.delete_at(n)
|
373
|
+
@denominators.delete_at(d)
|
374
|
+
@coefficient *= value
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
if @denominators.length == 0 && @numerators.length == 1
|
379
|
+
@numerators[0] * @coefficient
|
380
|
+
elsif @denominators.length == 0 && @numerators.length == 0
|
381
|
+
@coefficient
|
382
|
+
else
|
383
|
+
self
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
def to_s
|
388
|
+
|
389
|
+
end
|
390
|
+
|
391
|
+
def method_missing(method, *attrs, &block)
|
392
|
+
if Conversions[method]
|
393
|
+
@denominators << 1.send(method)
|
394
|
+
consolidate
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
346
399
|
class NumericConversion
|
347
400
|
include Comparable
|
348
401
|
|
402
|
+
def per
|
403
|
+
Alchemist::CompoundNumericConversion.new(self)
|
404
|
+
end
|
405
|
+
|
406
|
+
def p
|
407
|
+
per
|
408
|
+
end
|
409
|
+
|
349
410
|
def to(type = nil)
|
350
411
|
unless type
|
351
412
|
self
|
@@ -371,10 +432,18 @@ module Alchemist
|
|
371
432
|
@value.to_s
|
372
433
|
end
|
373
434
|
|
435
|
+
def value
|
436
|
+
@value
|
437
|
+
end
|
438
|
+
|
374
439
|
def to_f
|
375
440
|
@value
|
376
441
|
end
|
377
442
|
|
443
|
+
def ==(other)
|
444
|
+
self <=> other
|
445
|
+
end
|
446
|
+
|
378
447
|
def <=>(other)
|
379
448
|
(self.to_f * @exponent).to_f <=> other.to(@unit_name).to_f
|
380
449
|
end
|
@@ -409,7 +478,14 @@ module Alchemist
|
|
409
478
|
end
|
410
479
|
end
|
411
480
|
end
|
412
|
-
|
481
|
+
if unit_name == :*
|
482
|
+
if args[0].is_a?(Numeric)
|
483
|
+
@value *= args[0]
|
484
|
+
return self
|
485
|
+
else
|
486
|
+
raise Exception, "Incompatible Types"
|
487
|
+
end
|
488
|
+
end
|
413
489
|
if unit_name == :/ && args[0].is_a?(NumericConversion)
|
414
490
|
raise Exception, "Incompatible Types" unless (Conversions[@unit_name] & Conversions[args[0].unit_name]).length > 0
|
415
491
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Mongeau
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-01 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|