aixm 0.3.8 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +33 -3
  5. data/README.md +166 -56
  6. data/exe/ckmid +14 -0
  7. data/exe/mkmid +14 -0
  8. data/lib/aixm.rb +16 -6
  9. data/lib/aixm/association.rb +369 -0
  10. data/lib/aixm/classes.rb +43 -0
  11. data/lib/aixm/component/fato.rb +45 -53
  12. data/lib/aixm/component/frequency.rb +11 -12
  13. data/lib/aixm/component/geometry.rb +36 -38
  14. data/lib/aixm/component/geometry/arc.rb +2 -2
  15. data/lib/aixm/component/geometry/border.rb +6 -3
  16. data/lib/aixm/component/geometry/circle.rb +8 -2
  17. data/lib/aixm/component/geometry/point.rb +8 -2
  18. data/lib/aixm/component/helipad.rb +30 -38
  19. data/lib/aixm/component/layer.rb +28 -19
  20. data/lib/aixm/component/lighting.rb +12 -13
  21. data/lib/aixm/component/runway.rb +44 -48
  22. data/lib/aixm/{feature → component}/service.rb +37 -36
  23. data/lib/aixm/component/surface.rb +3 -3
  24. data/lib/aixm/component/timetable.rb +2 -2
  25. data/lib/aixm/component/{vertical_limits.rb → vertical_limit.rb} +12 -6
  26. data/lib/aixm/config.rb +2 -1
  27. data/lib/aixm/document.rb +27 -50
  28. data/lib/aixm/executables.rb +85 -0
  29. data/lib/aixm/feature.rb +13 -3
  30. data/lib/aixm/feature/address.rb +12 -13
  31. data/lib/aixm/feature/airport.rb +103 -128
  32. data/lib/aixm/feature/airspace.rb +44 -17
  33. data/lib/aixm/feature/navigational_aid.rb +7 -9
  34. data/lib/aixm/feature/navigational_aid/designated_point.rb +13 -15
  35. data/lib/aixm/feature/navigational_aid/dme.rb +11 -12
  36. data/lib/aixm/feature/navigational_aid/marker.rb +7 -3
  37. data/lib/aixm/feature/navigational_aid/ndb.rb +7 -3
  38. data/lib/aixm/feature/navigational_aid/tacan.rb +7 -3
  39. data/lib/aixm/feature/navigational_aid/vor.rb +23 -15
  40. data/lib/aixm/feature/obstacle.rb +29 -43
  41. data/lib/aixm/feature/obstacle_group.rb +37 -34
  42. data/lib/aixm/feature/organisation.rb +21 -5
  43. data/lib/aixm/feature/unit.rb +36 -46
  44. data/lib/aixm/memoize.rb +89 -0
  45. data/lib/aixm/object.rb +9 -0
  46. data/lib/aixm/payload_hash.rb +114 -0
  47. data/lib/aixm/refinements.rb +29 -76
  48. data/lib/aixm/shortcuts.rb +5 -42
  49. data/lib/aixm/version.rb +1 -1
  50. data/lib/aixm/xy.rb +1 -1
  51. data/schemas/ofmx/0/OFMX-Features.xsd +152 -20
  52. data/schemas/ofmx/0/OFMX-Snapshot.xsd +0 -5
  53. metadata +107 -156
  54. metadata.gz.sig +2 -0
  55. data/.github/workflows/test.yml +0 -26
  56. data/.gitignore +0 -6
  57. data/.ruby-version +0 -1
  58. data/.yardopts +0 -3
  59. data/Guardfile +0 -8
  60. data/aixm.gemspec +0 -35
  61. data/gems.rb +0 -3
  62. data/lib/aixm/component.rb +0 -6
  63. data/rakefile.rb +0 -36
  64. data/spec/factory.rb +0 -559
  65. data/spec/lib/aixm/a_spec.rb +0 -203
  66. data/spec/lib/aixm/component/fato_spec.rb +0 -267
  67. data/spec/lib/aixm/component/frequency_spec.rb +0 -74
  68. data/spec/lib/aixm/component/geometry/arc_spec.rb +0 -73
  69. data/spec/lib/aixm/component/geometry/border_spec.rb +0 -38
  70. data/spec/lib/aixm/component/geometry/circle_spec.rb +0 -68
  71. data/spec/lib/aixm/component/geometry/point_spec.rb +0 -37
  72. data/spec/lib/aixm/component/geometry_spec.rb +0 -316
  73. data/spec/lib/aixm/component/helipad_spec.rb +0 -193
  74. data/spec/lib/aixm/component/layer_spec.rb +0 -135
  75. data/spec/lib/aixm/component/lighting_spec.rb +0 -94
  76. data/spec/lib/aixm/component/runway_spec.rb +0 -479
  77. data/spec/lib/aixm/component/surface_spec.rb +0 -124
  78. data/spec/lib/aixm/component/timetable_spec.rb +0 -47
  79. data/spec/lib/aixm/component/vertical_limits_spec.rb +0 -94
  80. data/spec/lib/aixm/config_spec.rb +0 -41
  81. data/spec/lib/aixm/d_spec.rb +0 -150
  82. data/spec/lib/aixm/document_spec.rb +0 -1884
  83. data/spec/lib/aixm/errors_spec.rb +0 -14
  84. data/spec/lib/aixm/f_spec.rb +0 -85
  85. data/spec/lib/aixm/feature/address_spec.rb +0 -60
  86. data/spec/lib/aixm/feature/airport_spec.rb +0 -776
  87. data/spec/lib/aixm/feature/airspace_spec.rb +0 -394
  88. data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +0 -103
  89. data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +0 -98
  90. data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +0 -85
  91. data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +0 -95
  92. data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +0 -94
  93. data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +0 -251
  94. data/spec/lib/aixm/feature/navigational_aid_spec.rb +0 -52
  95. data/spec/lib/aixm/feature/obstacle_group_spec.rb +0 -330
  96. data/spec/lib/aixm/feature/obstacle_spec.rb +0 -284
  97. data/spec/lib/aixm/feature/organisation_spec.rb +0 -83
  98. data/spec/lib/aixm/feature/service_spec.rb +0 -59
  99. data/spec/lib/aixm/feature/unit_spec.rb +0 -238
  100. data/spec/lib/aixm/feature_spec.rb +0 -38
  101. data/spec/lib/aixm/p_spec.rb +0 -189
  102. data/spec/lib/aixm/refinements_spec.rb +0 -430
  103. data/spec/lib/aixm/version_spec.rb +0 -7
  104. data/spec/lib/aixm/w_spec.rb +0 -150
  105. data/spec/lib/aixm/xy_spec.rb +0 -180
  106. data/spec/lib/aixm/z_spec.rb +0 -94
  107. data/spec/macros/marking.rb +0 -12
  108. data/spec/macros/organisation.rb +0 -11
  109. data/spec/macros/remarks.rb +0 -12
  110. data/spec/macros/timetable.rb +0 -11
  111. data/spec/macros/xy.rb +0 -11
  112. data/spec/macros/z_qnh.rb +0 -11
  113. data/spec/sounds/failure.mp3 +0 -0
  114. data/spec/sounds/success.mp3 +0 -0
  115. data/spec/spec_helper.rb +0 -62
