aipp 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0897562e048a1f5eae251b19e4059ce16a319761acff603a0679e8688aad8a7a'
4
- data.tar.gz: d83c038edceaab6eb9d996eba589e3aa277e702be8974d80a22c7f45b0e7f8bf
3
+ metadata.gz: 6ce24174fda71fe6649f2d1f02eab03a2d9de0a59da6dbb581d581fe2dc2df4c
4
+ data.tar.gz: 7643f1ec9c399e244ddbc13ef9a3a5df31eaf63e78c197a55c55838a0536d8ad
5
5
  SHA512:
6
- metadata.gz: a1df374cfd53eaa0a5d767018996b6b62df24b7641d0755346b01c7846b4eaa40c307d777c684663335676f6003db0313e84d2ff379c74b2e0503cee5a4600e9
7
- data.tar.gz: a3cb46a7fb3d6e43ff1f030fdd361b0a764eea73431e9880a896aae87fc101d3f91d45e084940797633f2e5f5eb6fe27c9771f1c9e14931df40e8a2c4194fe28
6
+ metadata.gz: d4029172c77e70998f89c10eb19c6bb827d042fd7a9c9190538bb422e319c0387c85534de28e8d0357b0c676f99e7a222479419bbc34d00cc34ca3c918636987
7
+ data.tar.gz: 3a294be41d8eb5067dc286b60ed304db554607694e094b7fa92a114ce9bac663261ba4246d45d4da133b753689535f2a708d09dd47dc06204dd5f86c5dd982f6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.1.3
2
+
3
+ * Additons:
4
+ LF/AD-1.5
5
+ * Minor changes:
6
+ * Summary at end of run
7
+
1
8
  ## 0.1.2
2
9
 
3
10
  * Additions:
data/README.md CHANGED
@@ -31,7 +31,7 @@ aip2aixm --help
31
31
 
32
32
  ## Parsers
33
33
 
34
- Parsers are defined as modules and named +lib/aipp/parser/{FIR}/{AIP}.rb+. For
34
+ Parsers are defined as modules and named <tt>lib/aipp/parser/{FIR}/{AIP}.rb</tt>. For
35
35
  them to plug in, you have to define the following public methods:
36
36
 
37
37
  * `url`<br>Must return the download URL of the AIP HTML as a string.
@@ -53,6 +53,11 @@ You should `fail` on fatal and `warn` on non-fatal problems. If `$DEBUG` is
53
53
  warn("my message", binding)
54
54
  ```
55
55
 
56
+ ## Helpers
57
+
58
+ Any modules in <tt>lib/aipp/parser/{FIR}/helpers</tt> are required automatically and
59
+ can be included and used in the parsers.
60
+
56
61
  ## AIRAC date calculations
57
62
 
58
63
  ```ruby
data/aipp.gemspec CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'guard'
31
31
  spec.add_development_dependency 'guard-minitest'
32
32
 
33
- spec.add_runtime_dependency 'aixm', '~> 0', '>= 0.2.2'
33
+ spec.add_runtime_dependency 'aixm', '~> 0', '>= 0.2.3'
34
34
  spec.add_runtime_dependency 'nokogiri', '~> 1'
35
35
  spec.add_runtime_dependency 'nokogumbo', '~> 1'
36
36
  spec.add_runtime_dependency 'pry', '~> 0'
data/exe/aip2aixm CHANGED
@@ -20,7 +20,7 @@ class Executable
20
20
  @verbose = false
21
21
  OptionParser.new do |o|
22
22
  o.banner = <<~END
23
- Download online AIP and convert it to AIXM.
23
+ Download online AIP and convert it to AIXM for VFR.
24
24
  Usage: #{File.basename($0)} [options]
25
25
  END
26
26
  o.on('-A', '--about', 'author and license information') { puts 'Written by Sven Schwyn (bitcetera.com) and distributed under MIT license.'; exit }
@@ -42,8 +42,8 @@ class Executable
42
42
  extensions = [(:ofm if ofm)].compact
43
43
  filename = [fir, aip, airac].join('_') + '.aixm'
44
44
  loader = AIPP::Loader.new(fir: fir, aip: aip, airac: airac, limit: limit)
45
- aixm = loader.aixm.to_aixm(*extensions)
46
- File.write(Pathname.new(Dir.pwd).join(filename), aixm)
45
+ File.write(Pathname.new(Dir.pwd).join(filename), loader.aixm.to_aixm(*extensions))
46
+ puts "#{loader.aixm.features.count} feature(s) written to #{filename}"
47
47
  end
