bpm 0.1.0
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/.gitignore +4 -0
- data/.gitmodules +0 -0
- data/Gemfile +16 -0
- data/README.md +55 -0
- data/TODO.md +3 -0
- data/bin/bpm +8 -0
- data/bpm.gemspec +41 -0
- data/lib/bpm.rb +18 -0
- data/lib/bpm/cli.rb +6 -0
- data/lib/bpm/cli/base.rb +358 -0
- data/lib/bpm/cli/owner.rb +46 -0
- data/lib/bpm/credentials.rb +36 -0
- data/lib/bpm/default.json +9 -0
- data/lib/bpm/generator.rb +69 -0
- data/lib/bpm/init_generator.rb +43 -0
- data/lib/bpm/libgems_ext.rb +11 -0
- data/lib/bpm/libgems_ext/config_file.rb +33 -0
- data/lib/bpm/libgems_ext/dependency_installer.rb +150 -0
- data/lib/bpm/libgems_ext/installer.rb +39 -0
- data/lib/bpm/libgems_ext/libgems.rb +39 -0
- data/lib/bpm/libgems_ext/spec_fetcher.rb +11 -0
- data/lib/bpm/local.rb +76 -0
- data/lib/bpm/package.rb +277 -0
- data/lib/bpm/pipeline.rb +100 -0
- data/lib/bpm/pipeline/directive_processor.rb +47 -0
- data/lib/bpm/pipeline/generated_asset.rb +68 -0
- data/lib/bpm/pipeline/transport_processor.rb +32 -0
- data/lib/bpm/project.rb +427 -0
- data/lib/bpm/project_generator.rb +34 -0
- data/lib/bpm/remote.rb +104 -0
- data/lib/bpm/repository.rb +18 -0
- data/lib/bpm/server.rb +44 -0
- data/lib/bpm/version.rb +3 -0
- data/spec/cli/add_spec.rb +159 -0
- data/spec/cli/build_spec.rb +87 -0
- data/spec/cli/fetch_spec.rb +135 -0
- data/spec/cli/fetched_spec.rb +52 -0
- data/spec/cli/init_spec.rb +50 -0
- data/spec/cli/list_spec.rb +74 -0
- data/spec/cli/login_spec.rb +110 -0
- data/spec/cli/new_spec.rb +92 -0
- data/spec/cli/owner_spec.rb +114 -0
- data/spec/cli/push_spec.rb +73 -0
- data/spec/cli/remove_spec.rb +84 -0
- data/spec/cli/unpack_spec.rb +72 -0
- data/spec/cli/unyank_spec.rb +73 -0
- data/spec/cli/yank_spec.rb +73 -0
- data/spec/credentials_spec.rb +23 -0
- data/spec/fixtures/badrake-0.8.7.spd +0 -0
- data/spec/fixtures/builder-3.0.0.spd +0 -0
- data/spec/fixtures/bundler-1.1.pre.spd +0 -0
- data/spec/fixtures/coffee-1.0.1.pre.spd +0 -0
- data/spec/fixtures/core-test-0.4.9.spd +0 -0
- data/spec/fixtures/core-test/bin/cot +3 -0
- data/spec/fixtures/core-test/lib/main.js +1 -0
- data/spec/fixtures/core-test/package.json +46 -0
- data/spec/fixtures/core-test/resources/runner.css +1 -0
- data/spec/fixtures/core-test/tests/test.js +1 -0
- data/spec/fixtures/custom_generator-1.0.spd +0 -0
- data/spec/fixtures/custom_generator/lib/main.js +1 -0
- data/spec/fixtures/custom_generator/package.json +12 -0
- data/spec/fixtures/custom_generator/templates/init/project.json +19 -0
- data/spec/fixtures/custom_generator/templates/project/app.js +1 -0
- data/spec/fixtures/custom_generator/templates/project/lib/main.js +0 -0
- data/spec/fixtures/custom_generator/templates/project_generator.rb +20 -0
- data/spec/fixtures/hello_world/LICENSE +19 -0
- data/spec/fixtures/hello_world/README.md +21 -0
- data/spec/fixtures/hello_world/assets/bpm_packages.js +13 -0
- data/spec/fixtures/hello_world/assets/bpm_styles.css +14 -0
- data/spec/fixtures/hello_world/assets/papa-smurf.jpg +0 -0
- data/spec/fixtures/hello_world/hello_world.json +20 -0
- data/spec/fixtures/hello_world/lib/main.js +9 -0
- data/spec/fixtures/hello_world/packages/custom_package/assets/dummy.txt +1 -0
- data/spec/fixtures/hello_world/packages/custom_package/css/sample_styles.css +3 -0
- data/spec/fixtures/hello_world/packages/custom_package/custom_dir/basic-module.js +1 -0
- data/spec/fixtures/hello_world/packages/custom_package/lib/main.js +1 -0
- data/spec/fixtures/hello_world/packages/custom_package/package.json +22 -0
- data/spec/fixtures/hello_world/tests/main-test.js +8 -0
- data/spec/fixtures/highline-1.6.1.spd +0 -0
- data/spec/fixtures/ivory-0.0.1.spd +0 -0
- data/spec/fixtures/jquery-1.4.3.spd +0 -0
- data/spec/fixtures/optparse-1.0.1.spd +0 -0
- data/spec/fixtures/rake-0.8.6.spd +0 -0
- data/spec/fixtures/rake-0.8.7.spd +0 -0
- data/spec/fixtures/simple_hello/assets/bpm_packages.js +1 -0
- data/spec/fixtures/simple_hello/lib/main.js +1 -0
- data/spec/fixtures/spade-0.5.0.spd +0 -0
- data/spec/fixtures/src/README.txt +1 -0
- data/spec/fixtures/src/bundler-1.1.pre/.gitignore +22 -0
- data/spec/fixtures/src/bundler-1.1.pre/CHANGELOG.md +646 -0
- data/spec/fixtures/src/bundler-1.1.pre/ISSUES.md +47 -0
- data/spec/fixtures/src/bundler-1.1.pre/LICENSE +21 -0
- data/spec/fixtures/src/bundler-1.1.pre/README.md +29 -0
- data/spec/fixtures/src/bundler-1.1.pre/UPGRADING.md +103 -0
- data/spec/fixtures/src/bundler-1.1.pre/bin/bundle +20 -0
- data/spec/fixtures/src/bundler-1.1.pre/lib/bundler.js +23 -0
- data/spec/fixtures/src/bundler-1.1.pre/lib/bundler/definition.js +14 -0
- data/spec/fixtures/src/bundler-1.1.pre/lib/bundler/dependency.js +15 -0
- data/spec/fixtures/src/bundler-1.1.pre/lib/bundler/dsl.js +9 -0
- data/spec/fixtures/src/bundler-1.1.pre/lib/bundler/ui.js +6 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/bundle-config.ronn +90 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/bundle-exec.ronn +111 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/bundle-install.ronn +314 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/bundle-package.ronn +59 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/bundle-update.ronn +176 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/bundle.ronn +80 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/gemfile.5.ronn +279 -0
- data/spec/fixtures/src/bundler-1.1.pre/man/index.txt +6 -0
- data/spec/fixtures/src/bundler-1.1.pre/package.json +19 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/bin/cake +0 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/bin/coffee +0 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/lib/coffee.js +0 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/lib/coffee/base.js +0 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/lib/coffee/mocha/chai.js +0 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/package.json +19 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/qunit/coffee/test.js +0 -0
- data/spec/fixtures/src/coffee-1.0.1.pre/qunit/test.js +0 -0
- data/spec/fixtures/src/jquery/lib/main.js +7179 -0
- data/spec/fixtures/src/jquery/package.json +15 -0
- data/spec/fixtures/src/rake-0.8.6/CHANGES +436 -0
- data/spec/fixtures/src/rake-0.8.6/MIT-LICENSE +21 -0
- data/spec/fixtures/src/rake-0.8.6/README +196 -0
- data/spec/fixtures/src/rake-0.8.6/Rakefile +430 -0
- data/spec/fixtures/src/rake-0.8.6/TODO +20 -0
- data/spec/fixtures/src/rake-0.8.6/bin/rake +31 -0
- data/spec/fixtures/src/rake-0.8.6/doc/command_line_usage.rdoc +102 -0
- data/spec/fixtures/src/rake-0.8.6/doc/example/Rakefile1 +38 -0
- data/spec/fixtures/src/rake-0.8.6/doc/example/Rakefile2 +35 -0
- data/spec/fixtures/src/rake-0.8.6/doc/example/a.c +6 -0
- data/spec/fixtures/src/rake-0.8.6/doc/example/b.c +6 -0
- data/spec/fixtures/src/rake-0.8.6/doc/example/main.c +11 -0
- data/spec/fixtures/src/rake-0.8.6/doc/glossary.rdoc +51 -0
- data/spec/fixtures/src/rake-0.8.6/doc/jamis.rb +591 -0
- data/spec/fixtures/src/rake-0.8.6/doc/proto_rake.rdoc +127 -0
- data/spec/fixtures/src/rake-0.8.6/doc/rake.1.gz +0 -0
- data/spec/fixtures/src/rake-0.8.6/doc/rakefile.rdoc +534 -0
- data/spec/fixtures/src/rake-0.8.6/doc/rational.rdoc +151 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.4.14.rdoc +23 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.4.15.rdoc +35 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.5.0.rdoc +53 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.5.3.rdoc +78 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.5.4.rdoc +46 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.6.0.rdoc +141 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.7.0.rdoc +119 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.7.1.rdoc +59 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.7.2.rdoc +121 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.7.3.rdoc +47 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.8.0.rdoc +114 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.8.2.rdoc +165 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.8.3.rdoc +112 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.8.4.rdoc +147 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.8.5.rdoc +53 -0
- data/spec/fixtures/src/rake-0.8.6/doc/release_notes/rake-0.8.6.rdoc +55 -0
- data/spec/fixtures/src/rake-0.8.6/install.rb +88 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake.rb +2502 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/alt_system.rb +108 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/classic_namespace.rb +8 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/clean.rb +33 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/contrib/compositepublisher.rb +24 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/contrib/ftptools.rb +153 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/contrib/publisher.rb +75 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/contrib/rubyforgepublisher.rb +18 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/contrib/sshpublisher.rb +47 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/contrib/sys.rb +209 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/gempackagetask.rb +97 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/loaders/makefile.rb +42 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/packagetask.rb +184 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/rake_test_loader.rb +5 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/rdoctask.rb +209 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/ruby182_test_unit_fix.rb +23 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/runtest.rb +23 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/tasklib.rb +23 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/testtask.rb +161 -0
- data/spec/fixtures/src/rake-0.8.6/lib/rake/win32.rb +55 -0
- data/spec/fixtures/src/rake-0.8.6/package.json +18 -0
- data/spec/fixtures/src/rake-0.8.6/test/capture_stdout.rb +26 -0
- data/spec/fixtures/src/rake-0.8.7/CHANGES +440 -0
- data/spec/fixtures/src/rake-0.8.7/MIT-LICENSE +21 -0
- data/spec/fixtures/src/rake-0.8.7/README +196 -0
- data/spec/fixtures/src/rake-0.8.7/Rakefile +430 -0
- data/spec/fixtures/src/rake-0.8.7/TODO +20 -0
- data/spec/fixtures/src/rake-0.8.7/bin/rake +31 -0
- data/spec/fixtures/src/rake-0.8.7/doc/command_line_usage.rdoc +102 -0
- data/spec/fixtures/src/rake-0.8.7/doc/example/Rakefile1 +38 -0
- data/spec/fixtures/src/rake-0.8.7/doc/example/Rakefile2 +35 -0
- data/spec/fixtures/src/rake-0.8.7/doc/example/a.c +6 -0
- data/spec/fixtures/src/rake-0.8.7/doc/example/b.c +6 -0
- data/spec/fixtures/src/rake-0.8.7/doc/example/main.c +11 -0
- data/spec/fixtures/src/rake-0.8.7/doc/glossary.rdoc +51 -0
- data/spec/fixtures/src/rake-0.8.7/doc/jamis.rb +591 -0
- data/spec/fixtures/src/rake-0.8.7/doc/proto_rake.rdoc +127 -0
- data/spec/fixtures/src/rake-0.8.7/doc/rake.1.gz +0 -0
- data/spec/fixtures/src/rake-0.8.7/doc/rakefile.rdoc +534 -0
- data/spec/fixtures/src/rake-0.8.7/doc/rational.rdoc +151 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.4.14.rdoc +23 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.4.15.rdoc +35 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.5.0.rdoc +53 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.5.3.rdoc +78 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.5.4.rdoc +46 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.6.0.rdoc +141 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.7.0.rdoc +119 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.7.1.rdoc +59 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.7.2.rdoc +121 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.7.3.rdoc +47 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.0.rdoc +114 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.2.rdoc +165 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.3.rdoc +112 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.4.rdoc +147 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.5.rdoc +53 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.6.rdoc +55 -0
- data/spec/fixtures/src/rake-0.8.7/doc/release_notes/rake-0.8.7.rdoc +55 -0
- data/spec/fixtures/src/rake-0.8.7/install.rb +88 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake.rb +2506 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/alt_system.rb +108 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/classic_namespace.rb +8 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/clean.rb +33 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/contrib/compositepublisher.rb +24 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/contrib/ftptools.rb +153 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/contrib/publisher.rb +75 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/contrib/rubyforgepublisher.rb +18 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/contrib/sshpublisher.rb +47 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/contrib/sys.rb +209 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/gempackagetask.rb +97 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/loaders/makefile.rb +42 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/packagetask.rb +184 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/rake_test_loader.rb +5 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/rdoctask.rb +209 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/ruby182_test_unit_fix.rb +23 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/runtest.rb +23 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/tasklib.rb +23 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/testtask.rb +161 -0
- data/spec/fixtures/src/rake-0.8.7/lib/rake/win32.rb +55 -0
- data/spec/fixtures/src/rake-0.8.7/package.json +18 -0
- data/spec/fixtures/src/rake-0.8.7/test/capture_stdout.rb +26 -0
- data/spec/fixtures/src/spade/lib/main.js +1 -0
- data/spec/fixtures/src/spade/package.json +15 -0
- data/spec/fixtures/transporter/lib/main.js +3 -0
- data/spec/fixtures/transporter/packages/transport/lib/wrapper.js +5 -0
- data/spec/fixtures/transporter/packages/transport/package.json +21 -0
- data/spec/fixtures/transporter/transporter.json +18 -0
- data/spec/gauntlet_spec.rb +33 -0
- data/spec/package_spec.rb +319 -0
- data/spec/pipeline_spec.rb +213 -0
- data/spec/project_spec.rb +130 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/support/cli.rb +93 -0
- data/spec/support/env.rb +18 -0
- data/spec/support/fake.rb +53 -0
- data/spec/support/fake_gem_server.rb +72 -0
- data/spec/support/fake_gemcutter.rb +50 -0
- data/spec/support/matchers.rb +32 -0
- data/spec/support/path.rb +63 -0
- data/spec/support/project.rb +43 -0
- data/templates/init/assets/bpm_packages.js +7 -0
- data/templates/init/assets/bpm_styles.css +7 -0
- data/templates/init/project.json +16 -0
- data/templates/project/LICENSE +19 -0
- data/templates/project/README.md +21 -0
- data/templates/project/app.js +1 -0
- data/templates/project/index.html +13 -0
- metadata +627 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'libgems'
|
|
2
|
+
|
|
3
|
+
module LibGems
|
|
4
|
+
def self.default_sources
|
|
5
|
+
%w[https://sproutcutter.heroku.com/]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.host
|
|
9
|
+
@host ||= "https://sproutcutter.heroku.com"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.default_dir
|
|
13
|
+
File.join LibGems.user_home, BPM::BPM_DIR
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.user_dir
|
|
17
|
+
File.join LibGems.user_home, BPM::BPM_DIR
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.config_file
|
|
21
|
+
File.join LibGems.user_home, '.bpmrc'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.path
|
|
25
|
+
@gem_path ||= nil
|
|
26
|
+
|
|
27
|
+
unless @gem_path then
|
|
28
|
+
paths = [ENV['BPM_PATH'] || LibGems.configuration.path || default_path]
|
|
29
|
+
set_paths paths.compact.join(File::PATH_SEPARATOR)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
@gem_path
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.dir
|
|
36
|
+
set_home(ENV['BPM_HOME'] || LibGems.configuration.home || default_dir) unless @gem_home
|
|
37
|
+
@gem_home
|
|
38
|
+
end
|
|
39
|
+
end
|
data/lib/bpm/local.rb
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'libgems/uninstaller'
|
|
2
|
+
|
|
3
|
+
module BPM
|
|
4
|
+
class Local < Repository
|
|
5
|
+
def uninstall(package)
|
|
6
|
+
LibGems::Uninstaller.new(package).uninstall
|
|
7
|
+
true
|
|
8
|
+
rescue LibGems::InstallError
|
|
9
|
+
false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def pack(path, email=nil)
|
|
13
|
+
package_path = File.dirname(File.expand_path path)
|
|
14
|
+
cur_pwd = Dir.pwd
|
|
15
|
+
|
|
16
|
+
FileUtils.cd package_path if package_path != cur_pwd
|
|
17
|
+
package = BPM::Package.new(nil, email || creds.email)
|
|
18
|
+
package.json_path = File.basename path
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if package.valid?
|
|
22
|
+
silence do
|
|
23
|
+
LibGems::Builder.new(package.to_spec).build
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
FileUtils.cd cur_pwd if package_path != cur_pwd
|
|
28
|
+
package
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def unpack(path, target)
|
|
32
|
+
package = BPM::Package.new
|
|
33
|
+
package.bpkg = path
|
|
34
|
+
unpack_dir = File.expand_path(File.join(Dir.pwd, target, package.to_full_name))
|
|
35
|
+
LibGems::Installer.new(path, :unpack => true).unpack unpack_dir
|
|
36
|
+
package
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def installed(packages)
|
|
40
|
+
specs = LibGems.source_index.search dependency_for(packages)
|
|
41
|
+
|
|
42
|
+
specs.map do |spec|
|
|
43
|
+
[spec.name, spec.version, spec.original_platform]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def preferred_version(package, vers, prerelease)
|
|
48
|
+
dep = LibGems::Dependency.new package, vers
|
|
49
|
+
specs = LibGems.source_index.search dep
|
|
50
|
+
specs.last.version.to_s
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def source_root(package, vers, prerelease)
|
|
54
|
+
dep = LibGems::Dependency.new package, vers
|
|
55
|
+
specs = LibGems.source_index.search dep
|
|
56
|
+
|
|
57
|
+
dep2 = LibGems::Dependency.new package, '>= 0'
|
|
58
|
+
specs2 = LibGems.source_index.search dep2
|
|
59
|
+
|
|
60
|
+
spec = specs.last
|
|
61
|
+
spec &&
|
|
62
|
+
File.join(spec.installation_path, 'gems', "#{spec.name}-#{spec.version}")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def silence
|
|
68
|
+
original_verbose = LibGems.configuration.verbose
|
|
69
|
+
LibGems.configuration.verbose = false
|
|
70
|
+
yield
|
|
71
|
+
ensure
|
|
72
|
+
LibGems.configuration.verbose = original_verbose
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
data/lib/bpm/package.rb
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
module BPM
|
|
4
|
+
class Package
|
|
5
|
+
EXT = "spd"
|
|
6
|
+
METADATA = %w[keywords licenses engines main bin directories]
|
|
7
|
+
FIELDS = %w[name version description author homepage summary]
|
|
8
|
+
attr_accessor :metadata, :lib_path, :tests_path, :errors, :json_path, :attributes, :directories, :dependencies, :root_path
|
|
9
|
+
attr_accessor *FIELDS
|
|
10
|
+
|
|
11
|
+
def self.from_spec(spec)
|
|
12
|
+
pkg = new(spec.full_gem_path)
|
|
13
|
+
pkg.bpkg = spec
|
|
14
|
+
pkg
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def initialize(root_path=nil, email = "")
|
|
18
|
+
@root_path = root_path || Dir.pwd
|
|
19
|
+
@json_path = File.join @root_path, 'package.json'
|
|
20
|
+
@email = email
|
|
21
|
+
@attributes = {}
|
|
22
|
+
@dependencies = {}
|
|
23
|
+
@directories = {}
|
|
24
|
+
@metadata = {}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def bpm
|
|
28
|
+
@bpm || BPM::VERSION
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def bpkg=(spec)
|
|
32
|
+
unless spec.is_a?(LibGems::Specification)
|
|
33
|
+
spec = LibGems::Format.from_file_by_path(spec.to_s).spec
|
|
34
|
+
end
|
|
35
|
+
fill_from_gemspec(spec)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def to_spec
|
|
39
|
+
return unless valid?
|
|
40
|
+
LibGems::Specification.new do |spec|
|
|
41
|
+
spec.name = name
|
|
42
|
+
spec.version = version
|
|
43
|
+
spec.authors = [author]
|
|
44
|
+
spec.email = @email
|
|
45
|
+
spec.homepage = homepage
|
|
46
|
+
spec.summary = summary
|
|
47
|
+
spec.description = description
|
|
48
|
+
spec.requirements = [metadata.to_json]
|
|
49
|
+
spec.files = directory_files + template_files + ["package.json"]
|
|
50
|
+
spec.test_files = glob_files(tests_path)
|
|
51
|
+
spec.bindir = bin_path
|
|
52
|
+
spec.executables = bin_files.map{|p| File.basename(p) } if bin_path
|
|
53
|
+
# TODO: IS this right?
|
|
54
|
+
spec.rubyforge_project = "bpm"
|
|
55
|
+
def spec.file_name
|
|
56
|
+
"#{full_name}.#{EXT}"
|
|
57
|
+
end
|
|
58
|
+
dependencies.each{|d,v| spec.add_dependency(d, v) } if dependencies
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def as_json(options = {})
|
|
63
|
+
json = self.metadata.clone
|
|
64
|
+
FIELDS.each{|key| json[key] = send(key)}
|
|
65
|
+
json["dependencies"] = self.dependencies
|
|
66
|
+
json
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def to_json
|
|
70
|
+
as_json.to_json
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def to_full_name
|
|
74
|
+
"#{name}-#{version}"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def to_ext
|
|
78
|
+
"#{self.to_full_name}.#{EXT}"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def template_path(name)
|
|
82
|
+
path = File.join(root_path, 'templates', name.to_s)
|
|
83
|
+
File.exist?(path) ? path : nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def generator_for(type)
|
|
87
|
+
unless generator = BPM.generator_for(name, type, false)
|
|
88
|
+
path = File.join(root_path, 'templates', "#{type}_generator.rb")
|
|
89
|
+
load path if File.exist?(path)
|
|
90
|
+
generator = BPM.generator_for(name, type)
|
|
91
|
+
end
|
|
92
|
+
generator
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def errors
|
|
96
|
+
@errors ||= []
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def validate
|
|
100
|
+
validate_fields && validate_version && validate_paths
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def valid?
|
|
104
|
+
load_json && validate
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def has_json?
|
|
108
|
+
File.exist?(json_path)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def load_json
|
|
112
|
+
read && parse
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# TODO: Make better errors
|
|
116
|
+
# TODO: This might not work well with conflicting versions
|
|
117
|
+
def local_deps(search_path=nil)
|
|
118
|
+
search_path ||= File.join(root_path, "packages")
|
|
119
|
+
|
|
120
|
+
dependencies.inject([]) do |list, (name, version)|
|
|
121
|
+
package = Package.new(File.join(search_path, name))
|
|
122
|
+
requirement = LibGems::Requirement.new(version)
|
|
123
|
+
if package.has_json?
|
|
124
|
+
package.load_json
|
|
125
|
+
else
|
|
126
|
+
raise "Can't find package #{name} required in #{self.name}"
|
|
127
|
+
end
|
|
128
|
+
unless requirement.satisfied_by?(LibGems::Version.new(package.version))
|
|
129
|
+
raise "#{name} (#{package.version}) doesn't match #{version} required in #{self.name}"
|
|
130
|
+
end
|
|
131
|
+
(package.local_deps(search_path) << package).each do |dep|
|
|
132
|
+
list << dep unless list.any?{|d| d.name == dep.name }
|
|
133
|
+
end
|
|
134
|
+
list
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def directory_files
|
|
139
|
+
directories.reject{|k,_| k == 'tests' }.values.map{|dir| glob_files(dir) }.flatten
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def bin_files
|
|
143
|
+
if @attributes["bin"]
|
|
144
|
+
@attributes["bin"].values
|
|
145
|
+
else
|
|
146
|
+
[]
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def template_files
|
|
151
|
+
glob_files("templates")
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def bin_path
|
|
155
|
+
@directories["bin"] || "bin"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def lib_path
|
|
159
|
+
@directories["lib"] || "lib"
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def tests_path
|
|
163
|
+
@directories["tests"] || "tests"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def transport_plugins(project)
|
|
167
|
+
plugin_modules('plugin:transport', project)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def plugin_modules(key_name, project)
|
|
171
|
+
return [@attributes[key_name]] if @attributes[key_name]
|
|
172
|
+
dependencies.keys.map do |pkg_name|
|
|
173
|
+
dep = project.local_deps.find do |pkg|
|
|
174
|
+
pkg.load_json
|
|
175
|
+
pkg.name == pkg_name
|
|
176
|
+
end
|
|
177
|
+
dep.attributes[key_name]
|
|
178
|
+
end.compact
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# named directories that are expected to contain code. These will be
|
|
182
|
+
# searched for supported modules
|
|
183
|
+
def pipeline_libs
|
|
184
|
+
(@attributes['pipeline'] && @attributes['pipeline']['libs']) || ['lib']
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def pipeline_css
|
|
188
|
+
(@attributes['pipeline'] && @attributes['pipeline']['css']) || ['css']
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def pipeline_assets
|
|
192
|
+
(@attributes['pipeline'] && @attributes['pipeline']['assets']) || ['assets', 'resources']
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
private
|
|
196
|
+
|
|
197
|
+
def parse
|
|
198
|
+
FIELDS.each do |field|
|
|
199
|
+
send("#{field}=", @attributes[field])
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
self.dependencies = @attributes["dependencies"] || {}
|
|
203
|
+
self.directories = @attributes["directories"] || {}
|
|
204
|
+
self.metadata = Hash[*@attributes.select { |k, v| METADATA.include?(k) }.flatten(1)]
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def read
|
|
208
|
+
@attributes = JSON.parse(File.read(@json_path))
|
|
209
|
+
rescue *[JSON::ParserError, Errno::EACCES, Errno::ENOENT] => ex
|
|
210
|
+
add_error "There was a problem parsing #{File.basename(@json_path)}: #{ex.message}"
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def validate_paths
|
|
214
|
+
success = true
|
|
215
|
+
|
|
216
|
+
if paths = [*lib_path]
|
|
217
|
+
non_dirs = paths.reject{|p| File.directory?(File.join(@root_path, p))}
|
|
218
|
+
if paths.empty?
|
|
219
|
+
add_error "A lib directory is required"
|
|
220
|
+
success = false
|
|
221
|
+
elsif !non_dirs.empty?
|
|
222
|
+
add_error "#{non_dirs.map{|p| "'#{p}'" }.join(", ")}, specified for lib directory, is not a directory"
|
|
223
|
+
success = false
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# look for actual 'tests' in directories hash since simply having no
|
|
228
|
+
# tests dir is allowed as well.
|
|
229
|
+
unless @directories['tests'].nil? || File.directory?(File.join(@root_path, tests_path))
|
|
230
|
+
add_error "'#{tests_path}', specified for tests directory, is not a directory"
|
|
231
|
+
success = false
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
success
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def validate_version
|
|
238
|
+
LibGems::Version.new(version)
|
|
239
|
+
true
|
|
240
|
+
rescue ArgumentError => ex
|
|
241
|
+
add_error ex.to_s
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def validate_fields
|
|
245
|
+
%w[name description summary homepage author version directories].all? do |field|
|
|
246
|
+
value = send(field)
|
|
247
|
+
if value.nil? || value.size.zero?
|
|
248
|
+
add_error "Package requires a '#{field}' field"
|
|
249
|
+
else
|
|
250
|
+
true
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def add_error(message)
|
|
256
|
+
self.errors << message
|
|
257
|
+
false
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def glob_files(path)
|
|
261
|
+
Dir[File.join(path, "**", "*")].reject{|f| File.directory?(f) }
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def fill_from_gemspec(spec)
|
|
265
|
+
FIELDS.each{|field| send("#{field}=", spec.send(field).to_s) }
|
|
266
|
+
|
|
267
|
+
self.dependencies = {}
|
|
268
|
+
spec.dependencies.each{|d| self.dependencies[d.name] = d.requirement.to_s }
|
|
269
|
+
|
|
270
|
+
if spec.requirements && spec.requirements.size>0
|
|
271
|
+
self.metadata = JSON.parse(spec.requirements.first)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
data/lib/bpm/pipeline.rb
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require 'sprockets'
|
|
2
|
+
|
|
3
|
+
module BPM
|
|
4
|
+
|
|
5
|
+
autoload :DirectiveProcessor, 'bpm/pipeline/directive_processor'
|
|
6
|
+
autoload :GeneratedAsset, 'bpm/pipeline/generated_asset'
|
|
7
|
+
autoload :TransportProcessor, 'bpm/pipeline/transport_processor'
|
|
8
|
+
|
|
9
|
+
# A BPM package-aware asset pipeline. Asset lookup respects package.json
|
|
10
|
+
# directory configurations as well as loading preprocessors, formats, and
|
|
11
|
+
# postprocessors from the package config.
|
|
12
|
+
#
|
|
13
|
+
class Pipeline < Sprockets::Environment
|
|
14
|
+
|
|
15
|
+
attr_reader :project
|
|
16
|
+
|
|
17
|
+
# Pass in the project you want the pipeline to manage.
|
|
18
|
+
def initialize(project)
|
|
19
|
+
@project = project
|
|
20
|
+
project_path = project.root_path
|
|
21
|
+
|
|
22
|
+
super project_path
|
|
23
|
+
|
|
24
|
+
# use custom directive processor
|
|
25
|
+
%w(text/css application/javascript).each do |kind|
|
|
26
|
+
unregister_processor kind, Sprockets::DirectiveProcessor
|
|
27
|
+
register_processor kind, BPM::DirectiveProcessor
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
register_postprocessor 'application/javascript', BPM::TransportProcessor
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# configure search paths
|
|
34
|
+
append_path File.join project_path, '.bpm', 'packages'
|
|
35
|
+
append_path File.dirname project_path
|
|
36
|
+
append_path File.join project_path, 'assets'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Loads the passed JavaScript file and evals it. Used for loading
|
|
40
|
+
# transport and other plugins.
|
|
41
|
+
def js_context_for(path)
|
|
42
|
+
@js_contexts ||= {}
|
|
43
|
+
@js_contexts[path] ||= build_js_context(path)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Returns an array of all the buildable assets in the current directory.
|
|
47
|
+
# These are the assets that will be built when you compile the project.
|
|
48
|
+
def buildable_assets
|
|
49
|
+
|
|
50
|
+
# make sure the logical_path can be used to simply build into the
|
|
51
|
+
# assets directory when we are done
|
|
52
|
+
ret = ['bpm_packages.js', 'bpm_styles.css']
|
|
53
|
+
|
|
54
|
+
project.local_deps.each do |pkg|
|
|
55
|
+
pkg.load_json
|
|
56
|
+
pkg.pipeline_assets.each do |dir|
|
|
57
|
+
dir_name = pkg.directories[dir] || dir
|
|
58
|
+
dir_name.sub! /^\.?\//, ''
|
|
59
|
+
pkg_root = File.join(pkg.root_path, dir_name)
|
|
60
|
+
Dir[File.join(pkg_root, '**', '*')].each do |fn|
|
|
61
|
+
fn.sub! /^#{Regexp.escape pkg_root}\//, ''
|
|
62
|
+
ret << File.join(pkg.name, dir_name, fn)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
ret.sort.map { |x| find_asset x }.compact
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Detect whenever we are asked to build some of the magic files and swap
|
|
71
|
+
# in a custom asset type that can generate the contents.
|
|
72
|
+
def build_asset(logical_path, pathname, options)
|
|
73
|
+
magic_paths = %w(bpm_packages.js bpm_styles.css).map do |filename|
|
|
74
|
+
File.join project.root_path, 'assets', filename
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
if magic_paths.include? pathname.to_s
|
|
78
|
+
BPM::GeneratedAsset.new(self, logical_path, pathname, options)
|
|
79
|
+
else
|
|
80
|
+
super logical_path, pathname, options
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def build_js_context(path)
|
|
87
|
+
require 'v8'
|
|
88
|
+
|
|
89
|
+
ctx = V8::Context.new do |ctx|
|
|
90
|
+
ctx['exports'] = {}
|
|
91
|
+
ctx.eval "(function(exports) { #{File.read path} })(exports);"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
@js_contexts[path] = ctx
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|