github.com/aneshas/cli@v0.0.0-20180104210444-aec958fa47db/langs/python.go (about)

     1  package langs
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  type PythonLangHelper struct {
     9  	BaseHelper
    10  	Version string
    11  }
    12  
    13  func (h *PythonLangHelper) Handles(lang string) bool {
    14  	return defaultHandles(h, lang)
    15  }
    16  func (h *PythonLangHelper) Runtime() string {
    17  	return h.LangStrings()[0]
    18  }
    19  
    20  // TODO: I feel like this whole versioning thing here could be done better. eg: `runtime: python:2` where we have a single lang, but support versions in tags (like docker tags).
    21  func (lh *PythonLangHelper) LangStrings() []string {
    22  	if strings.HasPrefix(lh.Version, "3.6") {
    23  		return []string{"python3.6"}
    24  	}
    25  	return []string{"python", "python2.7"}
    26  }
    27  func (lh *PythonLangHelper) Extensions() []string {
    28  	return []string{".py"}
    29  }
    30  
    31  func (lh *PythonLangHelper) BuildFromImage() (string, error) {
    32  	return fmt.Sprintf("fnproject/python:%v", lh.Version), nil
    33  }
    34  
    35  func (lh *PythonLangHelper) RunFromImage() (string, error) {
    36  	return fmt.Sprintf("fnproject/python:%v", lh.Version), nil
    37  }
    38  
    39  func (lh *PythonLangHelper) Entrypoint() (string, error) {
    40  	python := "python2"
    41  	if strings.HasPrefix(lh.Version, "3.6") {
    42  		python = "python3"
    43  	}
    44  	return fmt.Sprintf("%v func.py", python), nil
    45  }
    46  
    47  func (h *PythonLangHelper) DockerfileBuildCmds() []string {
    48  	pip := "pip"
    49  	if strings.HasPrefix(h.Version, "3.6") {
    50  		pip = "pip3"
    51  	}
    52  	r := []string{}
    53  	if exists("requirements.txt") {
    54  		r = append(r,
    55  			"ADD requirements.txt /function/",
    56  			fmt.Sprintf("RUN %v install -r requirements.txt", pip),
    57  		)
    58  	}
    59  	r = append(r, "ADD . /function/")
    60  	return r
    61  }
    62  
    63  func (h *PythonLangHelper) IsMultiStage() bool {
    64  	return false
    65  }
    66  
    67  // The multi-stage build didn't work, pip seems to be required for it to load the modules
    68  // func (h *PythonLangHelper) DockerfileCopyCmds() []string {
    69  // return []string{
    70  // "ADD . /function/",
    71  // "COPY --from=build-stage /root/.cache/pip/ /root/.cache/pip/",
    72  // }
    73  // }