aixm 1.1.0 → 1.2.0

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +14 -0
  4. data/README.md +3 -1
  5. data/lib/aixm/a.rb +29 -15
  6. data/lib/aixm/association.rb +2 -1
  7. data/lib/aixm/classes.rb +4 -0
  8. data/lib/aixm/component/address.rb +15 -9
  9. data/lib/aixm/component/approach_lighting.rb +28 -25
  10. data/lib/aixm/component/fato.rb +38 -26
  11. data/lib/aixm/component/frequency.rb +32 -20
  12. data/lib/aixm/component/geometry/arc.rb +16 -3
  13. data/lib/aixm/component/geometry/border.rb +8 -1
  14. data/lib/aixm/component/geometry/circle.rb +14 -2
  15. data/lib/aixm/component/geometry/point.rb +8 -1
  16. data/lib/aixm/component/geometry/rhumb_line.rb +8 -1
  17. data/lib/aixm/component/geometry.rb +20 -10
  18. data/lib/aixm/component/helipad.rb +41 -20
  19. data/lib/aixm/component/layer.rb +31 -20
  20. data/lib/aixm/component/lighting.rb +22 -24
  21. data/lib/aixm/component/runway.rb +32 -25
  22. data/lib/aixm/component/service.rb +11 -17
  23. data/lib/aixm/component/surface.rb +47 -14
  24. data/lib/aixm/component/timesheet.rb +178 -0
  25. data/lib/aixm/component/timetable.rb +32 -13
  26. data/lib/aixm/component/vasis.rb +36 -6
  27. data/lib/aixm/component/vertical_limit.rb +26 -4
  28. data/lib/aixm/component.rb +4 -1
  29. data/lib/aixm/concerns/hash_equality.rb +21 -0
  30. data/lib/aixm/concerns/intensity.rb +30 -0
  31. data/lib/aixm/concerns/marking.rb +21 -0
  32. data/lib/aixm/concerns/remarks.rb +21 -0
  33. data/lib/aixm/concerns/timetable.rb +22 -0
  34. data/lib/aixm/d.rb +20 -14
  35. data/lib/aixm/document.rb +22 -5
  36. data/lib/aixm/f.rb +29 -17
  37. data/lib/aixm/feature/airport.rb +91 -45
  38. data/lib/aixm/feature/airspace.rb +28 -5
  39. data/lib/aixm/feature/navigational_aid/designated_point.rb +8 -1
  40. data/lib/aixm/feature/navigational_aid/dme.rb +12 -2
  41. data/lib/aixm/feature/navigational_aid/marker.rb +9 -2
  42. data/lib/aixm/feature/navigational_aid/ndb.rb +15 -3
  43. data/lib/aixm/feature/navigational_aid/vor.rb +20 -3
  44. data/lib/aixm/feature/navigational_aid.rb +29 -20
  45. data/lib/aixm/feature/obstacle.rb +105 -29
  46. data/lib/aixm/feature/obstacle_group.rb +3 -7
  47. data/lib/aixm/feature/organisation.rb +23 -14
  48. data/lib/aixm/feature/unit.rb +23 -11
  49. data/lib/aixm/feature.rb +23 -4
  50. data/lib/aixm/memoize.rb +3 -3
  51. data/lib/aixm/p.rb +20 -14
  52. data/lib/aixm/payload_hash.rb +5 -2
  53. data/lib/aixm/r.rb +15 -12
  54. data/lib/aixm/refinements.rb +42 -2
  55. data/lib/aixm/schedule/date.rb +181 -0
  56. data/lib/aixm/schedule/day.rb +114 -0
  57. data/lib/aixm/schedule/time.rb +255 -0
  58. data/lib/aixm/shortcuts.rb +3 -0
  59. data/lib/aixm/version.rb +1 -1
  60. data/lib/aixm/w.rb +20 -13
  61. data/lib/aixm/xy.rb +36 -25
  62. data/lib/aixm/z.rb +29 -17
  63. data/lib/aixm.rb +13 -0
  64. data.tar.gz.sig +0 -0
  65. metadata +22 -13
  66. metadata.gz.sig +0 -0
