calcpace 1.0.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 200091226ac840d686c80783b1ffdd25880e33d055023584bcf0d6ad4f80942b
4
- data.tar.gz: 983b752d6d4569accd2deebeecf0d071dd7d5d7c4d86ad13949b0dc57992efcb
3
+ metadata.gz: 4076fd00047c9b763ee7c4d38d5b3c75b638ec851c0af06895c70d050a122b10
4
+ data.tar.gz: 2c69b89a9f5508cd58a5f34b33f67517f6ac9a37218ae0e01fbbed600a269712
5
5
  SHA512:
6
- metadata.gz: bc18311a99f36de42c7684bab706665d875abf9d579ca31a05d2cebbd8ae75be66f6c34d5242d6d76538f78198c7ef4931a427c43a62b444abf1e0c8cfdc89da
7
- data.tar.gz: '0086fe8432f284529da6c6c7ded77488895360da55542f8ca6f50c8fd2976e3d8c2bf2e22d9c56cd10f9a560a4ad4666a12fc34655dbea263cd4f698eafb4e9c'
6
+ metadata.gz: '029f28e39b899c3d2ddc13c873db6ed76a3a3b743080c4c167263a592550c56f1dd68bb19e4bb353c15846c63a339d6ba07d7e1a33c1ce83ff8d3159f059d5e7'
7
+ data.tar.gz: 2878a6024448fd28264e9b7df4d26fc19f2f41d02016dab82caa7c87f46b8b3bce0de55e5edaff627ca5ffa1b945e2461e5a3d49188df12f533a0cf003011eeb
@@ -1,21 +1,40 @@
1
- # frozen_string_literal: true
1
+ require 'bigdecimal'
2
2
 
3
3
  module Calculator
4
- def pace(time, distance)
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)
5
10
  check_time(time)
6
11
  check_distance(distance)
7
- convert_to_clocktime(convert_to_seconds(time) / distance.to_f)
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)
8
19
  end
9
20
 
10
- def total_time(pace, distance)
21
+ def total_time_seconds(pace, distance, bigdecimal = false)
11
22
  check_time(pace)
12
23
  check_distance(distance)
13
- convert_to_clocktime(convert_to_seconds(pace) * distance.to_f)
24
+ pace_seconds = convert_to_seconds(pace)
25
+ bigdecimal ? pace_seconds * BigDecimal(distance.to_s) : pace_seconds * distance
14
26
  end
15
27
 
16
- def distance(time, pace)
28
+ def distance(time, pace, bigdecimal = false)
17
29
  check_time(time)
18
30
  check_time(pace)
19
- convert_to_seconds(time).to_f / convert_to_seconds(pace).round(2)
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
20
39
  end
21
- end
40
+ end
@@ -1,6 +1,11 @@
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
+
4
9
  def to_seconds(time)
5
10
  check_time(time)
6
11
  convert_to_seconds(time)
@@ -15,7 +20,7 @@ module Converter
15
20
  check_distance(distance)
16
21
  check_unit(unit)
17
22
  check_integer(round_limit)
18
- convert_the_distance(distance, unit, round_limit)
23
+ convert_the_distance(BigDecimal(distance.to_s), unit, round_limit)
19
24
  end
20
25
 
21
26
  def convert_to_seconds(time)
@@ -24,16 +29,16 @@ module Converter
24
29
  end
25
30
 
26
31
  def convert_to_clocktime(seconds)
27
- seconds >= 86_400 ? time = '%d %H:%M:%S' : time = '%H:%M:%S'
28
- Time.at(seconds).utc.strftime(time)
32
+ format = seconds >= 86_400 ? '%d %H:%M:%S' : '%H:%M:%S'
33
+ Time.at(seconds.to_i).utc.strftime(format)
29
34
  end
30
35
 
31
36
  def convert_the_distance(distance, unit, round_limit = 2)
32
37
  case unit
33
38
  when 'km'
34
- (distance * 0.621371).round(round_limit)
39
+ (distance * KM_TO_MI).round(round_limit)
35
40
  when 'mi'
36
- (distance * 1.60934).round(round_limit)
41
+ (distance * MI_TO_KM).round(round_limit)
37
42
  end
38
43
  end
39
- end
44
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'minitest/autorun'
4
+ require 'bigdecimal'
4
5
  require_relative '../../lib/calcpace'
5
6
 
6
7
  class TestCalculator < Minitest::Test
@@ -14,6 +15,23 @@ class TestCalculator < Minitest::Test
14
15
  assert_raises(RuntimeError) { @checker.pace('00:00:00', 0) }
15
16
  assert_raises(RuntimeError) { @checker.pace('00:00:00', -1) }
16
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)
17
35
  end
18
36
 
19
37
  def test_total_time
@@ -24,9 +42,27 @@ class TestCalculator < Minitest::Test
24
42
  assert_equal '01:00:00', @checker.total_time('00:05:00', 12)
25
43
  end
26
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
+
27
58
  def test_distance
28
59
  assert_raises(RuntimeError) { @checker.distance('', '00:05:00') }
29
60
  assert_raises(RuntimeError) { @checker.distance('01:00:00', '') }
30
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)
31
67
  end
32
68
  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: 1.0.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-06-16 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.4.6
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