sprockets 4.0.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -2
  3. data/MIT-LICENSE +21 -0
  4. data/README.md +103 -19
  5. data/lib/rake/sprocketstask.rb +6 -2
  6. data/lib/sprockets/add_source_map_comment_to_asset_processor.rb +1 -1
  7. data/lib/sprockets/asset.rb +23 -6
  8. data/lib/sprockets/base.rb +2 -2
  9. data/lib/sprockets/bower.rb +1 -1
  10. data/lib/sprockets/bundle.rb +1 -1
  11. data/lib/sprockets/cache/memory_store.rb +20 -11
  12. data/lib/sprockets/cache.rb +1 -1
  13. data/lib/sprockets/cached_environment.rb +11 -11
  14. data/lib/sprockets/coffee_script_processor.rb +2 -2
  15. data/lib/sprockets/configuration.rb +2 -2
  16. data/lib/sprockets/context.rb +2 -1
  17. data/lib/sprockets/dependencies.rb +1 -1
  18. data/lib/sprockets/digest_utils.rb +10 -13
  19. data/lib/sprockets/directive_processor.rb +19 -1
  20. data/lib/sprockets/eco_processor.rb +1 -1
  21. data/lib/sprockets/ejs_processor.rb +1 -1
  22. data/lib/sprockets/erb_processor.rb +8 -2
  23. data/lib/sprockets/exporters/base.rb +2 -3
  24. data/lib/sprockets/exporting.rb +2 -2
  25. data/lib/sprockets/loader.rb +5 -3
  26. data/lib/sprockets/manifest.rb +8 -7
  27. data/lib/sprockets/npm.rb +1 -1
  28. data/lib/sprockets/path_utils.rb +1 -1
  29. data/lib/sprockets/processing.rb +1 -1
  30. data/lib/sprockets/processor_utils.rb +4 -3
  31. data/lib/sprockets/sass_processor.rb +1 -1
  32. data/lib/sprockets/sassc_processor.rb +1 -1
  33. data/lib/sprockets/server.rb +30 -20
  34. data/lib/sprockets/source_map_processor.rb +1 -1
  35. data/lib/sprockets/source_map_utils.rb +4 -4
  36. data/lib/sprockets/uri_utils.rb +1 -1
  37. data/lib/sprockets/utils.rb +24 -16
  38. data/lib/sprockets/version.rb +1 -1
  39. data/lib/sprockets.rb +4 -1
  40. metadata +15 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cbc5f0a881069d09632a087bb32f43c8e5d01a631f2ff6fbc6e776e3695bd51c
4
- data.tar.gz: 580922aaccc4defd65fdf239b441f7e8e96216d98dae8fdfe0a64afc3b40a4bc
3
+ metadata.gz: 3c5995147a647a6d47d625b6cc9f10586506f3832cff0070985ec9560ee3fc0d
4
+ data.tar.gz: 1befd6f705efbef88f05dc58b38f719f11b445f76c60a95f854a43ef8e84c21d
5
5
  SHA512:
6
- metadata.gz: f474ef02d068783020ae4a3833bded8783d1a1bfa1ee5ae106dd7e8dfbcf12723c8582155cb44c0594b0c36bcad476b7139814f2577fa2e25a82ad6675763dc4
7
- data.tar.gz: 853bbac33f50b2097126190c01bdc182306b7aa7132d50b91248efd1dcc1b7a35863fa1a5e529eacc8d967ee9d2de8083ae68b72e02889e01a821d794d0ad147
6
+ metadata.gz: 9d47aea08307515c8a0fab29615fbde5f892c91300668afd83b2739032adeb77794d4303e6ecb56c570bc784695d25304f7481fa45c4ab7bbe0727281ee7deab
7
+ data.tar.gz: 6d0f0b116766053d96402f5d88602374829ef9610160bd8398a093db33ceaafe31a2f2b33a8d0c615769f0bbba7c39d867db90dfded9bc5ff35d0c0ff4482e36
data/CHANGELOG.md CHANGED
@@ -2,7 +2,40 @@
2
2
 
3
3
  Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprockets/blob/master/UPGRADING.md
4
4
 
5
- ## Master
5
+ ## 4.2.0
6
+
7
+ - Rack 3 compatibility. [#758](https://github.com/rails/sprockets/pull/758)
8
+ - Fix thread safety of `Sprockets::CachedEnvironment` and `Sprockets::Cache::MemoryStore`. [#771](https://github.com/rails/sprockets/pull/771)
9
+ - Add support for Rack 3.0. Headers set by sprockets will now be lower case. [#758](https://github.com/rails/sprockets/pull/758)
10
+ - Make `Sprockets::Utils.module_include` thread safe on JRuby. [#759](https://github.com/rails/sprockets/pull/759)
11
+
12
+ ## 4.1.0
13
+
14
+ - Allow age to be altered in asset:clean rake task.
15
+ - Fix `Sprockets::Server` to return lower-cased response headers to comply with Rack::Lint 3.0. [#744](https://github.com/rails/sprockets/pull/744)
16
+ - Adding new directive `depend_on_directory` [#668](https://github.com/rails/sprockets/pull/668)
17
+ - Fix `application/js-sourcemap+json` charset [#669](https://github.com/rails/sprockets/pull/669)
18
+ - Fix `CachedEnvironment` caching nil values [#723](https://github.com/rails/sprockets/pull/723)
19
+ - Process `*.jst.ejs.erb` files with ERBProcessor [#674](https://github.com/rails/sprockets/pull/674)
20
+ - Fix cache key for coffee script processor to be dependent on the filename [#670](https://github.com/rails/sprockets/pull/670)
21
+
22
+ ## 4.0.3
23
+
24
+ - Fix `Manifest#find` yielding from a Promise causing issue on Ruby 3.1.0-dev. [#720](https://github.com/rails/sprockets/pull/720)
25
+ - Better detect the ERB version to avoid deprecation warnings. [#719](https://github.com/rails/sprockets/pull/719)
26
+ - Allow assets already fingerprinted to be served through `Sprockets::Server`
27
+ - Do not fingerprint files that already contain a valid digest in their name
28
+ - Remove remaining support for Ruby < 2.4.[#672](https://github.com/rails/sprockets/pull/672)
29
+
30
+ ## 4.0.2
31
+
32
+ - Fix `etag` and digest path compilation that were generating string with invalid digest since 4.0.1.
33
+
34
+ ## 4.0.1
35
+
36
+ - Fix for Ruby 2.7 keyword arguments warning in `base.rb`. [#660](https://github.com/rails/sprockets/pull/660)
37
+ - Fix for when `x_sprockets_linecount` is missing from a source map.
38
+ - Fix subresource integrity to match the digest of the asset.
6
39
 
7
40
  ## 4.0.0
8
41
 
@@ -15,7 +48,7 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprocket
15
48
 
16
49
  ## 4.0.0.beta9
17
50
 
18
- - Minimum Ruby version for Sprockets 4 is now 2.5+ which matches minimum ruby verision of Rails [#604]
51
+ - Minimum Ruby version for Sprockets 4 is now 2.5+ which matches minimum ruby version of Rails [#604]
19
52
  - Fix threading bug introduced in Sprockets 4 [#603]
20
53
  - Warn when two potential manifest files exist. [#560]
21
54
 
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2014-2019 Sam Stephenson
2
+ Copyright (c) 2014-2019 Joshua Peek
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -115,10 +115,11 @@ Here is a list of the available directives:
115
115
  - [`require_self`](#require_self) - Change order of where current contents are concatenated to current
116
116
  - [`require_directory`](#require_directory) - Add contents of each file in a folder to current
117
117
  - [`require_tree`](#require_tree) - Add contents of all files in all directories in a path to current
118
- - [`link`](#link) - Make target file compile and be publically available without adding contents to current
119
- - [`link_directory`](#link_directory) - Make target directory compile and be publically available without adding contents to current
120
- - [`link_tree`](#link_tree) - Make target tree compile and be publically available without adding contents to current
118
+ - [`link`](#link) - Make target file compile and be publicly available without adding contents to current
119
+ - [`link_directory`](#link_directory) - Make target directory compile and be publicly available without adding contents to current
120
+ - [`link_tree`](#link_tree) - Make target tree compile and be publicly available without adding contents to current
121
121
  - [`depend_on`](#depend_on) - Recompile current file if target has changed
122
+ - [`depend_on_directory`](#depend_on_directory) - Recompile current file if any files in target directory has changed
122
123
  - [`stub`](#stub) - Ignore target file
123
124
 
124
125
  You can see what each of these does below.
@@ -239,7 +240,7 @@ The first time this file is compiled the `application.js` output will be written
239
240
 
240
241
  So, if `b.js` changes it will get recompiled. However instead of having to recompile the other files from `a.js` to `z.js` since they did not change, we can use the prior intermediary files stored in the cached values . If these files were expensive to generate, then this "partial" asset cache strategy can save a lot of time.
241
242
 
242
- Directives such as `require`, `link`, and `depend_on` tell Sprockets what assets need to be re-compiled when a file changes. Files are considered "fresh" based on their mtime on disk and a combination of cache keys.
243
+ Directives such as `require`, `link`, `depend_on`, and `depend_on_directory` tell Sprockets what assets need to be re-compiled when a file changes. Files are considered "fresh" based on their mtime on disk and a combination of cache keys.
243
244
 
244
245
  On Rails you can force a "clean" install by clearing the `public/assets` and `tmp/cache/assets` directories.
245
246
 
@@ -363,37 +364,78 @@ directory specified by *path*.
363
364
  ### link
364
365
 
365
366
  `link` *path* declares a dependency on the target *path* and adds it to a list
366
- of subdependencies to automatically be compiled when the asset is written out to
367
+ of subdependencies to be compiled when the asset is written out to
367
368
  disk.
368
369
 
369
370
  Example:
370
371
 
371
- If you've got a `manifest.js` file and you want to explicitly make sure an `admin.js` file is
372
- generated and made available to the public you can link it like this:
372
+ If you've got a `manifest.js` file and you want to specify that a `admin.js` source file should be
373
+ generated and made available to the public you can link it by including this in the `manifest.js` file:
373
374
 
374
375
  ```
375
376
  //= link admin.js
376
377
  ```
377
378
 
379
+ The argument to `link` is a _logical path_, that is it will be resolved according to the
380
+ configured asset load paths. See [Accessing Assets](#accessing-assets) above. A path relative to
381
+ the current file won't work, it must be a logical path.
382
+
383
+ **Caution**: the "link" directive should always have an explicit extension on the end.
384
+
385
+ `link` can also be used to include manifest files from mounted Rails engines:
386
+
387
+ ```
388
+ //= link my_engine_manifest
389
+ ```
390
+
391
+ This would find a manifest file at `my_engine/app/assets/config/my_engine_manifest.js` and include its directives.
392
+
378
393
  ### link_directory
379
394
 
380
- `link_directory` *path* links all the files inside the directory specified by the *path*
395
+ `link_directory` *path* links all the files inside the directory specified by the *path*. By "link", we mean they are specified as compilation targets to be written out to disk, and made available to be served to user-agents.
396
+
397
+ Files in subdirectories will not be linked (Compare to [link_tree](#link_tree)).
398
+
399
+ The *path* argument to `link_directory` is _not_ a logical path (it does not use the asset load paths), but is a path relative to the file the `link_directory` directive is found in, and can use `..` to . For instance, you might want:
400
+
401
+ ```js
402
+ //= link_directory ../stylesheets
403
+ ```
404
+
405
+ `link_directory` can take an optional second argument with an extension or content-type, with the
406
+ two arguments separated by a space:
407
+
408
+ ```js
409
+ //= link_directory ../stylesheets text/css
410
+ //= link_directory ../more_stylesheets .css
411
+ ```
412
+
413
+ This will limit the matching files to link to only files recognized as that type. An extension is
414
+ just a shortcut for the type referenced, it does not need to match the source file exactly, but
415
+ instead identifies the content-type the source file must be recognized as.
381
416
 
382
417
  ### link_tree
383
418
 
384
- `link_tree` *path* works like `link_directory`, but operates
419
+ `link_tree` *path* works like [link_directory](#link_directory), but operates
385
420
  recursively to link all files in all subdirectories of the
386
421
  directory specified by *path*.
387
422
 
388
423
  Example:
389
424
 
390
- You can specify a file extension so any extra files will be ignored:
425
+ ```js
426
+ //= link_tree ./path/to/folder
427
+ ```
428
+
429
+ Like `link_directory`, the argument is path relative to the current file, it is *not* a 'logical path' tresolved against load paths.
430
+
431
+
432
+ As with `link_directory`, you can also specify a second argument -- separated by a space -- so any extra files not matching the content-type specified will be ignored:
391
433
 
392
434
  ```js
393
- //= link_tree ./path/to/folder .js
435
+ //= link_tree ./path/to/folder text/javascript
436
+ //= link_tree ./path/to/other_folder .js
394
437
  ```
395
438
 
396
- > Note: There is an intentional space between the path and the extension
397
439
 
398
440
  ### depend_on
399
441
 
@@ -412,11 +454,53 @@ you need to tell sprockets that it needs to re-compile the file if `bar.data` ch
412
454
  var bar = '<%= File.read("bar.data") %>'
413
455
  ```
414
456
 
457
+ To depend on an entire directory containing multiple files, use `depend_on_directory`
458
+
415
459
  ### depend_on_asset
416
460
 
417
461
  `depend_on_asset` *path* works like `depend_on`, but operates
418
462
  recursively reading the file and following the directives found. This is automatically implied if you use `link`, so consider if it just makes sense using `link` instead of `depend_on_asset`.
419
463
 
464
+ ### depend_on_directory
465
+
466
+ `depend_on_directory` *path* declares all files in the given *path* without
467
+ including them in the bundle. This is useful when you need to expire an
468
+ asset's cache in response to a change in multiple files in a single directory.
469
+
470
+ All paths are relative to your declaration and must begin with `./`
471
+
472
+ Also, your must include these directories in your [load path](guides/building_an_asset_processing_framework.md#the-load-path).
473
+
474
+ **Example:**
475
+
476
+ If we've got a directory called `data` with files `a.data` and `b.data`
477
+
478
+ ```
479
+ // ./data/a.data
480
+ A
481
+ ```
482
+
483
+ ```
484
+ // ./data/b.data
485
+ B
486
+ ```
487
+
488
+ ```
489
+ // ./file.js.erb
490
+ //= depend_on_directory ./data
491
+ var a = '<% File.read('data/a.data') %>'
492
+ var b = '<% File.read('data/b.data') %>'
493
+ ```
494
+
495
+ Would produce:
496
+
497
+ ```js
498
+ var a = "A";
499
+ var b = "B";
500
+ ```
501
+
502
+ You can also see [Index files are proxies for folders](#index-files-are-proxies-for-folders) for another method of organizing folders that will give you more control.
503
+
420
504
  ### stub
421
505
 
422
506
  `stub` *path* excludes that asset and its dependencies from the asset bundle.
@@ -441,7 +525,7 @@ Generated files are cached. If you're using an `ENV` var then
441
525
  when you change then ENV var the asset will be forced to
442
526
  recompile. This behavior is only true for environment variables,
443
527
  if you are pulling a value from somewhere else, such as a database,
444
- must manually invalidate the cache to see the change.
528
+ you must manually invalidate the cache to see the change.
445
529
 
446
530
  If you're using Rails, there are helpers you can use such as `asset_url`
447
531
  that will cause a recompile if the value changes.
@@ -458,9 +542,9 @@ When you modify the `logo.png` on disk, it will force `application.css` to be
458
542
  recompiled so that the fingerprint will be correct in the generated asset.
459
543
 
460
544
  You can manually make sprockets depend on any other file that is generated
461
- by sprockets by using the `depend_on` directive. Rails implements the above
462
- feature by auto calling `depend_on` on the original asset when the `asset_url`
463
- is used inside of an asset.
545
+ by sprockets by using the `depend_on` or `depend_on_directory` directive. Rails
546
+ implements the above feature by auto calling `depend_on` on the original asset
547
+ when the `asset_url` is used inside of an asset.
464
548
 
465
549
  ### Styling with Sass and SCSS
466
550
 
@@ -573,19 +657,19 @@ Several JavaScript and CSS minifiers are available through shorthand.
573
657
  In Rails you will specify them with:
574
658
 
575
659
  ```ruby
576
- config.assets.js_compressor = :uglify
660
+ config.assets.js_compressor = :terser
577
661
  config.assets.css_compressor = :scss
578
662
  ```
579
663
 
580
664
  If you're not using Rails, configure this directly on the "environment".
581
665
 
582
666
  ``` ruby
583
- environment.js_compressor = :uglify
667
+ environment.js_compressor = :terser
584
668
  environment.css_compressor = :scss
585
669
  ```
586
670
 
587
671
  If you are using Sprockets directly with a Rack app, don't forget to add
588
- the `uglifier` and `sass` gems to your Gemfile when using above options.
672
+ the `terser` and `sass` gems to your Gemfile when using above options.
589
673
 
590
674
  ### Gzip
591
675
 
@@ -69,9 +69,12 @@ module Rake
69
69
  #
70
70
  attr_accessor :assets
71
71
 
72
- # Number of old assets to keep.
72
+ # Minimum number of old assets to keep. See Sprockets::Manifest#clean for more information.
73
73
  attr_accessor :keep
74
74
 
75
+ # Assets created within this age will be kept. See Sprockets::Manifest#clean for more information.
76
+ attr_accessor :age
77
+
75
78
  # Logger to use during rake tasks. Defaults to using stderr.
76
79
  #
77
80
  # t.logger = Logger.new($stdout)
@@ -103,6 +106,7 @@ module Rake
103
106
  @logger = Logger.new($stderr)
104
107
  @logger.level = Logger::INFO
105
108
  @keep = 2
109
+ @age = 3600
106
110
 
107
111
  yield self if block_given?
108
112
 
@@ -130,7 +134,7 @@ module Rake
130
134
  desc name == :assets ? "Clean old assets" : "Clean old #{name} assets"
131
135
  task "clean_#{name}" do
132
136
  with_logger do
133
- manifest.clean(keep)
137
+ manifest.clean(keep, age)
134
138
  end
135
139
  end
136
140
 
@@ -14,7 +14,7 @@ module Sprockets
14
14
  # information that is needed to build a source map file.
15
15
  #
16
16
  # To add this comment we must have an asset we can link to.
17
- # To do this we ensure that the original aset is loaded, then
17
+ # To do this we ensure that the original asset is loaded, then
18
18
  # we use a use a special mime type. For example `application/js-sourcemap+json`
19
19
  # for a JS source map.
20
20
  #
@@ -6,7 +6,7 @@ module Sprockets
6
6
  class Asset
7
7
  attr_reader :logical_path
8
8
 
9
- # Private: Intialize Asset wrapper from attributes Hash.
9
+ # Private: Initialize Asset wrapper from attributes Hash.
10
10
  #
11
11
  # Asset wrappers should not be initialized directly, only
12
12
  # Environment#find_asset should vend them.
@@ -38,7 +38,7 @@ module Sprockets
38
38
  #
39
39
  # The API status of the keys is dependent on the pipeline processors
40
40
  # itself. So some values maybe considered public and others internal.
41
- # See the pipeline proccessor documentation itself.
41
+ # See the pipeline processor documentation itself.
42
42
  #
43
43
  # Returns Hash.
44
44
  attr_reader :metadata
@@ -53,7 +53,7 @@ module Sprockets
53
53
 
54
54
  # Public: Internal URI to lookup asset by.
55
55
  #
56
- # NOT a publically accessible URL.
56
+ # NOT a publicly accessible URL.
57
57
  #
58
58
  # Returns URI.
59
59
  attr_reader :uri
@@ -64,7 +64,11 @@ module Sprockets
64
64
  #
65
65
  # Returns String.
66
66
  def digest_path
67
- logical_path.sub(/\.(\w+)$/) { |ext| "-#{etag}#{ext}" }
67
+ if DigestUtils.already_digested?(@name)
68
+ logical_path
69
+ else
70
+ logical_path.sub(/\.(\w+)$/) { |ext| "-#{etag}#{ext}" }
71
+ end
68
72
  end
69
73
 
70
74
  # Public: Return load path + logical path with digest spliced in.
@@ -123,13 +127,26 @@ module Sprockets
123
127
  metadata[:digest]
124
128
  end
125
129
 
130
+ # Private: Return the version of the environment where the asset was generated.
131
+ def environment_version
132
+ metadata[:environment_version]
133
+ end
134
+
126
135
  # Public: Returns String hexdigest of source.
127
136
  def hexdigest
128
137
  DigestUtils.pack_hexdigest(digest)
129
138
  end
130
139
 
131
140
  # Pubic: ETag String of Asset.
132
- alias_method :etag, :hexdigest
141
+ def etag
142
+ version = environment_version
143
+
144
+ if version && version != ""
145
+ DigestUtils.hexdigest(version + digest)
146
+ else
147
+ DigestUtils.pack_hexdigest(digest)
148
+ end
149
+ end
133
150
 
134
151
  # Public: Returns String base64 digest of source.
135
152
  def base64digest
@@ -138,7 +155,7 @@ module Sprockets
138
155
 
139
156
  # Public: A "named information" URL for subresource integrity.
140
157
  def integrity
141
- DigestUtils.integrity_uri(metadata[:digest])
158
+ DigestUtils.integrity_uri(digest)
142
159
  end
143
160
 
144
161
  # Public: Add enumerator to allow `Asset` instances to be used as Rack
@@ -115,8 +115,8 @@ module Sprockets
115
115
  #
116
116
  # environment['application.js']
117
117
  #
118
- def [](*args)
119
- find_asset(*args)
118
+ def [](*args, **options)
119
+ find_asset(*args, **options)
120
120
  end
121
121
 
122
122
  # Find asset by logical path or expanded path.
@@ -13,7 +13,7 @@ module Sprockets
13
13
  # load_path - String environment path
14
14
  # logical_path - String path relative to base
15
15
  #
16
- # Returns candiate filenames.
16
+ # Returns candidate filenames.
17
17
  def resolve_alternates(load_path, logical_path)
18
18
  candidates, deps = super
19
19
 
@@ -10,7 +10,7 @@ module Sprockets
10
10
  # Uses pipeline metadata:
11
11
  #
12
12
  # :required - Ordered Set of asset URIs to prepend
13
- # :stubbed - Set of asset URIs to substract from the required set.
13
+ # :stubbed - Set of asset URIs to subtract from the required set.
14
14
  #
15
15
  # Also see DirectiveProcessor.
16
16
  class Bundle
@@ -22,6 +22,7 @@ module Sprockets
22
22
  def initialize(max_size = DEFAULT_MAX_SIZE)
23
23
  @max_size = max_size
24
24
  @cache = {}
25
+ @mutex = Mutex.new
25
26
  end
26
27
 
27
28
  # Public: Retrieve value from cache.
@@ -32,12 +33,14 @@ module Sprockets
32
33
  #
33
34
  # Returns Object or nil or the value is not set.
34
35
  def get(key)
35
- exists = true
36
- value = @cache.delete(key) { exists = false }
37
- if exists
38
- @cache[key] = value
39
- else
40
- nil
36
+ @mutex.synchronize do
37
+ exists = true
38
+ value = @cache.delete(key) { exists = false }
39
+ if exists
40
+ @cache[key] = value
41
+ else
42
+ nil
43
+ end
41
44
  end
42
45
  end
43
46
 
@@ -50,9 +53,11 @@ module Sprockets
50
53
  #
51
54
  # Returns Object value.
52
55
  def set(key, value)
53
- @cache.delete(key)
54
- @cache[key] = value
55
- @cache.shift if @cache.size > @max_size
56
+ @mutex.synchronize do
57
+ @cache.delete(key)
58
+ @cache[key] = value
59
+ @cache.shift if @cache.size > @max_size
60
+ end
56
61
  value
57
62
  end
58
63
 
@@ -60,14 +65,18 @@ module Sprockets
60
65
  #
61
66
  # Returns String.
62
67
  def inspect
63
- "#<#{self.class} size=#{@cache.size}/#{@max_size}>"
68
+ @mutex.synchronize do
69
+ "#<#{self.class} size=#{@cache.size}/#{@max_size}>"
70
+ end
64
71
  end
65
72
 
66
73
  # Public: Clear the cache
67
74
  #
68
75
  # Returns true
69
76
  def clear(options=nil)
70
- @cache.clear
77
+ @mutex.synchronize do
78
+ @cache.clear
79
+ end
71
80
  true
72
81
  end
73
82
  end
@@ -62,7 +62,7 @@ module Sprockets
62
62
  # Internal: Wrap a backend cache store.
63
63
  #
64
64
  # Always assign a backend cache store instance to Environment#cache= and
65
- # use Environment#cache to retreive a wrapped interface.
65
+ # use Environment#cache to retrieve a wrapped interface.
66
66
  #
67
67
  # cache - A compatible backend cache store instance.
68
68
  def initialize(cache = nil, logger = self.class.default_logger)
@@ -4,7 +4,7 @@ require 'sprockets/base'
4
4
  module Sprockets
5
5
  # `CachedEnvironment` is a special cached version of `Environment`.
6
6
  #
7
- # The expection is that all of its file system methods are cached
7
+ # The exception is that all of its file system methods are cached
8
8
  # for the instances lifetime. This makes `CachedEnvironment` much faster. This
9
9
  # behavior is ideal in production environments where the file system
10
10
  # is immutable.
@@ -16,11 +16,11 @@ module Sprockets
16
16
  initialize_configuration(environment)
17
17
 
18
18
  @cache = environment.cache
19
- @stats = {}
20
- @entries = {}
21
- @uris = {}
22
- @processor_cache_keys = {}
23
- @resolved_dependencies = {}
19
+ @stats = Concurrent::Map.new
20
+ @entries = Concurrent::Map.new
21
+ @uris = Concurrent::Map.new
22
+ @processor_cache_keys = Concurrent::Map.new
23
+ @resolved_dependencies = Concurrent::Map.new
24
24
  end
25
25
 
26
26
  # No-op return self as cached environment.
@@ -31,27 +31,27 @@ module Sprockets
31
31
 
32
32
  # Internal: Cache Environment#entries
33
33
  def entries(path)
34
- @entries[path] ||= super(path)
34
+ @entries.fetch_or_store(path) { super(path) }
35
35
  end
36
36
 
37
37
  # Internal: Cache Environment#stat
38
38
  def stat(path)
39
- @stats[path] ||= super(path)
39
+ @stats.fetch_or_store(path) { super(path) }
40
40
  end
41
41
 
42
42
  # Internal: Cache Environment#load
43
43
  def load(uri)
44
- @uris[uri] ||= super(uri)
44
+ @uris.fetch_or_store(uri) { super(uri) }
45
45
  end
46
46
 
47
47
  # Internal: Cache Environment#processor_cache_key
48
48
  def processor_cache_key(str)
49
- @processor_cache_keys[str] ||= super(str)
49
+ @processor_cache_keys.fetch_or_store(str) { super(str) }
50
50
  end
51
51
 
52
52
  # Internal: Cache Environment#resolve_dependency
53
53
  def resolve_dependency(str)
54
- @resolved_dependencies[str] ||= super(str)
54
+ @resolved_dependencies.fetch_or_store(str) { super(str) }
55
55
  end
56
56
 
57
57
  private
@@ -6,7 +6,7 @@ module Sprockets
6
6
  # Processor engine class for the CoffeeScript compiler.
7
7
  # Depends on the `coffee-script` and `coffee-script-source` gems.
8
8
  #
9
- # For more infomation see:
9
+ # For more information see:
10
10
  #
11
11
  # https://github.com/rails/ruby-coffee-script
12
12
  #
@@ -20,7 +20,7 @@ module Sprockets
20
20
  def self.call(input)
21
21
  data = input[:data]
22
22
 
23
- js, map = input[:cache].fetch([self.cache_key, data]) do
23
+ js, map = input[:cache].fetch([self.cache_key, data, input[:filename]]) do
24
24
  result = Autoload::CoffeeScript.compile(
25
25
  data,
26
26
  sourceMap: "v3",
@@ -59,9 +59,9 @@ module Sprockets
59
59
 
60
60
  # Deprecated: Assign a `Digest` implementation class. This maybe any Ruby
61
61
  # `Digest::` implementation such as `Digest::SHA256` or
62
- # `Digest::MD5`.
62
+ # `Digest::SHA512`.
63
63
  #
64
- # environment.digest_class = Digest::MD5
64
+ # environment.digest_class = Digest::SHA512
65
65
  #
66
66
  def digest_class=(klass)
67
67
  self.config = config.merge(digest_class: klass).freeze
@@ -2,6 +2,7 @@
2
2
  require 'rack/utils'
3
3
  require 'set'
4
4
  require 'sprockets/errors'
5
+ require 'delegate'
5
6
 
6
7
  module Sprockets
7
8
  # They are typically accessed by ERB templates. You can mix in custom helpers
@@ -210,7 +211,7 @@ module Sprockets
210
211
  #
211
212
  # NOTE: This helper is currently not implemented and should be
212
213
  # customized by the application. Though, in the future, some
213
- # basics implemention may be provided with different methods that
214
+ # basic implementation may be provided with different methods that
214
215
  # are required to be overridden.
215
216
  def asset_path(path, options = {})
216
217
  message = <<-EOS
@@ -40,7 +40,7 @@ module Sprockets
40
40
  end
41
41
  end
42
42
 
43
- # Public: Add environmental dependency inheirted by all assets.
43
+ # Public: Add environmental dependency inherited by all assets.
44
44
  #
45
45
  # uri - String dependency URI
46
46
  #