emcee 1.0.3 → 1.0.4

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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/lib/emcee/directive_processor.rb +33 -0
  3. data/lib/emcee/document.rb +44 -0
  4. data/lib/emcee/{post_processors → processors}/import_processor.rb +11 -12
  5. data/lib/emcee/processors/script_processor.rb +32 -0
  6. data/lib/emcee/processors/stylesheet_processor.rb +32 -0
  7. data/lib/emcee/railtie.rb +14 -13
  8. data/lib/emcee/resolver.rb +23 -0
  9. data/lib/emcee/version.rb +1 -1
  10. data/test/compressors_test.rb +1 -5
  11. data/test/document_test.rb +55 -0
  12. data/test/dummy/app/assets/components/test6.html +2 -1
  13. data/test/dummy/app/assets/components/test7.html +2 -0
  14. data/test/dummy/log/test.log +17338 -0
  15. data/test/dummy/tmp/cache/assets/test/sprockets/458351c9b3b38136f089d00567fa2ab9 +0 -0
  16. data/test/dummy/tmp/cache/assets/test/sprockets/d4ee6708adf72d1eb87e17c8ac3ae163 +0 -0
  17. data/test/dummy/tmp/cache/assets/test/sprockets/e0561b1cebd62df57d5d6ac9d2b23033 +0 -0
  18. data/test/dummy/tmp/cache/assets/test/sprockets/ef2c9664b54fb0d162127bdea23cb7d9 +0 -0
  19. data/test/dummy/tmp/cache/assets/test/sprockets/f16d30b33e206690649697e498a2f1a8 +0 -0
  20. data/test/dummy/tmp/cache/assets/test/sprockets/f60c4ca381dbca97bfacc058e847695f +0 -0
  21. data/test/dummy/tmp/cache/assets/test/sprockets/f70ad5f62d58f65f05f09c8cc1d3165b +0 -0
  22. data/test/dummy_app_integration_test.rb +5 -0
  23. data/test/{post_processors_test.rb → processors_test.rb} +25 -27
  24. data/test/resolver_test.rb +53 -0
  25. metadata +22 -10
  26. data/lib/emcee/post_processors/script_processor.rb +0 -42
  27. data/lib/emcee/post_processors/stylesheet_processor.rb +0 -42
  28. data/lib/emcee/pre_processors/directive_processor.rb +0 -35
@@ -1,5 +1,7 @@
1
1
  require 'test_helper'
2
2
  require 'action_controller'
3
+ require 'coffee-rails'
4
+ require 'sass'
3
5
 
4
6
  class DummyAppIntegrationTest < ActionController::TestCase
5
7
  tests DummyController
@@ -35,9 +37,12 @@ class DummyAppIntegrationTest < ActionController::TestCase
35
37
  <p>test1</p>
36
38
  <polymer-element name="test6" attributes="source">
37
39
  <template>
40
+ <p hidden?="{{ hidden }}">hidden</p>
38
41
  <img src="{{ source }}">
39
42
  </template>
40
43
  </polymer-element>
44
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
45
+ <p>External script</p>
41
46
  EOS
42
47
  end
43
48
  end
@@ -1,50 +1,48 @@
1
1
  require 'test_helper'
2
- require 'emcee/post_processors/import_processor'
3
- require 'emcee/post_processors/script_processor'
4
- require 'emcee/post_processors/stylesheet_processor'
2
+ require 'emcee/processors/import_processor'
3
+ require 'emcee/processors/script_processor'
4
+ require 'emcee/processors/stylesheet_processor'
5
+ require 'emcee/document'
5
6
 
6
- require 'coffee-rails'
7
- require 'sass'
7
+ # Create a stub of our asset resolver, so we can test if we're sending the
8
+ # correct messages to it.
9
+ class ResolverStub
10
+ attr_reader :asset_required
8
11
 
9
- # Create a stub of Sprocket's Context class, so we can test if we're sending
10
- # the correct messages to it.
11
- class ContextStub
12
- attr_reader :assets
13
-
14
- def initialize
15
- @assets = []
16
- end
17
-
18
- def pathname
12
+ def directory
19
13
  "/"
20
14
  end
21
15
 
22
16
  def require_asset(asset)
23
- @assets << asset
17
+ @asset_required = true
24
18
  end
25
19
 
26
- def evaluate(path, options = {})
20
+ def evaluate(path)
27
21
  "/* contents */"
28
22
  end
23
+
24
+ def should_inline?(path)
25
+ true
26
+ end
29
27
  end
