jets 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/CHANGELOG.md +3 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/README.md +10 -11
- data/README/testing.md +8 -1
- data/lib/jets/cfn/upload.rb +2 -2
- data/lib/jets/commands/base.rb +1 -0
- data/lib/jets/lambda/dsl.rb +69 -9
- data/lib/jets/lambda/functions.rb +12 -0
- data/lib/jets/lambda/task.rb +15 -4
- data/lib/jets/poly_fun.rb +15 -1
- data/lib/jets/route.rb +1 -1
- data/lib/jets/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0f899e409f74150cb787d1e943bc952061eac3750eff304d6e7d657fb982b77
|
4
|
+
data.tar.gz: 182a1f82f57e0f4a7afd89924f6a90b60dcc1be053b4c0e3ca1cb645030c54d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1f6ad92079f026224861aeda73d5552834119dc59504c00ef1fbba5480c817305e3e517372eedf48684d6145fad2ed8bda610dc3223798eb4aa2c65f3a10b23
|
7
|
+
data.tar.gz: 31f71bf99f2499d3ba8ac00e298abba20a09b9235f8cfd20f400ae005204e07e24271a925be6abc2e728a6e0162f5ea44cbaee1248e11dd2089b397ef82661e8
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,9 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [1.0.6]
|
7
|
+
- method fixes: account for inheritance and private keyword #57
|
8
|
+
|
6
9
|
## [1.0.5]
|
7
10
|
- change config.lambdagems to config.gems
|
8
11
|
- friendly info message when yarn is not installed
|
data/Gemfile
CHANGED
@@ -7,7 +7,7 @@ gemspec
|
|
7
7
|
# TODO: Only require webpacker in Gemfile of project if possible.
|
8
8
|
# Need both because of jets/application.rb and jets/webpacker/middleware_setup.rb
|
9
9
|
group :development, :test do
|
10
|
-
gem "
|
10
|
+
gem "mysql2", "~> 0.5.2"
|
11
11
|
gem "webpacker", git: "https://github.com/tongueroo/webpacker.git", branch: "jets"
|
12
12
|
gem "rspec_junit_formatter"
|
13
13
|
end
|
data/Gemfile.lock
CHANGED
@@ -11,7 +11,7 @@ GIT
|
|
11
11
|
PATH
|
12
12
|
remote: .
|
13
13
|
specs:
|
14
|
-
jets (1.0.
|
14
|
+
jets (1.0.6)
|
15
15
|
actionpack (>= 5.2.1)
|
16
16
|
actionview (>= 5.2.1)
|
17
17
|
activerecord (>= 5.2.1)
|
@@ -118,9 +118,9 @@ GEM
|
|
118
118
|
mimemagic (0.3.2)
|
119
119
|
mini_portile2 (2.3.0)
|
120
120
|
minitest (5.11.3)
|
121
|
+
mysql2 (0.5.2)
|
121
122
|
nokogiri (1.8.5)
|
122
123
|
mini_portile2 (~> 2.3.0)
|
123
|
-
pg (0.21.0)
|
124
124
|
rack (2.0.5)
|
125
125
|
rack-proxy (0.6.5)
|
126
126
|
rack
|
@@ -167,7 +167,7 @@ DEPENDENCIES
|
|
167
167
|
bundler
|
168
168
|
byebug
|
169
169
|
jets!
|
170
|
-
|
170
|
+
mysql2 (~> 0.5.2)
|
171
171
|
rake
|
172
172
|
rspec
|
173
173
|
rspec_junit_formatter
|
data/README.md
CHANGED
@@ -19,7 +19,7 @@ It is key to understand AWS Lambda and API Gateway to understand Jets conceptual
|
|
19
19
|
* **AWS Lambda** is Functions as a Service. It allows you to upload and run functions without worrying about the underlying infrastructure.
|
20
20
|
* **API Gateway** is the routing layer for Lambda. It is used to route REST URL endpoints to Lambda functions.
|
21
21
|
|
22
|
-
The official documentation is at
|
22
|
+
The official documentation is at [Ruby on Jets](http://rubyonjets.com).
|
23
23
|
|
24
24
|
Refer to the official docs for more info, but here's a quick intro.
|
25
25
|
|
@@ -60,7 +60,7 @@ class PostsController < ApplicationController
|
|
60
60
|
end
|
61
61
|
```
|
62
62
|
|
63
|
-
Jets creates Lambda functions each
|
63
|
+
Jets creates Lambda functions for each public method in your controller.
|
64
64
|
|
65
65
|
### Jets Routing
|
66
66
|
|
@@ -86,15 +86,15 @@ end
|
|
86
86
|
|
87
87
|
Test your API Gateway endpoints with curl or postman. Note, replace the URL endpoint with the one that is created:
|
88
88
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
89
|
+
$ curl -s "https://quabepiu80.execute-api.us-east-1.amazonaws.com/dev/posts" | jq .
|
90
|
+
{
|
91
|
+
"hello": "world",
|
92
|
+
"action": "index"
|
93
|
+
}
|
94
94
|
|
95
95
|
### Jets Jobs
|
96
96
|
|
97
|
-
A Jets job handles
|
97
|
+
A Jets job handles asynchronous background jobs performed outside of the web request/response cycle. Here's an example:
|
98
98
|
|
99
99
|
app/jobs/hard_job.rb:
|
100
100
|
|
@@ -118,7 +118,7 @@ end
|
|
118
118
|
|
119
119
|
You can test your application with a local server that mimics API Gateway: [Jets Local Server](http://rubyonjets.com/docs/local-server/). Once ready, deploying to AWS Lambda is a single command.
|
120
120
|
|
121
|
-
|
121
|
+
jets deploy
|
122
122
|
|
123
123
|
After deployment, you can test the Lambda functions with the AWS Lambda console or the CLI.
|
124
124
|
|
@@ -132,7 +132,7 @@ Here's a [Live Demo](https://demo.rubyonjets.com/posts) of the quintessential CR
|
|
132
132
|
|
133
133
|
### Rails Support
|
134
134
|
|
135
|
-
Jets [Mega Mode](http://rubyonjets.com/docs/megamode/) provides Rails support with little effort. This allows you run a Rails application on AWS Lambda. Refer to the [Rails Support](http://rubyonjets.com/docs/rails-support/) docs for more info.
|
135
|
+
Jets [Mega Mode](http://rubyonjets.com/docs/megamode/) provides Rails support with little effort. This allows you to run a Rails application on AWS Lambda. Refer to the [Rails Support](http://rubyonjets.com/docs/rails-support/) docs for more info.
|
136
136
|
|
137
137
|
### More Info
|
138
138
|
|
@@ -141,7 +141,6 @@ For more documentation, check out the official docs: [Ruby on Jets](http://rubyo
|
|
141
141
|
* [Quick Start](http://rubyonjets.com/quick-start/)
|
142
142
|
* [Local Jets Server](http://rubyonjets.com/docs/local-server/)
|
143
143
|
* [REPL Console](http://rubyonjets.com/docs/repl-console/)
|
144
|
-
* [Jets Call](http://rubyonjets.com/docs/jets-call/)
|
145
144
|
* [Project Structure](http://rubyonjets.com/project-structure/)
|
146
145
|
* [App Configuration](http://rubyonjets.com/app-config/)
|
147
146
|
* [Database Support](http://rubyonjets.com/docs/database-support/)
|
data/README/testing.md
CHANGED
@@ -8,6 +8,8 @@ To run unit tests:
|
|
8
8
|
|
9
9
|
## Integration
|
10
10
|
|
11
|
+
These commands run all from the jets repo itself. The demo folder has been added to the `.gitignore`.
|
12
|
+
|
11
13
|
### Locally
|
12
14
|
|
13
15
|
To run the integration tests locally, you need to create a new Jets CRUD project and start the server:
|
@@ -38,4 +40,9 @@ Then you can deploy the jets app and test it on real AWS Lambda.
|
|
38
40
|
|
39
41
|
Run the remote integration script:
|
40
42
|
|
41
|
-
spec/integration/remote.sh
|
43
|
+
BASE_URL=xxx spec/integration/remote.sh
|
44
|
+
|
45
|
+
Example:
|
46
|
+
|
47
|
+
BASE_URL=https://wb5dcjc09a.execute-api.us-west-2.amazonaws.com/dev spec/integration/remote.sh
|
48
|
+
|
data/lib/jets/cfn/upload.rb
CHANGED
@@ -50,10 +50,10 @@ class Jets::Cfn
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def upload_assets
|
53
|
-
puts "
|
53
|
+
puts "Checking for modified public assets and uploading to S3."
|
54
54
|
start_time = Time.now
|
55
55
|
upload_public_assets
|
56
|
-
puts "Time
|
56
|
+
puts "Time for public assets to s3: #{pretty_time(Time.now-start_time).colorize(:green)}"
|
57
57
|
end
|
58
58
|
|
59
59
|
def upload_public_assets
|
data/lib/jets/commands/base.rb
CHANGED
@@ -79,6 +79,7 @@ class Jets::Commands::Base < Thor
|
|
79
79
|
def namespaced_commands
|
80
80
|
eager_load!
|
81
81
|
subclasses.map do |klass|
|
82
|
+
# This all_tasks is part of Thor not the lambda/dsl.rb
|
82
83
|
klass.all_tasks.keys.map do |task_name|
|
83
84
|
klass = klass.to_s.sub('Jets::Commands::','')
|
84
85
|
namespace = klass =~ /^Main/ ? nil : klass.underscore.gsub('/',':')
|
data/lib/jets/lambda/dsl.rb
CHANGED
@@ -13,6 +13,8 @@ module Jets::Lambda::Dsl
|
|
13
13
|
|
14
14
|
included do
|
15
15
|
class << self
|
16
|
+
extend Memoist
|
17
|
+
|
16
18
|
def class_properties(options=nil)
|
17
19
|
if options
|
18
20
|
@class_properties ||= {}
|
@@ -259,12 +261,70 @@ module Jets::Lambda::Dsl
|
|
259
261
|
# Returns the all tasks for this class with their method names as keys.
|
260
262
|
#
|
261
263
|
# ==== Returns
|
262
|
-
# OrderedHash:: An ordered hash with tasks names as keys and
|
264
|
+
# OrderedHash:: An ordered hash with tasks names as keys and Task
|
263
265
|
# objects as values.
|
264
266
|
#
|
265
267
|
def all_tasks
|
266
268
|
@all_tasks ||= ActiveSupport::OrderedHash.new
|
267
269
|
end
|
270
|
+
# Do not call all tasks outside this class, instead use: tasks or lambda functions
|
271
|
+
private :all_tasks
|
272
|
+
|
273
|
+
# Goes up the class inheritance chain to build the tasks.
|
274
|
+
#
|
275
|
+
# Example heirarchy:
|
276
|
+
#
|
277
|
+
# Jets::Lambda::Functions > Jets::Controller::Base > ApplicationController ...
|
278
|
+
# > PostsController > ChildPostsController
|
279
|
+
#
|
280
|
+
# Do not include tasks from the direct subclasses of Jets::Lambda::Functions
|
281
|
+
# because those classes are abstract. Dont want those methods to be included.
|
282
|
+
def find_all_tasks(public: true)
|
283
|
+
klass = self
|
284
|
+
direct_subclasses = Jets::Lambda::Functions.subclasses
|
285
|
+
lookup = []
|
286
|
+
|
287
|
+
# Go up class inheritance and builds lookup structure in memory
|
288
|
+
until direct_subclasses.include?(klass)
|
289
|
+
lookup << klass.send(:all_tasks) # one place we want to call private all_tasks method
|
290
|
+
klass = klass.superclass
|
291
|
+
end
|
292
|
+
merged_tasks = ActiveSupport::OrderedHash.new
|
293
|
+
# Go back down the class inheritance chain in reverse order and merge the tasks
|
294
|
+
lookup.reverse.each do |tasks_hash|
|
295
|
+
# tasks_hash is a result of all_tasks. Example: PostsController.all_tasks
|
296
|
+
merged_tasks.merge!(tasks_hash)
|
297
|
+
end
|
298
|
+
|
299
|
+
# The cfn builders required the right final child class to build the lambda functions correctly.
|
300
|
+
merged_tasks.each do |meth, task|
|
301
|
+
# Override the class name for the cfn builders
|
302
|
+
task = task.clone # do not stomp over current tasks since things are usually looked by reference
|
303
|
+
task.instance_variable_set(:@class_name, self.name)
|
304
|
+
merged_tasks[meth] = task
|
305
|
+
end
|
306
|
+
|
307
|
+
# Methods can be made private with the :private keyword after the method has been defined.
|
308
|
+
# To account for this, loop back thorugh all the methods and check if the method is indeed public.
|
309
|
+
tasks = ActiveSupport::OrderedHash.new
|
310
|
+
merged_tasks.each do |meth, task|
|
311
|
+
if public
|
312
|
+
tasks[meth] = task if task.public_meth?
|
313
|
+
else
|
314
|
+
tasks[meth] = task unless task.public_meth?
|
315
|
+
end
|
316
|
+
end
|
317
|
+
tasks
|
318
|
+
end
|
319
|
+
memoize :find_all_tasks
|
320
|
+
|
321
|
+
def all_public_tasks
|
322
|
+
find_all_tasks(public: true)
|
323
|
+
end
|
324
|
+
|
325
|
+
def all_private_tasks
|
326
|
+
find_all_tasks(public: false)
|
327
|
+
end
|
268
328
|
|
269
329
|
# Returns the tasks for this class in Array form.
|
270
330
|
#
|
@@ -272,13 +332,7 @@ module Jets::Lambda::Dsl
|
|
272
332
|
# Array of task objects
|
273
333
|
#
|
274
334
|
def tasks
|
275
|
-
|
276
|
-
end
|
277
|
-
|
278
|
-
# Used in Jets::Cfn::Builders::Interface#build
|
279
|
-
# Overridden in rule/dsl.rb
|
280
|
-
def build?
|
281
|
-
!tasks.empty?
|
335
|
+
all_public_tasks.values
|
282
336
|
end
|
283
337
|
|
284
338
|
# The public methods defined in the project app class ulimately become
|
@@ -287,7 +341,13 @@ module Jets::Lambda::Dsl
|
|
287
341
|
# Example return value:
|
288
342
|
# [:index, :new, :create, :show]
|
289
343
|
def lambda_functions
|
290
|
-
|
344
|
+
all_public_tasks.keys
|
345
|
+
end
|
346
|
+
|
347
|
+
# Used in Jets::Cfn::Builders::Interface#build
|
348
|
+
# Overridden in rule/dsl.rb
|
349
|
+
def build?
|
350
|
+
!tasks.empty?
|
291
351
|
end
|
292
352
|
|
293
353
|
# Polymorphic support
|
@@ -18,5 +18,17 @@ module Jets::Lambda
|
|
18
18
|
|
19
19
|
include Dsl # At the end so methods like event, context and method
|
20
20
|
# do not trigger method_added
|
21
|
+
|
22
|
+
class << self
|
23
|
+
# Tracking subclasses because it helps with Lambda::Dsl#find_all_tasks
|
24
|
+
def subclasses
|
25
|
+
@subclasses ||= []
|
26
|
+
end
|
27
|
+
|
28
|
+
def inherited(base)
|
29
|
+
super
|
30
|
+
self.subclasses << base if base.name
|
31
|
+
end
|
32
|
+
end
|
21
33
|
end
|
22
34
|
end
|
data/lib/jets/lambda/task.rb
CHANGED
@@ -14,14 +14,25 @@ class Jets::Lambda::Task
|
|
14
14
|
@replacements = options[:replacements] || {} # added to baseline replacements
|
15
15
|
end
|
16
16
|
|
17
|
-
def build_function_iam?
|
18
|
-
!!(@iam_policy || @managed_iam_policy)
|
19
|
-
end
|
20
|
-
|
21
17
|
def name
|
22
18
|
@meth
|
23
19
|
end
|
24
20
|
|
21
|
+
def public_meth?
|
22
|
+
# For anonymous classes (app/functions/hello.rb) the class name will be blank.
|
23
|
+
# These types of classes are treated specially and has only one handler method
|
24
|
+
# that is registered. So we know it is public.
|
25
|
+
return true if @class_name.nil? || @class_name == ''
|
26
|
+
|
27
|
+
klass = @class_name.constantize
|
28
|
+
public_methods = klass.public_instance_methods
|
29
|
+
public_methods.include?(meth.to_sym)
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_function_iam?
|
33
|
+
!!(@iam_policy || @managed_iam_policy)
|
34
|
+
end
|
35
|
+
|
25
36
|
@@lang_exts = {
|
26
37
|
ruby: '.rb',
|
27
38
|
python: '.py',
|
data/lib/jets/poly_fun.rb
CHANGED
@@ -17,6 +17,8 @@ module Jets
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def run(event, context={})
|
20
|
+
check_private_method!
|
21
|
+
|
20
22
|
if task.lang == :ruby
|
21
23
|
# controller = PostsController.new(event, content)
|
22
24
|
# resp = controller.edit
|
@@ -54,8 +56,20 @@ module Jets
|
|
54
56
|
end
|
55
57
|
|
56
58
|
def task
|
57
|
-
@app_class.
|
59
|
+
task = @app_class.all_public_tasks[@app_meth]
|
60
|
+
# Provider user a better error message to user than a nil failure.
|
61
|
+
unless task
|
62
|
+
raise "Unable to find #{@app_class}##{@app_meth}"
|
63
|
+
end
|
64
|
+
task
|
58
65
|
end
|
59
66
|
memoize :task
|
67
|
+
|
68
|
+
def check_private_method!
|
69
|
+
private_detected = @app_class.all_private_tasks.keys.include?(@app_meth)
|
70
|
+
return unless private_detected # Ok to continue
|
71
|
+
|
72
|
+
raise "The #{@app_class}##{@app_meth} is a private method. Unable to call it unless it is public"
|
73
|
+
end
|
60
74
|
end
|
61
75
|
end
|
data/lib/jets/route.rb
CHANGED
data/lib/jets/version.rb
CHANGED