alchemist 0.1.2.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +6 -6
- data/lib/alchemist.rb +47 -42
- metadata +21 -44
data/Rakefile
CHANGED
@@ -6,12 +6,12 @@ task :default => [:test]
|
|
6
6
|
task :test => ['test:units']
|
7
7
|
|
8
8
|
namespace :test do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
Rake::TestTask.new(:units) do |test|
|
10
|
+
test.libs << 'test'
|
11
|
+
test.ruby_opts << '-rubygems'
|
12
|
+
test.pattern = 'test/*.rb'
|
13
|
+
test.verbose = true
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
17
|
eval("$specification = begin; #{IO.read('alchemist.gemspec')}; end")
|
data/lib/alchemist.rb
CHANGED
@@ -3,7 +3,7 @@ module Alchemist
|
|
3
3
|
class << self
|
4
4
|
attr_accessor :use_si
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
@@si_units = %w[m meter metre meters metres liter litre litres liters l L farad farads F coulombs C gray grays Gy siemen siemens S mhos mho ohm ohms volt volts V ]
|
8
8
|
@@si_units += %w[joule joules J newton newtons N lux lx henry henrys H b B bits bytes bit byte lumen lumens lm candela candelas cd]
|
9
9
|
@@si_units += %w[tesla teslas T gauss Gs G gram gramme grams grammes g watt watts W pascal pascals Pa]
|
@@ -29,7 +29,7 @@ module Alchemist
|
|
29
29
|
},
|
30
30
|
:area => {
|
31
31
|
:square_meter => 1.0, :square_meters => 1.0, :square_metre => 1.0, :square_metres => 1.0,
|
32
|
-
:acre => 4046.85642, :acres => 4046.85642,
|
32
|
+
:acre => 4046.85642, :acres => 4046.85642,
|
33
33
|
:are => 1.0e+2, :ares => 1.0e+2, :a => 1.0e+2,
|
34
34
|
:barn => 1.0e-28, :barns => 1.0e-28, :b => 1.0e-28,
|
35
35
|
:circular_mil => 5.067075e-10, :circular_mils => 5.067075e-10,
|
@@ -143,6 +143,11 @@ module Alchemist
|
|
143
143
|
#unusual measurements
|
144
144
|
:foe => 1e+44, :foes => 1e+44
|
145
145
|
},
|
146
|
+
:frequency => {
|
147
|
+
:hertz => 1.0, :hz => 1.0, :'Hz' => 1.0,
|
148
|
+
:revolutions_per_minute => 1/60.0, :rpm => 1/60.0,
|
149
|
+
:beats_per_minute => 1/60.0, :bpm => 1/60.0
|
150
|
+
},
|
146
151
|
:force => {
|
147
152
|
:newton => 1.0, :newtons => 1.0, :N => 1.0,
|
148
153
|
:dyne => 1.0e-5, :dynes => 1.0e-5, :dyn => 1.0e-5,
|
@@ -250,7 +255,7 @@ module Alchemist
|
|
250
255
|
},
|
251
256
|
:temperature => {
|
252
257
|
:kelvin => 1.0, :K => 1.0,
|
253
|
-
|
258
|
+
|
254
259
|
: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 }],
|
255
260
|
: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 }],
|
256
261
|
: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 }],
|
@@ -258,7 +263,7 @@ module Alchemist
|
|
258
263
|
:degree_fahrenheit => [Proc.new{ |t| (t + 459.67) * (5.0/9.0) }, Proc.new{ |t| t * (9.0/5.0) - 459.67 }],
|
259
264
|
:degrees_fahrenheit => [Proc.new{ |t| (t + 459.67) * (5.0/9.0) }, Proc.new{ |t| t * (9.0/5.0) - 459.67 }],
|
260
265
|
:rankine => 1.8, :rankines => 1.8
|
261
|
-
},
|
266
|
+
},
|
262
267
|
:time => {
|
263
268
|
:second => 1.0, :seconds => 1.0, :s => 1.0,
|
264
269
|
:minute => 60.0, :minutes => 60.0, :min => 60.0,
|
@@ -321,9 +326,9 @@ module Alchemist
|
|
321
326
|
:atto => 1e-18, :a => 1e-18,
|
322
327
|
:zepto => 1e-21, :z => 1e-21,
|
323
328
|
:yocto => 1e-24, :y => 1e-24,
|
324
|
-
|
329
|
+
|
325
330
|
# binary prefixes
|
326
|
-
|
331
|
+
|
327
332
|
:kibi => 2.0**10.0, :Ki => 2.0**10.0,
|
328
333
|
:mebi => 2.0**20.0, :Mi => 2.0**20.0,
|
329
334
|
:gibi => 2.0**30.0, :Gi => 2.0**30.0,
|
@@ -333,23 +338,23 @@ module Alchemist
|
|
333
338
|
:zebi => 2.0**70.0, :Zi => 2.0**70.0,
|
334
339
|
:yobi => 2.0**80.0, :Yi => 2.0**80.0
|
335
340
|
}
|
336
|
-
|
341
|
+
|
337
342
|
def from(unit_name)
|
338
343
|
send(unit_name)
|
339
344
|
end
|
340
|
-
|
345
|
+
|
341
346
|
def self.unit_prefixes
|
342
347
|
@@unit_prefixes
|
343
348
|
end
|
344
|
-
|
349
|
+
|
345
350
|
def self.conversion_table
|
346
351
|
@@conversion_table
|
347
352
|
end
|
348
|
-
|
353
|
+
|
349
354
|
def self.operator_actions
|
350
355
|
@@operator_actions
|
351
356
|
end
|
352
|
-
|
357
|
+
|
353
358
|
class CompoundNumericConversion
|
354
359
|
attr_accessor :numerators, :denominators
|
355
360
|
def initialize(numerator)
|
@@ -359,7 +364,7 @@ module Alchemist
|
|
359
364
|
end
|
360
365
|
def *(value)
|
361
366
|
case value
|
362
|
-
when Numeric
|
367
|
+
when Numeric
|
363
368
|
@coefficient *= value
|
364
369
|
self
|
365
370
|
when Alchemist::NumericConversion
|
@@ -367,7 +372,7 @@ module Alchemist
|
|
367
372
|
return consolidate
|
368
373
|
end
|
369
374
|
end
|
370
|
-
|
375
|
+
|
371
376
|
def consolidate
|
372
377
|
@numerators.each_with_index do |numerator, n|
|
373
378
|
@denominators.each_with_index do |denominator, d|
|
@@ -389,11 +394,11 @@ module Alchemist
|
|
389
394
|
self
|
390
395
|
end
|
391
396
|
end
|
392
|
-
|
397
|
+
|
393
398
|
def to_s
|
394
|
-
|
399
|
+
|
395
400
|
end
|
396
|
-
|
401
|
+
|
397
402
|
def method_missing(method, *attrs, &block)
|
398
403
|
if Conversions[method]
|
399
404
|
@denominators << 1.send(method)
|
@@ -401,27 +406,27 @@ module Alchemist
|
|
401
406
|
end
|
402
407
|
end
|
403
408
|
end
|
404
|
-
|
409
|
+
|
405
410
|
class NumericConversion
|
406
411
|
include Comparable
|
407
|
-
|
412
|
+
|
408
413
|
def per
|
409
414
|
Alchemist::CompoundNumericConversion.new(self)
|
410
415
|
end
|
411
|
-
|
416
|
+
|
412
417
|
def p
|
413
418
|
per
|
414
419
|
end
|
415
|
-
|
420
|
+
|
416
421
|
def to(type = nil)
|
417
422
|
unless type
|
418
|
-
self
|
423
|
+
self
|
419
424
|
else
|
420
425
|
send(type)
|
421
426
|
end
|
422
427
|
end
|
423
428
|
alias_method :as, :to
|
424
|
-
|
429
|
+
|
425
430
|
def base(unit_type)
|
426
431
|
if(Alchemist.conversion_table[unit_type][@unit_name].is_a?(Array))
|
427
432
|
@exponent * Alchemist.conversion_table[unit_type][@unit_name][0].call(@value)
|
@@ -429,41 +434,41 @@ module Alchemist
|
|
429
434
|
@exponent * @value * Alchemist.conversion_table[unit_type][@unit_name]
|
430
435
|
end
|
431
436
|
end
|
432
|
-
|
437
|
+
|
433
438
|
def unit_name
|
434
439
|
@unit_name
|
435
440
|
end
|
436
|
-
|
441
|
+
|
437
442
|
def to_s
|
438
443
|
@value.to_s
|
439
444
|
end
|
440
|
-
|
445
|
+
|
441
446
|
def value
|
442
447
|
@value
|
443
448
|
end
|
444
|
-
|
449
|
+
|
445
450
|
def to_f
|
446
451
|
@value
|
447
452
|
end
|
448
|
-
|
453
|
+
|
449
454
|
def ==(other)
|
450
|
-
self <=> other
|
455
|
+
(self <=> other) == 0
|
451
456
|
end
|
452
|
-
|
457
|
+
|
453
458
|
def <=>(other)
|
454
459
|
(self.to_f * @exponent).to_f <=> other.to(@unit_name).to_f
|
455
460
|
end
|
456
|
-
|
457
|
-
private
|
461
|
+
|
462
|
+
private
|
458
463
|
def initialize value, unit_name, exponent = 1.0
|
459
464
|
@value = value.to_f
|
460
465
|
@unit_name = unit_name
|
461
466
|
@exponent = exponent
|
462
467
|
end
|
463
|
-
|
468
|
+
|
464
469
|
def method_missing unit_name, *args, &block
|
465
470
|
exponent, unit_name = Alchemist.parse_prefix(unit_name)
|
466
|
-
if Conversions[ unit_name ]
|
471
|
+
if Conversions[ unit_name ]
|
467
472
|
types = Conversions[ @unit_name] & Conversions[ unit_name]
|
468
473
|
if types[0] # assume first type
|
469
474
|
if(Alchemist.conversion_table[types[0]][unit_name].is_a?(Array))
|
@@ -493,24 +498,24 @@ module Alchemist
|
|
493
498
|
end
|
494
499
|
end
|
495
500
|
if unit_name == :/ && args[0].is_a?(NumericConversion)
|
496
|
-
raise Exception, "Incompatible Types" unless (Conversions[@unit_name] & Conversions[args[0].unit_name]).length > 0
|
501
|
+
raise Exception, "Incompatible Types" unless (Conversions[@unit_name] & Conversions[args[0].unit_name]).length > 0
|
497
502
|
end
|
498
503
|
args.map!{|a| a.is_a?(NumericConversion) ? a.send(@unit_name).to_f / @exponent : a }
|
499
504
|
@value = @value.send( unit_name, *args, &block )
|
500
|
-
|
501
|
-
|
505
|
+
|
506
|
+
|
502
507
|
unit_name == :/ ? @value : self
|
503
508
|
end
|
504
509
|
end
|
505
510
|
end
|
506
|
-
|
511
|
+
|
507
512
|
Conversions = {}
|
508
513
|
def method_missing unit_name, *args, &block
|
509
514
|
exponent, unit_name = Alchemist.parse_prefix(unit_name)
|
510
515
|
Conversions[ unit_name ] || super( unit_name, *args, &block )
|
511
516
|
NumericConversion.new self, unit_name, exponent
|
512
517
|
end
|
513
|
-
|
518
|
+
|
514
519
|
def self.register(type, names, value)
|
515
520
|
names = [names] unless names.is_a?(Array)
|
516
521
|
value = value.is_a?(NumericConversion) ? value.base(type) : value
|
@@ -525,10 +530,10 @@ module Alchemist
|
|
525
530
|
@@operator_actions[operation] ||= []
|
526
531
|
@@operator_actions[operation] << [type, other_type, converted_type]
|
527
532
|
end
|
528
|
-
|
533
|
+
|
529
534
|
def self.parse_prefix(unit)
|
530
535
|
@@unit_prefixes.each do |prefix, value|
|
531
|
-
if unit.to_s =~ /^#{prefix}.+/ && @@si_units.include?(unit.to_s.gsub(/^#{prefix}/,''))
|
536
|
+
if unit.to_s =~ /^#{prefix}.+/ && @@si_units.include?(unit.to_s.gsub(/^#{prefix}/,''))
|
532
537
|
if !(Conversions[ unit.to_s.gsub(/^#{prefix}/,'').to_sym ] & [ :information_storage ]).empty? && !@use_si && value >= 1000.0 && value.to_i & -value.to_i != value
|
533
538
|
value = 2 ** (10 * (Math.log(value) / Math.log(10)) / 3)
|
534
539
|
end
|
@@ -537,7 +542,7 @@ module Alchemist
|
|
537
542
|
end
|
538
543
|
[1.0, unit]
|
539
544
|
end
|
540
|
-
|
545
|
+
|
541
546
|
@@conversion_table.each do |type, conversions|
|
542
547
|
conversions.each do |name, value|
|
543
548
|
Conversions[name] ||= []
|
@@ -550,4 +555,4 @@ class Numeric
|
|
550
555
|
include Alchemist
|
551
556
|
end
|
552
557
|
|
553
|
-
require 'alchemist/compound'
|
558
|
+
require 'alchemist/compound'
|
metadata
CHANGED
@@ -1,70 +1,47 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemist
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 2
|
10
|
-
- 1
|
11
|
-
version: 0.1.2.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
|
+
prerelease:
|
12
6
|
platform: ruby
|
13
|
-
authors:
|
7
|
+
authors:
|
14
8
|
- Matthew Mongeau
|
15
9
|
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
date: 2011-01-05 00:00:00 -05:00
|
20
|
-
default_executable:
|
12
|
+
date: 2012-05-25 00:00:00.000000000Z
|
21
13
|
dependencies: []
|
22
|
-
|
23
14
|
description: Conversions... like you've never seen them before!!
|
24
|
-
email:
|
15
|
+
email: halogenandtoast@gmail.com
|
25
16
|
executables: []
|
26
|
-
|
27
17
|
extensions: []
|
28
|
-
|
29
18
|
extra_rdoc_files: []
|
30
|
-
|
31
|
-
files:
|
19
|
+
files:
|
32
20
|
- Rakefile
|
33
21
|
- lib/alchemist/compound.rb
|
34
22
|
- lib/alchemist.rb
|
35
|
-
|
36
|
-
homepage: http://github.com/toastyapps/alchemist
|
23
|
+
homepage: http://github.com/halogenandtoast/alchemist
|
37
24
|
licenses: []
|
38
|
-
|
39
25
|
post_install_message:
|
40
26
|
rdoc_options: []
|
41
|
-
|
42
|
-
require_paths:
|
27
|
+
require_paths:
|
43
28
|
- lib
|
44
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
30
|
none: false
|
46
|
-
requirements:
|
47
|
-
- -
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
|
50
|
-
|
51
|
-
- 0
|
52
|
-
version: "0"
|
53
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
36
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
segments:
|
60
|
-
- 0
|
61
|
-
version: "0"
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
62
41
|
requirements: []
|
63
|
-
|
64
42
|
rubyforge_project:
|
65
|
-
rubygems_version: 1.
|
43
|
+
rubygems_version: 1.8.16
|
66
44
|
signing_key:
|
67
45
|
specification_version: 3
|
68
46
|
summary: Conversions... like you've never seen them before!
|
69
47
|
test_files: []
|
70
|
-
|