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

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 (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