48
48
  end
49
49
 
@@ -0,0 +1,128 @@
1
+ module AIPP
2
+ module Parsers
3
+ include Helpers::URL
4
+ include Helpers::HTML
5
+ using AIPP::Refinements
6
+
7
+ MASTER_MAP = {
8
+ 'l' => 'ndb'
9
+ }.freeze
10
+
11
+ def convert!
12
+ cleanup!
13
+ html.css('tbody').each do |tbody|
14
+ name = last_id = nil
15
+ tbody.css('tr').to_enum.with_index(1).each do |tr, index|
16
+ break if index >= @limit
17
+ case tr.attr(:id)
18
+ when /TXT_NAME/
19
+ index -= 1
20
+ name = tr.css('td').text.strip.split("\n").first
21
+ when /GEO_LAT/
22
+ tds = tr.css('td')
23
+ type, runway = tds[0].text.strip.gsub(/\s+/, ' ').split(' ', 2)
24
+ master, slave = type.downcase.split('-')
25
+ if respond_to?("#{master}_from", true)
26
+ id = tds[1].text.strip.blank_to_nil || last_id
27
+ navaid = AIXM.send(
28
+ (MASTER_MAP[master] || master),
29
+ { id: id, name: [name, runway].compact.join(' ') }.
30
+ merge(base_from(tds)).
31
+ merge(send("#{master}_from", tds))
32
+ )
33
+ navaid.schedule = schedule_from(tds[3])
34
+ navaid.remarks = remarks_from(tds[6], tds[7], tds[8])
35
+ navaid.send("associate_#{slave}", channel: channel_from(tds[2])) if slave
36
+ aixm.features << navaid
37
+ last_id = id
38
+ else
39
+ warn("WARNING: navigational aid `#{master}' at ##{index} skipped: not relevant to VFR")
40
+ end
41
+ end
42
+ rescue => exception
43
+ warn("WARNING: error parsing navigational aid at ##{index}: #{exception.message}", binding)
44
+ end
45
+ end
46
+ true
47
+ end
48
+
49
+ private
50
+
51
+ def base_from(tds)
52
+ {
53
+ xy: xy_from(tds[4]),
54
+ z: z_from(tds[5])
55
+ }
56
+ end
57
+
58
+ def vor_from(tds)
59
+ {
60
+ type: :conventional,
61
+ f: frequency_from(tds[2]),
62
+ north: :geographic,
63
+ }
64
+ end
65
+
66
+ def dme_from(tds)
67
+ {
68
+ channel: channel_from(tds[2])
69
+ }
70
+ end
71
+
72
+ def ndb_from(tds)
73
+ {
74
+ type: :en_route,
75
+ f: frequency_from(tds[2])
76
+ }
77
+ end
78
+
79
+ def l_from(tds)
80
+ {
81
+ type: :locator,
82
+ f: frequency_from(tds[2])
83
+ }
84
+ end
85
+
86
+ def tacan_from(tds)
87
+ {
88
+ channel: channel_from(tds[2])
89
+ }
90
+ end
91
+
92
+ def xy_from(td)
93
+ parts = td.text.strip.split(/\s+/)
94
+ AIXM.xy(lat: parts[0], long: parts[1])
95
+ end
96
+
97
+ def z_from(td)
98
+ parts = td.text.strip.split(/\s+/)
99
+ AIXM.z(parts[0].to_i, :qnh) if parts[1] == 'ft'
100
+ end
101
+
102
+ def frequency_from(td)
103
+ parts = td.text.strip.split(/\s+/)
104
+ AIXM.f(parts[0], parts[1]) if parts[1] =~ /hz$/i
105
+ end
106
+
107
+ def channel_from(td)
108
+ parts = td.text.strip.split(/\s+/)
109
+ parts.last if parts[-2].downcase == 'ch'
110
+ end
111
+
112
+ def schedule_from(td)
113
+ code = td.text.strip
114
+ AIXM.schedule(code: code) unless code.empty?
115
+ end
116
+
117
+ def remarks_from(*parts)
118
+ part_titles = ['COVERAGE', 'RDH (SLOPE)', 'LOCATION']
119
+ [].tap do |remarks|
120
+ parts.each.with_index do |part, index|
121
+ if part = part.text.gsub(/ +/, ' ').strip.blank_to_nil
122
+ remarks << "#{part_titles[index]}:\n#{part}"
123
+ end
124
+ end
125
+ end.join("\n\n").blank_to_nil
126
+ end
127
+ end
128
+ end
@@ -1,14 +1,16 @@
1
1
  module AIPP
