gpx 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -33,7 +33,7 @@ work-in-progress than an attempt at full GPX compliance. The track side of the
33
33
  library has seen much more use than the route/waypoint side, so if you're doing
34
34
  something with routes or waypoints, you may need to tweak some things.
35
35
 
36
- Since this code uses REXML to read an entire GPX file into memory, it is not
36
+ Since this code uses XML to read an entire GPX file into memory, it is not
37
37
  the fastest possible solution for working with GPX data, especially if you are
38
38
  working with tracks from several days or weeks.
39
39
 
data/lib/gpx.rb CHANGED
@@ -21,7 +21,8 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
  $:.unshift(File.dirname(__FILE__))
24
- require 'rexml/document'
24
+ require 'rubygems'
25
+ require 'xml/libxml'
25
26
  require 'date'
26
27
  require 'time'
27
28
  require 'csv'
@@ -44,11 +44,11 @@ module GPX
44
44
  end
45
45
 
46
46
  def to_xml
47
- bnd = REXML::Element.new('bounds')
48
- bnd.attributes['min_lat'] = min_lat
49
- bnd.attributes['min_lon'] = min_lon
50
- bnd.attributes['max_lat'] = max_lat
51
- bnd.attributes['max_lon'] = max_lon
47
+ bnd = XML::Node.new('bounds')
48
+ bnd['minlat'] = min_lat.to_s
49
+ bnd['minlon'] = min_lon.to_s
50
+ bnd['maxlat'] = max_lat.to_s
51
+ bnd['maxlon'] = max_lon.to_s
52
52
  bnd
53
53
  end
54
54
 
@@ -21,14 +21,14 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
  module GPX
24
- VERSION = "0.1"
24
+ VERSION = "0.2"
25
25
 
26
26
  # A common base class which provides a useful initializer method to many
27
27
  # class in the GPX library.
28
28
  class Base
29
- include REXML
29
+ include XML
30
30
 
31
- # This initializer can take a REXML::Element and scrape out any text
31
+ # This initializer can take an XML::Node and scrape out any text
32
32
  # elements with the names given in the "text_elements" array. Each
33
33
  # element found underneath "parent" with a name in "text_elements" causes
34
34
  # an attribute to be initialized on the instance. This means you don't
@@ -37,8 +37,8 @@ module GPX
37
37
  # attributes to this method.
38
38
  def instantiate_with_text_elements(parent, text_elements)
39
39
  text_elements.each do |el|
40
- unless parent.elements[el].nil?
41
- val = parent.elements[el].text
40
+ unless parent.find(el).empty?
41
+ val = parent.find(el).first.content
42
42
  code = <<-code
43
43
  attr_accessor #{ el }
44
44
  #{el}=#{val}
@@ -22,7 +22,7 @@
22
22
  #++
23
23
  module GPX
24
24
  class GPXFile < Base
25
- attr_reader :tracks, :routes, :waypoints, :bounds, :lowest_point, :highest_point, :distance, :duration, :average_speed
25
+ attr_reader :tracks, :routes, :waypoints, :bounds, :lowest_point, :highest_point, :distance, :duration, :average_speed, :ns
26
26
 
27
27
 
28
28
  # This initializer can be used to create a new GPXFile from an existing
@@ -44,30 +44,41 @@ module GPX
44
44
  @duration = 0
45
45
  if(opts[:gpx_file])
46
46
  gpx_file = opts[:gpx_file]
47
- case gpx_file
48
- when String
49
- gpx_file = File.open(gpx_file)
50
- end
47
+ #case gpx_file
48
+ #when String
49
+ # gpx_file = File.open(gpx_file)
50
+ #end
51
+ gpx_file = gpx_file.name if gpx_file.is_a?(File)
51
52
  reset_meta_data
52
- @xml = Document.new(gpx_file, :ignore_whitespace_nodes => :all)
53
-
54
- bounds_element = (XPath.match(@xml, "/gpx/metadata/bounds").first rescue nil)
53
+ @xml = XML::Document.file(gpx_file)
54
+
55
+ # set XML namespace for XML find
56
+ if @xml.root.namespace_node
57
+ @ns = 'gpx:' + @xml.root.namespace_node.href
58
+ else
59
+ @ns = 'gpx:http://www.topografix.com/GPX/1/1' # default to GPX 1.1
60
+ end
61
+
62
+ bounds_element = (@xml.find("//gpx:gpx/gpx:metadata/gpx:bounds", @ns).to_a.first rescue nil)
55
63
  if bounds_element
