bpm 1.0.0.beta.5 → 1.0.0.beta.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/TODO.md +18 -17
  3. data/lib/bpm/pipeline/generated_asset.rb +64 -41
  4. data/lib/bpm/pipeline/plugin_context.rb +24 -0
  5. data/lib/bpm/pipeline/transport_processor.rb +3 -3
  6. data/lib/bpm/pipeline.rb +2 -1
  7. data/lib/bpm/project.rb +7 -1
  8. data/lib/bpm/version.rb +1 -1
  9. data/lib/bpm.rb +1 -0
  10. data/spec/fixtures/projects/minitest/minitest.json +4 -2
  11. data/spec/fixtures/projects/minitest/packages/uglyduck/minifier/main.js +3 -2
  12. data/spec/fixtures/projects/minitrans/lib/main.js +3 -0
  13. data/spec/fixtures/projects/minitrans/minitrans.json +25 -0
  14. data/spec/fixtures/projects/minitrans/packages/transport/lib/main.js +1 -0
  15. data/spec/fixtures/projects/minitrans/packages/transport/package.json +21 -0
  16. data/spec/fixtures/projects/minitrans/packages/transport/transports/wrapper.js +6 -0
  17. data/spec/fixtures/projects/minitrans/packages/uglyduck/lib/main.js +3 -0
  18. data/spec/fixtures/projects/minitrans/packages/uglyduck/minifier/main.js +6 -0
  19. data/spec/fixtures/projects/minitrans/packages/uglyduck/package.json +21 -0
  20. data/spec/fixtures/projects/transporter/packages/transport/transports/wrapper.js +2 -2
  21. data/spec/plugins/minifier_spec.rb +2 -2
  22. data/spec/plugins/transport_spec.rb +38 -0
  23. metadata +41 -56
  24. data/backbone/LICENSE +0 -22
  25. data/backbone/README +0 -25
  26. data/backbone/Rakefile +0 -42
  27. data/backbone/backbone-0.5.1.bpkg +0 -0
  28. data/backbone/examples/backbone-localstorage.js +0 -84
  29. data/backbone/examples/todos/destroy.png +0 -0
  30. data/backbone/examples/todos/index.html +0 -87
  31. data/backbone/examples/todos/todos.css +0 -311
  32. data/backbone/examples/todos/todos.js +0 -258
  33. data/backbone/index.html +0 -2606
  34. data/backbone/index.js +0 -1
  35. data/backbone/lib/backbone.js +0 -1149
  36. data/backbone/lib/index.js +0 -1
  37. data/backbone/package.json +0 -14
  38. data/backbone/test/collection.js +0 -345
  39. data/backbone/test/events.js +0 -70
  40. data/backbone/test/model.coffee +0 -43
  41. data/backbone/test/model.js +0 -424
  42. data/backbone/test/noconflict.js +0 -12
  43. data/backbone/test/router.js +0 -116
  44. data/backbone/test/speed.js +0 -45
  45. data/backbone/test/sync.js +0 -133
  46. data/backbone/test/test-zepto.html +0 -30
  47. data/backbone/test/test.html +0 -31
  48. data/backbone/test/vendor/jquery-1.5.js +0 -8176
  49. data/backbone/test/vendor/jslitmus.js +0 -649
  50. data/backbone/test/vendor/json2.js +0 -481
  51. data/backbone/test/vendor/qunit.css +0 -196
  52. data/backbone/test/vendor/qunit.js +0 -1364
  53. data/backbone/test/vendor/underscore-1.1.6.js +0 -807
  54. data/backbone/test/vendor/zepto-0.6.js +0 -692
  55. data/backbone/test/view.js +0 -137
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
1
 
2
+ * bpm now passes a context object with build settings and a minify option
3
+ to plugins - this will allow spade to support string loading.
4
+
5
+ # 1.0.0.beta.5
6
+
2
7
  * bpm list now shows local dependencies by default. Use bpm list --remote
3
8
  to get remote.
4
9
  * better compatibility with npm - "summary" field is optional and "url" is
data/TODO.md CHANGED
@@ -1,27 +1,28 @@
1
+ # Things To Do
1
2
 
2
- * Multiple format support. Format processors supplied by dependencies should
3
- be used to resolve formats.
4
-
5
- * minify then transport -> this will allow for string loading.
3
+ ## Important Features
6
4
 
