u3d 1.0.12 → 1.0.13
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.
- checksums.yaml +4 -4
- data/.github_changelog_generator +1 -1
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +19 -1
- data/DEVELOPMENT_PROCESS.md +10 -0
- data/Gemfile.lock +13 -14
- data/config/log_rules.json +53 -5
- data/fastlane-plugin-u3d/lib/fastlane/plugin/u3d/version.rb +1 -1
- data/lib/u3d/cache.rb +49 -25
- data/lib/u3d/commands.rb +23 -26
- data/lib/u3d/commands_generator.rb +6 -9
- data/lib/u3d/downloader.rb +8 -3
- data/lib/u3d/iniparser.rb +1 -1
- data/lib/u3d/installer.rb +15 -17
- data/lib/u3d/log_analyzer.rb +2 -6
- data/lib/u3d/unity_runner.rb +1 -1
- data/lib/u3d/unity_version_definition.rb +1 -1
- data/lib/u3d/unity_versions.rb +2 -2
- data/lib/u3d/version.rb +1 -1
- data/lib/u3d_core/command_executor.rb +3 -3
- data/lib/u3d_core/core_ext/hash.rb +30 -0
- data/lib/u3d_core/core_ext/operating_system_symbol.rb +33 -0
- data/lib/u3d_core/ui/disable_colors.rb +2 -2
- data/lib/u3d_core/ui/implementations/shell.rb +1 -3
- data/u3d.gemspec +9 -11
- metadata +72 -70
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 921e48e10c0e312b264724db1e4e8e995580150c
|
|
4
|
+
data.tar.gz: 65c8c9f9452e8a0ee9d8828301a17bc6cdbe114d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 420bae13d8ce41a64ee1b7cbef71e0083af60a6e31c0335ceae7f4fcbe42c74fd34cfe3bf535a49fc891dac7e12293db181e641b46003e79cc0c7db59eb5d76e
|
|
7
|
+
data.tar.gz: ca63925ef15a674149e5566f7afcc47b93e9c3782f22efe3e19febd2e8054100e9e5d44bd4c9ab3a5940651c87ec072099c63c5dc841507507314305d66e208f
|
data/.github_changelog_generator
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## [v1.0.13](https://github.com/DragonBox/u3d/tree/v1.0.13) (2018-01-09)
|
|
4
|
+
[Full Changelog](https://github.com/DragonBox/u3d/compare/v1.0.12...v1.0.13)
|
|
5
|
+
|
|
6
|
+
**Implemented enhancements:**
|
|
7
|
+
|
|
8
|
+
- u3d/install: allow to specify packages download directory [\#213](https://github.com/DragonBox/u3d/issues/213)
|
|
9
|
+
- u3d/available: fetch versions data from a central repository, speeding up identification of available releases [\#142](https://github.com/DragonBox/u3d/issues/142)
|
|
10
|
+
- u3d/available: introduce a central cache \(fixes \#142\) [\#217](https://github.com/DragonBox/u3d/pull/217) ([lacostej](https://github.com/lacostej))
|
|
11
|
+
- u3d/available: allow to match using regular expression [\#216](https://github.com/DragonBox/u3d/pull/216) ([lacostej](https://github.com/lacostej))
|
|
12
|
+
- u3d/install: allow to specify packages download directory using an environment variable [\#214](https://github.com/DragonBox/u3d/pull/214) ([niezbop](https://github.com/niezbop))
|
|
13
|
+
- u3d/prettify: remove Jenkins rules [\#211](https://github.com/DragonBox/u3d/pull/211) ([niezbop](https://github.com/niezbop))
|
|
14
|
+
- u3d/prettify: update ruleset with LICENSE SYSTEM rules [\#210](https://github.com/DragonBox/u3d/pull/210) ([niezbop](https://github.com/niezbop))
|
|
15
|
+
|
|
16
|
+
**Merged pull requests:**
|
|
17
|
+
|
|
18
|
+
- Rubocop 0.52.1 workaround. Fixed in rubocop master [\#218](https://github.com/DragonBox/u3d/pull/218) ([lacostej](https://github.com/lacostej))
|
|
19
|
+
- u3d/internals: a serie of cache related refactors [\#215](https://github.com/DragonBox/u3d/pull/215) ([lacostej](https://github.com/lacostej))
|
|
20
|
+
- Update to latest rubocop [\#212](https://github.com/DragonBox/u3d/pull/212) ([lacostej](https://github.com/lacostej))
|
|
21
|
+
|
|
3
22
|
## [v1.0.12](https://github.com/DragonBox/u3d/tree/v1.0.12) (2018-01-03)
|
|
4
23
|
[Full Changelog](https://github.com/DragonBox/u3d/compare/v1.0.11...v1.0.12)
|
|
5
24
|
|
|
@@ -28,7 +47,6 @@
|
|
|
28
47
|
|
|
29
48
|
**Merged pull requests:**
|
|
30
49
|
|
|
31
|
-
- Preparing release for 1.0.11 [\#192](https://github.com/DragonBox/u3d/pull/192) ([lacostej](https://github.com/lacostej))
|
|
32
50
|
- doc: explain CI setup with jenkins [\#191](https://github.com/DragonBox/u3d/pull/191) ([lacostej](https://github.com/lacostej))
|
|
33
51
|
- u3d/run: fail with a proper message when opening a Unity4 project [\#187](https://github.com/DragonBox/u3d/pull/187) ([lacostej](https://github.com/lacostej))
|
|
34
52
|
|
data/DEVELOPMENT_PROCESS.md
CHANGED
|
@@ -9,3 +9,13 @@
|
|
|
9
9
|
`rake release`
|
|
10
10
|
|
|
11
11
|
`rake bump`
|
|
12
|
+
|
|
13
|
+
= release of the fastlane plugin
|
|
14
|
+
|
|
15
|
+
`cd fastlane-plugin-u3d`
|
|
16
|
+
|
|
17
|
+
bump the version in `lib/fastlane/plugin/u3d/version.rb`
|
|
18
|
+
|
|
19
|
+
`bundle exec rake release`
|
|
20
|
+
|
|
21
|
+
see https://docs.fastlane.tools/plugins/create-plugin/#rubygems
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
u3d (1.0.
|
|
4
|
+
u3d (1.0.13)
|
|
5
5
|
colored (>= 1.2, < 2.0.0)
|
|
6
6
|
commander (>= 4.4.0, < 5.0.0)
|
|
7
7
|
file-tail (>= 1.2.0)
|
|
@@ -50,7 +50,7 @@ GEM
|
|
|
50
50
|
rainbow (>= 2.1)
|
|
51
51
|
rake (>= 10.0)
|
|
52
52
|
retriable (~> 2.1)
|
|
53
|
-
highline (1.7.
|
|
53
|
+
highline (1.7.10)
|
|
54
54
|
i18n (0.8.6)
|
|
55
55
|
inifile (3.0.0)
|
|
56
56
|
json (2.1.0)
|
|
@@ -60,18 +60,17 @@ GEM
|
|
|
60
60
|
multipart-post (2.0.0)
|
|
61
61
|
octokit (4.7.0)
|
|
62
62
|
sawyer (~> 0.8.0, >= 0.5.3)
|
|
63
|
-
parallel (1.12.
|
|
64
|
-
parser (2.4.0.
|
|
65
|
-
ast (~> 2.
|
|
66
|
-
plist (3.
|
|
63
|
+
parallel (1.12.1)
|
|
64
|
+
parser (2.4.0.2)
|
|
65
|
+
ast (~> 2.3)
|
|
66
|
+
plist (3.4.0)
|
|
67
67
|
powerpack (0.1.1)
|
|
68
68
|
pry (0.10.4)
|
|
69
69
|
coderay (~> 1.1.0)
|
|
70
70
|
method_source (~> 0.8.1)
|
|
71
71
|
slop (~> 3.4)
|
|
72
72
|
public_suffix (2.0.5)
|
|
73
|
-
rainbow (
|
|
74
|
-
rake
|
|
73
|
+
rainbow (3.0.0)
|
|
75
74
|
rake (10.5.0)
|
|
76
75
|
retriable (2.1.0)
|
|
77
76
|
rspec (3.1.0)
|
|
@@ -89,14 +88,14 @@ GEM
|
|
|
89
88
|
rspec_junit_formatter (0.2.3)
|
|
90
89
|
builder (< 4)
|
|
91
90
|
rspec-core (>= 2, < 4, != 2.12.0)
|
|
92
|
-
rubocop (0.
|
|
91
|
+
rubocop (0.52.1)
|
|
93
92
|
parallel (~> 1.10)
|
|
94
|
-
parser (>= 2.
|
|
93
|
+
parser (>= 2.4.0.2, < 3.0)
|
|
95
94
|
powerpack (~> 0.1)
|
|
96
|
-
rainbow (>=
|
|
95
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
97
96
|
ruby-progressbar (~> 1.7)
|
|
98
97
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
99
|
-
ruby-progressbar (1.
|
|
98
|
+
ruby-progressbar (1.9.0)
|
|
100
99
|
sawyer (0.8.1)
|
|
101
100
|
addressable (>= 2.3.5, < 2.6)
|
|
102
101
|
faraday (~> 0.8, < 1.0)
|
|
@@ -129,8 +128,8 @@ DEPENDENCIES
|
|
|
129
128
|
rake (~> 10.0)
|
|
130
129
|
rspec (~> 3.1.0)
|
|
131
130
|
rspec_junit_formatter (~> 0.2.3)
|
|
132
|
-
rubocop (~> 0.
|
|
131
|
+
rubocop (~> 0.52.1)
|
|
133
132
|
u3d!
|
|
134
133
|
|
|
135
134
|
BUNDLED WITH
|
|
136
|
-
1.16.
|
|
135
|
+
1.16.1
|
data/config/log_rules.json
CHANGED
|
@@ -137,15 +137,63 @@
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
},
|
|
140
|
-
"
|
|
140
|
+
"LICENSE": {
|
|
141
141
|
"active": true,
|
|
142
142
|
"silent": false,
|
|
143
|
-
"comment": "
|
|
144
|
-
"phase_start_pattern": "
|
|
143
|
+
"comment": "Unity license system logic",
|
|
144
|
+
"phase_start_pattern": "LICENSE SYSTEM",
|
|
145
145
|
"rules": {
|
|
146
|
-
"
|
|
146
|
+
"next_check": {
|
|
147
147
|
"active": true,
|
|
148
|
-
"start_pattern": "
|
|
148
|
+
"start_pattern": "LICENSE SYSTEM \\[.*\\] Next license update check is after (?<date>[\\d\\-]+)T(?<time>[\\d+\\:]+)",
|
|
149
|
+
"start_message": "Next update check after %{date} at %{time}"
|
|
150
|
+
},
|
|
151
|
+
"opening": {
|
|
152
|
+
"active": true,
|
|
153
|
+
"start_pattern": "LICENSE SYSTEM \\[.*\\] Opening (?<address>.*)$",
|
|
154
|
+
"start_message": "Opening %{address}",
|
|
155
|
+
"store_lines": false,
|
|
156
|
+
"end_pattern": "(?:\\[CEF\\]|LICENSE SYSTEM \\[.*\\] Received)",
|
|
157
|
+
"end_message": false
|
|
158
|
+
},
|
|
159
|
+
"received": {
|
|
160
|
+
"active": true,
|
|
161
|
+
"start_pattern": "LICENSE SYSTEM \\[.*\\] Received (?<address>.*)$",
|
|
162
|
+
"start_message": "Received %{address}",
|
|
163
|
+
"store_lines": false,
|
|
164
|
+
"end_pattern": "(?:\\[CEF\\]|LICENSE SYSTEM \\[.*\\] (?!Headers)|Cancelling)",
|
|
165
|
+
"end_message": false
|
|
166
|
+
},
|
|
167
|
+
"cef_undefined": {
|
|
168
|
+
"active": true,
|
|
169
|
+
"start_pattern": "\\[CEF\\] undefined in.*$",
|
|
170
|
+
"type": "warning"
|
|
171
|
+
},
|
|
172
|
+
"error": {
|
|
173
|
+
"active": true,
|
|
174
|
+
"start_pattern": "LICENSE SYSTEM \\[.*\\] (?<message>Error.*)",
|
|
175
|
+
"start_message": "%{message}",
|
|
176
|
+
"store_lines": true,
|
|
177
|
+
"end_pattern": "(?:^\\n|\\[CEF\\] undefined)",
|
|
178
|
+
"end_message": false,
|
|
179
|
+
"type": "error"
|
|
180
|
+
},
|
|
181
|
+
"timeout": {
|
|
182
|
+
"active": true,
|
|
183
|
+
"start_pattern": "Cancelling.*Timeout",
|
|
184
|
+
"start_message": "Timeout while trying to activate license. Please try again later or contact support@unity3d.com",
|
|
185
|
+
"type": "error"
|
|
186
|
+
},
|
|
187
|
+
"starting_activation": {
|
|
188
|
+
"active": true,
|
|
189
|
+
"start_pattern": "LICENSE SYSTEM \\[.*\\] Starting license activation with account (?<account>.*)$",
|
|
190
|
+
"start_message": "Starting license activation for account %{account}"
|
|
191
|
+
},
|
|
192
|
+
"successful_activation": {
|
|
193
|
+
"active": true,
|
|
194
|
+
"start_pattern": "LICENSE SYSTEM \\[.*\\] License activated successfully with user: (?<account>.*)$",
|
|
195
|
+
"start_message": "License activated for account %{account}",
|
|
196
|
+
"type": "success"
|
|
149
197
|
}
|
|
150
198
|
}
|
|
151
199
|
},
|
data/lib/u3d/cache.rb
CHANGED
|
@@ -22,12 +22,15 @@
|
|
|
22
22
|
|
|
23
23
|
require 'json'
|
|
24
24
|
require 'time'
|
|
25
|
+
require 'u3d_core/core_ext/operating_system_symbol'
|
|
25
26
|
require 'u3d/unity_versions'
|
|
26
27
|
require 'u3d/utils'
|
|
27
28
|
|
|
28
29
|
module U3d
|
|
29
30
|
# Cache stores the informations regarding versions
|
|
30
31
|
class Cache
|
|
32
|
+
using ::CoreExtensions::OperatingSystem
|
|
33
|
+
|
|
31
34
|
# Path to the directory containing the cache for the different OS
|
|
32
35
|
DEFAULT_LINUX_PATH = File.join(ENV['HOME'], '.u3d').freeze
|
|
33
36
|
DEFAULT_MAC_PATH = File.join(ENV['HOME'], 'Library', 'Application Support', 'u3d').freeze
|
|
@@ -38,6 +41,8 @@ module U3d
|
|
|
38
41
|
# Currently set to 24h
|
|
39
42
|
CACHE_LIFE = 60 * 60 * 24
|
|
40
43
|
|
|
44
|
+
GLOBAL_CACHE_URL = 'https://dragonbox.github.io/unities/v1/versions.json'.freeze
|
|
45
|
+
|
|
41
46
|
private
|
|
42
47
|
|
|
43
48
|
attr_accessor :cache
|
|
@@ -51,9 +56,9 @@ module U3d
|
|
|
51
56
|
@cache[key]
|
|
52
57
|
end
|
|
53
58
|
|
|
54
|
-
def initialize(path: nil, force_os: nil, force_refresh: false, offline: false)
|
|
59
|
+
def initialize(path: nil, force_os: nil, force_refresh: false, offline: false, central_cache: false)
|
|
55
60
|
raise "Cache: cannot specify both offline and force_refresh" if offline && force_refresh
|
|
56
|
-
@path = path ||
|
|
61
|
+
@path = path || Cache.default_os_path
|
|
57
62
|
@cache = {}
|
|
58
63
|
os = force_os || U3dCore::Helper.operating_system
|
|
59
64
|
Utils.ensure_dir(@path)
|
|
@@ -64,7 +69,18 @@ module U3d
|
|
|
64
69
|
need_update = false
|
|
65
70
|
end
|
|
66
71
|
@cache = data
|
|
67
|
-
overwrite_cache(file_path, os) if need_update || force_refresh
|
|
72
|
+
overwrite_cache(file_path, os, central_cache: central_cache) if need_update || force_refresh
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.default_os_path
|
|
76
|
+
case U3dCore::Helper.operating_system
|
|
77
|
+
when :linux
|
|
78
|
+
DEFAULT_LINUX_PATH
|
|
79
|
+
when :mac
|
|
80
|
+
DEFAULT_MAC_PATH
|
|
81
|
+
when :win
|
|
82
|
+
DEFAULT_WINDOWS_PATH
|
|
83
|
+
end
|
|
68
84
|
end
|
|
69
85
|
|
|
70
86
|
private #-------------------------------------------------------------------
|
|
@@ -87,39 +103,47 @@ module U3d
|
|
|
87
103
|
UI.error 'Failed to open cache.json: ' + file_error.to_s
|
|
88
104
|
need_update = true
|
|
89
105
|
else
|
|
90
|
-
need_update = data
|
|
91
|
-
|| data[os.id2name]['lastupdate'].nil?\
|
|
92
|
-
|| (Time.now.to_i - data[os.id2name]['lastupdate'] > CACHE_LIFE)\
|
|
93
|
-
|| (data[os.id2name]['versions'] || []).empty?
|
|
106
|
+
need_update = os_data_need_update?(data, os)
|
|
94
107
|
data[os.id2name] = nil if need_update
|
|
95
108
|
end
|
|
96
109
|
end
|
|
97
110
|
return need_update, data
|
|
98
111
|
end
|
|
99
112
|
|
|
113
|
+
def os_data_need_update?(data, os)
|
|
114
|
+
data[os.id2name].nil?\
|
|
115
|
+
|| data[os.id2name]['lastupdate'].nil?\
|
|
116
|
+
|| (Time.now.to_i - data[os.id2name]['lastupdate'] > CACHE_LIFE)\
|
|
117
|
+
|| (data[os.id2name]['versions'] || []).empty?
|
|
118
|
+
end
|
|
119
|
+
|
|
100
120
|
# Updates cache by retrieving versions with U3d::Downloader
|
|
101
|
-
def overwrite_cache(file_path, os)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
platform = 'Linux' if os == :linux
|
|
105
|
-
UI.important "Cache is out of date. Updating cache for #{platform}"
|
|
106
|
-
@cache ||= {}
|
|
107
|
-
@cache[os.id2name] = {}
|
|
108
|
-
@cache[os.id2name]['lastupdate'] = Time.now.to_i
|
|
109
|
-
@cache[os.id2name]['versions'] = UnityVersions.list_available(os: os)
|
|
121
|
+
def overwrite_cache(file_path, os, central_cache: false)
|
|
122
|
+
update_cache(os) unless central_cache && fetch_central_cache(os)
|
|
123
|
+
|
|
110
124
|
File.delete(file_path) if File.file?(file_path)
|
|
111
125
|
File.open(file_path, 'w') { |f| f.write(@cache.to_json) }
|
|
112
126
|
end
|
|
113
127
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
128
|
+
# Fetches central versions.json. Ignore it if it is too old
|
|
129
|
+
def fetch_central_cache(os)
|
|
130
|
+
UI.message("Fetching central 'versions.json' cache")
|
|
131
|
+
data = JSON.parse(Utils.get_ssl(GLOBAL_CACHE_URL))
|
|
132
|
+
need_update = os_data_need_update?(data, os)
|
|
133
|
+
@cache = data unless need_update
|
|
134
|
+
!need_update
|
|
135
|
+
rescue StandardError => e
|
|
136
|
+
UI.error("Failed fetching central versions.json. Manual fetch for platform #{os} #{e}")
|
|
137
|
+
false
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def update_cache(os)
|
|
141
|
+
UI.important "Cache is out of date. Updating cache for #{os.human_name}"
|
|
142
|
+
|
|
143
|
+
@cache ||= {}
|
|
144
|
+
@cache[os.id2name] = {}
|
|
145
|
+
@cache[os.id2name]['lastupdate'] = Time.now.to_i
|
|
146
|
+
@cache[os.id2name]['versions'] = UnityVersions.list_available(os: os)
|
|
123
147
|
end
|
|
124
148
|
end
|
|
125
149
|
end
|
data/lib/u3d/commands.rb
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
# SOFTWARE.
|
|
21
21
|
## --- END LICENSE BLOCK ---
|
|
22
22
|
|
|
23
|
+
require 'u3d_core/core_ext/hash'
|
|
23
24
|
require 'u3d/compatibility'
|
|
24
25
|
require 'u3d/unity_versions'
|
|
25
26
|
require 'u3d/unity_version_definition'
|
|
@@ -38,6 +39,8 @@ module U3d
|
|
|
38
39
|
# API for U3d, redirecting calls to class they concern
|
|
39
40
|
# rubocop:disable ClassLength
|
|
40
41
|
class Commands
|
|
42
|
+
using ::CoreExtensions::Extractable
|
|
43
|
+
|
|
41
44
|
class << self
|
|
42
45
|
def list_installed(options: {})
|
|
43
46
|
list = Installer.create.installed
|
|
@@ -65,17 +68,15 @@ module U3d
|
|
|
65
68
|
ver = options[:unity_version]
|
|
66
69
|
os = valid_os_or_current(options[:operating_system])
|
|
67
70
|
rl = options[:release_level]
|
|
68
|
-
cache = Cache.new(force_os: os, force_refresh: options[:force])
|
|
69
71
|
|
|
70
|
-
|
|
72
|
+
cache_versions = cache_versions(os, force_refresh: options[:force])
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
end
|
|
74
|
+
if ver
|
|
75
|
+
cache_versions = cache_versions.extract(*cache_versions.keys.select { |k| Regexp.new(ver).match(k) })
|
|
76
|
+
return UI.error "Version #{ver} doesn't match any in cache" if cache_versions.empty?
|
|
77
|
+
end
|
|
77
78
|
|
|
78
|
-
vcomparators =
|
|
79
|
+
vcomparators = cache_versions.keys.map { |k| UnityVersionComparator.new(k) }
|
|
79
80
|
if rl
|
|
80
81
|
letter = release_letter_mapping["latest_#{rl}".to_sym]
|
|
81
82
|
UI.message "Filtering available versions with release level '#{rl}' [letter '#{letter}']"
|
|
@@ -84,28 +85,21 @@ module U3d
|
|
|
84
85
|
sorted_keys = vcomparators.sort.map { |v| v.version.to_s }
|
|
85
86
|
|
|
86
87
|
sorted_keys.each do |k|
|
|
87
|
-
v =
|
|
88
|
+
v = cache_versions[k]
|
|
88
89
|
UI.message "Version #{k}: " + v.to_s.cyan.underline
|
|
89
90
|
next unless options[:packages]
|
|
90
91
|
inif = nil
|
|
91
92
|
begin
|
|
92
|
-
inif = U3d::INIparser.load_ini(k,
|
|
93
|
-
rescue => e
|
|
93
|
+
inif = U3d::INIparser.load_ini(k, cache_versions, os: os)
|
|
94
|
+
rescue StandardError => e
|
|
94
95
|
UI.error "Could not load packages for this version (#{e})"
|
|
95
96
|
else
|
|
96
97
|
UI.message 'Packages:'
|
|
97
|
-
inif.
|
|
98
|
+
inif.each_key { |pack| UI.message " - #{pack}" }
|
|
98
99
|
end
|
|
99
100
|
end
|
|
100
101
|
end
|
|
101
102
|
|
|
102
|
-
def cache_versions(os, offline: false)
|
|
103
|
-
cache = Cache.new(force_os: os, offline: offline)
|
|
104
|
-
cache_os = cache[os.id2name] || {}
|
|
105
|
-
cache_versions = cache_os['versions'] || {}
|
|
106
|
-
cache_versions
|
|
107
|
-
end
|
|
108
|
-
|
|
109
103
|
def install(args: [], options: {})
|
|
110
104
|
version = specified_or_current_project_version(args[0])
|
|
111
105
|
|
|
@@ -139,9 +133,7 @@ module U3d
|
|
|
139
133
|
|
|
140
134
|
unity = check_unity_presence(version: version)
|
|
141
135
|
|
|
142
|
-
unless unity
|
|
143
|
-
UI.user_error!('Unity version #{version} is not present and cannot be uninstalled')
|
|
144
|
-
end
|
|
136
|
+
UI.user_error!("Unity version #{version} is not present and cannot be uninstalled") unless unity
|
|
145
137
|
|
|
146
138
|
get_administrative_privileges(options)
|
|
147
139
|
|
|
@@ -163,14 +155,12 @@ module U3d
|
|
|
163
155
|
runner = Runner.new
|
|
164
156
|
args_pp = Runner.find_projectpath_in_args(run_args)
|
|
165
157
|
pp = args_pp
|
|
166
|
-
pp
|
|
158
|
+
pp ||= Dir.pwd
|
|
167
159
|
up = UnityProject.new(pp)
|
|
168
160
|
|
|
169
161
|
unless version # fall back in project default if we are on a Unity project
|
|
170
162
|
version = up.editor_version if up.exist?
|
|
171
|
-
unless version
|
|
172
|
-
UI.user_error!('Not sure which version of Unity to run. Are you in a Unity5 or later project?')
|
|
173
|
-
end
|
|
163
|
+
UI.user_error!('Not sure which version of Unity to run. Are you in a Unity5 or later project?') unless version
|
|
174
164
|
end
|
|
175
165
|
|
|
176
166
|
if up.exist? && args_pp.nil?
|
|
@@ -229,6 +219,13 @@ module U3d
|
|
|
229
219
|
|
|
230
220
|
private
|
|
231
221
|
|
|
222
|
+
def cache_versions(os, offline: false, force_refresh: false)
|
|
223
|
+
cache = Cache.new(force_os: os, offline: offline, force_refresh: force_refresh, central_cache: true)
|
|
224
|
+
cache_os = cache[os.id2name] || {}
|
|
225
|
+
cache_versions = cache_os['versions'] || {}
|
|
226
|
+
cache_versions
|
|
227
|
+
end
|
|
228
|
+
|
|
232
229
|
def verify_package_names(definition, packages)
|
|
233
230
|
packages.each do |package|
|
|
234
231
|
UI.user_error! "package '#{package}' doesn't exist" unless definition.available_package? package
|
|
@@ -74,7 +74,6 @@ module U3d
|
|
|
74
74
|
c.summary = 'Run unity, and parses its output through u3d\'s log prettifier'
|
|
75
75
|
c.description = %(
|
|
76
76
|
#{c.summary}
|
|
77
|
-
|
|
78
77
|
The default prettifier rules file is packaged with u3d (#{U3d::LogAnalyzer::RULES_PATH}).
|
|
79
78
|
You may which to pass your own using the environment variable U3D_RULES_PATH.
|
|
80
79
|
|
|
@@ -108,12 +107,13 @@ Fore more information about how the rules work, see https://github.com/DragonBox
|
|
|
108
107
|
c.option '-f', '--force', 'Force refresh list of available versions'
|
|
109
108
|
c.option '-r', '--release_level STRING', String, "Checks for availability on specific release level [#{levels.join(', ')}]"
|
|
110
109
|
c.option '-o', '--operating_system STRING', String, "Checks for availability on specific OS [#{oses.join(', ')}]"
|
|
111
|
-
c.option '-u', '--unity_version STRING', String, 'Checks if specified version is available'
|
|
110
|
+
c.option '-u', '--unity_version STRING', String, 'Checks if specified version is available. Can be a regular expression'
|
|
112
111
|
c.option '-p', '--packages', 'Lists available packages as well'
|
|
113
112
|
c.example 'List all versions available, forcing a refresh of the available packages from Unity servers', 'u3d available -f'
|
|
114
113
|
c.example 'List stable versions available', 'u3d available -r stable -p'
|
|
115
114
|
c.example 'List all versions available for Linux platform', 'u3d available -o linux'
|
|
116
115
|
c.example 'List packages available for Unity version 5.6.0f3', 'u3d available -u 5.6.0f3 -p'
|
|
116
|
+
c.example 'List packages available for Unity version containing the 5.6 string', 'u3d available -u \'5.6\' -p'
|
|
117
117
|
c.description = 'List download-ready versions of Unity3d'
|
|
118
118
|
c.action do |_args, options|
|
|
119
119
|
options.default packages: false
|
|
@@ -126,13 +126,15 @@ Fore more information about how the rules work, see https://github.com/DragonBox
|
|
|
126
126
|
c.summary = "Download (and/or) install Unity3D editor packages."
|
|
127
127
|
c.description = %(
|
|
128
128
|
#{c.summary}
|
|
129
|
-
|
|
130
129
|
This command allows you to either:
|
|
131
130
|
* download and install packages
|
|
132
131
|
* download packages but not install them
|
|
133
132
|
* install already downloaded packages
|
|
134
|
-
|
|
135
133
|
Already installed packages are skipped if asked to be installed again (except for the 'Example' package).
|
|
134
|
+
|
|
135
|
+
The default download path is $HOME/Downloads/Unity_Packages/, but you may change that by specifying the environment variable U3D_DOWNLOAD_PATH.
|
|
136
|
+
|
|
137
|
+
E.g. U3D_DOWNLOAD_PATH=/some/path/you/want u3d install ...
|
|
136
138
|
)
|
|
137
139
|
c.option '--[no-]download', 'Perform or not downloading before installation. Downloads by default'
|
|
138
140
|
c.option '--[no-]install', 'Perform or not installation after downloading. Installs by default'
|
|
@@ -167,9 +169,7 @@ Already installed packages are skipped if asked to be installed again (except fo
|
|
|
167
169
|
c.summary = 'Installs Unity dependencies. [Linux only]'
|
|
168
170
|
c.description = %(
|
|
169
171
|
#{c.summary}
|
|
170
|
-
|
|
171
172
|
Regarding the package manager: if dpkg is installed, u3d uses apt-get else if rpm is installed yum is used. If none of them is insalled, fails.
|
|
172
|
-
|
|
173
173
|
Regarding the dependencies themselves: only dependencies for the editor are installed. WebGL, Android and Tizen require others that you will have to install manually.
|
|
174
174
|
More on that: https://forum.unity3d.com/threads/unity-on-linux-release-notes-and-known-issues.350256/
|
|
175
175
|
)
|
|
@@ -191,12 +191,9 @@ More on that: https://forum.unity3d.com/threads/unity-on-linux-release-notes-and
|
|
|
191
191
|
c.summary = 'Prettify a saved logfile'
|
|
192
192
|
c.description = %(
|
|
193
193
|
#{c.summary}
|
|
194
|
-
|
|
195
194
|
The default prettifier rules file is packaged with u3d (#{U3d::LogAnalyzer::RULES_PATH}).
|
|
196
195
|
You may which to pass your own using the environment variable U3D_RULES_PATH.
|
|
197
|
-
|
|
198
196
|
E.g. U3D_RULES_PATH=my_rules.json u3d prettify ...
|
|
199
|
-
|
|
200
197
|
Fore more information about how the rules work, see https://github.com/DragonBox/u3d/blob/master/LOG_RULES.md
|
|
201
198
|
)
|
|
202
199
|
c.action do |args, _options|
|
data/lib/u3d/downloader.rb
CHANGED
|
@@ -34,6 +34,10 @@ module U3d
|
|
|
34
34
|
UNITY_MODULE_FILE_REGEX = %r{\/([\w\-_\.\+]+\.(?:pkg|exe|zip|sh|deb))}
|
|
35
35
|
|
|
36
36
|
class << self
|
|
37
|
+
def download_directory
|
|
38
|
+
File.expand_path(ENV['U3D_DOWNLOAD_PATH'] || File.join(DOWNLOAD_PATH, DOWNLOAD_DIRECTORY))
|
|
39
|
+
end
|
|
40
|
+
|
|
37
41
|
# fetch modules and put them in local cache
|
|
38
42
|
def fetch_modules(definition, packages: [], download: nil)
|
|
39
43
|
if download
|
|
@@ -113,6 +117,7 @@ module U3d
|
|
|
113
117
|
|
|
114
118
|
UI.header "Downloading #{package} version #{definition.version}"
|
|
115
119
|
UI.message 'Downloading from ' + url.to_s.cyan.underline
|
|
120
|
+
UI.message 'Download will be found at ' + path
|
|
116
121
|
download_package(path, url, size: definition.size_in_bytes(package))
|
|
117
122
|
|
|
118
123
|
if validator.validate(package, path, definition)
|
|
@@ -134,7 +139,7 @@ module U3d
|
|
|
134
139
|
|
|
135
140
|
class MacDownloader
|
|
136
141
|
def destination_for(package, definition)
|
|
137
|
-
dir = File.join(
|
|
142
|
+
dir = File.join(Downloader.download_directory, definition.version)
|
|
138
143
|
Utils.ensure_dir(dir)
|
|
139
144
|
file_name = UNITY_MODULE_FILE_REGEX.match(definition[package]['url'])[1]
|
|
140
145
|
|
|
@@ -148,7 +153,7 @@ module U3d
|
|
|
148
153
|
|
|
149
154
|
class LinuxDownloader
|
|
150
155
|
def destination_for(package, definition)
|
|
151
|
-
dir = File.join(
|
|
156
|
+
dir = File.join(Downloader.download_directory, definition.version)
|
|
152
157
|
Utils.ensure_dir(dir)
|
|
153
158
|
file_name = UNITY_MODULE_FILE_REGEX.match(definition[package]['url'])[1]
|
|
154
159
|
|
|
@@ -162,7 +167,7 @@ module U3d
|
|
|
162
167
|
|
|
163
168
|
class WindowsDownloader
|
|
164
169
|
def destination_for(package, definition)
|
|
165
|
-
dir = File.join(
|
|
170
|
+
dir = File.join(Downloader.download_directory, definition.version)
|
|
166
171
|
Utils.ensure_dir(dir)
|
|
167
172
|
file_name = UNITY_MODULE_FILE_REGEX.match(definition[package]['url'])[1]
|
|
168
173
|
|
data/lib/u3d/iniparser.rb
CHANGED
data/lib/u3d/installer.rb
CHANGED
|
@@ -31,8 +31,8 @@ module U3d
|
|
|
31
31
|
DEFAULT_LINUX_INSTALL = '/opt/'.freeze
|
|
32
32
|
DEFAULT_MAC_INSTALL = '/'.freeze
|
|
33
33
|
DEFAULT_WINDOWS_INSTALL = 'C:/Program Files/'.freeze
|
|
34
|
-
UNITY_DIR = "Unity_
|
|
35
|
-
UNITY_DIR_LINUX = "unity-editor
|
|
34
|
+
UNITY_DIR = "Unity_%<version>s".freeze
|
|
35
|
+
UNITY_DIR_LINUX = "unity-editor-%<version>s".freeze
|
|
36
36
|
|
|
37
37
|
class Installer
|
|
38
38
|
def self.create
|
|
@@ -88,7 +88,7 @@ module U3d
|
|
|
88
88
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
89
89
|
UI.success "Successfully moved '#{source_path}' to '#{new_path}'"
|
|
90
90
|
end
|
|
91
|
-
rescue => e
|
|
91
|
+
rescue StandardError => e
|
|
92
92
|
UI.error "Unable to move '#{source_path}' to '#{new_path}': #{e}"
|
|
93
93
|
end
|
|
94
94
|
end
|
|
@@ -97,7 +97,7 @@ module U3d
|
|
|
97
97
|
def sanitize_install(unity, dry_run: false)
|
|
98
98
|
source_path = unity.root_path
|
|
99
99
|
parent = File.expand_path('..', source_path)
|
|
100
|
-
new_path = File.join(parent, UNITY_DIR
|
|
100
|
+
new_path = File.join(parent, format(UNITY_DIR, version: unity.version))
|
|
101
101
|
|
|
102
102
|
command = "mv #{source_path.shellescape} #{new_path.shellescape}"
|
|
103
103
|
|
|
@@ -130,7 +130,7 @@ module U3d
|
|
|
130
130
|
if unity.nil?
|
|
131
131
|
UI.verbose "No Unity install for version #{version} was found"
|
|
132
132
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
133
|
-
destination_path = File.join(target_path, 'Applications', UNITY_DIR
|
|
133
|
+
destination_path = File.join(target_path, 'Applications', format(UNITY_DIR, version: version))
|
|
134
134
|
FileUtils.mv temp_path, destination_path
|
|
135
135
|
else
|
|
136
136
|
UI.verbose "Unity install for version #{version} found under #{unity.root_path}"
|
|
@@ -146,7 +146,7 @@ module U3d
|
|
|
146
146
|
FileUtils.mv temp_path, path if move_to_temp
|
|
147
147
|
end
|
|
148
148
|
end
|
|
149
|
-
rescue => e
|
|
149
|
+
rescue StandardError => e
|
|
150
150
|
UI.error "Failed to install pkg at #{file_path}: #{e}"
|
|
151
151
|
else
|
|
152
152
|
UI.success "Successfully installed package from #{file_path}"
|
|
@@ -156,7 +156,7 @@ module U3d
|
|
|
156
156
|
UI.verbose("Uninstalling Unity at '#{unity.root_path}'...")
|
|
157
157
|
command = "rm -r #{unity.root_path.argescape}"
|
|
158
158
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
159
|
-
rescue => e
|
|
159
|
+
rescue StandardError => e
|
|
160
160
|
UI.error "Failed to uninstall unity at #{unity.path}: #{e}"
|
|
161
161
|
else
|
|
162
162
|
UI.success "Successfully uninstalled '#{unity.root_path}'"
|
|
@@ -195,7 +195,7 @@ module U3d
|
|
|
195
195
|
def sanitize_install(unity, dry_run: false)
|
|
196
196
|
source_path = File.expand_path(unity.root_path)
|
|
197
197
|
parent = File.expand_path('..', source_path)
|
|
198
|
-
new_path = File.join(parent, UNITY_DIR_LINUX
|
|
198
|
+
new_path = File.join(parent, format(UNITY_DIR_LINUX, version: unity.version))
|
|
199
199
|
|
|
200
200
|
command = "mv #{source_path.shellescape} #{new_path.shellescape}"
|
|
201
201
|
|
|
@@ -233,14 +233,12 @@ module U3d
|
|
|
233
233
|
|
|
234
234
|
if installation_path
|
|
235
235
|
command = "cd #{installation_path.shellescape}; #{cmd}"
|
|
236
|
-
unless File.directory? installation_path
|
|
237
|
-
command = "mkdir -p #{installation_path.shellescape}; #{command}"
|
|
238
|
-
end
|
|
236
|
+
command = "mkdir -p #{installation_path.shellescape}; #{command}" unless File.directory? installation_path
|
|
239
237
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
240
238
|
else
|
|
241
239
|
U3dCore::CommandExecutor.execute(command: cmd, admin: true)
|
|
242
240
|
end
|
|
243
|
-
rescue => e
|
|
241
|
+
rescue StandardError => e
|
|
244
242
|
UI.error "Failed to install bash file at #{file}: #{e}"
|
|
245
243
|
else
|
|
246
244
|
UI.success 'Installation successful'
|
|
@@ -250,7 +248,7 @@ module U3d
|
|
|
250
248
|
UI.verbose("Uninstalling Unity at '#{unity.root_path}'...")
|
|
251
249
|
command = "rm -r #{unity.root_path}"
|
|
252
250
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
253
|
-
rescue => e
|
|
251
|
+
rescue StandardError => e
|
|
254
252
|
UI.error "Failed to uninstall unity at #{unity.path}: #{e}"
|
|
255
253
|
else
|
|
256
254
|
UI.success "Successfully uninstalled '#{unity.root_path}'"
|
|
@@ -279,7 +277,7 @@ module U3d
|
|
|
279
277
|
def sanitize_install(unity, dry_run: false)
|
|
280
278
|
source_path = File.expand_path(unity.root_path)
|
|
281
279
|
parent = File.expand_path('..', source_path)
|
|
282
|
-
new_path = File.join(parent, UNITY_DIR
|
|
280
|
+
new_path = File.join(parent, format(UNITY_DIR, version: unity.version))
|
|
283
281
|
|
|
284
282
|
source_path.tr!('/', '\\')
|
|
285
283
|
new_path.tr!('/', '\\')
|
|
@@ -297,7 +295,7 @@ module U3d
|
|
|
297
295
|
def install(file_path, version, installation_path: nil, info: {})
|
|
298
296
|
extension = File.extname(file_path)
|
|
299
297
|
raise "Installation of #{extension} files is not supported on Windows" if extension != '.exe'
|
|
300
|
-
path = installation_path || File.join(DEFAULT_WINDOWS_INSTALL, UNITY_DIR
|
|
298
|
+
path = installation_path || File.join(DEFAULT_WINDOWS_INSTALL, format(UNITY_DIR, version: version))
|
|
301
299
|
install_exe(
|
|
302
300
|
file_path,
|
|
303
301
|
installation_path: path,
|
|
@@ -321,7 +319,7 @@ module U3d
|
|
|
321
319
|
end
|
|
322
320
|
command ||= file_path.to_s
|
|
323
321
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
324
|
-
rescue => e
|
|
322
|
+
rescue StandardError => e
|
|
325
323
|
UI.error "Failed to install exe at #{file_path}: #{e}"
|
|
326
324
|
else
|
|
327
325
|
UI.success "Successfully installed #{info['title']}"
|
|
@@ -334,7 +332,7 @@ module U3d
|
|
|
334
332
|
command = "#{uninstall_exe.argescape} /S"
|
|
335
333
|
UI.message("Although the uninstall process completed, it takes a few seconds before the files are actually removed")
|
|
336
334
|
U3dCore::CommandExecutor.execute(command: command, admin: true)
|
|
337
|
-
rescue => e
|
|
335
|
+
rescue StandardError => e
|
|
338
336
|
UI.error "Failed to uninstall unity at #{unity.path}: #{e}"
|
|
339
337
|
else
|
|
340
338
|
UI.success "Successfully uninstalled '#{unity.root_path}'"
|
data/lib/u3d/log_analyzer.rb
CHANGED
|
@@ -184,9 +184,7 @@ module U3d
|
|
|
184
184
|
|
|
185
185
|
if @active_phase
|
|
186
186
|
apply_ruleset.call(@phases[@active_phase]['rules'], @active_phase)
|
|
187
|
-
if @phases[@active_phase]['phase_end_pattern'] && @phases[@active_phase]['phase_end_pattern'] =~ line
|
|
188
|
-
finish_phase
|
|
189
|
-
end
|
|
187
|
+
finish_phase if @phases[@active_phase]['phase_end_pattern'] && @phases[@active_phase]['phase_end_pattern'] =~ line
|
|
190
188
|
end
|
|
191
189
|
apply_ruleset.call(@generic_rules, 'GENERAL')
|
|
192
190
|
end
|
|
@@ -242,9 +240,7 @@ module U3d
|
|
|
242
240
|
r['fetched_line_pattern'] = Regexp.new r['fetched_line_pattern'] if r['fetched_line_pattern']
|
|
243
241
|
end
|
|
244
242
|
r['type'] = 'important' if r['type'] == 'warning'
|
|
245
|
-
if r['type'] && r['type'] != 'error' && r['type'] != 'important' && r['type'] != 'success'
|
|
246
|
-
r['type'] = 'message'
|
|
247
|
-
end
|
|
243
|
+
r['type'] = 'message' if r['type'] && r['type'] != 'error' && r['type'] != 'important' && r['type'] != 'success'
|
|
248
244
|
r['type'] ||= 'message'
|
|
249
245
|
r['ignore_lines'].map! { |pat| Regexp.new pat } if r['ignore_lines']
|
|
250
246
|
true
|
data/lib/u3d/unity_runner.rb
CHANGED
|
@@ -103,7 +103,7 @@ module U3d
|
|
|
103
103
|
tail_thread = Thread.new do
|
|
104
104
|
begin
|
|
105
105
|
pipe(log_file) { |line| output_callback.call(line) }
|
|
106
|
-
rescue => e
|
|
106
|
+
rescue StandardError => e
|
|
107
107
|
UI.error "Failure while trying to pipe #{log_file}: #{e.message}"
|
|
108
108
|
e.backtrace.each { |l| UI.error " #{l}" }
|
|
109
109
|
end
|
|
@@ -33,7 +33,7 @@ module U3d
|
|
|
33
33
|
@url = cached_versions ? cached_versions[version] : nil
|
|
34
34
|
begin
|
|
35
35
|
@ini = INIparser.load_ini(version, cached_versions, os: os, offline: offline)
|
|
36
|
-
rescue => e
|
|
36
|
+
rescue StandardError => e
|
|
37
37
|
# FIXME: weird that we catch this here
|
|
38
38
|
UI.error "Could not load INI file for version #{@version} on #{@os}: #{e}"
|
|
39
39
|
@ini = nil
|
data/lib/u3d/unity_versions.rb
CHANGED
|
@@ -39,7 +39,7 @@ module U3d
|
|
|
39
39
|
# URL for the beta releases list, they need to be accessed after
|
|
40
40
|
UNITY_BETAS = 'https://unity3d.com/unity/beta/archive'.freeze
|
|
41
41
|
# URL for a specific beta, takes into parameter a version string (%s)
|
|
42
|
-
UNITY_BETA_URL = 'https://unity3d.com/unity/beta/unity
|
|
42
|
+
UNITY_BETA_URL = 'https://unity3d.com/unity/beta/unity%<version>s'.freeze
|
|
43
43
|
|
|
44
44
|
#####################################################
|
|
45
45
|
# @!group REGEX: expressions to interpret data
|
|
@@ -88,7 +88,7 @@ module U3d
|
|
|
88
88
|
hash = {}
|
|
89
89
|
data = Utils.get_ssl(url)
|
|
90
90
|
results = data.scan(UNITY_BETAVERSION_REGEX).uniq
|
|
91
|
-
results.each { |beta| hash.merge!(fetch_version(UNITY_BETA_URL
|
|
91
|
+
results.each { |beta| hash.merge!(fetch_version(format(UNITY_BETA_URL, version: beta[0]), pattern)) }
|
|
92
92
|
hash
|
|
93
93
|
end
|
|
94
94
|
end
|
data/lib/u3d/version.rb
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
## --- END LICENSE BLOCK ---
|
|
22
22
|
|
|
23
23
|
module U3d
|
|
24
|
-
VERSION = '1.0.
|
|
24
|
+
VERSION = '1.0.13'.freeze
|
|
25
25
|
DESCRIPTION = 'Provides numerous tools for installing, managing and running the Unity3D game engine from command line.'.freeze
|
|
26
26
|
UNITY_VERSIONS_NOTE = "Unity3d uses the following version formatting: 0.0.0x0. The \'x\' can takes different values:\n"\
|
|
27
27
|
"\t. 'f' are the main release candidates for Unity3d\n"\
|
|
@@ -101,7 +101,7 @@ module U3dCore
|
|
|
101
101
|
end
|
|
102
102
|
end
|
|
103
103
|
raise "Exit status: #{status}".red if !status.nil? && status.nonzero?
|
|
104
|
-
rescue => ex
|
|
104
|
+
rescue StandardError => ex
|
|
105
105
|
# This could happen
|
|
106
106
|
# * if the status is failed
|
|
107
107
|
# * when the environment is wrong:
|
|
@@ -121,7 +121,7 @@ module U3dCore
|
|
|
121
121
|
if Helper.windows?
|
|
122
122
|
begin
|
|
123
123
|
result = system('reg query HKU\\S-1-5-19', out: File::NULL, err: File::NULL)
|
|
124
|
-
rescue
|
|
124
|
+
rescue StandardError
|
|
125
125
|
result = false
|
|
126
126
|
end
|
|
127
127
|
else
|
|
@@ -130,7 +130,7 @@ module U3dCore
|
|
|
130
130
|
result = system("sudo -k && echo #{credentials.password.shellescape} | sudo -S /usr/bin/whoami",
|
|
131
131
|
out: File::NULL,
|
|
132
132
|
err: File::NULL)
|
|
133
|
-
rescue
|
|
133
|
+
rescue StandardError
|
|
134
134
|
result = false
|
|
135
135
|
end
|
|
136
136
|
credentials.forget_credentials unless result # FIXME: why?
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
## --- BEGIN LICENSE BLOCK ---
|
|
2
|
+
# Copyright (c) 2017-present WeWantToKnow AS
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
# furnished to do so, subject to the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
# copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
# SOFTWARE.
|
|
21
|
+
## --- END LICENSE BLOCK ---
|
|
22
|
+
module CoreExtensions
|
|
23
|
+
module Extractable
|
|
24
|
+
refine Hash do
|
|
25
|
+
def extract(*keys)
|
|
26
|
+
select { |k, _v| keys.include?(k) }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## --- BEGIN LICENSE BLOCK ---
|
|
2
|
+
# Copyright (c) 2017-present WeWantToKnow AS
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
# furnished to do so, subject to the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
# copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
# SOFTWARE.
|
|
21
|
+
## --- END LICENSE BLOCK ---
|
|
22
|
+
module CoreExtensions
|
|
23
|
+
module OperatingSystem
|
|
24
|
+
refine Symbol do
|
|
25
|
+
def human_name
|
|
26
|
+
return 'Windows' if self == :win
|
|
27
|
+
return 'Mac OSX' if self == :mac
|
|
28
|
+
return 'Linux' if self == :linux
|
|
29
|
+
raise "Not a known operating system symbol #{self}"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
require 'colored'
|
|
28
28
|
|
|
29
29
|
class String
|
|
30
|
-
Colored::COLORS.keys.
|
|
30
|
+
Colored::COLORS.keys.each_key do |color|
|
|
31
31
|
define_method(color) do
|
|
32
32
|
self # do nothing with the string, but return it
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
|
-
Colored::EXTRAS.keys.
|
|
35
|
+
Colored::EXTRAS.keys.each_key do |extra|
|
|
36
36
|
define_method(extra) do
|
|
37
37
|
self # do nothing with the string, but return it
|
|
38
38
|
end
|
|
@@ -63,13 +63,11 @@ module U3dCore
|
|
|
63
63
|
if U3dCore::Globals.log_timestamps?
|
|
64
64
|
timestamp = ENV["U3D_UI_TIMESTAMP"]
|
|
65
65
|
# default timestamp if none specified
|
|
66
|
-
|
|
67
|
-
timestamp = if U3dCore::Globals.verbose?
|
|
66
|
+
timestamp ||= if U3dCore::Globals.verbose?
|
|
68
67
|
'%Y-%m-%d %H:%M:%S.%2N'
|
|
69
68
|
else
|
|
70
69
|
'%H:%M:%S'
|
|
71
70
|
end
|
|
72
|
-
end
|
|
73
71
|
end
|
|
74
72
|
# hide has last word
|
|
75
73
|
timestamp = nil if ENV["U3D_HIDE_TIMESTAMP"]
|
data/u3d.gemspec
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
|
-
|
|
3
1
|
lib = File.expand_path('../lib', __FILE__)
|
|
4
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
3
|
require 'u3d/version'
|
|
@@ -25,20 +23,20 @@ Gem::Specification.new do |spec|
|
|
|
25
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
26
24
|
spec.require_paths = ["lib"]
|
|
27
25
|
|
|
28
|
-
spec.add_dependency 'commander', '>= 4.4.0', '< 5.0.0' # CLI parser
|
|
29
|
-
spec.add_dependency 'security', '= 0.1.3' # macOS Keychain manager, a dead project, no updates expected
|
|
30
26
|
spec.add_dependency 'colored', '>= 1.2', '< 2.0.0' # terminal
|
|
31
|
-
spec.add_dependency '
|
|
32
|
-
spec.add_dependency 'inifile', '>= 3.0.0', '< 4.0.0' # Parses INI files
|
|
33
|
-
spec.add_dependency 'filesize', '>= 0.1.1' # File sizes prettifier
|
|
27
|
+
spec.add_dependency 'commander', '>= 4.4.0', '< 5.0.0' # CLI parser
|
|
34
28
|
spec.add_dependency 'file-tail', '>= 1.2.0'
|
|
29
|
+
spec.add_dependency 'filesize', '>= 0.1.1' # File sizes prettifier
|
|
30
|
+
spec.add_dependency 'inifile', '>= 3.0.0', '< 4.0.0' # Parses INI files
|
|
31
|
+
spec.add_dependency 'plist', '>= 3.1.0', '< 4.0.0' # Generate the Xcode config plist file
|
|
32
|
+
spec.add_dependency 'security', '= 0.1.3' # macOS Keychain manager, a dead project, no updates expected
|
|
35
33
|
# Development only
|
|
36
34
|
spec.add_development_dependency "bundler", "~> 1.13"
|
|
35
|
+
spec.add_development_dependency "coveralls"
|
|
36
|
+
spec.add_development_dependency "github_changelog_generator"
|
|
37
|
+
spec.add_development_dependency "pry"
|
|
37
38
|
spec.add_development_dependency "rake", "~> 10.0"
|
|
38
39
|
spec.add_development_dependency "rspec", "~> 3.1.0"
|
|
39
40
|
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.2.3'
|
|
40
|
-
spec.add_development_dependency
|
|
41
|
-
spec.add_development_dependency "coveralls"
|
|
42
|
-
spec.add_development_dependency "github_changelog_generator"
|
|
43
|
-
spec.add_development_dependency 'rubocop', '~> 0.49.1'
|
|
41
|
+
spec.add_development_dependency 'rubocop', '~> 0.52.1'
|
|
44
42
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: u3d
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.13
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jerome Lacoste
|
|
@@ -9,82 +9,76 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2018-01-
|
|
12
|
+
date: 2018-01-09 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
|
-
name:
|
|
15
|
+
name: colored
|
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
requirements:
|
|
18
18
|
- - ">="
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version:
|
|
20
|
+
version: '1.2'
|
|
21
21
|
- - "<"
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version:
|
|
23
|
+
version: 2.0.0
|
|
24
24
|
type: :runtime
|
|
25
25
|
prerelease: false
|
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
|
27
27
|
requirements:
|
|
28
28
|
- - ">="
|
|
29
29
|
- !ruby/object:Gem::Version
|
|
30
|
-
version:
|
|
30
|
+
version: '1.2'
|
|
31
31
|
- - "<"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 2.0.0
|
|
34
34
|
- !ruby/object:Gem::Dependency
|
|
35
|
-
name:
|
|
35
|
+
name: commander
|
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
40
|
+
version: 4.4.0
|
|
41
|
+
- - "<"
|
|
42
|
+
- !ruby/object:Gem::Version
|
|
43
|
+
version: 5.0.0
|
|
41
44
|
type: :runtime
|
|
42
45
|
prerelease: false
|
|
43
46
|
version_requirements: !ruby/object:Gem::Requirement
|
|
44
47
|
requirements:
|
|
45
|
-
- -
|
|
48
|
+
- - ">="
|
|
46
49
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
50
|
+
version: 4.4.0
|
|
51
|
+
- - "<"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 5.0.0
|
|
48
54
|
- !ruby/object:Gem::Dependency
|
|
49
|
-
name:
|
|
55
|
+
name: file-tail
|
|
50
56
|
requirement: !ruby/object:Gem::Requirement
|
|
51
57
|
requirements:
|
|
52
58
|
- - ">="
|
|
53
59
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
55
|
-
- - "<"
|
|
56
|
-
- !ruby/object:Gem::Version
|
|
57
|
-
version: 2.0.0
|
|
60
|
+
version: 1.2.0
|
|
58
61
|
type: :runtime
|
|
59
62
|
prerelease: false
|
|
60
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
61
64
|
requirements:
|
|
62
65
|
- - ">="
|
|
63
66
|
- !ruby/object:Gem::Version
|
|
64
|
-
version:
|
|
65
|
-
- - "<"
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: 2.0.0
|
|
67
|
+
version: 1.2.0
|
|
68
68
|
- !ruby/object:Gem::Dependency
|
|
69
|
-
name:
|
|
69
|
+
name: filesize
|
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - ">="
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version:
|
|
75
|
-
- - "<"
|
|
76
|
-
- !ruby/object:Gem::Version
|
|
77
|
-
version: 4.0.0
|
|
74
|
+
version: 0.1.1
|
|
78
75
|
type: :runtime
|
|
79
76
|
prerelease: false
|
|
80
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
81
78
|
requirements:
|
|
82
79
|
- - ">="
|
|
83
80
|
- !ruby/object:Gem::Version
|
|
84
|
-
version:
|
|
85
|
-
- - "<"
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
version: 4.0.0
|
|
81
|
+
version: 0.1.1
|
|
88
82
|
- !ruby/object:Gem::Dependency
|
|
89
83
|
name: inifile
|
|
90
84
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -106,33 +100,39 @@ dependencies:
|
|
|
106
100
|
- !ruby/object:Gem::Version
|
|
107
101
|
version: 4.0.0
|
|
108
102
|
- !ruby/object:Gem::Dependency
|
|
109
|
-
name:
|
|
103
|
+
name: plist
|
|
110
104
|
requirement: !ruby/object:Gem::Requirement
|
|
111
105
|
requirements:
|
|
112
106
|
- - ">="
|
|
113
107
|
- !ruby/object:Gem::Version
|
|
114
|
-
version:
|
|
108
|
+
version: 3.1.0
|
|
109
|
+
- - "<"
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
version: 4.0.0
|
|
115
112
|
type: :runtime
|
|
116
113
|
prerelease: false
|
|
117
114
|
version_requirements: !ruby/object:Gem::Requirement
|
|
118
115
|
requirements:
|
|
119
116
|
- - ">="
|
|
120
117
|
- !ruby/object:Gem::Version
|
|
121
|
-
version:
|
|
118
|
+
version: 3.1.0
|
|
119
|
+
- - "<"
|
|
120
|
+
- !ruby/object:Gem::Version
|
|
121
|
+
version: 4.0.0
|
|
122
122
|
- !ruby/object:Gem::Dependency
|
|
123
|
-
name:
|
|
123
|
+
name: security
|
|
124
124
|
requirement: !ruby/object:Gem::Requirement
|
|
125
125
|
requirements:
|
|
126
|
-
- -
|
|
126
|
+
- - '='
|
|
127
127
|
- !ruby/object:Gem::Version
|
|
128
|
-
version: 1.
|
|
128
|
+
version: 0.1.3
|
|
129
129
|
type: :runtime
|
|
130
130
|
prerelease: false
|
|
131
131
|
version_requirements: !ruby/object:Gem::Requirement
|
|
132
132
|
requirements:
|
|
133
|
-
- -
|
|
133
|
+
- - '='
|
|
134
134
|
- !ruby/object:Gem::Version
|
|
135
|
-
version: 1.
|
|
135
|
+
version: 0.1.3
|
|
136
136
|
- !ruby/object:Gem::Dependency
|
|
137
137
|
name: bundler
|
|
138
138
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -148,103 +148,103 @@ dependencies:
|
|
|
148
148
|
- !ruby/object:Gem::Version
|
|
149
149
|
version: '1.13'
|
|
150
150
|
- !ruby/object:Gem::Dependency
|
|
151
|
-
name:
|
|
151
|
+
name: coveralls
|
|
152
152
|
requirement: !ruby/object:Gem::Requirement
|
|
153
153
|
requirements:
|
|
154
|
-
- - "
|
|
154
|
+
- - ">="
|
|
155
155
|
- !ruby/object:Gem::Version
|
|
156
|
-
version: '
|
|
156
|
+
version: '0'
|
|
157
157
|
type: :development
|
|
158
158
|
prerelease: false
|
|
159
159
|
version_requirements: !ruby/object:Gem::Requirement
|
|
160
160
|
requirements:
|
|
161
|
-
- - "
|
|
161
|
+
- - ">="
|
|
162
162
|
- !ruby/object:Gem::Version
|
|
163
|
-
version: '
|
|
163
|
+
version: '0'
|
|
164
164
|
- !ruby/object:Gem::Dependency
|
|
165
|
-
name:
|
|
165
|
+
name: github_changelog_generator
|
|
166
166
|
requirement: !ruby/object:Gem::Requirement
|
|
167
167
|
requirements:
|
|
168
|
-
- - "
|
|
168
|
+
- - ">="
|
|
169
169
|
- !ruby/object:Gem::Version
|
|
170
|
-
version:
|
|
170
|
+
version: '0'
|
|
171
171
|
type: :development
|
|
172
172
|
prerelease: false
|
|
173
173
|
version_requirements: !ruby/object:Gem::Requirement
|
|
174
174
|
requirements:
|
|
175
|
-
- - "
|
|
175
|
+
- - ">="
|
|
176
176
|
- !ruby/object:Gem::Version
|
|
177
|
-
version:
|
|
177
|
+
version: '0'
|
|
178
178
|
- !ruby/object:Gem::Dependency
|
|
179
|
-
name:
|
|
179
|
+
name: pry
|
|
180
180
|
requirement: !ruby/object:Gem::Requirement
|
|
181
181
|
requirements:
|
|
182
|
-
- - "
|
|
182
|
+
- - ">="
|
|
183
183
|
- !ruby/object:Gem::Version
|
|
184
|
-
version: 0
|
|
184
|
+
version: '0'
|
|
185
185
|
type: :development
|
|
186
186
|
prerelease: false
|
|
187
187
|
version_requirements: !ruby/object:Gem::Requirement
|
|
188
188
|
requirements:
|
|
189
|
-
- - "
|
|
189
|
+
- - ">="
|
|
190
190
|
- !ruby/object:Gem::Version
|
|
191
|
-
version: 0
|
|
191
|
+
version: '0'
|
|
192
192
|
- !ruby/object:Gem::Dependency
|
|
193
|
-
name:
|
|
193
|
+
name: rake
|
|
194
194
|
requirement: !ruby/object:Gem::Requirement
|
|
195
195
|
requirements:
|
|
196
|
-
- - "
|
|
196
|
+
- - "~>"
|
|
197
197
|
- !ruby/object:Gem::Version
|
|
198
|
-
version: '0'
|
|
198
|
+
version: '10.0'
|
|
199
199
|
type: :development
|
|
200
200
|
prerelease: false
|
|
201
201
|
version_requirements: !ruby/object:Gem::Requirement
|
|
202
202
|
requirements:
|
|
203
|
-
- - "
|
|
203
|
+
- - "~>"
|
|
204
204
|
- !ruby/object:Gem::Version
|
|
205
|
-
version: '0'
|
|
205
|
+
version: '10.0'
|
|
206
206
|
- !ruby/object:Gem::Dependency
|
|
207
|
-
name:
|
|
207
|
+
name: rspec
|
|
208
208
|
requirement: !ruby/object:Gem::Requirement
|
|
209
209
|
requirements:
|
|
210
|
-
- - "
|
|
210
|
+
- - "~>"
|
|
211
211
|
- !ruby/object:Gem::Version
|
|
212
|
-
version:
|
|
212
|
+
version: 3.1.0
|
|
213
213
|
type: :development
|
|
214
214
|
prerelease: false
|
|
215
215
|
version_requirements: !ruby/object:Gem::Requirement
|
|
216
216
|
requirements:
|
|
217
|
-
- - "
|
|
217
|
+
- - "~>"
|
|
218
218
|
- !ruby/object:Gem::Version
|
|
219
|
-
version:
|
|
219
|
+
version: 3.1.0
|
|
220
220
|
- !ruby/object:Gem::Dependency
|
|
221
|
-
name:
|
|
221
|
+
name: rspec_junit_formatter
|
|
222
222
|
requirement: !ruby/object:Gem::Requirement
|
|
223
223
|
requirements:
|
|
224
|
-
- - "
|
|
224
|
+
- - "~>"
|
|
225
225
|
- !ruby/object:Gem::Version
|
|
226
|
-
version:
|
|
226
|
+
version: 0.2.3
|
|
227
227
|
type: :development
|
|
228
228
|
prerelease: false
|
|
229
229
|
version_requirements: !ruby/object:Gem::Requirement
|
|
230
230
|
requirements:
|
|
231
|
-
- - "
|
|
231
|
+
- - "~>"
|
|
232
232
|
- !ruby/object:Gem::Version
|
|
233
|
-
version:
|
|
233
|
+
version: 0.2.3
|
|
234
234
|
- !ruby/object:Gem::Dependency
|
|
235
235
|
name: rubocop
|
|
236
236
|
requirement: !ruby/object:Gem::Requirement
|
|
237
237
|
requirements:
|
|
238
238
|
- - "~>"
|
|
239
239
|
- !ruby/object:Gem::Version
|
|
240
|
-
version: 0.
|
|
240
|
+
version: 0.52.1
|
|
241
241
|
type: :development
|
|
242
242
|
prerelease: false
|
|
243
243
|
version_requirements: !ruby/object:Gem::Requirement
|
|
244
244
|
requirements:
|
|
245
245
|
- - "~>"
|
|
246
246
|
- !ruby/object:Gem::Version
|
|
247
|
-
version: 0.
|
|
247
|
+
version: 0.52.1
|
|
248
248
|
description: Provides numerous tools for installing, managing and running the Unity3D
|
|
249
249
|
game engine from command line.
|
|
250
250
|
email: jerome@wewanttoknow.com
|
|
@@ -389,6 +389,8 @@ files:
|
|
|
389
389
|
- lib/u3d_core.rb
|
|
390
390
|
- lib/u3d_core/command_executor.rb
|
|
391
391
|
- lib/u3d_core/command_runner.rb
|
|
392
|
+
- lib/u3d_core/core_ext/hash.rb
|
|
393
|
+
- lib/u3d_core/core_ext/operating_system_symbol.rb
|
|
392
394
|
- lib/u3d_core/core_ext/string.rb
|
|
393
395
|
- lib/u3d_core/credentials.rb
|
|
394
396
|
- lib/u3d_core/globals.rb
|