sprockets_relative_url 0.0.1 → 1.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6828c7133914066d3801a9db6b921e185ff23d3
4
- data.tar.gz: fd1d1436b1eef3bd5cb65160fb9460c8d98d9df6
3
+ metadata.gz: 7f178dd2d77344289848a57b1ad03e3fda57ed14
4
+ data.tar.gz: c66cc99fd140581195a2b974e24674b09991c929
5
5
  SHA512:
6
- metadata.gz: bbad6f0dad17a64b955d96be5ff18606cd1bf5edb228f3843f51c7044a1a67465ce386874d56ab57da95ef2a27ef55b3e61e4d15e5de00ce3b2193dfe6b5c76a
7
- data.tar.gz: 898bdae3a5367c1e515204bb8a81d133913a1b5e0605aea57aea3828d9f568627112b629676c10caf51597caf05dff2a6c0b5e9f541b0a2edd22358af27b0e4f
6
+ metadata.gz: 74be7143490d14c696eee9e5a57e746011b58a74963856e6fff290a829176cf4ec7e2aef939cf64ad2d493579bd447c2c37b1af0991eb63ea8440b29591582e0
7
+ data.tar.gz: 2383006eab8ca1236d8fe2a7086f9d24d366c58e87a699457cbc686bff43f8ef6906964d5c42fdb1ed339c6f763bf0a7b0c713529062b8936457bba15ff4e722
@@ -1,2 +1,5 @@
1
1
  Documentation:
2
2
  Enabled: false
3
+
4
+ Encoding:
5
+ Enabled: false
data/.simplecov CHANGED
@@ -1,3 +1,10 @@
1
+ require 'coveralls'
2
+
3
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+
1
8
  SimpleCov.start do
2
9
  add_filter('spec')
3
10
  end
@@ -0,0 +1,8 @@
1
+ ---
2
+ language: ruby
3
+ rvm:
4
+ - 2.1.1
5
+ - 2.0.0
6
+ - 1.9.3
7
+ - jruby-1.7.11
8
+ - rbx-2.2.10
data/README.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Sprockets Relative URL support
2
2
 
3
+ [![Gem Version][GV img]][Gem Version]
4
+ [![Build Status][BS img]][Build Status]
5
+ [![Dependency Status][DS img]][Dependency Status]
6
+ [![Code Climate][CC img]][Code Climate]
7
+ [![Coverage Status][CS img]][Coverage Status]
8
+ [![Semantic Versioning][SV img]][Semantic Versioning]
9
+
10
+ [Gem Version]: https://rubygems.org/gems/sprockets_relative_url
11
+ [Build Status]: https://travis-ci.org/smangelsdorf/sprockets_relative_url
12
+ [Dependency Status]: https://gemnasium.com/smangelsdorf/sprockets_relative_url
13
+ [Code Climate]: https://codeclimate.com/github/smangelsdorf/sprockets_relative_url
14
+ [Coverage Status]: https://coveralls.io/r/smangelsdorf/sprockets_relative_url
15
+ [Semantic Versioning]: http://semver.org
16
+
17
+ [GV img]: https://img.shields.io/gem/v/sprockets_relative_url.svg
18
+ [BS img]: https://img.shields.io/travis/smangelsdorf/sprockets_relative_url.svg
19
+ [DS img]: https://img.shields.io/gemnasium/smangelsdorf/sprockets_relative_url.svg
20
+ [CC img]: https://img.shields.io/codeclimate/github/smangelsdorf/sprockets_relative_url.svg
21
+ [CS img]: https://img.shields.io/coveralls/smangelsdorf/sprockets_relative_url.svg
22
+ [SV img]: http://img.shields.io/badge/semver-%E2%9C%94-brightgreen.svg
23
+
3
24
  Fixes relative URLs in CSS assets using Sprockets.
4
25
 
5
26
  Each asset is resolved from Sprockets, and its relative URL will be rewritten to
@@ -7,16 +28,19 @@ use a precompiled version. By adding this preprocessor, CSS frameworks can be
7
28
  minified and combined into your `application.css` file without any need to
8
29
  rewrite the `url()` values in their CSS.
9
30
 
10
- Tested with:
31
+ Tested Rubies:
11
32
 
12
- - Rails
13
- - TODO: Sinatra
33
+ - MRI 1.9.3, 2.0.0, 2.1.x
34
+ - JRuby 1.7.x
35
+ - Rubinius 2.2.x
14
36
 