data/lib/aixm/f.rb CHANGED
@@ -7,6 +7,7 @@ module AIXM
7
7
  # @example
8
8
  # AIXM.f(123.35, :mhz)
9
9
  class F
10
+ include AIXM::Concerns::HashEquality
10
11
  extend Forwardable
11
12
 
12
13
  UNITS = %i(ghz mhz khz).freeze
@@ -15,12 +16,23 @@ module AIXM
15
16
  # @return [Boolean] whether frequency is zero
16
17
  def_delegator :@freq, :zero?
17
18
 
18
- # @return [Float] frequency
19
+ # Frequency
20
+ #
21
+ # @overload freq
22
+ # @return [Float]
23
+ # @overload freq=(value)
24
+ # @param value [Float]
19
25
  attr_reader :freq
20
26
 
21
- # @return [Symbol] unit (see {UNITS})
27
+ # Unit
28
+ #
29
+ # @overload unit
30
+ # @return [Symbol] any of {UNITS}
31
+ # @overload unit=(value)
32
+ # @param value [Symbol] any of {UNITS}
22
33
  attr_reader :unit
23
34
 
35
+ # See the {overview}[AIXM::F] for examples.
24
36
  def initialize(freq, unit)
25
37
  self.freq, self.unit = freq, unit
26
38
  end
@@ -46,26 +58,22 @@ module AIXM
46
58
  fail(ArgumentError, "invalid unit") unless UNITS.include? @unit
47
59
  end
48
60
 
49
- # @return [Boolean] whether this frequency is part of a frequency band
61
+ # Whether this frequency is part of a frequency band.
62
+ #
63
+ # @return [Boolean]
50
64
  def between?(lower_freq, upper_freq, unit)
51
65
  freq.between?(lower_freq, upper_freq) && self.unit == unit
52
66
  end
53
67
 
54
68
  # @see Object#==
55
- # @return [Boolean]
56
69
  def ==(other)
57
70
  self.class === other && freq == other.freq && unit == other.unit
58
71
  end
59
- alias_method :eql?, :==
60
-
61
- # @see Object#hash
62
- # @return [Integer]
63
- def hash
64
- to_s.hash
65
- end
66
72
 
67
- # @return [Boolean] whether this frequency is part of the voice airband
68
- # for civil aviation using `AIXM.config.voice_channel_separation`
73
+ # Whether this frequency is part of the voice airband for civil aviation
74
+ # using +AIXM.config.voice_channel_separation+.
75
+ #
76
+ # @return [Boolean]
69
77
  def voice?
70
78
  return false unless unit == :mhz
71
79
  case AIXM.config.voice_channel_separation
@@ -78,15 +86,19 @@ module AIXM
78
86
 
79
87
  private
80
88
 
81
- # @return [Boolean] whether this frequency is part of the voice airband
82
- # for civil aviation using 25 kHz channel separation
89
+ # Whether this frequency is part of the voice airband for civil aviation
90
+ # using 25 kHz channel separation.
91
+ #
92
+ # @return [Boolean]
83
93
  def voice_25?
84
94
  return false unless unit == :mhz && freq == freq.round(3) && freq.between?(118, 136.975)
85
95
  ((freq * 1000).round % 25).zero?
86
96
  end
87
97
 
88
- # @return [Boolean] whether this frequency is part of the voice airband
89
- # for civil aviation using 8.33 kHz channel separation
98
+ # Whether this frequency is part of the voice airband for civil aviation
99
+ # using 8.33 kHz channel separation.
100
+ #
101
+ # @return [Boolean]
90
102
  def voice_833?
91
103
  return false unless unit == :mhz && freq == freq.round(3) && freq.between?(118, 136.99)
92
104
  [0.005, 0.01, 0.015].any? { |d| (((freq - d) * 1000).round % 25).zero? }
@@ -38,6 +38,8 @@ module AIXM
38
38
  class Airport < Feature
39
39
  include AIXM::Association
40
40
  include AIXM::Memoize
