com.facebook.buck.rules.DefaultKnownBuildRuleTypes.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.buck.rules.DefaultKnownBuildRuleTypes.java

Source

/*
 * Copyright 2014-present Facebook, Inc.
 *
 * 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.
 */

package com.facebook.buck.rules;

import com.facebook.buck.android.FakeAndroidDirectoryResolver;
import com.facebook.buck.cli.BuckConfig;
import com.facebook.buck.cli.FakeBuckConfig;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.util.FakeProcess;
import com.facebook.buck.util.FakeProcessExecutor;
import com.facebook.buck.util.ProcessExecutorParams;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DefaultKnownBuildRuleTypes {

    private DefaultKnownBuildRuleTypes() {
        // Utility class.
    }

    private static final ProcessExecutorParams XCODE_SELECT_PARAMS = ProcessExecutorParams.builder()
            .setCommand(ImmutableList.of("xcode-select", "--print-path")).build();
    private static final FakeProcess XCODE_SELECT_PROCESS = new FakeProcess(0, "/path/to/xcode", "");

    private static final ImmutableMap<String, String> PYTHONS = ImmutableMap.of("python", "2.6.5", "python2",
            "2.6.5", "python3", "3.5.0");

    protected static ImmutableMap<ProcessExecutorParams, FakeProcess> getPythonProcessMap(List<String> paths) {
        Set<String> uniquePaths = new HashSet<>(paths);
        ImmutableMap.Builder<ProcessExecutorParams, FakeProcess> processMap = ImmutableMap.builder();
        for (Map.Entry<String, String> python : PYTHONS.entrySet()) {
            for (String path : uniquePaths) {
                for (String extension : new String[] { "", ".exe", ".EXE" }) {
                    processMap.put(
                            ProcessExecutorParams.builder()
                                    .setCommand(ImmutableList
                                            .of(path + File.separator + python.getKey() + extension, "-V"))
                                    .build(),
                            new FakeProcess(0, "Python " + python.getValue(), ""));
                }
            }
        }
        return processMap.build();
    }

    @VisibleForTesting
    public static List<String> getPaths(ImmutableMap<String, String> environemnt) {
        String pathEnv = environemnt.get("PATH");
        if (pathEnv == null) {
            return Collections.emptyList();
        }

        return Arrays.asList(pathEnv.split(File.pathSeparator));
    }

    public static KnownBuildRuleTypes getDefaultKnownBuildRuleTypes(ProjectFilesystem filesystem,
            ImmutableMap<String, String> environment) throws InterruptedException, IOException {
        BuckConfig config = FakeBuckConfig.builder().setFilesystem(filesystem).build();
        List<String> paths = getPaths(environment);

        return KnownBuildRuleTypes.createInstance(config,
                new FakeProcessExecutor(ImmutableMap.<ProcessExecutorParams, FakeProcess>builder()
                        .put(XCODE_SELECT_PARAMS, XCODE_SELECT_PROCESS).putAll(getPythonProcessMap(paths)).build()),
                new FakeAndroidDirectoryResolver(), Optional.<Path>absent());
    }

}