kosmos 0.0.1 → 0.0.2.pre.test2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +109 -8
  4. data/bin/kosmos +6 -79
  5. data/kosmos.gemspec +4 -1
  6. data/lib/kosmos.rb +18 -4
  7. data/lib/kosmos/download_url.rb +4 -0
  8. data/lib/kosmos/git_adapter.rb +5 -3
  9. data/lib/kosmos/package.rb +41 -57
  10. data/lib/kosmos/package_attrs.rb +79 -0
  11. data/lib/kosmos/package_downloads.rb +80 -0
  12. data/lib/kosmos/packages/achievements.rb +8 -0
  13. data/lib/kosmos/packages/active_texture_management.rb +1 -1
  14. data/lib/kosmos/packages/advanced_animator.rb +9 -0
  15. data/lib/kosmos/packages/advanced_jet_engine.rb +9 -0
  16. data/lib/kosmos/packages/aerojet_kerbodyne.rb +9 -0
  17. data/lib/kosmos/packages/aies_aerospace.rb +9 -0
  18. data/lib/kosmos/packages/ambient_light_adjustment.rb +9 -0
  19. data/lib/kosmos/packages/amok_dynamics.rb +9 -0
  20. data/lib/kosmos/packages/antenna_range.rb +10 -0
  21. data/lib/kosmos/packages/asmis_eclss_mod.rb +9 -0
  22. data/lib/kosmos/packages/astronomers_visual_pack.rb +5 -0
  23. data/lib/kosmos/packages/atmospheric_sound_enhancement.rb +9 -0
  24. data/lib/kosmos/packages/auto_asparagus.rb +9 -0
  25. data/lib/kosmos/packages/aviation_lights.rb +9 -0
  26. data/lib/kosmos/packages/b9_aerospace_pack.rb +11 -0
  27. data/lib/kosmos/packages/b9_cockpit_extended.rb +9 -0
  28. data/lib/kosmos/packages/b9_iva_extension.rb +9 -0
  29. data/lib/kosmos/packages/baha_extraplanetary_parts.rb +9 -0
  30. data/lib/kosmos/packages/better_rove_mates.rb +9 -0
  31. data/lib/kosmos/packages/better_than_starting_manned.rb +9 -0
  32. data/lib/kosmos/packages/bob_catind_soviet_american_packs.rb +10 -0
  33. data/lib/kosmos/packages/bolt_on_mission_probe.rb +9 -0
  34. data/lib/kosmos/packages/cargo_transfer_bagsand_tanks.rb +9 -0
  35. data/lib/kosmos/packages/celestial_body_science_multiplier_editor.rb +9 -0
  36. data/lib/kosmos/packages/celss_greenhouse.rb +9 -0
  37. data/lib/kosmos/packages/chatterer.rb +9 -0
  38. data/lib/kosmos/packages/coffee_industries_modular_airliner.rb +9 -0
  39. data/lib/kosmos/packages/conics_configurator.rb +9 -0
  40. data/lib/kosmos/packages/connected_living_space_api.rb +9 -0
  41. data/lib/kosmos/packages/constellation_essentials.rb +9 -0
  42. data/lib/kosmos/packages/cross_feed_enabler.rb +9 -0
  43. data/lib/kosmos/packages/custom_asteroids.rb +9 -0
  44. data/lib/kosmos/packages/dang_it.rb +9 -0
  45. data/lib/kosmos/packages/dark_multi_player.rb +10 -0
  46. data/lib/kosmos/packages/davon_supply.rb +9 -0
  47. data/lib/kosmos/packages/davon_throttle_controlsystems.rb +9 -0
  48. data/lib/kosmos/packages/dmagic_orbital_science.rb +9 -0
  49. data/lib/kosmos/packages/down_under_aerospace.rb +9 -0
  50. data/lib/kosmos/packages/editor_extensions.rb +9 -0
  51. data/lib/kosmos/packages/editor_part_highlighter.rb +9 -0
  52. data/lib/kosmos/packages/engine_ignitor.rb +9 -0
  53. data/lib/kosmos/packages/fasa.rb +18 -0
  54. data/lib/kosmos/packages/flight_managerfor_reusable_stages.rb +9 -0
  55. data/lib/kosmos/packages/fus_tek_station_parts.rb +9 -0
  56. data/lib/kosmos/packages/fusebox.rb +9 -0
  57. data/lib/kosmos/packages/gimbal_auto_trim.rb +9 -0
  58. data/lib/kosmos/packages/ginger_corp_station_hubs.rb +9 -0
  59. data/lib/kosmos/packages/glow_strips.rb +9 -0
  60. data/lib/kosmos/packages/habitat_pack.rb +9 -0
  61. data/lib/kosmos/packages/hangar_extender.rb +9 -0
  62. data/lib/kosmos/packages/home_grown_rockets.rb +10 -0
  63. data/lib/kosmos/packages/hooligan_labs.rb +26 -0
  64. data/lib/kosmos/packages/hullcam_vds.rb +8 -0
  65. data/lib/kosmos/packages/kerbal_attachment_system.rb +1 -1
  66. data/lib/kosmos/packages/kerbal_engineer_redux.rb +11 -0
  67. data/lib/kosmos/packages/launch_countdown.rb +9 -0
  68. data/lib/kosmos/packages/remote_tech.rb +1 -11
  69. data/lib/kosmos/packages/void.rb +9 -0
  70. data/lib/kosmos/user_interface.rb +120 -0
  71. data/lib/kosmos/util.rb +5 -1
  72. data/lib/kosmos/version.rb +1 -1
  73. data/lib/kosmos/versioner.rb +3 -3
  74. data/lib/kosmos/web/app.rb +36 -0
  75. data/lib/kosmos/web/public/css/main.css +69 -0
  76. data/lib/kosmos/web/public/css/normalize.css +527 -0
  77. data/lib/kosmos/web/public/index.html +107 -0
  78. data/lib/kosmos/web/public/js/main.js +125 -0
  79. data/lib/kosmos/web/public/js/plugins.js +24 -0
  80. data/lib/kosmos/web/public/js/vendor/jquery-1.10.2.min.js +6 -0
  81. data/lib/kosmos/web/public/js/vendor/modernizr-2.6.2.min.js +4 -0
  82. data/lib/kosmos/web/public/js/vendor/underscore.js +5 -0
  83. data/package_generator.rb +197 -0
  84. data/spec/package_spec.rb +32 -1
  85. data/spec/spec_helper.rb +6 -0
  86. data/spec/versioner_spec.rb +2 -21
  87. metadata +113 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad005bee0010cb3e081b6851874c9f568ad09149
4
- data.tar.gz: 447b7bcda49ea3362b8343793da95b0ccbb084e0
3
+ metadata.gz: 8000615d26f3885d770b8ca1dfd6da6ba94f5a25
4
+ data.tar.gz: dfb4bccece00fc1ead2a60c80b56d46b5c365474
5
5
  SHA512:
6
- metadata.gz: 51858f7b3d5d0eb5da764d05fd72ec4d7eab02c82e1061cbfce0ce5fd84faa1c2c874a549822bed30ab27d8a032f24b7cbdd2cecd781eb5b9081a5be18fe2be1
7
- data.tar.gz: 1885d290b5215ab24537cf010c14ed9898d14698882553dc548a8bff886fc17accf6433aef6888f17e3da24f3307e30f190585a49da01c958daaa080ed0a41a8
6
+ metadata.gz: 9d47f76253588612ce48c3bc45a0d42c14f44ac21615c0dadf4b2716d665a8f8b34441dc3e40e0a317fb00a35e5b0b78936ac9d5edbea1ce0f20e0d3fe94f4ed
7
+ data.tar.gz: 082ac15a0c4dcb4884975b8013934a70b9c016dce178f31f05eac7216cadda8e0fee874221fa39e228551be61108c06d29c4dc53c534de0f5167f864bb23a45a
data/Gemfile CHANGED
@@ -8,6 +8,9 @@ group :development do
8
8
  gem 'rspec', '~> 2.14'
9
9
  gem 'webmock'
10
10
  gem 'pry'
11
+ gem 'octokit'
12
+ gem 'colorize'
13
+ gem 'activesupport'
11
14
  end
12
15
 
13
16
  group :test do
data/README.md CHANGED
@@ -1,21 +1,122 @@
1
1
  # Kosmos
