libxml-ruby 3.2.2-x64-mingw-ucrt → 3.2.3-x64-mingw-ucrt
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 +4 -4
- data/HISTORY +11 -0
- data/ext/libxml/ruby_xml.c +4 -0
- data/ext/libxml/ruby_xml_namespace.c +1 -0
- data/ext/libxml/ruby_xml_node.c +8 -4
- data/ext/libxml/ruby_xml_schema.c +151 -79
- data/ext/libxml/ruby_xml_schema.h +2 -5
- data/ext/libxml/ruby_xml_schema_attribute.c +23 -71
- data/ext/libxml/ruby_xml_schema_element.c +28 -54
- data/ext/libxml/ruby_xml_schema_facet.c +15 -21
- data/ext/libxml/ruby_xml_schema_type.c +19 -37
- data/ext/libxml/ruby_xml_version.h +3 -3
- data/lib/{3.1 → 3.0}/libxml_ruby.so +0 -0
- data/test/model/shiporder.rnc +2 -2
- data/test/model/shiporder.rng +2 -2
- data/test/model/shiporder.xsd +7 -3
- data/test/model/shiporder_bad.xsd +40 -0
- data/test/model/shiporder_import.xsd +45 -0
- data/test/test_schema.rb +92 -29
- metadata +5 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9799bff3bd887553e6882fb39836631745e457c9a6bfecd04e17bfa06c7a8d76
         | 
| 4 | 
            +
              data.tar.gz: 2869f54529062336d64ceb53e78f8771eecfafe6e6caf83bb8c648a85628944e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: f5e8c1ad556b60a29f94a384bca45069ef5e12c677cd84cc9d158d4fb1690e89aaf583a3ce52e79a99e2a53f14be43b5a1fa99931a267c838be9b23b2a2f11a2
         | 
| 7 | 
            +
              data.tar.gz: 64bca753b8cae3ffb7e4a38160e0ebc83a6e0c826f741baf11ea6de51efc94a6057ed1ed7487e7bdee2ee9f11a38644b476c4c9d0855b134d9d50eba6dddda47
         | 
    
        data/HISTORY
    CHANGED
    
    | @@ -1,5 +1,16 @@ | |
| 1 1 | 
             
            = Release History
         | 
| 2 2 |  | 
| 3 | 
            +
            == 3.2.3 / 2022-05-22
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Change some getter methods to instance variables with attr_accessors for easier debuggability (David Hansen)
         | 
| 6 | 
            +
            * Add a number of tests related to schemas  (David Hansen)
         | 
| 7 | 
            +
            * Add schema.imported_elements so we can find imported elements (David Hansen)
         | 
| 8 | 
            +
            * Fix segfault under windows when dereferencing a pre-existing error where the node has already been freed (David Hansen)
         | 
| 9 | 
            +
            * Update to change name from imported_elements to imported_ns_elements and return a hash of hashes for namespaced elements (David Hansen)
         | 
| 10 | 
            +
            * Only call xmlGetFeaturesList if LIBXML_LEGACY_ENABLED is defined. Most distros still ship libxml2 with legacy features enabled, but this will change (Nick Wellnhofer)
         | 
| 11 | 
            +
            * Update GitHub Actions to use ruby/setup-ruby (Greg)
         | 
| 12 | 
            +
            * Fix memory leak in rxml_node_path, node.path (vovanmozg)
         | 
| 13 | 
            +
             | 
| 3 14 | 
             
            == 3.2.2 / 2022-01-15
         | 
| 4 15 | 
             
            * Switch to Github actions for CI/CD (Greg)
         | 
| 5 16 | 
             
            * Test fixes (Greg, Sergio Durigan Junior)
         | 
    
        data/ext/libxml/ruby_xml.c
    CHANGED
    
    | @@ -764,6 +764,9 @@ static VALUE rxml_default_save_no_empty_tags_set(VALUE klass, VALUE value) | |
| 764 764 | 
             
             */
         | 
| 765 765 | 
             
            static VALUE rxml_features(VALUE klass)
         | 
| 766 766 | 
             
            {
         | 
| 767 | 
            +
            #ifndef LIBXML_LEGACY_ENABLED
         | 
| 768 | 
            +
              return Qnil;
         | 
| 769 | 
            +
            #else
         | 
| 767 770 | 
             
              VALUE arr, str;
         | 
| 768 771 | 
             
              int i, len = MAX_LIBXML_FEATURES_LEN;
         | 
| 769 772 | 
             
              char **list = NULL;
         | 
| @@ -788,6 +791,7 @@ static VALUE rxml_features(VALUE klass) | |
| 788 791 |  | 
| 789 792 | 
             
              ruby_xfree(list);
         | 
| 790 793 | 
             
              return (arr);
         | 
| 794 | 
            +
            #endif /* LIBXML_LEGACY_ENABLED */
         | 
| 791 795 | 
             
            }
         | 
| 792 796 |  | 
| 793 797 | 
             
            /*
         | 
| @@ -52,6 +52,7 @@ static VALUE rxml_namespace_initialize(VALUE self, VALUE node, VALUE prefix, | |
| 52 52 |  | 
| 53 53 | 
             
              Check_Type(node, T_DATA);
         | 
| 54 54 | 
             
              Data_Get_Struct(node, xmlNode, xnode);
         | 
| 55 | 
            +
              xmlResetLastError();
         | 
| 55 56 |  | 
| 56 57 | 
             
              /* Prefix can be null - that means its the default namespace */
         | 
| 57 58 | 
             
              xmlPrefix = NIL_P(prefix) ? NULL : (xmlChar *)StringValuePtr(prefix);
         | 
    
        data/ext/libxml/ruby_xml_node.c
    CHANGED
    
    | @@ -983,14 +983,18 @@ static VALUE rxml_node_path(VALUE self) | |
| 983 983 | 
             
            {
         | 
| 984 984 | 
             
              xmlNodePtr xnode;
         | 
| 985 985 | 
             
              xmlChar *path;
         | 
| 986 | 
            +
              VALUE result = Qnil;
         | 
| 986 987 |  | 
| 987 988 | 
             
              xnode = rxml_get_xnode(self);
         | 
| 988 989 | 
             
              path = xmlGetNodePath(xnode);
         | 
| 989 990 |  | 
| 990 | 
            -
              if (path | 
| 991 | 
            -
             | 
| 992 | 
            -
             | 
| 993 | 
            -
                 | 
| 991 | 
            +
              if (path)
         | 
| 992 | 
            +
              {
         | 
| 993 | 
            +
                result = rxml_new_cstr( path, NULL);
         | 
| 994 | 
            +
                xmlFree(path);
         | 
| 995 | 
            +
              }
         | 
| 996 | 
            +
             | 
| 997 | 
            +
              return result;
         | 
| 994 998 | 
             
            }
         | 
| 995 999 |  | 
| 996 1000 | 
             
            /*
         | 
| @@ -46,9 +46,37 @@ static void rxml_schema_free(xmlSchemaPtr xschema) | |
| 46 46 |  | 
| 47 47 | 
             
            VALUE rxml_wrap_schema(xmlSchemaPtr xschema)
         | 
| 48 48 | 
             
            {
         | 
| 49 | 
            -
               | 
| 49 | 
            +
              VALUE result;
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              if (!xschema)
         | 
| 52 | 
            +
                rb_raise(rb_eArgError, "XML::Schema is required!");
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              result = Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              /*
         | 
| 57 | 
            +
               * Create these as instance variables to provide the output of inspect/to_str some
         | 
| 58 | 
            +
               * idea of what schema this class contains.
         | 
| 59 | 
            +
               */
         | 
| 60 | 
            +
              rb_iv_set(result, "@target_namespace", QNIL_OR_STRING(xschema->targetNamespace));
         | 
| 61 | 
            +
              rb_iv_set(result, "@name", QNIL_OR_STRING(xschema->name));
         | 
| 62 | 
            +
              rb_iv_set(result, "@id", QNIL_OR_STRING(xschema->id));
         | 
| 63 | 
            +
              rb_iv_set(result, "@version", QNIL_OR_STRING(xschema->name));
         | 
| 64 | 
            +
             | 
| 65 | 
            +
              return result;
         | 
| 50 66 | 
             
            }
         | 
| 51 67 |  | 
| 68 | 
            +
            static VALUE rxml_schema_init(VALUE class, xmlSchemaParserCtxtPtr xparser)
         | 
| 69 | 
            +
            {
         | 
| 70 | 
            +
              xmlSchemaPtr xschema;
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              xschema = xmlSchemaParse(xparser);
         | 
| 73 | 
            +
              xmlSchemaFreeParserCtxt(xparser);
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              if (!xschema)
         | 
| 76 | 
            +
                rxml_raise(&xmlLastError);
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              return rxml_wrap_schema(xschema);
         | 
| 79 | 
            +
            }
         | 
| 52 80 |  | 
| 53 81 | 
             
            /*
         | 
| 54 82 | 
             
             * call-seq:
         | 
| @@ -59,15 +87,15 @@ VALUE rxml_wrap_schema(xmlSchemaPtr xschema) | |
| 59 87 | 
             
            static VALUE rxml_schema_init_from_uri(VALUE class, VALUE uri)
         | 
| 60 88 | 
             
            {
         | 
| 61 89 | 
             
              xmlSchemaParserCtxtPtr xparser;
         | 
| 62 | 
            -
              xmlSchemaPtr xschema;
         | 
| 63 90 |  | 
| 64 91 | 
             
              Check_Type(uri, T_STRING);
         | 
| 65 92 |  | 
| 93 | 
            +
              xmlResetLastError();
         | 
| 66 94 | 
             
              xparser = xmlSchemaNewParserCtxt(StringValuePtr(uri));
         | 
| 67 | 
            -
               | 
| 68 | 
            -
             | 
| 95 | 
            +
              if (!xparser)
         | 
| 96 | 
            +
                rxml_raise(&xmlLastError);
         | 
| 69 97 |  | 
| 70 | 
            -
              return  | 
| 98 | 
            +
              return rxml_schema_init(class, xparser);
         | 
| 71 99 | 
             
            }
         | 
| 72 100 |  | 
| 73 101 | 
             
            /*
         | 
| @@ -79,19 +107,16 @@ static VALUE rxml_schema_init_from_uri(VALUE class, VALUE uri) | |
| 79 107 | 
             
            static VALUE rxml_schema_init_from_document(VALUE class, VALUE document)
         | 
| 80 108 | 
             
            {
         | 
| 81 109 | 
             
              xmlDocPtr xdoc;
         | 
| 82 | 
            -
              xmlSchemaPtr xschema;
         | 
| 83 110 | 
             
              xmlSchemaParserCtxtPtr xparser;
         | 
| 84 111 |  | 
| 85 112 | 
             
              Data_Get_Struct(document, xmlDoc, xdoc);
         | 
| 86 113 |  | 
| 114 | 
            +
              xmlResetLastError();
         | 
| 87 115 | 
             
              xparser = xmlSchemaNewDocParserCtxt(xdoc);
         | 
| 88 | 
            -
               | 
| 89 | 
            -
             | 
| 116 | 
            +
              if (!xparser)
         | 
| 117 | 
            +
                rxml_raise(&xmlLastError);
         | 
| 90 118 |  | 
| 91 | 
            -
               | 
| 92 | 
            -
                return Qnil;
         | 
| 93 | 
            -
             | 
| 94 | 
            -
              return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
         | 
| 119 | 
            +
              return rxml_schema_init(class, xparser);
         | 
| 95 120 | 
             
            }
         | 
| 96 121 |  | 
| 97 122 | 
             
            /*
         | 
| @@ -100,57 +125,26 @@ static VALUE rxml_schema_init_from_document(VALUE class, VALUE document) | |
| 100 125 | 
             
             *
         | 
| 101 126 | 
             
             * Create a new schema using the specified string.
         | 
| 102 127 | 
             
             */
         | 
