jets-rails 0.2.0 → 1.0.0

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: c47cd2b1a0fa72eec799b7d25df47ddde8df183ae3f82b81ba653c65eb5139a2
4
- data.tar.gz: c168d9ac40131cfe97861a04f1a3e3ca49723ba3ff9e12418413f4792447e340
3
+ metadata.gz: 536f98adce430371ad8e7a31424b866b3ae44f99f45094485304ad8186e47979
4
+ data.tar.gz: 3c843ab9189c8f85608fc7de03c94b9881055d852bc9404cbdfe85339f0455bd
5
5
  SHA512:
6
- metadata.gz: 428d0b35d8c1199542a4c2e21992b84d5c30fa0e58b9f4d1ef75b77a93bec9797414cbeccda274b43c583858e51c9c8977504618a8d8a83ca249d3d1790aa327
7
- data.tar.gz: 0a288e9b1e889f3ecd51b3005c9c06dd3680849d1d6e5b58b8d75da7286ce782fa16a14e6c23da4b04b96bb6bba2e4c76f844c41f36f3a03e359c7447c178d32
6
+ metadata.gz: 71aa7434ee9332a6a823875e1572569b2f0399a3110aa3a556e9c07e6bc6f3baab144845f47ecd5d850728e434c2e5fdb2830066a07462b730ede955d23eecef
7
+ data.tar.gz: b16d8e88d3832a7e1bb492bc270b8c93a1a33511e9bfaa3f5067c328f622aabb3d48e8a0e3ea48956e944e7983fbf9b9cc8efefea93d3cd291ca8803e0fc816e
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/).
5
+
6
+ ## [1.0.0] - 2024-05-20
7
+
8
+ * jets 6 plugin: activejob jets_job adapter, engine
9
+ * activejob support jets_job adapter
10
+ * autoloader app/extensions and shared/extensions autoload paths
11
+ * before_configuration jets boot
12
+ * remove 0.3 code full rewrite
13
+
14
+ ## [0.3.0] - 2018-10-28
15
+
16
+ - allow for rails 4
17
+
18
+ ## [0.1.0] - 2018-10-27
19
+
20
+ - Initial release
@@ -1,4 +1,6 @@
1
- Copyright 2018 Tung Nguyen
1
+ Copyright (c) Tung Nguyen
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,16 +1,13 @@
1
- # Jets Rails for Mega Mode
1
+ # Jets Rails Support
2
2
 
