propshaft 0.9.1 → 1.0.0

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: 196e08be5355cc2d0083425ec483ccf07f462643e81ef7e7768e69323bb4331b
4
- data.tar.gz: 2eb14827138ff9ac43c131f2cfb90c79b36cae05c6e7ec8b465be11d9bdf566a
3
+ metadata.gz: 9bdd01776a4cf66e324271ccb59f41d8473b2863c75ace4d2d75f7295e2fad36
4
+ data.tar.gz: c1e8d1e3a3bfaee8ee77bd53b760bc272df4d25f4fc4c494eb14e99bc125acd9
5
5
  SHA512:
6
- metadata.gz: ca96acf2a13e721aa5d30e197bc98c787d6f2e3b978be337e995af90cd6242ead4031dc5d954d353db50020674a649326b97b9041c5973727c201326d134067c
7
- data.tar.gz: e4aa381ac0a65f6f17cd40a798f48965423933f7adbd707d4a644fbf03426555ee49aa55ae95de0c69334afa88f88697141c29134a3a1b2b2d117c2fda089bfb
6
+ metadata.gz: fddd9f7d38b01958b449f966143894f065d8a0c35a51dcd0b5234230daf3ac7897107289af615f6484d253f883d6c2c5351a6281b1fd0f9465efd3df0d92e6ad
7
+ data.tar.gz: 26f5105052b942c55f41f6f049eb3e28c1200231a51edad58c41645b936f51fbe98721ae1823b2ec293243c369cadb657368be4afee35747450fb01d948cee93
@@ -19,8 +19,8 @@ class Propshaft::Assembly
19
19
  end
20
20
 
21
21
  def resolver
22
- @resolver ||= if manifest_path.exist?
23
- Propshaft::Resolver::Static.new manifest_path: manifest_path, prefix: config.prefix
22
+ @resolver ||= if config.manifest_path.exist?
23
+ Propshaft::Resolver::Static.new manifest_path: config.manifest_path, prefix: config.prefix
24
24
  else
25
25
  Propshaft::Resolver::Dynamic.new load_path: load_path, prefix: config.prefix
26
26
  end
@@ -32,7 +32,7 @@ class Propshaft::Assembly
32
32
 
33
33
  def processor
34
34
  Propshaft::Processor.new \
35
- load_path: load_path, output_path: config.output_path, compilers: compilers
35
+ load_path: load_path, output_path: config.output_path, compilers: compilers, manifest_path: config.manifest_path
36
36
  end
37
37
 
38
38
  def compilers
@@ -51,9 +51,4 @@ class Propshaft::Assembly
51
51
  asset.send(path_type)
52
52
  end
53
53
  end
54
-
55
- private
56
- def manifest_path
57
- config.output_path.join(Propshaft::Processor::MANIFEST_FILENAME)
58
- end
59
54
  end
@@ -4,12 +4,21 @@ require "action_dispatch/http/mime_type"
4
4
  class Propshaft::Asset
5
5
  attr_reader :path, :logical_path, :load_path
6
6
 
7
+ class << self
8
+ def extract_path_and_digest(digested_path)
9
+ digest = digested_path[/-([0-9a-zA-Z]{7,128})\.(?!digested)([^.]|.map)+\z/, 1]
10
+ path = digest ? digested_path.sub("-#{digest}", "") : digested_path
11
+
12
+ [path, digest]
13
+ end
14
+ end
15
+
7
16
  def initialize(path, logical_path:, load_path:)
8
17
  @path, @logical_path, @load_path = path, Pathname.new(logical_path), load_path
9
18
  end
10
19
 
11
- def content
12
- File.binread(path)
20
+ def content(encoding: "ASCII-8BIT")
21
+ File.read(path, encoding: encoding)
13
22
  end
14
23
 
15
24
  def content_type
@@ -26,7 +26,7 @@ class Propshaft::OutputPath
26
26
  Hash.new.tap do |files|
27
27
  all_files_from_tree(path).each do |file|
28
28
  digested_path = file.relative_path_from(path)
29
- logical_path, digest = extract_path_and_digest(digested_path)
29
+ logical_path, digest = Propshaft::Asset.extract_path_and_digest(digested_path.to_s)
30
30
 
31
31
  files[digested_path.to_s] = {
32
32
  logical_path: logical_path.to_s,
@@ -42,7 +42,7 @@ class Propshaft::OutputPath
42
42
  modified_at = [ 0, Time.now - mtime ].max
43
43
  modified_at < expires_at || limit < count
44
44
  end
45
-
45
+
46
46
  def remove(path)
47
47
  FileUtils.rm(@path.join(path))
48
48
  Propshaft.logger.info "Removed #{path}"
@@ -51,11 +51,4 @@ class Propshaft::OutputPath
51
51
  def all_files_from_tree(path)
52
52
  path.children.flat_map { |child| child.directory? ? all_files_from_tree(child) : child }
53
53
  end
54
-
55
- def extract_path_and_digest(digested_path)
56
- digest = digested_path.to_s[/-([0-9a-f]{7,128})\.(?!digested)[^.]+\z/, 1]
57
- path = digest ? digested_path.sub("-#{digest}", "") : digested_path
58
-
59
- [path, digest]
60
- end
61
54
  end
@@ -1,12 +1,11 @@
1
1
  require "propshaft/output_path"
2
2
 
3
3
  class Propshaft::Processor
4
- MANIFEST_FILENAME = ".manifest.json"
4
+ attr_reader :load_path, :output_path, :compilers, :manifest_path
5
5
 
6
- attr_reader :load_path, :output_path, :compilers
7
-
8
- def initialize(load_path:, output_path:, compilers:)
6
+ def initialize(load_path:, output_path:, compilers:, manifest_path:)
9
7
  @load_path, @output_path = load_path, output_path
8
+ @manifest_path = manifest_path
10
9
  @compilers = compilers
11
10
  end
12
11
 
@@ -31,7 +30,8 @@ class Propshaft::Processor
31
30
 
32
31
 
33
32
  def write_manifest
34
- File.open(output_path.join(MANIFEST_FILENAME), "wb+") do |manifest|
33
+ FileUtils.mkdir_p(File.dirname(manifest_path))
34
+ File.open(manifest_path, "wb+") do |manifest|
35
35
  manifest.write load_path.manifest.to_json
36
36
  end
37
37
  end
@@ -34,6 +34,7 @@ module Propshaft
34
34
  config.assets.relative_url_root ||= app.config.relative_url_root
35
35
  config.assets.output_path ||=
36
36
  Pathname.new(File.join(app.config.paths["public"].first, app.config.assets.prefix))
37
+ config.assets.manifest_path ||= config.assets.output_path.join(".manifest.json")
37
38
 
38
39
  app.assets = Propshaft::Assembly.new(app.config.assets)
39
40
 
@@ -12,9 +12,9 @@ module Propshaft::Resolver
12
12
  end
13
13
  end
14
14
 
15
- def read(logical_path)
15
+ def read(logical_path, options = {})
16
16
  if asset = load_path.find(logical_path)
17
- asset.content
17
+ asset.content(**options)
18
18
  end
19
19
  end
20
20
  end
@@ -12,9 +12,9 @@ module Propshaft::Resolver
12
12
  end
13
13
  end
14
14
 
15
- def read(logical_path)
15
+ def read(logical_path, encoding: "ASCII-8BIT")
16
16
  if asset_path = parsed_manifest[logical_path]
17
- manifest_path.dirname.join(asset_path).read
17
+ File.read(manifest_path.dirname.join(asset_path), encoding: encoding)
18
18
  end
19
19
  end
20
20
 
@@ -35,10 +35,8 @@ class Propshaft::Server
35
35
  private
36
36
  def extract_path_and_digest(env)
37
37
  full_path = Rack::Utils.unescape(env["PATH_INFO"].to_s.sub(/^\//, ""))
38
- digest = full_path[/-([0-9a-zA-Z]{7,128})\.(?!digested)([^.]|.map)+\z/, 1]
39
- path = digest ? full_path.sub("-#{digest}", "") : full_path
40
38
 
41
- [ path, digest ]
39
+ Propshaft::Asset.extract_path_and_digest(full_path)
42
40
  end
43
41
 
44
42
  if Gem::Version.new(Rack::RELEASE) < Gem::Version.new("3")
@@ -1,3 +1,3 @@
1
1
  module Propshaft
2
- VERSION = "0.9.1"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: propshaft
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-12 00:00:00.000000000 Z
11
+ date: 2024-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  - !ruby/object:Gem::Version
115
115
  version: '0'
116
116
  requirements: []
117
- rubygems_version: 3.5.17
117
+ rubygems_version: 3.5.16
118
118
  signing_key:
119
119
  specification_version: 4
120
120
  summary: Deliver assets for Rails.