30
28
 
31
- class PostProcessorsTest < ActiveSupport::TestCase
29
+ class ProcessorsTest < ActiveSupport::TestCase
32
30
  setup do
33
- @context = ContextStub.new
31
+ @resolver = ResolverStub.new
34
32
  @body = <<-EOS.strip_heredoc
35
33
  <link rel="import" href="test.html">
36
34
  <link rel="stylesheet" href="test.css">
37
35
  <script src="test.js"></script>
38
36
  <p>test</p>
39
37
  EOS
38
+ @doc = Emcee::Document.new(@body)
40
39
  end
41
40
 
42
41
  test "processing imports should work" do
43
- processor = Emcee::PostProcessors::ImportProcessor.new(@context)
44
- processed = processor.process(@body)
42
+ processor = Emcee::Processors::ImportProcessor.new(@resolver)
43
+ processed = processor.process(@doc).to_s
45
44
 
46
- assert_equal 1, @context.assets.length
47
- assert_equal "/test.html", @context.assets[0]
45
+ assert @resolver.asset_required
48
46
  assert_equal processed, <<-EOS.strip_heredoc
49
47
  <link rel="stylesheet" href="test.css">
50
48
  <script src="test.js"></script>
@@ -53,8 +51,8 @@ class PostProcessorsTest < ActiveSupport::TestCase
53
51
  end
54
52
 
55
53
  test "processing stylesheets should work" do
56
- processor = Emcee::PostProcessors::StylesheetProcessor.new(@context)
57
- processed = processor.process(@body)
54
+ processor = Emcee::Processors::StylesheetProcessor.new(@resolver)
55
+ processed = processor.process(@doc).to_s
58
56
 
59
57
  assert_equal processed, <<-EOS.strip_heredoc
60
58
  <link rel="import" href="test.html">
@@ -65,8 +63,8 @@ class PostProcessorsTest < ActiveSupport::TestCase
65
63
  end
66
64
 
67
65
  test "processing scripts should work" do
68
- processor = Emcee::PostProcessors::ScriptProcessor.new(@context)
69
- processed = processor.process(@body)
66
+ processor = Emcee::Processors::ScriptProcessor.new(@resolver)
67
+ processed = processor.process(@doc).to_s
70
68
 
71
69
  assert_equal processed, <<-EOS.strip_heredoc
72
70
  <link rel="import" href="test.html">
@@ -0,0 +1,53 @@
1
+ require 'test_helper'
2
+ require 'emcee/resolver.rb'
3
+
4
+ # Create a stub of Sprocket's Context class, so we can test if we're sending
5
+ # the correct messages to it.
6
+ class ContextStub
7
+ attr_reader :assets
8
+
9
+ def initialize
10
+ @assets = []
11
+ end
12
+
13
+ def pathname
14
+ "/"
15
+ end
16
+
17
+ def require_asset(asset)
18
+ @assets << asset
19
+ end
20
+
21
+ def evaluate(path, options = {})
22
+ "/* contents */"
23
+ end
24
+ end
25
+
26
+ class ResolverTest < ActiveSupport::TestCase
27
+ setup do
28
+ @context = ContextStub.new
29
+ @resolver = Emcee::Resolver.new(@context)
30
+ end
31
+
32
+ test "should have directory" do
33
+ assert_equal @resolver.directory, "/"
34
+ end
35
+
36
+ test "should require assets" do
37
+ assert_difference "@context.assets.length" do
38
+ @resolver.require_asset("/asset1")
39
+ end
40
+ end
41
+
42
+ test "should evaluate an asset" do
43
+ assert_equal @resolver.evaluate("/test"), "/* contents */"
44
+ end
45
+
46
+ test "should indicate if asset should be inlined" do
47
+ assert @resolver.should_inline?("test.css")
48
+ assert @resolver.should_inline?("/vendor/assets/test.js")
49
+
50
+ assert_not @resolver.should_inline?("//fonts.googleapis.com/css?family=RobotoDraft:regular,bold,italic,thin,light,bolditalic,black,medium&lang=en")
51
+ assert_not @resolver.should_inline?("//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js")
52
+ end
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emcee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Huth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-03 00:00:00.000000000 Z
11
+ date: 2014-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 1.3.9
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 1.3.9
83
83
  description: Add web components to the Rails asset pipeline
84
84
  email:
85
85
  - andrew@huth.me
@@ -91,20 +91,23 @@ files:
91
91
  - Rakefile
92
92
  - lib/emcee.rb
93
93
  - lib/emcee/compressors/html_compressor.rb
94
+ - lib/emcee/directive_processor.rb
95
+ - lib/emcee/document.rb
94
96
  - lib/emcee/helpers/asset_tag_helper.rb
95
97
  - lib/emcee/helpers/asset_url_helper.rb
96
98
  - lib/emcee/helpers/sprockets_helper.rb
97
99
  - lib/emcee/loose_assets.rb
98
- - lib/emcee/post_processors/import_processor.rb
99
- - lib/emcee/post_processors/script_processor.rb
100
- - lib/emcee/post_processors/stylesheet_processor.rb
101
- - lib/emcee/pre_processors/directive_processor.rb
100
+ - lib/emcee/processors/import_processor.rb
101
+ - lib/emcee/processors/script_processor.rb
102
+ - lib/emcee/processors/stylesheet_processor.rb
102
103
  - lib/emcee/railtie.rb
104
+ - lib/emcee/resolver.rb
103
105
  - lib/emcee/version.rb
104
106
  - lib/generators/emcee/install/install_generator.rb
105
107
  - lib/generators/emcee/install/templates/application.html
106
108
  - lib/generators/emcee/install/templates/template.bowerrc
107
109
  - test/compressors_test.rb
110
+ - test/document_test.rb
108
111
  - test/dummy/README.rdoc
109
112
  - test/dummy/Rakefile
110
113
  - test/dummy/app/assets/components/application.html
@@ -116,6 +119,7 @@ files:
116
119
  - test/dummy/app/assets/components/test/test3.html
117
120
  - test/dummy/app/assets/components/test1.html
118
121
  - test/dummy/app/assets/components/test6.html
122
+ - test/dummy/app/assets/components/test7.html
119
123
  - test/dummy/app/assets/javascripts/application.js
120
124
  - test/dummy/app/assets/stylesheets/application.css
121
125
  - test/dummy/app/controllers/application_controller.rb
@@ -171,13 +175,16 @@ files:
171
175
  - test/dummy/tmp/cache/assets/test/sprockets/ea6d25feb3cd8cc19f7982458443f784
172
176
  - test/dummy/tmp/cache/assets/test/sprockets/ef2c9664b54fb0d162127bdea23cb7d9
173
177
  - test/dummy/tmp/cache/assets/test/sprockets/f16d30b33e206690649697e498a2f1a8
178
+ - test/dummy/tmp/cache/assets/test/sprockets/f60c4ca381dbca97bfacc058e847695f
179
+ - test/dummy/tmp/cache/assets/test/sprockets/f70ad5f62d58f65f05f09c8cc1d3165b
174
180
  - test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655
175
181
  - test/dummy/tmp/cache/assets/test/sprockets/fadf553480495a92d11dade99298bf7e
176
182
  - test/dummy/vendor/assets/components/test4.html
177
183
  - test/dummy/vendor/assets/components/test4.js
178
184
  - test/dummy_app_integration_test.rb
179
185
  - test/helpers_test.rb
180
- - test/post_processors_test.rb
186
+ - test/processors_test.rb
187
+ - test/resolver_test.rb
181
188
  - test/test_helper.rb
182
189
  homepage: https://github.com/ahuth/emcee
183
190
  licenses:
@@ -205,6 +212,7 @@ specification_version: 4
205
212
  summary: Add web components to the Rails asset pipeline.
206
213
  test_files:
207
214
  - test/compressors_test.rb
215
+ - test/document_test.rb
208
216
  - test/dummy/app/assets/components/application.html
209
217
  - test/dummy/app/assets/components/compile/test5.css.scss
210
218
  - test/dummy/app/assets/components/compile/test5.html
@@ -214,6 +222,7 @@ test_files:
214
222
  - test/dummy/app/assets/components/test/test3.html
215
223
  - test/dummy/app/assets/components/test1.html
216
224
  - test/dummy/app/assets/components/test6.html
225
+ - test/dummy/app/assets/components/test7.html
217
226
  - test/dummy/app/assets/javascripts/application.js
218
227
  - test/dummy/app/assets/stylesheets/application.css
219
228
  - test/dummy/app/controllers/application_controller.rb
@@ -271,12 +280,15 @@ test_files:
271
280
  - test/dummy/tmp/cache/assets/test/sprockets/ea6d25feb3cd8cc19f7982458443f784
272
281
  - test/dummy/tmp/cache/assets/test/sprockets/ef2c9664b54fb0d162127bdea23cb7d9
273
282
  - test/dummy/tmp/cache/assets/test/sprockets/f16d30b33e206690649697e498a2f1a8
283
+ - test/dummy/tmp/cache/assets/test/sprockets/f60c4ca381dbca97bfacc058e847695f
284
+ - test/dummy/tmp/cache/assets/test/sprockets/f70ad5f62d58f65f05f09c8cc1d3165b
274
285
  - test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655
275
286
  - test/dummy/tmp/cache/assets/test/sprockets/fadf553480495a92d11dade99298bf7e
276
287
  - test/dummy/vendor/assets/components/test4.html
277
288
  - test/dummy/vendor/assets/components/test4.js
278
289
  - test/dummy_app_integration_test.rb
279
290
  - test/helpers_test.rb
280
- - test/post_processors_test.rb
291
+ - test/processors_test.rb
292
+ - test/resolver_test.rb
281
293
  - test/test_helper.rb
282
294
  has_rdoc:
@@ -1,42 +0,0 @@
1
- require 'nokogiri'
2
- require 'uri'
3
-
4
- module Emcee
5
- module PostProcessors
6
- # ScriptProcessor scans a document for external script references and inlines
7
- # them into the current document.
8
- class ScriptProcessor
9
- def initialize(context)
10
- @context = context
11
- @directory = File.dirname(context.pathname)
12
- end
13
-
14
- def process(data)
15
- doc = Nokogiri::HTML.fragment(data)
16
- inline_scripts(doc)
17
- URI.unescape(doc.to_s)
18
- end
19
-
20
- private
21
-
22
- def inline_scripts(doc)
23
- doc.css("script[src]").each do |node|
24
- path = absolute_path(node.attribute("src"))
25
- content = @context.evaluate(path)
26
- script = create_script(doc, content)
27
- node.replace(script)
28
- end
29
- end
30
-
31
- def absolute_path(path)
32
- File.absolute_path(path, @directory)
33
- end
34
-
35
- def create_script(doc, content)
36
- node = Nokogiri::XML::Node.new("script", doc)
37
- node.content = content
38
- node
39
- end
40
- end
41
- end
42
- end
@@ -1,42 +0,0 @@
1
- require 'nokogiri'
2
- require 'uri'
3
-
4
- module Emcee
5
- module PostProcessors
6
- # StylesheetProcessor scans a document for external stylesheet references and
7
- # inlines them into the current document.
8
- class StylesheetProcessor
9
- def initialize(context)
10
- @context = context
11
- @directory = File.dirname(context.pathname)
12
- end
13
-
14
- def process(data)
15
- doc = Nokogiri::HTML.fragment(data)
16
- inline_styles(doc)
17
- URI.unescape(doc.to_s)
18
- end
19
-
20
- private
21
-
22
- def inline_styles(doc)
23
- doc.css("link[rel='stylesheet']").each do |node|
24
- path = absolute_path(node.attribute("href"))
25
- content = @context.evaluate(path)
26
- style = create_style(doc, content)
27
- node.replace(style)
28
- end
29
- end
30
-
31
- def absolute_path(path)
32
- File.absolute_path(path, @directory)
33
- end
34
-
35
- def create_style(doc, content)
36
- node = Nokogiri::XML::Node.new("style", doc)
37
- node.content = content
38
- node
39
- end
40
- end
41
- end
42
- end
@@ -1,35 +0,0 @@
1
- module Emcee
2
- module PreProcessors
3
- # The `DirectiveProcessor` is responsible for parsing and evaluating
4
- # directive comments in a source file.
5
- class DirectiveProcessor < Sprockets::DirectiveProcessor
6
- # Matches the entire header/directive block. This is everything from the
7
- # top of the file, enclosed in html comments.
8
- HEADER_PATTERN = /\A((?m:\s*)(<!--(?m:.*?)-->))+/
9
-
10
- # Implement `render` so that it uses our own header pattern.
11
- def render(context, locals)
12
- @context = context
13
- @pathname = context.pathname
14
- @directory = File.dirname(@pathname)
15
-
16
- @header = data[HEADER_PATTERN, 0] || ""
17
- @body = $' || data
18
- # Ensure body ends in a new line
19
- @body += "\n" if @body != "" && @body !~ /\n\Z/m
20
-
21
- @included_pathnames = []
22
-
23
- @result = ""
24
- @result.force_encoding(body.encoding)
25
-
26
- @has_written_body = false
27
-
28
- process_directives
29
- process_source
30
-
31
- @result
32
- end
33
- end
34
- end
35
- end