gooby 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,46 @@
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 GoobyBaseObject
9
+
10
+ include GoobyEnvironment
11
+ include GoobyIntrospection
12
+ include GoobyIO
13
+
14
+ UOM_MILES = "m"
15
+ UOM_KILOMETERS = "k"
16
+ UOM_YARDS = "y"
17
+ KILOMETERS_PER_MILE = 1.61290322581
18
+ YARDS_PER_MILE = 1760.0
19
+ MILES_PER_KILOMETER = 0.62
20
+ YARDS_PER_KILOMETER = 1091.2
21
+ METERS_PER_FOOT = 3.281 # see http://www.chrismanual.com/Intro/convfact.htm
22
+ SECONDS_PER_HOUR = 3600.0
23
+
24
+ @@config = nil
25
+
26
+ def self.set_config(c)
27
+ @@config = c
28
+ end
29
+
30
+ def self.get_config
31
+ @@config
32
+ end
33
+
34
+ def self.config_value(name)
35
+ @@config[name]
36
+ end
37
+
38
+ def self.boolean_config_value(name)
39
+ value = config_value(name)
40
+ return false if value.nil?
41
+ return true if value == true
42
+ return true if value == 'true'
43
+ false
44
+ end
45
+
46
+ end
@@ -0,0 +1,95 @@
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
+ ---
7
+
8
+ This abstract class implements common SAX-event and error handling for XML parsers.
9
+ 'libxml-ruby' gem version 0.9.7 is required.
10
+
11
+ =end
12
+
13
+ require 'libxml'
14
+
15
+ class GoobyBaseSaxParser
16
+
17
+ include LibXML
18
+ include XML::SaxParser::Callbacks
19
+
20
+ attr_reader :xml, :list, :current_tagname, :mappings
21
+ attr_reader :exception, :end_reached, :error
22
+
23
+ def initialize
24
+ @parser = XML::SaxParser.new
25
+ @parser.callbacks = self
26
+ @list, @current_text, @current_tagname = [], '', ''
27
+ @exception, @error, @end_reached = nil, nil, false
28
+ @mappings = {}
29
+ subclass_initialize
30
+ # XML::Error.set_handler do | e |
31
+ # self.set_error(e)
32
+ # end
33
+ end
34
+
35
+ def subclass_initialize
36
+ # subclasses should override this method. set @mappings and other variables.
37
+ end
38
+
39
+ def set_error(e)
40
+ @error = "#{e}"
41
+ end
42
+
43
+ def process_file(file)
44
+ process_xml(File.read(file))
45
+ end
46
+
47
+ def process_xml(xml_string)
48
+ begin
49
+ @xml = xml_string
50
+ @parser.string = @xml
51
+ @parser.parse
52
+ rescue Exception => e
53
+ @exception = "#{e.class} #{e.message}"
54
+ raise e
55
+ end
56
+ @list
57
+ end
58
+
59
+ # Indicates if an Exception, though not necessarily an Error, has occurred.
60
+ def has_exception?
61
+ (@exception == nil) ? false : true
62
+ end
63
+
64
+ # Indicates if an Error, though not necessarily an Exception, has occurred.
65
+ def has_error?
66
+ (@error == nil) ? false : true
67
+ end
68
+
69
+ # Indicates if the ending 'on_end_document' handler method has been called or not.
70
+ def end_reached?
71
+ @end_reached
72
+ end
73
+
74
+ def on_characters(chars)
75
+ @current_text << chars if chars
76
+ end
77
+
78
+ def on_cdata_block(cdata)
79
+ @current_text << cdata if cdata
80
+ end
81
+
82
+ def get_current_text
83
+ (@current_text) ? @current_text.strip : ''
84
+ end
85
+
86
+ def on_error(msg)
87
+ @error = "#{msg}"
88
+ end
89
+
90
+ def on_end_document
91
+ @end_reached = true
92
+ XML::Error.reset_handler
93
+ end
94
+
95
+ end
@@ -1,123 +1,41 @@
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
 
