jets 5.0.13 → 5.0.15

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: 9589a505325960693872eb2f2c0dd2303bb5ec299e4ee9a50017e1deb4928180
4
- data.tar.gz: 1433cdb88f01bf156d4b2615621dffd151e2259a41bb1d9ee79e7888edd70443
3
+ metadata.gz: 793eaf384ef1ef578d47e79c46a137f04ff2734a8dbde8219a2da73e6d4a1750
4
+ data.tar.gz: d6d253a3cebc683cb876f513c042bdf443d73adc5b4d61b130e807234bd2c06c
5
5
  SHA512:
6
- metadata.gz: f7b938b08f72022a066bd9e52c474543c9787309da7927c14e35dbe205f5bbce413bedb40e25a5e15a78c6c8f647f0efb0aafa9d6b69f652a64a915e7c649705
7
- data.tar.gz: a3376cca3d5ced2a1ab83d96b06e8c6b4b24f7f706498c5b0955cef0a7fb1e8a646078f22d5c60dad7ec7882f388f2541e3344b27d22204a0291b61628fefc57
6
+ metadata.gz: 2546975115d9471875543b795c480c85086bad4d04ecfb827b56e08afd4626f669d339919e74a051d516e088c87f157b8c40cffbe3896d233fc511714e4fceb5
7
+ data.tar.gz: 2a964324f5596564081fc61741ae3c992395dafd02fe841d2dae31488398a9d6c765b7d300869154202842f102f35d6dae50a179634b9b62c5887fa9b3c82be7
data/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
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/).
5
5
 
