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 6import sys 7 8def 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 65if __name__ == '__main__': 66 sys.exit(main()) 67