15
37
  ## Installation
16
38
 
17
39
  Add this line to your application's Gemfile:
18
40
 
19
- gem 'sprockets_relative_url'
41
+ ```ruby
42
+ gem 'sprockets_relative_url'
43
+ ```
20
44
 
21
45
  ## Usage
22
46
 
@@ -24,17 +48,57 @@ Add this line to your application's Gemfile:
24
48
 
25
49
  Add the processor to the Rails asset pipeline:
26
50
 
27
- Rails.application.assets
28
- .register_postprocessor('text/css', SprocketsRelativeUrl::Processor)
51
+ ```ruby
52
+ # config/initializers/sprockets_relative_url.rb
53
+ Rails.application.assets
54
+ .register_postprocessor('text/css', SprocketsRelativeUrl::Processor)
55
+ ```
56
+
57
+ Ensure referenced assets are being precompiled. For example:
58
+
59
+ ```ruby
60
+ # config/application.rb
61
+ config.assets.precompile << /(fonts|images)\/.*/
62
+ ```
63
+
64
+ ### Standalone Sprockets
65
+
66
+ ```ruby
67
+ env = Sprockets::Environment.new
68
+ env.append_path('app/assets')
69
+ env.register_postprocessor('text/css', SprocketsRelativeUrl::Processor)
70
+ ```
71
+
72
+ Similar to the Rails setup above, you will need to ensure that referenced assets
73
+ are being precompiled.
74
+
75
+ ## Caveats
76
+
77
+ This library uses a regular expression to grab `url(...)` values out of CSS,
78
+ which has some drawbacks:
79
+
80
+ * No support for escaped parentheses inside URLs:
81
+
82
+ ```css
83
+ background: url(images/mainbg\(white\).png);
84
+ ```
85
+
86
+ This issue is addressed by ignoring any URL which contains a backslash
87
+ character, but this obviously means that escaped characters in a URL are
88
+ prohibited. Special characters can be URL encoded to work around this.
29
89
 
30
- ### Sinatra
90
+ * Deliberately malformed CSS can probably trick the regular expression into
91
+ matching something it shouldn't. This should never be an issue, but it's
92
+ worth mentioning.
31
93
 
32
- TODO
94
+ These could be fixed properly by building a full CSS parser into the processor,
95
+ but the additional complexity is prohibitive.
33
96
 
34
97
  ## Contributing
35
98
 
