aixm 0.3.3 → 0.3.4

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -2
  4. data/CHANGELOG.md +20 -0
  5. data/README.md +7 -2
  6. data/aixm.gemspec +2 -3
  7. data/lib/aixm.rb +6 -2
  8. data/lib/aixm/a.rb +151 -0
  9. data/lib/aixm/component/frequency.rb +2 -2
  10. data/lib/aixm/component/geometry.rb +4 -0
  11. data/lib/aixm/component/geometry/point.rb +0 -4
  12. data/lib/aixm/component/helipad.rb +8 -22
  13. data/lib/aixm/component/runway.rb +36 -36
  14. data/lib/aixm/component/surface.rb +121 -0
  15. data/lib/aixm/component/timetable.rb +1 -0
  16. data/lib/aixm/constants.rb +40 -0
  17. data/lib/aixm/d.rb +5 -0
  18. data/lib/aixm/document.rb +2 -2
  19. data/lib/aixm/f.rb +6 -0
  20. data/lib/aixm/feature/address.rb +100 -0
  21. data/lib/aixm/feature/airport.rb +26 -7
  22. data/lib/aixm/feature/airspace.rb +10 -1
  23. data/lib/aixm/feature/navigational_aid.rb +1 -1
  24. data/lib/aixm/feature/navigational_aid/designated_point.rb +20 -5
  25. data/lib/aixm/feature/navigational_aid/dme.rb +2 -2
  26. data/lib/aixm/{component → feature}/service.rb +67 -16
  27. data/lib/aixm/feature/unit.rb +40 -6
  28. data/lib/aixm/refinements.rb +63 -6
  29. data/lib/aixm/shortcuts.rb +12 -4
  30. data/lib/aixm/version.rb +1 -1
  31. data/lib/aixm/xy.rb +6 -1
  32. data/lib/aixm/z.rb +6 -0
  33. data/schemas/ofmx/0/OFMX-DataTypes.xsd +5 -2
  34. data/schemas/ofmx/0/OFMX-Features.xsd +2 -0
  35. data/spec/factory.rb +32 -10
  36. data/spec/lib/aixm/a_spec.rb +203 -0
  37. data/spec/lib/aixm/component/helipad_spec.rb +11 -17
  38. data/spec/lib/aixm/component/runway_spec.rb +46 -32
  39. data/spec/lib/aixm/component/surface_spec.rb +88 -0
  40. data/spec/lib/aixm/d_spec.rb +10 -0
  41. data/spec/lib/aixm/document_spec.rb +104 -32
  42. data/spec/lib/aixm/f_spec.rb +10 -0
  43. data/spec/lib/aixm/feature/address_spec.rb +55 -0
  44. data/spec/lib/aixm/feature/airport_spec.rb +73 -3
  45. data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +43 -6
  46. data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +2 -2
  47. data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +2 -2
  48. data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +2 -2
  49. data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +2 -2
  50. data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +6 -6
  51. data/spec/lib/aixm/{component → feature}/service_spec.rb +12 -14
  52. data/spec/lib/aixm/feature/unit_spec.rb +7 -4
  53. data/spec/lib/aixm/refinements_spec.rb +100 -15
  54. data/spec/lib/aixm/z_spec.rb +10 -0
  55. metadata +17 -25
  56. data/lib/aixm/h.rb +0 -87
  57. data/spec/lib/aixm/h_spec.rb +0 -113
@@ -83,9 +83,10 @@ describe AIXM::Feature::Unit do
83
83
  </AhpUid>
84
84
  <codeType>TWR</codeType>
85
85
  <codeClass>ICAO</codeClass>
86
- <txtRmk>A/A FR only</txtRmk>
86
+ <txtRmk>FR only</txtRmk>
87
87
  </Uni>
88
- <Ser>
88
+ <!-- Service: AFIS by PUJAUT TWR -->
89
+ <Ser source="LF|GEN|0.0 FACTORY|0|0">
89
90
  <SerUid>
90
91
  <UniUid>
91
92
  <txtName>PUJAUT TWR</txtName>
@@ -124,7 +125,8 @@ describe AIXM::Feature::Unit do
124
125
  <codeLang>FR</codeLang>
125
126
  </Cdl>
126
127
  </Fqy>
127
- <Ser>
128
+ <!-- Service: AFIS by PUJAUT TWR -->
129
+ <Ser source="LF|GEN|0.0 FACTORY|0|0">
128
130
  <SerUid>