6
+ ## [5.0.15] - 2025-10-11
7
+ - update jets-api 0.2.1 dependency
8
+ - require logger super early
9
+ - require logger and mutex_m dependency
10
+ - add activemodel 7.0.8 dependency
11
+ - update to transfer manager upload file to remove deprecation warning
12
+ - update GEM_REGEXP match -gnu for Gemfile.lock rewrite
13
+
14
+ ## [5.0.14] - 2024-05-20
15
+ - [#719](https://github.com/rubyonjets/jets/pull/719) Support for s3 event sns configuration
16
+ - [#722](https://github.com/rubyonjets/jets/pull/722) Sets config.cache_classes to true in test env
17
+
6
18
  ## [5.0.13] - 2024-04-26
7
19
  - [#720](https://github.com/rubyonjets/jets/pull/720) Update docs link in status.rb
8
20
  - [#723](https://github.com/rubyonjets/jets/pull/723) fix prewarming post deploy
data/jets.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency "actionmailer", "~> 7.0.8"
29
29
  spec.add_dependency "actionpack", "~> 7.0.8"
30
30
  spec.add_dependency "actionview", "~> 7.0.8"
31
+ spec.add_dependency "activemodel", "~> 7.0.8"
31
32
  spec.add_dependency "activerecord", "~> 7.0.8"
32
33
  spec.add_dependency "activesupport", "~> 7.0.8"
33
34
  spec.add_dependency "railties", "~> 7.0.8" # for ActiveRecord database_tasks.rb
@@ -52,12 +53,14 @@ Gem::Specification.new do |spec|
52
53
  spec.add_dependency "dsl_evaluator", ">= 0.3.0" # for DslEvaluator.print_code
53
54
  spec.add_dependency "gems"
54
55
  spec.add_dependency "hashie"
55
- spec.add_dependency "jets-api", ">= 0.1.4"
56
+ spec.add_dependency "logger"
57
+ spec.add_dependency "jets-api", ">= 0.2.1"
56
58
  spec.add_dependency "jets-git"
57
59
  spec.add_dependency "jets-html-sanitizer"
58
60
  spec.add_dependency "kramdown"
59
61
  spec.add_dependency "memoist"
60
62
  spec.add_dependency "mini_mime"
63
+ spec.add_dependency "mutex_m"
61
64
  spec.add_dependency "rack"
62
65
  spec.add_dependency "rainbow"
63
66
  spec.add_dependency "recursive-open-struct"
@@ -4,7 +4,7 @@ module Jets::Builders
4
4
  class RubyPackager
5
5
  include Util
6
6
 
7
- GEM_REGEXP = /-(arm|x)\d+.*-(darwin|linux)/
7
+ GEM_REGEXP = /-(arm|x)\d+.*-(darwin|linux|gnu)|-(aarch64|x86_64|arm64|i386|powerpc|sparc|mips|riscv|loongarch|sw_64|hppa|ia64|s390).*-(darwin|linux|gnu)/
8
8
 
9
9
  attr_reader :full_app_root
10
10
  def initialize(relative_app_root)
@@ -77,7 +77,7 @@ module Jets::Builders
77
77
  # For example we add the jets-rails to the Gemfile.
78
78
  copy_back_gemfile_lock
79
79
 
80
- puts 'Bundle install completed'
80
+ puts "Bundle install completed"
81
81
  end
82
82
 
83
83
  # Example `bundle check` error:
@@ -92,7 +92,7 @@ module Jets::Builders
92
92
  # The Gemfile's dependencies are satisfied
93
93
  #
94
94
  def bundle_check
95
- out = ''
95
+ out = ""
96
96
  Bundler.with_unbundled_env do
97
97
  out = `cd #{cache_area} && bundle check 2>&1`
98
98
  end
@@ -124,7 +124,7 @@ module Jets::Builders
124
124
  puts "Tidying project: removing ignored files to reduce package size."
125
125
  tidy_project(@full_app_root)
126
126
  # The rack sub project has it's own gitignore.
127
- tidy_project(@full_app_root+"/rack")
127
+ tidy_project(@full_app_root + "/rack")
128
128
  end
129
129
 
130
130
  def tidy_project(path)
@@ -158,7 +158,7 @@ module Jets::Builders
158
158
 
159
159
  # IE: /tmp/jets/demo/cache/vendor/gems/ruby/2.5.0/bundler/gems/webpacker-a8c46614c675
160
160
  Dir.glob("#{cache_area}/vendor/gems/ruby/2.5.0/bundler/gems/*").each do |path|
161
- sha = path.split('-').last[0..6] # only first 7 chars of the git sha
161
+ sha = path.split("-").last[0..6] # only first 7 chars of the git sha
162
162
  unless git_shas.include?(sha)
163
163
  FileUtils.rm_rf(path) # REMOVE old submodule directory
164
164
  end
@@ -202,7 +202,7 @@ module Jets::Builders
202
202
  # amount is the number of lines to remove
203
203
  new_lines, capture, count, amount = [], true, 0, 2
204
204
  lines.each do |l|
205
- capture = false if l.include?('BUNDLED WITH')
205
+ capture = false if l.include?("BUNDLED WITH")
206
206
  if capture
207
207
  new_lines << l
208
208
  end
@@ -215,7 +215,7 @@ module Jets::Builders
215
215
  # Replace things like nokogiri (1.11.1-x86_64-darwin) => nokogiri (1.11.1)
216
216
  lines, new_lines = new_lines, []
217
217
  lines.each do |l|
218
- l.sub!(GEM_REGEXP, '') if l =~ GEM_REGEXP
218
+ l.sub!(GEM_REGEXP, "") if GEM_REGEXP.match?(l)
219
219
  new_lines << l
220
220
  end
221
221
 
@@ -236,11 +236,11 @@ module Jets::Builders
236
236
  next
237
237
  end
238
238
 
239
- in_platforms_section = l.include?('PLATFORMS')
239
+ in_platforms_section = l.include?("PLATFORMS")
240
240
  new_lines << l
241
241
  end
242
242
 
243
- content = new_lines.join('')
243
+ content = new_lines.join("")
244
244
  IO.write(gemfile_lock, content)
245
245
  end
246
246
 
@@ -261,12 +261,12 @@ module Jets::Builders
261
261
  # Dont know why this is the case.
262
262
  def create_bundle_config(frozen: false)
263
263
  FileUtils.rm_rf("#{cache_area}/.bundle")
264
- frozen_line = %Q|BUNDLE_FROZEN: "true"\n| if frozen
265
- text =<<-EOL
266
- ---
267
- #{frozen_line}BUNDLE_PATH: "vendor/gems"
268
- BUNDLE_WITHOUT: "development:test"
269
- EOL
264
+ frozen_line = %(BUNDLE_FROZEN: "true"\n) if frozen
265
+ text = <<~EOL
266
+ ---
267
+ #{frozen_line}BUNDLE_PATH: "vendor/gems"
268
+ BUNDLE_WITHOUT: "development:test"
269
+ EOL
270
270
  bundle_config = "#{cache_area}/.bundle/config"
271
271
  FileUtils.mkdir_p(File.dirname(bundle_config))
272
272
  IO.write(bundle_config, text)
@@ -4,7 +4,7 @@ module Jets::Cfn
4
4
 
5
5
  attr_reader :path
6
6
 
7
- def initialize(path, options={})
7
+ def initialize(path, options = {})
8
8
  @path = path
9
9
  @options = options
10
10
  end
@@ -25,7 +25,8 @@ module Jets::Cfn
25
25
  end
26
26
  end
27
27
 
28
- private
28
+ private
29
+
29
30
  def upload_to_s3?
30
31
  return false if @options[:stack_type] == :minimal # bucket not yet available
31
32
  bucket_name.present?
@@ -48,8 +49,7 @@ module Jets::Cfn
48
49
  end
49
50
 
50
51
  def upload_file_to_s3
51
- obj = s3_resource.bucket(bucket_name).object(s3_key)
52
- obj.upload_file(path)
52
+ transfer_manager.upload_file(path, bucket: bucket_name, key: s3_key)
53
53
 
54
54
  "https://s3.amazonaws.com/#{bucket_name}/#{s3_key}"
55
55
  end
@@ -58,6 +58,10 @@ module Jets::Cfn
58
58
  @s3_key ||= "jets/cfn-templates/#{File.basename(path)}"
59
59
  end
60
60
 
61
+ def transfer_manager
62
+ @transfer_manager ||= Aws::S3::TransferManager.new
63
+ end
64
+
61
65
  class << self
62
66
  # Caches reduce filesystem IO calls
63
67
  @@cache = {}
@@ -81,7 +85,7 @@ module Jets::Cfn
81
85
  template[:Outputs].keys.include?(key.to_sym)
82
86
  end
83
87
 
84
- name = File.basename(found_template).sub(/\.yml$/,'')
88
+ name = File.basename(found_template).sub(/\.yml$/, "")
85
89
  name.underscore.camelize # IE: ApiResources1
86
90
  end
87
91
  end
@@ -1,12 +1,16 @@
1
- require 'active_support/number_helper'
2
- require 'digest'
3
- require 'rack/mime'
1
+ require "active_support/number_helper"
2
+ require "digest"
3
+ require "rack/mime"
4
4
 
5
5
  module Jets::Cfn
6
6
  class Upload
7
7
  include Jets::AwsServices
8
8
  include ActiveSupport::NumberHelper # number_to_human_size
9
9
 
10
+ def transfer_manager
11
+ @transfer_manager ||= Aws::S3::TransferManager.new
12
+ end
13
+
10
14
  def upload
11
15
  upload_cfn_templates
12
16
  upload_zip_files
@@ -17,7 +21,7 @@ module Jets::Cfn
17
21
  Jets.s3_bucket
18
22
  end
19
23
 
20
- def upload_cfn_templates(version=nil)
24
+ def upload_cfn_templates(version = nil)
21
25
  puts "Uploading CloudFormation templates to S3." unless version # hide message when version is passed in
22
26
  expression = "#{Jets::Names.templates_folder}/*"
23
27
  if version # outside of each loop to avoid repeating
@@ -26,13 +30,11 @@ module Jets::Cfn
26
30
  checksum = Jets::Builders::Md5.checksums["stage/code"]
27
31
  version = "shas/#{checksum}"
28
32
  end
29
- checksum = Jets::Builders::Md5.checksums["stage/code"]
30
33
  Dir.glob(expression).each do |path|
31
34
  next unless File.file?(path)
32
- key = ["jets/cfn-templates", version, File.basename(path)].compact.join('/')
33
- obj = s3_resource.bucket(bucket_name).object(key)
34
- puts "Uploading #{path} to s3://#{bucket_name}/#{key}".color(:green) if ENV['JETS_DEBUG']
35
- obj.upload_file(path)
35
+ key = ["jets/cfn-templates", version, File.basename(path)].compact.join("/")
36
+ puts "Uploading #{path} to s3://#{bucket_name}/#{key}".color(:green) if ENV["JETS_DEBUG"]
37
+ transfer_manager.upload_file(path, bucket: bucket_name, key: key)
36
38
  end
37
39
  end
38
40
 
@@ -50,17 +52,16 @@ module Jets::Cfn
50
52
  puts "Uploading #{path} (#{file_size}) to S3"
51
53
  start_time = Time.now
52
54
  s3_key = "jets/code/#{File.basename(path)}"
53
- obj = s3_resource.bucket(bucket_name).object(s3_key)
54
- obj.upload_file(path)
55
+ transfer_manager.upload_file(path, bucket: bucket_name, key: s3_key)
55
56
  puts "Uploaded to s3://#{bucket_name}/#{s3_key}".color(:green)
56
- puts "Time to upload code to s3: #{pretty_time(Time.now-start_time).color(:green)}"
57
+ puts "Time to upload code to s3: #{pretty_time(Time.now - start_time).color(:green)}"
57
58
  end
58
59
 
59
60
  def upload_assets
60
61
  puts "Checking for modified public assets and uploading to S3."
61
62
  start_time = Time.now
62
63
  upload_public_assets
63
- puts "Time for public assets to s3: #{pretty_time(Time.now-start_time).color(:green)}"
64
+ puts "Time for public assets to s3: #{pretty_time(Time.now - start_time).color(:green)}"
64
65
  end
65
66
 
66
67
  def upload_public_assets
@@ -87,37 +88,36 @@ module Jets::Cfn
87
88
  end
88
89
 
89
90
  def upload_to_s3(full_path)
90
- if identical_on_s3?(full_path) && !ENV['JETS_ASSET_UPLOAD_FORCE']
91
- puts "Asset is identical on s3: #{full_path}" if ENV['JETS_DEBUG_ASSETS']
91
+ if identical_on_s3?(full_path) && !ENV["JETS_ASSET_UPLOAD_FORCE"]
92
+ puts "Asset is identical on s3: #{full_path}" if ENV["JETS_DEBUG_ASSETS"]
92
93
  return
93
94
  end
94
95
 
95
96
  key = s3_key(full_path)
96
- obj = s3_resource.bucket(bucket_name).object(key)
97
97
  content_type = content_type_headers(full_path)
98
- if ENV['JETS_DEBUG_ASSETS']
98
+ if ENV["JETS_DEBUG_ASSETS"]
99
99
  puts "Uploading and setting content type for s3://#{bucket_name}/#{key} content_type #{content_type[:content_type].inspect}"
100
100
  end
101
- obj.upload_file(full_path, { acl: "public-read", cache_control: cache_control }.merge(content_type))
101
+ transfer_manager.upload_file(full_path, bucket: bucket_name, key: key, acl: "public-read", cache_control: cache_control, **content_type)
102
102
  end
103
103
 
104
104
  CONTENT_TYPES_BY_EXTENSION = {
105
- '.css' => 'text/css',
106
- '.html' => 'text/html',
107
- '.js' => 'application/javascript',
105
+ ".css" => "text/css",
106
+ ".html" => "text/html",
107
+ ".js" => "application/javascript"
108
108
  }
109
109
  def content_type_headers(full_path)
110
110
  ext = File.extname(full_path)
111
111
  content_type = CONTENT_TYPES_BY_EXTENSION[ext] || Rack::Mime.mime_type(ext)
112
112
  if content_type
113
- { content_type: content_type }
113
+ {content_type: content_type}
114
114
  else
115
115
  {}
116
116
  end
117
117
  end
118
118
 
119
119
  def s3_key(full_path)
120
- relative_path = full_path.sub("#{Jets.root}/", '')
120
+ relative_path = full_path.sub("#{Jets.root}/", "")
121
121
  "jets/#{relative_path}"
122
122
  end
123
123
 
@@ -1,5 +1,5 @@
1
1
  Jets.application.configure do
2
- config.cache_classes = false
2
+ config.cache_classes = true
3
3
  config.eager_load = ENV["CI"].present?
4
4
  config.cache_store = :null_store
5
5
 
@@ -1,8 +1,49 @@
1
1
  module Jets::Job::Dsl
2
2
  module S3Event
3
+ # Register an S3 event.
4
+ # Allow custom sns_subscription_properties to be passed in.
5
+ #
6
+ # Examples
7
+ #
8
+ # props = {
9
+ # sns_subscription_properties: {
10
+ # FilterPolicyScope: "MessageBody",
11
+ # FilterPolicy: {
12
+ # Records: {
13
+ # s3: {
14
+ # object: {
15
+ # key: [
16
+ # { prefix: "test-prefix/" }
17
+ # ]
18
+ # }
19
+ # }
20
+ # }
21
+ # }.to_json
22
+ # }
23
+ # }
24
+ #
25
+ # s3_event("s3-bucket", props)
26
+ # def process_s3_event
27
+ # ...
28
+ # end
29
+ #
30
+ # The S3 event is set up with the following resources:
31
+ #
32
+ # - S3 Bucket
33
+ # - S3 Bucket Notification Configuration
34
+ # - SNS Topic
35
+ # - SNS Subscription
36
+ #
37
+ # @param [String] bucket_name
38
+ # @param [Hash] props
3
39
  def s3_event(bucket_name, props={})
4
40
  stack_name = declare_s3_bucket_resources(bucket_name) # only set up once per bucket
5
- declare_sns_subscription(TopicArn: "!Ref #{stack_name}SnsTopic") # set up subscription every time
41
+ sns_subscription_properties = {
42
+ **props[:sns_subscription_properties] || {},
43
+ TopicArn: "!Ref #{stack_name}SnsTopic"
44
+ }
45
+
46
+ declare_sns_subscription(sns_subscription_properties) # set up subscription every time
6
47
  end
7
48
 
8
49
  # Returns stack_name
data/lib/jets/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "5.0.13"
2
+ VERSION = "5.0.15"
3
3
  end
data/lib/jets.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  $stdout.sync = true unless ENV["JETS_STDOUT_SYNC"] == "0"
2
2
  $:.unshift(File.expand_path("../", __FILE__))
3
3
 
4
+ require "logger" # must require super early
5
+
4
6
  require "active_support"
5
7
  require "active_support/concern"
6
8
  require "active_support/core_ext"
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: 5.0.13
4
+ version: 5.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-26 00:00:00.000000000 Z
11
+ date: 2025-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 7.0.8
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 7.0.8
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 7.0.8
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: activerecord
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -374,20 +388,34 @@ dependencies:
374
388
  - - ">="
375
389
  - !ruby/object:Gem::Version
376
390
  version: '0'
391
+ - !ruby/object:Gem::Dependency
392
+ name: logger
393
+ requirement: !ruby/object:Gem::Requirement
394
+ requirements:
395
+ - - ">="
396
+ - !ruby/object:Gem::Version
397
+ version: '0'
398
+ type: :runtime
399
+ prerelease: false
400
+ version_requirements: !ruby/object:Gem::Requirement
401
+ requirements:
402
+ - - ">="
403
+ - !ruby/object:Gem::Version
404
+ version: '0'
377
405
  - !ruby/object:Gem::Dependency
378
406
  name: jets-api
379
407
  requirement: !ruby/object:Gem::Requirement
380
408
  requirements:
381
409
  - - ">="
382
410
  - !ruby/object:Gem::Version
383
- version: 0.1.4
411
+ version: 0.2.1
384
412
  type: :runtime
385
413
  prerelease: false
386
414
  version_requirements: !ruby/object:Gem::Requirement
387
415
  requirements:
388
416
  - - ">="
389
417
  - !ruby/object:Gem::Version
390
- version: 0.1.4
418
+ version: 0.2.1
391
419
  - !ruby/object:Gem::Dependency
392
420
  name: jets-git
393
421
  requirement: !ruby/object:Gem::Requirement
@@ -458,6 +486,20 @@ dependencies:
458
486
  - - ">="
459
487
  - !ruby/object:Gem::Version
460
488
  version: '0'
489
+ - !ruby/object:Gem::Dependency
490
+ name: mutex_m
491
+ requirement: !ruby/object:Gem::Requirement
492
+ requirements:
493
+ - - ">="
494
+ - !ruby/object:Gem::Version
495
+ version: '0'
496
+ type: :runtime
497
+ prerelease: false
498
+ version_requirements: !ruby/object:Gem::Requirement
499
+ requirements:
500
+ - - ">="
501
+ - !ruby/object:Gem::Version
502
+ version: '0'
461
503
  - !ruby/object:Gem::Dependency
462
504
  name: rack
463
505
  requirement: !ruby/object:Gem::Requirement