calcpace 0.2.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4525dc354de18e5ae106e84f2628eb649a28457deff01f9a4ecdf692a210d81
4
- data.tar.gz: b16f270b98de14001122a466d2d19d11e5316262ef5319944c25ac236ac56615
3
+ metadata.gz: 4076fd00047c9b763ee7c4d38d5b3c75b638ec851c0af06895c70d050a122b10
4
+ data.tar.gz: 2c69b89a9f5508cd58a5f34b33f67517f6ac9a37218ae0e01fbbed600a269712
5
5
  SHA512:
6
- metadata.gz: 7827da6cf956685513b3f56728a9475f9d5d5843ea2808b51a9a83800787779e71d4417c45d4e03779e6eb077a3158b1ca19c841c1ded861682ac8fa8f72beab
7
- data.tar.gz: e17f9a94e680266f856fe94d36c57cea4988d10c4941dd415af7e0efe5b52d801a2e4721dd8758a2ae1d0228685f4c6a27208fad462b6a1d081e384152bbd248
6
+ metadata.gz: '029f28e39b899c3d2ddc13c873db6ed76a3a3b743080c4c167263a592550c56f1dd68bb19e4bb353c15846c63a339d6ba07d7e1a33c1ce83ff8d3159f059d5e7'
7
+ data.tar.gz: 2878a6024448fd28264e9b7df4d26fc19f2f41d02016dab82caa7c87f46b8b3bce0de55e5edaff627ca5ffa1b945e2461e5a3d49188df12f533a0cf003011eeb
@@ -1,25 +1,40 @@
1
- # frozen_string_literal: true
2
-
3
- module Calculator
4
- def pace(time, distance)
5
- check_digits(time, distance)
6
- convert_to_clocktime(convert_to_seconds(time) / distance.to_f)
7
- end
8
-
9
- def total_time(pace, distance)
10
- check_digits(pace, distance)
11
- convert_to_clocktime(convert_to_seconds(pace) * distance.to_f)
12
- end
13
-
14
- def distance(time, pace)
15
- check_digits_time(time)
16
- check_digits_time(pace)
17
- convert_to_seconds(time).to_f / convert_to_seconds(pace).round(2)
18
- end
19
-
20
- def convert_distance(distance, unit)
21
- check_digits_distance(distance)
22
- check_unit(unit)
23
- convert(distance, unit)
24
- end
25
- end
1
+ require 'bigdecimal'
2
+
3
+ module Calculator
4
+ def pace(time, distance, bigdecimal = false)
5
+ pace_in_seconds = pace_seconds(time, distance, bigdecimal)
6
+ convert_to_clocktime(pace_in_seconds)
7
+ end
8
+
9
+ def pace_seconds(time, distance, bigdecimal = false)
10
+ check_time(time)
11
+ check_distance(distance)
12
+ seconds = convert_to_seconds(time)
13
+ bigdecimal ? seconds / BigDecimal(distance.to_s) : seconds / distance
14
+ end
15
+
16
+ def total_time(pace, distance, bigdecimal = false)
17
+ total_time_in_seconds = total_time_seconds(pace, distance, bigdecimal)
18
+ convert_to_clocktime(total_time_in_seconds)
19
+ end
20
+
21
+ def total_time_seconds(pace, distance, bigdecimal = false)
22
+ check_time(pace)
23
+ check_distance(distance)
24
+ pace_seconds = convert_to_seconds(pace)
25
+ bigdecimal ? pace_seconds * BigDecimal(distance.to_s) : pace_seconds * distance
26
+ end
27
+
28
+ def distance(time, pace, bigdecimal = false)
29
+ check_time(time)
30
+ check_time(pace)
31
+ if bigdecimal
32
+ time_seconds = BigDecimal(convert_to_seconds(time).to_s)
33
+ pace_seconds = BigDecimal(convert_to_seconds(pace).to_s)
34
+ else
35
+ time_seconds = convert_to_seconds(time)
36
+ pace_seconds = convert_to_seconds(pace)
37
+ end
38
+ time_seconds / pace_seconds
39
+ end
40
+ end
@@ -1,20 +1,19 @@
1
- # frozen_string_literal: true
2
-
3
- module Checker
4
- def check_digits(time, distance)
5
- check_digits_time(time)
6
- check_digits_distance(distance)
7
- end
8
-
9
- def check_digits_distance(distance)
10
- raise 'It must be a X.X positive number' unless distance.positive?
11
- end
12
-
13
- def check_digits_time(time_string)
14
- raise 'It must be a XX:XX:XX time' unless time_string =~ /\d{0,2}(:)*?\d{1,2}(:)\d{1,2}/
15
- end
16
-
17
- def check_unit(unit)
18
- raise 'It must be km or mi' unless %w[km mi].include?(unit)
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Checker
4
+ def check_distance(distance)
5
+ raise 'It must be a X.X positive number' unless distance.positive?
6
+ end
7
+
8
+ def check_time(time_string)
9
+ raise 'It must be a XX:XX:XX time' unless time_string =~ /\d{0,2}(:)*?\d{1,2}(:)\d{1,2}/
10
+ end
11
+
12
+ def check_integer(second)
13
+ raise 'It must be a positive number' unless second.is_a?(Integer) && second.positive?
14
+ end
15
+
16
+ def check_unit(unit)
17
+ raise 'It must be km or mi' unless %w[km mi].include?(unit)
18
+ end
19
+ end
@@ -1,22 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bigdecimal'
4
+
3
5
  module Converter
