sprockets 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sprockets might be problematic. Click here for more details.

Files changed (64) hide show
  1. data/LICENSE +21 -0
  2. data/README.md +356 -0
  3. data/lib/sprockets.rb +26 -37
  4. data/lib/sprockets/asset.rb +212 -0
  5. data/lib/sprockets/asset_attributes.rb +158 -0
  6. data/lib/sprockets/base.rb +163 -0
  7. data/lib/sprockets/bundled_asset.rb +258 -0
  8. data/lib/sprockets/cache/file_store.rb +41 -0
  9. data/lib/sprockets/caching.rb +123 -0
  10. data/lib/sprockets/charset_normalizer.rb +41 -0
  11. data/lib/sprockets/context.rb +217 -0
  12. data/lib/sprockets/digest.rb +67 -0
  13. data/lib/sprockets/directive_processor.rb +380 -0
  14. data/lib/sprockets/eco_template.rb +38 -0
  15. data/lib/sprockets/ejs_template.rb +37 -0
  16. data/lib/sprockets/engines.rb +98 -0
  17. data/lib/sprockets/environment.rb +81 -40
  18. data/lib/sprockets/errors.rb +17 -0
  19. data/lib/sprockets/index.rb +79 -0
  20. data/lib/sprockets/jst_processor.rb +26 -0
  21. data/lib/sprockets/mime.rb +38 -0
  22. data/lib/sprockets/processing.rb +280 -0
  23. data/lib/sprockets/processor.rb +32 -0
  24. data/lib/sprockets/safety_colons.rb +28 -0
  25. data/lib/sprockets/server.rb +272 -0
  26. data/lib/sprockets/static_asset.rb +86 -0
  27. data/lib/sprockets/trail.rb +114 -0
  28. data/lib/sprockets/utils.rb +67 -0
  29. data/lib/sprockets/version.rb +1 -7
  30. metadata +212 -64
  31. data/Rakefile +0 -19
  32. data/bin/sprocketize +0 -54
  33. data/ext/nph-sprockets.cgi +0 -127
  34. data/lib/sprockets/concatenation.rb +0 -36
  35. data/lib/sprockets/error.rb +0 -5
  36. data/lib/sprockets/pathname.rb +0 -37
  37. data/lib/sprockets/preprocessor.rb +0 -91
  38. data/lib/sprockets/secretary.rb +0 -106
  39. data/lib/sprockets/source_file.rb +0 -54
  40. data/lib/sprockets/source_line.rb +0 -82
  41. data/test/fixtures/assets/images/script_with_assets/one.png +0 -1
  42. data/test/fixtures/assets/images/script_with_assets/two.png +0 -1
  43. data/test/fixtures/assets/stylesheets/script_with_assets.css +0 -1
  44. data/test/fixtures/constants.yml +0 -1
  45. data/test/fixtures/double_slash_comments_that_are_not_requires_should_be_ignored_when_strip_comments_is_false.js +0 -8
  46. data/test/fixtures/double_slash_comments_that_are_not_requires_should_be_removed_by_default.js +0 -2
  47. data/test/fixtures/multiline_comments_should_be_removed_by_default.js +0 -4
  48. data/test/fixtures/requiring_a_file_after_it_has_already_been_required_should_do_nothing.js +0 -5
  49. data/test/fixtures/requiring_a_file_that_does_not_exist_should_raise_an_error.js +0 -1
  50. data/test/fixtures/requiring_a_single_file_should_replace_the_require_comment_with_the_file_contents.js +0 -3
  51. data/test/fixtures/requiring_the_current_file_should_do_nothing.js +0 -1
  52. data/test/fixtures/src/constants.yml +0 -3
  53. data/test/fixtures/src/foo.js +0 -1
  54. data/test/fixtures/src/foo/bar.js +0 -4
  55. data/test/fixtures/src/foo/foo.js +0 -1
  56. data/test/fixtures/src/script_with_assets.js +0 -3
  57. data/test/test_concatenation.rb +0 -28
  58. data/test/test_environment.rb +0 -64
  59. data/test/test_helper.rb +0 -55
  60. data/test/test_pathname.rb +0 -43
  61. data/test/test_preprocessor.rb +0 -107
  62. data/test/test_secretary.rb +0 -83
  63. data/test/test_source_file.rb +0 -34
  64. data/test/test_source_line.rb +0 -89
