bpm 0.1.4 → 1.0.0.beta.4
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.
- data/CHANGELOG.md +20 -0
- data/README.md +1 -1
- data/TODO.md +90 -2
- data/bpm.gemspec +3 -3
- data/lib/bpm/cli/base.rb +103 -52
- data/lib/bpm/errors.rb +51 -0
- data/lib/bpm/init_generator.rb +1 -8
- data/lib/bpm/libgems_ext/libgems.rb +9 -0
- data/lib/bpm/local.rb +6 -11
- data/lib/bpm/package.rb +272 -178
- data/lib/bpm/pipeline/generated_asset.rb +88 -28
- data/lib/bpm/pipeline/plugin_asset.rb +8 -2
- data/lib/bpm/pipeline/source_url_processor.rb +16 -0
- data/lib/bpm/pipeline/transport_processor.rb +5 -3
- data/lib/bpm/pipeline.rb +33 -23
- data/lib/bpm/project.rb +492 -167
- data/lib/bpm/project_generator.rb +14 -1
- data/lib/bpm/remote.rb +6 -4
- data/lib/bpm/server.rb +4 -15
- data/lib/bpm/version.rb +2 -1
- data/lib/bpm.rb +2 -0
- data/man/bpm-add.1.ronn +22 -0
- data/man/bpm-build.1.ronn +22 -0
- data/man/bpm-compile.1.ronn +23 -0
- data/man/bpm-config.7.ronn +21 -0
- data/man/bpm-fetch.1.ronn +22 -0
- data/man/bpm-fetched.1.ronn +22 -0
- data/man/bpm-init.1.ronn +22 -0
- data/man/bpm-list.1.ronn +22 -0
- data/man/bpm-login.1.ronn +22 -0
- data/man/bpm-new.1.ronn +22 -0
- data/man/bpm-owner.1.ronn +22 -0
- data/man/bpm-preview.1.ronn +22 -0
- data/man/bpm-push.1.ronn +22 -0
- data/man/bpm-remove.1.ronn +22 -0
- data/man/bpm-unpack.1.ronn +22 -0
- data/man/bpm-yank.1.ronn +22 -0
- data/man/bpm.1.ronn +31 -0
- data/spec/cli/add_spec.rb +26 -7
- data/spec/cli/fetch_spec.rb +15 -6
- data/spec/cli/init_spec.rb +165 -25
- data/spec/cli/{build_spec.rb → pack_spec.rb} +9 -10
- data/spec/cli/push_spec.rb +4 -4
- data/spec/cli/rebuild_spec.rb +181 -0
- data/spec/cli/remove_spec.rb +3 -4
- data/spec/cli/unpack_spec.rb +6 -6
- data/spec/fixtures/gems/core-test-0.4.9.bpkg +0 -0
- data/spec/fixtures/{core-test-0.4.9.bpkg → gems/uglify-js-1.0.4.bpkg} +0 -0
- data/spec/fixtures/packages/core-test/extras/extra_file.html +3 -0
- data/spec/fixtures/packages/core-test/index.html +3 -0
- data/spec/fixtures/{core-test → packages/core-test}/package.json +9 -3
- data/spec/fixtures/packages/invalid_json/package.json +3 -0
- data/spec/fixtures/packages/uglify-js/README.html +825 -0
- data/spec/fixtures/packages/uglify-js/README.org +431 -0
- data/spec/fixtures/packages/uglify-js/bin/uglifyjs +305 -0
- data/spec/fixtures/packages/uglify-js/docstyle.css +75 -0
- data/spec/fixtures/packages/uglify-js/lib/parse-js.js +1 -0
- data/spec/fixtures/packages/uglify-js/lib/process.js +1 -0
- data/spec/fixtures/packages/uglify-js/lib/squeeze-more.js +1 -0
- data/spec/fixtures/packages/uglify-js/package.json +27 -0
- data/spec/fixtures/packages/uglify-js/plugins/minifier.js +6 -0
- data/spec/fixtures/packages/uglify-js/uglify-js.js +17 -0
- data/spec/fixtures/projects/hello2/README.md +21 -0
- data/{templates/init → spec/fixtures/projects/hello2}/assets/bpm_packages.js +6 -1
- data/{templates/init → spec/fixtures/projects/hello2}/assets/bpm_styles.css +1 -1
- data/spec/fixtures/projects/hello2/hello2.json +16 -0
- data/spec/fixtures/projects/hello2/index.html +13 -0
- data/spec/fixtures/projects/hello2/packages/a/lib/main.js +2 -0
- data/spec/fixtures/projects/hello2/packages/a/package.json +17 -0
- data/spec/fixtures/projects/hello2/packages/b/lib/main.js +2 -0
- data/spec/fixtures/projects/hello2/packages/b/package.json +17 -0
- data/spec/fixtures/projects/hello2/packages/c/lib/main.js +2 -0
- data/spec/fixtures/projects/hello2/packages/c/package.json +16 -0
- data/spec/fixtures/projects/hello_dev/LICENSE +19 -0
- data/spec/fixtures/projects/hello_dev/README.md +21 -0
- data/spec/fixtures/projects/hello_dev/app/main.js +6 -0
- data/spec/fixtures/projects/hello_dev/assets/bpm_libs.js +5 -0
- data/spec/fixtures/projects/hello_dev/assets/bpm_styles.css +6 -0
- data/spec/fixtures/projects/hello_dev/css/main.css +1 -0
- data/spec/fixtures/projects/hello_dev/hello_dev.json +25 -0
- data/spec/fixtures/projects/hello_dev/index.html +14 -0
- data/spec/fixtures/projects/hello_dev/packages/style_package/css/some_style.css +3 -0
- data/spec/fixtures/{minitest/minitest.json → projects/hello_dev/packages/style_package/package.json} +5 -9
- data/spec/fixtures/projects/hello_world/LICENSE +19 -0
- data/spec/fixtures/projects/hello_world/assets/bpm_packages.js +1 -0
- data/spec/fixtures/projects/hello_world/assets/bpm_styles.css +1 -0
- data/spec/fixtures/projects/hello_world/custom_dir/custom.js +1 -0
- data/spec/fixtures/projects/hello_world/hello_world.json +41 -0
- data/spec/fixtures/projects/hello_world/lib/another.js +1 -0
- data/spec/fixtures/{hello_world → projects/hello_world}/packages/custom_package/package.json +5 -2
- data/spec/fixtures/projects/hello_world/vendor/lib/something.js +1 -0
- data/spec/fixtures/projects/init_app/assets/bpm_libs.js +6 -0
- data/spec/fixtures/projects/init_app/assets/bpm_styles.css +5 -0
- data/spec/fixtures/projects/init_app/assets/new_project/bpm_libs.js +6 -0
- data/spec/fixtures/projects/init_app/assets/new_project/bpm_styles.css +5 -0
- data/spec/fixtures/projects/init_app/new_project.json +27 -0
- data/spec/fixtures/projects/init_default/assets/bpm_libs.js +6 -0
- data/spec/fixtures/projects/init_default/assets/bpm_styles.css +5 -0
- data/spec/fixtures/projects/init_default/new_project.json +15 -0
- data/spec/fixtures/projects/minitest/minitest.json +26 -0
- data/spec/fixtures/{minitest → projects/minitest}/packages/uglyduck/package.json +1 -1
- data/spec/fixtures/projects/needs_rake/needs_rake.json +7 -0
- data/spec/fixtures/{transporter → projects/transporter}/packages/transport/package.json +1 -1
- data/spec/package_spec.rb +343 -315
- data/spec/pipeline_spec.rb +89 -71
- data/spec/plugins/minifier_spec.rb +25 -16
- data/spec/plugins/transport_spec.rb +1 -1
- data/spec/project_spec.rb +97 -34
- data/spec/spec_helper.rb +41 -0
- data/spec/support/fake_gem_server.rb +8 -4
- data/spec/support/path.rb +8 -0
- data/spec/support/project.rb +50 -17
- data/templates/init/project.json +12 -14
- data/templates/project/LICENSE +1 -1
- data/templates/project/app/main.js +6 -0
- data/templates/project/css/main.css +1 -0
- data/templates/project/index.html +4 -3
- data/vendor/sprockets/.travis.yml +3 -2
- data/vendor/sprockets/Gemfile +0 -6
- data/vendor/sprockets/lib/sprockets/asset.rb +7 -12
- data/vendor/sprockets/lib/sprockets/asset_attributes.rb +70 -53
- data/vendor/sprockets/lib/sprockets/base.rb +1 -14
- data/vendor/sprockets/lib/sprockets/bundled_asset.rb +72 -45
- data/vendor/sprockets/lib/sprockets/caching.rb +28 -23
- data/vendor/sprockets/lib/sprockets/context.rb +56 -26
- data/vendor/sprockets/lib/sprockets/directive_processor.rb +21 -4
- data/vendor/sprockets/lib/sprockets/eco_template.rb +3 -4
- data/vendor/sprockets/lib/sprockets/ejs_template.rb +3 -4
- data/vendor/sprockets/lib/sprockets/engines.rb +26 -1
- data/vendor/sprockets/lib/sprockets/environment.rb +2 -1
- data/vendor/sprockets/lib/sprockets/index.rb +1 -0
- data/vendor/sprockets/lib/sprockets/mime.rb +38 -0
- data/vendor/sprockets/lib/sprockets/processing.rb +4 -45
- data/vendor/sprockets/lib/sprockets/static_asset.rb +5 -6
- data/vendor/sprockets/lib/sprockets/static_compilation.rb +4 -12
- data/vendor/sprockets/lib/sprockets/trail.rb +2 -1
- data/vendor/sprockets/test/fixtures/default/blank.gif +0 -0
- data/vendor/sprockets/test/fixtures/default/with_data_uri.css.erb +3 -0
- data/vendor/sprockets/test/test_asset.rb +121 -15
- data/vendor/sprockets/test/test_asset_attributes.rb +85 -21
- data/vendor/sprockets/test/test_environment.rb +13 -36
- metadata +564 -444
- data/spec/cli/new_spec.rb +0 -118
- data/spec/fixtures/hello_world/assets/bpm_packages.js +0 -13
- data/spec/fixtures/hello_world/assets/bpm_styles.css +0 -14
- data/spec/fixtures/hello_world/hello_world.json +0 -20
- /data/spec/fixtures/{badrake-0.8.7.bpkg → gems/badrake-0.8.7.bpkg} +0 -0
- /data/spec/fixtures/{builder-3.0.0.bpkg → gems/builder-3.0.0.bpkg} +0 -0
- /data/spec/fixtures/{bundler-1.1.pre.bpkg → gems/bundler-1.1.pre.bpkg} +0 -0
- /data/spec/fixtures/{coffee-1.0.1.pre.bpkg → gems/coffee-1.0.1.pre.bpkg} +0 -0
- /data/spec/fixtures/{custom_generator-1.0.bpkg → gems/custom_generator-1.0.bpkg} +0 -0
- /data/spec/fixtures/{highline-1.6.1.bpkg → gems/highline-1.6.1.bpkg} +0 -0
- /data/spec/fixtures/{ivory-0.0.1.bpkg → gems/ivory-0.0.1.bpkg} +0 -0
- /data/spec/fixtures/{jquery-1.4.3.bpkg → gems/jquery-1.4.3.bpkg} +0 -0
- /data/spec/fixtures/{optparse-1.0.1.bpkg → gems/optparse-1.0.1.bpkg} +0 -0
- /data/spec/fixtures/{rake-0.8.6.bpkg → gems/rake-0.8.6.bpkg} +0 -0
- /data/spec/fixtures/{rake-0.8.7.bpkg → gems/rake-0.8.7.bpkg} +0 -0
- /data/spec/fixtures/{spade-0.5.0.bpkg → gems/spade-0.5.0.bpkg} +0 -0
- /data/spec/fixtures/{src → packages}/README.txt +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/.gitignore +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/CHANGELOG.md +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/ISSUES.md +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/LICENSE +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/README.md +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/UPGRADING.md +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/bin/bundle +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/lib/bundler/definition.js +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/lib/bundler/dependency.js +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/lib/bundler/dsl.js +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/lib/bundler/ui.js +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/lib/bundler.js +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/bundle-config.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/bundle-exec.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/bundle-install.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/bundle-package.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/bundle-update.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/bundle.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/gemfile.5.ronn +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/man/index.txt +0 -0
- /data/spec/fixtures/{src → packages}/bundler-1.1.pre/package.json +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/bin/cake +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/bin/coffee +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/lib/coffee/base.js +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/lib/coffee/mocha/chai.js +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/lib/coffee.js +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/package.json +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/qunit/coffee/test.js +0 -0
- /data/spec/fixtures/{src → packages}/coffee-1.0.1.pre/qunit/test.js +0 -0
- /data/spec/fixtures/{core-test → packages/core-test}/bin/cot +0 -0
- /data/spec/fixtures/{core-test → packages/core-test}/lib/main.js +0 -0
- /data/spec/fixtures/{core-test → packages/core-test}/resources/runner.css +0 -0
- /data/spec/fixtures/{core-test → packages/core-test}/tests/test.js +0 -0
- /data/spec/fixtures/{custom_generator → packages/custom_generator}/lib/main.js +0 -0
- /data/spec/fixtures/{custom_generator → packages/custom_generator}/package.json +0 -0
- /data/spec/fixtures/{custom_generator → packages/custom_generator}/templates/init/project.json +0 -0
- /data/spec/fixtures/{custom_generator → packages/custom_generator}/templates/project/app.js +0 -0
- /data/spec/fixtures/{custom_generator → packages/custom_generator}/templates/project/lib/main.js +0 -0
- /data/spec/fixtures/{custom_generator → packages/custom_generator}/templates/project_generator.rb +0 -0
- /data/spec/fixtures/{src → packages}/jquery/lib/main.js +0 -0
- /data/spec/fixtures/{src → packages}/jquery/package.json +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/CHANGES +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/MIT-LICENSE +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/README +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/Rakefile +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/TODO +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/bin/rake +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/command_line_usage.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/example/Rakefile1 +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/example/Rakefile2 +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/example/a.c +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/example/b.c +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/example/main.c +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/glossary.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/jamis.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/proto_rake.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/rake.1.gz +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/rakefile.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/rational.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.4.14.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.4.15.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.5.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.5.3.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.5.4.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.6.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.7.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.7.1.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.7.2.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.7.3.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.8.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.8.2.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.8.3.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.8.4.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.8.5.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/doc/release_notes/rake-0.8.6.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/install.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/alt_system.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/classic_namespace.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/clean.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/contrib/compositepublisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/contrib/ftptools.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/contrib/publisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/contrib/rubyforgepublisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/contrib/sshpublisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/contrib/sys.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/gempackagetask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/loaders/makefile.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/packagetask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/rake_test_loader.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/rdoctask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/ruby182_test_unit_fix.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/runtest.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/tasklib.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/testtask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake/win32.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/lib/rake.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/package.json +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.6/test/capture_stdout.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/CHANGES +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/MIT-LICENSE +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/README +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/Rakefile +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/TODO +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/bin/rake +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/command_line_usage.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/example/Rakefile1 +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/example/Rakefile2 +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/example/a.c +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/example/b.c +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/example/main.c +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/glossary.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/jamis.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/proto_rake.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/rake.1.gz +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/rakefile.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/rational.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.4.14.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.4.15.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.5.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.5.3.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.5.4.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.6.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.7.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.7.1.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.7.2.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.7.3.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.0.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.2.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.3.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.4.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.5.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.6.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/doc/release_notes/rake-0.8.7.rdoc +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/install.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/alt_system.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/classic_namespace.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/clean.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/contrib/compositepublisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/contrib/ftptools.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/contrib/publisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/contrib/rubyforgepublisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/contrib/sshpublisher.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/contrib/sys.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/gempackagetask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/loaders/makefile.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/packagetask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/rake_test_loader.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/rdoctask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/ruby182_test_unit_fix.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/runtest.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/tasklib.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/testtask.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake/win32.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/lib/rake.rb +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/package.json +0 -0
- /data/spec/fixtures/{src → packages}/rake-0.8.7/test/capture_stdout.rb +0 -0
- /data/spec/fixtures/{src → packages}/spade/lib/main.js +0 -0
- /data/spec/fixtures/{src → packages}/spade/package.json +0 -0
- /data/spec/fixtures/{custom_name → projects/custom_name}/MyProject.json +0 -0
- /data/spec/fixtures/{hello_world → projects/hello2}/LICENSE +0 -0
- /data/{templates/project → spec/fixtures/projects/hello2}/app.js +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/README.md +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/assets/papa-smurf.jpg +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/css/dummy.css +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/lib/main.js +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/packages/custom_package/assets/dummy.txt +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/packages/custom_package/css/sample_styles.css +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/packages/custom_package/custom_dir/basic-module.js +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/packages/custom_package/lib/main.js +0 -0
- /data/spec/fixtures/{hello_world → projects/hello_world}/tests/main-test.js +0 -0
- /data/spec/fixtures/{minitest → projects/minitest}/assets/bpm_packages.js +0 -0
- /data/spec/fixtures/{minitest → projects/minitest}/assets/bpm_styles.css +0 -0
- /data/spec/fixtures/{minitest → projects/minitest}/assets/minitest/app_package.js +0 -0
- /data/spec/fixtures/{minitest → projects/minitest}/lib/main.js +0 -0
- /data/spec/fixtures/{minitest → projects/minitest}/packages/uglyduck/lib/main.js +0 -0
- /data/spec/fixtures/{minitest → projects/minitest}/packages/uglyduck/minifier/main.js +0 -0
- /data/spec/fixtures/{simple_hello/assets/bpm_packages.js → projects/simple_hello/assets/bpm_libs.js} +0 -0
- /data/spec/fixtures/{simple_hello → projects/simple_hello}/lib/main.js +0 -0
- /data/spec/fixtures/{transporter → projects/transporter}/lib/main.js +0 -0
- /data/spec/fixtures/{transporter → projects/transporter}/packages/transport/lib/main.js +0 -0
- /data/spec/fixtures/{transporter → projects/transporter}/packages/transport/transports/wrapper.js +0 -0
- /data/spec/fixtures/{transporter → projects/transporter}/transporter.json +0 -0
data/lib/bpm/project.rb
CHANGED
|
@@ -20,7 +20,7 @@ module BPM
|
|
|
20
20
|
|
|
21
21
|
def self.is_project_root?(path)
|
|
22
22
|
!!project_file_path(path) ||
|
|
23
|
-
File.exists?(File.join(path, 'assets', '
|
|
23
|
+
File.exists?(File.join(path, 'assets', 'bpm_libs.js'))
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def self.nearest_project(path)
|
|
@@ -53,73 +53,206 @@ module BPM
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def bpm
|
|
56
|
-
@bpm || BPM::
|
|
56
|
+
@bpm || BPM::COMPAT_VERSION
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
def
|
|
59
|
+
def validate_name_and_path
|
|
60
|
+
# do nothing. never an error
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns a fully normalized hash of build settings
|
|
64
|
+
def build_settings(mode=:debug)
|
|
65
|
+
ret = {}
|
|
66
|
+
deps = mode == :debug ? sorted_deps : sorted_runtime_deps
|
|
67
|
+
deps.each { |dep| merge_build_settings(ret, dep, mode) }
|
|
68
|
+
merge_build_settings ret, self, mode, false
|
|
69
|
+
ret
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def all_dependencies
|
|
73
|
+
deps = dependencies.merge(dependencies_development || {})
|
|
74
|
+
deps.merge(dependencies_build)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def local_package_root(package_name=nil)
|
|
78
|
+
File.join([@root_path, 'packages', package_name].compact)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def internal_package_root(package_name=nil)
|
|
82
|
+
File.join([@root_path, BPM_DIR, 'packages', package_name].compact)
|
|
83
|
+
end
|
|
60
84
|
|
|
61
|
-
|
|
85
|
+
def assets_root(*paths)
|
|
86
|
+
File.join @root_path, 'assets', *paths
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def preview_root(*paths)
|
|
90
|
+
File.join @root_path, '.bpm', 'preview', *paths
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def build_app?
|
|
94
|
+
!!(bpm_build && bpm_build["#{name}/bpm_libs.js"])
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def build_app=(value)
|
|
62
98
|
|
|
63
|
-
|
|
64
|
-
|
|
99
|
+
bpm_libs = "#{name}/bpm_libs.js"
|
|
100
|
+
bpm_styles = "#{name}/bpm_styles.css"
|
|
101
|
+
|
|
102
|
+
if value
|
|
103
|
+
if bpm_build[bpm_libs].nil?
|
|
104
|
+
bpm_build[bpm_libs] = {
|
|
105
|
+
"directories" => ["app"],
|
|
106
|
+
"minifier" => "uglify-js"
|
|
107
|
+
}
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
if bpm_build[bpm_styles].nil?
|
|
111
|
+
bpm_build[bpm_styles] = {
|
|
112
|
+
"directories" => ["css"]
|
|
113
|
+
}
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
else
|
|
117
|
+
bpm_build.delete bpm_libs
|
|
118
|
+
bpm_build.delete bpm_styles
|
|
119
|
+
end
|
|
120
|
+
value
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# returns array of all assets that should be generated for this project
|
|
124
|
+
def buildable_asset_filenames(mode)
|
|
125
|
+
build_settings(mode).keys.reject { |x| !(x =~ /\..+$/) }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Validates that all required files are present in the project needed
|
|
129
|
+
# for compile to run. This will not fetch new dependencies from remote.
|
|
130
|
+
def verify_and_repair(mode=:debug, verbose=false)
|
|
131
|
+
valid_deps = find_dependencies rescue nil
|
|
132
|
+
fetch_dependencies(verbose) if valid_deps.nil?
|
|
133
|
+
rebuild_dependency_list nil, verbose
|
|
134
|
+
rebuild_preview verbose
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def rebuild_preview(verbose=false)
|
|
65
138
|
|
|
66
|
-
|
|
67
|
-
core_fetch_dependencies exp_deps, :runtime, true
|
|
139
|
+
needs_rebuild = true
|
|
68
140
|
|
|
69
|
-
|
|
70
|
-
|
|
141
|
+
if File.directory?(preview_root)
|
|
142
|
+
cur_previews = Dir[preview_root('**', '*')].sort.reject { |x| File.directory?(x) }
|
|
143
|
+
exp_filenames = buildable_asset_filenames(:debug)
|
|
144
|
+
exp_previews = exp_filenames.map { |x| preview_root(x) }.sort
|
|
145
|
+
needs_rebuild = cur_previews != exp_previews
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
if needs_rebuild
|
|
149
|
+
FileUtils.rm_r preview_root if File.exists? preview_root
|
|
150
|
+
buildable_asset_filenames(:debug).each do |filename|
|
|
151
|
+
next if File.exists? preview_root(filename)
|
|
152
|
+
FileUtils.mkdir_p File.dirname(preview_root(filename))
|
|
153
|
+
FileUtils.touch preview_root(filename)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
71
156
|
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Add a new dependency
|
|
160
|
+
#
|
|
161
|
+
# Adds to the project json and installs dependency
|
|
162
|
+
|
|
163
|
+
def add_dependencies(new_deps, development=false, verbose=false)
|
|
164
|
+
old_deps = build_local_dependency_list(false) || []
|
|
165
|
+
hard_deps = (development ? dependencies_development : dependencies).merge(new_deps)
|
|
166
|
+
all_hard_deps = all_dependencies.merge(new_deps)
|
|
167
|
+
exp_deps = find_non_local_dependencies(hard_deps, true)
|
|
168
|
+
|
|
169
|
+
puts "Fetching packages from remote..." if verbose
|
|
170
|
+
core_fetch_dependencies(exp_deps, verbose)
|
|
171
|
+
|
|
172
|
+
if development
|
|
173
|
+
self.dependencies_development = hard_deps
|
|
174
|
+
else
|
|
175
|
+
self.dependencies = hard_deps
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
rebuild_dependency_list(all_hard_deps, verbose)
|
|
179
|
+
|
|
72
180
|
local_deps.each do |dep|
|
|
73
181
|
next if old_deps.find { |pkg| (pkg.name == dep.name) && (pkg.version == dep.version) }
|
|
74
|
-
puts "Added package '#{dep.name}' (#{dep.version})"
|
|
182
|
+
puts "Added #{development ? "development " : ""}package '#{dep.name}' (#{dep.version})"
|
|
75
183
|
end
|
|
76
184
|
|
|
77
185
|
save!
|
|
78
|
-
|
|
79
186
|
end
|
|
80
187
|
|
|
188
|
+
|
|
189
|
+
# Remove a dependency
|
|
190
|
+
#
|
|
191
|
+
# Remove dependency from json. Does not remove from system.
|
|
192
|
+
|
|
81
193
|
def remove_dependencies(package_names, verbose=false)
|
|
82
194
|
|
|
83
195
|
hard_deps = dependencies.dup
|
|
84
|
-
old_deps =
|
|
85
|
-
|
|
196
|
+
old_deps = build_local_dependency_list(false)
|
|
197
|
+
|
|
86
198
|
package_names.each do |pkg_name|
|
|
87
199
|
raise "'#{pkg_name}' is not a dependency" if hard_deps[pkg_name].nil?
|
|
88
200
|
hard_deps.delete pkg_name
|
|
89
201
|
end
|
|
90
202
|
|
|
91
203
|
@dependencies = hard_deps
|
|
92
|
-
|
|
93
|
-
|
|
204
|
+
rebuild_dependency_list hard_deps, verbose
|
|
205
|
+
|
|
94
206
|
old_deps.each do |dep|
|
|
95
207
|
next if local_deps.find { |pkg| (pkg.name == dep.name) && (pkg.version == dep.version) }
|
|
96
208
|
puts "Removed package '#{dep.name}' (#{dep.version})"
|
|
97
209
|
end
|
|
98
|
-
|
|
210
|
+
|
|
99
211
|
save!
|
|
100
|
-
|
|
212
|
+
|
|
101
213
|
end
|
|
102
214
|
|
|
215
|
+
|
|
216
|
+
# Save to json
|
|
217
|
+
|
|
103
218
|
def save!
|
|
104
219
|
@had_changes = false
|
|
105
220
|
File.open @json_path, 'w+' do |fd|
|
|
106
221
|
fd.write JSON.pretty_generate as_json
|
|
107
222
|
end
|
|
108
223
|
end
|
|
109
|
-
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
# Get dependencies from server if not installed
|
|
227
|
+
|
|
110
228
|
def fetch_dependencies(verbose=false)
|
|
111
|
-
|
|
112
|
-
|
|
229
|
+
puts "Fetching packages from remote..." if verbose
|
|
230
|
+
exp_deps = find_non_local_dependencies(all_dependencies, true)
|
|
231
|
+
core_fetch_dependencies(exp_deps, verbose)
|
|
113
232
|
end
|
|
114
233
|
|
|
234
|
+
|
|
115
235
|
# Builds assets directory for dependent packages
|
|
236
|
+
|
|
116
237
|
def build(mode=:debug, verbose=false)
|
|
238
|
+
|
|
239
|
+
verify_and_repair mode, verbose
|
|
240
|
+
|
|
117
241
|
puts "Building static assets..." if verbose
|
|
118
|
-
pipeline = BPM::Pipeline.new self
|
|
119
|
-
asset_root = File.join root_path, 'assets'
|
|
120
242
|
|
|
243
|
+
report_package_locations if verbose
|
|
244
|
+
|
|
245
|
+
# Seed the project with any required files to ensure they are built
|
|
246
|
+
buildable_asset_filenames(mode).each do |filename|
|
|
247
|
+
dst_path = assets_root filename
|
|
248
|
+
next if File.exists? dst_path
|
|
249
|
+
FileUtils.mkdir_p File.dirname(dst_path)
|
|
250
|
+
FileUtils.touch dst_path
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
pipeline = BPM::Pipeline.new self, mode
|
|
121
254
|
pipeline.buildable_assets.each do |asset|
|
|
122
|
-
dst_path =
|
|
255
|
+
dst_path = assets_root asset.logical_path
|
|
123
256
|
FileUtils.mkdir_p File.dirname(dst_path)
|
|
124
257
|
|
|
125
258
|
if asset.kind_of? Sprockets::StaticAsset
|
|
@@ -127,20 +260,26 @@ module BPM
|
|
|
127
260
|
FileUtils.rm dst_path if File.exists? dst_path
|
|
128
261
|
FileUtils.cp asset.pathname, dst_path
|
|
129
262
|
else
|
|
130
|
-
|
|
263
|
+
$stdout << "~ Building #{asset.logical_path}..." if verbose
|
|
131
264
|
File.open(dst_path, 'w+') { |fd| fd << asset.to_s }
|
|
265
|
+
if verbose
|
|
266
|
+
gzip_size = `gzip -c #{dst_path}`.size
|
|
267
|
+
gzip_size = gzip_size < 1024 ? "#{gzip_size} bytes" : "#{gzip_size / 1024} Kb"
|
|
268
|
+
$stdout << " (gzipped size: #{gzip_size})\n"
|
|
269
|
+
end
|
|
132
270
|
end
|
|
133
271
|
end
|
|
134
|
-
|
|
272
|
+
|
|
135
273
|
puts "\n" if verbose
|
|
136
274
|
end
|
|
137
|
-
|
|
275
|
+
|
|
276
|
+
|
|
138
277
|
# Removes any built assets from the project. Usually called before a
|
|
139
278
|
# package is removed from the project to cleanup any assets
|
|
279
|
+
|
|
140
280
|
def unbuild(verbose=false)
|
|
141
|
-
|
|
142
281
|
puts "Removing stale assets..." if verbose
|
|
143
|
-
|
|
282
|
+
|
|
144
283
|
pipeline = BPM::Pipeline.new self
|
|
145
284
|
asset_root = File.join root_path, 'assets'
|
|
146
285
|
pipeline.buildable_assets.each do |asset|
|
|
@@ -149,59 +288,67 @@ module BPM
|
|
|
149
288
|
next unless File.exists? asset_path
|
|
150
289
|
puts "~ Removing #{asset.logical_path}" if verbose
|
|
151
290
|
FileUtils.rm asset_path
|
|
152
|
-
|
|
291
|
+
|
|
153
292
|
# cleanup empty directories
|
|
154
293
|
while !File.exists?(asset_path)
|
|
155
294
|
asset_path = File.dirname asset_path
|
|
156
295
|
FileUtils.rmdir(asset_path) if File.directory?(asset_path)
|
|
157
|
-
if verbose && !File.exists?(asset_path)
|
|
296
|
+
if verbose && !File.exists?(asset_path)
|
|
158
297
|
puts "~ Removed empty directory #{File.basename asset_path}"
|
|
159
298
|
end
|
|
160
299
|
end
|
|
161
300
|
end
|
|
162
|
-
|
|
301
|
+
|
|
163
302
|
puts "\n" if verbose
|
|
164
303
|
end
|
|
165
|
-
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
# Find package with name
|
|
307
|
+
|
|
166
308
|
def package_from_name(package_name)
|
|
167
309
|
return self if package_name == self.name
|
|
168
310
|
local_deps.find { |pkg| pkg.name == package_name }
|
|
169
311
|
end
|
|
170
|
-
|
|
312
|
+
|
|
313
|
+
|
|
171
314
|
# Returns the path on disk to reach a given package name
|
|
315
|
+
|
|
172
316
|
def path_from_package(package_name)
|
|
173
317
|
ret = package_from_name package_name
|
|
174
318
|
ret && ret.root_path
|
|
175
319
|
end
|
|
176
|
-
|
|
320
|
+
|
|
321
|
+
|
|
177
322
|
# Returns the path on disk for a given module id (relative to the project)
|
|
323
|
+
|
|
178
324
|
def path_from_module(module_path)
|
|
179
325
|
path_parts = module_path.to_s.split '/'
|
|
180
326
|
package_name = path_parts.shift
|
|
181
327
|
module_path = path_from_package(package_name)
|
|
328
|
+
|
|
182
329
|
if module_path
|
|
183
330
|
# expand package_name => package_name/main
|
|
184
331
|
path_parts = ['main'] if path_parts.size == 0
|
|
185
|
-
|
|
332
|
+
|
|
186
333
|
# expand package_name/~dirname => package_name/mapped_dirname
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
dirname = 'lib'
|
|
191
|
-
end
|
|
334
|
+
dirname = (path_parts.first && path_parts.first =~ /^~/) ?
|
|
335
|
+
path_parts.shift[1..-1] : 'lib'
|
|
336
|
+
|
|
192
337
|
pkg = BPM::Package.new(module_path)
|
|
193
338
|
pkg.load_json
|
|
194
339
|
dirname = (pkg && pkg.directories[dirname]) || dirname
|
|
195
|
-
|
|
340
|
+
|
|
196
341
|
# join the rest of the path
|
|
197
342
|
module_path = [package_name, dirname, *path_parts] * '/'
|
|
198
343
|
end
|
|
199
|
-
|
|
344
|
+
|
|
200
345
|
module_path
|
|
201
346
|
end
|
|
202
|
-
|
|
347
|
+
|
|
348
|
+
|
|
203
349
|
# Returns the package object and module id for the path. Path must match
|
|
204
350
|
# a package known to the project.
|
|
351
|
+
|
|
205
352
|
def package_and_module_from_path(path)
|
|
206
353
|
path = File.expand_path path.to_s
|
|
207
354
|
pkg = local_deps.find {|cur| path =~ /^#{Regexp.escape cur.root_path.to_s}\//}
|
|
@@ -238,51 +385,100 @@ module BPM
|
|
|
238
385
|
[pkg, parts.join('/')]
|
|
239
386
|
end
|
|
240
387
|
|
|
241
|
-
|
|
242
|
-
|
|
388
|
+
|
|
389
|
+
# List local dependency names, rebuilds list first time
|
|
390
|
+
|
|
391
|
+
def local_deps
|
|
392
|
+
@local_deps ||= build_local_dependency_list
|
|
243
393
|
end
|
|
244
394
|
|
|
395
|
+
# List of local dependency names in order of dependency
|
|
245
396
|
|
|
246
|
-
|
|
247
|
-
|
|
397
|
+
def sorted_deps
|
|
398
|
+
dep_names = (dependencies.keys + dependencies_development.keys).uniq
|
|
399
|
+
ret = []
|
|
400
|
+
|
|
401
|
+
dep_names.each do |dep_name|
|
|
402
|
+
dep = local_deps.find { |x| x.name == dep_name }
|
|
403
|
+
add_sorted_dep(dep, local_deps, :both, ret)
|
|
404
|
+
end
|
|
405
|
+
ret
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def sorted_runtime_deps
|
|
409
|
+
|
|
410
|
+
dep_names = dependencies.map { |name, vers| name }
|
|
411
|
+
deps = local_deps.reject { |dep| !dep_names.include?(dep.name) }
|
|
248
412
|
|
|
249
|
-
|
|
413
|
+
deps.inject([]) do |ret, dep|
|
|
414
|
+
add_sorted_dep(dep, local_deps, :runtime, ret)
|
|
415
|
+
ret
|
|
416
|
+
end
|
|
250
417
|
|
|
251
|
-
|
|
418
|
+
end
|
|
252
419
|
|
|
253
|
-
|
|
420
|
+
def sorted_development_deps
|
|
421
|
+
dep_names = dependencies_development.map { |name, vers| name }
|
|
422
|
+
deps = local_deps.reject { |dep| !dep_names.include?(dep.name) }
|
|
423
|
+
|
|
424
|
+
deps = deps.inject([]) do |ret, dep|
|
|
425
|
+
add_sorted_dep(dep, local_deps, :both, ret)
|
|
426
|
+
ret
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# development deps should include all dependencies of dev deps excluding
|
|
430
|
+
# those that are bonafide runtime deps
|
|
431
|
+
runtime_deps = sorted_runtime_deps
|
|
432
|
+
deps.reject! { |pkg| runtime_deps.include?(pkg) }
|
|
433
|
+
deps
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
# Verifies that packages are available to meet all the dependencies
|
|
438
|
+
def rebuild_dependency_list(deps=nil, verbose=false)
|
|
439
|
+
|
|
440
|
+
found = find_dependencies(deps, verbose)
|
|
441
|
+
|
|
442
|
+
install_root = self.internal_package_root
|
|
254
443
|
FileUtils.rm_r install_root if File.exists? install_root
|
|
255
444
|
FileUtils.mkdir_p install_root
|
|
256
445
|
|
|
257
446
|
found.each do |pkg|
|
|
258
|
-
dst_path = File.join
|
|
447
|
+
dst_path = File.join(install_root, pkg.name)
|
|
259
448
|
FileUtils.ln_s pkg.root_path, dst_path
|
|
260
449
|
end
|
|
261
|
-
|
|
450
|
+
|
|
262
451
|
@local_deps = nil
|
|
263
452
|
end
|
|
264
453
|
|
|
454
|
+
|
|
455
|
+
# Hash for conversion to json
|
|
456
|
+
|
|
265
457
|
def as_json
|
|
266
458
|
json = super
|
|
267
459
|
json["bpm"] = self.bpm
|
|
268
460
|
json
|
|
269
461
|
end
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
# Name of minifier
|
|
465
|
+
|
|
466
|
+
def minifier_name(asset_name)
|
|
467
|
+
build_settings[asset_name] && build_settings[asset_name]['bpm:minifier']
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
def load_json
|
|
471
|
+
return super if has_json?
|
|
472
|
+
FIELDS.keys.each{|f| send("#{c2u(f)}=", DEFAULT_CONFIG[f]) }
|
|
473
|
+
self.name = File.basename(@json_path, '.json')
|
|
474
|
+
self.version = "0.0.1"
|
|
475
|
+
true
|
|
273
476
|
end
|
|
274
477
|
|
|
478
|
+
|
|
275
479
|
private
|
|
276
480
|
|
|
277
|
-
|
|
278
|
-
if File.exists? @json_path
|
|
279
|
-
super
|
|
280
|
-
else
|
|
281
|
-
@attributes = DEFAULT_CONFIG.dup
|
|
282
|
-
@attributes["name"] = File.basename(@json_path, '.json')
|
|
283
|
-
@attributes["version"] = "0.0.1"
|
|
284
|
-
end
|
|
285
|
-
end
|
|
481
|
+
# Make sure fields are set up properly
|
|
286
482
|
|
|
287
483
|
def validate_fields
|
|
288
484
|
# TODO: Define other fields that are required for projects
|
|
@@ -295,56 +491,54 @@ module BPM
|
|
|
295
491
|
end
|
|
296
492
|
end
|
|
297
493
|
end
|
|
298
|
-
|
|
494
|
+
|
|
495
|
+
|
|
299
496
|
# builds a set of dependencies that excludes locally installed packages
|
|
300
497
|
# and includes their dependencies instead.
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
todo = []
|
|
498
|
+
|
|
499
|
+
def find_non_local_dependencies(deps, verbose)
|
|
500
|
+
search_list = Array(deps)
|
|
305
501
|
seen = []
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
if File.exists? package_root
|
|
317
|
-
pkg = BPM::Package.new package_root
|
|
502
|
+
ret = {}
|
|
503
|
+
|
|
504
|
+
until search_list.empty?
|
|
505
|
+
name, version = search_list.shift
|
|
506
|
+
next if seen.include?(name)
|
|
507
|
+
seen << name
|
|
508
|
+
|
|
509
|
+
package_root = local_package_root(name)
|
|
510
|
+
if File.exists?(package_root)
|
|
511
|
+
pkg = BPM::Package.new(package_root)
|
|
318
512
|
pkg.load_json
|
|
319
513
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
raise "Local package '#{pkg.name}' (#{pkg.version}) is not compatible with required version #{package_version}"
|
|
514
|
+
unless satisfied_by?(version, pkg.version)
|
|
515
|
+
raise LocalPackageConflictError.new(pkg.name, version, pkg.version)
|
|
323
516
|
end
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
pkg.
|
|
327
|
-
|
|
328
|
-
end
|
|
329
|
-
|
|
517
|
+
|
|
518
|
+
search_list += Array(pkg.dependencies)
|
|
519
|
+
search_list += Array(pkg.dependencies_development)
|
|
520
|
+
search_list += Array(pkg.dependencies_build)
|
|
330
521
|
else
|
|
331
|
-
ret[
|
|
522
|
+
ret[name] = version
|
|
332
523
|
end
|
|
333
524
|
end
|
|
334
|
-
|
|
525
|
+
|
|
335
526
|
ret
|
|
336
527
|
end
|
|
337
|
-
|
|
528
|
+
|
|
529
|
+
|
|
338
530
|
# Fetch any dependencies into local cache for the passed set of deps
|
|
339
|
-
|
|
340
|
-
|
|
531
|
+
|
|
532
|
+
def core_fetch_dependencies(deps, verbose)
|
|
341
533
|
deps.each do |pkg_name, pkg_version|
|
|
342
|
-
core_fetch_dependency pkg_name, pkg_version,
|
|
534
|
+
core_fetch_dependency pkg_name, pkg_version, :runtime, verbose
|
|
343
535
|
end
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
# Fetch a single dependency into local cache
|
|
540
|
+
|
|
541
|
+
def core_fetch_dependency(package_name, vers, type, verbose)
|
|
348
542
|
prerelease = false
|
|
349
543
|
if vers == '>= 0-pre'
|
|
350
544
|
prerelease = true
|
|
@@ -353,7 +547,7 @@ module BPM
|
|
|
353
547
|
prerelease = vers =~ /[a-zA-Z]/
|
|
354
548
|
end
|
|
355
549
|
|
|
356
|
-
dep = LibGems::Dependency.new(package_name, vers,
|
|
550
|
+
dep = LibGems::Dependency.new(package_name, vers, type)
|
|
357
551
|
cur_installed = LibGems.source_index.search(dep)
|
|
358
552
|
|
|
359
553
|
begin
|
|
@@ -368,18 +562,24 @@ module BPM
|
|
|
368
562
|
end
|
|
369
563
|
|
|
370
564
|
installed.each do |i|
|
|
371
|
-
puts "Fetched #{i.name} (#{i.version}) from remote" if verbose
|
|
565
|
+
puts "~ Fetched #{i.name} (#{i.version}) from remote" if verbose
|
|
372
566
|
end
|
|
373
|
-
|
|
567
|
+
|
|
374
568
|
end
|
|
375
569
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
570
|
+
|
|
571
|
+
# Get list of local dep names from the .bpm directory
|
|
572
|
+
#
|
|
573
|
+
# Pass +false+ to prevent the list from being rebuilt
|
|
574
|
+
|
|
575
|
+
def build_local_dependency_list(force=true)
|
|
576
|
+
install_root = self.internal_package_root
|
|
577
|
+
|
|
578
|
+
unless File.exists?(install_root)
|
|
579
|
+
return nil unless force
|
|
580
|
+
rebuild_dependency_list
|
|
381
581
|
end
|
|
382
|
-
|
|
582
|
+
|
|
383
583
|
Dir[File.join(install_root, '*')].map do |package_name|
|
|
384
584
|
pkg = BPM::Package.new package_name
|
|
385
585
|
pkg.load_json
|
|
@@ -387,87 +587,212 @@ module BPM
|
|
|
387
587
|
end
|
|
388
588
|
end
|
|
389
589
|
|
|
590
|
+
# Tell if package is vendored
|
|
591
|
+
|
|
390
592
|
def has_local_package?(package_name)
|
|
391
|
-
|
|
392
|
-
File.exists? package_root
|
|
593
|
+
File.directory?(local_package_root(package_name))
|
|
393
594
|
end
|
|
394
595
|
|
|
596
|
+
|
|
597
|
+
# Tell if given version is satisfied by the passed version
|
|
598
|
+
|
|
395
599
|
def satisfied_by?(req_vers, new_vers)
|
|
396
|
-
req = LibGems::Requirement.new
|
|
600
|
+
req = LibGems::Requirement.new(req_vers)
|
|
397
601
|
req_vers.sub(/^= /,'') == new_vers.sub(/^= /,'') ||
|
|
398
|
-
req.satisfied_by?(LibGems::Version.new(new_vers))
|
|
602
|
+
req.satisfied_by?(LibGems::Version.new(new_vers))
|
|
399
603
|
end
|
|
400
604
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
605
|
+
|
|
606
|
+
# Get list of dependencies, searching only the project and fetched
|
|
607
|
+
# packages. Does not query remote server. Raises if not found or
|
|
608
|
+
# conflicting.
|
|
609
|
+
def find_dependencies(deps=nil, verbose=false)
|
|
610
|
+
|
|
611
|
+
deps ||= all_dependencies
|
|
612
|
+
|
|
613
|
+
search_list = Array(deps)
|
|
614
|
+
found = []
|
|
615
|
+
ret = []
|
|
616
|
+
|
|
617
|
+
until search_list.empty?
|
|
618
|
+
name, version = search_list.shift
|
|
619
|
+
|
|
620
|
+
if dup = found.find{|p| p.name == name}
|
|
621
|
+
# already found, check for conflicts
|
|
622
|
+
next if satisfied_by?(version, dup.version)
|
|
623
|
+
raise PackageConflictError.new(name, dup.version, version)
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
pkg = locate_package(name, version, verbose)
|
|
627
|
+
raise PackageNotFoundError.new(name, version) unless pkg
|
|
628
|
+
|
|
629
|
+
found << pkg
|
|
630
|
+
|
|
631
|
+
# Look up dependencies of dependencies
|
|
632
|
+
search_list += Array(pkg.dependencies)
|
|
633
|
+
search_list += Array(pkg.dependencies_development)
|
|
634
|
+
search_list += Array(pkg.dependencies_build)
|
|
635
|
+
|
|
636
|
+
ret << pkg
|
|
407
637
|
end
|
|
408
|
-
|
|
638
|
+
|
|
639
|
+
ret
|
|
409
640
|
end
|
|
410
|
-
|
|
411
|
-
def locate_dependencies(deps, verbose)
|
|
412
|
-
todo = []
|
|
413
|
-
seen = []
|
|
414
|
-
ret = []
|
|
415
|
-
|
|
416
|
-
deps.each { |package_name, vers| todo << [package_name, vers] }
|
|
417
|
-
|
|
418
|
-
while todo.size > 0
|
|
419
|
-
package_name, vers = todo.shift
|
|
420
|
-
|
|
421
|
-
if seen.include? package_name
|
|
422
641
|
|
|
423
|
-
# already seen - verify requirements are not in conflict
|
|
424
|
-
pkg = ret.find { |p| p.name == package_name }
|
|
425
|
-
unless satisfied_by? vers, pkg.version
|
|
426
|
-
raise "Conflicting dependencies '#{package_name}' requires #{pkg.version} and #{vers}"
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
next
|
|
430
|
-
end
|
|
431
642
|
|
|
432
|
-
|
|
643
|
+
# Find package locally or in global cache
|
|
644
|
+
|
|
645
|
+
def locate_package(package_name, vers, verbose)
|
|
646
|
+
local = has_local_package?(package_name)
|
|
647
|
+
|
|
648
|
+
# It's true that we don't have a prerelase check here, but the
|
|
649
|
+
# previous one we had didn't do anything, so it's better to have
|
|
650
|
+
# none than one that doesn't work
|
|
651
|
+
vers = ">= 0" if vers == ">= 0-pre"
|
|
652
|
+
src_path = local ?
|
|
653
|
+
local_package_root(package_name) :
|
|
654
|
+
BPM::Local.new.source_root(package_name, vers)
|
|
655
|
+
|
|
656
|
+
return nil unless src_path
|
|
657
|
+
|
|
658
|
+
pkg = BPM::Package.new(src_path)
|
|
659
|
+
pkg.load_json # throws exception if json invalid
|
|
660
|
+
pkg
|
|
661
|
+
end
|
|
433
662
|
|
|
434
|
-
|
|
435
|
-
|
|
663
|
+
# pass in a hash of dependencies and versions
|
|
664
|
+
def report_package_locations(deps=nil)
|
|
665
|
+
deps ||= local_deps
|
|
666
|
+
deps.each do |dep|
|
|
667
|
+
is_local = has_local_package?(dep.name) ? 'local' : 'fetched'
|
|
668
|
+
puts "~ Using #{is_local} package '#{dep.name}' (#{dep.version})"
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
# Method for help in sorting dependencies
|
|
436
673
|
|
|
437
|
-
|
|
438
|
-
|
|
674
|
+
def add_sorted_dep(dep, deps, type, sorted, seen=[])
|
|
675
|
+
return if seen.include? dep
|
|
676
|
+
seen << dep # we want to do this first to avoid cylical refs
|
|
677
|
+
|
|
678
|
+
list = {}
|
|
679
|
+
list.merge!(dep.dependencies) if [:both, :runtime].include?(type)
|
|
680
|
+
list.merge!(dep.dependencies_development) if [:both, :development].include?(type)
|
|
681
|
+
list.each do |dep_name, dep_vers|
|
|
682
|
+
found_dep = deps.find { |cur| cur.name == dep_name }
|
|
683
|
+
add_sorted_dep(found_dep, deps, type, sorted, seen) if found_dep
|
|
684
|
+
end
|
|
685
|
+
sorted << dep unless sorted.include? dep
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
def has_mode(opts, mode)
|
|
689
|
+
return false if opts.nil?
|
|
690
|
+
modes = Array(opts['modes'])
|
|
691
|
+
modes.size==0 || modes.include?('*') || modes.include?(mode.to_s)
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
## BUILD OPTIONS
|
|
696
|
+
|
|
697
|
+
def merge_build_opts(ret, dep_name, target_name, opts, mode)
|
|
698
|
+
|
|
699
|
+
ret[target_name] ||= {}
|
|
700
|
+
|
|
701
|
+
if opts['assets']
|
|
702
|
+
ret[target_name] = opts['assets']
|
|
703
|
+
return
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
if opts['directories'] && opts['directories'].size>0
|
|
707
|
+
ret[target_name][dep_name] = opts['directories']
|
|
708
|
+
end
|
|
709
|
+
|
|
710
|
+
if opts['minifier']
|
|
711
|
+
if opts['minifier'].is_a? String
|
|
712
|
+
ret[target_name]['bpm:minifier'] = {}
|
|
713
|
+
ret[target_name]['bpm:minifier'][opts['minifier']] = '>= 0'
|
|
714
|
+
else
|
|
715
|
+
ret[target_name]['bpm:minifier'] = opts['minifier']
|
|
439
716
|
end
|
|
717
|
+
end
|
|
440
718
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
719
|
+
Array(opts['include']).each do |package_name|
|
|
720
|
+
dep = local_deps.find { |cur_dep| cur_dep.name == package_name }
|
|
721
|
+
raise PackageNotFoundError.new(package_name, '>= 0') if dep.nil?
|
|
722
|
+
tmp_settings = {}
|
|
723
|
+
merge_build_settings(tmp_settings, dep, mode, true, true)
|
|
724
|
+
if target_name =~ /\.css$/ && tmp_settings['bpm_styles.css']
|
|
725
|
+
ret[target_name].merge! tmp_settings['bpm_styles.css']
|
|
726
|
+
elsif target_name =~ /\.js$/ && tmp_settings['bpm_libs.js']
|
|
727
|
+
ret[target_name].merge! tmp_settings['bpm_libs.js']
|
|
444
728
|
end
|
|
445
|
-
|
|
446
|
-
ret << pkg
|
|
447
729
|
end
|
|
448
730
|
|
|
449
|
-
ret
|
|
450
731
|
end
|
|
732
|
+
|
|
733
|
+
def project_settings_excludes(dep_name, target_name)
|
|
734
|
+
exclusions = bpm_build[target_name] && bpm_build[target_name]['exclude']
|
|
735
|
+
exclusions && exclusions.include?(dep_name)
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
DEFAULT_BUILD_OPTS = {
|
|
739
|
+
'bpm_libs.js' => {
|
|
740
|
+
'directories' => ['lib'],
|
|
741
|
+
'modes' => ['*']
|
|
742
|
+
},
|
|
743
|
+
|
|
744
|
+
'bpm_styles.css' => {
|
|
745
|
+
'directories' => ['css'],
|
|
746
|
+
'modes' => ['*']
|
|
747
|
+
}
|
|
748
|
+
}
|
|
451
749
|
|
|
452
|
-
def
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
vers, prerel = clean_version vers
|
|
460
|
-
src_path = BPM::Local.new.source_root package_name, vers, prerel
|
|
461
|
-
if src_path
|
|
462
|
-
pkg = BPM::Package.new src_path
|
|
463
|
-
pkg.load_json
|
|
464
|
-
puts "~ Using fetched package '#{pkg.name}' (#{pkg.version})" if verbose
|
|
750
|
+
def soft_merge(base, ext)
|
|
751
|
+
ret = base.dup
|
|
752
|
+
ext.each do |key, value|
|
|
753
|
+
if ret[key].is_a?(Hash) && value.is_a?(Hash)
|
|
754
|
+
ret[key] = soft_merge(ret[key], value)
|
|
755
|
+
else
|
|
756
|
+
ret[key] = value
|
|
465
757
|
end
|
|
466
758
|
end
|
|
467
|
-
|
|
468
|
-
pkg
|
|
759
|
+
ret
|
|
469
760
|
end
|
|
470
761
|
|
|
762
|
+
def default_build_opts(dep_name)
|
|
763
|
+
@default_build_opts ||= {}
|
|
764
|
+
ret = @default_build_opts[dep_name]
|
|
765
|
+
if ret.nil?
|
|
766
|
+
ret = DEFAULT_BUILD_OPTS.dup
|
|
767
|
+
ret[dep_name] = {
|
|
768
|
+
"assets" => %w(resources assets),
|
|
769
|
+
"modes" => ["*"]
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
ret["#{dep_name}/bpm_tests.js"] = {
|
|
773
|
+
'directories' => ['tests'],
|
|
774
|
+
'modes' => ['debug']
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
@default_build_opts[dep_name] = ret
|
|
778
|
+
end
|
|
779
|
+
ret
|
|
780
|
+
end
|
|
781
|
+
|
|
782
|
+
def merge_build_settings(ret, dep, mode, include_defaults=true, ignore_excludes=false)
|
|
783
|
+
|
|
784
|
+
bpm_opts = dep.bpm_build
|
|
785
|
+
if include_defaults
|
|
786
|
+
bpm_opts = soft_merge default_build_opts(dep.name), bpm_opts
|
|
787
|
+
end
|
|
788
|
+
|
|
789
|
+
bpm_opts.each do |target_name, opts|
|
|
790
|
+
next if !has_mode(opts, mode)
|
|
791
|
+
next if !ignore_excludes && project_settings_excludes(dep.name, target_name)
|
|
792
|
+
merge_build_opts ret, dep.name, target_name, opts, mode
|
|
793
|
+
end
|
|
794
|
+
end
|
|
795
|
+
|
|
471
796
|
end
|
|
472
797
|
|
|
473
798
|
end
|