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.
- data/CHANGELOG.md +5 -0
- data/TODO.md +18 -17
- data/lib/bpm/pipeline/generated_asset.rb +64 -41
- data/lib/bpm/pipeline/plugin_context.rb +24 -0
- data/lib/bpm/pipeline/transport_processor.rb +3 -3
- data/lib/bpm/pipeline.rb +2 -1
- data/lib/bpm/project.rb +7 -1
- data/lib/bpm/version.rb +1 -1
- data/lib/bpm.rb +1 -0
- data/spec/fixtures/projects/minitest/minitest.json +4 -2
- data/spec/fixtures/projects/minitest/packages/uglyduck/minifier/main.js +3 -2
- data/spec/fixtures/projects/minitrans/lib/main.js +3 -0
- data/spec/fixtures/projects/minitrans/minitrans.json +25 -0
- data/spec/fixtures/projects/minitrans/packages/transport/lib/main.js +1 -0
- data/spec/fixtures/projects/minitrans/packages/transport/package.json +21 -0
- data/spec/fixtures/projects/minitrans/packages/transport/transports/wrapper.js +6 -0
- data/spec/fixtures/projects/minitrans/packages/uglyduck/lib/main.js +3 -0
- data/spec/fixtures/projects/minitrans/packages/uglyduck/minifier/main.js +6 -0
- data/spec/fixtures/projects/minitrans/packages/uglyduck/package.json +21 -0
- data/spec/fixtures/projects/transporter/packages/transport/transports/wrapper.js +2 -2
- data/spec/plugins/minifier_spec.rb +2 -2
- data/spec/plugins/transport_spec.rb +38 -0
- metadata +41 -56
- data/backbone/LICENSE +0 -22
- data/backbone/README +0 -25
- data/backbone/Rakefile +0 -42
- data/backbone/backbone-0.5.1.bpkg +0 -0
- data/backbone/examples/backbone-localstorage.js +0 -84
- data/backbone/examples/todos/destroy.png +0 -0
- data/backbone/examples/todos/index.html +0 -87
- data/backbone/examples/todos/todos.css +0 -311
- data/backbone/examples/todos/todos.js +0 -258
- data/backbone/index.html +0 -2606
- data/backbone/index.js +0 -1
- data/backbone/lib/backbone.js +0 -1149
- data/backbone/lib/index.js +0 -1
- data/backbone/package.json +0 -14
- data/backbone/test/collection.js +0 -345
- data/backbone/test/events.js +0 -70
- data/backbone/test/model.coffee +0 -43
- data/backbone/test/model.js +0 -424
- data/backbone/test/noconflict.js +0 -12
- data/backbone/test/router.js +0 -116
- data/backbone/test/speed.js +0 -45
- data/backbone/test/sync.js +0 -133
- data/backbone/test/test-zepto.html +0 -30
- data/backbone/test/test.html +0 -31
- data/backbone/test/vendor/jquery-1.5.js +0 -8176
- data/backbone/test/vendor/jslitmus.js +0 -649
- data/backbone/test/vendor/json2.js +0 -481
- data/backbone/test/vendor/qunit.css +0 -196
- data/backbone/test/vendor/qunit.js +0 -1364
- data/backbone/test/vendor/underscore-1.1.6.js +0 -807
- data/backbone/test/vendor/zepto-0.6.js +0 -692
- 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
|
-
|
3
|
-
be used to resolve formats.
|
4
|
-
|
5
|
-
* minify then transport -> this will allow for string loading.
|
3
|
+
## Important Features
|
6
4
|
|
7
|
-
*
|
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
|
-
|
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
|
-
#
|
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
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
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["
|
30
|
-
plugin_ctx["
|
31
|
-
out = plugin_ctx.eval("BPM_PLUGIN.compileTransport(DATA,
|
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
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,
|
3
|
+
BPM_PLUGIN.minify = function(body, context, pathname) {
|
4
4
|
var whatIsUglyDuck = 'undefined' === typeof UGLYDUCK ? '(main not loaded)' : UGLYDUCK;
|
5
|
-
|
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,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
|
+
/*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,
|
3
|
-
return "define_transport(function() {\n"+body+"\n}), '"+
|
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
|
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
|
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
|