9
- module Gooby
10
-
11
- =begin
12
-
13
- This is a singleton class whose values are loaded from a YAML file when your
14
- GoobyCommand class is created. The default filename is 'gooby_config.yaml"'.
15
-
16
- The YAML file contains configuration parameters, such as your Google Map key,
17
- map HTML options, points of interest, and courses.
18
-
19
- =end
20
- class Configuration < GoobyObject
21
-
22
- @@singleton_instance = nil
23
-
24
- attr_reader :yaml_filename, :configuration
25
-
26
- private_class_method :new
27
-
28
- def Configuration.init(yaml_filename='gooby_config.yaml')
29
- return @@singleton_instance if @@singleton_instance
30
- @@singleton_instance = new(yaml_filename)
31
- end
32
-
33
- def self.get_config
34
- @@singleton_instance
35
- end
36
-
37
- def initialize(yaml_filename)
38
- @yaml_filename = yaml_filename
39
- File.open("#{@yaml_filename}") { |fn| @configuration = YAML::load(fn) }
40
- end
41
-
42
- def get(name)
43
- if name == nil
44
- return ''
45
- end
46
- s = @configuration["#{name}"]
47
-
48
- # Provide "sensible defaults".
49
- if s == nil
50
- if (name == '')
51
- return ''
52
- elsif (name == 'english_metric')
53
- return 'english'
54
- elsif (name == 'gmap_first_tkpt_number')
55
- return 1
56
- elsif (name == 'gmap_last_tkpt_number')
57
- return 5000
58
- elsif (name == 'gmap_map_element_id')
59
- return 'map'
60
- elsif (name == 'gmap_height')
61
- return '600'
62
- elsif (name == 'gmap_icon_url_base')
63
- return 'http://www.your-web-site.com/gicons/'
64
- elsif (name == 'gmap_key')
65
- return 'enter your Google Map Key here'
66
- elsif (name == 'gmap_type_control')
67
- return true
68
- elsif (name == 'gmap_approx_max_points')
69
- return '200'
70
- elsif (name == 'gmap_gen_comments')
71
- return true
72
- elsif (name == 'gmap_size_control')
73
- return nil
74
- elsif (name == 'gmap_type')
75
- return 'G_NORMAL_MAP'
76
- elsif (name == 'gmap_zoom_level')
77
- return 5
78
- else
79
- return ''
80
- end
81
- end
82
- s
83
- end
84
-
85
- def print_all
86
- @configuration.keys.sort.each { |key|
87
- value = get(key)
88
- puts "#{key}: #{value}"
89
- }
90
- end
91
-
92
- def print_all_poi
93
- @configuration.keys.sort.each { |key|
94
- if (key.match(/poi[\.]/))
95
- val = @configuration["#{key}"]
96
- poi = Point.new(val)
97
- puts poi.to_s
98
- end
99
- }
100
- end
101
-
102
- def get_poi(number)
103
- val = @configuration["poi.#{number}"]
104
- (val) ? Point.new(val) : nil
105
- end
106
-
107
- def get_course(number)
108
- val = @configuration["course.#{number}"]
109
- (val) ? Course.new(val) : nil
110
- end
111
-
112
- def size
113
- @configuration.size
114
- end
8
+ module GoobyConfiguration
115
9
 
116
- # Return a String containing yaml filename and entry count.
117
- def to_s
118
- return "# Configuration: filename: #{@yaml_filename} entries: #{@configuration.size}"
10
+ def gooby_home
11
+ ENV['GOOBY_HOME']
12
+ end
13
+
14
+ def read_configuration(additional_config_file)
15
+
16
+ # First load the base config file into @configuration
17
+ base_config_file = "#{gooby_home}/config/gooby_config.yaml"
18
+ if File.exist?(base_config_file)
19
+ puts "loading base configuration file #{base_config_file}"
20
+ File.open(base_config_file) { | f | @configuration = YAML::load(f) }
21
+ else
22
+ puts "ERROR: the base configuration file does not exist - #{base_config_file}"
23
+ end
24
+
25
+ # Optionally load a second map-specific config file and overlay any
26
+ # values in the base configuration.
27
+ if (additional_config_file) && (File.exist?(additional_config_file))
28
+ puts "loading additional configuration file #{additional_config_file}"
29
+ File.open(additional_config_file) { | f | @additional_config = YAML::load(f) }
30
+ @additional_config.keys.each { | key |
31
+ value = @additional_config[key]
32
+ @configuration[key] = value
33
+ # puts "'#{key}' overlaid with '#{value}'"
34
+ }
35
+ else
36
+ puts "ERROR: the additional configuration file does not exist - #{additional_config_file}"
119
37
  end
120
-
121
- end
122
-
123
- end # end of module
38
+ GoobyBaseObject.set_config(@configuration)
39
+ end
40
+
41
+ end
@@ -1,95 +1,36 @@
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
 
