gooby 1.2.0 → 2.0.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 (257) hide show
  1. data/README +133 -341
  2. data/config/ballantyne.yaml +11 -0
  3. data/config/big_sur_marathon.yaml +11 -0
  4. data/config/crowders_mtn_hike.yaml +11 -0
  5. data/config/davidson1.yaml +16 -0
  6. data/config/gooby_config.yaml +28 -135
  7. data/cucumber.yml +1 -0
  8. data/features/build_gem.feature +88 -0
  9. data/features/gooby.feature +300 -0
  10. data/features/install.feature +78 -0
  11. data/features/steps/gooby_steps.rb +245 -0
  12. data/features/support/env.rb +4 -0
  13. data/lib/gooby.rb +24 -30
  14. data/lib/gooby_activity.rb +63 -0
  15. data/lib/gooby_base_object.rb +46 -0
  16. data/lib/gooby_base_sax_parser.rb +95 -0
  17. data/lib/gooby_configuration.rb +33 -115
  18. data/lib/gooby_counter_hash.rb +28 -87
  19. data/lib/gooby_dttm.rb +88 -66
  20. data/lib/gooby_environment.rb +48 -0
  21. data/lib/gooby_garmin_tcx_parser.rb +92 -0
  22. data/lib/gooby_google_kml_generator.rb +168 -0
  23. data/lib/gooby_google_map_generator.rb +284 -349
  24. data/lib/gooby_gpx_parser.rb +97 -0
  25. data/lib/gooby_help_producer.rb +40 -0
  26. data/lib/gooby_introspection.rb +25 -0
  27. data/lib/gooby_io.rb +30 -0
  28. data/lib/gooby_lap.rb +27 -18
  29. data/lib/gooby_process.rb +281 -0
  30. data/lib/gooby_sax_path_parser.rb +43 -0
  31. data/lib/gooby_tcx_extractor.rb +71 -0
  32. data/lib/gooby_track_log_parser.rb +114 -0
  33. data/lib/gooby_trackpoint.rb +276 -0
  34. data/lib/gooby_xml_object.rb +40 -0
  35. data/{img/gicons → out/images}/blank.png +0 -0
  36. data/{img/gicons → out/images}/dd-end.png +0 -0
  37. data/{img/gicons → out/images}/dd-start.png +0 -0
  38. data/{img/gicons → out/images}/marker.png +0 -0
  39. data/{img/gicons → out/images}/marker0.png +0 -0
  40. data/{img/gicons → out/images}/marker00.png +0 -0
  41. data/{img/gicons → out/images}/marker01.png +0 -0
  42. data/{img/gicons → out/images}/marker02.png +0 -0
  43. data/{img/gicons → out/images}/marker03.png +0 -0
  44. data/{img/gicons → out/images}/marker04.png +0 -0
  45. data/{img/gicons → out/images}/marker05.png +0 -0
  46. data/{img/gicons → out/images}/marker06.png +0 -0
  47. data/{img/gicons → out/images}/marker07.png +0 -0
  48. data/{img/gicons → out/images}/marker08.png +0 -0
  49. data/{img/gicons → out/images}/marker09.png +0 -0
  50. data/{img/gicons → out/images}/marker1.png +0 -0
  51. data/{img/gicons → out/images}/marker10.png +0 -0
  52. data/{img/gicons → out/images}/marker11.png +0 -0
  53. data/{img/gicons → out/images}/marker12.png +0 -0
  54. data/{img/gicons → out/images}/marker13.png +0 -0
  55. data/{img/gicons → out/images}/marker14.png +0 -0
  56. data/{img/gicons → out/images}/marker15.png +0 -0
  57. data/{img/gicons → out/images}/marker16.png +0 -0
  58. data/{img/gicons → out/images}/marker17.png +0 -0
  59. data/{img/gicons → out/images}/marker18.png +0 -0
  60. data/{img/gicons → out/images}/marker19.png +0 -0
  61. data/{img/gicons → out/images}/marker2.png +0 -0
  62. data/{img/gicons → out/images}/marker20.png +0 -0
  63. data/{img/gicons → out/images}/marker21.png +0 -0
  64. data/{img/gicons → out/images}/marker22.png +0 -0
  65. data/{img/gicons → out/images}/marker23.png +0 -0
  66. data/{img/gicons → out/images}/marker24.png +0 -0
  67. data/{img/gicons → out/images}/marker25.png +0 -0
  68. data/{img/gicons → out/images}/marker26.png +0 -0
  69. data/{img/gicons → out/images}/marker27.png +0 -0
  70. data/{img/gicons → out/images}/marker28.png +0 -0
  71. data/{img/gicons → out/images}/marker29.png +0 -0
  72. data/{img/gicons → out/images}/marker3.png +0 -0
  73. data/{img/gicons → out/images}/marker30.png +0 -0
  74. data/{img/gicons → out/images}/marker31.png +0 -0
  75. data/{img/gicons → out/images}/marker32.png +0 -0
  76. data/{img/gicons → out/images}/marker33.png +0 -0
  77. data/{img/gicons → out/images}/marker34.png +0 -0
  78. data/{img/gicons → out/images}/marker35.png +0 -0
  79. data/{img/gicons → out/images}/marker36.png +0 -0
  80. data/{img/gicons → out/images}/marker37.png +0 -0
  81. data/{img/gicons → out/images}/marker38.png +0 -0
  82. data/{img/gicons → out/images}/marker39.png +0 -0
  83. data/{img/gicons → out/images}/marker4.png +0 -0
  84. data/{img/gicons → out/images}/marker40.png +0 -0
  85. data/{img/gicons → out/images}/marker41.png +0 -0
  86. data/{img/gicons → out/images}/marker42.png +0 -0
  87. data/{img/gicons → out/images}/marker43.png +0 -0
  88. data/{img/gicons → out/images}/marker44.png +0 -0
  89. data/{img/gicons → out/images}/marker45.png +0 -0
  90. data/{img/gicons → out/images}/marker46.png +0 -0
  91. data/{img/gicons → out/images}/marker47.png +0 -0
  92. data/{img/gicons → out/images}/marker48.png +0 -0
  93. data/{img/gicons → out/images}/marker49.png +0 -0
  94. data/{img/gicons → out/images}/marker5.png +0 -0
  95. data/{img/gicons → out/images}/marker50.png +0 -0
  96. data/{img/gicons → out/images}/marker51.png +0 -0
  97. data/{img/gicons → out/images}/marker52.png +0 -0
  98. data/{img/gicons → out/images}/marker53.png +0 -0
  99. data/{img/gicons → out/images}/marker54.png +0 -0
  100. data/{img/gicons → out/images}/marker55.png +0 -0
  101. data/{img/gicons → out/images}/marker56.png +0 -0
  102. data/{img/gicons → out/images}/marker57.png +0 -0
  103. data/{img/gicons → out/images}/marker58.png +0 -0
  104. data/{img/gicons → out/images}/marker59.png +0 -0
  105. data/{img/gicons → out/images}/marker6.png +0 -0
  106. data/{img/gicons → out/images}/marker60.png +0 -0
  107. data/{img/gicons → out/images}/marker61.png +0 -0
  108. data/{img/gicons → out/images}/marker62.png +0 -0
  109. data/{img/gicons → out/images}/marker63.png +0 -0
  110. data/{img/gicons → out/images}/marker64.png +0 -0
  111. data/{img/gicons → out/images}/marker65.png +0 -0
  112. data/{img/gicons → out/images}/marker66.png +0 -0
  113. data/{img/gicons → out/images}/marker67.png +0 -0
  114. data/{img/gicons → out/images}/marker68.png +0 -0
  115. data/{img/gicons → out/images}/marker69.png +0 -0
  116. data/{img/gicons → out/images}/marker7.png +0 -0
  117. data/{img/gicons → out/images}/marker70.png +0 -0
  118. data/{img/gicons → out/images}/marker71.png +0 -0
  119. data/{img/gicons → out/images}/marker72.png +0 -0
  120. data/{img/gicons → out/images}/marker73.png +0 -0
  121. data/{img/gicons → out/images}/marker74.png +0 -0
  122. data/{img/gicons → out/images}/marker75.png +0 -0
  123. data/{img/gicons → out/images}/marker76.png +0 -0
  124. data/{img/gicons → out/images}/marker77.png +0 -0
  125. data/{img/gicons → out/images}/marker78.png +0 -0
  126. data/{img/gicons → out/images}/marker79.png +0 -0
  127. data/{img/gicons → out/images}/marker8.png +0 -0
  128. data/{img/gicons → out/images}/marker80.png +0 -0
  129. data/{img/gicons → out/images}/marker81.png +0 -0
  130. data/{img/gicons → out/images}/marker82.png +0 -0
  131. data/{img/gicons → out/images}/marker83.png +0 -0
  132. data/{img/gicons → out/images}/marker84.png +0 -0
  133. data/{img/gicons → out/images}/marker85.png +0 -0
  134. data/{img/gicons → out/images}/marker86.png +0 -0
  135. data/{img/gicons → out/images}/marker87.png +0 -0
  136. data/{img/gicons → out/images}/marker88.png +0 -0
  137. data/{img/gicons → out/images}/marker89.png +0 -0
  138. data/{img/gicons → out/images}/marker9.png +0 -0
  139. data/{img/gicons → out/images}/marker90.png +0 -0
  140. data/{img/gicons → out/images}/marker91.png +0 -0
  141. data/{img/gicons → out/images}/marker92.png +0 -0
  142. data/{img/gicons → out/images}/marker93.png +0 -0
  143. data/{img/gicons → out/images}/marker94.png +0 -0
  144. data/{img/gicons → out/images}/marker95.png +0 -0
  145. data/{img/gicons → out/images}/marker96.png +0 -0
  146. data/{img/gicons → out/images}/marker97.png +0 -0
  147. data/{img/gicons → out/images}/marker98.png +0 -0
  148. data/{img/gicons → out/images}/marker99.png +0 -0
  149. data/{img/gicons → out/images}/markerA.png +0 -0
  150. data/{img/gicons → out/images}/markerB.png +0 -0
  151. data/{img/gicons → out/images}/markerC.png +0 -0
  152. data/{img/gicons → out/images}/markerD.png +0 -0
  153. data/{img/gicons → out/images}/markerE.png +0 -0
  154. data/{img/gicons → out/images}/markerF.png +0 -0
  155. data/{img/gicons → out/images}/markerG.png +0 -0
  156. data/{img/gicons → out/images}/markerH.png +0 -0
  157. data/{img/gicons → out/images}/markerI.png +0 -0
  158. data/{img/gicons → out/images}/markerJ.png +0 -0
  159. data/{img/gicons → out/images}/mm_20_red.png +0 -0
  160. data/{img/gicons → out/images}/mm_20_shadow.png +0 -0
  161. data/{img/gicons → out/images}/shadow50.png +0 -0
  162. data/rakefile.rb +79 -0
  163. data/samples.sh +21 -0
  164. data/samples/2008_04_27_13_49_50_tcx.csv +2449 -0
  165. data/samples/2008_04_27_13_49_50_tcx.xml +24560 -0
  166. data/samples/2009_01_01_14_45_00_tcx.xml +10630 -0
  167. data/samples/ballantyne.csv +27 -0
  168. data/samples/ballantyne.gpx +117 -0
  169. data/samples/ballantyne.kml +91 -0
  170. data/samples/big_sur_marathon.html +2766 -0
  171. data/samples/big_sur_marathon.kml +685 -0
  172. data/samples/build_gem_test_results.txt +6 -0
  173. data/samples/crowders_mtn_hike.csv +1065 -0
  174. data/samples/crowders_mtn_hike.html +1283 -0
  175. data/samples/crowders_mtn_hike.log +1 -0
  176. data/samples/cucumber_test_results.txt +302 -0
  177. data/samples/davidson1.csv +1 -0
  178. data/samples/davidson1.html +75 -0
  179. data/samples/davidson_1_point_tcx.csv +0 -0
  180. data/samples/doc.kml +49 -0
  181. data/samples/gps_track_log_asheville_mt_pisgah.txt +1 -0
  182. data/samples/gps_track_logs.txt +1 -0
  183. data/samples/install_test_results.txt +81 -0
  184. data/samples/mt_pisgah.txt +1 -0
  185. data/samples/rspec_test_results.txt +5 -0
  186. data/setup.rb +66 -0
  187. data/spec/gooby_base_object_spec.rb +116 -0
  188. data/spec/gooby_counter_hash_spec.rb +34 -0
  189. data/spec/gooby_dttm_spec.rb +40 -0
  190. data/spec/gooby_spec_helper.rb +9 -0
  191. data/spec/gooby_xml_object_spec.rb +32 -0
  192. metadata +225 -226
  193. data/bin/code_scan.rb +0 -16
  194. data/bin/gooby_been_there.rb +0 -33
  195. data/bin/gooby_config.rb +0 -24
  196. data/bin/gooby_csv_validation.rb +0 -50
  197. data/bin/gooby_first_trackpoints_as_poi.rb +0 -31
  198. data/bin/gooby_gen_gmap.rb +0 -20
  199. data/bin/gooby_parser.rb +0 -21
  200. data/bin/gooby_splitter.rb +0 -21
  201. data/bin/gooby_version.rb +0 -20
  202. data/bin/run_all.sh +0 -33
  203. data/bin/run_been_there.sh +0 -19
  204. data/bin/run_config.sh +0 -12
  205. data/bin/run_csv_validation.sh +0 -15
  206. data/bin/run_db_gen.sh +0 -11
  207. data/bin/run_db_load.sh +0 -11
  208. data/bin/run_first_trackpoints_as_poi.sh +0 -16
  209. data/bin/run_gen_gmaps.sh +0 -21
  210. data/bin/run_parse_full.sh +0 -45
  211. data/bin/run_parse_samples.sh +0 -21
  212. data/bin/run_split.sh +0 -24
  213. data/bin/run_version.sh +0 -12
  214. data/data/20050305_corporate_cup_hm.csv +0 -251
  215. data/data/20050305_corporate_cup_hm.xml +0 -2208
  216. data/data/20050430_nashville_marathon.xml +0 -10043
  217. data/data/20050430_nashville_marathon_km.csv +0 -1208
  218. data/data/20060115_phoenix_marathon.csv +0 -1280
  219. data/data/20060115_phoenix_marathon.xml +0 -10620
  220. data/data/20070101_davidson_11m.csv +0 -251
  221. data/data/20070101_davidson_11m.xml +0 -2020
  222. data/data/20070505_davidson_5k.xml +0 -2875
  223. data/data/20070505_davidson_5k_km.csv +0 -286
  224. data/data/hrm1.csv +0 -5
  225. data/img/gicons/readme.txt +0 -14
  226. data/lib/gooby_code_scanner.rb +0 -288
  227. data/lib/gooby_command.rb +0 -210
  228. data/lib/gooby_course.rb +0 -117
  229. data/lib/gooby_csv_point.rb +0 -71
  230. data/lib/gooby_csv_reader.rb +0 -71
  231. data/lib/gooby_csv_run.rb +0 -28
  232. data/lib/gooby_delim_line.rb +0 -42
  233. data/lib/gooby_duration.rb +0 -86
  234. data/lib/gooby_forerunner_xml_parser.rb +0 -191
  235. data/lib/gooby_forerunner_xml_splitter.rb +0 -115
  236. data/lib/gooby_history.rb +0 -41
  237. data/lib/gooby_kernel.rb +0 -163
  238. data/lib/gooby_line.rb +0 -80
  239. data/lib/gooby_object.rb +0 -22
  240. data/lib/gooby_point.rb +0 -172
  241. data/lib/gooby_run.rb +0 -213
  242. data/lib/gooby_simple_xml_parser.rb +0 -50
  243. data/lib/gooby_test_helper.rb +0 -23
  244. data/lib/gooby_track.rb +0 -47
  245. data/lib/gooby_track_point.rb +0 -229
  246. data/lib/gooby_training_center_xml_parser.rb +0 -224
  247. data/lib/gooby_training_center_xml_splitter.rb +0 -116
  248. data/lib/split_code.sh +0 -29
  249. data/samples/20050305_corporate_cup_hm.html +0 -450
  250. data/samples/20050430_nashville_marathon.html +0 -1668
  251. data/samples/20060115_phoenix_marathon.html +0 -1596
  252. data/samples/20070101_davidson_11m.html +0 -432
  253. data/samples/20070505_davidson_5k.html +0 -413
  254. data/samples/been_there.txt +0 -92
  255. data/samples/hrm1.html +0 -87
  256. data/sql/gooby.ddl +0 -60
  257. data/sql/gooby_load.dml +0 -62
