theme-juice 0.3.8 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -7
- data/bin/tj +2 -0
- data/lib/theme-juice.rb +4 -4
- data/lib/theme-juice/cli.rb +135 -51
- data/lib/theme-juice/executor.rb +148 -84
- data/lib/theme-juice/ui.rb +217 -0
- data/lib/theme-juice/utilities.rb +14 -30
- data/lib/theme-juice/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ba65703ebc0aa6c3347653be95257dc44c0139b
|
4
|
+
data.tar.gz: acb64611b4953ea3f6dd9bdcd031ab041db4f934
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b2861fd3f7b839f44a68105518afc10407e783457f1aec6e72ed0fbee5ca3a7f771080d82bde4745958dcc619cf6f22155ad7a8b71c5996e3a9daf06322912a
|
7
|
+
data.tar.gz: 284659d59c835d0a31f84813bcc22e8e0ea49d08055d126138735a5999e183fdf4423e01b84d10ac33e07003c27ff4f74bcca34fedd2f79f27c7192e6b05c3b6
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Theme Juice [![Gem Version](
|
1
|
+
# Theme Juice [![Gem Version](http://img.shields.io/gem/v/theme-juice.svg)](https://rubygems.org/gems/theme-juice)
|
2
2
|
What is it? Theme Juice is a command line interface created to scaffold out a new WordPress development environment (using [VVV](https://github.com/Varying-Vagrant-Vagrants/VVV)) and countless development sites. Everybody loves one command setups, and `tj` can even do one command deployments too.
|
3
3
|
|
4
4
|
## Installation
|
@@ -39,9 +39,11 @@ tj
|
|
39
39
|
```
|
40
40
|
|
41
41
|
### Global flags:
|
42
|
-
| Flag
|
43
|
-
|
44
|
-
| `-
|
42
|
+
| Flag | Type | Description |
|
43
|
+
|:-------------------------|:------ |:------------------------------------------ |
|
44
|
+
| `-nu, [--no-unicode]` | Bool | Disable all unicode characters |
|
45
|
+
| `-nc, [--no-colors]` | Bool | Disable colored output |
|
46
|
+
| `-fp, [--vvv-path=PATH]` | String | Force custom path to your VVV installation |
|
45
47
|
|
46
48
|
### Print version:
|
47
49
|
This command will print the current version of `tj`.
|
@@ -89,7 +91,7 @@ tj list # Aliases: sites, show
|
|
89
91
|
### Watching and compiling assets:
|
90
92
|
Use this to watch and compile assets with your preferred build tool, whether that be [Grunt](https://github.com/gruntjs/grunt), [Gulp](https://github.com/gulpjs/gulp), [Guard](https://github.com/guard/guard), or whatever. This is simply a wrapper for whatever command is in your `tj-config.yml` file.
|
91
93
|
```bash
|
92
|
-
tj watch # Aliases: dev
|
94
|
+
tj watch # Aliases: dev, assets
|
93
95
|
```
|
94
96
|
|
95
97
|
### Managing development environment:
|
@@ -101,13 +103,13 @@ tj vm # Aliases: vagrant, vvv
|
|
101
103
|
### Managing vendor dependencies:
|
102
104
|
Use this to easily manage your dependencies with [Composer](https://github.com/composer/composer), or whatever other command you set in your `tj-config.yml`. This is a wrapper for whatever command is in your config file.
|
103
105
|
```bash
|
104
|
-
tj vendor # Aliases: deps
|
106
|
+
tj vendor # Aliases: dep, deps
|
105
107
|
```
|
106
108
|
|
107
109
|
### Managing deployment and migration:
|
108
110
|
Use this to easily manage your deployment and migration with [Capistrano](https://github.com/capistrano/capistrano) (or again, anything else set within your `tj-config.yml`). This is just a wrapper for your chosen command.
|
109
111
|
```bash
|
110
|
-
tj server # Aliases: deploy
|
112
|
+
tj server # Aliases: deploy, remote
|
111
113
|
```
|
112
114
|
|
113
115
|
### Executing WP-CLI locally inside your VM with `wp-cli-ssh`
|
data/bin/tj
CHANGED
data/lib/theme-juice.rb
CHANGED
@@ -6,11 +6,11 @@ require "rubygems"
|
|
6
6
|
require "thor"
|
7
7
|
require "yaml"
|
8
8
|
|
9
|
+
module ThemeJuice
|
10
|
+
end
|
11
|
+
|
9
12
|
require_relative "theme-juice/version"
|
13
|
+
require_relative "theme-juice/ui"
|
10
14
|
require_relative "theme-juice/utilities"
|
11
15
|
require_relative "theme-juice/executor"
|
12
16
|
require_relative "theme-juice/cli"
|
13
|
-
|
14
|
-
module ThemeJuice
|
15
|
-
# Silence is golden?
|
16
|
-
end
|
data/lib/theme-juice/cli.rb
CHANGED
@@ -6,28 +6,68 @@ module ThemeJuice
|
|
6
6
|
map %w[setup, init, prep] => :create
|
7
7
|
map %w[remove, trash, teardown] => :delete
|
8
8
|
map %w[sites, show] => :list
|
9
|
-
map %w[dev]
|
9
|
+
map %w[assets, dev] => :watch
|
10
10
|
map %w[dep, deps] => :vendor
|
11
|
-
map %w[deploy]
|
11
|
+
map %w[deploy, remote] => :server
|
12
12
|
map %w[vagrant, vvv] => :vm
|
13
13
|
|
14
|
-
class_option :
|
14
|
+
class_option :no_unicode, type: :boolean, alias: "-nu", desc: "Disable all unicode characters"
|
15
|
+
class_option :no_colors, type: :boolean, alias: "-nc", desc: "Disable colored output"
|
16
|
+
class_option :vvv_path, type: :string, alias: "-fp", default: nil, desc: "Force path to VVV installation"
|
15
17
|
|
16
18
|
###
|
17
19
|
# Non-Thor commands
|
18
20
|
###
|
19
21
|
no_commands do
|
20
22
|
|
23
|
+
###
|
24
|
+
# Disable unicode characters if flag is passed
|
25
|
+
#
|
26
|
+
# @return {Void}
|
27
|
+
###
|
28
|
+
def use_unicode_chars?
|
29
|
+
::ThemeJuice::Utilities.no_unicode = true if options[:no_unicode]
|
30
|
+
end
|
31
|
+
|
32
|
+
###
|
33
|
+
# Disable unicode characters if flag is passed
|
34
|
+
#
|
35
|
+
# @return {Void}
|
36
|
+
###
|
37
|
+
def use_terminal_colors?
|
38
|
+
::ThemeJuice::Utilities.no_colors = true if options[:no_colors]
|
39
|
+
end
|
40
|
+
|
21
41
|
###
|
22
42
|
# Set VVV path
|
23
43
|
#
|
24
44
|
# @return {Void}
|
25
45
|
###
|
26
46
|
def force_vvv_path?
|
27
|
-
|
28
|
-
::ThemeJuice::Utilities.
|
47
|
+
if options[:vvv_path].nil?
|
48
|
+
::ThemeJuice::Utilities.vvv_path = File.expand_path("~/vagrant")
|
49
|
+
else
|
50
|
+
::ThemeJuice::Utilities.vvv_path = options[:vvv_path]
|
51
|
+
::ThemeJuice::UI.notice "You're using a custom VVV path : (#{::ThemeJuice::Utilities.vvv_path})"
|
52
|
+
|
53
|
+
unless ::ThemeJuice::UI.agree? "Is the path correct?"
|
54
|
+
::ThemeJuice::UI.error "Good call. Let's create a working dev environment, not a broken computer. Aborting mission."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
unless Dir.exist? ::ThemeJuice::Utilities.vvv_path
|
59
|
+
::ThemeJuice::UI.error "Cannot load VVV path (#{::ThemeJuice::Utilities.vvv_path}). Aborting mission before something bad happens."
|
29
60
|
end
|
30
61
|
end
|
62
|
+
|
63
|
+
###
|
64
|
+
# Output welcome message
|
65
|
+
#
|
66
|
+
# @return {Void}
|
67
|
+
###
|
68
|
+
def welcome_message
|
69
|
+
::ThemeJuice::UI.success "Welcome to Theme Juice!"
|
70
|
+
end
|
31
71
|
end
|
32
72
|
|
33
73
|
###
|
@@ -39,7 +79,10 @@ module ThemeJuice
|
|
39
79
|
def version
|
40
80
|
# ::ThemeJuice::Utilities.check_if_current_version_is_outdated
|
41
81
|
|
42
|
-
|
82
|
+
::ThemeJuice::UI.speak ::ThemeJuice::VERSION, {
|
83
|
+
color: :green,
|
84
|
+
icon: :arrow_right
|
85
|
+
}
|
43
86
|
end
|
44
87
|
|
45
88
|
###
|
@@ -63,9 +106,12 @@ module ThemeJuice
|
|
63
106
|
method_option :skip_db, type: :boolean, desc: "Skip database prompts and use defaults"
|
64
107
|
method_option :use_defaults, type: :boolean, desc: "Skip all promps and use default settings"
|
65
108
|
def create(site = nil)
|
66
|
-
self.
|
109
|
+
self.use_terminal_colors?
|
110
|
+
self.use_unicode_chars?
|
67
111
|
|
68
|
-
|
112
|
+
self.welcome_message
|
113
|
+
|
114
|
+
self.force_vvv_path?
|
69
115
|
|
70
116
|
if options[:site]
|
71
117
|
site = options[:site]
|
@@ -73,20 +119,31 @@ module ThemeJuice
|
|
73
119
|
|
74
120
|
# Check if user passed all required options through flags
|
75
121
|
if options.length >= 6 || options[:use_defaults]
|
76
|
-
|
122
|
+
::ThemeJuice::UI.speak "Well... looks like you just have everything all figured out, huh?", {
|
123
|
+
color: [:black, :on_green],
|
124
|
+
icon: :arrow_right,
|
125
|
+
full_width: true
|
126
|
+
}
|
77
127
|
elsif site.nil?
|
78
|
-
|
128
|
+
::ThemeJuice::UI.speak "Just a few questions before we begin...", {
|
129
|
+
color: [:black, :on_green],
|
130
|
+
icon: :arrow_right,
|
131
|
+
full_width: true
|
132
|
+
}
|
79
133
|
else
|
80
|
-
|
134
|
+
::ThemeJuice::UI.speak "Your site name shall be '#{site}'! Just a few more questions before we begin...", {
|
135
|
+
color: [:black, :on_green],
|
136
|
+
icon: :arrow_right,
|
137
|
+
full_width: true
|
138
|
+
}
|
81
139
|
end
|
82
140
|
|
83
141
|
# Ask for the Site name if not passed directly
|
84
|
-
site ||=
|
142
|
+
site ||= ::ThemeJuice::UI.prompt "What's the site name? (only ascii characters are allowed)"
|
85
143
|
|
86
144
|
# Make sure site name is valid
|
87
145
|
if site.match /[^0-9A-Za-z.\-]/
|
88
|
-
|
89
|
-
exit 1
|
146
|
+
::ThemeJuice::UI.error "Site name contains invalid non-ascii characters. This name is used for creating directories, so that's not gonna work. Aborting mission."
|
90
147
|
end
|
91
148
|
|
92
149
|
# Bare install?
|
@@ -103,7 +160,7 @@ module ThemeJuice
|
|
103
160
|
if options[:use_defaults]
|
104
161
|
site_location = "#{Dir.pwd}/"
|
105
162
|
else
|
106
|
-
site_location =
|
163
|
+
site_location = ::ThemeJuice::UI.prompt "Where do you want to setup the site?", default: "#{Dir.pwd}/", path: true
|
107
164
|
end
|
108
165
|
end
|
109
166
|
|
@@ -125,16 +182,23 @@ module ThemeJuice
|
|
125
182
|
if options[:use_defaults]
|
126
183
|
starter_theme = themes["theme-juice/theme-juice-starter"]
|
127
184
|
else
|
128
|
-
|
185
|
+
::ThemeJuice::UI.speak "Which starter theme would you like to use? (partial name is acceptable)", {
|
186
|
+
color: :blue,
|
187
|
+
icon: :bullet_hollow
|
188
|
+
}
|
189
|
+
|
129
190
|
choose do |menu|
|
130
|
-
menu.index = "
|
131
|
-
menu.prompt = set_color "
|
191
|
+
menu.index = " #{::ThemeJuice::UI::BULLET_HOLLOW}"
|
192
|
+
menu.prompt = set_color " #{::ThemeJuice::UI::ARROW_RIGHT} Choose one :".ljust(16), :blue
|
132
193
|
|
133
194
|
themes.each do |theme, repo|
|
134
195
|
menu.choice theme do
|
135
196
|
|
136
197
|
if theme == "theme-juice/theme-juice-starter"
|
137
|
-
|
198
|
+
::ThemeJuice::UI.speak "Awesome choice!", {
|
199
|
+
color: :green,
|
200
|
+
icon: :arrow_up
|
201
|
+
}
|
138
202
|
end
|
139
203
|
|
140
204
|
starter_theme = repo
|
@@ -142,11 +206,11 @@ module ThemeJuice
|
|
142
206
|
end
|
143
207
|
|
144
208
|
menu.choice "other" do
|
145
|
-
starter_theme =
|
209
|
+
starter_theme = ::ThemeJuice::UI.prompt "What is the repository URL for the starter theme you would like to clone?", indent: 2
|
146
210
|
end
|
147
211
|
|
148
212
|
menu.choice "none" do |opt|
|
149
|
-
|
213
|
+
::ThemeJuice::UI.notice "Next time you need to create a site without a starter theme, you can just run the 'setup' command instead."
|
150
214
|
starter_theme, bare_setup = opt, true
|
151
215
|
end
|
152
216
|
end
|
@@ -161,13 +225,12 @@ module ThemeJuice
|
|
161
225
|
if options[:use_defaults]
|
162
226
|
dev_url = "#{site}.dev"
|
163
227
|
else
|
164
|
-
dev_url =
|
228
|
+
dev_url = ::ThemeJuice::UI.prompt "What do you want the development url to be? (this should end in '.dev')", default: "#{site}.dev"
|
165
229
|
end
|
166
230
|
end
|
167
231
|
|
168
232
|
unless dev_url.match /(.dev)$/
|
169
|
-
|
170
|
-
exit 1
|
233
|
+
::ThemeJuice::UI.error "Your development url doesn't end with '.dev'. This is used within Vagrant, so that's not gonna work. Aborting mission."
|
171
234
|
end
|
172
235
|
|
173
236
|
# Initialize a git repository on setup
|
@@ -177,8 +240,8 @@ module ThemeJuice
|
|
177
240
|
if options[:use_defaults] || options[:skip_repo]
|
178
241
|
repository = false
|
179
242
|
else
|
180
|
-
if
|
181
|
-
repository =
|
243
|
+
if ::ThemeJuice::UI.agree? "Would you like to initialize a new Git repository?"
|
244
|
+
repository = ::ThemeJuice::UI.prompt "What is the repository's URL?", indent: 2
|
182
245
|
else
|
183
246
|
repository = false
|
184
247
|
end
|
@@ -189,28 +252,28 @@ module ThemeJuice
|
|
189
252
|
if options[:use_defaults] || options[:skip_db]
|
190
253
|
db_host = "vvv"
|
191
254
|
else
|
192
|
-
db_host =
|
255
|
+
db_host = ::ThemeJuice::UI.prompt "Database host", default: "vvv"
|
193
256
|
end
|
194
257
|
|
195
258
|
# Database name
|
196
259
|
if options[:use_defaults] || options[:skip_db]
|
197
260
|
db_name = "#{clean_site_name}_db"
|
198
261
|
else
|
199
|
-
db_name =
|
262
|
+
db_name = ::ThemeJuice::UI.prompt "Database name", default: "#{clean_site_name}_db"
|
200
263
|
end
|
201
264
|
|
202
265
|
# Database username
|
203
266
|
if options[:use_defaults] || options[:skip_db]
|
204
267
|
db_user = "#{clean_site_name}_user"
|
205
268
|
else
|
206
|
-
db_user =
|
269
|
+
db_user = ::ThemeJuice::UI.prompt "Database username", default: "#{clean_site_name}_user"
|
207
270
|
end
|
208
271
|
|
209
272
|
# Database password
|
210
273
|
if options[:use_defaults] || options[:skip_db]
|
211
274
|
db_pass = SecureRandom.base64
|
212
275
|
else
|
213
|
-
db_pass =
|
276
|
+
db_pass = ::ThemeJuice::UI.prompt "Database password", default: SecureRandom.base64
|
214
277
|
end
|
215
278
|
|
216
279
|
# Save options
|
@@ -219,7 +282,7 @@ module ThemeJuice
|
|
219
282
|
site_location: File.expand_path(site_location),
|
220
283
|
starter_theme: starter_theme,
|
221
284
|
bare_setup: bare_setup,
|
222
|
-
dev_location: File.expand_path("#{::ThemeJuice::Utilities.
|
285
|
+
dev_location: File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/www/tj-#{site}"),
|
223
286
|
dev_url: dev_url,
|
224
287
|
repository: repository,
|
225
288
|
db_host: db_host,
|
@@ -229,27 +292,26 @@ module ThemeJuice
|
|
229
292
|
}
|
230
293
|
|
231
294
|
# Verify that all the options are correct
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
295
|
+
::ThemeJuice::UI.list "Your settings :", :yellow, [
|
296
|
+
"Site name: #{opts[:site_name]}",
|
297
|
+
"Site location: #{opts[:site_location]}",
|
298
|
+
"Starter theme: #{opts[:starter_theme]}",
|
299
|
+
"Development location: #{opts[:dev_location]}",
|
300
|
+
"Development url: http://#{opts[:dev_url]}",
|
301
|
+
"Initialized repository: #{opts[:repository]}",
|
302
|
+
"Database host: #{opts[:db_host]}",
|
303
|
+
"Database name: #{opts[:db_name]}",
|
304
|
+
"Database username: #{opts[:db_user]}",
|
305
|
+
"Database password: #{opts[:db_pass]}"
|
306
|
+
]
|
307
|
+
|
308
|
+
if ::ThemeJuice::UI.agree? "Do the options above look correct?"
|
245
309
|
::ThemeJuice::Executor::create opts
|
246
310
|
else
|
247
|
-
|
248
|
-
exit 1
|
311
|
+
::ThemeJuice::UI.error "Dang typos... aborting mission."
|
249
312
|
end
|
250
313
|
else
|
251
|
-
|
252
|
-
exit 1
|
314
|
+
::ThemeJuice::UI.error "Site name is required. Aborting mission."
|
253
315
|
end
|
254
316
|
end
|
255
317
|
|
@@ -277,10 +339,17 @@ module ThemeJuice
|
|
277
339
|
desc "delete SITE", "Remove SITE from the VVV development environment (does not remove local site)"
|
278
340
|
method_option :restart, type: :boolean
|
279
341
|
def delete(site)
|
342
|
+
self.use_terminal_colors?
|
343
|
+
self.use_unicode_chars?
|
280
344
|
self.force_vvv_path?
|
281
345
|
|
282
|
-
|
283
|
-
|
346
|
+
::ThemeJuice::UI.speak "Are you sure you want to delete '#{site}'? (y/N)", {
|
347
|
+
color: [:white, :on_red],
|
348
|
+
icon: :arrow_right,
|
349
|
+
full_width: true
|
350
|
+
}
|
351
|
+
|
352
|
+
if ::ThemeJuice::UI.agree? "", { color: :red, simple: true }
|
284
353
|
::ThemeJuice::Executor::delete site, options[:restart]
|
285
354
|
end
|
286
355
|
end
|
@@ -292,6 +361,8 @@ module ThemeJuice
|
|
292
361
|
###
|
293
362
|
desc "list", "List all sites within the VVV development environment"
|
294
363
|
def list
|
364
|
+
self.use_terminal_colors?
|
365
|
+
self.use_unicode_chars?
|
295
366
|
self.force_vvv_path?
|
296
367
|
|
297
368
|
::ThemeJuice::Executor::list
|
@@ -305,6 +376,9 @@ module ThemeJuice
|
|
305
376
|
desc "install", "Run installation for the starter theme"
|
306
377
|
method_option :config, type: :string, aliases: "-c", default: nil, desc: "Force path to config file"
|
307
378
|
def install
|
379
|
+
self.use_terminal_colors?
|
380
|
+
self.use_unicode_chars?
|
381
|
+
|
308
382
|
::ThemeJuice::Executor::install options[:config]
|
309
383
|
end
|
310
384
|
|
@@ -318,6 +392,9 @@ module ThemeJuice
|
|
318
392
|
###
|
319
393
|
desc "watch [COMMANDS]", "Watch and compile assets"
|
320
394
|
def watch(*commands)
|
395
|
+
self.use_terminal_colors?
|
396
|
+
self.use_unicode_chars?
|
397
|
+
|
321
398
|
::ThemeJuice::Executor::subcommand "#{__method__}", commands.join(" ")
|
322
399
|
end
|
323
400
|
|
@@ -331,6 +408,9 @@ module ThemeJuice
|
|
331
408
|
###
|
332
409
|
desc "vendor [COMMANDS]", "Manage vendor dependencies"
|
333
410
|
def vendor(*commands)
|
411
|
+
self.use_terminal_colors?
|
412
|
+
self.use_unicode_chars?
|
413
|
+
|
334
414
|
::ThemeJuice::Executor::subcommand "#{__method__}", commands.join(" ")
|
335
415
|
end
|
336
416
|
|
@@ -344,6 +424,8 @@ module ThemeJuice
|
|
344
424
|
###
|
345
425
|
desc "server [COMMANDS]", "Manage deployment and migration"
|
346
426
|
def server(*commands)
|
427
|
+
self.use_terminal_colors?
|
428
|
+
self.use_unicode_chars?
|
347
429
|
self.force_vvv_path?
|
348
430
|
|
349
431
|
::ThemeJuice::Executor::subcommand "#{__method__}", commands.join(" ")
|
@@ -359,9 +441,11 @@ module ThemeJuice
|
|
359
441
|
###
|
360
442
|
desc "vm [COMMANDS]", "Manage virtual development environment with Vagrant"
|
361
443
|
def vm(*commands)
|
444
|
+
self.use_terminal_colors?
|
445
|
+
self.use_unicode_chars?
|
362
446
|
self.force_vvv_path?
|
363
447
|
|
364
|
-
system "cd #{::ThemeJuice::Utilities.
|
448
|
+
system "cd #{::ThemeJuice::Utilities.vvv_path} && vagrant #{commands.join(" ")}"
|
365
449
|
end
|
366
450
|
end
|
367
451
|
end
|
data/lib/theme-juice/executor.rb
CHANGED
@@ -37,8 +37,7 @@ module ThemeJuice
|
|
37
37
|
if @config[subcommand]
|
38
38
|
run ["#{@config[subcommand]} #{commands}"], false
|
39
39
|
else
|
40
|
-
|
41
|
-
exit 1
|
40
|
+
::ThemeJuice::UI.error "Unable to find '#{subcommand}' command in '#{config_path}/tj-config.yml'. Aborting mission."
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
@@ -52,7 +51,7 @@ module ThemeJuice
|
|
52
51
|
def create(opts)
|
53
52
|
@opts = opts
|
54
53
|
|
55
|
-
|
54
|
+
::ThemeJuice::UI.notice "Running setup for '#{@opts[:site_name]}'..."
|
56
55
|
|
57
56
|
unless project_dir_is_setup?
|
58
57
|
setup_project_dir
|
@@ -109,37 +108,44 @@ module ThemeJuice
|
|
109
108
|
end
|
110
109
|
|
111
110
|
if setup_was_successful?
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
111
|
+
::ThemeJuice::UI.success "Setup complete!"
|
112
|
+
::ThemeJuice::UI.speak "In order to finish creating your site, you need to provision Vagrant. Do it now? (y/N)", {
|
113
|
+
color: [:black, :on_blue],
|
114
|
+
icon: :arrow_reload,
|
115
|
+
full_width: true
|
116
|
+
}
|
117
|
+
|
118
|
+
if ::ThemeJuice::UI.agree? "", { simple: true }
|
119
|
+
::ThemeJuice::UI.speak "Restarting VVV...", {
|
120
|
+
color: :yellow,
|
121
|
+
icon: :bullet_solid
|
122
|
+
}
|
117
123
|
|
118
124
|
if restart_vagrant
|
119
|
-
|
120
|
-
# Output success message
|
121
|
-
say " Success!".ljust(terminal_width), [:black, :on_green, :bold]
|
125
|
+
::ThemeJuice::UI.success "Success!"
|
122
126
|
|
123
127
|
# Output setup info
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
128
|
+
::ThemeJuice::UI.list "Your settings :", :blue, [
|
129
|
+
"Site name: #{@opts[:site_name]}",
|
130
|
+
"Site location: #{@opts[:site_location]}",
|
131
|
+
"Starter theme: #{@opts[:starter_theme]}",
|
132
|
+
"Development location: #{@opts[:dev_location]}",
|
133
|
+
"Development url: http://#{@opts[:dev_url]}",
|
134
|
+
"Initialized repository: #{@opts[:repository]}",
|
135
|
+
"Database host: #{@opts[:db_host]}",
|
136
|
+
"Database name: #{@opts[:db_name]}",
|
137
|
+
"Database username: #{@opts[:db_user]}",
|
138
|
+
"Database password: #{@opts[:db_pass]}"
|
139
|
+
]
|
135
140
|
end
|
136
141
|
else
|
137
|
-
|
142
|
+
::ThemeJuice::UI.notice "Remember, Vagrant needs to be provisioned before you can use your new site. Exiting..."
|
138
143
|
exit
|
139
144
|
end
|
140
145
|
else
|
141
|
-
|
142
|
-
|
146
|
+
::ThemeJuice::UI.error "Setup failed. Running cleanup..." do
|
147
|
+
delete @opts[:site_name], false
|
148
|
+
end
|
143
149
|
end
|
144
150
|
end
|
145
151
|
|
@@ -159,14 +165,13 @@ module ThemeJuice
|
|
159
165
|
###
|
160
166
|
@opts = {
|
161
167
|
site_name: site,
|
162
|
-
dev_location: File.expand_path("#{::ThemeJuice::Utilities.
|
168
|
+
dev_location: File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/www/tj-#{site}")
|
163
169
|
}
|
164
170
|
|
165
171
|
if dev_site_is_setup?
|
166
172
|
remove_dev_site
|
167
173
|
else
|
168
|
-
|
169
|
-
exit 1
|
174
|
+
::ThemeJuice::UI.error "Site '#{@opts[:site_name]}' does not exist."
|
170
175
|
end
|
171
176
|
|
172
177
|
if database_is_setup?
|
@@ -178,15 +183,18 @@ module ThemeJuice
|
|
178
183
|
end
|
179
184
|
|
180
185
|
if removal_was_successful?
|
181
|
-
|
186
|
+
::ThemeJuice::UI.success "Site '#{@opts[:site_name]}' successfully removed!"
|
182
187
|
|
183
188
|
if restart
|
184
|
-
|
189
|
+
::ThemeJuice::UI.speak "Restarting VVV...", {
|
190
|
+
color: :yellow,
|
191
|
+
icon: :bullet_solid
|
192
|
+
}
|
193
|
+
|
185
194
|
restart_vagrant
|
186
195
|
end
|
187
196
|
else
|
188
|
-
|
189
|
-
exit 1
|
197
|
+
::ThemeJuice::UI.error "'#{@opts[:site_name]}' could not be fully be removed."
|
190
198
|
end
|
191
199
|
end
|
192
200
|
|
@@ -198,15 +206,17 @@ module ThemeJuice
|
|
198
206
|
def list
|
199
207
|
sites = []
|
200
208
|
|
201
|
-
Dir.glob(File.expand_path("#{::ThemeJuice::Utilities.
|
209
|
+
Dir.glob(File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/www/*")).each do |f|
|
202
210
|
sites << File.basename(f).gsub(/(tj-)/, "") if File.directory?(f) && f.include?("tj-")
|
203
211
|
end
|
204
212
|
|
205
213
|
if sites.empty?
|
206
|
-
|
214
|
+
::ThemeJuice::UI.speak "Nothing to list. Why haven't you created a site yet?", {
|
215
|
+
color: :yellow,
|
216
|
+
icon: :bullet_solid
|
217
|
+
}
|
207
218
|
else
|
208
|
-
|
209
|
-
sites.each_with_index { |site, i| say " ● #{site}", :blue }
|
219
|
+
::ThemeJuice::UI.list "Your sites :", :green, sites
|
210
220
|
end
|
211
221
|
|
212
222
|
sites
|
@@ -241,21 +251,20 @@ module ThemeJuice
|
|
241
251
|
if config_is_setup? config_path
|
242
252
|
@config = YAML.load_file "#{config_path}/tj-config.yml"
|
243
253
|
else
|
244
|
-
|
254
|
+
::ThemeJuice::UI.notice "Unable to find 'tj-config.yml' file in '#{config_path}'."
|
245
255
|
|
246
|
-
if
|
256
|
+
if ::ThemeJuice::UI.agree? "Would you like to create one?"
|
247
257
|
|
248
258
|
setup_config(config_path)
|
249
259
|
|
250
260
|
if config_is_setup? config_path
|
251
|
-
|
261
|
+
::ThemeJuice::UI.notice "Please re-run the last command to continue."
|
252
262
|
exit
|
253
263
|
else
|
254
264
|
exit 1
|
255
265
|
end
|
256
266
|
else
|
257
|
-
|
258
|
-
exit 1
|
267
|
+
::ThemeJuice::UI.error "A config file is needed to continue. Aborting mission."
|
259
268
|
end
|
260
269
|
end
|
261
270
|
end
|
@@ -270,7 +279,7 @@ module ThemeJuice
|
|
270
279
|
###
|
271
280
|
def restart_vagrant
|
272
281
|
run [
|
273
|
-
"cd #{::ThemeJuice::Utilities.
|
282
|
+
"cd #{::ThemeJuice::Utilities.vvv_path}",
|
274
283
|
"vagrant halt",
|
275
284
|
"vagrant up --provision",
|
276
285
|
], false
|
@@ -308,14 +317,14 @@ module ThemeJuice
|
|
308
317
|
# @return {Bool}
|
309
318
|
###
|
310
319
|
def vvv_is_setup?
|
311
|
-
File.exist? File.expand_path(::ThemeJuice::Utilities.
|
320
|
+
File.exist? File.expand_path(::ThemeJuice::Utilities.vvv_path)
|
312
321
|
end
|
313
322
|
|
314
323
|
###
|
315
324
|
# @return {Bool}
|
316
325
|
###
|
317
326
|
def wildcard_subdomains_is_setup?
|
318
|
-
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.
|
327
|
+
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/Vagrantfile")).grep(/(config.landrush.enabled = true)/m).any?
|
319
328
|
end
|
320
329
|
|
321
330
|
###
|
@@ -336,7 +345,7 @@ module ThemeJuice
|
|
336
345
|
# @return {Bool}
|
337
346
|
###
|
338
347
|
def database_is_setup?
|
339
|
-
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.
|
348
|
+
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/database/init-custom.sql")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
|
340
349
|
end
|
341
350
|
|
342
351
|
###
|
@@ -357,7 +366,7 @@ module ThemeJuice
|
|
357
366
|
# @return {Bool}
|
358
367
|
###
|
359
368
|
def synced_folder_is_setup?
|
360
|
-
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.
|
369
|
+
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/Vagrantfile")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
|
361
370
|
end
|
362
371
|
|
363
372
|
###
|
@@ -387,13 +396,17 @@ module ThemeJuice
|
|
387
396
|
# @return {Void}
|
388
397
|
###
|
389
398
|
def setup_vvv
|
390
|
-
|
399
|
+
::ThemeJuice::UI.speak "Installing VVV into '#{File.expand_path("#{::ThemeJuice::Utilities.vvv_path}")}'...", {
|
400
|
+
color: :yellow,
|
401
|
+
icon: :bullet_solid
|
402
|
+
}
|
403
|
+
|
391
404
|
run [
|
392
405
|
"vagrant plugin install vagrant-hostsupdater",
|
393
406
|
"vagrant plugin install vagrant-triggers",
|
394
407
|
"vagrant plugin install landrush",
|
395
|
-
"git clone https://github.com/Varying-Vagrant-Vagrants/VVV.git #{::ThemeJuice::Utilities.
|
396
|
-
"cd #{::ThemeJuice::Utilities.
|
408
|
+
"git clone https://github.com/Varying-Vagrant-Vagrants/VVV.git #{::ThemeJuice::Utilities.vvv_path}",
|
409
|
+
"cd #{::ThemeJuice::Utilities.vvv_path}/database && touch init-custom.sql"
|
397
410
|
]
|
398
411
|
end
|
399
412
|
|
@@ -403,7 +416,11 @@ module ThemeJuice
|
|
403
416
|
# @return {Void}
|
404
417
|
###
|
405
418
|
def setup_project_dir
|
406
|
-
|
419
|
+
::ThemeJuice::UI.speak "Creating project directory tree in '#{@opts[:site_location]}'...", {
|
420
|
+
color: :yellow,
|
421
|
+
icon: :bullet_solid
|
422
|
+
}
|
423
|
+
|
407
424
|
run ["mkdir -p #{@opts[:site_location]}"]
|
408
425
|
end
|
409
426
|
|
@@ -416,8 +433,12 @@ module ThemeJuice
|
|
416
433
|
# @return {Void}
|
417
434
|
###
|
418
435
|
def setup_wildcard_subdomains
|
419
|
-
|
420
|
-
|
436
|
+
::ThemeJuice::UI.speak "Setting up wildcard subdomains...", {
|
437
|
+
color: :yellow,
|
438
|
+
icon: :bullet_solid
|
439
|
+
}
|
440
|
+
|
441
|
+
open File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/Vagrantfile"), "a+" do |file|
|
421
442
|
file.puts "\n"
|
422
443
|
file.puts "###"
|
423
444
|
file.puts "# Enable wildcard subdomains"
|
@@ -438,9 +459,13 @@ module ThemeJuice
|
|
438
459
|
# @return {Void}
|
439
460
|
###
|
440
461
|
def setup_dev_site
|
441
|
-
|
462
|
+
::ThemeJuice::UI.speak "Setting up new development site at '#{@opts[:dev_location]}'...", {
|
463
|
+
color: :yellow,
|
464
|
+
icon: :bullet_solid
|
465
|
+
}
|
466
|
+
|
442
467
|
run [
|
443
|
-
"cd #{::ThemeJuice::Utilities.
|
468
|
+
"cd #{::ThemeJuice::Utilities.vvv_path}/www",
|
444
469
|
"mkdir tj-#{@opts[:site_name]}",
|
445
470
|
]
|
446
471
|
end
|
@@ -453,10 +478,10 @@ module ThemeJuice
|
|
453
478
|
# @return {Void}
|
454
479
|
###
|
455
480
|
def setup_config(config_path)
|
456
|
-
watch
|
457
|
-
server
|
458
|
-
vendor
|
459
|
-
install =
|
481
|
+
watch = ::ThemeJuice::UI.prompt "Watch command to use", indent: 2, default: "bundle exec guard"
|
482
|
+
server = ::ThemeJuice::UI.prompt "Deployment command to use", indent: 2, default: "bundle exec cap"
|
483
|
+
vendor = ::ThemeJuice::UI.prompt "Vendor command to use", indent: 2, default: "composer"
|
484
|
+
install = ::ThemeJuice::UI.prompt "Commands to run on theme install", indent: 2, default: "composer install"
|
460
485
|
|
461
486
|
File.open "#{config_path}/tj-config.yml", "w" do |file|
|
462
487
|
file.puts "watch: #{watch}"
|
@@ -467,9 +492,12 @@ module ThemeJuice
|
|
467
492
|
end
|
468
493
|
|
469
494
|
if config_is_setup? config_path
|
470
|
-
|
495
|
+
::ThemeJuice::UI.speak "Successfully added 'tj-config.yml' file.", {
|
496
|
+
color: :green,
|
497
|
+
icon: :bullet_solid
|
498
|
+
}
|
471
499
|
else
|
472
|
-
|
500
|
+
::ThemeJuice::UI.error "Could not create 'tj-config.yml' file. Make sure you have write capabilities to '#{@opts[:site_location]}'."
|
473
501
|
end
|
474
502
|
end
|
475
503
|
|
@@ -484,9 +512,12 @@ module ThemeJuice
|
|
484
512
|
end
|
485
513
|
|
486
514
|
if hosts_is_setup?
|
487
|
-
|
515
|
+
::ThemeJuice::UI.speak "Successfully added 'vvv-hosts' file.", {
|
516
|
+
color: :green,
|
517
|
+
icon: :bullet_solid
|
518
|
+
}
|
488
519
|
else
|
489
|
-
|
520
|
+
::ThemeJuice::UI.error "Could not create 'vvv-hosts' file. Make sure you have write capabilities to '#{@opts[:site_location]}'."
|
490
521
|
end
|
491
522
|
end
|
492
523
|
|
@@ -496,7 +527,7 @@ module ThemeJuice
|
|
496
527
|
# @return {Void}
|
497
528
|
###
|
498
529
|
def setup_database
|
499
|
-
File.open File.expand_path("#{::ThemeJuice::Utilities.
|
530
|
+
File.open File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/database/init-custom.sql"), "a+" do |file|
|
500
531
|
file.puts "### Begin '#{@opts[:site_name]}'"
|
501
532
|
file.puts "#"
|
502
533
|
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
@@ -508,9 +539,12 @@ module ThemeJuice
|
|
508
539
|
end
|
509
540
|
|
510
541
|
if database_is_setup?
|
511
|
-
|
542
|
+
::ThemeJuice::UI.speak "Successfully added database to 'init-custom.sql'.", {
|
543
|
+
color: :green,
|
544
|
+
icon: :bullet_solid
|
545
|
+
}
|
512
546
|
else
|
513
|
-
|
547
|
+
::ThemeJuice::UI.error "Could not add database info for '#{@opts[:site_name]}' to 'init-custom.sql'. Make sure you have write capabilities to '#{@opts[:site_location]}'."
|
514
548
|
end
|
515
549
|
end
|
516
550
|
|
@@ -530,9 +564,12 @@ module ThemeJuice
|
|
530
564
|
end
|
531
565
|
|
532
566
|
if nginx_is_setup?
|
533
|
-
|
567
|
+
::ThemeJuice::UI.speak "Successfully added 'vvv-nginx.conf' file.", {
|
568
|
+
color: :green,
|
569
|
+
icon: :bullet_solid
|
570
|
+
}
|
534
571
|
else
|
535
|
-
|
572
|
+
::ThemeJuice::UI.error "Could not create 'vvv-nginx.conf' file. Make sure you have write capabilities to '#{@opts[:site_location]}'."
|
536
573
|
end
|
537
574
|
end
|
538
575
|
|
@@ -552,9 +589,12 @@ module ThemeJuice
|
|
552
589
|
end
|
553
590
|
|
554
591
|
if env_is_setup?
|
555
|
-
|
592
|
+
::ThemeJuice::UI.speak "Successfully added '.env.development' file.", {
|
593
|
+
color: :green,
|
594
|
+
icon: :bullet_solid
|
595
|
+
}
|
556
596
|
else
|
557
|
-
|
597
|
+
::ThemeJuice::UI.error "Could not create '.env.development' file. Make sure you have write capabilities to '#{@opts[:site_location]}'."
|
558
598
|
end
|
559
599
|
end
|
560
600
|
|
@@ -566,7 +606,10 @@ module ThemeJuice
|
|
566
606
|
# @return {Void}
|
567
607
|
###
|
568
608
|
def setup_wordpress
|
569
|
-
|
609
|
+
::ThemeJuice::UI.speak "Setting up WordPress...", {
|
610
|
+
color: :yellow,
|
611
|
+
icon: :bullet_solid
|
612
|
+
}
|
570
613
|
|
571
614
|
unless @opts[:bare_setup]
|
572
615
|
run [
|
@@ -582,7 +625,10 @@ module ThemeJuice
|
|
582
625
|
# @return {Void}
|
583
626
|
###
|
584
627
|
def install_theme_dependencies
|
585
|
-
|
628
|
+
::ThemeJuice::UI.speak "Installing theme dependencies...", {
|
629
|
+
color: :yellow,
|
630
|
+
icon: :bullet_solid
|
631
|
+
}
|
586
632
|
|
587
633
|
@config["install"].each do |command|
|
588
634
|
run ["cd #{@opts[:site_location]}", command], false
|
@@ -595,9 +641,12 @@ module ThemeJuice
|
|
595
641
|
# @return {Void}
|
596
642
|
###
|
597
643
|
def setup_synced_folder
|
598
|
-
|
644
|
+
::ThemeJuice::UI.speak "Syncing host theme directory '#{@opts[:site_location]}' with VM theme directory '/srv/www/tj-#{@opts[:site_name]}'...", {
|
645
|
+
color: :yellow,
|
646
|
+
icon: :bullet_solid
|
647
|
+
}
|
599
648
|
|
600
|
-
open File.expand_path("#{::ThemeJuice::Utilities.
|
649
|
+
open File.expand_path("#{::ThemeJuice::Utilities.vvv_path}/Vagrantfile"), "a+" do |file|
|
601
650
|
file.puts "### Begin '#{@opts[:site_name]}'"
|
602
651
|
file.puts "#"
|
603
652
|
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
@@ -617,7 +666,10 @@ module ThemeJuice
|
|
617
666
|
# @return {Void}
|
618
667
|
###
|
619
668
|
def setup_repo
|
620
|
-
|
669
|
+
::ThemeJuice::UI.speak "Setting up Git repository at '#{@opts[:repository]}'...", {
|
670
|
+
color: :yellow,
|
671
|
+
icon: :bullet_solid
|
672
|
+
}
|
621
673
|
|
622
674
|
if repo_is_setup?
|
623
675
|
run [
|
@@ -646,14 +698,17 @@ module ThemeJuice
|
|
646
698
|
file.puts "\tvagrant:"
|
647
699
|
file.puts "\t\turl: #{@opts[:dev_url]}"
|
648
700
|
file.puts "\t\tpath: /srv/www/tj-#{@opts[:site_name]}"
|
649
|
-
file.puts "\t\tcmd: cd #{::ThemeJuice::Utilities.
|
701
|
+
file.puts "\t\tcmd: cd #{::ThemeJuice::Utilities.vvv_path} && vagrant ssh-config > /tmp/vagrant_ssh_config && ssh -q %pseudotty% -F /tmp/vagrant_ssh_config default %cmd%"
|
650
702
|
file.puts "\n"
|
651
703
|
end
|
652
704
|
|
653
705
|
if wpcli_is_setup?
|
654
|
-
|
706
|
+
::ThemeJuice::UI.speak "Successfully added ssh settings to 'wp-cli.local.yml' file.", {
|
707
|
+
color: :green,
|
708
|
+
icon: :bullet_solid
|
709
|
+
}
|
655
710
|
else
|
656
|
-
|
711
|
+
::ThemeJuice::UI.error "Could not create 'wp-cli.local.yml' file. Make sure you have write capabilities to '#{@opts[:site_location]}'."
|
657
712
|
end
|
658
713
|
end
|
659
714
|
|
@@ -664,15 +719,18 @@ module ThemeJuice
|
|
664
719
|
###
|
665
720
|
def remove_dev_site
|
666
721
|
|
667
|
-
unless Dir.entries("#{::ThemeJuice::Utilities.
|
722
|
+
unless Dir.entries("#{::ThemeJuice::Utilities.vvv_path}").include? "www"
|
668
723
|
say " ↑ Cannot load VVV path. Aborting mission before something bad happens.".ljust(terminal_width), [:white, :on_red]
|
669
724
|
exit 1
|
670
725
|
end
|
671
726
|
|
672
727
|
if run ["rm -rf #{@opts[:dev_location]}"]
|
673
|
-
|
728
|
+
::ThemeJuice::UI.speak "VVV installation for '#{@opts[:site_name]}' successfully removed.", {
|
729
|
+
color: :green,
|
730
|
+
icon: :bullet_solid
|
731
|
+
}
|
674
732
|
else
|
675
|
-
|
733
|
+
::ThemeJuice::UI.error "Theme '#{@opts[:site_name]}' could not be removed. Make sure you have write capabilities to '#{@opts[:dev_location]}'."
|
676
734
|
end
|
677
735
|
end
|
678
736
|
|
@@ -682,8 +740,11 @@ module ThemeJuice
|
|
682
740
|
# @return {Void}
|
683
741
|
###
|
684
742
|
def remove_database
|
685
|
-
if remove_traces_from_file "#{::ThemeJuice::Utilities.
|
686
|
-
|
743
|
+
if remove_traces_from_file "#{::ThemeJuice::Utilities.vvv_path}/database/init-custom.sql"
|
744
|
+
::ThemeJuice::UI.speak "Database for '#{@opts[:site_name]}' successfully removed.", {
|
745
|
+
color: :yellow,
|
746
|
+
icon: :bullet_solid
|
747
|
+
}
|
687
748
|
end
|
688
749
|
end
|
689
750
|
|
@@ -693,8 +754,11 @@ module ThemeJuice
|
|
693
754
|
# @return {Void}
|
694
755
|
###
|
695
756
|
def remove_synced_folder
|
696
|
-
if remove_traces_from_file "#{::ThemeJuice::Utilities.
|
697
|
-
|
757
|
+
if remove_traces_from_file "#{::ThemeJuice::Utilities.vvv_path}/Vagrantfile"
|
758
|
+
::ThemeJuice::UI.speak "Synced folders for '#{@opts[:site_name]}' successfully removed.", {
|
759
|
+
color: :yellow,
|
760
|
+
icon: :bullet_solid
|
761
|
+
}
|
698
762
|
end
|
699
763
|
end
|
700
764
|
|
@@ -0,0 +1,217 @@
|
|
1
|
+
module ThemeJuice
|
2
|
+
module UI
|
3
|
+
|
4
|
+
QUESTION_MARK = "?"
|
5
|
+
BULLET_HOLLOW = "\u25CB"
|
6
|
+
BULLET_SOLID = "\u2022"
|
7
|
+
ARROW_UP = "\u2191"
|
8
|
+
ARROW_RIGHT = "\u2192"
|
9
|
+
ARROW_DOWN = "\u2193"
|
10
|
+
ARROW_LEFT = "\u2190"
|
11
|
+
ARROW_RELOAD = "\u21AA"
|
12
|
+
BLOCK_LARGE = "\u2588"
|
13
|
+
BLOCK_MED = "\u258D"
|
14
|
+
BLOCK_SMALL = "\u258F"
|
15
|
+
|
16
|
+
class << self
|
17
|
+
include ::Thor::Actions
|
18
|
+
include ::Thor::Shell
|
19
|
+
|
20
|
+
###
|
21
|
+
# Output formatted message to terminal
|
22
|
+
#
|
23
|
+
# @param {String} message
|
24
|
+
# @param {Hash} opts
|
25
|
+
#
|
26
|
+
# @return {Void}
|
27
|
+
###
|
28
|
+
def speak(message, opts = {})
|
29
|
+
format_message! message, opts
|
30
|
+
|
31
|
+
# Check if we're suppressing terminal output
|
32
|
+
if opts.key? :suppress
|
33
|
+
message
|
34
|
+
else
|
35
|
+
say message
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
###
|
40
|
+
# Output success message
|
41
|
+
#
|
42
|
+
# @param {String} message
|
43
|
+
#
|
44
|
+
# @return {Void}
|
45
|
+
###
|
46
|
+
def success(message)
|
47
|
+
self.speak message, {
|
48
|
+
color: [:black, :on_green, :bold],
|
49
|
+
full_width: true
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
###
|
54
|
+
# Output notice message
|
55
|
+
#
|
56
|
+
# @param {String} message
|
57
|
+
#
|
58
|
+
# @return {Void}
|
59
|
+
###
|
60
|
+
def notice(message)
|
61
|
+
self.speak message, {
|
62
|
+
color: [:black, :on_yellow],
|
63
|
+
icon: :arrow_right,
|
64
|
+
full_width: true
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
###
|
69
|
+
# Output error message and exit. Allows a block to be passed
|
70
|
+
# as well, which will be executed before exiting
|
71
|
+
#
|
72
|
+
# @param {String} message
|
73
|
+
#
|
74
|
+
# @return {Void}
|
75
|
+
###
|
76
|
+
def error(message)
|
77
|
+
self.speak message, {
|
78
|
+
color: [:white, :on_red],
|
79
|
+
icon: :arrow_up,
|
80
|
+
full_width: true
|
81
|
+
}
|
82
|
+
|
83
|
+
yield if block_given?
|
84
|
+
|
85
|
+
exit 1
|
86
|
+
end
|
87
|
+
|
88
|
+
###
|
89
|
+
# Output a list of messages
|
90
|
+
#
|
91
|
+
# @param {String} header
|
92
|
+
# @param {Symbol} color
|
93
|
+
# @param {Array} list
|
94
|
+
#
|
95
|
+
# @return {Void}
|
96
|
+
###
|
97
|
+
def list(header, color, list)
|
98
|
+
self.speak header, {
|
99
|
+
color: [:black, :"on_#{color}"],
|
100
|
+
icon: :arrow_right,
|
101
|
+
full_width: true
|
102
|
+
}
|
103
|
+
|
104
|
+
list.each do |item|
|
105
|
+
self.speak item, {
|
106
|
+
color: :"#{color}",
|
107
|
+
icon: :bullet_solid
|
108
|
+
}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
###
|
113
|
+
# Ask a question
|
114
|
+
#
|
115
|
+
# @param {String} question
|
116
|
+
# @param {Hash} opts
|
117
|
+
#
|
118
|
+
# @return {Void}
|
119
|
+
###
|
120
|
+
def prompt(question, *opts)
|
121
|
+
format_message! question, {
|
122
|
+
color: :blue,
|
123
|
+
icon: :bullet_hollow
|
124
|
+
}
|
125
|
+
|
126
|
+
opts.each do |opt|
|
127
|
+
if opt.respond_to? :key?
|
128
|
+
|
129
|
+
# if opt.key? :default
|
130
|
+
# opt[:default] = set_color(opt[:default], :black, :bold)
|
131
|
+
# end
|
132
|
+
|
133
|
+
if opt.key? :indent
|
134
|
+
set!(question) { |str| (" " * opt[:indent]) << str }
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
break
|
139
|
+
end
|
140
|
+
|
141
|
+
ask "#{question} :", *opts
|
142
|
+
end
|
143
|
+
|
144
|
+
###
|
145
|
+
# Ask a yes or no question
|
146
|
+
#
|
147
|
+
# @param {String} question
|
148
|
+
# @param {Hash} opts
|
149
|
+
#
|
150
|
+
# @return {Bool}
|
151
|
+
###
|
152
|
+
def agree?(question, opts = {})
|
153
|
+
|
154
|
+
unless opts.key? :color
|
155
|
+
opts[:color] = :blue
|
156
|
+
end
|
157
|
+
|
158
|
+
format_message! question, {
|
159
|
+
color: opts[:color],
|
160
|
+
icon: :bullet_hollow
|
161
|
+
}
|
162
|
+
|
163
|
+
if opts.key? :simple
|
164
|
+
yes? " :", if opts.key? :color then opts[:color] end
|
165
|
+
else
|
166
|
+
yes? "#{question} (y/N) :"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
###
|
173
|
+
# Destructively format message
|
174
|
+
#
|
175
|
+
# @param {String} message
|
176
|
+
# @param {Hash} opts
|
177
|
+
#
|
178
|
+
# @return {String}
|
179
|
+
###
|
180
|
+
def format_message!(message, opts = {})
|
181
|
+
|
182
|
+
# Check if we're using an icon
|
183
|
+
unless ::ThemeJuice::Utilities.no_unicode
|
184
|
+
if opts.key? :icon
|
185
|
+
set!(message) { |msg| " #{self.const_get(opts[:icon].to_s.upcase)} " << msg if opts[:icon].is_a? Symbol }
|
186
|
+
else
|
187
|
+
set!(message) { |msg| " " << msg }
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# Check if message should take up entire width
|
192
|
+
# of the terminal window
|
193
|
+
if opts.key? :full_width
|
194
|
+
set!(message) { |msg| msg.ljust(terminal_width) }
|
195
|
+
end
|
196
|
+
|
197
|
+
# Check if we're using colors
|
198
|
+
unless ::ThemeJuice::Utilities.no_colors
|
199
|
+
if opts.key? :color
|
200
|
+
set!(message) { |msg| set_color(msg, *opts[:color]) }
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
message
|
205
|
+
end
|
206
|
+
|
207
|
+
###
|
208
|
+
# Run destructive block against message
|
209
|
+
#
|
210
|
+
# @return {String}
|
211
|
+
###
|
212
|
+
def set!(string)
|
213
|
+
str = yield(string); string.clear; string << str
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -1,37 +1,13 @@
|
|
1
1
|
module ThemeJuice
|
2
2
|
module Utilities
|
3
3
|
class << self
|
4
|
+
attr_accessor :vvv_path
|
5
|
+
attr_accessor :no_unicode
|
6
|
+
attr_accessor :no_colors
|
7
|
+
|
4
8
|
include ::Thor::Actions
|
5
9
|
include ::Thor::Shell
|
6
10
|
|
7
|
-
@@vvv_path ||= File.expand_path("~/vagrant")
|
8
|
-
|
9
|
-
###
|
10
|
-
# Set path to VVV installation
|
11
|
-
#
|
12
|
-
# @param {String} path
|
13
|
-
#
|
14
|
-
# @return {String}
|
15
|
-
###
|
16
|
-
def set_vvv_path(path)
|
17
|
-
@@vvv_path = File.expand_path(path)
|
18
|
-
end
|
19
|
-
|
20
|
-
###
|
21
|
-
# Get path to VVV installation
|
22
|
-
#
|
23
|
-
# @return {String}
|
24
|
-
###
|
25
|
-
def get_vvv_path
|
26
|
-
|
27
|
-
unless @@vvv_path
|
28
|
-
say " ↑ Cannot load VVV path. Aborting mission before something bad happens.".ljust(terminal_width), [:white, :on_red]
|
29
|
-
exit 1
|
30
|
-
end
|
31
|
-
|
32
|
-
@@vvv_path
|
33
|
-
end
|
34
|
-
|
35
11
|
###
|
36
12
|
# Check if program is installed
|
37
13
|
#
|
@@ -60,9 +36,17 @@ module ThemeJuice
|
|
60
36
|
remote_version = remotes.map { |n, _| n.version }.sort.last
|
61
37
|
|
62
38
|
if ::Gem::Version.new(local_version) < ::Gem::Version.new(remote_version)
|
63
|
-
|
39
|
+
::ThemeJuice::UI.speak "Your version of Theme Juice (#{local_version}) is outdated. There is a newer version (#{remote_version}) available. Please update now.", {
|
40
|
+
color: [:black, :on_yellow],
|
41
|
+
icon: :arrow_right,
|
42
|
+
full_width: true
|
43
|
+
}
|
64
44
|
else
|
65
|
-
|
45
|
+
::ThemeJuice::UI.speak "Your version of Theme Juice (#{local_version}) up to date.", {
|
46
|
+
color: [:black, :on_green],
|
47
|
+
icon: :arrow_right,
|
48
|
+
full_width: true
|
49
|
+
}
|
66
50
|
end
|
67
51
|
end
|
68
52
|
end
|
data/lib/theme-juice/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theme-juice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezekiel Gabrielse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -49,6 +49,7 @@ extra_rdoc_files: []
|
|
49
49
|
files:
|
50
50
|
- lib/theme-juice/cli.rb
|
51
51
|
- lib/theme-juice/executor.rb
|
52
|
+
- lib/theme-juice/ui.rb
|
52
53
|
- lib/theme-juice/utilities.rb
|
53
54
|
- lib/theme-juice/version.rb
|
54
55
|
- lib/theme-juice.rb
|