Rename WebKitTools to Tools
[WebKit-https.git] / Tools / Scripts / webkitpy / layout_tests / port / factory.py
1 #!/usr/bin/env python
2 # Copyright (C) 2010 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7 #
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 """Factory method to retrieve the appropriate port implementation."""
31
32
33 import sys
34
35 ALL_PORT_NAMES = ['test', 'dryrun', 'mac', 'win', 'gtk', 'qt', 'chromium-mac',
36                   'chromium-linux', 'chromium-win', 'google-chrome-win',
37                   'google-chrome-mac', 'google-chrome-linux32', 'google-chrome-linux64']
38
39
40 def get(port_name=None, options=None, **kwargs):
41     """Returns an object implementing the Port interface. If
42     port_name is None, this routine attempts to guess at the most
43     appropriate port on this platform."""
44     # Wrapped for backwards-compatibility
45     if port_name:
46         kwargs['port_name'] = port_name
47     if options:
48         kwargs['options'] = options
49     return _get_kwargs(**kwargs)
50
51
52 def _get_kwargs(**kwargs):
53     port_to_use = kwargs.get('port_name', None)
54     options = kwargs.get('options', None)
55     if port_to_use is None:
56         if sys.platform == 'win32' or sys.platform == 'cygwin':
57             if options and hasattr(options, 'chromium') and options.chromium:
58                 port_to_use = 'chromium-win'
59             else:
60                 port_to_use = 'win'
61         elif sys.platform == 'linux2':
62             port_to_use = 'chromium-linux'
63         elif sys.platform == 'darwin':
64             if options and hasattr(options, 'chromium') and options.chromium:
65                 port_to_use = 'chromium-mac'
66             else:
67                 port_to_use = 'mac'
68
69     if port_to_use is None:
70         raise NotImplementedError('unknown port; sys.platform = "%s"' %
71                                   sys.platform)
72
73     if port_to_use == 'test':
74         import test
75         maker = test.TestPort
76     elif port_to_use.startswith('dryrun'):
77         import dryrun
78         maker = dryrun.DryRunPort
79     elif port_to_use.startswith('mac'):
80         import mac
81         maker = mac.MacPort
82     elif port_to_use.startswith('win'):
83         import win
84         maker = win.WinPort
85     elif port_to_use.startswith('gtk'):
86         import gtk
87         maker = gtk.GtkPort
88     elif port_to_use.startswith('qt'):
89         import qt
90         maker = qt.QtPort
91     elif port_to_use.startswith('chromium-gpu'):
92         import chromium_gpu
93         maker = chromium_gpu.get
94     elif port_to_use.startswith('chromium-mac'):
95         import chromium_mac
96         maker = chromium_mac.ChromiumMacPort
97     elif port_to_use.startswith('chromium-linux'):
98         import chromium_linux
99         maker = chromium_linux.ChromiumLinuxPort
100     elif port_to_use.startswith('chromium-win'):
101         import chromium_win
102         maker = chromium_win.ChromiumWinPort
103     elif port_to_use.startswith('google-chrome'):
104         import google_chrome
105         maker = google_chrome.GetGoogleChromePort
106     else:
107         raise NotImplementedError('unsupported port: %s' % port_to_use)
108     return maker(**kwargs)
109
110 def get_all(options=None):
111     """Returns all the objects implementing the Port interface."""
112     return dict([(port_name, get(port_name, options=options))
113                  for port_name in ALL_PORT_NAMES])