github.com/aneshas/cli@v0.0.0-20180104210444-aec958fa47db/langs/ruby.go (about) 1 package langs 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 ) 9 10 type RubyLangHelper struct { 11 BaseHelper 12 } 13 14 func (h *RubyLangHelper) Handles(lang string) bool { 15 return defaultHandles(h, lang) 16 } 17 func (h *RubyLangHelper) Runtime() string { 18 return h.LangStrings()[0] 19 } 20 21 func (lh *RubyLangHelper) LangStrings() []string { 22 return []string{"ruby"} 23 } 24 func (lh *RubyLangHelper) Extensions() []string { 25 return []string{".rb"} 26 } 27 28 func (lh *RubyLangHelper) BuildFromImage() (string, error) { 29 return "fnproject/ruby:dev", nil 30 } 31 32 func (lh *RubyLangHelper) RunFromImage() (string, error) { 33 return "fnproject/ruby", nil 34 } 35 36 func (h *RubyLangHelper) DockerfileBuildCmds() []string { 37 r := []string{} 38 if exists("Gemfile") { 39 r = append(r, 40 "ADD Gemfile* /function/", 41 "RUN bundle install", 42 ) 43 } 44 return r 45 } 46 47 func (h *RubyLangHelper) DockerfileCopyCmds() []string { 48 return []string{ 49 "COPY --from=build-stage /usr/lib/ruby/gems/ /usr/lib/ruby/gems/", // skip this if no Gemfile? Does it matter? 50 "ADD . /function/", 51 } 52 } 53 54 func (lh *RubyLangHelper) Entrypoint() (string, error) { 55 return "ruby func.rb", nil 56 } 57 58 func (lh *RubyLangHelper) HasBoilerplate() bool { return true } 59 60 func (lh *RubyLangHelper) GenerateBoilerplate() error { 61 wd, err := os.Getwd() 62 if err != nil { 63 return err 64 } 65 msg := "%s already exists, can't generate boilerplate" 66 codeFile := filepath.Join(wd, "func.rb") 67 if exists(codeFile) { 68 return fmt.Errorf(msg, "func.rb") 69 } 70 gemFile := filepath.Join(wd, "Gemfile") 71 if exists(gemFile) { 72 return fmt.Errorf(msg, "Gemfile") 73 } 74 testFile := filepath.Join(wd, "test.json") 75 if exists(testFile) { 76 return fmt.Errorf(msg, "test.json") 77 } 78 79 if err := ioutil.WriteFile(codeFile, []byte(rubySrcBoilerplate), os.FileMode(0644)); err != nil { 80 return err 81 } 82 83 if err := ioutil.WriteFile(gemFile, []byte(rubyGemfileBoilerplate), os.FileMode(0644)); err != nil { 84 return err 85 } 86 87 if err := ioutil.WriteFile(testFile, []byte(rubyTestBoilerPlate), os.FileMode(0644)); err != nil { 88 return err 89 } 90 return nil 91 } 92 93 const ( 94 rubySrcBoilerplate = `require 'json' 95 96 # Default value(s) 97 name = "World" 98 99 # Parse input 100 payload = STDIN.read 101 if payload != "" 102 payload = JSON.parse(payload) 103 name = payload['name'] 104 end 105 106 # Print response 107 x = {message:"Hello #{name}"} 108 # STDERR.puts x.inspect 109 puts x.to_json 110 111 # Logging 112 STDERR.puts "---> STDERR goes to server logs" 113 ` 114 115 rubyGemfileBoilerplate = `source 'https://rubygems.org' 116 117 gem 'json', '> 1.8.2' 118 ` 119 120 // Could use same test for most langs 121 rubyTestBoilerPlate = `{ 122 "tests": [ 123 { 124 "input": { 125 "body": { 126 "name": "Johnny" 127 } 128 }, 129 "output": { 130 "body": { 131 "message": "Hello Johnny" 132 } 133 } 134 }, 135 { 136 "input": { 137 "body": "" 138 }, 139 "output": { 140 "body": { 141 "message": "Hello World" 142 } 143 } 144 } 145 ] 146 } 147 ` 148 )