run_ical 0.5.0 → 0.7.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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +33 -0
  3. data/.rubocop.yml +34 -1
  4. data/Gemfile +3 -1
  5. data/README.md +51 -0
  6. data/Rakefile +5 -1
  7. data/exe/run_ical +13 -22
  8. data/lib/run_ical/data/advanced_10_k.rb +5 -2
  9. data/lib/run_ical/data/advanced_10_k.yaml +57 -0
  10. data/lib/run_ical/data/advanced_15_k.rb +5 -2
  11. data/lib/run_ical/data/advanced_15_k.yaml +71 -0
  12. data/lib/run_ical/data/advanced_5_k.rb +5 -2
  13. data/lib/run_ical/data/advanced_5_k.yaml +57 -0
  14. data/lib/run_ical/data/advanced_8_k.rb +11 -0
  15. data/lib/run_ical/data/advanced_8_k.yaml +57 -0
  16. data/lib/run_ical/data/half_marathon_advanced.rb +5 -2
  17. data/lib/run_ical/data/half_marathon_advanced.yaml +85 -0
  18. data/lib/run_ical/data/half_marathon_hm3.rb +5 -2
  19. data/lib/run_ical/data/half_marathon_hm3.yaml +85 -0
  20. data/lib/run_ical/data/half_marathon_intermediate1.rb +5 -2
  21. data/lib/run_ical/data/half_marathon_intermediate1.yaml +85 -0
  22. data/lib/run_ical/data/half_marathon_intermediate2.rb +5 -2
  23. data/lib/run_ical/data/half_marathon_intermediate2.yaml +85 -0
  24. data/lib/run_ical/data/half_marathon_novice1.rb +5 -2
  25. data/lib/run_ical/data/half_marathon_novice1.yaml +85 -0
  26. data/lib/run_ical/data/half_marathon_novice2.rb +5 -2
  27. data/lib/run_ical/data/half_marathon_novice2.yaml +85 -0
  28. data/lib/run_ical/data/half_marathon_walkers.rb +11 -0
  29. data/lib/run_ical/data/half_marathon_walkers.yaml +85 -0
  30. data/lib/run_ical/data/intermediate_10_k.rb +5 -2
  31. data/lib/run_ical/data/intermediate_10_k.yaml +57 -0
  32. data/lib/run_ical/data/intermediate_15_k.rb +5 -2
  33. data/lib/run_ical/data/intermediate_15_k.yaml +71 -0
  34. data/lib/run_ical/data/intermediate_5_k.rb +5 -2
  35. data/lib/run_ical/data/intermediate_5_k.yaml +57 -0
  36. data/lib/run_ical/data/intermediate_8_k.rb +5 -2
  37. data/lib/run_ical/data/intermediate_8_k.yaml +57 -0
  38. data/lib/run_ical/data/marathon_3.rb +11 -0
  39. data/lib/run_ical/data/marathon_3.yaml +169 -0
  40. data/lib/run_ical/data/marathon_advanced1.rb +11 -0
  41. data/lib/run_ical/data/marathon_advanced1.yaml +127 -0
  42. data/lib/run_ical/data/marathon_advanced2.rb +11 -0
  43. data/lib/run_ical/data/marathon_advanced2.yaml +127 -0
  44. data/lib/run_ical/data/marathon_boston_bound.rb +11 -0
  45. data/lib/run_ical/data/marathon_boston_bound.yaml +86 -0
  46. data/lib/run_ical/data/marathon_dopey_challenge.rb +11 -0
  47. data/lib/run_ical/data/marathon_dopey_challenge.yaml +127 -0
  48. data/lib/run_ical/data/marathon_intermediate1.rb +11 -0
  49. data/lib/run_ical/data/marathon_intermediate1.yaml +127 -0
  50. data/lib/run_ical/data/marathon_intermediate2.rb +11 -0
  51. data/lib/run_ical/data/marathon_intermediate2.yaml +127 -0
  52. data/lib/run_ical/data/marathon_novice1.rb +5 -2
  53. data/lib/run_ical/data/marathon_novice1.yaml +127 -0
  54. data/lib/run_ical/data/marathon_novice2.rb +4 -1
  55. data/lib/run_ical/data/marathon_novice2.yaml +90 -89
  56. data/lib/run_ical/data/marathon_novice_supreme.rb +11 -0
  57. data/lib/run_ical/data/marathon_novice_supreme.yaml +211 -0
  58. data/lib/run_ical/data/marathon_personal_best.rb +11 -0
  59. data/lib/run_ical/data/marathon_personal_best.yaml +211 -0
  60. data/lib/run_ical/data/marathon_senior.rb +11 -0
  61. data/lib/run_ical/data/marathon_senior.yaml +57 -0
  62. data/lib/run_ical/data/novice_10_k.rb +5 -2
  63. data/lib/run_ical/data/novice_10_k.yaml +57 -0
  64. data/lib/run_ical/data/novice_15_k.rb +5 -2
  65. data/lib/run_ical/data/novice_15_k.yaml +71 -0
  66. data/lib/run_ical/data/novice_5_k.rb +5 -2
  67. data/lib/run_ical/data/novice_5_k.yaml +57 -0
  68. data/lib/run_ical/data/novice_8_k.rb +5 -2
  69. data/lib/run_ical/data/novice_8_k.yaml +57 -0
  70. data/lib/run_ical/data/walkers_5_k.rb +5 -2
  71. data/lib/run_ical/data/walkers_5_k.yaml +57 -0
  72. data/lib/run_ical/data/walking_10_k.rb +5 -2
  73. data/lib/run_ical/data/walking_10_k.yaml +57 -0
  74. data/lib/run_ical/data.rb +33 -0
  75. data/lib/run_ical/version.rb +3 -1
  76. data/lib/run_ical.rb +47 -27
  77. data/run_ical.gemspec +15 -10
  78. data/tasks/higdon_programs.yml +211 -0
  79. data/tasks/refresh_data.rake +167 -0
  80. metadata +96 -36
  81. data/.travis.yml +0 -5