36
99
  1. Fork it ( https://github.com/smangelsdorf/sprockets_relative_url/fork )
37
100
  2. Create your feature branch (`git checkout -b my-new-feature`)
38
101
  3. Commit your changes (`git commit -am 'Add some feature'`)
39
- 4. Push to the branch (`git push origin my-new-feature`)
40
- 5. Create a new Pull Request
102
+ 4. Verify project tests and style (`rake`)
103
+ 5. Push to the branch (`git push origin my-new-feature`)
104
+ 6. Create a new Pull Request
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new
7
+
8
+ task default: [:spec, :rubocop]
@@ -1,37 +1,45 @@
1
1
  module SprocketsRelativeUrl
2
2
  class Processor < Sprockets::Processor
3
3
  CSS_URL_REGEXP = /
4
- (?<=\burl\() # Match url\( prefix
4
+ (?<=[^a-zA-Z0-9_-]url\() # Match url\( prefix
5
5
  \s*
6
- (?<q>['"]?) # Opening quote
7
- (?<path>[^\)]+?) # Capture actual path
8
- \k<q> # Backref for closing quote
6
+ (?<q>['"]?) # Opening quote
7
+ (?<path>[^\)]+?) # Capture actual path
8
+ \k<q> # Backref for closing quote
9
9
  \s*
10
- (?=\)) # Match \) terminator
10
+ (?=\)) # Match \) terminator
11
11
  /x
12
12
 
13
+ private_constant :CSS_URL_REGEXP
14
+
13
15
  def evaluate(context, *)
14
16
  data.gsub(CSS_URL_REGEXP) do
15
17
  path = Regexp.last_match[:path]
16
-
17
18
  next path if should_skip?(path)
18
- root_relative_path(context, path)
19
+
20
+ uri = URI.parse(path)
21
+ next path if uri.absolute?
22
+
23
+ uri.path = root_relative_path(context, uri.path)
24
+ uri.to_s
19
25
  end
20
26
  end
21
27
 
22
28
  private
23
29
 
24
30
  def root_relative_path(context, path)
25
- asset_full_path = context.pathname.parent.join(path)
31
+ decoded = URI.decode(path)
32
+ asset_full_path = context.pathname.parent.join(decoded)
26
33
  asset = context.environment.find_asset(asset_full_path)
27
34
 
28
35
  return path if asset.nil?
29
36
 
30
- context.asset_path(asset.logical_path)
37
+ encoded = URI.encode(asset.logical_path)
38
+ context.asset_path(encoded)
31
39
  end
32
40
 
33
41
  def should_skip?(path)
34
- path.start_with?('/') || path.include?('\\') || URI.parse(path).absolute?
42
+ path.start_with?('/') || path.include?('\\')
35
43
  end
36
44
  end
37
45
  end
@@ -1,3 +1,3 @@
1
1
  module SprocketsRelativeUrl
2
- VERSION = '0.0.1'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -16,8 +16,8 @@ describe SprocketsRelativeUrl::Processor do
16
16
  end
17
17
  let(:asset_prefix) { '/assets' }
18
18
 
19
- let(:files) { %w(images/background.gif css/extra/test.gif) }
20
- let(:hash) { SecureRandom.hex(20) }
19
+ let(:files) { %w(images/background.gif css/extra/test.gif images/\.gif) }
20
+ let(:hash) { Time.now.to_i.to_s }
21
21
 
22
22
  subject { SprocketsRelativeUrl::Processor.new { data } }
23
23
 
@@ -25,7 +25,7 @@ describe SprocketsRelativeUrl::Processor do
25
25
  files.each do |file|
26
26
  pathname = base_path.join(file)
27
27
  pathname.parent.mkpath
28
- pathname.write('') unless pathname.exist?
28
+ pathname.open('w').close unless pathname.exist?
29
29
  end
30
30
 
31
31
  allow(context).to receive(:asset_path) do |s|
@@ -116,6 +116,31 @@ describe SprocketsRelativeUrl::Processor do
116
116
  include_examples 'rewrite the url'
117
117
  end
118
118
 
119
+ context 'with url encoding' do
120
+ let(:data) { 'background: url(../images/%5c.gif)' }
121
+ let(:expected) { %r{background: url\(/assets/images/%5[cC]-\h+\.gif\)} }
122
+
123
+ include_examples 'rewrite the url'
124
+ end
125
+
126
+ context 'with query parameters' do
127
+ let(:data) { 'background: url(../images/background.gif?1)' }
128
+ let(:expected) do
129
+ %r{background: url\(/assets/images/background-\h+\.gif\?1\)}
130
+ end
131
+
132
+ include_examples 'rewrite the url'
133
+ end
134
+
135
+ context 'with a url fragment' do
136
+ let(:data) { 'background: url(../images/background.gif#1)' }
137
+ let(:expected) do
138
+ %r{background: url\(/assets/images/background-\h+\.gif#1\)}
139
+ end
140
+
141
+ include_examples 'rewrite the url'
142
+ end
143
+
119
144
  context 'with a root-relative url' do
120
145
  let(:data) { 'background: url(/images/background.gif)' }
121
146
  include_examples 'leave the url alone'
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency 'bundler', '~> 1.6'
25
25
  spec.add_development_dependency 'rake'
26
26
  spec.add_development_dependency 'simplecov'
27
+ spec.add_development_dependency 'coveralls'
27
28
 
28
29
  spec.add_runtime_dependency 'sprockets', '~> 2.12'
29
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sprockets_relative_url
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shaun Mangelsdorf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-03 00:00:00.000000000 Z
11
+ date: 2014-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: guard
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: sprockets
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -133,6 +147,7 @@ files:
133
147
  - ".rspec"
134
148
  - ".rubocop.yml"
135
149
  - ".simplecov"
150
+ - ".travis.yml"
136
151
  - Gemfile
137
152
  - Guardfile
138
153
  - LICENSE.txt
@@ -171,3 +186,4 @@ summary: Fixes relative URLs in CSS assets using Sprockets.
171
186
  test_files:
172
187
  - spec/spec_helper.rb
173
188
  - spec/sprockets_relative_url/processor_spec.rb
189
+ has_rdoc: