auom 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +2 -6
  4. data/.travis.yml +5 -2
  5. data/Changelog.md +5 -1
  6. data/Gemfile +0 -5
  7. data/README.md +17 -22
  8. data/TODO +1 -1
  9. data/auom.gemspec +14 -14
  10. data/circle.yml +3 -0
  11. data/config/flay.yml +1 -1
  12. data/config/flog.yml +1 -1
  13. data/config/reek.yml +2 -1
  14. data/config/rubocop.yml +130 -34
  15. data/lib/auom.rb +0 -2
  16. data/lib/auom/algebra.rb +5 -7
  17. data/lib/auom/equalization.rb +0 -2
  18. data/lib/auom/inspection.rb +26 -23
  19. data/lib/auom/relational.rb +2 -4
  20. data/lib/auom/unit.rb +15 -17
  21. data/spec/shared/incompatible_operation_behavior.rb +0 -2
  22. data/spec/shared/operation_behavior.rb +5 -4
  23. data/spec/shared/sunits_shared.rb +0 -2
  24. data/spec/spec_helper.rb +1 -4
  25. data/spec/unit/auom/algebra/add_spec.rb +12 -16
  26. data/spec/unit/auom/algebra/divide_spec.rb +50 -52
  27. data/spec/unit/auom/algebra/multiply_spec.rb +17 -21
  28. data/spec/unit/auom/algebra/substract_spec.rb +4 -8
  29. data/spec/unit/auom/equalization/equality_operator_spec.rb +3 -7
  30. data/spec/unit/auom/inspection/class_methods/prettify_unit_part_spec.rb +7 -7
  31. data/spec/unit/auom/inspection/inspect_spec.rb +1 -5
  32. data/spec/unit/auom/relational/greater_than_or_equal_to_predicate_spec.rb +0 -4
  33. data/spec/unit/auom/relational/greater_than_predicate_spec.rb +0 -4
  34. data/spec/unit/auom/relational/less_than_or_equal_to_predicate_spec.rb +0 -4
  35. data/spec/unit/auom/relational/less_than_predicate_spec.rb +0 -4
  36. data/spec/unit/auom/unit/assert_same_unit_spec.rb +2 -6
  37. data/spec/unit/auom/unit/class_methods/convert_spec.rb +0 -4
  38. data/spec/unit/auom/unit/class_methods/lookup_spec.rb +2 -6
  39. data/spec/unit/auom/unit/class_methods/new_spec.rb +16 -21
  40. data/spec/unit/auom/unit/class_methods/try_convert_spec.rb +0 -4
  41. data/spec/unit/auom/unit/class_methods/units_spec.rb +0 -4
  42. data/spec/unit/auom/unit/denominators_spec.rb +0 -4
  43. data/spec/unit/auom/unit/numerators_spec.rb +0 -4
  44. data/spec/unit/auom/unit/same_unit_predicate_spec.rb +1 -5
  45. data/spec/unit/auom/unit/scalar_spec.rb +0 -4
  46. data/spec/unit/auom/unit/unit_spec.rb +0 -4
  47. data/spec/unit/auom/unit/unitless_predicate_spec.rb +0 -4
  48. metadata +29 -22
  49. data/Gemfile.devtools +0 -71
  50. data/Guardfile +0 -8
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  module AUOM
4
2
  # Equalization for auom units
5
3
  module Equalization
@@ -1,8 +1,11 @@
1
- # encoding: UTF-8
2
-
3
1
  module AUOM
4
2
  # Inspection module for auom units
5
3
  module Inspection
4
+
5
+ INSPECT_FORMAT = '<%s @scalar=%s%s>'.freeze
6
+ SCALAR_FORMAT = '~%0.4f'.freeze
7
+ UNIT_FORMAT = ' %s/%s'.freeze
8
+
6
9
  # Return inspectable representation
7
10
  #
8
11
  # @return [String]
@@ -10,12 +13,24 @@ module AUOM
10
13
  # @api private
11
14
  #
12
15
  def inspect
13
- sprintf('<%s @scalar=%s%s>', self.class, pretty_scalar, pretty_unit)
16
+ format(INSPECT_FORMAT, self.class, pretty_scalar, pretty_unit)
17
+ end
18
+
19
+ # Return prettified units
20
+ #
21
+ # @param [Array] base
22
+ #
23
+ # @return [String]
24
+ #
25
+ # @api private
26
+ #
27
+ def self.prettify_unit_part(base)
28
+ counts(base).map { |unit, length| length > 1 ? "#{unit}^#{length}" : unit }.join('*')
14
29
  end
