faastruby 0.5.23 → 0.5.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +35 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +16 -2
- data/faastruby.gemspec +2 -0
- data/lib/faastruby/cli/commands/project/new.rb +10 -0
- data/lib/faastruby/local.rb +31 -0
- data/lib/faastruby/local/listeners/listener.rb +8 -0
- data/lib/faastruby/local/processors.rb +1 -0
- data/lib/faastruby/local/processors/opal.rb +92 -0
- data/lib/faastruby/server.rb +1 -0
- data/lib/faastruby/server/runner.rb +8 -0
- data/lib/faastruby/server/runner_methods.rb +4 -0
- data/lib/faastruby/server/template.rb +13 -0
- data/lib/faastruby/version.rb +1 -1
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9e8d511a386cfc4cf3ed084c04c10398ad7d93c298a3bd202f2690ae9f72a7d
|
4
|
+
data.tar.gz: 4ce5ed8f21a33e3c648fe60f13f41b3938b31f02122952d1b66765cf7dd861aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd373b632709eee2ac1283ca11454dc5572258a7ca8e7f2b32376f7e473b3d2fd4640e384ee24051f22f3a67bf91e098b195655ae3b01ed4985c24474468cbd0
|
7
|
+
data.tar.gz: 4999518623a9c3d4409e4a93c963cb9a83860e24fe814b28c1b93593d67134dcf4f06e9c93dfe3108bec2dd1ae2292bb779d635f4ab5315781ee91f878ed6f4a
|
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# This file is a template, and might need editing before it works on your project.
|
2
|
+
# Official docker image.
|
3
|
+
image: ruby:2.6
|
4
|
+
|
5
|
+
stages:
|
6
|
+
- test
|
7
|
+
- build
|
8
|
+
- deploy
|
9
|
+
|
10
|
+
test:
|
11
|
+
stage: test
|
12
|
+
script:
|
13
|
+
- bundle install --with test
|
14
|
+
- bundle exec rspec
|
15
|
+
|
16
|
+
build:
|
17
|
+
stage: build
|
18
|
+
script:
|
19
|
+
- gem build faastruby.gemspec
|
20
|
+
only:
|
21
|
+
- tags
|
22
|
+
except:
|
23
|
+
- branches
|
24
|
+
- master
|
25
|
+
|
26
|
+
push:
|
27
|
+
stage: deploy
|
28
|
+
when: manual
|
29
|
+
script:
|
30
|
+
- gem push faastruby-*.gem
|
31
|
+
only:
|
32
|
+
- tags
|
33
|
+
except:
|
34
|
+
- branches
|
35
|
+
- master
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.5.24 - Apr 17 2019
|
4
|
+
- Add experimental support for Opal
|
5
|
+
- Add new project configuration keys: `opal_dir` and `opal_js_destination`
|
6
|
+
- Add helper method `render_template` to the Ruby runtime.
|
7
|
+
|
3
8
|
## 0.5.23 - Apr 7 2019
|
4
9
|
- Move regions configuration to a separate file, so it can be shared among different components of the gem
|
5
10
|
- Replace hardcoded URLs by the correct variables
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
faastruby (0.5.
|
4
|
+
faastruby (0.5.24)
|
5
5
|
colorize (~> 0.8)
|
6
6
|
faastruby-rpc (~> 0.2.7)
|
7
7
|
listen (~> 3.1)
|
8
8
|
oj (~> 3.6)
|
9
|
+
opal (~> 0.11.4)
|
10
|
+
opal-jquery (~> 0.4.3)
|
9
11
|
puma (~> 3.12)
|
10
12
|
rest-client (~> 2.0)
|
11
13
|
rouge (~> 3.3)
|
@@ -21,6 +23,7 @@ GEM
|
|
21
23
|
specs:
|
22
24
|
addressable (2.5.2)
|
23
25
|
public_suffix (>= 2.0.2, < 4.0)
|
26
|
+
ast (2.4.0)
|
24
27
|
backports (3.13.0)
|
25
28
|
colorize (0.8.1)
|
26
29
|
crack (0.4.3)
|
@@ -34,6 +37,7 @@ GEM
|
|
34
37
|
oj (~> 3.6)
|
35
38
|
ffi (1.10.0)
|
36
39
|
hashdiff (0.3.7)
|
40
|
+
hike (1.2.3)
|
37
41
|
http-cookie (1.0.3)
|
38
42
|
domain_name (~> 0.5)
|
39
43
|
listen (3.1.5)
|
@@ -47,7 +51,16 @@ GEM
|
|
47
51
|
mustermann (1.0.3)
|
48
52
|
necromancer (0.4.0)
|
49
53
|
netrc (0.11.0)
|
50
|
-
oj (3.7.
|
54
|
+
oj (3.7.12)
|
55
|
+
opal (0.11.4)
|
56
|
+
ast (>= 2.3.0)
|
57
|
+
hike (~> 1.2)
|
58
|
+
parser (= 2.3.3.1)
|
59
|
+
sourcemap (~> 0.1.0)
|
60
|
+
opal-jquery (0.4.3)
|
61
|
+
opal (>= 0.10.0, < 0.12.0)
|
62
|
+
parser (2.3.3.1)
|
63
|
+
ast (~> 2.2)
|
51
64
|
pastel (0.7.2)
|
52
65
|
equatable (~> 0.5.0)
|
53
66
|
tty-color (~> 0.4.0)
|
@@ -93,6 +106,7 @@ GEM
|
|
93
106
|
rack-protection (= 2.0.5)
|
94
107
|
sinatra (= 2.0.5)
|
95
108
|
tilt (>= 1.3, < 3)
|
109
|
+
sourcemap (0.1.1)
|
96
110
|
strings (0.1.5)
|
97
111
|
strings-ansi (~> 0.1)
|
98
112
|
unicode-display_width (~> 1.5)
|
data/faastruby.gemspec
CHANGED
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_runtime_dependency 'tmuxinator', '~> 0.15'
|
25
25
|
spec.add_runtime_dependency 'rouge', '~> 3.3'
|
26
26
|
spec.add_runtime_dependency 'listen', '~> 3.1'
|
27
|
+
spec.add_runtime_dependency 'opal', '~> 0.11.4'
|
28
|
+
spec.add_runtime_dependency 'opal-jquery', '~> 0.4.3'
|
27
29
|
|
28
30
|
|
29
31
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
@@ -159,6 +159,16 @@ module FaaStRuby
|
|
159
159
|
## Defaults to 'functions'.
|
160
160
|
# functions_dir: functions
|
161
161
|
|
162
|
+
## Opal support (experimental)
|
163
|
+
## You can use Opal to write Ruby code and have it autocompiled to
|
164
|
+
## Javascript and placed inside the public assets folder.
|
165
|
+
## If 'opal_dir' is set, folders inside 'opal_dir' that contain
|
166
|
+
## a file named 'main.rb' will be compiled using opal
|
167
|
+
# opal_dir: opal
|
168
|
+
## Destination folder for .js files created by Opal.
|
169
|
+
## Defaults to PUBLIC_DIR/assets/javascripts
|
170
|
+
# opal_js_destination: public/assets/javascripts
|
171
|
+
|
162
172
|
## The name of the function that will respond to requests made
|
163
173
|
## to '/'. Defaults to 'root'
|
164
174
|
# root_to: root
|
data/lib/faastruby/local.rb
CHANGED
@@ -71,6 +71,7 @@ module FaaStRuby
|
|
71
71
|
DEFAULT_RUBY_RUNTIME = "ruby:#{CURRENT_MINOR_RUBY}".freeze
|
72
72
|
FUNCTIONS_EVENT_QUEUE = Queue.new
|
73
73
|
PUBLIC_EVENT_QUEUE = Queue.new
|
74
|
+
OPAL_EVENT_QUEUE = Queue.new
|
74
75
|
WORKSPACE_BASE_HOST = ENV['FAASTRUBY_WORKSPACE_BASE_HOST'] || 'faast.cloud'
|
75
76
|
URL_PROTOCOL = ENV['FAASTRUBY_URL_PROTOCOL'] || 'https'
|
76
77
|
puts "Using '#{DEFAULT_RUBY_RUNTIME}' as default Ruby runtime." if RUBY_ENABLED
|
@@ -125,6 +126,18 @@ module FaaStRuby
|
|
125
126
|
YAML.load(File.read(SECRETS_YAML_FILE))['secrets'] || {}
|
126
127
|
end
|
127
128
|
|
129
|
+
def self.opal_enabled?
|
130
|
+
!project_config['opal_dir'].nil?
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.opal_dir
|
134
|
+
"#{SERVER_ROOT}/#{project_config['opal_dir']}"
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.opal_js_destination
|
138
|
+
project_config['opal_js_destination'] || "#{public_dir}/assets/javascripts"
|
139
|
+
end
|
140
|
+
|
128
141
|
def self.start!
|
129
142
|
Listen::Adapter::Linux::DEFAULTS[:events] << :modify
|
130
143
|
debug "self.start!"
|
@@ -135,10 +148,19 @@ module FaaStRuby
|
|
135
148
|
puts "Detecting existing functions."
|
136
149
|
puts "Ruby functions: #{ruby_functions.inspect}"
|
137
150
|
puts "Crystal functions: #{crystal_functions.inspect}"
|
151
|
+
|
138
152
|
listen_on_functions_dir
|
153
|
+
if opal_enabled?
|
154
|
+
puts "Opal Ruby files will be auto-compiled to Javascript and added to '#{opal_js_destination}'."
|
155
|
+
FileUtils.mkdir_p(Local.opal_dir)
|
156
|
+
listen_on_opal_dir
|
157
|
+
end
|
139
158
|
listen_on_public_dir if SYNC_ENABLED
|
159
|
+
|
140
160
|
FunctionProcessor.new(FUNCTIONS_EVENT_QUEUE).start
|
161
|
+
OpalProcessor.new(OPAL_EVENT_QUEUE).start if opal_enabled?
|
141
162
|
StaticFileProcessor.new(PUBLIC_EVENT_QUEUE).start if SYNC_ENABLED
|
163
|
+
|
142
164
|
# initial_compile
|
143
165
|
puts "Listening for changes."
|
144
166
|
puts "faastRuby Local is ready at http://localhost:3000"
|
@@ -148,6 +170,7 @@ module FaaStRuby
|
|
148
170
|
puts "Stopping Watchdog..."
|
149
171
|
Local::Listener.functions_listener.each(&:stop)
|
150
172
|
Local::Listener.public_listener.each(&:stop)
|
173
|
+
Local::Listener.opal_listener.each(&:stop)
|
151
174
|
end
|
152
175
|
|
153
176
|
def self.initial_compile
|
@@ -176,6 +199,14 @@ module FaaStRuby
|
|
176
199
|
Local::Listener.functions_listener << listener
|
177
200
|
end
|
178
201
|
|
202
|
+
def self.listen_on_opal_dir
|
203
|
+
debug "self.listen_on_opal_dir"
|
204
|
+
debug "Listening for changes in '#{opal_dir}'"
|
205
|
+
listener = Listener.new(directory: opal_dir, queue: OPAL_EVENT_QUEUE)
|
206
|
+
listener.start
|
207
|
+
Local::Listener.opal_listener << listener
|
208
|
+
end
|
209
|
+
|
179
210
|
def self.listen_on_public_dir
|
180
211
|
debug "self.listen_on_public_dir"
|
181
212
|
debug "Listening for changes in '#{public_dir}'"
|
@@ -7,6 +7,10 @@ module FaaStRuby
|
|
7
7
|
def self.public_listener
|
8
8
|
@@public_listener ||= []
|
9
9
|
end
|
10
|
+
def self.opal_listener
|
11
|
+
@@opal_listener ||= []
|
12
|
+
end
|
13
|
+
|
10
14
|
include Local::Logger
|
11
15
|
attr_accessor :listener, :directory, :queue
|
12
16
|
def initialize(directory:, queue:)
|
@@ -103,6 +107,10 @@ module FaaStRuby
|
|
103
107
|
filename == 'faastruby.yml'
|
104
108
|
end
|
105
109
|
|
110
|
+
def file_is_opal_main?
|
111
|
+
filename == 'main.rb'
|
112
|
+
end
|
113
|
+
|
106
114
|
# def file_was_just_added?
|
107
115
|
# debug __method__
|
108
116
|
# Time.now.to_i - File.ctime(@full_path).to_i <= 1
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module FaaStRuby
|
2
|
+
module Local
|
3
|
+
class OpalProcessor < Processor
|
4
|
+
|
5
|
+
def added(event)
|
6
|
+
debug "added(#{event.inspect})"
|
7
|
+
# does nothing
|
8
|
+
return true
|
9
|
+
end
|
10
|
+
|
11
|
+
def modified(event)
|
12
|
+
debug "modified(#{event.inspect})"
|
13
|
+
# This should trigger
|
14
|
+
# - compile to JS
|
15
|
+
compile(event)
|
16
|
+
end
|
17
|
+
|
18
|
+
def removed(event)
|
19
|
+
debug "removed(#{event.inspect})"
|
20
|
+
# This should trigger
|
21
|
+
# - Remove from workspace
|
22
|
+
if event.file_is_opal_main?
|
23
|
+
remove_from_public(event)
|
24
|
+
else
|
25
|
+
compile(event)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def remove_from_public(event)
|
30
|
+
delete_path = event.relative_path_dirname.sub(/^#{Local.opal_dir}\//, "#{Local.public_dir}/")
|
31
|
+
# return false unless delete_path.match(/^#{Local.public_dir}\//)
|
32
|
+
return false if delete_path.nil? || delete_path.match(/^\s*$/)
|
33
|
+
puts "Deleting: #{Local.opal_js_destination}/#{delete_path}"
|
34
|
+
FileUtils.rm_rf("#{Local.opal_js_destination}/#{delete_path}")
|
35
|
+
dir = "#{Local.opal_js_destination}/#{delete_path}"
|
36
|
+
delete_recursive_folder(dir)
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete_recursive_folder(entry)
|
40
|
+
dirname = File.dirname(entry)
|
41
|
+
return if dirname == Local.opal_js_destination
|
42
|
+
glob = Dir.glob("#{dirname}/*")
|
43
|
+
return if glob.any?
|
44
|
+
puts "Deleting: #{dirname}"
|
45
|
+
FileUtils.rmdir(dirname)
|
46
|
+
delete_recursive_folder(dirname)
|
47
|
+
end
|
48
|
+
|
49
|
+
def compile(event)
|
50
|
+
debug "compile"
|
51
|
+
js_path = event.relative_path_dirname.sub(/^#{Local.opal_dir}\//, "")
|
52
|
+
FileUtils.mkdir_p("#{Local.opal_js_destination}/#{js_path}")
|
53
|
+
compile_cmd = [
|
54
|
+
"opal",
|
55
|
+
"-I",
|
56
|
+
"#{event.dirname}",
|
57
|
+
"--gem",
|
58
|
+
'jquery',
|
59
|
+
"--gem",
|
60
|
+
'opal-jquery',
|
61
|
+
"--compile",
|
62
|
+
"#{event.dirname}/main.rb",
|
63
|
+
">",
|
64
|
+
"#{Local.opal_js_destination}/#{js_path}/main.js"
|
65
|
+
]
|
66
|
+
# run it:
|
67
|
+
run(event.dirname, 'compile') {`#{compile_cmd.join(' ')}`; puts "Done"}
|
68
|
+
puts "Running: #{compile_cmd.join(' ')}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def first_parent_of(entry, event_type)
|
72
|
+
debug "first_parent_of(#{entry.inspect})"
|
73
|
+
absolute_folder = get_parent_folder_for(entry)
|
74
|
+
if event_type == :removed
|
75
|
+
name = absolute_folder.dup
|
76
|
+
name.slice!("#{Local.opal_dir}/")
|
77
|
+
end
|
78
|
+
absolute_folder
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_parent_folder_for(entry)
|
82
|
+
return File.dirname(entry) if File.basename(entry) == 'main.rb'
|
83
|
+
debug "get_parent_folder_for(#{entry.inspect})"
|
84
|
+
dirname = File.dirname(entry)
|
85
|
+
raise MissingConfigurationFileError.new("ERROR: Could not determine the parent. Make sure your opal folders a main file 'main.rb'.") if dirname == SERVER_ROOT
|
86
|
+
return dirname if File.file?("#{dirname}/main.rb")
|
87
|
+
get_parent_folder_for(dirname)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/faastruby/server.rb
CHANGED
@@ -55,6 +55,7 @@ module FaaStRuby
|
|
55
55
|
require 'faastruby/server/event_channel'
|
56
56
|
require 'faastruby/server/subscriber'
|
57
57
|
# require 'faastruby/server/event_hub'
|
58
|
+
require 'faastruby/server/template'
|
58
59
|
require 'faastruby/server/runner_methods'
|
59
60
|
require 'faastruby/server/function_object'
|
60
61
|
require 'faastruby/server/runner'
|
@@ -73,6 +73,14 @@ module FaaStRuby
|
|
73
73
|
response = function_object.handler(event, *args) || function_object.render_nothing
|
74
74
|
response = FaaStRuby::Response.invalid_response unless response.is_a?(FaaStRuby::Response)
|
75
75
|
rescue Exception => e
|
76
|
+
if e.class == SyntaxError
|
77
|
+
line, *m = e.message.split(' ')
|
78
|
+
line_no = line.split(':')[1]
|
79
|
+
real_no = line_no.to_i - 13
|
80
|
+
STDOUT.puts "handler.rb:#{real_no}: #{m.join(' ')}"
|
81
|
+
else
|
82
|
+
STDOUT.puts e.full_message
|
83
|
+
end
|
76
84
|
error = Oj.dump({
|
77
85
|
'error' => e.message,
|
78
86
|
'location' => e.backtrace&.first
|
@@ -88,6 +88,10 @@ module FaaStRuby
|
|
88
88
|
respond_with(nil, status: status, headers: headers, binary: false)
|
89
89
|
end
|
90
90
|
|
91
|
+
def render_template(template_path, status: 200, headers: {}, variables: {})
|
92
|
+
render html: FaaStRuby::Template.new(variables: variables).render(template_path), status: status, headers: headers
|
93
|
+
end
|
94
|
+
|
91
95
|
def redirect_to(function: nil, url: nil, status: 303)
|
92
96
|
headers = {"Location" => function || url}
|
93
97
|
respond_with(nil, status: status, headers: headers, binary: false)
|
data/lib/faastruby/version.rb
CHANGED
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.
|
4
|
+
version: 0.5.24
|
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-04-
|
11
|
+
date: 2019-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -192,6 +192,34 @@ dependencies:
|
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '3.1'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: opal
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 0.11.4
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 0.11.4
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: opal-jquery
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 0.4.3
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 0.4.3
|
195
223
|
- !ruby/object:Gem::Dependency
|
196
224
|
name: bundler
|
197
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -257,6 +285,7 @@ extensions: []
|
|
257
285
|
extra_rdoc_files: []
|
258
286
|
files:
|
259
287
|
- ".gitignore"
|
288
|
+
- ".gitlab-ci.yml"
|
260
289
|
- ".rspec"
|
261
290
|
- ".travis.yml"
|
262
291
|
- CHANGELOG.md
|
@@ -319,6 +348,7 @@ files:
|
|
319
348
|
- lib/faastruby/local/monkey_patch.rb
|
320
349
|
- lib/faastruby/local/processors.rb
|
321
350
|
- lib/faastruby/local/processors/function.rb
|
351
|
+
- lib/faastruby/local/processors/opal.rb
|
322
352
|
- lib/faastruby/local/processors/processor.rb
|
323
353
|
- lib/faastruby/local/processors/static_file.rb
|
324
354
|
- lib/faastruby/local/static_files.rb
|
@@ -341,6 +371,7 @@ files:
|
|
341
371
|
- lib/faastruby/server/runner.rb
|
342
372
|
- lib/faastruby/server/runner_methods.rb
|
343
373
|
- lib/faastruby/server/subscriber.rb
|
374
|
+
- lib/faastruby/server/template.rb
|
344
375
|
- lib/faastruby/spec_helper.rb
|
345
376
|
- lib/faastruby/supported_runtimes.rb
|
346
377
|
- lib/faastruby/user.rb
|