aipp 2.2.0 → 2.2.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +5 -0
- data/lib/aipp/regions/LF/aip/serviced_airspaces.rb +48 -25
- data/lib/aipp/regions/LF/aip/services.rb +14 -3
- data/lib/aipp/runner.rb +5 -1
- data/lib/aipp/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +5 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fb12aa39a6f3fdec1fd5aad06f710f6e87a0898c7b438306e08dc5a7b663a96e
|
|
4
|
+
data.tar.gz: af5e924c030036416ed373ae2196975ef1ddcf564ded3eca39f60d2c5d99cd23
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ab37e2bfcdb4a6419450c8a75c2bd1d3a6dbcdf2b4f2e9f86d5859a4d41e5bc6fc30bcaf629c82e61e98613641477d922743d3d3776b205ab2b255eaae081c1a
|
|
7
|
+
data.tar.gz: 6fdf209fed20da43f36b9f62cbae84be1c939bd839c87db1ff432ac751085d06f281a4607fd6531abd84c8ba46beebe0271d9527461d761c16508e92ddc9fbea
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,8 @@ module AIPP::LF::AIP
|
|
|
3
3
|
|
|
4
4
|
include AIPP::LF::Helpers::Base
|
|
5
5
|
|
|
6
|
+
depends_on :Aerodromes
|
|
7
|
+
|
|
6
8
|
# Map source types to type and optional local type and skip regexp
|
|
7
9
|
SOURCE_TYPES = {
|
|
8
10
|
'FIR' => { type: 'FIR' },
|
|
@@ -13,9 +15,7 @@ module AIPP::LF::AIP
|
|
|
13
15
|
'TMA' => { type: 'TMA', skip: /geneve/i }, # Geneva listed FYI only
|
|
14
16
|
'SIV' => { type: 'SECTOR', local_type: 'FIZ/SIV' }, # providing FIS
|
|
15
17
|
'CTR' => { type: 'CTR' },
|
|
16
|
-
'RMZ' => { type: '
|
|
17
|
-
'TMZ' => { type: 'RAS', local_type: 'TMZ' },
|
|
18
|
-
'RMZ-TMZ' => { type: 'RAS', local_type: 'RMZ-TMZ' }
|
|
18
|
+
'RMZ-TMZ' => { type: ['RMZ', 'TMZ'] } # two separate airspaces
|
|
19
19
|
}.freeze
|
|
20
20
|
|
|
21
21
|
# Map airspace "<type> <name>" to location indicator
|
|
@@ -36,34 +36,57 @@ module AIPP::LF::AIP
|
|
|
36
36
|
next if espace_node.(:Nom).match? DELEGATED_RE
|
|
37
37
|
next if (re = target[:skip]) && espace_node.(:Nom).match?(re)
|
|
38
38
|
# Build airspaces and layers
|
|
39
|
-
AIPP.cache.partie.css(%Q(Partie:has(Espace[pk="#{espace_node['pk']}"])))
|
|
39
|
+
partie_nodes = AIPP.cache.partie.css(%Q(Partie:has(Espace[pk="#{espace_node['pk']}"])))
|
|
40
|
+
partie_nodes.each_with_index do |partie_node, index|
|
|
40
41
|
next if partie_node.(:NomPartie).match? DELEGATED_RE
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
].compact.join(' '),
|
|
48
|
-
type: target[:type],
|
|
49
|
-
local_type: target[:local_type]
|
|
50
|
-
).tap do |airspace|
|
|
51
|
-
airspace.meta = espace_node.attr('pk')
|
|
52
|
-
airspace.geometry = geometry_from(partie_node.(:Contour))
|
|
53
|
-
fail("geometry is not closed") unless airspace.geometry.closed?
|
|
54
|
-
AIPP.cache.volume.css(%Q(Volume:has(Partie[pk="#{partie_node['pk']}"]))).each do |volume_node|
|
|
55
|
-
airspace.add_layer(
|
|
56
|
-
layer_from(volume_node).tap do |layer|
|
|
57
|
-
layer.location_indicator = FIR_LOCATION_INDICATORS.fetch(airspace.name) if airspace.type == :flight_information_region
|
|
58
|
-
end
|
|
59
|
-
)
|
|
60
|
-
end
|
|
42
|
+
partie_nom = partie_node.(:NomPartie).remove(/^\.$/).blank_to_nil
|
|
43
|
+
partie_index = if partie_nodes.count > 1
|
|
44
|
+
if partie_nom.match?(/^\d+$/)
|
|
45
|
+
partie_nom.to_i # use declared index if numerical...
|
|
46
|
+
else
|
|
47
|
+
index # ...or positional index otherwise
|
|
61
48
|
end
|
|
62
|
-
|
|
49
|
+
end
|
|
50
|
+
[target[:type]].flatten.each do |type|
|
|
51
|
+
add(
|
|
52
|
+
AIXM.airspace(
|
|
53
|
+
source: source(part: 'ENR', position: espace_node.line),
|
|
54
|
+
id: id_from(espace_node, partie_index),
|
|
55
|
+
name: name_from(espace_node, partie_nom),
|
|
56
|
+
type: type,
|
|
57
|
+
local_type: target[:local_type]
|
|
58
|
+
).tap do |airspace|
|
|
59
|
+
airspace.meta = espace_node.attr('pk')
|
|
60
|
+
airspace.geometry = geometry_from(partie_node.(:Contour))
|
|
61
|
+
fail("geometry is not closed") unless airspace.geometry.closed?
|
|
62
|
+
AIPP.cache.volume.css(%Q(Volume:has(Partie[pk="#{partie_node['pk']}"]))).each do |volume_node|
|
|
63
|
+
airspace.add_layer(
|
|
64
|
+
layer_from(volume_node).tap do |layer|
|
|
65
|
+
layer.location_indicator = FIR_LOCATION_INDICATORS.fetch(airspace.name) if airspace.type == :flight_information_region
|
|
66
|
+
end
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
)
|
|
71
|
+
end
|
|
63
72
|
end
|
|
64
73
|
end
|
|
65
74
|
end
|
|
66
75
|
end
|
|
67
76
|
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def id_from(espace_node, partie_index)
|
|
80
|
+
if espace_node.(:TypeEspace) == 'CTR' &&
|
|
81
|
+
(ad_pk = espace_node.at_css(:AdAssocie)&.attr('pk')) &&
|
|
82
|
+
(airport = find_by(:airport, meta: ad_pk).first)
|
|
83
|
+
then
|
|
84
|
+
[airport.id, partie_index].join
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def name_from(espace_node, partie_nom)
|
|
89
|
+
[espace_node.(:Nom), partie_nom].compact.join(' ')
|
|
90
|
+
end
|
|
68
91
|
end
|
|
69
92
|
end
|
|
@@ -40,10 +40,16 @@ module AIPP::LF::AIP
|
|
|
40
40
|
AIPP.cache.service.css(%Q(Service[lk^="[LF]"][pk])).each do |service_node|
|
|
41
41
|
# Ignore private services/frequencies
|
|
42
42
|
next if service_node.(:IndicLieu) == 'XX'
|
|
43
|
-
# Load referenced airport
|
|
43
|
+
# Load directly referenced airport
|
|
44
44
|
airport = given(service_node.at_css('Ad')&.attr('pk')) do
|
|
45
45
|
find_by(:airport, meta: _1).first
|
|
46
46
|
end
|
|
47
|
+
# Load indirectly referenced airport
|
|
48
|
+
airport ||= given(service_node.at_css('Espace')&.attr('pk')) do
|
|
49
|
+
if airspace = find_by(:airspace, meta: _1)&.first
|
|
50
|
+
find_by(:airport, id: airspace.id[0, 4])&.first
|
|
51
|
+
end
|
|
52
|
+
end
|
|
47
53
|
# Build addresses and services
|
|
48
54
|
case SOURCE_TYPES.fetch(type_for(service_node))
|
|
49
55
|
when :address
|
|
@@ -53,7 +59,9 @@ module AIPP::LF::AIP
|
|
|
53
59
|
given service_from(service_node) do |service|
|
|
54
60
|
AIPP.cache.frequence.css(%Q(Frequence:has(Service[pk="#{service_node['pk']}"]))).each do |frequence_node|
|
|
55
61
|
if frequency = frequency_from(frequence_node, service_node)
|
|
56
|
-
|
|
62
|
+
unless frequency.type == :emergency
|
|
63
|
+
service.add_frequency frequency
|
|
64
|
+
end
|
|
57
65
|
end
|
|
58
66
|
end
|
|
59
67
|
if airport
|
|
@@ -70,7 +78,10 @@ module AIPP::LF::AIP
|
|
|
70
78
|
end
|
|
71
79
|
# Assign A/A address to all yet radioless airports
|
|
72
80
|
find_by(:airport).each do |airport|
|
|
73
|
-
unless airport.
|
|
81
|
+
unless airport.addresses.any? ||
|
|
82
|
+
airport.services.find_by(:service, type: :aerodrome_control_tower_service).any? ||
|
|
83
|
+
airport.services.find_by(:service, type: :flight_information_service).any?
|
|
84
|
+
then
|
|
74
85
|
airport.add_address(
|
|
75
86
|
address_from_vac_for(airport) || fallback_address_for(airport)
|
|
76
87
|
)
|
data/lib/aipp/runner.rb
CHANGED
|
@@ -115,7 +115,11 @@ module AIPP
|
|
|
115
115
|
info("detecting duplicates")
|
|
116
116
|
if (duplicates = aixm.features.duplicates).any?
|
|
117
117
|
message = "duplicates found"
|
|
118
|
-
details = duplicates.map
|
|
118
|
+
details = duplicates.map do |group|
|
|
119
|
+
group.map.with_index do |member, index|
|
|
120
|
+
"#{member.inspect} from #{member.source} #{'has duplicate(s)...' if index.zero?}"
|
|
121
|
+
end
|
|
122
|
+
end.join("\n")
|
|
119
123
|
AIPP.options.force ? warn(message) : fail([message, details].join(":\n"))
|
|
120
124
|
end
|
|
121
125
|
info("validating #{AIPP.options.schema.upcase}")
|
data/lib/aipp/version.rb
CHANGED
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aipp
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.2.
|
|
4
|
+
version: 2.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sven Schwyn
|
|
@@ -27,7 +27,7 @@ cert_chain:
|
|
|
27
27
|
k/QvZU05f6HMYBrPogJgIzHC/C5N/yeE4BVEuBDn+10Zb1iu3aDk8sd0uMgukCY8
|
|
28
28
|
TUmlP5A6NeGdeDJIoLgromAKs+nvI7TWzhQq9ODs51XhxgUFRCvBqUTpjTQigw==
|
|
29
29
|
-----END CERTIFICATE-----
|
|
30
|
-
date: 2024-
|
|
30
|
+
date: 2024-05-29 00:00:00.000000000 Z
|
|
31
31
|
dependencies:
|
|
32
32
|
- !ruby/object:Gem::Dependency
|
|
33
33
|
name: airac
|
|
@@ -58,7 +58,7 @@ dependencies:
|
|
|
58
58
|
version: '1'
|
|
59
59
|
- - ">="
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 1.5.
|
|
61
|
+
version: 1.5.2
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -68,7 +68,7 @@ dependencies:
|
|
|
68
68
|
version: '1'
|
|
69
69
|
- - ">="
|
|
70
70
|
- !ruby/object:Gem::Version
|
|
71
|
-
version: 1.5.
|
|
71
|
+
version: 1.5.2
|
|
72
72
|
- !ruby/object:Gem::Dependency
|
|
73
73
|
name: notam
|
|
74
74
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -474,7 +474,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
474
474
|
- !ruby/object:Gem::Version
|
|
475
475
|
version: '0'
|
|
476
476
|
requirements: []
|
|
477
|
-
rubygems_version: 3.5.
|
|
477
|
+
rubygems_version: 3.5.11
|
|
478
478
|
signing_key:
|
|
479
479
|
specification_version: 4
|
|
480
480
|
summary: Parser for aeronautical information publications
|
metadata.gz.sig
CHANGED
|
Binary file
|