15
30
 
16
31
  private
17
32
 
18
- # Return prettyfied scalar
33
+ # Return prettified scalar
19
34
  #
20
35
  # @return [String]
21
36
  #
@@ -23,13 +38,13 @@ module AUOM
23
38
  #
24
39
  def pretty_scalar
25
40
  if reminder?
26
- sprintf('~%0.4f', scalar)
41
+ format(SCALAR_FORMAT, scalar)
27
42
  else
28
- scalar.to_i
43
+ scalar.to_int
29
44
  end
30
45
  end
31
46
 
32
- # Return prettyfied unit part
47
+ # Return prettified unit part
33
48
  #
34
49
  # @return [String]
35
50
  # if there is a prettifiable unit part
@@ -42,15 +57,15 @@ module AUOM
42
57
  def pretty_unit
43
58
  return if unitless?
44
59
 
45
- numerator = Inspection.prettify_unit_part(@numerators)
46
- denominator = Inspection.prettify_unit_part(@denominators)
60
+ numerator = Inspection.prettify_unit_part(numerators)
61
+ denominator = Inspection.prettify_unit_part(denominators)
47
62
 
48
63
  numerator = '1' if numerator.empty?
49
64
  if denominator.empty?
50
65
  return " #{numerator}"
51
66
  end
52
67
 
53
- sprintf(' %s/%s', numerator, denominator)
68
+ format(UNIT_FORMAT, numerator, denominator)
54
69
  end
55
70
 
56
71
  # Test if scalar has and reminder in decimal representation
@@ -67,18 +82,6 @@ module AUOM
67
82
  !(scalar % scalar.denominator).zero?
68
83
  end
69
84
 
70
- # Return prettified units
71
- #
72
- # @param [Array] base
73
- #
74
- # @return [String]
75
- #
76
- # @api private
77
- #
78
- def self.prettify_unit_part(base)
79
- counts(base).map { |unit, length| length > 1 ? "#{unit}^#{length}" : unit }.join('*')
80
- end
81
-
82
85
  # Return unit counts
83
86
  #
84
87
  # @param [Array] base
@@ -91,7 +94,7 @@ module AUOM
91
94
  counts = base.each_with_object(Hash.new(0)) { |unit, hash| hash[unit] += 1 }
92
95
  counts.sort do |left, right|
93
96
  result = right.last <=> left.last
94
- if result == 0
97
+ if result.equal?(0)
95
98
  left.first <=> right.first
96
99
  else
97
100
  result
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  module AUOM
4
2
  # Mixin to add relational operators
5
3
  module Relational
@@ -21,7 +19,7 @@ module AUOM
21
19
  end
22
20
  alias_method :<=, :less_than_or_equal_to?
23
21
 
24
- # Test if unit is greater than or equal toother
22
+ # Test if unit is greater than or equal to other
25
23
  #
26
24
  # @param [Unit] other
27
25
  #
@@ -74,7 +72,7 @@ module AUOM
74
72
 
75
73
  private
76
74
 
77
- # Peform relational operation
75
+ # Perform relational operation
78
76
  #
79
77
  # @param [Unit] other
80
78
  # @param [Symbol] operation
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  module AUOM
4
2
  # A scalar with units
5
3
  class Unit
@@ -43,7 +41,7 @@ module AUOM
43
41
  #
44
42
  # include AUOM
45
43
  # m = Unit.new(1, :meter)
46
- # m.denoninators # => []
44
+ # m.denominators # => []
47
45
  #
48
46
  # @return [Rational]
49
47
  #
@@ -78,7 +76,7 @@ module AUOM
78
76
  kilometer: [1000, :meter]
79
77
  }.freeze
80
78
 
81
- # Return buildin units symbols
79
+ # Return built-in units symbols
82
80
  #
83
81
  # @return [Hash]
84
82
  #
@@ -115,7 +113,7 @@ module AUOM
115
113
  # if units are the same
116
114
  #
117
115
  # @return [false]
118
- # otehrwise
116
+ # otherwise
119
117
  #
120
118
  # @example
121
119
  #