@@ -1,82 +0,0 @@
1
- module Sprockets
2
- class SourceLine
3
- attr_reader :source_file, :line, :number
4
-
5
- def initialize(source_file, line, number)
6
- @source_file = source_file
7
- @line = line
8
- @number = number
9
- end
10
-
11
- def comment
12
- @comment ||= line[/^\s*\/\/(.*)/, 1]
13
- end
14
-
15
- def comment?
16
- !!comment
17
- end
18
-
19
- def comment!
20
- @comment = line
21
- end
22
-
23
- def begins_multiline_comment?
24
- line =~ /^\s*\/\*(.*)/
25
- end
26
-
27
- def begins_pdoc_comment?
28
- line =~ /^\s*\/\*\*(.*)/
29
- end
30
-
31
- def ends_multiline_comment?
32
- line =~ /^(.*)\*\/\s*/
33
- end
34
-
35
- def ends_pdoc_comment?
36
- line =~ /^(.*)\*\*\/\s*/
37
- end
38
-
39
- def require
40
- @require ||= (comment || "")[/^=\s+require\s+(\"(.*?)\"|<(.*?)>)\s*$/, 1]
41
- end
42
-
43
- def require?
44
- !!require
45
- end
46
-
47
- def provide
48
- @provide ||= (comment || "")[/^=\s+provide\s+\"(.*?)\"\s*$/, 1]
49
- end
50
-
51
- def provide?
52
- !!provide
53
- end
54
-
55
- def inspect
56
- "line #@number of #{@source_file.pathname}"
57
- end
58
-
59
- def to_s(constants = source_file.environment.constants)
60
- result = line.chomp
61
- interpolate_constants!(result, constants)
62
- strip_trailing_whitespace!(result)
63
- result + $/
64
- end
65
-
66
- protected
67
- def interpolate_constants!(result, constants)
68
- result.gsub!(/<%=(.*?)%>/) do
69
- constant = $1.strip
70
- if value = constants[constant]
71
- value
72
- else
73
- raise UndefinedConstantError, "couldn't find constant `#{constant}' in #{inspect}"
74
- end
75
- end
76
- end
77
-
78
- def strip_trailing_whitespace!(result)
79
- result.gsub!(/\s+$/, "")
80
- end
81
- end
82
- end
@@ -1 +0,0 @@
1
- VERSION: 1.0
@@ -1,8 +0,0 @@
1
- // This is a double-slash comment that should appear in the resulting output file.
2
- /* This is a slash-star comment that should appear in the resulting output file. */
3
- /* This is multiline slash-star comment
4
- * that should appear in the resulting
5
- * output file */
6
- /**
7
- This is not a PDoc comment that should appear in the resulting output file.
8
- */
@@ -1,2 +0,0 @@
1
- // This is a double-slash comment that should not appear in the resulting output file.
2
- /* This is a slash-star comment that should not appear in the resulting output file. */
@@ -1,4 +0,0 @@
1
- /**
2
- * This is a PDoc comment
3
- * that should appear in the resulting output file.
4
- **/
@@ -1,5 +0,0 @@
1
- var before_first_require;
2
- //= require <foo>
3
- var after_first_require_and_before_second_require;
4
- //= require <foo>
5
- var after_second_require;
@@ -1,3 +0,0 @@
1
- var before_require;
2
- //= require <foo>
3
- var after_require;
@@ -1 +0,0 @@
1
- //= require "requiring_the_current_file_should_do_nothing"
@@ -1,3 +0,0 @@
1
- ONE: one
2
- TWO: two
3
- HELLO: Hello world!
@@ -1 +0,0 @@
1
- var Foo = { };
@@ -1,4 +0,0 @@
1
- //= require "bar"
2
- var FooBar = { };
3
-
4
- /* Hello! */
@@ -1 +0,0 @@
1
- var FooFoo = { };
@@ -1,3 +0,0 @@
1
- //= provide "../assets"
2
-
3
- var ScriptWithAssets = { };
@@ -1,28 +0,0 @@
1
- require "test_helper"
2
-
3
- class ConcatenationTest < Test::Unit::TestCase
4
- def setup
5
- @concatenation = Sprockets::Concatenation.new
6
- @environment = environment_for_fixtures
7
- end
8
-
9
- def test_record
10
- assert_equal [], @concatenation.source_lines
11
- assert_equal "hello\n", @concatenation.record(source_line("hello\n")).to_s
12
- assert_equal "world\n", @concatenation.record(source_line("world\n")).to_s
13
- assert_equal ["hello\n", "world\n"], @concatenation.source_lines.map { |source_line| source_line.to_s }
14
- end
15
-
16
- def test_to_s
17
- @concatenation.record(source_line("hello\n"))
18
- @concatenation.record(source_line("world\n"))
19
- assert_equal "hello\nworld\n", @concatenation.to_s
20
- end
21
-
22
- def test_save_to
23
- filename = File.join(FIXTURES_PATH, "output.js")
24
- @concatenation.save_to(filename)
25
- assert_equal @concatenation.to_s, IO.read(filename)
26
- File.unlink(filename)
27
- end
28
- end
@@ -1,64 +0,0 @@
1
- require "test_helper"
2
-
3
- class EnvironmentTest < Test::Unit::TestCase
4
- def test_load_path_locations_become_pathnames_for_absolute_locations_from_the_root
5
- environment = Sprockets::Environment.new("/root", ["/a", "b"])
6
- assert_load_path_equals ["/a", "/root/b", "/root"], environment
7
- end
8
-
9
- def test_pathname_from_for_location_with_leading_slash_should_return_a_pathname_with_the_location_unchanged
10
- environment = Sprockets::Environment.new("/root")
11
- assert_absolute_location "/a", environment.pathname_from("/a")
12
- end
13
-
14
- def test_pathname_from_for_relative_location_should_return_a_pathname_for_the_expanded_absolute_location_from_root
15
- environment = Sprockets::Environment.new("/root")
16
- assert_absolute_location "/root/a", environment.pathname_from("a")
17
- assert_absolute_location "/root/a", environment.pathname_from("./a")
18
- assert_absolute_location "/a", environment.pathname_from("../a")
19
- end
20
-
21
- def test_register_load_location_should_unshift_the_location_onto_the_load_path
22
- environment = Sprockets::Environment.new("/root")
23
- environment.register_load_location("a")
24
- assert_load_path_equals ["/root/a", "/root"], environment
25
- environment.register_load_location("b")
26
- assert_load_path_equals ["/root/b", "/root/a", "/root"], environment
27
- end
28
-
29
- def test_register_load_location_should_remove_already_existing_locations_before_unshifting
30
- environment = Sprockets::Environment.new("/root")
31
- environment.register_load_location("a")
32
- environment.register_load_location("b")
33
- assert_load_path_equals ["/root/b", "/root/a", "/root"], environment
34
- environment.register_load_location("a")
35
- assert_load_path_equals ["/root/a", "/root/b", "/root"], environment
36
- end
37
-
38
- def test_find_should_return_the_first_matching_pathname_in_the_load_path
39
- environment = environment_for_fixtures
40
- first_pathname = environment.find("foo.js")
41
- assert_absolute_location_ends_with "src/foo.js", first_pathname
42
-
43
- environment.register_load_location(File.join(FIXTURES_PATH, "src", "foo"))
44
- second_pathname = environment.find("foo.js")
45
- assert_not_equal first_pathname, second_pathname
46
- assert_absolute_location_ends_with "foo/foo.js", second_pathname
47
- end
48
-
49
- def test_find_should_return_nil_when_no_matching_source_file_is_found
50
- environment = environment_for_fixtures
51
- assert_nil environment.find("nonexistent.js")
52
- end
53
-
54
- def test_constants_should_return_a_hash_of_all_constants_defined_in_the_load_path
55
- constants = environment_for_fixtures.constants
56
- assert_kind_of Hash, constants
57
- assert_equal %w(HELLO ONE TWO VERSION), constants.keys.sort
58
- end
59
-
60
- protected
61
- def assert_load_path_equals(load_path_absolute_locations, environment)
62
- assert load_path_absolute_locations.zip(environment.load_path).map { |location, pathname| File.expand_path(location) == pathname.absolute_location }.all?
63
- end
64
- end
@@ -1,55 +0,0 @@
1
- require File.join(File.dirname(__FILE__), *%w".. lib sprockets")
2
- require "test/unit"
3
- require "fileutils"
4
- require "tmpdir"
5
-
6
- class Test::Unit::TestCase
7
- FIXTURES_PATH = File.expand_path(File.join(File.dirname(__FILE__), "fixtures")) unless defined?(FIXTURES_PATH)
8
-
9
- protected
10
- def location_for_fixture(fixture)
11
- File.join(FIXTURES_PATH, fixture)
12
- end
13
-
14
- def content_of_fixture(fixture)
15
- IO.read(location_for_fixture(fixture))
16
- end
17
-
18
- def environment_for_fixtures
19
- Sprockets::Environment.new(FIXTURES_PATH, source_directories_in_fixtures_path)
20
- end
21
-
22
- def source_directories_in_fixtures_path
23
- Dir[File.join(FIXTURES_PATH, "**", "src")]
24
- end
25
-
26
- def assert_absolute_location(location, pathname)
27
- assert_equal File.expand_path(location), pathname.absolute_location
28
- end
29
-
30
- def assert_absolute_location_ends_with(location_ending, pathname)
31
- assert pathname.absolute_location[/#{Regexp.escape(location_ending)}$/]
32
- end
33
-
34
- def pathname(location, environment = @environment)
35
- Sprockets::Pathname.new(environment, File.join(FIXTURES_PATH, location))
36
- end
37
-
38
- def source_file(location, environment = @environment)
39
- Sprockets::SourceFile.new(environment, pathname(location, environment))
40
- end
41
-
42
- def source_line(line, source_file = nil, line_number = 1)
43
- Sprockets::SourceLine.new(source_file || source_file("dummy"), line, line_number)
44
- end
45
-
46
- def with_temporary_directory
47
- path = File.join(Dir.tmpdir, [caller[0][/`(.*)'/, 1], Time.now.to_f].join("_"))
48
- begin
49
- FileUtils.mkdir(path)
50
- yield path
51
- ensure
52
- FileUtils.rm_rf(path)
53
- end
54
- end
55
- end
@@ -1,43 +0,0 @@
1
- require "test_helper"
2
-
3
- class PathnameTest < Test::Unit::TestCase
4
- def setup
5
- @environment = environment_for_fixtures
6
- end
7
-
8
- def test_absolute_location_is_automatically_expanded
9
- expanded_location = File.expand_path(File.join(FIXTURES_PATH, "foo"))
10
- assert_absolute_location expanded_location, pathname("foo")
11
- assert_absolute_location expanded_location, pathname("./foo")
12
- assert_absolute_location expanded_location, pathname("./foo/../foo")
13
- end
14
-
15
- def test_find_should_return_a_pathname_for_the_location_relative_to_the_absolute_location_of_the_pathname
16
- assert_absolute_location_ends_with "src/foo/bar.js", pathname("src/foo").find("bar.js")
17
- end
18
-
19
- def test_find_should_return_nil_when_the_location_relative_to_the_absolute_location_of_the_pathname_is_not_a_file_or_does_not_exist
20
- assert_nil pathname("src/foo").find("nonexistent.js")
21
- end
22
-
23
- def test_parent_pathname_should_return_a_pathname_for_the_parent_directory
24
- assert_absolute_location_ends_with "src", pathname("src/foo").parent_pathname
25
- assert_absolute_location_ends_with "foo", pathname("src/foo/foo.js").parent_pathname
26
- end
27
-
28
- def test_source_file_should_return_a_source_file_for_the_pathname
29
- source_file = pathname("src/foo.js").source_file
30
- assert_kind_of Sprockets::SourceFile, source_file
31
- assert_equal pathname("src/foo.js"), source_file.pathname
32
- end
33
-
34
- def test_equality_of_pathnames
35
- assert_equal pathname("src/foo.js"), pathname("src/foo.js")
36
- assert_equal pathname("src/foo.js"), pathname("src/foo/../foo.js")
37
- assert_not_equal pathname("src/foo.js"), pathname("src/foo/foo.js")
38
- end
39
-
40
- def test_to_s_should_return_absolute_location
41
- assert_equal pathname("src/foo.js").to_s, pathname("src/foo.js").absolute_location
42
- end
43
- end
@@ -1,107 +0,0 @@
1
- require "test_helper"
2
-
3
- class PreprocessorTest < Test::Unit::TestCase
4
- def setup
5
- @environment = environment_for_fixtures
6
- @preprocessor = Sprockets::Preprocessor.new(@environment)
7
- end
8
-
9
- def test_double_slash_comments_that_are_not_requires_should_be_removed_by_default
10
- require_file_for_this_test
11
- assert_concatenation_does_not_contain_line "// This is a double-slash comment that should not appear in the resulting output file."
12
- assert_concatenation_contains_line "/* This is a slash-star comment that should not appear in the resulting output file. */"
13
- end
14
-
15
- def test_double_slash_comments_that_are_not_requires_should_be_ignored_when_strip_comments_is_false
16
- @preprocessor = Sprockets::Preprocessor.new(@environment, :strip_comments => false)
17
- require_file_for_this_test
18
- assert_concatenation_contains_line "// This is a double-slash comment that should appear in the resulting output file."
19
- assert_concatenation_contains_line "/* This is a slash-star comment that should appear in the resulting output file. */"
20
-
21
- assert_concatenation_contains_line "/* This is multiline slash-star comment"
22
- assert_concatenation_contains_line "* that should appear in the resulting"
23
- assert_concatenation_contains_line "* output file */"
24
-
25
- assert_concatenation_contains_line "This is not a PDoc comment that should appear in the resulting output file."
26
- end
27
-
28
- def test_multiline_comments_should_be_removed_by_default
29
- require_file_for_this_test
30
- assert_concatenation_does_not_contain_line "/**"
31
- assert_concatenation_does_not_contain_line " * This is a PDoc comment"
32
- assert_concatenation_does_not_contain_line " * that should appear in the resulting output file."
33
- assert_concatenation_does_not_contain_line "**/"
34
- end
35
-
36
- def test_requiring_a_single_file_should_replace_the_require_comment_with_the_file_contents
37
- require_file_for_this_test
38
- assert_concatenation_contains <<-LINES
39
- var before_require;
40
- var Foo = { };
41
- var after_require;
42
- LINES
43
- end
44
-
45
- def test_requiring_a_file_that_does_not_exist_should_raise_an_error
46
- assert_raises(Sprockets::LoadError) do
47
- require_file_for_this_test
48
- end
49
- end
50
-
51
- def test_requiring_the_current_file_should_do_nothing
52
- require_file_for_this_test
53
- assert_equal "", output_text
54
- end
55
-
56
- def test_requiring_a_file_after_it_has_already_been_required_should_do_nothing
57
- require_file_for_this_test
58
- assert_concatenation_contains <<-LINES
59
- var before_first_require;
60
- var Foo = { };
61
- var after_first_require_and_before_second_require;
62
- var after_second_require;
63
- LINES
64
- end
65
-
66
- protected
67
- attr_reader :environment, :preprocessor
68
-
69
- def concatenation
70
- preprocessor.concatenation
71
- end
72
-
73
- def output_text
74
- preprocessor.concatenation.to_s
75
- end
76
-
77
- def source_lines_matching(line)
78
- concatenation.source_lines.select { |source_line| source_line.line.strip == line }
79
- end
80
-
81
- def require_file(location)
82
- preprocessor.require(environment.find(location).source_file)
83
- end
84
-
85
- def require_file_for_this_test
86
- require_file(file_for_this_test)
87
- end
88
-
89
- def file_for_this_test
90
- caller.map { |c| c[/`(.*?)'$/, 1] }.grep(/^test_/).first[5..-1] + ".js"
91
- end
92
-
93
- def assert_concatenation_does_not_contain_line(line)
94
- assert source_lines_matching(line).empty?, "Expected #{line.inspect} to not exist"
95
- end
96
-
97
- def assert_concatenation_contains_line(line)
98
- assert source_lines_matching(line).any?, "Expected #{line.inspect} to exist"
99
- end
100
-
101
- def assert_concatenation_contains(indented_text)
102
- lines = indented_text.split($/)
103
- initial_indent = lines.first[/^\s*/].length
104
- unindented_text = lines.map { |line| line[initial_indent..-1] }.join($/)
105
- assert output_text[unindented_text]
106
- end
107
- end