| 103 | 
            -
            static VALUE rxml_schema_init_from_string(VALUE  | 
| 128 | 
            +
            static VALUE rxml_schema_init_from_string(VALUE class, VALUE schema_str)
         | 
| 104 129 | 
             
            {
         | 
| 105 130 | 
             
              xmlSchemaParserCtxtPtr xparser;
         | 
| 106 | 
            -
              xmlSchemaPtr xschema;
         | 
| 107 131 |  | 
| 108 132 | 
             
              Check_Type(schema_str, T_STRING);
         | 
| 109 133 |  | 
| 134 | 
            +
              xmlResetLastError();
         | 
| 110 135 | 
             
              xparser = xmlSchemaNewMemParserCtxt(StringValuePtr(schema_str), (int)strlen(StringValuePtr(schema_str)));
         | 
| 111 | 
            -
               | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
              return Data_Wrap_Struct(cXMLSchema, NULL, rxml_schema_free, xschema);
         | 
| 115 | 
            -
            }
         | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
            static VALUE rxml_schema_target_namespace(VALUE self)
         | 
| 119 | 
            -
            {
         | 
| 120 | 
            -
              xmlSchemaPtr xschema;
         | 
| 121 | 
            -
             | 
| 122 | 
            -
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 123 | 
            -
             | 
| 124 | 
            -
              QNIL_OR_STRING(xschema->targetNamespace)
         | 
| 125 | 
            -
            }
         | 
| 126 | 
            -
             | 
| 127 | 
            -
            static VALUE rxml_schema_name(VALUE self)
         | 
| 128 | 
            -
            {
         | 
| 129 | 
            -
              xmlSchemaPtr xschema;
         | 
| 130 | 
            -
             | 
| 131 | 
            -
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 136 | 
            +
              if (!xparser)
         | 
| 137 | 
            +
                rxml_raise(&xmlLastError);
         | 
| 132 138 |  | 
| 133 | 
            -
               | 
| 134 | 
            -
            }
         | 
| 135 | 
            -
             | 
| 136 | 
            -
            static VALUE rxml_schema_version(VALUE self)
         | 
| 137 | 
            -
            {
         | 
| 138 | 
            -
              xmlSchemaPtr xschema;
         | 
| 139 | 
            -
             | 
| 140 | 
            -
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 141 | 
            -
             | 
| 142 | 
            -
              QNIL_OR_STRING(xschema->version)
         | 
| 143 | 
            -
            }
         | 
| 144 | 
            -
             | 
| 145 | 
            -
            static VALUE rxml_schema_id(VALUE self)
         | 
| 146 | 
            -
            {
         | 
| 147 | 
            -
              xmlSchemaPtr xschema;
         | 
| 148 | 
            -
             | 
| 149 | 
            -
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 150 | 
            -
             | 
| 151 | 
            -
              QNIL_OR_STRING(xschema->id)
         | 
| 139 | 
            +
              return rxml_schema_init(class, xparser);
         | 
| 152 140 | 
             
            }
         | 
| 153 141 |  | 
| 142 | 
            +
            /*
         | 
| 143 | 
            +
             * call-seq:
         | 
| 144 | 
            +
             *    XML::Schema.document -> document
         | 
| 145 | 
            +
             *
         | 
| 146 | 
            +
             * Return the Schema XML Document
         | 
| 147 | 
            +
             */
         | 
| 154 148 | 
             
            static VALUE rxml_schema_document(VALUE self)
         | 
| 155 149 | 
             
            {
         | 
| 156 150 | 
             
              xmlSchemaPtr xschema;
         | 
| @@ -160,7 +154,7 @@ static VALUE rxml_schema_document(VALUE self) | |
| 160 154 | 
             
              return rxml_node_wrap(xmlDocGetRootElement(xschema->doc));
         | 
| 161 155 | 
             
            }
         | 
| 162 156 |  | 
| 163 | 
            -
            static void scan_namespaces(xmlSchemaImportPtr ximport, VALUE array, xmlChar *nsname)
         | 
| 157 | 
            +
            static void scan_namespaces(xmlSchemaImportPtr ximport, VALUE array, const xmlChar *nsname)
         | 
| 164 158 | 
             
            {
         | 
| 165 159 | 
             
              xmlNodePtr xnode;
         | 
| 166 160 | 
             
              xmlNsPtr xns;
         | 
| @@ -171,7 +165,7 @@ static void scan_namespaces(xmlSchemaImportPtr ximport, VALUE array, xmlChar *ns | |
| 171 165 | 
             
                xns = xnode->nsDef;
         | 
| 172 166 |  | 
| 173 167 | 
             
                while (xns)
         | 
| 174 | 
            -
             | 
| 168 | 
            +
                {
         | 
| 175 169 | 
             
                  VALUE namespace = rxml_namespace_wrap(xns);
         | 
| 176 170 | 
             
                  rb_ary_push(array, namespace);
         | 
| 177 171 | 
             
                  xns = xns->next;
         | 
| @@ -179,6 +173,12 @@ static void scan_namespaces(xmlSchemaImportPtr ximport, VALUE array, xmlChar *ns | |
| 179 173 | 
             
              }
         | 
| 180 174 | 
             
            }
         | 
| 181 175 |  | 
| 176 | 
            +
            /*
         | 
| 177 | 
            +
             * call-seq:
         | 
| 178 | 
            +
             *    XML::Schema.namespaces -> array
         | 
| 179 | 
            +
             *
         | 
| 180 | 
            +
             * Returns an array of Namespaces defined by the schema
         | 
| 181 | 
            +
             */
         | 
| 182 182 | 
             
            static VALUE rxml_schema_namespaces(VALUE self)
         | 
| 183 183 | 
             
            {
         | 
| 184 184 | 
             
              VALUE result;
         | 
| @@ -192,7 +192,7 @@ static VALUE rxml_schema_namespaces(VALUE self) | |
| 192 192 | 
             
              return result;
         | 
| 193 193 | 
             
            }
         | 
| 194 194 |  | 
| 195 | 
            -
            static void  | 
| 195 | 
            +
            static void scan_schema_element(xmlSchemaElementPtr xelement, VALUE hash, const xmlChar *name)
         | 
| 196 196 | 
             
            {
         | 
| 197 197 | 
             
              VALUE element = rxml_wrap_schema_element(xelement);
         | 
| 198 198 | 
             
              rb_hash_aset(hash, rb_str_new2((const char*)name), element);
         | 
| @@ -204,40 +204,77 @@ static VALUE rxml_schema_elements(VALUE self) | |
| 204 204 | 
             
              xmlSchemaPtr xschema;
         | 
| 205 205 |  | 
| 206 206 | 
             
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 207 | 
            -
              xmlHashScan(xschema->elemDecl, (xmlHashScanner) | 
| 207 | 
            +
              xmlHashScan(xschema->elemDecl, (xmlHashScanner)scan_schema_element, (void *)result);
         | 
| 208 208 |  | 
| 209 209 | 
             
              return result;
         | 
| 210 210 | 
             
            }
         | 
| 211 211 |  | 
| 212 | 
            -
            static void  | 
| 212 | 
            +
            static void collect_imported_ns_elements(xmlSchemaImportPtr import, VALUE result, const xmlChar *name)
         | 
| 213 213 | 
             
            {
         | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 214 | 
            +
              if (import->imported && import->schema)
         | 
| 215 | 
            +
              {
         | 
| 216 | 
            +
                VALUE elements = rb_hash_new();
         | 
| 217 | 
            +
                xmlHashScan(import->schema->elemDecl, (xmlHashScanner)scan_schema_element, (void *)elements);
         | 
| 218 | 
            +
                rb_hash_aset(result, QNIL_OR_STRING(import->schema->targetNamespace), elements);
         | 
| 219 | 
            +
              }
         | 
| 220 | 
            +
            }
         | 
| 221 | 
            +
             | 
| 222 | 
            +
            /*
         | 
| 223 | 
            +
             * call-seq:
         | 
| 224 | 
            +
             *    XML::Schema.imported_ns_elements -> hash
         | 
| 225 | 
            +
             *
         | 
| 226 | 
            +
             * Returns a hash by namespace of a hash of schema elements within the entire schema including imports
         | 
| 227 | 
            +
             */
         | 
| 228 | 
            +
            static VALUE rxml_schema_imported_ns_elements(VALUE self)
         | 
| 229 | 
            +
            {
         | 
| 230 | 
            +
              xmlSchemaPtr xschema;
         | 
| 231 | 
            +
              VALUE result = rb_hash_new();
         | 
| 232 | 
            +
             | 
| 233 | 
            +
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 234 | 
            +
             | 
| 235 | 
            +
              if (xschema)
         | 
| 236 | 
            +
              {
         | 
| 237 | 
            +
                xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_ns_elements, (void *)result);
         | 
| 238 | 
            +
              }
         | 
| 239 | 
            +
             | 
| 240 | 
            +
              return result;
         | 
| 241 | 
            +
            }
         | 
| 242 | 
            +
             | 
| 243 | 
            +
            static void scan_schema_type(xmlSchemaTypePtr xtype, VALUE hash, const xmlChar *name)
         | 
| 244 | 
            +
            {
         | 
| 245 | 
            +
              VALUE type = rxml_wrap_schema_type(xtype);
         | 
| 246 | 
            +
              rb_hash_aset(hash, rb_str_new2((const char*)name), type);
         | 
| 216 247 | 
             
            }
         | 
| 217 248 |  | 
| 218 249 | 
             
            static VALUE rxml_schema_types(VALUE self)
         | 
| 219 250 | 
             
            {
         | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 251 | 
            +
              VALUE result = rb_hash_new();
         | 
| 252 | 
            +
              xmlSchemaPtr xschema;
         | 
| 222 253 |  | 
| 223 | 
            -
             | 
| 254 | 
            +
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 224 255 |  | 
| 225 | 
            -
             | 
| 226 | 
            -
             | 
| 227 | 
            -
             | 
| 228 | 
            -
             | 
| 256 | 
            +
              if (xschema != NULL && xschema->typeDecl != NULL)
         | 
| 257 | 
            +
              {
         | 
| 258 | 
            +
                xmlHashScan(xschema->typeDecl, (xmlHashScanner)scan_schema_type, (void *)result);
         | 
| 259 | 
            +
              }
         | 
| 229 260 |  | 
| 230 | 
            -
             | 
| 261 | 
            +
              return result;
         | 
| 231 262 | 
             
            }
         | 
| 232 263 |  | 
| 233 | 
            -
            static void collect_imported_types(xmlSchemaImportPtr import, VALUE result)
         | 
| 264 | 
            +
            static void collect_imported_types(xmlSchemaImportPtr import, VALUE result, const xmlChar *name)
         | 
| 234 265 | 
             
            {
         | 
| 235 266 | 
             
              if (import->imported && import->schema)
         | 
| 236 267 | 
             
              {
         | 
| 237 | 
            -
                xmlHashScan(import->schema->typeDecl, (xmlHashScanner) | 
| 268 | 
            +
                xmlHashScan(import->schema->typeDecl, (xmlHashScanner)scan_schema_type, (void *)result);
         | 
| 238 269 | 
             
              }
         | 
| 239 270 | 
             
            }
         | 
| 240 271 |  | 
| 272 | 
            +
            /*
         | 
| 273 | 
            +
             * call-seq:
         | 
| 274 | 
            +
             *    XML::Schema.imported_types -> hash
         | 
| 275 | 
            +
             *
         | 
| 276 | 
            +
             * Returns a hash of all types within the entire schema including imports
         | 
| 277 | 
            +
             */
         | 
| 241 278 | 
             
            static VALUE rxml_schema_imported_types(VALUE self)
         | 
| 242 279 | 
             
            {
         | 
| 243 280 | 
             
              xmlSchemaPtr xschema;
         | 
| @@ -247,7 +284,38 @@ static VALUE rxml_schema_imported_types(VALUE self) | |
| 247 284 |  | 
| 248 285 | 
             
              if (xschema)
         | 
| 249 286 | 
             
              {
         | 
| 250 | 
            -
             | 
| 287 | 
            +
                xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_types, (void *)result);
         | 
| 288 | 
            +
              }
         | 
| 289 | 
            +
             | 
| 290 | 
            +
              return result;
         | 
| 291 | 
            +
            }
         | 
| 292 | 
            +
             | 
| 293 | 
            +
            static void collect_imported_ns_types(xmlSchemaImportPtr import, VALUE result, const xmlChar *name)
         | 
| 294 | 
            +
            {
         | 
| 295 | 
            +
              if (import->imported && import->schema)
         | 
| 296 | 
            +
              {
         | 
| 297 | 
            +
                VALUE types = rb_hash_new();
         | 
| 298 | 
            +
                xmlHashScan(import->schema->typeDecl, (xmlHashScanner)scan_schema_type, (void *)types);
         | 
| 299 | 
            +
                rb_hash_aset(result, QNIL_OR_STRING(import->schema->targetNamespace), types);
         | 
| 300 | 
            +
              }
         | 
| 301 | 
            +
            }
         | 
| 302 | 
            +
             | 
| 303 | 
            +
            /*
         | 
| 304 | 
            +
             * call-seq:
         | 
| 305 | 
            +
             *    XML::Schema.imported_ns_types -> hash
         | 
| 306 | 
            +
             *
         | 
| 307 | 
            +
             * Returns a hash by namespace of a hash of schema types within the entire schema including imports
         | 
| 308 | 
            +
             */
         | 
| 309 | 
            +
            static VALUE rxml_schema_imported_ns_types(VALUE self)
         | 
| 310 | 
            +
            {
         | 
| 311 | 
            +
              xmlSchemaPtr xschema;
         | 
| 312 | 
            +
              VALUE result = rb_hash_new();
         | 
| 313 | 
            +
             | 
| 314 | 
            +
              Data_Get_Struct(self, xmlSchema, xschema);
         | 
| 315 | 
            +
             | 
| 316 | 
            +
              if (xschema)
         | 
| 317 | 
            +
              {
         | 
| 318 | 
            +
                xmlHashScan(xschema->schemasImports, (xmlHashScanner)collect_imported_ns_types, (void *)result);
         | 
| 251 319 | 
             
              }
         | 
| 252 320 |  | 
| 253 321 | 
             
              return result;
         | 
| @@ -260,16 +328,20 @@ void rxml_init_schema(void) | |
| 260 328 | 
             
              rb_define_singleton_method(cXMLSchema, "from_string", rxml_schema_init_from_string, 1);
         | 
| 261 329 | 
             
              rb_define_singleton_method(cXMLSchema, "document", rxml_schema_init_from_document, 1);
         | 
| 262 330 |  | 
| 263 | 
            -
               | 
| 264 | 
            -
               | 
| 265 | 
            -
               | 
| 266 | 
            -
               | 
| 267 | 
            -
               | 
| 331 | 
            +
              /* Create attr_reader methods for the above instance variables */
         | 
| 332 | 
            +
              rb_define_attr(cXMLSchema, "target_namespace", 1, 0);
         | 
| 333 | 
            +
              rb_define_attr(cXMLSchema, "name", 1, 0);
         | 
| 334 | 
            +
              rb_define_attr(cXMLSchema, "id", 1, 0);
         | 
| 335 | 
            +
              rb_define_attr(cXMLSchema, "version", 1, 0);
         | 
| 268 336 |  | 
| 269 | 
            -
               | 
| 270 | 
            -
              rb_define_method(cXMLSchema, " | 
| 337 | 
            +
              // These are just methods so as to hide their values and not overly clutter the output of inspect/to_str
         | 
| 338 | 
            +
              rb_define_method(cXMLSchema, "document", rxml_schema_document, 0);
         | 
| 271 339 | 
             
              rb_define_method(cXMLSchema, "namespaces", rxml_schema_namespaces, 0);
         | 
| 340 | 
            +
              rb_define_method(cXMLSchema, "elements", rxml_schema_elements, 0);
         | 
| 341 | 
            +
              rb_define_method(cXMLSchema, "imported_ns_elements", rxml_schema_imported_ns_elements, 0);
         | 
| 272 342 | 
             
              rb_define_method(cXMLSchema, "types", rxml_schema_types, 0);
         | 
| 343 | 
            +
              rb_define_method(cXMLSchema, "imported_types", rxml_schema_imported_types, 0);
         | 
| 344 | 
            +
              rb_define_method(cXMLSchema, "imported_ns_types", rxml_schema_imported_ns_types, 0);
         | 
| 273 345 |  | 
| 274 346 | 
             
              rxml_init_schema_facet();
         | 
| 275 347 | 
             
              rxml_init_schema_element();
         | 
| @@ -9,11 +9,8 @@ extern VALUE cXMLSchema; | |
| 9 9 |  | 
| 10 10 | 
             
            void rxml_init_schema(void);
         | 
| 11 11 |  | 
| 12 | 
            -
            #define QNIL_OR_STRING(slot) | 
| 13 | 
            -
                 | 
| 14 | 
            -
                  return Qnil; \
         | 
| 15 | 
            -
                else \
         | 
| 16 | 
            -
            	    return rb_str_new2((const char *)slot);
         | 
| 12 | 
            +
            #define QNIL_OR_STRING(slot) \
         | 
| 13 | 
            +
                (slot == NULL) ? Qnil : rb_str_new2((const char *)slot)
         | 
| 17 14 |  | 
| 18 15 | 
             
            #define SUBSET_RESTRICTION  1<<0
         | 
| 19 16 | 
             
            #define SUBSET_EXTENSION    1<<1
         | 
| @@ -12,62 +12,31 @@ static void rxml_schema_attribute_free(xmlSchemaAttributeUsePtr attr) | |
| 12 12 |  | 
| 13 13 | 
             
            VALUE rxml_wrap_schema_attribute(xmlSchemaAttributeUsePtr attr)
         | 
| 14 14 | 
             
            {
         | 
| 15 | 
            -
               | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
            static VALUE rxml_schema_attribute_namespace(VALUE self)
         | 
| 19 | 
            -
            {
         | 
| 20 | 
            -
              xmlSchemaAttributeUsePtr attr;
         | 
| 21 | 
            -
              const xmlChar *tns;
         | 
| 15 | 
            +
              VALUE result;
         | 
| 16 | 
            +
              const xmlChar *tns_str, *name_str;
         | 
| 22 17 |  | 
| 23 | 
            -
               | 
| 18 | 
            +
              if (!attr)
         | 
| 19 | 
            +
                rb_raise(rb_eArgError, "XML::Schema::Attribute required!");
         | 
| 24 20 |  | 
| 25 | 
            -
               | 
| 26 | 
            -
                return Qnil;
         | 
| 21 | 
            +
              result = Data_Wrap_Struct(cXMLSchemaAttribute, NULL, rxml_schema_attribute_free, attr);
         | 
| 27 22 |  | 
| 28 23 | 
             
              if (attr->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
         | 
| 29 | 
            -
             | 
| 24 | 
            +
                tns_str = ((xmlSchemaAttributeUseProhibPtr) attr)->targetNamespace;
         | 
| 25 | 
            +
                name_str = ((xmlSchemaAttributeUseProhibPtr) attr)->name;
         | 
| 30 26 | 
             
              } else if (attr->type == XML_SCHEMA_EXTRA_QNAMEREF) {
         | 
| 31 | 
            -
             | 
| 27 | 
            +
                tns_str = ((xmlSchemaQNameRefPtr) attr)->targetNamespace;
         | 
| 28 | 
            +
                name_str = ((xmlSchemaQNameRefPtr) attr)->name;
         | 
| 32 29 | 
             
              } else {
         | 
| 33 | 
            -
             | 
| 30 | 
            +
                tns_str = ((xmlSchemaAttributePtr) (attr->attrDecl))->targetNamespace;
         | 
| 31 | 
            +
                name_str = ((xmlSchemaAttributePtr) (attr->attrDecl))->name;
         | 
| 34 32 | 
             
              }
         | 
| 33 | 
            +
              rb_iv_set(result, "@target_namespace", QNIL_OR_STRING(tns_str));
         | 
| 34 | 
            +
              rb_iv_set(result, "@name", QNIL_OR_STRING(name_str));
         | 
| 35 | 
            +
              rb_iv_set(result, "@type", rxml_wrap_schema_type((xmlSchemaTypePtr)attr->attrDecl->subtypes));
         | 
| 36 | 
            +
              rb_iv_set(result, "@value", QNIL_OR_STRING(attr->defValue));
         | 
| 37 | 
            +
              rb_iv_set(result, "@occurs", INT2NUM(attr->occurs));
         | 
| 35 38 |  | 
| 36 | 
            -
               | 
| 37 | 
            -
            }
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            static VALUE rxml_schema_attribute_name(VALUE self)
         | 
| 40 | 
            -
            {
         | 
| 41 | 
            -
              xmlSchemaAttributeUsePtr attr;
         | 
| 42 | 
            -
              const xmlChar *name;
         | 
| 43 | 
            -
             | 
| 44 | 
            -
              Data_Get_Struct(self, xmlSchemaAttributeUse, attr);
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              if (attr == NULL)
         | 
| 47 | 
            -
                return Qnil;
         | 
| 48 | 
            -
             | 
| 49 | 
            -
              if (attr->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
         | 
| 50 | 
            -
                  name = ((xmlSchemaAttributeUseProhibPtr) attr)->name;
         | 
| 51 | 
            -
              } else if (attr->type == XML_SCHEMA_EXTRA_QNAMEREF) {
         | 
| 52 | 
            -
                  name = ((xmlSchemaQNameRefPtr) attr)->name;
         | 
| 53 | 
            -
              } else {
         | 
| 54 | 
            -
                  xmlSchemaAttributePtr attrDecl = ((xmlSchemaAttributeUsePtr) attr)->attrDecl;
         | 
| 55 | 
            -
                  name = attrDecl->name;
         | 
| 56 | 
            -
              }
         | 
| 57 | 
            -
             | 
| 58 | 
            -
              QNIL_OR_STRING(name)
         | 
| 59 | 
            -
            }
         | 
| 60 | 
            -
             | 
| 61 | 
            -
            static VALUE rxml_schema_attribute_type(VALUE self)
         | 
| 62 | 
            -
            {
         | 
| 63 | 
            -
              xmlSchemaAttributeUsePtr attr;
         | 
| 64 | 
            -
              xmlSchemaTypePtr xtype;
         | 
| 65 | 
            -
             | 
| 66 | 
            -
              Data_Get_Struct(self, xmlSchemaAttributeUse, attr);
         | 
| 67 | 
            -
             | 
| 68 | 
            -
              xtype = attr->attrDecl->subtypes;
         | 
| 69 | 
            -
             | 
| 70 | 
            -
              return rxml_wrap_schema_type((xmlSchemaTypePtr) xtype);
         | 
| 39 | 
            +
              return result;
         | 
| 71 40 | 
             
            }
         | 
| 72 41 |  | 
| 73 42 | 
             
            static VALUE rxml_schema_attribute_node(VALUE self)
         | 
| @@ -79,31 +48,14 @@ static VALUE rxml_schema_attribute_node(VALUE self) | |
| 79 48 | 
             
              return rxml_node_wrap(attr->node);
         | 
| 80 49 | 
             
            }
         | 
| 81 50 |  | 
| 82 | 
            -
            static VALUE rxml_schema_attribute_value(VALUE self)
         | 
| 83 | 
            -
            {
         | 
| 84 | 
            -
              xmlSchemaAttributeUsePtr attr;
         | 
| 85 | 
            -
             | 
| 86 | 
            -
              Data_Get_Struct(self, xmlSchemaAttributeUse, attr);
         | 
| 87 | 
            -
             | 
| 88 | 
            -
              QNIL_OR_STRING(attr->defValue)
         | 
| 89 | 
            -
            }
         | 
| 90 | 
            -
             | 
| 91 | 
            -
            static VALUE rxml_schema_attribute_occurs(VALUE self)
         | 
| 92 | 
            -
            {
         | 
| 93 | 
            -
              xmlSchemaAttributeUsePtr attr;
         | 
| 94 | 
            -
             | 
| 95 | 
            -
              Data_Get_Struct(self, xmlSchemaAttributeUse, attr);
         | 
| 96 | 
            -
             | 
| 97 | 
            -
              return INT2NUM(attr->occurs);
         | 
| 98 | 
            -
            }
         | 
| 99 | 
            -
             | 
| 100 51 | 
             
            void rxml_init_schema_attribute(void)
         | 
| 101 52 | 
             
            {
         | 
| 102 53 | 
             
              cXMLSchemaAttribute = rb_define_class_under(cXMLSchema, "Attribute", rb_cObject);
         | 
| 103 | 
            -
               | 
| 104 | 
            -
               | 
| 105 | 
            -
               | 
| 54 | 
            +
              rb_define_attr(cXMLSchemaAttribute, "name", 1, 0);
         | 
| 55 | 
            +
              rb_define_attr(cXMLSchemaAttribute, "type", 1, 0);
         | 
| 56 | 
            +
              rb_define_attr(cXMLSchemaAttribute, "namespace", 1, 0);
         | 
| 57 | 
            +
              rb_define_attr(cXMLSchemaAttribute, "value", 1, 0);
         | 
| 58 | 
            +
              rb_define_attr(cXMLSchemaAttribute, "occurs", 1, 0);
         | 
| 59 | 
            +
             | 
| 106 60 | 
             
              rb_define_method(cXMLSchemaAttribute, "node", rxml_schema_attribute_node, 0);
         | 
| 107 | 
            -
              rb_define_method(cXMLSchemaAttribute, "value", rxml_schema_attribute_value, 0);
         | 
| 108 | 
            -
              rb_define_method(cXMLSchemaAttribute, "occurs", rxml_schema_attribute_occurs, 0);
         | 
| 109 61 | 
             
            }
         | 
| @@ -10,40 +10,21 @@ static void rxml_schema_element_free(xmlSchemaElementPtr xschema_element) | |
| 10 10 | 
             
              xmlFree(xschema_element);
         | 
| 11 11 | 
             
            }
         | 
| 12 12 |  | 
| 13 | 
            -
            VALUE rxml_wrap_schema_element(xmlSchemaElementPtr  | 
| 13 | 
            +
            VALUE rxml_wrap_schema_element(xmlSchemaElementPtr xelem)
         | 
| 14 14 | 
             
            {
         | 
| 15 | 
            -
               | 
| 16 | 
            -
            }
         | 
| 15 | 
            +
              VALUE result;
         | 
| 17 16 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
              xmlSchemaElementPtr xelem;
         | 
| 17 | 
            +
              if (!xelem)
         | 
| 18 | 
            +
                rb_raise(rb_eArgError, "XML::Schema::Element is required!");
         | 
| 21 19 |  | 
| 22 | 
            -
               | 
| 20 | 
            +
              result = Data_Wrap_Struct(cXMLSchemaElement, NULL, rxml_schema_element_free, xelem);
         | 
| 23 21 |  | 
| 24 | 
            -
              QNIL_OR_STRING(xelem-> | 
| 25 | 
            -
             | 
| 22 | 
            +
              rb_iv_set(result, "@name", QNIL_OR_STRING(xelem->name));
         | 
| 23 | 
            +
              rb_iv_set(result, "@value", QNIL_OR_STRING(xelem->value));
         | 
| 24 | 
            +
              rb_iv_set(result, "@namespace", QNIL_OR_STRING(xelem->targetNamespace));
         | 
| 25 | 
            +
              rb_iv_set(result, "@type", rxml_wrap_schema_type((xmlSchemaTypePtr) (xelem->subtypes)));
         | 
| 26 26 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
            {
         | 
| 29 | 
            -
              xmlSchemaElementPtr xelem;
         | 
| 30 | 
            -
             | 
| 31 | 
            -
              Data_Get_Struct(self, xmlSchemaElement, xelem);
         | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
              QNIL_OR_STRING(xelem->name)
         | 
| 35 | 
            -
            }
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            static VALUE rxml_schema_element_type(VALUE self)
         | 
| 38 | 
            -
            {
         | 
| 39 | 
            -
              xmlSchemaElementPtr xelem;
         | 
| 40 | 
            -
              xmlSchemaTypePtr xtype;
         | 
| 41 | 
            -
             | 
| 42 | 
            -
              Data_Get_Struct(self, xmlSchemaElement, xelem);
         | 
| 43 | 
            -
             | 
| 44 | 
            -
              xtype = xelem->subtypes;
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              return rxml_wrap_schema_type((xmlSchemaTypePtr) xtype);
         | 
| 27 | 
            +
              return result;
         | 
| 47 28 | 
             
            }
         | 
| 48 29 |  | 
| 49 30 | 
             
            static VALUE rxml_schema_element_node(VALUE self)
         | 
| @@ -55,41 +36,34 @@ static VALUE rxml_schema_element_node(VALUE self) | |
| 55 36 | 
             
              return rxml_node_wrap(xelem->node);
         | 
| 56 37 | 
             
            }
         | 
| 57 38 |  | 
| 58 | 
            -
            static VALUE  | 
| 39 | 
            +
            static VALUE rxml_schema_element_annot(VALUE self)
         | 
| 59 40 | 
             
            {
         | 
| 60 41 | 
             
              xmlSchemaElementPtr xelem;
         | 
| 42 | 
            +
              VALUE annotation = Qnil;
         | 
| 61 43 |  | 
| 62 44 | 
             
              Data_Get_Struct(self, xmlSchemaElement, xelem);
         | 
| 63 45 |  | 
| 64 | 
            -
               | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
            {
         | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
            	{
         | 
| 76 | 
            -
            		xmlChar *content = xmlNodeGetContent(xelem->annot->content);
         | 
| 77 | 
            -
            		if (content)
         | 
| 78 | 
            -
            		{
         | 
| 79 | 
            -
            			result = rxml_new_cstr(content, NULL);
         | 
| 80 | 
            -
            			xmlFree(content);
         | 
| 81 | 
            -
            		}
         | 
| 82 | 
            -
            	}
         | 
| 83 | 
            -
            	return result;
         | 
| 46 | 
            +
              if ((xelem->annot != NULL) && (xelem->annot->content != NULL))
         | 
| 47 | 
            +
              {
         | 
| 48 | 
            +
                xmlChar *content = xmlNodeGetContent(xelem->annot->content);
         | 
| 49 | 
            +
                if (content)
         | 
| 50 | 
            +
                {
         | 
| 51 | 
            +
                  annotation = rxml_new_cstr(content, NULL);
         | 
| 52 | 
            +
                  xmlFree(content);
         | 
| 53 | 
            +
                }
         | 
| 54 | 
            +
              }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              return annotation;
         | 
| 84 57 | 
             
            }
         | 
| 85 58 |  | 
| 86 59 | 
             
            void rxml_init_schema_element(void)
         | 
| 87 60 | 
             
            {
         | 
| 88 61 | 
             
              cXMLSchemaElement = rb_define_class_under(cXMLSchema, "Element", rb_cObject);
         | 
| 89 | 
            -
               | 
| 90 | 
            -
               | 
| 91 | 
            -
               | 
| 62 | 
            +
              rb_define_attr(cXMLSchemaElement, "name", 1, 0);
         | 
| 63 | 
            +
              rb_define_attr(cXMLSchemaElement, "value", 1, 0);
         | 
| 64 | 
            +
              rb_define_attr(cXMLSchemaElement, "namespace", 1, 0);
         | 
| 65 | 
            +
              rb_define_attr(cXMLSchemaElement, "type", 1, 0);
         | 
| 66 | 
            +
             | 
| 92 67 | 
             
              rb_define_method(cXMLSchemaElement, "node", rxml_schema_element_node, 0);
         | 
| 93 | 
            -
              rb_define_method(cXMLSchemaElement, "value", rxml_schema_element_value, 0);
         | 
| 94 68 | 
             
              rb_define_method(cXMLSchemaElement, "annotation", rxml_schema_element_annot, 0);
         | 
| 95 69 | 
             
            }
         | 
| @@ -9,44 +9,38 @@ static void rxml_schema_facet_free(xmlSchemaFacetPtr xschema_type) | |
| 9 9 | 
             
              xmlFree(xschema_type);
         | 
| 10 10 | 
             
            }
         | 
| 11 11 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
            static VALUE rxml_schema_facet_node(VALUE self)
         | 
| 12 | 
            +
            VALUE rxml_wrap_schema_facet(xmlSchemaFacetPtr facet)
         | 
| 15 13 | 
             
            {
         | 
| 16 | 
            -
               | 
| 14 | 
            +
              VALUE result;
         | 
| 17 15 |  | 
| 18 | 
            -
               | 
| 16 | 
            +
              if (!facet)
         | 
| 17 | 
            +
                rb_raise(rb_eArgError, "XML::Schema::Facet required!");
         | 
| 19 18 |  | 
| 20 | 
            -
               | 
| 21 | 
            -
            }
         | 
| 19 | 
            +
              result = Data_Wrap_Struct(cXMLSchemaFacet, NULL, rxml_schema_facet_free, facet);
         | 
| 22 20 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
              xmlSchemaFacetPtr facet;
         | 
| 21 | 
            +
              rb_iv_set(result, "@kind", INT2NUM(facet->type));
         | 
| 22 | 
            +
              rb_iv_set(result, "@value", QNIL_OR_STRING(facet->value));
         | 
| 26 23 |  | 
| 27 | 
            -
               | 
| 24 | 
            +
              return result;
         | 
| 28 25 |  | 
| 29 | 
            -
              QNIL_OR_STRING(facet->value)
         | 
| 30 26 | 
             
            }
         | 
| 31 27 |  | 
| 32 | 
            -
             | 
| 28 | 
            +
            /* START FACET*/
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            static VALUE rxml_schema_facet_node(VALUE self)
         | 
| 33 31 | 
             
            {
         | 
| 34 32 | 
             
              xmlSchemaFacetPtr facet;
         | 
| 35 33 |  | 
| 36 34 | 
             
              Data_Get_Struct(self, xmlSchemaFacet, facet);
         | 
| 37 35 |  | 
| 38 | 
            -
              return  | 
| 39 | 
            -
            }
         | 
| 40 | 
            -
             | 
| 41 | 
            -
            VALUE rxml_wrap_schema_facet(xmlSchemaFacetPtr facet)
         | 
| 42 | 
            -
            {
         | 
| 43 | 
            -
              return Data_Wrap_Struct(cXMLSchemaFacet, NULL, rxml_schema_facet_free, facet);
         | 
| 36 | 
            +
              return rxml_node_wrap(facet->node);
         | 
| 44 37 | 
             
            }
         | 
| 45 38 |  | 
| 46 39 | 
             
            void rxml_init_schema_facet(void)
         | 
| 47 40 | 
             
            {
         | 
| 48 41 | 
             
              cXMLSchemaFacet = rb_define_class_under(cXMLSchema, "Facet", rb_cObject);
         | 
| 49 | 
            -
               | 
| 42 | 
            +
              rb_define_attr(cXMLSchemaFacet, "kind", 1, 0);
         | 
| 43 | 
            +
              rb_define_attr(cXMLSchemaFacet, "value", 1, 0);
         | 
| 44 | 
            +
             | 
| 50 45 | 
             
              rb_define_method(cXMLSchemaFacet, "node", rxml_schema_facet_node, 0);
         | 
| 51 | 
            -
              rb_define_method(cXMLSchemaFacet, "kind", rxml_schema_facet_kind, 0);
         | 
| 52 46 | 
             
            }
         | 
| @@ -17,34 +17,36 @@ static void rxml_schema_type_free(xmlSchemaTypePtr xschema_type) | |
| 17 17 |  | 
| 18 18 | 
             
            VALUE rxml_wrap_schema_type(xmlSchemaTypePtr xtype)
         | 
| 19 19 | 
             
            {
         | 
| 20 | 
            -
               | 
| 21 | 
            -
            }
         | 
| 20 | 
            +
              VALUE result;
         | 
| 22 21 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
              xmlSchemaTypePtr xtype;
         | 
| 22 | 
            +
              if (!xtype)
         | 
| 23 | 
            +
                rb_raise(rb_eArgError, "XML::Schema::Type required!");
         | 
| 26 24 |  | 
| 27 | 
            -
               | 
| 25 | 
            +
              result = Data_Wrap_Struct(cXMLSchemaType, NULL, rxml_schema_type_free, xtype);
         | 
| 28 26 |  | 
| 29 | 
            -
              QNIL_OR_STRING(xtype-> | 
| 27 | 
            +
              rb_iv_set(result, "@name", QNIL_OR_STRING(xtype->name));
         | 
| 28 | 
            +
              rb_iv_set(result, "@namespace", QNIL_OR_STRING(xtype->targetNamespace));
         | 
| 29 | 
            +
              rb_iv_set(result, "@kind", INT2NUM(xtype->type));
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              return result;
         | 
| 30 32 | 
             
            }
         | 
| 31 33 |  | 
| 32 | 
            -
            static VALUE  | 
| 34 | 
            +
            static VALUE rxml_schema_type_base(VALUE self)
         | 
| 33 35 | 
             
            {
         | 
| 34 36 | 
             
              xmlSchemaTypePtr xtype;
         | 
| 35 37 |  | 
| 36 38 | 
             
              Data_Get_Struct(self, xmlSchemaType, xtype);
         | 
| 37 39 |  | 
| 38 | 
            -
               | 
| 40 | 
            +
              return (xtype->baseType != xtype) ? rxml_wrap_schema_type(xtype->baseType) : Qnil;
         | 
| 39 41 | 
             
            }
         | 
| 40 42 |  | 
| 41 | 
            -
            static VALUE  | 
| 43 | 
            +
            static VALUE rxml_schema_type_node(VALUE self)
         | 
| 42 44 | 
             
            {
         | 
| 43 45 | 
             
              xmlSchemaTypePtr xtype;
         | 
| 44 46 |  | 
| 45 47 | 
             
              Data_Get_Struct(self, xmlSchemaType, xtype);
         | 
| 46 48 |  | 
| 47 | 
            -
              return  | 
| 49 | 
            +
              return (xtype->node != NULL) ? rxml_node_wrap(xtype->node) : Qnil;
         | 
| 48 50 | 
             
            }
         | 
| 49 51 |  | 
| 50 52 | 
             
            static VALUE rxml_schema_type_facets(VALUE self)
         | 
| @@ -68,27 +70,6 @@ static VALUE rxml_schema_type_facets(VALUE self) | |
| 68 70 | 
             
              return result;
         | 
| 69 71 | 
             
            }
         | 
| 70 72 |  | 
| 71 | 
            -
            static VALUE rxml_schema_type_node(VALUE self)
         | 
| 72 | 
            -
            {
         | 
| 73 | 
            -
              xmlSchemaTypePtr xtype;
         | 
| 74 | 
            -
             | 
| 75 | 
            -
              Data_Get_Struct(self, xmlSchemaType, xtype);
         | 
| 76 | 
            -
             | 
| 77 | 
            -
              if(xtype->node != NULL)
         | 
| 78 | 
            -
                return rxml_node_wrap(xtype->node);
         | 
| 79 | 
            -
              else
         | 
| 80 | 
            -
                return Qnil;
         | 
| 81 | 
            -
            }
         | 
| 82 | 
            -
             | 
| 83 | 
            -
            static VALUE rxml_schema_type_kind(VALUE self)
         | 
| 84 | 
            -
            {
         | 
| 85 | 
            -
              xmlSchemaTypePtr xtype;
         | 
| 86 | 
            -
             | 
| 87 | 
            -
              Data_Get_Struct(self, xmlSchemaType, xtype);
         | 
| 88 | 
            -
             | 
| 89 | 
            -
              return INT2NUM(xtype->type);
         | 
| 90 | 
            -
            }
         | 
| 91 | 
            -
             | 
| 92 73 | 
             
            static VALUE rxml_schema_type_annot(VALUE self)
         | 
| 93 74 | 
             
            {
         | 
| 94 75 | 
             
              VALUE result = Qnil;
         | 
| @@ -220,13 +201,14 @@ void rxml_init_schema_type(void) | |
| 220 201 |  | 
| 221 202 | 
             
              cXMLSchemaType = rb_define_class_under(cXMLSchema, "Type", rb_cObject);
         | 
| 222 203 |  | 
| 223 | 
            -
               | 
| 224 | 
            -
               | 
| 225 | 
            -
               | 
| 226 | 
            -
             | 
| 204 | 
            +
              rb_define_attr(cXMLSchemaType, "namespace", 1, 0);
         | 
| 205 | 
            +
              rb_define_attr(cXMLSchemaType, "name", 1, 0);
         | 
| 206 | 
            +
              rb_define_attr(cXMLSchemaType, "kind", 1, 0);
         | 
| 207 | 
            +
             | 
| 227 208 | 
             
              rb_define_method(cXMLSchemaType, "base", rxml_schema_type_base, 0);
         | 
| 228 | 
            -
              rb_define_method(cXMLSchemaType, "kind", rxml_schema_type_kind, 0);
         | 
| 229 209 | 
             
              rb_define_method(cXMLSchemaType, "node", rxml_schema_type_node, 0);
         | 
| 210 | 
            +
              rb_define_method(cXMLSchemaType, "elements", rxml_schema_type_elements, 0);
         | 
| 211 | 
            +
              rb_define_method(cXMLSchemaType, "attributes", rxml_schema_type_attributes, 0);
         | 
| 230 212 | 
             
              rb_define_method(cXMLSchemaType, "facets", rxml_schema_type_facets, 0);
         | 
| 231 213 | 
             
              rb_define_method(cXMLSchemaType, "annotation", rxml_schema_type_annot, 0);
         | 
| 232 214 | 
             
            }
         | 
| @@ -1,9 +1,9 @@ | |
| 1 1 | 
             
            /* Don't nuke this block!  It is used for automatically updating the
         | 
| 2 2 | 
             
             * versions below. VERSION = string formatting, VERNUM = numbered
         | 
| 3 3 | 
             
             * version for inline testing: increment both or none at all.*/
         | 
| 4 | 
            -
            #define RUBY_LIBXML_VERSION  "3.2. | 
| 5 | 
            -
            #define RUBY_LIBXML_VERNUM    | 
| 4 | 
            +
            #define RUBY_LIBXML_VERSION  "3.2.3"
         | 
| 5 | 
            +
            #define RUBY_LIBXML_VERNUM   323
         | 
| 6 6 | 
             
            #define RUBY_LIBXML_VER_MAJ   3
         | 
| 7 7 | 
             
            #define RUBY_LIBXML_VER_MIN   2
         | 
| 8 | 
            -
            #define RUBY_LIBXML_VER_MIC    | 
| 8 | 
            +
            #define RUBY_LIBXML_VER_MIC   3
         | 
| 9 9 | 
             
            #define RUBY_LIBXML_VER_PATCH 0
         | 
| Binary file | 
    
        data/test/model/shiporder.rnc
    CHANGED
    
    | @@ -5,9 +5,9 @@ | |
| 5 5 | 
             
            #
         | 
| 6 6 | 
             
            namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"
         | 
| 7 7 |  | 
| 8 | 
            -
            start =  | 
| 8 | 
            +
            start = shiporderType
         | 
| 9 9 |  | 
| 10 | 
            -
             | 
| 10 | 
            +
            shiporderType  = element shiporder { attribute orderid { text },
         | 
| 11 11 | 
             
                                             attribute xsi:noNamespaceSchemaLocation { text }, 
         | 
| 12 12 | 
             
                                           orderperson, shipto, item* }
         | 
| 13 13 |  | 
    
        data/test/model/shiporder.rng
    CHANGED
    
    | @@ -7,9 +7,9 @@ | |
| 7 7 | 
             
            -->
         | 
| 8 8 | 
             
            <grammar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://relaxng.org/ns/structure/1.0">
         | 
| 9 9 | 
             
              <start>
         | 
| 10 | 
            -
                <ref name=" | 
| 10 | 
            +
                <ref name="shiporderType"/>
         | 
| 11 11 | 
             
              </start>
         | 
| 12 | 
            -
              <define name=" | 
| 12 | 
            +
              <define name="shiporderType">
         | 
| 13 13 | 
             
                <element name="shiporder">
         | 
| 14 14 | 
             
                  <attribute name="orderid"/>
         | 
| 15 15 | 
             
                  <attribute name="xsi:noNamespaceSchemaLocation"/>
         | 
    
        data/test/model/shiporder.xsd
    CHANGED
    
    | @@ -1,8 +1,12 @@ | |
| 1 1 | 
             
            <?xml version="1.0" encoding="iso-8859-1" ?>
         | 
| 2 2 | 
             
            <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
         | 
| 3 | 
            -
              <xs:element name="shiporder" type="shiporder"/>
         | 
| 4 3 |  | 
| 5 | 
            -
              <xs: | 
| 4 | 
            +
              <xs:import namespace="http://xml4r.org/ibxml-ruby/test/shiporder"
         | 
| 5 | 
            +
                         schemaLocation="shiporder_import.xsd"/>
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              <xs:element name="shiporder" type="shiporderType"/>
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              <xs:complexType name="shiporderType">
         | 
| 6 10 | 
             
                <xs:annotation>
         | 
| 7 11 | 
             
                  <xs:documentation>Shiporder type documentation</xs:documentation>
         | 
| 8 12 | 
             
                </xs:annotation>
         | 
| @@ -37,4 +41,4 @@ | |
| 37 41 | 
             
                <xs:attribute name="foo" default="1" type="xs:integer" use="optional"/>
         | 
| 38 42 | 
             
                <xs:attribute name="bar" use="prohibited"/>
         | 
| 39 43 | 
             
              </xs:complexType>
         | 
| 40 | 
            -
            </xs:schema>
         | 
| 44 | 
            +
            </xs:schema>
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="iso-8859-1" ?>
         | 
| 2 | 
            +
            <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
         | 
| 3 | 
            +
              <xs:element name="shiporder" type="shiporderType"/>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              <xs:complexType name="shiporderType">
         | 
| 6 | 
            +
                <xs:anntation>
         | 
| 7 | 
            +
                  <xs:documentation>Shiporder type documentation</xs:documentation>
         | 
| 8 | 
            +
                </xs:anntation>
         | 
| 9 | 
            +
                <xs:sequence>
         | 
| 10 | 
            +
                  <xs:element name="orderperson" type="xs:string">
         | 
| 11 | 
            +
                    <xs:annotation>
         | 
| 12 | 
            +
                      <xs:documentation>orderperson element documentation</xs:documentation>
         | 
| 13 | 
            +
                    </xs:annotation>
         | 
| 14 | 
            +
                  </xs:element>
         | 
| 15 | 
            +
                  <xs:element name="shipto">
         | 
| 16 | 
            +
                    <xs:complexType>
         | 
| 17 | 
            +
                      <xs:sequence>
         | 
| 18 | 
            +
                        <xs:element name="name" type="xs:string"/>
         | 
| 19 | 
            +
                        <xs:element name="address" type="xs:string"/>
         | 
| 20 | 
            +
                        <xs:element name="city" type="xs:string"/>
         | 
| 21 | 
            +
                        <xs:element name="country" type="xs:string"/>
         | 
| 22 | 
            +
                      </xs:sequence>
         | 
| 23 | 
            +
                    </xs:complexType>
         | 
| 24 | 
            +
                  </xs:element>
         | 
| 25 | 
            +
                  <xs:element name="item" maxOccurs="unbounded">
         | 
| 26 | 
            +
                    <xs:complexType>
         | 
| 27 | 
            +
                      <xs:seq>
         | 
| 28 | 
            +
                        <xs:element name="title" type="xs:string"/>
         | 
| 29 | 
            +
                        <xs:element name="note" type="xs:string" minOccurs="0"/>
         | 
| 30 | 
            +
                        <xs:element name="quantity" type="xs:positiveInteger"/>
         | 
| 31 | 
            +
                        <xs:element name="price" type="xs:decimal"/>
         | 
| 32 | 
            +
                      </xs:seq>
         | 
| 33 | 
            +
                    </xs:complexType>
         | 
| 34 | 
            +
                  </xs:element>
         | 
| 35 | 
            +
                </xs:sequence>
         | 
| 36 | 
            +
                <xs:attribute name="orderid" type="xs:string" use="required"/>
         | 
| 37 | 
            +
                <xs:attribute name="foo" default="1" type="xs:integer" use="optional"/>
         | 
| 38 | 
            +
                <xs:attribute name="bar" use="prohibited"/>
         | 
| 39 | 
            +
              </xs:complexType>
         | 
| 40 | 
            +
            </xs:schema>
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="iso-8859-1" ?>
         | 
| 2 | 
            +
            <xs:schema xmlns="http://xml4r.org/libxml-ruby/test/shiporder"
         | 
| 3 | 
            +
                       xmlns:xs="http://www.w3.org/2001/XMLSchema"
         | 
| 4 | 
            +
                       targetNamespace="http://xml4r.org/libxml-ruby/test/shiporder">
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              <xs:element name="shiporder" type="shiporderFooType"/>
         | 
| 7 | 
            +
              <xs:complexType name="shiporderFooType">
         | 
| 8 | 
            +
                <xs:annotation>
         | 
| 9 | 
            +
                  <xs:documentation>Shiporder type documentation for Testing of imported schema</xs:documentation>
         | 
| 10 | 
            +
                </xs:annotation>
         | 
| 11 | 
            +
                <xs:sequence>
         | 
| 12 | 
            +
                  <xs:element name="orderperson" type="xs:string">
         | 
| 13 | 
            +
                    <xs:annotation>
         | 
| 14 | 
            +
                      <xs:documentation>orderperson element documentation</xs:documentation>
         | 
| 15 | 
            +
                    </xs:annotation>
         | 
| 16 | 
            +
                  </xs:element>
         | 
| 17 | 
            +
                  <xs:element name="shipto">
         | 
| 18 | 
            +
                    <xs:complexType>
         | 
| 19 | 
            +
                      <xs:sequence>
         | 
| 20 | 
            +
                        <xs:element name="name" type="xs:string"/>
         | 
| 21 | 
            +
                        <xs:element name="address" type="xs:string"/>
         | 
| 22 | 
            +
                        <xs:element name="city" type="xs:string"/>
         | 
| 23 | 
            +
                        <xs:element name="country" type="xs:string"/>
         | 
| 24 | 
            +
                        <xs:element name="phone" type="xs:string"/>
         | 
| 25 | 
            +
                      </xs:sequence>
         | 
| 26 | 
            +
                    </xs:complexType>
         | 
| 27 | 
            +
                  </xs:element>
         | 
| 28 | 
            +
                  <xs:element name="item" maxOccurs="unbounded">
         | 
| 29 | 
            +
                    <xs:complexType>
         | 
| 30 | 
            +
                      <xs:sequence>
         | 
| 31 | 
            +
                        <xs:element name="title" type="xs:string"/>
         | 
| 32 | 
            +
                        <xs:element name="note" type="xs:string" minOccurs="0"/>
         | 
| 33 | 
            +
                        <xs:element name="quantity" type="xs:positiveInteger"/>
         | 
| 34 | 
            +
                        <xs:element name="price" type="xs:decimal"/>
         | 
| 35 | 
            +
                        <xs:element name="discount" type="xs:decimal"/>
         | 
| 36 | 
            +
                      </xs:sequence>
         | 
| 37 | 
            +
                    </xs:complexType>
         | 
| 38 | 
            +
                  </xs:element>
         | 
| 39 | 
            +
                </xs:sequence>
         | 
| 40 | 
            +
                <xs:attribute name="orderid" type="xs:string" use="required"/>
         | 
| 41 | 
            +
                <xs:attribute name="foo" default="1" type="xs:integer" use="optional"/>
         | 
| 42 | 
            +
                <xs:attribute name="bar" type="xs:string" use="optional"/>
         | 
| 43 | 
            +
                <xs:attribute name="xyzzy" type="xs:string" use="prohibited"/>
         | 
| 44 | 
            +
              </xs:complexType>
         | 
| 45 | 
            +
            </xs:schema>
         | 
    
        data/test/test_schema.rb
    CHANGED
    
    | @@ -3,18 +3,19 @@ | |
| 3 3 | 
             
            require_relative './test_helper'
         | 
| 4 4 |  | 
| 5 5 | 
             
            class TestSchema < Minitest::Test
         | 
| 6 | 
            +
              Import_NS = 'http://xml4r.org/libxml-ruby/test/shiporder'.freeze
         | 
| 7 | 
            +
             | 
| 6 8 | 
             
              def setup
         | 
| 7 9 | 
             
                file = File.join(File.dirname(__FILE__), 'model/shiporder.xml')
         | 
| 8 10 | 
             
                @doc = LibXML::XML::Document.file(file)
         | 
| 11 | 
            +
                schema_file = File.join(File.dirname(__FILE__), 'model/shiporder.xsd')
         | 
| 12 | 
            +
                schema_doc = LibXML::XML::Document.file(schema_file)
         | 
| 13 | 
            +
                @schema = LibXML::XML::Schema.document(schema_doc)
         | 
| 9 14 | 
             
              end
         | 
| 10 15 |  | 
| 11 16 | 
             
              def teardown
         | 
| 12 17 | 
             
                @doc = nil
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
              def schema
         | 
| 16 | 
            -
                document = LibXML::XML::Document.file(File.join(File.dirname(__FILE__), 'model/shiporder.xsd'))
         | 
| 17 | 
            -
                LibXML::XML::Schema.document(document)
         | 
| 18 | 
            +
                @schema = nil
         | 
| 18 19 | 
             
              end
         | 
| 19 20 |  | 
| 20 21 | 
             
              def check_error(error)
         | 
| @@ -33,11 +34,50 @@ class TestSchema < Minitest::Test | |
| 33 34 | 
             
              end
         | 
| 34 35 |  | 
| 35 36 | 
             
              def test_load_from_doc
         | 
| 36 | 
            -
                assert_instance_of(LibXML::XML::Schema, schema)
         | 
| 37 | 
            +
                assert_instance_of(LibXML::XML::Schema, @schema)
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def test_schema_load_from_uri
         | 
| 41 | 
            +
                xlink_schema = LibXML::XML::Schema.new('http://www.w3.org/1999/xlink.xsd')
         | 
| 42 | 
            +
                assert_instance_of(LibXML::XML::Schema, xlink_schema)
         | 
| 43 | 
            +
                assert_instance_of(LibXML::XML::Schema::Element, xlink_schema.elements['title'])
         | 
| 44 | 
            +
                assert_instance_of(LibXML::XML::Schema::Type, xlink_schema.types['titleEltType'])
         | 
| 45 | 
            +
                assert_equal('http://www.w3.org/1999/xlink', xlink_schema.target_namespace)
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              def test_schema_from_string
         | 
| 49 | 
            +
                schema_file = File.join(File.dirname(__FILE__), 'model/shiporder.xsd')
         | 
| 50 | 
            +
                schema_from_str = LibXML::XML::Schema.from_string(File.read(schema_file))
         | 
| 51 | 
            +
                assert_instance_of(LibXML::XML::Schema, schema_from_str)
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def test_invalid_schema_doc
         | 
| 55 | 
            +
                bad_schema_file = File.join(File.dirname(__FILE__), 'model/shiporder_bad.xsd')
         | 
| 56 | 
            +
                bad_schema_doc = LibXML::XML::Document.file(bad_schema_file)
         | 
| 57 | 
            +
                bad_schema = nil
         | 
| 58 | 
            +
                ## Note: this type of error throws
         | 
| 59 | 
            +
                begin
         | 
| 60 | 
            +
                  bad_schema = LibXML::XML::Schema.document(bad_schema_doc)
         | 
| 61 | 
            +
                rescue LibXML::XML::Error => error
         | 
| 62 | 
            +
                  bad_schema = error
         | 
| 63 | 
            +
                  assert(error.message.match(/Error: Element '.*': The content is not valid. Expected is \(/))
         | 
| 64 | 
            +
                  assert_kind_of(LibXML::XML::Error, error)
         | 
| 65 | 
            +
                  assert_equal(LibXML::XML::Error::SCHEMASP, error.domain)
         | 
| 66 | 
            +
                  assert_equal(LibXML::XML::Error::SCHEMAP_S4S_ELEM_NOT_ALLOWED, error.code)
         | 
| 67 | 
            +
                  assert_equal(LibXML::XML::Error::ERROR, error.level)
         | 
| 68 | 
            +
                  assert(error.file.match(/shiporder_bad.xsd/))
         | 
| 69 | 
            +
                  assert_equal("Element '{http://www.w3.org/2001/XMLSchema}complexType'", error.str1)
         | 
| 70 | 
            +
                  refute_nil(error.str2)
         | 
| 71 | 
            +
                  assert_nil(error.str3)
         | 
| 72 | 
            +
                  assert_equal(0, error.int1)
         | 
| 73 | 
            +
                  assert_equal(0, error.int2)
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
                ## Last but not least, make sure we threw an error
         | 
| 76 | 
            +
                assert_instance_of(LibXML::XML::Error, bad_schema)
         | 
| 37 77 | 
             
              end
         | 
| 38 78 |  | 
| 39 79 | 
             
              def test_doc_valid
         | 
| 40 | 
            -
                assert(@doc.validate_schema(schema))
         | 
| 80 | 
            +
                assert(@doc.validate_schema(@schema))
         | 
| 41 81 | 
             
              end
         | 
| 42 82 |  | 
| 43 83 | 
             
              def test_doc_invalid
         | 
| @@ -45,7 +85,7 @@ class TestSchema < Minitest::Test | |
| 45 85 | 
             
                @doc.root << new_node
         | 
| 46 86 |  | 
| 47 87 | 
             
                error = assert_raises(LibXML::XML::Error) do
         | 
| 48 | 
            -
                  @doc.validate_schema(schema)
         | 
| 88 | 
            +
                  @doc.validate_schema(@schema)
         | 
| 49 89 | 
             
                end
         | 
| 50 90 |  | 
| 51 91 | 
             
                check_error(error)
         | 
| @@ -56,7 +96,7 @@ class TestSchema < Minitest::Test | |
| 56 96 |  | 
| 57 97 | 
             
              def test_reader_valid
         | 
| 58 98 | 
             
                reader = LibXML::XML::Reader.string(@doc.to_s)
         | 
| 59 | 
            -
                assert(reader.schema_validate(schema))
         | 
| 99 | 
            +
                assert(reader.schema_validate(@schema))
         | 
| 60 100 |  | 
| 61 101 | 
             
                while reader.read
         | 
| 62 102 | 
             
                end
         | 
| @@ -74,7 +114,7 @@ class TestSchema < Minitest::Test | |
| 74 114 | 
             
                reader = LibXML::XML::Reader.string(@doc.to_s)
         | 
| 75 115 |  | 
| 76 116 | 
             
                # Set a schema
         | 
| 77 | 
            -
                assert(reader.schema_validate(schema))
         | 
| 117 | 
            +
                assert(reader.schema_validate(@schema))
         | 
| 78 118 |  | 
| 79 119 | 
             
                while reader.read
         | 
| 80 120 | 
             
                end
         | 
| @@ -91,32 +131,55 @@ class TestSchema < Minitest::Test | |
| 91 131 |  | 
| 92 132 | 
             
              # Schema meta-data tests
         | 
| 93 133 | 
             
              def test_elements
         | 
| 94 | 
            -
                assert_instance_of(Hash, schema.elements)
         | 
| 95 | 
            -
                assert_equal(1, schema.elements.length)
         | 
| 96 | 
            -
                assert_instance_of(LibXML::XML::Schema::Element, schema.elements['shiporder'])
         | 
| 134 | 
            +
                assert_instance_of(Hash, @schema.elements)
         | 
| 135 | 
            +
                assert_equal(1, @schema.elements.length)
         | 
| 136 | 
            +
                assert_instance_of(LibXML::XML::Schema::Element, @schema.elements['shiporder'])
         | 
| 97 137 | 
             
              end
         | 
| 98 138 |  | 
| 99 139 | 
             
              def test_types
         | 
| 100 | 
            -
                assert_instance_of(Hash, schema.types)
         | 
| 101 | 
            -
                assert_equal(1, schema.types.length)
         | 
| 102 | 
            -
                assert_instance_of(LibXML::XML::Schema::Type, schema.types[' | 
| 140 | 
            +
                assert_instance_of(Hash, @schema.types)
         | 
| 141 | 
            +
                assert_equal(1, @schema.types.length)
         | 
| 142 | 
            +
                assert_instance_of(LibXML::XML::Schema::Type, @schema.types['shiporderType'])
         | 
| 103 143 | 
             
              end
         | 
| 104 144 |  | 
| 105 145 | 
             
              def test_imported_types
         | 
| 106 | 
            -
                assert_instance_of(Hash, schema.imported_types)
         | 
| 107 | 
            -
                assert_equal( | 
| 108 | 
            -
                assert_instance_of(LibXML::XML::Schema::Type, schema. | 
| 146 | 
            +
                assert_instance_of(Hash, @schema.imported_types)
         | 
| 147 | 
            +
                assert_equal(2, @schema.imported_types.length)
         | 
| 148 | 
            +
                assert_instance_of(LibXML::XML::Schema::Type, @schema.imported_types['shiporderType'])
         | 
| 149 | 
            +
                assert_instance_of(LibXML::XML::Schema::Type, @schema.imported_types['shiporderFooType'])
         | 
| 150 | 
            +
              end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              def test_imported_ns_types
         | 
| 153 | 
            +
                assert_instance_of(Hash, @schema.imported_ns_types)
         | 
| 154 | 
            +
                assert_equal(2, @schema.imported_ns_types.length)
         | 
| 155 | 
            +
                assert_equal(1, @schema.imported_ns_types[nil].length)
         | 
| 156 | 
            +
                assert_equal(1, @schema.imported_ns_types[Import_NS].length)
         | 
| 157 | 
            +
                assert_instance_of(LibXML::XML::Schema::Type, @schema.imported_ns_types[nil]['shiporderType'])
         | 
| 158 | 
            +
                assert_instance_of(LibXML::XML::Schema::Type, @schema.imported_ns_types[Import_NS]['shiporderFooType'])
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
              def test_imported_ns_elements
         | 
| 162 | 
            +
                assert_instance_of(Hash, @schema.imported_ns_elements)
         | 
| 163 | 
            +
                assert_equal(2, @schema.imported_ns_elements.length)
         | 
| 164 | 
            +
                assert_equal(1, @schema.imported_ns_elements[nil].length)
         | 
| 165 | 
            +
                assert_equal(1, @schema.imported_ns_elements[Import_NS].length)
         | 
| 166 | 
            +
                assert_instance_of(LibXML::XML::Schema::Element, @schema.imported_ns_elements[nil]['shiporder'])
         | 
| 167 | 
            +
                assert_instance_of(LibXML::XML::Schema::Element, @schema.imported_ns_elements[Import_NS]['shiporder'])
         | 
| 168 | 
            +
                assert_equal('shiporderType', @schema.imported_ns_elements[nil]['shiporder'].type.name)
         | 
| 169 | 
            +
                assert_equal('shiporderFooType', @schema.imported_ns_elements[Import_NS]['shiporder'].type.name)
         | 
| 109 170 | 
             
              end
         | 
| 110 171 |  | 
| 111 172 | 
             
              def test_namespaces
         | 
| 112 | 
            -
                assert_instance_of(Array, schema.namespaces)
         | 
| 113 | 
            -
                 | 
| 173 | 
            +
                assert_instance_of(Array, @schema.namespaces)
         | 
| 174 | 
            +
                ## For some reason, when importing another schema we end up with two xs->http://www.w3.org/2001/XMLSchema namespaces.
         | 
| 175 | 
            +
                ## So, we expect 3 here (one for Import_NS and then two for the schema namespace.
         | 
| 176 | 
            +
                assert_equal(3, @schema.namespaces.length)
         | 
| 114 177 | 
             
              end
         | 
| 115 178 |  | 
| 116 179 | 
             
              def test_schema_type
         | 
| 117 | 
            -
                type = schema.types[' | 
| 180 | 
            +
                type = @schema.types['shiporderType']
         | 
| 118 181 |  | 
| 119 | 
            -
                assert_equal(' | 
| 182 | 
            +
                assert_equal('shiporderType', type.name)
         | 
| 120 183 | 
             
                assert_nil(type.namespace)
         | 
| 121 184 | 
             
                assert_equal("Shiporder type documentation", type.annotation)
         | 
| 122 185 | 
             
                assert_instance_of(LibXML::XML::Node, type.node)
         | 
| @@ -130,22 +193,22 @@ class TestSchema < Minitest::Test | |
| 130 193 | 
             
              end
         | 
| 131 194 |  | 
| 132 195 | 
             
              def test_schema_element
         | 
| 133 | 
            -
                element = schema.types[' | 
| 196 | 
            +
                element = @schema.types['shiporderType'].elements['orderperson']
         | 
| 134 197 |  | 
| 135 198 | 
             
                assert_equal('orderperson', element.name)
         | 
| 136 199 | 
             
                assert_nil(element.namespace)
         | 
| 137 200 | 
             
                assert_equal("orderperson element documentation", element.annotation)
         | 
| 138 201 |  | 
| 139 | 
            -
                element = schema.types[' | 
| 202 | 
            +
                element = @schema.types['shiporderType'].elements['item']
         | 
| 140 203 | 
             
                assert_equal('item', element.name)
         | 
| 141 204 |  | 
| 142 | 
            -
                element = schema.types[' | 
| 205 | 
            +
                element = @schema.types['shiporderType'].elements['item'].type.elements['note']
         | 
| 143 206 | 
             
                assert_equal('note', element.name)
         | 
| 144 207 | 
             
                assert_equal('string', element.type.name)
         | 
| 145 208 | 
             
              end
         | 
| 146 209 |  | 
| 147 210 | 
             
              def test_schema_attributes
         | 
| 148 | 
            -
                type = schema.types[' | 
| 211 | 
            +
                type = @schema.types['shiporderType']
         | 
| 149 212 |  | 
| 150 213 | 
             
                assert_instance_of(Array, type.attributes)
         | 
| 151 214 | 
             
                assert_equal(2, type.attributes.length)
         | 
| @@ -153,14 +216,14 @@ class TestSchema < Minitest::Test | |
| 153 216 | 
             
              end
         | 
| 154 217 |  | 
| 155 218 | 
             
              def test_schema_attribute
         | 
| 156 | 
            -
                attribute = schema.types[' | 
| 219 | 
            +
                attribute = @schema.types['shiporderType'].attributes.first
         | 
| 157 220 |  | 
| 158 221 | 
             
                assert_equal("orderid", attribute.name)
         | 
| 159 222 | 
             
                assert_nil(attribute.namespace)
         | 
| 160 223 | 
             
                assert_equal(1, attribute.occurs)
         | 
| 161 224 | 
             
                assert_equal('string', attribute.type.name)
         | 
| 162 225 |  | 
| 163 | 
            -
                attribute = schema.types[' | 
| 226 | 
            +
                attribute = @schema.types['shiporderType'].attributes[1]
         | 
| 164 227 | 
             
                assert_equal(2, attribute.occurs)
         | 
| 165 228 | 
             
                assert_equal('1', attribute.default)
         | 
| 166 229 | 
             
                assert_equal('integer', attribute.type.name)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: libxml-ruby
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.2. | 
| 4 | 
            +
              version: 3.2.3
         | 
| 5 5 | 
             
            platform: x64-mingw-ucrt
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ross Bamform
         | 
| @@ -14,7 +14,7 @@ authors: | |
| 14 14 | 
             
            autorequire:
         | 
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 | 
            -
            date: 2022- | 
| 17 | 
            +
            date: 2022-05-22 00:00:00.000000000 Z
         | 
| 18 18 | 
             
            dependencies:
         | 
| 19 19 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 20 20 | 
             
              name: rake-compiler
         | 
| @@ -137,7 +137,7 @@ files: | |
| 137 137 | 
             
            - ext/libxml/ruby_xml_xpointer.c
         | 
| 138 138 | 
             
            - ext/libxml/ruby_xml_xpointer.h
         | 
| 139 139 | 
             
            - ext/vc/libxml_ruby.sln
         | 
| 140 | 
            -
            - lib/3. | 
| 140 | 
            +
            - lib/3.0/libxml_ruby.so
         | 
| 141 141 | 
             
            - lib/libxml-ruby.rb
         | 
| 142 142 | 
             
            - lib/libxml.rb
         | 
| 143 143 | 
             
            - lib/libxml/attr.rb
         | 
| @@ -215,6 +215,8 @@ files: | |
| 215 215 | 
             
            - test/model/shiporder.rng
         | 
| 216 216 | 
             
            - test/model/shiporder.xml
         | 
| 217 217 | 
             
            - test/model/shiporder.xsd
         | 
| 218 | 
            +
            - test/model/shiporder_bad.xsd
         | 
| 219 | 
            +
            - test/model/shiporder_import.xsd
         | 
| 218 220 | 
             
            - test/model/soap.xml
         | 
| 219 221 | 
             
            - test/model/xinclude.xml
         | 
| 220 222 | 
             
            - test/test_attr.rb
         |