faastruby 0.5.8 → 0.5.9

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: 728055c1dbaf19af90d69045fd40cdec172dd175ca83459474935fcba668a8fb
4
- data.tar.gz: f02a78da5de130860f44c0af5d1293969b1e60e0a95f3ec109840117e5fdb7de
3
+ metadata.gz: ad8d16f69c2faa2730dde9c389f3d2485bbbba81b348ae20bd5f4e6074cd4477
4
+ data.tar.gz: 0b156a957b0cb34b436353cf0e89f192232b8f01239ec4f41c5ef9e3bb52c97d
5
5
  SHA512:
6
- metadata.gz: fb22f60d0b66702e7e41414bf32765be171a1ab4158f06fa241ddcd5b8390528a5441fcf803933ecd05bfc6066967ea21d950773b96c51da1fd2ba259f949886
7
- data.tar.gz: c9b1fd124e8c3a295120a6fe435ef7c18bd076b9701f533a7fe59155d7402b8b5df5dc3b341584a0fd01dc229f757f9be4edb46039901f91b6fa04e3a373781b
6
+ metadata.gz: 3292a49454d2a445d032653569ef201f2365c676ffa7b82c907ba4e3edda2e62043c58e2b2493c0747c96131df94eef1a2d58ae0acbff791c2abdd77881cb981
7
+ data.tar.gz: b78fdfb6a57e1666579f8ab0330bb4c2cce3872dd18ec1ff41ee69e9f43c09c3ecfe936151bacd15eecae42293c21fca3b03f1c60056b140d2b64a818c617dbe
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.9 - Mar 11 2019
4
+ - 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
+ - Watchdog will stream the output of commands instead of printing everything once it's done.
6
+ - Disable caching for static files on Local
7
+
3
8
  ## 0.5.8 - Mar 11 2019
4
9
  - Bump dependency faastruby-rpc to v0.2.3
5
10
  - Use CSS gradient instead of background picture on Local Web template
@@ -42,7 +42,7 @@ module FaaStRuby
42
42
  create_or_use_workspace
43
43
  if @yaml_config['serve_static']
44
44
  package_file_name = build_package
