spade-packager 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.gitmodules +6 -0
- data/bin/spadepkg +8 -0
- data/lib/libgems_ext.rb +8 -0
- data/lib/libgems_ext/config_file.rb +33 -0
- data/lib/libgems_ext/dependency_installer.rb +150 -0
- data/lib/libgems_ext/installer.rb +39 -0
- data/lib/libgems_ext/libgems.rb +39 -0
- data/lib/libgems_ext/spec_fetcher.rb +11 -0
- data/lib/spade-packager.rb +1 -0
- data/lib/spade/packager.rb +18 -0
- data/lib/spade/packager/cli.rb +9 -0
- data/lib/spade/packager/cli/base.rb +196 -0
- data/lib/spade/packager/cli/owner.rb +46 -0
- data/lib/spade/packager/cli/project_generator.rb +117 -0
- data/lib/spade/packager/credentials.rb +38 -0
- data/lib/spade/packager/local.rb +50 -0
- data/lib/spade/packager/package.rb +160 -0
- data/lib/spade/packager/remote.rb +98 -0
- data/lib/spade/packager/repository.rb +18 -0
- data/lib/spade/packager/version.rb +5 -0
- data/packages/coffee-script/.gitignore +8 -0
- data/packages/coffee-script/.npmignore +11 -0
- data/packages/coffee-script/Cakefile +229 -0
- data/packages/coffee-script/LICENSE +22 -0
- data/packages/coffee-script/README +47 -0
- data/packages/coffee-script/Rakefile +78 -0
- data/packages/coffee-script/bin/cake +7 -0
- data/packages/coffee-script/bin/coffee +7 -0
- data/packages/coffee-script/documentation/coffee/aliases.coffee +11 -0
- data/packages/coffee-script/documentation/coffee/array_comprehensions.coffee +2 -0
- data/packages/coffee-script/documentation/coffee/block_comment.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/cake_tasks.coffee +9 -0
- data/packages/coffee-script/documentation/coffee/classes.coffee +25 -0
- data/packages/coffee-script/documentation/coffee/comparisons.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/conditionals.coffee +13 -0
- data/packages/coffee-script/documentation/coffee/default_args.coffee +8 -0
- data/packages/coffee-script/documentation/coffee/do.coffee +4 -0
- data/packages/coffee-script/documentation/coffee/embedded.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/existence.coffee +10 -0
- data/packages/coffee-script/documentation/coffee/expressions.coffee +9 -0
- data/packages/coffee-script/documentation/coffee/expressions_assignment.coffee +3 -0
- data/packages/coffee-script/documentation/coffee/expressions_comprehension.coffee +3 -0
- data/packages/coffee-script/documentation/coffee/expressions_try.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/fat_arrow.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/functions.coffee +2 -0
- data/packages/coffee-script/documentation/coffee/heredocs.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/heregexes.coffee +11 -0
- data/packages/coffee-script/documentation/coffee/interpolation.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/multiple_return_values.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/object_comprehensions.coffee +4 -0
- data/packages/coffee-script/documentation/coffee/object_extraction.coffee +13 -0
- data/packages/coffee-script/documentation/coffee/objects_and_arrays.coffee +19 -0
- data/packages/coffee-script/documentation/coffee/objects_reserved.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/overview.coffee +28 -0
- data/packages/coffee-script/documentation/coffee/parallel_assignment.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/patterns_and_splats.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/prototypes.coffee +3 -0
- data/packages/coffee-script/documentation/coffee/range_comprehensions.coffee +2 -0
- data/packages/coffee-script/documentation/coffee/scope.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/slices.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/soaks.coffee +1 -0
- data/packages/coffee-script/documentation/coffee/splats.coffee +27 -0
- data/packages/coffee-script/documentation/coffee/splices.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/strings.coffee +8 -0
- data/packages/coffee-script/documentation/coffee/switch.coffee +10 -0
- data/packages/coffee-script/documentation/coffee/try.coffee +8 -0
- data/packages/coffee-script/documentation/coffee/while.coffee +10 -0
- data/packages/coffee-script/documentation/css/docs.css +374 -0
- data/packages/coffee-script/documentation/css/idle.css +64 -0
- data/packages/coffee-script/documentation/docs/browser.html +25 -0
- data/packages/coffee-script/documentation/docs/cake.html +43 -0
- data/packages/coffee-script/documentation/docs/coffee-script.html +51 -0
- data/packages/coffee-script/documentation/docs/command.html +161 -0
- data/packages/coffee-script/documentation/docs/docco.css +186 -0
- data/packages/coffee-script/documentation/docs/grammar.html +399 -0
- data/packages/coffee-script/documentation/docs/helpers.html +31 -0
- data/packages/coffee-script/documentation/docs/index.html +3 -0
- data/packages/coffee-script/documentation/docs/lexer.html +490 -0
- data/packages/coffee-script/documentation/docs/nodes.html +1338 -0
- data/packages/coffee-script/documentation/docs/optparse.html +78 -0
- data/packages/coffee-script/documentation/docs/repl.html +24 -0
- data/packages/coffee-script/documentation/docs/rewriter.html +251 -0
- data/packages/coffee-script/documentation/docs/scope.html +54 -0
- data/packages/coffee-script/documentation/docs/underscore.html +295 -0
- data/packages/coffee-script/documentation/images/background.png +0 -0
- data/packages/coffee-script/documentation/images/banding.png +0 -0
- data/packages/coffee-script/documentation/images/button_bg.png +0 -0
- data/packages/coffee-script/documentation/images/button_bg_dark.gif +0 -0
- data/packages/coffee-script/documentation/images/button_bg_green.gif +0 -0
- data/packages/coffee-script/documentation/images/favicon.ico +0 -0
- data/packages/coffee-script/documentation/images/logo.png +0 -0
- data/packages/coffee-script/documentation/images/screenshadow.png +0 -0
- data/packages/coffee-script/documentation/index.html.erb +1607 -0
- data/packages/coffee-script/documentation/js/aliases.js +17 -0
- data/packages/coffee-script/documentation/js/array_comprehensions.js +6 -0
- data/packages/coffee-script/documentation/js/block_comment.js +4 -0
- data/packages/coffee-script/documentation/js/cake_tasks.js +10 -0
- data/packages/coffee-script/documentation/js/classes.js +44 -0
- data/packages/coffee-script/documentation/js/comparisons.js +3 -0
- data/packages/coffee-script/documentation/js/conditionals.js +12 -0
- data/packages/coffee-script/documentation/js/default_args.js +7 -0
- data/packages/coffee-script/documentation/js/do.js +10 -0
- data/packages/coffee-script/documentation/js/embedded.js +4 -0
- data/packages/coffee-script/documentation/js/existence.js +6 -0
- data/packages/coffee-script/documentation/js/expressions.js +15 -0
- data/packages/coffee-script/documentation/js/expressions_assignment.js +2 -0
- data/packages/coffee-script/documentation/js/expressions_comprehension.js +9 -0
- data/packages/coffee-script/documentation/js/expressions_try.js +7 -0
- data/packages/coffee-script/documentation/js/fat_arrow.js +9 -0
- data/packages/coffee-script/documentation/js/functions.js +7 -0
- data/packages/coffee-script/documentation/js/heredocs.js +2 -0
- data/packages/coffee-script/documentation/js/heregexes.js +2 -0
- data/packages/coffee-script/documentation/js/interpolation.js +4 -0
- data/packages/coffee-script/documentation/js/multiple_return_values.js +5 -0
- data/packages/coffee-script/documentation/js/object_comprehensions.js +15 -0
- data/packages/coffee-script/documentation/js/object_extraction.js +10 -0
- data/packages/coffee-script/documentation/js/objects_and_arrays.js +17 -0
- data/packages/coffee-script/documentation/js/objects_reserved.js +4 -0
- data/packages/coffee-script/documentation/js/overview.js +35 -0
- data/packages/coffee-script/documentation/js/parallel_assignment.js +4 -0
- data/packages/coffee-script/documentation/js/patterns_and_splats.js +4 -0
- data/packages/coffee-script/documentation/js/prototypes.js +3 -0
- data/packages/coffee-script/documentation/js/range_comprehensions.js +9 -0
- data/packages/coffee-script/documentation/js/scope.js +8 -0
- data/packages/coffee-script/documentation/js/slices.js +4 -0
- data/packages/coffee-script/documentation/js/soaks.js +2 -0
- data/packages/coffee-script/documentation/js/splats.js +15 -0
- data/packages/coffee-script/documentation/js/splices.js +3 -0
- data/packages/coffee-script/documentation/js/strings.js +2 -0
- data/packages/coffee-script/documentation/js/switch.js +23 -0
- data/packages/coffee-script/documentation/js/try.js +8 -0
- data/packages/coffee-script/documentation/js/while.js +18 -0
- data/packages/coffee-script/documentation/vendor/jquery-1.4.2.js +6240 -0
- data/packages/coffee-script/examples/beautiful_code/binary_search.coffee +16 -0
- data/packages/coffee-script/examples/beautiful_code/quicksort_runtime.coffee +13 -0
- data/packages/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee +34 -0
- data/packages/coffee-script/examples/blocks.coffee +54 -0
- data/packages/coffee-script/examples/code.coffee +167 -0
- data/packages/coffee-script/examples/computer_science/README +4 -0
- data/packages/coffee-script/examples/computer_science/binary_search.coffee +25 -0
- data/packages/coffee-script/examples/computer_science/bubble_sort.coffee +11 -0
- data/packages/coffee-script/examples/computer_science/linked_list.coffee +108 -0
- data/packages/coffee-script/examples/computer_science/luhn_algorithm.coffee +36 -0
- data/packages/coffee-script/examples/computer_science/merge_sort.coffee +19 -0
- data/packages/coffee-script/examples/computer_science/selection_sort.coffee +23 -0
- data/packages/coffee-script/examples/poignant.coffee +181 -0
- data/packages/coffee-script/examples/potion.coffee +206 -0
- data/packages/coffee-script/examples/underscore.coffee +682 -0
- data/packages/coffee-script/examples/web_server.coffee +12 -0
- data/packages/coffee-script/extras/EXTRAS +7 -0
- data/packages/coffee-script/extras/coffee-script.js +8 -0
- data/packages/coffee-script/extras/jsl.conf +44 -0
- data/packages/coffee-script/index.html +2515 -0
- data/packages/coffee-script/lib/browser.js +52 -0
- data/packages/coffee-script/lib/cake.js +76 -0
- data/packages/coffee-script/lib/coffee-script.js +82 -0
- data/packages/coffee-script/lib/command.js +263 -0
- data/packages/coffee-script/lib/grammar.js +581 -0
- data/packages/coffee-script/lib/helpers.js +66 -0
- data/packages/coffee-script/lib/index.js +8 -0
- data/packages/coffee-script/lib/lexer.js +633 -0
- data/packages/coffee-script/lib/nodes.js +2165 -0
- data/packages/coffee-script/lib/optparse.js +111 -0
- data/packages/coffee-script/lib/parser.js +649 -0
- data/packages/coffee-script/lib/repl.js +42 -0
- data/packages/coffee-script/lib/rewriter.js +353 -0
- data/packages/coffee-script/lib/scope.js +120 -0
- data/packages/coffee-script/lib/spade-format.js +45 -0
- data/packages/coffee-script/package.json +26 -0
- data/packages/coffee-script/src/browser.coffee +43 -0
- data/packages/coffee-script/src/cake.coffee +69 -0
- data/packages/coffee-script/src/coffee-script.coffee +92 -0
- data/packages/coffee-script/src/command.coffee +214 -0
- data/packages/coffee-script/src/grammar.coffee +590 -0
- data/packages/coffee-script/src/helpers.coffee +56 -0
- data/packages/coffee-script/src/index.coffee +2 -0
- data/packages/coffee-script/src/lexer.coffee +653 -0
- data/packages/coffee-script/src/nodes.coffee +1754 -0
- data/packages/coffee-script/src/optparse.coffee +99 -0
- data/packages/coffee-script/src/repl.coffee +42 -0
- data/packages/coffee-script/src/rewriter.coffee +326 -0
- data/packages/coffee-script/src/scope.coffee +94 -0
- data/packages/coffee-script/test/arguments.coffee +127 -0
- data/packages/coffee-script/test/assignment.coffee +98 -0
- data/packages/coffee-script/test/break.coffee +18 -0
- data/packages/coffee-script/test/comments.coffee +201 -0
- data/packages/coffee-script/test/conditionals.coffee +181 -0
- data/packages/coffee-script/test/exception_handling.coffee +90 -0
- data/packages/coffee-script/test/helpers.coffee +96 -0
- data/packages/coffee-script/test/importing.coffee +18 -0
- data/packages/coffee-script/test/operators.coffee +225 -0
- data/packages/coffee-script/test/ranges_slices_and_splices.coffee +186 -0
- data/packages/coffee-script/test/regular_expressions.coffee +56 -0
- data/packages/coffee-script/test/test.html +123 -0
- data/packages/coffee-script/test/test_chaining.coffee +77 -0
- data/packages/coffee-script/test/test_classes.coffee +372 -0
- data/packages/coffee-script/test/test_compilation.coffee +26 -0
- data/packages/coffee-script/test/test_comprehensions.coffee +318 -0
- data/packages/coffee-script/test/test_existence.coffee +165 -0
- data/packages/coffee-script/test/test_functions.coffee +379 -0
- data/packages/coffee-script/test/test_heredocs.coffee +111 -0
- data/packages/coffee-script/test/test_literals.coffee +270 -0
- data/packages/coffee-script/test/test_option_parser.coffee +27 -0
- data/packages/coffee-script/test/test_pattern_matching.coffee +162 -0
- data/packages/coffee-script/test/test_returns.coffee +63 -0
- data/packages/coffee-script/test/test_splats.coffee +102 -0
- data/packages/coffee-script/test/test_strings.coffee +118 -0
- data/packages/coffee-script/test/test_switch.coffee +103 -0
- data/packages/coffee-script/test/test_while.coffee +71 -0
- data/packages/ivory/LICENSE.txt +1 -0
- data/packages/ivory/README.md +19 -0
- data/packages/ivory/lib/buffer.js +111 -0
- data/packages/ivory/lib/events.js +137 -0
- data/packages/ivory/lib/fs.js +266 -0
- data/packages/ivory/lib/main.js +13 -0
- data/packages/ivory/lib/path.js +158 -0
- data/packages/ivory/lib/ruby/buffer.rb +145 -0
- data/packages/ivory/lib/ruby/constants.rb +585 -0
- data/packages/ivory/lib/ruby/events.rb +32 -0
- data/packages/ivory/lib/ruby/fs.rb +245 -0
- data/packages/ivory/lib/ruby/process.rb +28 -0
- data/packages/ivory/lib/stream.js +115 -0
- data/packages/ivory/lib/util.js +414 -0
- data/packages/ivory/package.json +11 -0
- data/packages/ivory/spade-boot.js +78 -0
- data/packages/jquery/main.js +7179 -0
- data/packages/jquery/package.json +10 -0
- data/packages/json/lib/main.js +14 -0
- data/packages/json/package.json +8 -0
- data/packages/lproj/README.md +77 -0
- data/packages/lproj/examples/demo-app/en.lproj/localized.strings +2 -0
- data/packages/lproj/examples/demo-app/fr.lproj/localized.strings +3 -0
- data/packages/lproj/examples/demo-app/index.html +8 -0
- data/packages/lproj/examples/demo-app/lib/main.js +7 -0
- data/packages/lproj/examples/demo-app/package.json +9 -0
- data/packages/lproj/lib/main.js +78 -0
- data/packages/lproj/lib/strings-format.js +6 -0
- data/packages/lproj/package.json +9 -0
- data/packages/optparse/README.md +161 -0
- data/packages/optparse/TODO +1 -0
- data/packages/optparse/examples/browser-test.html +75 -0
- data/packages/optparse/examples/nodejs-test.js +90 -0
- data/packages/optparse/lib/optparse.js +309 -0
- data/packages/optparse/package.json +13 -0
- data/packages/optparse/seed.yml +5 -0
- data/packages/text/lib/main.js +8 -0
- data/packages/text/package.json +9 -0
- data/packages/web-file/README.md +7 -0
- data/packages/web-file/lib/errors.js +32 -0
- data/packages/web-file/lib/file-reader.js +10 -0
- data/packages/web-file/lib/file-system.js +234 -0
- data/packages/web-file/lib/file-writer.js +10 -0
- data/packages/web-file/lib/file.js +9 -0
- data/packages/web-file/lib/main.js +34 -0
- data/packages/web-file/lib/platform.js +25 -0
- data/packages/web-file/lib/ruby/file.rb +252 -0
- data/packages/web-file/lib/ruby/file_reader.rb +69 -0
- data/packages/web-file/lib/ruby/file_system.rb +134 -0
- data/packages/web-file/lib/ruby/file_writer.rb +78 -0
- data/packages/web-file/package.json +12 -0
- data/packages/web-typed-array/README.md +7 -0
- data/packages/web-typed-array/lib/array-buffer-view.js +9 -0
- data/packages/web-typed-array/lib/array-buffer.js +7 -0
- data/packages/web-typed-array/lib/main.js +33 -0
- data/packages/web-typed-array/lib/platform.js +20 -0
- data/packages/web-typed-array/lib/ruby/array_buffer.rb +31 -0
- data/packages/web-typed-array/lib/ruby/array_buffer_view.rb +130 -0
- data/packages/web-typed-array/lib/ruby/typed_array.rb +133 -0
- data/packages/web-typed-array/lib/typed-array.js +26 -0
- data/packages/web-typed-array/package.json +9 -0
- data/spade-packager.gemspec +39 -0
- data/spec/cli/build_spec.rb +57 -0
- data/spec/cli/install_spec.rb +119 -0
- data/spec/cli/installed_spec.rb +55 -0
- data/spec/cli/list_spec.rb +74 -0
- data/spec/cli/login_spec.rb +75 -0
- data/spec/cli/new_spec.rb +5 -0
- data/spec/cli/owner_spec.rb +114 -0
- data/spec/cli/push_spec.rb +73 -0
- data/spec/cli/uninstall_spec.rb +58 -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.3.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/resources/runner.css +0 -0
- data/spec/fixtures/core-test/tests/test.js +1 -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/package.json +30 -0
- data/spec/fixtures/rake-0.8.6.spd +0 -0
- data/spec/fixtures/rake-0.8.7.spd +0 -0
- data/spec/gauntlet_spec.rb +27 -0
- data/spec/package_spec.rb +267 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/support/cli.rb +103 -0
- data/spec/support/fake.rb +48 -0
- data/spec/support/fake_gem_server.rb +67 -0
- data/spec/support/fake_gemcutter.rb +50 -0
- data/spec/support/matchers.rb +32 -0
- data/spec/support/path.rb +61 -0
- data/templates/project/LICENSE +19 -0
- data/templates/project/README.md +21 -0
- data/templates/project/lib/main.js +9 -0
- data/templates/project/project.json +31 -0
- data/templates/project/tests/main-test.js +8 -0
- metadata +484 -0
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/bin/spadepkg
ADDED
data/lib/libgems_ext.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'libgems/config_file'
|
2
|
+
|
3
|
+
module LibGems
|
4
|
+
class ConfigFile
|
5
|
+
|
6
|
+
# Duplicate, with slight work-arounds, but needed for SYSTEM_WIDE_CONFIG_FILE
|
7
|
+
system_config_path =
|
8
|
+
if defined?(Win32API) # Already required in original version
|
9
|
+
CSIDL_COMMON_APPDATA = 0x0023
|
10
|
+
path = 0.chr * 260
|
11
|
+
if RUBY_VERSION > '1.9' then
|
12
|
+
SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'PLPLP',
|
13
|
+
'L', :stdcall
|
14
|
+
SHGetFolderPath.call nil, CSIDL_COMMON_APPDATA, nil, 1, path
|
15
|
+
else
|
16
|
+
SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'LLLLP',
|
17
|
+
'L'
|
18
|
+
SHGetFolderPath.call 0, CSIDL_COMMON_APPDATA, 0, 1, path
|
19
|
+
end
|
20
|
+
|
21
|
+
path.strip
|
22
|
+
else
|
23
|
+
'/etc'
|
24
|
+
end
|
25
|
+
|
26
|
+
remove_const(:SYSTEM_WIDE_CONFIG_FILE)
|
27
|
+
SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'spaderc'
|
28
|
+
|
29
|
+
def credentials_path
|
30
|
+
File.join(LibGems.user_dir, "credentials")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'libgems/dependency_installer'
|
2
|
+
|
3
|
+
module LibGems
|
4
|
+
class DependencyInstaller
|
5
|
+
|
6
|
+
# Had to overwrite this all just to change the match from /gem$/ to /spd$/
|
7
|
+
# TODO: Consider whether extension should be settable in LibGems
|
8
|
+
def find_spec_by_name_and_version(gem_name,
|
9
|
+
version = LibGems::Requirement.default,
|
10
|
+
prerelease = false)
|
11
|
+
spec_and_source = nil
|
12
|
+
|
13
|
+
glob = if File::ALT_SEPARATOR then
|
14
|
+
gem_name.gsub File::ALT_SEPARATOR, File::SEPARATOR
|
15
|
+
else
|
16
|
+
gem_name
|
17
|
+
end
|
18
|
+
|
19
|
+
local_gems = Dir["#{glob}*"].sort.reverse
|
20
|
+
|
21
|
+
unless local_gems.empty? then
|
22
|
+
local_gems.each do |gem_file|
|
23
|
+
next unless gem_file =~ /spd$/
|
24
|
+
begin
|
25
|
+
spec = LibGems::Format.from_file_by_path(gem_file).spec
|
26
|
+
spec_and_source = [spec, gem_file]
|
27
|
+
break
|
28
|
+
rescue SystemCallError, LibGems::Package::FormatError
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if spec_and_source.nil? then
|
34
|
+
dep = LibGems::Dependency.new gem_name, version
|
35
|
+
dep.prerelease = true if prerelease
|
36
|
+
spec_and_sources = find_gems_with_sources(dep).reverse
|
37
|
+
|
38
|
+
spec_and_source = spec_and_sources.find { |spec, source|
|
39
|
+
LibGems::Platform.match spec.platform
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
if spec_and_source.nil? then
|
44
|
+
raise LibGems::GemNotFoundException.new(
|
45
|
+
"Could not find a valid spd '#{gem_name}' (#{version}) locally or in a repository",
|
46
|
+
gem_name, version, @errors)
|
47
|
+
end
|
48
|
+
|
49
|
+
@specs_and_sources = [spec_and_source]
|
50
|
+
end
|
51
|
+
|
52
|
+
# Overwrite this to use our custom installer
|
53
|
+
def install dep_or_name, version = LibGems::Requirement.default
|
54
|
+
LibGems.with_rubygems_compat do
|
55
|
+
if String === dep_or_name then
|
56
|
+
find_spec_by_name_and_version dep_or_name, version, @prerelease
|
57
|
+
else
|
58
|
+
dep_or_name.prerelease = @prerelease
|
59
|
+
@specs_and_sources = [find_gems_with_sources(dep_or_name).last]
|
60
|
+
end
|
61
|
+
|
62
|
+
@installed_gems = []
|
63
|
+
|
64
|
+
gather_dependencies
|
65
|
+
|
66
|
+
@gems_to_install.each do |spec|
|
67
|
+
last = spec == @gems_to_install.last
|
68
|
+
# HACK is this test for full_name acceptable?
|
69
|
+
next if @source_index.any? { |n,_| n == spec.full_name } and not last
|
70
|
+
|
71
|
+
# TODO: make this sorta_verbose so other users can benefit from it
|
72
|
+
say "Installing spd #{spec.full_name}" if LibGems.configuration.really_verbose
|
73
|
+
|
74
|
+
_, source_uri = @specs_and_sources.assoc spec
|
75
|
+
begin
|
76
|
+
local_gem_path = LibGems::RemoteFetcher.fetcher.download spec, source_uri,
|
77
|
+
@cache_dir
|
78
|
+
rescue LibGems::RemoteFetcher::FetchError
|
79
|
+
next if @force
|
80
|
+
raise
|
81
|
+
end
|
82
|
+
|
83
|
+
inst = LibGems::Installer.new local_gem_path,
|
84
|
+
:bin_dir => @bin_dir,
|
85
|
+
:development => @development,
|
86
|
+
:env_shebang => @env_shebang,
|
87
|
+
:force => @force,
|
88
|
+
:format_executable => @format_executable,
|
89
|
+
:ignore_dependencies => @ignore_dependencies,
|
90
|
+
:install_dir => @install_dir,
|
91
|
+
:security_policy => @security_policy,
|
92
|
+
:source_index => @source_index,
|
93
|
+
:user_install => @user_install,
|
94
|
+
:wrappers => @wrappers
|
95
|
+
|
96
|
+
spec = inst.install
|
97
|
+
|
98
|
+
@installed_gems << spec
|
99
|
+
end
|
100
|
+
|
101
|
+
@installed_gems
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def find_gems_with_sources(dep)
|
106
|
+
# Reset the errors
|
107
|
+
@errors = nil
|
108
|
+
gems_and_sources = []
|
109
|
+
|
110
|
+
if @domain == :both or @domain == :local then
|
111
|
+
Dir[File.join(Dir.pwd, "#{dep.name}-[0-9]*.spd")].each do |gem_file|
|
112
|
+
spec = LibGems::Format.from_file_by_path(gem_file).spec
|
113
|
+
gems_and_sources << [spec, gem_file] if spec.name == dep.name
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if @domain == :both or @domain == :remote then
|
118
|
+
begin
|
119
|
+
requirements = dep.requirement.requirements.map do |req, ver|
|
120
|
+
req
|
121
|
+
end
|
122
|
+
|
123
|
+
all = !dep.prerelease? &&
|
124
|
+
# we only need latest if there's one requirement and it is
|
125
|
+
# guaranteed to match the newest specs
|
126
|
+
(requirements.length > 1 or
|
127
|
+
(requirements.first != ">=" and requirements.first != ">"))
|
128
|
+
|
129
|
+
found, @errors = LibGems::SpecFetcher.fetcher.fetch_with_errors dep, all, true, dep.prerelease?
|
130
|
+
|
131
|
+
gems_and_sources.push(*found)
|
132
|
+
|
133
|
+
rescue LibGems::RemoteFetcher::FetchError => e
|
134
|
+
if LibGems.configuration.really_verbose then
|
135
|
+
say "Error fetching remote data:\t\t#{e.message}"
|
136
|
+
say "Falling back to local-only install"
|
137
|
+
end
|
138
|
+
@domain = :local
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
gems_and_sources.sort_by do |gem, source|
|
143
|
+
[gem, source =~ /^http:\/\// ? 0 : 1] # local gems win
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'libgems/installer'
|
2
|
+
|
3
|
+
module LibGems
|
4
|
+
class Installer
|
5
|
+
|
6
|
+
def app_script_text(bin_file_name)
|
7
|
+
<<-TEXT
|
8
|
+
#{shebang bin_file_name}
|
9
|
+
#
|
10
|
+
# This file was generated by Spade.
|
11
|
+
#
|
12
|
+
# The application '#{@spec.name}' is installed as part of an spd, and
|
13
|
+
# this file is here to facilitate running it.
|
14
|
+
#
|
15
|
+
|
16
|
+
version = "#{LibGems::Requirement.default}"
|
17
|
+
|
18
|
+
if ARGV.first =~ /^_(.*)_$/ and LibGems::Version.correct? $1 then
|
19
|
+
version = $1
|
20
|
+
ARGV.shift
|
21
|
+
end
|
22
|
+
|
23
|
+
gem '#{@spec.name}', version
|
24
|
+
|
25
|
+
path = LibGems.bin_path('#{@spec.name}', '#{bin_file_name}', version)
|
26
|
+
shebang = File.open(path){|f| f.readline }
|
27
|
+
|
28
|
+
if shebang =~ /^\#\!.*ruby/
|
29
|
+
load path
|
30
|
+
else
|
31
|
+
exec path, *ARGV
|
32
|
+
end
|
33
|
+
TEXT
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
@@ -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, Spade::SPADE_DIR
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.user_dir
|
17
|
+
File.join LibGems.user_home, Spade::SPADE_DIR
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.config_file
|
21
|
+
File.join LibGems.user_home, '.spaderc'
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.path
|
25
|
+
@gem_path ||= nil
|
26
|
+
|
27
|
+
unless @gem_path then
|
28
|
+
paths = [ENV['SPADE_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['SPADE_HOME'] || LibGems.configuration.home || default_dir) unless @gem_home
|
37
|
+
@gem_home
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spade/packager'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spade/core'
|
2
|
+
require 'libgems'
|
3
|
+
require 'libgems_ext'
|
4
|
+
|
5
|
+
module Spade
|
6
|
+
module Packager
|
7
|
+
TEMPLATES_DIR = File.expand_path("../../../templates", __FILE__)
|
8
|
+
|
9
|
+
autoload :CLI, 'spade/packager/cli'
|
10
|
+
autoload :Credentials, 'spade/packager/credentials'
|
11
|
+
autoload :Local, 'spade/packager/local'
|
12
|
+
autoload :Package, 'spade/packager/package'
|
13
|
+
autoload :Remote, 'spade/packager/remote'
|
14
|
+
autoload :Repository, 'spade/packager/repository'
|
15
|
+
autoload :Version, 'spade/packager/version'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'highline'
|
3
|
+
|
4
|
+
module Spade
|
5
|
+
module Packager
|
6
|
+
module CLI
|
7
|
+
LOGIN_MESSAGE = "Please login first with `spade login`."
|
8
|
+
|
9
|
+
class Base < Thor
|
10
|
+
|
11
|
+
class_option :verbose, :type => :boolean, :default => false,
|
12
|
+
:aliases => ['-V'],
|
13
|
+
:desc => 'Show additional debug information while running'
|
14
|
+
|
15
|
+
desc "owner", "Manage users for a package"
|
16
|
+
subcommand "owner", Spade::Packager::CLI::Owner
|
17
|
+
|
18
|
+
desc "install [PACKAGE]", "Installs one or many spade packages"
|
19
|
+
method_option :version, :type => :string, :default => ">= 0", :aliases => ['-v'], :desc => 'Specify a version to install'
|
20
|
+
method_option :prerelease, :type => :boolean, :default => false, :aliases => ['--pre'], :desc => 'Install a prerelease version'
|
21
|
+
def install(*packages)
|
22
|
+
report_arity_error("install") and return if packages.size.zero?
|
23
|
+
|
24
|
+
begin
|
25
|
+
packages.each do |package|
|
26
|
+
installed = Spade::Packager::Remote.new.install(package, options[:version], options[:prerelease])
|
27
|
+
installed.each do |spec|
|
28
|
+
say "Successfully installed #{spec.full_name}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
rescue LibGems::InstallError => e
|
32
|
+
abort "Install error: #{e}"
|
33
|
+
rescue LibGems::GemNotFoundException => e
|
34
|
+
abort "Can't find package #{e.name} #{e.version} available for install"
|
35
|
+
rescue Errno::EACCES, LibGems::FilePermissionError => e
|
36
|
+
abort e.message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "installed [PACKAGE]", "Shows what spade packages are installed"
|
41
|
+
def installed(*packages)
|
42
|
+
local = Spade::Packager::Local.new
|
43
|
+
index = local.installed(packages)
|
44
|
+
print_specs(packages, index)
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "uninstall [PACKAGE]", "Uninstalls one or many packages"
|
48
|
+
def uninstall(*packages)
|
49
|
+
local = Spade::Packager::Local.new
|
50
|
+
if packages.size > 0
|
51
|
+
packages.each do |package|
|
52
|
+
if !local.uninstall(package)
|
53
|
+
abort %{No packages installed named "#{package}"}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
report_arity_error('uninstall')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
desc "login", "Log in with your Spade credentials"
|
62
|
+
def login
|
63
|
+
highline = HighLine.new
|
64
|
+
say "Enter your Spade credentials."
|
65
|
+
|
66
|
+
begin
|
67
|
+
email = highline.ask "\nEmail:" do |q|
|
68
|
+
next unless STDIN.tty?
|
69
|
+
q.readline = true
|
70
|
+
end
|
71
|
+
|
72
|
+
password = highline.ask "\nPassword:" do |q|
|
73
|
+
next unless STDIN.tty?
|
74
|
+
q.echo = "*"
|
75
|
+
end
|
76
|
+
rescue Interrupt => ex
|
77
|
+
abort "Cancelled login."
|
78
|
+
end
|
79
|
+
|
80
|
+
say "\nLogging in as #{email}..."
|
81
|
+
|
82
|
+
if Spade::Packager::Remote.new.login(email, password)
|
83
|
+
say "Logged in!"
|
84
|
+
else
|
85
|
+
say "Incorrect email or password."
|
86
|
+
login
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
desc "push", "Distribute your spade package"
|
91
|
+
def push(package)
|
92
|
+
remote = Spade::Packager::Remote.new
|
93
|
+
if remote.logged_in?
|
94
|
+
say remote.push(package)
|
95
|
+
else
|
96
|
+
say LOGIN_MESSAGE
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
desc "yank", "Remove a specific package version release from SproutCutter"
|
101
|
+
method_option :version, :type => :string, :default => nil, :aliases => ['-v'], :desc => 'Specify a version to yank'
|
102
|
+
method_option :undo, :type => :boolean, :default => false, :desc => 'Unyank package'
|
103
|
+
def yank(package)
|
104
|
+
if options[:version]
|
105
|
+
remote = Spade::Packager::Remote.new
|
106
|
+
if remote.logged_in?
|
107
|
+
if options[:undo]
|
108
|
+
say remote.unyank(package, options[:version])
|
109
|
+
else
|
110
|
+
say remote.yank(package, options[:version])
|
111
|
+
end
|
112
|
+
else
|
113
|
+
say LOGIN_MESSAGE
|
114
|
+
end
|
115
|
+
else
|
116
|
+
say "Version required"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
desc "list", "View available packages for download"
|
121
|
+
method_option :all, :type => :boolean, :default => false, :aliases => ['-a'], :desc => 'List all versions available'
|
122
|
+
method_option :prerelease, :type => :boolean, :default => false, :aliases => ['--pre'], :desc => 'List prerelease versions available'
|
123
|
+
def list(*packages)
|
124
|
+
remote = Spade::Packager::Remote.new
|
125
|
+
index = remote.list_packages(packages, options[:all], options[:prerelease])
|
126
|
+
print_specs(packages, index)
|
127
|
+
end
|
128
|
+
|
129
|
+
desc "new [NAME]", "Generate a new project skeleton"
|
130
|
+
def new(name)
|
131
|
+
ProjectGenerator.new(self,
|
132
|
+
name, File.expand_path(name)).run
|
133
|
+
end
|
134
|
+
|
135
|
+
desc "build", "Build a spade package from a package.json"
|
136
|
+
def build
|
137
|
+
local = Spade::Packager::Local.new
|
138
|
+
if local.logged_in?
|
139
|
+
package = local.pack("package.json")
|
140
|
+
if package.errors.empty?
|
141
|
+
puts "Successfully built package: #{package.to_ext}"
|
142
|
+
else
|
143
|
+
failure_message = "Spade encountered the following problems building your package:"
|
144
|
+
package.errors.each do |error|
|
145
|
+
failure_message << "\n* #{error}"
|
146
|
+
end
|
147
|
+
abort failure_message
|
148
|
+
end
|
149
|
+
else
|
150
|
+
abort LOGIN_MESSAGE
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
desc "unpack [PACKAGE]", "Extract files from a spade package"
|
155
|
+
method_option :target, :type => :string, :default => ".", :aliases => ['-t'], :desc => 'Unpack to given directory'
|
156
|
+
def unpack(*paths)
|
157
|
+
local = Spade::Packager::Local.new
|
158
|
+
|
159
|
+
paths.each do |path|
|
160
|
+
begin
|
161
|
+
package = local.unpack(path, options[:target])
|
162
|
+
unpack_path = File.expand_path(File.join(Dir.pwd, options[:target], package.to_full_name))
|
163
|
+
puts "Unpacked spade into: #{unpack_path}"
|
164
|
+
rescue Errno::EACCES, LibGems::FilePermissionError => ex
|
165
|
+
abort "There was a problem unpacking #{path}:\n#{ex.message}"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def report_arity_error(name)
|
173
|
+
self.class.handle_argument_error(self.class.tasks[name], nil)
|
174
|
+
end
|
175
|
+
|
176
|
+
def print_specs(packages, index)
|
177
|
+
spades = {}
|
178
|
+
|
179
|
+
index.each do |(name, version, platform)|
|
180
|
+
spades[name] ||= []
|
181
|
+
spades[name] << version
|
182
|
+
end
|
183
|
+
|
184
|
+
if spades.size.zero?
|
185
|
+
abort %{No packages found matching "#{packages.join('", "')}".}
|
186
|
+
else
|
187
|
+
spades.each do |name, versions|
|
188
|
+
puts "#{name} (#{versions.sort.reverse.join(", ")})"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|