@@ -1,7 +1,7 @@
1
1
  using AIXM::Refinements
2
2
 
3
3
  module AIXM
4
- class Component
4
+ module Component
5
5
 
6
6
  # Lighting of a runway, helipad etc
7
7
  #
@@ -14,10 +14,13 @@ module AIXM
14
14
  # lighting.color = COLORS or nil
15
15
  # lighting.remarks = String or nil
16
16
  #
17
- # @see https://github.com/openflightmaps/ofmx/wiki/Airport#rls-runway-direction-lighting
18
- # @see https://github.com/openflightmaps/ofmx/wiki/Airport#fls-fato-direction-lighting
19
- # @see https://github.com/openflightmaps/ofmx/wiki/Airport#tls-helipad-tlof-lighting
17
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#rls-runway-direction-lighting
18
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#fls-fato-direction-lighting
19
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#tls-helipad-tlof-lighting
20
20
  class Lighting
21
+ include AIXM::Association
22
+ include AIXM::Memoize
23
+
21
24
  POSITIONS = {
22
25
  TDZ: :touch_down_zone,
23
26
  AIM: :aiming_point,
@@ -54,8 +57,9 @@ module AIXM
54
57
  OTHER: :other # specify in remarks
55
58
  }
56
59
 
57
- # @return [AIXM::Component::Runway::Direction, AIXM::Component::FATO::Direction, AIXM::Component::Helipad] lighted entity
58
- attr_reader :lightable
60
+ # @!method lightable
61
+ # @return [AIXM::Component::Runway::Direction, AIXM::Component::FATO::Direction, AIXM::Component::Helipad] lighted entity
62
+ belongs_to :lightable
59
63
 
