dynamic_assets 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +11 -31
- data/app/helpers/dynamic_assets_helpers.rb +3 -1
- data/lib/dynamic_assets/reference.rb +45 -15
- data/lib/dynamic_assets/reference/stylesheet_reference.rb +3 -1
- metadata +6 -53
- data/spec/dummy_rails_app/app/controllers/application_controller.rb +0 -3
- data/spec/dummy_rails_app/app/helpers/application_helper.rb +0 -2
- data/spec/dummy_rails_app/config/application.rb +0 -42
- data/spec/dummy_rails_app/config/boot.rb +0 -6
- data/spec/dummy_rails_app/config/environment.rb +0 -5
- data/spec/dummy_rails_app/config/environments/development.rb +0 -26
- data/spec/dummy_rails_app/config/environments/production.rb +0 -49
- data/spec/dummy_rails_app/config/environments/test.rb +0 -35
- data/spec/dummy_rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy_rails_app/config/initializers/inflections.rb +0 -10
- data/spec/dummy_rails_app/config/initializers/mime_types.rb +0 -5
- data/spec/dummy_rails_app/config/initializers/secret_token.rb +0 -7
- data/spec/dummy_rails_app/config/initializers/session_store.rb +0 -8
- data/spec/dummy_rails_app/config/routes.rb +0 -58
- data/spec/dummy_rails_app/db/seeds.rb +0 -7
- data/spec/dummy_rails_app/spec/spec_helper.rb +0 -27
- data/spec/dummy_rails_app/test/performance/browsing_test.rb +0 -9
- data/spec/dummy_rails_app/test/test_helper.rb +0 -13
- data/spec/helpers/dynamic_assets_helpers_spec.rb +0 -164
- data/spec/lib/dynamic_assets/config_spec.rb +0 -148
- data/spec/lib/dynamic_assets/manager_spec.rb +0 -9
- data/spec/lib/dynamic_assets/stylesheet_reference_spec.rb +0 -139
- data/spec/spec_helper.rb +0 -24
- data/spec/support/matchers/string_matchers.rb +0 -61
data/README.rdoc
CHANGED
@@ -7,21 +7,19 @@ Out of the box it can (optionally):
|
|
7
7
|
* Combine all CSS files into one for faster downloading.
|
8
8
|
* Combine all JavaScript files into one.
|
9
9
|
* Minify assets to make them smaller.
|
10
|
-
* Run your CSS or JS assets through ERB, like views.
|
10
|
+
* Run your CSS or JS assets through ERB so they can reference helpers, like views.
|
11
11
|
* Run your CSS assets through a {Sass}[http://sass-lang.com/] pre-processor (sass or scss).
|
12
|
-
* Run them through ERB then Sass,
|
13
|
-
your app to set some Sass variables.)
|
12
|
+
* Run them through ERB then Sass, which can be useful to allow your app to set some Sass variables.
|
14
13
|
* Combine, minify, and pre-process in memory instead of on disk, to accommodate read-only
|
15
14
|
filesystems (e.g. Heroku).
|
16
15
|
* Set Cache-Control and Expires headers for far-future expiration,
|
17
|
-
allowing browsers and front-end caches like Varnish
|
18
|
-
|
16
|
+
allowing browsers and front-end caches like Varnish or {Rack::Cache}[http://rtomayko.github.com/rack-cache/]
|
17
|
+
to hold assets for a long time.
|
18
|
+
* Group assets, much like
|
19
19
|
{Scott Becker's venerable asset_packager}[http://synthesis.sbecker.net/pages/asset_packager].
|
20
20
|
(Example: You may want a set of stylesheets for your main interface, and another set for your admin
|
21
21
|
interface, maybe with some overlap. With DynamicAssets, your normal users won't pay the
|
22
22
|
penalty of downloading your admin styles.)
|
23
|
-
* Allow CSS assets to refer to static images through relative URLs. That is, it doesn't break URLs
|
24
|
-
embedded in CSS.
|
25
23
|
* Invalidate caches and CDNs by inserting a SHA1 signature into the asset URL path instead of using the
|
26
24
|
Rails scheme of appending a URL timestamp. Some asset servers (notably Amazon CloudFront) will
|
27
25
|
drop parameters from the URL, so cache-busting requires path-changing, and since assets are often
|
@@ -40,6 +38,11 @@ dynamically is useful enough that multiple people have thought of implementing i
|
|
40
38
|
|
41
39
|
gem "dynamic_assets"
|
42
40
|
|
41
|
+
And if you're planning to use Sass or SCSS, add this, too:
|
42
|
+
|
43
|
+
gem "haml", "~> 3.0"
|
44
|
+
|
45
|
+
|
43
46
|
2. Put your CSS files in <tt>app/assets/stylesheets</tt> and your JS files in
|
44
47
|
<tt>app/assets/javascripts</tt>. Each filename's extension triggers an
|
45
48
|
optional pre-processor:
|
@@ -124,34 +127,11 @@ dynamically is useful enough that multiple people have thought of implementing i
|
|
124
127
|
<link href="/assets/stylesheets/1302901403/sidebar.css" media="screen" rel="stylesheet" type="text/css" />
|
125
128
|
|
126
129
|
|
127
|
-
== Variables for ERB
|
128
|
-
|
129
|
-
By default, assets are served by a small controller whose routes are added to
|
130
|
-
your app automatically when the gem is loaded, but you can easily create your
|
131
|
-
own controller if you prefer. One reason to do this would be to inject variables
|
132
|
-
into an asset via ERB, like this:
|
133
|
-
|
134
|
-
class AssetsController < ApplicationController
|
135
|
-
include DynamicAssets::Controller
|
136
|
-
|
137
|
-
def show_stylesheet
|
138
|
-
@background_color = '#FFE'
|
139
|
-
render_asset :stylesheets, params[:name], "text/css"
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
Now in app/assets/stylesheets/application.css.erb you could do this:
|
144
|
-
|
145
|
-
body {
|
146
|
-
background-color: <%= @background_color %>;
|
147
|
-
}
|
148
|
-
|
149
|
-
|
150
130
|
== Static Image URLs Embedded in CSS
|
151
131
|
|
152
132
|
Suppose you install a JavaScript plugin that comes with a stylesheet and
|
153
133
|
some images. The stylesheet, thing.css, may reference one of its images
|
154
|
-
like this:
|
134
|
+
with a relative URL, like this:
|
155
135
|
|
156
136
|
div.thing {
|
157
137
|
background: url(fancy_background.png);
|
@@ -31,7 +31,9 @@ protected
|
|
31
31
|
def asset_path(asset_ref)
|
32
32
|
path_args = []
|
33
33
|
path_args << asset_ref.name
|
34
|
-
|
34
|
+
|
35
|
+
signature = asset_ref.signature binding
|
36
|
+
path_args << { :signature => signature } if signature.present?
|
35
37
|
|
36
38
|
case asset_ref
|
37
39
|
when DynamicAssets::StylesheetReference then stylesheet_asset_path *path_args
|
@@ -50,23 +50,22 @@ module DynamicAssets
|
|
50
50
|
@member_root = File.find_existing(possible_roots) || possible_roots.first
|
51
51
|
end
|
52
52
|
|
53
|
-
|
54
|
-
def content(context = nil)
|
53
|
+
def content(context, for_signature = false)
|
55
54
|
@context = context
|
56
|
-
s = combine_content
|
57
|
-
s = minify s if DynamicAssets::Manager.minify?
|
55
|
+
s = combine_content for_signature
|
56
|
+
s = minify s if DynamicAssets::Manager.minify? && !for_signature
|
58
57
|
s
|
59
58
|
end
|
60
59
|
|
61
|
-
def signature
|
62
|
-
# Note that the signature is based on the context
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
# change in signature, set or update the ASSET_VERSION
|
60
|
+
def signature(context)
|
61
|
+
# Note that the signature is based on the context at the time the
|
62
|
+
# asset helper is called, which is different from the context at
|
63
|
+
# the time of asset rendering.
|
64
|
+
#
|
65
|
+
# To force a change in signature, set or update the ASSET_VERSION
|
67
66
|
# config variable.
|
68
67
|
|
69
|
-
|
68
|
+
(ENV['ASSET_VERSION'] || "") + Digest::SHA1.hexdigest(content(context, true))
|
70
69
|
end
|
71
70
|
|
72
71
|
def minify(content_string)
|
@@ -104,16 +103,26 @@ module DynamicAssets
|
|
104
103
|
File.extname(path) == ".erb"
|
105
104
|
end
|
106
105
|
|
107
|
-
def combine_content
|
106
|
+
def combine_content(for_signature)
|
108
107
|
member_names.map do |member_name|
|
109
|
-
read_member member_name
|
108
|
+
read_member member_name, for_signature
|
110
109
|
end.join "\n"
|
111
110
|
end
|
112
111
|
|
113
|
-
def read_member(member_name)
|
112
|
+
def read_member(member_name, for_signature)
|
114
113
|
path = path_for_member_name member_name
|
115
114
|
content_string = get_raw_content path
|
116
|
-
|
115
|
+
|
116
|
+
if path_is_erb?(path)
|
117
|
+
raise "ERB requires a context" unless @context
|
118
|
+
begin
|
119
|
+
content_string = ERB.new(content_string).result @context
|
120
|
+
rescue StandardError => e
|
121
|
+
raise e.exception(parse_erb_error(e, path, content_string) ||
|
122
|
+
"Error in ERB #{path}, unknown line number: #{e}")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
117
126
|
content_string
|
118
127
|
end
|
119
128
|
|
@@ -125,5 +134,26 @@ module DynamicAssets
|
|
125
134
|
File.open(path, "r") { |f| f.read }
|
126
135
|
end
|
127
136
|
|
137
|
+
def parse_erb_error(error, path, content_string)
|
138
|
+
# Exception parsing inspired by HelpfulERB
|
139
|
+
|
140
|
+
return nil unless error.backtrace.first =~ /^[^:]+:(\d+):in /
|
141
|
+
|
142
|
+
line_number = $1.to_i
|
143
|
+
lines = content_string.split /\n/
|
144
|
+
|
145
|
+
min = [line_number - 5, 0].max
|
146
|
+
max = [line_number + 1, lines.length].min
|
147
|
+
|
148
|
+
width = max.to_s.size
|
149
|
+
|
150
|
+
message = "Error in ERB '#{path}' at line #{line_number}:\n\n" +
|
151
|
+
(min..max).map do |i|
|
152
|
+
n = i + 1
|
153
|
+
marker = n == line_number ? "*" : ""
|
154
|
+
"%2s %#{width}i %s" % [marker, n, lines[i]]
|
155
|
+
end.join("\n") +
|
156
|
+
"\n\n#{error.class}: #{error.message}"
|
157
|
+
end
|
128
158
|
end
|
129
159
|
end
|
@@ -28,8 +28,10 @@ module DynamicAssets
|
|
28
28
|
protected
|
29
29
|
|
30
30
|
# Overridden to transform URLs embedded in the CSS
|
31
|
-
def read_member(member_name)
|
31
|
+
def read_member(member_name, for_signature)
|
32
32
|
content_string = super
|
33
|
+
return content_string if for_signature
|
34
|
+
|
33
35
|
format = format_for_member_name member_name
|
34
36
|
|
35
37
|
content_string = case format
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: dynamic_assets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.6.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Robert Davis
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05
|
13
|
+
date: 2011-06-05 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
requirements:
|
54
54
|
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 1.
|
56
|
+
version: 1.6.2
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: *id004
|
@@ -113,30 +113,6 @@ files:
|
|
113
113
|
- lib/dynamic_assets/reference/javascript_reference.rb
|
114
114
|
- lib/dynamic_assets/reference/stylesheet_reference.rb
|
115
115
|
- README.rdoc
|
116
|
-
- spec/dummy_rails_app/app/controllers/application_controller.rb
|
117
|
-
- spec/dummy_rails_app/app/helpers/application_helper.rb
|
118
|
-
- spec/dummy_rails_app/config/application.rb
|
119
|
-
- spec/dummy_rails_app/config/boot.rb
|
120
|
-
- spec/dummy_rails_app/config/environment.rb
|
121
|
-
- spec/dummy_rails_app/config/environments/development.rb
|
122
|
-
- spec/dummy_rails_app/config/environments/production.rb
|
123
|
-
- spec/dummy_rails_app/config/environments/test.rb
|
124
|
-
- spec/dummy_rails_app/config/initializers/backtrace_silencers.rb
|
125
|
-
- spec/dummy_rails_app/config/initializers/inflections.rb
|
126
|
-
- spec/dummy_rails_app/config/initializers/mime_types.rb
|
127
|
-
- spec/dummy_rails_app/config/initializers/secret_token.rb
|
128
|
-
- spec/dummy_rails_app/config/initializers/session_store.rb
|
129
|
-
- spec/dummy_rails_app/config/routes.rb
|
130
|
-
- spec/dummy_rails_app/db/seeds.rb
|
131
|
-
- spec/dummy_rails_app/spec/spec_helper.rb
|
132
|
-
- spec/dummy_rails_app/test/performance/browsing_test.rb
|
133
|
-
- spec/dummy_rails_app/test/test_helper.rb
|
134
|
-
- spec/helpers/dynamic_assets_helpers_spec.rb
|
135
|
-
- spec/lib/dynamic_assets/config_spec.rb
|
136
|
-
- spec/lib/dynamic_assets/manager_spec.rb
|
137
|
-
- spec/lib/dynamic_assets/stylesheet_reference_spec.rb
|
138
|
-
- spec/spec_helper.rb
|
139
|
-
- spec/support/matchers/string_matchers.rb
|
140
116
|
has_rdoc: true
|
141
117
|
homepage: http://github.com/davisre/dynamic_assets
|
142
118
|
licenses:
|
@@ -151,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
151
127
|
requirements:
|
152
128
|
- - ">="
|
153
129
|
- !ruby/object:Gem::Version
|
154
|
-
hash:
|
130
|
+
hash: 1850481041292794772
|
155
131
|
segments:
|
156
132
|
- 0
|
157
133
|
version: "0"
|
@@ -168,28 +144,5 @@ rubygems_version: 1.6.2
|
|
168
144
|
signing_key:
|
169
145
|
specification_version: 3
|
170
146
|
summary: Allow your Rails 3 app to package and process your CSS and JS assets on the fly.
|
171
|
-
test_files:
|
172
|
-
|
173
|
-
- spec/dummy_rails_app/app/helpers/application_helper.rb
|
174
|
-
- spec/dummy_rails_app/config/application.rb
|
175
|
-
- spec/dummy_rails_app/config/boot.rb
|
176
|
-
- spec/dummy_rails_app/config/environment.rb
|
177
|
-
- spec/dummy_rails_app/config/environments/development.rb
|
178
|
-
- spec/dummy_rails_app/config/environments/production.rb
|
179
|
-
- spec/dummy_rails_app/config/environments/test.rb
|
180
|
-
- spec/dummy_rails_app/config/initializers/backtrace_silencers.rb
|
181
|
-
- spec/dummy_rails_app/config/initializers/inflections.rb
|
182
|
-
- spec/dummy_rails_app/config/initializers/mime_types.rb
|
183
|
-
- spec/dummy_rails_app/config/initializers/secret_token.rb
|
184
|
-
- spec/dummy_rails_app/config/initializers/session_store.rb
|
185
|
-
- spec/dummy_rails_app/config/routes.rb
|
186
|
-
- spec/dummy_rails_app/db/seeds.rb
|
187
|
-
- spec/dummy_rails_app/spec/spec_helper.rb
|
188
|
-
- spec/dummy_rails_app/test/performance/browsing_test.rb
|
189
|
-
- spec/dummy_rails_app/test/test_helper.rb
|
190
|
-
- spec/helpers/dynamic_assets_helpers_spec.rb
|
191
|
-
- spec/lib/dynamic_assets/config_spec.rb
|
192
|
-
- spec/lib/dynamic_assets/manager_spec.rb
|
193
|
-
- spec/lib/dynamic_assets/stylesheet_reference_spec.rb
|
194
|
-
- spec/spec_helper.rb
|
195
|
-
- spec/support/matchers/string_matchers.rb
|
147
|
+
test_files: []
|
148
|
+
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require File.expand_path('../boot', __FILE__)
|
2
|
-
|
3
|
-
require 'rails/all'
|
4
|
-
|
5
|
-
# If you have a Gemfile, require the gems listed there, including any gems
|
6
|
-
# you've limited to :test, :development, or :production.
|
7
|
-
Bundler.require(:default, Rails.env) if defined?(Bundler)
|
8
|
-
|
9
|
-
module DummyRailsApp
|
10
|
-
class Application < Rails::Application
|
11
|
-
# Settings in config/environments/* take precedence over those specified here.
|
12
|
-
# Application configuration should go into files in config/initializers
|
13
|
-
# -- all .rb files in that directory are automatically loaded.
|
14
|
-
|
15
|
-
# Custom directories with classes and modules you want to be autoloadable.
|
16
|
-
# config.autoload_paths += %W(#{config.root}/extras)
|
17
|
-
|
18
|
-
# Only load the plugins named here, in the order given (default is alphabetical).
|
19
|
-
# :all can be used as a placeholder for all plugins not explicitly named.
|
20
|
-
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
21
|
-
|
22
|
-
# Activate observers that should always be running.
|
23
|
-
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
24
|
-
|
25
|
-
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
26
|
-
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
27
|
-
# config.time_zone = 'Central Time (US & Canada)'
|
28
|
-
|
29
|
-
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
30
|
-
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
31
|
-
# config.i18n.default_locale = :de
|
32
|
-
|
33
|
-
# JavaScript files you want as :defaults (application.js is always included).
|
34
|
-
# config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
|
35
|
-
|
36
|
-
# Configure the default encoding used in templates for Ruby 1.9.
|
37
|
-
config.encoding = "utf-8"
|
38
|
-
|
39
|
-
# Configure sensitive parameters which will be filtered from the log file.
|
40
|
-
config.filter_parameters += [:password]
|
41
|
-
end
|
42
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
DummyRailsApp::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/application.rb
|
3
|
-
|
4
|
-
# In the development environment your application's code is reloaded on
|
5
|
-
# every request. This slows down response time but is perfect for development
|
6
|
-
# since you don't have to restart the webserver when you make code changes.
|
7
|
-
config.cache_classes = false
|
8
|
-
|
9
|
-
# Log error messages when you accidentally call methods on nil.
|
10
|
-
config.whiny_nils = true
|
11
|
-
|
12
|
-
# Show full error reports and disable caching
|
13
|
-
config.consider_all_requests_local = true
|
14
|
-
config.action_view.debug_rjs = true
|
15
|
-
config.action_controller.perform_caching = false
|
16
|
-
|
17
|
-
# Don't care if the mailer can't send
|
18
|
-
config.action_mailer.raise_delivery_errors = false
|
19
|
-
|
20
|
-
# Print deprecation notices to the Rails logger
|
21
|
-
config.active_support.deprecation = :log
|
22
|
-
|
23
|
-
# Only use best-standards-support built into browsers
|
24
|
-
config.action_dispatch.best_standards_support = :builtin
|
25
|
-
end
|
26
|
-
|
@@ -1,49 +0,0 @@
|
|
1
|
-
DummyRailsApp::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/application.rb
|
3
|
-
|
4
|
-
# The production environment is meant for finished, "live" apps.
|
5
|
-
# Code is not reloaded between requests
|
6
|
-
config.cache_classes = true
|
7
|
-
|
8
|
-
# Full error reports are disabled and caching is turned on
|
9
|
-
config.consider_all_requests_local = false
|
10
|
-
config.action_controller.perform_caching = true
|
11
|
-
|
12
|
-
# Specifies the header that your server uses for sending files
|
13
|
-
config.action_dispatch.x_sendfile_header = "X-Sendfile"
|
14
|
-
|
15
|
-
# For nginx:
|
16
|
-
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
|
17
|
-
|
18
|
-
# If you have no front-end server that supports something like X-Sendfile,
|
19
|
-
# just comment this out and Rails will serve the files
|
20
|
-
|
21
|
-
# See everything in the log (default is :info)
|
22
|
-
# config.log_level = :debug
|
23
|
-
|
24
|
-
# Use a different logger for distributed setups
|
25
|
-
# config.logger = SyslogLogger.new
|
26
|
-
|
27
|
-
# Use a different cache store in production
|
28
|
-
# config.cache_store = :mem_cache_store
|
29
|
-
|
30
|
-
# Disable Rails's static asset server
|
31
|
-
# In production, Apache or nginx will already do this
|
32
|
-
config.serve_static_assets = false
|
33
|
-
|
34
|
-
# Enable serving of images, stylesheets, and javascripts from an asset server
|
35
|
-
# config.action_controller.asset_host = "http://assets.example.com"
|
36
|
-
|
37
|
-
# Disable delivery errors, bad email addresses will be ignored
|
38
|
-
# config.action_mailer.raise_delivery_errors = false
|
39
|
-
|
40
|
-
# Enable threaded mode
|
41
|
-
# config.threadsafe!
|
42
|
-
|
43
|
-
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
44
|
-
# the I18n.default_locale when a translation can not be found)
|
45
|
-
config.i18n.fallbacks = true
|
46
|
-
|
47
|
-
# Send deprecation notices to registered listeners
|
48
|
-
config.active_support.deprecation = :notify
|
49
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
DummyRailsApp::Application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/application.rb
|
3
|
-
|
4
|
-
# The test environment is used exclusively to run your application's
|
5
|
-
# test suite. You never need to work with it otherwise. Remember that
|
6
|
-
# your test database is "scratch space" for the test suite and is wiped
|
7
|
-
# and recreated between test runs. Don't rely on the data there!
|
8
|
-
config.cache_classes = true
|
9
|
-
|
10
|
-
# Log error messages when you accidentally call methods on nil.
|
11
|
-
config.whiny_nils = true
|
12
|
-
|
13
|
-
# Show full error reports and disable caching
|
14
|
-
config.consider_all_requests_local = true
|
15
|
-
config.action_controller.perform_caching = false
|
16
|
-
|
17
|
-
# Raise exceptions instead of rendering exception templates
|
18
|
-
config.action_dispatch.show_exceptions = false
|
19
|
-
|
20
|
-
# Disable request forgery protection in test environment
|
21
|
-
config.action_controller.allow_forgery_protection = false
|
22
|
-
|
23
|
-
# Tell Action Mailer not to deliver emails to the real world.
|
24
|
-
# The :test delivery method accumulates sent emails in the
|
25
|
-
# ActionMailer::Base.deliveries array.
|
26
|
-
config.action_mailer.delivery_method = :test
|
27
|
-
|
28
|
-
# Use SQL instead of Active Record's schema dumper when creating the test database.
|
29
|
-
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
30
|
-
# like if you have constraints or database-specific column types
|
31
|
-
# config.active_record.schema_format = :sql
|
32
|
-
|
33
|
-
# Print deprecation notices to the stderr
|
34
|
-
config.active_support.deprecation = :stderr
|
35
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
|
4
|
-
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
|
5
|
-
|
6
|
-
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
|
7
|
-
# Rails.backtrace_cleaner.remove_silencers!
|
@@ -1,10 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Add new inflection rules using the following format
|
4
|
-
# (all these examples are active by default):
|
5
|
-
# ActiveSupport::Inflector.inflections do |inflect|
|
6
|
-
# inflect.plural /^(ox)$/i, '\1en'
|
7
|
-
# inflect.singular /^(ox)en/i, '\1'
|
8
|
-
# inflect.irregular 'person', 'people'
|
9
|
-
# inflect.uncountable %w( fish sheep )
|
10
|
-
# end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Your secret key for verifying the integrity of signed cookies.
|
4
|
-
# If you change this key, all old signed cookies will become invalid!
|
5
|
-
# Make sure the secret is at least 30 characters and all random,
|
6
|
-
# no regular words or you'll be exposed to dictionary attacks.
|
7
|
-
DummyRailsApp::Application.config.secret_token = '9c84a3a25344a4bb6033fb01225d7af245dc5f965cadf01502ca1badd308b46940020af7a9d1986005e4b3d02472356d49e62cc87f4c3320e6fcf3a8dbaa94e0'
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
DummyRailsApp::Application.config.session_store :cookie_store, :key => '_dummy_rails_app_session'
|
4
|
-
|
5
|
-
# Use the database for sessions instead of the cookie-based default,
|
6
|
-
# which shouldn't be used to store highly confidential information
|
7
|
-
# (create the session table with "rails generate session_migration")
|
8
|
-
# DummyRailsApp::Application.config.session_store :active_record_store
|
@@ -1,58 +0,0 @@
|
|
1
|
-
DummyRailsApp::Application.routes.draw do
|
2
|
-
# The priority is based upon order of creation:
|
3
|
-
# first created -> highest priority.
|
4
|
-
|
5
|
-
# Sample of regular route:
|
6
|
-
# match 'products/:id' => 'catalog#view'
|
7
|
-
# Keep in mind you can assign values other than :controller and :action
|
8
|
-
|
9
|
-
# Sample of named route:
|
10
|
-
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
|
11
|
-
# This route can be invoked with purchase_url(:id => product.id)
|
12
|
-
|
13
|
-
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
14
|
-
# resources :products
|
15
|
-
|
16
|
-
# Sample resource route with options:
|
17
|
-
# resources :products do
|
18
|
-
# member do
|
19
|
-
# get 'short'
|
20
|
-
# post 'toggle'
|
21
|
-
# end
|
22
|
-
#
|
23
|
-
# collection do
|
24
|
-
# get 'sold'
|
25
|
-
# end
|
26
|
-
# end
|
27
|
-
|
28
|
-
# Sample resource route with sub-resources:
|
29
|
-
# resources :products do
|
30
|
-
# resources :comments, :sales
|
31
|
-
# resource :seller
|
32
|
-
# end
|
33
|
-
|
34
|
-
# Sample resource route with more complex sub-resources
|
35
|
-
# resources :products do
|
36
|
-
# resources :comments
|
37
|
-
# resources :sales do
|
38
|
-
# get 'recent', :on => :collection
|
39
|
-
# end
|
40
|
-
# end
|
41
|
-
|
42
|
-
# Sample resource route within a namespace:
|
43
|
-
# namespace :admin do
|
44
|
-
# # Directs /admin/products/* to Admin::ProductsController
|
45
|
-
# # (app/controllers/admin/products_controller.rb)
|
46
|
-
# resources :products
|
47
|
-
# end
|
48
|
-
|
49
|
-
# You can have the root of your site routed with "root"
|
50
|
-
# just remember to delete public/index.html.
|
51
|
-
# root :to => "welcome#index"
|
52
|
-
|
53
|
-
# See how all your routes lay out with "rake routes"
|
54
|
-
|
55
|
-
# This is a legacy wild controller route that's not recommended for RESTful applications.
|
56
|
-
# Note: This route will make all actions in every controller accessible via GET requests.
|
57
|
-
# match ':controller(/:action(/:id(.:format)))'
|
58
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
# This file should contain all the record creation needed to seed the database with its default values.
|
2
|
-
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
|
3
|
-
#
|
4
|
-
# Examples:
|
5
|
-
#
|
6
|
-
# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
|
7
|
-
# Mayor.create(:name => 'Daley', :city => cities.first)
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
-
ENV["RAILS_ENV"] ||= 'test'
|
3
|
-
require File.expand_path("../../config/environment", __FILE__)
|
4
|
-
require 'rspec/rails'
|
5
|
-
|
6
|
-
# Requires supporting ruby files with custom matchers and macros, etc,
|
7
|
-
# in spec/support/ and its subdirectories.
|
8
|
-
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
9
|
-
|
10
|
-
RSpec.configure do |config|
|
11
|
-
# == Mock Framework
|
12
|
-
#
|
13
|
-
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
14
|
-
#
|
15
|
-
# config.mock_with :mocha
|
16
|
-
# config.mock_with :flexmock
|
17
|
-
# config.mock_with :rr
|
18
|
-
config.mock_with :rspec
|
19
|
-
|
20
|
-
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
21
|
-
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
22
|
-
|
23
|
-
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
24
|
-
# examples within a transaction, remove the following line or assign false
|
25
|
-
# instead of true.
|
26
|
-
config.use_transactional_fixtures = true
|
27
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
ENV["RAILS_ENV"] = "test"
|
2
|
-
require File.expand_path('../../config/environment', __FILE__)
|
3
|
-
require 'rails/test_help'
|
4
|
-
|
5
|
-
class ActiveSupport::TestCase
|
6
|
-
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
|
7
|
-
#
|
8
|
-
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
9
|
-
# -- they do not yet inherit this setting
|
10
|
-
fixtures :all
|
11
|
-
|
12
|
-
# Add more helper methods to be used by all tests here...
|
13
|
-
end
|
@@ -1,164 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe DynamicAssetsHelpers do
|
4
|
-
|
5
|
-
describe "#stylesheet_asset_tag" do
|
6
|
-
subject { helper.stylesheet_asset_tag *args }
|
7
|
-
|
8
|
-
context "when called with no arguments" do
|
9
|
-
let(:args) { [] }
|
10
|
-
|
11
|
-
it "fails with an ArgumentError" do
|
12
|
-
expect { subject }.to raise_error ArgumentError
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
context "when called with a group_key" do
|
17
|
-
let(:args) { [group_key] }
|
18
|
-
let(:group_key) { :base }
|
19
|
-
|
20
|
-
context "when the DynamicAssets::Manager says the given group key is associated with 3 stylesheets" do
|
21
|
-
|
22
|
-
before do
|
23
|
-
DynamicAssets::Manager.stub(:asset_references_for_group_key).with(:stylesheets, group_key).
|
24
|
-
and_return [
|
25
|
-
DynamicAssets::StylesheetReference.new.tap { |r| r.stub(:name => "a", :signature => 123) },
|
26
|
-
DynamicAssets::StylesheetReference.new.tap { |r| r.stub(:name => "b", :signature => 456) },
|
27
|
-
DynamicAssets::StylesheetReference.new.tap { |r| r.stub(:name => "c", :signature => 789) }
|
28
|
-
]
|
29
|
-
end
|
30
|
-
|
31
|
-
it "is three link tags" do
|
32
|
-
subject.scan('<link ').length.should == 3
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'is three tags with type="text/css"' do
|
36
|
-
subject.scan('type="text/css"').length.should == 3
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'is three tags with rel"stylesheet"' do
|
40
|
-
subject.scan('rel="stylesheet"').length.should == 3
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'is three tags with media="screen"' do
|
44
|
-
subject.scan('media="screen"').length.should == 3
|
45
|
-
end
|
46
|
-
|
47
|
-
context "when the arguments also include HTML attributes" do
|
48
|
-
before { args << { :media => "print", :id => "foo" } }
|
49
|
-
|
50
|
-
it "is three links, each of which has the given attributes" do
|
51
|
-
subject.scan('media="print"').length.should == 3
|
52
|
-
subject.scan('id="foo"').length.should == 3
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context "when config.asset_host is nil" do
|
57
|
-
before { helper.config.asset_host.should be_nil }
|
58
|
-
|
59
|
-
it "is three tags with hrefs derived from the asset name and signature" do
|
60
|
-
should contain_string 'href="/assets/stylesheets/v/123/a.css"'
|
61
|
-
should contain_string 'href="/assets/stylesheets/v/456/b.css"'
|
62
|
-
should contain_string 'href="/assets/stylesheets/v/789/c.css"'
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context "when config.asset_host is set to a.example.com" do
|
67
|
-
before { helper.config.stub(:asset_host).and_return "http://a.example.com" }
|
68
|
-
|
69
|
-
it "is three tags with hrefs whose host is a.example.com" do
|
70
|
-
should contain_string 'href="http://a.example.com/assets/stylesheets/v/123/a.css"'
|
71
|
-
should contain_string 'href="http://a.example.com/assets/stylesheets/v/456/b.css"'
|
72
|
-
should contain_string 'href="http://a.example.com/assets/stylesheets/v/789/c.css"'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context "when config.asset_host is set to a%d.example.com" do
|
77
|
-
before { helper.config.stub(:asset_host).and_return "http://a%d.example.com" }
|
78
|
-
|
79
|
-
it "is three tags with hrefs whose host is a[0-3].example.com" do
|
80
|
-
should =~ /href="http:\/\/a[0-3].example.com\/assets\/stylesheets\/v\/123\/a.css"/
|
81
|
-
should =~ /href="http:\/\/a[0-3].example.com\/assets\/stylesheets\/v\/456\/b.css"/
|
82
|
-
should =~ /href="http:\/\/a[0-3].example.com\/assets\/stylesheets\/v\/789\/c.css"/
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe "#javascript_asset_tag" do
|
90
|
-
subject { helper.javascript_asset_tag *args }
|
91
|
-
|
92
|
-
context "when called with no arguments" do
|
93
|
-
let(:args) { [] }
|
94
|
-
|
95
|
-
it "fails with an ArgumentError" do
|
96
|
-
expect { subject }.to raise_error ArgumentError
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "when called with a group_key" do
|
101
|
-
let(:args) { [group_key] }
|
102
|
-
let(:group_key) { :base }
|
103
|
-
|
104
|
-
context "when the DynamicAssets::Manager says the given group key is associated with 3 scripts" do
|
105
|
-
|
106
|
-
before do
|
107
|
-
DynamicAssets::Manager.stub(:asset_references_for_group_key).with(:javascripts, group_key).
|
108
|
-
and_return [
|
109
|
-
DynamicAssets::JavascriptReference.new.tap { |r| r.stub(:name => "a", :signature => 123) },
|
110
|
-
DynamicAssets::JavascriptReference.new.tap { |r| r.stub(:name => "b", :signature => 456) },
|
111
|
-
DynamicAssets::JavascriptReference.new.tap { |r| r.stub(:name => "c", :signature => 789) }
|
112
|
-
]
|
113
|
-
end
|
114
|
-
|
115
|
-
it "is three script tags" do
|
116
|
-
subject.scan('<script ').length.should == 3
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'is three tags with type="text/javascript"' do
|
120
|
-
subject.scan('type="text/javascript"').length.should == 3
|
121
|
-
end
|
122
|
-
|
123
|
-
context "when the arguments also include HTML attributes" do
|
124
|
-
before { args << { :id => "foo" } }
|
125
|
-
|
126
|
-
it "is three links, each of which has the given attributes" do
|
127
|
-
subject.scan('id="foo"').length.should == 3
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
context "when config.asset_host is nil" do
|
132
|
-
before { helper.config.asset_host.should be_nil }
|
133
|
-
|
134
|
-
it "is three tags with srcs derived from the asset name and signature" do
|
135
|
-
should contain_string 'src="/assets/javascripts/v/123/a.js"'
|
136
|
-
should contain_string 'src="/assets/javascripts/v/456/b.js"'
|
137
|
-
should contain_string 'src="/assets/javascripts/v/789/c.js"'
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
context "when config.asset_host is set to a.example.com" do
|
142
|
-
before { helper.config.stub(:asset_host).and_return "http://a.example.com" }
|
143
|
-
|
144
|
-
it "is three tags with srcs whose host is a.example.com" do
|
145
|
-
should contain_string 'src="http://a.example.com/assets/javascripts/v/123/a.js"'
|
146
|
-
should contain_string 'src="http://a.example.com/assets/javascripts/v/456/b.js"'
|
147
|
-
should contain_string 'src="http://a.example.com/assets/javascripts/v/789/c.js"'
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
context "when config.asset_host is set to a%d.example.com" do
|
152
|
-
before { helper.config.stub(:asset_host).and_return "http://a%d.example.com" }
|
153
|
-
|
154
|
-
it "is three tags with srcs whose host is a[0-3].example.com" do
|
155
|
-
should =~ /src="http:\/\/a[0-3].example.com\/assets\/javascripts\/v\/123\/a.js"/
|
156
|
-
should =~ /src="http:\/\/a[0-3].example.com\/assets\/javascripts\/v\/456\/b.js"/
|
157
|
-
should =~ /src="http:\/\/a[0-3].example.com\/assets\/javascripts\/v\/789\/c.js"/
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|
@@ -1,148 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe DynamicAssets::Config do
|
4
|
-
subject { Object.new.extend(DynamicAssets::Config).tap { |m| m.init yml_path } }
|
5
|
-
let(:yml_path) { "/yml/path" }
|
6
|
-
|
7
|
-
|
8
|
-
context "when the yml file does not exist" do
|
9
|
-
before { File.stub(:exists?).with(yml_path).and_return false }
|
10
|
-
|
11
|
-
it "#asset_references_for_group_key works but returns nil" do
|
12
|
-
subject.asset_references_for_group_key(:stylesheets, :base).should be_nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it "#asset_reference_for_name works but returns nil" do
|
16
|
-
subject.asset_reference_for_name(:stylesheets, "sheet1").should be_nil
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
context "when the yml file exists" do
|
22
|
-
let(:yml) { {} }
|
23
|
-
before do
|
24
|
-
File.stub(:exists?).with(yml_path).and_return true
|
25
|
-
YAML.stub(:load_file).with(yml_path).and_return yml
|
26
|
-
end
|
27
|
-
|
28
|
-
context "and contains no config vars" do
|
29
|
-
its(:combine_asset_groups?) { should be_true }
|
30
|
-
its(:minify?) { should be_true }
|
31
|
-
its(:cache?) { should be_true }
|
32
|
-
|
33
|
-
context "and contains one group of two stylesheets" do
|
34
|
-
before { yml["stylesheets"] = [{ "base" => ["sheet1", "sheet2"] }] }
|
35
|
-
|
36
|
-
it "instantiates one StylesheetReference" do
|
37
|
-
DynamicAssets::StylesheetReference.should_receive(:new).once.and_return "a Style Ref"
|
38
|
-
subject
|
39
|
-
end
|
40
|
-
|
41
|
-
it "#asset_references_for_group_key returns one stylesheet reference for the group" do
|
42
|
-
subject.asset_references_for_group_key(:stylesheets, :base).length.should == 1
|
43
|
-
end
|
44
|
-
|
45
|
-
it "#asset_reference_for_name returns one stylesheet reference for the grouped sheet" do
|
46
|
-
subject.asset_reference_for_name(:stylesheets, "base").should_not be_nil
|
47
|
-
end
|
48
|
-
|
49
|
-
it "#asset_reference_for_name returns no stylesheet reference for an individual sheet" do
|
50
|
-
subject.asset_reference_for_name(:stylesheets, "sheet1").should be_nil
|
51
|
-
end
|
52
|
-
|
53
|
-
context "and contains one group of three javascripts" do
|
54
|
-
before { yml["javascripts"] = [{ "base" => ["script1", "script2", "script3"] }] }
|
55
|
-
|
56
|
-
it "instantiates one JavascriptReference" do
|
57
|
-
DynamicAssets::JavascriptReference.should_receive(:new).once.and_return "a JavaScript Ref"
|
58
|
-
subject
|
59
|
-
end
|
60
|
-
|
61
|
-
it "#asset_references_for_group_key returns one javascript reference for the group" do
|
62
|
-
subject.asset_references_for_group_key(:javascripts, :base).length.should == 1
|
63
|
-
end
|
64
|
-
|
65
|
-
it "#asset_reference_for_name returns one javascript reference for the grouped script" do
|
66
|
-
subject.asset_reference_for_name(:javascripts, "base").should_not be_nil
|
67
|
-
end
|
68
|
-
|
69
|
-
it "#asset_reference_for_name returns no javascript reference for an individual script" do
|
70
|
-
subject.asset_reference_for_name(:javascripts, "script2").should be_nil
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
context "when the yml file contains config vars that set minify to false" do
|
79
|
-
let(:yml) { { "config" => { Rails.env => { "minify" => false } } } }
|
80
|
-
|
81
|
-
its(:combine_asset_groups?) { should be_true }
|
82
|
-
its(:minify?) { should be_false }
|
83
|
-
its(:cache?) { should be_true }
|
84
|
-
end
|
85
|
-
|
86
|
-
context "when the yml file contains config vars that set cache to false" do
|
87
|
-
let(:yml) { { "config" => { Rails.env => { "cache" => false } } } }
|
88
|
-
|
89
|
-
its(:combine_asset_groups?) { should be_true }
|
90
|
-
its(:minify?) { should be_true }
|
91
|
-
its(:cache?) { should be_false }
|
92
|
-
end
|
93
|
-
|
94
|
-
context "when the yml file contains config vars that set combine_asset_groups to false" do
|
95
|
-
let(:yml) { { "config" => { Rails.env => { "combine_asset_groups" => false } } } }
|
96
|
-
|
97
|
-
its(:combine_asset_groups?) { should be_false }
|
98
|
-
its(:minify?) { should be_true }
|
99
|
-
its(:cache?) { should be_true }
|
100
|
-
|
101
|
-
context "and contains one group of two stylesheets" do
|
102
|
-
before { yml["stylesheets"] = [{ "base" => ["sheet1", "sheet2"] }] }
|
103
|
-
|
104
|
-
it "instantiates two StylesheetReferences" do
|
105
|
-
DynamicAssets::StylesheetReference.should_receive(:new).twice.and_return "a Style Ref"
|
106
|
-
subject
|
107
|
-
end
|
108
|
-
|
109
|
-
it "#asset_references_for_group_key returns two stylesheet references for the group" do
|
110
|
-
subject.asset_references_for_group_key(:stylesheets, :base).length.should == 2
|
111
|
-
end
|
112
|
-
|
113
|
-
it "#asset_reference_for_name returns no stylesheet reference for the grouped sheet" do
|
114
|
-
subject.asset_reference_for_name(:stylesheets, "base").should be_nil
|
115
|
-
end
|
116
|
-
|
117
|
-
it "#asset_reference_for_name returns a stylesheet reference for an individual sheet" do
|
118
|
-
subject.asset_reference_for_name(:stylesheets, "sheet1").should_not be_nil
|
119
|
-
end
|
120
|
-
|
121
|
-
context "and contains one group of three javascripts" do
|
122
|
-
before { yml["javascripts"] = [{ "base" => ["script1", "script2", "script3"] }] }
|
123
|
-
|
124
|
-
it "instantiates three JavascriptReferences" do
|
125
|
-
DynamicAssets::JavascriptReference.should_receive(:new).exactly(3).times.
|
126
|
-
and_return "a JavaScript Ref"
|
127
|
-
subject
|
128
|
-
end
|
129
|
-
|
130
|
-
it "#asset_references_for_group_key returns three javascript references for the group" do
|
131
|
-
subject.asset_references_for_group_key(:javascripts, :base).length.should == 3
|
132
|
-
end
|
133
|
-
|
134
|
-
it "#asset_reference_for_name returns no javascript reference for the grouped script" do
|
135
|
-
subject.asset_reference_for_name(:javascripts, "base").should be_nil
|
136
|
-
end
|
137
|
-
|
138
|
-
it "#asset_reference_for_name returns a javascript reference for an individual script" do
|
139
|
-
subject.asset_reference_for_name(:javascripts, "script2").should_not be_nil
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
@@ -1,139 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module DynamicAssets
|
4
|
-
describe StylesheetReference do
|
5
|
-
|
6
|
-
describe "#content" do
|
7
|
-
subject { reference.content }
|
8
|
-
let(:reference) { StylesheetReference.new :name => "thing" }
|
9
|
-
|
10
|
-
context "when a css file with the given reference name exists" do
|
11
|
-
before do
|
12
|
-
reference.stub(:path_for_member_name).with("thing").and_return "/foo/thing.css"
|
13
|
-
reference.stub(:raw_content_exists?).with("/foo/thing.css").and_return true
|
14
|
-
reference.stub(:get_raw_content).with("/foo/thing.css").and_return raw_content
|
15
|
-
end
|
16
|
-
|
17
|
-
context "and the file is blank" do
|
18
|
-
let(:raw_content) { "" }
|
19
|
-
it { should be_blank }
|
20
|
-
end
|
21
|
-
|
22
|
-
context "and the file contains styles" do
|
23
|
-
let(:raw_content) { "div.foo { color: #FFF }" }
|
24
|
-
|
25
|
-
context "and the Manager is not configured to minify" do
|
26
|
-
before { Manager.stub :minify? => false }
|
27
|
-
|
28
|
-
it "is the raw content" do
|
29
|
-
subject.should == raw_content
|
30
|
-
end
|
31
|
-
|
32
|
-
it "does not call its own #minify method" do
|
33
|
-
reference.should_not_receive :minify
|
34
|
-
subject
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context "and the Manager is configured to minify" do
|
39
|
-
before { Manager.stub :minify? => true }
|
40
|
-
|
41
|
-
it "is the result of calling its own #minify method" do
|
42
|
-
reference.should_receive(:minify).and_return "tiny output"
|
43
|
-
subject.should == "tiny output"
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "and the file contains URLs relative to the stylesheet" do
|
50
|
-
let(:raw_content) { "body { background: url(background.gif); }" }
|
51
|
-
|
52
|
-
it "makes the URLs relative to RELATIVE_URL_ROOT and the member name" do
|
53
|
-
should contain_string "url(#{StylesheetReference::RELATIVE_URL_ROOT}/thing/background.gif)"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "and the file contains URLs within directories relative to the stylesheet" do
|
58
|
-
let(:raw_content) { "body { background: url(a/b/background.gif); }" }
|
59
|
-
|
60
|
-
it "makes the URLs relative to RELATIVE_URL_ROOT and the member name" do
|
61
|
-
should contain_string "url(#{StylesheetReference::RELATIVE_URL_ROOT}/thing/a/b/background.gif)"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "and the file contains URLs with dots, relative to the stylesheet" do
|
66
|
-
let(:raw_content) { "body { background: url(../a/b/background.gif); }" }
|
67
|
-
|
68
|
-
it "makes the URLs relative to RELATIVE_URL_ROOT and the member name, ignoring leading dots" do
|
69
|
-
should contain_string "url(#{StylesheetReference::RELATIVE_URL_ROOT}/thing/a/b/background.gif)"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context "and the file contains full URLs with hosts" do
|
74
|
-
let(:raw_content) { "body { background: url(http://www.example.com/background.gif); }" }
|
75
|
-
|
76
|
-
it "leaves the URLs unchanged" do
|
77
|
-
should contain_string "url(http://www.example.com/background.gif)"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "#minify" do
|
84
|
-
subject { reference.minify content }
|
85
|
-
let(:reference) { StylesheetReference.new :name => "thing" }
|
86
|
-
|
87
|
-
context "when given content that has whitespace and comments" do
|
88
|
-
let(:content) do %Q!
|
89
|
-
/*
|
90
|
-
* Some sample styles
|
91
|
-
*/
|
92
|
-
div.foo { color: #FFF; } /* foo style */
|
93
|
-
div.bar, span.baz { font-size: 12px; }
|
94
|
-
!
|
95
|
-
end
|
96
|
-
|
97
|
-
it "is the result of calling CSSMin.minify" do
|
98
|
-
CSSMin.should_receive(:minify).with(content).and_return "tiny content"
|
99
|
-
subject.should == "tiny content"
|
100
|
-
end
|
101
|
-
|
102
|
-
# We assume CSSMin is fully tested, but as a sanity check we
|
103
|
-
# observe the StylesheetReference's behavior with a few examples:
|
104
|
-
|
105
|
-
it "contains no double spaces" do
|
106
|
-
should_not =~ / /
|
107
|
-
end
|
108
|
-
|
109
|
-
it "contains no newlines" do
|
110
|
-
should_not =~ /\n/
|
111
|
-
end
|
112
|
-
|
113
|
-
it "removes space between selectors" do
|
114
|
-
should contain_string "div.bar,span.baz"
|
115
|
-
end
|
116
|
-
|
117
|
-
it "removes space around opening brackets" do
|
118
|
-
should contain_string "span.baz{font-size"
|
119
|
-
end
|
120
|
-
|
121
|
-
it "removes space around closing brackets" do
|
122
|
-
should contain_string "}div.bar"
|
123
|
-
end
|
124
|
-
|
125
|
-
it "removes space around values" do
|
126
|
-
should contain_string "font-size:12px;}"
|
127
|
-
end
|
128
|
-
|
129
|
-
it "removes comments that are on their own lines" do
|
130
|
-
should_not contain_string "Some sample styles"
|
131
|
-
end
|
132
|
-
|
133
|
-
it "removes comments that are on the same line as a style" do
|
134
|
-
should_not contain_string "Some sample styles"
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
ENV["RAILS_ENV"] ||= 'test'
|
2
|
-
|
3
|
-
require 'dummy_rails_app/config/environment'
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
|
6
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
|
-
|
9
|
-
require 'rspec/rails'
|
10
|
-
require 'capybara/rspec'
|
11
|
-
|
12
|
-
require 'dynamic_assets'
|
13
|
-
|
14
|
-
# PENDING: not sure why these aren't auto-required
|
15
|
-
require 'app/helpers/dynamic_assets_helpers'
|
16
|
-
require 'config/routes'
|
17
|
-
|
18
|
-
# Requires supporting files with custom matchers and macros, etc,
|
19
|
-
# in ./support/ and its subdirectories.
|
20
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
21
|
-
|
22
|
-
RSpec.configure do |config|
|
23
|
-
|
24
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# Makes sure a string contains a given substring. The difference between these two:
|
4
|
-
#
|
5
|
-
# my_string.should =~ /something/ # Using a regex
|
6
|
-
# my_string.should contain_string "something" # Using this matcher
|
7
|
-
#
|
8
|
-
# is that this matcher will escape the string for you, so you can search for .*?%^ASQ
|
9
|
-
# and not get weird results.
|
10
|
-
#
|
11
|
-
RSpec::Matchers.define :contain_string do |expected|
|
12
|
-
|
13
|
-
match do |actual|
|
14
|
-
raise "Expected value has an unexpected type. It's #{expected.class} but should be String." unless
|
15
|
-
expected.is_a?(String)
|
16
|
-
raise "Actual value has an unexpected type. It's #{actual.class} but should be String." unless
|
17
|
-
actual.is_a?(String)
|
18
|
-
|
19
|
-
actual =~ /#{Regexp.escape(expected)}/
|
20
|
-
end
|
21
|
-
|
22
|
-
failure_message_for_should do |actual|
|
23
|
-
"expected that \"#{actual}\" would contain \"#{expected}\""
|
24
|
-
end
|
25
|
-
|
26
|
-
failure_message_for_should_not do |actual|
|
27
|
-
"expected that \"#{actual}\" would not contain \"#{expected}\""
|
28
|
-
end
|
29
|
-
|
30
|
-
description do
|
31
|
-
"contain \"#{expected}\""
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
#
|
38
|
-
# Example: my_string.should start_with "ABCDE"
|
39
|
-
#
|
40
|
-
RSpec::Matchers.define :start_with do |expected|
|
41
|
-
|
42
|
-
match do |actual|
|
43
|
-
raise "Actual value has an unexpected type. It's #{actual.class} but should be String." unless
|
44
|
-
actual.is_a?(String)
|
45
|
-
|
46
|
-
actual =~ /^#{Regexp.escape("#{expected}")}/
|
47
|
-
end
|
48
|
-
|
49
|
-
failure_message_for_should do |actual|
|
50
|
-
"expected that \"#{actual}\" would start with \"#{expected}\""
|
51
|
-
end
|
52
|
-
|
53
|
-
failure_message_for_should_not do |actual|
|
54
|
-
"expected that \"#{actual}\" would not start with \"#{expected}\""
|
55
|
-
end
|
56
|
-
|
57
|
-
description do
|
58
|
-
"start with \"#{expected}\""
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|