41
+ include AIXM::Concerns::Timetable
42
+ include AIXM::Concerns::Remarks
41
43
 
42
44
  public_class_method :new
43
45
 
@@ -112,7 +114,7 @@ module AIXM
112
114
  # @return [AIXM::Feature::Organisation] superior organisation
113
115
  belongs_to :organisation, as: :member
114
116
 
115
- # ICAO indicator, IATA indicator or generated indicator
117
+ # ICAO, IATA or generated airport indicator.
116
118
  #
117
119
  # * four letter ICAO indicator (e.g. "LFMV")
118
120
  # * three letter IATA indicator (e.g. "AVN")
@@ -120,19 +122,42 @@ module AIXM
120
122
  # * two letter ICAO country code + at least four letters/digits (e.g.
121
123
  # "LFFOOBAR123" or "LF" + GPS code)
122
124
  #
123
- # @return [String] airport indicator
125
+ # @overload id
126
+ # @return [String]
127
+ # @overload id=(value)
128
+ # @param value [String]
124
129
  attr_reader :id
125
130
 
126
- # @return [String] full name
131
+ # Full name
132
+ #
133
+ # @overload name
134
+ # @return [String]
135
+ # @overload name=(value)
136
+ # @param value [String]
127
137
  attr_reader :name
128
138
 
129
- # @return [AIXM::XY] reference point
139
+ # Reference point
140
+ #
141
+ # @overload xy
142
+ # @return [AIXM::XY]
143
+ # @overload xy=(value)
144
+ # @param value [AIXM::XY]
130
145
  attr_reader :xy
131
146
 
132
- # @return [String, nil] GPS code
147
+ # GPS code
148
+ #
149
+ # @overload gps
150
+ # @return [String, nil]
151
+ # @overload gps=(value)
152
+ # @param value [String, nil]
133
153
  attr_reader :gps
134
154
 
135
- # @return [AIXM::Z, nil] elevation in +:qnh+
155
+ # Elevation in +:qnh+
156
+ #
157
+ # @overload z
158
+ # @return [AIXM::Z, nil]
159
+ # @overload z=(value)
160
+ # @param value [AIXM::Z, nil]
136
161
  attr_reader :z
137
162
 
138
163
  # When looking towards the geographic (aka: true) north, a positive
@@ -146,18 +171,24 @@ module AIXM
146
171
  # @return [Float, nil] magnetic declination in degrees
147
172
  attr_reader :declination
148
173
 
149
- # @return [AIXM::Z, nil] transition altitude in +:qnh+
174
+ # Transition altitude in +:qnh+
175
+ #
176
+ # @overload transition_z
177
+ # @return [AIXM::Z, nil]
178
+ # @overload transition_z=(value)
179
+ # @param value [AIXM::Z, nil]
150
180
  attr_reader :transition_z
151
181
 
152
- # @return [AIXM::Component::Timetable, nil] operating hours
153
- attr_reader :timetable
154
-
155
- # @return [String, nil] operator of the airport
182
+ # Operator of the airport
183
+ #
184
+ # @overload operator
185
+ # @return [String, nil]
186
+ # @overload operator=(value)
187
+ # @param value [String, nil]
156
188
  attr_reader :operator
157
189
 
158
- # @return [String, nil] free text remarks
159
- attr_reader :remarks
160
-
190
+ # See the {cheat sheet}[AIXM::Feature::Airport] for examples on how to
191
+ # create instances of this class.
161
192
  def initialize(source: nil, region: nil, organisation:, id: nil, name:, xy:)
162
193
  super(source: source, region: region)
163
194
  self.organisation, self.name, self.id, self.xy = organisation, name, id, xy # name must be set before id
@@ -186,12 +217,17 @@ module AIXM
186
217
  @gps = value&.upcase
187
218
  end
188
219
 
220
+ # Type of airport.
221
+ #
189
222
  # The type is usually derived from the presence of runways and helipads,
190
223
  # however, this may be overridden by setting an alternative value, most
191
224
  # notably +:landing_site+.
192
225
  #
193
226
  # @!attribute type
194
- # @return [Symbol] type of airport (see {TYPES})
227
+ # @overload type
228
+ # @return [Symbol] any of {TYPES}
229
+ # @overload type=(value)
230
+ # @param value [Symbol] any of {TYPES}
195
231
  def type
196
232
  @type = case
197
233
  when @type then @type
@@ -228,20 +264,11 @@ module AIXM
228
264
  @transition_z = value
229
265
  end
230
266
 
231
- def timetable=(value)
232
- fail(ArgumentError, "invalid timetable") unless value.nil? || value.is_a?(AIXM::Component::Timetable)
233
- @timetable = value
234
- end
235
-
236
267
  def operator=(value)
237
268
  fail(ArgumentError, "invalid name") unless value.nil? || value.is_a?(String)
238
269
  @operator = value&.uptrans
239
270
  end
240
271
 
241
- def remarks=(value)
242
- @remarks = value&.to_s
243
- end
244
-
245
272
  # @return [String] UID markup
246
273
  def to_uid(as: :AhpUid)
247
274
  builder = Builder::XmlMarkup.new(indent: 2)
@@ -350,6 +377,8 @@ module AIXM
350
377
  # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#ahu-airport-usage
351
378
  class UsageLimitation
352
379
  include AIXM::Association
380
+ include AIXM::Concerns::Timetable
381
+ include AIXM::Concerns::Remarks
353
382
 