129
131
  <UniUid>
130
132
  <txtName>PUJAUT TWR</txtName>
@@ -163,7 +165,8 @@ describe AIXM::Feature::Unit do
163
165
  <codeLang>FR</codeLang>
164
166
  </Cdl>
165
167
  </Fqy>
166
- <Ser>
168
+ <!-- Service: APP by PUJAUT TWR -->
169
+ <Ser source="LF|GEN|0.0 FACTORY|0|0">
167
170
  <SerUid>
168
171
  <UniUid>
169
172
  <txtName>PUJAUT TWR</txtName>
@@ -155,6 +155,32 @@ describe AIXM::Refinements do
155
155
  end
156
156
  end
157
157
 
158
+ context Regexp do
159
+ describe :decapture do
160
+ it "should replace capture groups with non-capture groups" do
161
+ /(foo) baz (bar)/.decapture.must_equal /(?-mix:(?:foo) baz (?:bar))/
162
+ /(foo) baz (bar)/i.decapture.must_equal /(?i-mx:(?:foo) baz (?:bar))/
163
+ end
164
+
165
+ it "should replace named capture groups with non-capture groups" do
166
+ /(?<a>foo) baz (?<b>bar)/.decapture.must_equal /(?-mix:(?:foo) baz (?:bar))/
167
+ /(?<a>foo) baz (?<b>bar)/i.decapture.must_equal /(?i-mx:(?:foo) baz (?:bar))/
168
+ end
169
+
170
+ it "should not replace special groups" do
171
+ /(?:foo) (?<=baz) bar/.decapture.must_equal /(?-mix:(?:foo) (?<=baz) bar)/
172
+ end
173
+
174
+ it "should not replace literal round brackets" do
175
+ /\(foo\)/.decapture.must_equal /(?-mix:\(foo\))/
176
+ end
177
+
178
+ it "should replace literal backslash followed by literal round brackets" do
179
+ /\\(foo\\)/.decapture.must_equal /(?-mix:\\(?:foo\\))/
180
+ end
181
+ end
182
+ end
183
+
158
184
  context String do
159
185
  describe :indent do
160
186
  it "must indent single line string" do
@@ -167,77 +193,137 @@ describe AIXM::Refinements do
167
193
  end
168
194
  end
169
195
 
196
+ describe :payload_hash do
197
+ subject do
198
+ <<~END
199
+ <?xml version="1.0" encoding="utf-8"?>
200
+ <OFMX-Snapshot region="LF">
201
+ <Ser type="essential" active="true">
202
+ <SerUid>
203
+ <UniUid>
204
+ <txtName>STRASBOURG APP</txtName>
205
+ </UniUid>
206
+ <codeType version="1" subversion="2">APP</codeType>
207
+ <noSeq>1</noSeq>
208
+ </SerUid>
209
+ <Stt priority="1">
210
+ <codeWorkHr>H24</codeWorkHr>
211
+ </Stt>
212
+ <Stt priority="2">
213
+ <codeWorkHr>HX</codeWorkHr>
214
+ </Stt>
215
+ <txtRmk>aka STRASBOURG approche</txtRmk>
216
+ </Ser>
217
+ </OFMX-Snapshot>
218
+ END
219
+ end
220
+
221
+ it "must calculate the hash" do
222
+ subject.payload_hash(region: 'LF', element: 'Ser').must_equal "269b1f18-cabe-3c9e-1d71-48a7414a4cb9"
223
+ end
224
+ end
225
+
170
226
  describe :to_dd do
171
227
  it "must convert +6.2 DMS to DD" do
