runby_pace 0.61.155 → 0.61.156

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
  SHA1:
3
- metadata.gz: 1f4113557b6764f4482318812146a3262b015b42
4
- data.tar.gz: 5f4cdec6c937ea9c88ca6cee9e18706dd297d229
3
+ metadata.gz: 6f97923bb6c2c8726a14a7218d9c93350099f2a8
4
+ data.tar.gz: 3f086c6bf1d291f552d8cc7a1c08a1991dfcbfb1
5
5
  SHA512:
6
- metadata.gz: 913f2201dc935dcd5e862cd608864179645464dba07a3fac19bb53e0507932c11279e7efe3ab6f5683e9190d219d6810759197c20189a9b177f90390ea303b09
7
- data.tar.gz: 9bba3bf4861a2a8b03ff6bfe0a82248e5767fe2363d48a4e3cc6fc1b28d9eb1fe196094535ab3a49d6153315802e5c126bf9dee87973defccc242b420efcd81e
6
+ metadata.gz: e79168f22807655d7d1d63daed5c2adabd62a44952c3ddde82b069e2f633fdd1c508f95d57b82656fb93b4ad1bcf9d3d831aa7256182a1f07df7ad660b53d2c4
7
+ data.tar.gz: 4179fb47ff8d3e1febe646997d35fb23537c9ae78a2968d70df340174c50354ae86f1fd28029b2efbad485b0fe4aae275c1fc3fffb5525c4da5d0c75daf5bb5f
data/bin/runbypace CHANGED
@@ -11,5 +11,5 @@ rescue LoadError
11
11
  require_relative '../lib/runby_pace'
12
12
  end
13
13
 
14
- cli = Runby::Cli.new(ARGV)
15
- exit cli.run
14
+ cli = Runby::Cli::Cli.new(ARGV)
15
+ cli.run
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'readline'
4
+ require 'optparse'
5
+ require_relative 'config'
6
+
7
+ module Runby
8
+ module Cli
9
+ # Command line interface and REPL for RunbyPace
10
+ class Cli
11
+ def initialize(args = ARGV)
12
+ @args = args
13
+ @config = Config.new
14
+ @options = parse_options args
15
+ end
16
+
17
+ def run
18
+ puts 'Runby Pace REPL!'
19
+ bnd = binding
20
+ while (input = Readline.readline('🏃 ', true))
21
+ begin
22
+ result = bnd.eval input
23
+ rescue StandardError => e
24
+ puts "#{e.class}: #{e.message}"
25
+ else
26
+ puts result
27
+ end
28
+ end
29
+ end
30
+
31
+ def print_targets(five_k_time, distance_units = :mi)
32
+ five_k_time = @config['five_k_time'] if five_k_time.nil?
33
+
34
+ five_k_time = Runby.sanitize(five_k_time).as(RunbyTime)
35
+ puts "\nIf you can run a 5K in #{five_k_time}, your training paces should be:"
36
+ paces = []
37
+ RunTypes.all_classes.each do |run_type|
38
+ run = run_type.new
39
+ paces.push(description: run.description, pace: run.lookup_pace(five_k_time, distance_units))
40
+ end
41
+ paces.sort_by { |p| p[:pace].fast }.reverse_each { |p| puts " #{p[:description]}: #{p[:pace]}" }
42
+ nil
43
+ end
44
+
45
+ # -- Shortcuts for the REPL
46
+ def di(*args)
47
+ Distance.new(*args)
48
+ end
49
+
50
+ def du(*args)
51
+ DistanceUnit.new(*args)
52
+ end
53
+
54
+ def pc(*args)
55
+ Pace.new(*args)
56
+ end
57
+
58
+ def sp(*args)
59
+ Speed.new(*args)
60
+ end
61
+
62
+ def tm(*args)
63
+ RunbyTime.new(*args)
64
+ end
65
+
66
+ private
67
+
68
+ def parse_options(options)
69
+ args = { targets: nil }
70
+
71
+ OptionParser.new do |opts|
72
+ opts.banner = 'Usage: runbypace.rb [options]'
73
+
74
+ opts.on('-h', '--help', 'Display this help message') do
75
+ puts opts
76
+ exit
77
+ end
78
+
79
+ opts.on('-c', '--config [SETTING][=NEW_VALUE]', 'Get or set a configuration value') do |config|
80
+ manage_config config
81
+ exit
82
+ end
83
+
84
+ opts.on('-t', '--targets [5K race time]', 'Show target paces') do |targets|
85
+ args[:targets] = targets
86
+ print_targets targets
87
+ exit
88
+ end
89
+ end.parse!(options)
90
+ args
91
+ end
92
+
93
+ def manage_config(config)
94
+ c = parse_config_setting config
95
+ unless c.key
96
+ # No key specified. Print all settings.
97
+ @config.pretty_print
98
+ return
99
+ end
100
+ if c.value
101
+ # Set setting "key" to new "value"
102
+ @config[c.key] = c.value
103
+ return
104
+ end
105
+ if c.clear_setting
106
+ @config[c.key] = nil
107
+ else
108
+ # Print the value of setting "key"
109
+ p @config[c.key]
110
+ end
111
+ end
112
+
113
+ def parse_config_setting(setting)
114
+ setting = '' if setting.nil?
115
+ Class.new do
116
+ attr_reader :key, :value, :clear_setting
117
+ def initialize(setting)
118
+ tokens = setting.split('=')
119
+ @key = tokens[0]
120
+ @value = tokens[1]
121
+ @clear_setting = (@value.nil? && setting.include?('='))
122
+ end
123
+ end.new(setting)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'pp'
5
+
6
+ module Runby
7
+ #
8
+ module Cli
9
+ class Config
10
+ USER_CONFIG_PATH = File.expand_path('~/.runbypace').freeze
11
+
12
+ VALID_OPTIONS = {
13
+ five_k_time: { validate_as: RunbyTime }
14
+ }.freeze
15
+
16
+ def initialize
17
+ @settings = load_user_settings
18
+ end
19
+
20
+ def load_user_settings
21
+ if File.exist? USER_CONFIG_PATH
22
+ YAML.load_file USER_CONFIG_PATH
23
+ else
24
+ {}
25
+ end
26
+ end
27
+
28
+ def store_user_settings
29
+ File.open(USER_CONFIG_PATH, 'w') { |file| file.write @settings.to_yaml }
30
+ end
31
+
32
+ def [](key)
33
+ return unless known_setting?(key)
34
+ return unless option_configured?(key)
35
+ "#{key} => #{@settings[key]}"
36
+ end
37
+
38
+ def []=(key, value)
39
+ return unless known_setting?(key)
40
+ if value
41
+ value = sanitize_value key, value
42
+ return unless value
43
+ @settings[key] = value.to_s
44
+ else
45
+ @settings.delete(key)
46
+ end
47
+ store_user_settings
48
+ end
49
+
50
+ def pretty_print
51
+ pp @settings
52
+ end
53
+
54
+ def known_setting?(key)
55
+ unless VALID_OPTIONS.key?(key.to_sym)
56
+ puts "Unknown setting #{key}"
57
+ return false
58
+ end
59
+ true
60
+ end
61
+
62
+ def sanitize_value(key, value)
63
+ cls = VALID_OPTIONS[key.to_sym][:validate_as]
64
+ begin
65
+ value = Runby.sanitize(value).as(cls)
66
+ rescue StandardError => ex
67
+ value = nil
68
+ p ex.message
69
+ end
70
+ value
71
+ end
72
+
73
+ def option_configured?(key)
74
+ unless @settings.key? key
75
+ puts "#{key} not configured. Set with:\n\trunbypace --config #{key} VALUE"
76
+ false
77
+ end
78
+ true
79
+ end
80
+ end
81
+ end
82
+ end
data/lib/runby_pace.rb CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  require 'runby_pace/version'
3
3
  Dir[File.dirname(__FILE__) + '/runby_pace/*.rb'].each { |file| require file }
