u3d 1.2.3 → 1.3.0

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 (61) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +33 -10
  3. data/.github/workflows/ci.yml +35 -0
  4. data/.github_changelog_generator +3 -1
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +15 -3
  7. data/CHANGELOG.md +62 -11
  8. data/Gemfile.lock +147 -87
  9. data/Rakefile +12 -7
  10. data/appveyor.yml +25 -6
  11. data/examples/Example1/Gemfile +4 -2
  12. data/examples/Example1/Gemfile.lock +8 -6
  13. data/examples/Example1/Rakefile +2 -0
  14. data/examples/Example1/fastlane/Fastfile +2 -0
  15. data/examples/Example2/Gemfile +4 -2
  16. data/examples/Example2/Gemfile.lock +12 -7
  17. data/examples/Example2/fastlane/Fastfile +2 -0
  18. data/exe/u3d +3 -1
  19. data/lib/u3d/asset.rb +6 -2
  20. data/lib/u3d/cache.rb +14 -10
  21. data/lib/u3d/commands.rb +14 -9
  22. data/lib/u3d/commands_generator.rb +6 -4
  23. data/lib/u3d/compatibility.rb +2 -0
  24. data/lib/u3d/download_validator.rb +6 -3
  25. data/lib/u3d/downloader.rb +12 -8
  26. data/lib/u3d/failure_reporter.rb +4 -3
  27. data/lib/u3d/hub_modules_parser.rb +24 -7
  28. data/lib/u3d/ini_modules_parser.rb +10 -8
  29. data/lib/u3d/installation.rb +31 -49
  30. data/lib/u3d/installer.rb +44 -33
  31. data/lib/u3d/log_analyzer.rb +31 -27
  32. data/lib/u3d/unity_license.rb +2 -0
  33. data/lib/u3d/unity_module.rb +2 -0
  34. data/lib/u3d/unity_project.rb +4 -1
  35. data/lib/u3d/unity_runner.rb +12 -10
  36. data/lib/u3d/unity_version_definition.rb +3 -0
  37. data/lib/u3d/unity_version_number.rb +8 -2
  38. data/lib/u3d/unity_versions.rb +28 -23
  39. data/lib/u3d/utils.rb +82 -15
  40. data/lib/u3d/version.rb +8 -6
  41. data/lib/u3d.rb +2 -0
  42. data/lib/u3d_core/admin_tools.rb +2 -0
  43. data/lib/u3d_core/command_executor.rb +11 -7
  44. data/lib/u3d_core/command_runner.rb +17 -19
  45. data/lib/u3d_core/core_ext/hash.rb +2 -0
  46. data/lib/u3d_core/core_ext/operating_system_symbol.rb +3 -0
  47. data/lib/u3d_core/core_ext/string.rb +2 -0
  48. data/lib/u3d_core/credentials.rb +9 -7
  49. data/lib/u3d_core/env.rb +3 -0
  50. data/lib/u3d_core/globals.rb +7 -7
  51. data/lib/u3d_core/helper.rb +6 -4
  52. data/lib/u3d_core/ui/disable_colors.rb +2 -0
  53. data/lib/u3d_core/ui/implementations/shell.rb +8 -5
  54. data/lib/u3d_core/ui/interface.rb +3 -0
  55. data/lib/u3d_core/ui/ui.rb +5 -4
  56. data/lib/u3d_core/update_checker/changelog.rb +4 -0
  57. data/lib/u3d_core/update_checker/update_checker.rb +7 -8
  58. data/lib/u3d_core/version.rb +2 -0
  59. data/lib/u3d_core.rb +2 -0
  60. data/u3d.gemspec +19 -9
  61. metadata +101 -30
data/lib/u3d/utils.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Copyright (c) 2016-present WeWantToKnow AS
3
5
  #
@@ -27,11 +29,11 @@ require 'u3d_core/helper'
27
29
 
28
30
  module U3d
29
31
  # Several different utility methods
30
- # rubocop:disable ModuleLength
32
+ # rubocop:disable Metrics/ModuleLength
31
33
  module Utils
32
34
  # Regex to capture each part of a version string (0.0.0x0)
33
35
  CSIDL_LOCAL_APPDATA = 0x001c
