pr2gpx 0.1.1 → 0.1.2

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/lib/pr2gpx.rb CHANGED
@@ -1,13 +1,15 @@
1
- require 'nokogiri'
2
- require 'nokogiri/xml'
3
- require 'pr2gpx/parser'
4
1
  require 'pr2gpx/options'
2
+ require 'pr2gpx/parser'
3
+ require 'pr2gpx/gpx'
5
4
 
5
+ # Creates an Enumerable with one entry for every file in search_path,
6
+ # containing the files content.
6
7
  def enumerate_files search_path
7
8
  Enumerator.new do |e|
8
9
  Dir
9
10
  .glob(search_path)
10
11
  .each do |filename|
12
+ $stderr.puts "Reading #{filename}" if $verbose
11
13
  File.open filename do |file|
12
14
  e.yield file.read()
13
15
  end
@@ -15,6 +17,13 @@ def enumerate_files search_path
15
17
  end
16
18
  end
17
19
 
20
+ # Runs each element of content_enum through ReportParser::parse,
21
+ # receiving an Enumerable of PositionReport. If the report passes
22
+ # through the filter, it is added to the hash of the station, if
23
+ # no other report with the same date exists.
24
+ #
25
+ # Those hashes are stored in another hash, indexed by callsign,
26
+ # which gets returned.
18
27
  def load_data content_enum, filter
19
28
  reportParser = ReportParser.new
20
29
  stations = Hash.new
@@ -24,16 +33,25 @@ def load_data content_enum, filter
24
33
  if reports
25
34
  reports.each do |report|
26
35
  if filter.include? report
36
+ $stderr.print 'o' if $verbose
27
37
  stations[report.callsign] = Hash.new unless stations.has_key? report.callsign
28
38
  stations[report.callsign][report.date] = report unless stations[report.callsign].has_key? report.date
39
+ else
40
+ $stderr.print '.' if $verbose
29
41
  end
30
42
  end
31
43
  end
44
+ $stderr.puts if $verbose
32
45
  end
33
46
 
34
47
  stations
35
48
  end
36
49
 
50
+ # Converts the reports the entries of the stations-hash, which are
51
+ # hashes indexed by date, into arrays sorted by date.
52
+ #
53
+ # The parameter last can be used to limit the reports to the N
54
+ # most recent ones.
37
55
  def filter_data! stations, last
38
56
  stations.each do |callsign, reports|
39
57
  stations[callsign] = reports.values
@@ -46,52 +64,16 @@ def filter_data! stations, last
46
64
  end
47
65
  end
48
66
 
49
- def build_gpx stations, create_trk, create_wpt
50
- builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
51
- xml.gpx(xmlns: 'http://www.topografix.com/GPX/1/1') do
52
- if create_trk
53
- stations.each do |callsign, reports|
54
- xml.trk do
55
- xml.name callsign
56
- xml.trkseg do
57
- reports.each do |report|
58
- xml.send('trkpt', lat: report.position.latitude, lon: report.position.longitude) do
59
- xml.name report.comment
60
- xml.time report.date.strftime('%FT%TZ')
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
67
- if create_wpt
68
- stations.each do |callsign, reports|
69
- last = reports.last
70
- reports.each do |report|
71
- xml.send('wpt', lat: report.position.latitude, lon: report.position.longitude) do
72
- xml.name report.callsign
73
- xml.desc report.comment
74
- xml.time report.date.strftime('%FT%TZ')
75
- xml.type 'WPT'
76
- xml.sym report == last ? 'triangle' : 'circle'
77
- end
78
- end
79
- end
80
- end
81
- end
82
- end
83
- builder.to_xml
84
- end
85
-
86
- def write_gpx filename, gpx
87
- File.open filename, 'w:UTF-8' do |file|
88
- file.write gpx
89
- end
90
- end
91
-
92
67
  options = parse_options ARGV
93
68
  exit if not options
94
69
 
70
+ errors = validate_options(options)
71
+ if errors
72
+ $stderr.puts errors
73
+ exit
74
+ end
75
+
76
+ # normalize path separators
95
77
  options[:input].gsub!('\\', '/')
96
78
  options[:output].gsub!('\\', '/') if options[:output]
97
79
 
@@ -103,7 +85,7 @@ filter = ReportFilter.new options[:callsign]
103
85
  stations = load_data(enumerate_files(search_path), filter)
104
86
  filter_data! stations, options[:last]
105
87
 
106
- if options[:split]
88
+ if options[:split] # create one document for each station
107
89
  stations.each do |callsign, reports|
108
90
  gpx = build_gpx({ callsign => reports }, options[:create_trk], options[:create_wpt])
109
91
 
@@ -113,7 +95,7 @@ if options[:split]
113
95
  puts gpx
114
96
  end
115
97
  end
116
- else
98
+ else # create one document for all data
117
99
  gpx = build_gpx(stations, options[:create_trk], options[:create_wpt])
118
100
 
119
101
  if options[:output] then
data/lib/pr2gpx/gpx.rb ADDED
@@ -0,0 +1,53 @@
1
+ require 'nokogiri'
2
+ require 'nokogiri/xml'
3
+
4
+ # Creates the GPX document from the stations hash.
5
+ #
6
+ # If create_trk is true, one trk per station gets created.
7
+ #
8
+ # If create_wpt is true, one waypoint for every report of every
9
+ # station gets created.
10
+ def build_gpx stations, create_trk, create_wpt
11
+ builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
12
+ xml.gpx(xmlns: 'http://www.topografix.com/GPX/1/1') do
13
+ if create_trk
14
+ stations.each do |callsign, reports|
15
+ xml.trk do
16
+ xml.name callsign
17
+ xml.trkseg do
18
+ reports.each do |report|
19
+ xml.send('trkpt', lat: report.position.latitude, lon: report.position.longitude) do
20
+ xml.name report.comment
21
+ xml.time report.date.strftime('%FT%TZ')
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ if create_wpt
29
+ stations.each do |callsign, reports|
30
+ last = reports.last
31
+ reports.each do |report|
32
+ xml.send('wpt', lat: report.position.latitude, lon: report.position.longitude) do
33
+ xml.name report.callsign
34
+ xml.desc report.comment
35
+ xml.time report.date.strftime('%FT%TZ')
36
+ xml.type 'WPT'
37
+ xml.sym report == last ? 'triangle' : 'circle'
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ builder.to_xml
45
+ end
46
+
47
+ # Writes the gpx document with UTF-8 encoding to filename.
48
+ def write_gpx filename, gpx
49
+ $stderr.puts "Writing #{filename}" if $verbose
50
+ File.open filename, 'w:UTF-8' do |file|
51
+ file.write gpx
52
+ end
53
+ end
@@ -1,5 +1,6 @@
1
1
  require 'optparse'
2
2
 
3
+ # If options are valid, returns a hash of options, otherwise nil.
3
4
  def parse_options argv
4
5
  options = {}
5
6
  mandatory = [:input]
@@ -95,4 +96,31 @@ def parse_options argv
95
96
  end
96
97
 
97
98
  options
99
+ end
100
+
101
+ # If errors are encountered, returns an array of error messages, otherwise nil.
102
+ def validate_options options
103
+ errors = []
104
+
105
+ if not File.exists?(options[:input])
106
+ errors << 'Path specified in --input does not exist.'
107
+ elsif not File.directory?(options[:input])
108
+ errors << 'Path specified in --input is not a directory.'
109
+ end
110
+
111
+ if options[:split]
112
+ if not File.exists?(options[:output])
113
+ errors << 'Path specified in --output does not exist.'
114
+ elsif not File.directory?(options[:output])
115
+ errors << 'Path specified in --output is not a directory.'
116
+ end
117
+ else
118
+ if not File.exists?(File.dirname(options[:output]))
119
+ errors << 'Path specified in --output does not exist.'
120
+ elsif File.directory?(options[:output])
121
+ errors << 'Path specified in --output is a directory.'
122
+ end
123
+ end
124
+
125
+ errors if errors.length > 0
98
126
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pr2gpx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -37,6 +37,7 @@ executables:
37
37
  extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
40
+ - lib/pr2gpx/gpx.rb
40
41
  - lib/pr2gpx/options.rb
41
42
  - lib/pr2gpx/parser.rb
42
43
  - lib/pr2gpx.rb