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
@@ -20,9 +20,16 @@ module AIXM
20
20
  # @return [AIXM::Component::Geometry] geometry this segment belongs to
21
21
  belongs_to :geometry, as: :segment
22
22
 
23
- # @return [AIXM::XY] (starting) point
23
+ # (Starting) point
24
+ #
25
+ # @overload xy
26
+ # @return [AIXM::XY]
27
+ # @overload xy=(value)
28
+ # @param value [AIXM::XY]
24
29
  attr_reader :xy
25
30
 
31
+ # See the {cheat sheet}[AIXM::Component::Geometry::RhumbLine] for
32
+ # examples on how to create instances of this class.
26
33
  def initialize(xy:)
27
34
  self.xy = xy
28
35
  end
@@ -49,6 +49,8 @@ module AIXM
49
49
  # @return [AIXM::Feature::Airspace] airspace the geometry defines
50
50
  belongs_to :airspace
51
51
 
52
+ # See the {cheat sheet}[AIXM::Component::Geometry] for examples on how to
53
+ # create instances of this class.
52
54
  def initialize(*segments)
53
55
  segments.each { add_segment(_1) }
54
56
  end
@@ -58,36 +60,44 @@ module AIXM
58
60
  %Q(#<#{self.class} segments=#{segments.count.inspect}>)
59
61
  end
60
62
 
61
- # @return [Boolean] whether the geometry is closed
63
+ # Whether the geometry is closed
64
+ #
65
+ # @return [Boolean]
62
66
  def closed?
63
67
  point? || circle? || polygon?
64
68
  end
65
69
 
66
- # @return [String] AIXM or OFMX markup
67
- def to_xml
68
- fail(GeometryError.new("geometry is not closed", self)) unless closed?
69
- segments.map { _1.to_xml }.join
70
- end
71
-
72
- # @return [Boolean] Single point geometry?
70
+ # Whether a single point geometry
71
+ #
72
+ # @return [Boolean]
73
73
  def point?
74
74
  segments.size == 1 &&
75
75
  segments.first.is_a?(AIXM::Component::Geometry::Point)
76
76
  end
77
77
 
78
- # @return [Boolean] Circle shaped geometry?
78
+ # Whether a circle shaped geometry
79
+ #
80
+ # @return [Boolean]
79
81
  def circle?
80
82
  segments.size == 1 &&
81
83
  segments.first.is_a?(AIXM::Component::Geometry::Circle)
82
84
  end
83
85
 
84
- # @return [Boolean] Polygon shaped geometry?
86
+ # Whether a polygon shaped geometry
87
+ #
88
+ # @return [Boolean]
85
89
  def polygon?
86
90
  segments.size >= 3 &&
87
91
  !segments.any? { _1.is_a?(AIXM::Component::Geometry::Circle) } &&
88
92
  segments.last.is_a?(AIXM::Component::Geometry::Point) &&
89
93
  segments.first.xy == segments.last.xy
90
94
  end
95
+
96
+ # @return [String] AIXM or OFMX markup
97
+ def to_xml
98
+ fail(GeometryError.new("geometry is not closed", self)) unless closed?
99
+ segments.map { _1.to_xml }.join
100
+ end
91
101
  end
92
102
 
93
103
  end
@@ -25,6 +25,8 @@ module AIXM
25
25
  class Helipad < Component
26
26
  include AIXM::Association
27
27
  include AIXM::Memoize
28
+ include AIXM::Concerns::Marking
29
+ include AIXM::Concerns::Remarks
28
30
 
29
31
  PERFORMANCE_CLASSES = {
30
32
  '1': :'1',
@@ -68,30 +70,57 @@ module AIXM
68
70
  # @return [AIXM::Feature::Airport] airport this helipad belongs to
69
71
  belongs_to :airport
70
72
 
71
- # @return [String] full name (e.g. "H1")
73
+ # Full name (e.g. "H1")
74
+ #
75
+ # @overload name
76
+ # @return [String]
77
+ # @overload name=(value)
78
+ # @param value [String]
72
79
  attr_reader :name
73
80
 
74
- # @return [AIXM::XY] center point
81
+ # Center point
82
+ #
83
+ # @overload center_xy
84
+ # @return [AIXM::XY]
85
+ # @overload center_xy=(value)
86
+ # @param value [AIXM::XY]
75
87
  attr_reader :xy
76
88
 
77
- # @return [AIXM::Z, nil] elevation in +:qnh+
89
+ # Elevation in +:qnh+
90
+ #
91
+ # @overload z
92
+ # @return [AIXM::Z, nil]
93
+ # @overload z=(value)
94
+ # @param value [AIXM::Z, nil]
78
95
  attr_reader :z
79
96
 
80
- # @return [AIXM::R, nil] dimensions
97
+ # Dimensions
98
+ #
99
+ # @overload dimensions
100
+ # @return [AIXM::R, nil]
101
+ # @overload dimensions=(value)
102
+ # @param value [AIXM::R, nil]
81
103
  attr_reader :dimensions
82
104
 
83
- # @return [String, nil] markings
84
- attr_reader :marking
85
-
86
- # @return [Integer, Symbol, nil] suitable performance class
105
+ # Suitable performance class
106
+ #
107
+ # @overload performance_class
108
+ # @return [Integer, Symbol, nil]
109
+ # @overload performance_class=(value)
110
+ # @param value [Integer, Symbol, nil]
87
111
  attr_reader :performance_class
88
112
 
89
- # @return [Symbol, nil] status of the helipad (see {STATUSES}) or +nil+ for normal operation
113
+ # Status of the helipad
114
+ #
115
+ # @overload status
116
+ # @return [Symbol, nil] any of {STATUSES} or +nil+ for normal operation
117
+ # @overload status=(value)
118
+ # @param value [Symbol, nil] any of {STATUSES} or +nil+ for normal
119
+ # operation
90
120
  attr_reader :status
91
121
 
92
- # @return [String, nil] free text remarks
93
- attr_reader :remarks
94
-
122
+ # See the {cheat sheet}[AIXM::Component::Helipad] for examples on how to
123
+ # create instances of this class.
95
124
  def initialize(name:, xy:)
96
125
  self.name, self.xy = name, xy
97
126
  self.surface = AIXM.surface
@@ -122,10 +151,6 @@ module AIXM
122
151
  @dimensions = value
123
152
  end
124
153
 
125
- def marking=(value)
126
- @marking = value&.to_s
127
- end
128
-
129
154
  def performance_class=(value)
130
155
  @performance_class = value.nil? ? nil : (PERFORMANCE_CLASSES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid performance class"))
131
156
  end
@@ -134,10 +159,6 @@ module AIXM
134
159
  @status = value.nil? ? nil : (STATUSES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid status"))
135
160
  end
136
161
 
137
- def remarks=(value)
138
- @remarks = value&.to_s
139
- end
140
-
141
162
  # @return [String] UID markup
142
163
  def to_uid
143
164
  builder = Builder::XmlMarkup.new(indent: 2)
@@ -21,6 +21,8 @@ module AIXM
21
21
  # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airspace
22
22
  class Layer < Component
23
23
  include AIXM::Association
24
+ include AIXM::Concerns::Timetable
25
+ include AIXM::Concerns::Remarks
24
26
 
25
27
  CLASSES = (:A..:G).freeze
26
28
 
@@ -106,18 +108,24 @@ module AIXM
106
108
  # @return [AIXM::Feature::Airspace] airspace the layer defines
107
109
  belongs_to :airspace
108
110
 
109
- # @return [String, nil] four letter location identifier as published in the ICAO DOC 7910
111
+ # Four letter location identifier as published in the ICAO DOC 7910
112
+ #
113
+ # @overload location_indicator
114
+ # @return [String, nil]
115
+ # @overload location_indicator=(value)
116
+ # @param value [String, nil]
110
117
  attr_reader :location_indicator
111
118
 
112
- # @return [String, nil] primary activity (e.g. "GLIDER")
119
+ # Primary activity
120
+ #
121
+ # @overload activity
122
+ # @return [Symbol, nil] any of {ACTIVITIES}
123
+ # @overload activity=(value)
124
+ # @param value [Symbol, nil] any of {ACTIVITIES}
113
125
  attr_reader :activity
114
126
 
115
- # @return [AIXM::Component::Timetable, nil] activation hours
116
- attr_reader :timetable
117
-
118
- # @return [String, nil] free text remarks
119
- attr_reader :remarks
120
-
127
+ # See the {cheat sheet}[AIXM::Component::Layer] for examples on how to
128
+ # create instances of this class.
121
129
  def initialize(class: nil, location_indicator: nil, vertical_limit:)
122
130
  self.class = binding.local_variable_get(:class)
123
131
  self.location_indicator, self.vertical_limit = location_indicator, vertical_limit
@@ -129,8 +137,15 @@ module AIXM
129
137
  %Q(#<#{__class__} class=#{@klass.inspect}>)
130
138
  end
131
139
 
140
+ # Class of layer.
141
+ #
142
+ # @note Use +Object#__class__+ alias to query the Ruby object class.
143
+ #
132
144
  # @!attribute class
133
- # @return [Symbol] class of layer (see {CLASSES})
145
+ # @overload class
146
+ # @return [Symbol] any of {CLASSES}
147
+ # @overload class=(value)
148
+ # @param value [Symbol] any of {CLASSES}
134
149
  def class
135
150
  @klass
136
151
  end
@@ -149,13 +164,13 @@ module AIXM
149
164
  @activity = value.nil? ? nil : ACTIVITIES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid activity")
150
165
  end
151
166
 
152
- def timetable=(value)
153
- fail(ArgumentError, "invalid timetable") unless value.nil? || value.is_a?(AIXM::Component::Timetable)
154
- @timetable = value
155
- end
156
-
157
- # @!attribute [w] selective
158
- # @return [Boolean] whether the layer may be activated selectively
167
+ # Whether the layer may be activated selectively.
168
+ #
169
+ # @!attribute selective
170
+ # @overload selective?
171
+ # @return [Boolean]
172
+ # @overload selective=(value)
173
+ # @param value [Boolean]
159
174
  def selective?
160
175
  @selective
161
176
  end
@@ -165,10 +180,6 @@ module AIXM
165
180
  @selective = value
166
181
  end
167
182
 
168
- def remarks=(value)
169
- @remarks = value&.to_s
170
- end
171
-
172
183
  # @return [String] AIXM or OFMX markup
173
184
  def to_xml
174
185
  builder = Builder::XmlMarkup.new(indent: 2)
@@ -20,6 +20,8 @@ module AIXM
20
20
  class Lighting < Component
21
21
  include AIXM::Association
22
22
  include AIXM::Memoize
23
+ include AIXM::Concerns::Intensity
24
+ include AIXM::Concerns::Remarks
23
25
 
24
26
  POSITIONS = {
25
27
  TDZ: :touch_down_zone,
@@ -40,13 +42,6 @@ module AIXM
40
42
  OTHER: :other # specify in remarks
41
43
  }.freeze
42
44
 
43
- INTENSITIES = {
44
- LIL: :low,
45
- LIM: :medium,
46
- LIH: :high,
47
- OTHER: :other # specify in remarks
48
- }.freeze
49
-
50
45
  COLORS = {
51
46
  YEL: :yellow,
52
47
  RED: :red,
@@ -61,21 +56,32 @@ module AIXM
61
56
  # @return [AIXM::Component::Runway::Direction, AIXM::Component::FATO::Direction, AIXM::Component::Helipad] lighted entity
62
57
  belongs_to :lightable
63
58
 
64
- # @return [Symbol, nil] position of the lighting system (see {POSITIONS})
59
+ # Position of the lighting system
60
+ #
61
+ # @overload position
62
+ # @return [Symbol, nil] any of {POSITIONS}
63
+ # @overload position=(value)
64
+ # @param value [Symbol, nil] any of {POSITIONS}
65
65
  attr_reader :position
66
66
 
67
- # @return [String, nil] detailed description
67
+ # Detailed description
68
+ #
69
+ # @overload description
70
+ # @return [String, nil]
71
+ # @overload description=(value)
72
+ # @param value [String, nil]
68
73
  attr_reader :description
69
74
 
70
- # @return [Symbol, nil] intensity of lights (see {INTENSITIES})
71
- attr_reader :intensity
72
-
73
- # @return [Symbol, nil] color of lights (see {COLORS})
75
+ # Color of lights
76
+ #
77
+ # @overload color
78
+ # @return [Symbol, nil] any of {COLORS}
79
+ # @overload color=(value)
80
+ # @param value [Symbol, nil] any of {COLORS}
74
81
  attr_reader :color
75
82
 
76
- # @return [String, nil] free text remarks
77
- attr_reader :remarks
78
-
83
+ # See the {cheat sheet}[AIXM::Component::Lighting] for examples on how to
84
+ # create instances of this class.
79
85
  def initialize(position:)
80
86
  self.position = position
81
87
  end
@@ -93,18 +99,10 @@ module AIXM
93
99
  @description = value&.to_s
94
100
  end
95
101
 
96
- def intensity=(value)
97
- @intensity = value.nil? ? nil : INTENSITIES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid intensity")
98
- end
99
-
100
102
  def color=(value)
101
103
  @color = value.nil? ? nil : COLORS.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid color")
102
104
  end
103
105
 
104
- def remarks=(value)
105
- @remarks = value&.to_s
106
- end
107
-
108
106
  # @return [String] UID markup
109
107
  def to_uid(as:)
110
108
  builder = Builder::XmlMarkup.new(indent: 2)
@@ -51,6 +51,8 @@ module AIXM
51
51
  class Runway < Component
52
52
  include AIXM::Association
53
53
  include AIXM::Memoize
54
+ include AIXM::Concerns::Marking
55
+ include AIXM::Concerns::Remarks
54
56
 
55
57
  STATUSES = {
56
58
  CLSD: :closed,
@@ -86,21 +88,33 @@ module AIXM
86
88
  # @return [AIXM::Feature::Airport] airport the runway belongs to
87
89
  belongs_to :airport
88
90
 
89
- # @return [String] full name of runway (e.g. "12/30" or "16L/34R")
91
+ # Full name of runway (e.g. "12/30" or "16L/34R")
92
+ #
93
+ # @overload name
94
+ # @return [String]
95
+ # @overload name=(value)
96
+ # @param value [String]
90
97
  attr_reader :name
91
98
 
92
- # @return [AIXM::R, nil] dimensions
99
+ # Dimensions
100
+ #
101
+ # @overload dimensions
102
+ # @return [AIXM::R, nil]
103
+ # @overload dimensions=(value)
104
+ # @param value [AIXM::R, nil]
93
105
  attr_reader :dimensions
94
106
 
95
- # @return [String, nil] markings
96
- attr_reader :marking
97
-
98
- # @return [Symbol, nil] status of the runway (see {STATUSES}) or +nil+ for normal operation
107
+ # Status of the runway
108
+ #
109
+ # @overload status
110
+ # @return [Symbol, nil] any of {STATUSES} or +nil+ for normal operation
111
+ # @overload status=(value)
112
+ # @param value [Symbol, nil] any of {STATUSES} or +nil+ for normal
113
+ # operation
99
114
  attr_reader :status
100
115
 
101
- # @return [String, nil] free text remarks
102
- attr_reader :remarks
103
-
116
+ # See the {cheat sheet}[AIXM::Component::Runway] for examples on how to
117
+ # create instances of this class.
104
118
  def initialize(name:)
105
119
  self.name = name
106
120
  @name.split("/").tap do |forth_name, back_name|
@@ -126,18 +140,10 @@ module AIXM
126
140
  @dimensions = value
127
141
  end
128
142
 
129
- def marking=(value)
130
- @marking = value&.to_s
131
- end
132
-
133
143
  def status=(value)
134
144
  @status = value.nil? ? nil : (STATUSES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid status"))
135
145
  end
136
146
 
137
- def remarks=(value)
138
- @remarks = value&.to_s
139
- end
140
-
141
147
  # @return [String] UID markup
142
148
  def to_uid
143
149
  builder = Builder::XmlMarkup.new(indent: 2)
@@ -180,6 +186,7 @@ module AIXM
180
186
  class Direction
181
187
  include AIXM::Association
182
188
  include AIXM::Memoize
189
+ include AIXM::Concerns::Remarks
183
190
 
184
191
  VFR_PATTERNS = {
185
192
  L: :left,
@@ -207,7 +214,12 @@ module AIXM
207
214
  # @return [AIXM::Component::Runway] runway the runway direction is further describing
208
215
  belongs_to :runway, readonly: true
209
216
 
210
- # @return [AIXM::A] partial name of runway (e.g. "12" or "16L")
217
+ # Partial name of runway (e.g. "12" or "16L")
218
+ #
219
+ # @overload name
220
+ # @return [AIXM::A]
221
+ # @overload name=(value)
222
+ # @param value [AIXM::A]
211
223
  attr_reader :name
212
224
 
213
225
  # @return [AIXM::A, nil] (true) geographic bearing in degrees
@@ -231,9 +243,8 @@ module AIXM
231
243
  # @return [Symbol, nil] direction of the VFR flight pattern (see {VFR_PATTERNS})
232
244
  attr_reader :vfr_pattern
233
245
 
234
- # @return [String, nil] free text remarks
235
- attr_reader :remarks
236
-
246
+ # See the {cheat sheet}[AIXM::Component::Runway] for examples on how to
247
+ # create instances of this class.
237
248
  def initialize(name:)
238
249
  self.name = name
239
250
  self.vasis = AIXM.vasis
@@ -288,10 +299,6 @@ module AIXM
288
299
  @vfr_pattern = value.nil? ? nil : (VFR_PATTERNS.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid VFR pattern"))
289
300
  end
290
301
 
291
- def remarks=(value)
292
- @remarks = value&.to_s
293
- end
294
-
295
302
  # @return [AIXM::A] magnetic bearing in degrees
296
303
  def magnetic_bearing
297
304
  if geographic_bearing && runway.airport.declination
@@ -17,6 +17,8 @@ module AIXM
17
17
  class Service < Component
18
18
  include AIXM::Association
19
19
  include AIXM::Memoize
20
+ include AIXM::Concerns::Timetable
21
+ include AIXM::Concerns::Remarks
20
22
 
21
23
  TYPES = {
22
24
  ACS: :area_control_service,
@@ -122,7 +124,7 @@ module AIXM
122
124
  :transcribed_weather_broadcast_service => :meteorological_office,
123
125
  :uhf_direction_finding_service => :uhf_direction_finding_station,
124
126
  :upper_area_control_service => :upper_area_control_centre,
125
- :vhf_direction_finding_service => :vdf_direction_finding_station,
127
+ :vdf_direction_finding_service => :vdf_direction_finding_station,
126
128
  :volmet_service => :meteorological_office,
127
129
  :other => :other
128
130
  }.freeze
@@ -150,15 +152,16 @@ module AIXM
150
152
  # @return [AIXM::Component::Layer] airspace layer this service is provided within
151
153
  belongs_to :layer
152
154
 
153
- # @return [Symbol] type of service (see {TYPES})
155
+ # Type of service
156
+ #
157
+ # @overload type
158
+ # @return [Symbol] any of {TYPES}
159
+ # @overload type=(value)
160
+ # @param value [Symbol] any of {TYPES}
154
161
  attr_reader :type
155
162
 
156
- # @return [AIXM::Component::Timetable, nil] operating hours
157
- attr_reader :timetable
158
-
159
- # @return [String, nil] free text remarks
160
- attr_reader :remarks
161
-
163
+ # See the {cheat sheet}[AIXM::Component::Service] for examples on how to
164
+ # create instances of this class.
162
165
  def initialize(type:)
163
166
  self.type = type
164
167
  @sequence = 1
@@ -173,15 +176,6 @@ module AIXM
173
176
  @type = TYPES.lookup(value&.to_s&.to_sym, nil) || fail(ArgumentError, "invalid type")
174
177
  end
175
178
 
176
- def timetable=(value)
177
- fail(ArgumentError, "invalid timetable") unless value.nil? || value.is_a?(AIXM::Component::Timetable)
178
- @timetable = value
179
- end
180
-
181
- def remarks=(value)
182
- @remarks = value&.to_s
183
- end
184
-
185
179
  # Guess the unit type for this service
186
180
  #
187
181
  # @return [Symbol, nil] guessed unit type or +nil+ if unmappable
@@ -23,6 +23,8 @@ module AIXM
23
23
  # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#tla-helipad-tlof
24
24
  # @see https://gitlab.com/openflightmaps/ofmx/wikis/Airport#fto-fato
25
25
  class Surface < Component
26
+ include AIXM::Concerns::Remarks
27
+
26
28
  COMPOSITIONS = {
27
29
  ASPH: :asphalt,
28
30
  BITUM: :bitumen, # dug up, bound and rolled ground
@@ -59,27 +61,56 @@ module AIXM
59
61
  OTHER: :other
60
62
  }.freeze
61
63
 
62
- # @return [Symbol, nil] composition of the surface (see {COMPOSITIONS})
64
+ # Composition of the surface.
65
+ #
66
+ # @overload composition
67
+ # @return [Symbol, nil] any of {COMPOSITIONS}
68
+ # @overload composition=(value)
69
+ # @param value [Symbol, nil] any of {COMPOSITIONS}
63
70
  attr_reader :composition
64
71
 
65
- # @return [Symbol, nil] preparation of the surface (see {PREPARATIONS})
72
+ # Preparation of the surface.
73
+ #
74
+ # @overload preparation
75
+ # @return [Symbol, nil] any of {PREPARATIONS}
76
+ # @overload preparation=(value)
77
+ # @param value [Symbol, nil] any of {PREPARATIONS}
66
78
  attr_reader :preparation
67
79
 
68
- # @return [Symbol, nil] condition of the surface (see {CONDITIONS})
80
+ # Condition of the surface.
81
+ #
82
+ # @overload condition
83
+ # @return [Symbol, nil] any of {CONDITIONS}
84
+ # @overload condition=(value)
85
+ # @param value [Symbol, nil] any of {CONDITIONS}
69
86
  attr_reader :condition
70
87
 
71
- # @return [AIXM::W, nil] single isolated wheel load weight
88
+ # Single isolated wheel load weight
89
+ #
90
+ # @overload siwl_weight
91
+ # @return [AIXM::W, nil]
92
+ # @overload siwl_weight=(value)
93
+ # @param value [AIXM::W, nil]
72
94
  attr_reader :siwl_weight
73
95
 
74
- # @return [AIXM::P, nil] single isolated wheel load tire pressure
96
+ # Single isolated wheel load tire pressure
97
+ #
98
+ # @overload siwl_tire_pressure
99
+ # @return [AIXM::P, nil]
100
+ # @overload siwl_tire_pressure=(value)
101
+ # @param value [AIXM::P, nil]
75
102
  attr_reader :siwl_tire_pressure
76
103
 
77
- # @return [AIXM::W, nil] all-up wheel weight
104
+ # All-up wheel weight
105
+ #
106
+ # @overload auw_weight
107
+ # @return [AIXM::W, nil]
108
+ # @overload auw_weight=(value)
109
+ # @param value [AIXM::W, nil]
78
110
  attr_reader :auw_weight
79
111
 
80
- # @return [String, nil] free text remarks
81
- attr_reader :remarks
82
-
112
+ # See the {cheat sheet}[AIXM::Component::Surface] for examples on how to
113
+ # create instances of this class.
83
114
  def initialize
84
115
  @pcn = {}
85
116
  end
@@ -101,7 +132,13 @@ module AIXM
101
132
  @condition = value.nil? ? nil : CONDITIONS.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid condition")
102
133
  end
103
134
 
104
- # @return [String, nil] pavement classification number (e.g. "59/F/A/W/T")
135
+ # Pavement classification number (e.g. "59/F/A/W/T")
136
+ #
137
+ # @!attribute pcn
138
+ # @overload pcn
139
+ # @return [String, nil]
140
+ # @overload pcn=(value)
141
+ # @param value [String, nil]
105
142
  def pcn
106
143
  @pcn.none? ? nil : @pcn.values.join("/".freeze)
107
144
  end
@@ -127,10 +164,6 @@ module AIXM
127
164
  @auw_weight = value
128
165
  end
129
166
 
130
- def remarks=(value)
131
- @remarks = value&.to_s
132
- end
133
-
134
167
  # @return [String] AIXM or OFMX markup
135
168
  def to_xml
136
169
  builder = Builder::XmlMarkup.new(indent: true)