rails-assets-manifest 2.0.1 → 3.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: b3b37255b188591ca005e9421faf46d08a6906e5d13d7b6d2bc27cc278dde8ea
4
- data.tar.gz: 1d3faec5a30ce6c2cbe41b7c543b9e1b3fd9162320c2a8babf08533b4aebec41
3
+ metadata.gz: 36c667b7c457d214df43ac5f4c9e54f5baac237c0f9a61ac3eeedc6d1d458ab9
4
+ data.tar.gz: 1a7c777200e2087c05be7759091007857861261a5d00912256f35f5ff98d2a6c
5
5
  SHA512:
6
- metadata.gz: f2dce0a879ba0931ed9ff2544ebabae420780a3f6c25bc9617f36c833758d4408f4c2ef388ed5bf59974a225d6cdfa2a578d217f5c552f9b0abfc0242de381c1
7
- data.tar.gz: b29d086dcf4a9c93f5892ae204ac1f0ad8a51cd24d918fdcecc56f02cc87de8b99cdeccce4eb2111de563d923aa4059ed8f294a2f1c00c71f066d3cb313de15b
6
+ metadata.gz: 6117f1e88a27ba3dd5ce5edc85a21952e91de97abd3d72bc9b37a1527aa8352a7170371acf2bec29a268a8aced6b3519af4d9e4409848f041c9d950090ca38cb
7
+ data.tar.gz: 2f38b29bf90d82cd5a4a8e039a2fef2bd536326d1fe81eb3ee9e04d5b2637f4f3114a5deeb75ce6a6aec332cdf7874056033d4dde53d8bea7bc5d053774dbc6a
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: test
3
+ on: push
4
+ jobs:
5
+ rspec:
6
+ name: "ruby:${{ matrix.ruby }} rails:${{ matrix.rails }} ${{ matrix.variant }}"
7
+ runs-on: ubuntu-20.04
8
+
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby:
13
+ - "3.1"
14
+ - "3.0"
15
+ - "2.7"
16
+ rails:
17
+ - "7.0"
18
+ - "6.1"
19
+ - "6.0"
20
+ - "5.2"
21
+ variant:
22
+ - ""
23
+ - "no-sprockets"
24
+ exclude:
25
+ - ruby: "3.1"
26
+ rails: "6.1"
27
+ - ruby: "3.1"
28
+ rails: "6.0"
29
+ - ruby: "3.1"
30
+ rails: "5.2"
31
+ - ruby: "3.0"
32
+ rails: "5.2"
33
+
34
+ env:
35
+ BUNDLE_GEMFILE: gemfiles/rails_${{ matrix.rails }}.gemfile
36
+ BUNDLE_WITHOUT: development
37
+ BUNDLE_JOBS: 4
38
+ BUNDLE_RETRY: 3
39
+ VARIANT: ${{ matrix.variant }}
40
+
41
+ steps:
42
+ - uses: actions/checkout@master
43
+ - uses: ruby/setup-ruby@v1
44
+ with:
45
+ ruby-version: ${{ matrix.ruby }}
46
+ bundler-cache: true
47
+
48
+ - run: bundle exec rspec --color
49
+
50
+ rubocop:
51
+ name: rubocop
52
+ runs-on: ubuntu-20.04
53
+
54
+ env:
55
+ BUNDLE_WITHOUT: development
56
+ BUNDLE_JOBS: 4
57
+ BUNDLE_RETRY: 3
58
+
59
+ steps:
60
+ - uses: actions/checkout@master
61
+ - uses: ruby/setup-ruby@v1
62
+ with:
63
+ ruby-version: 3.1
64
+ bundler-cache: true
65
+
66
+ - run: bundle exec rubocop --parallel --fail-level E
data/.gitignore CHANGED
@@ -3,6 +3,8 @@
3
3
  /coverage
4
4
  /doc
5
5
  /pkg
6
+ /spec/dummy/log
7
+ /spec/dummy/tmp
6
8
  /spec/examples.txt
7
9
  /tmp
8
10
  /vendor/bundle
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
- --format documentation
1
+ --backtrace
2
2
  --color
3
+ --format documentation
3
4
  --require spec_helper
data/.rubocop.yml CHANGED
@@ -1,211 +1,7 @@
1
- require:
2
- - rubocop-rspec
1
+ inherit_gem:
2
+ rubocop-config: default.yml
3
3
 
4
4
  AllCops:
