aixm 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +14 -0
- data/README.md +3 -1
- data/lib/aixm/a.rb +29 -15
- data/lib/aixm/association.rb +2 -1
- data/lib/aixm/classes.rb +4 -0
- data/lib/aixm/component/address.rb +15 -9
- data/lib/aixm/component/approach_lighting.rb +28 -25
- data/lib/aixm/component/fato.rb +38 -26
- data/lib/aixm/component/frequency.rb +32 -20
- data/lib/aixm/component/geometry/arc.rb +16 -3
- data/lib/aixm/component/geometry/border.rb +8 -1
- data/lib/aixm/component/geometry/circle.rb +14 -2
- data/lib/aixm/component/geometry/point.rb +8 -1
- data/lib/aixm/component/geometry/rhumb_line.rb +8 -1
- data/lib/aixm/component/geometry.rb +20 -10
- data/lib/aixm/component/helipad.rb +41 -20
- data/lib/aixm/component/layer.rb +31 -20
- data/lib/aixm/component/lighting.rb +22 -24
- data/lib/aixm/component/runway.rb +32 -25
- data/lib/aixm/component/service.rb +11 -17
- data/lib/aixm/component/surface.rb +47 -14
- data/lib/aixm/component/timesheet.rb +178 -0
- data/lib/aixm/component/timetable.rb +32 -13
- data/lib/aixm/component/vasis.rb +36 -6
- data/lib/aixm/component/vertical_limit.rb +26 -4
- data/lib/aixm/component.rb +4 -1
- data/lib/aixm/concerns/hash_equality.rb +21 -0
- data/lib/aixm/concerns/intensity.rb +30 -0
- data/lib/aixm/concerns/marking.rb +21 -0
- data/lib/aixm/concerns/remarks.rb +21 -0
- data/lib/aixm/concerns/timetable.rb +22 -0
- data/lib/aixm/d.rb +20 -14
- data/lib/aixm/document.rb +22 -5
- data/lib/aixm/f.rb +29 -17
- data/lib/aixm/feature/airport.rb +91 -45
- data/lib/aixm/feature/airspace.rb +28 -5
- data/lib/aixm/feature/navigational_aid/designated_point.rb +8 -1
- data/lib/aixm/feature/navigational_aid/dme.rb +12 -2
- data/lib/aixm/feature/navigational_aid/marker.rb +9 -2
- data/lib/aixm/feature/navigational_aid/ndb.rb +15 -3
- data/lib/aixm/feature/navigational_aid/vor.rb +20 -3
- data/lib/aixm/feature/navigational_aid.rb +29 -20
- data/lib/aixm/feature/obstacle.rb +105 -29
- data/lib/aixm/feature/obstacle_group.rb +3 -7
- data/lib/aixm/feature/organisation.rb +23 -14
- data/lib/aixm/feature/unit.rb +23 -11
- data/lib/aixm/feature.rb +23 -4
- data/lib/aixm/memoize.rb +3 -3
- data/lib/aixm/p.rb +20 -14
- data/lib/aixm/payload_hash.rb +5 -2
- data/lib/aixm/r.rb +15 -12
- data/lib/aixm/refinements.rb +42 -2
- data/lib/aixm/schedule/date.rb +181 -0
- data/lib/aixm/schedule/day.rb +114 -0
- data/lib/aixm/schedule/time.rb +255 -0
- data/lib/aixm/shortcuts.rb +3 -0
- data/lib/aixm/version.rb +1 -1
- data/lib/aixm/w.rb +20 -13
- data/lib/aixm/xy.rb +36 -25
- data/lib/aixm/z.rb +29 -17
- data/lib/aixm.rb +13 -0
- data.tar.gz.sig +0 -0
- metadata +22 -13
- metadata.gz.sig +0 -0
@@ -43,6 +43,7 @@ module AIXM
|
|
43
43
|
class Obstacle < Feature
|
44
44
|
include AIXM::Association
|
45
45
|
include AIXM::Memoize
|
46
|
+
include AIXM::Concerns::Remarks
|
46
47
|
|
47
48
|
public_class_method :new
|
48
49
|
|
@@ -67,63 +68,138 @@ module AIXM
|
|
67
68
|
# @return [AIXM::Feature::ObstacleGroup] group this obstacle belongs to
|
68
69
|
belongs_to :obstacle_group
|
69
70
|
|
70
|
-
#
|
71
|
+
# Full name.
|
72
|
+
#
|
73
|
+
# @overload name
|
74
|
+
# @return [String]
|
75
|
+
# @overload name=(value)
|
76
|
+
# @param value [String]
|
71
77
|
attr_reader :name
|
72
78
|
|
73
|
-
#
|
79
|
+
# Type of obstacle.
|
80
|
+
#
|
81
|
+
# @overload type
|
82
|
+
# @return [Symbol] any of {TYPES}
|
83
|
+
# @overload type=(value)
|
84
|
+
# @param value [Symbol] any of {TYPES}
|
74
85
|
attr_reader :type
|
75
86
|
|
76
|
-
#
|
87
|
+
# Circular base center point.
|
88
|
+
#
|
89
|
+
# @overload xy
|
90
|
+
# @return [AIXM::XY]
|
91
|
+
# @overload xy=(value)
|
92
|
+
# @param value [AIXM::XY]
|
77
93
|
attr_reader :xy
|
78
94
|
|
79
|
-
#
|
95
|
+
# Circular base radius.
|
96
|
+
#
|
97
|
+
# @overload radius
|
98
|
+
# @return [AIXM::D]
|
99
|
+
# @overload radius=(value)
|
100
|
+
# @param value [AIXM::D]
|
80
101
|
attr_reader :radius
|
81
102
|
|
82
|
-
#
|
103
|
+
# Elevation of the top point in +:qnh+.
|
104
|
+
#
|
105
|
+
# @overload z
|
106
|
+
# @return [AIXM::Z]
|
107
|
+
# @overload z=(value)
|
108
|
+
# @param value [AIXM::Z]
|
83
109
|
attr_reader :z
|
84
110
|
|
85
|
-
#
|
86
|
-
#
|
111
|
+
# Presence of lighting (e.g. strobes).
|
112
|
+
#
|
113
|
+
# @overload lighting
|
114
|
+
# @return [Boolean, nil] +nil+ means unknown
|
115
|
+
# @overload lighting=(value)
|
116
|
+
# @param value [Boolean, nil] +nil+ means unknown
|
87
117
|
attr_reader :lighting
|
88
118
|
|
89
|
-
#
|
119
|
+
# Detailed description of the lighting.
|
120
|
+
#
|
121
|
+
# @overload lighting_remarks
|
122
|
+
# @return [String, nil]
|
123
|
+
# @overload lighting_remarks=(value)
|
124
|
+
# @param value [String, nil]
|
90
125
|
attr_reader :lighting_remarks
|
91
126
|
|
92
|
-
#
|
93
|
-
#
|
127
|
+
# Presence of marking (e.g. red/white paint).
|
128
|
+
#
|
129
|
+
# @overload marking
|
130
|
+
# @return [Boolean, nil] +nil+ means unknown
|
131
|
+
# @overload marking=(value)
|
132
|
+
# @param value [Boolean, nil] +nil+ means unknown
|
94
133
|
attr_reader :marking
|
95
134
|
|
96
|
-
#
|
135
|
+
# Detailed description of the marking.
|
136
|
+
#
|
137
|
+
# @overload marking_remarks
|
138
|
+
# @return [String nil]
|
139
|
+
# @overload marking_remarks=(value)
|
140
|
+
# @param value [String, nil]
|
97
141
|
attr_reader :marking_remarks
|
98
142
|
|
99
|
-
#
|
143
|
+
# Height from ground to top point.
|
144
|
+
#
|
145
|
+
# @overload height
|
146
|
+
# @return [AIXM::D, nil]
|
147
|
+
# @overload height=(value)
|
148
|
+
# @param value [AIXM::D, nil]
|
100
149
|
attr_reader :height
|
101
150
|
|
102
|
-
#
|
103
|
-
#
|
151
|
+
# Height accuracy.
|
152
|
+
#
|
153
|
+
# @overload height_accurate
|
154
|
+
# @return [Boolean, nil] +nil+ means unknown
|
155
|
+
# @overload height_accurate=(value)
|
156
|
+
# @param value [Boolean, nil] +nil+ means unknown
|
104
157
|
attr_reader :height_accurate
|
105
158
|
|
106
|
-
#
|
159
|
+
# Margin of error for circular base center point.
|
160
|
+
#
|
161
|
+
# @overload xy_accuracy
|
162
|
+
# @return [AIXM::D, nil]
|
163
|
+
# @overload xy_accuracy=(value)
|
164
|
+
# @param value [AIXM::D, nil]
|
107
165
|
attr_reader :xy_accuracy
|
108
166
|
|
109
|
-
#
|
167
|
+
# Margin of error for top point.
|
168
|
+
#
|
169
|
+
# @overload z_accuracy
|
170
|
+
# @return [AIXM::D, nil]
|
171
|
+
# @overload z_accuracy=(value)
|
172
|
+
# @param value [AIXM::D, nil]
|
110
173
|
attr_reader :z_accuracy
|
111
174
|
|
112
|
-
#
|
175
|
+
# Effective after this point in time.
|
176
|
+
#
|
177
|
+
# @overload valid_from
|
178
|
+
# @return [Time, Date, String, nil]
|
179
|
+
# @overload valid_from=(value)
|
180
|
+
# @param value [Time, Date, String, nil]
|
113
181
|
attr_reader :valid_from
|
114
182
|
|
115
|
-
#
|
183
|
+
# Effective until this point in time.
|
184
|
+
#
|
185
|
+
# @overload valid_until
|
186
|
+
# @return [Time, Date, String, nil]
|
187
|
+
# @overload valid_until=(value)
|
188
|
+
# @param value [Time, Date, String, nil]
|
116
189
|
attr_reader :valid_until
|
117
190
|
|
118
|
-
#
|
119
|
-
|
120
|
-
|
121
|
-
# @return [Symbol, nil] another obstacle to which a physical link exists
|
191
|
+
# Another obstacle to which a physical link exists.
|
192
|
+
#
|
193
|
+
# @return [AIXM::Feature::Obstacle, nil]
|
122
194
|
attr_reader :linked_to
|
123
195
|
|
124
|
-
#
|
196
|
+
# Type of physical link between this and another obstacle.
|
197
|
+
#
|
198
|
+
# @return [Symbol, nil] any of {LINK_TYPES}
|
125
199
|
attr_reader :link_type
|
126
200
|
|
201
|
+
# See the {cheat sheet}[AIXM::Feature::Obstacle] for examples on how to
|
202
|
+
# create instances of this class.
|
127
203
|
def initialize(source: nil, region: nil, name: nil, type:, xy:, z:, radius: nil)
|
128
204
|
super(source: source, region: region)
|
129
205
|
self.name, self.type, self.xy, self.z, self.radius = name, type, xy, z, radius
|
@@ -205,10 +281,6 @@ module AIXM
|
|
205
281
|
@valid_until = value&.to_time
|
206
282
|
end
|
207
283
|
|
208
|
-
def remarks=(value)
|
209
|
-
@remarks = value&.to_s
|
210
|
-
end
|
211
|
-
|
212
284
|
def linked_to=(value)
|
213
285
|
fail(ArgumentError, "invalid linked to") unless value.is_a?(AIXM::Feature::Obstacle)
|
214
286
|
@linked_to = value
|
@@ -220,12 +292,16 @@ module AIXM
|
|
220
292
|
end
|
221
293
|
private :link_type=
|
222
294
|
|
223
|
-
#
|
295
|
+
# Whether part of an obstacle group.
|
296
|
+
#
|
297
|
+
# @return [Boolean]
|
224
298
|
def grouped?
|
225
299
|
obstacle_group && obstacle_group.obstacles.count > 1
|
226
300
|
end
|
227
301
|
|
228
|
-
#
|
302
|
+
# Whether obstacle is linked to another one.
|
303
|
+
#
|
304
|
+
# @return [Boolean]
|
229
305
|
def linked?
|
230
306
|
!!linked_to
|
231
307
|
end
|
@@ -40,6 +40,7 @@ module AIXM
|
|
40
40
|
class ObstacleGroup < Feature
|
41
41
|
include AIXM::Association
|
42
42
|
include AIXM::Memoize
|
43
|
+
include AIXM::Concerns::Remarks
|
43
44
|
|
44
45
|
public_class_method :new
|
45
46
|
|
@@ -78,9 +79,8 @@ module AIXM
|
|
78
79
|
end
|
79
80
|
end
|
80
81
|
|
81
|
-
#
|
82
|
-
|
83
|
-
|
82
|
+
# See the {cheat sheet}[AIXM::Feature::ObstacleGroup] for examples on how
|
83
|
+
# to create instances of this class.
|
84
84
|
def initialize(source: nil, region: nil, name: nil)
|
85
85
|
super(source: source, region: region)
|
86
86
|
self.name = name
|
@@ -106,10 +106,6 @@ module AIXM
|
|
106
106
|
@z_accuracy = value
|
107
107
|
end
|
108
108
|
|
109
|
-
def remarks=(value)
|
110
|
-
@remarks = value&.to_s
|
111
|
-
end
|
112
|
-
|
113
109
|
# @return [String] UID markup
|
114
110
|
def to_uid
|
115
111
|
builder = Builder::XmlMarkup.new(indent: 2)
|
@@ -20,6 +20,7 @@ module AIXM
|
|
20
20
|
class Organisation < Feature
|
21
21
|
include AIXM::Association
|
22
22
|
include AIXM::Memoize
|
23
|
+
include AIXM::Concerns::Remarks
|
23
24
|
|
24
25
|
public_class_method :new
|
25
26
|
|
@@ -36,29 +37,41 @@ module AIXM
|
|
36
37
|
}.freeze
|
37
38
|
|
38
39
|
# @!method members
|
39
|
-
# @return [Array<AIXM::Feature::Airport,
|
40
|
-
# AIXM::Feature::Unit,
|
40
|
+
# @return [Array<AIXM::Feature::Airport, AIXM::Feature::Unit,
|
41
41
|
# AIXM::Feature::NavigationalAid>] aiports, units or navigational aids
|
42
42
|
#
|
43
43
|
# @!method add_member(member)
|
44
|
-
# @param member [AIXM::Feature::Airport,
|
45
|
-
# AIXM::Feature::Unit,
|
44
|
+
# @param member [AIXM::Feature::Airport, AIXM::Feature::Unit,
|
46
45
|
# AIXM::Feature::NavigationalAid]
|
47
46
|
# @return [self]
|
48
47
|
has_many :members, accept: [:airport, :unit, 'AIXM::Feature::NavigationalAid']
|
49
48
|
|
50
|
-
#
|
49
|
+
# Name of organisation (e.g. "FRANCE")
|
50
|
+
#
|
51
|
+
# @overload name
|
52
|
+
# @return [String]
|
53
|
+
# @overload name=(value)
|
54
|
+
# @param value [String]
|
51
55
|
attr_reader :name
|
52
56
|
|
53
|
-
#
|
57
|
+
# Type of organisation
|
58
|
+
#
|
59
|
+
# @overload type
|
60
|
+
# @return [Symbol] any of {TYPES}
|
61
|
+
# @overload type=(value)
|
62
|
+
# @param value [Symbol] any of {TYPES}
|
54
63
|
attr_reader :type
|
55
64
|
|
56
|
-
#
|
65
|
+
# Code of the organisation (e.g. "LF")
|
66
|
+
#
|
67
|
+
# @overload id
|
68
|
+
# @return [String, nil]
|
69
|
+
# @overload id=(value)
|
70
|
+
# @param value [String, nil]
|
57
71
|
attr_reader :id
|
58
72
|
|
59
|
-
#
|
60
|
-
|
61
|
-
|
73
|
+
# See the {cheat sheet}[AIXM::Feature::Organisation] for examples on how to
|
74
|
+
# create instances of this class.
|
62
75
|
def initialize(source: nil, region: nil, name:, type:)
|
63
76
|
super(source: source, region: region)
|
64
77
|
self.name, self.type = name, type
|
@@ -83,10 +96,6 @@ module AIXM
|
|
83
96
|
@id = value&.upcase
|
84
97
|
end
|
85
98
|
|
86
|
-
def remarks=(value)
|
87
|
-
@remarks = value&.to_s
|
88
|
-
end
|
89
|
-
|
90
99
|
# @return [String] UID markup
|
91
100
|
def to_uid
|
92
101
|
builder = Builder::XmlMarkup.new(indent: 2)
|
data/lib/aixm/feature/unit.rb
CHANGED
@@ -23,6 +23,7 @@ module AIXM
|
|
23
23
|
class Unit < Feature
|
24
24
|
include AIXM::Association
|
25
25
|
include AIXM::Memoize
|
26
|
+
include AIXM::Concerns::Remarks
|
26
27
|
|
27
28
|
public_class_method :new
|
28
29
|
|
@@ -95,15 +96,24 @@ module AIXM
|
|
95
96
|
# @return [AIXM::Feature::Airport, nil] airport
|
96
97
|
belongs_to :airport
|
97
98
|
|
98
|
-
#
|
99
|
+
# Name of unit (e.g. "MARSEILLE ACS")
|
100
|
+
#
|
101
|
+
# @overload name
|
102
|
+
# @return [String]
|
103
|
+
# @overload name=(value)
|
104
|
+
# @param value [String]
|
99
105
|
attr_reader :name
|
100
106
|
|
101
|
-
#
|
107
|
+
# Type of unit
|
108
|
+
#
|
109
|
+
# @overload type
|
110
|
+
# @return [Symbol] any of {TYPES}
|
111
|
+
# @overload type=(value)
|
112
|
+
# @param value [Symbol] any of {TYPES}
|
102
113
|
attr_reader :type
|
103
114
|
|
104
|
-
#
|
105
|
-
|
106
|
-
|
115
|
+
# See the {cheat sheet}[AIXM::Feature::Unit] for examples on how to create
|
116
|
+
# instances of this class.
|
107
117
|
def initialize(source: nil, region: nil, organisation:, name:, type:, class:)
|
108
118
|
super(source: source, region: region)
|
109
119
|
self.organisation, self.name, self.type = organisation, name, type
|
@@ -124,9 +134,15 @@ module AIXM
|
|
124
134
|
@type = TYPES.lookup(value&.to_s&.to_sym, nil) || fail(ArgumentError, "invalid type")
|
125
135
|
end
|
126
136
|
|
127
|
-
#
|
137
|
+
# Class of unit.
|
138
|
+
#
|
128
139
|
# @note Use +Object#__class__+ alias to query the Ruby object class.
|
129
|
-
#
|
140
|
+
#
|
141
|
+
# @!attribute class
|
142
|
+
# @overload class
|
143
|
+
# @return [Symbol] any of {CLASSES}
|
144
|
+
# @overload class=(value)
|
145
|
+
# @param value [Symbol] any of {CLASSES}
|
130
146
|
def class
|
131
147
|
@klass
|
132
148
|
end
|
@@ -135,10 +151,6 @@ module AIXM
|
|
135
151
|
@klass = CLASSES.lookup(value&.to_s&.to_sym, nil) || fail(ArgumentError, "invalid class")
|
136
152
|
end
|
137
153
|
|
138
|
-
def remarks=(value)
|
139
|
-
@remarks = value&.to_s
|
140
|
-
end
|
141
|
-
|
142
154
|
# @return [String] UID markup
|
143
155
|
def to_uid
|
144
156
|
builder = Builder::XmlMarkup.new(indent: 2)
|
data/lib/aixm/feature.rb
CHANGED
@@ -2,17 +2,31 @@ module AIXM
|
|
2
2
|
|
3
3
|
# @abstract
|
4
4
|
class Feature
|
5
|
+
include AIXM::Concerns::HashEquality
|
6
|
+
|
5
7
|
REGION_RE = /\A[A-Z]{2}\z/.freeze
|
6
8
|
|
7
9
|
private_class_method :new
|
8
10
|
|
9
|
-
#
|
11
|
+
# Freely usable e.g. to find_by foreign keys.
|
12
|
+
#
|
13
|
+
# @return [Object]
|
10
14
|
attr_accessor :meta
|
11
15
|
|
12
|
-
#
|
16
|
+
# Reference to source of the feature data.
|
17
|
+
#
|
18
|
+
# @overload source
|
19
|
+
# @return [String]
|
20
|
+
# @overload source=(value)
|
21
|
+
# @param value [String]
|
13
22
|
attr_reader :source
|
14
23
|
|
15
|
-
#
|
24
|
+
# OFMX region all features in this document belong to.
|
25
|
+
#
|
26
|
+
# @overload region
|
27
|
+
# @return [String]
|
28
|
+
# @overload region=(value)
|
29
|
+
# @param value [String]
|
16
30
|
attr_reader :region
|
17
31
|
|
18
32
|
def initialize(source: nil, region: nil)
|
@@ -30,10 +44,15 @@ module AIXM
|
|
30
44
|
@region = value&.upcase
|
31
45
|
end
|
32
46
|
|
33
|
-
# @
|
47
|
+
# @see Object#==
|
34
48
|
def ==(other)
|
35
49
|
self.__class__ === other && self.to_uid == other.to_uid
|
36
50
|
end
|
51
|
+
|
52
|
+
# @see Object#eql?
|
53
|
+
def hash
|
54
|
+
[self.__class__, to_uid].hash
|
55
|
+
end
|
37
56
|
end
|
38
57
|
|
39
58
|
end
|
data/lib/aixm/memoize.rb
CHANGED
@@ -79,8 +79,8 @@ module AIXM
|
|
79
79
|
@cache = {}
|
80
80
|
end
|
81
81
|
|
82
|
-
def method(method, &)
|
83
|
-
send(:"call_with#{:out if cached?(method)}_cache", method, &)
|
82
|
+
def method(method, &block) # TODO: [ruby-3.1] use anonymous block "&" on this and next line
|
83
|
+
send(:"call_with#{:out if cached?(method)}_cache", method, &block)
|
84
84
|
end
|
85
85
|
|
86
86
|
private
|
@@ -99,7 +99,7 @@ module AIXM
|
|
99
99
|
ensure
|
100
100
|
cache.delete(method)
|
101
101
|
end
|
102
|
-
|
103
102
|
end
|
103
|
+
|
104
104
|
end
|
105
105
|
end
|
data/lib/aixm/p.rb
CHANGED
@@ -7,6 +7,7 @@ module AIXM
|
|
7
7
|
# @example
|
8
8
|
# AIXM.d(14, :bar)
|
9
9
|
class P
|
10
|
+
include AIXM::Concerns::HashEquality
|
10
11
|
include Comparable
|
11
12
|
extend Forwardable
|
12
13
|
|
@@ -18,16 +19,29 @@ module AIXM
|
|
18
19
|
torr: { p: 133.322, mpa: 0.000133322, psi: 0.019336721305636, bar: 0.00133322 }
|
19
20
|
}.freeze
|
20
21
|
|
22
|
+
# Whether pressure is zero.
|
23
|
+
#
|
21
24
|
# @!method zero?
|
22
|
-
#
|
25
|
+
# @return [Boolean]
|
23
26
|
def_delegator :@pres, :zero?
|
24
27
|
|
25
|
-
#
|
28
|
+
# Pressure
|
29
|
+
#
|
30
|
+
# @overload pres
|
31
|
+
# @return [Float]
|
32
|
+
# @overload pres=(value)
|
33
|
+
# @param value [Float]
|
26
34
|
attr_reader :pres
|
27
35
|
|
28
|
-
#
|
36
|
+
# Unit
|
37
|
+
#
|
38
|
+
# @overload unit
|
39
|
+
# @return [Symbol] any of {UNITS}
|
40
|
+
# @overload unit=(value)
|
41
|
+
# @param value [Symbol] any of {UNITS}
|
29
42
|
attr_reader :unit
|
30
43
|
|
44
|
+
# See the {overview}[AIXM::P] for examples.
|
31
45
|
def initialize(pres, unit)
|
32
46
|
self.pres, self.unit = pres, unit
|
33
47
|
end
|
@@ -53,13 +67,14 @@ module AIXM
|
|
53
67
|
fail(ArgumentError, "invalid unit") unless UNITS.has_key? @unit
|
54
68
|
end
|
55
69
|
|
70
|
+
# Convert pressure
|
71
|
+
#
|
56
72
|
# @!method to_p
|
57
73
|
# @!method to_mpa
|
58
74
|
# @!method to_psi
|
59
75
|
# @!method to_bar
|
60
76
|
# @!method to_torr
|
61
|
-
#
|
62
|
-
# @return [AIXM::P] convert pressure
|
77
|
+
# @return [AIXM::P] converted pressure
|
63
78
|
UNITS.each_key do |target_unit|
|
64
79
|
define_method "to_#{target_unit}" do
|
65
80
|
return self if unit == target_unit
|
@@ -68,22 +83,13 @@ module AIXM
|
|
68
83
|
end
|
69
84
|
|
70
85
|
# @see Object#<=>
|
71
|
-
# @return [Integer]
|
72
86
|
def <=>(other)
|
73
87
|
pres <=> other.send(:"to_#{unit}").pres
|
74
88
|
end
|
75
89
|
|
76
90
|
# @see Object#==
|
77
|
-
# @return [Boolean]
|
78
91
|
def ==(other)
|
79
92
|
self.class === other && (self <=> other).zero?
|
80
93
|
end
|
81
|
-
alias_method :eql?, :==
|
82
|
-
|
83
|
-
# @see Object#hash
|
84
|
-
# @return [Integer]
|
85
|
-
def hash
|
86
|
-
to_s.hash
|
87
|
-
end
|
88
94
|
end
|
89
95
|
end
|
data/lib/aixm/payload_hash.rb
CHANGED
@@ -16,7 +16,8 @@ module AIXM
|
|
16
16
|
class PayloadHash
|
17
17
|
IGNORED_ATTRIBUTES = %w(mid source).freeze
|
18
18
|
|
19
|
-
# @param fragment [Nokogiri::XML::DocumentFragment, Nokogiri::XML::Element,
|
19
|
+
# @param fragment [Nokogiri::XML::DocumentFragment, Nokogiri::XML::Element,
|
20
|
+
# String] XML fragment
|
20
21
|
def initialize(fragment)
|
21
22
|
@fragment = case fragment
|
22
23
|
when Nokogiri::XML::DocumentFragment then fragment
|
@@ -25,7 +26,9 @@ module AIXM
|
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
#
|
29
|
+
# UUIDv3
|
30
|
+
#
|
31
|
+
# @return [String]
|
29
32
|
def to_uuid
|
30
33
|
uuid_for payload_array
|
31
34
|
end
|
data/lib/aixm/r.rb
CHANGED
@@ -8,13 +8,25 @@ module AIXM
|
|
8
8
|
# AIXM.r(AIXM.d(25, :m), AIXM.d(20, :m)) # rectangle
|
9
9
|
# AIXM.r(AIXM.d(25, :m)) # square
|
10
10
|
class R
|
11
|
+
include AIXM::Concerns::HashEquality
|
11
12
|
|
12
|
-
#
|
13
|
+
# Rectangle length
|
14
|
+
#
|
15
|
+
# @overload length
|
16
|
+
# @return [AIXM::D]
|
17
|
+
# @overload length=(value)
|
18
|
+
# @param value [AIXM::D]
|
13
19
|
attr_reader :length
|
14
20
|
|
15
|
-
#
|
21
|
+
# Rectangle width
|
22
|
+
#
|
23
|
+
# @overload width
|
24
|
+
# @return [AIXM::D]
|
25
|
+
# @overload width=(value)
|
26
|
+
# @param value [AIXM::D]
|
16
27
|
attr_reader :width
|
17
28
|
|
29
|
+
# See the {overview}[AIXM::R] for examples.
|
18
30
|
def initialize(length, width=nil)
|
19
31
|
self.length, self.width = length, (width || length)
|
20
32
|
end
|
@@ -37,7 +49,7 @@ module AIXM
|
|
37
49
|
end
|
38
50
|
end
|
39
51
|
|
40
|
-
# Calculate the surface in square meters
|
52
|
+
# Calculate the surface in square meters.
|
41
53
|
#
|
42
54
|
# @return [Float]
|
43
55
|
def surface
|
@@ -45,18 +57,9 @@ module AIXM
|
|
45
57
|
end
|
46
58
|
|
47
59
|
# @see Object#==
|
48
|
-
# @return [Boolean]
|
49
60
|
def ==(other)
|
50
61
|
self.class === other && length == other.length && width == other.width
|
51
62
|
end
|
52
|
-
alias_method :eql?, :==
|
53
|
-
|
54
|
-
# @see Object#hash
|
55
|
-
# @return [Integer]
|
56
|
-
def hash
|
57
|
-
to_s.hash
|
58
|
-
end
|
59
63
|
|
60
64
|
end
|
61
|
-
|
62
65
|
end
|
data/lib/aixm/refinements.rb
CHANGED
@@ -128,8 +128,30 @@ module AIXM
|
|
128
128
|
# @note This is a refinement for +Object+
|
129
129
|
# @return [Object]
|
130
130
|
refine Object do
|
131
|
-
def then_if(condition, &)
|
132
|
-
condition ? self.then(&) : self
|
131
|
+
def then_if(condition, &block) # TODO: [ruby-3.1] use anonymous block "&" on this and next line
|
132
|
+
condition ? self.then(&block) : self
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# @!method Range.from
|
137
|
+
# Returns a Range covering the given object.
|
138
|
+
#
|
139
|
+
# To ease coverage tests in mixed arrays of single objects and object
|
140
|
+
# ranges, this method assures you're always dealing with objects. It
|
141
|
+
# returns self if it is already a Range, otherwise builds one with the
|
142
|
+
# given single object as both beginning and end.
|
143
|
+
#
|
144
|
+
# @example
|
145
|
+
# Range.from(5) # => (5..5)
|
146
|
+
# Range.from(1..3) # => (1..3)
|
147
|
+
#
|
148
|
+
# @note This is a refinement for +Range+
|
149
|
+
# @param object [Object]
|
150
|
+
# @return [Range]
|
151
|
+
#refine Range do
|
152
|
+
refine Range.singleton_class do
|
153
|
+
def from(object)
|
154
|
+
object.is_a?(Range) ? object : (object..object)
|
133
155
|
end
|
134
156
|
end
|
135
157
|
|
@@ -140,6 +162,7 @@ module AIXM
|
|
140
162
|
# /^(foo)(?<name>bar)/.decapture # => /^(?:foo)(?:bar)/
|
141
163
|
#
|
142
164
|
# @note This is a refinement for +Regexp+
|
165
|
+
# @return [Regexp]
|
143
166
|
refine Regexp do
|
144
167
|
def decapture
|
145
168
|
Regexp.new(to_s.gsub(/\(\?<\w+>|(?<![^\\]\\)\((?!\?)/, '(?:'))
|
@@ -154,6 +177,7 @@ module AIXM
|
|
154
177
|
# # => AIXM::Feature::NavigationalAid
|
155
178
|
#
|
156
179
|
# @note This is a refinement for +String+
|
180
|
+
# @return [Class]
|
157
181
|
refine String do
|
158
182
|
def to_class
|
159
183
|
Object.const_get(self)
|
@@ -170,6 +194,7 @@ module AIXM
|
|
170
194
|
#
|
171
195
|
# @see https://www.rubydoc.info/gems/dry-inflector
|
172
196
|
# @note This is a refinement for +String+
|
197
|
+
# @return [String]
|
173
198
|
refine String do
|
174
199
|
def inflect(*inflections)
|
175
200
|
inflections.inject(self) do |memo, inflection|
|
@@ -178,6 +203,21 @@ module AIXM
|
|
178
203
|
end
|
179
204
|
end
|
180
205
|
|
206
|
+
# @!method compact
|
207
|
+
# Collapse whitespace to one space, but leave +\n+ untouched, then strip
|
208
|
+
# what's left.
|
209
|
+
#
|
210
|
+
# @example
|
211
|
+
# " foo\n\nbar baz \r".compact # => "foo\n\nbar baz"
|
212
|
+
#
|
213
|
+
# @note This is a refinement for +String+
|
214
|
+
# @return [String] compacted string
|
215
|
+
refine String do
|
216
|
+
def compact
|
217
|
+
split("\n").map { _1.gsub(/\s+/, ' ') }.join("\n").strip
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
181
221
|
# @!method indent(number)
|
182
222
|
# Indent every line of a string with +number+ spaces.
|
183
223
|
#
|