faastruby 0.2.6 → 0.3.1

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: 7fd64fdf16d7eaccea051a5d101f1376c7276285b8ae68f31320dc9dafe4d348
4
- data.tar.gz: 3277f48a6095471b033ce8b730532255c092935437b30d72a9a851ccd1a0be21
3
+ metadata.gz: ca9d4cec0bdbdaefb83ad63a578a211a5fb186f118f2e9c7f4bb8f81f4b2ac08
4
+ data.tar.gz: 5857b9257bafe182fb38f89a6a1290d3a7fc148e75bc405e48a9cd51e6acbb80
5
5
  SHA512:
6
- metadata.gz: 4342ed171a03f6dd3ad3bb1d9ee6b0f0d5cbb81de042a64e2e6fa884bf52c6f7ebf0146b4d25d5c8338b88ebf2126b15774c92aa904a5c677a8bcb8a3cf6689b
7
- data.tar.gz: 6a4ed4b25c093aac6f968c82932a1194ef0f6d2d172b99b7cc96a1072d77bd29f3ee1351d5439948ea362bcfcda15ee8c4d5d961c78f9c1c14a6e08b861b31ed
6
+ metadata.gz: f6fdbc0c311dc686ef5f1aa2f8310d4cef9fdf7c77d304bb42edc8069da4603b30d033df29d2b4743e5891f1ef90a34460ffb49cebcf927bbbad02c6860b8eff
7
+ data.tar.gz: 8aeb14ace46c50277eff7a9a9f29d7dda88f302674a96a5d5ece6930072698a3eff8a3816984f91944d39f359594b643caf0c1605e8ec8e2f1c6c02e515d4062
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.1 - Dec 9 2018
4
+ - Add faastruby-rpc to Gemfile template and runtime dependencies
5
+
6
+ ## 0.3.0 - Dec 9 2018
7
+ - Add spinner feedback when destroying workspace
8
+ - Better error handling when response is not JSON
9
+ - New command `faastruby server` will start a development environment.
10
+
3
11
  ## 0.2.6 - Nov 20 2018
4
12
  - Change Ruby minimum version to 2.5.0
5
13
  - Disable timeout on HTTP requests.
data/Gemfile.lock CHANGED
@@ -1,39 +1,61 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- faastruby (0.2.6)
4
+ faastruby (0.3.0)
5
5
  colorize (~> 0.8)
6
+ faastruby-rpc (~> 0.1)
6
7
  oj (~> 3.6)
8
+ puma (~> 3.12)
7
9
  rest-client (~> 2.0)
8
10
  rubyzip (~> 1.2)
11
+ sinatra (~> 2.0)
12
+ sinatra-contrib (~> 2.0)
9
13
  tty-spinner (~> 0.8)
10
14
  tty-table (~> 0.10)
11
15
 
12
16
  GEM
13
17
  remote: https://rubygems.org/
14
18
  specs:
19
+ activesupport (5.2.2)
20
+ concurrent-ruby (~> 1.0, >= 1.0.2)
21
+ i18n (>= 0.7, < 2)
22
+ minitest (~> 5.1)
23
+ tzinfo (~> 1.1)
15
24
  addressable (2.5.2)
16
25
  public_suffix (>= 2.0.2, < 4.0)
26
+ backports (3.11.4)
17
27
  colorize (0.8.1)
28
+ concurrent-ruby (1.1.3)
18
29
  crack (0.4.3)
19
30
  safe_yaml (~> 1.0.0)
20
31
  diff-lcs (1.3)
21
32
  domain_name (0.5.20180417)
22
33
  unf (>= 0.0.5, < 1.0.0)
23
34
  equatable (0.5.0)
35
+ faastruby-rpc (0.1.1)
36
+ oj (~> 3.6)
24
37
  hashdiff (0.3.7)
25
38
  http-cookie (1.0.3)
26
39
  domain_name (~> 0.5)
40
+ i18n (1.1.1)
41
+ concurrent-ruby (~> 1.0)
27
42
  mime-types (3.2.2)
28
43
  mime-types-data (~> 3.2015)
29
44
  mime-types-data (3.2018.0812)
45
+ minitest (5.11.3)
46
+ multi_json (1.13.1)
47
+ mustermann (1.0.3)
30
48
  necromancer (0.4.0)
31
49
  netrc (0.11.0)
32
- oj (3.7.1)
50
+ oj (3.7.4)
33
51
  pastel (0.7.2)
34
52
  equatable (~> 0.5.0)
35
53
  tty-color (~> 0.4.0)
36
54
  public_suffix (3.0.3)
55
+ puma (3.12.0)
56
+ rack (2.0.6)
57
+ rack-protection (2.0.4)
58
+ rack
37
59
  rake (10.5.0)