3
- This gem works in conjuction with Jets to allow you to run a Rails application on AWS Lambda. This gem is not meant to be used standalone. Instead, jets automatically adds this gem to a Rails application as part of [Mega Mode Rails Support](http://rubyonjets.com/docs/rails-support/).
3
+ [![BoltOps Badge](https://img.boltops.com/boltops/badges/boltops-badge.png)](https://www.boltops.com)
4
4
 
5
- ## Usage
6
-
7
- This gem is not meant to be used standalone. You can enable it though by adding to your Rails Gemfile and setting the `JETS_MEGA=1` env var.
5
+ A [Jets Plugin](https://docs.rubyonjets.com/docs/plugins/) for Rails and [Jets](http://rubyonjets.com/).
8
6
 
9
- ## More Info
7
+ ## Usage
10
8
 
11
- For more information about Jets and Rails Support refer to:
9
+ Add gem to your Gemfile, bundle, and deploy
12
10
 
13
- * [Ruby on Jets](http://rubyonjets.com)
14
- * [AWS Lambda Ruby Support at Native Speed with Jets](https://blog.boltops.com/2018/09/02/aws-lambda-ruby-support-at-native-speed-with-jets)
15
- * [Jets Rails Support](http://rubyonjets.com/docs/rails-support/)
16
- * [Toronto Serverless Presentation: Jets Framework on AWS Lambda](https://blog.boltops.com/2018/09/25/toronto-serverless-presentation-jets-framework-on-aws-lambda)
11
+ bundle add "jets-rails"
12
+ jets init
13
+ jets deploy
data/Rakefile CHANGED
@@ -1,27 +1,8 @@
1
- begin
2
- require 'bundler/setup'
3
- rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
- end
1
+ # frozen_string_literal: true
6
2
 
7
- require 'rdoc/task'
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
8
5
 
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'JetsRails'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.md')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
15
- end
6
+ RSpec::Core::RakeTask.new(:spec)
16
7
 
17
- require 'bundler/gem_tasks'
18
-
19
- require 'rake/testtask'
20
-
21
- Rake::TestTask.new(:test) do |t|
22
- t.libs << 'test'
23
- t.pattern = 'test/**/*_test.rb'
24
- t.verbose = false
25
- end
26
-
27
- task default: :test
8
+ task default: :spec
@@ -0,0 +1,13 @@
1
+ require "active_job"
2
+
3
+ module ActiveJob::QueueAdapters
4
+ class JetsJobAdapter
5
+ def enqueue(job)
6
+ Jets::Rails::Job::Queue.new(job).enqueue
7
+ end
8
+
9
+ def enqueue_at(job, timestamp)
10
+ Jets::Rails::Job::Queue.new(job, timestamp).enqueue
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ require "zeitwerk"
2
+
3
+ module Jets
4
+ module Rails
5
+ class Autoloader
6
+ class Inflector < Zeitwerk::Inflector
7
+ def camelize(basename, _abspath)
8
+ map = {cli: "CLI", version: "VERSION"}
9
+ map[basename.to_sym] || super
10
+ end
11
+ end
12
+
13
+ class << self
14
+ def setup
15
+ loader = Zeitwerk::Loader.new
16
+ loader.inflector = Inflector.new
17
+ lib = File.expand_path("../..", __dir__) # lib
18
+ loader.push_dir(lib)
19
+ loader.ignore("#{lib}/jets-rails.rb")
20
+ loader.setup
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ require "rails/engine"
2
+
3
+ module Jets::Rails
4
+ class Engine < Rails::Engine
5
+ # Need to use before_configuration for dotenv
6
+ # so env values can be used in config/initializers
7
+ config.before_configuration do
8
+ Jets.boot # sets up autoloader
9
+ end
10
+
11
+ # Let Jets handle these autoload paths
12
+ #
13
+ # Jets.project.config.all_load_paths example:
14
+ #
15
+ # app/events
16
+ # app/extensions
17
+ # shared/resources
18
+ # shared/extensions
19
+ # app/functions
20
+ # shared/functions
21
+ #
22
+ config.before_initialize do
23
+ Jets.project.config.all_load_paths.each do |path|
24
+ Rails.autoloaders.main.ignore(Rails.root.join(path))
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ require "active_job"
2
+
3
+ module Jets::Rails::Job
4
+ class Executer
5
+ extend Memoist
6
+
7
+ def initialize(job_data)
8
+ @job_data = job_data
9
+ end
10
+
11
+ def execute
12
+ ActiveJob::Base.execute(@job_data)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ class Jets::Rails::Job::Queue
2
+ class Check
3
+ class Error < StandardError; end
4
+
5
+ class << self
6
+ include Jets::Util::Logging
7
+
8
+ @@error_message = "ERROR: Unable to get queue url".color(:red)
9
+ def exist!
10
+ job_enable!
11
+ existance!
12
+ end
13
+
14
+ def existance!
15
+ return if Url.queue_url
16
+
17
+ log.error @@error_message
18
+ raise Error, "Are you sure you have deployed with Jets.project.config.job.enable = true ?"
19
+ rescue Jets::Api::Error::NotFound
20
+ log.error @@error_message
21
+ raise Error, "It does not look like the stack has successfully deployed. Please deploy first."
22
+ end
23
+
24
+ def job_enable!
25
+ return if Url.queue_url
26
+
27
+ log.error @@error_message
28
+ raise Error, "Are you sure that config.job.enable = true ?"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ class Jets::Rails::Job::Queue
2
+ class Url
3
+ class << self
4
+ extend Memoist
5
+
6
+ def queue_url
7
+ # JETS_JOB_QUEUE_URL must be set when on AWS Lambda
8
+ # to avoid the API call to retrieve the queue_url
9
+ return ENV["JETS_JOB_QUEUE_URL"] if ENV["JETS_JOB_QUEUE_URL"]
10
+ # 1. can be nil
11
+ # 2. can raise NotFound error
12
+ resp = Jets::Api::Release.retrieve("latest")
13
+ resp.queue_url
14
+ end
15
+ memoize :queue_url
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,78 @@
1
+ require "aws-sdk-sqs"
2
+
3
+ module Jets::Rails::Job
4
+ class Queue
5
+ class Error < StandardError; end
6
+
7
+ extend Memoist
8
+ include Jets::Util::Logging
9
+ delegate :queue_url, to: Url
10
+
11
+ attr_reader :job, :timestamp
12
+ def initialize(job, timestamp = nil)
13
+ @job = job
14
+ @timestamp = timestamp
15
+ end
16
+
17
+ def enqueue
18
+ Check.exist!
19
+
20
+ params = {
21
+ queue_url: queue_url,
22
+ message_body: JSON.dump(job.serialize)
23
+ }
24
+ if fifo?
25
+ params.merge!(fifo_params)
26
+ else
27
+ params.merge!(standard_params)
28
+ end
29
+ log.info "Enqueueing job to #{queue_url}"
30
+ log.debug " with params: #{params.inspect}"
31
+ sqs.send_message(params)
32
+ end
33
+
34
+ def fifo?
35
+ queue_url.include?(".fifo")
36
+ end
37
+
38
+ def fifo_params
39
+ options = {}
40
+ options[:message_deduplication_id] = message_deduplication_id
41
+
42
+ message_group_id = @job.message_group_id if @job.respond_to?(:message_group_id)
43
+ message_group_id ||= "jets"
44
+
45
+ options[:message_group_id] = message_group_id
46
+ options
47
+ end
48
+
49
+ # Note that `job_id` is NOT included in deduplication keys because it is unique for
50
+ # each initialization of the job, and the run-once behavior must be guaranteed for ActiveJob retries.
51
+ # Even without setting job_id, it is implicitly excluded from deduplication keys.
52
+ def message_deduplication_id
53
+ ex_dedup_keys = @job.excluded_deduplication_keys if @job.respond_to?(:excluded_deduplication_keys)
54
+ ex_dedup_keys ||= []
55
+ ex_dedup_keys += ["job_id"]
56
+ body = @job.serialize
57
+ deduplication_body = body.except(*ex_dedup_keys)
58
+ Digest::SHA256.hexdigest(JSON.dump(deduplication_body))
59
+ end
60
+
61
+ def standard_params
62
+ @timestamp ? {delay_seconds: delay_seconds} : {}
63
+ end
64
+
65
+ def delay_seconds
66
+ delay = (@timestamp - Time.now.to_f).floor
67
+ delay = 0 if delay.negative?
68
+ raise ArgumentError, "Unable to queue a job with a delay greater than 15 minutes" if delay > 15.minutes
69
+
70
+ delay
71
+ end
72
+
73
+ def sqs
74
+ Aws::SQS::Client.new
75
+ end
76
+ memoize :sqs
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jets
4
+ module Rails
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
data/lib/jets/rails.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ $:.unshift(File.expand_path("..", __dir__))
4
+ require "active_job/queue_adapters/jets_job_adapter"
5
+
6
+ require "jets/rails/autoloader"
7
+ Jets::Rails::Autoloader.setup
8
+
9
+ require "memoist"
10
+ require "rainbow/ext/string"
11
+
12
+ module Jets
13
+ module Rails
14
+ class Error < StandardError; end
15
+ end
16
+ end
17
+
18
+ require "jets/rails/engine" if defined?(Rails::Railtie)
data/lib/jets-rails.rb CHANGED
@@ -1 +1 @@
1
- require_relative "jets_rails"
1
+ require_relative "jets/rails"
metadata CHANGED
@@ -1,67 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jets-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-28 00:00:00.000000000 Z
11
+ date: 2024-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk-sqs
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: memoist
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
13
69
  - !ruby/object:Gem::Dependency
14
70
  name: rails
15
71
  requirement: !ruby/object:Gem::Requirement
16
72
  requirements:
17
- - - "~>"
73
+ - - ">="
18
74
  - !ruby/object:Gem::Version
19
- version: '5'
75
+ version: '7.0'
20
76
  type: :runtime
21
77
  prerelease: false
22
78
  version_requirements: !ruby/object:Gem::Requirement
23
79
  requirements:
24
- - - "~>"
80
+ - - ">="
25
81
  - !ruby/object:Gem::Version
26
- version: '5'
82
+ version: '7.0'
27
83
  - !ruby/object:Gem::Dependency
28
- name: sqlite3
84
+ name: rainbow
29
85
  requirement: !ruby/object:Gem::Requirement
30
86
  requirements:
31
87
  - - ">="
32
88
  - !ruby/object:Gem::Version
33
89
  version: '0'
34
- type: :development
90
+ type: :runtime
35
91
  prerelease: false
36
92
  version_requirements: !ruby/object:Gem::Requirement
37
93
  requirements:
38
94
  - - ">="
39
95
  - !ruby/object:Gem::Version
40
96
  version: '0'
41
- description: Reconfigures the Rails application and injects the necessary changes
42
- to run the rack application on AWS Lambda. Meant to be used in conjunction with
43
- Jets. Not meant to be used standalone.
97
+ - !ruby/object:Gem::Dependency
98
+ name: zeitwerk
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
44
112
  email:
45
113
  - tongueroo@gmail.com
46
114
  executables: []
47
115
  extensions: []
48
116
  extra_rdoc_files: []
49
117
  files:
50
- - MIT-LICENSE
118
+ - ".rspec"
119
+ - CHANGELOG.md
120
+ - LICENSE.txt
51
121
  - README.md
52
122
  - Rakefile
123
+ - lib/active_job/queue_adapters/jets_job_adapter.rb
53
124
  - lib/jets-rails.rb
54
- - lib/jets_rails.rb
55
- - lib/jets_rails/core_ext/kernel.rb
56
- - lib/jets_rails/logger.rb
57
- - lib/jets_rails/railtie.rb
58
- - lib/jets_rails/stage_middleware.rb
59
- - lib/jets_rails/version.rb
60
- - lib/tasks/jets_rails_tasks.rake
61
- homepage: https://github.com/tongueroo/jets-rails
62
- licenses:
63
- - MIT
64
- metadata: {}
125
+ - lib/jets/rails.rb
126
+ - lib/jets/rails/autoloader.rb
127
+ - lib/jets/rails/engine.rb
128
+ - lib/jets/rails/job/executer.rb
129
+ - lib/jets/rails/job/queue.rb
130
+ - lib/jets/rails/job/queue/check.rb
131
+ - lib/jets/rails/job/queue/url.rb
132
+ - lib/jets/rails/version.rb
133
+ homepage: https://github.com/rubyonjets/jets-rails
134
+ licenses: []
135
+ metadata:
136
+ homepage_uri: https://github.com/rubyonjets/jets-rails
65
137
  post_install_message:
66
138
  rdoc_options: []
67
139
  require_paths:
@@ -70,16 +142,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
70
142
  requirements:
71
143
  - - ">="
72
144
  - !ruby/object:Gem::Version
73
- version: '0'
145
+ version: 3.2.0
74
146
  required_rubygems_version: !ruby/object:Gem::Requirement
75
147
  requirements:
76
148
  - - ">="
77
149
  - !ruby/object:Gem::Version
78
150
  version: '0'
79
151
  requirements: []
80
- rubyforge_project:
81
- rubygems_version: 2.7.6
152
+ rubygems_version: 3.4.19
82
153
  signing_key:
83
154
  specification_version: 4
84
- summary: Jets Mega Mode Rails Support
155
+ summary: Jets Rails Support
85
156
  test_files: []
@@ -1,35 +0,0 @@
1
- # With this implementation we write to disk immedaitely. This simplifies the
2
- # implementation because we do not have to flush to io buffer by passing signals
3
- # back and forth from the jets ruby server process to the rack server process.
4
- module Kernel
5
- # List from https://ruby-doc.org/core-2.5.1/Kernel.html
6
- # Note, will lose pp format in the @io_buffer but looks like a lot of work to keep the pp format.
7
- # Must override stdout which can be messy quick: https://www.ruby-forum.com/topic/43725
8
- OVERRIDE_METHODS = %w[
9
- p
10
- pp
11
- print
12
- printf
13
- putc
14
- puts
15
- ]
16
- # NOTE adding sprintf produces #<%s: %s:%s/%s> with puma? So not including sprintf
17
- OVERRIDE_METHODS.each do |meth|
18
- # Example of generated code:
19
- #
20
- # alias_method :original_puts, :puts
21
- # def puts(*args, &block)
22
- # original_puts(*args, &block)
23
- # end
24
- #
25
- class_eval <<~CODE
26
- alias_method :original_#{meth}, :#{meth}
27
- def #{meth}(*args, &block)
28
- # Write immediately for debugging
29
- message = "Rails: " + args.first.to_s + "\n"
30
- IO.write("/tmp/jets-output.log", message, mode: 'a')
31
- original_#{meth}(*args, &block)
32
- end
33
- CODE
34
- end
35
- end
@@ -1,14 +0,0 @@
1
- require 'active_support'
2
-
3
- # Tap into rails logging to show logs in CloudWatch eventually.
4
- #
5
- # Overriding Rails SimpleFormatter directly is pretty simple approach.
6
- # The definition is short.
7
- class ActiveSupport::Logger::SimpleFormatter
8
- # This method is invoked when a log event occurs
9
- def call(severity, timestamp, progname, msg)
10
- result = "#{String === msg ? msg : msg.inspect}\n"
11
- IO.write("/tmp/jets-output.log", "Rails: #{result}", mode: 'a')
12
- result
13
- end
14
- end
@@ -1,7 +0,0 @@
1
- module JetsRails
2
- class Railtie < ::Rails::Railtie
3
- initializer "jets_rails.configure_middleware" do
4
- Rails.application.middleware.insert_before(Rack::Sendfile, StageMiddleware)
5
- end
6
- end
7
- end
@@ -1,26 +0,0 @@
1
- module JetsRails
2
- class StageMiddleware
3
- def initialize(app)
4
- @app = app
5
- end
6
-
7
- def call(env)
8
- add_stage_name(env) if on_aws?(env)
9
- status, headers, body = @app.call(env)
10
- [status, headers, body]
11
- end
12
-
13
- private
14
- # Add API Gateway Stage Name
15
- def add_stage_name(env)
16
- # changes links that Rails generates
17
- env[Rack::SCRIPT_NAME] = "/#{JetsRails.stage}"
18
- end
19
-
20
- def on_aws?(env)
21
- return true if ENV['JETS_ON_AWS'] # for local testing
22
- host = env['HTTP_X_FORWARDED_HOST'] # from Jets::Rack::Request#set_headers!
23
- host&.include?("amazonaws.com")
24
- end
25
- end
26
- end
@@ -1,3 +0,0 @@
1
- module JetsRails
2
- VERSION = '0.2.0'
3
- end
data/lib/jets_rails.rb DELETED
@@ -1,24 +0,0 @@
1
- # JETS_MEGA is set in the bin/rackup wrapper
2
- # We do this check so we can include jets-rails in the Gemfile and allow users
3
- # to check to see if the bundle install will work though this is not activated
4
- # logically without JETS_MEGA set.
5
- return unless ENV['JETS_MEGA']
6
-
7
- # = Configuration
8
- #
9
- # Configure with Rails initializer. Example:
10
- #
11
- # config/initializer/jets.rb:
12
- #
13
- # JetsRails.stage = ENV['JETS_STAGE'] || 'dev'
14
- #
15
- module JetsRails
16
- cattr_accessor :stage
17
- self.stage = "dev" # default. should be set to in Rails initializer
18
-
19
- autoload :StageMiddleware, 'jets_rails/stage_middleware'
20
- end
21
-
22
- require "jets_rails/core_ext/kernel"
23
- require "jets_rails/logger" # eager load rails override
24
- require "jets_rails/railtie"
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :jets_rails do
3
- # # Task goes here
4
- # end