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,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