2
2
 
3
- TODO: Write a gem description
3
+ A simple package manager for Kerbal Space Program. Install any mod by simply
4
+ saying `kosmos install name-of-mod`. For example, install Mechjeb by issuing the
5
+ command:
6
+
7
+ ```
8
+ kosmos install mechjeb
9
+ ```
10
+
11
+ *Note:* Kosmos is still in active development, and is not meant for serious use
12
+ unless you're brave or stupid.
4
13
 
5
14
  ## Installation
6
15
 
7
- Add this line to your application's Gemfile:
16
+ *Note:* Kosmos is indeed not super easy to install if you're not used to
17
+ installing things by hand. When Kosmos is ready for "production" use, one-click
18
+ installers will be added.
19
+
20
+ Kosmos has three dependencies, all of which are currently expected to be on your
21
+ `PATH`. They are:
22
+
23
+ * Ruby version 2.0+,
24
+ * Git, and
25
+ * PhantomJS
26
+
27
+ ### Installing Ruby
28
+
29
+ Kosmos has been tested on Ruby 2.0.0, and it is recommended that you use Ruby
30
+ 2.0.0 or greater. Check your version of Ruby using:
31
+
32
+ ```sh
33
+ ruby -v
34
+ ```
35
+
36
+ If you need to update Ruby, use one of the following tools:
37
+
38
+ * *Mac*: [RVM](https://rvm.io/) is the recommended tool for the job, but not
39
+ everyone is comfortable with it. If you prefer, you may use
40
+ [Homebrew](http://brew.sh) and install Ruby 2.0 with: `brew install ruby20`.
41
+ * *Windows*: Install Ruby 2.0+ with [Ruby Installer](http://rubyinstaller.org/).
42
+ * *Linux*: Use [RVM](https://rvm.io/).
43
+
44
+ Verify that you're running Ruby 2.0+ by running:
45
+
46
+ ```sh
47
+ ruby -v
48
+ ```
49
+
50
+ ### Installing Git
51
+
52
+ * *Mac*: Use the [Mac Git installer][mac-git], or use Homebrew. Remember to
53
+ check any box asking to add Git to your path.
54
+ * *Windows*: Install Git using [this installer][win-git]. Remember to check any
55
+ box asking to add Git to your path.
56
+ * *Linux*: Run the command:
57
+ * `yum install git-core` on Fedora, or
58
+ * `apt-get install git` on Debian / Ubuntu.
59
+
60
+ Verify that Git is installed properly by running:
8
61
 
9
- gem 'kosmos'
62
+ ```sh
63
+ git --version
64
+ ```
10
65
 
11
- And then execute:
66
+ ### Installing PhantomJS
12
67
 
13
- $ bundle
68
+ Install PhantomJS [here][phantom]. You will need to add PhantomJS to your path
69
+ manually. Verify that PhantomJS is installed properly by running:
14
70
 
15
- Or install it yourself as:
71
+ ```sh
72
+ phantomjs --version
73
+ ```
16
74
 
17
- $ gem install kosmos
75
+ ### Installing Kosmos itself
76
+
77
+ Just run:
78
+
79
+ ```sh
80
+ gem install kosmos
81
+ ```
82
+
83
+ And it'll be ready to go.
18
84
 
19
85
  ## Usage
20
86
 
21
- TODO: Write usage instructions here
87
+ Install any command by running:
88
+
89
+ ```
90
+ kosmos install name-of-the-mod-goes-here
91
+ ```
92
+
93
+ Uninstall any mod by running:
94
+
95
+ ```
96
+ kosmos uninstall name-of-the-mod-goes-here
97
+ ```
98
+
99
+ You can install multiple mods by separating the names by spaces:
100
+
101
+ ```
102
+ kosmos install mod-a mod-b mod-c
103
+ ```
104
+
105
+ You can ask Kosmos what mods it's installed by running:
106
+
107
+ ```
108
+ kosmos list
109
+ ```
110
+
111
+ ### A complete example
112
+
113
+ Almost all of the mods Scott Manley uses in Interstellar Quest are available
114
+ through Kosmos. You can install them all by running:
115
+
116
+ ```
117
+ kosmos install active-texture-management b9 b9-fix b9-modzero kerbal-alarm-clock kw-rocketry ksp-interstellar ferram deadly-reentry kethane infernal-robotics distant-object-enhancement better-atmospheres remote-tech-2 remote-tech-2-fixpack tac-life-support enhanced-navball kerbal-joint-reinforcement docking-port-alignment-indicator safe-chute kerbal-attachment-system real-chute tac-fuel-balancer
118
+ ```
119
+
120
+ [mac-git]: http://sourceforge.net/projects/git-osx-installer/
121
+ [win-git]: http://git-scm.com/download/win
122
+ [phantom]: http://phantomjs.org/download.html
data/bin/kosmos CHANGED
@@ -6,88 +6,15 @@ Kosmos.configure do |config|
6
6
  config.verbose = true
7
7
  end
8
8
 
9
- def pretty_print_list(list)
10
- list.each { |value| puts " * #{value}" }
11
- end
12
-
13
- def load_packages(package_names)
14
- packages = Hash[package_names.map do |name|
15
- [name, Kosmos::Package.find(name)]
16
- end]
17
-
18
- unknown_packages = packages.select { |_, package| package.nil? }
19
-
20
- if unknown_packages.any?
21
- puts "Error: Kosmos couldn't find any packages with the following names:"
22
- pretty_print_list(unknown_packages.keys)
23
- exit
24
- end
25
-
26
- packages.values
27
- end
28
-
29
- def check_installed_packages(ksp_path, packages)
30
- installed_titles = Kosmos::Versioner.installed_packages(ksp_path)
31
-
32
- installed_packages = packages.select do |package|
33
- installed_titles.include?(package.title)
34
- end
35
-
36
- if installed_packages.any?
37
- puts "Error: You have already installed the following packages using Kosmos:"
38
- pretty_print_list(installed_packages.map(&:title))
39
- exit
40
- end
41
- end
42
-
43
9
  case ARGV.shift
44
10
  when 'init'
45
- ksp_path = ARGV.shift
46
-
47
- puts "Initializing Kosmos into #{ksp_path} (This will take a sec) ..."
48
-
49
- Kosmos::Versioner.init_repo(ksp_path)
50
- Kosmos.save_ksp_path(ksp_path)
51
-
52
- puts "Done! You're ready to begin installing mods."
53
- puts
54
- puts "Install your first mod by running the command:"
55
- puts " kosmos install [name-of-the-mod]"
56
- puts
57
-
11
+ Kosmos::UserInterface.init(ARGV)
58
12
  when 'install'
59
- ksp_path = Kosmos.load_ksp_path
60
-
61
- packages = load_packages(ARGV)
62
- check_installed_packages(ksp_path, packages)
63
-
64
- puts "Kosmos is about to install #{packages.count} package(s):"
65
- pretty_print_list(packages.map(&:title))
66
-
67
- packages.each do |package|
68
- puts "Installing package #{package.title} ..."
69
- package.new.install!(ksp_path)
70
- puts "Done!"
71
- end
72
-
13
+ Kosmos::UserInterface.install(ARGV)
73
14
  when 'uninstall'
74
- ksp_path = Kosmos.load_ksp_path
75
-
76
- package_name = ARGV.shift
77
- package = Kosmos::Package.find(package_name)
78
-
79
- if package
80
- puts "Preparing to uninstall #{package.title} ..."
81
- Kosmos::Versioner.uninstall_package(ksp_path, package)
82
- puts "Done! Just uninstalled: #{package.title}."
83
- else
84
- puts "Error: Kosmos couldn't find any packages with the name #{package_name.inspect}."
85
- end
86
-
15
+ Kosmos::UserInterface.uninstall(ARGV)
87
16
  when 'list'
88
- ksp_path = Kosmos.load_ksp_path
89
-
90
- packages = Kosmos::Versioner.installed_packages(ksp_path)
91
- puts "You have installed #{packages.length} mod(s) using Kosmos:"
92
- pretty_print_list(packages)
17
+ Kosmos::UserInterface.list(ARGV)
18
+ when 'server'
19
+ Kosmos::UserInterface.server(ARGV)
93
20
  end
data/kosmos.gemspec CHANGED
@@ -17,8 +17,11 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency "json_pure"
20
21
  spec.add_dependency "rubyzip"
21
- spec.add_dependency "rugged"
22
22
  spec.add_dependency "httparty"
23
23
  spec.add_dependency "nokogiri"
24
+ spec.add_dependency "damerau-levenshtein"
25
+ spec.add_dependency "sinatra"
26
+ spec.add_dependency "thin"
24
27
  end
data/lib/kosmos.rb CHANGED
@@ -1,12 +1,16 @@
1
1
  require 'kosmos/package_dsl'
2
+ require 'kosmos/package_attrs'
3
+ require 'kosmos/package_downloads'
2
4
  require 'kosmos/package'
3
5
  require 'kosmos/versioner'
4
6
  require 'kosmos/git_adapter'
5
7
  require 'kosmos/download_url'
8
+ require 'kosmos/user_interface'
9
+ require 'kosmos/web/app'
6
10
  require 'kosmos/util'
7
11
  require 'kosmos/version'
8
12
 
9
- require 'json'
13
+ require 'json/pure'
10
14
 
11
15
  module Kosmos
12
16
  class << self
@@ -26,16 +30,25 @@ module Kosmos
26
30
  read_config[:ksp_path]
27
31
  end
28
32
 
33
+ def cache_dir
34
+ read_config[:cache_dir]
35
+ end
36
+
29
37
  private
30
38
 
31
39
  def write_config(opts)
32
- File.open(config_path, "rw+") do |file|
40
+ File.open(config_path, "r+") do |file|
33
41
  file.write JSON.pretty_generate(read_config.merge(opts))
34
42
  end
35
43
  end
36
44
 
37
45
  def read_config
38
- JSON.parse(File.read(config_path), symbolize_names: true)
46
+ config = File.read(config_path)
47
+ if config.empty?
48
+ {}
49
+ else
50
+ JSON.parse(config, symbolize_names: true)
51
+ end
39
52
  end
40
53
 
41
54
  def config_path
@@ -44,11 +57,12 @@ module Kosmos
44
57
  end
45
58
 
46
59
  class Configuration
47
- attr_accessor :verbose, :post_processors
60
+ attr_accessor :verbose, :post_processors, :output_method
48
61
 
49
62
  def initialize
50
63
  @verbose = false
51
64
  @post_processors = [Kosmos::PostProcessors::ModuleManagerResolver]
65
+ @output_method = Proc.new { |str| puts str }
52
66
  end
53
67
  end
54
68
  end
@@ -16,6 +16,10 @@ module Kosmos
16
16
  end
17
17
  end
18
18
 
19
+ def has_known_resolver?
20
+ mediafire? || box? || dropbox? || curseforge?
21
+ end
22
+
19
23
  def mediafire?
20
24
  url =~ /mediafire/
21
25
  end
@@ -6,6 +6,10 @@ module Kosmos
6
6
  def init_repo(path)
7
7
  Dir.chdir(path) do
8
8
  `git init`
9
+
10
+ File.open('.gitignore', 'w') do |file|
11
+ file.write "!*\n"
12
+ end
9
13
  end
10
14
  end
11
15
 
@@ -16,11 +20,9 @@ module Kosmos
16
20
  end
17
21
  end
18
22
 
19
- def revert_commit(repo_path, commit, commit_message)
23
+ def revert_commit(repo_path, commit)
20
24
  Dir.chdir(repo_path) do
21
25
  `git revert --no-commit #{commit.sha}`
22
- `git add -A -f`
23
- `git commit --allow-empty -m #{commit_message.shellescape}`
24
26
  end
25
27
  end
26
28
 
@@ -2,50 +2,46 @@ require 'pathname'
2
2
  require 'httparty'
3
3
  require 'zip'
4
4
  require 'tmpdir'
5
+ require 'damerau-levenshtein'
5
6
 
6
7
  module Kosmos
7
8
  class Package
8
9
  include PackageDsl
10
+ include PackageAttrs
9
11
 
10
12
  attr_reader :ksp_path, :download_dir
11
13
 
12
- [:title, :url].each do |param|
13
- define_singleton_method(param) do |value = nil|
14
- if value
15
- instance_variable_set("@#{param}", value)
16
- else
17
- instance_variable_get("@#{param}")
18
- end
19
- end
20
- end
21
-
22
- # Internal version of the `install` method, which saves before actually
23
- # performing the installation.
14
+ # Internal version of the `install` method, which handles procedures commong
15
+ # to all packages, such as saving work before and after installation, as
16
+ # well as downloading and unzipping packages and running post-processors.
24
17
  def install!(ksp_path)
25
18
  @ksp_path = ksp_path
19
+
20
+ install_prerequisites!
21
+
26
22
  @download_dir = self.class.unzip!
27
23
 
28
24
  Util.log "Saving your work before installing ..."
29
- Versioner.mark_preinstall(ksp_path, self.class)
25
+ Versioner.mark_preinstall(ksp_path, self)
30
26
 
31
- Util.log "Installing #{self.class.title} ..."
27
+ Util.log "Installing #{title} ..."
32
28
  install
33
29
 
34
30
  Util.log "Cleaning up ..."
35
- Kosmos.config.post_processors.each { |p| p.post_process(ksp_path) }
31
+ Util.run_post_processors!(ksp_path)
36
32
 
37
- Versioner.mark_postinstall(ksp_path, self.class)
33
+ Versioner.mark_postinstall(ksp_path, self)
34
+
35
+ install_postrequisites!
38
36
  end
39
37
 
40
38
  class << self
41
- def aliases(*aliases)
42
- @aliases ||= []
39
+ def unzip!
40
+ PackageDownloads.download_and_unzip_package(self)
41
+ end
43
42
 
44
- if aliases.any?
45
- @aliases = aliases
46
- else
47
- @aliases
48
- end
43
+ def download!
44
+ PackageDownloads.download_package(self)
49
45
  end
50
46
 
51
47
  # a callback for when a subclass of this class is created
@@ -57,52 +53,40 @@ module Kosmos
57
53
  name.downcase.gsub(' ', "-")
58
54
  end
59
55
 
56
+ def normalized_title
57
+ normalize_for_find(title)
58
+ end
59
+
60
60
  def find(name)
61
61
  @@packages.find do |package|
62
- [package.title, package.aliases].flatten.any? do |candidate_name|
62
+ package.names.any? do |candidate_name|
63
63
  normalize_for_find(candidate_name) == normalize_for_find(name)
64
64
  end
65
65
  end
66
66
  end
67
67
 
68
- def unzip!
69
- download_file = download!
70
-
71
- Util.log "Unzipping ..."
72
-
73
- output_path = Pathname.new(download_file.path).parent.to_s
74
-
75
- Zip::File.open(download_file.path) do |zip_file|
76
- zip_file.each do |entry|
77
- destination = File.join(output_path, entry.name)
78
- parent_dir = File.expand_path('..', destination)
79
-
80
- FileUtils.mkdir_p(parent_dir) unless File.exists?(parent_dir)
81
-
82
- entry.extract(destination)
83
- end
68
+ def search(name)
69
+ @@packages.min_by do |package|
70
+ package.names.map do |candidate_name|
71
+ DamerauLevenshtein.distance(name, candidate_name)
72
+ end.min
84
73
  end
85
-
86
- File.delete(File.absolute_path(download_file))
87
-
88
- output_path
89
74
  end
75
+ end
90
76
 
91
- def download!
92
- Util.log "The package is found at #{url}. Finding the download URL ..."
93
- download_url = DownloadUrl.new(url).resolve_download_url
94
-
95
-
96
- Util.log "Found it. Downloading from #{download_url} ..."
97
- downloaded_file = HTTParty.get(download_url)
98
-
99
- tmpdir = Dir.mktmpdir
77
+ private
100
78
 
101
- download_file = File.new(File.join(tmpdir, 'download'), 'w+')
102
- download_file.write(downloaded_file)
103
- download_file.close
79
+ def install_prerequisites!
80
+ resolve_prerequisites.each do |package|
81
+ Util.log "#{title} has prerequisite #{package.title}."
82
+ package.new.install!(ksp_path)
83
+ end
84
+ end
104
85
 
105
- download_file
86
+ def install_postrequisites!
87
+ resolve_postrequisites.each do |package|
88
+ Util.log "#{title} has postrequisite #{package.title}."
89
+ package.new.install!(ksp_path)
106
90
  end
107
91
  end
108
92