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  )