farski-systeme 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +18 -1
- data/VERSION.yml +2 -2
- data/lib/systeme.rb +17 -1
- data/test/metric_test.rb +1 -1
- data/test/parse_test.rb +33 -0
- metadata +7 -5
data/README.rdoc
CHANGED
@@ -44,6 +44,23 @@ Conversions allow you to display or pass data in a unit other than the SI base.
|
|
44
44
|
=> 3.28083989501312
|
45
45
|
# 5280 was presumed to be in meters, if you were looking for a result of 1 you should do 5280.feet.in_miles
|
46
46
|
|
47
|
+
== Advanced Usage
|
48
|
+
|
49
|
+
One useful application of systeme is to take human readable input to produce usable and storable data
|
50
|
+
|
51
|
+
# How far did you walk today?
|
52
|
+
input = "6.25mi"
|
53
|
+
|
54
|
+
distance = input.to_f
|
55
|
+
unit = ((unit_data = input.match(/([a-zA-Z]+)/)) ? unit_data[1] : "m" )
|
56
|
+
|
57
|
+
si_distance = distance.send(unit)
|
58
|
+
=> 10058.4
|
59
|
+
|
60
|
+
== Parsing
|
61
|
+
|
62
|
+
The parse method provides very lax natural language parsing of dimensioned numbers in strings. It works much as one would expect, but two things to note: it will simply ignore any numbers associated with labels it doesn't understand, and it doesn't care if all the numbers in the string are of the same dimensionality. A string like "1 meter 1 centimeter" 1.01 and the string "1 meter 1 kilogram" will return 2.0. The same unit label can appear many times in a single string ("1m 1m 1m" => 3.0). If the parser finds a number with no label, it is technically being dimensioned as 'meter', which has no effect on the value.
|
63
|
+
|
47
64
|
= Installation
|
48
65
|
|
49
66
|
=== As a gem
|
@@ -54,7 +71,7 @@ The official distributions of this gem are available on RubyForge under the proj
|
|
54
71
|
|
55
72
|
$ gem install systeme
|
56
73
|
|
57
|
-
Development can be followed on GitHub at http://www.
|
74
|
+
Development can be followed on GitHub at http://www.github.com/farski/systeme
|
58
75
|
|
59
76
|
$ gem install farski-systeme
|
60
77
|
|
data/VERSION.yml
CHANGED
data/lib/systeme.rb
CHANGED
@@ -13,6 +13,22 @@ module Systeme
|
|
13
13
|
include Systeme::Imperial
|
14
14
|
include Systeme::Length
|
15
15
|
include Systeme::Conversions
|
16
|
+
|
17
|
+
def self.parse(string)
|
18
|
+
return nil if (!string || !string.match(/\d/))
|
19
|
+
|
20
|
+
string.gsub!(/ */, '').gsub!(/([a-zA-Z])(\d)/, '\1 \2')
|
21
|
+
parts = string.split(' ')
|
22
|
+
total = parts.inject(0) do |total, part|
|
23
|
+
value = part.to_f
|
24
|
+
label = ((l = part.match(/([a-zA-Z]+)/)) ? l[1] : "m")
|
25
|
+
total += (value.respond_to?(label) ? value.send(label) : 0)
|
26
|
+
end
|
27
|
+
|
28
|
+
return total
|
29
|
+
end
|
16
30
|
end
|
17
31
|
|
18
|
-
Numeric.send :include, Systeme
|
32
|
+
Numeric.send :include, Systeme
|
33
|
+
|
34
|
+
puts Systeme.parse('1m')
|
data/test/metric_test.rb
CHANGED
data/test/parse_test.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class ParseTest < Test::Unit::TestCase
|
4
|
+
should "parse a single base unit string" do
|
5
|
+
assert_equal 1, Systeme.parse('1m')
|
6
|
+
assert_equal 1, Systeme.parse('1 meter')
|
7
|
+
assert_equal 1, Systeme.parse('1 meters')
|
8
|
+
assert_equal 1, Systeme.parse('1 m')
|
9
|
+
end
|
10
|
+
|
11
|
+
should "parse a single non-base unit string" do
|
12
|
+
assert_equal 1000, Systeme.parse('1km')
|
13
|
+
assert_equal 1000, Systeme.parse('1 kilometer')
|
14
|
+
assert_equal 1000, Systeme.parse('1 kilometers')
|
15
|
+
assert_equal 1000, Systeme.parse('1 km')
|
16
|
+
end
|
17
|
+
|
18
|
+
should "parse a complex string" do
|
19
|
+
assert_equal 1001, Systeme.parse('1km 1m')
|
20
|
+
assert_equal 1001, Systeme.parse('1 km 1 m')
|
21
|
+
assert_equal 1001, Systeme.parse('1kilometer1meter')
|
22
|
+
assert_equal 1001, Systeme.parse('1 kilometer 1 meter')
|
23
|
+
end
|
24
|
+
|
25
|
+
should "parse a complex string with non-SI units" do
|
26
|
+
assert_equal 1609.344, Systeme.parse('1 mile')
|
27
|
+
assert_equal 1609.3694, Systeme.parse('1 mi 1in')
|
28
|
+
end
|
29
|
+
|
30
|
+
should "parse a complex string with units from different systems" do
|
31
|
+
assert_equal 1610.344, Systeme.parse('1 mile 1m')
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: farski-systeme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Kalafarski
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-02-25 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -36,12 +36,14 @@ files:
|
|
36
36
|
- test/imperial_test.rb
|
37
37
|
- test/international_test.rb
|
38
38
|
- test/metric_test.rb
|
39
|
+
- test/parse_test.rb
|
39
40
|
- test/test_helper.rb
|
40
|
-
has_rdoc:
|
41
|
+
has_rdoc: true
|
41
42
|
homepage: http://github.com/farski/systeme
|
42
43
|
post_install_message:
|
43
|
-
rdoc_options:
|
44
|
-
|
44
|
+
rdoc_options:
|
45
|
+
- --inline-source
|
46
|
+
- --charset=UTF-8
|
45
47
|
require_paths:
|
46
48
|
- lib
|
47
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|