60
64
  # @return [Symbol, nil] position of the lighting system (see {POSITIONS})
61
65
  attr_reader :position
@@ -81,12 +85,6 @@ module AIXM
81
85
  %Q(#<#{self.class} position=#{position.inspect}>)
82
86
  end
83
87
 
84
- def lightable=(value)
85
- fail(ArgumentError, "invalid lightable") unless value.respond_to? :lightings
86
- @lightable = value
87
- end
88
- private :lightable=
89
-
90
88
  def position=(value)
91
89
  @position = POSITIONS.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid position")
92
90
  end
@@ -113,8 +111,9 @@ module AIXM
113
111
  builder.tag!(as) do |tag|
114
112
  tag << lightable.to_uid.indent(2)
115
113
  tag.codePsn(POSITIONS.key(position).to_s)
116
- end.insert_payload_hash(region: AIXM.config.mid_region)
114
+ end
117
115
  end
116
+ memoize :to_uid
118
117
 
119
118
  # @return [String] AIXM or OFMX markup
120
119
  def to_xml(as:)
@@ -1,7 +1,7 @@
1
1
  using AIXM::Refinements
2
2
 
3
3
  module AIXM
4
- class Component
4
+ module Component
5
5
 
6
6
  # Runways are landing and takeoff strips for forward propelled aircraft.
7
7
  #
@@ -44,8 +44,11 @@ module AIXM
44
44
  # runway.forth.geographic_orientation = 165
45
45
  # runway.back = nil
46
46
  #
47
- # @see https://github.com/openflightmaps/ofmx/wiki/Airport#rwy-runway
47
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#rwy-runway
48
48
  class Runway
49
+ include AIXM::Association
50
+ include AIXM::Memoize
51
+
49
52
  STATUSES = {
50
53
  CLSD: :closed,
51
54
  WIP: :work_in_progress, # e.g. construction work
@@ -55,8 +58,21 @@ module AIXM
55
58
  OTHER: :other # specify in remarks
56
59
  }
57
60
 
58
- # @return [AIXM::Feature::Airport] airport the runway belongs to
59
- attr_reader :airport
61
+ # @!method forth
62
+ # @return [AIXM::Component::Runway::Direction] main direction
63
+ # @!method forth=(forth)
64
+ # @param forth [AIXM::Component::Runway::Direction]
65
+ has_one :forth, accept: 'AIXM::Component::Runway::Direction'
66
+
67
+ # @!method back
68
+ # @return [AIXM::Component::Runway::Direction, nil] reverse direction
69
+ # @!method back=(back)
70
+ # @param back [AIXM::Component::Runway::Direction, nil]
71
+ has_one :back, accept: 'AIXM::Component::Runway::Direction', allow_nil: true
72
+
73
+ # @!method airport
74
+ # @return [AIXM::Feature::Airport] airport the runway belongs to
75
+ belongs_to :airport
60
76
 
61
77
  # @return [String] full name of runway (e.g. "12/30" or "16L/34R")
62
78
  attr_reader :name
@@ -76,18 +92,12 @@ module AIXM
76
92
  # @return [String, nil] free text remarks
77
93
  attr_reader :remarks
78
94
 
79
- # @return [AIXM::Component::Runway::Direction] main direction
80
- attr_accessor :forth
81
-
82
- # @return [AIXM::Component::Runway::Direction] reverse direction
83
- attr_accessor :back
84
-
85
95
  def initialize(name:)
86
96
  self.name = name
87
- @name.split("/").tap do |forth, back|
88
- @forth = Direction.new(runway: self, name: AIXM.a(forth))
89
- @back = Direction.new(runway: self, name: AIXM.a(back)) if back
90
- fail(ArgumentError, "invalid name") unless !@back || @back.name.inverse_of?(@forth.name)
97
+ @name.split("/").tap do |forth_name, back_name|
98
+ self.forth = Direction.new(name: AIXM.a(forth_name))
99
+ self.back = Direction.new(name: AIXM.a(back_name)) if back_name
100
+ fail(ArgumentError, "invalid name") unless !back || back.name.inverse_of?(@forth.name)
91
101
  end
92
102
  @surface = AIXM.surface
93
103
  end
@@ -97,12 +107,6 @@ module AIXM
97
107
  %Q(#<#{self.class} airport=#{airport&.id.inspect} name=#{name.inspect}>)
98
108
  end
99
109
 
100
- def airport=(value)
101
- fail(ArgumentError, "invalid airport") unless value.is_a? AIXM::Feature::Airport
102
- @airport = value
103
- end
104
- private :airport=
105
-
106
110
  def name=(value)
107
111
  fail(ArgumentError, "invalid name") unless value.is_a? String
108
112
  @name = value.uptrans
@@ -138,8 +142,9 @@ module AIXM
138
142
  builder.RwyUid do |rwy_uid|
139
143
  rwy_uid << airport.to_uid.indent(2)
140
144
  rwy_uid.txtDesig(name)
141
- end.insert_payload_hash(region: AIXM.config.mid_region)
145
+ end
142
146
  end
147
+ memoize :to_uid
143
148
 
144
149
  # @return [String] AIXM or OFMX markup
145
150
  def to_xml
@@ -167,16 +172,27 @@ module AIXM
167
172
  # Runway directions further describe each direction {#forth} and {#back}
168
173
  # of a runway.
169
174
  #
170
- # @see https://github.com/openflightmaps/ofmx/wiki/Airport#rdn-runway-direction
175
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#rdn-runway-direction
171
176
  class Direction
177
+ include AIXM::Association
178
+ include AIXM::Memoize
179
+
172
180
  VFR_PATTERNS = {
173
181
  L: :left,
174
182
  R: :right,
175
183
  E: :left_or_right
176
184
  }
177
185
 
178
- # @return [AIXM::Component::Runway] runway the runway direction is further describing
179
- attr_reader :runway
186
+ # @!method lightings
187
+ # @return [Array<AIXM::Component::Lighting>] installed lighting systems
188
+ # @!method add_lighting(lighting)
189
+ # @param lighting [AIXM::Component::Lighting]
190
+ # @return [self]
191
+ has_many :lightings, as: :lightable
192
+
193
+ # @!method runway
194
+ # @return [AIXM::Component::Runway] runway the runway direction is further describing
195
+ belongs_to :runway, readonly: true
180
196
 
181
197
  # @return [AIXM::A] partial name of runway (e.g. "12" or "16L")
182
198
  attr_reader :name
@@ -201,12 +217,8 @@ module AIXM
201
217
  # @return [String, nil] free text remarks
202
218
  attr_reader :remarks
203
219
 
204
- # @return [Array<AIXM::Component::Lighting>] installed lighting systems
205
- attr_reader :lightings
206
-
207
- def initialize(runway:, name:)
208
- self.runway, self.name = runway, name
209
- @lightings = []
220
+ def initialize(name:)
221
+ self.name = name
210
222
  end
211
223
 
212
224
  # @return [String]
@@ -214,12 +226,6 @@ module AIXM
214
226
  %Q(#<#{self.class} airport=#{runway&.airport&.id.inspect} name=#{name.inspect}>)
215
227
  end
216
228
 
217
- def runway=(value)
218
- fail(ArgumentError, "invalid runway") unless value.is_a? AIXM::Component::Runway
219
- @runway = value
220
- end
221
- private :runway
222
-
223
229
  def name=(value)
224
230
  fail(ArgumentError, "invalid name") unless value.is_a? AIXM::A
225
231
  @name = value
@@ -263,17 +269,6 @@ module AIXM
263
269
  @remarks = value&.to_s
264
270
  end
265
271
 
266
- # Add a lighting system to the runway direction.
267
- #
268
- # @param lighting [AIXM::Component::Lighting] lighting instance
269
- # @return [self]
270
- def add_lighting(lighting)
271
- fail(ArgumentError, "invalid lighting") unless lighting.is_a? AIXM::Component::Lighting
272
- lighting.send(:lightable=, self)
273
- @lightings << lighting
274
- self
275
- end
276
-
277
272
  # @return [AIXM::A] magnetic orientation (magnetic bearing) in degrees
278
273
  def magnetic_orientation
279
274
  if geographic_orientation && runway.airport.declination
@@ -287,8 +282,9 @@ module AIXM
287
282
  builder.RdnUid do |rdn_uid|
288
283
  rdn_uid << runway.to_uid.indent(2)
289
284
  rdn_uid.txtDesig(name)
290
- end.insert_payload_hash(region: AIXM.config.mid_region)
285
+ end
291
286
  end
287
+ memoize :to_uid
292
288
 
293
289
  # @return [String] AIXM or OFMX markup
294
290
  def to_xml
@@ -1,22 +1,22 @@
1
1
  using AIXM::Refinements
2
2
 
3
3
  module AIXM
4
- class Feature
4
+ module Component
5
5
 
6
6
  # Service provided by a unit.
7
7
  #
8
8
  # ===Cheat Sheet in Pseudo Code:
9
9
  # service = AIXM.service(
10
- # source: String or nil
11
10
  # type: TYPES
12
11
  # )
13
12
  # service.timetable = AIXM.timetable or nil
14
13
  # service.remarks = String or nil
15
14
  # service.add_frequency(AIXM.frequency)
16
15
  #
17
- # @see https://github.com/openflightmaps/ofmx/wiki/Organisation#ser-service
18
- class Service < Feature
19
- public_class_method :new
16
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Organisation#ser-service
17
+ class Service
18
+ include AIXM::Association
19
+ include AIXM::Memoize
20
20
 
21
21
  TYPES = {
22
22
  ACS: :area_control_service,
@@ -125,10 +125,21 @@ module AIXM
125
125
  :vhf_direction_finding_service => :vdf_direction_finding_station,
126
126
  :volmet_service => :meteorological_office,
127
127
  :other => :other
128
- }
128
+ }.freeze
129
+
130
+ # @!method frequencies
131
+ # @return [Array<AIXM::Component::Frequency>] frequencies used by this service
132
+ # @!method add_frequency(frequency)
133
+ # @param frequency [AIXM::Component::Frequency]
134
+ has_many :frequencies
129
135
 
130
- # @return [AIXM::Feature::Unit] unit providing this service
131
- attr_reader :unit
136
+ # @!method unit
137
+ # @return [AIXM::Feature::Unit] unit providing this service
138
+ belongs_to :unit
139
+
140
+ # @!method layer
141
+ # @return [AIXM::Component::Layer] airspace layer this service is provided within
142
+ belongs_to :layer
132
143
 
133
144
  # @return [Symbol] type of service (see {TYPES})
134
145
  attr_reader :type
@@ -139,13 +150,9 @@ module AIXM
139
150
  # @return [String, nil] free text remarks
140
151
  attr_reader :remarks
141
152
 
142
- # @return [Array<AIXM::Component::Frequency>] frequencies used by this service
143
- attr_reader :frequencies
144
-
145
- def initialize(source: nil, type:)
146
- super(source: source)
153
+ def initialize(type:)
147
154
  self.type = type
148
- @frequencies = []
155
+ @sequence = 1
149
156
  end
150
157
 
151
158
  # @return [String]
@@ -153,12 +160,6 @@ module AIXM
153
160
  %Q(#<#{self.class} type=#{type.inspect}>)
154
161
  end
155
162
 
156
- def unit=(value)
157
- fail(ArgumentError, "invalid unit") unless value.is_a? AIXM::Feature::Unit
158
- @unit = value
159
- end
160
- private :unit=
161
-
162
163
  def type=(value)
163
164
  @type = TYPES.lookup(value&.to_s&.to_sym, nil) || fail(ArgumentError, "invalid type")
164
165
  end
@@ -172,17 +173,6 @@ module AIXM
172
173
  @remarks = value&.to_s
173
174
  end
174
175
 
175
- # Add a frequency used by this service
176
- #
177
- # @param frequency [AIXM::Component::Frequency] frequency instance
178
- # @return [self]
179
- def add_frequency(frequency)
180
- fail(ArgumentError, "invalid frequency") unless frequency.is_a? AIXM::Component::Frequency
181
- frequency.send(:service=, self)
182
- @frequencies << frequency
183
- self
184
- end
185
-
186
176
  # Guess the unit type for this service
187
177
  #
188
178
  # @return [Symbol, nil] guessed unit type or +nil+ if unmappable
@@ -192,20 +182,21 @@ module AIXM
192
182
 
193
183
  # @return [String] UID markup
194
184
  def to_uid
185
+ resequence!
195
186
  builder = Builder::XmlMarkup.new(indent: 2)
196
187
  builder.SerUid do |ser_uid|
197
188
  ser_uid << unit.to_uid.indent(2)
198
189
  ser_uid.codeType(TYPES.key(type).to_s)
199
190
  ser_uid.noSeq(@sequence)
200
- end.insert_payload_hash(region: AIXM.config.mid_region)
191
+ end
201
192
  end
193
+ memoize :to_uid
202
194
 
203
195
  # @return [String] AIXM or OFMX markup
204
- def to_xml(sequence:)
205
- @sequence = sequence
196
+ def to_xml
206
197
  builder = Builder::XmlMarkup.new(indent: 2)
207
- builder.comment! ["Service: #{TYPES.key(type)}", unit&.name].compact.join(' by ')
208
- builder.Ser({ source: (source if AIXM.ofmx?) }.compact) do |ser|
198
+ builder.comment! ["Service: #{TYPES.key(type)}", unit&.send(:name_with_type)].compact.join(' by ')
199
+ builder.Ser do |ser|
209
200
  ser << to_uid.indent(2)
210
201
  ser << timetable.to_xml(as: :Stt).indent(2) if timetable
211
202
  ser.txtRmk(remarks) if remarks
@@ -215,6 +206,16 @@ module AIXM
215
206
  end
216
207
  builder.target!
217
208
  end
209
+
210
+ private
211
+
212
+ def resequence!
213
+ unit.services.sort { |a, b| a.type <=> b.type }.each.with_object({}) do |service, sequences|
214
+ sequences[service.type] = (sequences[service.type] || 0) + 1
215
+ service.instance_variable_set(:@sequence, sequences[service.type])
216
+ end
217
+ end
218
+
218
219
  end
219
220
 
220
221
  end
@@ -1,7 +1,7 @@
1
1
  using AIXM::Refinements
2
2
 
3
3
  module AIXM
4
- class Component
4
+ module Component
5
5
 
6
6
  # Surface of a runway, helipad etc
7
7
  #
@@ -21,7 +21,7 @@ module AIXM
21
21
  # * +AIXM::PCN_RE+ - regular expression to match PCN notations
22
22
  #
23
23
  #
24
- # @see https://github.com/openflightmaps/ofmx/wiki/Airport#rwy-runway
24
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#rwy-runway
25
25
  class Surface
26
26
  COMPOSITIONS = {
27
27
  ASPH: :asphalt,
@@ -109,7 +109,7 @@ module AIXM
109
109
  def pcn=(value)
110
110
  return @pcn = {} if value.nil?
111
111
  fail(ArgumentError, "invalid PCN") unless match = value.to_s.upcase.match(PCN_RE)
112
- @pcn = match.named_captures.reject{ |k| k == 'pcn' }
112
+ @pcn = match.named_captures.reject{ _1 == 'pcn' }
113
113
  end
114
114
 
115
115
  def siwl_weight=(value)
@@ -1,7 +1,7 @@
1
1
  using AIXM::Refinements
2
2
 
3
3
  module AIXM
4
- class Component
4
+ module Component
5
5
 
6
6
  # Timetables define activity time windows.
7
7
  #
@@ -17,7 +17,7 @@ module AIXM
17
17
  # * +AIXM::H24+ - continuous, all day and all night
18
18
  # * +AIXM::H_RE+ - pattern matching working hour codes
19
19
  #
20
- # @see https://github.com/openflightmaps/ofmx/wiki/Timetable#predefined-timetable
20
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Timetable#predefined-timetable
21
21
  class Timetable
22
22
  CODES = {
23
23
  H24: :continuous, # all day and all night
@@ -1,9 +1,9 @@
1
1
  using AIXM::Refinements
2
2
 
3
3
  module AIXM
4
- class Component
4
+ module Component
5
5
 
6
- # Vertical limits define a 3D airspace vertically. They are often noted in
6
+ # Vertical limit defines a 3D airspace vertically. It is often noted in
7
7
  # AIP as follows:
8
8
  #
9
9
  # upper_z
@@ -13,7 +13,7 @@ module AIXM
13
13
  # (min_z) whichever is lower
14
14
  #
15
15
  # ===Cheat Sheet in Pseudo Code:
16
- # vertical_limits = AIXM.vertical_limits(
16
+ # vertical_limit = AIXM.vertical_limit(
17
17
  # upper_z: AIXM.z
18
18
  # max_z: AIXM.z or nil
19
19
  # lower_z: AIXM.z
@@ -24,14 +24,20 @@ module AIXM
24
24
  # * +AIXM::GROUND+ - surface expressed as "0 ft QFE"
25
25
  # * +AIXM::UNLIMITED+ - no upper limit expressed as "FL 999"
26
26
  #
27
- # @see https://github.com/openflightmaps/ofmx/wiki/Airspace#ase-airspace
28
- class VerticalLimits
27
+ # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airspace#ase-airspace
28
+ class VerticalLimit
29
+ include AIXM::Association
30
+
29
31
  # @api private
30
32
  TAGS = { upper_z: :Upper, lower_z: :Lower, max_z: :Max, min_z: :Mnm }.freeze
31
33
 
32
34
  # @api private
33
35
  CODES = { qfe: :HEI, qnh: :ALT, qne: :STD }.freeze
34
36
 
37
+ # @!method layer
38
+ # @return [AIXM::Component::Layer] layer to which this vertical limit applies
39
+ belongs_to :layer
40
+
35
41
  # @return [AIXM::Z] upper limit
36
42
  attr_reader :upper_z
37
43
 
@@ -50,7 +56,7 @@ module AIXM
50
56
 
51
57
  # @return [String]
52
58
  def inspect
53
- payload = %i(upper_z max_z lower_z min_z).map { |l| %Q(#{l}="#{send(l)}") if send(l) }.compact
59
+ payload = %i(upper_z max_z lower_z min_z).map { %Q(#{_1}="#{send(_1)}") if send(_1) }.compact
54
60
  %Q(#<#{self.class} #{payload.join(' ')}>)
55
61
  end
56
62