9
- module Gooby
10
-
11
- =begin rdoc
12
- This class wrappers a Hash object and provides increment/decrement functionality
13
- for a given key. It is used to sum the number of things (i.e. - xml tags) in a
14
- collection.
15
- =end
16
-
17
- class CounterHash < GoobyObject
18
-
19
- def initialize
20
- @hash = Hash.new(0)
21
- end
22
-
23
- def size
24
- @hash.size
25
- end
26
-
27
- # Return the Integer count for the given key; zero default.
28
- def value(key)
29
- (@hash.has_key?(key)) ? @hash[key] : 0
30
- end
31
-
32
- # Increment the count for the given key.
33
- def increment(key)
34
- if key == nil
35
- return
36
- end
37
- if (@hash.has_key?(key))
38
- val = @hash[key]
39
- @hash[key] = val + 1
40
- else
41
- @hash[key] = 1
42
- end
43
- end
44
-
45
- def increment_tokens(text)
46
- tokens = tokenize(text)
47
- tokens.each { |token| increment(token) }
48
- end
49
-
50
- # Decrement the count for the given key.
51
- def decrement(key)
52
- if key == nil
53
- return
54
- end
55
- if (@hash.has_key?(key))
56
- val = @hash[key]
57
- @hash[key] = val - 1
58
- else
59
- @hash[key] = -1
60
- end
61
- end
62
-
63
- # Return an Array of the sorted keys.
64
- def sorted_keys
65
- @hash.keys.sort
66
- end
67
-
68
- # Return a String containing all key=val pairs.
69
- def to_s
70
- s = "CHash:"
71
- sorted_keys.each { |key|
72
- val = @hash[key]
73
- s << " key: [#{key}] val: [#{val}]\n"
74
- }
75
- s
76
- end
77
-
78
- # Return an XML String containing all key=val pairs, optionally aligned.
79
- def to_xml(aligned=false)
80
- s = "<CHash>"
81
- sorted_keys.each { |key|
82
- val = @hash[key]
83
- (aligned) ? s << "\n " : s << ''
84
- s << " <entry key='#{key}' value='#{val}'/>"
85
- }
86
- if aligned
87
- s << "\n "
88
- end
89
- s << " </CHash>"
90
- s
91
- end
8
+ class GoobyCounterHash
9
+
10
+ attr_reader :hash
92
11
 
12
+ def initialize
13
+ @hash = Hash.new(0)
93
14
  end
94
-
95
- end # end of module
15
+
16
+ def increment(key)
17
+ new_value = @hash[key] + 1
18
+ @hash[key] = new_value
19
+ new_value
20
+ end
21
+
22
+ def decrement(key)
23
+ new_value = @hash[key] - 1
24
+ @hash[key] = new_value
25
+ new_value
26
+ end
27
+
28
+ def value(key)
29
+ @hash[key]
30
+ end
31
+
32
+ def sorted_keys
33
+ @hash.keys.sort
34
+ end
35
+
36
+ end
@@ -1,87 +1,109 @@
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
- =end
6
+ ---
8
7
 
9
- module Gooby
8
+ Instances of this class represent a Date and Time as parsed from a value
9
+ such as '2006-01-15T13:41:40Z' in an XML file produced by a GPS device.
10
+ It wrappers a Time object.
10
11
 
11
- =begin rdoc
12
- Instances of this class represent a Date and Time as parsed from a value
13
- such as '2006-01-15T13:41:40Z' in an XML file produced by a GPS device.
14
- It wrappers both a DateTime and Time object.
15
12
  =end
13
+
14
+
16
15
 
17
- class DtTm < GoobyObject
18
-
19
- attr_accessor :rawdata, :dateTime, :time, :valid
16
+ class GoobyDtTm < GoobyBaseObject
20
17
 
21
- # Constructor; arg is a String like '2006-01-15T13:41:40Z'.
22
- def initialize(raw)
23
- if raw
24
- @rawdata = raw.strip
25
- if @rawdata.size > 18
26
- @date_time = DateTime.parse(@rawdata[0..18])
27
- @time = Time.parse(@date_time.to_s)
28
- @valid = true
29
- else
30
- @valid = false
31
- end
32
- else
33
- @rawdata = ''
34
- @valid = false
35
- end
36
- end
18
+ @@months = Hash.new('')
37
19
 