38
60
  rest-client (2.0.2)
39
61
  http-cookie (>= 1.0.2, < 2.0)
@@ -54,22 +76,39 @@ GEM
54
76
  rspec-support (3.8.0)
55
77
  rubyzip (1.2.2)
56
78
  safe_yaml (1.0.4)
79
+ sinatra (2.0.4)
80
+ mustermann (~> 1.0)
81
+ rack (~> 2.0)
82
+ rack-protection (= 2.0.4)
83
+ tilt (~> 2.0)
84
+ sinatra-contrib (2.0.4)
85
+ activesupport (>= 4.0.0)
86
+ backports (>= 2.8.2)
87
+ multi_json
88
+ mustermann (~> 1.0)
89
+ rack-protection (= 2.0.4)
90
+ sinatra (= 2.0.4)
91
+ tilt (>= 1.3, < 3)
57
92
  strings (0.1.4)
58
93
  strings-ansi (~> 0.1.0)
59
94
  unicode-display_width (~> 1.4.0)
60
95
  unicode_utils (~> 1.4.0)
61
96
  strings-ansi (0.1.0)
97
+ thread_safe (0.3.6)
98
+ tilt (2.0.9)
62
99
  tty-color (0.4.3)
63
100
  tty-cursor (0.6.0)
64
101
  tty-screen (0.6.5)
65
- tty-spinner (0.8.0)
66
- tty-cursor (>= 0.5.0)
102
+ tty-spinner (0.9.0)
103
+ tty-cursor (~> 0.6.0)
67
104
  tty-table (0.10.0)
68
105
  equatable (~> 0.5.0)
69
106
  necromancer (~> 0.4.0)
70
107
  pastel (~> 0.7.2)
71
108
  strings (~> 0.1.0)
72
109
  tty-screen (~> 0.6.4)
110
+ tzinfo (1.2.5)
111
+ thread_safe (~> 0.1)
73
112
  unf (0.1.4)
74
113
  unf_ext
75
114
  unf_ext (0.0.7.5)
@@ -2,4 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  group :test do
4
4
  gem 'rspec'
5
+ gem 'faastruby-rpc'
5
6
  end
@@ -1,2 +1,3 @@
1
+ require 'faastruby-rpc'
1
2
  require 'helpers/faastruby'
2
3
  include FaaStRuby
data/example/Gemfile CHANGED
@@ -2,4 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  group :test do
4
4
  gem 'rspec'
5
+ gem 'faastruby-rpc'
5
6
  end
@@ -1,2 +1,3 @@
1
+ require 'faastruby-rpc'
1
2
  require 'helpers/faastruby'