354
383
  TYPES = {
355
384
  PERMIT: :permitted,
@@ -370,15 +399,16 @@ module AIXM
370
399
  # @return [AIXM::Feature::Airport] airport this usage limitation is assigned to
371
400
  belongs_to :airport
372
401
 
373
- # @return [Symbol] type of limitation
402
+ # Type of limitation
403
+ #
404
+ # @overload type
405
+ # @return [Symbol] any of {TYPES}
406
+ # @overload type=(value)
407
+ # @param value [Symbol] any of {TYPES}
374
408
  attr_reader :type
375
409
 
376
- # @return [AIXM::Component::Timetable, nil] limitation application hours
377
- attr_reader :timetable
378
-
379
- # @return [String, nil] free text remarks
380
- attr_reader :remarks
381
-
410
+ # See the {cheat sheet}[AIXM::Feature::Airport::UsageLimitation] for
411
+ # examples on how to create instances of this class.
382
412
  def initialize(type:)
383
413
  self.type = type
384
414
  end
@@ -392,15 +422,6 @@ module AIXM
392
422
  @type = TYPES.lookup(value&.to_s&.to_sym, nil) || fail(ArgumentError, "invalid type")
393
423
  end
394
424
 
395
- def timetable=(value)
396
- fail(ArgumentError, "invalid timetable") unless value.nil? || value.is_a?(AIXM::Component::Timetable)
397
- @timetable = value
398
- end
399
-
400
- def remarks=(value)
401
- @remarks = value&.to_s
402
- end
403
-
404
425
  # @return [String] AIXM or OFMX markup
405
426
  def to_xml
406
427
  builder = Builder::XmlMarkup.new(indent: 2)
@@ -471,19 +492,44 @@ module AIXM
471
492
  # @return [AIXM::Feature::Airport::UsageLimitation] usage limitation the condition belongs to
472
493
  belongs_to :usage_limitation
473
494
 
474
- # @return [Symbol, nil] kind of aircraft (see {AIRCRAFT})
495
+ # Kind of aircraft.
496
+ #
497
+ # @overload aircraft
498
+ # @return [Symbol, nil] any of {AIRCRAFT}
499
+ # @overload aircraft=(value)
500
+ # @param value [Symbol, nil] any of {AIRCRAFT}
475
501
  attr_reader :aircraft
476
502
 
477
- # @return [String, nil] flight rule (see {RULES})
503
+ # Flight rule.
504
+ #
505
+ # @overload rule
506
+ # @return [Symbol, nil] any of {RULES}
507
+ # @overload rule=(value)
508
+ # @param value [Symbol, nil] any of {RULES}
478
509
  attr_reader :rule
479
510
 
480
- # @return [String, nil] whether military or civil (see {REALMS})
511
+ # Military, civil etc.
512
+ #
513
+ # @overload realm
514
+ # @return [Symbol, nil] any of {REALMS}
515
+ # @overload realm=(value)
516
+ # @param value [Symbol, nil] any of {REALMS}
481
517
  attr_reader :realm
482
518
 
483
- # @return [String, nil] geographic origin of the flight (see {ORIGINS})
519
+ # Geographic origin of the flight.
520
+ #
521
+ # @overload origin
522
+ # @return [Symbol, nil] any of {ORIGINS}
523
+ # @overload origin=(value)
524
+ # @param value [Symbol, nil] any of {ORIGINS}
484
525
  attr_reader :origin
485
526
 
486
- # @return [String, nil] purpose of the flight (see {PURPOSES})
527
+ # Purpose of the flight.
528
+ #
529
+ # @overload purpose
530
+ # @return [Symbol, nil] any of {PURPOSES}
531
+ # @overload purpose=(value)
532
+ # @param value [Symbol, nil] any of {PURPOSES}
487
533
  attr_reader :purpose
488
534
 
489
535
  # @return [String]
@@ -92,23 +92,46 @@ module AIXM
92
92
  # @param layer [AIXM::Compoment::Layer]
93
93
  has_many :layers
94
94
 
95
+ # Published identifier (e.g. "LFP81").
96
+ #
95
97
  # @note When assigning +nil+, a 4 byte hex derived from {#type}, {#name}
96
98
  # and {#local_type} is written instead.
97
99
  #
98
- # @return [String] published identifier (e.g. "LFP81")
100
+ # @overload id
101
+ # @return [String]
102
+ # @overload id=(value)
103
+ # @param value [String]
99
104
  attr_reader :id
100
105
 
101
- # @return [Symbol] type of airspace (see {TYPES})
106
+ # Type of airspace (see {TYPES})
107
+ #
108
+ # @overload type
109
+ # @return [Symbol] any of {TYPES}
110
+ # @overload type=(value)
111
+ # @param value [Symbol] any of {TYPES}
102
112
  attr_reader :type
103
113
 
104
- # Some regions define additional types. They are usually specified with
114
+ # Local type.
105
115
  #
106
- # @return [String, nil] local type (e.g. "RMZ" or "TMZ")
116
+ # Some regions define additional local types such as "RMZ" or "TMZ". They
117
+ # are often further specifying type +:regulated_airspace+.
118
+ #
119
+ # @overload local_type
120
+ # @return [String, nil]
121
+ # @overload local_type=(value)
122
+ # @param value [String, nil]
107
123
  attr_reader :local_type
108
124
 
109
- # @return [String, nil] full name (e.g. "LF P 81 CHERBOURG")
125
+ # Full name (e.g. "LF P 81 CHERBOURG")
126
+ #
127
+ # @overload name
128
+ # @return [String, nil]
129
+ # @overload name=(value)
130
+ # @param value [String, nil]
110
131
  attr_reader :name
111
132
 
133
+ # See the {cheat sheet}[AIXM::Feature::Airspace] for examples on how to
134
+ # create instances of this class.
112
135
  def initialize(source: nil, region: nil, id: nil, type:, local_type: nil, name: nil)
113
136
  super(source: source, region: region)
114
137
  self.type, self.local_type, self.name = type, local_type, name
@@ -41,9 +41,16 @@ module AIXM
41
41
  # associated with
42
42
  belongs_to :airport
43
43
 
44
- # @return [Symbol] type of designated point
44
+ # Type of designated point
45
+ #
46
+ # @overload type
47
+ # @return [Symbol] any of {TYPES}
48
+ # @overload type=(value)
49
+ # @param value [Symbol] any of {TYPES}
45
50
  attr_reader :type
46
51
 
52
+ # See the {cheat sheet}[AIXM::Feature::NavigationalAid::DesignatedPoint]
53
+ # for examples on how to create instances of this class.
47
54
  def initialize(type:, **arguments)
48
55
  super(organisation: nil, z: nil, **arguments)
49
56
  self.type = type
@@ -43,9 +43,20 @@ module AIXM
43
43
  # @return [AIXM::Feature::NavigationalAid::VOR, nil] associated VOR
44
44
  belongs_to :vor, readonly: true
45
45
 
46
- # @return [String] radio channel
46
+ # Radio channel
47
+ #
48
+ # @overload channel
49
+ # @return [String]
50
+ # @overload channel=(value)
51
+ # @param value [String]
52
+ # @overload ghost_f
53
+ # @return [AIXM::F] ghost frequency matching the {#channel}
54
+ # @overload ghost_f=(value)
55
+ # @param value [AIXM::F] ghost frequency matching the {#channel}
47
56
  attr_reader :channel
48
57
 
58
+ # See the {cheat sheet}[AIXM::Feature::NavigationalAid::DME] for examples
59
+ # on how to create instances of this class.
49
60
  def initialize(channel: nil, ghost_f: nil, **arguments)
50
61
  super(**arguments)
51
62
  case
@@ -72,7 +83,6 @@ module AIXM
72
83
  self.channel = "#{number}#{letter}"
73
84
  end
74
85
 
75
- # @return [AIXM::F] ghost frequency matching the channel
76
86
  def ghost_f
77
87
  if channel
78
88
  number, letter = channel.split(/(?=[XY])/)
@@ -39,13 +39,20 @@ module AIXM
39
39
  OTHER: :other # specify in remarks
40
40
  }