@@ -0,0 +1,78 @@
1
+ Feature: Install Gooby
2
+ Gem file 'gooby-2.0.0.gem' has been created and downloaded
3
+ now we install it, run setup.rb, and ensure that certain files are present
4
+
5
+ Scenario: Execute the install process
6
+ Given file 'install.sh' exists
7
+ And the gem we are installing is named 'gooby-2.0.0.gem'
8
+ And file '/temp/gooby-2.0.0.gem' exists
9
+ And file 'gem_list_after_uninstall.txt' is removed if present
10
+ And file 'gem_list_after_install.txt' is removed if present
11
+ And GOOBY_HOME is set to '/Users/cjoakim/gooby'
12
+ And the GOOBY_HOME directory is recreated
13
+
14
+ Then we execute the shell script './install.sh'
15
+ And my garmin training center export file 'current.tcx' file is restored
16
+ And these unpacked files exist within directory '/Users/cjoakim/gooby':
17
+ | file | type |
18
+ | config | directory |
19
+ | csv | directory |
20
+ | data | directory |
21
+ | features/steps | directory |
22
+ | features/support | directory |
23
+ | out/images | directory |
24
+ | samples | directory |
25
+ | splits | directory |
26
+ | tmp | directory |
27
+ | cucumber.yml | regular |
28
+ | README | regular |
29
+ | rakefile.rb | regular |
30
+ | samples.sh | regular |
31
+ | setup.rb | regular |
32
+ | config/ballantyne.yaml | regular |
33
+ | config/big_sur_marathon.yaml | regular |
34
+ | config/crowders_mtn_hike.yaml | regular |
35
+ | config/davidson1.yaml | regular |
36
+ | config/gooby_config.yaml | regular |
37
+ | csv/2008_04_27_13_49_50_tcx.csv | regular |
38
+ | data/current.tcx | regular |
39
+ | features/build_gem.feature | regular |
40
+ | features/gooby.feature | regular |
41
+ | features/install.feature | regular |
42
+ | features/steps/gooby_steps.rb | regular |
43
+ | features/support/env.rb | regular |
44
+ | out/images/dd-end.png | regular |
45
+ | out/images/dd-end.png | regular |
46
+ | out/images/marker1.png | regular |
47
+ | out/images/marker26.png | regular |
48
+ | out/images/shadow50.png | regular |
49
+ | samples/2008_04_27_13_49_50_tcx.csv | regular |
50
+ | samples/2008_04_27_13_49_50_tcx.xml | regular |
51
+ | samples/2009_01_01_14_45_00_tcx.xml | regular |
52
+ | samples/ballantyne.csv | regular |
53
+ | samples/ballantyne.gpx | regular |
54
+ | samples/ballantyne.kml | regular |
55
+ | samples/big_sur_marathon.html | regular |
56
+ | samples/big_sur_marathon.kml | regular |
57
+ | samples/build_gem_test_results.txt | regular |
58
+ | samples/crowders_mtn_hike.csv | regular |
59
+ | samples/crowders_mtn_hike.html | regular |
60
+ | samples/crowders_mtn_hike.log | regular |
61
+ | samples/cucumber_test_results.txt | regular |
62
+ | samples/davidson1.csv | regular |
63
+ | samples/davidson1.html | regular |
64
+ | samples/doc.kml | regular |
65
+ | samples/gps_track_log_asheville_mt_pisgah.txt | regular |
66
+ | samples/gps_track_logs.txt | regular |
67
+ | samples/install_test_results.txt | regular |
68
+ | samples/mt_pisgah.txt | regular |
69
+ | samples/rspec_test_results.txt | regular |
70
+
71
+ And these generated files exist within directory '/Users/cjoakim/gooby':
72
+ | file | type |
73
+ | out/ballantyne.html | regular |
74
+ | out/ballantyne.kml | regular |
75
+ | out/big_sur_marathon.html | regular |
76
+ | out/big_sur_marathon.kml | regular |
77
+ | out/crowders_mtn_hike.html | regular |
78
+ | out/crowders_mtn_hike.kml | regular |
@@ -0,0 +1,245 @@
1
+
2
+ def gooby_home
3
+ ENV['GOOBY_HOME']
4
+ end
5
+
6
+ def directory?(word)
7
+ return false if word.nil?
8
+ return true if word.downcase == 'directory'
9
+ return true if word.downcase == 'dir'
10
+ return true if word.downcase == 'folder'
11
+ false
12
+ end
13
+
14
+ Then /^GOOBY_HOME is set to '(.*)'$/ do | dir_name |
15
+ ENV['GOOBY_HOME'] = dir_name
16
+ `env > tmp/cuke_env.txt`
17
+ gooby_home.should == dir_name
18
+ end
19
+
20
+ Then /^the config file we use is '(.*)'$/ do | file |
21
+ @config_file = file
22
+ end
23
+
24
+ Then /^we imported the data from our Garmin GPS device model 305 into Garmin Training Center$/ do
25
+ # This step is for documentation purposes only
26
+ end
27
+
28
+ Then /^exported the data from Garmin Training Center to a TCX file$/ do
29
+ # This step is for documentation purposes only
30
+ end
31
+
32
+ Then /^the TCX file is named '(.*)'$/ do | filename |
33
+ @tcx_filename = filename
34
+ end
35
+
36
+ Then /^an empty (.*) directory within GOOBY_HOME$/ do | dir |
37
+ pattern = "#{gooby_home}/#{dir}/*.*"
38
+ FileUtils.rm Dir.glob(pattern)
39
+ Dir.glob(pattern).size.should == 0
40
+ end
41
+
42
+ Then /^file '(.*)' does not exist within GOOBY_HOME$/ do | file |
43
+ full_name = "#{gooby_home}/#{file}"
44
+ if File.exist?(full_name)
45
+ FileUtils.rm(full_name)
46
+ end
47
+ File.exist?(full_name).should == false
48
+ end
49
+
50
+ Then /^rake task '(.*)' is executed$/ do | task_name |
51
+ @gooby_task = task_name.split(':')[1]
52
+ @redirect_file = "tmp/#{@gooby_task}.txt"
53
+ params = ''
54
+ if task_name == 'gooby:extract_activities_from_tcx'
55
+ params = "tcx_file=#{@tcx_filename}"
56
+ end
57
+ if @config_file
58
+ params << "config_file=#{@config_file}"
59
+ end
60
+ command = "rake #{task_name} #{params} > #{@redirect_file}"
61
+ `#{command}`
62
+ end
63
+
64
+ Then /^the (.*) file '(.*)' is created$/ do | type, file |
65
+ File.exists?(file).should == true
66
+ lines = IO.readlines(file)
67
+ if type == 'CSV'
68
+ @csv_filename, @csv_lines = file, lines
69
+ elsif type == 'HTML'
70
+ @html_filename, @html_lines = file, lines
71
+ elsif type == 'KML'
72
+ @kml_filename, @kml_lines = file, lines
73
+ elsif type == 'KMZ'
74
+ @kmz_filename = file
75
+ end
76
+ end
77
+
78
+ Then /^the following lines are expected$/ do
79
+ @expected_lines = []
80
+ end
81
+
82
+ Then "line: $to_eol" do | to_eol |
83
+ @expected_lines << to_eol.strip
84
+ end
85
+
86
+ Then /^the CSV file contains (.*) trackpoints$/ do | count |
87
+ trackpoints = []
88
+ FasterCSV.foreach(@csv_filename) do | row |
89
+ tkpt = GoobyTrackpoint.new
90
+ tkpt.from_csv(row)
91
+ trackpoints << tkpt
92
+ end
93
+ trackpoints.size.should == count.to_i
94
+ end
95
+
96
+ Then /^the HTML file contains (.*) lines$/ do | count |
97
+ @html_lines.size.should == count.to_i
98
+ end
99
+
100
+ Then /^the KML file contains (.*) lines$/ do | count |
101
+ @kml_lines.size.should == count.to_i
102
+ end
103
+
104
+ Then /^the splits directory contains at least (.*) files matching name '(.*)'$/ do | count, p |
105
+ pattern = "#{gooby_home}/splits/#{p}*"
106
+ list = Dir.glob(pattern)
107
+ list.size.should >= count.to_i
108
+ end
109
+
110
+ Then /^these activity xml files exist:$/ do | table |
111
+ table.hashes.each do | hash |
112
+ lines = IO.readlines(hash['file'])
113
+ lines.size.should == hash['lines'].to_i
114
+ end
115
+ end
116
+
117
+ Then /^the output contains (.*) lines, within a tolerance of (.*)$/ do | count, tolerance |
118
+ @redirect_file_lines = IO.readlines(@redirect_file)
119
+ @redirect_file_lines.size.should >= count.to_i - tolerance.to_i
120
+ @redirect_file_lines.size.should <= count.to_i + tolerance.to_i
121
+ end
122
+
123
+ Then /^the (.*) contains the expected lines$/ do | type |
124
+ content_lines = @csv_lines if type == 'CSV'
125
+ content_lines = @html_lines if type == 'HTML'
126
+ content_lines = @kml_lines if type == 'KML'
127
+ content_lines = @redirect_file_lines if type == 'output'
128
+ prev_match_idx = -1
129
+ @expected_lines.each { | expected_line |
130
+ matched = false
131
+ content_lines.each_with_index { | content_line, content_line_idx |
132
+ if content_line_idx > prev_match_idx
133
+ pos_idx = content_line.strip.index(expected_line)
134
+ if (pos_idx) && (pos_idx >= 0)
135
+ matched, prev_match_idx = true, content_line_idx
136
+ end
137
+ end
138
+ }
139
+ matched.should == true
140
+ }
141
+ end
142
+
143
+ Then /^we edit CSV file '(.*)' to contain only point number (.*)$/ do | file, point_number |
144
+ lines = IO.readlines(file)
145
+ out = File.new file, 'w+'
146
+ out.write lines[point_number.to_i]
147
+ out.flush
148
+ out.close
149
+ end
150
+
151
+ Then /^the CSV file contains these trackpoints:$/ do | table |
152
+ trackpoints = []
153
+ FasterCSV.foreach(@csv_filename) do | row |
154
+ tkpt = GoobyTrackpoint.new
155
+ tkpt.from_csv(row)
156
+ trackpoints << tkpt
157
+ end
158
+ table.hashes.each do | hash |
159
+ seq = hash['seq'].to_i
160
+ seq.should > 0
161
+ seq.should <= trackpoints.size
162
+ tkpt = trackpoints[seq - 1]
163
+ tkpt.latitude.to_s.should == hash['latitude']
164
+ tkpt.longitude.to_s.should == hash['longitude']
165
+ tkpt.distance.to_s.should == hash['distance']
166
+ tkpt.elapsed_time.to_s.should == hash['elapsed']
167
+ tkpt.mph.to_s.should == hash['mph']
168
+ tkpt.pace.to_s.should == hash['pace']
169
+ end
170
+ end
171
+
172
+ Then /^copy the generated files to the samples directory$/ do
173
+ list = []
174
+ list << 'csv/2008_04_27_13_49_50_tcx.csv'
175
+ list << 'csv/ballantyne.csv'
176
+ list << 'csv/crowders_mtn_hike.csv'
177
+ list << 'csv/davidson1.csv'
178
+ list << 'out/ballantyne.kml'
179
+ list << 'out/big_sur_marathon.html'
180
+ list << 'out/big_sur_marathon.kml'
181
+ list << 'out/crowders_mtn_hike.html'
182
+ list << 'out/davidson1.html'
183
+ list << 'out/doc.kml'
184
+ FileUtils.cp list, "samples"
185
+ end
186
+
187
+ Then /^(.*) '(.*)' exists$/ do | word , name |
188
+ if directory?(word)
189
+ if File.exist?(name) && File.directory?(name)
190
+ # ok, the directory exists
191
+ else
192
+ FileUtils.mkdir_p(name)
193
+ end
194
+ end
195
+ File.exist?(name).should == true
196
+ end
197
+
198
+ Then /^the GOOBY_HOME directory is recreated$/ do
199
+ if File.exist?(gooby_home) && File.directory?(gooby_home)
200
+ FileUtils.rm_rf(gooby_home)
201
+ end
202
+ FileUtils.mkdir_p(gooby_home)
203
+ end
204
+
205
+ Then /^my garmin training center export file 'current.tcx' file is restored$/ do
206
+ FileUtils.cp '/data/gooby/garmin/current.tcx', "#{gooby_home}/data/current.tcx"
207
+ end
208
+
209
+ Then /^the gem we are (.*) is named '(.*)'$/ do | word, name |
210
+ @gem_name = name
211
+ end
212
+
213
+ Then /^(.*) '(.*)' is removed if present$/ do | word , name |
214
+ if (word.downcase == 'directory') || (word.downcase == 'dir')
215
+ if File.exist?(name) && File.directory?(name)
216
+ FileUtils.rm_rf(name)
217
+ end
218
+ else
219
+ if File.exist?(name)
220
+ FileUtils.rm(name)
221
+ end
222
+ end
223
+ File.exist?(name).should == false
224
+ end
225
+
226
+ Then /^we execute the shell script '(.*)'$/ do | name |
227
+ @shell_script_name = name
228
+ result = `#{@shell_script_name}`
229
+ end
230
+
231
+ Then /^these (.*) files exist within directory '(.*)':$/ do | word, dir, table |
232
+ table.hashes.each do | hash |
233
+ filename, type = "#{dir}/#{hash['file']}".strip, hash['type'].to_s.strip
234
+ # puts "verifying: #{dir} #{type} #{filename}"
235
+ if directory?(type)
236
+ File.exist?(filename).should == true
237
+ File.directory?(filename).should == true
238
+ else
239
+ File.exist?(filename).should == true
240
+ File.directory?(filename).should == false
241
+ IO.readlines(filename).size.should > 0
242
+ end
243
+ end
244
+ end
245
+
@@ -0,0 +1,4 @@
1
+
2
+ require 'lib/gooby'
3
+
4
+ require 'spec/expectations'
@@ -1,44 +1,38 @@
1
1
  =begin
