bunto-assets 1.0.0.pre.alpha

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.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +19 -0
  3. data/LICENSE +21 -0
  4. data/README.md +275 -0
  5. data/Rakefile +3 -0
  6. data/lib/bunto/assets/addons/autoprefixer.rb +13 -0
  7. data/lib/bunto/assets/addons/bootstrap.rb +7 -0
  8. data/lib/bunto/assets/addons/font_awesome.rb +7 -0
  9. data/lib/bunto/assets/addons/javascript.rb +11 -0
  10. data/lib/bunto/assets/cached.rb +20 -0
  11. data/lib/bunto/assets/config.rb +76 -0
  12. data/lib/bunto/assets/env.rb +207 -0
  13. data/lib/bunto/assets/hook.rb +78 -0
  14. data/lib/bunto/assets/hooks/bunto/drops.rb +9 -0
  15. data/lib/bunto/assets/hooks/bunto/setup.rb +13 -0
  16. data/lib/bunto/assets/hooks/bunto/write.rb +9 -0
  17. data/lib/bunto/assets/hooks/cache.rb +15 -0
  18. data/lib/bunto/assets/hooks/compression.rb +17 -0
  19. data/lib/bunto/assets/hooks/configuration.rb +12 -0
  20. data/lib/bunto/assets/hooks/context.rb +11 -0
  21. data/lib/bunto/assets/hooks/erb.rb +15 -0
  22. data/lib/bunto/assets/hooks/helpers.rb +14 -0
  23. data/lib/bunto/assets/hooks/logger.rb +9 -0
  24. data/lib/bunto/assets/hooks/sources.rb +13 -0
  25. data/lib/bunto/assets/hooks/sprockets.rb +9 -0
  26. data/lib/bunto/assets/hooks/version.rb +11 -0
  27. data/lib/bunto/assets/hooks.rb +20 -0
  28. data/lib/bunto/assets/liquid/drop.rb +76 -0
  29. data/lib/bunto/assets/liquid/filters.rb +28 -0
  30. data/lib/bunto/assets/liquid/tag/defaults/image.rb +69 -0
  31. data/lib/bunto/assets/liquid/tag/defaults.rb +23 -0
  32. data/lib/bunto/assets/liquid/tag/parser.rb +200 -0
  33. data/lib/bunto/assets/liquid/tag/proxied_asset.rb +114 -0
  34. data/lib/bunto/assets/liquid/tag/proxies.rb +118 -0
  35. data/lib/bunto/assets/liquid/tag.rb +203 -0
  36. data/lib/bunto/assets/liquid.rb +15 -0
  37. data/lib/bunto/assets/logger.rb +59 -0
  38. data/lib/bunto/assets/patches/bunto/cleaner.rb +16 -0
  39. data/lib/bunto/assets/patches/bunto/site.rb +11 -0
  40. data/lib/bunto/assets/patches/kernel.rb +29 -0
  41. data/lib/bunto/assets/patches/sprockets/asset.rb +21 -0
  42. data/lib/bunto/assets/patches.rb +10 -0
  43. data/lib/bunto/assets/processors/liquid.rb +42 -0
  44. data/lib/bunto/assets/proxies/magick.rb +155 -0
  45. data/lib/bunto/assets/version.rb +11 -0
  46. data/lib/bunto/assets.rb +24 -0
  47. data/lib/bunto-assets.rb +7 -0
  48. metadata +197 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6b31429ffff3e57efcf0c643a23cdf1b3a02bc8d