2
3
  include FaaStRuby
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sinatra'
4
+ require 'sinatra/multi_route'
5
+ require 'yaml'
6
+ require 'oj'
7
+ require 'faastruby-rpc'
8
+
9
+ module FaaStRubyFunction
10
+ def self.call(workspace_name, function_name, event, args)
11
+ begin
12
+ load "./#{workspace_name}/#{function_name}/handler.rb"
13
+ response = handler(event, *args)
14
+ return response if response.is_a?(FaaStRubyFunction::Response)
15
+ body = {
16
+ 'error' => "Please use the helpers 'render' or 'respond_with' as your function return value."
17
+ }
18
+ respond_with(Oj.dump(body), status: 500, headers: {'Content-Type' => 'application/json'})
19
+ rescue Exception => e
20
+ body = {
21
+ 'error' => e.message,
22
+ 'location' => e.backtrace&.first,
23
+ }
24
+ respond_with(Oj.dump(body), status: 500, headers: {'Content-Type' => 'application/json'})
25
+ end
26
+ end
27
+ def self.respond_with(body, status: 200, headers: {})
28
+ r = FaaStRubyFunction::Response.new(:body, :status, :headers)
29
+ r.new(body, status, headers)
30
+ end
31
+
32
+ def self.render(js: nil, body: nil, inline: nil, html: nil, json: nil, yaml: nil, text: nil, status: 200, headers: {}, content_type: nil)
33
+ headers["Content-Type"] = content_type if content_type
34
+ case
35
+ when json
36
+ headers["Content-Type"] ||= "application/json"
37
+ resp_body = json.is_a?(String) ? json : Oj.dump(json)
38
+ when html, inline
39
+ headers["Content-Type"] ||= "text/html"
40
+ resp_body = html
41
+ when text
42
+ headers["Content-Type"] ||= "text/plain"
43
+ resp_body = text
44
+ when yaml
45
+ headers["Content-Type"] ||= "application/yaml"
46
+ resp_body = yaml.to_yaml
47
+ when body
48
+ headers["Content-Type"] ||= "application/octet-stream"
49
+ resp_body = raw
50
+ when js
51
+ headers["Content-Type"] ||= "text/javascript"
52
+ resp_body = js
53
+ end
54
+ respond_with(resp_body, status: status, headers: headers)
55
+ end
56
+ class Event < Struct
57
+ end
58
+
59
+ class Response < Struct
60
+ end
61
+ end
62
+
63
+ class FaaStRubyServer < Sinatra::Application
64
+ set :port, 3000
65
+ set :bind, '0.0.0.0'
66
+ case ARGV.shift
67
+ when '-p'
68
+ set :port, ARGV.shift
69
+ when '-b'
70
+ set :bind, ARGV.shift
71
+ end
72
+ set :server, %w[puma]
73
+ set :run, false
74
+ set :show_exceptions, false
75
+
76
+ register Sinatra::MultiRoute
77
+ route :get, :post, :put, :patch, :delete, '/:workspace_name/:function_name' do
78
+ e = FaaStRubyFunction::Event.new(:body, :query_params, :headers, :context)
79
+ headers = env.select { |key, value| key.include?('HTTP_') || ['CONTENT_TYPE', 'CONTENT_LENGTH', 'REMOTE_ADDR', 'REQUEST_METHOD', 'QUERY_STRING'].include?(key) }
80
+ if headers.has_key?("HTTP_FAASTRUBY_RPC")
81
+ body = nil
82
+ rpc_args = parse_body(request.body.read, headers['CONTENT_TYPE'], request.request_method) || []
83
+ else
84
+ body = parse_body(request.body.read, headers['CONTENT_TYPE'], request.request_method)
85
+ rpc_args = []
86
+ end
87
+ query_params = parse_query(request.query_string)
88
+ context = set_context(params[:workspace_name], params[:function_name])
89
+ event = e.new(body, query_params, headers, context)
90
+ response = FaaStRubyFunction.call(params[:workspace_name], params[:function_name], event, rpc_args)
91
+ status response.status
92
+ headers response.headers
93
+ body response.body
94
+ end
95
+
96
+ def parse_body(body, content_type, method)
97
+ return nil if method == 'GET'
98
+ return {} if body.nil? && method != 'GET'
99
+ return Oj.load(body) if content_type == 'application/json'
100
+ return body
101
+ end
102
+
103
+ def set_context(workspace_name, function_name)
104
+ return nil unless File.file?('context.yml')
105
+ yaml = YAML.load(File.read('context.yml'))
106
+ return nil unless yaml.has_key?(workspace_name)
107
+ yaml[workspace_name][function_name]
108
+ end
109
+
110
+ def parse_query(query_string)
111
+ hash = {}
112
+ query_string.split('&').each do |param|
113
+ key, value = params.split('=')
114
+ hash[key] = value
115
+ end
116
+ hash
117
+ end
118
+ def self.run?
119
+ true
120
+ end
121
+ end
122
+
123
+ FaaStRubyServer.run! rescue nil # this will suppress some of the errors messages
data/faastruby.gemspec CHANGED
@@ -17,6 +17,10 @@ Gem::Specification.new do |spec|
17
17
  spec.add_runtime_dependency 'tty-table', '~> 0.10'
18
18
  spec.add_runtime_dependency 'rubyzip', '~> 1.2'
19
19
  spec.add_runtime_dependency 'colorize', '~> 0.8'
20
+ spec.add_runtime_dependency 'sinatra', '~> 2.0'
21
+ spec.add_runtime_dependency 'sinatra-contrib', '~> 2.0'
22
+ spec.add_runtime_dependency 'puma', '~> 3.12'
23
+ spec.add_runtime_dependency 'faastruby-rpc', '~> 0.1'
20
24
 
21
25
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
22
26
  # to allow pushing to a single host or delete this section to allow pushing to any host.
data/lib/faastruby/api.rb CHANGED
@@ -131,7 +131,12 @@ module FaaStRuby
131
131
  end
132
132
 
133
133
  def parse(response)
134
- body = Oj.load(response.body) unless [500, 408].include?(response.code)
134
+ begin
135
+ body = Oj.load(response.body) unless [500, 408].include?(response.code)
136
+ rescue Oj::ParseError => e
137
+ puts response.body
138
+ raise e
139
+ end
135
140
  case response.code
136
141
  when 401 then return error(["(401) Unauthorized - #{body['error']}"], 401)
137
142
  when 404 then return error(["(404) Not Found - #{body['error']}"], 404)
data/lib/faastruby/cli.rb CHANGED
@@ -21,6 +21,7 @@ module FaaStRuby
21
21
  FaaStRuby::Command::Help.new(args).run
22
22
  return
23
23
  end
24
+ start_server(args) if command == 'server'
24
25
  check_version
25
26
  check_region
26
27
  error("Unknown command: #{command}") unless FaaStRuby::Command::COMMANDS.has_key?(command)
@@ -42,5 +43,9 @@ module FaaStRuby
42
43
  ENV['FAASTRUBY_REGION'] ||= DEFAULT_REGION
43
44
  error(["No such region: #{ENV['FAASTRUBY_REGION']}".red, "Valid regions are: #{FaaStRuby::REGIONS.join(' | ')}"], color: nil) unless FaaStRuby::REGIONS.include?(ENV['FAASTRUBY_REGION'])
44
45
  end
46
+
47
+ def self.start_server(args)
48
+ exec("faastruby-server #{args.join(' ')}")
49
+ end
45
50
  end
46
51
  end
@@ -57,7 +57,7 @@ EOS
57
57
 
58
58
  def dir_exists?
59
59
  return unless File.directory?(@base_dir)
60
- print "The directory '#{@function_name}' already exists. Overwrite files? [y/N] "
60
+ print "The folder '#{@function_name}' already exists. Overwrite files? [y/N] "
61
61
  response = STDIN.gets.chomp
62
62
  FaaStRuby::CLI.error("Cancelled", color: nil) unless response == 'y'
63
63
  end
@@ -96,4 +96,4 @@ EOS
96
96
  end
97
97
  end
98
98
  end
99
- end
99
+ end
@@ -7,11 +7,13 @@ module FaaStRuby
7
7
  @missing_args = []
8
8
  FaaStRuby::CLI.error(@missing_args, color: nil) if missing_args.any?
9
9
  @workspace_name = @args.shift
10
+ @base_dir = "./#{@workspace_name}"
10
11
  parse_options
11
12
  @options['credentials_file'] ||= FaaStRuby.credentials_file
12
13
  end
13
14
 
14
15
  def run
16
+ dir_exists? || FileUtils.mkdir_p(@base_dir)
15
17
  spinner = spin("Requesting credentials...")
16
18
  workspace = FaaStRuby::Workspace.create(name: @workspace_name, email: @options['email'])
17
19
  spinner.stop("Done!")
@@ -37,6 +39,12 @@ module FaaStRuby
37
39
 
38
40
  private
39
41
 
42
+ def dir_exists?
43
+ return false unless File.directory?(@base_dir)
44
+ puts "Local folder '#{@workspace_name}' already exists."
45
+ true
46
+ end
47
+
40
48
  def missing_args
41
49
  if @args.empty?
42
50
  @missing_args << "Missing argument: WORKSPACE_NAME".red
@@ -16,8 +16,10 @@ module FaaStRuby
16
16
  warning unless @options['force']
17
17
  FaaStRuby::CLI.error("Cancelled") unless @options['force'] == 'y'
18
18
  workspace = FaaStRuby::Workspace.new(name: @workspace_name)
19
+ spinner = spin("Destroying...")
19
20
  workspace.destroy
20
21
  FaaStRuby::CLI.error(workspace.errors) if workspace.errors.any?
22
+ spinner.stop("Done!")
21
23
  FaaStRuby::Credentials.remove(@workspace_name, @options['credentials_file'])
22
24
  puts "Workspace '#{@workspace_name}' was deleted from the server"
23
25
  end
@@ -1,3 +1,3 @@
1
1
  module FaaStRuby
2
- VERSION = '0.2.6'
2
+ VERSION = '0.3.1'
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.2.6
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paulo Arruda
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-21 00:00:00.000000000 Z
11
+ date: 2018-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -94,6 +94,62 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sinatra
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sinatra-contrib
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: puma
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.12'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.12'
139
+ - !ruby/object:Gem::Dependency
140
+ name: faastruby-rpc
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.1'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.1'
97
153
  - !ruby/object:Gem::Dependency
98
154
  name: bundler
99
155
  requirement: !ruby/object:Gem::Requirement
@@ -155,6 +211,7 @@ email:
155
211
  - parrudaj@gmail.com
156
212
  executables:
157
213
  - faastruby
214
+ - faastruby-server
158
215
  extensions: []
159
216
  extra_rdoc_files: []
160
217
  files:
@@ -180,6 +237,7 @@ files:
180
237
  - example/spec/helpers/faastruby.rb
181
238
  - example/spec/spec_helper.rb
182
239
  - exe/faastruby
240
+ - exe/faastruby-server
183
241
  - faastruby.gemspec
184
242
  - lib/faastruby.rb
185
243
  - lib/faastruby/api.rb