Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-5228

gen python with recursive overwrite ttypes.py and self-import

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 0.11.0
    • None
    • Python - Compiler
    • None

    Description

      thrift generate python code overwrite `ttypes.py`, does not include all things defined in different IDL files with same namespace, and `a self-import` would also occur. But generate for go or java would be as expected, i.e., in different files.

      one can use the following snippets to re-produce the wired things

      ```
      $ thrift --version

      Thrift version 0.11.0
      ```

      IDL definition
      `crop.thrift`
      ```
      namespace py test_thrift.common.media
      namespace go test_thrift.common.media

      struct CropRequest

      {   1: optional list<string> ratio; }

      ```

       

      `media.thrift`
      ```
      include "crop.thrift"

      namespace py test_thrift.common.media
      namespace go test_thrift.common.media

      enum MediaType

      {   UNKNOWN = 0;   IMAGE = 1;   VIDEO = 2; }

      struct Identifier

      {   1: optional MediaType media_type;   2: optional string token; }

      struct Request

      {   3: optional Identifier identifier;   20: optional crop.CropRequest crop_request; }

      ```

      generate code for python/go
      ```
      $ thrift -r -gen py media.thrift
      $ thrift -r -gen go media.thrift
      ```

      ```
      ├── gen-go
      │   └── test_thrift
      │   └── common
      │   └── media
      │   ├── GoUnusedProtection__.go
      │   ├── crop-consts.go
      │   ├── crop.go
      │   ├── media-consts.go
      │   └── media.go
      ├── gen-py
      │   ├── _init_.py
      │   └── test_thrift
      │   ├── _init_.py
      │   └── common
      │   ├── _init_.py
      │   └── media
      │   ├── _init_.py
      │   ├── constants.py
      │   └── ttypes.py
      ```

      things in `gen-py/test_thrift/common/media/ttypes.py` does not include the definitions in `crop.thrift`, and there is a `self import`: (`import test_thrift.common.media.ttypes` )

      looks like

      <details><pre><code>
      #

      1. Autogenerated by Thrift Compiler (0.11.0)
        #
      2. DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
        #
      3. options string: py
        #

      from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
      from thrift.protocol.TProtocol import TProtocolException
      from thrift.TRecursive import fix_spec

      import sys
      import test_thrift.common.media.ttypes

      from thrift.transport import TTransport
      all_structs = []

      class MediaType(object):
      UNKNOWN = 0
      IMAGE = 1
      VIDEO = 2

      _VALUES_TO_NAMES =

      { 0: "UNKNOWN", 1: "IMAGE", 2: "VIDEO", }

      _NAMES_TO_VALUES =

      { "UNKNOWN": 0, "IMAGE": 1, "VIDEO": 2, }

      class Identifier(object):
      """
      Attributes:

      • media_type
      • token
        """

      def _init_(self, media_type=None, token=None,):
      self.media_type = media_type
      self.token = token

      def read(self, iprot):
      if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
      iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
      return
      iprot.readStructBegin()
      while True:
      (fname, ftype, fid) = iprot.readFieldBegin()
      if ftype == TType.STOP:
      break
      if fid == 1:
      if ftype == TType.I32:
      self.media_type = iprot.readI32()
      else:
      iprot.skip(ftype)
      elif fid == 2:
      if ftype == TType.STRING:
      self.token = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
      else:
      iprot.skip(ftype)
      else:
      iprot.skip(ftype)
      iprot.readFieldEnd()
      iprot.readStructEnd()

      def write(self, oprot):
      if oprot._fast_encode is not None and self.thrift_spec is not None:
      oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
      return
      oprot.writeStructBegin('Identifier')
      if self.media_type is not None:
      oprot.writeFieldBegin('media_type', TType.I32, 1)
      oprot.writeI32(self.media_type)
      oprot.writeFieldEnd()
      if self.token is not None:
      oprot.writeFieldBegin('token', TType.STRING, 2)
      oprot.writeString(self.token.encode('utf-8') if sys.version_info[0] == 2 else self.token)
      oprot.writeFieldEnd()
      oprot.writeFieldStop()
      oprot.writeStructEnd()

      def validate(self):
      return

      def _repr_(self):
      L = ['%s=%r' % (key, value)
      for key, value in self._dict_.items()]
      return '%s(%s)' % (self._class.name_, ', '.join(L))

      def _eq_(self, other):
      return isinstance(other, self._class) and self.dict_ == other._dict_

      def _ne_(self, other):
      return not (self == other)

      class Request(object):
      """
      Attributes:

      • identifier
      • crop_request
        """

      def _init_(self, identifier=None, crop_request=None,):
      self.identifier = identifier
      self.crop_request = crop_request

      def read(self, iprot):
      if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
      iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
      return
      iprot.readStructBegin()
      while True:
      (fname, ftype, fid) = iprot.readFieldBegin()
      if ftype == TType.STOP:
      break
      if fid == 3:
      if ftype == TType.STRUCT:
      self.identifier = Identifier()
      self.identifier.read(iprot)
      else:
      iprot.skip(ftype)
      elif fid == 20:
      if ftype == TType.STRUCT:
      self.crop_request = test_thrift.common.media.ttypes.CropRequest()
      self.crop_request.read(iprot)
      else:
      iprot.skip(ftype)
      else:
      iprot.skip(ftype)
      iprot.readFieldEnd()
      iprot.readStructEnd()

      def write(self, oprot):
      if oprot._fast_encode is not None and self.thrift_spec is not None:
      oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
      return
      oprot.writeStructBegin('Request')
      if self.identifier is not None:
      oprot.writeFieldBegin('identifier', TType.STRUCT, 3)
      self.identifier.write(oprot)
      oprot.writeFieldEnd()
      if self.crop_request is not None:
      oprot.writeFieldBegin('crop_request', TType.STRUCT, 20)
      self.crop_request.write(oprot)
      oprot.writeFieldEnd()
      oprot.writeFieldStop()
      oprot.writeStructEnd()

      def validate(self):
      return

      def _repr_(self):
      L = ['%s=%r' % (key, value)
      for key, value in self._dict_.items()]
      return '%s(%s)' % (self._class.name_, ', '.join(L))

      def _eq_(self, other):
      return isinstance(other, self._class) and self.dict_ == other._dict_

      def _ne_(self, other):
      return not (self == other)
      all_structs.append(Identifier)
      Identifier.thrift_spec = (
      None, # 0
      (1, TType.I32, 'media_type', None, None, ), # 1
      (2, TType.STRING, 'token', 'UTF8', None, ), # 2
      )
      all_structs.append(Request)
      Request.thrift_spec = (
      None, # 0
      None, # 1
      None, # 2
      (3, TType.STRUCT, 'identifier', [Identifier, None], None, ), # 3
      None, # 4
      None, # 5
      None, # 6
      None, # 7
      None, # 8
      None, # 9
      None, # 10
      None, # 11
      None, # 12
      None, # 13
      None, # 14
      None, # 15
      None, # 16
      None, # 17
      None, # 18
      None, # 19
      (20, TType.STRUCT, 'crop_request', [test_thrift.common.media.ttypes.CropRequest, None], None, ), # 20
      )
      fix_spec(all_structs)
      del all_structs
      </code></pre></details>
      ```

      Attachments

        Activity

          People

            Unassigned Unassigned
            qinluo qinluo
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: