|  | # | 
|  | # Copyright 2017 The Cobalt Authors. All Rights Reserved. | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | # | 
|  | """Functionality to enumerate and represent starboard ports.""" | 
|  |  | 
|  | import os | 
|  | import _env | 
|  | from starboard.tools import environment | 
|  |  | 
|  | # The name->platform path mapping. | 
|  | _PATH_MAP = $platforms_map | 
|  | _PATH_MAP = {k:os.path.normpath(v) for k,v in _PATH_MAP.iteritems()} | 
|  |  | 
|  |  | 
|  | # Cache of the name->PlatformInfo mapping. | 
|  | _INFO_MAP = None | 
|  |  | 
|  |  | 
|  | def _ConstructInfoMap(): | 
|  | """Constructs mapping of platform names to PlatformInfo objects. | 
|  |  | 
|  | Returns: | 
|  | A Mapping of name->PlatformInfo. | 
|  | """ | 
|  | result = {} | 
|  | for name, path in _PATH_MAP.iteritems(): | 
|  | result[name] = PlatformInfo(name, path) | 
|  | return result | 
|  |  | 
|  |  | 
|  | def _GetInfoMap(): | 
|  | """Gets mapping of platform names to PlatformInfo objects.""" | 
|  | global _INFO_MAP | 
|  | if not _INFO_MAP: | 
|  | _INFO_MAP = _ConstructInfoMap() | 
|  | return _INFO_MAP | 
|  |  | 
|  |  | 
|  | # Cache of the sorted list of all platform names. | 
|  | _ALL = None | 
|  |  | 
|  |  | 
|  | def GetAll(): | 
|  | """Gets a sorted list of all valid Starboard platform names.""" | 
|  | global _ALL | 
|  | if not _ALL: | 
|  | _ALL = sorted(_GetInfoMap().keys()) | 
|  | return _ALL | 
|  |  | 
|  |  | 
|  | def Get(platform_name): | 
|  | """Gets the PlatformInfo for the given platform name, or None.""" | 
|  | return _GetInfoMap().get(platform_name) | 
|  |  | 
|  |  | 
|  | def GetAllInfos(): | 
|  | """Gets a sorted sequence of PlatformInfo objects for all valid platforms.""" | 
|  | return (Get(p) for p in GetAll()) | 
|  |  | 
|  |  | 
|  | def IsValid(platform_name): | 
|  | """Determines whether the given platform name is valid.""" | 
|  | return platform_name in _GetInfoMap() | 
|  |  | 
|  |  | 
|  | class PlatformInfo(object): | 
|  | """Information about a specific Starboard platform.""" | 
|  |  | 
|  | def __init__(self, name, path): | 
|  | self.name = name | 
|  | self.path = path |