aipp 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -2
- data/CHANGELOG.md +15 -0
- data/README.md +122 -37
- data/TODO.md +4 -0
- data/aipp.gemspec +8 -3
- data/lib/aipp.rb +14 -2
- data/lib/aipp/aip.rb +44 -29
- data/lib/aipp/downloader.rb +115 -0
- data/lib/aipp/executable.rb +6 -6
- data/lib/aipp/parser.rb +23 -23
- data/lib/aipp/patcher.rb +47 -0
- data/lib/aipp/pdf.rb +123 -0
- data/lib/aipp/regions/LF/AD-1.3.rb +162 -0
- data/lib/aipp/regions/LF/AD-1.3.yml +511 -0
- data/lib/aipp/regions/LF/AD-1.6.rb +31 -0
- data/lib/aipp/regions/LF/AD-2.rb +316 -0
- data/lib/aipp/regions/LF/AD-2.yml +185 -0
- data/lib/aipp/regions/LF/AD-3.1.rb-NEW +11 -0
- data/lib/aipp/regions/LF/ENR-2.1.rb +25 -24
- data/lib/aipp/regions/LF/ENR-4.1.rb +24 -23
- data/lib/aipp/regions/LF/ENR-4.3.rb +8 -6
- data/lib/aipp/regions/LF/ENR-5.1.rb +32 -22
- data/lib/aipp/regions/LF/ENR-5.5.rb-NEW +11 -0
- data/lib/aipp/regions/LF/helpers/AD_radio.rb +90 -0
- data/lib/aipp/regions/LF/helpers/URL.rb +26 -0
- data/lib/aipp/regions/LF/helpers/common.rb +186 -0
- data/lib/aipp/version.rb +1 -1
- data/lib/core_ext/enumerable.rb +52 -0
- data/lib/core_ext/nil_class.rb +10 -0
- data/lib/core_ext/object.rb +42 -0
- data/lib/core_ext/string.rb +105 -0
- data/spec/fixtures/archive.zip +0 -0
- data/spec/fixtures/document.pdf +0 -0
- data/spec/fixtures/document.pdf.json +1 -0
- data/spec/fixtures/new.html +6 -0
- data/spec/fixtures/new.pdf +0 -0
- data/spec/fixtures/new.txt +1 -0
- data/spec/lib/aipp/downloader_spec.rb +81 -0
- data/spec/lib/aipp/patcher_spec.rb +46 -0
- data/spec/lib/aipp/pdf_spec.rb +124 -0
- data/spec/lib/core_ext/enumberable_spec.rb +76 -0
- data/spec/lib/core_ext/nil_class_spec.rb +11 -0
- data/spec/lib/core_ext/string_spec.rb +88 -0
- data/spec/spec_helper.rb +1 -0
- metadata +123 -23
- data/lib/aipp/progress.rb +0 -40
- data/lib/aipp/refinements.rb +0 -114
- data/lib/aipp/regions/LF/helper.rb +0 -177
- data/spec/lib/aipp/refinements_spec.rb +0 -123
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8728d9b2f455af64005813f575779ce93a2bf19167afb0574ce603ef0ed3582f
|
4
|
+
data.tar.gz: 6d901cc39dee66f917e56508520bf78383863375f90a72264909b60996c7d57d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 908575b22b787ca1743333146b113b89aea0a1e8919f0ae50abc2bf306bc11fcaec8a12780a56f3591eb96bb7790924a7959d15f0b4d06f68847e527f14782ec
|
7
|
+
data.tar.gz: 12a04dab59f3d229624938c21b64f1c05f15352ed1f5617c5fb05745b0230ef2b80a1fd54024d65375e452fdf8d79d7320ff5fa1d396f03ef1764c4ce4a91b63
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.6.3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,22 @@
|
|
1
|
+
## 0.2.2
|
2
|
+
|
3
|
+
#### Changes
|
4
|
+
* Helper modules instead of one monolythic `helper.rb`
|
5
|
+
|
6
|
+
#### Additions
|
7
|
+
* LF/AD-1.3
|
8
|
+
* LF/AD-1.6
|
9
|
+
* LF/AD-2
|
10
|
+
|
1
11
|
## 0.2.1
|
2
12
|
|
3
13
|
#### Changes
|
14
|
+
* Require Ruby 2.6
|
4
15
|
* Fix broken downloader
|
5
16
|
|
17
|
+
#### Additions
|
18
|
+
* Support for PDF files
|
19
|
+
|
6
20
|
## 0.2.0
|
7
21
|
|
8
22
|
#### Changes
|
@@ -38,5 +52,6 @@
|
|
38
52
|
## 0.1.0
|
39
53
|
|
40
54
|
#### Initial Implementation
|
55
|
+
* Require Ruby 2.5
|
41
56
|
* Framework and aip2aixm executable
|
42
57
|
* LF/ENR-5.1
|
data/README.md
CHANGED
@@ -8,9 +8,10 @@
|
|
8
8
|
|
9
9
|
Parser for Aeronautical Information Publication (AIP) available online.
|
10
10
|
|
11
|
-
This gem incluces two executables to download and parse aeronautical data, then export is as [AIXM](https://github.com/svoop/aixm) or [OFMX](https://github.com/openflightmaps/ofmx/wiki).
|
11
|
+
This gem incluces two executables to download and parse aeronautical data as HTML or PDF, then export is as [AIXM](https://github.com/svoop/aixm) or [OFMX](https://github.com/openflightmaps/ofmx/wiki).
|
12
12
|
|
13
13
|
* [Homepage](https://github.com/svoop/aipp)
|
14
|
+
* [Rubydoc](https://www.rubydoc.info/gems/aipp/AIPP)
|
14
15
|
* Author: [Sven Schwyn - Bitcetera](http://www.bitcetera.com)
|
15
16
|
|
16
17
|
## Install
|
@@ -36,25 +37,7 @@ AIPP uses a storage directory for configuration, caching and in order to keep th
|
|
36
37
|
|
37
38
|
The reference implementation is region "LF" (France).
|
38
39
|
|
39
|
-
To implement a region, you have to create a new directory <tt>lib/aipp/regions/{REGION}
|
40
|
-
|
41
|
-
### helper.rb
|
42
|
-
|
43
|
-
Create the file <tt>helper.rb</tt> which defines the module `AIPP::LF::Helper` and usually contains the URL builder method `url_for` used by all AIP parsers:
|
44
|
-
|
45
|
-
```ruby
|
46
|
-
module AIPP
|
47
|
-
module LF
|
48
|
-
module Helper
|
49
|
-
|
50
|
-
def url_for(aip_file)
|
51
|
-
# build and return the download URL for the aip file
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
```
|
40
|
+
To implement a region, you have to create a new directory <tt>lib/aipp/regions/{REGION}/</tt> and place the following files there:
|
58
41
|
|
59
42
|
### AIP Parsers
|
60
43
|
|
@@ -68,8 +51,9 @@ module AIPP
|
|
68
51
|
DEPENDS = %w(ENR-2.1 ENR-2.2) # declare dependencies to other AIPs
|
69
52
|
|
70
53
|
def parse
|
71
|
-
html =
|
72
|
-
|
54
|
+
html = read # read the Nokogiri::HTML5 document
|
55
|
+
feature = (...) # build the feature
|
56
|
+
write(feature: feature) # write the feature to AIXM::Document
|
73
57
|
end
|
74
58
|
|
75
59
|
end
|
@@ -86,8 +70,9 @@ module AIPP
|
|
86
70
|
|
87
71
|
def parse
|
88
72
|
%i(one two three).each do |part|
|
89
|
-
html =
|
90
|
-
|
73
|
+
html = read(aip_file: "#{aip}.#{part}") # read with a non-standard name
|
74
|
+
support_html = read(aip_file: 'AD-0.6') # maybe read necessary support documents
|
75
|
+
(...)
|
91
76
|
end
|
92
77
|
end
|
93
78
|
|
@@ -96,14 +81,99 @@ module AIPP
|
|
96
81
|
end
|
97
82
|
```
|
98
83
|
|
99
|
-
Inside the `parse` method, you have access to the following
|
84
|
+
Inside the `parse` method, you have access to the following methods:
|
85
|
+
|
86
|
+
* [`read`](https://www.rubydoc.info/gems/aipp/AIPP/AIP#read-instance_method) – download and read an AIP file
|
87
|
+
* [`write`](https://www.rubydoc.info/gems/aipp/AIPP/AIP#write-instance_method) – write a [`AIXM::Feature`]([AIXM Rubygem](https://github.com/svoop/aixm)
|
88
|
+
* [`select`](https://www.rubydoc.info/gems/aipp/AIPP/AIP#find-instance_method – search previously written [`AIXM::Feature`s]([AIXM Rubygem](https://github.com/svoop/aixm)
|
89
|
+
* some core extensions from ActiveSupport – [`Object#blank`](https://www.rubydoc.info/gems/activesupport/Object#blank%3F-instance_method) and [`String`](https://www.rubydoc.info/gems/activesupport/String)
|
90
|
+
* core extensions from this gem – [`Object`](https://www.rubydoc.info/gems/aipp/Object), [`String`](https://www.rubydoc.info/gems/aipp/String), [`NilClass`](https://www.rubydoc.info/gems/aipp/NilClass) and [`Enumerable`](https://www.rubydoc.info/gems/aipp/Enumerable)
|
91
|
+
|
92
|
+
As well as the following objects:
|
100
93
|
|
101
|
-
* `aixm` – target: instance of `AIXM::Document` (see [AIXM Rubygem](https://github.com/svoop/aixm))
|
102
94
|
* `options` – arguments read from <tt>aip2aixm</tt> or <tt>aip2ofmx</tt> respectively
|
103
95
|
* `config` – configuration read from <tt>config.yml</tt>
|
104
96
|
* `cache` – virgin `OStruct` instance to make objects available across AIPs
|
105
97
|
|
106
|
-
|
98
|
+
### Helpers
|
99
|
+
|
100
|
+
Helpers are modules defined in the <tt>lib/aipp/regions/{REGION}/helpers/</tt> directory. All helper modules are required automatically.
|
101
|
+
|
102
|
+
There is one mandatory helper called `URL.rb` which must define the following method to build URLs from which to download AIPs:
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
module AIPP
|
106
|
+
module LF
|
107
|
+
module Helpers
|
108
|
+
module URL
|
109
|
+
|
110
|
+
def url_for(aip_file)
|
111
|
+
# build and return the download URL for the aip file
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
```
|
119
|
+
|
120
|
+
Feel free to add more helpers to DRY code which is shared by multiple AIP parsers. Say you want to extract methods which are used by all AIP parsers:
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
module AIPP
|
124
|
+
module LF
|
125
|
+
module Helpers
|
126
|
+
module Common
|
127
|
+
|
128
|
+
def source(position:, aip_file: nil)
|
129
|
+
(...)
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
```
|
137
|
+
|
138
|
+
To use this `source` method, simply include the helper module in the AIP parser:
|
139
|
+
|
140
|
+
```ruby
|
141
|
+
module AIPP
|
142
|
+
module LF
|
143
|
+
class AD2 < AIP
|
144
|
+
|
145
|
+
include AIPP::LF::Helpers::Common
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
```
|
151
|
+
|
152
|
+
### Patches
|
153
|
+
|
154
|
+
When parsed data is faulty or missing, you might have to use a different data source instead such as static data from a fixture file. This is where patches come in. You can patch any AIXM attribute setter by defining a patch block inside the AIP parser:
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
module AIPP
|
158
|
+
module LF
|
159
|
+
class AD2 < AIP
|
160
|
+
|
161
|
+
patch AIXM::Component::Runway::Direction, :xy do |parser, object, value|
|
162
|
+
throw :abort unless value.nil?
|
163
|
+
@fixtures ||= YAML.load_file(Pathname(__FILE__).dirname.join('AD-1.3.yml'))
|
164
|
+
airport_id = parser.instance_variable_get(:@airport).id
|
165
|
+
direction_name = object.name.to_s
|
166
|
+
throw :abort if (xy = @fixtures.dig('runways', airport_id, direction_name, 'xy')).nil?
|
167
|
+
lat, long = xy.split(/\s+/)
|
168
|
+
AIXM.xy(lat: lat, long: long)
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
```
|
175
|
+
|
176
|
+
The patch block receives the object and the current value. If this value is okay, `throw :abort` to leave the patch block without touching anything. Otherwise, have the patch block return a new value which will be used instead.
|
107
177
|
|
108
178
|
### Source File Line Numbers
|
109
179
|
|
@@ -113,11 +183,11 @@ In order to reference the source of an AIXM/OFMX feature, it's necessary to know
|
|
113
183
|
tr.line
|
114
184
|
```
|
115
185
|
|
116
|
-
|
186
|
+
⚠️ Make sure you have build Nokogumbo `--with-libxml2`. Otherwise, all elements will report line number `0` and therefore render OFMX documents invalid. See the [Nokogumbo README](https://github.com/rubys/nokogumbo/blob/master/README.md#flavors-of-nokogumbo) for more on this.
|
117
187
|
|
118
188
|
### Errors
|
119
189
|
|
120
|
-
You should `fail` on fatal problems. The `-
|
190
|
+
You should `fail` on fatal problems. The `-e` command line argument will open a Pry session when such an error occurs. Issue errors as usual:
|
121
191
|
|
122
192
|
```ruby
|
123
193
|
fail "my message"
|
@@ -125,23 +195,38 @@ fail "my message"
|
|
125
195
|
|
126
196
|
### Warnings
|
127
197
|
|
128
|
-
You should `warn` on non-fatal problems. The `-
|
198
|
+
You should `warn` on non-fatal problems. The `-w ID` command line argument will open a Pry session when then warning with the given ID occurs. To issue a warning:
|
129
199
|
|
130
200
|
```ruby
|
131
|
-
warn("my message",
|
132
|
-
warn("my message",
|
201
|
+
warn("my message", pry: binding) # open Pry attached to the binding
|
202
|
+
warn("my message", pry: error) # open Pry attached to the error
|
133
203
|
```
|
134
204
|
|
135
|
-
###
|
205
|
+
### Messages
|
136
206
|
|
137
|
-
|
207
|
+
#### info
|
208
|
+
|
209
|
+
Use `info` for essential info messages:
|
138
210
|
|
139
211
|
```ruby
|
140
|
-
info("my message") #
|
141
|
-
info("my message",
|
142
|
-
info("my message", color: :green) # show info with this color
|
212
|
+
info("my message") # displays "my message" in black
|
213
|
+
info("my message", color: :green) # displays "my message" in green
|
143
214
|
```
|
144
215
|
|
216
|
+
#### debug
|
217
|
+
|
218
|
+
Use `debug` for in-depth info messages which are only shown if the `--verbose` mode is set:
|
219
|
+
|
220
|
+
```ruby
|
221
|
+
debug("my message") # displays "my message" in blue
|
222
|
+
```
|
223
|
+
|
224
|
+
### Pry
|
225
|
+
|
226
|
+
Pry is loaded with stack explorer support. Type `help` in the Pry console to see all available commands. The most useful command in the context of this gem is `up` which beams you one frame up in the caller stack.
|
227
|
+
|
228
|
+
Note: It's not currently possible to use pry-byebug at this time since it [interferes with pry-rescue](https://github.com/ConradIrwin/pry-rescue/issues/71).
|
229
|
+
|
145
230
|
## AIRAC Date Calculations
|
146
231
|
|
147
232
|
The `AIPP::AIRAC` class is used to calculate AIRAC cycles:
|
data/TODO.md
ADDED
data/aipp.gemspec
CHANGED
@@ -19,21 +19,26 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.required_ruby_version = '>= 2.
|
22
|
+
spec.required_ruby_version = '>= 2.6'
|
23
23
|
|
24
|
-
spec.add_development_dependency 'bundler'
|
25
24
|
spec.add_development_dependency 'rake'
|
26
25
|
spec.add_development_dependency 'minitest'
|
27
26
|
spec.add_development_dependency 'minitest-reporters'
|
28
27
|
spec.add_development_dependency 'minitest-sound'
|
29
28
|
spec.add_development_dependency 'minitest-matchers'
|
29
|
+
spec.add_development_dependency 'spy'
|
30
30
|
spec.add_development_dependency 'guard'
|
31
31
|
spec.add_development_dependency 'guard-minitest'
|
32
32
|
|
33
|
-
spec.add_runtime_dependency 'aixm', '
|
33
|
+
spec.add_runtime_dependency 'aixm', '>= 0.3.4'
|
34
|
+
spec.add_runtime_dependency 'activesupport', '~> 5'
|
34
35
|
spec.add_runtime_dependency 'nokogiri', '~> 1'
|
35
36
|
spec.add_runtime_dependency 'nokogumbo', '~> 2'
|
37
|
+
spec.add_runtime_dependency 'pdf-reader', '~> 2'
|
38
|
+
spec.add_runtime_dependency 'json', '~> 2'
|
39
|
+
spec.add_runtime_dependency 'rubyzip', '~> 1'
|
36
40
|
spec.add_runtime_dependency 'colorize', '~> 0'
|
37
41
|
spec.add_runtime_dependency 'pry', '~> 0'
|
38
42
|
spec.add_runtime_dependency 'pry-rescue', '~> 1'
|
43
|
+
spec.add_runtime_dependency 'pry-stack_explorer', '~> 0'
|
39
44
|
end
|
data/lib/aipp.rb
CHANGED
@@ -12,16 +12,28 @@ require 'ostruct'
|
|
12
12
|
require 'date'
|
13
13
|
require 'nokogiri'
|
14
14
|
require 'nokogumbo'
|
15
|
+
require 'pdf-reader'
|
16
|
+
require 'json'
|
17
|
+
require 'zip'
|
15
18
|
require 'aixm'
|
16
19
|
|
20
|
+
require 'active_support'
|
21
|
+
require 'active_support/core_ext/object/blank'
|
22
|
+
require 'active_support/core_ext/string'
|
23
|
+
require_relative 'core_ext/object'
|
24
|
+
require_relative 'core_ext/string'
|
25
|
+
require_relative 'core_ext/nil_class'
|
26
|
+
require_relative 'core_ext/enumerable'
|
27
|
+
|
17
28
|
require_relative 'aipp/version'
|
18
|
-
require_relative 'aipp/
|
29
|
+
require_relative 'aipp/pdf'
|
19
30
|
require_relative 'aipp/t_hash'
|
20
31
|
require_relative 'aipp/executable'
|
21
|
-
require_relative 'aipp/progress'
|
22
32
|
require_relative 'aipp/airac'
|
33
|
+
require_relative 'aipp/patcher'
|
23
34
|
require_relative 'aipp/aip'
|
24
35
|
require_relative 'aipp/parser'
|
36
|
+
require_relative 'aipp/downloader'
|
25
37
|
|
26
38
|
# Disable "did you mean?" suggestions
|
27
39
|
module DidYouMean::Correctable
|
data/lib/aipp/aip.rb
CHANGED
@@ -2,62 +2,77 @@ module AIPP
|
|
2
2
|
|
3
3
|
# @abstract
|
4
4
|
class AIP
|
5
|
-
using AIPP::Refinements
|
6
|
-
include AIPP::Progress
|
7
5
|
extend Forwardable
|
6
|
+
include AIPP::Patcher
|
8
7
|
|
9
8
|
DEPENDS = []
|
10
9
|
|
11
10
|
# @return [String] AIP name (e.g. "ENR-2.1")
|
12
11
|
attr_reader :aip
|
13
12
|
|
14
|
-
#
|
15
|
-
|
13
|
+
# @!method close
|
14
|
+
# @see AIPP::Downloader#close
|
15
|
+
def_delegator :@downloader, :close
|
16
16
|
|
17
|
-
# @!method aixm
|
18
|
-
# @return (see AIPP::Parser#aixm)
|
19
17
|
# @!method config
|
20
|
-
# @
|
18
|
+
# @see AIPP::Parser#config
|
21
19
|
# @!method options
|
22
|
-
# @
|
20
|
+
# @see AIPP::Parser#options
|
23
21
|
# @!method cache
|
24
|
-
# @
|
22
|
+
# @see AIPP::Parser#cache
|
25
23
|
def_delegators :@parser, :aixm, :config, :options, :cache
|
24
|
+
private :aixm
|
26
25
|
|
27
|
-
def initialize(aip:, parser:)
|
28
|
-
@aip, @parser = aip, parser
|
29
|
-
self.class.include
|
26
|
+
def initialize(aip:, downloader:, parser:)
|
27
|
+
@aip, @downloader, @parser = aip, downloader, parser
|
28
|
+
self.class.include ("AIPP::%s::Helpers::URL" % options[:region]).constantize
|
30
29
|
end
|
31
30
|
|
32
|
-
#
|
31
|
+
# Read an AIP source file
|
33
32
|
#
|
34
33
|
# Depending on whether a local copy of the file exists, either:
|
35
|
-
# * download from URL to local storage and read from local
|
36
|
-
# * read from local
|
34
|
+
# * download from URL to local storage and read from local archive
|
35
|
+
# * read from local archive
|
37
36
|
#
|
38
37
|
# An URL builder method +url_for(aip_file)+ must be defined either in
|
39
38
|
# +helper.rb+ or in the AIP parser definition (e.g. +ENR-2.1.rb+).
|
40
39
|
#
|
41
40
|
# @param aip_file [String] e.g. "ENR-2.1" or "AD-2.LFMV" (default: +aip+)
|
42
|
-
# @return [Nokogiri::HTML5] HTML document
|
43
|
-
|
41
|
+
# @return [Nokogiri::HTML5::Document, String] HTML as Nokogiri document,
|
42
|
+
# PDF or TXT as String
|
43
|
+
def read(aip_file=nil)
|
44
44
|
aip_file ||= aip
|
45
|
-
|
46
|
-
info("Downloading #{aip_file}", force: true)
|
47
|
-
storage_path.mkpath
|
48
|
-
IO.copy_stream(open(url_for(aip_file)), aip_path)
|
49
|
-
end
|
50
|
-
Nokogiri::HTML5(aip_path)
|
45
|
+
@downloader.read(document: aip_file, url: url_for(aip_file))
|
51
46
|
end
|
52
47
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
join(("#{aip_file}.html" if aip_file).to_s)
|
48
|
+
# Write feature to AIXM
|
49
|
+
#
|
50
|
+
# @param feature [AIXM::Feature] e.g. airport or airspace
|
51
|
+
def write(feature)
|
52
|
+
aixm.features << feature
|
59
53
|
end
|
60
54
|
|
55
|
+
# Search features previously written to AIXM and return those matching the
|
56
|
+
# given class and attribute values
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# select(:airport, id: "LFNT")
|
60
|
+
#
|
61
|
+
# @param klass [Class, Symbol] feature class like AIXM::Feature::Airport or
|
62
|
+
# AIXM::Feature::NavigationalAid::VOR, shorthand notations as symbols
|
63
|
+
# e.g. :airport or :vor as listed in AIXM::CLASSES are recognized as well
|
64
|
+
# @param attributes [Hash] filter by these attributes and their values
|
65
|
+
# @return [Array<AIXM::Feature>]
|
66
|
+
def select(klass, attributes={})
|
67
|
+
klass = AIXM::CLASSES.fetch(klass) if klass.is_a? Symbol
|
68
|
+
aixm.features.select do |feature|
|
69
|
+
if feature.is_a? klass
|
70
|
+
attributes.reduce(true) do |memo, (attribute, value)|
|
71
|
+
memo && feature.send(attribute) == value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
61
76
|
end
|
62
77
|
|
63
78
|
end
|