7
- * HTML manifest support [in general we need a way for packages to generate new assets]
5
+ * Multiple format support. Format processors supplied by dependencies
6
+ should
7
+ be used to resolve formats.
8
+ * HTML manifest support [in general we need a way for packages to generate
9
+ new assets]
10
+ * cache-friendly URLs
11
+ * HTML files should be able to process as templates using a template plugin
12
+ * Can we use YAML instead of JSON?
13
+ * Changing a dependency in a package.json should rebuild all files in
14
+ preview mode (in case the transport was modified)
8
15
 
9
- * cache-friendly URLs
10
-
11
- * HTML files should be able to process as templates using a template plugin
12
-
13
- * Can we use YAML instead of JSON?
14
-
15
- * Changing a dependency in a package.json should rebuild all files in preview mode (in case the transport was modified)
16
-
17
- * make work with JS that is placed at the root of the package. (i.e. lib = .)
18
-
19
- * figure out why requiring LibGems takes so long; really slows down launch
16
+ ## Lower Priority
20
17
 
18
+ * figure out why requiring LibGems takes so long; really slows down launch
19
+ * Make LibGems & bpm compatible with ruby 1.8.7
20
+ * make work with JS that is placed at the root of the package.
21
+ (i.e. lib = .)
21
22
 
22
23
  ----------------
23
24
 
24
- # SCENARIOS
25
+ # Usage Scenarios
25
26
 
26
27
  ## New user with existing app using bpm to manage dependencies
27
28
 
@@ -8,6 +8,62 @@ module BPM
8
8
  'text/css' => ['css', 'pipeline_css'],
9
9
  'application/javascript' => ['lib', 'pipeline_libs']
10
10
  }
11
+
12
+ def self.generating_asset
13
+ @generating_asset && @generating_asset.last
14
+ end
15
+
16
+ def self.push_generating_asset(asset)
17
+ @generating_asset ||= []
18
+ @generating_asset.push asset
19
+ end
20
+
21
+ def self.pop_generating_asset
22
+ @generating_asset && @generating_asset.pop
23
+ end
24
+
25
+ def build_settings
26
+ ret = environment.project.build_settings[asset_name]
27
+ (ret && ret['bpm:settings']) || {}
28
+ end
29
+
30
+ def minify_body(data)
31
+
32
+ project = environment.project
33
+ minifier_name = project.minifier_name asset_name
34
+ minifier_name = minifier_name.keys.first if minifier_name
35
+
36
+ if minifier_name && content_type == 'application/javascript'
37
+ pkg = project.package_from_name minifier_name
38
+ if pkg.nil?
39
+ raise MinifierNotFoundError.new(minifier_name)
40
+ end
41
+
42
+ minifier_plugin_name = pkg.bpm_minifier
43
+ if minifier_plugin_name.nil?
44
+ raise MinifierNotFoundError.new(minifier_name)
45
+ end
46
+
47
+ plugin_ctx = environment.plugin_context_for minifier_plugin_name
48
+
49
+ # slice out the header at the top - we don't want the minifier to
50
+ # touch it.
51
+ header = data.match /^(\/\* ====.+====\*\/)$/m
52
+ if header
53
+ header = header[0] + "\n"
54
+ data = data[header.size..-1]
55
+ end
56
+
57
+ V8::C::Locker() do
58
+ plugin_ctx["CTX"] = BPM::PluginContext.new(pkg)
59
+ plugin_ctx["DATA"] = data
60
+ data = plugin_ctx.eval("BPM_PLUGIN.minify(DATA, CTX)")
61
+ end
62
+
63
+ data = header+data if header
64
+ end
65
+ data
66
+ end
11
67
 
12
68
  protected
13
69
 
@@ -18,53 +74,20 @@ module BPM
18
74
  private
19
75
 
20
76
  def build_source
21
- minify super
77
+ self.class.push_generating_asset self
78
+ ret = minify super
79
+ self.class.pop_generating_asset
80
+ ret
22
81
  end
23
82
 
24
83
  def minify(hash)
25
84
  return hash if environment.mode == :debug
26
85
 
27
86
  hash = environment.cache_hash("#{pathname}:minify", id) do
