bpm 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.gitmodules +3 -0
  2. data/Gemfile +0 -13
  3. data/TODO.md +1 -0
  4. data/bpm.gemspec +8 -3
  5. data/lib/bpm/cli/base.rb +22 -20
  6. data/lib/bpm/generator.rb +3 -3
  7. data/lib/bpm/libgems_ext/dependency_installer.rb +4 -4
  8. data/lib/bpm/libgems_ext/installer.rb +1 -1
  9. data/lib/bpm/package.rb +13 -9
  10. data/lib/bpm/pipeline/generated_asset.rb +30 -3
  11. data/lib/bpm/pipeline/transport_processor.rb +20 -12
  12. data/lib/bpm/pipeline.rb +17 -9
  13. data/lib/bpm/project.rb +42 -10
  14. data/lib/bpm/server.rb +5 -0
  15. data/lib/bpm/version.rb +1 -1
  16. data/lib/bpm.rb +2 -0
  17. data/lib/vendored_sprockets.rb +7 -0
  18. data/spec/cli/add_spec.rb +40 -37
  19. data/spec/cli/build_spec.rb +5 -5
  20. data/spec/cli/new_spec.rb +49 -23
  21. data/spec/cli/push_spec.rb +5 -5
  22. data/spec/cli/unpack_spec.rb +14 -14
  23. data/spec/fixtures/{badrake-0.8.7.spd → badrake-0.8.7.bpkg} +0 -0
  24. data/spec/fixtures/{builder-3.0.0.spd → builder-3.0.0.bpkg} +0 -0
  25. data/spec/fixtures/{bundler-1.1.pre.spd → bundler-1.1.pre.bpkg} +0 -0
  26. data/spec/fixtures/{coffee-1.0.1.pre.spd → coffee-1.0.1.pre.bpkg} +0 -0
  27. data/spec/fixtures/{core-test-0.4.9.spd → core-test-0.4.9.bpkg} +0 -0
  28. data/spec/fixtures/{custom_generator-1.0.spd → custom_generator-1.0.bpkg} +0 -0
  29. data/spec/fixtures/custom_name/MyProject.json +4 -0
  30. data/spec/fixtures/hello_world/css/dummy.css +3 -0
  31. data/spec/fixtures/{highline-1.6.1.spd → highline-1.6.1.bpkg} +0 -0
  32. data/spec/fixtures/{ivory-0.0.1.spd → ivory-0.0.1.bpkg} +0 -0
  33. data/spec/fixtures/{jquery-1.4.3.spd → jquery-1.4.3.bpkg} +0 -0
  34. data/spec/fixtures/minitest/assets/bpm_packages.js +1 -0
  35. data/spec/fixtures/minitest/assets/bpm_styles.css +0 -0
  36. data/spec/fixtures/minitest/assets/minitest/app_package.js +1 -0
  37. data/spec/fixtures/minitest/lib/main.js +1 -0
  38. data/spec/fixtures/minitest/minitest.json +22 -0
  39. data/spec/fixtures/minitest/packages/uglyduck/lib/main.js +1 -0
  40. data/spec/fixtures/minitest/packages/uglyduck/minifier/main.js +4 -0
  41. data/spec/fixtures/minitest/packages/uglyduck/package.json +21 -0
  42. data/spec/fixtures/{optparse-1.0.1.spd → optparse-1.0.1.bpkg} +0 -0
  43. data/spec/fixtures/{rake-0.8.6.spd → rake-0.8.6.bpkg} +0 -0
  44. data/spec/fixtures/{rake-0.8.7.spd → rake-0.8.7.bpkg} +0 -0
  45. data/spec/fixtures/{spade-0.5.0.spd → spade-0.5.0.bpkg} +0 -0
  46. data/spec/fixtures/transporter/packages/transport/lib/main.js +1 -0
  47. data/spec/fixtures/transporter/packages/transport/package.json +1 -1
  48. data/spec/fixtures/transporter/packages/transport/transports/wrapper.js +5 -0
  49. data/spec/gauntlet_spec.rb +2 -2
  50. data/spec/package_spec.rb +3 -3
  51. data/spec/pipeline_spec.rb +175 -54
  52. data/spec/project_spec.rb +19 -3
  53. data/spec/support/fake_gem_server.rb +4 -4
  54. data/templates/init/project.json +3 -1
  55. data/templates/project/index.html +1 -1
  56. data/vendor/sprockets/.gitignore +7 -0
  57. data/vendor/sprockets/.travis.yml +6 -0
  58. data/vendor/sprockets/Gemfile +8 -0
  59. data/vendor/sprockets/LICENSE +20 -0
  60. data/vendor/sprockets/README.md +22 -0
  61. data/vendor/sprockets/Rakefile +8 -0
  62. data/vendor/sprockets/lib/sprockets/asset.rb +203 -0
  63. data/vendor/sprockets/lib/sprockets/asset_attributes.rb +161 -0
  64. data/vendor/sprockets/lib/sprockets/base.rb +147 -0
  65. data/vendor/sprockets/lib/sprockets/bundled_asset.rb +222 -0
  66. data/vendor/sprockets/lib/sprockets/cache/file_store.rb +41 -0
  67. data/vendor/sprockets/lib/sprockets/caching.rb +121 -0
  68. data/vendor/sprockets/lib/sprockets/charset_normalizer.rb +41 -0
  69. data/vendor/sprockets/lib/sprockets/context.rb +191 -0
  70. data/vendor/sprockets/lib/sprockets/digest.rb +73 -0
  71. data/vendor/sprockets/lib/sprockets/directive_processor.rb +380 -0
  72. data/vendor/sprockets/lib/sprockets/eco_template.rb +39 -0
  73. data/vendor/sprockets/lib/sprockets/ejs_template.rb +38 -0
  74. data/vendor/sprockets/lib/sprockets/engines.rb +92 -0
  75. data/vendor/sprockets/lib/sprockets/environment.rb +93 -0
  76. data/vendor/sprockets/lib/sprockets/errors.rb +17 -0
  77. data/vendor/sprockets/lib/sprockets/index.rb +80 -0
  78. data/vendor/sprockets/lib/sprockets/jst_processor.rb +26 -0
  79. data/vendor/sprockets/lib/sprockets/processing.rb +310 -0
  80. data/vendor/sprockets/lib/sprockets/processor.rb +32 -0
  81. data/vendor/sprockets/lib/sprockets/safety_colons.rb +28 -0
  82. data/vendor/sprockets/lib/sprockets/server.rb +270 -0
  83. data/vendor/sprockets/lib/sprockets/static_asset.rb +87 -0
  84. data/vendor/sprockets/lib/sprockets/static_compilation.rb +82 -0
  85. data/vendor/sprockets/lib/sprockets/trail.rb +122 -0
  86. data/vendor/sprockets/lib/sprockets/utils.rb +67 -0
  87. data/vendor/sprockets/lib/sprockets/version.rb +3 -0
  88. data/vendor/sprockets/lib/sprockets.rb +31 -0
  89. data/vendor/sprockets/sprockets.gemspec +30 -0
  90. data/vendor/sprockets/test/fixtures/asset/POW.png +0 -0
  91. data/vendor/sprockets/test/fixtures/asset/application.js +6 -0
  92. data/vendor/sprockets/test/fixtures/asset/bar-utf8.css +2 -0
  93. data/vendor/sprockets/test/fixtures/asset/charset.css +2 -0
  94. data/vendor/sprockets/test/fixtures/asset/circle/a.js +2 -0
  95. data/vendor/sprockets/test/fixtures/asset/circle/b.js +2 -0
  96. data/vendor/sprockets/test/fixtures/asset/circle/c.js +2 -0
  97. data/vendor/sprockets/test/fixtures/asset/compat.js +4 -0
  98. data/vendor/sprockets/test/fixtures/asset/constants.js +2 -0
  99. data/vendor/sprockets/test/fixtures/asset/constants.yml +1 -0
  100. data/vendor/sprockets/test/fixtures/asset/default_mime_type.js +1 -0
  101. data/vendor/sprockets/test/fixtures/asset/filename.js.erb +1 -0
  102. data/vendor/sprockets/test/fixtures/asset/foo-utf8.css +2 -0
  103. data/vendor/sprockets/test/fixtures/asset/included_header.js +4 -0
  104. data/vendor/sprockets/test/fixtures/asset/jquery.tmpl.min.js +1 -0
  105. data/vendor/sprockets/test/fixtures/asset/mismatch.js +1 -0
  106. data/vendor/sprockets/test/fixtures/asset/multiple.js +2 -0
  107. data/vendor/sprockets/test/fixtures/asset/multipleengine.js +1 -0
  108. data/vendor/sprockets/test/fixtures/asset/noengine.js +1 -0
  109. data/vendor/sprockets/test/fixtures/asset/noformat.coffee +1 -0
  110. data/vendor/sprockets/test/fixtures/asset/one.css +1 -0
  111. data/vendor/sprockets/test/fixtures/asset/oneengine.js +1 -0
  112. data/vendor/sprockets/test/fixtures/asset/project.css +1 -0
  113. data/vendor/sprockets/test/fixtures/asset/project.js.erb +4 -0
  114. data/vendor/sprockets/test/fixtures/asset/relative/include.js +4 -0
  115. data/vendor/sprockets/test/fixtures/asset/relative/require.js +1 -0
  116. data/vendor/sprockets/test/fixtures/asset/relative/require_outside_path.js +1 -0
  117. data/vendor/sprockets/test/fixtures/asset/require_self.css +9 -0
  118. data/vendor/sprockets/test/fixtures/asset/require_self_twice.css +8 -0
  119. data/vendor/sprockets/test/fixtures/asset/semicolons/bar.js +1 -0
  120. data/vendor/sprockets/test/fixtures/asset/semicolons/index.js +5 -0
  121. data/vendor/sprockets/test/fixtures/asset/sprite.css.erb +12 -0
  122. data/vendor/sprockets/test/fixtures/asset/tree/all/b/c/d.js +2 -0
  123. data/vendor/sprockets/test/fixtures/asset/tree/all/b/c/e.js +1 -0
  124. data/vendor/sprockets/test/fixtures/asset/tree/all/b/c.js +1 -0
  125. data/vendor/sprockets/test/fixtures/asset/tree/all/b.css +2 -0
  126. data/vendor/sprockets/test/fixtures/asset/tree/all/b.js.erb +1 -0
  127. data/vendor/sprockets/test/fixtures/asset/tree/all/d/c.js.coffee +1 -0
  128. data/vendor/sprockets/test/fixtures/asset/tree/all/d/e.js +1 -0
  129. data/vendor/sprockets/test/fixtures/asset/tree/all_with_require.js +7 -0
  130. data/vendor/sprockets/test/fixtures/asset/tree/all_with_require_directory.js +1 -0
  131. data/vendor/sprockets/test/fixtures/asset/tree/all_with_require_tree.js +2 -0
  132. data/vendor/sprockets/test/fixtures/asset/tree/directory/application.js +2 -0
  133. data/vendor/sprockets/test/fixtures/asset/tree/directory/bar.js +1 -0
  134. data/vendor/sprockets/test/fixtures/asset/tree/directory/foo.js +1 -0
  135. data/vendor/sprockets/test/fixtures/asset/tree/tree/application.js +2 -0
  136. data/vendor/sprockets/test/fixtures/asset/tree/tree/bar.js +1 -0
  137. data/vendor/sprockets/test/fixtures/asset/tree/tree/foo.js +1 -0
  138. data/vendor/sprockets/test/fixtures/asset/tree/with_logical_path/a/a.js +1 -0
  139. data/vendor/sprockets/test/fixtures/asset/tree/with_logical_path/require_tree_with_logical_path.js +1 -0
  140. data/vendor/sprockets/test/fixtures/asset/tree/without_argument/a.js +1 -0
  141. data/vendor/sprockets/test/fixtures/asset/tree/without_argument/b.js +1 -0
  142. data/vendor/sprockets/test/fixtures/asset/tree/without_argument/require_tree_without_argument.js +1 -0
  143. data/vendor/sprockets/test/fixtures/asset/two.css +1 -0
  144. data/vendor/sprockets/test/fixtures/asset/unicode.js +2 -0
  145. data/vendor/sprockets/test/fixtures/asset/unknownexts.min.js +2 -0
  146. data/vendor/sprockets/test/fixtures/asset/users.js.erb.str +4 -0
  147. data/vendor/sprockets/test/fixtures/context/POW.png +0 -0
  148. data/vendor/sprockets/test/fixtures/context/application.js.yml +3 -0
  149. data/vendor/sprockets/test/fixtures/context/bar.js +1 -0
  150. data/vendor/sprockets/test/fixtures/context/foo.js +2 -0
  151. data/vendor/sprockets/test/fixtures/context/helpers.css.erb +3 -0
  152. data/vendor/sprockets/test/fixtures/context/properties.js.erb +7 -0
  153. data/vendor/sprockets/test/fixtures/context/require_glob.js +1 -0
  154. data/vendor/sprockets/test/fixtures/context/resolve_content_type.js.erb +4 -0
  155. data/vendor/sprockets/test/fixtures/context/sprite.css.embed +3 -0
  156. data/vendor/sprockets/test/fixtures/default/application.js.coffee +4 -0
  157. data/vendor/sprockets/test/fixtures/default/coffee/foo.coffee +1 -0
  158. data/vendor/sprockets/test/fixtures/default/coffee/index.js +3 -0
  159. data/vendor/sprockets/test/fixtures/default/empty +0 -0
  160. data/vendor/sprockets/test/fixtures/default/gallery.css.erb +3 -0
  161. data/vendor/sprockets/test/fixtures/default/gallery.js +1 -0
  162. data/vendor/sprockets/test/fixtures/default/goodbye.jst.eco +1 -0
  163. data/vendor/sprockets/test/fixtures/default/hello.jst.ejs +1 -0
  164. data/vendor/sprockets/test/fixtures/default/hello.txt +1 -0
  165. data/vendor/sprockets/test/fixtures/default/interpolation.js +1 -0
  166. data/vendor/sprockets/test/fixtures/default/missing_require.js +1 -0
  167. data/vendor/sprockets/test/fixtures/default/mobile/a.js +1 -0
  168. data/vendor/sprockets/test/fixtures/default/mobile/b.js +1 -0
  169. data/vendor/sprockets/test/fixtures/default/mobile/c.css +1 -0
  170. data/vendor/sprockets/test/fixtures/default/mobile/d.css +1 -0
  171. data/vendor/sprockets/test/fixtures/default/mobile/index.css +3 -0
  172. data/vendor/sprockets/test/fixtures/default/mobile/index.js +1 -0
  173. data/vendor/sprockets/test/fixtures/default/noreturn.js +1 -0
  174. data/vendor/sprockets/test/fixtures/default/project.js.coffee.erb +2 -0
  175. data/vendor/sprockets/test/fixtures/directives/code_before_comment +3 -0
  176. data/vendor/sprockets/test/fixtures/directives/comment_without_directives +6 -0
  177. data/vendor/sprockets/test/fixtures/directives/directive_word_splitting +6 -0
  178. data/vendor/sprockets/test/fixtures/directives/directives_after_header +16 -0
  179. data/vendor/sprockets/test/fixtures/directives/double_slash +9 -0
  180. data/vendor/sprockets/test/fixtures/directives/hash +8 -0
  181. data/vendor/sprockets/test/fixtures/directives/no_header +2 -0
  182. data/vendor/sprockets/test/fixtures/directives/slash_star +10 -0
  183. data/vendor/sprockets/test/fixtures/directives/slash_star_single +4 -0
  184. data/vendor/sprockets/test/fixtures/directives/space_between_directive_word +2 -0
  185. data/vendor/sprockets/test/fixtures/directives/triple_hash +10 -0
  186. data/vendor/sprockets/test/fixtures/encoding/ascii.js +1 -0
  187. data/vendor/sprockets/test/fixtures/encoding/ascii_utf8.js +2 -0
  188. data/vendor/sprockets/test/fixtures/encoding/utf16.js +0 -0
  189. data/vendor/sprockets/test/fixtures/encoding/utf8.js +1 -0
  190. data/vendor/sprockets/test/fixtures/encoding/utf8_bom.js +1 -0
  191. data/vendor/sprockets/test/fixtures/engines/hello.alert +1 -0
  192. data/vendor/sprockets/test/fixtures/engines/moo.js.str +1 -0
  193. data/vendor/sprockets/test/fixtures/public/compiled-digest-0aa2105d29558f3eb790d411d7d8fb66.js +3 -0
  194. data/vendor/sprockets/test/fixtures/public/compiled-digest-1c41eb0cf934a0c76babe875f982f9d1.js +1 -0
  195. data/vendor/sprockets/test/fixtures/server/app/javascripts/application.js +5 -0
  196. data/vendor/sprockets/test/fixtures/server/app/javascripts/bar.js +1 -0
  197. data/vendor/sprockets/test/fixtures/server/app/javascripts/foo.js +1 -0
  198. data/vendor/sprockets/test/fixtures/server/app/javascripts/hello.txt +2 -0
  199. data/vendor/sprockets/test/fixtures/server/app/javascripts/tree.js +1 -0
  200. data/vendor/sprockets/test/fixtures/server/vendor/javascripts/missing_require.js +1 -0
  201. data/vendor/sprockets/test/fixtures/server/vendor/stylesheets/missing_require.css +1 -0
  202. data/vendor/sprockets/test/sprockets_test.rb +56 -0
  203. data/vendor/sprockets/test/test_asset.rb +593 -0
  204. data/vendor/sprockets/test/test_asset_attributes.rb +86 -0
  205. data/vendor/sprockets/test/test_caching.rb +62 -0
  206. data/vendor/sprockets/test/test_context.rb +115 -0
  207. data/vendor/sprockets/test/test_directive_processor.rb +124 -0
  208. data/vendor/sprockets/test/test_encoding.rb +65 -0
  209. data/vendor/sprockets/test/test_engines.rb +73 -0
  210. data/vendor/sprockets/test/test_environment.rb +610 -0
  211. data/vendor/sprockets/test/test_server.rb +227 -0
  212. metadata +258 -54
  213. data/spec/fixtures/transporter/packages/transport/lib/wrapper.js +0 -5
