Uploaded image for project: 'Apache Avro'
  1. Apache Avro
  2. AVRO-1651

Python-Avro fails to recognize previously defined types if they're not in the same namespace

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.7.7
    • None
    • python

    Description

      If you reference a named type in a record, but the named type doesn't have the same namespace as the record (or doesn't have a namespace, while the record does), Python-Avro fails to recognize the named type. Here are five Python scripts that illustrate the problem:

      import avro.schema
      names = avro.schema.Names()
      avro.schema.make_avsc_object(

      {"type": "enum", "name": "Hello", "symbols": ["one", "two", "three"]}

      , names)
      avro.schema.make_avsc_object({"type": "record", "name": "There", "fields": [

      {"name": "Wow", "type": "Hello"}

      ]}, names)

      1. works

      import avro.schema
      names = avro.schema.Names()
      avro.schema.make_avsc_object(

      {"type": "enum", "name": "Hello", "symbols": ["one", "two", "three"]}

      , names)
      avro.schema.make_avsc_object({"type": "record", "name": "There", "namespace": "com.wowie", "fields": [

      {"name": "Wow", "type": "Hello"}

      ]}, names)

      1. doesn't work

      import avro.schema
      names = avro.schema.Names()
      avro.schema.make_avsc_object(

      {"type": "enum", "name": "Hello", "namespace": "com.wowie", "symbols": ["one", "two", "three"]}

      , names)
      avro.schema.make_avsc_object({"type": "record", "name": "There", "namespace": "com.wowie", "fields": [

      {"name": "Wow", "type": "Hello"}

      ]}, names)

      1. works

      import avro.schema
      names = avro.schema.Names()
      avro.schema.make_avsc_object(

      {"type": "enum", "name": "Hello", "namespace": "com.wowie", "symbols": ["one", "two", "three"]}

      , names)
      avro.schema.make_avsc_object({"type": "record", "name": "There", "namespace": "com.wowie", "fields": [

      {"name": "Wow", "type": "com.wowie.Hello"}

      ]}, names)

      1. works

      import avro.schema
      names = avro.schema.Names()
      avro.schema.make_avsc_object(

      {"type": "enum", "name": "Hello", "namespace": "com.wowie", "symbols": ["one", "two", "three"]}

      , names)
      avro.schema.make_avsc_object({"type": "record", "name": "There", "fields": [

      {"name": "Wow", "type": "com.wowie.Hello"}

      ]}, names)

      1. works

      The equivalent Java programs (using Avro-Java) do work:

      import org.apache.avro.Schema.Parser;
      Parser p = new Parser;
      p.parse("""

      {"type": "enum", "name": "Hello", "symbols": ["one", "two", "three"]}

      """);
      p.parse("""{"type": "record", "name": "There", "fields": [

      {"name": "Wow", "type": "Hello"}

      ]}""");
      // works

      import org.apache.avro.Schema.Parser;
      Parser p = new Parser;
      p.parse("""

      {"type": "enum", "name": "Hello", "symbols": ["one", "two", "three"]}

      """);
      p.parse("""{"type": "record", "name": "There", "namespace": "com.wowie", "fields": [

      {"name": "Wow", "type": "Hello"}

      ]}""");
      // works

      import org.apache.avro.Schema.Parser;
      Parser p = new Parser;
      p.parse("""

      {"type": "enum", "name": "Hello", "namespace": "com.wowie", "symbols": ["one", "two", "three"]}

      """);
      p.parse("""{"type": "record", "name": "There", "namespace": "com.wowie", "fields": [

      {"name": "Wow", "type": "Hello"}

      ]}""");
      // works

      import org.apache.avro.Schema.Parser;
      Parser p = new Parser;
      p.parse("""

      {"type": "enum", "name": "Hello", "namespace": "com.wowie", "symbols": ["one", "two", "three"]}

      """);
      p.parse("""{"type": "record", "name": "There", "namespace": "com.wowie", "fields": [

      {"name": "Wow", "type": "com.wowie.Hello"}

      ]}""");
      // works

      import org.apache.avro.Schema.Parser;
      Parser p = new Parser;
      p.parse("""

      {"type": "enum", "name": "Hello", "namespace": "com.wowie", "symbols": ["one", "two", "three"]}

      """);
      p.parse("""{"type": "record", "name": "There", "fields": [

      {"name": "Wow", "type": "com.wowie.Hello"}

      ]}""");
      // works

      Attachments

        Activity

          People

            Unassigned Unassigned
            jpivarski Jim Pivarski
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: