jets 0.6.2 → 0.6.3

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: c5e19887ba1605e079b1c49a85a4f37088f3c5fc79a6b0863b979d2c3916c7ab
4
- data.tar.gz: 470eac8944fd085fe23a8eb79ba26ebdb5704dbee844688df9a4bcad4862d6df
3
+ metadata.gz: 99d211e564c05c5406aa02c2524c6c3c31b31ebc8b5887453c6241428318a1cf
4
+ data.tar.gz: 68fec88d0f05af3763a9fa03be35c2dee56b5d5957195dcc4ff85cd4b092ef50
5
5
  SHA512:
6
- metadata.gz: 6f7e9cc5798a1bafd67c32d5ae7b1c85b00ee354a0f1ecd93f9c02e595a75afee7216ffaf5f8764e74e8ace43b831353cc4813f439bca319eabf5628a861d19c
7
- data.tar.gz: 8f21f6e699661a2734f9632d51e3aa20404979c57d5ec6bc52f7c4f498f32efcc2160840c03af8c414083eb53124fdec300501352af231b2bfc17c7e4d4d8f7a
6
+ metadata.gz: dad39bb8411c0692e262de6178d41cdacd6293c7dc95672ea7581500801c9bfc500a1394d3325701dc049743e769f4701210df5f5f46b3ff2791eda11fcabb60
7
+ data.tar.gz: 35a72039c9f9afc6500a5d8317d67d42132b72712f9f12ecf5f30663eace1222ec58f6d36251ec441de675db366e2eca2122340cf9dcab54c8323ea888da7564
@@ -3,6 +3,9 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [0.6.3]
7
+ - fix app logging: pull request #14
8
+
6
9
  ## [0.6.2]
7
10
  - add versions to gemspec dependencies
8
11
 
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (0.6.2)
14
+ jets (0.6.3)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -72,7 +72,7 @@ GEM
72
72
  aws-partitions (~> 1.0)
73
73
  aws-sigv4 (~> 1.0)
74
74
  jmespath (~> 1.0)
75
- aws-sdk-dynamodb (1.10.0)
75
+ aws-sdk-dynamodb (1.11.0)
76
76
  aws-sdk-core (~> 3)
77
77
  aws-sigv4 (~> 1.0)
78
78
  aws-sdk-kms (1.7.0)
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  <div align="center">
2
- <link href="http://rubyonjets.com"><img src="http://rubyonjets.com/img/logos/jets-logo.png" /></img>
2
+ <a href="http://rubyonjets.com"><img src="http://rubyonjets.com/img/logos/jets-logo.png" /></a>
3
3
  </div>
4
4
 