4
+ Dir[File.dirname(__FILE__) + '/runby_pace/cli/*.rb'].each { |file| require file }
4
5
  Dir[File.dirname(__FILE__) + '/runby_pace/run_types/*.rb'].each { |file| require file }
5
6
  Dir[File.dirname(__FILE__) + '/runby_pace/utility/*.rb'].each { |file| require file }
6
7
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runby_pace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.61.155
4
+ version: 0.61.156
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ty Walls
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-23 00:00:00.000000000 Z
11
+ date: 2017-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -74,7 +74,8 @@ files:
74
74
  - bin/runbypace
75
75
  - bin/setup
76
76
  - lib/runby_pace.rb
77
- - lib/runby_pace/cli.rb
77
+ - lib/runby_pace/cli/cli.rb
78
+ - lib/runby_pace/cli/config.rb
78
79
  - lib/runby_pace/distance.rb
79
80
  - lib/runby_pace/distance_unit.rb
80
81
  - lib/runby_pace/golden_pace_set.rb
@@ -108,7 +109,7 @@ homepage: https://github.com/tygerbytes/runby-pace
108
109
  licenses:
109
110
  - MIT
110
111
  metadata:
111
- commit-hash: f99f2d744c16c3eefe2df019698c65189b5af805
112
+ commit-hash: 8c0727f6450d43e4fcd00e44901c183622aa9062
112
113
  post_install_message:
113
114
  rdoc_options: []
114
115
  require_paths:
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'readline'
4
-
5
- module Runby
6
- # Command line interface and REPL for RunbyPace
7
- class Cli
8
- def initialize(args = ARGV)
9
- @args = args
10
- end
11
-
12
- def run
13
- puts 'Runby Pace REPL!'
14
- bnd = binding
15
- while (input = Readline.readline('🏃 ', true))
16
- begin
17
- result = bnd.eval input
18
- rescue StandardError => e
19
- puts "#{e.class}: #{e.message}"
20
- else
21
- puts result
22
- end
23
- end
24
- end
25
-
26
- def targets(five_k_time, distance_units = :mi)
27
- five_k_time = Runby.sanitize(five_k_time).as(RunbyTime)
28
- puts "\nIf you can run a 5K in #{five_k_time}, your training paces should be:"
29
- RunTypes.all_classes.each do |run_type|
30
- run = run_type.new
31
- puts " #{run.description}: #{run.lookup_pace(five_k_time, distance_units)}"
32
- end
33
- nil
34
- end
35
-
36
- # -- Shortcuts
37
- def d(*args)
38
- Distance.new(*args)
39
- end
40
-
41
- def du(*args)
42
- DistanceUnit.new(*args)
43
- end
44
-
45
- def p(*args)
46
- Pace.new(*args)
47
- end
48
-
49
- def s(*args)
50
- Speed.new(*args)
51
- end
52
-
53
- def t(*args)
54
- RunbyTime.new(*args)
55
- end
56
- end
57
- end