faastruby 0.5.9 → 0.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad8d16f69c2faa2730dde9c389f3d2485bbbba81b348ae20bd5f4e6074cd4477
4
- data.tar.gz: 0b156a957b0cb34b436353cf0e89f192232b8f01239ec4f41c5ef9e3bb52c97d
3
+ metadata.gz: 8708963b2799676a36e2a8e78424656d9cb415c90d1b94efc75142f7976f7c6a
4
+ data.tar.gz: 47f5c687fc019a1a124a975a697b76c461dc9f31b141b30c710c20e6d3e17011
5
5
  SHA512:
6
- metadata.gz: 3292a49454d2a445d032653569ef201f2365c676ffa7b82c907ba4e3edda2e62043c58e2b2493c0747c96131df94eef1a2d58ae0acbff791c2abdd77881cb981
7
- data.tar.gz: b78fdfb6a57e1666579f8ab0330bb4c2cce3872dd18ec1ff41ee69e9f43c09c3ecfe936151bacd15eecae42293c21fca3b03f1c60056b140d2b64a818c617dbe
6
+ metadata.gz: 83dfa0ec0f1fed55fe7cdfe894cce2d78dba942668d279f7d83e86e1303204dd695517e1f752fe61fd96e612ab1149e2db788d02aff3c92e2cdcb80453bebd93
7
+ data.tar.gz: d234ef49f82abee9162b26bb99c5c78099d5b6ff18afe22422de39287316f3af74b478d950fa7c5af3cb4be1cf5f3a10a7386481fbe1fd22cfcaa009724ea64d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.10 - unreleased
4
+ - Fix Watchdog message when a function is removed from the project.
5
+ - Add method render_nothing to ruby and crystal functions, to make it clear how to send an empty response body
6
+ - Empty functions will render an empty body
7
+ - Ensure Watchdog listeners stop when exiting
8
+ - Fix bug preventing `--create-local-dir` from creating a folder when `create-workspace` is used
9
+ - Change message confirmation when destroying a workspace
10
+ - Update YAML template comments with mention to `test_command`
11
+ - FaaStRuby Local won't start unless it can find `project.yml` in current directory.
12
+ - Fix command `faastruby deploy`
13
+ - Fix bug when response headers are empty
14
+
3
15
  ## 0.5.9 - Mar 11 2019
4
16
  - Add Gemfile support to Watchdog. When a `Gemfile` is added to a function, Watchdog will initialize it if the file is empty and run `bundle install` every time you modify it.
5
17
  - Watchdog will stream the output of commands instead of printing everything once it's done.
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- faastruby (0.5.7)
4
+ faastruby (0.5.10)
5
5
  colorize (~> 0.8)
6
- faastruby-rpc (~> 0.2.2)
6
+ faastruby-rpc (~> 0.2.3)
7
7
  listen (~> 3.1)
8
8
  oj (~> 3.6)
9
9
  puma (~> 3.12)
@@ -30,7 +30,7 @@ GEM
30
30
  unf (>= 0.0.5, < 1.0.0)
31
31
  equatable (0.5.0)
32
32
  erubis (2.7.0)
33
- faastruby-rpc (0.2.2)
33
+ faastruby-rpc (0.2.3)
34
34
  oj (~> 3.6)
35
35
  ffi (1.10.0)
36
36
  hashdiff (0.3.7)
data/lib/faastruby/api.rb CHANGED
@@ -204,7 +204,7 @@ module FaaStRuby
204
204
  end
205
205
 
206
206
  def parse(response)
207
- if latest_version = response.headers[:x_update_available]
207
+ if response.headers && latest_version = response.headers[:x_update_available]
208
208
  puts "########### FaaStRuby Update Available ###########"
209
209
  puts "# Latest version: #{latest_version} #"
210
210
  puts "# Please run 'faastruby update' #"
@@ -106,6 +106,10 @@ module FaaStRuby
106
106
 
107
107
  def yaml_comments
