kosmos 0.0.1 → 0.0.2.pre.test2

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.
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