gooby 1.1.0 → 1.2.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.
- data/README +200 -35
- data/bin/code_scan.rb +1 -3
- data/bin/gooby_been_there.rb +12 -14
- data/bin/gooby_config.rb +11 -3
- data/bin/gooby_csv_validation.rb +50 -0
- data/bin/gooby_first_trackpoints_as_poi.rb +31 -0
- data/bin/gooby_gen_gmap.rb +7 -3
- data/bin/gooby_parser.rb +7 -5
- data/bin/gooby_splitter.rb +7 -4
- data/bin/gooby_version.rb +7 -3
- data/bin/run_all.sh +12 -2
- data/bin/run_been_there.sh +4 -1
- data/bin/run_config.sh +12 -0
- data/bin/run_csv_validation.sh +15 -0
- data/bin/run_db_gen.sh +1 -1
- data/bin/run_db_load.sh +1 -1
- data/bin/run_first_trackpoints_as_poi.sh +16 -0
- data/bin/run_gen_gmaps.sh +7 -6
- data/bin/run_parse_full.sh +45 -0
- data/bin/run_parse_samples.sh +21 -0
- data/bin/run_split.sh +5 -4
- data/bin/run_version.sh +12 -0
- data/config/gooby_config.yaml +130 -131
- data/data/20050305_corporate_cup_hm.csv +251 -251
- data/data/20050430_nashville_marathon_km.csv +1208 -0
- data/data/20060115_phoenix_marathon.csv +1280 -1280
- data/data/20070101_davidson_11m.csv +251 -0
- data/data/{davidson_11m_20070101.xml → 20070101_davidson_11m.xml} +0 -0
- data/data/{davidson_5K_20070505.xml → 20070505_davidson_5k.xml} +0 -0
- data/data/20070505_davidson_5k_km.csv +286 -0
- data/data/hrm1.csv +5 -0
- data/lib/gooby.rb +27 -3144
- data/lib/gooby_code_scanner.rb +288 -0
- data/lib/gooby_command.rb +210 -0
- data/lib/gooby_configuration.rb +123 -0
- data/lib/gooby_counter_hash.rb +95 -0
- data/lib/gooby_course.rb +117 -0
- data/lib/gooby_csv_point.rb +71 -0
- data/lib/gooby_csv_reader.rb +71 -0
- data/lib/gooby_csv_run.rb +28 -0
- data/lib/gooby_delim_line.rb +42 -0
- data/lib/gooby_dttm.rb +87 -0
- data/lib/gooby_duration.rb +86 -0
- data/lib/gooby_forerunner_xml_parser.rb +191 -0
- data/lib/gooby_forerunner_xml_splitter.rb +115 -0
- data/lib/gooby_google_map_generator.rb +385 -0
- data/lib/gooby_history.rb +41 -0
- data/lib/gooby_kernel.rb +163 -0
- data/lib/gooby_lap.rb +30 -0
- data/lib/gooby_line.rb +80 -0
- data/lib/gooby_object.rb +22 -0
- data/lib/gooby_point.rb +172 -0
- data/lib/gooby_run.rb +213 -0
- data/lib/gooby_simple_xml_parser.rb +50 -0
- data/lib/gooby_test_helper.rb +23 -0
- data/lib/gooby_track.rb +47 -0
- data/lib/gooby_track_point.rb +229 -0
- data/lib/gooby_training_center_xml_parser.rb +224 -0
- data/lib/gooby_training_center_xml_splitter.rb +116 -0
- data/lib/split_code.sh +29 -0
- data/samples/20050305_corporate_cup_hm.html +269 -269
- data/samples/20050430_nashville_marathon.html +1410 -1266
- data/samples/20060115_phoenix_marathon.html +1311 -1311
- data/samples/{davidson_11m_20070101.html → 20070101_davidson_11m.html} +267 -267
- data/samples/20070505_davidson_5k.html +413 -0
- data/samples/been_there.txt +52 -704
- data/samples/hrm1.html +87 -0
- data/sql/gooby.ddl +20 -16
- data/sql/gooby_load.dml +36 -9
- metadata +48 -14
- data/bin/example_usage.txt +0 -55
- data/bin/run_parse.sh +0 -43
- data/bin/run_parse_named.sh +0 -19
- data/data/20050430_nashville_marathon.csv +0 -1208
- data/data/davidson_11m_20070101.csv +0 -251
- data/data/davidson_5K_20070505.csv +0 -286
- data/data/test1.txt +0 -4
- data/samples/davidson_5K_20070505.html +0 -395
@@ -0,0 +1,288 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Gooby = Google APIs + Ruby
|
4
|
+
Gooby - Copyright 2007 by Chris Joakim.
|
5
|
+
Gooby is available under GNU General Public License (GPL) license.
|
6
|
+
|
7
|
+
=end
|
8
|
+
|
9
|
+
module Gooby
|
10
|
+
|
11
|
+
class CodeScanner < GoobyObject
|
12
|
+
|
13
|
+
def initialize(argv)
|
14
|
+
|
15
|
+
function = 'outline'
|
16
|
+
if (argv.size > 1)
|
17
|
+
function = argv[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
@code_file = argv[0]
|
21
|
+
@test_file = "ts_#{@code_file}"
|
22
|
+
@code_lines = read_lines("lib/#{@code_file}")
|
23
|
+
@test_lines = read_lines("tests/#{@test_file}")
|
24
|
+
|
25
|
+
puts "code lines = #{@code_lines.size}"
|
26
|
+
puts "test lines = #{@test_lines.size}"
|
27
|
+
|
28
|
+
@tokens_hash = CounterHash.new
|
29
|
+
@module_names_hash = CounterHash.new
|
30
|
+
@class_names_hash = CounterHash.new
|
31
|
+
@method_names_hash = CounterHash.new
|
32
|
+
@mc_line_num_array = Array.new
|
33
|
+
@type_names = Hash.new
|
34
|
+
@code_hash = Hash.new
|
35
|
+
@test_hash = Hash.new
|
36
|
+
@api_hash = Hash.new
|
37
|
+
@merged_hash = Hash.new
|
38
|
+
@exclude_classes = Array.new
|
39
|
+
|
40
|
+
regenerate_test_suite if (function == 'regenerate_test_suite')
|
41
|
+
regenerate_test_suite if (function == 'tests')
|
42
|
+
|
43
|
+
model_class_outline if (function == 'model_class_outline')
|
44
|
+
model_class_outline if (function == 'outline')
|
45
|
+
|
46
|
+
quick_reference_guide if (function == 'quick_reference_guide')
|
47
|
+
quick_reference_guide if (function == 'qrg')
|
48
|
+
|
49
|
+
mcm_references if (function == 'mcm_references')
|
50
|
+
mcm_references if (function == 'mcm')
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def regenerate_test_suite
|
56
|
+
@exclude_classes = %w( TestHelper CodeScanner )
|
57
|
+
parse_code_lines
|
58
|
+
parse_test_lines
|
59
|
+
merge_keys
|
60
|
+
regenerate(@test_file)
|
61
|
+
end
|
62
|
+
|
63
|
+
def model_class_outline
|
64
|
+
parse_code_lines
|
65
|
+
@mc_line_num_array.each { |line|
|
66
|
+
tokens = tokenize(line)
|
67
|
+
type = tokens[0].ljust(6)
|
68
|
+
name = tokens[1]
|
69
|
+
count = tokens[2].rjust(6)
|
70
|
+
#puts " #{count} #{type} #{name}"
|
71
|
+
puts "cp gooby.rb gooby_#{name.downcase}.rb"
|
72
|
+
}
|
73
|
+
puts hello
|
74
|
+
end
|
75
|
+
|
76
|
+
def quick_reference_guide
|
77
|
+
parse_code_lines
|
78
|
+
determine_longest_names
|
79
|
+
quick_reference_guide_report('module')
|
80
|
+
quick_reference_guide_report('class')
|
81
|
+
end
|
82
|
+
|
83
|
+
def quick_reference_guide_report(obj_type)
|
84
|
+
@api_hash.keys.sort.each { |key|
|
85
|
+
val = @api_hash[key]
|
86
|
+
tokens = tokenize(key, '|')
|
87
|
+
if (tokens[0] == obj_type)
|
88
|
+
s1 = tokens[0].ljust(6)
|
89
|
+
s2 = tokens[1].ljust(@longest_classname + 1)
|
90
|
+
s3 = tokens[2]
|
91
|
+
# s = sprintf("%6s '%30s %s'", tokens[0], tokens[1], tokens[2])
|
92
|
+
puts "#{s1} #{s2} #{s3}"
|
93
|
+
end
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
def determine_longest_names
|
98
|
+
@longest_classname = 0
|
99
|
+
@api_hash.keys.sort.each { |key|
|
100
|
+
tokens = tokenize(@api_hash[key], '|')
|
101
|
+
@longest_classname = tokens[1].size if tokens[1].size > @longest_classname
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
def mcm_references
|
106
|
+
parse_code_lines
|
107
|
+
determine_longest_names
|
108
|
+
@module_names_hash.sorted_keys.each { |name|
|
109
|
+
count = @tokens_hash.value(name)
|
110
|
+
puts "module: #{name} (#{count})"
|
111
|
+
}
|
112
|
+
@class_names_hash.sorted_keys.each { |name|
|
113
|
+
count = @tokens_hash.value(name)
|
114
|
+
puts "class: #{name} (#{count})"
|
115
|
+
}
|
116
|
+
@method_names_hash.sorted_keys.each { |name|
|
117
|
+
count = @tokens_hash.value(name)
|
118
|
+
puts "method: #{name} (#{count})"
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
def parse_code_lines
|
123
|
+
type = ''
|
124
|
+
type_name = ''
|
125
|
+
meth_name = ''
|
126
|
+
line_number = 0
|
127
|
+
@code_lines.each { | line |
|
128
|
+
line_number = line_number + 1
|
129
|
+
line.strip!
|
130
|
+
if (line.match(/^module /))
|
131
|
+
type = 'module'
|
132
|
+
tokens = line.split
|
133
|
+
type_name = tokens[1]
|
134
|
+
@module_names_hash.increment(type_name)
|
135
|
+
@mc_line_num_array << "module #{type_name} #{line_number}"
|
136
|
+
elsif (line.match(/^class /))
|
137
|
+
type = 'class'
|
138
|
+
tokens = line.split
|
139
|
+
type_name = tokens[1]
|
140
|
+
@class_names_hash.increment(type_name)
|
141
|
+
@mc_line_num_array << "class #{type_name} #{line_number}"
|
142
|
+
elsif (line.match(/^def /))
|
143
|
+
signature = line[4...999]
|
144
|
+
short_method = parse_meth_name("#{signature}")
|
145
|
+
@code_hash["test_#{type}_#{type_name}"] = "#{type_name}"
|
146
|
+
@code_hash["test_#{type}_#{type_name}_#{short_method}"] = "#{type_name}|#{signature}"
|
147
|
+
@api_hash["#{type}|#{type_name}|#{signature}" ] = "#{type}|#{type_name}|#{signature}"
|
148
|
+
@method_names_hash.increment(short_method)
|
149
|
+
end
|
150
|
+
increment_tokens(line)
|
151
|
+
}
|
152
|
+
end
|
153
|
+
|
154
|
+
def increment_tokens(line)
|
155
|
+
# see http://www.asciitable.com/
|
156
|
+
s = ''
|
157
|
+
line.each_byte { |b|
|
158
|
+
keep = false
|
159
|
+
keep = true if ((b >= 65) && (b <= 90)) # A-Z
|
160
|
+
keep = true if ((b >= 97) && (b <= 122)) # a-z
|
161
|
+
keep = true if ((b >= 48) && (b <= 57)) # 0-9
|
162
|
+
keep = true if (b == 95) # _
|
163
|
+
keep = true if (b == 64) # @
|
164
|
+
keep = true if (b == 63) # ?
|
165
|
+
keep = true if (b == 33) # !
|
166
|
+
if keep
|
167
|
+
s << b.chr
|
168
|
+
else
|
169
|
+
s << ' '
|
170
|
+
end
|
171
|
+
}
|
172
|
+
@tokens_hash.increment_tokens(s)
|
173
|
+
end
|
174
|
+
|
175
|
+
def parse_meth_name(string)
|
176
|
+
string.gsub!('(', ' ')
|
177
|
+
string.gsub!(')', ' ')
|
178
|
+
tokens = string.split
|
179
|
+
tokens[0]
|
180
|
+
end
|
181
|
+
|
182
|
+
def parse_test_lines
|
183
|
+
in_zone = true
|
184
|
+
method_name = 'a_start'
|
185
|
+
method_lines = Array.new
|
186
|
+
line_num = 0
|
187
|
+
|
188
|
+
@test_lines.each { | line |
|
189
|
+
line_num = line_num + 1
|
190
|
+
line.chomp!
|
191
|
+
prefix = line[0...5] # ' def' or ' end'
|
192
|
+
prefix42 = line [0..42]
|
193
|
+
|
194
|
+
if ((prefix == ' def') || (prefix == "\tdef"))
|
195
|
+
in_zone = true
|
196
|
+
tokens = line.split
|
197
|
+
method_name = tokens[1]
|
198
|
+
method_lines = Array.new
|
199
|
+
end
|
200
|
+
|
201
|
+
if in_zone
|
202
|
+
method_lines << "#{line}"
|
203
|
+
end
|
204
|
+
if (prefix42 == ' # beginning of tests - keep this marker')
|
205
|
+
in_zone = false
|
206
|
+
@test_hash["aaa"] = method_lines
|
207
|
+
end
|
208
|
+
if ((prefix == ' end') || (prefix == "\tend"))
|
209
|
+
in_zone = false
|
210
|
+
@test_hash["#{method_name}"] = method_lines
|
211
|
+
end
|
212
|
+
}
|
213
|
+
end
|
214
|
+
|
215
|
+
def merge_keys
|
216
|
+
@merged_hash = Hash.new
|
217
|
+
@code_hash.keys.sort.each { |key| @merged_hash["#{key}"] = "code" }
|
218
|
+
@test_hash.keys.sort.each { |key| @merged_hash["#{key}"] = "test" }
|
219
|
+
end
|
220
|
+
|
221
|
+
def regenerate(test_file)
|
222
|
+
code = ''
|
223
|
+
@merged_hash.keys.sort.each { |key|
|
224
|
+
tokens = key.split('_')
|
225
|
+
type, name, meth = tokens[1], tokens[2], tokens[3]
|
226
|
+
|
227
|
+
processThisKey = true
|
228
|
+
@exclude_classes.each { |xc| (xc == name) ? processThisKey = false : x = 0 }
|
229
|
+
|
230
|
+
next if !processThisKey
|
231
|
+
|
232
|
+
if @test_hash.has_key?(key)
|
233
|
+
# We already have a test method written in the test class,
|
234
|
+
# so keep this currently existing test code!
|
235
|
+
|
236
|
+
if @code_hash.has_key?(key)
|
237
|
+
comment = nil
|
238
|
+
else
|
239
|
+
if key != 'aaa'
|
240
|
+
comment = "# Warning: possible obsolete test method - #{key}"
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
code << "\n" if key != 'aaa'
|
245
|
+
code << "\n#{comment}\n" if comment
|
246
|
+
array = @test_hash["#{key}"]
|
247
|
+
array.each { |line| code << "\n#{line}" }
|
248
|
+
else
|
249
|
+
# We don't have this test method in the current test class,
|
250
|
+
# so generate a test method stub.
|
251
|
+
code << "\n"
|
252
|
+
code << "\n def #{key}"
|
253
|
+
code << "\n"
|
254
|
+
|
255
|
+
if @gen_impl_stub
|
256
|
+
if type = 'class'
|
257
|
+
code << "\n #obj = #{type}.new"
|
258
|
+
code << "\n #result = obj.#{meth}"
|
259
|
+
code << "\n #expected = ''"
|
260
|
+
s = "\n"
|
261
|
+
s << ' #assert_equal(expected, actual, "'
|
262
|
+
s << "#{type}.#{meth} "
|
263
|
+
s << 'values are not as expected; #{result} vs #{expected}")'
|
264
|
+
code << s
|
265
|
+
else
|
266
|
+
code << "\n #result = #{type}.#{meth}"
|
267
|
+
code << "\n #expected = ''"
|
268
|
+
s = "\n"
|
269
|
+
s << ' #assert_equal(expected, actual, "'
|
270
|
+
s << "#{type}.#{meth} "
|
271
|
+
s << 'values are not as expected; #{result} vs #{expected}")'
|
272
|
+
code << s
|
273
|
+
end
|
274
|
+
end
|
275
|
+
code << "\n\n end"
|
276
|
+
end
|
277
|
+
}
|
278
|
+
code << "\n\nend # end of class\n"
|
279
|
+
fn = "tests/#{test_file}"
|
280
|
+
out = File.new fn, "w+"
|
281
|
+
out.write code
|
282
|
+
out.flush
|
283
|
+
out.close
|
284
|
+
puts "file written: #{fn}"
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
end # end of module
|
@@ -0,0 +1,210 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
Gooby = Google APIs + Ruby
|
4
|
+
Gooby - Copyright 2007 by Chris Joakim.
|
5
|
+
Gooby is available under GNU General Public License (GPL) license.
|
6
|
+
|
7
|
+
=end
|
8
|
+
|
9
|
+
module Gooby
|
10
|
+
|
11
|
+
class GoobyCommand < GoobyObject
|
12
|
+
|
13
|
+
attr_reader :configuration, :csv_points, :csv_col_names
|
14
|
+
|
15
|
+
def initialize(gooby_yaml_filename=nil)
|
16
|
+
@configuration = Gooby::Configuration.init(gooby_yaml_filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
def display_configuration
|
20
|
+
#puts @configuration.to_s
|
21
|
+
@configuration.print_all
|
22
|
+
end
|
23
|
+
|
24
|
+
def display_version
|
25
|
+
s = "# #{project_name} #{project_version_number} #{project_date}. #{project_copyright}."
|
26
|
+
puts s
|
27
|
+
end
|
28
|
+
|
29
|
+
def split_garmin_export_file(argv)
|
30
|
+
if (argv == nil)
|
31
|
+
puts "ERROR: no ARGV args passed."
|
32
|
+
elsif (argv.size < 3)
|
33
|
+
puts ""
|
34
|
+
puts "Invalid program args; three args required - format, input filename, output directory"
|
35
|
+
puts " the first arg, format, should be one of: garmin201, garmin205, garmin305, etc."
|
36
|
+
puts " the second arg is the input filename - which is a garmin export file"
|
37
|
+
puts " the third arg is the output directory where the split files are written to\n\n"
|
38
|
+
puts "Please correct the program arguments and try again. \n\n"
|
39
|
+
else
|
40
|
+
format = argv[0].downcase
|
41
|
+
filename = argv[1]
|
42
|
+
out_dir = argv[2]
|
43
|
+
|
44
|
+
if (format == 'garmin201')
|
45
|
+
split_garmin_forerunner_logbook_xml(filename, out_dir)
|
46
|
+
else
|
47
|
+
split_garmin_training_center_xml(filename, out_dir)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def split_garmin_forerunner_logbook_xml(xml_filename, out_dir)
|
53
|
+
splitter = Gooby::ForerunnerXmlSplitter.new(xml_filename, out_dir)
|
54
|
+
splitter.split
|
55
|
+
end
|
56
|
+
|
57
|
+
def split_garmin_training_center_xml(tcx_filename, out_dir)
|
58
|
+
splitter = Gooby::TrainingCenterXmlSplitter.new(tcx_filename, out_dir)
|
59
|
+
splitter.split
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_garmin_xml_file(argv)
|
63
|
+
if (argv == nil)
|
64
|
+
puts "ERROR: no ARGV args passed."
|
65
|
+
elsif (argv.size < 2)
|
66
|
+
puts ""
|
67
|
+
puts "Invalid program args; three args required - format, uom, input (xml) filename"
|
68
|
+
puts " the first arg, format, should be one of: garmin201, garmin205, garmin305, etc."
|
69
|
+
puts " the second arg, unit-of-measure, should be either 'english' or 'metric'."
|
70
|
+
puts " the third arg, input xml filename, was produced by the Gooby 'splitter.rb' program."
|
71
|
+
puts "Please correct the program arguments and try again. \n\n"
|
72
|
+
else
|
73
|
+
format = argv[0].downcase
|
74
|
+
uom = argv[1].downcase
|
75
|
+
filename = argv[2]
|
76
|
+
puts Trackpoint.csv_header
|
77
|
+
if (format == 'garmin201')
|
78
|
+
parse_garmin_forerunner_logbook_xml(filename, uom)
|
79
|
+
else
|
80
|
+
parse_garmin_training_center_xml(filename, uom)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def parse_garmin_forerunner_logbook_xml(xml_filename, uom)
|
86
|
+
handler = Gooby::ForerunnerXmlParser.new(uom)
|
87
|
+
Document.parse_stream((File.new xml_filename), handler)
|
88
|
+
handler.put_all_run_tkpt_csv()
|
89
|
+
end
|
90
|
+
|
91
|
+
def parse_garmin_training_center_xml(tcx_filename, uom)
|
92
|
+
handler = Gooby::TrainingCenterXmlParser.new(uom)
|
93
|
+
Document.parse_stream((File.new tcx_filename), handler)
|
94
|
+
handler.put_all_run_tkpt_csv()
|
95
|
+
end
|
96
|
+
|
97
|
+
def read_csv_files(array_of_filenames, record_index=0)
|
98
|
+
@csv_reader = Gooby::CsvReader.new(array_of_filenames)
|
99
|
+
@csv_points = @csv_reader.read
|
100
|
+
@csv_col_names = @csv_reader.col_names
|
101
|
+
puts @csv_reader.to_s
|
102
|
+
if (record_index > 0)
|
103
|
+
@csv_reader.display_formatted_record(record_index)
|
104
|
+
end
|
105
|
+
@csv_points
|
106
|
+
end
|
107
|
+
|
108
|
+
def been_there(course_id, proximity=0.0070, uom='deg')
|
109
|
+
unless @csv_points
|
110
|
+
puts "You must first invoke method 'read_csv_files' with a list of parsed CSV filenames."
|
111
|
+
return
|
112
|
+
end
|
113
|
+
course = configuration.get_course("#{course_id}")
|
114
|
+
unless course
|
115
|
+
puts "Unable to find course id '#{course_id}' in the gooby config yaml file."
|
116
|
+
return
|
117
|
+
end
|
118
|
+
puts ''
|
119
|
+
# collect the csv_points into run arrays
|
120
|
+
@curr_run_id = 'x'
|
121
|
+
@csv_runs = Array.new
|
122
|
+
@csv_points.each { |csv_point|
|
123
|
+
if (csv_point.run_id == @curr_run_id)
|
124
|
+
@curr_run.add_point(csv_point)
|
125
|
+
else
|
126
|
+
@curr_run_id = csv_point.run_id
|
127
|
+
@curr_run = Gooby::CsvRun.new(@curr_run_id)
|
128
|
+
@curr_run.add_point(csv_point)
|
129
|
+
@csv_runs << @curr_run
|
130
|
+
end
|
131
|
+
}
|
132
|
+
|
133
|
+
# iterate the runs - looking for a match vs the course
|
134
|
+
@csv_runs.each { |csv_run|
|
135
|
+
puts "Scanning run id '#{csv_run.id}', point count= #{csv_run.points.size}" if false
|
136
|
+
run_points = csv_run.points
|
137
|
+
course.reset
|
138
|
+
course.points.each { |course_point|
|
139
|
+
closest_diff = 999
|
140
|
+
closest_point = nil
|
141
|
+
run_points.each { |run_point|
|
142
|
+
diff = course_point.degrees_diff(run_point)
|
143
|
+
if ((diff < proximity) && (diff < closest_diff))
|
144
|
+
closest_diff = diff
|
145
|
+
closest_point = run_point
|
146
|
+
closest_point.degrees_diff = diff
|
147
|
+
course.matched(course_point.number, run_point)
|
148
|
+
end
|
149
|
+
}
|
150
|
+
}
|
151
|
+
if course.matched?
|
152
|
+
puts "Course '#{course.name}' matched vs run id '#{csv_run.id}'"
|
153
|
+
course.display_matches
|
154
|
+
else
|
155
|
+
puts "course not matched" if false
|
156
|
+
end
|
157
|
+
}
|
158
|
+
end
|
159
|
+
|
160
|
+
def first_trackpoints_as_poi(date_string)
|
161
|
+
# cat 2007_poi.csv | sort +4n > 2007_poi_sorted.csv
|
162
|
+
home_point = Point.new('35.495469007128285', '-80.83213448524475', '752.5755445824', 'Home at South Faulkner Way Stopsign') # TODO
|
163
|
+
# poi.123 35.484114 -80.820274 788.7661681152 2007-06-30 10:48:32 1.01214244648463
|
164
|
+
@csv_points.each { |csv_point|
|
165
|
+
proximity = home_point.proximity(csv_point, 'm')
|
166
|
+
if (csv_point.lap_number == 1)
|
167
|
+
if date_string
|
168
|
+
if csv_point.date == date_string
|
169
|
+
puts sprintf("%s %s %s %s %s %s %s", 'poi. ',
|
170
|
+
character_align('.', csv_point.latitude, 3, 7),
|
171
|
+
character_align('.', csv_point.longitude, 4, 7),
|
172
|
+
character_align('.', csv_point.altitude, 5, 11),
|
173
|
+
character_align('.', proximity.to_s, 3, 20),
|
174
|
+
csv_point.date,
|
175
|
+
csv_point.time,
|
176
|
+
csv_point.distance)
|
177
|
+
end
|
178
|
+
else
|
179
|
+
puts sprintf("%s %s %s %s %s %s %s", 'poi. ',
|
180
|
+
character_align('.', csv_point.latitude, 3, 7),
|
181
|
+
character_align('.', csv_point.longitude, 4, 7),
|
182
|
+
character_align('.', csv_point.altitude, 5, 11),
|
183
|
+
character_align('.', proximity.to_s, 3, 20),
|
184
|
+
csv_point.date,
|
185
|
+
csv_point.time,
|
186
|
+
csv_point.distance)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
}
|
190
|
+
end
|
191
|
+
|
192
|
+
def generate_google_map(argv)
|
193
|
+
if (argv == nil)
|
194
|
+
puts "ERROR: no ARGV args passed."
|
195
|
+
elsif (argv.size < 1)
|
196
|
+
puts ""
|
197
|
+
puts "Invalid program args; one required - input csv filename"
|
198
|
+
puts " the first arg, csv filename, was produced by the Gooby 'parser.rb' program."
|
199
|
+
puts "Please correct the program arguments and try again. \n\n"
|
200
|
+
else
|
201
|
+
csv_filename = argv[0]
|
202
|
+
configuration = Gooby::Configuration.get_config
|
203
|
+
generator = Gooby::GoogleMapGenerator.new(csv_filename)
|
204
|
+
generator.generate_page(configuration)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
end # end of module
|