aixm 1.3.1 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c4dd1d553f6bf8c1f704cd521b14f26e89dc1161d065b82fd867fde1a556d97e
4
- data.tar.gz: 9fcba185054638267827d2e7a5eec09e849d237738455ec1bd9bb1cbabbabf5f
3
+ metadata.gz: 49f4c417f17321e81579c5ec2f63e94e95e3e5b466def5304051e508aac0db04
4
+ data.tar.gz: 78dcbe01cde6c2eac9bf49ed2f8828a96f1ea112393e2730e2e2a902177ee0b3
5
5
  SHA512:
6
- metadata.gz: 0ab5bd974c993d0813e550c129040c6fac9f2d31f787f428e3582aef9486d1a2e95983dca76c822be9b621c97fe87c0263d571e92a485b0a3f9b2af76a7a6d0b
7
- data.tar.gz: 2969d03eb3bf308ad19fd481c1ca5244525848a5802eea3b9d4a999bb3feeb826ef483dbfdec23b567a2e326a3704fe1c45a61a74825cd0483bc4bfb2c7e9b97
6
+ metadata.gz: f6901fd3474f200ef670161e5377c550c882e9adbc24fd34c3a790b6ca7c44157f5509ee737c85ad10187ce93acaba7b81635e385b461944f5cbf29436f522f5
7
+ data.tar.gz: 9a204bb3611c4405252dfff814ab5d10f628b85936067ccf10358786446ad719c25753cb1a9d8aafb26540311034e6c6c30994cad96fe44a73807ce847fe14ef
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  Nothing so far
4
4
 
5
+ ## 1.3.3
6
+
7
+ #### Changes
8
+ * Extend `ckmid` and `mkmid` to accept multiple files and globbing.
9
+
10
+ ## 1.3.2
11
+
12
+ #### Changes
13
+ * Add `#pred` (aliased `#prev`) and `#succ` (alias `#next`) to both
14
+ `AIXM::Date` and `AIXM::Day` in order to use them for iterations
15
+ * Pretty print generic features only to prevent segfaults on large documents
16
+
5
17
  ## 1.3.1
6
18
 