34
- UNITY_VERSION_REGEX = /(\d+)(?:\.(\d+)(?:\.(\d+))?)?(?:(\w)(?:(\d+))?)?/
36
+ UNITY_VERSION_REGEX = /(\d+)(?:\.(\d+)(?:\.(\d+))?)?(?:(\w)(?:(\d+))?)?/.freeze
35
37
 
36
38
  class << self
37
39
  def final_url(url, redirect_limit: 10)
@@ -53,6 +55,7 @@ module U3d
53
55
 
54
56
  def follow_redirects(url, redirect_limit: 10, http_method: :get, request_headers: {}, &block)
55
57
  raise 'Too many redirections' if redirect_limit.zero?
58
+
56
59
  response = nil
57
60
  request = nil
58
61
  uri = URI(url)
@@ -65,15 +68,15 @@ module U3d
65
68
  end
66
69
  response = http.request request
67
70
  end
68
- rescue OpenSSL::OpenSSLError => ssl_error
71
+ rescue OpenSSL::OpenSSLError => e
69
72
  UI.error 'SSL has faced an error, you may want to check our README to fix it'
70
- raise ssl_error
73
+ raise e
71
74
  end
72
75
 
73
76
  case response
74
- when Net::HTTPSuccess then
77
+ when Net::HTTPSuccess
75
78
  yield(request, response)
76
- when Net::HTTPRedirection then
79
+ when Net::HTTPRedirection
77
80
  UI.verbose "Redirected to #{response['location']}"
78
81
  follow_redirects(response['location'], redirect_limit: redirect_limit - 1, http_method: http_method, request_headers: request_headers, &block)
79
82
  else raise "Request failed with status #{response.code}"
@@ -83,6 +86,7 @@ module U3d
83
86
  def http_request_class(method, uri)
84
87
  return Net::HTTP::Get.new uri if method == :get
85
88
  return Net::HTTP::Head.new uri if method == :head
89
+
86
90
  raise "Unknown method #{method}"
87
91
  end
88
92
 
@@ -111,10 +115,12 @@ module U3d
111
115
  # FIXME revisits, this slows down download on fast network
112
116
  # sleep 0.08 # adjust to reduce CPU
113
117
  next unless print_progress
118
+
114
119
  print_progress_now = Time.now.to_f - last_print_update > 0.5
115
120
  # force printing when done downloading
116
121
  print_progress_now = true if !print_progress_now && size && current >= size
117
122
  next unless print_progress_now
123
+
118
124
  last_print_update = Time.now.to_f
119
125
  Utils.print_progress(current, size, started_at)
120
126
  print "\n" unless UI.interactive?
@@ -140,6 +146,7 @@ module U3d
140
146
  def hashfile(file_path, blocksize: 65_536)
141
147
  require 'digest'
142
148
  raise ArgumentError, 'Not a file' unless File.file?(file_path)
149
+
143
150
  md5 = Digest::MD5.new
144
151
  File.open(file_path, 'r') do |f|
145
152
  md5 << f.read(blocksize) until f.eof?
@@ -155,9 +162,10 @@ module U3d
155
162
  if U3dCore::Helper.operating_system == :win
156
163
  yield
157
164
  else
158
- stat_command = if U3dCore::Helper.operating_system == :linux
165
+ stat_command = case U3dCore::Helper.operating_system
166
+ when :linux
159
167
  "stat -c \"%U,%a\" #{dir}"
160
- elsif U3dCore::Helper.operating_system == :mac
168
+ when :mac
161
169
  "stat -f \"%Su,%A\" #{dir}"
162
170
  end
163
171
  owner, access = U3dCore::CommandExecutor.execute(command: stat_command, admin: false).strip.split(',')
@@ -199,29 +207,87 @@ module U3d
199
207
  ver = UNITY_VERSION_REGEX.match(version)
200
208
  if ver.nil?
201
209
  raise ArgumentError, "Version (#{version}) does not match the Unity "\
202
- 'version format 0.0.0x0'
210
+ 'version format 0.0.0x0'
203
211
  end
204
212
  [ver[1], ver[2], ver[3], ver[4], ver[5]]
205
213
  end
206
214
 
207
215
  def windows_local_appdata
208
- require 'win32api'
216
+ require "fiddle"
209
217
 
218
+ shell32 = Fiddle.dlopen('shell32')
219
+ getdir = Fiddle::Function.new(shell32['SHGetFolderPath'], [Fiddle::TYPE_LONG, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP], Fiddle::TYPE_LONG)
210
220
  windir = ' ' * 261
211
-
212
- getdir = Win32API.new('shell32', 'SHGetFolderPath', 'LLLLP', 'L')
213
221
  result = getdir.call(0, CSIDL_LOCAL_APPDATA, 0, 0, windir)
222
+
214
223
  raise "Unable to get Local Appdata directory, returned with value #{result}" unless result.zero?
224
+
215
225
  windir.rstrip!
216
226
  windir = windir.encode("UTF-8", Encoding.find('filesystem'))
217
227
  windir = File.expand_path(windir.rstrip)
218
228
 
219
229
  return windir if Dir.exist? windir
230
+
220
231
  raise "Local Appdata retrieved (#{windir}) is not correct"
221
232
  end
222
233
 
234
+ def windows_fileversion(info_key, path)
235
+ require "fiddle"
236
+ version_dll = Fiddle.dlopen('version.dll')
237
+ kernel32 = Fiddle.dlopen('kernel32.dll')
238
+
239
+ get_file_version_info_size = Fiddle::Function.new(version_dll['GetFileVersionInfoSize'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_LONG)
240
+ get_file_version_info = Fiddle::Function.new(version_dll['GetFileVersionInfo'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) # FIXME: TYPE_INT => TYPE_LONG??
241
+ ver_query_value = Fiddle::Function.new(version_dll['VerQueryValue'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
242
+ rtl_move_memory = Fiddle::Function.new(kernel32['RtlMoveMemory'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG], Fiddle::TYPE_INT)
243
+
244
+ file = "#{path.tr('/', '\\')}\u0000"
245
+
246
+ s = [0].pack('L')
247
+ version_size = get_file_version_info_size.call(file, s)
248
+ raise StandardError if version_size.zero?
249
+
250
+ version_info = ' ' * version_size
251
+ version_ok = get_file_version_info.call(file, 0, version_size, version_info)
252
+ raise StandardError if version_ok.zero? # TODO: use GetLastError
253
+
254
+ # hack, giving up using VerQueryValue for now.
255
+ rstring = version_info.unpack('v*').map { |c| c.chr if c < 256 } * ''
256
+ r = /#{info_key}..(.*?)\000/.match(rstring)
257
+ # puts "#{info_key} = #{r ? r[1] : '??'}"
258
+ return r ? r[1] : nil
259
+
260
+ # rubocop:disable Lint/UnreachableCode
261
+ # hardcoding lang codepage
262
+ struct_path = "\\StringFileInfo\\040904b0\\#{info_key}"
263
+
264
+ addr = [0].pack('L')
265
+ size = [0].pack('L')
266
+ query_ok = ver_query_value.call(version_info, "#{struct_path}\u0000", addr, size)
267
+ raise StandardError if query_ok.zero?
268
+
269
+ raddr = addr.unpack1('L')
270
+ rsize = size.unpack1('L')
271
+
272
+ # this is not working right now, getting seg faults and other low level issues
273
+ puts "Size: #{raddr} #{rsize}"
274
+ fixed_info = Array.new(rsize, 0).pack('L*')
275
+ query_ok = rtl_move_memory.call(fixed_info, raddr, fixed_info.length)
276
+ raise StandardError if query_ok.zero?
277
+
278
+ info = fixed_info.unpack('L*')
279
+ file_version = [info[4], info[3], info[6], info[5]]
280
+ product_version = [info[8], info[7], info[10], info[9]]
281
+ [file_version, product_version]
282
+ # rubocop:enable Lint/UnreachableCode
283
+ rescue StandardError => e
284
+ UI.error("Failure to find '#{info_key}' under '#{path}': #{e}")
285
+ UI.error(e.backtrace)
286
+ nil
287
+ end
288
+
223
289
  def pretty_filesize(filesize)
224
- Filesize.from(filesize.round.to_s + ' B').pretty
290
+ Filesize.from("#{filesize.round} B").pretty
225
291
  end
226
292
 
227
293
  def windows_path(path)
@@ -252,11 +318,12 @@ module U3d
252
318
  private
253
319
 
254
320
  def http_max_retries
255
- ENV['U3D_HTTP_MAX_RETRIES'].to_i if ENV['U3D_HTTP_MAX_RETRIES']
321
+ ENV.fetch('U3D_HTTP_MAX_RETRIES', nil)&.to_i
256
322
  end
257
323
 
258
324
  def http_read_timeout
259
325
  return ENV['U3D_HTTP_READ_TIMEOUT'].to_i if ENV['U3D_HTTP_READ_TIMEOUT']
326
+
260
327
  300
261
328
  end
262
329
 
@@ -270,5 +337,5 @@ module U3d
270
337
  end
271
338
  end
272
339
  end
273
- # rubocop:enable ModuleLength
340
+ # rubocop:enable Metrics/ModuleLength
274
341
  end
data/lib/u3d/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Copyright (c) 2016-present WeWantToKnow AS
3
5
  #
@@ -21,11 +23,11 @@
21
23
  ## --- END LICENSE BLOCK ---
22
24
 
23
25
  module U3d
24
- VERSION = '1.2.3'.freeze
25
- DESCRIPTION = 'Provides numerous tools for installing, managing and running the Unity game engine from command line.'.freeze
26
+ VERSION = '1.3.0'
27
+ DESCRIPTION = 'Provides numerous tools for installing, managing and running the Unity game engine from command line.'
26
28
  UNITY_VERSIONS_NOTE = "Unity uses the following version formatting: 0.0.0x0. The \'x\' can takes different values:\n"\
27
- "\t. 'f' are the main release candidates for Unity\n"\
28
- "\t. 'p' are patches fixing those releases\n"\
29
- "\t. 'b' are the beta releases\n"\
30
- "\t. 'a' are the alpha releases (not currently discovered)\n".freeze
29
+ "\t. 'f' are the main release candidates for Unity\n"\
30
+ "\t. 'p' are patches fixing those releases\n"\
31
+ "\t. 'b' are the beta releases\n"\
32
+ "\t. 'a' are the alpha releases (not currently discovered)\n"
31
33
  end
data/lib/u3d.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Copyright (c) 2016-present WeWantToKnow AS
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -65,7 +67,7 @@ module U3dCore
65
67
  output_callback = proc do |line|
66
68
  # Prefix the current line with a string
67
69
  prefix.each do |element|
68
- line = element[:prefix] + line if element[:block] && element[:block].call(line)
70
+ line = element[:prefix] + line if element[:block]&.call(line)
69
71
  end
70
72
  UI.command_output(line)
71
73
  end
@@ -97,27 +99,28 @@ module U3dCore
97
99
  line = l.strip # strip so that \n gets removed
98
100
  output << line
99
101
 
100
- output_callback.call(l) if output_callback
102
+ output_callback&.call(l)
101
103
  end
102
104
  end
103
105
  raise "Exit status: #{status}".red if !status.nil? && status.nonzero?
104
- rescue StandardError => ex
106
+ rescue StandardError => e
105
107
  # This could happen
106
108
  # * if the status is failed
107
109
  # * when the environment is wrong:
108
110
  # > invalid byte sequence in US-ASCII (ArgumentError)
109
- output << ex.to_s
111
+ output << e.to_s
110
112
  o = output.join("\n")
111
113
  UI.verbose o
112
- raise ex unless error_callback
114
+ raise e unless error_callback
115
+
113
116
  error_callback.call(o, nil)
114
117
  end
115
118
  return output.join("\n")
116
119
  end
117
120
 
118
- # rubocop:disable PredicateName,PerceivedComplexity
121
+ # rubocop:disable Naming/PredicateName
119
122
  def has_admin_privileges?(retry_count: 2)
120
- # rubocop:enable PredicateName,PerceivedComplexity
123
+ # rubocop:enable Naming/PredicateName
121
124
  if Helper.windows?
122
125
  begin
123
126
  result = system_no_output('reg query HKU\\S-1-5-19')
@@ -152,6 +155,7 @@ module U3dCore
152
155
  unless env_username == "root"
153
156
  cred = U3dCore::Credentials.new(user: env_username)
154
157
  raise CredentialsError, "The command \'#{command}\' must be run with admin privileges" unless has_admin_privileges?
158
+
155
159
  command = "sudo -k && echo #{cred.password.shellescape} | sudo -S bash -c \"#{command}\""
156
160
  end
157
161
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -36,6 +38,7 @@ module U3dCore
36
38
  def select_runner_impl
37
39
  # disable PTY by setting env variable
38
40
  return U3dCore::SafePopen.method(:spawn) unless ENV['U3D_NO_TTY'].nil?
41
+
39
42
  begin
40
43
  require 'pty'
41
44
  return U3dCore::SafePty.method(:spawn)
@@ -55,25 +58,20 @@ module U3dCore
55
58
  def self.spawn(command, &_block)
56
59
  require 'pty'
57
60
  PTY.spawn(command) do |r, w, p|
61
+ trap('INT') do
62
+ Process.kill("INT", p)
63
+ end
64
+ yield r, w, p
65
+ # if the process has closed, ruby might raise an exception if we try
66
+ # to do I/O on a closed stream. This behavior is platform specific
67
+ rescue Errno::EIO
68
+ ensure
58
69
  begin
59
- trap('INT') do
60
- Process.kill("INT", p)
61
- end
62
- yield r, w, p
63
- # if the process has closed, ruby might raise an exception if we try
64
- # to do I/O on a closed stream. This behavior is platform specific
65
- # rubocop:disable HandleExceptions
66
- rescue Errno::EIO
67
- # rubocop:enable HandleExceptions
68
- ensure
69
- begin
70
- Process.wait p
71
- # The process might have exited.
72
- # This behavior is also ruby version dependent.
73
- # rubocop:disable HandleExceptions
74
- rescue Errno::ECHILD, PTY::ChildExited
75
- end
76
- # rubocop:enable HandleExceptions
70
+ Process.wait p
71
+ # The process might have exited.
72
+ # This behavior is also ruby version dependent.
73
+ rescue Errno::ECHILD, PTY::ChildExited
74
+ # do nothing
77
75
  end
78
76
  end
79
77
  $CHILD_STATUS.exitstatus
@@ -88,7 +86,7 @@ module U3dCore
88
86
  def self.spawn(command, &_block)
89
87
  require 'open3'
90
88
  Open3.popen2e(command) do |r, w, p|
91
- yield w, r, p.value.pid # note the inversion
89
+ yield w, r, p.value.pid # NOTE: the inversion
92
90
 
93
91
  r.close
94
92
  w.close
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Copyright (c) 2017-present WeWantToKnow AS
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Copyright (c) 2017-present WeWantToKnow AS
3
5
  #
@@ -26,6 +28,7 @@ module CoreExtensions
26
28
  return 'Windows' if self == :win
27
29
  return 'Mac OSX' if self == :mac
28
30
  return 'Linux' if self == :linux
31
+
29
32
  raise "Not a known operating system symbol #{self}"
30
33
  end
31
34
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Copyright (c) 2016-present WeWantToKnow AS
3
5
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -26,7 +28,7 @@ require 'security'
26
28
 
27
29
  module U3dCore
28
30
  class Credentials
29
- MAC_U3D_SERVER = 'u3d'.freeze
31
+ MAC_U3D_SERVER = 'u3d'
30
32
  def initialize(user: nil, password: nil)
31
33
  @user = user
32
34
  @password = password
@@ -39,6 +41,7 @@ module U3dCore
39
41
  while @user.to_s.empty?
40
42
  UI.verbose 'Username does not exist or is empty'
41
43
  raise CredentialsError, 'Username missing and context is not interactive. Please check that the environment variable is correct' unless UI.interactive?
44
+
42
45
  @user = UI.input 'Username for u3d:'
43
46
  end
44
47
 
@@ -48,12 +51,10 @@ module U3dCore
48
51
  def password
49
52
  @password ||= ENV['U3D_PASSWORD']
50
53
 
51
- if Helper.mac? && @use_keychain
52
- unless @password
53
- UI.message 'Fetching password from keychain'
54
- password_holder = Security::InternetPassword.find(server: server_name)
55
- @password = password_holder.password unless password_holder.nil?
56
- end
54
+ if Helper.mac? && @use_keychain && !@password
55
+ UI.message 'Fetching password from keychain'
56
+ password_holder = Security::InternetPassword.find(server: server_name)
57
+ @password = password_holder.password unless password_holder.nil?
57
58
  end
58
59
 
59
60
  if @password.nil?
@@ -76,6 +77,7 @@ module U3dCore
76
77
  while @password.nil?
77
78
  UI.verbose 'Password does not exist'
78
79
  raise CredentialsError, 'Password missing and context is not interactive. Please make sure it is correct' unless UI.interactive?
80
+
79
81
  @password = UI.password "Password for #{user}:"
80
82
  end
81
83
 
data/lib/u3d_core/env.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2019-present WeWantToKnow AS
@@ -26,6 +28,7 @@ module U3dCore
26
28
  def self.truthy?(env)
27
29
  return false unless ENV[env]
28
30
  return false if %w[no false off 0].include?(ENV[env].to_s)
31
+
29
32
  return true
30
33
  end
31
34
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -52,13 +54,14 @@ module U3dCore
52
54
  end
53
55
 
54
56
  def method_missing(method_sym, *arguments, &block)
55
- if method_sym.to_s =~ /^with_(.*)$/
57
+ case method_sym.to_s
58
+ when /^with_(.*)$/
56
59
  if attributes.include? Regexp.last_match(1)
57
60
  with(Regexp.last_match(1).to_sym, arguments.first, &block)
58
61
  else
59
62
  super
60
63
  end
61
- elsif method_sym.to_s =~ /^(.*)\?$/
64
+ when /^(.*)\?$/
62
65
  if attributes.include? Regexp.last_match(1)
63
66
  is?(Regexp.last_match(1).to_sym)
64
67
  else
@@ -70,15 +73,12 @@ module U3dCore
70
73
  end
71
74
 
72
75
  def respond_to_missing?(method_sym, include_private = false)
73
- # rubocop:disable GuardClause
74
- if method_sym.to_s =~ /^with_(.*)$/
75
- return attributes.include? Regexp.last_match(1)
76
- elsif method_sym.to_s =~ /^(.*)\?$/
76
+ case method_sym.to_s
77
+ when /^with_(.*)$/ || /^(.*)\?$/
77
78
  return attributes.include? Regexp.last_match(1)
78
79
  else
79
80
  super
80
81
  end
81
- # rubocop:enable GuardClause
82
82
  end
83
83
  end
84
84
  private_class_method :is?, :with, :attributes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -42,7 +44,7 @@ module U3dCore
42
44
  end
43
45
 
44
46
  def self.windows_path(path)
45
- path.gsub(%r{\/(\d)}, '/\\\\\1').tr('/', '\\')
47
+ path.gsub(%r{/(\d)}, '/\\\\\1').tr('/', '\\')
46
48
  end
47
49
 
48
50
  # Runs a given command using backticks (`)
@@ -95,6 +97,7 @@ module U3dCore
95
97
  # taken from: https://github.com/Microsoft/BashOnWindows/issues/423#issuecomment-221627364
96
98
  proc_version = '/proc/version'
97
99
  return false unless File.exist? proc_version
100
+
98
101
  File.open(proc_version, 'r') do |f|
99
102
  return !(/Microsof|WSL/ =~ f.read).nil?
100
103
  end
@@ -112,7 +115,7 @@ module U3dCore
112
115
 
113
116
  # the current operating system
114
117
  def self.operating_system
115
- # rubocop:disable GuardClause
118
+ # rubocop:disable Style/GuardClause
116
119
  if linux?
117
120
  return :linux
118
121
  elsif mac?
@@ -122,7 +125,7 @@ module U3dCore
122
125
  else
123
126
  raise 'Could not assume what OS you\'re running, please specify it as much as possible'
124
127
  end
125
- # rubocop:enable GuardClause
128
+ # rubocop:enable Style/GuardClause
126
129
  end
127
130
 
128
131
  def self.win_64?
@@ -153,5 +156,4 @@ module U3dCore
153
156
  # return ENV["FL_BUILDLOG_PATH"] || "~/Library/Logs"
154
157
  # end
155
158
  end
156
- # rubocop:enable Metrics/ModuleLength
157
159
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -27,6 +29,7 @@ module U3dCore
27
29
  class Shell < Interface
28
30
  # test_log_buffer: by default, don't show any logs when running tests
29
31
  def initialize(test_log_buffer: nil)
32
+ super()
30
33
  @test_log_buffer = test_log_buffer
31
34
  end
32
35
 
@@ -52,16 +55,15 @@ module U3dCore
52
55
 
53
56
  class EPipeIgnorerLogDevice < Logger::LogDevice
54
57
  def initialize(logdev)
58
+ super
55
59
  @logdev = logdev
56
60
  end
57
61
 
58
- # rubocop:disable HandleExceptions
59
62
  def write(message)
60
63
  @logdev.write(message)
61
64
  rescue Errno::EPIPE
62
65
  # ignored
63
66
  end
64
- # rubocop:enable HandleExceptions
65
67
  end
66
68
 
67
69
  def format_string(datetime = Time.now, severity = "")
@@ -79,7 +81,7 @@ module U3dCore
79
81
  s = []
80
82
  s << "#{severity} " if U3dCore::Globals.verbose? && severity && !severity.empty?
81
83
  s << "[#{datetime.strftime(timestamp)}] " if timestamp
82
- s.join('')
84
+ s.join
83
85
  end
84
86
 
85
87
  #####################################################
@@ -114,7 +116,7 @@ module U3dCore
114
116
  actual = (message.split("\r").last || "") # as clearing the line will remove the `>` and the time stamp
115
117
  actual.split("\n").each do |msg|
116
118
  prefix = msg.include?("▸") ? "" : "▸ "
117
- log.info(prefix + "" + msg.magenta)
119
+ log.info("#{prefix}#{msg.magenta}")
118
120
  end
119
121
  end
120
122
 
@@ -125,7 +127,7 @@ module U3dCore
125
127
  def header(message)
126
128
  i = message.length + 8
127
129
  success("-" * i)
128
- success("--- " + message + " ---")
130
+ success("--- #{message} ---")
129
131
  success("-" * i)
130
132
  end
131
133
 
@@ -167,6 +169,7 @@ module U3dCore
167
169
 
168
170
  def verify_interactive!(message)
169
171
  return if interactive?
172
+
170
173
  important(message)
171
174
  crash!("Could not retrieve response as u3d runs in non-interactive mode")
172
175
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -143,6 +145,7 @@ module U3dCore
143
145
  attr_reader :show_github_issues
144
146
 
145
147
  def initialize(show_github_issues: false)
148
+ super
146
149
  @show_github_issues = show_github_issues
147
150
  end
148
151
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2016-present WeWantToKnow AS
@@ -30,22 +32,21 @@ module U3dCore
30
32
 
31
33
  attr_writer :current
32
34
  end
33
-
34
- # rubocop:disable Style/MethodMissing
35
+ # rubocop:disable Style/MissingRespondToMissing
35
36
  def self.method_missing(method_sym, *args, &_block)
37
+ # rubocop:enable Style/MissingRespondToMissing
36
38
  # not using `responds` because we don't care about methods like .to_s and so on
37
39
  interface_methods = Interface.instance_methods - Object.instance_methods
38
40
  UI.user_error!("Unknown method '#{method_sym}', supported #{interface_methods}") unless interface_methods.include?(method_sym)
39
41
 
40
42
  current.send(method_sym, *args)
41
43
  end
42
- # rubocop:enable Style/MethodMissing
43
44
  end
44
45
  end
45
46
 
46
47
  require 'u3d_core/ui/interface'
47
48
 
48
49
  # Import all available implementations
49
- Dir[File.expand_path('implementations/*.rb', File.dirname(__FILE__))].each do |file|
50
+ Dir[File.expand_path('implementations/*.rb', File.dirname(__FILE__))].sort.each do |file|
50
51
  require file
51
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ## --- BEGIN LICENSE BLOCK ---
2
4
  # Original work Copyright (c) 2015-present the fastlane authors
3
5
  # Modified work Copyright 2019-present WeWantToKnow AS
@@ -31,12 +33,14 @@ module U3dCore
31
33
 
32
34
  releases(gem_name).each_with_index do |release, index|
33
35
  next unless Gem::Version.new(to_version(release['tag_name'])) > Gem::Version.new(current_version)
36
+
34
37
  puts("")
35
38
  puts(release['name'].green)
36
39
  puts(release['body'])
37
40
  did_show_changelog = true
38
41
 
39
42
  next unless index == 2
43
+
40
44
  puts("")
41
45
  puts("To see all new releases, open https://github.com/DragonBox/#{gem_name}/releases".green)
42
46
  break