Gooby 0.9.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 (98) hide show
  1. data/README +218 -0
  2. data/bin/forerunner_xml_parser.rb +28 -0
  3. data/bin/forerunner_xml_parser.sh +16 -0
  4. data/bin/forerunner_xml_splitter.rb +60 -0
  5. data/bin/gen_gmap.rb +30 -0
  6. data/bin/gen_gmap.sh +19 -0
  7. data/bin/tests_gen.rb +13 -0
  8. data/data/20041113_richmond_marathon.csv +1036 -0
  9. data/data/20041113_richmond_marathon.xml +8663 -0
  10. data/data/20050305_corporate_cup_hm.csv +251 -0
  11. data/data/20050305_corporate_cup_hm.xml +2208 -0
  12. data/data/20050430_nashville_marathon.csv +1208 -0
  13. data/data/20050430_nashville_marathon.xml +10043 -0
  14. data/data/20051119_dowd_ymca_hm.csv +251 -0
  15. data/data/20051119_dowd_ymca_hm.xml +2210 -0
  16. data/data/20051124_hyatt_turkey_trot_8K.csv +321 -0
  17. data/data/20051124_hyatt_turkey_trot_8K.xml +2651 -0
  18. data/data/forerunner_2005.xml +259620 -0
  19. data/data/forerunner_2006.xml +190853 -0
  20. data/data/forerunner_2007.xml +259014 -0
  21. data/data/geo_data.txt +171 -0
  22. data/data/phx.csv +1280 -0
  23. data/data/phx.xml +10620 -0
  24. data/data/run_2007_01_01_16_38_27.xml +2020 -0
  25. data/data/run_2007_01_06_15_27_31.xml +2020 -0
  26. data/data/run_2007_01_10_12_25_47.xml +820 -0
  27. data/data/run_2007_01_10_22_44_54.csv +112 -0
  28. data/data/run_2007_01_10_22_44_54.xml +908 -0
  29. data/data/run_2007_01_11_10_48_45.xml +1292 -0
  30. data/data/run_2007_01_13_15_37_06.xml +1964 -0
  31. data/data/run_2007_01_14_15_46_02.xml +1368 -0
  32. data/data/run_2007_01_15_14_01_48.xml +1868 -0
  33. data/data/run_2007_01_20_16_22_05.xml +1702 -0
  34. data/data/run_2007_01_27_17_32_13.xml +3626 -0
  35. data/data/run_2007_01_28_19_14_52.xml +2538 -0
  36. data/data/run_2007_02_03_14_30_20.xml +2016 -0
  37. data/data/run_2007_02_04_18_02_30.xml +1476 -0
  38. data/data/run_2007_02_17_16_29_35.xml +1236 -0
  39. data/data/run_2007_02_19_14_44_33.xml +1816 -0
  40. data/data/run_2007_02_23_15_53_55.xml +36 -0
  41. data/data/run_2007_02_23_15_55_20.xml +1296 -0
  42. data/data/run_2007_02_24_15_01_35.csv +484 -0
  43. data/data/run_2007_02_24_15_01_35.xml +3884 -0
  44. data/data/test1.txt +4 -0
  45. data/lib/cls_counter_hash.rb +83 -0
  46. data/lib/cls_delim_line.rb +40 -0
  47. data/lib/cls_dttm.rb +84 -0
  48. data/lib/cls_duration.rb +87 -0
  49. data/lib/cls_forerunner_xml_parser.rb +183 -0
  50. data/lib/cls_forerunner_xml_splitter.rb +113 -0
  51. data/lib/cls_geo_data.rb +186 -0
  52. data/lib/cls_gooby_object.rb +23 -0
  53. data/lib/cls_google_map_generator.rb +368 -0
  54. data/lib/cls_history.rb +38 -0
  55. data/lib/cls_lap.rb +27 -0
  56. data/lib/cls_line.rb +78 -0
  57. data/lib/cls_options.rb +74 -0
  58. data/lib/cls_position.rb +49 -0
  59. data/lib/cls_run.rb +199 -0
  60. data/lib/cls_simple_xml_parser.rb +46 -0
  61. data/lib/cls_test_regen.rb +187 -0
  62. data/lib/cls_track.rb +52 -0
  63. data/lib/cls_trackpoint.rb +205 -0
  64. data/lib/mod_introspect.rb +33 -0
  65. data/lib/mod_io.rb +65 -0
  66. data/lib/mod_project_info.rb +81 -0
  67. data/lib/mod_string.rb +26 -0
  68. data/lib/mod_test_helper.rb +22 -0
  69. data/samples/20041113_richmond_marathon.html +532 -0
  70. data/samples/20050305_corporate_cup_hm.html +448 -0
  71. data/samples/20050430_nashville_marathon.html +530 -0
  72. data/samples/gps_point_capture.html +54 -0
  73. data/samples/phoenix_marathon.html +542 -0
  74. data/samples/run_2007_01_10_22_44_54.html +146 -0
  75. data/samples/run_2007_02_24_15_01_35.html +298 -0
  76. data/tests/tst_cls_counter_hash.rb +105 -0
  77. data/tests/tst_cls_delim_line.rb +72 -0
  78. data/tests/tst_cls_dttm.rb +129 -0
  79. data/tests/tst_cls_duration.rb +49 -0
  80. data/tests/tst_cls_forerunner_xml_parser.rb +68 -0
  81. data/tests/tst_cls_geo_data.rb +69 -0
  82. data/tests/tst_cls_gooby_object.rb +24 -0
  83. data/tests/tst_cls_google_map_generator.rb +107 -0
  84. data/tests/tst_cls_history.rb +44 -0
  85. data/tests/tst_cls_lap.rb +36 -0
  86. data/tests/tst_cls_line.rb +108 -0
  87. data/tests/tst_cls_options.rb +77 -0
  88. data/tests/tst_cls_position.rb +64 -0
  89. data/tests/tst_cls_run.rb +140 -0
  90. data/tests/tst_cls_simple_xml_parser.rb +48 -0
  91. data/tests/tst_cls_track.rb +68 -0
  92. data/tests/tst_cls_trackpoint.rb +143 -0
  93. data/tests/tst_gooby.rb +28 -0
  94. data/tests/tst_mod_introspect.rb +30 -0
  95. data/tests/tst_mod_io.rb +51 -0
  96. data/tests/tst_mod_project_info.rb +77 -0
  97. data/tests/tst_mod_string.rb +56 -0
  98. metadata +142 -0