28
- project = environment.project
29
- minifier_name = project.minifier_name asset_name
30
- minifier_name = minifier_name.keys.first if minifier_name
31
-
32
- if minifier_name && content_type == 'application/javascript'
33
- pkg = project.package_from_name minifier_name
34
- if pkg.nil?
35
- raise MinifierNotFoundError.new(minifier_name)
36
- end
37
-
38
- minifier_plugin_name = pkg.bpm_minifier
39
- if minifier_plugin_name.nil?
40
- raise MinifierNotFoundError.new(minifier_name)
41
- end
42
-
43
- plugin_ctx = environment.plugin_context_for minifier_plugin_name
44
-
45
- # slice out the header at the top - we don't want the minifier to
46
- # touch it.
47
- data = hash['source']
48
- header = data.match /^(\/\* ====.+====\*\/)$/m
49
- if header
50
- header = header[0] + "\n"
51
- data = data[header.size..-1]
52
- end
53
-
54
- V8::C::Locker() do
55
- plugin_ctx["PACKAGE_INFO"] = pkg.as_json
56
- plugin_ctx["DATA"] = data
57
- data = plugin_ctx.eval("BPM_PLUGIN.minify(DATA, PACKAGE_INFO)")
58
- end
59
-
60
- data = header+data if header
61
-
62
- { 'length' => Rack::Utils.bytesize(data),
63
- 'digest' => environment.digest.update(data).hexdigest,
64
- 'source' => data }
65
- else
66
- hash
67
- end
87
+ data = minify_body hash['source']
88
+ { 'length' => Rack::Utils.bytesize(data),
89
+ 'digest' => environment.digest.update(data).hexdigest,
90
+ 'source' => data }
68
91
  end
69
92
 
70
93
  hash['length'] = Integer(hash['length']) if hash['length'].is_a?(String)
@@ -0,0 +1,24 @@
1
+ module BPM
2
+
3
+ class PluginContext
4
+
5
+ attr_reader :moduleId
6
+ attr_reader :package
7
+
8
+ def initialize(pkg, module_id=nil)
9
+ @generating_asset = BPM::GeneratedAsset.generating_asset
10
+ @package = pkg.as_json
11
+ @moduleId = module_id
12
+ end
13
+
14
+ def minify(body)
15
+ @generating_asset ? @generating_asset.minify_body(body) : body
16
+ end
17
+
18
+ def settings
19
+ @generating_asset ? @generating_asset.build_settings : {}
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -26,9 +26,9 @@ module BPM
26
26
  out = ''
27
27
 
28
28
  V8::C::Locker() do
29
- plugin_ctx["PACKAGE_INFO"] = pkg.as_json
30
- plugin_ctx["DATA"] = data
31
- out = plugin_ctx.eval("BPM_PLUGIN.compileTransport(DATA, PACKAGE_INFO, '#{module_id}', '#{filepath}');")
29
+ plugin_ctx["DATA"] = data
30
+ plugin_ctx["CTX"] = BPM::PluginContext.new(pkg, module_id)
31
+ out = plugin_ctx.eval("BPM_PLUGIN.compileTransport(DATA, CTX, '#{filepath}');")
32
32
  end
33
33
 
34
34
  out + "\n\n"
data/lib/bpm/pipeline.rb CHANGED
@@ -20,6 +20,7 @@ module BPM
20
20
 
21
21
  # Pass in the project you want the pipeline to manage.
22
22
  def initialize(project, mode = :debug, include_preview = false)
23
+
23
24
  @project = project
24
25
  @mode = mode
25
26
  @plugin_contexts = {}
@@ -66,7 +67,7 @@ module BPM
66
67
 
67
68
  dep = project.local_deps.find { |dep| dep.name == target_name }
68
69
  dep = project if project.name == target_name
69
-
70
+
70
71
  dir_paths = File.join(dep.root_path, dir_name)
71
72
  if File.directory? dir_paths
72
73
  dir_paths = Dir[File.join(dir_paths, '**', '*')]
data/lib/bpm/project.rb CHANGED
@@ -638,9 +638,12 @@ module BPM
638
638
 
639
639
  # Look up dependencies of dependencies
640
640
  search_list += Array(pkg.dependencies)
641
- search_list += Array(pkg.dependencies_development)
642
641
  search_list += Array(pkg.dependencies_build)
643
642
 
643
+ if has_local_package? pkg.name
644
+ search_list += Array(pkg.dependencies_development)
645
+ end
646
+
644
647
  ret << pkg
645
648
  end
646
649
 
@@ -745,6 +748,9 @@ module BPM
745
748
  end
746
749
  end
747
750
 
751
+ bpm_settings = ret[target_name]['bpm:settings'] ||= {}
752
+ ret[target_name]['bpm:settings'] = soft_merge(bpm_settings, opts)
753
+
748
754
  end
749
755
 
750
756
  def project_settings_excludes(dep_name, target_name)
data/lib/bpm/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module BPM
2
- VERSION = "1.0.0.beta.5"
2
+ VERSION = "1.0.0.beta.6"
3
3
  COMPAT_VERSION = '1.0.0'
4
4
  end
data/lib/bpm.rb CHANGED
@@ -19,6 +19,7 @@ module BPM
19
19
  autoload :TransportProcessor, 'bpm/pipeline/transport_processor'
20
20
  autoload :SourceURLProcessor, 'bpm/pipeline/source_url_processor'
21
21
  autoload :PluginAsset, 'bpm/pipeline/plugin_asset'
22
+ autoload :PluginContext, 'bpm/pipeline/plugin_context'
22
23
  end
23
24
 
24
25
  # The BPM constants need to be defined first
@@ -14,12 +14,14 @@
14
14
  "bpm:build": {
15
15
 
16
16
  "bpm_libs.js": {
17
- "minifier": { "uglyduck": ">= 0" }
17
+ "minifier": { "uglyduck": ">= 0" },
18
+ "uglyduck:where": "boston"
18
19
  },
19
20
 
20
21
  "minitest/bpm_libs.js": {
21
22
  "directories": ["lib"],
22
- "minifier": { "uglyduck": ">= 0" }
23
+ "minifier": { "uglyduck": ">= 0" },
24
+ "uglyduck:where": "sanfran"
23
25
  }
24
26
  }
25
27
 
@@ -1,6 +1,7 @@
1
1
  /*globals BPM_PLUGIN UGLYDUCK */
2
2
 
3
- BPM_PLUGIN.minify = function(body, pkg, moduleId, pathname) {
3
+ BPM_PLUGIN.minify = function(body, context, pathname) {
4
4
  var whatIsUglyDuck = 'undefined' === typeof UGLYDUCK ? '(main not loaded)' : UGLYDUCK;
5
- return "//MINIFIED START\nUGLY DUCK "+UGLYDUCK+"\n"+body+"\n//MINIFIED END\n";
5
+ var whereIsUglyDuck = context.settings['uglyduck:where'] || '(build settings not found)'
6
+ return "//MINIFIED START\nUGLY DUCK "+whatIsUglyDuck+whereIsUglyDuck+"\n"+body+"\n//MINIFIED END\n";
6
7
  };
@@ -0,0 +1,3 @@
1
+ //TRANSPORT
2
+ transporter();
3
+ //TRANSPORT
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "minitrans",
3
+ "version": "2.0.0",
4
+ "bpm": "0.1.0",
5
+
6
+ "description": "DESCRIPTION HERE",
7
+ "author": "YOUR NAME HERE",
8
+ "homepage": "URL",
9
+
10
+ "directories": {
11
+ "lib": "lib"
12
+ },
13
+
14
+ "dependencies": {
15
+ "transport": "0.5.0"
16
+ },
17
+
18
+ "bpm:build": {
19
+ "bpm_libs.js": {
20
+ "directories": ["lib"],
21
+ "minifier": "uglyduck"
22
+ }
23
+ }
24
+
25
+ }
@@ -0,0 +1 @@
1
+ // TRANSPORT DEMO
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "transport",
3
+ "version": "0.5.0",
4
+ "bpm": "0.1.0",
5
+
6
+ "description": "DESCRIPTION HERE",
7
+ "author": "YOUR NAME HERE",
8
+ "homepage": "URL",
9
+
10
+ "directories": {
11
+ "lib": "./lib",
12
+ "test": "./tests"
13
+ },
14
+
15
+ "dependencies": {
16
+
17
+ },
18
+
19
+ "bpm:transport": "transport/transports/wrapper"
20
+
21
+ }
@@ -0,0 +1,6 @@
1
+
2
+ BPM_PLUGIN.compileTransport = function(body, context, filename) {
3
+ body = JSON.stringify("(function() { "+context.minify(body)+" })()\n");
4
+ return "define_transport("+body+"), '"+context['package'].name+"', '"+context.moduleId+"', '"+filename+"');";
5
+ };
6
+
@@ -0,0 +1,3 @@
1
+ //UGLY DUCK
2
+ UGLYDUCK = "IS UGLY";
3
+
@@ -0,0 +1,6 @@
1
+ /*globals BPM_PLUGIN UGLYDUCK */
2
+
3
+ BPM_PLUGIN.minify = function(body, pkg, moduleId, pathname) {
4
+ var whatIsUglyDuck = 'undefined' === typeof UGLYDUCK ? '(main not loaded)' : UGLYDUCK;
5
+ return "//MINIFIED START\nUGLY DUCK "+UGLYDUCK+"\n"+body+"\n//MINIFIED END\n";
6
+ };
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "uglyduck",
3
+ "version": "1.0.0",
4
+ "bpm": "0.1.0",
5
+
6
+ "description": "DESCRIPTION HERE",
7
+ "author": "YOUR NAME HERE",
8
+ "homepage": "URL",
9
+
10
+ "directories": {
11
+ "lib": "lib",
12
+ "minifier": "minifier",
13
+ "test": "tests"
14
+ },
15
+
16
+ "dependencies": {
17
+ },
18
+
19
+ "bpm:minifier": "uglyduck/minifier/main"
20
+
21
+ }
@@ -1,5 +1,5 @@
1
1
 
2
- BPM_PLUGIN.compileTransport = function(body, pkg, moduleId, filename) {
3
- return "define_transport(function() {\n"+body+"\n}), '"+pkg.name+"', '"+moduleId+"', '"+filename+"');";
2
+ BPM_PLUGIN.compileTransport = function(body, context, filename) {
3
+ return "define_transport(function() {\n"+body+"\n}), '"+context['package'].name+"', '"+context.moduleId+"', '"+filename+"');";
4
4
  };
5
5
 
@@ -29,7 +29,7 @@ describe BPM::Pipeline, 'minifier' do
29
29
  This file is generated automatically by the bpm (http://www.bpmjs.org)
30
30
  =========================================================================*/
31
31
  //MINIFIED START
32
- UGLY DUCK IS UGLY
32
+ UGLY DUCK IS UGLYboston
33
33
 
34
34
 
35
35
  //MINIFIED END
@@ -48,7 +48,7 @@ EOF
48
48
  This file is generated automatically by the bpm (http://www.bpmjs.org)
49
49
  =========================================================================*/
50
50
  //MINIFIED START
51
- UGLY DUCK IS UGLY
51
+ UGLY DUCK IS UGLYsanfran
52
52
 
53
53
  #{File.read(file_path)}
54
54
  //MINIFIED END
@@ -31,5 +31,43 @@ describe BPM::Pipeline, 'transport processor' do
31
31
  asset = subject.find_asset 'transport/lib/main.js'
32
32
  asset.to_s.should == "// TRANSPORT DEMO\n"
33
33
  end
34
+
35
+ end
36
+
37
+ describe BPM::Pipeline, 'transport processor w/ minifier' do
38
+
39
+ before do
40
+ goto_home
41
+ set_host
42
+ reset_libgems bpm_dir.to_s
43
+ start_fake(FakeGemServer.new)
44
+
45
+ FileUtils.cp_r project_fixture('minitrans'), '.'
46
+ cd home('minitrans')
47
+
48
+ bpm 'rebuild'
49
+ wait
50
+ end
51
+
52
+ subject do
53
+ project = BPM::Project.new home('minitrans')
54
+ BPM::Pipeline.new project
55
+ end
56
+
57
+ it "should invoke minifier in project" do
58
+ asset = subject.find_asset 'bpm_libs.js'
59
+ exp_path = home('transporter', 'lib', 'main.js')
60
+ expected = <<EOF
61
+ (function() { //MINIFIED START
62
+ UGLY DUCK IS UGLY
63
+ //TRANSPORT
64
+ transporter();
65
+ //TRANSPORT
66
+
67
+ //MINIFIED END
68
+ })()
69
+ EOF
70
+ asset.to_s.should include(expected.to_json)
71
+ end
34
72
 
35
73
  end