5
- Exclude:
6
- - 'bin/**'
7
- - 'config/initializers/integration*'
8
- - 'db/schema.rb'
9
- - 'vendor/**'
10
- TargetRubyVersion: 2.5
11
- TargetRailsVersion: 5.2
12
-
13
-
14
-
15
- # -----------------------------------------------------------------------------
16
- # RAILS
17
-
18
- Rails:
19
- Enabled: true
20
-
21
- #
22
- # False positives:
23
- # * On Acfs::Resource#update_attriubutes!
24
- #
25
- Rails/ActiveRecordAliases:
26
- Exclude:
27
- - spec/**/*_spec.rb
28
-
29
- #
30
- # False positives:
31
- # * On embedded models in migrations.
32
- #
33
- Rails/ApplicationRecord:
34
- Exclude:
35
- - 'db/**/*'
36
-
37
- #
38
- # Often when triggered it just wants to pass joined paths as separate
39
- # arguments but that can hurt readability.
40
- #
41
- Rails/FilePath:
42
- Enabled: false
43
-
44
- #
45
- # False positives:
46
- # * Specs and migrations often need to update things without validations.
47
- #
48
- Rails/SkipsModelValidations:
49
- Exclude:
50
- - 'db/migrations/**.rb'
51
- - 'spec/**/*_spec.rb'
52
-
53
-
54
-
55
- # -----------------------------------------------------------------------------
56
- # RSPEC
57
-
58
- RSpec:
59
- Include:
60
- - 'spec/**/*_spec.rb'
61
- - 'spec/spec_helper.rb'
62
- - 'spec/rails_helper.rb'
63
-
64
- RSpec/ContextWording:
65
- Enabled: false
66
-
67
- RSpec/ExampleLength:
68
- Enabled: false
69
-
70
- RSpec/ExpectInHook:
71
- Enabled: false
72
-
73
- RSpec/FilePath:
74
- Exclude:
75
- - 'spec/client/**/*_spec.rb'
76
-
77
- RSpec/MessageSpies:
78
- Enabled: false
79
-
80
- RSpec/MissingExampleGroupArgument:
81
- Enabled: false
82
-
83
- RSpec/MultipleExpectations:
84
- Enabled: false
85
-
86
- RSpec/NestedGroups:
87
- Max: 5
88
-
89
- # -----------------------------------------------------------------------------
90
- # Layout
91
-
92
- Layout/AlignParameters:
93
- EnforcedStyle: with_fixed_indentation
94
-
95
- Layout/CaseIndentation:
96
- EnforcedStyle: end
97
- SupportedStyles:
98
- - case
99
- - end
100
- IndentOneStep: true
101
-
102
- Layout/MultilineMethodCallIndentation:
103
- EnforcedStyle: indented
104
-
105
- Layout/SpaceInsideBlockBraces:
106
- EnforcedStyle: space
107
- EnforcedStyleForEmptyBraces: no_space
108
- SpaceBeforeBlockParameters: false
109
-
110
- Layout/SpaceInsideHashLiteralBraces:
111
- EnforcedStyle: no_space
112
-
113
-
114
-
115
- # -----------------------------------------------------------------------------
116
- # Lint
117
-
118
- #
119
- # False positives:
120
- # * expect { something }.to change { something } often triggers this
121
- #
122
- Lint/AmbiguousBlockAssociation:
123
- Exclude:
124
- - 'spec/**/*_spec.rb'
125
-
126
-
127
-
128
- # -----------------------------------------------------------------------------
129
- # Metrics
130
-
131
- Metrics/BlockLength:
132
- Exclude:
133
- - 'db/**/*'
134
- - 'spec/**/*'
135
- - 'config/**/*'
136
- - '**/*.rake'
137
-
138
- Metrics/ClassLength:
139
- Max: 200
140
-
141
- Metrics/LineLength:
142
- Exclude:
143
- - 'db/**/*'
144
- - 'spec/**/*'
145
- - 'config/**/*'
146
-
147
- Metrics/MethodLength:
148
- Exclude:
149
- - 'db/**/*'
150
-
151
-
152
-
153
- # -----------------------------------------------------------------------------
154
- # Style
155
-
156
- Style/BracesAroundHashParameters:
157
- EnforcedStyle: context_dependent
158
-
159
- #
160
- # Both styles or mixtures are reasonable
161
- #
162
- Style/ClassAndModuleChildren:
163
- EnforcedStyle: compact
164
- Enabled: false
165
-
166
- #
167
- # Would be better but unlikely...
168
- #
169
- Style/Documentation:
170
- Enabled: false
171
-
172
- #
173
- # Scripts might include on top-level
174
- #
175
- Style/MixinUsage:
176
- Exclude:
177
- - 'scripts/**/*'
178
-
179
- Style/RaiseArgs:
180
- EnforcedStyle: compact
181
-
182
- #
183
- # Quick single line rescues in specs
184
- #
185
- Style/RescueModifier:
186
- Exclude:
187
- - 'spec/**/*_spec.rb'
188
-
189
- #
190
- # Quick single line rescues in specs
191
- #
192
- Style/RescueStandardError:
193
- Exclude:
194
- - 'spec/**/*_spec.rb'
195
-
196
- #
197
- # Often used pattern in chaining subjects in specs
198
- #
199
- Style/Semicolon:
200
- Exclude:
201
- - 'spec/**/*_spec.rb'
202
-
203
- Style/SignalException:
204
- EnforcedStyle: only_raise
205
-
206
- Style/TrailingCommaInArrayLiteral:
207
- EnforcedStyleForMultiline: comma
208
-
209
- Style/TrailingCommaInHashLiteral:
210
- EnforcedStyleForMultiline: comma
211
-
5
+ TargetRubyVersion: 2.7
6
+ SuggestExtensions: False
7
+ NewCops: enable
data/Appraisals ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise 'rails-7.0' do
4
+ gem 'rails', '~> 7.0.0'
5
+ end
6
+
7
+ appraise 'rails-6.1' do
8
+ gem 'rails', '~> 6.1.0'
9
+ end
10
+
11
+ appraise 'rails-6.0' do
12
+ gem 'rails', '~> 6.0.0'
13
+ end
14
+
15
+ appraise 'rails-5.2' do
16
+ gem 'rails', '~> 5.2.0'
17
+ end
data/CHANGELOG.md CHANGED
@@ -17,6 +17,46 @@ This project adheres to [Semantic Versioning](http://semver.org/) and [Keep a Ch
17
17
  ### Breaks
18
18
 
19
19
 
20
+ ## 3.0.0 - (2022-02-08)
21
+ ---
22
+
23
+ ### New
24
+ * Test integration with a Rails application without sprockets
25
+ * Add support for Rails 7.0 and Ruby 3.1
26
+
27
+
28
+ ### Breaks
29
+ * Default to `public/assets/assets-manifest.json` manifest path matching new default from `webpack-assets-manifest` plugin
30
+ * Only support single manifest source file and error if not found (#9)
31
+ * Use `config.assets_manifest` as the config base to avoid conflicts in apps without sprockets (#9)
32
+ * Drop support for Ruby <2.7
33
+
34
+
35
+ ## 2.1.2 - (2021-09-05)
36
+ ---
37
+
38
+ ### Fixes
39
+ * Return correct fully qualified URLs from manifest when relative URL host or asset host is configured
40
+
41
+
42
+ ## 2.1.1 - (2021-06-20)
43
+ ---
44
+
45
+ ### Fixes
46
+ * Super method signature for keyword arguments
47
+
48
+
49
+ ## 2.1.0 - (2019-09-11)
50
+ ---
51
+
52
+ ### New
53
+ * Automatically add `crossorigin="anonymous"` for SRI resources
54
+ * Separate manifest caching and eager loading
55
+
56
+ ### Changes
57
+ * Remove defunct onboot manifest validation (f3fe8f57)
58
+
59
+
20
60
  ## 2.0.1 - (2019-08-09)
21
61
  ---
22
62
 
@@ -33,7 +73,6 @@ This project adheres to [Semantic Versioning](http://semver.org/) and [Keep a Ch
33
73
 
34
74
  ### Breaks
35
75
  * Change `manifest` configuration option into `manifests` to support multiple files
36
- * Change configuration option into to support multiple files
37
76
 
38
77
 
39
78
  ## 1.1.0 - (2019-08-08)
data/Gemfile CHANGED
@@ -5,5 +5,18 @@ source 'https://rubygems.org'
5
5
  # Load gem's dependencies
6
6
  gemspec
7
7
 
8
- gem 'rake', '~> 12.0'
8
+ gem 'net-smtp', require: false # not bundled in Ruby 3.1+
9
+ gem 'rails', require: false
10
+ gem 'sprockets-rails', require: false # not included by default in Rails 7+
11
+ gem 'sqlite3', require: false
12
+
13
+ gem 'rake', '~> 13.0'
9
14
  gem 'rspec', '~> 3.0'
15
+ gem 'rspec-rails', '~> 5.0'
16
+
17
+ gem 'pry'
18
+ gem 'rubocop-config', github: 'jgraichen/rubocop-config', ref: 'v7', require: false
19
+
20
+ group :development do
21
+ gem 'appraisal'
22
+ end
data/README.md CHANGED
@@ -1,8 +1,11 @@
1
1
  # Rails::Assets::Manifest
2
2
 
3
- Load all assets in your rails application from a `manifest.json`, e.g. generated by [webpack-assets-manifest](https://github.com/webdeveric/webpack-assets-manifest).
3
+ [![Gem Version](https://img.shields.io/gem/v/rails-assets-manifest?logo=ruby)](https://rubygems.org/gems/rails-assets-manifest)
4
+ [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/jgraichen/rails-assets-manifest/test?logo=github)](https://github.com/jgraichen/rails-assets-manifest/actions)
4
5
 
5
- This gem does not make any assumption on which tool to use to make your assets not how to configure or invoke it. It only requires a manifest JSON. The Manifest must either be a simple string map or must map to objects having a `'src'` attribute. Subresource integrity is supported too:
6
+ Load all assets in your Rails application from a `manifest.json`, e.g. generated by [webpack-assets-manifest](https://github.com/webdeveric/webpack-assets-manifest).
7
+
8
+ This gem does not make any assumption on which tool to use to make your assets not how to configure or invoke it. It only requires a manifest JSON. The manifest must either be a simple string map or must map to objects having a `'src'` attribute. Sub-resource integrity is supported too:
6
9
 
7
10
  ```json
8
11
  {
@@ -17,7 +20,7 @@ This gem does not make any assumption on which tool to use to make your assets n
17
20
  }
18
21
  ```
19
22
 
20
- This gem does not add new helper methods but extends the existing helpers. SRI is automatically added if available and within a secure context:
23
+ This gem does not add new helper methods but extends the existing helpers. SRI is automatically added if available and within a secure context. A `crossorigin="anonymous"` attribute is automatically added if non is present.
21
24
 
22
25
  ```slim
23
26
  html
@@ -27,8 +30,8 @@ html
27
30
  ```
28
31
 
29
32
  ```html
30
- <link rel="stylesheet" media="all" href="2b16adf6f756625a0194.css" integrity="sha384-/oreyvcV6U6htGZD0fDWR8/Txezke8KhD0QNgHb660hSaW7M+ZzxxuB4Vo+PuAC9">
31
- <script src="2b16adf6f756625a0194.js" integrity="sha384-iJ55fQQApbQGxWEWSbWStBabi+yNGxZSQy/010+1Dhxl+rymyhGF4NtjUkOsYv7B"></script>
33
+ <link rel="stylesheet" media="all" href="2b16adf6f756625a0194.css" integrity="sha384-/oreyvcV6U6htGZD0fDWR8/Txezke8KhD0QNgHb660hSaW7M+ZzxxuB4Vo+PuAC9" crossorigin="anonymous">
34
+ <script src="2b16adf6f756625a0194.js" integrity="sha384-iJ55fQQApbQGxWEWSbWStBabi+yNGxZSQy/010+1Dhxl+rymyhGF4NtjUkOsYv7B" crossorigin="anonymous"></script>
32
35
  ```
33
36
 
34
37
  ## Installation
@@ -41,22 +44,39 @@ gem 'rails-assets-manifest'
41
44
 
42
45
  ## Usage
43
46
 
44
- The manifest path can be configured e.g. in an environment:
47
+ The manifest path can be configured e.g. in an `environments/*.rb` file:
45
48
 
46
49
  ```ruby
47
- config.assets.manifests = %w(public/.asset-manifest.json)
50
+ config.assets_manifest.path = "public/.asset-manifest.json"
48
51
  ```
49
52
 
50
- If `config.cache_classes` is set to `true` the manifest file be loaded once on boot and raise errors if missing or invalid.
53
+ If `config.cache_classes` is set to `true` the manifest file be loaded once on boot. Assets included with `integrity: true` will raise an error if the integrity option is missing in the manifest.
51
54
 
52
- Assets included with `integrity: true` will raise an error if the integrity option is missing in the manifest.
55
+ ## Webpack Assets Manifest Example
53
56
 
54
- Multiple manifests can be loaded by specifying multiple files. Glob patterns are supported:
57
+ The following snippet provides an example configuration for the[webpack-assets-manifest](https://github.com/webdeveric/webpack-assets-manifest) plugin to generating a compatible assets manifest file.
55
58
 
56
- ```ruby
57
- config.assets.manifests = %w(public/.manifest.*.json lib/manifest.json)
59
+ ```ts
60
+ new WebpackAssetsManifest({
61
+ integrity: true,
62
+ integrityHashes: ["sha384"],
63
+ writeToDisk: true,
64
+ entrypoints: false,
65
+ entrypointsUseAssets: true,
66
+ publicPath,
67
+ // Ignore a source maps and compressed files.
68
+ customize(e) {
69
+ if (e.key.endsWith(".map") || e.key.endsWith(".gz")) {
70
+ return false;
71
+ }
72
+
73
+ return e;
74
+ },
75
+ })
58
76
  ```
59
77
 
78
+ Specifying `writeToDisk: true` allows running the `webpack-dev-server` as proxy to the Rails application, and still generate correct assets links in Rails code. `rails-assets-manifest` defaults to using `public/assets/assets-manifest.json` as the manifest path.
79
+
60
80
  ## TODO
61
81
 
62
82
  * Override/Join with `asset_host` URL?
@@ -72,7 +92,7 @@ Multiple manifests can be loaded by specifying multiple files. Glob patterns are
72
92
 
73
93
  ## MIT License
74
94
 
75
- Copyright (c) 2018 Jan Graichen
95
+ Copyright (c) 2018-2022 Jan Graichen
76
96
 
77
97
  Permission is hereby granted, free of charge, to any person obtaining a copy
78
98
  of this software and associated documentation files (the "Software"), to deal
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'rails/assets/manifest'
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.2.0"
6
+ gem "sprockets-rails", require: false
7
+ gem "net-smtp", require: false
8
+ gem "sqlite3", require: false
9
+ gem "rake", "~> 13.0"
10
+ gem "rspec", "~> 3.0"
11
+ gem "rspec-rails", "~> 5.0"
12
+ gem "rubocop", "~> 1.14"
13
+ gem "pry"
14
+
15
+ group :development do
16
+ gem "appraisal"
17
+ end
18
+
19
+ gemspec path: "../"
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.0.0"
6
+ gem "sprockets-rails", require: false
7
+ gem "net-smtp", require: false
8
+ gem "sqlite3", require: false
9
+ gem "rake", "~> 13.0"
10
+ gem "rspec", "~> 3.0"
11
+ gem "rspec-rails", "~> 5.0"
12
+ gem "rubocop", "~> 1.14"
13
+ gem "pry"
14
+
15
+ group :development do
16
+ gem "appraisal"
17
+ end
18
+
19
+ gemspec path: "../"
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.1.0"
6
+ gem "sprockets-rails", require: false
7
+ gem "net-smtp", require: false
8
+ gem "sqlite3", require: false
9
+ gem "rake", "~> 13.0"
10
+ gem "rspec", "~> 3.0"
11
+ gem "rspec-rails", "~> 5.0"
12
+ gem "rubocop", "~> 1.14"
13
+ gem "pry"
14
+
15
+ group :development do
16
+ gem "appraisal"
17
+ end
18
+
19
+ gemspec path: "../"
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 7.0.0"
6
+ gem "sprockets-rails", require: false
7
+ gem "net-smtp", require: false
8
+ gem "sqlite3", require: false
9
+ gem "rake", "~> 13.0"
10
+ gem "rspec", "~> 3.0"
11
+ gem "rspec-rails", "~> 5.0"
12
+ gem "rubocop", "~> 1.14"
13
+ gem "pry"
14
+
15
+ group :development do
16
+ gem "appraisal"
17
+ end
18
+
19
+ gemspec path: "../"
@@ -2,22 +2,44 @@
2
2
 
3
3
  module Rails::Assets::Manifest
4
4
  module Helper
5
- def compute_asset_path(name, **_kwargs)
5
+ URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}i.freeze
6
+
7
+ def path_to_asset(source, options)
8
+ if (entry = ::Rails::Assets::Manifest.lookup(path_with_extname(source, options)))
9
+ # Directly return the entry src if it is a fully qualified URL. Otherwise,
10
+ # Rails will join the URL with `relative_url_root` and/or asset host.
11
+ return entry.src if URI_REGEXP.match?(entry.src)
12
+
13
+ if entry.src[0] == '/'
14
+ # When the asset name starts with a slash, Rails will skip an
15
+ # additional lookup via `#compute_asset_path` and directly use the
16
+ # provided path. As we already have looked up the manifest entry here,
17
+ # we can pass the entry source, but only *if* it starts with a slash.
18
+ return super entry.src, options
19
+ end
20
+ end
21
+
22
+ super
23
+ end
24
+
25
+ def compute_asset_path(name, _options)
6
26
  ::Rails::Assets::Manifest.lookup!(name).src
7
- rescue EntryMissing => e
27
+ rescue EntryMissing
8
28
  return super if Rails::Assets::Manifest.passthrough?
29
+
9
30
  raise
10
31
  end
11
32
 
12
- def asset_integrity(name, **kwargs)
13
- ::Rails::Assets::Manifest.lookup!(path_with_extname(name, **kwargs)).integrity
14
- rescue EntryMissing => e
33
+ def asset_integrity(name, options)
34
+ ::Rails::Assets::Manifest.lookup!(path_with_extname(name, options)).integrity
35
+ rescue EntryMissing
15
36
  return super if Rails::Assets::Manifest.passthrough?
37
+
16
38
  raise
17
39
  end
18
40
 
19
41
  def javascript_include_tag(*sources, integrity: nil, **kwargs)
20
- return super(*sources, **kwargs) unless compute_integrity?(integrity)
42
+ return super(*sources, **kwargs) unless manifest_use_integrity?(integrity)
21
43
 
22
44
  with_integrity(sources, integrity, :javascript, **kwargs) do |source, options|
23
45
  super(source, options)
@@ -25,7 +47,7 @@ module Rails::Assets::Manifest
25
47
  end
26
48
 
27
49
  def stylesheet_link_tag(*sources, integrity: nil, **kwargs)
28
- return super(*sources, **kwargs) unless compute_integrity?(integrity)
50
+ return super(*sources, **kwargs) unless manifest_use_integrity?(integrity)
29
51
 
30
52
  with_integrity(sources, integrity, :stylesheet, **kwargs) do |source, options|
31
53
  super(source, options)
@@ -34,38 +56,43 @@ module Rails::Assets::Manifest
34
56
 
35
57
  private
36
58
 
37
- def compute_integrity?(option)
38
- return false unless secure_subresource_integrity_context?
59
+ def manifest_use_integrity?(option)
60
+ return false unless secure_request_context?
39
61
 
40
62
  option || option.nil?
41
63
  end
42
64
 
65
+ # http://www.w3.org/TR/SRI/#non-secure-contexts-remain-non-secure
66
+ def secure_request_context?
67
+ respond_to?(:request) && request && (request.local? || request.ssl?)
68
+ end
69
+
43
70
  def with_integrity(sources, required, type, **kwargs)
44
71
  sources.map do |source|
45
72
  path = path_with_extname(source, type: type, **kwargs)
46
73
 
47
74
  # integrity hash passed directly
48
75
  if required.is_a?(String)
49
- next yield(source, integrity: required, **kwargs)
76
+ next yield(source, integrity: required, crossorigin: 'anonymous', **kwargs)
77
+ end
50
78
 
51
79
  # Explicit passed `true` option
52
- elsif required
80
+ if required
53
81
  integrity = asset_integrity(source, type: type, **kwargs)
54
82
 
55
- if !integrity
56
- raise IntegrityMissing.new "SRI missing for #{path}"
57
- end
83
+ raise IntegrityMissing.new "SRI missing for #{path}" unless integrity
58
84
 
59
- next yield(source, integrity: integrity, **kwargs)
85
+ next yield(source, integrity: integrity, crossorigin: 'anonymous', **kwargs)
86
+ end
60
87
 
61
88
  # No integrity option passed or `nil` default from above
62
- elsif required.nil?
89
+ if required.nil?
63
90
  entry = ::Rails::Assets::Manifest.lookup(path)
64
91
 
65
92
  # Only if it is an asset from our manifest and there is an integrity
66
93
  # we default to adding one
67
- if(entry && entry.integrity)
68
- next yield(source, integrity: entry.integrity, **kwargs)
94
+ if entry && entry.integrity
95
+ next yield(source, integrity: entry.integrity, crossorigin: 'anonymous', **kwargs)
69
96
  end
70
97
  end
71
98
 
@@ -73,10 +100,6 @@ module Rails::Assets::Manifest
73
100
  end.join.html_safe
74
101
  end
75
102
 
76
- def secure_subresource_integrity_context?
77
- respond_to?(:request) && (request&.local? || request&.ssl?)
78
- end
79
-
80
103
  def path_with_extname(path, options)
81
104
  path = path.to_s
82
105
  "#{path}#{compute_asset_extname(path, options)}"
@@ -4,11 +4,9 @@ module Rails::Assets::Manifest
4
4
  class Manifest
5
5
  attr_reader :path
6
6
 
7
- def initialize(files:, cache: true)
8
- @files = Array(files).flatten.each(&:freeze).freeze
7
+ def initialize(path, cache: true)
8
+ @path = Rails.root.join(path).to_s.freeze
9
9
  @cache = cache
10
-
11
- data if cache?
12
10
  end
13
11
 
14
12
  def cache?
@@ -22,7 +20,7 @@ module Rails::Assets::Manifest
22
20
  def lookup!(name)
23
21
  lookup(name) || begin
24
22
  raise EntryMissing.new <<~ERROR
25
- Can't find #{name} in #{path}. Your manifests contain:
23
+ Can't find #{name} in #{path}. Your manifest contain:
26
24
  #{JSON.pretty_generate(data.keys)}
27
25
  ERROR
28
26
  end
@@ -32,6 +30,10 @@ module Rails::Assets::Manifest
32
30
  data.key?(name.to_s)
33
31
  end
34
32
 
33
+ def eager_load!
34
+ data
35
+ end
36
+
35
37
  private
36
38
 
37
39
  Entry = Struct.new(:src, :integrity) do
@@ -48,13 +50,9 @@ module Rails::Assets::Manifest
48
50
  end
49
51
  end
50
52
 
51
- def files
52
- @files.map {|path| Dir.glob(path) }.flatten
53
- end
54
-
55
53
  def load
56
- files.each_with_object({}) do |file, entries|
57
- JSON.parse(File.read(file)).each_pair do |key, entry|
54
+ {}.tap do |entries|
55
+ JSON.parse(File.read(path)).each_pair do |key, entry|
58
56
  if entry.is_a?(String)
59
57
  entries[key] = Entry.new(entry, nil)
60
58
  elsif entry.is_a?(Hash) && entry.key?('src')
@@ -68,7 +66,7 @@ module Rails::Assets::Manifest
68
66
  raise ManifestMissing.new <<~ERROR
69
67
  Asset manifest does not exist: #{e}
70
68
  ERROR
71
- rescue => e
69
+ rescue StandardError => e
72
70
  raise ManifestInvalid.new <<~ERROR
73
71
  Asset manifest could not be loaded: #{e}
74
72
  ERROR
@@ -4,48 +4,27 @@ module Rails
4
4
  module Assets
5
5
  module Manifest
6
6
  class Railtie < ::Rails::Railtie
7
- # If this plugin is used with sprockets this option
8
- # already exists and must not be overriden. Otherwise
9
- # all sprockets default options are removed breaking
10
- # sprockets.
11
- unless config.respond_to?(:assets)
12
- config.assets = ::ActiveSupport::OrderedOptions.new
13
- end
7
+ config.assets_manifest = ::ActiveSupport::OrderedOptions.new
14
8
 
15
- # Path where the manifest files are loaded from.
16
- config.assets.manifests = ['public/assets/manifest.json']
9
+ # Path where the manifest file is loaded from.
10
+ config.assets_manifest.path = 'public/assets/assets-manifest.json'
17
11
 
18
- # If set to true missing assets will not raise an
19
- # exception but are passed through to sprockets
20
- # or rails own asset methods.
21
- config.assets.passthrough = false
12
+ # If set to true missing assets will not raise an exception but are
13
+ # passed through to sprockets or rails own asset methods.
14
+ config.assets_manifest.passthrough = false
22
15
 
23
16
  config.after_initialize do |_|
24
17
  ActiveSupport.on_load(:action_view) do
25
- include Helper
18
+ prepend Helper
26
19
  end
27
20
  end
28
21
 
29
- initializer 'rails-assets-manifest' do |app|
30
- ::Rails::Assets::Manifest.instance if server?
31
- end
32
-
33
- private
34
-
35
- def server?
36
- !(console? || generator? || rake?)
37
- end
38
-
39
- def console?
40
- defined?(Rails::Console)
41
- end
42
-
43
- def generator?
44
- defined?(Rails::Generators)
22
+ config.to_prepare do
23
+ ::Rails::Assets::Manifest.prepare!
45
24
  end
46
25
 
47
- def rake?
48
- File.basename($0) == "rake"
26
+ config.before_eager_load do
27
+ ::Rails::Assets::Manifest.eager_load!
49
28
  end
50
29
  end
51
30
  end
@@ -4,12 +4,12 @@ module Rails
4
4
  module Assets
5
5
  module Manifest
6
6
  module VERSION
7
- MAJOR = 2
7
+ MAJOR = 3
8
8
  MINOR = 0
9
- PATCH = 1
9
+ PATCH = 0
10
10
  STAGE = nil
11
11
 
12
- STRING = [MAJOR, MINOR, PATCH, STAGE].reject(&:nil?).join('.')
12
+ STRING = [MAJOR, MINOR, PATCH, STAGE].compact.join('.')
13
13
 
14
14
  def self.to_s
15
15
  STRING
@@ -13,25 +13,37 @@ module Rails
13
13
  require 'rails/assets/manifest/railtie' if defined?(Rails::Railtie)
14
14
 
15
15
  class ManifestMissing < StandardError; end
16
+
16
17
  class ManifestInvalid < StandardError; end
18
+
17
19
  class EntryMissing < StandardError; end
20
+
18
21
  class IntegrityMissing < StandardError; end
19
22
 
20
23
  class << self
21
24
  delegate :lookup, :lookup!, to: :instance
22
25
 
23
- def instance
24
- @instance ||= begin
26
+ attr_reader :instance
27
+
28
+ def prepare!
29
+ @instance = begin
25
30
  config = Rails.application.config
26
31
 
27
- Manifest.new \
28
- files: config.assets.manifests,
29
- cache: config.cache_classes
32
+ Manifest.new(
33
+ config.assets_manifest.path,
34
+ cache: config.cache_classes,
35
+ )
30
36
  end
31
37
  end
32
38
 
39
+ def eager_load!
40
+ return unless @instance
41
+
42
+ @instance.eager_load!
43
+ end
44
+
33
45
  def passthrough?
34
- Rails.application.config.assets.passthrough
46
+ Rails.application.config.assets_manifest.passthrough
35
47
  end
36
48
  end
37
49
  end
@@ -14,9 +14,10 @@ Gem::Specification.new do |spec|
14
14
  spec.description = 'Load all rails assets from an external manifest.'
15
15
  spec.homepage = 'https://github.com/jgraichen/rails-assets-manifest'
16
16
 
17
- spec.metadata['homepage_uri'] = spec.homepage
18
- spec.metadata['source_code_uri'] = 'https://github.com/jgraichen/rails-assets-manifest'
19
- spec.metadata['changelog_uri'] = 'https://github.com/jgraichen/rails-assets-manifest/blob/master/CHANGELOG.md'
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/jgraichen/rails-assets-manifest'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/jgraichen/rails-assets-manifest/blob/master/CHANGELOG.md'
20
+ spec.metadata['rubygems_mfa_required'] = 'true'
20
21
 
21
22
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
23
  `git ls-files -z`.split("\x0").reject do |f|
@@ -28,6 +29,8 @@ Gem::Specification.new do |spec|
28
29
  spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
29
30
  spec.require_paths = ['lib']
30
31
 
32
+ spec.required_ruby_version = '>= 2.7.0'
33
+
31
34
  spec.add_dependency 'activesupport', '> 4.2'
32
35
  spec.add_dependency 'railties', '> 4.2'
33
36
 
data/renovate.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": ["config:base", "schedule:earlyMondays"]
3
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-assets-manifest
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Graichen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-09 00:00:00.000000000 Z
11
+ date: 2022-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -60,10 +60,11 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - ".editorconfig"
63
+ - ".github/workflows/test.yml"
63
64
  - ".gitignore"
64
65
  - ".rspec"
65
66
  - ".rubocop.yml"
66
- - ".travis.yml"
67
+ - Appraisals
67
68
  - CHANGELOG.md
68
69
  - Gemfile
69
70
  - LICENSE
@@ -71,23 +72,24 @@ files:
71
72
  - Rakefile
72
73
  - bin/console
73
74
  - bin/setup
74
- - gemfiles/rails-4-2.gemfile
75
- - gemfiles/rails-5-0.gemfile
76
- - gemfiles/rails-5-1.gemfile
77
- - gemfiles/rails-5-2.gemfile
78
- - gemfiles/rails-master.gemfile
75
+ - gemfiles/rails_5.2.gemfile
76
+ - gemfiles/rails_6.0.gemfile
77
+ - gemfiles/rails_6.1.gemfile
78
+ - gemfiles/rails_7.0.gemfile
79
79
  - lib/rails/assets/manifest.rb
80
80
  - lib/rails/assets/manifest/helper.rb
81
81
  - lib/rails/assets/manifest/manifest.rb
82
82
  - lib/rails/assets/manifest/railtie.rb
83
83
  - lib/rails/assets/manifest/version.rb
84
84
  - rails-assets-manifest.gemspec
85
+ - renovate.json
85
86
  homepage: https://github.com/jgraichen/rails-assets-manifest
86
87
  licenses: []
87
88
  metadata:
88
89
  homepage_uri: https://github.com/jgraichen/rails-assets-manifest
89
90
  source_code_uri: https://github.com/jgraichen/rails-assets-manifest
90
91
  changelog_uri: https://github.com/jgraichen/rails-assets-manifest/blob/master/CHANGELOG.md
92
+ rubygems_mfa_required: 'true'
91
93
  post_install_message:
92
94
  rdoc_options: []
93
95
  require_paths:
@@ -96,14 +98,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
98
  requirements:
97
99
  - - ">="
98
100
  - !ruby/object:Gem::Version
99
- version: '0'
101
+ version: 2.7.0
100
102
  required_rubygems_version: !ruby/object:Gem::Requirement
101
103
  requirements:
102
104
  - - ">="
103
105
  - !ruby/object:Gem::Version
104
106
  version: '0'
105
107
  requirements: []
106
- rubygems_version: 3.0.3
108
+ rubygems_version: 3.3.3
107
109
  signing_key:
108
110
  specification_version: 4
109
111
  summary: Load all rails assets from an external manifest.
data/.travis.yml DELETED
@@ -1,37 +0,0 @@
1
- dist: xenial
2
- language: ruby
3
- cache: bundler
4
-
5
- rvm:
6
- - 2.6.3
7
- - 2.5.5
8
-
9
- gemfile:
10
- - gemfiles/rails-5-2.gemfile
11
- - gemfiles/rails-master.gemfile
12
-
13
- before_install:
14
- - gem update --system
15
- - gem install bundler
16
-
17
- script:
18
- - bundle exec rspec spec
19
-
20
- jobs:
21
- allow_failures:
22
- - gemfile: gemfiles/rails-master.gemfile
23
-
24
- include:
25
- - stage: Release
26
- rvm: 2.6.3
27
- env: []
28
- script: skip
29
- install: skip
30
- deploy:
31
- provider: rubygems
32
- api_key:
33
- secure: m5gUzb8J40lo4EJ2xE8XwoeHq4S3ZEDE+AyikDHzGKc5NEQQcCRoc469UlDO7fYfBHGKLh2eEe6+e/T+dyRE/C0qE/tfd6pVWf8xdyzt9+rB0zM3k7pR2Aud2hZ8NFF4bAQ28OvQ2y9pWWLVS9Bn/C0Xou951yZM+vufPVZpX7+08Aw+ZdPQrmg+v9SxsvWElm/is0CMjsHxpEy1vpyyBlF/DhNpHgd+69nupyTuZP8bg3lirZexek0xNaccNpflmrUeRwE7yofVGMfrRhvm5kOniYI+sQl/Zwru9+hK2WaSzfX/ou4ENihiLDGo5gdWeYcyLbS61yQARsRn21cN6SA0iYVuVnAruHC3uoxRh7ty1H8s3aUJnPTnnBj5cnfP9pqOyZI8zFi54CujkEFbRVLlWfGjKtCScgFBwkpXS5aB6CBplulMrX3kz/jYXFgodXLsV10WD725WGJ2Jkb52PoT5i2GyA/Ao746s7+wPIEV/l8NAurcroSHOzr9PcAUG/CwdzgidSnLfwl+qplMCGaUHtdHkPaRHqJL9j4BmcqoGVMaU0a4mAXsrlJG/drT2PMMrREKChtnQPtWg3L9HHDHBIKuXZCIQ7G9n2Dz7lpWnyKZKjJTcFyZWbbnKHLXlE1KDBUiG9qqrYbpky+IEPUt4jZ1W8hx4tKGjNlNwjU=
34
- gem: rails-assets-manifest
35
- on:
36
- tags: true
37
- repo: jgraichen/rails-assets-manifest
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Load root Gemfile
6
- eval_gemfile '../Gemfile'
7
-
8
- gem 'activesupport', '~> 4.2.0'
9
- gem 'railties', '~> 4.2.0'
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Load root Gemfile
6
- eval_gemfile '../Gemfile'
7
-
8
- gem 'activesupport', '~> 5.0.0'
9
- gem 'railties', '~> 5.0.0'
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Load root Gemfile
6
- eval_gemfile '../Gemfile'
7
-
8
- gem 'activesupport', '~> 5.1.0'
9
- gem 'railties', '~> 5.1.0'
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Load root Gemfile
6
- eval_gemfile '../Gemfile'
7
-
8
- gem 'activesupport', '~> 5.2.0'
9
- gem 'railties', '~> 5.2.0'
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- # Load root Gemfile
6
- eval_gemfile '../Gemfile'
7
-
8
- gem 'activesupport', git: 'https://github.com/rails/rails'
9
- gem 'railties', git: 'https://github.com/rails/rails'