[ 
https://issues.apache.org/jira/browse/THRIFT-5228?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jens Geyer updated THRIFT-5228:
-------------------------------
    Component/s: Python - Compiler

> gen python with recursive overwrite ttypes.py and self-import
> -------------------------------------------------------------
>
>                 Key: THRIFT-5228
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5228
>             Project: Thrift
>          Issue Type: Bug
>          Components: Python - Compiler
>    Affects Versions: 0.11.0
>            Reporter: qinluo
>            Priority: Major
>
> 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>
>  #
>  # Autogenerated by Thrift Compiler (0.11.0)
>  #
>  # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
>  #
>  # 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>
>  ```



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to