@@ -0,0 +1,56 @@
1
+ require "test/unit"
2
+ require "sprockets"
3
+ require "tilt"
4
+ require "fileutils"
5
+
6
+ if defined? Encoding
7
+ Encoding.default_external = 'utf-8'
8
+ Encoding.default_internal = 'utf-8'
9
+ end
10
+
11
+ class Sprockets::TestCase < Test::Unit::TestCase
12
+ FIXTURE_ROOT = File.expand_path(File.join(File.dirname(__FILE__), "fixtures"))
13
+
14
+ undef_method :default_test if method_defined? :default_test
15
+
16
+ def self.test(name, &block)
17
+ define_method("test #{name.inspect}", &block)
18
+ end
19
+
20
+ def fixture(path)
21
+ IO.read(fixture_path(path))
22
+ end
23
+
24
+ def fixture_path(path)
25
+ File.join(FIXTURE_ROOT, path)
26
+ end
27
+
28
+ def sandbox(*paths)
29
+ backup_paths = paths.select { |path| File.exist?(path) }
30
+ remove_paths = paths.select { |path| !File.exist?(path) }
31
+
32
+ begin
33
+ backup_paths.each do |path|
34
+ FileUtils.cp(path, "#{path}.orig")
35
+ end
36
+
37
+ yield
38
+ ensure
39
+ backup_paths.each do |path|
40
+ if File.exist?("#{path}.orig")
41
+ FileUtils.mv("#{path}.orig", path)
42
+ end
43
+
44
+ assert !File.exist?("#{path}.orig")
45
+ end
46
+
47
+ remove_paths.each do |path|
48
+ if File.exist?(path)
49
+ FileUtils.rm_rf(path)
50
+ end
51
+
52
+ assert !File.exist?(path)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,593 @@
1
+ require "sprockets_test"
2
+
3
+ module AssetTests
4
+ def self.test(name, &block)
5
+ define_method("test #{name.inspect}", &block)
6
+ end
7
+
8
+ test "pathname is a Pathname that exists" do
9
+ assert_kind_of Pathname, @asset.pathname
10
+ assert @asset.pathname.exist?
11
+ end
12
+
13
+ test "logical path can find itself" do
14
+ assert_equal @asset, @env[@asset.logical_path]
15
+ end
16
+
17
+ test "mtime" do
18
+ assert @asset.mtime
19
+ end
20
+
21
+ test "digest" do
22
+ assert @asset.digest
23
+ end
24
+
25
+ test "stale?" do
26
+ assert !@asset.stale?
27
+ end
28
+
29
+ test "fresh?" do
30
+ assert @asset.fresh?
31
+ end
32
+
33
+ test "dependencies are an Array" do
34
+ assert_kind_of Array, @asset.dependencies
35
+ end
36
+
37
+ test "splat asset" do
38
+ assert_kind_of Array, @asset.to_a
39
+ end
40
+
41
+ test "body is a String" do
42
+ assert_kind_of String, @asset.body
43
+ end
44
+
45
+ test "write to file" do
46
+ target = fixture_path('asset/tmp.js')
47
+ begin
48
+ @asset.write_to(target)
49
+ assert File.exist?(target)
50
+ assert_equal @asset.mtime, File.mtime(target)
51
+ ensure
52
+ FileUtils.rm(target) if File.exist?(target)
53
+ assert !File.exist?(target)
54
+ end
55
+ end
56
+
57
+ test "write to gzipped file" do
58
+ target = fixture_path('asset/tmp.js.gz')
59
+ begin
60
+ @asset.write_to(target)
61
+ assert File.exist?(target)
62
+ assert_equal @asset.mtime, File.mtime(target)
63
+ ensure
64
+ FileUtils.rm(target) if File.exist?(target)
65
+ assert !File.exist?(target)
66
+ end
67
+ end
68
+ end
69
+
70
+ class StaticAssetTest < Sprockets::TestCase
71
+ def setup
72
+ @env = Sprockets::Environment.new
73
+ @env.append_path(fixture_path('asset'))
74
+ @env.cache = {}
75
+
76
+ @asset = @env['POW.png']
77
+ end
78
+
79
+ include AssetTests
80
+
81
+ test "class" do
82
+ assert_kind_of Sprockets::StaticAsset, @asset
83
+ end
84
+
85
+ test "content type" do
86
+ assert_equal "image/png", @asset.content_type
87
+ end
88
+
89
+ test "length" do
90
+ assert_equal 42917, @asset.length
91
+ end
92
+
93
+ test "splat" do
94
+ assert_equal [@asset], @asset.to_a
95
+ end
96
+
97
+ test "dependencies" do
98
+ assert_equal [], @asset.dependencies
99
+ end
100
+
101
+ test "to path" do
102
+ assert_equal fixture_path('asset/POW.png'), @asset.to_path
103
+ end
104
+
105
+ test "body is entire contents" do
106
+ assert_equal @asset.to_s, @asset.body
107
+ end
108
+
109
+ test "asset is fresh if its mtime and contents are the same" do
110
+ assert @asset.fresh?
111
+ end
112
+
113
+ test "asset is stale if its environment has changed" do
114
+ assert @asset.fresh?
115
+ @env.prepend_path fixture_path('default')
116
+ assert @asset.stale?
117
+ end
118
+
119
+ test "asset is fresh if its mtime is changed but its contents is the same" do
120
+ filename = fixture_path('asset/POW.png')
121
+
122
+ sandbox filename do
123
+ File.open(filename, 'w') { |f| f.write "a" }
124
+ asset = @env['POW.png']
125
+
126
+ assert asset.fresh?
127
+
128
+ File.open(filename, 'w') { |f| f.write "a" }
129
+ mtime = Time.now + 1
130
+ File.utime(mtime, mtime, filename)
131
+
132
+ assert asset.fresh?
133
+ end
134
+ end
135
+
136
+ test "asset is stale when its contents has changed" do
137
+ filename = fixture_path('asset/POW.png')
138
+
139
+ sandbox filename do
140
+ File.open(filename, 'w') { |f| f.write "a" }
141
+ asset = @env['POW.png']
142
+
143
+ assert asset.fresh?
144
+
145
+ File.open(filename, 'w') { |f| f.write "b" }
146
+ mtime = Time.now + 1
147
+ File.utime(mtime, mtime, filename)
148
+
149
+ assert asset.stale?
150
+ end
151
+ end
152
+
153
+ test "asset is stale if the file is removed" do
154
+ filename = fixture_path('asset/POW.png')
155
+
156
+ sandbox filename do
157
+ File.open(filename, 'w') { |f| f.write "a" }
158
+ asset = @env['POW.png']
159
+
160
+ assert asset.fresh?
161
+
162
+ File.unlink(filename)
163
+
164
+ assert asset.stale?
165
+ end
166
+ end
167
+
168
+ test "serializing asset to and from hash" do
169
+ expected = @asset
170
+ hash = {}
171
+ @asset.encode_with(hash)
172
+ actual = @env.asset_from_hash(hash)
173
+
174
+ assert_kind_of Sprockets::StaticAsset, actual
175
+ assert_equal expected.logical_path, actual.logical_path
176
+ assert_equal expected.pathname, actual.pathname
177
+ assert_equal expected.content_type, actual.content_type
178
+ assert_equal expected.length, actual.length
179
+ assert_equal expected.digest, actual.digest
180
+
181
+ assert_equal expected.dependencies, actual.dependencies
182
+ assert_equal expected.to_a, actual.to_a
183
+ assert_equal expected.body, actual.body
184
+ assert_equal expected.to_s, actual.to_s
185
+
186
+ assert actual.eql?(expected)
187
+ assert expected.eql?(actual)
188
+ end
189
+ end
190
+
191
+ class BundledAssetTest < Sprockets::TestCase
192
+ def setup
193
+ @env = Sprockets::Environment.new
194
+ @env.append_path(fixture_path('asset'))
195
+ @env.cache = {}
196
+
197
+ @asset = @env['application.js']
198
+ end
199
+
200
+ include AssetTests
201
+
202
+ test "class" do
203
+ assert_kind_of Sprockets::BundledAsset, @asset
204
+ end
205
+
206
+ test "content type" do
207
+ assert_equal "application/javascript", @asset.content_type
208
+ end
209
+
210
+ test "length" do
211
+ assert_equal 157, @asset.length
212
+ end
213
+
214
+ test "to_s" do
215
+ assert_equal "var Project = {\n find: function(id) {\n }\n};\nvar Users = {\n find: function(id) {\n }\n};\n\ndocument.on('dom:loaded', function() {\n $('search').focus();\n});\n", @asset.to_s
216
+ end
217
+
218
+ test "each" do
219
+ body = ""
220
+ @asset.each { |part| body << part }
221
+ assert_equal "var Project = {\n find: function(id) {\n }\n};\nvar Users = {\n find: function(id) {\n }\n};\n\ndocument.on('dom:loaded', function() {\n $('search').focus();\n});\n", body
222
+ end
223
+
224
+ test "requiring the same file multiple times has no effect" do
225
+ assert_equal read("project.js")+"\n", asset("multiple.js").to_s
226
+ end
227
+
228
+ test "requiring a file of a different format raises an exception" do
229
+ assert_raise Sprockets::ContentTypeMismatch do
230
+ asset("mismatch.js")
231
+ end
232
+ end
233
+
234
+ test "splatted asset includes itself" do
235
+ assert_equal [resolve("project.js")], asset("project.js").to_a.map(&:pathname)
236
+ end
237
+
238
+ test "asset includes self as dependency" do
239
+ assert_equal [], asset("project.js").dependencies.map(&:pathname)
240
+ end
241
+
242
+ test "asset with child dependencies" do
243
+ assert_equal [resolve("project.js"), resolve("users.js")],
244
+ asset("application.js").dependencies.map(&:pathname)
245
+ end
246
+
247
+ test "splatted asset with child dependencies" do
248
+ assert_equal [resolve("project.js"), resolve("users.js"), resolve("application.js")],
249
+ asset("application.js").to_a.map(&:pathname)
250
+ end
251
+
252
+ test "bundled asset body is just its own contents" do
253
+ assert_equal "\ndocument.on('dom:loaded', function() {\n $('search').focus();\n});\n",
254
+ asset("application.js").body
255
+ end
256
+
257
+ test "bundling joins files with blank line" do
258
+ assert_equal "var Project = {\n find: function(id) {\n }\n};\nvar Users = {\n find: function(id) {\n }\n};\n\ndocument.on('dom:loaded', function() {\n $('search').focus();\n});\n",
259
+ asset("application.js").to_s
260
+ end
261
+
262
+ test "dependencies appear in the source before files that required them" do
263
+ assert_match(/Project.+Users.+focus/m, asset("application.js").to_s)
264
+ end
265
+
266
+ test "processing a source file with no engine extensions" do
267
+ assert_equal read("users.js"), asset("noengine.js").to_s
268
+ end
269
+
270
+ test "processing a source file with one engine extension" do
271
+ assert_equal read("users.js"), asset("oneengine.js").to_s
272
+ end
273
+
274
+ test "processing a source file with multiple engine extensions" do
275
+ assert_equal read("users.js"), asset("multipleengine.js").to_s
276
+ end
277
+
278
+ test "processing a source file with unknown extensions" do
279
+ assert_equal read("users.js") + "var jQuery;\n", asset("unknownexts.min.js").to_s
280
+ end
281
+
282
+ test "processing a source file in compat mode" do
283
+ assert_equal read("project.js") + "\n" + read("users.js"),
284
+ asset("compat.js").to_s
285
+ end
286
+
287
+ test "included dependencies are inserted after the header of the dependent file" do
288
+ assert_equal "# My Application\n" + read("project.js") + "\n\nhello();\n",
289
+ asset("included_header.js").to_s
290
+ end
291
+
292
+ test "requiring a file with a relative path" do
293
+ assert_equal read("project.js") + "\n",
294
+ asset("relative/require.js").to_s
295
+ end
296
+
297
+ test "including a file with a relative path" do
298
+ assert_equal "// Included relatively\n" + read("project.js") + "\n\nhello();\n", asset("relative/include.js").to_s
299
+ end
300
+
301
+ test "can't require files outside the load path" do
302
+ assert_raise Sprockets::FileNotFound do
303
+ asset("relative/require_outside_path.js")
304
+ end
305
+ end
306
+
307
+ test "require_directory requires all child files in alphabetical order" do
308
+ assert_equal(
309
+ "ok(\"b.js.erb\");\n",
310
+ asset("tree/all_with_require_directory.js").to_s
311
+ )
312
+ end
313
+
314
+ test "require_directory current directory includes self last" do
315
+ assert_equal(
316
+ "var Bar;\nvar Foo;\nvar App;\n",
317
+ asset("tree/directory/application.js").to_s
318
+ )
319
+ end
320
+
321
+ test "require_tree requires all descendant files in alphabetical order" do
322
+ assert_equal(
323
+ asset("tree/all_with_require.js").to_s,
324
+ asset("tree/all_with_require_tree.js").to_s
325
+ )
326
+ end
327
+
328
+ test "require_tree without an argument defaults to the current directory" do
329
+ assert_equal(
330
+ "a();\nb();\n",
331
+ asset("tree/without_argument/require_tree_without_argument.js").to_s
332
+ )
333
+ end
334
+
335
+ test "require_tree with current directory includes self last" do
336
+ assert_equal(
337
+ "var Bar;\nvar Foo;\nvar App;\n",
338
+ asset("tree/tree/application.js").to_s
339
+ )
340
+ end
341
+
342
+ test "require_tree with a logical path argument raises an exception" do
343
+ assert_raise(Sprockets::ArgumentError) do
344
+ asset("tree/with_logical_path/require_tree_with_logical_path.js").to_s
345
+ end
346
+ end
347
+
348
+ test "require_self inserts the current file's body at the specified point" do
349
+ assert_equal "/* b.css */\n\nb { display: none }\n/*\n */\n.one {}\n\n\nbody {}\n.two {}\n.project {}\n", asset("require_self.css").to_s
350
+ end
351
+
352
+ test "multiple require_self directives raises and error" do
353
+ assert_raise(Sprockets::ArgumentError) do
354
+ asset("require_self_twice.css")
355
+ end
356
+ end
357
+
358
+ test "circular require raises an error" do
359
+ assert_raise(Sprockets::CircularDependencyError) do
360
+ asset("circle/a.js")
361
+ end
362
+ assert_raise(Sprockets::CircularDependencyError) do
363
+ asset("circle/b.js")
364
+ end
365
+ assert_raise(Sprockets::CircularDependencyError) do
366
+ asset("circle/c.js")
367
+ end
368
+ end
369
+
370
+ test "__FILE__ is properly set in templates" do
371
+ assert_equal %(var filename = "#{resolve("filename.js")}";\n),
372
+ asset("filename.js").to_s
373
+ end
374
+
375
+ test "asset inherits the format extension and content type of the original file" do
376
+ asset = asset("project.js")
377
+ assert_equal "application/javascript", asset.content_type
378
+ end
379
+
380
+ if Tilt::CoffeeScriptTemplate.respond_to?(:default_mime_type)
381
+ test "asset falls back to engines default mime type" do
382
+ asset = asset("default_mime_type.js")
383
+ assert_equal "application/javascript", asset.content_type
384
+ end
385
+ end
386
+
387
+ test "asset is a rack response body" do
388
+ body = ""
389
+ asset("project.js").each { |part| body += part }
390
+ assert_equal asset("project.js").to_s, body
391
+ end
392
+
393
+ test "asset length is source length" do
394
+ assert_equal 46, asset("project.js").length
395
+ end
396
+
397
+ test "asset length is source length with unicode characters" do
398
+ assert_equal 8, asset("unicode.js").length
399
+ end
400
+
401
+ test "asset digest" do
402
+ assert asset("project.js").digest
403
+ end
404
+
405
+ test "asset is fresh if its mtime and contents are the same" do
406
+ assert asset("application.js").fresh?
407
+ end
408
+
409
+ test "asset is stale if its environment has changed" do
410
+ asset = asset("application.js")
411
+ assert asset.fresh?
412
+ @env.prepend_path fixture_path("default")
413
+ assert asset.stale?
414
+ end
415
+
416
+ test "asset is stale when its contents has changed" do
417
+ filename = fixture_path('asset/test.js')
418
+
419
+ sandbox filename do
420
+ File.open(filename, 'w') { |f| f.write "a;" }
421
+ asset = @env['test.js']
422
+
423
+ assert asset.fresh?
424
+
425
+ File.open(filename, 'w') { |f| f.write "b;" }
426
+ mtime = Time.now + 1
427
+ File.utime(mtime, mtime, filename)
428
+
429
+ assert asset.stale?
430
+ end
431
+ end
432
+
433
+ test "asset is stale if the file is removed" do
434
+ filename = fixture_path('asset/test.js')
435
+
436
+ sandbox filename do
437
+ File.open(filename, 'w') { |f| f.write "a;" }
438
+ asset = @env['test.js']
439
+
440
+ assert asset.fresh?
441
+
442
+ File.unlink(filename)
443
+
444
+ assert asset.stale?
445
+ end
446
+ end
447
+
448
+ test "asset is stale when one of its source files is modified" do
449
+ main = fixture_path('asset/test-main.js')
450
+ dep = fixture_path('asset/test-dep.js')
451
+
452
+ sandbox main, dep do
453
+ File.open(main, 'w') { |f| f.write "//= require test-dep\n" }
454
+ File.open(dep, 'w') { |f| f.write "a;" }
455
+ asset = @env['test-main.js']
456
+
457
+ assert asset.fresh?
458
+
459
+ File.open(dep, 'w') { |f| f.write "b;" }
460
+ mtime = Time.now + 1
461
+ File.utime(mtime, mtime, dep)
462
+
463
+ assert asset.stale?
464
+ end
465
+ end
466
+
467
+ test "asset if stale if once of its source files is removed" do
468
+ main = fixture_path('asset/test-main.js')
469
+ dep = fixture_path('asset/test-dep.js')
470
+
471
+ sandbox main, dep do
472
+ File.open(main, 'w') { |f| f.write "//= require test-dep\n" }
473
+ File.open(dep, 'w') { |f| f.write "a;" }
474
+ asset = @env['test-main.js']
475
+
476
+ assert asset.fresh?
477
+
478
+ File.unlink(dep)
479
+
480
+ assert asset.stale?
481
+ end
482
+ end
483
+
484
+ test "asset is stale if a file is added to its require directory" do
485
+ asset = asset("tree/all_with_require_directory.js")
486
+ assert asset.fresh?
487
+
488
+ dirname = File.join(fixture_path("asset"), "tree/all")
489
+ filename = File.join(dirname, "z.js")
490
+
491
+ sandbox filename do
492
+ File.open(filename, 'w') { |f| f.write "z" }
493
+ mtime = Time.now + 1
494
+ File.utime(mtime, mtime, dirname)
495
+
496
+ assert asset.stale?
497
+ end
498
+ end
499
+
500
+ test "asset is stale if a file is added to its require tree" do
501
+ asset = asset("tree/all_with_require_tree.js")
502
+ assert asset.fresh?
503
+
504
+ dirname = File.join(fixture_path("asset"), "tree/all/b/c")
505
+ filename = File.join(dirname, "z.js")
506
+
507
+ sandbox filename do
508
+ File.open(filename, 'w') { |f| f.write "z" }
509
+ mtime = Time.now + 1
510
+ File.utime(mtime, mtime, dirname)
511
+
512
+ assert asset.stale?
513
+ end
514
+ end
515
+
516
+ test "asset is stale if its declared dependency changes" do
517
+ sprite = fixture_path('asset/sprite.css.erb')
518
+ image = fixture_path('asset/POW.png')
519
+
520
+ sandbox sprite, image do
521
+ asset = @env['sprite.css']
522
+
523
+ assert asset.fresh?
524
+
525
+ File.open(image, 'w') { |f| f.write "(change)" }
526
+ mtime = Time.now + 1
527
+ File.utime(mtime, mtime, image)
528
+
529
+ assert asset.stale?
530
+ end
531
+ end
532
+
533
+ test "legacy constants.yml" do
534
+ assert_equal "var Prototype = { version: '2.0' };\n",
535
+ asset("constants.js").to_s
536
+ end
537
+
538
+ test "multiple charset defintions are stripped from css bundle" do
539
+ assert_equal "@charset \"UTF-8\";\n.foo {}\n\n.bar {}\n", asset("charset.css").to_s
540
+ end
541
+
542
+ test "appends missing semicolons" do
543
+ assert_equal "var Bar\n;\n\n(function() {\n var Foo\n})\n;\n",
544
+ asset("semicolons.js").to_s
545
+ end
546
+
547
+ test "serializing asset to and from hash" do
548
+ expected = @asset
549
+ hash = {}
550
+ @asset.encode_with(hash)
551
+ actual = @env.asset_from_hash(hash)
552
+
553
+ assert_kind_of Sprockets::BundledAsset, actual
554
+ assert_equal expected.logical_path, actual.logical_path
555
+ assert_equal expected.pathname, actual.pathname
556
+ assert_equal expected.body, actual.body
557
+ assert_equal expected.to_s, actual.to_s
558
+ assert_equal expected.content_type, actual.content_type
559
+ assert_equal expected.length, actual.length
560
+ assert_equal expected.digest, actual.digest
561
+ assert_equal expected.dependencies, actual.dependencies
562
+ assert_equal expected.to_a, actual.to_a
563
+ assert_equal expected.to_s, actual.to_s
564
+
565
+ assert actual.eql?(expected)
566
+ assert expected.eql?(actual)
567
+ end
568
+
569
+ test "should not fail if home is not set in environment" do
570
+ begin
571
+ home, ENV["HOME"] = ENV["HOME"], nil
572
+ assert_nothing_raised do
573
+ env = Sprockets::Environment.new
574
+ env.append_path(fixture_path('asset'))
575
+ env['application.js']
576
+ end
577
+ ensure
578
+ ENV["HOME"] = home
579
+ end
580
+ end
581
+
582
+ def asset(logical_path)
583
+ @env[logical_path]
584
+ end
585
+
586
+ def resolve(logical_path)
587
+ @env.resolve(logical_path)
588
+ end
589
+
590
+ def read(logical_path)
591
+ File.read(resolve(logical_path))
592
+ end
593
+ end