38
- public
39
-
40
- # Return @time.to_i
41
- def to_i()
42
- (@time) ? @time.to_i : invalid_time
20
+ attr_accessor :time, :valid
21
+
22
+ def lookup_month(m)
23
+ if @@months.size == 0
24
+ @@months = Hash.new('') # 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
25
+ @@months['01'] = 'jan'
26
+ @@months['02'] = 'feb'
27
+ @@months['03'] = 'mar'
28
+ @@months['04'] = 'apr'
29
+ @@months['05'] = 'may'
30
+ @@months['06'] = 'jun'
31
+ @@months['07'] = 'jul'
32
+ @@months['08'] = 'aug'
33
+ @@months['09'] = 'sep'
34
+ @@months['10'] = 'oct'
35
+ @@months['11'] = 'nov'
36
+ @@months['12'] = 'dec'
43
37
  end
38
+ @@months[m]
39
+ end
44
40
 
45
- # Calculates and returns diff between another instance.
46
- def seconds_diff(anotherDtTm)
47
- if anotherDtTm
48
- to_i - anotherDtTm.to_i
49
- else
50
- invalid_time
41
+ # The arg is a String like '2006-01-15T13:41:40Z'.
42
+ def initialize(raw)
43
+ @valid = false
44
+ if raw
45
+ a = raw.tr('TZ\-\:', ' ').strip.split
46
+ if a.size > 5
47
+ @time = Time.utc(a[0].to_i, lookup_month(a[1]), a[2].to_i, a[3].to_i, a[4].to_i, a[5].to_i)
48
+ @valid = true if @time
51
49
  end
52
50
  end
53
-
54
- def yyyy_mm_dd
55
- @time.strftime("%Y-%m-%d")
56
- end
57
-
58
- def yyyy_mm_dd_hh_mm_ss(delim=' ')
59
- @time.strftime("%Y-%m-%d#{delim}%H:%M:%S")
60
- end
61
-
62
- def hh_mm_ss
63
- @time.strftime("%H:%M:%S")
51
+ end
52
+
53
+ def to_i
54
+ (@time) ? @time.to_i : invalid_time
55
+ end
56
+
57
+ def invalid_time
58
+ return -99999999
59
+ end
60
+
61
+ def yyyy_mm_dd
62
+ time.strftime("%Y-%m-%d")
63
+ end
64
+
65
+ def yyyy_mm_dd_hh_mm_ss(delim=' ')
66
+ time.strftime("#{yyyy_mm_dd}#{delim}#{hh_mm_ss}")
67
+ end
68
+
69
+ def hh_mm_ss
70
+ time.strftime("%H:%M:%S")
71
+ end
72
+
73
+ def seconds_diff(another_dttm)
74
+ if another_dttm
75
+ to_i - another_dttm.to_i
76
+ else
77
+ invalid_time
64
78
  end
79
+ end
65
80
 
66
- # Calculate and return time diff in 'hh:mm:ss' format.
67
- def hhmmss_diff(anotherDtTm)
68
- if anotherDtTm
69
- t = @time - (anotherDtTm.to_i)
70
- t.strftime("%H:%M:%S")
71
- else
72
- '00:00:00'
73
- end
81
+ def hhmmss_diff(another_dttm)
82
+ if another_dttm
83
+ secs = seconds_diff(another_dttm).abs
84
+ hh = (secs / SECONDS_PER_HOUR).to_i
85
+ rem = secs - (hh * SECONDS_PER_HOUR)
86
+ mm = (rem / 60).to_i
87
+ ss = rem - (mm * 60).to_i
88
+ ss = 59 if ss > 59
89
+ "#{hh}:#{zero_pad(mm)}:#{zero_pad(ss.to_i)}"
90
+ else
91
+ '00:00:00'
74
92
  end
93
+ end
94
+
95
+ def to_s
96
+ "#{yyyy_mm_dd} #{hh_mm_ss} #{to_i}"
97
+ end
75
98
 
76
- def to_s
77
- "#{@rawdata}"
78
- end
99
+ private
79
100
 
80
- # Return a String with state values for debugging.
81
- def print_string
82
- "DtTm: #{yyyy_mm_dd_hh_mm_ss} #{to_i} #{@rawdata}"
101
+ def zero_pad(val)
102
+ if (val.to_i < 10)
103
+ return '0' + val.to_s
104
+ else
105
+ return '' + val.to_s
83
106
  end
107
+ end
84
108
 
85
- end
86
-
87
- end # end of module
109
+ end