u3d 0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.licenses.json +19 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +43 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +98 -0
  8. data/LICENSE +21 -0
  9. data/LICENSE.fastlane +22 -0
  10. data/LOG_RULES.md +170 -0
  11. data/README.md +72 -0
  12. data/Rakefile +28 -0
  13. data/TODO.md +15 -0
  14. data/build.sh +5 -0
  15. data/config/log_rules.json +230 -0
  16. data/examples/Example1/.gitignore +19 -0
  17. data/examples/Example1/Assets/Editor.meta +9 -0
  18. data/examples/Example1/Assets/Editor/EditorRun.cs +23 -0
  19. data/examples/Example1/Assets/Editor/EditorRun.cs.meta +12 -0
  20. data/examples/Example1/Assets/Editor/FileSystemUtil.cs +26 -0
  21. data/examples/Example1/Assets/Editor/FileSystemUtil.cs.meta +12 -0
  22. data/examples/Example1/Assets/Scene1.unity +264 -0
  23. data/examples/Example1/Assets/Scene1.unity.meta +8 -0
  24. data/examples/Example1/Gemfile +8 -0
  25. data/examples/Example1/Gemfile.lock +165 -0
  26. data/examples/Example1/ProjectSettings/AudioManager.asset +16 -0
  27. data/examples/Example1/ProjectSettings/ClusterInputManager.asset +6 -0
  28. data/examples/Example1/ProjectSettings/DynamicsManager.asset +18 -0
  29. data/examples/Example1/ProjectSettings/EditorBuildSettings.asset +7 -0
  30. data/examples/Example1/ProjectSettings/EditorSettings.asset +14 -0
  31. data/examples/Example1/ProjectSettings/GraphicsSettings.asset +61 -0
  32. data/examples/Example1/ProjectSettings/InputManager.asset +295 -0
  33. data/examples/Example1/ProjectSettings/NavMeshAreas.asset +89 -0
  34. data/examples/Example1/ProjectSettings/NetworkManager.asset +8 -0
  35. data/examples/Example1/ProjectSettings/Physics2DSettings.asset +35 -0
  36. data/examples/Example1/ProjectSettings/ProjectSettings.asset +591 -0
  37. data/examples/Example1/ProjectSettings/ProjectVersion.txt +1 -0
  38. data/examples/Example1/ProjectSettings/QualitySettings.asset +180 -0
  39. data/examples/Example1/ProjectSettings/TagManager.asset +43 -0
  40. data/examples/Example1/ProjectSettings/TimeManager.asset +9 -0
  41. data/examples/Example1/ProjectSettings/UnityConnectSettings.asset +32 -0
  42. data/examples/Example1/README.md +5 -0
  43. data/examples/Example1/Rakefile +5 -0
  44. data/examples/Example1/fastlane/Fastfile +4 -0
  45. data/examples/Example1/fastlane/Pluginfile +1 -0
  46. data/examples/Example1/run.sh +1 -0
  47. data/examples/Example2/.gitignore +20 -0
  48. data/examples/Example2/Assets/Editor.meta +9 -0
  49. data/examples/Example2/Assets/Editor/EditorRun.cs +33 -0
  50. data/examples/Example2/Assets/Editor/EditorRun.cs.meta +12 -0
  51. data/examples/Example2/Assets/Editor/PostprocessBuildPlayer.cs +92 -0
  52. data/examples/Example2/Assets/Editor/PostprocessBuildPlayer.cs.meta +8 -0
  53. data/examples/Example2/Assets/Editor/PostprocessBuildPlayer_log.sh +31 -0
  54. data/examples/Example2/Assets/Editor/PostprocessBuildPlayer_log.sh.meta +8 -0
  55. data/examples/Example2/Assets/Editor/SimpleBuildSetup.cs +20 -0
  56. data/examples/Example2/Assets/Editor/SimpleBuildSetup.cs.meta +12 -0
  57. data/examples/Example2/Assets/Scene.unity +278 -0
  58. data/examples/Example2/Assets/Scene.unity.meta +8 -0
  59. data/examples/Example2/Gemfile +8 -0
  60. data/examples/Example2/Gemfile.lock +165 -0
  61. data/examples/Example2/ProjectSettings/AudioManager.asset +17 -0
  62. data/examples/Example2/ProjectSettings/ClusterInputManager.asset +6 -0
  63. data/examples/Example2/ProjectSettings/DynamicsManager.asset +19 -0
  64. data/examples/Example2/ProjectSettings/EditorBuildSettings.asset +10 -0
  65. data/examples/Example2/ProjectSettings/EditorSettings.asset +14 -0
  66. data/examples/Example2/ProjectSettings/GraphicsSettings.asset +63 -0
  67. data/examples/Example2/ProjectSettings/InputManager.asset +295 -0
  68. data/examples/Example2/ProjectSettings/NavMeshAreas.asset +89 -0
  69. data/examples/Example2/ProjectSettings/NetworkManager.asset +8 -0
  70. data/examples/Example2/ProjectSettings/Physics2DSettings.asset +36 -0
  71. data/examples/Example2/ProjectSettings/ProjectSettings.asset +591 -0
  72. data/examples/Example2/ProjectSettings/ProjectVersion.txt +1 -0
  73. data/examples/Example2/ProjectSettings/QualitySettings.asset +193 -0
  74. data/examples/Example2/ProjectSettings/TagManager.asset +43 -0
  75. data/examples/Example2/ProjectSettings/TimeManager.asset +9 -0
  76. data/examples/Example2/ProjectSettings/UnityConnectSettings.asset +34 -0
  77. data/examples/Example2/README.md +10 -0
  78. data/examples/Example2/fastlane/Fastfile +4 -0
  79. data/examples/Example2/fastlane/Pluginfile +1 -0
  80. data/exe/u3d +7 -0
  81. data/fastlane-plugin-u3d/.gitignore +10 -0
  82. data/fastlane-plugin-u3d/.licenses.json +9 -0
  83. data/fastlane-plugin-u3d/.rspec +3 -0
  84. data/fastlane-plugin-u3d/.rubocop.yml +253 -0
  85. data/fastlane-plugin-u3d/.travis.yml +4 -0
  86. data/fastlane-plugin-u3d/Gemfile +6 -0
  87. data/fastlane-plugin-u3d/LICENSE +21 -0
  88. data/fastlane-plugin-u3d/README.md +52 -0
  89. data/fastlane-plugin-u3d/Rakefile +9 -0
  90. data/fastlane-plugin-u3d/circle.yml +9 -0
  91. data/fastlane-plugin-u3d/fastlane-plugin-u3d.gemspec +31 -0
  92. data/fastlane-plugin-u3d/fastlane/Fastfile +3 -0
  93. data/fastlane-plugin-u3d/fastlane/Pluginfile +1 -0
  94. data/fastlane-plugin-u3d/lib/fastlane/plugin/u3d.rb +38 -0
  95. data/fastlane-plugin-u3d/lib/fastlane/plugin/u3d/actions/u3d_action.rb +80 -0
  96. data/fastlane-plugin-u3d/lib/fastlane/plugin/u3d/helper/u3d_helper.rb +34 -0
  97. data/fastlane-plugin-u3d/lib/fastlane/plugin/u3d/version.rb +27 -0
  98. data/fastlane-plugin-u3d/spec/spec_helper.rb +32 -0
  99. data/lib/u3d.rb +33 -0
  100. data/lib/u3d/cache.rb +120 -0
  101. data/lib/u3d/commands.rb +307 -0
  102. data/lib/u3d/commands_generator.rb +163 -0
  103. data/lib/u3d/downloader.rb +363 -0
  104. data/lib/u3d/iniparser.rb +83 -0
  105. data/lib/u3d/installer.rb +445 -0
  106. data/lib/u3d/log_analyzer.rb +221 -0
  107. data/lib/u3d/unity_version_number.rb +71 -0
  108. data/lib/u3d/unity_versions.rb +207 -0
  109. data/lib/u3d/utils.rb +121 -0
  110. data/lib/u3d/version.rb +31 -0
  111. data/lib/u3d_core.rb +30 -0
  112. data/lib/u3d_core/command_executor.rb +134 -0
  113. data/lib/u3d_core/command_runner.rb +93 -0
  114. data/lib/u3d_core/credentials.rb +116 -0
  115. data/lib/u3d_core/globals.rb +84 -0
  116. data/lib/u3d_core/helper.rb +149 -0
  117. data/lib/u3d_core/ui/disable_colors.rb +40 -0
  118. data/lib/u3d_core/ui/implementations/shell.rb +157 -0
  119. data/lib/u3d_core/ui/interface.rb +182 -0
  120. data/lib/u3d_core/ui/ui.rb +49 -0
  121. data/local_gem_install.sh +6 -0
  122. data/scripts/be +14 -0
  123. data/u3d.gemspec +41 -0
  124. metadata +388 -0
@@ -0,0 +1,84 @@
1
+ ## --- BEGIN LICENSE BLOCK ---
2
+ # Original work Copyright (c) 2015-present the fastlane authors
3
+ # Modified work Copyright 2016-present WeWantToKnow AS
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+ ## --- END LICENSE BLOCK ---
23
+
24
+ module U3dCore
25
+ # all these attributes are false by default
26
+ # and can be set overriden temporarily using a
27
+ # with_attr(value) do
28
+ # something
29
+ # end
30
+ # construct
31
+ class Globals
32
+ class << self
33
+ attr_writer :verbose, :log_timestamps, :use_keychain, :do_not_login
34
+
35
+ def attributes
36
+ @attributes ||= ((methods - public_instance_methods).grep(/=$/) - [:<=, :>=]).map do |s|
37
+ a = s.to_s
38
+ a[0..(a.length - 2)] # remove the '='
39
+ end
40
+ end
41
+
42
+ def with(attr, value)
43
+ orig_attr = send("#{attr}?")
44
+ send("#{attr}=", value)
45
+ yield if block_given?
46
+ ensure
47
+ send("#{attr}=", orig_attr)
48
+ end
49
+
50
+ def is?(attr)
51
+ instance_variable_get("@#{attr}")
52
+ end
53
+
54
+ def method_missing(method_sym, *arguments, &block)
55
+ if method_sym.to_s =~ /^with_(.*)$/
56
+ if attributes.include? Regexp.last_match(1)
57
+ with(Regexp.last_match(1).to_sym, arguments.first, &block)
58
+ else
59
+ super
60
+ end
61
+ elsif method_sym.to_s =~ /^(.*)\?$/
62
+ if attributes.include? Regexp.last_match(1)
63
+ is?(Regexp.last_match(1).to_sym)
64
+ else
65
+ super
66
+ end
67
+ else
68
+ super
69
+ end
70
+ end
71
+
72
+ def respond_to?(method_sym, include_private = false)
73
+ if method_sym.to_s =~ /^with_(.*)$/
74
+ return attributes.include? Regexp.last_match(1)
75
+ elsif method_sym.to_s =~ /^(.*)\?$/
76
+ return attributes.include? Regexp.last_match(1)
77
+ else
78
+ super
79
+ end
80
+ end
81
+ end
82
+ private_class_method :is?, :with, :attributes
83
+ end
84
+ end
@@ -0,0 +1,149 @@
1
+ ## --- BEGIN LICENSE BLOCK ---
2
+ # Original work Copyright (c) 2015-present the fastlane authors
3
+ # Modified work Copyright 2016-present WeWantToKnow AS
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+ ## --- END LICENSE BLOCK ---
23
+
24
+ require 'logger'
25
+ require 'colored'
26
+
27
+ module U3dCore
28
+ module Helper
29
+ # Runs a given command using backticks (`)
30
+ # and prints them out using the UI.command method
31
+ def self.backticks(command, print: true)
32
+ UI.command(command) if print
33
+ result = `#{command}`
34
+ UI.command_output(result) if print
35
+ return result
36
+ end
37
+
38
+ # @return true if the currently running program is a unit test
39
+ def self.is_test?
40
+ defined? SpecHelper
41
+ end
42
+
43
+ # removes ANSI colors from string
44
+ def self.strip_ansi_colors(str)
45
+ str.gsub(/\e\[([;\d]+)?m/, '')
46
+ end
47
+
48
+ # @return [boolean] true if executing with bundler (like 'bundle exec fastlane [action]')
49
+ def self.bundler?
50
+ # Bundler environment variable
51
+ %w(BUNDLE_BIN_PATH BUNDLE_GEMFILE).each do |current|
52
+ return true if ENV.key?(current)
53
+ end
54
+ return false
55
+ end
56
+
57
+ # Do we run from a bundled fastlane, which contains Ruby and OpenSSL?
58
+ # Usually this means the fastlane directory is ~/.fastlane/bin/
59
+ # We set this value via the environment variable `FASTLANE_SELF_CONTAINED`
60
+ def self.contained_fastlane?
61
+ ENV["FASTLANE_SELF_CONTAINED"].to_s == "true" && !homebrew?
62
+ end
63
+
64
+ # returns true if fastlane was installed from the Fabric Mac app
65
+ def self.mac_app?
66
+ ENV["FASTLANE_SELF_CONTAINED"].to_s == "false"
67
+ end
68
+
69
+ # returns true if fastlane was installed via Homebrew
70
+ def self.homebrew?
71
+ ENV["FASTLANE_INSTALLED_VIA_HOMEBREW"].to_s == "true"
72
+ end
73
+
74
+ # returns true if fastlane was installed via RubyGems
75
+ def self.rubygems?
76
+ !bundler? && !contained_fastlane? && !homebrew? && !mac_app?
77
+ end
78
+
79
+ # @return [boolean] true if building in a known CI environment
80
+ def self.ci?
81
+ # Check for Jenkins, Travis CI, ... environment variables
82
+ %w(JENKINS_HOME JENKINS_URL TRAVIS CIRCLECI CI TEAMCITY_VERSION GO_PIPELINE_NAME bamboo_buildKey GITLAB_CI XCS).each do |current|
83
+ return true if ENV.key?(current)
84
+ end
85
+ return false
86
+ end
87
+
88
+ def self.windows?
89
+ # taken from: http://stackoverflow.com/a/171011/1945875
90
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
91
+ end
92
+
93
+ def self.linux?
94
+ (/linux/ =~ RUBY_PLATFORM) != nil
95
+ end
96
+
97
+ # Is the currently running computer a Mac?
98
+ def self.mac?
99
+ (/darwin/ =~ RUBY_PLATFORM) != nil
100
+ end
101
+
102
+ # the valid operating systems
103
+ def self.operating_systems
104
+ [:linux, :mac, :win]
105
+ end
106
+
107
+ # the current operating system
108
+ def self.operating_system
109
+ if linux?
110
+ return :linux
111
+ elsif mac?
112
+ return :mac
113
+ elsif windows?
114
+ return :win
115
+ else
116
+ raise 'Could not assume what OS you\'re running, please specify it as much as possible'
117
+ end
118
+ end
119
+
120
+ def self.win_64?
121
+ (/x64/ =~ RUBY_PLATFORM) != nil
122
+ end
123
+
124
+ def self.win_32?
125
+ (/i386/ =~ RUBY_PLATFORM) != nil
126
+ end
127
+
128
+ # Do we want to disable the colored output?
129
+ def self.colors_disabled?
130
+ ENV["U3D_DISABLE_COLORS"]
131
+ end
132
+
133
+ # Does the user use the Mac stock terminal
134
+ def self.mac_stock_terminal?
135
+ !!ENV["TERM_PROGRAM_VERSION"]
136
+ end
137
+
138
+ # Does the user use iTerm?
139
+ def self.iterm?
140
+ !!ENV["ITERM_SESSION_ID"]
141
+ end
142
+
143
+ # Logs base directory
144
+ # def self.buildlog_path
145
+ # return ENV["FL_BUILDLOG_PATH"] || "~/Library/Logs"
146
+ # end
147
+ end
148
+ # rubocop:enable Metrics/ModuleLength
149
+ end
@@ -0,0 +1,40 @@
1
+ ## --- BEGIN LICENSE BLOCK ---
2
+ # Original work Copyright (c) 2015-present the fastlane authors
3
+ # Modified work Copyright 2016-present WeWantToKnow AS
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+ ## --- END LICENSE BLOCK ---
23
+
24
+ # This code overwrites the methods from the colored gem
25
+ # via https://github.com/defunkt/colored/blob/master/lib/colored.rb
26
+
27
+ require 'colored'
28
+
29
+ class String
30
+ Colored::COLORS.keys.each do |color|
31
+ define_method(color) do
32
+ self # do nothing with the string, but return it
33
+ end
34
+ end
35
+ Colored::EXTRAS.keys.each do |extra|
36
+ define_method(extra) do
37
+ self # do nothing with the string, but return it
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,157 @@
1
+ ## --- BEGIN LICENSE BLOCK ---
2
+ # Original work Copyright (c) 2015-present the fastlane authors
3
+ # Modified work Copyright 2016-present WeWantToKnow AS
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+ ## --- END LICENSE BLOCK ---
23
+
24
+ module U3dCore
25
+ # Shell is the terminal output of things
26
+ # For documentation for each of the methods open `interface.rb`
27
+ class Shell < Interface
28
+ def log
29
+ return @log if @log
30
+
31
+ $stdout.sync = true
32
+
33
+ @log ||= if Helper.is_test?
34
+ Logger.new(nil) # don't show any logs when running tests
35
+ else
36
+ Logger.new($stdout)
37
+ end
38
+
39
+ @log.formatter = proc do |severity, datetime, _progname, msg|
40
+ "#{format_string(datetime, severity)}#{msg}\n"
41
+ end
42
+
43
+ require 'u3d_core/ui/disable_colors' if U3dCore::Helper.colors_disabled?
44
+
45
+ @log
46
+ end
47
+
48
+ def format_string(datetime = Time.now, severity = "")
49
+ if U3dCore::Globals.log_timestamps?
50
+ timestamp = ENV["U3D_UI_TIMESTAMP"]
51
+ # default timestamp if none specified
52
+ unless timestamp
53
+ timestamp = if U3dCore::Globals.verbose?
54
+ '%Y-%m-%d %H:%M:%S.%2N'
55
+ else
56
+ '%H:%M:%S'
57
+ end
58
+ end
59
+ end
60
+ # hide has last word
61
+ timestamp = nil if ENV["U3D_HIDE_TIMESTAMP"]
62
+ s = []
63
+ s << "#{severity} " if U3dCore::Globals.verbose? && severity && !severity.empty?
64
+ s << "[#{datetime.strftime(timestamp)}] " if timestamp
65
+ s.join('')
66
+ end
67
+
68
+ #####################################################
69
+ # @!group Messaging: show text to the user
70
+ #####################################################
71
+
72
+ def error(message)
73
+ log.error(message.to_s.red)
74
+ end
75
+
76
+ def important(message)
77
+ log.warn(message.to_s.yellow)
78
+ end
79
+
80
+ def success(message)
81
+ log.info(message.to_s.green)
82
+ end
83
+
84
+ def message(message)
85
+ log.info(message.to_s)
86
+ end
87
+
88
+ def deprecated(message)
89
+ log.error(message.to_s.bold.blue)
90
+ end
91
+
92
+ def command(message)
93
+ log.info("$ #{message}".cyan.underline)
94
+ end
95
+
96
+ def command_output(message)
97
+ actual = (message.split("\r").last || "") # as clearing the line will remove the `>` and the time stamp
98
+ actual.split("\n").each do |msg|
99
+ prefix = msg.include?("▸") ? "" : "▸ "
100
+ log.info(prefix + "" + msg.magenta)
101
+ end
102
+ end
103
+
104
+ def verbose(message)
105
+ log.debug(message.to_s) if U3dCore::Globals.verbose?
106
+ end
107
+
108
+ def header(message)
109
+ i = message.length + 8
110
+ success("-" * i)
111
+ success("--- " + message + " ---")
112
+ success("-" * i)
113
+ end
114
+
115
+ #####################################################
116
+ # @!group Errors: Inputs
117
+ #####################################################
118
+
119
+ def interactive?
120
+ interactive = true
121
+ interactive = false if $stdout.isatty == false
122
+ interactive = false if Helper.ci?
123
+ return interactive
124
+ end
125
+
126
+ def input(message)
127
+ verify_interactive!(message)
128
+ ask("#{format_string}#{message.to_s.yellow}").to_s.strip
129
+ end
130
+
131
+ def confirm(message)
132
+ verify_interactive!(message)
133
+ agree("#{format_string}#{message.to_s.yellow} (y/n)", true)
134
+ end
135
+
136
+ def select(message, options)
137
+ verify_interactive!(message)
138
+
139
+ important(message)
140
+ choose(*options)
141
+ end
142
+
143
+ def password(message)
144
+ verify_interactive!(message)
145
+
146
+ ask("#{format_string}#{message.to_s.yellow}") { |q| q.echo = "*" }
147
+ end
148
+
149
+ private
150
+
151
+ def verify_interactive!(message)
152
+ return if interactive?
153
+ important(message)
154
+ crash!("Could not retrieve response as u3d runs in non-interactive mode")
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,182 @@
1
+ ## --- BEGIN LICENSE BLOCK ---
2
+ # Original work Copyright (c) 2015-present the fastlane authors
3
+ # Modified work Copyright 2016-present WeWantToKnow AS
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+ ## --- END LICENSE BLOCK ---
23
+
24
+ module U3dCore
25
+ # Abstract super class
26
+ class Interface
27
+ #####################################################
28
+ # @!group Messaging: show text to the user
29
+ #####################################################
30
+
31
+ # Level Error: Can be used to show additional error
32
+ # information before actually raising an exception
33
+ # or can be used to just show an error from which
34
+ # u3d can recover (much magic)
35
+ #
36
+ # By default those messages are shown in red
37
+ def error(_message)
38
+ not_implemented(__method__)
39
+ end
40
+
41
+ # Level Important: Can be used to show warnings to the user
42
+ # not necessarly negative, but something the user should
43
+ # be aware of.
44
+ #
45
+ # By default those messages are shown in yellow
46
+ def important(_message)
47
+ not_implemented(__method__)
48
+ end
49
+
50
+ # Level Success: Show that something was successful
51
+ #
52
+ # By default those messages are shown in green
53
+ def success(_message)
54
+ not_implemented(__method__)
55
+ end
56
+
57
+ # Level Message: Show a neutral message to the user
58
+ #
59
+ # By default those messages shown in white/black
60
+ def message(_message)
61
+ not_implemented(__method__)
62
+ end
63
+
64
+ # Level Deprecated: Show that a particular function is deprecated
65
+ #
66
+ # By default those messages shown in strong blue
67
+ def deprecated(_message)
68
+ not_implemented(__method__)
69
+ end
70
+
71
+ # Level Command: Print out a terminal command that is being
72
+ # executed.
73
+ #
74
+ # By default those messages shown in cyan
75
+ def command(_message)
76
+ not_implemented(__method__)
77
+ end
78
+
79
+ # Level Command Output: Print the output of a command with
80
+ # this method
81
+ #
82
+ # By default those messages shown in magenta
83
+ def command_output(_message)
84
+ not_implemented(__method__)
85
+ end
86
+
87
+ # Level Verbose: Print out additional information for the
88
+ # users that are interested. Will only be printed when
89
+ # $verbose = true
90
+ #
91
+ # By default those messages are shown in white
92
+ def verbose(_message)
93
+ not_implemented(__method__)
94
+ end
95
+
96
+ # Print a header = a text in a box
97
+ # use this if this message is really important
98
+ def header(_message)
99
+ not_implemented(__method__)
100
+ end
101
+
102
+ #####################################################
103
+ # @!group Errors: Inputs
104
+ #####################################################
105
+
106
+ # Is is possible to ask the user questions?
107
+ def interactive?(_message)
108
+ not_implemented(__method__)
109
+ end
110
+
111
+ # get a standard text input (single line)
112
+ def input(_message)
113
+ not_implemented(__method__)
114
+ end
115
+
116
+ # A simple yes or no question
117
+ def confirm(_message)
118
+ not_implemented(__method__)
119
+ end
120
+
121
+ # Let the user select one out of x items
122
+ # return value is the value of the option the user chose
123
+ def select(_message, _options)
124
+ not_implemented(__method__)
125
+ end
126
+
127
+ # Password input for the user, text field shouldn't show
128
+ # plain text
129
+ def password(_message)
130
+ not_implemented(__method__)
131
+ end
132
+
133
+ #####################################################
134
+ # @!group Errors: Different kinds of exceptions
135
+ #####################################################
136
+
137
+ # raised from crash!
138
+ class UICrash < StandardError
139
+ end
140
+
141
+ # raised from user_error!
142
+ class UIError < StandardError
143
+ attr_reader :show_github_issues
144
+
145
+ def initialize(show_github_issues: false)
146
+ @show_github_issues = show_github_issues
147
+ end
148
+ end
149
+
150
+ # Pass an exception to this method to exit the program
151
+ # using the given exception
152
+ # Use this method instead of user_error! if this error is
153
+ # unexpected, e.g. an invalid server response that shouldn't happen
154
+ def crash!(exception)
155
+ raise UICrash.new, exception.to_s
156
+ end
157
+
158
+ # Use this method to exit the program because of an user error
159
+ # e.g. app doesn't exist on the given Developer Account
160
+ # or invalid user credentials
161
+ # or scan tests fail
162
+ # This will show the error message, but doesn't show the full
163
+ # stack trace
164
+ # Basically this should be used when you actively catch the error
165
+ # and want to show a nice error message to the user
166
+ def user_error!(error_message, options = {})
167
+ options = { show_github_issues: false }.merge(options)
168
+ raise UIError.new(show_github_issues: options[:show_github_issues]), error_message.to_s
169
+ end
170
+
171
+ #####################################################
172
+ # @!group Helpers
173
+ #####################################################
174
+ def not_implemented(method_name)
175
+ UI.user_error!("Current UI '#{self}' doesn't support method '#{method_name}'")
176
+ end
177
+
178
+ def to_s
179
+ self.class.name.split('::').last
180
+ end
181
+ end
182
+ end