6
+ KM_TO_MI = BigDecimal("0.621371")
7
+ MI_TO_KM = BigDecimal("1.60934")
8
+
9
+ def to_seconds(time)
10
+ check_time(time)
11
+ convert_to_seconds(time)
12
+ end
13
+
14
+ def to_clocktime(seconds)
15
+ check_integer(seconds)
16
+ convert_to_clocktime(seconds)
17
+ end
18
+
19
+ def convert(distance, unit, round_limit = 2)
20
+ check_distance(distance)
21
+ check_unit(unit)
22
+ check_integer(round_limit)
23
+ convert_the_distance(BigDecimal(distance.to_s), unit, round_limit)
24
+ end
25
+
4
26
  def convert_to_seconds(time)
5
27
  hour, minute, seconds = time.split(':').map(&:to_i)
6
28
  (hour * 3600) + (minute * 60) + seconds
7
29
  end
8
30
 
9
31
  def convert_to_clocktime(seconds)
10
- Time.at(seconds).utc.strftime('%H:%M:%S')
32
+ format = seconds >= 86_400 ? '%d %H:%M:%S' : '%H:%M:%S'
33
+ Time.at(seconds.to_i).utc.strftime(format)
11
34
  end
12
35
 
13
- # tem que chamar as checagens de digitos antes de chamar o convert_distance
14
- def convert(distance, unit)
36
+ def convert_the_distance(distance, unit, round_limit = 2)
15
37
  case unit
16
38
  when 'km'
17
- (distance * 0.621371).round(2)
39
+ (distance * KM_TO_MI).round(round_limit)
18
40
  when 'mi'
19
- (distance * 1.60934).round(2)
41
+ (distance * MI_TO_KM).round(round_limit)
20
42
  end
21
43
  end
