calcpace 0.2.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: 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