u3d 1.2.3 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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