5
+ Ruby and Lambda splat out a baby and that child's name is [Jets](http://rubyonjets.com/).
6
+
5
7
  ![Build Status](https://codebuild.us-west-2.amazonaws.com/badges?uuid=eyJlbmNyeXB0ZWREYXRhIjoiUE12K3ljQTFQUjVpRW0reGhGVHVQdkplTHlOdUtENnBya2JhVWVXaFIvTU92MlBtV3hIUE9pb25jWGw0MS9jN2RXMERKRHh5Nzhvd01Za0NyeUs5SCtzPSIsIml2UGFyYW1ldGVyU3BlYyI6IkMybEJFaXdzejJEaHNWVmEiLCJtYXRlcmlhbFNldFNlcmlhbCI6MX0%3D&branch=master)
6
8
  [![CircleCI](https://circleci.com/gh/tongueroo/jets.svg?style=svg)](https://circleci.com/gh/tongueroo/jets)
7
9
 
8
- Ruby and Lambda splat out a baby and that child's name is Jets.
9
-
10
10
  ## What is Jets?
11
11
 
12
12
  Jets is a Ruby Serverless Framework. Jets allows you to create serverless applications with a beautiful language: Ruby. It includes everything required to build an application and deploy it to AWS Lambda.
@@ -24,7 +24,7 @@ Refer to the official docs for more info, but here's a quick intro.
24
24
 
25
25
  A Jets controller handles a web request and renders a response. Here's an example:
26
26
 
27
- `app/controllers/posts_controller.rb`:
27
+ app/controllers/posts_controller.rb:
28
28
 
29
29
  ```ruby
30
30
  class PostsController < ApplicationController
@@ -48,7 +48,7 @@ Jets creates Lambda functions each the public method in your controller.
48
48
 
49
49
  You connect Lambda functions to API Gateway URL endpoints with a routes file:
50
50
 
51
- `config/routes.rb`:
51
+ config/routes.rb:
52
52
 
53
53
  ```ruby
54
54
  Jets.application.routes.draw do
@@ -74,9 +74,11 @@ Test your API Gateway endpoints with curl or postman. Note, replace the URL endp
74
74
  "action": "index"
75
75
  }
76
76
 
77
- ### Jets Workers
77
+ ### Jets Jobs
78
+
79
+ A Jets job handles asynchrous background jobs performed outside of the web request/response cycle. Here's an example:
78
80
 
79
- A Jets worker handles background jobs. It is performed outside of the web request/response cycle. Here's an example:
81
+ app/jobs/hard_job.rb:
80
82
 
81
83
  ```ruby
82
84
  class HardJob < ApplicationJob
@@ -92,7 +94,7 @@ class HardJob < ApplicationJob
92
94
  end
93
95
  ```
94
96
 
95
- `HardJob#dig` will be ran every 10 hours and `HardJob#lift` will be ran every 12 hours.
97
+ `HardJob#dig` runs every 10 hours and `HardJob#lift` runs every 12 hours.
96
98
 
97
99
  ### Jets Deployment
98
100
 
@@ -5,7 +5,7 @@ module Jets
5
5
  include AwsServices
6
6
 
7
7
  def region
8
- return 'us-east-1' if ENV['TEST']
8
+ return 'us-east-1' if test?
9
9
 
10
10
  region = nil
11
11
 
@@ -28,9 +28,13 @@ module Jets
28
28
 
29
29
  # aws sts get-caller-identity
30
30
  def account
31
- return '123456789' if ENV['TEST']
31
+ return '123456789' if test?
32
32
  sts.get_caller_identity.account
33
33
  end
34
34
  memoize :account
35
+
36
+ def test?
37
+ ENV['TEST'] || ENV['CIRCLECI']
38
+ end
35
39
  end
36
40
  end
@@ -1,10 +1,10 @@
1
1
  class Jets::Booter
2
2
  class << self
3
3
  @booted = false
4
- def boot!
4
+ def boot!(options={})
5
5
  return if @booted
6
6
 
7
- stdout_to_stderr
7
+ redirect_output(options)
8
8
  confirm_jets_project!
9
9
  require_bundle_gems
10
10
  Jets::Dotenv.load!
@@ -14,16 +14,37 @@ class Jets::Booter
14
14
  @booted = true
15
15
  end
16
16
 
17
- # Override for Lambda processing.
18
- # $stdout = $stderr might seem weird but we want puts to write to stderr which
19
- # is set in the node shim to write to stderr. This directs the output to
20
- # Lambda logs.
21
- # Printing to stdout managles up the payload returned from Lambda function.
22
- # This is not desired when returning payload to API Gateway eventually.
23
- def stdout_to_stderr
17
+ # TODO: Reconsider if we should redirect stdout to stderr globally for local request.
18
+ # Dont think we need to anymore now that we're not using the old shim.
19
+ #
20
+ # So for `{stringio: false}` and `jets call --local`, redirecting helps
21
+ # but we can also just go fix that jets call method. Though there might be a lot
22
+ # of other places where we might have to fix puts calls.
23
+ def redirect_output(options={})
24
24
  $stdout.sync = true
25
25
  $stderr.sync = true
26
- $stdout = $stderr
26
+ if options[:stringio]
27
+ # Set both $stdout and $stdout to a StringIO object as a buffer.
28
+ # At the end of the request, write this buffer to the filesystem.
29
+ # In the node shim, read it back and write it to AWS Lambda logs.
30
+ #
31
+ # This allows using `puts` to write to CloudWatch.
32
+ $stdout = $stderr = StringIO.new # for ruby_server and AWS Lambda to capture log
33
+ else
34
+ # Printing to stdout can mangle up the response if we're piping the value to
35
+ # jq. For exampe, `jets call --local .. | jq`
36
+ # By redirecting stderr we can use jq.
37
+ #
38
+ $stdout = $stderr # jets call and local jets operation
39
+ end
40
+ end
41
+
42
+ # Used in ruby_server.rb
43
+ def flush_output
44
+ IO.write("/tmp/jets-output.log", $stdout.string)
45
+ # Thanks: https://stackoverflow.com/questions/28445000/how-can-i-clear-a-stringio-instance
46
+ $stdout.truncate(0)
47
+ $stdout.rewind
27
48
  end
28
49
 
29
50
  # require_bundle_gems called when environment boots up via Jets.boot. It
@@ -342,9 +342,11 @@ EOL
342
342
  # When using submodules, bundler leaves old submodules behind. Over time this inflates
343
343
  # the size of the the bundled gems. So we'll clean it up.
344
344
  def clean_old_submodules
345
- lockfile = "#{cache_area}/Gemfile.lock"
346
345
  # https://stackoverflow.com/questions/38800129/parsing-a-gemfile-lock-with-bundler
347
- parser = Bundler::LockfileParser.new(Bundler.read_file(Bundler.default_lockfile))
346
+ lockfile = "#{cache_area}/Gemfile.lock"
347
+ return unless File.exist?(lockfile)
348
+
349
+ parser = Bundler::LockfileParser.new(Bundler.read_file(lockfile))
348
350
  specs = parser.specs
349
351
 
350
352
  # specs = Bundler.load.specs
@@ -2,10 +2,12 @@
2
2
 
3
3
  const spawn = require('child_process').spawn;
4
4
  const fs = require('fs');
5
+ const readline = require('readline');
5
6
  const TMP_LOG_PATH = '/tmp/shim-subprocess.log';
6
7
  const subprocess_out = fs.openSync(TMP_LOG_PATH, 'a');
7
8
  const subprocess_err = fs.openSync(TMP_LOG_PATH, 'a');
8
9
  const JETS_DEBUG = process.env.JETS_DEBUG // set JETS_DEBUG=1 to see more debugging info
10
+ const JETS_OUTPUT = '/tmp/jets-output.log';
9
11
 
10
12
  function once() {
11
13
  // Uncomment fake run once locally. No need to do this on real lambda environment.
@@ -112,6 +114,22 @@ function request(event, handler, callback) {
112
114
  return;
113
115
  }
114
116
 
117
+ if (fs.existsSync(JETS_OUTPUT)) {
118
+ // Thanks: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
119
+ var rd = readline.createInterface({
120
+ input: fs.createReadStream(JETS_OUTPUT),
121
+ // output: process.stdout,
122
+ console: false
123
+ });
124
+
125
+ rd.on('line', function(line) {
126
+ // Important to use console.error in case locally testing shim or we see
127
+ // stdout "twice", once from here and once from ruby-land and it's confusing.
128
+ // AWS lambda will write console.error and console.log to CloudWatch.
129
+ console.error(line); // output to AWS Lambda Logs
130
+ });
131
+ }
132
+
115
133
  var resp = JSON.parse(stdout_buffer);
116
134
  if (resp["errorMessage"]) {
117
135
  // Customize error object for lambda format
@@ -113,6 +113,7 @@ module Jets::Commands
113
113
  expression = "#{Jets.root}app/**/**/*.rb"
114
114
  Dir.glob(expression).each do |path|
115
115
  return false unless File.file?(path)
116
+ next if path.include?("app/functions") # cannot lazy load these because they are anonymous classes
116
117
  next unless app_file?(path)
117
118
 
118
119
  relative_path = path.sub(Jets.root.to_s, '')
@@ -28,8 +28,8 @@ module Jets::Core
28
28
  end
29
29
 
30
30
  # Load all application base classes and project classes
31
- def boot
32
- Jets::Booter.boot!
31
+ def boot(options={})
32
+ Jets::Booter.boot!(options)
33
33
  end
34
34
 
35
35
  # Ensures trailing slash
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'stringio'
2
3
 
3
4
  # Node shim calls this class to process both controllers and jobs
4
5
  class Jets::Processors::MainProcessor
@@ -59,5 +60,4 @@ class Jets::Processors::MainProcessor
59
60
  # $stderr.puts("END OF RUBY OUTPUT") # uncomment for debugging
60
61
  end
61
62
  end
62
-
63
63
  end
@@ -1,5 +1,11 @@
1
1
  require 'socket'
2
2
  require 'json'
3
+ require 'stringio'
4
+
5
+ # Save copy of old stdout, since Jets.boot messes with it.
6
+ # So we can use $normal_stdout.puts for debugging.
7
+ $normal_stdout ||= $stdout
8
+ $normal_stderr ||= $stderr
3
9
 
4
10
  # https://ruby-doc.org/stdlib-2.3.0/libdoc/socket/rdoc/TCPServer.html
5
11
  # https://stackoverflow.com/questions/806267/how-to-fire-and-forget-a-subprocess
@@ -15,8 +21,7 @@ module Jets
15
21
  PORT = 8080
16
22
 
17
23
  def run
18
- $stdout.sync = true
19
- Jets.boot # outside of child process for COW
24
+ Jets.boot(stringio: true) # outside of child process for COW
20
25
  Jets.eager_load!
21
26
 
22
27
  # INT - ^C
@@ -44,10 +49,11 @@ module Jets
44
49
  # child process
45
50
  server = TCPServer.new(8080) # Server bind to port 8080
46
51
  puts "Ruby server started on port #{PORT}" if ENV['FOREGROUND'] || ENV['JETS_DEBUG'] || ENV['C9_USER']
47
- input_completed = false
52
+
48
53
  loop do
49
- event, handler = nil, nil
50
54
  client = server.accept # Wait for a client to connect
55
+
56
+ input_completed, event, handler = nil, nil, nil
51
57
  unless input_completed
52
58
  event = client.gets.strip # text
53
59
  # puts event # uncomment for debugging, Jets has changed stdout to stderr
@@ -60,9 +66,10 @@ module Jets
60
66
  prewarm_request(event) :
61
67
  standard_request(event, '{}', handler)
62
68
 
63
- client.puts(result)
69
+ Jets::Booter.flush_output # flushing output as soon we dont need it anymore
70
+
71
+ client.puts('{"test": 1}')
64
72
  client.close
65
- input_completed = false
66
73
  end
67
74
  end
68
75
 
@@ -90,4 +97,3 @@ module Jets
90
97
  end
91
98
  end
92
99
  end
93
-
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "0.6.2"
2
+ VERSION = "0.6.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-20 00:00:00.000000000 Z
11
+ date: 2018-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor