class FixProtocolTools::MessagesProcessor
Constants
- MESSAGE_DELIMITER
Public Class Methods
new(options)
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 10 def initialize(options) @spec = nil @is_even_line = true @output = STDOUT @grep = options[:grep] @highlights = options[:highlights] || [] @heartbeats = options[:heartbeats] if options[:dictionary] @spec = Specification::Dictionary.new(Specification::Reader.read_file(options[:dictionary])) end end
Public Instance Methods
process()
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 23 def process() buffer = nil ARGF.each do |line| line = line.gsub(/\r/, '').chomp if buffer buffer += line if buffer =~ /8=FIX.*[A\x01]10=\d+/ process_line(buffer) buffer = nil end else if line =~ /8=FIX/ && !(line =~ /[A\x01]10=\d+/) buffer = line else process_line(line) end end end process_line(buffer) if buffer end
Private Instance Methods
fix_message_fields(line)
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 111 def fix_message_fields(line) start_index = line.index("8=FIX") end_index = line.rindex(MESSAGE_DELIMITER) if start_index && end_index line[start_index ... end_index].split(MESSAGE_DELIMITER).map do |pair| pair.strip.split '=' end else nil end end
formatted_row(field_id, value_id, field_name, value_name, field_name_padding)
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 94 def formatted_row(field_id, value_id, field_name, value_name, field_name_padding) row = field_name + ' = '.rjust(field_name_padding) + value_name + ' '.rjust(35 - value_name.length) + field_id + '=' + value_id if @highlights and @highlights.include?(field_name) yellow(row) else row end end
print_row(line)
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 48 def print_row(line) @output.puts(@is_even_line ? green(line) : line) @is_even_line = !@is_even_line end
process_line(line)
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 53 def process_line(line) fields = fix_message_fields(line.gsub('^A', MESSAGE_DELIMITER)) return unless fields @spec ||= resolve_specification(fields) rows = [] show_message = @grep.nil? message_name = 'Undefined' sender = 'Undefined' target = 'Undefined' fields.each do |field_id, value_id| field_name = @spec.field_name(field_id) || field_id field_name_padding = @spec.max_field_length - field_name.length - 2 value_name = if @spec.message_type?(field_id) message_name = @spec.message_type(value_id) else @spec.enum_value(field_id, value_id) end sender = value_name if @spec.sender? field_id target = value_name if @spec.target? field_id if @grep && (value_name.include?(@grep) || value_id.include?(@grep)) value_name = red(value_name) show_message = true end show_message = false if !@heartbeats && @spec.heartbeat?(field_id, value_id) rows << formatted_row(field_id, value_id, field_name, value_name, field_name_padding) end if show_message @is_even_line = false @output.puts '' @output.puts("[#{red(message_name + " #{sender} >>> #{target}")}]" + yellow(" =-=-=-=-=-=-==-=-=-=-=-=-==-=-=-=-=-=-= ")) rows.each { |row| print_row(row) } end end
resolve_specification(fields)
click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 106 def resolve_specification(fields) fix_version = fields[0].last Specification::Dictionary.new(Specification::Reader.read_defaults(fix_version)) end