ninjs 0.16.3 → 0.16.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/VERSION +1 -1
  2. data/lib/sprockets/.gitignore +4 -0
  3. data/lib/sprockets/CHANGELOG +22 -0
  4. data/lib/sprockets/LICENSE +20 -0
  5. data/lib/sprockets/README.markdown +230 -0
  6. data/lib/sprockets/bin/sprocketize +54 -0
  7. data/lib/sprockets/ext/nph-sprockets.cgi +127 -0
  8. data/lib/sprockets/lib/sprockets.rb +42 -0
  9. data/lib/sprockets/lib/sprockets/concatenation.rb +36 -0
  10. data/lib/sprockets/lib/sprockets/environment.rb +52 -0
  11. data/lib/sprockets/lib/sprockets/error.rb +5 -0
  12. data/lib/sprockets/lib/sprockets/pathname.rb +37 -0
  13. data/lib/sprockets/lib/sprockets/preprocessor.rb +96 -0
  14. data/lib/sprockets/lib/sprockets/secretary.rb +110 -0
  15. data/lib/sprockets/lib/sprockets/source_file.rb +56 -0
  16. data/lib/sprockets/lib/sprockets/source_line.rb +85 -0
  17. data/lib/sprockets/lib/sprockets/version.rb +9 -0
  18. data/lib/sprockets/sprockets.gemspec +15 -0
  19. data/lib/sprockets/test/fixtures/assets/images/script_with_assets/one.png +1 -0
  20. data/lib/sprockets/test/fixtures/assets/images/script_with_assets/two.png +1 -0
  21. data/lib/sprockets/test/fixtures/assets/stylesheets/script_with_assets.css +1 -0
  22. data/lib/sprockets/test/fixtures/constants.yml +1 -0
  23. data/lib/sprockets/test/fixtures/double_slash_comments_that_are_not_requires_should_be_ignored_when_strip_comments_is_false.js +8 -0
  24. data/lib/sprockets/test/fixtures/double_slash_comments_that_are_not_requires_should_be_removed_by_default.js +2 -0
  25. data/lib/sprockets/test/fixtures/multiline_comments_should_be_removed_by_default.js +4 -0
  26. data/lib/sprockets/test/fixtures/requiring_a_file_after_it_has_already_been_required_should_do_nothing.js +5 -0
  27. data/lib/sprockets/test/fixtures/requiring_a_file_that_does_not_exist_should_raise_an_error.js +1 -0
  28. data/lib/sprockets/test/fixtures/requiring_a_single_file_should_replace_the_require_comment_with_the_file_contents.js +3 -0
  29. data/lib/sprockets/test/fixtures/requiring_the_current_file_should_do_nothing.js +1 -0
  30. data/lib/sprockets/test/fixtures/src/constants.yml +3 -0
  31. data/lib/sprockets/test/fixtures/src/foo.js +1 -0
  32. data/lib/sprockets/test/fixtures/src/foo/bar.js +4 -0
  33. data/lib/sprockets/test/fixtures/src/foo/foo.js +1 -0
  34. data/lib/sprockets/test/fixtures/src/script_with_assets.js +3 -0
  35. data/lib/sprockets/test/fixtures/src/script_with_comments.js +13 -0
  36. data/lib/sprockets/test/test_concatenation.rb +28 -0
  37. data/lib/sprockets/test/test_environment.rb +64 -0
  38. data/lib/sprockets/test/test_helper.rb +55 -0
  39. data/lib/sprockets/test/test_pathname.rb +43 -0
  40. data/lib/sprockets/test/test_preprocessor.rb +107 -0
  41. data/lib/sprockets/test/test_secretary.rb +89 -0
  42. data/lib/sprockets/test/test_source_file.rb +34 -0
  43. data/lib/sprockets/test/test_source_line.rb +89 -0
  44. data/ninjs.gemspec +55 -13
  45. metadata +46 -4
@@ -0,0 +1,9 @@
1
+ module Sprockets
2
+ module Version
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ TINY = 2
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join(".")
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "sprockets"
3
+ s.version = "1.0.2"
4
+ s.date = "2009-02-24"
5
+ s.summary = "JavaScript dependency management and concatenation"
6
+ s.email = "sstephenson@gmail.com"
7
+ s.homepage = "http://getsprockets.org/"
8
+ s.description = "Sprockets is a Ruby library that preprocesses and concatenates JavaScript source files."
9
+ s.rubyforge_project = "sprockets"
10
+ s.has_rdoc = false
11
+ s.authors = ["Sam Stephenson"]
12
+ s.files = Dir["Rakefile", "bin/**/*", "lib/**/*", "test/**/*", "ext/**/*"]
13
+ s.test_files = Dir["test/test_*.rb"] unless $SAFE > 0
14
+ s.executables = ["sprocketize"]
15
+ end
@@ -0,0 +1 @@
1
+ VERSION: 1.0
@@ -0,0 +1,8 @@
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
+ */
@@ -0,0 +1,2 @@
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. */
@@ -0,0 +1,4 @@
1
+ /**
2
+ * This is a PDoc comment
3
+ * that should appear in the resulting output file.
4
+ **/
@@ -0,0 +1,5 @@
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;
@@ -0,0 +1,3 @@
1
+ var before_require;
2
+ //= require <foo>
3
+ var after_require;
@@ -0,0 +1 @@
1
+ //= require "requiring_the_current_file_should_do_nothing"
@@ -0,0 +1,3 @@
1
+ ONE: one
2
+ TWO: two
3
+ HELLO: Hello world!
@@ -0,0 +1 @@
1
+ var Foo = { };
@@ -0,0 +1,4 @@
1
+ //= require "bar"
2
+ var FooBar = { };
3
+
4
+ /* Hello! */
@@ -0,0 +1 @@
1
+ var FooFoo = { };
@@ -0,0 +1,3 @@
1
+ //= provide "../assets"
2
+
3
+ var ScriptWithAssets = { };
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Comment that should remain
3
+ */
4
+
5
+ /**
6
+ * PDoc comment that should be stripped
7
+ **/
8
+
9
+ (function(){})();
10
+
11
+ // This should be stripped, too
12
+
13
+ with({}){}; // but not this
@@ -0,0 +1,28 @@
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
@@ -0,0 +1,64 @@
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
@@ -0,0 +1,55 @@
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
@@ -0,0 +1,43 @@
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
@@ -0,0 +1,107 @@
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
@@ -0,0 +1,89 @@
1
+ require "test_helper"
2
+
3
+ class SecretaryTest < Test::Unit::TestCase
4
+ def test_load_locations_are_not_expanded_when_expand_paths_is_false
5
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH)
6
+ secretary.add_load_location("src/**/", :expand_paths => false)
7
+
8
+ assert_equal [File.join(FIXTURES_PATH, "src/**"), FIXTURES_PATH],
9
+ secretary.environment.load_path.map { |pathname| pathname.absolute_location }
10
+ end
11
+
12
+ def test_load_locations_are_expanded_when_expand_paths_is_true
13
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH)
14
+ secretary.add_load_location("src/**/", :expand_paths => true)
15
+
16
+ assert_equal [File.join(FIXTURES_PATH, "src", "foo"), File.join(FIXTURES_PATH, "src"), FIXTURES_PATH],
17
+ secretary.environment.load_path.map { |pathname| pathname.absolute_location }
18
+ end
19
+
20
+ def test_source_files_are_not_expanded_when_expand_paths_is_false
21
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH)
22
+ assert_raises(Sprockets::LoadError) do
23
+ secretary.add_source_file("src/f*.js", :expand_paths => false)
24
+ end
25
+ end
26
+
27
+ def test_source_files_are_expanded_when_expand_paths_is_true
28
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH)
29
+ secretary.add_source_file("src/f*.js", :expand_paths => true)
30
+
31
+ assert_equal [File.join(FIXTURES_PATH, "src", "foo.js")],
32
+ secretary.preprocessor.source_files.map { |source_file| source_file.pathname.absolute_location }
33
+ end
34
+
35
+ def test_install_assets_into_empty_directory
36
+ with_temporary_directory do |temp|
37
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH, :asset_root => temp)
38
+ secretary.add_source_file("src/script_with_assets.js")
39
+
40
+ assert_equal [], Dir[File.join(temp, "**", "*")]
41
+ secretary.install_assets
42
+ assert_equal paths_relative_to(temp,
43
+ "images", "images/script_with_assets", "images/script_with_assets/one.png",
44
+ "images/script_with_assets/two.png", "stylesheets", "stylesheets/script_with_assets.css"),
45
+ Dir[File.join(temp, "**", "*")].sort
46
+ end
47
+ end
48
+
49
+ def test_install_assets_into_nonexistent_directory
50
+ with_temporary_directory do |temp|
51
+ temp = File.join(temp, "assets")
52
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH, :asset_root => temp)
53
+ secretary.add_source_file("src/script_with_assets.js")
54
+
55
+ assert_equal [], Dir[File.join(temp, "**", "*")]
56
+ secretary.install_assets
57
+ assert_equal paths_relative_to(temp,
58
+ "images", "images/script_with_assets", "images/script_with_assets/one.png",
59
+ "images/script_with_assets/two.png", "stylesheets", "stylesheets/script_with_assets.css"),
60
+ Dir[File.join(temp, "**", "*")].sort
61
+ end
62
+ end
63
+
64
+ def test_install_assets_into_subdirectories_that_already_exist
65
+ with_temporary_directory do |temp|
66
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH, :asset_root => temp)
67
+ secretary.add_source_file("src/script_with_assets.js")
68
+
69
+ FileUtils.mkdir_p(File.join(temp, "images", "script_with_assets"))
70
+ assert_equal paths_relative_to(temp, "images", "images/script_with_assets"), Dir[File.join(temp, "**", "*")]
71
+ secretary.install_assets
72
+ assert_equal paths_relative_to(temp,
73
+ "images", "images/script_with_assets", "images/script_with_assets/one.png",
74
+ "images/script_with_assets/two.png", "stylesheets", "stylesheets/script_with_assets.css"),
75
+ Dir[File.join(temp, "**", "*")].sort
76
+ end
77
+ end
78
+
79
+ def test_secretary_passes_strip_comments_option_through_to_preprocessor
80
+ secretary = Sprockets::Secretary.new(:root => FIXTURES_PATH, :strip_comments => false)
81
+ secretary.add_source_file("src/script_with_comments.js")
82
+ assert_equal content_of_fixture("src/script_with_comments.js"), secretary.concatenation.to_s
83
+ end
84
+
85
+ protected
86
+ def paths_relative_to(root, *paths)
87
+ paths.map { |path| File.join(root, path) }
88
+ end
89
+ end