@@ -0,0 +1,57 @@
1
+ ---
2
+ - activity: Rest
3
+ - activity: 4 mi pace
4
+ - activity: Stretch & strengthen
5
+ - activity: 8 mi easy
6
+ - activity: Stretch & strengthen
7
+ - activity: Rest
8
+ - activity: 12 mi easy
9
+ - activity: Rest
10
+ - activity: 6 mi easy pace
11
+ - activity: Stretch & strengthen
12
+ - activity: 6 mi easy
13
+ - activity: Stretch & strengthen
14
+ - activity: Rest
15
+ - activity: 14 mi easy
16
+ - activity: Rest
17
+ - activity: 4 mi pace
18
+ - activity: Stretch & strengthen
19
+ - activity: 8 mi easy
20
+ - activity: Stretch & strengthen
21
+ - activity: Rest
22
+ - activity: 12 mi easy
23
+ - activity: Rest
24
+ - activity: 6 mi easy pace
25
+ - activity: Stretch & strengthen
26
+ - activity: 6 mi easy
27
+ - activity: Stretch & strengthen
28
+ - activity: Rest
29
+ - activity: 16 mi easy
30
+ - activity: Rest
31
+ - activity: 4 mi pace
32
+ - activity: Stretch & strengthen
33
+ - activity: 10 mi easy
34
+ - activity: Stretch & strengthen
35
+ - activity: Rest
36
+ - activity: 12 mi easy
37
+ - activity: Rest
38
+ - activity: 6 mi easy pace
39
+ - activity: Stretch & strengthen
40
+ - activity: 6 mi easy
41
+ - activity: Stretch & strengthen
42
+ - activity: Rest
43
+ - activity: 20 mi easy
44
+ - activity: Rest
45
+ - activity: 4 mi pace
46
+ - activity: Stretch & strengthen
47
+ - activity: 8 mi easy
48
+ - activity: Stretch & strengthen
49
+ - activity: Rest
50
+ - activity: 12 mi easy
51
+ - activity: Rest
52
+ - activity: 6 mi easy pace
53
+ - activity: Stretch & strengthen
54
+ - activity: Rest
55
+ - activity: Rest
56
+ - activity: Rest
57
+ - activity: Marathon
@@ -1,8 +1,11 @@
1
1
  module RunIcal
2
2
  module Data
3
3
  class Novice10K
4
- DESCRIPTION = "10-K - Novice "
5
- DATA = [{:activity=>"Rest"}, {:activity=>"2.5 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"40 min cross"}, {:activity=>"3 m run"}, {:activity=>"Rest"}, {:activity=>"2.5 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"40 min cross"}, {:activity=>"3.5 m run"}, {:activity=>"Rest"}, {:activity=>"2.5 m run"}, {:activity=>"35 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"50 min cross"}, {:activity=>"4 m run"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"35 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"50 min cross"}, {:activity=>"4 m run"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"40 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"60 min cross"}, {:activity=>"4.5 m run"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"40 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"60 min cross"}, {:activity=>"5 m run"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"45 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"60 min cross"}, {:activity=>"5.5 m run"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"Rest"}, {:activity=>"10-K Run\r\n\t\t\t "}]
4
+ DISTANCE = "10-K"
5
+ LEVEL = "Novice"
6
+ POSITION = 7
7
+ DESCRIPTION = "#{DISTANCE} - #{LEVEL}"
8
+ DATA = YAML.safe_load_file(File.join(__dir__, 'novice_10_k.yaml'), symbolize_names: true)
6
9
  end
7
10
  end
8
11
  end
@@ -0,0 +1,57 @@
1
+ ---
2
+ - activity: Rest
3
+ - activity: 2.5 mi run
4
+ - activity: 30 min cross
5
+ - activity: 2 mi run
6
+ - activity: Rest
7
+ - activity: 40 min cross
8
+ - activity: 3 mi run
9
+ - activity: Rest
10
+ - activity: 2.5 mi run
11
+ - activity: 30 min cross
12
+ - activity: 2 mi run
13
+ - activity: Rest
14
+ - activity: 40 min cross
15
+ - activity: 3.5 mi run
16
+ - activity: Rest
17
+ - activity: 2.5 mi run
18
+ - activity: 35 min cross
19
+ - activity: 2 mi run
20
+ - activity: Rest
21
+ - activity: 50 min cross
22
+ - activity: 4 mi run
23
+ - activity: Rest
24
+ - activity: 3 mi run
25
+ - activity: 35 min cross
26
+ - activity: 2 mi run
27
+ - activity: Rest
28
+ - activity: 50 min cross
29
+ - activity: 4 mi run
30
+ - activity: Rest
31
+ - activity: 3 mi run
32
+ - activity: 40 min cross
33
+ - activity: 2 mi run
34
+ - activity: Rest
35
+ - activity: 60 min cross
36
+ - activity: 4.5 mi run
37
+ - activity: Rest
38
+ - activity: 3 mi run
39
+ - activity: 40 min cross
40
+ - activity: 2 mi run
41
+ - activity: Rest
42
+ - activity: 60 min cross
43
+ - activity: 5 mi run
44
+ - activity: Rest
45
+ - activity: 3 mi run
46
+ - activity: 45 min cross
47
+ - activity: 2 mi run
48
+ - activity: Rest
49
+ - activity: 60 min cross
50
+ - activity: 5.5 mi run
51
+ - activity: Rest
52
+ - activity: 3 mi run
53
+ - activity: 30 min cross
54
+ - activity: 2 mi run
55
+ - activity: Rest
56
+ - activity: Rest
57
+ - activity: 10K Run
@@ -1,8 +1,11 @@
1
1
  module RunIcal
2
2
  module Data
3
3
  class Novice15K
4
- DESCRIPTION = "15-K - Novice "
5
- DATA = [{:activity=>"Stretch & strengthen"}, {:activity=>"2 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"2 m run"}, {:activity=>"30 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"3 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"30 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"3 m run"}, {:activity=>"35 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"4 m run"}, {:activity=>"30 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"2 m run"}, {:activity=>"35 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"2 m run"}, {:activity=>"40 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"4 m run"}, {:activity=>"40 min cross"}, {:activity=>"3 m run + strength"}, {:activity=>"Rest"}, {:activity=>"5 m run"}, {:activity=>"40 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"4 m run"}, {:activity=>"40 min cross"}, {:activity=>"3 m run + strength"}, {:activity=>"Rest"}, {:activity=>"6 m run"}, {:activity=>"50 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"3 m run"}, {:activity=>"45 min cross"}, {:activity=>"3 m run + strength"}, {:activity=>"Rest"}, {:activity=>"4 m run"}, {:activity=>"50 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"5 m run"}, {:activity=>"45 min cross"}, {:activity=>"3 m run + strength"}, {:activity=>"Rest"}, {:activity=>"7 m run"}, {:activity=>"60 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"5 m run"}, {:activity=>"45 min cross"}, {:activity=>"3 m run + strength"}, {:activity=>"Rest"}, {:activity=>"8 m run"}, {:activity=>"60 min cross"}, {:activity=>"Stretch & strengthen"}, {:activity=>"3 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"2 m run or rest"}, {:activity=>"Rest"}, {:activity=>"15-K Race"}]
4
+ DISTANCE = "15-K"
5
+ LEVEL = "Novice"
6
+ POSITION = 11
7
+ DESCRIPTION = "#{DISTANCE} - #{LEVEL}"
8
+ DATA = YAML.safe_load_file(File.join(__dir__, 'novice_15_k.yaml'), symbolize_names: true)
6
9
  end
7
10
  end
8
11
  end
@@ -0,0 +1,71 @@
1
+ ---
2
+ - activity: Stretch & strengthen
3
+ - activity: 2 mi run
4
+ - activity: 30 min cross
5
+ - activity: 2 mi run + strength
6
+ - activity: Rest
7
+ - activity: 2 mi run
8
+ - activity: 30 min cross
9
+ - activity: Stretch & strengthen
10
+ - activity: 3 mi run
11
+ - activity: 30 min cross
12
+ - activity: 2 mi run + strength
13
+ - activity: Rest
14
+ - activity: 3 mi run
15
+ - activity: 30 min cross
16
+ - activity: Stretch & strengthen
17
+ - activity: 3 mi run
18
+ - activity: 35 min cross
19
+ - activity: 2 mi run + strength
20
+ - activity: Rest
21
+ - activity: 4 mi run
22
+ - activity: 30 min cross
23
+ - activity: Stretch & strengthen
24
+ - activity: 2 mi run
25
+ - activity: 35 min cross
26
+ - activity: 2 mi run + strength
27
+ - activity: Rest
28
+ - activity: 2 mi run
29
+ - activity: 40 min cross
30
+ - activity: Stretch & strengthen
31
+ - activity: 4 mi run
32
+ - activity: 40 min cross
33
+ - activity: 3 mi run + strength
34
+ - activity: Rest
35
+ - activity: 5 mi run
36
+ - activity: 40 min cross
37
+ - activity: Stretch & strengthen
38
+ - activity: 4 mi run
39
+ - activity: 40 min cross
40
+ - activity: 3 mi run + strength
41
+ - activity: Rest
42
+ - activity: 6 mi run
43
+ - activity: 50 min cross
44
+ - activity: Stretch & strengthen
45
+ - activity: 3 mi run
46
+ - activity: 45 min cross
47
+ - activity: 3 mi run + strength
48
+ - activity: Rest
49
+ - activity: 4 mi run
50
+ - activity: 50 min cross
51
+ - activity: Stretch & strengthen
52
+ - activity: 5 mi run
53
+ - activity: 45 min cross
54
+ - activity: 3 mi run + strength
55
+ - activity: Rest
56
+ - activity: 7 mi run
57
+ - activity: 60 min cross
58
+ - activity: Stretch & strengthen
59
+ - activity: 5 mi run
60
+ - activity: 45 min cross
61
+ - activity: 3 mi run + strength
62
+ - activity: Rest
63
+ - activity: 8 mi run
64
+ - activity: 60 min cross
65
+ - activity: Stretch & strengthen
66
+ - activity: 3 mi run
67
+ - activity: 30 min cross
68
+ - activity: 2 mi run + strength
69
+ - activity: 2 mi run or rest
70
+ - activity: Rest
71
+ - activity: 15K Race
@@ -1,8 +1,11 @@
1
1
  module RunIcal
2
2
  module Data
3
3
  class Novice5K
4
- DESCRIPTION = "5-K : Novice"
5
- DATA = [{:activity=>"Rest or run/walk"}, {:activity=>"1.5 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"1.5 m run"}, {:activity=>"Rest"}, {:activity=>"1.5 m run"}, {:activity=>"30 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"1.75 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"1.5 m run"}, {:activity=>"Rest"}, {:activity=>"1.75 m run"}, {:activity=>"35 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"2 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"1.5 m run"}, {:activity=>"Rest"}, {:activity=>"2 m run"}, {:activity=>"40 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"2.25 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"1.5 m run"}, {:activity=>"Rest"}, {:activity=>"2.25 m run"}, {:activity=>"45 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"2.5 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"2.5 m run"}, {:activity=>"50 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"2.75 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"2.75 m run"}, {:activity=>"55 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"3 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"3 m run"}, {:activity=>"60 min walk"}, {:activity=>"Rest or run/walk"}, {:activity=>"3 m run"}, {:activity=>"Rest or run/walk"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"Rest"}, {:activity=>"5-K Race"}]
4
+ DISTANCE = "5-K"
5
+ LEVEL = "Novice"
6
+ POSITION = 0
7
+ DESCRIPTION = "#{DISTANCE} - #{LEVEL}"
8
+ DATA = YAML.safe_load_file(File.join(__dir__, 'novice_5_k.yaml'), symbolize_names: true)
6
9
  end
7
10
  end
8
11
  end
@@ -0,0 +1,57 @@
1
+ ---
2
+ - activity: Rest or run/walk
3
+ - activity: 1.5 mi run
4
+ - activity: Rest or run/walk
5
+ - activity: 1.5 mi run
6
+ - activity: Rest
7
+ - activity: 1.5 mi run
8
+ - activity: 30 min walk
9
+ - activity: Rest or run/walk
10
+ - activity: 1.75 mi run
11
+ - activity: Rest or run/walk
12
+ - activity: 1.5 mi run
13
+ - activity: Rest
14
+ - activity: 1.75 mi run
15
+ - activity: 35 min walk
16
+ - activity: Rest or run/walk
17
+ - activity: 2 mi run
18
+ - activity: Rest or run/walk
19
+ - activity: 1.5 mi run
20
+ - activity: Rest
21
+ - activity: 2 mi run
22
+ - activity: 40 min walk
23
+ - activity: Rest or run/walk
24
+ - activity: 2.25 mi run
25
+ - activity: Rest or run/walk
26
+ - activity: 1.5 mi run
27
+ - activity: Rest
28
+ - activity: 2.25 mi run
29
+ - activity: 45 min walk
30
+ - activity: Rest or run/walk
31
+ - activity: 2.5 mi run
32
+ - activity: Rest or run/walk
33
+ - activity: 2 mi run
34
+ - activity: Rest
35
+ - activity: 2.5 mi run
36
+ - activity: 50 min walk
37
+ - activity: Rest or run/walk
38
+ - activity: 2.75 mi run
39
+ - activity: Rest or run/walk
40
+ - activity: 2 mi run
41
+ - activity: Rest
42
+ - activity: 2.75 mi run
43
+ - activity: 55 min walk
44
+ - activity: Rest or run/walk
45
+ - activity: 3 mi run
46
+ - activity: Rest or run/walk
47
+ - activity: 2 mi run
48
+ - activity: Rest
49
+ - activity: 3 mi run
50
+ - activity: 60 min walk
51
+ - activity: Rest or run/walk
52
+ - activity: 3 mi run
53
+ - activity: Rest or run/walk
54
+ - activity: 2 mi run
55
+ - activity: Rest
56
+ - activity: Rest
57
+ - activity: 5K Race
@@ -1,8 +1,11 @@
1
1
  module RunIcal
2
2
  module Data
3
3
  class Novice8K
4
- DESCRIPTION = "8-K - Novice "
5
- DATA = [{:activity=>"Stretch & strength"}, {:activity=>"2 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"30 min cross"}, {:activity=>"2 m run"}, {:activity=>"Stretch & strength"}, {:activity=>"2 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"30 min cross"}, {:activity=>"2.5 m run"}, {:activity=>"Stretch & strength"}, {:activity=>"2.5 m run"}, {:activity=>"35 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"40 min cross"}, {:activity=>"3 m run"}, {:activity=>"Stretch & strength"}, {:activity=>"2.5 m run"}, {:activity=>"35 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"40 min cross"}, {:activity=>"3.5 m run\r\n "}, {:activity=>"Stretch & strength"}, {:activity=>"2.5 m run"}, {:activity=>"40 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"50 min cross"}, {:activity=>"4 m run"}, {:activity=>"Stretch & strength"}, {:activity=>"3 m run"}, {:activity=>"40 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"50 min cross"}, {:activity=>"4 m run"}, {:activity=>"Stretch & strength"}, {:activity=>"3 m run"}, {:activity=>"45 min cross"}, {:activity=>"2 m run + strength"}, {:activity=>"Rest"}, {:activity=>"60 min cross"}, {:activity=>"4.5 m run"}, {:activity=>"Stretch & strength"}, {:activity=>"3 m run"}, {:activity=>"30 min cross"}, {:activity=>"2 m run"}, {:activity=>"Rest"}, {:activity=>"Rest or 60 min cross"}, {:activity=>"Rest"}]
4
+ DISTANCE = "8-K"
5
+ LEVEL = "Novice"
6
+ POSITION = 4
7
+ DESCRIPTION = "#{DISTANCE} - #{LEVEL}"
8
+ DATA = YAML.safe_load_file(File.join(__dir__, 'novice_8_k.yaml'), symbolize_names: true)
6
9
  end
7
10
  end
8
11
  end
@@ -0,0 +1,57 @@
1
+ ---
2
+ - activity: Stretch & strength
3
+ - activity: 2 mi run
4
+ - activity: 30 min cross
5
+ - activity: 2 mi run + strength
6
+ - activity: Rest
7
+ - activity: 30 min cross
8
+ - activity: 2 mi run
9
+ - activity: Stretch & strength
10
+ - activity: 2 mi run
11
+ - activity: 30 min cross
12
+ - activity: 2 mi run + strength
13
+ - activity: Rest
14
+ - activity: 30 min cross
15
+ - activity: 2.5 mi run
16
+ - activity: Stretch & strength
17
+ - activity: 2.5 mi run
18
+ - activity: 35 min cross
19
+ - activity: 2 mi run + strength
20
+ - activity: Rest
21
+ - activity: 40 min cross
22
+ - activity: 3 mi run
23
+ - activity: Stretch & strength
24
+ - activity: 2.5 mi run
25
+ - activity: 35 min cross
26
+ - activity: 2 mi run + strength
27
+ - activity: Rest
28
+ - activity: 40 min cross
29
+ - activity: 3.5 mi run
30
+ - activity: Stretch & strength
31
+ - activity: 2.5 mi run
32
+ - activity: 40 min cross
33
+ - activity: 2 mi run + strength
34
+ - activity: Rest
35
+ - activity: 50 min cross
36
+ - activity: 4 mi run
37
+ - activity: Stretch & strength
38
+ - activity: 3 mi run
39
+ - activity: 40 min cross
40
+ - activity: 2 mi run + strength
41
+ - activity: Rest
42
+ - activity: 50 min cross
43
+ - activity: 4 mi run
44
+ - activity: Stretch & strength
45
+ - activity: 3 mi run
46
+ - activity: 45 min cross
47
+ - activity: 2 mi run + strength
48
+ - activity: Rest
49
+ - activity: 60 min cross
50
+ - activity: 4.5 mi run
51
+ - activity: Stretch & strength
52
+ - activity: 3 mi run
53
+ - activity: 30 min cross
54
+ - activity: 2 mi run
55
+ - activity: Rest
56
+ - activity: Rest or 60 min cross
57
+ - activity: 8K Race
@@ -1,8 +1,11 @@
1
1
  module RunIcal
2
2
  module Data
3
3
  class Walkers5K
4
- DESCRIPTION = "5-K - Walkers "
5
- DATA = [{:activity=>"Rest or walk"}, {:activity=>"15 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"15 min walk"}, {:activity=>"Rest"}, {:activity=>"1.5 m walk"}, {:activity=>"30-60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"15 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"15 min walk"}, {:activity=>"Rest"}, {:activity=>"1.75 m walk"}, {:activity=>"35-60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"20 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"20 min walk"}, {:activity=>"Rest"}, {:activity=>"2 m walk"}, {:activity=>"40-60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"20 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"20 min walk"}, {:activity=>"Rest"}, {:activity=>"2.25 m walk"}, {:activity=>"45-60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"25 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"25 min walk"}, {:activity=>"Rest"}, {:activity=>"2.5 m walk"}, {:activity=>"50-60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"25 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"25 min walk"}, {:activity=>"Rest"}, {:activity=>"2.75 m walk"}, {:activity=>"55-60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest"}, {:activity=>"3 m walk"}, {:activity=>"60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest"}, {:activity=>"Rest"}, {:activity=>"5-K Race"}]
4
+ DISTANCE = "5-K"
5
+ LEVEL = "Walkers"
6
+ POSITION = 3
7
+ DESCRIPTION = "#{DISTANCE} - #{LEVEL}"
8
+ DATA = YAML.safe_load_file(File.join(__dir__, 'walkers_5_k.yaml'), symbolize_names: true)
6
9
  end
7
10
  end
8
11
  end
@@ -0,0 +1,57 @@
1
+ ---
2
+ - activity: Rest or walk
3
+ - activity: 15 min walk
4
+ - activity: Rest or walk
5
+ - activity: 15 min walk
6
+ - activity: Rest
7
+ - activity: 1.5 mi walk
8
+ - activity: 30-60 min walk
9
+ - activity: Rest or walk
10
+ - activity: 15 min walk
11
+ - activity: Rest or walk
12
+ - activity: 15 min walk
13
+ - activity: Rest
14
+ - activity: 1.75 mi walk
15
+ - activity: 35-60 min walk
16
+ - activity: Rest or walk
17
+ - activity: 20 min walk
18
+ - activity: Rest or walk
19
+ - activity: 20 min walk
20
+ - activity: Rest
21
+ - activity: 2 mi walk
22
+ - activity: 40-60 min walk
23
+ - activity: Rest or walk
24
+ - activity: 20 min walk
25
+ - activity: Rest or walk
26
+ - activity: 20 min walk
27
+ - activity: Rest
28
+ - activity: 2.25 mi walk
29
+ - activity: 45-60 min walk
30
+ - activity: Rest or walk
31
+ - activity: 25 min walk
32
+ - activity: Rest or walk
33
+ - activity: 25 min walk
34
+ - activity: Rest
35
+ - activity: 2.5 mi walk
36
+ - activity: 50-60 min walk
37
+ - activity: Rest or walk
38
+ - activity: 25 min walk
39
+ - activity: Rest or walk
40
+ - activity: 25 min walk
41
+ - activity: Rest
42
+ - activity: 2.75 mi walk
43
+ - activity: 55-60 min walk
44
+ - activity: Rest or walk
45
+ - activity: 30 min walk
46
+ - activity: Rest or walk
47
+ - activity: 30 min walk
48
+ - activity: Rest
49
+ - activity: 3 mi walk
50
+ - activity: 60 min walk
51
+ - activity: Rest or walk
52
+ - activity: 30 min walk
53
+ - activity: Rest or walk
54
+ - activity: 30 min walk
55
+ - activity: Rest
56
+ - activity: Rest
57
+ - activity: 5K Race
@@ -1,8 +1,11 @@
1
1
  module RunIcal
2
2
  module Data
3
3
  class Walking10K
4
- DESCRIPTION = "10-K - Walking "
5
- DATA = [{:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest"}, {:activity=>"3 m walk"}, {:activity=>"45-90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"35 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"35 min walk"}, {:activity=>"Rest"}, {:activity=>"3.5 m walk"}, {:activity=>"55-90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"40 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"40 min walk"}, {:activity=>"Rest"}, {:activity=>"4 m walk"}, {:activity=>"65-90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"45 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"45 min walk"}, {:activity=>"Rest"}, {:activity=>"4.5 m walk"}, {:activity=>"75-90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"50 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"50 min walk"}, {:activity=>"Rest"}, {:activity=>"5 m walk"}, {:activity=>"80-90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"55 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"55 min walk"}, {:activity=>"Rest"}, {:activity=>"5.5 m walk"}, {:activity=>"85-90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"60 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"60 min walk"}, {:activity=>"Rest"}, {:activity=>"6 m walk"}, {:activity=>"90 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest or walk"}, {:activity=>"30 min walk"}, {:activity=>"Rest"}, {:activity=>"Rest"}, {:activity=>"10-K Walk"}]
4
+ DISTANCE = "10-K"
5
+ LEVEL = "Walkers"
6
+ POSITION = 10
7
+ DESCRIPTION = "#{DISTANCE} - #{LEVEL}"
8
+ DATA = YAML.safe_load_file(File.join(__dir__, 'walking_10_k.yaml'), symbolize_names: true)
6
9
  end
7
10
  end
8
11
  end
@@ -0,0 +1,57 @@
1
+ ---
2
+ - activity: Rest or walk
3
+ - activity: 30 min walk
4
+ - activity: Rest or walk
5
+ - activity: 30 min walk
6
+ - activity: Rest
7
+ - activity: 3 mi walk
8
+ - activity: 45-90 min walk
9
+ - activity: Rest or walk
10
+ - activity: 35 min walk
11
+ - activity: Rest or walk
12
+ - activity: 35 min walk
13
+ - activity: Rest
14
+ - activity: 3.5 mi walk
15
+ - activity: 55-90 min walk
16
+ - activity: Rest or walk
17
+ - activity: 40 min walk
18
+ - activity: Rest or walk
19
+ - activity: 40 min walk
20
+ - activity: Rest
21
+ - activity: 4 mi walk
22
+ - activity: 65-90 min walk
23
+ - activity: Rest or walk
24
+ - activity: 45 min walk
25
+ - activity: Rest or walk
26
+ - activity: 45 min walk
27
+ - activity: Rest
28
+ - activity: 4.5 mi walk
29
+ - activity: 75-90 min walk
30
+ - activity: Rest or walk
31
+ - activity: 50 min walk
32
+ - activity: Rest or walk
33
+ - activity: 50 min walk
34
+ - activity: Rest
35
+ - activity: 5 mi walk
36
+ - activity: 80-90 min walk
37
+ - activity: Rest or walk
38
+ - activity: 55 min walk
39
+ - activity: Rest or walk
40
+ - activity: 55 min walk
41
+ - activity: Rest
42
+ - activity: 5.5 mi walk
43
+ - activity: 85-90 min walk
44
+ - activity: Rest or walk
45
+ - activity: 60 min walk
46
+ - activity: Rest or walk
47
+ - activity: 60 min walk
48
+ - activity: Rest
49
+ - activity: 6 mi walk
50
+ - activity: 90 min walk
51
+ - activity: Rest or walk
52
+ - activity: 30 min walk
53
+ - activity: Rest or walk
54
+ - activity: 30 min walk
55
+ - activity: Rest
56
+ - activity: Rest
57
+ - activity: 10K Walk
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RunIcal
4
+ # Namespace for the training plans in lib/run_ical/data.
5
+ #
6
+ # `constants` returns them in load order, which is alphabetical by filename and
7
+ # puts every Advanced plan before every Novice one. These helpers present them
8
+ # the way a runner would expect: by distance ascending, then by difficulty.
9
+ module Data
10
+ class << self
11
+ # Every program class, ordered for display.
12
+ def programs
13
+ constants.map { |name| const_get(name) }.sort_by { |program| program::POSITION }
14
+ end
15
+
16
+ # Programs grouped by distance, both groups and members in display order.
17
+ # Suitable for rendering <optgroup>s.
18
+ #
19
+ # RunIcal::Data.by_distance["5-K"].map(&:DESCRIPTION)
20
+ # #=> ["5-K - Novice", "5-K - Intermediate", ...]
21
+ def by_distance
22
+ programs.group_by { |program| program::DISTANCE }
23
+ end
24
+
25
+ # Look up a program class by its name, or nil.
26
+ def find(name)
27
+ return nil unless constants.include?(name.to_sym)
28
+
29
+ const_get(name.to_sym)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RunIcal
2
- VERSION = "0.5.0"
4
+ VERSION = "0.7.0"
3
5
  end
data/lib/run_ical.rb CHANGED
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "run_ical/version"
2
4
  require "yaml"
3
5
  require "base64"
4
- Dir[File.expand_path("../run_ical/data/*.rb", __FILE__)].each do |file|
6
+ require "run_ical/data"
7
+ Dir[File.expand_path("run_ical/data/*.rb", __dir__)].each do |file|
5
8
  require file
6
9
  end
7
10
 
@@ -9,10 +12,11 @@ require "icalendar"
9
12
 
10
13
  module RunIcal
11
14
  class Generator
15
+ ALARM_TRIGGER = "-P1DT0H0M0S" # 1 day before
16
+
12
17
  def self.generate(race_date:, program:)
13
- unless RunIcal::Data.constants.include?(program.to_sym)
14
- raise ArgumentError, "#{program} is unsupported"
15
- end
18
+ raise ArgumentError, "#{program} is unsupported" unless RunIcal::Data.constants.include?(program.to_sym)
19
+
16
20
  program = program.to_sym
17
21
  new(race_date: race_date, program: program).generate
18
22
  end
@@ -23,36 +27,52 @@ module RunIcal
23
27
  end
24
28
 
25
29
  def generate
26
- description = @program.const_get(:DESCRIPTION)
27
- data = @program.const_get(:DATA)
28
30
  cal = Icalendar::Calendar.new
29
- cal.x_wr_calname = "#{description} for #{@race_date}"
30
- start_date_padding = @race_date.saturday? ? 2 : 1
31
- start_date = @race_date - (data.size - start_date_padding).days
31
+ cal.x_wr_calname = "#{@program.const_get(:DESCRIPTION)} for #{@race_date}"
32
+ training_days.each { |date, activity| add_event(cal, date, activity) }
33
+ cal.publish
34
+ cal.to_ical
35
+ end
32
36
 
33
- date_list = (start_date..@race_date).to_a
34
- date_list.each.with_index do |date, index|
35
- activity = data[index][:activity]
37
+ private
36
38
 
37
- if activity =~ /rest/i && @race_date.saturday? && index == date_list.size - 1
38
- activity = data[index + 1][:activity]
39
- end
39
+ def data
40
+ @program.const_get(:DATA)
41
+ end
40
42
 
41
- cal.event do |e|
42
- e.dtstart = Icalendar::Values::Date.new(date)
43
- e.dtend = Icalendar::Values::Date.new(date)
44
- e.summary = activity
45
- e.ip_class = "PUBLIC"
43
+ # The plan is anchored to race day and counted backwards, so the last day of the
44
+ # program always lands on the race.
45
+ def training_days
46
+ dates = (start_date..@race_date).to_a
47
+ dates.each_with_index.map { |date, index| [date, activity_at(index, dates.size)] }
48
+ end
46
49
 
47
- e.alarm do |a|
48
- a.summary = activity
49
- a.trigger = "-P1DT0H0M0S" # 1 day before
50
- end
50
+ def start_date
51
+ padding = @race_date.saturday? ? 2 : 1
52
+ @race_date - (data.size - padding).days
53
+ end
54
+
55
+ # Plans end on a Sunday, so a Saturday race would otherwise finish on the rest day
56
+ # that precedes it. Skip that rest day and use the race instead.
57
+ def activity_at(index, count)
58
+ activity = data[index][:activity]
59
+ return activity unless @race_date.saturday? && index == count - 1 && activity.match?(/rest/i)
60
+
61
+ data[index + 1][:activity]
62
+ end
63
+
64
+ def add_event(cal, date, activity)
65
+ cal.event do |e|
66
+ e.dtstart = Icalendar::Values::Date.new(date)
67
+ e.dtend = Icalendar::Values::Date.new(date)
68
+ e.summary = activity
69
+ e.ip_class = "PUBLIC"
70
+
71
+ e.alarm do |a|
72
+ a.summary = activity
73
+ a.trigger = ALARM_TRIGGER
51
74
  end
52
75
  end
53
-
54
- cal.publish
55
- cal.to_ical
56
76
  end
57
77
  end
58
78
  end