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 // }