runby_pace 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 77f387051e46c4f6f78a9b473bd489481138c165
4
+ data.tar.gz: e8f3e809926fac438a1101500600f67818d94e22
5
+ SHA512:
6
+ metadata.gz: 85f384bccd0ffc9db3aef47f13bff41a0f0134227020eaf65647b33d07188fe9da17ec4c497f383266f5586b5a0395870c6129695af8adeedbbbaa3f2726c539
7
+ data.tar.gz: 042add614397d1516a5c25a2301011396d04c218b7cd4b5d8544e08a29601736ebd16e912fd1e845279b1dfb33f142cca4f0b29d00f85badd024e3751eb482d4
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .idea/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.4
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'coveralls', require: false
5
+ end
6
+
7
+ group :development, :test do
8
+ gem 'guard'
9
+ gem 'guard-rspec'
10
+ gem 'rb-notifu'
11
+ end
12
+
13
+ # Specify your gem's dependencies in runby_pace.gemspec
14
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,72 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ # Note: The cmd option is now required due to the increasing number of ways
19
+ # rspec may be run, below are examples of the most common uses.
20
+ # * bundler: 'bundle exec rspec'
21
+ # * bundler binstubs: 'bin/rspec'
22
+ # * spring: 'bin/rspec' (This will use spring if running and you have
23
+ # installed the spring binstubs per the docs)
24
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
25
+ # * 'just' rspec: 'rspec'
26
+
27
+ guard :rspec, cmd: "bundle exec rspec" do
28
+ require "guard/rspec/dsl"
29
+ dsl = Guard::RSpec::Dsl.new(self)
30
+
31
+ # Feel free to open issues for suggestions and improvements
32
+
33
+ # RSpec files
34
+ rspec = dsl.rspec
35
+ watch(rspec.spec_helper) { rspec.spec_dir }
36
+ watch(rspec.spec_support) { rspec.spec_dir }
37
+ watch(rspec.spec_files)
38
+
39
+ # Ruby files
40
+ ruby = dsl.ruby
41
+ dsl.watch_spec_files_for(ruby.lib_files)
42
+
43
+ # Rails files
44
+ rails = dsl.rails(view_extensions: %w(erb haml slim))
45
+ dsl.watch_spec_files_for(rails.app_files)
46
+ dsl.watch_spec_files_for(rails.views)
47
+
48
+ watch(rails.controllers) do |m|
49
+ [
50
+ rspec.spec.call("routing/#{m[1]}_routing"),
51
+ rspec.spec.call("controllers/#{m[1]}_controller"),
52
+ rspec.spec.call("acceptance/#{m[1]}")
53
+ ]
54
+ end
55
+
56
+ # Rails config changes
57
+ watch(rails.spec_helper) { rspec.spec_dir }
58
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
59
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
60
+
61
+ # Capybara features specs
62
+ watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
63
+ watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
64
+
65
+ # Turnip features and steps
66
+ watch(%r{^spec/acceptance/(.+)\.feature$})
67
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
68
+ Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
69
+ end
70
+
71
+ notification :notifu, time: 5, nosound: true, xp: true
72
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Ty Walls
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # RunbyPace
2
+
3
+ RunbyPace contains the core logic for calculating the target "paces" used by runners. By "runners" I mean the common
4
+ humanoid biped variety, complete with oscillating appendages and prolific perspiration. :)
5
+
6
+ | | |
7
+ | --- | --- |
8
+ | **Build** | [![Build Status](https://travis-ci.org/tygerbytes/runby-pace.svg?branch=master)](https://travis-ci.org/tygerbytes/runby-pace) |
9
+ | **Coverage** | [![Coverage Status](https://coveralls.io/repos/github/tygerbytes/runby-pace/badge.svg?branch=master)](https://coveralls.io/github/tygerbytes/runby-pace?branch=master) |
10
+
11
+ Any sort of running program will include runs at varying paces, easy runs, distance runs, tempo runs, long runs, and
12
+ then the gambit of "interval" type runs, such as 1500m pace repetitions, 5K and 10K pace reps, cruise intervals, and
13
+ so on. Many runners typically consult pace tables based on their most recent time for a 5K race. So assuming your most
14
+ recent 5K time was 20 minutes, and you're supposed to run a "long run", you find your most recent 5K time in the
15
+ Long Run table, and it tells you that you should try to maintain a pace of 5:30-6:19 minutes per kilometer.
16
+
17
+ So this is great, but a little tedious. RunbyPace automates this whole process by calculating all of the paces for you.
18
+ All you need is your current 5K time and some Ruby, and you're off running at just the right pace.
19
+
20
+ Note that this project is currently being developed, so the gem doesn't even exist yet. Coming soon!
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ ```ruby
27
+ gem 'runby_pace'
28
+ ```
29
+
30
+ And then execute:
31
+
32
+ $ bundle
33
+
34
+ Or install it yourself as:
35
+
36
+ $ gem install runby_pace
37
+
38
+ ## Usage
39
+
40
+ TODO: Coming soon... When the class interfaces are fleshed out.
41
+
42
+ ## Development
43
+
44
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
45
+
46
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
47
+
48
+ ## Contributing
49
+
50
+ Bug reports and pull requests are welcome on GitHub at https://github.com/tygerbytes/runby-pace.
51
+
52
+
53
+ ## License
54
+
55
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/_guard-core ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application '_guard-core' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require "pathname"
10
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require "rubygems"
14
+ require "bundler/setup"
15
+
16
+ load Gem.bin_path("guard", "_guard-core")
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'runby_pace'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start
data/bin/guard ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'guard' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require "pathname"
10
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require "rubygems"
14
+ require "bundler/setup"
15
+
16
+ load Gem.bin_path("guard", "guard")
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,69 @@
1
+ module RunbyPace
2
+
3
+ class PaceData
4
+
5
+ # The number of data points plotted on our line of 5K times.
6
+ # We take 5K times from 14:00 to 42:00 with a sample rate
7
+ # of 30 seconds, and out pops 57.
8
+ DATA_POINTS_COUNT = 57
9
+
10
+ # The midpoint along the X axis of our pace data "graph"
11
+ MIDPOINT_X = 28
12
+
13
+ # The fastest pace within the run type data set.
14
+ # Given a personal record of 14 minutes for a 5K race,
15
+ # this is the prescribed pace for this run type.
16
+ attr_reader :fastest_pace_km
17
+
18
+ # The slowest pace for the run type data set.
19
+ # Given a personal record of 42 minutes for a 5K race,
20
+ # this is the prescribed pace for this run type.
21
+ attr_reader :slowest_pace_km
22
+
23
+ # For maximum flexibility, we assume the radius of the curve
24
+ # of the pace data to be equal to the X axis midpoint, a perfect circle.
25
+ # Use the midpoint_radius_divisor to reduce the height of the curve
26
+ # until it matches that of the data. (See #curve_minutes)
27
+ attr_reader :midpoint_radius_divisor
28
+
29
+ def initialize(fastest_pace_km, slowest_pace_km, midpoint_radius_divisor)
30
+ @fastest_pace_km = RunbyPace::PaceTime.new(fastest_pace_km)
31
+ @slowest_pace_km = RunbyPace::PaceTime.new(slowest_pace_km)
32
+ @midpoint_radius_divisor = midpoint_radius_divisor
33
+ end
34
+
35
+ # Calculate the slope of the line between the fastest and slowest paces
36
+ def slope
37
+ (@slowest_pace_km.total_minutes - @fastest_pace_km.total_minutes) / (DATA_POINTS_COUNT - 1)
38
+ end
39
+
40
+ # Calculate the prescribed pace for the given 5K time
41
+ def calc(five_k_time)
42
+ five_k_time = RunbyPace::PaceTime.new(five_k_time)
43
+ x2 = ((five_k_time.total_minutes * 2) - (MIDPOINT_X - 1)) - 1
44
+ RunbyPace::PaceTime.from_minutes(slope * x2 + @fastest_pace_km.total_minutes + curve_minutes(x2))
45
+ end
46
+
47
+ private
48
+
49
+ # Since the paces for each 5K time do not progress in a straight line
50
+ # when plotted on a graph, but rather a curve with its highest point near
51
+ # the center, we must add some seconds to the calculated time depending on
52
+ # where we are on the line.
53
+ # Paces near the start and end of the line need little to no time added,
54
+ # whereas paces near the middle need the most time added.
55
+ # The default curve radius is the same as the midpoint of the X axis,
56
+ # forming a circle. Use #midpoint_radius_divisor to reduce it's size.
57
+ def curve_minutes(x_axis)
58
+ return 0 if @midpoint_radius_divisor == 0
59
+ midpoint_reduction = x_axis
60
+ midpoint = MIDPOINT_X
61
+ if midpoint_reduction > midpoint
62
+ midpoint_reduction = midpoint - (midpoint_reduction - midpoint)
63
+ midpoint_reduction = 0 if midpoint_reduction < 0
64
+ end
65
+ # TODO: Use an actual curve instead of a triangle to calculate the number of minutes to add.
66
+ midpoint_reduction / @midpoint_radius_divisor / 60
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,15 @@
1
+ module RunbyPace
2
+
3
+ class PaceRange
4
+ attr_reader :fast, :slow
5
+
6
+ def initialize(fast, slow)
7
+ @fast = RunbyPace::PaceTime.new(fast)
8
+ @slow = RunbyPace::PaceTime.new(slow)
9
+ end
10
+
11
+ def to_s
12
+ "#{@fast}-#{@slow}"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,102 @@
1
+ module RunbyPace
2
+
3
+ class PaceTime
4
+ attr_reader :time_s, :minutes_part, :seconds_part
5
+
6
+ def initialize(time)
7
+ if time.is_a?(String) || time.is_a?(Symbol)
8
+ init_from_string(time)
9
+ elsif time.is_a?(PaceTime)
10
+ init_from_clone(time)
11
+ end
12
+ end
13
+
14
+ # @param [numeric] total_seconds
15
+ def self.from_seconds(total_seconds)
16
+ minutes = total_seconds.abs.to_i / 60
17
+ seconds = total_seconds.abs.to_i % 60
18
+ PaceTime.new("#{'%02d' % minutes}:#{'%02d' % seconds}")
19
+ end
20
+
21
+ # @param [numeric] total_minutes
22
+ def self.from_minutes(total_minutes)
23
+ self.from_seconds(total_minutes * 60.0)
24
+ end
25
+
26
+ def to_s
27
+ @time_s
28
+ end
29
+
30
+ def total_seconds
31
+ @minutes_part * 60 + @seconds_part
32
+ end
33
+
34
+ def total_minutes
35
+ @minutes_part + (@seconds_part / 60.0)
36
+ end
37
+
38
+ # @param [PaceTime] value
39
+ def -(value)
40
+ if value.is_a?(PaceTime)
41
+ PaceTime.from_seconds(total_seconds - value.total_seconds)
42
+ end
43
+ end
44
+
45
+ # @param [PaceTime] value
46
+ def +(value)
47
+ if value.is_a?(PaceTime)
48
+ PaceTime.from_seconds(total_seconds + value.total_seconds)
49
+ end
50
+ end
51
+
52
+ def ==(value)
53
+ if value.is_a?(PaceTime)
54
+ total_seconds == value.total_seconds
55
+ elsif value.is_a?(String)
56
+ @time_s == value
57
+ end
58
+ end
59
+
60
+ def >(value)
61
+ if value.is_a?(PaceTime)
62
+ total_seconds > value.total_seconds
63
+ end
64
+ end
65
+
66
+ def >=(value)
67
+ if value.is_a?(PaceTime)
68
+ total_seconds >= value.total_seconds
69
+ end
70
+ end
71
+
72
+ def <(value)
73
+ if value.is_a?(PaceTime)
74
+ total_seconds < value.total_seconds
75
+ end
76
+ end
77
+
78
+ def <=(value)
79
+ if value.is_a?(PaceTime)
80
+ total_seconds <= value.total_seconds
81
+ end
82
+ end
83
+
84
+ private
85
+
86
+ def init_from_string(time)
87
+ raise 'Invalid time format' if !time.match(/(-)?\d\d:\d\d/)
88
+ @time_s = time.to_s
89
+ parts = time.to_s.split(':')
90
+ @minutes_part = parts[0].to_i
91
+ @seconds_part = parts[1].to_i
92
+ raise 'Seconds must be less than 60' if @seconds_part.abs > 59
93
+ end
94
+
95
+ # @param [PaceTime] time
96
+ def init_from_clone(time)
97
+ @time_s = time.time_s
98
+ @minutes_part = time.minutes_part
99
+ @seconds_part = time.seconds_part
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,7 @@
1
+ module RunbyPace
2
+
3
+ class RunType
4
+ def pace(five_k_time)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ module RunbyPace
2
+
3
+ module RunTypes
4
+
5
+ class LongRun < RunType
6
+ attr_reader :slow_pace_data, :fast_pace_data
7
+
8
+ def initialize
9
+ @slow_pace_data = PaceData.new('04:39', '11:53', 1.55)
10
+ @fast_pace_data = PaceData.new('04:00', '10:32', 1.99)
11
+ end
12
+
13
+ def pace(five_k_time)
14
+ fast = @fast_pace_data.calc(five_k_time)
15
+ slow = @slow_pace_data.calc(five_k_time)
16
+ PaceRange.new(fast, slow)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module RunbyPace
2
+ VERSION = '0.2.0'
3
+ end
data/lib/runby_pace.rb ADDED
@@ -0,0 +1,7 @@
1
+
2
+ require 'runby_pace/version'
3
+ Dir[File.dirname(__FILE__) + '/runby_pace/*.rb'].each { |file| require file }
4
+ Dir[File.dirname(__FILE__) + '/runby_pace/run_types/*.rb'].each { |file| require file }
5
+
6
+ module RunbyPace
7
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'runby_pace/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'runby_pace'
8
+ spec.version = RunbyPace::VERSION
9
+ spec.authors = ['Ty Walls']
10
+ spec.email = ['tygerbytes@users.noreply.github.com']
11
+
12
+ spec.summary = %q{Runby Pace is the core logic which simplifies the calculation target paces used by track and distance runners.}
13
+ spec.homepage = 'https://github.com/tygerbytes/runby-pace'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.11'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec', '~> 3.0'
24
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: runby_pace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Ty Walls
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-05-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description:
56
+ email:
57
+ - tygerbytes@users.noreply.github.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - Guardfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - bin/_guard-core
71
+ - bin/console
72
+ - bin/guard
73
+ - bin/setup
74
+ - lib/runby_pace.rb
75
+ - lib/runby_pace/pace_data.rb
76
+ - lib/runby_pace/pace_range.rb
77
+ - lib/runby_pace/pace_time.rb
78
+ - lib/runby_pace/run_type.rb
79
+ - lib/runby_pace/run_types/long_run.rb
80
+ - lib/runby_pace/version.rb
81
+ - runby_pace.gemspec
82
+ homepage: https://github.com/tygerbytes/runby-pace
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.4.5.1
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Runby Pace is the core logic which simplifies the calculation target paces
106
+ used by track and distance runners.
107
+ test_files: []