228
+ %q(12°34'56.78"N).to_dd.must_equal 12.58243888888889
172
229
  %q(12°34'56.78").to_dd.must_equal 12.58243888888889
230
+ %q(12°34'56.78'').to_dd.must_equal 12.58243888888889
173
231
  %q(12 34 56.78).to_dd.must_equal 12.58243888888889
174
- %q(123456.78).to_dd.must_equal 12.58243888888889
232
+ %q(123456.78N).to_dd.must_equal 12.58243888888889
175
233
  end
176
234
 
177
235
  it "must convert -6.2 DMS to DD" do
236
+ %q(12°34'56.78"S).to_dd.must_equal(-12.58243888888889)
178
237
  %q(-12°34'56.78").to_dd.must_equal(-12.58243888888889)
179
238
  %q(-12 34 56.78).to_dd.must_equal(-12.58243888888889)
180
- %q(-123456.78).to_dd.must_equal(-12.58243888888889)
239
+ %q(123456.78S).to_dd.must_equal(-12.58243888888889)
181
240
  end
182
241
 
183
242
  it "must convert +7.2 DMS to DD" do
243
+ %q(111°22'33.44"N).to_dd.must_equal 111.37595555555555
184
244
  %q(111°22'33.44").to_dd.must_equal 111.37595555555555
185
245
  %q(111 22 33.44).to_dd.must_equal 111.37595555555555
186
- %q(1112233.44).to_dd.must_equal 111.37595555555555
246
+ %q(1112233.44N).to_dd.must_equal 111.37595555555555
187
247
  end
188
248
 
189
249
  it "must convert -7.2 DMS to DD" do
250
+ %q(111°22'33.44"S).to_dd.must_equal(-111.37595555555555)
190
251
  %q(-111°22'33.44").to_dd.must_equal(-111.37595555555555)
191
252
  %q(-111 22 33.44).to_dd.must_equal(-111.37595555555555)
192
- %q(-1112233.44).to_dd.must_equal(-111.37595555555555)
253
+ %q(1112233.44S).to_dd.must_equal(-111.37595555555555)
193
254
  end
194
255
 
195
256
  it "must convert +6.1 DMS to DD" do
257
+ %q(12°34'56.7"N).to_dd.must_equal 12.582416666666667
196
258
  %q(12°34'56.7").to_dd.must_equal 12.582416666666667
197
259
  %q(12 34 56.7).to_dd.must_equal 12.582416666666667
198
- %q(123456.7).to_dd.must_equal 12.582416666666667
260
+ %q(123456.7N).to_dd.must_equal 12.582416666666667
199
261
  end
200
262
 
201
263
  it "must convert -6.1 DMS to DD" do
264
+ %q(12°34'56.7"S).to_dd.must_equal(-12.582416666666667)
202
265
  %q(-12°34'56.7").to_dd.must_equal(-12.582416666666667)
203
266
  %q(-12 34 56.7).to_dd.must_equal(-12.582416666666667)
204
- %q(-123456.7).to_dd.must_equal(-12.582416666666667)
267
+ %q(123456.7S).to_dd.must_equal(-12.582416666666667)
205
268
  end
206
269
 
207
270
  it "must convert +7.1 DMS to DD" do
271
+ %q(111°22'33.4"N).to_dd.must_equal 111.37594444444444
208
272
  %q(111°22'33.4").to_dd.must_equal 111.37594444444444
209
273
  %q(111 22 33.4).to_dd.must_equal 111.37594444444444
210
- %q(1112233.4).to_dd.must_equal 111.37594444444444
274
+ %q(1112233.4N).to_dd.must_equal 111.37594444444444
211
275
  end
212
276
 
213
- it "must convert +7.1 DMS to DD" do
277
+ it "must convert -7.1 DMS to DD" do
278
+ %q(111°22'33.4"S).to_dd.must_equal(-111.37594444444444)
214
279
  %q(-111°22'33.4").to_dd.must_equal(-111.37594444444444)
215
280
  %q(-111 22 33.4).to_dd.must_equal(-111.37594444444444)
216
- %q(-1112233.4).to_dd.must_equal(-111.37594444444444)
281
+ %q(1112233.4S).to_dd.must_equal(-111.37594444444444)
217
282
  end
218
283
 
219
284
  it "must convert +6.0 DMS to DD" do
285
+ %q(12°34'56"N).to_dd.must_equal 12.582222222222223
220
286
  %q(12°34'56").to_dd.must_equal 12.582222222222223
221
287
  %q(12 34 56).to_dd.must_equal 12.582222222222223
222
- %q(123456).to_dd.must_equal 12.582222222222223
288
+ %q(123456N).to_dd.must_equal 12.582222222222223
223
289
  end
224
290
 
225
291
  it "must convert -6.0 DMS to DD" do
292
+ %q(12°34'56"S).to_dd.must_equal(-12.582222222222223)
226
293
  %q(-12°34'56").to_dd.must_equal(-12.582222222222223)
227
294
  %q(-12 34 56).to_dd.must_equal(-12.582222222222223)
228
- %q(-123456).to_dd.must_equal(-12.582222222222223)
295
+ %q(123456S).to_dd.must_equal(-12.582222222222223)
229
296
  end
230
297
 
231
298
  it "must convert +7.0 DMS to DD" do
299
+ %q(111°22'33"N).to_dd.must_equal 111.37583333333333
232
300
  %q(111°22'33").to_dd.must_equal 111.37583333333333
233
301
  %q(111 22 33).to_dd.must_equal 111.37583333333333
234
- %q(1112233).to_dd.must_equal 111.37583333333333
302
+ %q(1112233N).to_dd.must_equal 111.37583333333333
235
303
  end
236
304
 
237
- it "must convert +7.0 DMS to DD" do
305
+ it "must convert -7.0 DMS to DD" do
306
+ %q(111°22'33"S).to_dd.must_equal(-111.37583333333333)
238
307
  %q(-111°22'33").to_dd.must_equal(-111.37583333333333)
239
308
  %q(-111 22 33).to_dd.must_equal(-111.37583333333333)
240
- %q(-1112233).to_dd.must_equal(-111.37583333333333)
309
+ %q(1112233S).to_dd.must_equal(-111.37583333333333)
310
+ end
311
+
312
+ it "must convert all cardinal directions to DD" do
313
+ %q(111°22'33.44"N).to_dd.must_equal 111.37595555555555
314
+ %q(111°22'33.44"E).to_dd.must_equal 111.37595555555555
315
+ %q(111°22'33.44"S).to_dd.must_equal -111.37595555555555
316
+ %q(111°22'33.44"W).to_dd.must_equal -111.37595555555555
317
+ end
318
+
319
+ it "must ignore minor typos when converting to DD" do
320
+ %q(111°22'33,44"N).to_dd.must_equal 111.37595555555555
321
+ %q(111°22'33.44"n).to_dd.must_equal 111.37595555555555
322
+ %q(111°22"33.44"N).to_dd.must_equal 111.37595555555555
323
+ %q(111°22'33.44'N).to_dd.must_equal 111.37595555555555
324
+ %q(111°22'33.44" N).to_dd.must_equal 111.37595555555555
325
+ %q(111° 22' 33.44" N).to_dd.must_equal 111.37595555555555
326
+ %q(-111°22'33.44"S).to_dd.must_equal 111.37595555555555
241
327
  end
242
328
 
243
329
  it "must do all possible roundtrip conversions" do
@@ -276,5 +362,4 @@ describe AIXM::Refinements do
276
362
  end
277
363
  end
278
364
  end
279
-
280
365
  end
@@ -81,4 +81,14 @@ describe AIXM::Z do
81
81
  { subject => true }[dupe].must_equal true
82
82
  end
83
83
  end
84
+
85
+ describe :zero? do
86
+ it "returns true for zero height, elevation or altitude" do
87
+ subject.tap { |s| s.alt = 0 }.must_be :zero?
88
+ end
89
+
90
+ it "returns false for non-zero height, elevation or altitude" do
91
+ subject.tap { |s| s.alt = 1 }.wont_be :zero?
92
+ end
93
+ end
84
94
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aixm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Schwyn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-16 00:00:00.000000000 Z
11
+ date: 2019-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rake
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -169,6 +155,7 @@ files:
169
155
  - Rakefile
170
156
  - aixm.gemspec
171
157
  - lib/aixm.rb
158
+ - lib/aixm/a.rb
172
159
  - lib/aixm/component.rb
173
160
  - lib/aixm/component/frequency.rb
174
161
  - lib/aixm/component/geometry.rb
@@ -179,15 +166,17 @@ files:
179
166
  - lib/aixm/component/helipad.rb
180
167
  - lib/aixm/component/layer.rb
181
168
  - lib/aixm/component/runway.rb
182
- - lib/aixm/component/service.rb
169
+ - lib/aixm/component/surface.rb
183
170
  - lib/aixm/component/timetable.rb
184
171
  - lib/aixm/component/vertical_limits.rb
185
172
  - lib/aixm/config.rb
173
+ - lib/aixm/constants.rb
186
174
  - lib/aixm/d.rb
187
175
  - lib/aixm/document.rb
188
176
  - lib/aixm/errors.rb
189
177
  - lib/aixm/f.rb
190
178
  - lib/aixm/feature.rb
179
+ - lib/aixm/feature/address.rb
191
180
  - lib/aixm/feature/airport.rb
192
181
  - lib/aixm/feature/airspace.rb
193
182
  - lib/aixm/feature/navigational_aid.rb
@@ -200,8 +189,8 @@ files:
200
189
  - lib/aixm/feature/obstacle.rb
201
190
  - lib/aixm/feature/obstacle_group.rb
202
191
  - lib/aixm/feature/organisation.rb
192
+ - lib/aixm/feature/service.rb
203
193
  - lib/aixm/feature/unit.rb
204
- - lib/aixm/h.rb
205
194
  - lib/aixm/refinements.rb
206
195
  - lib/aixm/shortcuts.rb
207
196
  - lib/aixm/version.rb
@@ -216,6 +205,7 @@ files:
216
205
  - schemas/ofmx/0/OFMX-Features.xsd
217
206
  - schemas/ofmx/0/OFMX-Snapshot.xsd
218
207
  - spec/factory.rb
208
+ - spec/lib/aixm/a_spec.rb
219
209
  - spec/lib/aixm/component/frequency_spec.rb
220
210
  - spec/lib/aixm/component/geometry/arc_spec.rb
221
211
  - spec/lib/aixm/component/geometry/border_spec.rb
@@ -225,7 +215,7 @@ files:
225
215
  - spec/lib/aixm/component/helipad_spec.rb
226
216
  - spec/lib/aixm/component/layer_spec.rb
227
217
  - spec/lib/aixm/component/runway_spec.rb
228
- - spec/lib/aixm/component/service_spec.rb
218
+ - spec/lib/aixm/component/surface_spec.rb
229
219
  - spec/lib/aixm/component/timetable_spec.rb
230
220
  - spec/lib/aixm/component/vertical_limits_spec.rb
231
221
  - spec/lib/aixm/config_spec.rb
@@ -233,6 +223,7 @@ files:
233
223
  - spec/lib/aixm/document_spec.rb
234
224
  - spec/lib/aixm/errors_spec.rb
235
225
  - spec/lib/aixm/f_spec.rb
226
+ - spec/lib/aixm/feature/address_spec.rb
236
227
  - spec/lib/aixm/feature/airport_spec.rb
237
228
  - spec/lib/aixm/feature/airspace_spec.rb
238
229
  - spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb
@@ -245,9 +236,9 @@ files:
245
236
  - spec/lib/aixm/feature/obstacle_group_spec.rb
246
237
  - spec/lib/aixm/feature/obstacle_spec.rb
247
238
  - spec/lib/aixm/feature/organisation_spec.rb
239
+ - spec/lib/aixm/feature/service_spec.rb
248
240
  - spec/lib/aixm/feature/unit_spec.rb
249
241
  - spec/lib/aixm/feature_spec.rb
250
- - spec/lib/aixm/h_spec.rb
251
242
  - spec/lib/aixm/refinements_spec.rb
252
243
  - spec/lib/aixm/version_spec.rb
253
244
  - spec/lib/aixm/xy_spec.rb
@@ -272,20 +263,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
272
263
  requirements:
273
264
  - - ">="
274
265
  - !ruby/object:Gem::Version
275
- version: '2.5'
266
+ version: '2.6'
276
267
  required_rubygems_version: !ruby/object:Gem::Requirement
277
268
  requirements:
278
269
  - - ">="
279
270
  - !ruby/object:Gem::Version
280
271
  version: '0'
281
272
  requirements: []
282
- rubyforge_project:
283
- rubygems_version: 2.7.6
273
+ rubygems_version: 3.0.3
284
274
  signing_key:
285
275
  specification_version: 4
286
276
  summary: Aeronautical Information Exchange Model (AIXM 4.5).
287
277
  test_files:
288
278
  - spec/factory.rb
279
+ - spec/lib/aixm/a_spec.rb
289
280
  - spec/lib/aixm/component/frequency_spec.rb
290
281
  - spec/lib/aixm/component/geometry/arc_spec.rb
291
282
  - spec/lib/aixm/component/geometry/border_spec.rb
@@ -295,7 +286,7 @@ test_files:
295
286
  - spec/lib/aixm/component/helipad_spec.rb
296
287
  - spec/lib/aixm/component/layer_spec.rb
297
288
  - spec/lib/aixm/component/runway_spec.rb
298
- - spec/lib/aixm/component/service_spec.rb
289
+ - spec/lib/aixm/component/surface_spec.rb
299
290
  - spec/lib/aixm/component/timetable_spec.rb
300
291
  - spec/lib/aixm/component/vertical_limits_spec.rb
301
292
  - spec/lib/aixm/config_spec.rb
@@ -303,6 +294,7 @@ test_files:
303
294
  - spec/lib/aixm/document_spec.rb
304
295
  - spec/lib/aixm/errors_spec.rb
305
296
  - spec/lib/aixm/f_spec.rb
297
+ - spec/lib/aixm/feature/address_spec.rb
306
298
  - spec/lib/aixm/feature/airport_spec.rb
307
299
  - spec/lib/aixm/feature/airspace_spec.rb
308
300
  - spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb
@@ -315,9 +307,9 @@ test_files:
315
307
  - spec/lib/aixm/feature/obstacle_group_spec.rb
316
308
  - spec/lib/aixm/feature/obstacle_spec.rb
317
309
  - spec/lib/aixm/feature/organisation_spec.rb
310
+ - spec/lib/aixm/feature/service_spec.rb
318
311
  - spec/lib/aixm/feature/unit_spec.rb
319
312
  - spec/lib/aixm/feature_spec.rb
320
- - spec/lib/aixm/h_spec.rb
321
313
  - spec/lib/aixm/refinements_spec.rb
322
314
  - spec/lib/aixm/version_spec.rb
323
315
  - spec/lib/aixm/xy_spec.rb
@@ -1,87 +0,0 @@
1
- using AIXM::Refinements
2
-
3
- module AIXM
4
-
5
- # Heading of an aircraft or runway
6
- #
7
- # @example
8
- # AIXM.h(12)
9
- # AIXM.h('12')
10
- # AIXM.h('34L')
11
- # AIXM.h('05X')
12
- class H
13
- SUFFIX_INVERSIONS = {
14
- R: :L,
15
- L: :R
16
- }.freeze
17
-
18
- # @return [Integer] heading
19
- attr_reader :deg
20
-
21
- # @return [Symbol, nil] suffix
22
- attr_reader :suffix
23
-
24
- def initialize(deg_and_suffix)
25
- fail(ArgumentError, "invalid heading") unless deg_and_suffix.to_s =~ /\A(\d+)([A-Z]+)?\z/
26
- self.deg, self.suffix = $1.to_i, $2
27
- end
28
-
29
- # @return [String]
30
- def inspect
31
- %Q(#<#{self.class} #{to_s}>)
32
- end
33
-
34
- # @return [String] human readable representation (e.g. "05" or "34L")
35
- def to_s
36
- [('%02d' % deg), suffix].map(&:to_s).join
37
- end
38
-
39
- def deg=(value)
40
- fail(ArgumentError, "invalid deg") unless value.between?(1, 36)
41
- @deg = value
42
- end
43
-
44
- def suffix=(value)
45
- fail(ArgumentError, "invalid suffix") unless value.nil? || value.to_s =~ /\A[A-Z]+\z/
46
- @suffix = value&.to_s&.to_sym
47
- end
48
-
49
- # Invert a heading by 180 degrees
50
- #
51
- # @example
52
- # AIXM.h('12').invert # => AIXM.h(30)
53
- # AIXM.h('34L').invert # => AIXM.h(16, 'R')
54
- # AIXM.h('33X').invert # => AIXM.h(17, 'bravo')
55
- #
56
- # @return [AIXM::H] inverted heading
57
- def invert
58
- AIXM.h([(((deg + 17) % 36) + 1), SUFFIX_INVERSIONS.fetch(suffix, suffix)].join)
59
- end
60
-
61
- # Check whether +other+ heading is the inverse
62
- #
63
- # @example
64
- # AIXM.h('12').inverse_of? AIXM.h('30') # => true
65
- # AIXM.h('34L').inverse_of? AIXM.h('16R') # => true
66
- # AIXM.h('16R').inverse_of? AIXM.h('16L') # => false
67
- #
68
- # @return [AIXM::H] inverted heading
69
- def inverse_of?(other)
70
- invert == other
71
- end
72
-
73
- # @see Object#==
74
- # @return [Boolean]
75
- def ==(other)
76
- self.class === other && deg == other.deg && suffix == other.suffix
77
- end
78
- alias_method :eql?, :==
79
-
80
- # @see Object#hash
81
- # @return [Integer]
82
- def hash
83
- to_s.hash
84
- end
85
- end
86
-
87
- end