45
- spinner = say("[#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
45
+ spinner = say("* [#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
46
46
  workspace = FaaStRuby::Workspace.new(name: @workspace_name).deploy(package_file_name)
47
47
  else
48
48
  if ruby_runtime?
@@ -53,7 +53,7 @@ module FaaStRuby
53
53
  end
54
54
  FaaStRuby::CLI.error("[#{@function_name}] Deploy aborted because 'test_command' exited non-zero.") unless run_tests
55
55
  package_file_name = build_package
56
- spinner = say("[#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
56
+ spinner = say("* [#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
57
57
  workspace = FaaStRuby::Workspace.new(name: @workspace_name).deploy(package_file_name, root_to: @options['root_to'], catch_all: @options['catch_all'], context: @options['context'])
58
58
  end
59
59
  if workspace.errors.any?
@@ -107,14 +107,14 @@ module FaaStRuby
107
107
 
108
108
  def shards_install
109
109
  return true unless File.file?('shard.yml')
110
- puts "[#{@function_name}] [build] Verifying dependencies"
111
- system('shards check') || system('shards install')
110
+ puts "[#{@function_name}] Verifying dependencies"
111
+ system('shards check > /dev/null') || system('shards install')
112
112
  end
113
113
 
114
114
  def bundle_install
115
115
  return true unless File.file?('Gemfile')
116
- puts "[#{@function_name}] [build] Verifying dependencies"
117
- system('bundle check') || system('bundle install')
116
+ puts "* [#{@function_name}] Verifying dependencies"
117
+ system('bundle check >/dev/null') || system('bundle install')
118
118
  end
119
119
 
120
120
  def missing_args
@@ -1,3 +1,4 @@
1
+ STDOUT.sync
1
2
  module FaaStRuby
2
3
  module Local
3
4
  require 'listen'
@@ -63,18 +63,17 @@ module FaaStRuby
63
63
  def deploy
64
64
  debug "deploy"
65
65
  deploy_cmd, deploy_cmd_print = generate_deploy_command
66
- puts "Running: #{deploy_cmd_print.join(' ')}"
67
- output, status = Open3.capture2e(deploy_cmd.join(' '))
68
- STDOUT.puts "#{Time.now} | " + "* [#{name}] Deploying...".green
69
- STDOUT.puts "---"
70
- String.disable_colorization = true
71
- if status.exitstatus == 0
72
- output.split("\n").each {|o| puts o unless o == '---'}
73
- else
74
- puts "* [#{name}] Deploy Failed:"
75
- STDERR.puts output
66
+ puts "Running: #{deploy_cmd_print.join(' ')}".yellow
67
+ i, oe, thr = Open3.popen2(deploy_cmd.join(' '))
68
+ i.close
69
+ oe.each_line do |line|
70
+ next if line.chomp == '' || line.chomp == '---'
71
+ STDOUT.puts "#{Time.now} | #{line}"
72
+ STDOUT.puts "---"
76
73
  end
77
- String.disable_colorization = false
74
+ thr.join
75
+ oe.close
76
+ status = thr.value
78
77
  end
79
78
 
80
79
  def language
@@ -89,7 +88,7 @@ module FaaStRuby
89
88
  def generate_deploy_command
90
89
  debug "generate_deploy_command"
91
90
  project_config = Local.project_config
92
- deploy_cmd = ['faastruby', 'deploy-to', Local.workspace, '-f', @absolute_folder, '--dont-create-workspace']
91
+ deploy_cmd = ['faastruby', 'deploy-to', Local.workspace, '-f', @absolute_folder, '--dont-create-workspace', '--quiet']
93
92
  deploy_cmd << '--set-root' if Local.root_to == @name
94
93
  deploy_cmd << '--set-catch-all' if Local.catch_all == @name
95
94
  secrets_json = Oj.dump(Local.secrets_for_function(@name)) rescue nil
@@ -3,6 +3,16 @@ module FaaStRuby
3
3
  class RubyFunction < Function
4
4
  include Local::Logger
5
5
 
6
+ def self.default_gemfile
7
+ faastruby_rpc_version = Gem::DependencyList.from_specs.select{|d| d.name == 'faastruby-rpc'}[0]&.version || '0.2.3'
8
+ %(source 'https://rubygems.org'
9
+
10
+ group :test do
11
+ gem 'rspec'
12
+ end
13
+ )
14
+ end
15
+
6
16
  def yaml_hash
7
17
  debug "yaml_hash"
8
18
  hash = {
@@ -45,12 +45,13 @@ module FaaStRuby
45
45
 
46
46
  class ListenerEvent
47
47
  include Local::Logger
48
- attr_accessor :type, :filename, :full_path, :relative_path, :listened_directory, :dirname
48
+ attr_accessor :type, :filename, :full_path, :relative_path, :relative_path_dirname, :listened_directory, :dirname
49
49
  def initialize(type:, full_path:, listened_directory:)
50
50
  debug "initialize(type: #{type.inspect}, full_path: #{full_path.inspect}, listened_directory: #{listened_directory.inspect})"
51
51
  @listened_directory = listened_directory
52
52
  @full_path = full_path
53
53
  @relative_path = relative_path_for(@full_path.dup)
54
+ @relative_path_dirname = File.dirname(@relative_path)
54
55
  @filename = File.basename(@full_path)
55
56
  @dirname = File.dirname(@full_path)
56
57
  @type = type
@@ -64,6 +65,11 @@ module FaaStRuby
64
65
  added? && filename.match(/^handler\.(rb|cr)$/)
65
66
  end
66
67
 
68
+ def file_is_a_gemfile?
69
+ debug __method__
70
+ filename == 'Gemfile'
71
+ end
72
+
67
73
  def file_is_a_handler?
68
74
  debug __method__
69
75
  filename.match(/^handler\.(rb|cr)$/)
@@ -12,6 +12,7 @@ module FaaStRuby
12
12
  debug "ignoring #{event.filename}"
13
13
  return true
14
14
  end
15
+ return true if event.filename == 'Gemfile.lock'
15
16
  return false
16
17
  end
17
18
 
@@ -34,7 +35,8 @@ module FaaStRuby
34
35
  debug "added: a handler file was added"
35
36
  return new_function(event)
36
37
  end
37
- unless event.file_is_a_function_config?
38
+ init_gemfile(event) if event.file_is_a_gemfile?
39
+ unless event.file_is_a_function_config? && event.file_is_a_gemfile?
38
40
  debug "added: a file was added"
39
41
  deploy(event)
40
42
  end
@@ -45,6 +47,7 @@ module FaaStRuby
45
47
  # This should trigger
46
48
  # - Compile
47
49
  # - Deploy
50
+ bundle_install(event) if event.file_is_a_gemfile?
48
51
  compile_function(event)
49
52
  deploy(event)
50
53
  end
@@ -96,7 +99,7 @@ module FaaStRuby
96
99
  object = function_object_for_handler(event.filename)
97
100
  function = object.new(
98
101
  absolute_folder: event.dirname,
99
- name: File.dirname(event.relative_path),
102
+ name: event.relative_path_dirname,
100
103
  )
101
104
  run(function.name, 'new_function') do
102
105
  debug "+ IGNORE #{event.dirname}"
@@ -146,6 +149,25 @@ module FaaStRuby
146
149
  run(function.name, 'remove_from_workspace') {function.remove_from_workspace}
147
150
  end
148
151
 
152
+ def bundle_install(event)
153
+ puts "Running: cd #{event.relative_path_dirname} && bundle install"
154
+ if system("cd #{event.dirname} && bundle install")
155
+ STDOUT.puts '---'.yellow
156
+ puts "Gems from Gemfile '#{event.relative_path}' installed."
157
+ else
158
+ STDOUT.puts '---'.red
159
+ STDOUT.puts "#{Time.now} | Error installing gems for Gemfile '#{event.relative_path}'.".red
160
+ end
161
+ end
162
+
163
+ def init_gemfile(event)
164
+ unless File.size(event.full_path) > 0
165
+ puts "Initializing Gemfile '#{event.relative_path}'"
166
+ sleep 0.2
167
+ File.write(event.full_path, Local::RubyFunction.default_gemfile)
168
+ end
169
+ end
170
+
149
171
  end
150
172
  end
151
173
  end
@@ -29,15 +29,18 @@ module FaaStRuby
29
29
  path = "public/#{@relative_path}"
30
30
  cmd = "faastruby cp '#{path}' '#{Local.workspace}:/#{@relative_path}'"
31
31
  puts "Running: #{cmd}"
32
- output, status = Open3.capture2e(cmd)
33
- String.disable_colorization = true
34
- if status.exitstatus == 0
35
- output.split("\n").each {|o| puts o unless o == '---' || o == "" || o.match(/Copying file to/)}
36
- else
37
- puts "* [#{path}] Error uploading static file '#{path}' to cloud workspace '#{Local.workspace}':"
38
- STDERR.puts output
32
+ i, oe, thr = Open3.popen2(cmd)
33
+ i.close
34
+ STDOUT.puts "#{Time.now} | * [#{path}] Uploading file to workspace '#{Local.workspace}'"
35
+ oe.each_line do |line|
36
+ next if line.chomp == '' || line.chomp == '---'
37
+ STDOUT.puts "#{Time.now} | #{line}"
38
+ STDOUT.puts "---"
39
39
  end
40
- String.disable_colorization = false
40
+ thr.join
41
+ oe.close
42
+ status = thr.value
43
+ puts "* [#{path}] Error uploading static file '#{path}' to cloud workspace '#{Local.workspace}':" if status.exitstatus != 0
41
44
  end
42
45
 
43
46
  def remove_from_workspace
@@ -14,6 +14,7 @@ module FaaStRuby
14
14
  set :root, SERVER_ROOT
15
15
  set :public_folder, FaaStRuby::ProjectConfig.public_dir
16
16
  set :static, true
17
+ set :static_cache_control, [:must_revalidate, :proxy_revalidate, :max_age => 0]
17
18
  register Sinatra::MultiRoute
18
19
  before do
19
20
  cache_control :must_revalidate, :proxy_revalidate, :max_age => 0
@@ -1,3 +1,3 @@
1
1
  module FaaStRuby
2
- VERSION = '0.5.8'
2
+ VERSION = '0.5.9'
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.8
4
+ version: 0.5.9
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-11 00:00:00.000000000 Z
11
+ date: 2019-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -339,7 +339,6 @@ files:
339
339
  - lib/faastruby/server/response.rb
340
340
  - lib/faastruby/server/runner.rb
341
341
  - lib/faastruby/server/runner_methods.rb
342
- - lib/faastruby/server/sentinel.rb
343
342
  - lib/faastruby/server/subscriber.rb
344
343
  - lib/faastruby/spec_helper.rb
345
344
  - lib/faastruby/supported_runtimes.rb
@@ -1,496 +0,0 @@
1
- # # Here 'function_folder' is the function folder.
2
- # require 'open3'
3
- # require 'tempfile'
4
- # require 'pathname'
5
- # require 'yaml'
6
- # require 'listen'
7
- # require 'colorize'
8
- # require 'securerandom'
9
-
10
- # module FaaStRuby
11
- # module Sentinel
12
- # extend FaaStRuby::Logger::System
13
- # STATIC_FILES_SYNC_ENABLED = SYNC_ENABLED && FaaStRuby::ProjectConfig.public_dir?
14
- # STOPPER_QUEUE = Queue.new
15
- # @@threads = {}
16
- # MUTEX = Mutex.new
17
- # def self.quit
18
- # Process.kill("HUP", FaaStRuby.sentinel_pid)
19
- # end
20
-
21
- # def self.add_thread(function_folder, key, value)
22
- # MUTEX.synchronize do
23
- # @@threads[function_folder] ||= {}
24
- # @@threads[function_folder][key] = value
25
- # end
26
- # end
27
- # def self.get_thread(function_folder, key)
28
- # MUTEX.synchronize do
29
- # return nil if @@threads[function_folder].nil?
30
- # @@threads[function_folder][key]
31
- # end
32
- # end
33
-
34
- # def self.get_threads
35
- # MUTEX.synchronize do
36
- # @@threads
37
- # end
38
- # end
39
-
40
- # def self.tag
41
- # '(Sentinel)'
42
- # end
43
-
44
- # def self.try_workspace
45
- # puts "#{tag} Connecting to workspace '#{WORKSPACE_NAME}'..."
46
- # try_to_create = Proc.new {system("faastruby create-workspace #{WORKSPACE_NAME}")}
47
- # has_credentials = system("faastruby list-workspace #{WORKSPACE_NAME} > /dev/null 2>&1")
48
- # continue = has_credentials || try_to_create.call
49
- # unless continue
50
- # puts "[FATAL] Unable to setup project workspace '#{WORKSPACE_NAME}'. Make sure you have the credentials, or try a different environment name.\nExample: faastruby local --sync --deploy-env #{DEPLOY_ENVIRONMENT}-#{(rand * 100).to_i}".red
51
- # exit 1
52
- # end
53
- # true
54
- # end
55
-
56
- # def self.watch_for_live_compile(functions)
57
- # functions.each do |path|
58
- # # puts "Starting live compile for #{path}"
59
- # watch_function_for_live_compile(path)
60
- # end
61
- # end
62
-
63
- # def self.watch_function_for_live_compile(path)
64
- # function_folder = File.expand_path path
65
- # # FileUtils.rm_f("#{function_folder}/handler")
66
- # # FileUtils.rm_f("#{function_folder}/handler.dwarf")
67
- # add_thread(function_folder, 'watcher', start_watcher_for(function_folder))
68
- # # This will force compile when the server starts
69
- # trigger("#{function_folder}/faastruby.yml")
70
- # end
71
-
72
- # def self.start_watcher_for(function_folder)
73
- # function_name = get_function_name(function_folder)
74
- # puts "#{tag} Live compiling enabled for '#{function_name}'."
75
- # exclude_from_watcher = [
76
- # "#{function_folder}/handler",
77
- # "#{function_folder}/handler.dwarf",
78
- # "#{function_folder}/.package.zip"
79
- # ]
80
- # new_watcher_thread(function_folder, exclude_from_watcher, function_name)
81
- # end
82
-
83
- # def self.stop_watcher(listener, function_name)
84
- # STOPPER_QUEUE << [listener, function_name]
85
- # end
86
-
87
- # def self.new_watcher_thread(function_folder, exclude_from_watcher, function_name)
88
- # handler_path = get_handler_path_in(function_folder)
89
- # listener = Listen.to(function_folder) do |modified, added, removed|
90
- # full_path, relative_path, event = translate(modified, added, removed)
91
- # next if exclude_from_watcher.include?(full_path)
92
- # file_name = File.basename(full_path)
93
- # puts "#{tag} Previous Job for '#{function_name}' aborted" if kill_thread_if_alive(function_folder, 'running', function_name)
94
- # # puts "#{tag} Event: #{full_path}, #{event}"
95
- # if event == :removed && is_a_function?(full_path, function_folder)
96
- # puts "#{tag} Disabling watcher for function '#{function_name}'."
97
- # stop_watcher(get_thread(function_folder, 'watcher'), function_name)
98
- # # listener = get_thread(function_folder, 'watcher')
99
- # # listener.stop
100
- # # # Thread.current.exit
101
- # next
102
- # end
103
- # add_thread(function_folder, 'running', Thread.new {CrystalBuild.new(function_folder, handler_path, run_before_build: true).start})
104
- # end
105
- # listener.start
106
- # listener
107
- # end
108
-
109
- # def self.detect_new_functions(target, language)
110
- # puts "#{tag} Watching for new #{language} functions..."
111
- # only = /\/handler.rb$/ if language == 'Ruby'
112
- # only = /\/handler.cr$/ if language == 'Crystal'
113
- # listener = Listen.to(target, only: only) do |modified, added, removed|
114
- # full_path, relative_path, event = translate(modified, added, removed)
115
- # # Filewatcher.new(target).watch do |full_path, event|
116
- # next unless event == :added
117
- # file_name = File.basename(full_path)
118
- # function_folder = File.dirname(full_path)
119
- # function_name = get_function_name(function_folder)
120
- # yield(function_folder, file_name, full_path, function_name)
121
- # enable_sync_for(function_folder, delay: 1) if SYNC_ENABLED
122
- # end
123
- # listener.start
124
- # listener
125
- # end
126
-
127
- # def self.start_crystal(functions)
128
- # puts "#{tag} Crystal functions: #{functions}"
129
- # enable_sync(functions, delay: 1) if SYNC_ENABLED
130
- # watch_for_live_compile(functions) unless SYNC_ENABLED
131
- # detect_new_functions(Dir.pwd, 'Crystal') do |function_folder, file, full_path, function_name|
132
- # function_folder = normalize_crystal_folder(function_folder)
133
- # add_configuration(function_folder, file, full_path)
134
- # puts "#{tag} New Crystal function detected at '#{function_name}'."
135
- # write_handler(full_path, 'crystal') unless File.size(full_path) > 0
136
- # add_thread(function_folder, 'watcher', start_watcher_for(function_folder))
137
- # # trigger(full_path)
138
- # end
139
- # end
140
-
141
- # def self.start_ruby(functions)
142
- # puts "#{tag} Ruby functions: #{functions}"
143
- # enable_sync(functions) if SYNC_ENABLED
144
- # listener = detect_new_functions(Dir.pwd, 'Ruby') do |function_folder, file, full_path, function_name|
145
- # add_configuration(function_folder, file, full_path)
146
- # puts "#{tag} New Ruby function detected at '#{function_name}'."
147
- # write_handler(full_path, 'ruby') unless File.size(full_path) > 0
148
- # end
149
- # end
150
-
151
- # def self.start_public
152
- # puts "#{tag} Watching public folder '#{File.basename(FaaStRuby::ProjectConfig.public_dir)}'..."
153
- # add_thread(FaaStRuby::ProjectConfig.public_dir, 'sync', start_public_sync)
154
- # end
155
-
156
- # ########################
157
-
158
- # def self.start_public_sync(delay: nil)
159
- # sleep delay if delay
160
- # public_dir = FaaStRuby::ProjectConfig.public_dir
161
- # listener = Listen.to(public_dir) do |modified, added, removed|
162
- # full_path, relative_path, event = translate(modified, added, removed)
163
- # # puts "FULL_PATH: #{full_path}"
164
- # # puts "RELATIVE_PATH: #{relative_path}"
165
- # # puts "EVENT: #{event}"
166
- # # next if File.directory?(full_path)
167
- # file_name = File.basename(full_path)
168
- # puts "#{tag} Previous upload of '#{FaaStRuby::ProjectConfig.public_dir(absolute: false)}/#{relative_path}' aborted" if kill_thread_if_alive(full_path, 'deploying', full_path)
169
-
170
- # if event == :removed
171
- # cmd = "faastruby rm #{WORKSPACE_NAME}:/#{relative_path}"
172
- # puts "#{tag} Running: #{cmd}"
173
- # system(cmd)
174
- # add_thread(full_path, 'deployed', nil)
175
- # next
176
- # end
177
- # # deploy_cmd, deploy_cmd_print = faastruby_cp(filename)
178
- # cmd = "faastruby cp #{full_path} #{WORKSPACE_NAME}:/#{relative_path}"
179
- # puts "#{tag} Running: #{cmd}"
180
- # add_thread(full_path, 'deploying', Thread.new {system("cd #{SERVER_ROOT} && #{cmd}")})
181
- # add_thread(full_path, 'deployed', true)
182
- # end
183
- # listener.start
184
- # listener
185
- # end
186
-
187
- # def self.translate(modified, added, removed)
188
- # return [modified[0], relative_path_for(modified[0].dup), :modified] if modified.any?
189
- # return [added[0], relative_path_for(added[0].dup), :added] if added.any?
190
- # return [removed[0], relative_path_for(removed[0].dup), :removed] if removed.any?
191
- # end
192
-
193
- # # def self.final_path_and_subject(full_path)
194
- # # relative_path = relative_path_for(full_path)
195
- # # prefix = relative_path.slice!(/^(public|functions)\//)
196
- # # subject = :static if File.expand_path(prefix) == "#{FaaStRuby::ProjectConfig.public_dir}"
197
- # # subject = :function if File.expand_path(prefix) == "#{FaaStRuby::ProjectConfig.functions_dir}"
198
- # # [relative_path_for(full_path), subject]
199
- # # end
200
-
201
- # def self.relative_path_for(full_path)
202
- # full_path.slice!("#{SERVER_ROOT}/#{FaaStRuby::ProjectConfig.public_dir(absolute: false)}/")
203
- # full_path
204
- # end
205
-
206
- # ####################
207
-
208
- # def self.enable_sync(functions, delay: nil)
209
- # functions.each do |path|
210
- # function_folder = File.expand_path path
211
- # enable_sync_for(function_folder, delay: delay)
212
- # end
213
- # end
214
-
215
- # def self.enable_sync_for(function_folder, delay: nil)
216
- # add_thread(function_folder, 'sync', start_sync_for(function_folder, delay: delay))
217
- # end
218
-
219
- # def self.start_listener_monitor
220
- # Thread.new do
221
- # loop do
222
- # listener, function_name = STOPPER_QUEUE.pop
223
- # listener.stop
224
- # puts "#{tag} Watcher for function '#{function_name}' was stopped."
225
- # end
226
- # end
227
- # end
228
-
229
- # def self.start!
230
- # Dir.chdir FaaStRuby::ProjectConfig.functions_dir
231
- # start_listener_monitor
232
- # functions = find_functions
233
- # listeners = {}
234
- # puts "#{tag} Sync mode enabled. Your functions will be auto-deployed to the workspace '#{WORKSPACE_NAME}'." if SYNC_ENABLED
235
- # listeners['ruby'] = start_ruby(functions['ruby']) if RUBY_ENABLED
236
- # listeners['crystal'] = start_crystal(functions['crystal']) if CRYSTAL_ENABLED
237
- # # aaa # gotta finish configure public sync
238
- # listeners['public'] = start_public if STATIC_FILES_SYNC_ENABLED
239
- # function_listeners = listeners['crystal'].merge(listeners['ruby'])
240
- # function_listeners.each do
241
- # sleep
242
- # ensure
243
- # listeners.each {|language, listener| listener.stop}
244
- # end
245
-
246
- # def self.normalize_crystal_folder(function_folder)
247
- # if function_folder.match(/src$/) && File.file?("#{function_folder}/../faastruby.yml") && File.file?("#{function_folder}/handler.cr")
248
- # function_folder.sub!(/\/src$/, '')
249
- # end
250
- # function_folder
251
- # end
252
-
253
- # def self.write_handler(filename, runtime)
254
- # content = "def handler(event)\n # Write code here\n \nend" if runtime == 'ruby'
255
- # content = "def handler(event : FaaStRuby::Event) : FaaStRuby::Response\n # Write code here\n \nend" if runtime == 'crystal'
256
- # File.write(filename, content)
257
- # end
258
-
259
- # def self.get_function_name(function_folder)
260
- # # f_dir = FaaStRuby::ProjectConfig.functions_dir.dup
261
- # # f_dir.slice!(function_folder)
262
- # # f_dir
263
- # (function_folder.split('/') - FaaStRuby::ProjectConfig.functions_dir.split('/')).join('/')
264
- # end
265
-
266
- # def self.add_configuration(function_folder, file, filename)
267
- # if File.file?("#{function_folder}/faastruby.yml")
268
- # merge_yaml(function_folder, runtime: default_runtime(file))
269
- # else
270
- # write_yaml(function_folder, runtime: default_runtime(file))
271
- # end
272
- # end
273
-
274
- # def self.default_runtime(handler)
275
- # case handler
276
- # when 'handler.rb'
277
- # return DEFAULT_RUBY_RUNTIME
278
- # when 'handler.cr'
279
- # return DEFAULT_CRYSTAL_RUNTIME
280
- # end
281
- # end
282
-
283
- # def self.trigger(file)
284
- # Thread.new do
285
- # sleep 0.5
286
- # FileUtils.touch(file)
287
- # Thread.exit
288
- # end
289
- # end
290
-
291
- # def self.merge_yaml(function_folder, runtime:)
292
- # yaml = YAML.load(File.read("#{function_folder}/faastruby.yml"))
293
- # write_yaml(function_folder, runtime: runtime, original: yaml)
294
- # end
295
-
296
- # def self.write_yaml(function_folder, runtime:, original: nil)
297
- # function_name = get_function_name(function_folder)
298
- # hash = {
299
- # 'cli_version' => FaaStRuby::VERSION,
300
- # 'name' => function_name,
301
- # 'runtime' => runtime
302
- # }
303
- # hash = original.merge(hash) if original
304
- # File.write("#{function_folder}/faastruby.yml", hash.to_yaml)
305
- # # unless original
306
- # File.open("#{function_folder}/faastruby.yml", 'a') do |f|
307
- # f.write yaml_comments
308
- # end
309
- # # end
310
- # puts "#{tag} File created: '#{function_name}/faastruby.yml'"
311
- # end
312
-
313
- # def self.yaml_comments
314
- # [
315
- # '## You can add commands to run locally before building the deployment package.',
316
- # "## Some use cases are:",
317
- # "## * minifying Javascript/CSS",
318
- # "## * downloading a file to be included in the package.",
319
- # "# before_build:",
320
- # "# - curl https://some.url --output some.file",
321
- # "# - uglifyjs your.js -c -m -o your.min.js",
322
- # '',
323
- # '## To schedule periodic runs, follow the example below:',
324
- # '# schedule:',
325
- # '# job1:',
326
- # '# when: every 2 hours',
327
- # '# body: {"foo": "bar"}',
328
- # '# method: POST',
329
- # '# query_params: {"param": "value"}',
330
- # '# headers: {"Content-Type": "application/json"}',
331
- # '# job2: ...'
332
- # ].join("\n")
333
- # end
334
-
335
- # def self.start_sync_for(function_folder, delay: nil)
336
- # # function_name = get_function_name(function_folder)
337
- # # puts "#{tag} Sync activated for function '#{function_name}'."
338
- # Thread.new do
339
- # start_sync(function_folder, delay: delay)
340
- # end
341
- # end
342
-
343
- # def self.remove_from_cloud(function_name, function_folder)
344
- # remove_cmd = ["faastruby", "remove-from", WORKSPACE_NAME, "-y", "-f", function_name]
345
- # removed = system(*remove_cmd)
346
- # add_thread(function_folder, 'deployed', nil)
347
- # if removed
348
- # puts "#{tag} Function '#{function_name}' was removed from the cloud."
349
- # else
350
- # puts "#{tag} The workspace '#{WORKSPACE_NAME}' had no function named '#{function_name}', please ignore the message in red."
351
- # end
352
- # end
353
-
354
- # def self.kill_thread_if_alive(function_folder, kind, function_name)
355
- # thr = get_thread(function_folder, kind)
356
- # if thr&.alive?
357
- # Thread.kill(thr)
358
- # return true
359
- # end
360
- # return false
361
- # end
362
-
363
- # def self.start_sync(function_folder, delay: nil)
364
- # sleep delay if delay
365
- # function_name = get_function_name(function_folder)
366
- # exclude_from_watcher = [
367
- # "#{function_folder}/handler",
368
- # "#{function_folder}/handler.dwarf",
369
- # "#{function_folder}/.package.zip"
370
- # ]
371
- # listener = Listen.to(function_folder) do |modified, added, removed|
372
- # full_path, relative_path, event = translate(modified, added, removed)
373
- # next if exclude_from_watcher.include?(full_path)
374
- # puts "#{tag} Previous Deploy for '#{function_name}' aborted" if kill_thread_if_alive(function_folder, 'deploying', function_name)
375
- # if event == :removed && is_a_function?(full_path, function_folder)
376
- # remove_from_project(function_folder, function_name)
377
- # next
378
- # end
379
- # deploy_cmd, deploy_cmd_print = generate_deploy_command(function_name, function_folder)
380
- # puts "#{tag} Running: #{deploy_cmd_print.join(' ')}"
381
- # deploy(function_folder, deploy_cmd)
382
- # end
383
- # listener.start
384
- # listener
385
- # end
386
-
387
- # def self.is_a_function?(filename, function_folder)
388
- # filename == function_folder || filename.match(/#{function_folder}\/(handler\.(rb|cr)|faastruby.yml)/)
389
- # end
390
-
391
- # def self.remove_from_project(function_folder, function_name)
392
- # Thread.kill(get_thread(function_folder, 'sync'))
393
- # add_thread(function_folder, 'sync', nil)
394
- # puts "#{tag} Function '#{function_name}' was removed from the project."
395
- # remove_from_cloud(function_name, function_folder)# if get_thread(function_folder, 'deployed')
396
- # end
397
-
398
- # def self.deploy(function_folder, deploy_cmd)
399
- # add_thread(function_folder, 'deploying', Thread.new {system(*deploy_cmd)})
400
- # add_thread(function_folder, 'deployed', true)
401
- # end
402
-
403
- # def self.generate_deploy_command(function_name, function_folder)
404
- # project_config = FaaStRuby::ProjectConfig.project_config
405
- # deploy_cmd = ['faastruby', 'deploy-to', WORKSPACE_NAME, '-f', function_name]
406
- # deploy_cmd << '--set-root' if FaaStRuby::ProjectConfig.root_to == function_name
407
- # deploy_cmd << '--set-catch-all' if FaaStRuby::ProjectConfig.catch_all == function_name
408
- # secrets_json = Oj.dump(FaaStRuby::ProjectConfig.secrets_for_function(function_name)) rescue nil
409
- # deploy_cmd_print = deploy_cmd
410
- # if secrets_json
411
- # deploy_cmd += ["--context", secrets_json]
412
- # deploy_cmd_print += ["--context", '*REDACTED*']
413
- # end
414
- # [deploy_cmd, deploy_cmd_print]
415
- # end
416
-
417
- # def self.get_handler_path_in(function_folder)
418
- # if File.file?("#{function_folder}/handler.cr")
419
- # "#{function_folder}/handler"
420
- # else
421
- # "#{function_folder}/src/handler"
422
- # end
423
- # end
424
-
425
- # def self.check_for_yaml_file(function_folder, handler_file)
426
- # yaml_file = "#{function_folder}/faastruby.yml"
427
- # unless File.file?(yaml_file)
428
- # puts "#{tag} Function '#{function_folder}' did not have a YML configuration file."
429
- # write_yaml(function_folder, runtime: default_runtime(File.basename(handler_file)), original: nil)
430
- # end
431
- # YAML.load(File.read yaml_file)
432
- # end
433
-
434
- # def self.find_functions
435
- # crystal_functions = []
436
- # ruby_functions = []
437
- # Dir.glob(["**/handler.rb", "**/handler.cr"]).each do |handler_file|
438
- # function_folder = File.dirname(handler_file)
439
- # function_folder.sub!(/\/src$/, '') if handler_file.match(/src\/handler\.cr$/)
440
- # yaml = check_for_yaml_file(function_folder, handler_file)
441
- # case yaml['runtime']
442
- # when /^crystal:/
443
- # crystal_functions << function_folder
444
- # when /^ruby:/
445
- # ruby_functions << function_folder
446
- # end
447
- # end
448
- # {'crystal' => crystal_functions, 'ruby' => ruby_functions}
449
- # end
450
- # end
451
-
452
- # class CrystalBuild
453
- # include FaaStRuby::Logger::System
454
- # def initialize(directory, handler_path, run_before_build: false)
455
- # @directory = directory
456
- # @function_name = Sentinel.get_function_name(directory)
457
- # @runtime_path = Pathname.new "#{Gem::Specification.find_by_name("faastruby").gem_dir}/lib/faastruby/server/crystal_runtime.cr"
458
- # h_path = Pathname.new(handler_path)
459
- # @handler_path = h_path.relative_path_from @runtime_path
460
- # @env = {'HANDLER_PATH' => @handler_path.to_s}
461
- # @run_before_build = run_before_build
462
- # @crystal_build = "cd #{@directory} && crystal build #{@runtime_path} -o handler"
463
- # end
464
-
465
- # def pre_compile_list
466
- # return [] unless @run_before_build
467
- # YAML.load(File.read("#{@directory}/faastruby.yml"))["before_build"] || []
468
- # end
469
-
470
- # def precompile
471
- # pre_compile_list.each do |cmd|
472
- # cmd = "cd #{@directory} && #{cmd}"
473
- # puts "#{tag} Job ID=\"#{job_id}\" running before_build: '#{cmd}'"
474
- # output, status = Open3.capture2e(cmd)
475
- # success = status.exitstatus == 0
476
- # unless success
477
- # puts "#{tag} Job ID=\"#{job_id}\": #{output}"
478
- # puts "#{tag} Job ID=\"#{job_id}\" failed: #{status}"
479
- # return false
480
- # end
481
- # end
482
- # return true
483
- # end
484
-
485
- # def start
486
- # Thread.report_on_exception = false
487
- # job_id = SecureRandom.uuid
488
- # puts "#{tag} Job ID=\"#{job_id}\" started: Compiling function '#{@function_name}'"
489
- # return false unless precompile
490
- # output, status = Open3.capture2e(@env, @crystal_build)
491
- # success = status.exitstatus == 0
492
- # puts "#{tag} Job ID=\"#{job_id}\": #{output}" unless success
493
- # puts "#{tag} Job ID=\"#{job_id}\" #{success ? 'completed' : 'failed'}: #{status}"
494
- # end
495
- # end
496
- # end