faastruby 0.5.8 → 0.5.9

Sign up to get free protection for your applications and to get access to all the features.
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