2
2
  module Parsers
3
3
  include Helpers::URL
4
+ include Helpers::HTML
4
5
  using AIPP::Refinements
5
6
 
6
7
  def convert!
8
+ cleanup!
7
9
  html.css('tbody').each do |tbody|
8
10
  tbody.css('tr').to_enum.with_index(1).each do |tr, index|
9
11
  break if index >= @limit
10
12
  tds = tr.css('td')
11
- master, slave = tds[1].text.strip.downcase.gsub(/[^\w-]/, '').downcase.split('-')
13
+ master, slave = tds[1].text.strip.gsub(/[^\w-]/, '').downcase.split('-')
12
14
  navaid = AIXM.send(master, base_from(tds).merge(send("#{master}_from", tds)))
13
15
  navaid.schedule = schedule_from(tds[4])
14
16
  navaid.remarks = remarks_from(tds[5], tds[7], tds[9])
@@ -34,7 +36,7 @@ module AIPP
34
36
 
35
37
  def vor_from(tds)
36
38
  {
37
- type: :vor,
39
+ type: :conventional,
38
40
  f: frequency_from(tds[3]),
39
41
  north: :geographic,
40
42
  }
@@ -48,6 +50,7 @@ module AIPP
48
50
 
49
51
  def ndb_from(tds)
50
52
  {
53
+ type: :en_route,
51
54
  f: frequency_from(tds[3])
52
55
  }
53
56
  end
@@ -1,9 +1,10 @@
1
1
  module AIPP
2
2
  module Parsers
3
3
  include Helpers::URL
4
- # using AIPP::Refinements
4
+ include Helpers::HTML
5
5
 
6
6
  def convert!
7
+ cleanup!
7
8
  html.css('tbody').each do |tbody|
8
9
  tbody.css('tr').to_enum.with_index(1).each do |tr, index|
9
10
  break if index >= @limit
@@ -1,6 +1,7 @@
1
1
  module AIPP
2
2
  module Parsers
3
3
  include Helpers::URL
4
+ include Helpers::HTML
4
5
  using AIPP::Refinements
5
6
  using AIXM::Refinements
6
7
 
@@ -21,6 +22,7 @@ module AIPP
21
22
  }.freeze
22
23
 
23
24
  def convert!
25
+ cleanup!
24
26
  html.css('tbody:has(tr[id^=mid])').each do |tbody|
25
27
  airspace = nil
26
28
  tbody.css('tr').to_enum.with_index(1).each do |tr, index|
@@ -126,7 +128,7 @@ module AIPP
126
128
  end
127
129
  end
128
130
  end
129
- end.join("\n\n")
131
+ end.join("\n\n").blank_to_nil
130
132
  end
131
133
  end
132
134
  end
@@ -0,0 +1,11 @@
1
+ module AIPP
2
+ module Helpers
3
+ module HTML
4
+
5
+ def cleanup!
6
+ html.css('del').each { |n| n.remove } # remove deleted entries
7
+ end
8
+
9
+ end
10
+ end
11
+ end
data/lib/aipp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module AIPP
2
- VERSION = "0.1.2".freeze
2
+ VERSION = "0.1.3".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aipp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Schwyn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-26 00:00:00.000000000 Z
11
+ date: 2018-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -131,7 +131,7 @@ dependencies:
131
131
  version: '0'
132
132
  - - ">="
133
133
  - !ruby/object:Gem::Version
134
- version: 0.2.2
134
+ version: 0.2.3
135
135
  type: :runtime
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
@@ -141,7 +141,7 @@ dependencies:
141
141
  version: '0'
142
142
  - - ">="
143
143
  - !ruby/object:Gem::Version
144
- version: 0.2.2
144
+ version: 0.2.3
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: nokogiri
147
147
  requirement: !ruby/object:Gem::Requirement
@@ -206,9 +206,11 @@ files:
206
206
  - lib/aipp.rb
207
207
  - lib/aipp/airac.rb
208
208
  - lib/aipp/loader.rb
209
+ - lib/aipp/parsers/LF/AD-1.5.rb
209
210
  - lib/aipp/parsers/LF/ENR-4.1.rb
210
211
  - lib/aipp/parsers/LF/ENR-4.3.rb
211
212
  - lib/aipp/parsers/LF/ENR-5.1.rb
213
+ - lib/aipp/parsers/LF/helpers/html.rb
212
214
  - lib/aipp/parsers/LF/helpers/url.rb
213
215
  - lib/aipp/refinements.rb
214
216
  - lib/aipp/version.rb