@@ -0,0 +1,38 @@
1
+ =begin rdoc
2
+
3
+ Instances of this class represent a <History> aggregate object from a
4
+ Forerunner XML file.
5
+
6
+ Gooby - Copyright 2007 by Chris Joakim.
7
+ Gooby is available under GNU General Public License (GPL) license.
8
+
9
+ =end
10
+
11
+ module Gooby
12
+
13
+ class History < GoobyObject
14
+
15
+ attr_reader :runs
16
+
17
+ def initialize
18
+ @runs = Array.new
19
+ end
20
+
21
+ # Adds a Run during XML parsing.
22
+ def add_run(run)
23
+ @runs.push(run)
24
+ end
25
+
26
+ def to_s
27
+ return "Hist: runs: #{@runs.size}"
28
+ end
29
+
30
+ def print_string
31
+ s = "History: run count=#{@runs.size} \n"
32
+ runs.each { | run | s << run.print_string }
33
+ s
34
+ end
35
+
36
+ end
37
+
38
+ end
data/lib/cls_lap.rb ADDED
@@ -0,0 +1,27 @@
1
+ =begin rdoc
2
+
3
+ Instances of this class represent a <Lap> aggregate object from a
4
+ Forerunner XML file.
5
+
6
+ Gooby - Copyright 2007 by Chris Joakim.
7
+ Gooby is available under GNU General Public License (GPL) license.
8
+
9
+ =end
10
+
11
+ module Gooby
12
+
13
+ class Lap < GoobyObject
14
+
15
+ attr_accessor :number, :startTime, :duration, :length, :beginPosition, :endPosition
16
+
17
+ def initialize(num)
18
+ @number = num
19
+ end
20
+
21
+ def to_s
22
+ return "Lap: num: #{@number} start: #{@startTime} dur: #{@duration} len: #{@length} begin: #{@beginPosition.to_s} end: #{@endPosition.to_s}"
23
+ end
24
+
25
+ end
26
+
27
+ end
data/lib/cls_line.rb ADDED
@@ -0,0 +1,78 @@
1
+ =begin rdoc
2
+
3
+ Gooby - Copyright 2007 by Chris Joakim.
4
+ Gooby is available under GNU General Public License (GPL) license.
5
+
6
+ =end
7
+
8
+ module Gooby
9
+
10
+ class Line < GoobyObject
11
+
12
+ attr_accessor :raw_data, :tokens
13
+
14
+ def initialize(raw='', delim=nil, strip=false)
15
+ if strip
16
+ @raw_data = raw.strip
17
+ else
18
+ @raw_data = raw
19
+ end
20
+
21
+ @tokens = tokenize(@raw_data, delim, strip=false)
22
+ end
23
+
24
+ public
25
+
26
+ def token(idx)
27
+ @tokens[idx]
28
+ end
29
+
30
+ def token_count
31
+ @tokens.size
32
+ end
33
+
34
+ def token_idx_equals(idx, value)
35
+ if idx < token_count
36
+ if @tokens[idx] == value
37
+ return true
38
+ end
39
+ end
40
+ false
41
+ end
42
+
43
+ def match(pattern)
44
+ @raw_data.match(pattern)
45
+ end
46
+
47
+ def is_comment
48
+ s = @raw_data.strip
49
+ (s.match('^#')) ? true : false
50
+ end
51
+
52
+ def is_populated_non_comment
53
+ s = @raw_data.strip
54
+ if s.size == 0
55
+ return false
56
+ end
57
+ if is_comment
58
+ return false
59
+ end
60
+ return true
61
+ end
62
+
63
+ def concatinate_tokens(start_idx = 0)
64
+ s = ''
65
+ idx = -1
66
+ @tokens.each { |tok|
67
+ idx = idx + 1
68
+ if idx >= start_idx
69
+ s << tok
70
+ s << ' '
71
+ end
72
+ }
73
+ s.strip!
74
+ s
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,74 @@
1
+ =begin rdoc
2
+
3
+ Gooby - Copyright 2007 by Chris Joakim.
4
+ Gooby is available under GNU General Public License (GPL) license.
5
+
6
+ =end
7
+
8
+ module Gooby
9
+
10
+ class Options < GoobyObject
11
+
12
+ attr_reader :yamlFilename, :options
13
+
14
+ def initialize(filename) # Constructor.
15
+ filename ? @yamlFilename = filename : @yamlFilename = 'gooby_options.yaml'
16
+ loadFile()
17
+ end
18
+
19
+ public
20
+
21
+ # Load the @yamlFilename
22
+ def loadFile
23
+ File.open("#{@yamlFilename}") { |fn|
24
+ @options = YAML::load(fn)
25
+ }
26
+ end
27
+
28
+ def get(name)
29
+ if name == nil
30
+ return ''
31
+ end
32
+ s = @options["#{name}"]
33
+
34
+ # Provide "sensible defaults".
35
+ if s == nil
36
+ if (name == '')
37
+ return ''
38
+ elsif (name == 'gmap_first_tkpt_number')
39
+ return 1
40
+ elsif (name == 'gmap_last_tkpt_number')
41
+ return 5000
42
+ elsif (name == 'gmap_map_element_id')
43
+ return 'map'
44
+ elsif (name == 'gmap_height')
45
+ return '600'
46
+ elsif (name == 'gmap_key')
47
+ return 'enter your Google Map Key here'
48
+ elsif (name == 'gmap_type_control')
49
+ return true
50
+ elsif (name == 'gmap_approx_max_points')
51
+ return '200'
52
+ elsif (name == 'gmap_gen_comments')
53
+ return true
54
+ elsif (name == 'gmap_size_control')
55
+ return nil
56
+ elsif (name == 'gmap_type')
57
+ return 'G_NORMAL_MAP'
58
+ elsif (name == 'gmap_zoom_level')
59
+ return 5
60
+ else
61
+ return ''
62
+ end
63
+ end
64
+ s
65
+ end
66
+
67
+ # Return a String containing yaml filename and entry count.
68
+ def to_s
69
+ return "Options: filename: #{@yamlFilename} entries: #{@options.size}"
70
+ end
71
+
72
+ end
73
+
74
+ end
@@ -0,0 +1,49 @@
1
+ =begin rdoc
2
+
3
+ Instances of this class represent a <Position> aggregate object from a
4
+ Forerunner XML file. Each contains a latitude and longitude.
5
+ Instances within a Trackpoint will also contain an altitude.
6
+
7
+ Gooby - Copyright 2007 by Chris Joakim.
8
+ Gooby is available under GNU General Public License (GPL) license.
9
+
10
+ =end
11
+
12
+ module Gooby
13
+
14
+ class Position < GoobyObject
15
+
16
+ attr_accessor :latitude, :longitude, :altitude, :note
17
+
18
+ def initialize(lat, lng, alt='0', note='')
19
+ @latitude = lat.to_s
20
+ @longitude = lng.to_s
21
+ @altitude = alt.to_s
22
+ @note = note.to_s
23
+ end
24
+
25
+ public
26
+
27
+ def to_s
28
+ return "lat: #{@latitude} lng: #{@longitude} alt: #{@altitude} note: #{@note}"
29
+ end
30
+
31
+ def to_csv
32
+ return "#{@latitude} | #{@longitude} | #{@altitude}"
33
+ end
34
+
35
+ def latitude_as_float
36
+ @latitude ? @latitude.to_f : invalid_latitude
37
+ end
38
+
39
+ def longitude_as_float
40
+ @longitude ? @longitude.to_f : invalid_longitude
41
+ end
42
+
43
+ def altitude_as_float
44
+ @altitude ? @altitude.to_f : invalid_altitude
45
+ end
46
+
47
+ end
48
+
49
+ end
data/lib/cls_run.rb ADDED
@@ -0,0 +1,199 @@
1
+ =begin rdoc
2
+
3
+ Instances of this class represent a <Run> aggregate object from a
4
+ Forerunner XML file.
5
+
6
+ Additionally, there is distance, pace, and Google Map generation logic
7
+ in this class.
8
+
9
+ Gooby - Copyright 2007 by Chris Joakim.
10
+ Gooby is available under GNU General Public License (GPL) license.
11
+
12
+ =end
13
+
14
+ module Gooby
15
+
16
+ class Run < GoobyObject
17
+
18
+ attr_accessor :number, :descr, :notes, :tracks, :tkpts, :laps, :distance
19
+
20
+ def initialize(number=0, descr='')
21
+ @number = number
22
+ @descr = descr
23
+ @notes = ''
24
+ @tracks = Array.new
25
+ @tkpts = Array.new
26
+ @laps = Array.new
27
+ @distance = 0
28
+ @options = Hash.new
29
+ @logProgress = true
30
+ @finished = false
31
+ end
32
+
33
+ public
34
+
35
+ # This method is invoked at end-of-parsing.
36
+ def finish()
37
+ @logProgress = false
38
+ unless @finished
39
+ @tracks.each { |trk|
40
+ trk.trackpoints().each { |tkpt|
41
+ tkpt.runNumber = @number
42
+ @tkpts.push(tkpt)
43
+ }
44
+ }
45
+ compute_distance_and_pace
46
+ compute_splits
47
+ @finished = true
48
+ end
49
+ end
50
+
51
+ public
52
+
53
+ def add_track(trk)
54
+ if trk != nil
55
+ @tracks.push(trk)
56
+ end
57
+ end
58
+
59
+ def trackpoint_count()
60
+ @tkpts.size()
61
+ end
62
+
63
+ def add_lap(lap)
64
+ @laps.push(lap)
65
+ end
66
+
67
+ def lapCount()
68
+ @laps.size
69
+ end
70
+
71
+ def start_dttm()
72
+ count = 0
73
+ @tracks.each { |trk|
74
+ trk.trackpoints().each { |tkpt|
75
+ return tkpt.dttm()
76
+ }
77
+ }
78
+ return nil
79
+ end
80
+
81
+ def end_dttm()
82
+ lastOne = nil
83
+ @tracks.each { |trk|
84
+ trk.trackpoints().each { |tkpt|
85
+ lastOne = tkpt.dttm()
86
+ }
87
+ }
88
+ lastOne
89
+ end
90
+
91
+ def duration()
92
+ first = start_dttm()
93
+ last = end_dttm()
94
+ if first
95
+ if last
96
+ return last.hhmmss_diff(first)
97
+ end
98
+ end
99
+ return "??:??:??"
100
+ end
101
+
102
+ def start_yyyy_mm_dd
103
+ if start_dttm()
104
+ start_dttm().yyyy_mm_dd()
105
+ else
106
+ ""
107
+ end
108
+ end
109
+
110
+ def start_hh_mm_ss
111
+ if start_dttm()
112
+ start_dttm().hh_mm_ss()
113
+ else
114
+ ""
115
+ end
116
+ end
117
+
118
+ def end_hh_mm_ss
119
+ if end_dttm()
120
+ end_dttm().hh_mm_ss()
121
+ else
122
+ ""
123
+ end
124
+ end
125
+
126
+ def to_s
127
+ finish() unless @finished
128
+ s = "Run: #{@number} date: #{start_yyyy_mm_dd} distance: #{distance} duration: #{duration} "
129
+ s << " tracks: #{@tracks.size} tkpts: #{trackpoint_count} laps: #{lapCount} "
130
+ s << " notes: #{@notes} "
131
+ s
132
+ end
133
+
134
+ def print_string
135
+ finish() unless @finished
136
+ "Run number=#{@number} tracks=#{@tracks.size} tkpts=#{@tkpts.size} laps=#{@laps.size} distance=#{@distance} "
137
+ end
138
+
139
+ def put_csv()
140
+ finish() unless @finished
141
+ puts "#{@number}|#{}|#{start_yyyy_mm_dd()}|#{start_hh_mm_ss()}|#{end_hh_mm_ss}|#{duration()}|#{@distance}|#{@tracks.size}|#{trackpoint_count()}|#{lapCount}|#{@notes.strip}"
142
+ end
143
+
144
+ def put_tkpt_csv(with_header_comment=false)
145
+ finish() unless @finished
146
+ if with_header_comment
147
+ puts "# Run: #{@number} date: #{start_yyyy_mm_dd} dist: #{distance} dur: #{duration} trks: #{@tracks.size} tkpts: #{trackpoint_count} laps: #{lapCount} "
148
+ end
149
+ @tkpts.each { | tkpt | puts tkpt.to_csv }
150
+ end
151
+
152
+ def put_laps
153
+ @laps.each { | lap | puts lap.to_s }
154
+ end
155
+
156
+ private
157
+
158
+ def compute_distance_and_pace
159
+ cumulative_dist = 0.to_f;
160
+ curr_index = -1
161
+ prev_tkpt = nil
162
+ start_dttm = nil
163
+ @tkpts.each { | tkpt |
164
+ curr_index = curr_index + 1
165
+ if curr_index == 0
166
+ start_dttm = tkpt.dttm()
167
+ prev_tkpt = tkpt
168
+ else
169
+ cumulative_dist = tkpt.compute_distance_and_pace(curr_index, start_dttm, cumulative_dist, prev_tkpt, 'M')
170
+ prev_tkpt = tkpt
171
+ end
172
+ }
173
+ @distance = cumulative_dist
174
+ end
175
+
176
+ def compute_splits
177
+ nextSplitDist = 1.00
178
+ prevSplitTkpt = nil
179
+ loop1Count = 0;
180
+ @tkpts.each { |tkpt|
181
+ loop1Count = loop1Count + 1
182
+ if tkpt.cumulativeDistance() >= nextSplitDist
183
+ tkpt.set_split(0 + nextSplitDist, prevSplitTkpt)
184
+ nextSplitDist = nextSplitDist + 1.00
185
+ prevSplitTkpt = tkpt
186
+ end
187
+ }
188
+ # set first and last booleans
189
+ count = 0
190
+ @tkpts.each { |tkpt|
191
+ count = count + 1
192
+ tkpt.first = true if count == 1
193
+ tkpt.last = true if count == loop1Count
194
+ }
195
+ end
196
+
197
+ end
198
+
199
+ end