spade 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/lib/spade.js +11 -17
- data/lib/spade/bundle.rb +20 -0
- data/lib/spade/dependency_installer.rb +103 -0
- data/lib/spade/installer.rb +40 -0
- data/lib/spade/package.rb +7 -1
- data/lib/spade/remote.rb +3 -1
- data/lib/spade/version.rb +1 -1
- data/spec/cli/update_spec.rb +8 -0
- data/spec/fixtures/core-test/bin/cot +2 -0
- data/spec/javascript/normalize-test.js +17 -3
- data/spec/javascript/require-test.js +2 -0
- metadata +6 -2
data/Gemfile.lock
CHANGED
data/lib/spade.js
CHANGED
@@ -67,7 +67,6 @@ var spade ;
|
|
67
67
|
}
|
68
68
|
|
69
69
|
function normalize(id, contextId, contextPkg, _asPackage) {
|
70
|
-
|
71
70
|
// slice separator off the end since it is not used...
|
72
71
|
if (id[id.length-1]==='/') id = id.slice(0,-1);
|
73
72
|
|
@@ -77,18 +76,17 @@ var spade ;
|
|
77
76
|
idx = 0,
|
78
77
|
len = id.length,
|
79
78
|
part, next,
|
79
|
+
packageName = parts[0],
|
80
80
|
useTilde = false;
|
81
81
|
|
82
|
-
|
83
|
-
|
82
|
+
if (contextPkg && contextPkg.main && contextId === packageName+'/main') {
|
84
83
|
// If we're requiring from main we need to handle relative requires specially
|
85
|
-
// I'm not sure if this is required by spec, but at least some CommonJS packages require it (jsdom)
|
86
|
-
if (module === 'main' && contextPkg && contextPkg.main) {
|
87
84
|
useTilde = true;
|
88
85
|
parts = contextPkg.main.replace(/^\.?\//, '').split('/');
|
89
|
-
parts.pop(); // Remove module
|
90
86
|
}
|
91
87
|
|
88
|
+
parts.pop(); // get rid of the last path element since it is a module.
|
89
|
+
|
92
90
|
while(idx<len) {
|
93
91
|
next = id.indexOf('/', idx);
|
94
92
|
if (next<0) next = len;
|
@@ -102,16 +100,7 @@ var spade ;
|
|
102
100
|
id = parts.join('/');
|
103
101
|
|
104
102
|
// Make the path into a root relative path
|
105
|
-
if (useTilde) {
|
106
|
-
var dirPath;
|
107
|
-
for (var name in contextPkg.directories) {
|
108
|
-
dirPath = contextPkg.directories[name].replace(/^\.?\//, '');
|
109
|
-
if (id.substring(0, dirPath.length) === dirPath) {
|
110
|
-
id = id.replace(dirPath, contextPkg.name+'/~'+name);
|
111
|
-
break;
|
112
|
-
}
|
113
|
-
}
|
114
|
-
}
|
103
|
+
if (useTilde) { id = packageName+'/~'+id; }
|
115
104
|
|
116
105
|
// else, just slice off beginning '/' if needed
|
117
106
|
} else if (id[0]==='/') id = id.slice(1);
|
@@ -124,7 +113,12 @@ var spade ;
|
|
124
113
|
// slice separators off begin and end
|
125
114
|
if (id[0]==='/') id = id.slice(1);
|
126
115
|
|
127
|
-
|
116
|
+
// Convert root relative paths to normal paths where possible
|
117
|
+
if (contextPkg && contextPkg.directories) {
|
118
|
+
var libPath = contextPkg.directories['lib'];
|
119
|
+
if (libPath) { id = id.replace('~'+libPath.replace(/^\.?\//, '')+'/', ''); }
|
120
|
+
}
|
121
|
+
|
128
122
|
return remap(id, contextPkg);
|
129
123
|
}
|
130
124
|
|
data/lib/spade/bundle.rb
CHANGED
@@ -24,6 +24,9 @@ module Spade
|
|
24
24
|
|
25
25
|
installed = []
|
26
26
|
|
27
|
+
|
28
|
+
#TODO: Clean up duplication here
|
29
|
+
|
27
30
|
Dir.glob(File.join(BUILTIN_PACKAGES, '*')).each do |path|
|
28
31
|
next unless File.exists? File.join(path, 'package.json')
|
29
32
|
|
@@ -35,6 +38,23 @@ module Spade
|
|
35
38
|
puts "Installing built-in package #{File.basename(path)}" if verbose
|
36
39
|
end
|
37
40
|
|
41
|
+
# Do this to get the Gem.dir right
|
42
|
+
env = Spade::Environment.new
|
43
|
+
Dir.glob(File.join(env.spade_dir, 'gems', '*')).each do |path|
|
44
|
+
package_def = File.join(path, 'package.json')
|
45
|
+
next unless File.exists?(package_def)
|
46
|
+
|
47
|
+
next if installed.include? path
|
48
|
+
installed << path
|
49
|
+
|
50
|
+
json = JSON.load File.read(package_def)
|
51
|
+
package_name = json['name']
|
52
|
+
new_path = File.join(spade_path, 'packages', package_name)
|
53
|
+
FileUtils.ln_s path, new_path, :force => true
|
54
|
+
puts "Installing system package #{File.basename(path)}" if verbose
|
55
|
+
end
|
56
|
+
|
57
|
+
|
38
58
|
Dir.glob(File.join(rootdir, 'packages', '*')).each do |path|
|
39
59
|
next unless File.exists? File.join(path, 'package.json')
|
40
60
|
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'spade/installer'
|
2
|
+
|
3
|
+
module Spade
|
4
|
+
class DependencyInstaller < Gem::DependencyInstaller
|
5
|
+
|
6
|
+
# Had to overwrite this all just to change the match from /gem$/ to /spd$/
|
7
|
+
def find_spec_by_name_and_version(gem_name,
|
8
|
+
version = Gem::Requirement.default,
|
9
|
+
prerelease = false)
|
10
|
+
spec_and_source = nil
|
11
|
+
|
12
|
+
glob = if File::ALT_SEPARATOR then
|
13
|
+
gem_name.gsub File::ALT_SEPARATOR, File::SEPARATOR
|
14
|
+
else
|
15
|
+
gem_name
|
16
|
+
end
|
17
|
+
|
18
|
+
local_gems = Dir["#{glob}*"].sort.reverse
|
19
|
+
|
20
|
+
unless local_gems.empty? then
|
21
|
+
local_gems.each do |gem_file|
|
22
|
+
next unless gem_file =~ /spd$/
|
23
|
+
begin
|
24
|
+
spec = Gem::Format.from_file_by_path(gem_file).spec
|
25
|
+
spec_and_source = [spec, gem_file]
|
26
|
+
break
|
27
|
+
rescue SystemCallError, Gem::Package::FormatError
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if spec_and_source.nil? then
|
33
|
+
dep = Gem::Dependency.new gem_name, version
|
34
|
+
dep.prerelease = true if prerelease
|
35
|
+
spec_and_sources = find_gems_with_sources(dep).reverse
|
36
|
+
|
37
|
+
spec_and_source = spec_and_sources.find { |spec, source|
|
38
|
+
Gem::Platform.match spec.platform
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
if spec_and_source.nil? then
|
43
|
+
raise Gem::GemNotFoundException.new(
|
44
|
+
"Could not find a valid spd '#{gem_name}' (#{version}) locally or in a repository",
|
45
|
+
gem_name, version, @errors)
|
46
|
+
end
|
47
|
+
|
48
|
+
@specs_and_sources = [spec_and_source]
|
49
|
+
end
|
50
|
+
|
51
|
+
# Overwrite this to use our custom installer
|
52
|
+
def install dep_or_name, version = Gem::Requirement.default
|
53
|
+
if String === dep_or_name then
|
54
|
+
find_spec_by_name_and_version dep_or_name, version, @prerelease
|
55
|
+
else
|
56
|
+
dep_or_name.prerelease = @prerelease
|
57
|
+
@specs_and_sources = [find_gems_with_sources(dep_or_name).last]
|
58
|
+
end
|
59
|
+
|
60
|
+
@installed_gems = []
|
61
|
+
|
62
|
+
gather_dependencies
|
63
|
+
|
64
|
+
@gems_to_install.each do |spec|
|
65
|
+
last = spec == @gems_to_install.last
|
66
|
+
# HACK is this test for full_name acceptable?
|
67
|
+
next if @source_index.any? { |n,_| n == spec.full_name } and not last
|
68
|
+
|
69
|
+
# TODO: make this sorta_verbose so other users can benefit from it
|
70
|
+
say "Installing spd #{spec.full_name}" if Gem.configuration.really_verbose
|
71
|
+
|
72
|
+
_, source_uri = @specs_and_sources.assoc spec
|
73
|
+
begin
|
74
|
+
local_gem_path = Gem::RemoteFetcher.fetcher.download spec, source_uri,
|
75
|
+
@cache_dir
|
76
|
+
rescue Gem::RemoteFetcher::FetchError
|
77
|
+
next if @force
|
78
|
+
raise
|
79
|
+
end
|
80
|
+
|
81
|
+
inst = Spade::Installer.new local_gem_path,
|
82
|
+
:bin_dir => @bin_dir,
|
83
|
+
:development => @development,
|
84
|
+
:env_shebang => @env_shebang,
|
85
|
+
:force => @force,
|
86
|
+
:format_executable => @format_executable,
|
87
|
+
:ignore_dependencies => @ignore_dependencies,
|
88
|
+
:install_dir => @install_dir,
|
89
|
+
:security_policy => @security_policy,
|
90
|
+
:source_index => @source_index,
|
91
|
+
:user_install => @user_install,
|
92
|
+
:wrappers => @wrappers
|
93
|
+
|
94
|
+
spec = inst.install
|
95
|
+
|
96
|
+
@installed_gems << spec
|
97
|
+
end
|
98
|
+
|
99
|
+
@installed_gems
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Spade
|
2
|
+
class Installer < Gem::Installer
|
3
|
+
|
4
|
+
def app_script_text(bin_file_name)
|
5
|
+
<<-TEXT
|
6
|
+
#{shebang bin_file_name}
|
7
|
+
#
|
8
|
+
# This file was generated by Spade.
|
9
|
+
#
|
10
|
+
# The application '#{@spec.name}' is installed as part of an spd, and
|
11
|
+
# this file is here to facilitate running it.
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'spade'
|
15
|
+
|
16
|
+
# Configures RubyGems properly
|
17
|
+
env = Spade::Environment.new
|
18
|
+
|
19
|
+
version = "#{Gem::Requirement.default}"
|
20
|
+
|
21
|
+
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
|
22
|
+
version = $1
|
23
|
+
ARGV.shift
|
24
|
+
end
|
25
|
+
|
26
|
+
gem '#{@spec.name}', version
|
27
|
+
|
28
|
+
path = Gem.bin_path('#{@spec.name}', '#{bin_file_name}', version)
|
29
|
+
shebang = File.open(path){|f| f.readline }
|
30
|
+
|
31
|
+
if shebang =~ /^\#\!.*ruby/
|
32
|
+
load path
|
33
|
+
else
|
34
|
+
exec path, *ARGV
|
35
|
+
end
|
36
|
+
TEXT
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/spade/package.rb
CHANGED
@@ -26,8 +26,10 @@ module Spade
|
|
26
26
|
spec.summary = summary
|
27
27
|
spec.description = description
|
28
28
|
spec.requirements = [metadata.to_json]
|
29
|
-
spec.files = directory_files +
|
29
|
+
spec.files = directory_files + ["package.json"]
|
30
30
|
spec.test_files = glob_files(test_path) if test_path
|
31
|
+
spec.bindir = bin_path
|
32
|
+
spec.executables = bin_files.map{|p| File.basename(p) } if bin_path
|
31
33
|
spec.rubyforge_project = "spade"
|
32
34
|
def spec.file_name
|
33
35
|
"#{full_name}.#{EXT}"
|
@@ -77,6 +79,10 @@ module Spade
|
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
82
|
+
def bin_path
|
83
|
+
@directories["bin"] || "bin"
|
84
|
+
end
|
85
|
+
|
80
86
|
def lib_path
|
81
87
|
@directories["lib"]
|
82
88
|
end
|
data/lib/spade/remote.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'spade/dependency_installer'
|
2
|
+
|
1
3
|
module Spade
|
2
4
|
class Remote < Repository
|
3
5
|
extend Gem::GemcutterUtilities
|
@@ -72,7 +74,7 @@ module Spade
|
|
72
74
|
end
|
73
75
|
|
74
76
|
def install(package, version, prerelease)
|
75
|
-
inst =
|
77
|
+
inst = Spade::DependencyInstaller.new(:prerelease => prerelease)
|
76
78
|
inst.install package, Gem::Requirement.new([version])
|
77
79
|
inst.installed_gems
|
78
80
|
end
|
data/lib/spade/version.rb
CHANGED
@@ -46,7 +46,6 @@ Ct.test('normalize', function(t) {
|
|
46
46
|
|
47
47
|
Ct.test('normalize package', function(t) {
|
48
48
|
var spade = t.spade;
|
49
|
-
|
50
49
|
spade.register('sproutcore', {}); // register as a package
|
51
50
|
t.equal(spade.normalize('sproutcore'), 'sproutcore/main');
|
52
51
|
t.equal(spade.normalize('foo/sproutcore'), 'foo/sproutcore');
|
@@ -54,6 +53,21 @@ Ct.test('normalize package', function(t) {
|
|
54
53
|
|
55
54
|
Ct.test('normalize relative require from main', function(t) {
|
56
55
|
// I think this is a valid test, but not certain
|
57
|
-
t.spade
|
58
|
-
|
56
|
+
var spade = t.spade, mainRequire, otherRequire;
|
57
|
+
spade.register('foo', { main: './lib/foo', directories: { lib: './lib/foo' } });
|
58
|
+
spade.register('foo/main', 'return require;');
|
59
|
+
spade.register('foo/other/main', 'return require;');
|
60
|
+
mainRequire = spade.require('foo/main');
|
61
|
+
otherRequire = spade.require('foo/other/main');
|
62
|
+
t.equal(mainRequire.normalize('./foo/adfadf'), 'foo/adfadf', 'works for real main');
|
63
|
+
t.equal(otherRequire.normalize('./foo/core'), 'foo/other/foo/core', "no difference for fake main");
|
64
|
+
});
|
65
|
+
|
66
|
+
Ct.test('normalize tilde paths with lib', function(t){
|
67
|
+
var spade = t.spade, fooRequire;
|
68
|
+
spade.register('foo', { directories: { lib: './lib' }}); // register as a package
|
69
|
+
spade.register('foo/main', 'return require;');
|
70
|
+
fooRequire = spade.require('foo');
|
71
|
+
t.equal(fooRequire.normalize('foo/~lib/main'), 'foo/main');
|
72
|
+
t.equal(fooRequire.normalize('foo/~lib/core'), 'foo/core');
|
59
73
|
});
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: spade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Charles Jolley
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-04-04 00:00:00 -07:00
|
14
14
|
default_executable: spade
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -354,8 +354,10 @@ files:
|
|
354
354
|
- lib/spade/console.rb
|
355
355
|
- lib/spade/context.rb
|
356
356
|
- lib/spade/credentials.rb
|
357
|
+
- lib/spade/dependency_installer.rb
|
357
358
|
- lib/spade/environment.rb
|
358
359
|
- lib/spade/exports.rb
|
360
|
+
- lib/spade/installer.rb
|
359
361
|
- lib/spade/loader.rb
|
360
362
|
- lib/spade/local.rb
|
361
363
|
- lib/spade/package.rb
|
@@ -430,6 +432,7 @@ files:
|
|
430
432
|
- spec/cli/uninstall_spec.rb
|
431
433
|
- spec/cli/unpack_spec.rb
|
432
434
|
- spec/cli/unyank_spec.rb
|
435
|
+
- spec/cli/update_spec.rb
|
433
436
|
- spec/cli/yank_spec.rb
|
434
437
|
- spec/credentials_spec.rb
|
435
438
|
- spec/fixtures/badrake-0.8.7.gem
|
@@ -516,6 +519,7 @@ test_files:
|
|
516
519
|
- spec/cli/uninstall_spec.rb
|
517
520
|
- spec/cli/unpack_spec.rb
|
518
521
|
- spec/cli/unyank_spec.rb
|
522
|
+
- spec/cli/update_spec.rb
|
519
523
|
- spec/cli/yank_spec.rb
|
520
524
|
- spec/credentials_spec.rb
|
521
525
|
- spec/fixtures/badrake-0.8.7.gem
|