22
- end
44
+ end
data/lib/calcpace.rb CHANGED
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'calcpace/calculator'
4
- require_relative 'calcpace/checker'
5
- require_relative 'calcpace/converter'
6
-
7
- class Calcpace
8
- include Calculator
9
- include Checker
10
- include Converter
11
-
12
- def initialize; end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'calcpace/calculator'
4
+ require_relative 'calcpace/checker'
5
+ require_relative 'calcpace/converter'
6
+
7
+ class Calcpace
8
+ include Calculator
9
+ include Checker
10
+ include Converter
11
+
12
+ def initialize; end
13
+ end
@@ -1,40 +1,68 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitest/autorun'
4
- require_relative '../../lib/calcpace'
5
-
6
- class TestCalculator < Minitest::Test
7
- def setup
8
- @checker = Calcpace.new
9
- end
10
-
11
- def test_pace
12
- assert_raises(RuntimeError) { @checker.pace('', 10) }
13
- assert_raises(RuntimeError) { @checker.pace('invalid', 10) }
14
- assert_raises(RuntimeError) { @checker.pace('00:00:00', 0) }
15
- assert_raises(RuntimeError) { @checker.pace('00:00:00', -1) }
16
- assert_equal '00:06:00', @checker.pace('01:00:00', 10)
17
- end
18
-
19
- def test_total_time
20
- assert_raises(RuntimeError) { @checker.total_time('', 10) }
21
- assert_raises(RuntimeError) { @checker.total_time('invalid', 10) }
22
- assert_raises(RuntimeError) { @checker.total_time('00:00:00', 0) }
23
- assert_raises(RuntimeError) { @checker.total_time('00:00:00', -1) }
24
- assert_equal '01:00:00', @checker.total_time('00:05:00', 12)
25
- end
26
-
27
- def test_distance
28
- assert_raises(RuntimeError) { @checker.distance('', '00:05:00') }
29
- assert_raises(RuntimeError) { @checker.distance('01:00:00', '') }
30
- assert_equal 18.0, @checker.distance('01:30:00', '00:05:00')
31
- end
32
-
33
- def test_convert_distance
34
- assert_raises(RuntimeError) { @checker.convert_distance(10, 'invalid') }
35
- assert_raises(RuntimeError) { @checker.convert_distance(-1, 'km') }
36
- assert_raises(RuntimeError) { @checker.convert_distance(0, 'km') }
37
- assert_equal 6.21, @checker.convert_distance(10, 'km')
38
- assert_equal 16.09, @checker.convert_distance(10, 'mi')
39
- end
40
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require 'bigdecimal'
5
+ require_relative '../../lib/calcpace'
6
+
7
+ class TestCalculator < Minitest::Test
8
+ def setup
9
+ @checker = Calcpace.new
10
+ end
11
+
12
+ def test_pace
13
+ assert_raises(RuntimeError) { @checker.pace('', 10) }
14
+ assert_raises(RuntimeError) { @checker.pace('invalid', 10) }
15
+ assert_raises(RuntimeError) { @checker.pace('00:00:00', 0) }
16
+ assert_raises(RuntimeError) { @checker.pace('00:00:00', -1) }
17
+ assert_equal '00:06:00', @checker.pace('01:00:00', 10)
18
+ assert_equal '00:07:54', @checker.pace('01:37:21', 12.3)
19
+ end
20
+
21
+ def test_pace_without_bigdecimal_precision
22
+ assert_equal '00:07:54', @checker.pace('01:37:21', 12.3, false)
23
+ end
24
+
25
+ def test_pace_seconds
26
+ assert_raises(RuntimeError) { @checker.pace_seconds('', 10) }
27
+ assert_raises(RuntimeError) { @checker.pace_seconds('invalid', 10) }
28
+ assert_raises(RuntimeError) { @checker.pace_seconds('00:00:00', 0) }
29
+ assert_raises(RuntimeError) { @checker.pace_seconds('00:00:00', -1) }
30
+ assert_equal BigDecimal('474.8780487804878'), @checker.pace_seconds('01:37:21', 12.3)
31
+ end
32
+
33
+ def test_pace_seconds_with_bigdecimal_precision
34
+ assert_equal BigDecimal('0.474878048780487804878048780487804878049e3'), @checker.pace_seconds('01:37:21', 12.3, true)
35
+ end
36
+
37
+ def test_total_time
38
+ assert_raises(RuntimeError) { @checker.total_time('', 10) }
39
+ assert_raises(RuntimeError) { @checker.total_time('invalid', 10) }
40
+ assert_raises(RuntimeError) { @checker.total_time('00:00:00', 0) }
41
+ assert_raises(RuntimeError) { @checker.total_time('00:00:00', -1) }
42
+ assert_equal '01:00:00', @checker.total_time('00:05:00', 12)
43
+ end
44
+
45
+ def test_total_time_seconds
46
+ assert_raises(RuntimeError) { @checker.total_time_seconds('', 10) }
47
+ assert_raises(RuntimeError) { @checker.total_time_seconds('invalid', 10) }
48
+ assert_raises(RuntimeError) { @checker.total_time_seconds('00:00:00', 0) }
49
+ assert_raises(RuntimeError) { @checker.total_time_seconds('00:00:00', -1) }
50
+ assert_equal 3600, @checker.total_time_seconds('00:05:00', 12)
51
+ assert_equal 71844.3, @checker.total_time_seconds('01:37:21', 12.3)
52
+ end
53
+
54
+ def test_total_time_seconds_with_bigdecimal_precision
55
+ assert_equal BigDecimal('0.718443e5'), @checker.total_time_seconds('01:37:21', 12.3, true)
56
+ end
57
+
58
+ def test_distance
59
+ assert_raises(RuntimeError) { @checker.distance('', '00:05:00') }
60
+ assert_raises(RuntimeError) { @checker.distance('01:00:00', '') }
61
+ assert_equal 18.0, @checker.distance('01:30:00', '00:05:00')
62
+ assert_equal 15.0, @checker.distance('01:37:21', '00:06:17')
63
+ end
64
+
65
+ def test_distance_with_bigdecimal_precision
66
+ assert_equal BigDecimal('0.15493368700265251989389920424403183024e2'), @checker.distance('01:37:21', '00:06:17', true)
67
+ end
68
+ end
@@ -1,32 +1,27 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitest/autorun'
4
- require_relative '../../lib/calcpace'
5
-
6
- class TestChecker < Minitest::Test
7
- def setup
8
- @checker = Calcpace.new
9
- end
10
-
11
- def test_check_digits_distance
12
- assert_raises(RuntimeError) { @checker.check_digits_distance(-1) }
13
- assert_raises(RuntimeError) { @checker.check_digits_distance(0) }
14
- assert_nil @checker.check_digits_distance(1)
15
- end
16
-
17
- def test_check_digits_time
18
- assert_raises(RuntimeError) { @checker.check_digits_time('') }
19
- assert_nil @checker.check_digits_time('00:00:00')
20
- end
21
-
22
- def test_check_digits
23
- assert_raises(RuntimeError) { @checker.check_digits('00:00:00', 0) }
24
- assert_raises(RuntimeError) { @checker.check_digits('', 1) }
25
- assert_nil @checker.check_digits('00:00:00', 1)
26
- end
27
-
28
- def test_convert
29
- assert_equal 6.21, @checker.convert(10, 'km')
30
- assert_equal 16.09, @checker.convert(10, 'mi')
31
- end
32
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require_relative '../../lib/calcpace'
5
+
6
+ class TestChecker < Minitest::Test
7
+ def setup
8
+ @checker = Calcpace.new
9
+ end
10
+
11
+ def test_check_distance
12
+ assert_raises(RuntimeError) { @checker.check_distance(-1) }
13
+ assert_raises(RuntimeError) { @checker.check_distance(0) }
14
+ assert_nil @checker.check_distance(1)
15
+ end
16
+
17
+ def test_check_time
18
+ assert_raises(RuntimeError) { @checker.check_time('') }
19
+ assert_nil @checker.check_time('00:00:00')
20
+ end
21
+
22
+ def test_check_integer
23
+ assert_raises(RuntimeError) { @checker.check_integer(-1) }
24
+ assert_raises(RuntimeError) { @checker.check_integer(0) }
25
+ assert_nil @checker.check_integer(1)
26
+ end
27
+ end
@@ -1,24 +1,49 @@
1
- # frozen_string_literal: true
2
-
3
- require 'minitest/autorun'
4
- require_relative '../../lib/calcpace'
5
-
6
- class TestConverter < Minitest::Test
7
- def setup
8
- @checker = Calcpace.new
9
- end
10
-
11
- def test_convert_to_seconds
12
- assert_equal 4262, @checker.convert_to_seconds('01:11:02')
13
- end
14
-
15
- def test_convert_to_clocktime
16
- assert_equal '01:11:02', @checker.convert_to_clocktime(4262)
17
- end
18
-
19
- def test_convert_distance_km
20
- assert_equal 6.21, @checker.convert_distance(10, 'km')
21
- assert_equal 16.09, @checker.convert_distance(10, 'mi')
22
- assert_raises(RuntimeError) { @checker.convert_distance(10, 'invalid') }
23
- end
24
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require_relative '../../lib/calcpace'
5
+
6
+ class TestConverter < Minitest::Test
7
+ def setup
8
+ @checker = Calcpace.new
9
+ end
10
+
11
+ def test_convert_to_seconds
12
+ assert_equal 4262, @checker.convert_to_seconds('01:11:02')
13
+ end
14
+
15
+ def test_to_seconds
16
+ assert_equal 3600, @checker.to_seconds('01:00:00')
17
+ assert_raises(RuntimeError) { @checker.to_seconds('invalid') }
18
+ end
19
+
20
+ def test_convert_to_clocktime
21
+ assert_equal '01:11:02', @checker.convert_to_clocktime(4262)
22
+ end
23
+
24
+ def test_to_clocktime
25
+ assert_equal '01:00:00', @checker.to_clocktime(3600)
26
+ assert_equal '02 01:00:00', @checker.to_clocktime(90000)
27
+ assert_raises(RuntimeError) { @checker.to_clocktime(-1) }
28
+ assert_raises(RuntimeError) { @checker.to_clocktime(0) }
29
+ assert_raises(RuntimeError) { @checker.to_clocktime('invalid') }
30
+ end
31
+
32
+ def test_convert_the_distance
33
+ assert_equal 6.21, @checker.convert_the_distance(10, 'km')
34
+ assert_equal 6.2, @checker.convert_the_distance(10, 'km', 1)
35
+ assert_equal 6.214, @checker.convert_the_distance(10, 'km', 3)
36
+ assert_equal 16.09, @checker.convert_the_distance(10, 'mi')
37
+ end
38
+
39
+ def test_convert
40
+ assert_equal 6.21, @checker.convert(10, 'km')
41
+ assert_equal 16.09, @checker.convert(10, 'mi')
42
+ assert_equal 6.2, @checker.convert(10, 'km', 1)
43
+ assert_raises(RuntimeError) { @checker.convert(10, 'invalid') }
44
+ assert_raises(RuntimeError) { @checker.convert(-1, 'km') }
45
+ assert_raises(RuntimeError) { @checker.convert(10, 'km', -2) }
46
+ assert_raises(RuntimeError) { @checker.convert(10, 'km', 0) }
47
+ assert_raises(RuntimeError) { @checker.convert(10, 'km', 'invalid') }
48
+ end
49
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calcpace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joao Gilberto Saraiva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-25 00:00:00.000000000 Z
11
+ date: 2024-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -94,9 +94,12 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.11'
97
- description: Calculate pace, total time, distance and easily convert distances (kilometers
98
- and miles) for activities like running and cycling. Get readable results in HH:MM:SS
99
- or X.X format for time and distance calculations.
97
+ description: 'Calcpace is a Ruby gem that helps with calculations related to running/cycling
98
+ activities or general purposes involving distance and time. It can calculate pace,
99
+ total time, and distance. It also converts distances between miles and kilometers
100
+ and check formats of time and distance. The results are provided in a readable format,
101
+ with times in HH:MM:SS or seconds and distances in X.X format. If you need, the
102
+ gem supports BigDecimal to handle the calculations, '
100
103
  email: joaogilberto@tuta.io
101
104
  executables: []
102
105
  extensions: []
@@ -114,8 +117,7 @@ licenses:
114
117
  - MIT
115
118
  metadata:
116
119
  source_code_uri: https://github.com/0jonjo/calcpace
117
- post_install_message: It's time to grab your sneakers or hop on your bike and start
118
- exercising! Thank you for installing Calcpace!
120
+ post_install_message: It's time to calculate! Thank you for installing Calcpace.
119
121
  rdoc_options: []
120
122
  require_paths:
121
123
  - lib
@@ -130,11 +132,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
132
  - !ruby/object:Gem::Version
131
133
  version: '0'
132
134
  requirements: []
133
- rubygems_version: 3.2.33
135
+ rubygems_version: 3.5.16
134
136
  signing_key:
135
137
  specification_version: 4
136
- summary: 'Calcpace: calculate time and distances for activities such as running and
137
- cycling.'
138
+ summary: 'Calcpace: calculate time, distance, pace, velocity and convert distances
139
+ in an easy and precise way.'
138
140
  test_files:
139
141
  - test/calcpace/test_calculator.rb
140
142
  - test/calcpace/test_checker.rb