class GeneratorPython
def initialize(type, major, minor, sp, verid, dir)
@type = type
@major = major
@minor = minor
@beginstring = type + "." + major + "." + minor
if @type == "FIX" && major >= "5"
@beginstring = "FIXT.1.1"
end
@depth = 0;
@dir = dir + "/"
if( sp != "0" )
@f = createFile( "quick" + type.downcase + major + minor + "sp#{sp}" + ".py" )
else
@f = createFile( "quick" + type.downcase + major + minor + ".py" )
end
@verid = verid
@messageStarted = false
end
def createFile(name)
attr = File::CREAT|File::TRUNC|File::RDWR
return File.new(@dir + name, attr, 0644)
end
def tabs
count = 0
result = ""
while (count != @depth)
result += "\t"
count += 1
end
return result
end
def front
@f.puts "import quickfix as fix"
@f.puts
end
def field(name, number)
end
def headerStart
end
def headerEnd
end
def trailerStart
end
def trailerEnd
end
def baseMessageStart
@f.puts tabs + "class Message(fix.Message):"
@depth += 1
@f.puts tabs + "def __init__(self):"
@depth += 1
@f.puts tabs + "fix.Message.__init__(self)"
@f.puts tabs + "self.getHeader().setField( fix.BeginString(" + "\"" + @beginstring + "\"" + ") )"
if( @verid != "0" )
@f.puts tabs + "self.getHeader().setField( fix.ApplVerID(" + "\"" + @verid + "\"" +") )"
end
@depth -= 1
@depth -= 1
end
def baseMessageEnd
end
def groupStart(name, number, delim, order)
return if @messageStarted == false
@f.puts
@depth += 1
@f.puts tabs + "class " + name + "(fix.Group):"
@depth += 1
@f.puts tabs + "def __init__(self):"
@depth += 1
@f.puts tabs + "order = fix.IntArray(#{order.size+1})"
order.each_index { |i| @f.puts tabs + "order[#{i}] = #{order[i]}" }
@f.puts tabs + "order[#{order.size}] = 0"
@f.puts tabs + "fix.Group.__init__(self, #{number}, #{delim}, order)"
@depth -= 1
@depth -= 1
end
def groupEnd
return if @messageStarted == false
@depth -= 1
end
def messageStart(name, msgtype, required)
@messageStarted = true;
@f.puts
@f.puts tabs + "class " + name + "(Message):"
@depth += 1
@f.puts tabs + "def __init__(self):"
@depth += 1
@f.puts tabs + "Message.__init__(self)"
@f.puts tabs + "self.getHeader().setField( fix.MsgType(" + "\"" + msgtype + "\") )"
@depth -= 1
@depth -= 1
end
def messageEnd
@messageStarted = false
end
def fieldsStart
@f = createFile("quickfix_fields.py")
@f.puts tabs + "import quickfix"
@f.puts
end
def fieldType( name, type )
return "CheckSum" if name == "CheckSum"
return "Char" if type == "CHAR"
return "Double" if type == "PRICE"
return "Int" if type == "INT"
return "Double" if type == "AMT"
return "Double" if type == "QTY"
return "UtcTimeStamp" if type == "UTCTIMESTAMP"
return "Bool" if type == "BOOLEAN"
return "Double" if type == "FLOAT"
return "Double" if type == "PRICEOFFSET"
return "UtcDate" if type == "UTCDATE"
return "UtcDate" if type == "UTCDATEONLY"
return "UtcTimeOnly" if type == "UTCTIMEONLY"
return "Int" if type == "NUMINGROUP"
return "Double" if type == "PERCENTAGE"
return "Int" if type == "SEQNUM"
return "Int" if type == "LENGTH"
return "String"
end
def fields(name, number, type, values)
@f.puts tabs + "class #{name}(quickfix.#{fieldType(name, type)}Field):"
@depth += 1
@f.puts tabs + "def __init__(self, data = None):"
@depth += 1
@f.puts tabs + "if data == None:"
@depth += 1
@f.puts tabs + "quickfix.#{fieldType(name, type)}Field.__init__(self, #{number})"
@depth -= 1
@f.puts tabs + "else:"
@depth += 1
@f.puts tabs + "quickfix.#{fieldType(name, type)}Field.__init__(self, #{number}, data)"
@depth -= 1
@depth -= 1
@depth -= 1
@f.puts
end
def fieldsEnd
@f.close
end
def back
@f.close
end
end