From 0e3c787d422076e199a0c930d0c025397e01b847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=85=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 25 Apr 2024 22:48:31 +0200 Subject: [PATCH] Fix resolving schemas with unprefixed namespace --- lib/xsd/base_object.rb | 2 +- .../commons/Types.xsd | 297 ++++++++++++++++++ .../retail_license_notification/scheme.xsd | 106 +++++++ spec/xsd/schema_spec.rb | 12 + 4 files changed, 416 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/retail_license_notification/commons/Types.xsd create mode 100644 spec/fixtures/retail_license_notification/scheme.xsd diff --git a/lib/xsd/base_object.rb b/lib/xsd/base_object.rb index 6809c7f..9ecc57b 100644 --- a/lib/xsd/base_object.rb +++ b/lib/xsd/base_object.rb @@ -77,7 +77,7 @@ def nodes(name = :*, deep = false) # @return Array def schemas_for_namespace(ns_or_prefix) # resolve namespace for current node if prefix was provided - prefix = node.namespaces["xmlns:#{ns_or_prefix}"] + prefix = node.namespaces[['xmlns', (ns_or_prefix == '' ? nil : ns_or_prefix)].compact.join(':')] ns = prefix || ns_or_prefix if schema.targets_namespace?(ns) diff --git a/spec/fixtures/retail_license_notification/commons/Types.xsd b/spec/fixtures/retail_license_notification/commons/Types.xsd new file mode 100644 index 0000000..ac6d30a --- /dev/null +++ b/spec/fixtures/retail_license_notification/commons/Types.xsd @@ -0,0 +1,297 @@ + + + + + + + Номер + + + + + Дата + + + + + + + число с ограничением длины до 2 цифр + + + + + + + + число с ограничением длины до 25 цифр + + + + + + + + текст длиной до 20 символов + + + + + + + + текст длиной до 12 символов + + + + + + + + текст длиной до 400 символов + + + + + + + + текст длиной до 50 символов + + + + + + + + текст длиной до 255 символов + + + + + + + + число с ограничением длины до 1 цифр + + + + + + + + число с ограничением длины до 3 цифр + + + + + + + + число с ограничением длины до 9 цифр + + + + + + + + число с ограничением длины до 10 цифр + + + + + + + + число с ограничением длины до 13 цифр + + + + + + + + число с ограничением длины до 15 цифр + + + + + + + + число с ограничением длины до 12 цифр + + + + + + + + текст длиной до 9 символов + + + + + + + + текст длиной до 10 символов + + + + + + + + текст длиной до 100 символов + + + + + + + + текст длиной до 1000 символов + + + + + + + + текст длиной до 10000 символов + + + + + + + + текст длиной до 15 символов + + + + + + + + текст длиной до 19 символов + + + + + + + + текст длиной до 25 символов + + + + + + + + текст длиной до 200 символов + + + + + + + + текст длиной до 2000 символов + + + + + + + + текст длиной до 250 символов + + + + + + + + текст длиной до 254 символов + + + + + + + + текст длиной до 30 символов + + + + + + + + текст длиной до 32 символов + + + + + + + + текст длиной до 300 символов + + + + + + + + текст длиной до 4 символов + + + + + + + + текст длиной до 40 символов + + + + + + + + текст длиной до 4000 символов + + + + + + + + текст длиной до 500 символов + + + + + + + + текст длиной до 64 символов + + + + + + + + текст длиной до 900 символов + + + + + + diff --git a/spec/fixtures/retail_license_notification/scheme.xsd b/spec/fixtures/retail_license_notification/scheme.xsd new file mode 100644 index 0000000..b2f78df --- /dev/null +++ b/spec/fixtures/retail_license_notification/scheme.xsd @@ -0,0 +1,106 @@ + + + + + + + Направление уведомления о необходимости устранения выявленных нарушений + + + + + + Направление уведомления об устранении выявленных нарушений + + + + + + + + Заявление + + + + + Уведомление о необходимости устранения выявленных нарушений + + + + + Приложенные документы + + + + + + + + + Наименование файла + + + + + Наименование документа + + + + + Тип содержимого файла + + + + + + + + + + + + + + + Заявление + + + + + Уведомление об устранении выявленных нарушений + + + + + + Приложенные документы + + + + + + + + + Наименование файла + + + + + Наименование документа + + + + + Тип содержимого файла + + + + + + + + + + + diff --git a/spec/xsd/schema_spec.rb b/spec/xsd/schema_spec.rb index 9a41113..18a06d5 100644 --- a/spec/xsd/schema_spec.rb +++ b/spec/xsd/schema_spec.rb @@ -104,6 +104,18 @@ end end + context 'with retail_license_notification example file' do + subject(:schema) { reader.schema } + let(:file) { fixture_file(%w[retail_license_notification scheme.xsd], read: false) } + + describe '#schemas_for_namespace' do + it 'gets schema for unprefixed namespace' do + expect(schema.schemas_for_namespace('').first.target_namespace).to eq('urn://fsrar/smev/retail_license_notification/types/1.0.0') + expect(schema.object_by_name('complexType', 'DocumentType').name).to eq('DocumentType') + end + end + end + # context 'with mvd example files' do # subject(:schema) do # wsdl = Wasabi.document(fixture_file(%w[mvd service.wsdl]))