4
+ data.tar.gz: 773fe2c9059efc63d4696517fd2b31a1af3a5aed
5
+ SHA512:
6
+ metadata.gz: c40b39c878020cfae98efff6d70bdf43de74850056316296a54ece7b43c1da5325e318ecee9a7dbdd100fb5c69dcbc108373b5af2939732b633b67da38f03478
7
+ data.tar.gz: 1bf712167ae3b29691fc45870401d1d540ab17a03c482b9d014a864767e93c0634dec6311d2f659fc1854374125634802dedf03b389c401459db8e1aa33f1877
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+
4
+ gem "rake"
5
+ group :development do
6
+ gem "therubyracer", :platforms => :mri, :require => false
7
+ gem "pry", :require => false
8
+ end
9
+
10
+ group :test do
11
+ gem "codeclimate-test-reporter", :require => false
12
+ end
13
+
14
+ gem "uglifier", :require => false
15
+ gem "sprockets-es6", "~> 0.6", :require => false
16
+ gem "autoprefixer-rails", "~> 6.0", :require => false
17
+ gem "font-awesome-sass", "~> 4.4", :require => false
18
+ gem "bootstrap-sass", "~> 3.3", :require => false
19
+ gem "mini_magick", "~> 4.2", :require => false
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2012-2015 Aleksey V Zapparov (http://ixti.net/)
2
+ Copyright (c) 2015-present Jordon Bedwell (https://envygeeks.io)
3
+ Copyright (c) 2016-present Suriyaa Kudo (https://j.mp/ItsSuriyaa)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,275 @@
1
+ [![Build Status](https://travis-ci.org/bunto/bunto-assets.svg?branch=master)][travis]
2
+
3
+ [travis]: https://travis-ci.org/bunto/bunto-assets
4
+
5
+ # Bunto Assets
6
+
7
+ Bunto assets is an asset pipeline using Sprockets (v3) to build especially
8
+ for Bunto. It utilizes new features of both Sprockets and Bunto to achieve
9
+ a clean and extensible assets platform for Bunto.
10
+
11
+ ## Using Bunto Assets with Bunto
12
+
13
+ Add `gem "bunto-assets"` to your `Gemfile` and add `bunto-assets`
14
+ to your `_config.yml` like the following:
15
+
16
+ ```yaml
17
+ gems:
18
+ - bunto-assets
19
+ ```
20
+
21
+ ## Configuration
22
+
23
+ A lot of our configuration transforms based on the `BUNTO_ENV` variable
24
+ set in your environment. Such as digesting and whether or not to enable the
25
+ CDN. Some of them can be explicitly overridden but a few cannot right now.
26
+ You should set your `BUNTO_ENV=development` on your development
27
+ machine and `BUNTO_ENV=production` when building to push.
28
+
29
+ ```yaml
30
+ assets:
31
+ compress:
32
+ css: false | true | default - development: false, production: true
33
+ js: false | true | default - development: false, production: true
34
+ cache: false | directory | default: .asset-cache
35
+ cdn: https://cdn.example.com
36
+ skip_baseurl_with_cdn: false
37
+ skip_prefix_with_cdn: false
38
+ prefix: "/assets"
39
+ assets:
40
+ - "*.png"
41
+ - "bundle.css"
42
+ digest: true
43
+ sources:
44
+ - _assets/css
45
+ - _assets/images
46
+ - _assets/javascripts
47
+ - _assets/stylesheets
48
+ - _assets/fonts
49
+ - _assets/img
50
+ - _assets/js
51
+ features:
52
+ liquid: true | false | default: false
53
+ automatic_img_size: true | false | default: true
54
+ automatic_img_alt : true | false | default: true
55
+ ```
56
+
57
+ ### Liquid Processing with your Bunto context
58
+
59
+ By default (whether `features.liquid` is true or false) we will process
60
+ all files with the extension ".liquid", so if you give us ".scss.liquid"
61
+ we will parse the liquid and then we will parse the SCSS and finally
62
+ output your ".css" file.
63
+
64
+ When `features.liquid` is set to true, we will process ***ALL*** files
65
+ through Liquid, regardless of whether they have the ".liquid" extension.
66
+ Use this at your own risk.
67
+
68
+ ### Cache Folder
69
+
70
+ If you plan to change the `cache` folder, please make sure to add that
71
+ folder to your `exclude` list in Bunto or you will generate over and over
72
+ and over again, `.` folders are not ignored by default.
73
+
74
+ ### Sources
75
+
76
+ The listed resources in the example are all defaults. It should be noted
77
+ that we append your sources instead of replace our resources with yours. So
78
+ if you add `_assets/folder` then we will append that to our sources and
79
+ both will work.
80
+
81
+ ***NOTE: if you use our `_assets` base folder container as a base folder for
82
+ your sprockets, we will not append our sources, we will only use that
83
+ folder as the sole source (base folder.)***
84
+
85
+ ### Digesting
86
+
87
+ * Disable digesting by default in development.
88
+ * Digest by default in production.
89
+
90
+ ***You can force digesting with `digest: true` in your `_config.yml`***
91
+
92
+ ### Compression
93
+
94
+ * Requires sass and uglifier.
95
+ * Disable compression by default in development.
96
+ * Enable by default in production.
97
+
98
+ ### Bower Components
99
+
100
+ Modify your `.bowerrc` file and add:
101
+
102
+ ```json
103
+ {
104
+ "directory": "_assets/bower"
105
+ }
106
+ ```
107
+
108
+ And then add `_assets/bower` to your sources list and Sprockets will do the
109
+ the rest for you... you can even `//= require bower_asset.js`. We will even
110
+ compress them for you per normal if Sprockets supports it and allows us to.
111
+
112
+ ***You do not need to modify your `.bowerrc` file, you can optionally just
113
+ add it to your sources list and it will work that way too! As long as it's in
114
+ your Bunto folder.***
115
+
116
+ ## Tags
117
+
118
+ * image, img
119
+ * javascript, js
120
+ * stylesheet, css, style
121
+ * asset, asset_source
122
+ * asset_path
123
+
124
+ ### Tag Example:
125
+
126
+ ```liquid
127
+ {% img src magick:2x alt:'This is my alt' %}
128
+ {% img src magick:2x alt:'This is my alt' sprockets:accept:image/gif %}
129
+ ```
130
+
131
+ ### What do the colons mean? Proxies/Tags
132
+
133
+ * `argument` is a boolean HTML argument.
134
+ * `key:value` is an HTML key="value" if no proxy exists.
135
+ * `proxy:key:value` will set a proxy key with the given value.
136
+ * `proxy:key` is a boolean argument if the proxy and key exists.
137
+ * `unknown:key:value` will raise `DoubleColonError`, escape it.
138
+ * `proxy:unknown:value` will raise a `UnknownProxyError`.
139
+
140
+ Lets say we have `sprockets` proxies and sprockets allows you to proxy accept,
141
+ if you send `{% img src sprockets:accept:image/gif }` then Sprockets find_asset
142
+ will get `{ :accept => "image/gif" }` but if you try to proxy "unknown" on
143
+ sprockets we will raise a Proxy error. For more information then look at
144
+ `parser_spec.rb` in the spec folder because it literally lays out the ground
145
+ rules for our tags as a specification.
146
+
147
+ ### Current Proxies:
148
+
149
+ * `sprockets:accept:<value>`
150
+ * `sprockets:write_to:<value>`
151
+
152
+ ## Liquid Variables
153
+
154
+ We support liquid arguments for tag values (but not tag keys), and we also
155
+ support Liquid pre-processing (with your Bunto context) sass/less/css files
156
+ you need do nothing special for the preprocessing an entire file, it's
157
+ always done.
158
+
159
+ An example of using Liquid in your tags:
160
+
161
+ ```liquid
162
+ {% img '{{ image_path }}' %}
163
+ {% img '{{ image_path }}' proxy:key:'{{ value }}' %}
164
+ {% img {{\ image_path\ }} %}
165
+ ```
166
+
167
+ An example of using Liquid in your SCSS:
168
+
169
+ ```scss
170
+ .bg {
171
+ background: url(asset_path("{{ site.background_image }}"));
172
+ }
173
+ ```
174
+
175
+ You have full access to your entire Bunto context from any liquid
176
+ processing we do, so you can do whatever you like and be as dynamic as you
177
+ like, including full loops and conditional Liquid based CSS since we
178
+ pre-process your text files.
179
+
180
+ ## Getting a list of your assets and basic info from Liquid
181
+
182
+ We provide all *your* assets as a hash of Liquid Drops so you can get basic
183
+ info that we wish you to have access to without having to prepare the class.
184
+
185
+ ```liquid
186
+ {{ assets["bundle.css"].content_type }} => "text/css"
187
+ {{ assets["images.jpg"].width }} => 62
188
+ {{ assets["images.jpg"].height }} => 62
189
+ ```
190
+
191
+ The current list of available accessors:
192
+
193
+ * `logical_path`
194
+ * `content_type` -> `type`
195
+ * `filename`
196
+ * `basename`
197
+ * `width`
198
+ * `height`
199
+
200
+ If you would like more, please feel free to add a pull request, at this
201
+ time we will reject all pull requests that wish to add any digested paths as
202
+ those are dynamically created when a proxy is ran so we can never predict
203
+ it reliably unless we proxy and that would be a performance problem.
204
+
205
+ ## ERB Support
206
+
207
+ ERB Support is removed in favor of trying to get this included on Github Pages
208
+ eventually (if I can.) Having ERB presents a security risk to Github because it
209
+ would allow you to use Ruby in ways they don't want you to.
210
+
211
+ ## Filters
212
+
213
+ There is a full suite of filters, actually, any tag and any proxy can be a
214
+ filter by way of filter arguments, take the following example:
215
+
216
+ ```liquid
217
+ {{ src | img : "magick:2x magick:quality:92" }}
218
+ ```
219
+
220
+ ## Hooks
221
+
222
+ * `:env => [:init]`
223
+
224
+ You can register and trigger hooks like so:
225
+
226
+ ```ruby
227
+ Bunto::Assets::Hook.register :env, :init do
228
+ # Your Work
229
+ end
230
+ ```
231
+
232
+ ## Sass Helpers
233
+
234
+ ***Our currently supported helpers are:***
235
+
236
+ * asset_path
237
+ * image_path
238
+ * font_path
239
+
240
+ ## Addons
241
+
242
+ * CSS Auto Prefixer - add "autoprefixer-rails" to your Gemfile.
243
+ * ES6 Transpiler (through Babel) - add "sprockets-es6" to your Gemfile.
244
+ * Image Magick - add "mini_magick" to your Gemfile, only works with `img`, `image`.
245
+ * Bootstrap - add "bootstrap-sass" to your Gemfile and "@import 'bootstrap'"
246
+ * Font Awesome - add "font-awesome-sass" to your Gemfile.
247
+
248
+ ***Please note that some of these (if not all) have trouble with Rhino --
249
+ `therubyrhino` so you would probably be best to just use Node.js or io.js at
250
+ that point rather than trying to fight it.***
251
+
252
+ ### Image Magick Proxy arguments:
253
+
254
+ * `magick:resize:<value>`
255
+ * `magick:format:<value>`
256
+ * `magick:quality:<value>`
257
+ * `magick:rotate:<value>`
258
+ * `magick:gravity:<value>`
259
+ * `magick:crop:<value>`
260
+ * `magick:flip:<value>`
261
+ * `magick:quadruple`, `magick:4x`
262
+ * `magick:one-third`, `magick:1/3`
263
+ * `magick:three-fourths`, `magick:3/4`
264
+ * `magick:two-fourths`, `magick:2/4`
265
+ * `magick:two-thirds`, `magick:2/3`
266
+ * `magick:one-fourth`, `magick:1/4`
267
+ * `magick:half`, `magick:1/2`
268
+
269
+ ## Having trouble with our documentation?
270
+
271
+ If you do not understand something in our documentation please feel
272
+ free to file a ticket and it will be explained and the documentation updated,
273
+ however... if you have already figured out the problem please feel free to
274
+ submit a pull request with clarification in the documentation and we'll
275
+ happily work with you on updating it.
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "rspec/core/rake_task"
2
+ RSpec::Core::RakeTask.new(:spec)
3
+ task :default => [:spec]
@@ -0,0 +1,13 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ try_require_if_javascript "autoprefixer-rails" do
8
+ Bunto::Assets::Hook.register :env, :init do |env|
9
+ AutoprefixerRails.install(env, env.asset_config[
10
+ "autoprefixer"
11
+ ])
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ try_require "bootstrap-sass"
@@ -0,0 +1,7 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ try_require "font-awesome-sass"
@@ -0,0 +1,11 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ try_require_if_javascript "sprockets/es6" do
8
+ if ExecJS.runtime.is_a?(ExecJS::RubyRhinoRuntime)
9
+ Bunto.logger.warn "ES6 transpiler has trouble with RubyRhino, use Node"
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ module Bunto
8
+ module Assets
9
+ class Cached < Sprockets::CachedEnvironment
10
+ attr_reader :bunto
11
+ attr_reader :parent
12
+
13
+ def initialize(env)
14
+ @parent = env
15
+ @bunto = env.bunto
16
+ super env
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,76 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ module Bunto
8
+ module Assets
9
+ module Config
10
+ DefaultSources = %W(
11
+ _assets/css _assets/stylesheets
12
+ _assets/images _assets/img _assets/fonts
13
+ _assets/javascripts _assets/js
14
+ ).freeze
15
+
16
+ # ----------------------------------------------------------------------
17
+
18
+ Development = {
19
+ "skip_baseurl_with_cdn" => false,
20
+ "skip_prefix_with_cdn" => false,
21
+ "prefix" => "/assets",
22
+ "digest" => false,
23
+ "assets" => [],
24
+
25
+ "compress" => {
26
+ "css" => false,
27
+ "js" => false
28
+ },
29
+
30
+ "features" => {
31
+ "automatic_img_alt" => true,
32
+ "automatic_img_size" => true,
33
+ "liquid" => false
34
+ }
35
+ }.freeze
36
+
37
+ # ----------------------------------------------------------------------
38
+
39
+ Production = Development.merge({
40
+ "digest" => true,
41
+ "compress" => {
42
+ "css" => true,
43
+ "js" => true
44
+ }
45
+ }).freeze
46
+
47
+ # ----------------------------------------------------------------------
48
+
49
+ def self.merge_sources(bunto, config)
50
+ config["sources"] ||= []
51
+ return if config["sources"].grep(/\A\s*_assets\/?\s*\Z/).size > 0
52
+ sources = DefaultSources + config["sources"].to_a
53
+
54
+ config["sources"] = Set.new(sources.map do |val|
55
+ bunto.in_source_dir(val)
56
+ end)
57
+ end
58
+
59
+ # ----------------------------------------------------------------------
60
+
61
+ def self.defaults
62
+ if %W(development test).include?(Bunto.env)
63
+ then Development else Production
64
+ end
65
+ end
66
+
67
+ # ----------------------------------------------------------------------
68
+
69
+ def self.merge(new_hash, old_hash = defaults)
70
+ old_hash.merge(new_hash) do |_, old_val, new_val|
71
+ old_val.is_a?(Hash) && new_val.is_a?(Hash) ? merge(new_val, old_val) : new_val
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,207 @@
1
+ # ----------------------------------------------------------------------------
2
+ # Frozen-string-literal: true
3
+ # Copyright: 2016-present - MIT License
4
+ # Encoding: utf-8
5
+ # ----------------------------------------------------------------------------
6
+
7
+ module Bunto
8
+ module Assets
9
+ class Env < Sprockets::Environment
10
+ attr_reader :bunto, :used
11
+
12
+ class << self
13
+ attr_accessor :past
14
+ def liquid_proxies
15
+ Liquid::Tag::Proxies
16
+ end
17
+ end
18
+
19
+ # ----------------------------------------------------------------------
20
+
21
+ def excludes
22
+ excludes = Set.new
23
+ excludes << strip_path(in_cache_dir)
24
+ excludes
25
+ end
26
+
27
+ # ----------------------------------------------------------------------
28
+
29
+ def all_unparsed_assets
30
+ @unparsed_assets ||= logical_paths.select do |(_, val)|
31
+ val.start_with?(bunto.in_source_dir)
32
+ end
33
+ end
34
+
35
+ # ----------------------------------------------------------------------
36
+
37
+ def to_liquid_payload
38
+ bunto.sprockets.all_unparsed_assets.each_with_object({}) do |(key, val), hash|
39
+ hash[key] = Bunto::Assets::Liquid::Drop.new(
40
+ val, bunto
41
+ )
42
+ end
43
+ end
44
+
45
+ # ----------------------------------------------------------------------
46
+
47
+ def initialize(path, bunto = nil)
48
+ bunto, path = path, nil if path.is_a?(Bunto::Site)
49
+ @bunto = bunto
50
+ @used = Set.new
51
+
52
+ path ? super(path) : super()
53
+ Hook.trigger :env, :init do |hook|
54
+ hook.arity > 0 || 0 > hook.arity ? hook.call(self) : instance_eval(&hook)
55
+ end
56
+ end
57
+
58
+ # ----------------------------------------------------------------------
59
+
60
+ def liquid_proxies
61
+ self.class.liquid_proxies
62
+ end
63
+
64
+ # ----------------------------------------------------------------------
65
+ # Make sure a path falls withint our cache dir.
66
+ # ----------------------------------------------------------------------
67
+
68
+ def in_cache_dir(*paths)
69
+ cache_dir = asset_config["cache"] || ".asset-cache"
70
+ bunto.in_source_dir(cache_dir, *paths)
71
+ end
72
+
73
+ # ----------------------------------------------------------------------
74
+ # Merged form of `#extra_assets`
75
+ # ----------------------------------------------------------------------
76
+
77
+ def all_assets
78
+ Set.new(@used).merge extra_assets
79
+ end
80
+
81
+ # ----------------------------------------------------------------------
82
+ # Assets you tell us you want to always compile, even if you do not
83
+ # use them. Just like Rails this is probably normally used.
84
+ # ----------------------------------------------------------------------
85
+
86
+ def extra_assets
87
+ assets = asset_config["assets"] ||= []
88
+ each_logical_path(*assets).map do |v|
89
+ find_asset v
90
+ end
91
+ end
92
+
93
+ # ----------------------------------------------------------------------
94
+
95
+ def cdn?
96
+ !dev? && asset_config.key?("cdn") && \
97
+ asset_config["cdn"]
98
+ end
99
+
100
+ # ----------------------------------------------------------------------
101
+
102
+ def baseurl
103
+ ary = []
104
+
105
+ ary << bunto.config["baseurl"] unless cdn? && asset_config["skip_baseurl_with_cdn"]
106
+ ary << asset_config[ "prefix"] unless cdn? && asset_config[ "skip_prefix_with_cdn"]
107
+
108
+ File.join(*ary.delete_if do |val|
109
+ val.nil? || val.empty?
110
+ end)
111
+ end
112
+
113
+ # ----------------------------------------------------------------------
114
+
115
+ def dev?
116
+ %W(development test).include?(Bunto.env)
117
+ end
118
+
119
+ # ----------------------------------------------------------------------
120
+
121
+ def compress?(what)
122
+ !!asset_config["compress"] \
123
+ .fetch(what, false)
124
+ end
125
+
126
+ # ----------------------------------------------------------------------
127
+
128
+ def asset_config
129
+ bunto.config["assets"] ||= {}
130
+ end
131
+
132
+ # ----------------------------------------------------------------------
133
+
134
+ def digest?
135
+ !!asset_config["digest"]
136
+ end
137
+
138
+ # ----------------------------------------------------------------------
139
+ # Prefix path prefixes the path with the baseurl and the cdn if it
140
+ # exists and is in the right mode to use it. Otherwise it will only use
141
+ # the baseurl and asset prefix. All of these can be adjusted.
142
+ # ----------------------------------------------------------------------
143
+
144
+ def prefix_path(path = nil)
145
+ cdn = asset_config["cdn"]
146
+ base_url = baseurl
147
+
148
+ path_ = []
149
+ path_ << base_url unless base_url.empty?
150
+ path_ << path unless path.nil?
151
+
152
+ url = cdn && cdn?? File.join(cdn, *path_) : File.join(*path_)
153
+ url.chomp("/")
154
+ end
155
+
156
+ # ----------------------------------------------------------------------
157
+
158
+ def cached
159
+ Cached.new(self)
160
+ end
161
+
162
+ # ----------------------------------------------------------------------
163
+
164
+ def write_all
165
+ past = self.class.past ||= Set.new
166
+ (@used.any?? all_assets : past).each do |obj|
167
+ if past.add(obj) && path = as_path(obj)
168
+ obj.write_to path
169
+ end
170
+ end
171
+ end
172
+
173
+ # ----------------------------------------------------------------------
174
+
175
+ private
176
+ def strip_path(path)
177
+ path.sub(bunto.in_source_dir("/"), "")
178
+ end
179
+
180
+ # ----------------------------------------------------------------------
181
+
182
+ private
183
+ def as_path(v)
184
+ path = digest?? v.digest_path : v.logical_path
185
+ bunto.in_dest_dir(File.join(asset_config[ "prefix"], path))
186
+ end
187
+
188
+ # ----------------------------------------------------------------------
189
+
190
+ class << self
191
+ def context_patches
192
+ Proc.new do
193
+ alias _old_asset_path asset_path
194
+ def asset_path(asset, _ = {})
195
+ rtn = _old_asset_path asset
196
+
197
+ return unless rtn
198
+ path = environment.find_asset(resolve(asset))
199
+ environment.parent.used.add(path)
200
+ rtn
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end