7
19
  #### Changes
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![Version](https://img.shields.io/gem/v/aixm.svg?style=flat)](https://rubygems.org/gems/aixm)
2
- [![Tests](https://img.shields.io/github/workflow/status/svoop/aixm/Test.svg?style=flat&label=tests)](https://github.com/svoop/aixm/actions?workflow=Test)
2
+ [![Tests](https://img.shields.io/github/actions/workflow/status/svoop/aixm/test.yml?style=flat&label=tests)](https://github.com/svoop/aixm/actions?workflow=Test)
3
3
  [![Code Climate](https://img.shields.io/codeclimate/maintainability/svoop/aixm.svg?style=flat)](https://codeclimate.com/github/svoop/aixm/)
4
4
  [![Donorbox](https://img.shields.io/badge/donate-on_donorbox-yellow.svg)](https://donorbox.org/bitcetera)
5
5
 
@@ -291,7 +291,7 @@ By `using AIXM::Refinements` you get a few handy [extensions to Ruby core classe
291
291
 
292
292
  ### mkmid
293
293
 
294
- The `mkmid` executable reads an OFMX file, adds [OFMX-compliant `mid` values](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid) into all `*Uid` elements and validates the result against the schema.
294
+ The `mkmid` executable reads OFMX files, adds [OFMX-compliant `mid` values](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid) into all `*Uid` elements and validates the result against the schema.
295
295
 
296
296
  ```
297
297
  mkmid --help
@@ -299,7 +299,7 @@ mkmid --help
299
299
 
300
300
  ### ckmid
301
301
 
302
- The `chmid` executable reads an OFMX file, validates it against the schema and checks all `mid` attributes for [OFMX-compliance](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid).
302
+ The `chmid` executable reads OFMX files, validates them against the schema and checks all `mid` attributes for [OFMX-compliance](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid).
303
303
 
304
304
  ```
305
305
  ckmid --help
@@ -10,11 +10,11 @@ module AIXM
10
10
  # @yield [Nokogiri::XML::Builder]
11
11
  # @return [Nokogiri::XML::DocumentFragment]
12
12
  def build_fragment
13
- Nokogiri::XML::DocumentFragment.parse('').tap do |document|
14
- Nokogiri::XML::Builder.with(document) do |fragment|
15
- yield fragment
13
+ Nokogiri::XML::DocumentFragment.parse('').tap do |fragment|
14
+ Nokogiri::XML::Builder.with(fragment) do |builder|
15
+ yield builder
16
16
  end
17
- document.elements.each { _1.add_next_sibling("\n") } # add newline between tags on top level
17
+ fragment.elements.each { _1.add_next_sibling("\n") } # add newline between tags on top level
18
18
  end
19
19
  end
20
20
 
data/lib/aixm/document.rb CHANGED
@@ -168,10 +168,13 @@ module AIXM
168
168
  effective: @effective_at.xmlschema,
169
169
  expiration: (@expiration_at&.xmlschema if AIXM.ofmx?)
170
170
  }.compact
171
- Nokogiri::XML::Builder.new do |builder|
171
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |builder|
172
172
  builder.send(AIXM.schema(:root), meta) do |root|
173
+ root.text("\n")
173
174
  AIXM::Concerns::Memoize.method :to_uid do
174
- features.each { _1.add_to(root) }
175
+ # TODO: indent is lost if added directly to the builder
176
+ # features.each { _1.add_to(root) }
177
+ features.each { root << _1.to_xml.indent(2) }
175
178
  end
176
179
  if AIXM.ofmx? && AIXM.config.mid
177
180
  AIXM::PayloadHash::Mid.new(builder.doc).insert_mid
@@ -182,7 +185,7 @@ module AIXM
182
185
 
183
186
  # @return [String] AIXM or OFMX markup
184
187
  def to_xml
185
- document.pretty.to_xml
188
+ document.to_xml
186
189
  end
187
190
  end
188
191
  end
@@ -8,36 +8,37 @@ module AIXM
8
8
  @options = options
9
9
  OptionParser.new do |o|
10
10
  o.banner = <<~END
11
- Add mid attributes to a schema valid OFMX file.
12
- Usage: #{File.basename($0)} infile.ofmx
11
+ Add mid attributes to OFMX files.
12
+ Usage: #{File.basename($0)} files
13
13
  END
14
14
  o.on('-i', '--[no-]in-place', 'overwrite file instead of dumping to STDOUT (default: false)') { @options[:in_place] = _1 }
15
15
  o.on('-f', '--[no-]force', 'ignore XML schema validation errors (default: false)') { @options[:force] = _1 }
16
16
  o.on('-A', '--about', 'show author/license information and exit') { AIXM::Executables.about }
17
17
  o.on('-V', '--version', 'show version and exit') { AIXM::Executables.version }
18
18
  end.parse!
19
- @infile = ARGV.shift
19
+ @files = ARGV
20
20
  end
21
21
 
22
22
  def run
23
- fail 'cannot read file' unless @infile && File.readable?(@infile)
24
- fail 'file ist not OFMX' unless @infile.match?(/\.ofmx$/)
25
- AIXM.ofmx!
26
- document = File.open(@infile) { Nokogiri::XML(_1) }
27
- AIXM::PayloadHash::Mid.new(document).insert_mid
28
- errors = Nokogiri::XML::Schema(File.open(AIXM.schema(:xsd))).validate(document)
29
- case
30
- when errors.any? && !@options[:force]
31
- puts errors
32
- fail "OFMX file is not schema valid"
33
- when @options[:in_place]
34
- File.write(@infile, document.to_xml)
35
- else
36
- puts document.to_xml
23
+ @files.each do |file|
24
+ fail "cannot read #{file}" unless file && File.readable?(file)
25
+ fail "#{file} is not OFMX" unless file.match?(/\.ofmx$/)
26
+ AIXM.ofmx!
27
+ document = File.open(file) { Nokogiri::XML(_1) }
28
+ AIXM::PayloadHash::Mid.new(document).insert_mid
29
+ errors = Nokogiri::XML::Schema(File.open(AIXM.schema(:xsd))).validate(document)
30
+ case
31
+ when errors.any? && !@options[:force]
32
+ fail (["#{file} is not valid..."] + errors).join("\n")
33
+ when @options[:in_place]
34
+ File.write(file, document.to_xml)
35
+ else
36
+ puts document.to_xml
37
+ end
38
+ rescue => error
39
+ puts "ERROR: #{error.message}"
40
+ exit 1
37
41
  end
38
- rescue => error
39
- puts "ERROR: #{error.message}"
40
- exit 1
41
42
  end
42
43
  end
43
44
 
@@ -45,29 +46,31 @@ module AIXM
45
46
  def initialize(**options)
46
47
  OptionParser.new do |o|
47
48
  o.banner = <<~END
48
- Check mid attributes of an OFMX file.
49
- Usage: #{File.basename($0)} infile.ofmx
49
+ Check mid attributes of OFMX files.
50
+ Usage: #{File.basename($0)} files
50
51
  END
51
52
  o.on('-A', '--about', 'show author/license information and exit') { AIXM::Executables.about }
52
53
  o.on('-V', '--version', 'show version and exit') { AIXM::Executables.version }
53
54
  end.parse!
54
- @infile = ARGV.shift
55
+ @files = ARGV
55
56
  end
56
57
 
57
58
  def run
58
- fail 'cannot read file' unless @infile && File.readable?(@infile)
59
- fail 'file ist not OFMX' unless @infile.match?(/\.ofmx$/)
60
- AIXM.ofmx!
61
- document = File.open(@infile) { Nokogiri::XML(_1) }
62
- errors = Nokogiri::XML::Schema(File.open(AIXM.schema(:xsd))).validate(document)
63
- errors += AIXM::PayloadHash::Mid.new(document).check_mid
64
- if errors.any?
65
- puts errors
66
- fail "OFMX file has errors"
67
- end
68
- rescue => error
69
- puts "ERROR: #{error.message}"
70
- exit 1
59
+ exit(
60
+ @files.reduce(true) do |success, file|
61
+ fail "cannot read #{file}" unless file && File.readable?(file)
62
+ fail "#{file} is not OFMX" unless file.match?(/\.ofmx$/)
63
+ AIXM.ofmx!
64
+ document = File.open(file) { Nokogiri::XML(_1) }
65
+ errors = Nokogiri::XML::Schema(File.open(AIXM.schema(:xsd))).validate(document)
66
+ errors += AIXM::PayloadHash::Mid.new(document).check_mid
67
+ fail (["#{file} is not valid..."] + errors).join("\n") if errors.any?
68
+ success && true
69
+ rescue RuntimeError => error
70
+ puts "ERROR: #{error.message}"
71
+ false
72
+ end
73
+ )
71
74
  end
72
75
  end
73
76
 
@@ -59,7 +59,7 @@ module AIXM
59
59
  element['region'] ||= region if element.name.match?(/Uid$/)
60
60
  end
61
61
  end
62
- builder << decorated_fragment.to_xml
62
+ builder << decorated_fragment.to_pretty_xml
63
63
  end
64
64
  end
65
65
 
@@ -129,33 +129,32 @@ module AIXM
129
129
  end
130
130
  end
131
131
 
132
- # @!method pretty
133
- # Transform the XML document to be pretty when sending +to_xml+
132
+ # @!method to_pretty_xml
133
+ # Pretty printing alternative of +to_xml+
134
134
  #
135
135
  # @example
136
136
  # xml = <<~END
137
- # <xml><aaa> AAA </aaa>
137
+ # <aaa></aaa>
138
138
  # <bbb/>
139
- # <ccc foo="bar" >
140
- # CCC
141
- # </ccc>
142
- # </xml>
139
+ # <ccc foo="bar" >
140
+ # <ddd>
141
+ # </ddd>
142
+ # </ccc>
143
143
  # END
144
- # Nokogiri.XML(xml).pretty.to_xml
145
- # # => <?xml version=\"1.0\" encoding=\"UTF-8\"?>
146
- # <xml>
147
- # <aaa> AAA </aaa>
148
- # <bbb/>
149
- # <ccc foo="bar">
150
- # CCC
151
- # </ccc>
152
- # </xml>
153
- #
154
- # @note This is a refinement for +Nokogiri::XML::Document+
155
- # @return [Nokogiri::XML::Document]
156
- refine Nokogiri::XML::Document do
157
- def pretty
158
- PRETTY_XSLT.transform(self)
144
+ # Nokogiri::XML::DocumentFragment.parse(xml).to_pretty_xml
145
+ # # => <aaa/>
146
+ # <bbb/>
147
+ # <ccc foo="bar">
148
+ # <ddd/>
149
+ # </ccc>
150
+ #
151
+ # @note This is a refinement for +Nokogiri::XML::DocumentFragment+
152
+ # @return [String]
153
+ refine Nokogiri::XML::DocumentFragment do
154
+ def to_pretty_xml
155
+ builder = Nokogiri::XML::Builder.new
156
+ builder.DocumentFragment { _1 << self.to_html }
157
+ AIXM::Refinements::PRETTY_XSLT.transform(builder.doc).at_css('DocumentFragment').children.map(&:to_xml).join("\n")
159
158
  end
160
159
  end
161
160
 
@@ -84,16 +84,20 @@ module AIXM
84
84
  end
85
85
 
86
86
  # Create new date one day prior to this one.
87
- def prev
87
+ #
88
+ # @return [AIXM::Schedule::Date]
89
+ def pred
88
90
  self.class.new(date.prev_day.to_s.sub(/^-/, '')).at(year: (YEARLESS_YEAR if yearless?))
89
91
  end
92
+ alias_method :prev, :pred
90
93
 
91
94
  # Create new date one day after this one.
92
95
  #
93
96
  # @return [AIXM::Schedule::Date]
94
- def next
97
+ def succ
95
98
  self.class.new(date.next_day).at(year: (YEARLESS_YEAR if yearless?))
96
99
  end
100
+ alias_method :next, :succ
97
101
 
98
102
  # Calculate difference in days between two dates.
99
103
  #
@@ -13,8 +13,8 @@ module AIXM
13
13
  include AIXM::Concerns::HashEquality
14
14
  include Comparable
15
15
 
16
- DAYS = %i(sunday monday tuesday wednesday thursday friday saturday workday day_preceding_workday day_following_workday holiday day_preceding_holiday day_following_holiday any).freeze
17
- SORTABLE_DAYS = DAYS[0, 7]
16
+ WEEKDAYS = %i(sunday monday tuesday wednesday thursday friday saturday).freeze
17
+ DAYS = (WEEKDAYS + %i(workday day_preceding_workday day_following_workday holiday day_preceding_holiday day_following_holiday any)).freeze
18
18
 
19
19
  # Day of the week or special named day
20
20
  #
@@ -31,7 +31,7 @@ module AIXM
31
31
  self.day = day
32
32
  when Integer
33
33
  fail ArgumentError unless day.between?(0, 6)
34
- self.day = SORTABLE_DAYS[day]
34
+ self.day = WEEKDAYS[day]
35
35
  else
36
36
  fail ArgumentError
37
37
  end
@@ -44,10 +44,37 @@ module AIXM
44
44
  day.to_s.gsub('_', ' ')
45
45
  end
46
46
 
47
+ # Symbol used to initialize this day
48
+ #
49
+ # @return [Symbol]
50
+ def to_sym
51
+ day.to_s.to_sym
52
+ end
53
+
47
54
  def inspect
48
55
  %Q(#<#{self.class} #{to_s}>)
49
56
  end
50
57
 
58
+ # Create new day one day prior to this one.
59
+ #
60
+ # @return [AIXM::Schedule::Day]
61
+ def pred
62
+ return self if any?
63
+ fail(TypeError, "can't iterate from #{day}") unless wday
64
+ self.class.new(WEEKDAYS[wday.pred % 7])
65
+ end
66
+ alias_method :prev, :pred
67
+
68
+ # Create new day one day after this one.
69
+ #
70
+ # @return [AIXM::Schedule::Day]
71
+ def succ
72
+ return self if any?
73
+ fail(TypeError, "can't iterate from #{day}") unless wday
74
+ self.class.new(WEEKDAYS[wday.succ % 7])
75
+ end
76
+ alias_method :next, :succ
77
+
51
78
  # Whether two days are equal.
52
79
  #
53
80
  # @return [Boolean]
@@ -71,7 +98,7 @@ module AIXM
71
98
  #
72
99
  # @return [Boolean]
73
100
  def sortable?
74
- SORTABLE_DAYS.include? day
101
+ WEEKDAYS.include? day
75
102
  end
76
103
 
77
104
  # Whether this schedule day falls within the given range of schedule
@@ -104,6 +131,10 @@ module AIXM
104
131
  fail ArgumentError unless DAYS.include? @day
105
132
  end
106
133
 
134
+ def wday
135
+ WEEKDAYS.index(day.to_sym)
136
+ end
137
+
107
138
  # @note Necessary to use this class in Range.
108
139
  def <=>(other)
109
140
  DAYS.index(day) <=> DAYS.index(other.day) || day.to_s <=> other.to_s
data/lib/aixm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module AIXM
2
- VERSION = "1.3.1".freeze
2
+ VERSION = "1.3.3".freeze
3
3
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aixm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Schwyn
@@ -29,7 +29,7 @@ cert_chain:
29
29
  kAyiRqgxF4dJviwtqI7mZIomWL63+kXLgjOjMe1SHxfIPo/0ji6+r1p4KYa7o41v
30
30
  fwIwU1MKlFBdsjkd
31
31
  -----END CERTIFICATE-----
32
- date: 2022-11-06 00:00:00.000000000 Z
32
+ date: 2023-01-05 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: nokogiri
@@ -312,7 +312,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
312
  - !ruby/object:Gem::Version
313
313
  version: '0'
314
314
  requirements: []
315
- rubygems_version: 3.3.25
315
+ rubygems_version: 3.4.2
316
316
  signing_key:
317
317
  specification_version: 4
318
318
  summary: Builder for AIXM/OFMX aeronautical information
metadata.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- Z���%ى��Z�0�~2[}O-'�B<Rg�WG��Rf
2
- ���(����@B!�NB~�d,��� ~��q4Q7W�w�VE`fwA�`r(e=���P��J�
1
+ ���Yw�����c� +˥wZ�I9��~T������%�+-��uF0���V������ �
2
+ ��\��% {����5�&x��vy����٤R?J$�O�/� 9�?��IC��D��:Ho�@q"��E��YC��̅;\^�7�XZD2�_O�����Ĝ;.{���:�.�u��n�ۛw�$7��vo�{���.�?CO] ��