lib/u3d/installation.rb in u3d-1.0.11 vs lib/u3d/installation.rb in u3d-1.0.12

- old
+ new

@@ -27,10 +27,28 @@ UNITY_DIR_CHECK_LINUX = /unity-editor-\d+\.\d+\.\d+[a-z]\d+\z/ class Installation attr_reader :root_path + NOT_PLAYBACKENGINE_PACKAGES = %w[Documentation StandardAssets MonoDevelop].freeze + PACKAGE_ALIASES = + { + 'Android' => [], + 'iOS' => ['iPhone'], + 'AppleTV' => ['tvOS'], + 'Linux' => ['StandaloneLinux'], + 'Mac' => %w[StandaloneOSXIntel StandaloneOSXIntel64 StandaloneOSX], + 'Windows' => ['StandaloneWindows'], + 'Metro' => [], + 'UWP-IL2CPP' => [], + 'Samsung-TV' => [], + 'Tizen' => [], + 'WebGL' => [], + 'Facebook-Games' => ['Facebook'], + 'Vuforia-AR' => ['UnityExtensions'] + }.freeze + def initialize(root_path: nil, path: nil) @root_path = root_path @path = path end @@ -42,10 +60,26 @@ LinuxInstallation.new(root_path: root_path, path: path) else WindowsInstallation.new(root_path: root_path, path: path) end end + + def packages + false + end + + def package_installed?(package) + return true if (packages || []).include?(package) + + aliases = PACKAGE_ALIASES[package] + + # If no aliases for the package are found, then it's a new package not yet known by Unity + # If the exact name doesn't match then we have to suppose it's not installed + return false unless aliases + + return !(aliases & packages).empty? + end end class PlaybackEngineUtils def self.list_module_configs(playbackengine_parent_path) Dir.glob("#{playbackengine_parent_path}/PlaybackEngines/*/ivy.xml") @@ -88,15 +122,33 @@ return @path if @path "#{@root_path}/Unity.app" end def packages - PlaybackEngineUtils.list_module_configs(root_path).map do |mpath| - PlaybackEngineUtils.module_name(mpath) + pack = [] + PlaybackEngineUtils.list_module_configs(root_path).each do |mpath| + pack << PlaybackEngineUtils.module_name(mpath) end + NOT_PLAYBACKENGINE_PACKAGES.each do |module_name| + pack << module_name unless Dir[module_name_pattern(module_name)].empty? + end + pack end + def module_name_pattern(module_name) + case module_name + when 'Documentation' + return "#{root_path}/Documentation/" + when 'StandardAssets' + return "#{root_path}/Standard Assets/" + when 'MonoDevelop' + return "#{root_path}/MonoDevelop.app/" + else + UI.crash! "No pattern is known for #{module_name} on Mac" + end + end + def clean_install? !(root_path =~ UNITY_DIR_CHECK).nil? end private @@ -135,14 +187,10 @@ def path UI.deprecated("path is deprecated. Use root_path instead") @root_path || @path end - def packages - false - end - def clean_install? !(root_path =~ UNITY_DIR_CHECK_LINUX).nil? end end @@ -177,11 +225,29 @@ @root_path || @path end def packages path = "#{root_path}/Editor/Data/" - PlaybackEngineUtils.list_module_configs(path).map do |mpath| - PlaybackEngineUtils.module_name(mpath) + pack = [] + PlaybackEngineUtils.list_module_configs(path).each do |mpath| + pack << PlaybackEngineUtils.module_name(mpath) + end + NOT_PLAYBACKENGINE_PACKAGES.each do |module_name| + pack << module_name unless Dir[module_name_pattern(module_name)].empty? + end + pack + end + + def module_name_pattern(module_name) + case module_name + when 'Documentation' + return "#{root_path}/Editor/Data/Documentation/" + when 'StandardAssets' + return "#{root_path}/Editor/Standard Assets/" + when 'MonoDevelop' + return "#{root_path}/MonoDevelop/" + else + UI.crash! "No pattern is known for #{module_name} on Windows" end end def clean_install? !(root_path =~ UNITY_DIR_CHECK).nil?