2
2
 
3
- Gooby = Google APIs + Ruby
4
- Gooby - Copyright 2007 by Chris Joakim.
3
+ Gooby = Google APIs + Ruby. Copyright 2009 by Chris Joakim.
5
4
  Gooby is available under GNU General Public License (GPL) license.
6
5
 
7
6
  =end
8
7
 
8
+ require 'rubygems'
9
+ require 'rbconfig'
9
10
  require 'date'
11
+ require 'erb'
12
+ require 'fastercsv'
10
13
  require 'find'
11
- require 'rbconfig'
12
- require 'rexml/document'
13
- require 'rexml/streamlistener'
14
- require 'singleton'
14
+ require 'libxml'
15
15
  require 'time'
16
16
  require 'yaml'
17
17
 
18
- require 'gooby_kernel'
19
- require 'gooby_test_helper'
20
- require 'gooby_object'
18
+ require 'gooby_environment'
19
+ require 'gooby_introspection'
20
+ require 'gooby_io'
21
+ require 'gooby_help_producer'
22
+ require 'gooby_base_object'
23
+ require 'gooby_configuration'
21
24
  require 'gooby_counter_hash'
22
- require 'gooby_delim_line'
23
25
  require 'gooby_dttm'
24
- require 'gooby_duration'
25
- require 'gooby_forerunner_xml_parser'
26
- require 'gooby_forerunner_xml_splitter'
27
- require 'gooby_training_center_xml_parser'
28
- require 'gooby_training_center_xml_splitter'
29
- require 'gooby_google_map_generator'
30
- require 'gooby_history'
26
+ require 'gooby_xml_object'
31
27
  require 'gooby_lap'
