faastruby 0.5.12 → 0.5.13

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: b9ece53c09286e9112f6cbf104e2da719f6bfa1af81c0f143e57a8648b172492
4
- data.tar.gz: cbcc0483287fae2b62cc9e8eac2089df5af57d9643199a92fbc944a5e67fe034
3
+ metadata.gz: 78ae5a5b233203bdddaf6ba73a83efdb1046020909be4a4e2e4382aef76eedb6
4
+ data.tar.gz: d5391ab896bf2fb2b6aaa2726f602fd857bc03e99c1bb1f3423e443c9d3c6aa1
5
5
  SHA512:
6
- metadata.gz: 5e29abfaa6e7f5bbca266a6ce034c6594a4d606aecbdae73a0fc2bdc1fc6b3643dde1909de6b74c441cc3e050caaac80c2055e8efd2825bb30756d863e7ddffb
7
- data.tar.gz: f2496500afd5ce5213bdc59899fe77e4ef42cd6e0a221708eb025d244f173fc76c571a6d2acd81526c8212ef9447e78f3d5690faa621269db505d8ed7940d514
6
+ metadata.gz: 44d01a454d491ceb188cd4571c1cfbd7c4424053e4722b9eca08f0ea291b3e4dfb2d2e5852614d7af0bc450a4efc42ddf29a3880e120a40ad3f7ff63dcde96c5
7
+ data.tar.gz: 13eb59c4aa0ed8ad27f0588701302ea7a94f5dcc0c346ef43b1e09a26e5156d53316d7d71ac4274ef9604c1917e92c0ff6b5e2339ea3d6ad65597dccbe842880
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.13 - unreleased
4
+ - Update help with new spelling
5
+ - Better handle of deploys when sync is enabled
6
+ - Fix broken output spinners
7
+ - Improved console messages
8
+ - Disable initial compile of crystal functions when starting Local
9
+ - Fixed output bug when deploying from Local
10
+ - Clearer message output for the command `confirm-account`
11
+ - Ignore when Gemfile.lock is added
12
+ - Don't trigger a deploy when Gemfile is added
13
+ - Ignore Gemfile changes while initializing it
14
+
3
15
  ## 0.5.12 - Mar 16 2019
4
16
  - Add new branding to Local web templates.
5
17
  - Fix secrets.yml example in comments.
data/README.md CHANGED
@@ -1,111 +1,93 @@
1
+ ![faastRuby](https://faastruby.io/wp-content/uploads/2019/03/logo-positive.png)
2
+
1
3
  [![Gem Version](https://badge.fury.io/rb/faastruby.svg)](https://badge.fury.io/rb/faastruby)
2
4
  [![Build Status](https://travis-ci.org/FaaStRuby/faastruby-cli.svg?branch=master)](https://travis-ci.org/FaaStRuby/faastruby-cli)
3
5
 
4
- * Looking for help? [Ask a question](https://meta.stackoverflow.com/questions/ask?tags=FaaStRuby,Serverless,Ruby,FaaS).
6
+ * Looking for help? [Join our Slack!](https://faastruby.io/slack).
5
7
 
6
- * [Changelog](https://github.com/FaaStRuby/faastruby-cli/blob/master/CHANGELOG.md)
8
+ * [Changelog](https://github.com/faastRuby/faastruby-cli/blob/master/CHANGELOG.md)
7
9
 
8
10
  # faastruby-cli
9
11
 
10
- CLI tool for managing workspaces and functions hosted at [FaaStRuby](https://faastruby.io).
12
+ Local development kit and CLI tool for managing workspaces and functions hosted at [faastRuby](https://faastruby.io).
11
13
 
12
- ## What is FaaStRuby?
13
- FaaStRuby is a Serverless Software Development Platform for Ruby and Crystal.
14
+ ## What is faastRuby?
15
+ faastRuby is a Serverless Software Development Platform for Ruby and Crystal.
14
16
 
15
- * [Tutorial](https://faastruby.io/getting-started)
17
+ * [Documentation](https://faastruby.io/docs/faastruby-local/)
16
18
 
17
19
  ## Try it
18
20
 
19
21
  Getting up and running is quick and easy:
20
22
 
21
- ![Getting up and running](https://s3.amazonaws.com/faastruby/public/create-project.mp4)
22
-
23
23
  1. Install the gem so `faastruby` is available in your terminal
24
24
 
25
25
  ```
26
26
  ~$ gem install faastruby
27
27
  ```
28
28
 
29
- 2. Create a new FaaStRuby project
29
+ 2. Create a new faastRuby project
30
30
 
31
31
  ```
32
- ~$ faastruby new-project hello-world
33
- + d ./hello-world
34
- + f ./hello-world/project.yml
35
- + f ./hello-world/secrets.yml
36
- + d ./hello-world/functions/root
37
- + f ./hello-world/functions/root/index.html.erb
38
- + f ./hello-world/functions/root/template.rb
39
- + f ./hello-world/functions/root/handler.rb
40
- + f ./hello-world/functions/root/faastruby.yml
41
- + d ./hello-world/functions/catch-all
42
- + f ./hello-world/functions/catch-all/404.html
43
- + f ./hello-world/functions/catch-all/handler.rb
44
- + f ./hello-world/functions/catch-all/faastruby.yml
45
- + f ./hello-world/public/faastruby.yml
46
- + f ./hello-world/.gitignore
47
- Initialized empty Git repository in /Users/mf/OpenSource/faastruby/hello-world/.git/
48
- Project 'hello-world' initialized.
32
+ ~$ faastruby new-project my-project
33
+ + d ./myproject
34
+ + f ./myproject/project.yml
35
+ + f ./myproject/secrets.yml
36
+ + d ./myproject/functions/root
37
+ + f ./myproject/functions/root/index.html.erb
38
+ + f ./myproject/functions/root/template.rb
39
+ + f ./myproject/functions/root/handler.rb
40
+ + f ./myproject/functions/root/faastruby.yml
41
+ + d ./myproject/functions/catch-all
42
+ + f ./myproject/functions/catch-all/404.html
43
+ + f ./myproject/functions/catch-all/handler.rb
44
+ + f ./myproject/functions/catch-all/faastruby.yml
45
+ + f ./myproject/public/faastruby.yml
46
+ + f ./myproject/.gitignore
47
+ Initialized empty Git repository in /Users/DemoUser/myproject/.git/
48
+ Project 'myproject' initialized.
49
49
  Now run:
50
- $ cd hello-world
50
+ $ cd myproject
51
51
  $ faastruby local
52
52
  ```
53
53
 
54
54
  3. Fire up the local development environment for your new project
55
55
 
56
56
  ```
57
- ~$ cd hello-world
58
- ~/hello-world$ faastruby local
57
+ ~$ cd myproject
58
+ ~/myproject$ faastruby local
59
59
  Puma starting in single mode...
60
60
  * Version 3.12.0 (ruby 2.5.3-p105), codename: Llamas in Pajamas
61
61
  * Min threads: 0, max threads: 32
62
62
  * Environment: production
63
- sh: crystal: command not found
64
- 2019-02-27 23:36:03 +0800 (EventHub) Channel subscriptions: {}
63
+ * Listening on tcp://0.0.0.0:3000
64
+ Use Ctrl-C to stop
65
+ 2019-03-16 21:09:36 -0300 | Detecting existing functions.
65
66
  ---
66
- 2019-02-27 23:36:03 +0800 (EventHub) Please restart the server if you modify channel subscriptions in 'faastruby.yml' for any function.
67
+ 2019-03-16 21:09:36 -0300 | Ruby functions: ["lists/pets", "root", "catch-all", "ruby"]
67
68
  ---
68
- 2019-02-27 23:36:03 +0800 (EventHub) Events thread started.
69
+ 2019-03-16 21:09:36 -0300 | Crystal functions: []
69
70
  ---
70
- 2019-02-27 23:36:03 +0800 (Sentinel) Ruby functions: ["root", "catch-all"]
71
+ 2019-03-16 21:09:37 -0300 | Listening for changes.
71
72
  ---
72
- 2019-02-27 23:36:03 +0800 (Sentinel) Watching for new Ruby functions...
73
73
  ```
74
74
 
75
75
  As you can see, this runs with Ruby only. If you want to run Crystal as well (similar to Ruby, but with types and compiled to run very fast), simply [install Crystal](https://crystal-lang.org/reference/installation/) and start `faastruby local` again.
76
76
 
77
77
 
78
- `faastruby local` is very powerful. When you add a new folder with a `handler.rb` or `handler.cr`, it will automatically be detected. FaaStRuby will automatically add the configuration for the function so you can jump straight in:
79
-
80
- ![How to add a new folder and file](https://s3.amazonaws.com/faastruby/public/new-paths.mp4)
78
+ `faastruby local` is very powerful. When you add a new folder with a `handler.rb` or `handler.cr`, it will automatically be detected. faastRuby will automatically add the configuration for the function so you can jump straight in.
81
79
 
82
- Changes to the code will automatically be detected and immediately refreshed for you, making local development easy and comfortable:
83
- [!How to edit files and refresh them in the browser](https://s3.amazonaws.com/faastruby/public/local-file-refresh.mp4)
80
+ Changes to the code will automatically be detected and immediately refreshed for you, making local development easy and comfortable.
84
81
 
85
- 4. Deploy it to a workspace:
82
+ 4. Deploy it to the cloud:
86
83
 
87
84
  ```
88
- ~/hello-world$ faastruby deploy-to awesome-prod
89
- ◐ Running tests... Passed!
85
+ ~/hello-world$ faastruby deploy
90
86
  ...
91
-
92
- Finished in 0.00563 seconds (files took 0.15076 seconds to load)
93
- 3 examples, 0 failures
94
-
95
- ◐ Building package... Done!
96
- ◐ Deploying to workspace 'awesome-prod'... Done!
97
- Endpoint: https://api.tor1.faastruby.io/awesome-prod/hello-world
87
+ * Project URL: https://myproject-stage-abd123.tor1.faast.cloud
98
88
  ```
89
+ Now visit that url in the browser!
99
90
 
100
- 3. Run it:
101
-
102
- ```
103
- ~/hello-world$ curl https://api.tor1.faastruby.io/awesome-prod/hello-world
104
- Hello, World!
105
- ```
106
-
107
- Build lots of functions and share them with fellow Ruby devs!
108
-
109
- ## FaaStRuby + Hyperstack = fullstack Ruby apps!
91
+ ## faastRuby + Hyperstack = fullstack Ruby apps!
110
92
 
111
- Do you think JavaScript is your only option for the front-end? Think again. [Hyperstack](https://hyperstack.org) is a Ruby DSL, compiled by Opal, bundled by Webpack, powered by React.
93
+ Do you think JavaScript is your only option for the front-end? Think again. [Hyperstack](https://hyperstack.org) is a Ruby DSL, compiled by Opal, bundled by Webpack, powered by React.
@@ -3,8 +3,10 @@ require 'yaml'
3
3
  module FaaStRuby
4
4
  module Command
5
5
  class BaseCommand
6
- def self.spin(message)
7
- spinner = TTY::Spinner.new(":spinner #{message}", format: SPINNER_FORMAT)
6
+ def self.spin(message=nil)
7
+ s = ":spinner"
8
+ s += " #{message}" if message
9
+ spinner = TTY::Spinner.new(s, format: SPINNER_FORMAT)
8
10
  spinner.auto_spin
9
11
  spinner
10
12
  end
@@ -14,13 +14,16 @@ module FaaStRuby
14
14
  def run
15
15
  user = User.new(email: @options['email'])
16
16
  user.send_confirmation_code
17
- puts "\nYou should have received an email with a confirmation token. If you didn't receive an email, make sure you sign up with the correct email address."
17
+ puts "\nYou should have received an email with a confirmation token."
18
+ puts "If you didn't receive an email:"
19
+ puts "- Make sure you sign up with the correct email address"
20
+ puts "- The system won't send an email if you account status is already 'confirmed'"
18
21
  print "Confirmation Token: "
19
22
  user.confirmation_token = STDIN.gets.chomp
20
23
  spinner = spin("Confirming your account...")
21
24
  user.confirm_account!
22
25
  FaaStRuby::CLI.error(user.errors) if user.errors.any?
23
- spinner.stop(" Done!")
26
+ spinner.success
24
27
  user.save_credentials
25
28
  puts "Login successful!"
26
29
  migrate
@@ -32,10 +32,10 @@ module FaaStRuby
32
32
  spinner = spin("Creating your account...")
33
33
  user = User.create(email: email, password: password)
34
34
  if user.errors.any?
35
- spinner.stop(" Failed :(")
35
+ spinner.error
36
36
  FaaStRuby::CLI.error(user.errors)
37
37
  end
38
- spinner.stop(' Done!')
38
+ spinner.success
39
39
  exec("faastruby confirm-account --email #{email}")
40
40
  exit 0
41
41
  end
@@ -62,7 +62,7 @@ module FaaStRuby
62
62
  @yaml_config['before_build']&.each do |command|
63
63
  puts `#{command}`
64
64
  end
65
- spinner.stop(' Done!')
65
+ spinner.success
66
66
  self.class.build(source, output_file, @function_name)
67
67
  end
68
68
 
@@ -41,10 +41,21 @@ module FaaStRuby
41
41
  def run
42
42
  create_or_use_workspace
43
43
  if @yaml_config['serve_static']
44
+ if @options['quiet']
45
+ puts "[#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'..."
46
+ spinner = spin("")
47
+ else
48
+ spinner = say("[#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'...")
49
+ end
44
50
  package_file_name = build_package
45
- spinner = say("* [#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
46
51
  workspace = FaaStRuby::Workspace.new(name: @workspace_name).deploy(package_file_name)
47
52
  else
53
+ if @options['quiet']
54
+ puts "[#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'..."
55
+ spinner = spin("")
56
+ else
57
+ spinner = spin("[#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'...")
58
+ end
48
59
  if ruby_runtime?
49
60
  FaaStRuby::CLI.error('Please fix the problems above and try again') unless bundle_install
50
61
  end
@@ -53,15 +64,14 @@ module FaaStRuby
53
64
  end
54
65
  FaaStRuby::CLI.error("[#{@function_name}] Deploy aborted because 'test_command' exited non-zero.") unless run_tests
55
66
  package_file_name = build_package
56
- spinner = say("* [#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
57
67
  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
68
  end
59
69
  if workspace.errors.any?
60
- puts ' Failed :(' unless spinner&.stop(' Failed :(')
70
+ puts ' Failed :(' unless spinner&.error
61
71
  @package_file.unlink
62
72
  FaaStRuby::CLI.error(workspace.errors)
63
73
  end
64
- spinner.stop(' Done!') unless @options['quiet']
74
+ spinner.success unless @options['quiet']
65
75
  @package_file.unlink
66
76
  puts "* [#{@function_name}] Deploy OK".green
67
77
  unless @yaml_config['serve_static']
@@ -101,20 +111,24 @@ module FaaStRuby
101
111
  # for consistency. This is temporary until the API gets patched.
102
112
  spinner = say("[#{@function_name}] Waiting for the workspace '#{@workspace_name}' to be ready...", quiet: @options['quiet'])
103
113
  sleep 2
104
- puts ' Done!' unless spinner&.stop(' Done!')
114
+ puts ' Done!' unless spinner&.success
105
115
  end
106
116
  end
107
117
 
108
118
  def shards_install
109
119
  return true unless File.file?('shard.yml')
110
- puts "[#{@function_name}] Verifying dependencies"
120
+ # puts "[#{@function_name}] Verifying dependencies" unless @options["quiet"]
111
121
  system('shards check > /dev/null') || system('shards install')
122
+ rescue Errno::EPIPE
123
+ true
112
124
  end
113
125
 
114
126
  def bundle_install
115
127
  return true unless File.file?('Gemfile')
116
- puts "* [#{@function_name}] Verifying dependencies"
128
+ # puts "* [#{@function_name}] Verifying dependencies" unless @options["quiet"]
117
129
  system('bundle check >/dev/null') || system('bundle install')
130
+ rescue Errno::EPIPE
131
+ true
118
132
  end
119
133
 
120
134
  def missing_args
@@ -140,7 +154,7 @@ module FaaStRuby
140
154
  @yaml_config['before_build']&.each do |command|
141
155
  puts `#{command}`
142
156
  end
143
- spinner&.stop(' Done!')
157
+ spinner&.success
144
158
  end
145
159
  require 'faastruby/cli/commands/function/build'
146
160
  FaaStRuby::Command::Function::Build.build(source, output_file, @function_name, true)
@@ -186,7 +186,7 @@ module FaaStRuby
186
186
  return true unless File.file?("#{@base_dir}/Gemfile")
187
187
  spinner = spin("Installing gems...")
188
188
  system("bundle install --gemfile=#{@base_dir}/Gemfile > /dev/null")
189
- spinner.stop('Done!')
189
+ spinner.success
190
190
  end
191
191
 
192
192
  def write_shards_file
@@ -213,7 +213,7 @@ module FaaStRuby
213
213
  return true unless File.file?("#{@base_dir}/shard.yml")
214
214
  spinner = spin("Installing shards...")
215
215
  system("cd #{@base_dir} && shards install > /dev/null")
216
- spinner.stop('Done!')
216
+ spinner.success
217
217
  end
218
218
 
219
219
  def name_valid?
@@ -29,10 +29,10 @@ module FaaStRuby
29
29
  function = FaaStRuby::Function.new(name: @function_name, workspace: workspace)
30
30
  function.destroy
31
31
  if function.errors.any?
32
- spinner.stop('Failed :(')
32
+ spinner.error
33
33
  FaaStRuby::CLI.error(function.errors)
34
34
  end
35
- spinner.stop('Done!')
35
+ spinner.success
36
36
  end
37
37
 
38
38
  def self.help
@@ -22,10 +22,10 @@ module FaaStRuby
22
22
  function = FaaStRuby::Function.new(name: @function_name, workspace: workspace)
23
23
  function.update(new_context: @options['data'])
24
24
  if function.errors.any?
25
- spinner.stop('Failed :(')
25
+ spinner.error
26
26
  FaaStRuby::CLI.error(function.errors)
27
27
  end
28
- spinner.stop('Done!')
28
+ spinner.success
29
29
  end
30
30
 
31
31
  def self.help
@@ -7,7 +7,7 @@ module FaaStRuby
7
7
  end
8
8
 
9
9
  def run
10
- puts "FaaStRuby CLI - Manage workspaces and functions hosted at faastruby.io"
10
+ puts "faastRuby CLI - Manage workspaces and functions hosted at faastruby.io"
11
11
  puts "Version: #{FaaStRuby::VERSION}"
12
12
  puts
13
13
  puts "Usage: faastruby [update] [OPTIONS] COMMAND [--help | -h] [ARGS]"
@@ -13,13 +13,19 @@ module FaaStRuby
13
13
  @args = args
14
14
  help
15
15
  parse_options
16
+ @mutex = Mutex.new
17
+ @failed = {}
16
18
  @options['functions'] += find_functions unless @options['functions'].any?
17
19
  @options['environment'] ||= 'stage'
18
20
  @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?")
21
+ @project_secrets = YAML.load(File.read(PROJECT_SECRETS_FILE)) rescue {secrets: {}}
19
22
  @project_name = @project_yaml['name']
20
23
  @root_to = @project_yaml['root_to'] || 'root'
21
24
  @catch_all = @project_yaml['catch_all'] || 'catch-all'
22
25
  @project_identifier = "-#{@project_yaml['identifier']}" if @project_yaml['identifier']
26
+ @workspace = "#{@project_name}-#{@options['environment']}#{@project_identifier}"
27
+ @spinners = TTY::Spinner::Multi.new("Deploying project '#{@project_name}' to workspace '#{@workspace}'", format: SPINNER_FORMAT)
28
+ # puts
23
29
  end
24
30
 
25
31
  def puts(msg)
@@ -33,38 +39,69 @@ module FaaStRuby
33
39
  errors = false
34
40
  root_folder = Dir.pwd
35
41
  jobs = []
36
- workspace = "#{@project_name}-#{@options['environment']}#{@project_identifier}"
37
- spinner = spin "Deploying project '#{@project_name}' to workspace #{workspace}..."
38
- try_workspace(workspace)
42
+
43
+ # spinner = spin "Deploying project '#{@project_name}' to workspace #{workspace}..."
44
+ connect_spinner = @spinners.register "[:spinner] Connecting to workspace '#{@workspace}'"
45
+ connect_spinner.auto_spin
46
+ try_workspace(@workspace, connect_spinner)
39
47
  @options['functions'].each do |function_path|
40
48
  jobs << Thread.new do
41
- # puts "[#{function_path}] Entering folder '#{function_path}'"
42
- # Dir.chdir function_path
43
49
  function_config = YAML.load(File.read("#{function_path}/faastruby.yml"))
44
50
  function_name = function_config['name']
45
-
46
- cmd = "cd #{function_path} && faastruby deploy-to #{workspace} --quiet --dont-create-workspace"
51
+ msg = function_name == 'public' ? "Uploading static assets in '#{function_name}'" : "Deploying function '#{function_path}'"
52
+ spinner = @spinners.register "[:spinner] #{msg}"
53
+ spinner.auto_spin
54
+ # puts "[#{function_path}] Entering folder '#{function_path}'"
55
+ # Dir.chdir function_path
56
+ cmd = "cd #{function_path} && faastruby deploy-to #{@workspace} --quiet --dont-create-workspace"
47
57
  cmd += " --set-root" if @root_to == function_name
48
58
  cmd += " --set-catch-all" if @catch_all == function_name
49
- Open3.popen2(cmd) do |stdin, stdout, status_thread|
50
- stdout.each_line do |line|
51
- puts line
52
- end
53
- FaaStRuby::CLI.error("* [#{function_path}] Deploy FAILED", color: nil) unless status_thread.value.success?
59
+ secrets = secrets_for(function_name)
60
+ secrets_json = Oj.dump(secrets) if secrets
61
+ cmd += " --context '#{secrets_json}'" if secrets_json
62
+ output, status = Open3.capture2e(cmd)
63
+ if status == 0
64
+ spinner.success
65
+ else
66
+ add_failed(function_name, output)
67
+ spinner.error
54
68
  end
55
69
  end
56
70
  end
57
71
  jobs.each{|thr| thr.join}
58
- puts "* Project URL: #{FaaStRuby.workspace_host_for(workspace)}\n\n".green
72
+ if @failed.any?
73
+ puts "\n\nFAILURES:".red
74
+ @failed.each do |function_name, output|
75
+ puts "* Function '#{function_name}' deploy failed:".red
76
+ puts output
77
+ puts nil
78
+ end
79
+ puts "* Project URL: #{FaaStRuby.workspace_host_for(@workspace)}\n".green
80
+ end
81
+ end
82
+
83
+ def secrets_for(function_name)
84
+ secrets = @project_secrets[@options['environment']]
85
+ return nil unless secrets
86
+ secrets[function_name]
87
+ end
88
+
89
+ def add_failed(function_name, output)
90
+ @mutex.synchronize do
91
+ @failed[function_name] = output
92
+ end
59
93
  end
60
94
 
61
- def try_workspace(workspace)
95
+ def try_workspace(workspace, connect_spinner)
96
+ return true if @options['skip_create_workspace']
62
97
  try_to_create = Proc.new {system("faastruby create-workspace #{workspace} > /dev/null 2>&1")}
63
98
  has_credentials = system("faastruby list-workspace #{workspace} > /dev/null 2>&1")
64
99
  continue = has_credentials || try_to_create.call
65
100
  unless continue
101
+ connect_spinner.error
66
102
  FaaStRuby::CLI.error("Unable to deploy project to workspace '#{workspace}'. Make sure you have the credentials, or try a different environment name.\nExample: faastruby deploy --deploy-env #{@options['environment']}-#{(rand * 100).to_i}")
67
103
  end
104
+ connect_spinner.success
68
105
  true
69
106
  end
70
107
 
@@ -95,6 +132,8 @@ module FaaStRuby
95
132
  while @args.any?
96
133
  option = @args.shift
97
134
  case option
135
+ when '--skip-create-workspace'
136
+ @options['skip_create_workspace'] = true
98
137
  when '--function', '-f'
99
138
  @options['functions'] << @args.shift
100
139
  when '--env', '-e'
@@ -21,12 +21,12 @@ module FaaStRuby
21
21
  spinner = spin("Setting up workspace '#{@workspace_name}'...")
22
22
  workspace = FaaStRuby::Workspace.create(name: @workspace_name, email: @options['email'])
23
23
  if workspace.errors.any?
24
- spinner.stop(" Failed :(") if exit_on_error
24
+ spinner.error if exit_on_error
25
25
  FaaStRuby::CLI.error(workspace.errors) if exit_on_error
26
- spinner.stop
26
+ spinner.success
27
27
  return false
28
28
  end
29
- spinner.stop(" Done!")
29
+ spinner.success
30
30
  end
31
31
  create_dir if @options['create_local_dir'] && create_directory && !dir_exists?
32
32
  true
@@ -21,10 +21,10 @@ module FaaStRuby
21
21
  spinner = spin("Destroying...")
22
22
  workspace.destroy
23
23
  if workspace.errors.any?
24
- spinner.stop(" Failed :(")
24
+ spinner.error
25
25
  FaaStRuby::CLI.error(workspace.errors)
26
26
  end
27
- spinner.stop("Done!")
27
+ spinner.success
28
28
  puts "Workspace '#{@workspace_name}' was deleted from the cloud platform."
29
29
  end
30
30
 
@@ -70,11 +70,11 @@ module FaaStRuby
70
70
  response = api.migrate_to_account(workspace_name: workspace_name, api_key: credentials['api_key'], api_secret: credentials['api_secret'])
71
71
  if response.code > 299
72
72
  @failed << workspace_name
73
- spinner.stop(" Failed :(".red)
73
+ spinner.error
74
74
  return false
75
75
  end
76
76
  @migrated << workspace_name
77
- spinner.stop(" Done!".green)
77
+ spinner.success
78
78
  return true
79
79
  end
80
80
 
@@ -19,7 +19,7 @@ module FaaStRuby
19
19
  workspace = FaaStRuby::Workspace.new(name: @workspace_name)
20
20
  workspace.delete_file(relative_path: @relative_path)
21
21
  FaaStRuby::CLI.error(workspace.errors) if workspace.errors.any?
22
- spinner.stop("Done!")
22
+ spinner.success
23
23
  puts "* [#{@relative_path}] File removed from cloud workspace '#{@workspace_name}'.".green
24
24
  end
25
25
 
@@ -19,7 +19,7 @@ module FaaStRuby
19
19
  workspace = FaaStRuby::Workspace.new(name: @workspace_name)
20
20
  workspace.update_runners(@options['runners_max'])
21
21
  FaaStRuby::CLI.error(workspace.errors) if workspace.errors.any?
22
- spinner.stop("Done!")
22
+ spinner.success
23
23
  end
24
24
 
25
25
  def self.help
@@ -128,10 +128,11 @@ module FaaStRuby
128
128
  puts "Crystal functions: #{crystal_functions.inspect}"
129
129
  listen_on_functions_dir
130
130
  listen_on_public_dir if SYNC_ENABLED
131
- initial_compile_and_deploy(crystal_functions)
132
- puts "Listening for changes."
133
131
  FunctionProcessor.new(FUNCTIONS_EVENT_QUEUE).start
134
132
  StaticFileProcessor.new(PUBLIC_EVENT_QUEUE).start if SYNC_ENABLED
133
+ # initial_compile
134
+ puts "Listening for changes."
135
+ puts "faastRuby Local is ready at http://localhost:3000"
135
136
  sleep
136
137
  ensure
137
138
  puts "Stopping Watchdog..."
@@ -139,30 +140,21 @@ module FaaStRuby
139
140
  Local::Listener.public_listener.each(&:stop)
140
141
  end
141
142
 
142
- def self.initial_compile_and_deploy(crystal_functions)
143
- debug "initial_compile_and_deploy(#{crystal_functions.inspect})"
144
- puts "Triggering 'compile' on Crystal functions." if crystal_functions.any?
145
- if SYNC_ENABLED
146
- puts "Running initial cloud sync."
147
- StaticFile.full_sync
143
+ def self.initial_compile
144
+ debug __method__
145
+ Thread.new do
146
+ sleep 1
147
+ crystal_functions = @@functions.map{|f| f if f.language == "crystal"}.compact
148
+ puts "Triggering 'compile' on Crystal functions." if crystal_functions.any?
149
+ crystal_functions.each {|f| FileUtils.touch("#{f.absolute_folder}/faastruby.yml")}
148
150
  end
149
- sleep 1
150
- @@functions.each {|f| FileUtils.touch("#{f.absolute_folder}/faastruby.yml")}
151
151
  end
152
152
 
153
153
  def self.sync_mode_enabled
154
154
  debug __method__
155
155
  puts "Sync mode enabled."
156
- print "Connecting to workspace '#{workspace}'... "
157
- try_to_create = Proc.new {system("faastruby create-workspace #{workspace}")}
158
- has_credentials = system("faastruby list-workspace #{workspace} > /dev/null 2>&1")
159
- continue = has_credentials || try_to_create.call
160
- unless continue
161
- puts "[FATAL] Unable to setup project workspace '#{workspace}'. 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
162
- exit 1
163
- end
164
- STDOUT.puts "connected!\n".yellow
165
156
  puts "Your local environment will be synced to https://#{workspace}.tor1.faast.cloud"
157
+ system("faastruby deploy")
166
158
  true
167
159
  end
168
160
 
@@ -64,16 +64,15 @@ module FaaStRuby
64
64
  debug "deploy"
65
65
  deploy_cmd, deploy_cmd_print = generate_deploy_command
66
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 "---"
67
+ status = nil
68
+ Open3.popen2(deploy_cmd.join(' ')) do |i, oe, thr|
69
+ oe.each_line do |line|
70
+ next if line.chomp == '' || line.chomp == '---'
71
+ STDOUT.puts "#{Time.now} | #{line}"
72
+ STDOUT.puts "---"
73
+ end
74
+ status = thr.value
73
75
  end
74
- thr.join
75
- oe.close
76
- status = thr.value
77
76
  end
78
77
 
79
78
  def language
@@ -66,6 +66,18 @@ module FaaStRuby
66
66
  debug "EVENT: #{@full_path}"
67
67
  end
68
68
 
69
+ def to_h
70
+ {
71
+ listened_directory: @listened_directory,
72
+ full_path: @full_path,
73
+ relative_path: @relative_path,
74
+ relative_path_dirname: @relative_path_dirname,
75
+ filename: @filename,
76
+ dirname: @dirname,
77
+ type: @type
78
+ }
79
+ end
80
+
69
81
  def function_created?
70
82
  debug __method__
71
83
  added? && filename.match(/^handler\.(rb|cr)$/)
@@ -76,6 +88,11 @@ module FaaStRuby
76
88
  filename == 'Gemfile'
77
89
  end
78
90
 
91
+ def file_is_a_gemfile_lock?
92
+ debug __method__
93
+ filename == 'Gemfile.lock'
94
+ end
95
+
79
96
  def file_is_a_handler?
80
97
  debug __method__
81
98
  filename.match(/^handler\.(rb|cr)$/)
@@ -4,7 +4,8 @@ module FaaStRuby
4
4
 
5
5
  def should_ignore?(event)
6
6
  debug "should_ignore?(#{event.inspect})"
7
- if present_in_ignore_list?(event.dirname)
7
+ return true if event.file_is_a_gemfile_lock?
8
+ if present_in_ignore_list?(event.dirname) || present_in_ignore_list?(event.full_path)
8
9
  debug "SKIP #{event}"
9
10
  return true
10
11
  end
@@ -36,7 +37,7 @@ module FaaStRuby
36
37
  return new_function(event)
37
38
  end
38
39
  init_gemfile(event) if event.file_is_a_gemfile?
39
- unless event.file_is_a_function_config? && event.file_is_a_gemfile?
40
+ unless event.file_is_a_function_config? || event.file_is_a_gemfile? || event.file_is_a_gemfile_lock?
40
41
  debug "added: a file was added"
41
42
  deploy(event)
42
43
  end
@@ -124,7 +125,6 @@ module FaaStRuby
124
125
  end
125
126
 
126
127
  def deploy(event)
127
- debug "deploy(#{event.inspect})"
128
128
  return false unless SYNC_ENABLED
129
129
  # This should run when sync is enabled and:
130
130
  # - added any file but handler
@@ -132,11 +132,11 @@ module FaaStRuby
132
132
  # - removed any file but handler
133
133
  function = Local::Function.that_has_file(event.full_path, event.type)
134
134
  run(function.name, 'deploy') do
135
- debug "+ IGNORE #{function.absolute_folder}"
136
- add_ignore(function.absolute_folder)
137
- function.deploy
138
- debug "- IGNORE #{function.absolute_folder}"
139
- remove_ignore(function.absolute_folder)
135
+ # debug "+ IGNORE #{function.absolute_folder}"
136
+ # add_ignore(function.absolute_folder)
137
+ function.deploy
138
+ # debug "- IGNORE #{function.absolute_folder}"
139
+ # remove_ignore(function.absolute_folder)
140
140
  end
141
141
  end
142
142
 
@@ -150,24 +150,30 @@ module FaaStRuby
150
150
  end
151
151
 
152
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
153
+ run(event.dirname, 'bundle install') do
154
+ puts "Running: cd #{event.relative_path_dirname} && bundle install"
155
+ if system("cd #{event.dirname} && bundle install")
156
+ STDOUT.puts '---'.yellow
157
+ puts "Gems from Gemfile '#{event.relative_path}' were installed in your local machine."
158
+ else
159
+ STDOUT.puts '---'.red
160
+ STDOUT.puts "#{Time.now} | Error installing gems in your local machine for Gemfile '#{event.relative_path}'.".red
161
+ end
160
162
  end
161
163
  end
162
164
 
163
165
  def init_gemfile(event)
164
166
  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)
167
+ run(event.full_path, "init_gemfile") do
168
+ puts "Initializing Gemfile '#{event.relative_path}'"
169
+ add_ignore(event.full_path)
170
+ sleep 0.2
171
+ File.write(event.full_path, Local::RubyFunction.default_gemfile)
172
+ sleep 0.5
173
+ remove_ignore(event.full_path)
174
+ end
168
175
  end
169
176
  end
170
-
171
177
  end
172
178
  end
173
179
  end
@@ -1,3 +1,3 @@
1
1
  module FaaStRuby
2
- VERSION = '0.5.12'
2
+ VERSION = '0.5.13'
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.12
4
+ version: 0.5.13
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-16 00:00:00.000000000 Z
11
+ date: 2019-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client