u3d 0.9

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