@@ -132,7 +130,7 @@ module AUOM
132
130
  other.unit.eql?(unit)
133
131
  end
134
132
 
135
- # Instancitate a new unit
133
+ # Instantiate a new unit
136
134
  #
137
135
  # @param [Rational] scalar
138
136
  # @param [Enumerable] numerators
@@ -161,7 +159,7 @@ module AUOM
161
159
  # # A complex unit
162
160
  # u = Unit.new(Rational(1, 3), :euro, :meter)
163
161
  # u.fractions? # => true
164
- # u.sclar # => Rational(1, 3)
162
+ # u.scalar # => Rational(1, 3)
165
163
  # u.inspect # => <AUOM::Unit @scalar=~0.3333 euro/meter>
166
164
  # u.unit # => [[:euro], [:meter]]
167
165
  #
@@ -189,7 +187,7 @@ module AUOM
189
187
  #
190
188
  def assert_same_unit(other)
191
189
  unless same_unit?(other)
192
- raise ArgumentError, 'Incompatible units'
190
+ fail ArgumentError, 'Incompatible units'
193
191
  end
194
192
 
195
193
  self
@@ -209,7 +207,7 @@ module AUOM
209
207
  def self.convert(operand)
210
208
  converted = try_convert(operand)
211
209
  unless converted
212
- raise ArgumentError, "Cannot convert #{operand.inspect} to #{self}"
210
+ fail ArgumentError, "Cannot convert #{operand.inspect} to #{self}"
213
211
  end
214
212
  converted
215
213
  end
@@ -230,7 +228,7 @@ module AUOM
230
228
  case operand
231
229
  when self
232
230
  operand
233
- when Fixnum, Rational
231
+ when Integer, Rational
234
232
  new(operand)
235
233
  end
236
234
  end
@@ -252,18 +250,18 @@ module AUOM
252
250
  left.delete_if { |item| right.delete_at(right.index(item) || right.length) }
253
251
  end
254
252
 
255
- @numerators = numerators.freeze
253
+ @numerators = numerators.freeze
256
254
  @denominators = denominators.freeze
257
255
 
258
- @unit = [@numerators, @denominators].freeze
259
- @scalar.freeze
256
+ @unit = [numerators, denominators].freeze
257
+ scalar.freeze
260
258
  end
261
259
 
262
260
  # Return rational converted from value
263
261
  #
264
262
  # @param [Object] value
265
263
  #
266
- # @return [Rationa]
264
+ # @return [Rational]
267
265
  #
268
266
  # @raise [ArgumentError]
269
267
  # raises argument error when cannot be converted to a rational
@@ -274,10 +272,10 @@ module AUOM
274
272
  case value
275
273
  when Rational
276
274
  value
277
- when Fixnum
275
+ when Integer
278
276
  Rational(value)
279
277
  else
280
- raise ArgumentError, "#{value.inspect} cannot be converted to rational"
278
+ fail ArgumentError, "#{value.inspect} cannot be converted to rational"
281
279
  end
282
280
  end
283
281
 
@@ -314,7 +312,7 @@ module AUOM
314
312
  #
315
313
  def self.lookup(value)
316
314
  units.fetch(value) do
317
- raise ArgumentError, "Unknown unit #{value.inspect}"
315
+ fail ArgumentError, "Unknown unit #{value.inspect}"
318
316
  end
319
317
  end
320
318
 
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  shared_examples_for 'an incompatible operation' do
4
2
  it 'should raise ArgumentError' do
5
3
  expect { subject }.to raise_error(ArgumentError, 'Incompatible units')
@@ -1,13 +1,14 @@
1
- # encoding: UTF-8
2
-
3
1
  shared_examples_for 'an operation' do
4
2
  it 'returns a new object' do
5
- object.should_not equal(subject)
3
+ expect(object).to_not equal(subject)
6
4
  end
7
5
 
8
6
  it 'is idempotent on equivalency' do
9
7
  first = subject
10
- __memoized.delete(:subject)
8
+ fail unless RSpec.configuration.threadsafe?
9
+ mutex = __memoized.instance_variable_get(:@mutex)
10
+ memoized = __memoized.instance_variable_get(:@memoized)
11
+ mutex.synchronize { memoized.delete(:subject) }
11
12
  should eql(first)
12
13
  end
13
14
 
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  shared_examples_for 'unitless unit' do
4
2
  its(:numerators) { should == [] }
5
3
  its(:denominators) { should == [] }
@@ -1,5 +1,2 @@
1
- # encoding: UTF-8
2
-
3
1
  require 'auom'
4
- require 'devtools'
5
- Devtools.init_spec_helper
2
+ require 'devtools/spec_helper'
@@ -1,7 +1,3 @@
1
- # encoding: UTF-8
2
-
3
- require 'spec_helper'
4
-
5
1
  describe AUOM::Algebra, '#add' do
6
2
  subject { object.add(operand) }
7
3
 
@@ -10,22 +6,22 @@ describe AUOM::Algebra, '#add' do
10
6
  context 'when unit is unitless' do
11
7
  let(:arguments) { [1] }
12
8
 
13
- context 'and operand is a Fixnum' do
14
- let(:operand) { 1 }
9
+ context 'and operand is an Integer' do
10
+ let(:operand) { 2 }
15
11
 
16
12
  it_should_behave_like 'an operation'
17
13
 
18
- it { should eql(AUOM::Unit.new(2)) }
14
+ it { should eql(AUOM::Unit.new(3)) }
19
15
  end
20
16
 
21
17
  context 'and operand is a unitless unit' do
22
- let(:operand) { AUOM::Unit.new(1) }
18
+ let(:operand) { AUOM::Unit.new(2) }
23
19
 
24
- it { should eql(AUOM::Unit.new(2)) }
20
+ it { should eql(AUOM::Unit.new(3)) }
25
21
  end
26
22
 
27
23
  context 'and operand is a unitful unit' do
28
- let(:operand) { AUOM::Unit.new(1, :meter) }
24
+ let(:operand) { AUOM::Unit.new(2, :meter) }
29
25
 
30
26
  it_should_behave_like 'an incompatible operation'
31
27
  end
@@ -34,28 +30,28 @@ describe AUOM::Algebra, '#add' do
34
30
  context 'when unit is unitful' do
35
31
  let(:arguments) { [1, :meter, :euro] }
36
32
 
37
- context 'and operand is a Fixnum' do
38
- let(:operand) { 1 }
33
+ context 'and operand is an Integer' do
34
+ let(:operand) { 2 }
39
35
 
40
36
  it_should_behave_like 'an incompatible operation'
41
37
  end
42
38
 
43
39
  context 'and operand is a unitless unit' do
44
- let(:operand) { AUOM::Unit.new(1) }
40
+ let(:operand) { AUOM::Unit.new(2) }
45
41
 
46
42
  it_should_behave_like 'an incompatible operation'
47
43
  end
48
44
 
49
45
  context 'and operand is a incompatible unit' do
50
- let(:operand) { AUOM::Unit.new(1, :euro) }
46
+ let(:operand) { AUOM::Unit.new(2, :euro) }
51
47
 
52
48
  it_should_behave_like 'an incompatible operation'
53
49
  end
54
50
 
55
51
  context 'and operand is a compatible unit' do
56
- let(:operand) { AUOM::Unit.new(1, :meter, :euro) }
52
+ let(:operand) { AUOM::Unit.new(2, :meter, :euro) }
57
53
 
58
- it { should eql(AUOM::Unit.new(2, :meter, :euro)) }
54
+ it { should eql(AUOM::Unit.new(3, :meter, :euro)) }
59
55
  end
60
56
  end
61
57
  end
@@ -1,85 +1,83 @@
1
- # encoding: UTF-8
1
+ describe AUOM::Algebra do
2
+ describe '#divide' do
3
+ subject { object.divide(operand) }
2
4
 
3
- require 'spec_helper'
5
+ let(:object) { AUOM::Unit.new(*arguments) }
4
6
 
5
- describe AUOM::Algebra, '#divide' do
6
- subject { object.divide(operand) }
7
+ context 'with unitless unit' do
8
+ let(:arguments) { [4] }
7
9
 
8
- let(:object) { AUOM::Unit.new(*arguments) }
10
+ context 'when operand is a fixnum' do
11
+ let(:operand) { 2 }
9
12
 
10
- context 'with unitless unit' do
11
- let(:arguments) { [4] }
12
-
13
- context 'when operand is a fixnum' do
14
- let(:operand) { 2 }
15
-
16
- it_should_behave_like 'an operation'
13
+ it_should_behave_like 'an operation'
17
14
 