56
- @bounds.min_lat = bounds_element.attributes["min_lat"].to_f
57
- @bounds.min_lon = bounds_element.attributes["min_lon"].to_f
58
- @bounds.max_lat = bounds_element.attributes["max_lat"].to_f
59
- @bounds.max_lon = bounds_element.attributes["max_lon"].to_f
64
+ @bounds.min_lat = get_bounds_attr_value(bounds_element, %w{ min_lat minlat minLat })
65
+ @bounds.min_lon = get_bounds_attr_value(bounds_element, %w{ min_lon minlon minLon})
66
+ @bounds.max_lat = get_bounds_attr_value(bounds_element, %w{ max_lat maxlat maxLat})
67
+ @bounds.max_lon = get_bounds_attr_value(bounds_element, %w{ max_lon maxlon maxLon})
60
68
  else
61
69
  get_bounds = true
62
70
  end
63
-
64
- @tracks = XPath.match(@xml, "/gpx/trk").collect do |trk|
71
+
72
+ @tracks = []
73
+ @xml.find("//gpx:gpx/gpx:trk", @ns).each do |trk|
65
74
  trk = Track.new(:element => trk, :gpx_file => self)
66
75
  update_meta_data(trk, get_bounds)
67
- trk
76
+ @tracks << trk
68
77
  end
69
- @waypoints = XPath.match(@xml, "/gpx/wpt").collect { |wpt| Waypoint.new(:element => wpt, :gpx_file => self) }
70
- @routes = XPath.match(@xml, "/gpx/rte").collect { |rte| Route.new(:element => rte, :gpx_file => self) }
78
+ @waypoints = []
79
+ @xml.find("//gpx:gpx/gpx:wpt", @ns).each { |wpt| @waypoints << Waypoint.new(:element => wpt, :gpx_file => self) }
80
+ @routes = []
81
+ @xml.find("//gpx:gpx/gpx:rte", @ns).each { |rte| @routes << Route.new(:element => rte, :gpx_file => self) }
71
82
 
72
83
  @tracks.delete_if { |t| t.empty? }
73
84
 
@@ -82,6 +93,15 @@ module GPX
82
93
  end
83
94
  end
84
95
 
96
+ def get_bounds_attr_value(el, possible_names)
97
+ result = nil
98
+ possible_names.each do |name|
99
+ result = el[name]
100
+ break unless result.nil?
101
+ end
102
+ return (result.to_f rescue nil)
103
+ end
104
+
85
105
  # Returns the distance, in kilometers, meters, or miles, of all of the
86
106
  # tracks and segments contained in this GPXFile.
87
107
  def distance(opts = { :units => 'kilometers' })
@@ -175,32 +195,32 @@ module GPX
175
195
  def write(filename)
176
196
 
177
197
  doc = Document.new
178
- gpx_elem = Element.new('gpx')
179
- doc.add(gpx_elem)
180
- gpx_elem.attributes['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance"
181
- gpx_elem.attributes['xmlns'] = "http://www.topografix.com/GPX/1/1"
182
- gpx_elem.attributes['version'] = "1.1"
183
- gpx_elem.attributes['creator'] = "GPX RubyGem 0.1 Copyright 2006 Doug Fales -- http://walkingboss.com"
184
- gpx_elem.attributes['xsi:schemaLocation'] = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
198
+ doc.root = Node.new('gpx')
199
+ gpx_elem = doc.root
200
+ gpx_elem['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance"
201
+ gpx_elem['xmlns'] = "http://www.topografix.com/GPX/1/1"
202
+ gpx_elem['version'] = "1.1"
203
+ gpx_elem['creator'] = "GPX RubyGem 0.1 Copyright 2006 Doug Fales -- http://walkingboss.com"
204
+ gpx_elem['xsi:schemaLocation'] = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
185
205
 
186
- meta_data_elem = Element.new('metadata')
187
- name_elem = Element.new('name')
188
- name_elem.text = File.basename(filename)
189
- meta_data_elem.elements << name_elem
206
+ meta_data_elem = Node.new('metadata')
207
+ name_elem = Node.new('name')
208
+ name_elem << File.basename(filename)
209
+ meta_data_elem << name_elem
190
210
 
191
- time_elem = Element.new('time')
192
- time_elem.text = Time.now.xmlschema
193
- meta_data_elem.elements << time_elem
211
+ time_elem = Node.new('time')
212
+ time_elem << Time.now.xmlschema
213
+ meta_data_elem << time_elem
194
214
 
195
- meta_data_elem.elements << bounds.to_xml
215
+ meta_data_elem << bounds.to_xml
196
216
 
197
- gpx_elem.elements << meta_data_elem
217
+ gpx_elem << meta_data_elem
198
218
 
199
- tracks.each { |t| gpx_elem.add_element t.to_xml } unless tracks.nil?
200
- waypoints.each { |w| gpx_elem.add_element w.to_xml } unless waypoints.nil?
201
- routes.each { |r| gpx_elem.add_element r.to_xml } unless routes.nil?
219
+ tracks.each { |t| gpx_elem << t.to_xml } unless tracks.nil?
220
+ waypoints.each { |w| gpx_elem << w.to_xml } unless waypoints.nil?
221
+ routes.each { |r| gpx_elem << r.to_xml } unless routes.nil?
202
222
 
203
- File.open(filename, 'w') { |f| doc.write(f) }
223
+ doc.save(filename, true)
204
224
  end
205
225
 
206
226
  private
@@ -29,16 +29,17 @@ module GPX
29
29
 
30
30
  # When you need to manipulate individual points, you can create a Point
31
31
  # object with a latitude, a longitude, an elevation, and a time. In
32
- # addition, you can pass a REXML element to this initializer, and the
32
+ # addition, you can pass an XML element to this initializer, and the
33
33
  # relevant info will be parsed out.
34
34
  def initialize(opts = {:lat => 0.0, :lon => 0.0, :elevation => 0.0, :time => Time.now } )
35
+ @gpx_file = opts[:gpx_file]
35
36
  if (opts[:element])
36
37
  elem = opts[:element]
37
- @lat, @lon = elem.attributes["lat"].to_f, elem.attributes["lon"].to_f
38
+ @lat, @lon = elem["lat"].to_f, elem["lon"].to_f
38
39
  @latr, @lonr = (D_TO_R * @lat), (D_TO_R * @lon)
39
40
  #'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
40
- @time = (Time.xmlschema(elem.elements["time"].text) rescue nil)
41
- @elevation = elem.elements["ele"].text.to_f if elem.elements["ele"]
41
+ @time = (Time.xmlschema(elem.find("gpx:time", @gpx_file.ns).first.content) rescue nil)
42
+ @elevation = elem.find("gpx:ele", @gpx_file.ns).first.content.to_f unless elem.find("gpx:ele", @gpx_file.ns).empty?
42
43
  else
43
44
  @lat = opts[:lat]
44
45
  @lon = opts[:lon]
@@ -85,17 +86,19 @@ module GPX
85
86
  @lon = longitude
86
87
  end
87
88
 
88
- # Convert this point to a REXML::Element.
89
+ # Convert this point to a XML::Node.
89
90
  def to_xml(elem_name = 'trkpt')
90
- pt = Element.new('trkpt')
91
- pt.attributes['lat'] = lat
92
- pt.attributes['lon'] = lon
93
- time_elem = Element.new('time')
94
- time_elem.text = time.xmlschema
95
- pt.elements << time_elem
96
- elev = Element.new('ele')
97
- elev.text = elevation
98
- pt.elements << elev
91
+ pt = Node.new('trkpt')
92
+ pt['lat'] = lat.to_s
93
+ pt['lon'] = lon.to_s
94
+ unless time.nil?
95
+ time_elem = Node.new('time')
96
+ time_elem << time.xmlschema
97
+ pt << time_elem
98
+ end
99
+ elev = Node.new('ele')
100
+ elev << elevation
101
+ pt << elev
99
102
  pt
100
103
  end
101
104
 
@@ -29,13 +29,13 @@ module GPX
29
29
 
30
30
  attr_reader :points, :name, :gpx_file
31
31
 
32
- # Initialize a Route from a REXML::Element.
32
+ # Initialize a Route from a XML::Node.
33
33
  def initialize(opts = {})
34
34
  rte_element = opts[:element]
35
35
  @gpx_file = opts[:gpx_file]
36
- @name = rte_element.elements["child::name"].text
36
+ @name = rte_element.find("child::gpx:name", @ns).first.content
37
37
  @points = []
38
- XPath.each(rte_element, "child::rtept") do |point|
38
+ rte_element.find("child::gpx:rtept", @ns).each do |point|
39
39
  @points << Point.new(:element => point)
40
40
  end
41
41
 
@@ -51,13 +51,13 @@ module GPX
51
51
  points.delete_if{ |pt| area.contains? pt }
52
52
  end
53
53
 
54
- # Convert this Route to a REXML::Element.
54
+ # Convert this Route to a XML::Node.
55
55
  def to_xml
56
- rte = Element.new('rte')
57
- name_elem = Element.new('name')
58
- name_elem.text = name
59
- rte.elements << name_elem
60
- points.each { |rte_pt| rte.elements << rte_pt.to_xml('rtept') }
56
+ rte = Node.new('rte')
57
+ name_elem = Node.new('name')
58
+ name_elem << name
59
+ rte << name_elem
60
+ points.each { |rte_pt| rte << rte_pt.to_xml('rtept') }
61
61
  rte
62
62
  end
63
63
 
@@ -31,9 +31,10 @@ module GPX
31
31
  attr_reader :earliest_point, :latest_point, :bounds, :highest_point, :lowest_point, :distance
32
32
  attr_accessor :points, :track
33
33
 
34
- # If a REXML::Element object is passed-in, this will initialize a new
34
+ # If a XML::Node object is passed-in, this will initialize a new
35
35
  # Segment based on its contents. Otherwise, a blank Segment is created.
36
36
  def initialize(opts = {})
37
+ @gpx_file = opts[:gpx_file]
37
38
  @track = opts[:track]
38
39
  @points = []
39
40
  @earliest_point = nil
@@ -45,11 +46,13 @@ module GPX
45
46
  if(opts[:element])
46
47
  segment_element = opts[:element]
47
48
  last_pt = nil
48
- unless segment_element.is_a?(Text)
49
- XPath.each(segment_element, "child::trkpt") do |trkpt|
50
- pt = TrackPoint.new(:element => trkpt, :segment => self)
51
- @earliest_point = pt if(@earliest_point.nil? or pt.time < @earliest_point.time)
52
- @latest_point = pt if(@latest_point.nil? or pt.time > @latest_point.time)
49
+ if segment_element.is_a?(XML::Node)
50
+ segment_element.find("child::gpx:trkpt", @gpx_file.ns).each do |trkpt|
51
+ pt = TrackPoint.new(:element => trkpt, :segment => self, :gpx_file => @gpx_file)
52
+ unless pt.time.nil?
53
+ @earliest_point = pt if(@earliest_point.nil? or pt.time < @earliest_point.time)
54
+ @latest_point = pt if(@latest_point.nil? or pt.time > @latest_point.time)
55
+ end
53
56
  unless pt.elevation.nil?
54
57
  @lowest_point = pt if(@lowest_point.nil? or pt.elevation < @lowest_point.elevation)
55
58
  @highest_point = pt if(@highest_point.nil? or pt.elevation > @highest_point.elevation)
@@ -85,7 +88,7 @@ module GPX
85
88
 
86
89
  # Returns true if the given time is within this Segment.
87
90
  def contains_time?(time)
88
- (time >= @earliest_point.time and time <= @latest_point.time)
91
+ (time >= @earliest_point.time and time <= @latest_point.time) rescue false
89
92
  end
90
93
 
91
94
  # Finds the closest point in time to the passed-in time argument. Useful
@@ -129,10 +132,10 @@ module GPX
129
132
  (points.nil? or (points.size == 0))
130
133
  end
131
134
 
132
- # Converts this Segment to a REXML::Element object.
135
+ # Converts this Segment to a XML::Node object.
133
136
  def to_xml
134
- seg = Element.new('trkseg')
135
- points.each { |pt| seg.elements << pt.to_xml }
137
+ seg = Node.new('trkseg')
138
+ points.each { |pt| seg << pt.to_xml }
136
139
  seg
137
140
  end
138
141
 
@@ -202,8 +205,10 @@ module GPX
202
205
  end
203
206
 
204
207
  def update_meta_data(pt, last_pt)
205
- @earliest_point = pt if(@earliest_point.nil? or pt.time < @earliest_point.time)
206
- @latest_point = pt if(@latest_point.nil? or pt.time > @latest_point.time)
208
+ unless pt.time.nil?
209
+ @earliest_point = pt if(@earliest_point.nil? or pt.time < @earliest_point.time)
210
+ @latest_point = pt if(@latest_point.nil? or pt.time > @latest_point.time)
211
+ end
207
212
  unless pt.elevation.nil?
208
213
  @lowest_point = pt if(@lowest_point.nil? or pt.elevation < @lowest_point.elevation)
209
214
  @highest_point = pt if(@highest_point.nil? or pt.elevation > @highest_point.elevation)
@@ -32,7 +32,7 @@ module GPX
32
32
  attr_reader :points, :bounds, :lowest_point, :highest_point, :distance
33
33
  attr_accessor :segments, :name, :gpx_file
34
34
 
35
- # Initialize a track from a REXML::Element, or, if no :element option is
35
+ # Initialize a track from a XML::Node, or, if no :element option is
36
36
  # passed, initialize a blank Track object.
37
37
  def initialize(opts = {})
38
38
  @gpx_file = opts[:gpx_file]
@@ -41,9 +41,9 @@ module GPX
41
41
  reset_meta_data
42
42
  if(opts[:element])
43
43
  trk_element = opts[:element]
44
- @name = (trk_element.elements["child::name"].text rescue "")
45
- XPath.each(trk_element, "child::trkseg") do |seg_element|
46
- seg = Segment.new(:element => seg_element, :track => self)
44
+ @name = (trk_element.find("child::gpx:name", @gpx_file.ns).first.content rescue "")
45
+ trk_element.find("child::gpx:trkseg", @gpx_file.ns).each do |seg_element|
46
+ seg = Segment.new(:element => seg_element, :track => self, :gpx_file => @gpx_file)
47
47
  update_meta_data(seg)
48
48
  @segments << seg
49
49
  @points.concat(seg.points) unless seg.nil?
@@ -101,14 +101,14 @@ module GPX
101
101
  (points.nil? or points.size.zero?)
102
102
  end
103
103
 
104
- # Creates a new REXML::Element from the contents of this instance.
104
+ # Creates a new XML::Node from the contents of this instance.
105
105
  def to_xml
106
- trk= Element.new('trk')
107
- name_elem = Element.new('name')
108
- name_elem.text = name
109
- trk.elements << name_elem
106
+ trk= Node.new('trk')
107
+ name_elem = Node.new('name')
108
+ name_elem << name
109
+ trk << name_elem
110
110
  segments.each do |seg|
111
- trk.elements << seg.to_xml
111
+ trk << seg.to_xml
112
112
  end
113
113
  trk
114
114
  end
@@ -39,7 +39,7 @@ module GPX
39
39
  def delete_area(area)
40
40
  end
41
41
 
42
- # Initializes a waypoint from a REXML::Element.
42
+ # Initializes a waypoint from a XML::Node.
43
43
  def initialize(opts = {})
44
44
  wpt_elem = opts[:element]
45
45
  super(:element => wpt_elem)
@@ -47,25 +47,25 @@ module GPX
47
47
  @gpx_file = opts[:gpx_file]
48
48
  end
49
49
 
50
- # Converts a waypoint to a REXML::Element.
50
+ # Converts a waypoint to a XML::Node.
51
51
  def to_xml
52
- wpt = Element.new('wpt')
52
+ wpt = Node.new('wpt')
53
53
  wpt.attributes['lat'] = lat
54
54
  wpt.attributes['lon'] = lon
55
55
  if self.respond_to? :name
56
- name_elem = Element.new('name')
57
- name_elem.text = self.name
58
- wpt.elements << name_elem
56
+ name_elem = Node.new('name')
57
+ name_elem << self.name
58
+ wpt << name_elem
59
59
  end
60
60
  if self.respond_to? :sym
61
- sym_elem = Element.new('sym')
62
- sym_elem.text = self.sym
63
- wpt.elements << sym_elem
61
+ sym_elem = Node.new('sym')
62
+ sym_elem << self.sym
63
+ wpt << sym_elem
64
64
  end
65
65
  if self.respond_to? :ele
66
- elev_elem = Element.new('ele')
67
- elev_elem.text = self.ele
68
- wpt.elements << elev_elem
66
+ elev_elem = Node.new('ele')
67
+ elev_elem << self.ele
68
+ wpt << elev_elem
69
69
  end
70
70
  wpt
71
71
  end
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/gpx'
3
+
4
+ class TestGPX10 < Test::Unit::TestCase
5
+ GPX_FILE = File.join(File.dirname(__FILE__), "gpx_files/gpx10.gpx")
6
+
7
+ def test_read
8
+ # make sure we can read a GPX 1.0 file
9
+ @gpx_file = GPX::GPXFile.new(:gpx_file => GPX_FILE)
10
+ end
11
+
12
+ end
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <gpx version="1.0"
3
+ creator="GPSBabel - http://www.gpsbabel.org"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns="http://www.topografix.com/GPX/1/0"
6
+ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
7
+ <trk>
8
+ <name>ACTIVE LOG #74</name>
9
+ <number>82</number>
10
+ <trkseg>
11
+ <trkpt lat="37.378388923" lon="-122.063654875">
12
+ <ele>35.706055</ele>
13
+ <time>2007-11-23T23:49:43Z</time>
14
+ </trkpt>
15
+ </trkseg>
16
+ </trk>
17
+ </gpx>
@@ -1,4 +1,5 @@
1
1
  require 'test/unit'
2
+ require 'yaml'
2
3
  require File.dirname(__FILE__) + '/../lib/gpx'
3
4
 
4
5
  class TestSegment < Test::Unit::TestCase
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: gpx
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.1"
7
- date: 2006-10-14 00:00:00 -06:00
6
+ version: "0.2"
7
+ date: 2007-11-29 00:00:00 -07:00
8
8
  summary: A basic API for reading and writing GPX files.
9
9
  require_paths:
10
10
  - lib
@@ -25,11 +25,11 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Doug Fales
30
31
  files:
31
32
  - lib/gpx
32
- - lib/gpx.rb
33
33
  - lib/gpx/bounds.rb
34
34
  - lib/gpx/gpx.rb
35
35
  - lib/gpx/gpx_file.rb
@@ -40,18 +40,21 @@ files:
40
40
  - lib/gpx/track.rb
41
41
  - lib/gpx/trackpoint.rb
42
42
  - lib/gpx/waypoint.rb
43
+ - lib/gpx.rb
44
+ - tests/gpx10_test.rb
43
45
  - tests/gpx_files
44
- - tests/magellan_test.rb
45
- - tests/segment_test.rb
46
- - tests/track_file_test.rb
47
- - tests/track_test.rb
48
46
  - tests/gpx_files/arches.gpx
47
+ - tests/gpx_files/gpx10.gpx
49
48
  - tests/gpx_files/magellan_track.log
50
49
  - tests/gpx_files/one_segment.gpx
51
50
  - tests/gpx_files/one_track.gpx
52
51
  - tests/gpx_files/routes.gpx
53
52
  - tests/gpx_files/tracks.gpx
54
53
  - tests/gpx_files/waypoints.gpx
54
+ - tests/magellan_test.rb
55
+ - tests/segment_test.rb
56
+ - tests/track_file_test.rb
57
+ - tests/track_test.rb
55
58
  - Rakefile
56
59
  - README
57
60
  test_files: []