validate_xml_xsi 0.2.4 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4252059ac1bc3c6ae4aa11ca57703dea71d54a107483129d76955f371a6b56b7
4
- data.tar.gz: a1c8bf3d962e546e85d8a39a156d562144df7b12a6c38724e74d264287ac304c
3
+ metadata.gz: aeccb816b7e38de2b2cc3b29dd0f3035e56f8bf2190f9d1281ae11ec73573efb
4
+ data.tar.gz: '0953d2190b837f8b692b468c3e06d77c55cad671a03ed4eaf2e7219e31013cc3'
5
5
  SHA512:
6
- metadata.gz: dbc3ee5c3c8d136b280b8bf7414934c4b8d1e18b2f6ae37a92ff5314bd1ce9028528c69876c64b52ebe8a3d54ed579255c7de327118e5ebaf6b73ccea4b02af1
7
- data.tar.gz: d1524cf149f1439ecab4215100de7718465b5a7147796382ecaf42fd08a63030a584bfe6c39d0f46cf298c07f1128b885f75c78dfe3c0d4566a1a0f47ae4a97c
6
+ metadata.gz: 323fc0b7cd7b322ff35c72dd77ae1b33b5aee6b5bed953ed7b3e965cc7924bb98c36145a2296e279a6c6e208c9aa056e33809f00f3e9272d15b898425bc3e407
7
+ data.tar.gz: 8d79a528c2fb9172b2d0d29bcd10f67d241a792fba510b613eed501645d73cb137ed3ba0af0223b5b4cd3510025268184a42e487810428b196d17664778501a1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v0.2.4
2
+
3
+ * Fix some silly syntax errors
4
+
1
5
  ## v0.2.3
2
6
 
3
7
  * Rename XML_XSI::Schema::parse_schema to just XML_XSI::Schema::parse
data/bin/validate_xml_xsi CHANGED
@@ -3,7 +3,7 @@ require 'validate_xml_xsi'
3
3
 
4
4
  while ARGV.size > 0
5
5
  fname = ARGV.shift
6
- errors = XML_XSI::Schema::validate(fname)
6
+ errors = XML_XSI::Schema::new(XML_XSI.parse(fname)).validate
7
7
  if errors.empty?
8
8
  puts "XML Schema check complete - NO ERRORS!"
9
9
  else
@@ -14,32 +14,52 @@ class XML_XSI
14
14
  class Schema
15
15
  class DocumentError < StandardError; end
16
16
  class ValidationError < StandardError
17
- Params = [:type, :file, :line, :column, :message, :err]
18
- attr_reader *Params, :description
19
- def initialize(*args)
20
- Params.each.with_index { |param, idx| instance_variable_set("@#{param.to_s}", args[idx]) }
21
- @description = "#{@type.to_s} ERROR [#{@file}:#{@line}:#{@column}]: #{@message}".freeze
17
+ attr_reader :type, :file, :line, :column, :level, :message, :description, :error
18
+ def initialize(type, err, filename = nil)
19
+ @type = type
20
+ @error = err
21
+ @file = filename.nil? ? @error.file : filename
22
+ @line = @error.line
23
+ @column = @error.column
24
+ if /((?:ERROR)|(?:WARNING)): /.match(@error.message)
25
+ @level = $1
26
+ @message = $'
27
+ @description = "#{@type.to_s} #{@level.to_s} [#{@file}:#{@line}:#{@column}]: #{@message}".freeze
28
+ else
29
+ @level = ''
30
+ @message = @error.message
31
+ @description = "#{@type.to_s} #{@message}".freeze
32
+ end
22
33
  super(@description)
23
34
  end
24
35
  end
25
36
 
26
- def self.parse(xml_doc)
37
+ attr_reader :xsd
38
+ def initialize(xml_doc)
27
39
  unless xml_doc.is_a?(Nokogiri::XML::Document)
28
- raise DocumentError.new("not a Nokogiri::XML::Document (class: #{xml_doc.class.name})!")
40
+ raise DocumentError.new("invalid Nokogiri::XML::Document - #{xml_doc.class.name}")
41
+ end
42
+ @document = xml_doc
43
+ ## Determine default/top/root namespace
44
+ target_ns_href = nil
45
+ @document.namespaces.each do |ns_prefix, ns_href|
46
+ target_ns_href = ns_href if ns_prefix.nil? || ns_prefix.empty? || ns_prefix.eql?('xmlns')
29
47
  end
48
+ raise DocumentError.new("Unable to determine default (xmlns) namespace!") if target_ns_href.nil? || target_ns_href.empty?
30
49
  ## Build an all-in-one XSD document that imports all of the separate schema locations
31
- xsd_doc = "<?xml version=\"1.0\"?>\n"
32
- xsd_doc << "<xsd:schema targetNamespace=\"http://www.w3.orig/XML/1998/namespace\"\n" \
33
- " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" \
50
+ @xsd = "<?xml version=\"1.0\"?>\n"
51
+ @xsd << "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" \
52
+ " targetNamespace=\"#{target_ns_href}\"\n" \
34
53
  " version=\"1.0\">\n"
54
+ ## Include the default xml namespace
55
+ schemata_by_ns = {}
35
56
  ## Iterate over all the elements and find any xsi:schemaLocation attributes
36
57
  ## and build a hash of all of the namespaces and locations
37
- schemata_by_ns = {}
38
- xml_doc.search('//*[@xsi:schemaLocation]').each do |elem|
58
+ @document.search('//*[@xsi:schemaLocation]').each do |elem|
39
59
  elem['xsi:schemaLocation'].scan(/(\S+)\s+(\S+)/).each do |ns_set|
40
60
  if ns_loc = schemata_by_ns[ns_set.first]
41
61
  unless ns_loc.eql?(ns_set.last)
42
- raise DocumentError.new("MISMATCHING XMLNS XSI: #{ns_set.first} -> #{ns_loc} VS #{ns_set.last}")
62
+ raise DocumentError.new("MISMATCHING namespace: #{ns_set.first} -> #{ns_loc} VS #{ns_set.last}")
43
63
  end
44
64
  else
45
65
  schemata_by_ns[ns_set.first] = ns_set.last
@@ -47,28 +67,25 @@ class XML_XSI
47
67
  end
48
68
  end
49
69
  schemata_by_ns.each do |ns_href, ns_file|
50
- xsd_doc << " <xsd:import namespace=\"#{ns_href}\" schemaLocation=\"#{ns_file}\"/>\n"
70
+ @xsd << (ns_href.eql?(target_ns_href) ?
71
+ " <xsd:include schemaLocation=\"#{ns_file}\"/>\n" :
72
+ " <xsd:import namespace=\"#{ns_href}\" schemaLocation=\"#{ns_file}\"/>\n")
51
73
  end
52
- xsd_doc << "</xsd:schema>\n"
53
- Nokogiri::XML::Schema.new(xsd_doc)
74
+ @xsd << "</xsd:schema>\n"
75
+
76
+ ## Create the Schema objects
77
+ @schema = Nokogiri::XML::Schema.new(@xsd)
54
78
  end
55
79
 
56
- def self.validate(xml_doc, xsd = nil)
57
- xml_doc = XML_XSI::parse(xml_doc) unless xml_doc.is_a?(Nokogiri::XML::Document)
80
+ def validate
58
81
  errors = []
59
- unless xsd.nil? || xsd.is_a?(Nokogiri::XML::Schema)
60
- raise DocumentError.new("Invalid XSD - not a Nokogiri::XML::Schema (class: #{xsd.class.name})!")
61
- end
62
- xsd = self.parse(xml_doc) if xsd.nil?
63
- xsd.errors.each do |err|
64
- err_msg = (/ERROR: /.match(err.message)) ? $' : err.message
65
- errors << ValidationError.new(:XSD, err.file, err.line, err.column, err_msg, err)
82
+ @schema.errors.each do |err|
83
+ errors << ValidationError.new(:XSD, err)
66
84
  end
67
- errs = xsd.validate(xml_doc)
85
+ errs = @schema.validate(@document)
68
86
  errs.each do |err|
69
- err_msg = (/ERROR: /.match(err.message)) ? $' : err.message
70
- fname = (err.file.nil?) ? xml_doc.filename : err.file
71
- errors << ValidationError.new(:XML, fname, err.line, err.column, err_msg, err)
87
+ fname = (err.file.nil?) ? @document.filename : err.file
88
+ errors << ValidationError.new(:XML, err, fname)
72
89
  end
73
90
  errors
74
91
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "validate_xml_xsi"
3
- spec.version = "0.2.4"
3
+ spec.version = "0.3.0"
4
4
  spec.authors = ["David Hansen"]
5
5
  spec.email = ["david@hansen4.net"]
6
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validate_xml_xsi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Hansen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-21 00:00:00.000000000 Z
11
+ date: 2022-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler