ruby-measurement 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,4 +1,10 @@
1
1
  language: ruby
2
+
2
3
  rvm:
3
4
  - 1.9.3
5
+ - 2.0.0
4
6
  - ruby-head
7
+
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: ruby-head
data/README.md CHANGED
@@ -162,6 +162,12 @@ that will be used when displaying a measurement.
162
162
  Measurement.parse('3 year') # => 3.0 yr
163
163
  Measurement.parse('3 years') # => 3.0 yr
164
164
 
165
+ ### List all units names defined
166
+
167
+ List all keys you can use as unit
168
+
169
+ Measurement.names # => ['count','doz','dozen',...]
170
+
165
171
  ## Contributing
166
172
 
167
173
  1. Fork it
@@ -82,24 +82,11 @@ class Measurement
82
82
  def self.parse(str = '0')
83
83
  str = str.strip
84
84
 
85
- if str =~ COMPLEX_REGEX
86
- real, imaginary, unit_name = str.scan(COMPLEX_REGEX).first
87
- quantity = Complex(real.to_f, imaginary.to_f).to_f
88
- elsif str =~ SCIENTIFIC_REGEX
89
- whole, unit_name = str.scan(SCIENTIFIC_REGEX).first
90
- quantity = whole.to_f
91
- elsif str =~ RATIONAL_REGEX
92
- whole, _, numerator, denominator, unit_name = str.scan(RATIONAL_REGEX).first
93
-
94
- if numerator && denominator
95
- numerator = numerator.to_f + (denominator.to_f * whole.to_f)
96
- denominator = denominator.to_f
97
- quantity = Rational(numerator, denominator).to_f
98
- else
99
- quantity = whole.to_f
100
- end
101
- else
102
- raise ArgumentError, "Unable to parse: '#{str}'"
85
+ case str
86
+ when COMPLEX_REGEX then unit_name, quantity = parse_complex(str)
87
+ when SCIENTIFIC_REGEX then unit_name, quantity = parse_scientific(str)
88
+ when RATIONAL_REGEX then unit_name, quantity = parse_rational(str)
89
+ else raise ArgumentError, "Unable to parse: '#{str}'"
103
90
  end
104
91
 
105
92
  unit_name ||= 'count'
@@ -115,6 +102,32 @@ class Measurement
115
102
 
116
103
  private
117
104
 
105
+ def self.parse_complex(str)
106
+ real, imaginary, unit_name = str.scan(COMPLEX_REGEX).first
107
+ quantity = Complex(real.to_f, imaginary.to_f).to_f
108
+ return unit_name, quantity
109
+ end
110
+
111
+ def self.parse_scientific(str)
112
+ whole, unit_name = str.scan(SCIENTIFIC_REGEX).first
113
+ quantity = whole.to_f
114
+ return unit_name, quantity
115
+ end
116
+
117
+ def self.parse_rational(str)
118
+ whole, _, numerator, denominator, unit_name = str.scan(RATIONAL_REGEX).first
119
+
120
+ if numerator && denominator
121
+ numerator = numerator.to_f + (denominator.to_f * whole.to_f)
122
+ denominator = denominator.to_f
123
+ quantity = Rational(numerator, denominator).to_f
124
+ else
125
+ quantity = whole.to_f
126
+ end
127
+
128
+ return unit_name, quantity
129
+ end
130
+
118
131
  define(:count) do |unit|
119
132
  unit.convert_to(:dozen) { |value| value / 12.0 }
120
133
  end
@@ -56,6 +56,10 @@ class Measurement
56
56
  @definitions[unit_name.to_s.downcase]
57
57
  end
58
58
 
59
+ def self.names
60
+ @definitions.keys
61
+ end
62
+
59
63
  private
60
64
 
61
65
  def self.[]=(unit_name, unit)
@@ -1,3 +1,3 @@
1
1
  class Measurement
2
- VERSION = '1.2.0'
2
+ VERSION = '1.2.1'
3
3
  end
@@ -117,4 +117,47 @@ describe Measurement::Unit do
117
117
  end
118
118
  end
119
119
  end
120
+
121
+ describe '.names' do
122
+ subject { Measurement::Unit }
123
+
124
+ it 'returns all defined unit names' do
125
+ unit_names = subject.names
126
+ unit_names.should be_kind_of Array
127
+ unit_names.should include 'count'
128
+ end
129
+ end
130
+
131
+ describe '.define' do
132
+ subject { Measurement::Unit }
133
+
134
+ it 'returns a unit builder' do
135
+ builder = subject.define(:count)
136
+ builder.should be_a Measurement::Unit::Builder
137
+ end
138
+
139
+ it 'accepts a block' do
140
+ builder = subject.define(:count) { |b| b.alias :ct }
141
+ builder.should be_a Measurement::Unit::Builder
142
+ end
143
+ end
144
+
145
+ describe '.[]' do
146
+ subject { Measurement::Unit }
147
+
148
+ describe 'for a unit name that is defined' do
149
+ it 'returns the unit' do
150
+ unit = subject[:dozen]
151
+ unit.should be_a Measurement::Unit
152
+ unit.name.should eq 'doz'
153
+ unit.aliases.should eq %w(doz dozen).to_set
154
+ end
155
+ end
156
+
157
+ describe 'for a unit name that is not defined' do
158
+ it 'returns nil' do
159
+ subject[:potato].should be_nil
160
+ end
161
+ end
162
+ end
120
163
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-measurement
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-16 00:00:00.000000000 Z
12
+ date: 2013-07-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &2160834380 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2160834380
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &2160833960 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,7 +37,12 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *2160833960
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  description: Simple gem for calculating and converting measurements
37
47
  email: matt.huggins@gmail.com
38
48
  executables: []
@@ -99,15 +109,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
109
  - - ! '>='
100
110
  - !ruby/object:Gem::Version
101
111
  version: '0'
112
+ segments:
113
+ - 0
114
+ hash: -4225981439654296545
102
115
  required_rubygems_version: !ruby/object:Gem::Requirement
103
116
  none: false
104
117
  requirements:
105
118
  - - ! '>='
106
119
  - !ruby/object:Gem::Version
107
120
  version: '0'
121
+ segments:
122
+ - 0
123
+ hash: -4225981439654296545
108
124
  requirements: []
109
125
  rubyforge_project:
110
- rubygems_version: 1.8.10
126
+ rubygems_version: 1.8.25
111
127
  signing_key:
112
128
  specification_version: 3
113
129
  summary: Simple gem for calculating and converting measurements