sprockets 3.0.0.beta.6 → 3.0.0.beta.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +171 -100
  3. data/lib/rake/sprocketstask.rb +2 -2
  4. data/lib/sprockets.rb +69 -63
  5. data/lib/sprockets/asset.rb +2 -61
  6. data/lib/sprockets/autoload_processor.rb +48 -0
  7. data/lib/sprockets/base.rb +4 -6
  8. data/lib/sprockets/bower.rb +8 -5
  9. data/lib/sprockets/bundle.rb +9 -13
  10. data/lib/sprockets/cache.rb +19 -14
  11. data/lib/sprockets/cache/file_store.rb +2 -1
  12. data/lib/sprockets/cached_environment.rb +15 -68
  13. data/lib/sprockets/closure_compressor.rb +17 -4
  14. data/lib/sprockets/coffee_script_processor.rb +26 -0
  15. data/lib/sprockets/coffee_script_template.rb +3 -20
  16. data/lib/sprockets/compressing.rb +10 -4
  17. data/lib/sprockets/configuration.rb +21 -37
  18. data/lib/sprockets/context.rb +37 -67
  19. data/lib/sprockets/dependencies.rb +73 -0
  20. data/lib/sprockets/digest_utils.rb +8 -2
  21. data/lib/sprockets/directive_processor.rb +122 -165
  22. data/lib/sprockets/eco_processor.rb +32 -0
  23. data/lib/sprockets/eco_template.rb +3 -26
  24. data/lib/sprockets/ejs_processor.rb +31 -0
  25. data/lib/sprockets/ejs_template.rb +3 -25
  26. data/lib/sprockets/encoding_utils.rb +9 -21
  27. data/lib/sprockets/engines.rb +25 -27
  28. data/lib/sprockets/environment.rb +9 -1
  29. data/lib/sprockets/erb_processor.rb +30 -0
  30. data/lib/sprockets/erb_template.rb +3 -20
  31. data/lib/sprockets/file_reader.rb +15 -0
  32. data/lib/sprockets/http_utils.rb +2 -0
  33. data/lib/sprockets/jst_processor.rb +9 -2
  34. data/lib/sprockets/legacy.rb +212 -3
  35. data/lib/sprockets/legacy_tilt_processor.rb +1 -1
  36. data/lib/sprockets/loader.rb +95 -89
  37. data/lib/sprockets/manifest.rb +23 -59
  38. data/lib/sprockets/mime.rb +28 -41
  39. data/lib/sprockets/path_dependency_utils.rb +76 -0
  40. data/lib/sprockets/path_utils.rb +21 -1
  41. data/lib/sprockets/paths.rb +23 -8
  42. data/lib/sprockets/processing.rb +102 -91
  43. data/lib/sprockets/processor_utils.rb +97 -0
  44. data/lib/sprockets/resolve.rb +110 -97
  45. data/lib/sprockets/sass_cache_store.rb +2 -2
  46. data/lib/sprockets/sass_compressor.rb +17 -4
  47. data/lib/sprockets/sass_functions.rb +2 -2
  48. data/lib/sprockets/sass_importer.rb +2 -2
  49. data/lib/sprockets/sass_processor.rb +305 -0
  50. data/lib/sprockets/sass_template.rb +4 -286
  51. data/lib/sprockets/server.rb +1 -13
  52. data/lib/sprockets/transformers.rb +62 -25
  53. data/lib/sprockets/uglifier_compressor.rb +17 -4
  54. data/lib/sprockets/uri_utils.rb +190 -0
  55. data/lib/sprockets/utils.rb +87 -6
  56. data/lib/sprockets/version.rb +1 -1
  57. data/lib/sprockets/yui_compressor.rb +17 -4
  58. metadata +14 -5
  59. data/lib/sprockets/asset_uri.rb +0 -80
  60. data/lib/sprockets/lazy_processor.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8efcdd68f447ff7e005fe4edd68eaae03f06f1d6
4
- data.tar.gz: d0b92f39df358468d6039d3d1bb08970d271a733
3
+ metadata.gz: d55da847286c101c972d4726a09af4abb94d5580
4
+ data.tar.gz: 1a5ffd86bcfafcf7524efc61224b2e95a4bd2633
5
5
  SHA512:
6
- metadata.gz: 6819d688dd19334c5f09ba24e3399fcb2a8cf5c233e6be75450d8fdeb909abfc356c68dc0a38203e07bc6a8aa636e6ccaa1868a1396fd346d5145405806ca580
7
- data.tar.gz: c8d3438168908e7f72ca0f4fe68669ed3d91c237e4712be6c43970de7ccd87d5178acf7171abcbde28d448bcdf1a0c7cd73b52122abe299cbb53ddb274d7fc67
6
+ metadata.gz: 74bd05cb90faa8f43acbfaa7d68678d4dec71dda98a752c60a8889e3374881690aef1b414e86a3180fe843411185943339d3393d62d1e4d93c8effbb13bce094
7
+ data.tar.gz: c60422ed4c47b110be53585ffd66b7b8dc1080b3321585471c57cb38eedbc1d5c39272247cc4662888fa985559da2e3575bdeed9ca0b3fe404a54103802ac53f
data/README.md CHANGED
@@ -5,20 +5,26 @@ It features declarative dependency management for JavaScript and CSS
5
5
  assets, as well as a powerful preprocessor pipeline that allows you to
6
6
  write assets in languages like CoffeeScript, Sass and SCSS.
7
7
 
8
- # Installation #
8
+
9
+ ## Installation
9
10
 
10
11
  Install Sprockets from RubyGems:
11
12
 
12
- $ gem install sprockets
13
+ ``` sh
14
+ $ gem install sprockets
15
+ ```
13
16
 
14
17
  Or include it in your project's `Gemfile` with Bundler:
15
18
 
16
- gem 'sprockets', '~> 3.0'
19
+ ``` ruby
20
+ gem 'sprockets', '~> 3.0'
21
+ ```
22
+
17
23
 
18
- # Understanding the Sprockets Environment #
24
+ ## Understanding the Sprockets Environment
19
25
 
20
26
  You'll need an instance of the `Sprockets::Environment` class to
21
- access and serve assets from your application. Under Rails 3.1 and
27
+ access and serve assets from your application. Under Rails 4.0 and
22
28
  later, `YourApp::Application.assets` is a preconfigured
23
29
  `Sprockets::Environment` instance. For Rack-based applications, create
24
30
  an instance in `config.ru`.
@@ -28,7 +34,7 @@ assets, manipulating the load path, and registering processors. It is
28
34
  also a Rack application that can be mounted at a URL to serve assets
29
35
  over HTTP.
30
36
 
31
- ## The Load Path ##
37
+ ### The Load Path
32
38
 
33
39
  The *load path* is an ordered list of directories that Sprockets uses
34
40
  to search for assets.
@@ -42,29 +48,31 @@ The power of the load path is that it lets you organize your source
42
48
  files into multiple directories -- even directories that live outside
43
49
  your application -- and combine those directories into a single
44
50
  virtual filesystem. That means you can easily bundle JavaScript, CSS
45
- and images into a Ruby library and import them into your application.
51
+ and images into a Ruby library or [Bower](http://bower.io) package and import them into your application.
46
52
 
47
- ### Manipulating the Load Path ###
53
+ #### Manipulating the Load Path
48
54
 
49
55
  To add a directory to your environment's load path, use the
50
56
  `append_path` and `prepend_path` methods. Directories at the beginning
51
57
  of the load path have precedence over subsequent directories.
52
58
 
53
- environment = Sprockets::Environment.new
54
- environment.append_path 'app/assets/javascripts'
55
- environment.append_path 'lib/assets/javascripts'
56
- environment.append_path 'vendor/assets/jquery'
59
+ ``` ruby
60
+ environment = Sprockets::Environment.new
61
+ environment.append_path 'app/assets/javascripts'
62
+ environment.append_path 'lib/assets/javascripts'
63
+ environment.append_path 'vendor/assets/bower_components'
64
+ ```
57
65
 
58
66
  In general, you should append to the path by default and reserve
59
67
  prepending for cases where you need to override existing assets.
60
68
 
61
- ## Accessing Assets ##
69
+ ### Accessing Assets
62
70
 
63
71
  Once you've set up your environment's load path, you can mount the
64
72
  environment as a Rack server and request assets via HTTP. You can also
65
73
  access assets programmatically from within your application.
66
74
 
67
- ### Logical Paths ###
75
+ #### Logical Paths
68
76
 
69
77
  Assets in Sprockets are always referenced by their *logical path*.
70
78
 
@@ -90,7 +98,7 @@ contains the directory `app/assets/javascripts`:
90
98
  In this way, all directories in the load path are merged to create a
91
99
  virtual filesystem whose entries are logical paths.
92
100
 
93
- ### Serving Assets Over HTTP ###
101
+ #### Serving Assets Over HTTP
94
102
 
95
103
  When you mount an environment, all of its assets are accessible as
96
104
  logical paths underneath the *mount point*. For example, if you mount
@@ -98,48 +106,48 @@ your environment at `/assets` and request the URL
98
106
  `/assets/application.js`, Sprockets will search your load path for the
99
107
  file named `application.js` and serve it.
100
108
 
101
- Under Rails 3.1 and later, your Sprockets environment is automatically
109
+ Under Rails 4.0 and later, your Sprockets environment is automatically
102
110
  mounted at `/assets`. If you are using Sprockets with a Rack
103
111
  application, you will need to mount the environment yourself. A good
104
112
  way to do this is with the `map` method in `config.ru`:
105
113
 
106
- require 'sprockets'
107
- map '/assets' do
108
- environment = Sprockets::Environment.new
109
- environment.append_path 'app/assets/javascripts'
110
- environment.append_path 'app/assets/stylesheets'
111
- run environment
112
- end
113
-
114
- map '/' do
115
- run YourRackApp
116
- end
114
+ ``` ruby
115
+ require 'sprockets'
116
+ map '/assets' do
117
+ environment = Sprockets::Environment.new
118
+ environment.append_path 'app/assets/javascripts'
119
+ environment.append_path 'app/assets/stylesheets'
120
+ run environment
121
+ end
122
+
123
+ map '/' do
124
+ run YourRackApp
125
+ end
126
+ ```
117
127
 
118
- ### Accessing Assets Programmatically ###
128
+ #### Accessing Assets Programmatically
119
129
 
120
130
  You can use the `find_asset` method (aliased as `[]`) to retrieve an
121
131
  asset from a Sprockets environment. Pass it a logical path and you'll
122
- get a `Sprockets::BundledAsset` instance back:
132
+ get a `Sprockets::Asset` instance back:
123
133
 
124
- environment['application.js']
125
- # => #<Sprockets::BundledAsset ...>
134
+ ``` ruby
135
+ environment['application.js']
136
+ # => #<Sprockets::Asset ...>
137
+ ```
126
138
 
127
139
  Call `to_s` on the resulting asset to access its contents, `length` to
128
140
  get its length in bytes, `mtime` to query its last-modified time, and
129
141
  `filename` to get its full path on the filesystem.
130
142
 
131
- # Using Engines #
132
143
 
133
- Asset source files can be written in another language, like SCSS or
134
- CoffeeScript, and automatically compiled to CSS or JavaScript by
135
- Sprockets. Compilers for these languages are called *engines*.
144
+ ## Using Processors
136
145
 
137
- Engines are specified by additional extensions on the asset source
138
- filename. For example, a CSS file written in SCSS might have the name
139
- `layout.css.scss`, while a JavaScript file written in CoffeeScript
140
- might have the name `dialog.js.coffee`.
146
+ Asset source files can be written in another format, like SCSS or
147
+ CoffeeScript, and automatically compiled to CSS or JavaScript by
148
+ Sprockets. Processors that convert a file from one format to another are called *transformers*.
141
149
 
142
- ## Minifying Assets ##
150
+ ### Minifying Assets
143
151
 
144
152
  Several JavaScript and CSS minifiers are available through shorthand.
145
153
 
@@ -148,7 +156,7 @@ environment.js_compressor = :uglify
148
156
  environment.css_compressor = :scss
149
157
  ```
150
158
 
151
- ## Styling with Sass and SCSS ##
159
+ ### Styling with Sass and SCSS
152
160
 
153
161
  [Sass](http://sass-lang.com/) is a language that compiles to CSS and
154
162
  adds features like nested rules, variables, mixins and selector
@@ -158,10 +166,10 @@ If the `sass` gem is available to your application, you can use Sass
158
166
  to write CSS assets in Sprockets.
159
167
 
160
168
  Sprockets supports both Sass syntaxes. For the original
161
- whitespace-sensitive syntax, use the extension `.css.sass`. For the
162
- new SCSS syntax, use the extension `.css.scss`.
169
+ whitespace-sensitive syntax, use the extension `.sass`. For the
170
+ new SCSS syntax, use the extension `.scss`.
163
171
 
164
- ## Scripting with CoffeeScript ##
172
+ ### Scripting with CoffeeScript
165
173
 
166
174
  [CoffeeScript](http://jashkenas.github.com/coffee-script/) is a
167
175
  language that compiles to the "good parts" of JavaScript, featuring a
@@ -175,9 +183,9 @@ an [ExecJS](https://github.com/sstephenson/execjs)-supported runtime
175
183
  on your system to invoke it.
176
184
 
177
185
  To write JavaScript assets with CoffeeScript, use the extension
178
- `.js.coffee`.
186
+ `.coffee`.
179
187
 
180
- ## JavaScript Templating with EJS and Eco ##
188
+ ### JavaScript Templating with EJS and Eco
181
189
 
182
190
  Sprockets supports *JavaScript templates* for client-side rendering of
183
191
  strings or markup. JavaScript templates have the special format
@@ -188,12 +196,14 @@ logical path as a property on the global `JST` object. Invoke a
188
196
  template function to render the template as a string. The resulting
189
197
  string can then be inserted into the DOM.
190
198
 
191
- <!-- templates/hello.jst.ejs -->
192
- <div>Hello, <span><%= name %></span>!</div>
199
+ ```
200
+ <!-- templates/hello.jst.ejs -->
201
+ <div>Hello, <span><%= name %></span>!</div>
193
202
 
194
- // application.js
195
- //= require templates/hello
196
- $("#hello").html(JST["templates/hello"]({ name: "Sam" }));
203
+ // application.js
204
+ //= require templates/hello
205
+ $("#hello").html(JST["templates/hello"]({ name: "Sam" }));
206
+ ```
197
207
 
198
208
  Sprockets supports two JavaScript template languages:
199
209
  [EJS](https://github.com/sstephenson/ruby-ejs), for embedded
@@ -210,17 +220,12 @@ templates have the extension `.jst.eco`. Note that the `eco` gem
210
220
  depends on the CoffeeScript compiler, so the same caveats apply as
211
221
  outlined above for the CoffeeScript engine.
212
222
 
213
- ## Invoking Ruby with ERB ##
223
+ ### Invoking Ruby with ERB
214
224
 
215
225
  Sprockets provides an ERB engine for preprocessing assets using
216
226
  embedded Ruby code. Append `.erb` to a CSS or JavaScript asset's
217
227
  filename to enable the ERB engine.
218
228
 
219
- **Note**: Sprockets processes multiple engine extensions in order from
220
- right to left, so you can use multiple engines with a single
221
- asset. For example, to have a CoffeeScript asset that is first
222
- preprocessed with ERB, use the extension `.js.coffee.erb`.
223
-
224
229
  Ruby code embedded in an asset is evaluated in the context of a
225
230
  `Sprockets::Context` instance for the given asset. Common uses for ERB
226
231
  include:
@@ -236,13 +241,8 @@ include:
236
241
  See the [Helper Methods](lib/sprockets/context.rb) section for more information about
237
242
  interacting with `Sprockets::Context` instances via ERB.
238
243
 
239
- ### String Interpolation Syntax ###
240
-
241
- If you need access to Ruby from an asset but cannot use ERB's `<% …
242
- %>` syntax, Sprockets also supports Ruby string interpolation syntax
243
- (`#{ … }`) with the `.str` engine extension.
244
244
 
245
- # Managing and Bundling Dependencies #
245
+ ## Managing and Bundling Dependencies
246
246
 
247
247
  You can create *asset bundles* -- ordered concatenations of asset
248
248
  source files -- by specifying dependencies in a special comment syntax
@@ -253,16 +253,18 @@ them to recursively build a dependency graph. When you request an
253
253
  asset with dependencies, the dependencies will be included in order at
254
254
  the top of the file.
255
255
 
256
- ## The Directive Processor ##
256
+ ### The Directive Processor
257
257
 
258
258
  Sprockets runs the *directive processor* on each CSS and JavaScript
259
259
  source file. The directive processor scans for comment lines beginning
260
260
  with `=` in comment blocks at the top of the file.
261
261
 
262
- //= require jquery
263
- //= require jquery-ui
264
- //= require backbone
265
- //= require_tree .
262
+ ``` js
263
+ //= require jquery
264
+ //= require jquery-ui
265
+ //= require backbone
266
+ //= require_tree .
267
+ ```
266
268
 
267
269
  The first word immediately following `=` specifies the directive
268
270
  name. Any words following the directive name are treated as
@@ -274,21 +276,27 @@ contain spaces, similar to commands in the Unix shell.
274
276
  processing. Sprockets will not look for directives in comment blocks
275
277
  that occur after the first line of code.
276
278
 
277
- ### Supported Comment Types ###
279
+ #### Supported Comment Types
278
280
 
279
281
  The directive processor understands comment blocks in three formats:
280
282
 
281
- /* Multi-line comment blocks (CSS, SCSS, JavaScript)
282
- *= require foo
283
- */
283
+ ``` css
284
+ /* Multi-line comment blocks (CSS, SCSS, JavaScript)
285
+ *= require foo
286
+ */
287
+ ```
284
288
 
285
- // Single-line comment blocks (SCSS, JavaScript)
286
- //= require foo
289
+ ``` js
290
+ // Single-line comment blocks (SCSS, JavaScript)
291
+ //= require foo
292
+ ```
287
293
 
288
- # Single-line comment blocks (CoffeeScript)
289
- #= require foo
294
+ ``` coffee
295
+ # Single-line comment blocks (CoffeeScript)
296
+ #= require foo
297
+ ```
290
298
 
291
- ## Sprockets Directives ##
299
+ ### Sprockets Directives
292
300
 
293
301
  You can use the following directives to declare dependencies in asset
294
302
  source files.
@@ -297,7 +305,7 @@ For directives that take a *path* argument, you may specify either a
297
305
  logical path or a relative path. Relative paths begin with `./` and
298
306
  reference files relative to the location of the current file.
299
307
 
300
- ### The `require` Directive ###
308
+ #### The `require` Directive
301
309
 
302
310
  `require` *path* inserts the contents of the asset source file
303
311
  specified by *path*. If the file is required multiple times, it will
@@ -309,35 +317,35 @@ appear in the bundle only once.
309
317
  format in the directory specified by *path*. Files are required in
310
318
  alphabetical order.
311
319
 
312
- ### The `require_tree` Directive ###
320
+ #### The `require_tree` Directive
313
321
 
314
322
  `require_tree` *path* works like `require_directory`, but operates
315
323
  recursively to require all files in all subdirectories of the
316
324
  directory specified by *path*.
317
325
 
318
- ### The `require_self` Directive ###
326
+ #### The `require_self` Directive
319
327
 
320
328
  `require_self` tells Sprockets to insert the body of the current
321
329
  source file before any subsequent `require` directives.
322
330
 
323
- ### The `link` Directive ###
331
+ #### The `link` Directive
324
332
 
325
333
  `link` *path* declares a dependency on the target *path* and adds it to a list
326
334
  of subdependencies to automatically be compiled when the asset is written out to
327
335
  disk.
328
336
 
329
337
  For an example, in a CSS file you might reference an external image that always
330
- need to be compiled along with the css file.
338
+ needs to be compiled along with the css file.
331
339
 
332
340
  ``` css
333
- /* link "logo.png" */
341
+ /*= link "logo.png" */
334
342
  .logo {
335
343
  background-image: url(logo.png)
336
344
  }
337
345
  ```
338
346
 
339
- However, if you use a `asset-path/url` SCSS helper, these links will
340
- automatically be setup for you.
347
+ However, if you use a `asset-path` or `asset-url` SCSS helper, these links will
348
+ automatically be defined for you.
341
349
 
342
350
  ``` css
343
351
  .logo {
@@ -345,33 +353,93 @@ automatically be setup for you.
345
353
  }
346
354
  ```
347
355
 
348
- ### The `depend_on` Directive ###
356
+ #### The `depend_on` Directive
349
357
 
350
358
  `depend_on` *path* declares a dependency on the given *path* without
351
359
  including it in the bundle. This is useful when you need to expire an
352
360
  asset's cache in response to a change in another file.
353
361
 
354
- ### The `depend_on_asset` Directive ###
362
+ #### The `depend_on_asset` Directive
355
363
 
356
364
  `depend_on_asset` *path* works like `depend_on`, but operates
357
- recursively reading the file and following the directives found.
365
+ 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`.
358
366
 
359
- ### The `stub` Directive ###
367
+ #### The `stub` Directive
360
368
 
361
369
  `stub` *path* allows dependency to be excluded from the asset bundle.
362
370
  The *path* must be a valid asset and may or may not already be part
363
371
  of the bundle. `stub` should only be used at the top level bundle, not
364
372
  within any subdependencies.
365
373
 
366
- # Development #
367
374
 
368
- ## Contributing ##
375
+ ## Processor Interface
376
+
377
+ Sprockets 2.x was originally design around [Tilt](https://github.com/rtomayko/tilt)'s engine interface. However, starting with 3.x, a new interface has been introduced deprecating Tilt.
378
+
379
+ Similar to Rack, a processor is a any "callable" (an object that responds to `call`). This maybe a simple Proc or a full class that defines a `def self.call(input)` method. The `call` method accepts an `input` Hash and returns a Hash of metadata.
380
+
381
+ Also see [`Sprockets::ProcessorUtils`](https://github.com/sstephenson/sprockets/blob/master/lib/sprockets/processor_utils.rb) for public helper methods.
382
+
383
+ ### input Hash
384
+
385
+ The `input` Hash defines the following public fields.
386
+
387
+ * `:data` - String asset contents
388
+ * `:environment` - Current `Sprockets::Environment` instance.
389
+ * `:cache` - A `Sprockets::Cache` instance. See [`Sprockets::Cache#fetch`](https://github.com/sstephenson/sprockets/blob/master/lib/sprockets/cache.rb).
390
+ * `:uri` - String Asset URI.
391
+ * `:filename` - String full path to original file.
392
+ * `:load_path` - String current load path for filename.
393
+ * `:name` - String logical path for filename.
394
+ * `:content_type` - String content type of the output asset.
395
+ * `:metadata` - Hash of processor metadata.
396
+
397
+ ``` ruby
398
+ def self.call(input)
399
+ input[:cache].fetch("my:cache:key:v1") do
400
+ # Remove all semicolons from source
401
+ input[:data].gsub(";", "")
402
+ end
403
+ end
404
+ ```
405
+
406
+ ### return Hash
407
+
408
+ The processor should return metadata `Hash`. With the exception of the `:data` key, the processor can store arbitrary JSON valid values in this Hash. The data will be stored and exposed on `Asset#metadata`.
409
+
410
+ The returned `:data` replaces the assets `input[:data]` to the next processor in the chain. Returning a `String` is shorthand for returning `{ data: str }`. And returning `nil` is shorthand for a no-op where the input data is not transformed, `{ data: input[:data] }`.
411
+
412
+ ### metadata
413
+
414
+ The metadata Hash provides an open format for processors to extend the pipeline processor. Internally, built-in processors use it for passing data to each other.
415
+
416
+ * `:required` - A `Set` of String Asset URIs that the Bundle processor should concatenate together.
417
+ * `:stubbed` - A `Set` of String Asset URIs that will be omitted from the `:required` set.
418
+ * `:links` - A `Set` of String Asset URIs that should be compiled along with this asset.
419
+ * `:dependencies` - A `Set` of String Cache URIs that should be monitored for caching.
420
+
421
+ ``` ruby
422
+ def self.call(input)
423
+ # Any metadata may start off as nil, so initialize it the value
424
+ required = Set.new(input[:metadata][:required])
425
+
426
+ # Manually add "foo.js" asset uri to our bundle
427
+ required << input[:environment].resolve("foo.js")
428
+
429
+ { required: required }
430
+ end
431
+ ```
432
+
433
+
434
+ ## Development
435
+
436
+ ### Contributing
369
437
 
370
438
  The Sprockets source code is [hosted on
371
439
  GitHub](https://github.com/sstephenson/sprockets). You can check out a
372
440
  copy of the latest code using Git:
373
441
 
374
- $ git clone https://github.com/sstephenson/sprockets.git
442
+ $ git clone https://github.com/sstephenson/sprockets
375
443
 
376
444
  If you've found a bug or have a question, please open an issue on the
377
445
  [Sprockets issue
@@ -379,25 +447,28 @@ tracker](https://github.com/sstephenson/sprockets/issues). Or, clone
379
447
  the Sprockets repository, write a failing test case, fix the bug and
380
448
  submit a pull request.
381
449
 
382
- ## Version History ##
450
+ ### Version History
383
451
 
384
452
  **3.0.0**
385
453
 
454
+ * New processor API. Tilt interface is deprecated.
455
+ * Improved file store caching backend.
386
456
  * MIME Types now accept charset custom charset detecters. Improves support for UTF-16/32 files.
387
457
  * Environment#version no longer affects asset digests. Only used for busting the asset cache.
388
458
  * Removed builtin support for LESS.
389
- * Removed include directive support.
390
- * Deprecated BundledAsset#to_a. Use BundledAsset#included to access debugging subcomponents.
459
+ * Removed `//= include` directive support.
460
+ * Deprecated `BundledAsset#to_a`. Use `BundledAsset#included` to access debugging subcomponents.
391
461
  * Support circular dependencies. For parity with ES6 modules.
392
462
  * Manifest compilation will no longer generate .gz files by default. [Mixing
393
463
  Content-Encoding and ETags is just a bad
394
464
  idea](https://issues.apache.org/bugzilla/show_bug.cgi?id=39727)
395
- * Added linked or referenced assets. When an asset is compiled, any of its links
396
- will be compiled as well.
465
+ * Added linked or referenced assets. When an asset is compiled, any of its links will be compiled as well.
466
+ * Introduce some limitations around enumerating all logical paths. 4.x will deprecate it and favor linked manifests for compliation.
397
467
  * Add Asset integrity attribute for Subresource Integrity
398
- * Default digest changed to SHA256. Configuring digest_class is deprecated.
399
- * Rename Asset#digest to Asset#hexdigest. Asset#digest is deprecated and will
468
+ * Default digest changed to SHA256. Configuring `digest_class` is deprecated.
469
+ * Rename `Asset#digest` to `Asset#hexdigest`. `Asset#digest` is deprecated and will
400
470
  return a raw byte String in 4.x.
471
+ * Added transitional compatibility flag to `Environment#resolve(path, compat: true)`. 2.x mode operates with `compat: true` and 4.x with `compat: false`
401
472
 
402
473
  **2.12.3** (October 28, 2014)
403
474
 
@@ -561,7 +632,7 @@ submit a pull request.
561
632
 
562
633
  * Initial public release.
563
634
 
564
- # License #
635
+ ## License
565
636
 
566
637
  Copyright &copy; 2014 Sam Stephenson <<sstephenson@gmail.com>>
567
638