ruby-measurement 1.2.0 → 1.2.1

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/.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