108
108
  [
109
+ '## To run tests before each deploy, uncomment the line below',
110
+ '## and change the command if you are not using Rspec.',
111
+ '# test_command: rspec',
112
+ '',
109
113
  '## You can add commands to run locally before building the deployment package.',
110
114
  "## Some use cases are:",
111
115
  "## * minifying Javascript/CSS",
@@ -3,11 +3,7 @@ module FaaStRuby
3
3
  module Project
4
4
  PROJECT_YAML_FILE = 'project.yml'
5
5
  PROJECT_SECRETS_FILE = 'secrets.yml'
6
- PROJECT_CREDENTIALS_FILE = '.credentials.yml'
7
6
  class ProjectBaseCommand < BaseCommand
8
- def read_credentials_file
9
- File.file?(PROJECT_CREDENTIALS_FILE)
10
- end
11
7
  end
12
8
  end
13
9
  end
@@ -1,3 +1,4 @@
1
+ STDOUT.sync
1
2
  require 'open3'
2
3
  module FaaStRuby
3
4
  module Command
@@ -16,9 +17,9 @@ module FaaStRuby
16
17
  @options['environment'] ||= 'stage'
17
18
  @project_yaml = YAML.load(File.read(PROJECT_YAML_FILE))['project'] rescue FaaStRuby::CLI.error("Could not find file 'project.yml'. Are you running this command from the project's folder?")
18
19
  @project_name = @project_yaml['name']
20
+ @root_to = @project_yaml['root_to'] || 'root'
21
+ @catch_all = @project_yaml['catch_all'] || 'catch-all'
19
22
  @project_identifier = "-#{@project_yaml['identifier']}" if @project_yaml['identifier']
20
- @options['root_to'] ||= @project_yaml['root_to']
21
- @options['catch_all'] ||= @project_yaml['catch_all']
22
23
  end
23
24
 
24
25
  def puts(msg)
@@ -33,17 +34,18 @@ module FaaStRuby
33
34
  root_folder = Dir.pwd
34
35
  jobs = []
35
36
  workspace = "#{@project_name}-#{@options['environment']}#{@project_identifier}"
37
+ spinner = spin "Deploying project '#{@project_name}' to workspace #{workspace}..."
36
38
  try_workspace(workspace)
37
- spinner = spin("Deploying project '#{@project_name}'...")
38
39
  @options['functions'].each do |function_path|
39
40
  jobs << Thread.new do
40
41
  # puts "[#{function_path}] Entering folder '#{function_path}'"
41
42
  # Dir.chdir function_path
42
43
  function_config = YAML.load(File.read("#{function_path}/faastruby.yml"))
43
44
  function_name = function_config['name']
44
- cmd = "cd #{function_path} && faastruby deploy-to #{workspace} --quiet"
45
- cmd += " --set-root" if @options['root_to'] == function_name
46
- cmd += " --set-catch-all" if @options['catch_all'] == function_name
45
+
46
+ cmd = "cd #{function_path} && faastruby deploy-to #{workspace} --quiet --dont-create-workspace"
47
+ cmd += " --set-root" if @root_to == function_name
48
+ cmd += " --set-catch-all" if @catch_all == function_name
47
49
  Open3.popen2(cmd) do |stdin, stdout, status_thread|
48
50
  stdout.each_line do |line|
49
51
  puts line
@@ -53,7 +55,6 @@ module FaaStRuby
53
55
  end
54
56
  end
55
57
  jobs.each{|thr| thr.join}
56
- spinner.stop(" Done!")
57
58
  puts "* Project URL: #{FaaStRuby.workspace_host_for(workspace)}\n\n".green
58
59
  end
59
60
 
@@ -94,10 +95,6 @@ module FaaStRuby
94
95
  while @args.any?
95
96
  option = @args.shift
96
97
  case option
97
- when '--root-to'
98
- @options['root_to'] = @args.shift
99
- when '--catch-all'
100
- @options['catch_all'] = @args.shift
101
98
  when '--function', '-f'
102
99
  @options['functions'] << @args.shift
103
100
  when '--env', '-e'
@@ -26,7 +26,6 @@ module FaaStRuby
26
26
  FaaStRuby::CLI.error("The project name must have between 3 and 15 characters, and can only have letters, numbers and dashes.") unless name_valid?
27
27
  @base_dir = "./#{@project_name}"
28
28
  parse_options
29
- @options['credentials_file'] ||= PROJECT_CREDENTIALS_FILE
30
29
  @options['project_type'] ||= 'web'
31
30
  end
32
31
 
@@ -77,7 +77,7 @@ module FaaStRuby
77
77
  while @args.any?
78
78
  option = @args.shift
79
79
  case option
80
- when '--create-local-dir',
80
+ when '--create-local-dir'
81
81
  @options['create_local_dir'] = true
82
82
  when '--local-only'
83
83
  @options['create_local_dir'] = true
@@ -25,14 +25,14 @@ module FaaStRuby
25
25
  FaaStRuby::CLI.error(workspace.errors)
26
26
  end
27
27
  spinner.stop("Done!")
28
- puts "Workspace '#{@workspace_name}' was deleted from the server"
28
+ puts "Workspace '#{@workspace_name}' was deleted from the cloud platform."
29
29
  end
30
30
 
31
31
  private
32
32
 
33
33
  def warning
34
34
  print "WARNING: ".red
35
- puts "This action will permanently remove the workspace '#{@workspace_name}' and all its functions from the server."
35
+ puts "This action will permanently remove the workspace '#{@workspace_name}' and all its functions from the cloud platform."
36
36
  print "Are you sure? [y/N] "
37
37
  @options['force'] = STDIN.gets.chomp
38
38
  end
@@ -101,16 +101,6 @@ module FaaStRuby
101
101
  @@functions ||= []
102
102
  end
103
103
 
104
- def self.functions_listener
105
- debug "self.functions_listener"
106
- @@functions_listener
107
- end
108
-
109
- def self.public_listener
110
- debug "self.public_listener"
111
- @@public_listener
112
- end
113
-
114
104
  def self.secrets_for_function(function_name)
115
105
  debug "self.secrets_for_function(#{function_name.inspect})"
116
106
  deploy_environment_secrets[function_name] || {}
@@ -143,6 +133,10 @@ module FaaStRuby
143
133
  FunctionProcessor.new(FUNCTIONS_EVENT_QUEUE).start
144
134
  StaticFileProcessor.new(PUBLIC_EVENT_QUEUE).start if SYNC_ENABLED
145
135
  sleep
136
+ ensure
137
+ puts "Stopping Watchdog..."
138
+ Local::Listener.functions_listener.each(&:stop)
139
+ Local::Listener.public_listener.each(&:stop)
146
140
  end
147
141
 
148
142
  def self.initial_compile_and_deploy(crystal_functions)
@@ -175,15 +169,17 @@ module FaaStRuby
175
169
  def self.listen_on_functions_dir
176
170
  debug "self.listen_on_functions_dir"
177
171
  debug "Listening for changes in '#{functions_dir}'"
178
- @@functions_listener = Listener.new(directory: functions_dir, queue: FUNCTIONS_EVENT_QUEUE)
179
- @@functions_listener.start
172
+ listener = Listener.new(directory: functions_dir, queue: FUNCTIONS_EVENT_QUEUE)
173
+ listener.start
174
+ Local::Listener.functions_listener << listener
180
175
  end
181
176
 
182
177
  def self.listen_on_public_dir
183
178
  debug "self.listen_on_public_dir"
184
179
  debug "Listening for changes in '#{public_dir}'"
185
- @@public_listener = Listener.new(directory: public_dir, queue: PUBLIC_EVENT_QUEUE)
186
- @@public_listener.start
180
+ listener = Listener.new(directory: public_dir, queue: PUBLIC_EVENT_QUEUE)
181
+ listener.start
182
+ Local::Listener.public_listener << listener
187
183
  end
188
184
  end
189
185
  end
@@ -123,6 +123,10 @@ def render(icon : String? = nil, jpeg : String? = nil, gif : String? = nil, png
123
123
  FaaStRuby::Response.new(body: resp_body, status: status, headers: headers, binary: bin)
124
124
  end
125
125
 
126
+ def render_nothing(status : Int32 = 200, headers : Hash(String, String) = {} of String => String)
127
+ FaaStRuby::Response.new(body: nil, status: status, headers: headers, binary: false)
128
+ end
129
+
126
130
  def redirect_to(function : String, status : Int32 = 303)
127
131
  headers = {"Location" => function}
128
132
  FaaStRuby::Response.new(body: nil, status: status, headers: headers)
@@ -160,7 +164,7 @@ rescue e
160
164
  exit 1
161
165
  end
162
166
  spawn do
163
- response = FaaStRuby::Function.run(event: payload.event)
167
+ response = FaaStRuby::Function.run(event: payload.event) || render_nothing
164
168
  puts "R,#{Base64.urlsafe_encode(response.payload.to_json)}"
165
169
  exit 0
166
170
  end
@@ -148,6 +148,10 @@ module FaaStRuby
148
148
 
149
149
  def yaml_comments
150
150
  [
151
+ '## To run tests before each deploy, uncomment the line test_command below',
152
+ '## and change the command if you are not using Rspec.',
153
+ '# test_command: rspec',
154
+ '',
151
155
  '## You can add commands to run locally before building the deployment package.',
152
156
  "## Some use cases are:",
153
157
  "## * minifying Javascript/CSS",
@@ -1,6 +1,12 @@
1
1
  module FaaStRuby
2
2
  module Local
3
3
  class Listener
4
+ def self.functions_listener
5
+ @@functions_listener ||= []
6
+ end
7
+ def self.public_listener
8
+ @@public_listener ||= []
9
+ end
4
10
  include Local::Logger
5
11
  attr_accessor :listener, :directory, :queue
6
12
  def initialize(directory:, queue:)
@@ -60,7 +60,7 @@ module FaaStRuby
60
60
  # - Remove from workspace
61
61
  if event.file_is_a_function_config?
62
62
  debug "removed: the file is a function_config"
63
- function_name = event.relative_path
63
+ function_name = event.relative_path_dirname
64
64
  puts "Function '#{function_name}' was removed."
65
65
  return remove_from_workspace(event)
66
66
  end
@@ -24,7 +24,13 @@ module FaaStRuby
24
24
  exit 1
25
25
  end
26
26
  SERVER_ROOT = Dir.pwd
27
- PROJECT_YAML_FILE = ENV['FAASTRUBY_PROJECT_CONFIG_FILE'] || "#{SERVER_ROOT}/project.yml"
27
+ PROJECT_YAML_FILE = "#{SERVER_ROOT}/project.yml"
28
+ unless File.file?(PROJECT_YAML_FILE)
29
+ puts "\nERROR: Project configuration file not in current directory."
30
+ puts "You can only run 'faastruby local' inside a Project directory."
31
+ puts "To create a project, run 'faastruby new-project project-name'.\n\n"
32
+ exit 1
33
+ end
28
34
  SECRETS_FILE = ENV['FAASTRUBY_PROJECT_SECRETS_FILE'] || "#{SERVER_ROOT}/secrets.yml"
29
35
  PROJECT_NAME = YAML.load(File.read(PROJECT_YAML_FILE))['project']['name']
30
36
  SYNC_ENABLED = ENV['FAASTRUBY_PROJECT_SYNC_ENABLED']
@@ -25,7 +25,7 @@ module FaaStRuby
25
25
  end
26
26
 
27
27
  def self.invalid_response
28
- body = {'error' => "Your function must render a response. For example, render text: \"Hello World!\""}
28
+ body = {'error' => "Your function must render a response. For example, render text: \"Hello World!\". If you want to respond with an empty body, use 'render_nothing'."}
29
29
  body = Oj.dump(body)
30
30
  new(
31
31
  body: body,
@@ -70,7 +70,7 @@ module FaaStRuby
70
70
  begin
71
71
  function = load_function("#{@function_folder}/handler.rb")
72
72
  function_object.extend(function)
73
- response = function_object.handler(event, *args)
73
+ response = function_object.handler(event, *args) || function_object.render_nothing
74
74
  response = FaaStRuby::Response.invalid_response unless response.is_a?(FaaStRuby::Response)
75
75
  rescue Exception => e
76
76
  error = Oj.dump({
@@ -84,6 +84,10 @@ module FaaStRuby
84
84
  respond_with(resp_body, status: status, headers: headers, binary: bin)
85
85
  end
86
86
 
87
+ def render_nothing(status: 200, headers: {})
88
+ respond_with(nil, status: status, headers: headers, binary: false)
89
+ end
90
+
87
91
  def redirect_to(function: nil, url: nil, status: 303)
88
92
  headers = {"Location" => function || url}
89
93
  respond_with(nil, status: status, headers: headers, binary: false)
@@ -1,3 +1,3 @@
1
1
  module FaaStRuby
2
- VERSION = '0.5.9'
2
+ VERSION = '0.5.10'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faastruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.9
4
+ version: 0.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paulo Arruda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-12 00:00:00.000000000 Z
11
+ date: 2019-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client