32
- require 'gooby_line'
33
- require 'gooby_configuration'
34
- require 'gooby_point'
35
- require 'gooby_csv_point'
36
- require 'gooby_csv_run'
37
- require 'gooby_csv_reader'
38
- require 'gooby_track_point'
39
- require 'gooby_run'
40
- require 'gooby_simple_xml_parser'
41
- require 'gooby_track'
42
- require 'gooby_course'
43
- require 'gooby_code_scanner'
44
- require 'gooby_command'
28
+ require 'gooby_trackpoint'
29
+ require 'gooby_activity'
30
+ require 'gooby_tcx_extractor'
31
+ require 'gooby_track_log_parser'
32
+ require 'gooby_base_sax_parser'
33
+ require 'gooby_sax_path_parser'
34
+ require 'gooby_garmin_tcx_parser'
35
+ require 'gooby_gpx_parser'
36
+ require 'gooby_google_kml_generator'
37
+ require 'gooby_google_map_generator'
38
+ require 'gooby_process'
@@ -0,0 +1,63 @@
1
+ =begin
2
+
3
+ Gooby = Google APIs + Ruby. Copyright 2009 by Chris Joakim.
4
+ Gooby is available under GNU General Public License (GPL) license.
5
+
6
+ =end
7
+
8
+ class GoobyActivity < GoobyXmlObject
9
+
10
+ attr_reader :sport, :laps, :trackpoints
11
+
12
+ def initialize(attrs=nil)
13
+ base_initialize
14
+ @laps, @trackpoints, @current_lap = [], [], nil
15
+ if attrs
16
+ attrs.keys.each { | name | set(name, attrs[name]) }
17
+ end
18
+ end
19
+
20
+ def sport
21
+ get('Sport')
22
+ end
23
+
24
+ def add_lap(lap)
25
+ if lap
26
+ lap.set('Seq', @laps.size + 1)
27
+ @laps << lap
28
+ @current_lap = lap
29
+ end
30
+ end
31
+
32
+ def add_trackpoint(trackpoint)
33
+ if trackpoint
34
+ trackpoint.set('Seq', @trackpoints.size + 1)
35
+ @trackpoints << trackpoint
36
+ end
37
+ end
38
+
39
+ # Coumpute the elapsed time and distance of each Trackpoint within the Activity.
40
+ def post_process
41
+ cumulative_distance, first_tkpt_dttm, prev_tkpt = 0.0, nil, nil
42
+ @trackpoints.each { | tkpt |
43
+ if prev_tkpt
44
+ incremental_distance = tkpt.proximity(prev_tkpt)
45
+ cumulative_distance = cumulative_distance + incremental_distance
46
+ tkpt.set('Distance', cumulative_distance)
47
+ else
48
+ first_tkpt_dttm = tkpt.dttm
49
+ tkpt.set('Distance', 0.0)
50
+ end
51
+ tkpt.compute_elapsed_time(first_tkpt_dttm)
52
+ tkpt.compute_cumulative_pace_and_mph(first_tkpt_dttm)
53
+ prev_tkpt = tkpt
54
+ }
55
+ end
56
+
57
+ def trackpoints_csv
58
+ lines = []
59
+ @trackpoints.each { | trackpoint | lines << trackpoint.to_csv }
60
+ lines
61
+ end
62
+
63
+ end