Home | History | Annotate | Download | only in tools
      1 #!/usr/bin/env python
      2 # Copyright 2013 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 import sys
      7 
      8 def main():
      9   """Converts a vertical serialization into a compact, horizontal serialization.
     10   """
     11 
     12   COLUMNS = ['First name', 'Middle name', 'Last name', 'Email', 'Company name',
     13              'Address line 1', 'Address line 2', 'City', 'State', 'ZIP code',
     14              'Country', 'Phone']
     15 
     16   if len(sys.argv) != 2:
     17     print "Usage: python flatten.py <path/to/serialized_profiles>"
     18     return
     19 
     20   profiles = [COLUMNS]
     21   with open(sys.argv[1], 'r') as serialized_profiles:
     22     profile = []
     23     previous_field_type = ''
     24     for line in serialized_profiles:
     25       # Trim the newline if present.
     26       if line[-1] == '\n':
     27         line = line[:-1]
     28 
     29       if line == "---":
     30         if len(profile):
     31           # Reached the end of a profile.
     32           # Save the current profile and prepare to build up the next one.
     33           profiles.append(profile)
     34           profile = []
     35       else:
     36         # Append the current field's value to the current profile.
     37         line_parts = line.split(': ', 1)
     38         field_type = line_parts[0]
     39         field_value = line_parts[1]
     40         if field_type != previous_field_type:
     41           profile.append("'%s'" % field_value)
     42         else:
     43           # This is a non-primary value for a multi-valued field.
     44           profile[-1] += ", '%s'" % field_value
     45         previous_field_type = field_type
     46 
     47     if len(profile):
     48       profiles.append(profile)
     49 
     50   # Prepare format strings so that we can align the contents of each column.
     51   transposed = zip(*profiles)
     52   column_widths = []
     53   for column in transposed:
     54     widths = [len(value) for value in column]
     55     column_widths.append(max(widths))
     56   column_formats = ["{0:<" + str(width) + "}" for width in column_widths]
     57 
     58   for profile in profiles:
     59     profile_format = zip(column_formats, profile)
     60     profile = [format_.format(value) for (format_, value) in profile_format]
     61     print " | ".join(profile)
     62   return 0
     63 
     64 
     65 if __name__ == '__main__':
     66   sys.exit(main())
     67