18
- it { should eql(AUOM::Unit.new(2)) }
19
- end
15
+ it { should eql(AUOM::Unit.new(2)) }
16
+ end
20
17
 
21
- context 'when operand is a unitless unit' do
22
- let(:operand) { AUOM::Unit.new(2) }
18
+ context 'when operand is a unitless unit' do
19
+ let(:operand) { AUOM::Unit.new(2) }
23
20
 
24
- it_should_behave_like 'an operation'
21
+ it_should_behave_like 'an operation'
25
22
 
26
- it { should eql(AUOM::Unit.new(2)) }
27
- end
23
+ it { should eql(AUOM::Unit.new(2)) }
24
+ end
28
25
 
29
- context 'when operand is a unitful unit' do
30
- let(:operand) { AUOM::Unit.new(2, :meter) }
26
+ context 'when operand is a unitful unit' do
27
+ let(:operand) { AUOM::Unit.new(2, :meter) }
31
28
 
32
- it_should_behave_like 'an operation'
29
+ it_should_behave_like 'an operation'
33
30
 
34
- it { should eql(AUOM::Unit.new(2, [], :meter)) }
31
+ it { should eql(AUOM::Unit.new(2, [], :meter)) }
32
+ end
35
33
  end
36
- end
37
34
 
38
- context 'with unitful unit' do
39
- let(:arguments) { [2, :meter] }
35
+ context 'with unitful unit' do
36
+ let(:arguments) { [2, :meter] }
40
37
 
41
- context 'when operand is a fixnum' do
42
- let(:operand) { 1 }
38
+ context 'when operand is a fixnum' do
39
+ let(:operand) { 1 }
43
40
 
44
- it_should_behave_like 'an operation'
41
+ it_should_behave_like 'an operation'
45
42
 
46
- it { should eql(AUOM::Unit.new(2, :meter)) }
47
- end
43
+ it { should eql(AUOM::Unit.new(2, :meter)) }
44
+ end
48
45
 
49
- context 'when operand is a unitless unit' do
50
- let(:operand) { AUOM::Unit.new(1) }
46
+ context 'when operand is a unitless unit' do
47
+ let(:operand) { AUOM::Unit.new(1) }
51
48
 
52
- it_should_behave_like 'an operation'
49
+ it_should_behave_like 'an operation'
53
50
 
54
- it { should eql(AUOM::Unit.new(2, :meter)) }
55
- end
51
+ it { should eql(AUOM::Unit.new(2, :meter)) }
52
+ end
56
53
 
57
- context 'when operand is a unitful unit' do
54
+ context 'when operand is a unitful unit' do
58
55
 
59
- context 'and units get added to denominator' do
60
- let(:operand) { AUOM::Unit.new(1, :euro) }
56
+ context 'and units get added to denominator' do
57
+ let(:operand) { AUOM::Unit.new(1, :euro) }
61
58
 
62
- it_should_behave_like 'an operation'
59
+ it_should_behave_like 'an operation'
63
60
 
64
- it { should eql(AUOM::Unit.new(2, :meter, :euro)) }
65
- end
61
+ it { should eql(AUOM::Unit.new(2, :meter, :euro)) }
62
+ end
66
63
 
67
- context 'and units get added to numerator' do
68
- let(:operand) { AUOM::Unit.new(1, nil, :euro) }
64
+ context 'and units get added to numerator' do
65
+ let(:operand) { AUOM::Unit.new(1, nil, :euro) }
69
66
 
70
- it_should_behave_like 'an operation'
67
+ it_should_behave_like 'an operation'
71
68
 
72
- it { should eql(AUOM::Unit.new(2, [:euro, :meter])) }
73
- end
69
+ it { should eql(AUOM::Unit.new(2, %i[euro meter])) }
70
+ end
74
71
 
75
- context 'and units cancle each other' do
76
- let(:operand) { AUOM::Unit.new(1, :meter) }
72
+ context 'and units cancel each other' do
73
+ let(:operand) { AUOM::Unit.new(1, :meter) }
77
74
 
78
- it_should_behave_like 'an operation'
75
+ it_should_behave_like 'an operation'
79
76
 
80
- it { should eql(AUOM::Unit.new(2)) }
81
- end
77
+ it { should eql(AUOM::Unit.new(2)) }
78
+ end
82
79
 
80
+ end
83
81
  end
84
82
  end
85
83
  end