propshaft 0.9.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: 0cec588585c21b06e765dbf70ac6f0d3a4b9ad2826c8a11120553a8db0931559
4
- data.tar.gz: dde9f2d2a7095731ea93585e237421b73adc4acc71218ef574e566468796d1eb
3
+ metadata.gz: 9bdd01776a4cf66e324271ccb59f41d8473b2863c75ace4d2d75f7295e2fad36
4
+ data.tar.gz: c1e8d1e3a3bfaee8ee77bd53b760bc272df4d25f4fc4c494eb14e99bc125acd9
5
5
  SHA512:
6
- metadata.gz: c372a207074f656261b8be407d224780678fd68e6caf645323c898ca06cb04f4cc0e1b2ab2ac2d59179162bb3a6c1e137297635aef8c49d1a0e4b3d279e609c6
7
- data.tar.gz: 80c3963e4963ae52b19793b8de066a173b1227a5b6ea1d1ff4420f88b1939a09f2a476fd55e52a4a18fe688c53bc0862756700723557a108d052441ade893259
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,12 +34,13 @@ 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
 
40
41
  if config.assets.server
41
42
  app.routes.prepend do
42
- mount app.assets.server => app.assets.config.prefix
43
+ mount app.assets.server, at: app.assets.config.prefix
43
44
  end
44
45
  end
45
46
 
@@ -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)[^.]+\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.0"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/propshaft.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "active_support"
2
2
  require "active_support/core_ext/module/attribute_accessors"
3
+ require "active_support/core_ext/module/delegation"
3
4
  require "logger"
4
5
 
5
6
  module Propshaft
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.0
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-05-21 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.10
117
+ rubygems_version: 3.5.16
118
118
  signing_key:
119
119
  specification_version: 4
120
120
  summary: Deliver assets for Rails.