41
41
 
42
- # @return [Symbol] type of marker (see {TYPES})
42
+ # Type of marker
43
+ #
44
+ # @overload type
45
+ # @return [Symbol, nil] any of {TYPES}
46
+ # @overload type=(value)
47
+ # @param value [Symbol, nil] any of {TYPES}
43
48
  attr_reader :type
44
49
 
45
- # TODO: Marker require an associated ILS (not yet implemented)
50
+ # See the {cheat sheet}[AIXM::Feature::NavigationalAid::Marker] for
51
+ # examples on how to create instances of this class.
46
52
  def initialize(type:, **arguments)
47
53
  super(**arguments)
48
54
  self.type = type
55
+ # TODO: Marker require an associated ILS (not yet implemented)
49
56
  warn("WARNING: Marker is not fully implemented yet due to the lack of ILS")
50
57
  end
51
58
 
@@ -25,7 +25,7 @@ module AIXM
25
25
  # @see https://gitlab.com/openflightmaps/ofmx/wikis/Navigational-aid#ndb-ndb
26
26
  class NDB < NavigationalAid
27
27
  include AIXM::Memoize
28
-
28
+
29
29
  public_class_method :new
30
30
 
31
31
  TYPES = {
@@ -35,12 +35,24 @@ module AIXM
35
35
  OTHER: :other # specify in remarks
36
36
  }.freeze
37
37
 
38
- # @return [Symbol, nil] type of NDB (see {TYPES})
38
+ # Type of NDB
39
+ #
40
+ # @overload type
41
+ # @return [Symbol, nil] any of {TYPES}
42
+ # @overload type=(value)
43
+ # @param value [Symbol, nil] any of {TYPES}
39
44
  attr_reader :type
40
45
 
41
- # @return [AIXM::F] radio frequency
46
+ # Radio frequency
47
+ #
48
+ # @overload f
49
+ # @return [AIXM::F]
50
+ # @overload f=(value)
51
+ # @param value [AIXM::F]
42
52
  attr_reader :f
43
53
 
54
+ # See the {cheat sheet}[AIXM::Feature::NavigationalAid::NDB] for examples
55
+ # on how to create instances of this class.
44
56
  def initialize(type:, f:, **arguments)
45
57
  super(**arguments)
46
58
  self.type, self.f = type, f
@@ -59,15 +59,32 @@ module AIXM
59
59
  # @param tacan [AIXM::Feature::NavigationalAid::TACAN, nil]
60
60
  has_one :tacan, allow_nil: true
61
61
 
62
- # @return [Symbol] type of VOR (see {TYPES})
62
+ # Type of VOR
63
+ #
64
+ # @overload type
65
+ # @return [Symbol] any of {TYPES}
66
+ # @overload type=(value)
67
+ # @param value [Symbol] any of {TYPES}
63
68
  attr_reader :type
64
69
 
65
- # @return [AIXM::F] radio requency
70
+ # Radio requency
71
+ #
72
+ # @overload f
73
+ # @return [AIXM::F]
74
+ # @overload f=(value)
75
+ # @param value [AIXM::F]
66
76
  attr_reader :f
67
77
 
68
- # @return [Symbol] north indication (see {NORTHS})
78
+ # North indication
79
+ #
80
+ # @overload north
81
+ # @return [Symbol] any of {NORTHS}
82
+ # @overload north=(value)
83
+ # @param value [Symbol] any of {NORTHS}
69
84
  attr_reader :north
70
85
 
86
+ # See the {cheat sheet}[AIXM::Feature::VOR] for examples on how to
87
+ # create instances of this class.
71
88
  def initialize(type:, f:, north:, **arguments)
72
89
  super(**arguments)
73
90
  self.type, self.f, self.north = type, f, north
@@ -6,6 +6,8 @@ module AIXM
6
6
  # @abstract
7
7
  class NavigationalAid < Feature
8
8
  include AIXM::Association
9
+ include AIXM::Concerns::Timetable
10
+ include AIXM::Concerns::Remarks
9
11
 
10
12
  private_class_method :new
11
13
 
@@ -13,24 +15,38 @@ module AIXM
13
15
  # @return [AIXM::Feature::Organisation] superior organisation
14
16
  belongs_to :organisation, as: :member
15
17
 
16
- # @return [String] published identifier
18
+ # Published identifier
19
+ #
20
+ # @overload id
21
+ # @return [String]
22
+ # @overload id=(value)
23
+ # @param value [String]
17
24
  attr_reader :id
18
25
 
19
- # @return [String, nil] name of the navigational aid
26
+ # Name of the navigational aid.
27
+ #
28
+ # @overload name
29
+ # @return [String, nil]
30
+ # @overload name=(value)
31
+ # @param value [String, nil]
20
32
  attr_reader :name
21
33
 
22
- # @return [AIXM::XY] geographic position
34
+ # Geographic position.
35
+ #
36
+ # @overload xy
37
+ # @return [AIXM::XY]
38
+ # @overload xy=(value)
39
+ # @param value [AIXM::XY]
23
40
  attr_reader :xy
24
41
 
25
- # @return [AIXM::Z, nil] elevation in +:qnh+
42
+ # Elevation in +:qnh+.
43
+ #
44
+ # @overload z
45
+ # @return [AIXM::Z, nil]
46
+ # @overload z=(value)
47
+ # @param value [AIXM::Z, nil]
26
48
  attr_reader :z
27
49
 
28
- # @return [AIXM::Component::Timetable, nil] operating hours
29
- attr_reader :timetable
30
-
31
- # @return [String, nil] free text remarks
32
- attr_reader :remarks
33
-
34
50
  def initialize(source: nil, region: nil, organisation:, id:, name: nil, xy:, z: nil)
35
51
  super(source: source, region: region)
36
52
  self.organisation, self.id, self.name, self.xy, self.z = organisation, id, name, xy, z
@@ -61,16 +77,9 @@ module AIXM
61
77
  @z = value
62
78
  end
63
79
 
64
- def timetable=(value)
65
- fail(ArgumentError, "invalid timetable") unless value.nil? || value.is_a?(AIXM::Component::Timetable)
66
- @timetable = value
67
- end
68
-
69
- def remarks=(value)
70
- @remarks = value&.to_s
71
- end
72
-
73
- # @return [String] fully descriptive combination of {#class} and {#type} key
80
+ # Fully descriptive combination of {#class} and {#type} key.
81
+ #
82
+ # @return [String]
74
83
  def kind
75
84
  [self.class.name.split('::').last, type_key].compact.join(':'.freeze)
76
85
  end