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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 73d1296a8484fbae76a72f7a5606c252bb4743ba
4
- data.tar.gz: f74f4c6a09211dba3028f56b7c6559d2f466d107
3
+ metadata.gz: 9ba65703ebc0aa6c3347653be95257dc44c0139b
4
+ data.tar.gz: acb64611b4953ea3f6dd9bdcd031ab041db4f934
5
5
  SHA512:
6
- metadata.gz: fa89fb673767296ae6b412e086d4180f9e2ceb2a1fc29bb909a1b68d82666501fae5abdb1a68ba0bf1c692aec81e10c0cda4bb56ebbebd28ed4814f3fcdfb20f
7
- data.tar.gz: 15eb808984f6de663e48b890db4d85e77d0d6543e7805e64f2ac1b4780a7194779cf5ce04149d54b4a76a92704112b79ff5f169fe3d3228986823d3b5fc30a46
6
+ metadata.gz: 6b2861fd3f7b839f44a68105518afc10407e783457f1aec6e72ed0fbee5ca3a7f771080d82bde4745958dcc619cf6f22155ad7a8b71c5996e3a9daf06322912a
7
+ data.tar.gz: 284659d59c835d0a31f84813bcc22e8e0ea49d08055d126138735a5999e183fdf4423e01b84d10ac33e07003c27ff4f74bcca34fedd2f79f27c7192e6b05c3b6
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Theme Juice [![Gem Version](https://badge.fury.io/rb/theme-juice.svg)](http://badge.fury.io/rb/theme-juice)
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 | Type | Description |
43
- |:--------------------------------------- |:------ |:------------------------------------------------ |
44
- | `-fp, [--vvv-path=PATH]` | String | Force custom path to your VVV installation |
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
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
2
4
  require "thor"
3
5
 
4
6
  begin
@@ -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
@@ -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] => :watch
9
+ map %w[assets, dev] => :watch
10
10
  map %w[dep, deps] => :vendor
11
- map %w[deploy] => :server
11
+ map %w[deploy, remote] => :server
12
12
  map %w[vagrant, vvv] => :vm
13
13
 
14
- class_option :vvv_path, type: :string, alias: "-fp", default: nil, desc: "Force path to VVV installation"
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
- unless options[:vvv_path].nil?
28
- ::ThemeJuice::Utilities.set_vvv_path options[:vvv_path]
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
- say ::ThemeJuice::VERSION, :green
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.force_vvv_path?
109
+ self.use_terminal_colors?
110
+ self.use_unicode_chars?
67
111
 
68
- say " Welcome to Theme Juice!".ljust(terminal_width), [:black, :on_green, :bold]
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
- say "Well... looks like you just have everything all figured out, huh?".ljust(terminal_width), [:black, :on_green]
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
- say "Just a few questions before we begin...".ljust(terminal_width), [:black, :on_green]
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
- say "Your site name shall be '#{site}'! Just a few more questions before we begin...".ljust(terminal_width), [:black, :on_green]
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 ||= ask "What's the site name? (only ascii characters are allowed) :", :blue
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
- say "Site name contains invalid non-ascii characters. This name is used for creating directories, so that's not gonna work. Aborting mission.".ljust(terminal_width), [:white, :on_red]
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 = ask "Where do you want to setup the site? :", :blue, default: "#{Dir.pwd}/", path: true
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
- say "Which starter theme would you like to use? (partial name is acceptable)", :blue
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 " Choose one :".ljust(16), :blue
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
- say "Awesome choice!", :green
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 = ask "What is the repository URL for the starter theme you would like to clone? :", :blue
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
- say "Next time you need to create a site without a starter theme, you can just run the 'setup' command instead.".ljust(terminal_width), [:black, :on_yellow]
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 = ask "What do you want the development url to be? (this should end in '.dev') :", :blue, default: "#{site}.dev"
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
- say "Your development url doesn't end with '.dev'. This is used within Vagrant, so that's not gonna work. Aborting mission.".ljust(terminal_width), [:white, :on_red]
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 yes? "Would you like to initialize a new Git repository? (y/N) :", :blue
181
- repository = ask "What is the repository's URL? :", :blue
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 = ask "Database host :", :blue, default: "vvv"
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 = ask "Database name :", :blue, default: "#{clean_site_name}_db"
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 = ask "Database username :", :blue, default: "#{clean_site_name}_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 = ask "Database password :", :blue, default: SecureRandom.base64
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.get_vvv_path}/www/tj-#{site}"),
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
- say "Your settings :".ljust(terminal_width), [:black, :on_yellow]
233
- say "Site name: #{opts[:site_name]}", :yellow
234
- say "Site location: #{opts[:site_location]}", :yellow
235
- say "Starter theme: #{opts[:starter_theme]}", :yellow
236
- say "Development location: #{opts[:dev_location]}", :yellow
237
- say "Development url: http://#{opts[:dev_url]}", :yellow
238
- say "Initialized repository: #{opts[:repository]}", :yellow
239
- say "Database host: #{opts[:db_host]}", :yellow
240
- say "Database name: #{opts[:db_name]}", :yellow
241
- say "Database username: #{opts[:db_user]}", :yellow
242
- say "Database password: #{opts[:db_pass]}", :yellow
243
-
244
- if yes? " ○ Do the options above look correct? (y/N) :", :blue
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
- say "Dang typos... aborting mission.".ljust(terminal_width), [:white, :on_red]
248
- exit 1
311
+ ::ThemeJuice::UI.error "Dang typos... aborting mission."
249
312
  end
250
313
  else
251
- say "Site name is required. Aborting mission.".ljust(terminal_width), [:white, :on_red]
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
- say "Are you sure you want to delete '#{site}'?".ljust(terminal_width), [:white, :on_red]
283
- if yes? " (y/N) :", :red
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.get_vvv_path} && vagrant #{commands.join(" ")}"
448
+ system "cd #{::ThemeJuice::Utilities.vvv_path} && vagrant #{commands.join(" ")}"
365
449
  end
366
450
  end
367
451
  end
@@ -37,8 +37,7 @@ module ThemeJuice
37
37
  if @config[subcommand]
38
38
  run ["#{@config[subcommand]} #{commands}"], false
39
39
  else
40
- say "Unable to find '#{subcommand}' command in '#{config_path}/tj-config.yml'. Aborting mission.".ljust(terminal_width), [:white, :on_red]
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
- say "Running setup for '#{@opts[:site_name]}'...".ljust(terminal_width), [:black, :on_yellow]
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
- say "Setup complete!".ljust(terminal_width), [:black, :on_green]
113
-
114
- say " ↺ In order to finish creating your site, you need to provision Vagrant. Do it now?".ljust(terminal_width), [:black, :on_blue]
115
- if yes? " (y/N) :", :blue
116
- say " ● Restarting VVV...", :yellow
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
- say "Your settings :".ljust(terminal_width), [:black, :on_green]
125
- say "Site name: #{@opts[:site_name]}", :blue
126
- say "Site location: #{@opts[:site_location]}", :blue
127
- say "Starter theme: #{@opts[:starter_theme]}", :blue
128
- say "Development location: #{@opts[:dev_location]}", :blue
129
- say "Development url: http://#{@opts[:dev_url]}", :blue
130
- say "Initialized repository: #{@opts[:repository]}", :blue
131
- say "Database host: #{@opts[:db_host]}", :blue
132
- say "Database name: #{@opts[:db_name]}", :blue
133
- say "Database username: #{@opts[:db_user]}", :blue
134
- say "Database password: #{@opts[:db_pass]}", :blue
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
- say "Remember, Vagrant needs to be provisioned before you can use your new site. Exiting...".ljust(terminal_width), [:black, :on_yellow]
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
- say "Setup failed. Running cleanup...".ljust(terminal_width), [:white, :on_red]
142
- delete @opts[:site_name], false
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.get_vvv_path}/www/tj-#{site}")
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
- say "Site '#{@opts[:site_name]}' does not exist.".ljust(terminal_width), [:white, :on_red]
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
- say "Site '#{@opts[:site_name]}' successfully removed!".ljust(terminal_width), [:black, :on_green]
186
+ ::ThemeJuice::UI.success "Site '#{@opts[:site_name]}' successfully removed!"
182
187
 
183
188
  if restart
184
- say "Restarting VVV...", :yellow
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
- say " ↑ Site '#{@opts[:site_name]}' could not be fully be removed.".ljust(terminal_width), [:white, :on_red]
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.get_vvv_path}/www/*")).each do |f|
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
- say "Nothing to list. Why haven't you created a site yet?", :yellow
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
- say "Your sites :".ljust(terminal_width), [:black, :on_green]
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
- say "Unable to find 'tj-config.yml' file in '#{config_path}'.".ljust(terminal_width), [:white, :on_red]
254
+ ::ThemeJuice::UI.notice "Unable to find 'tj-config.yml' file in '#{config_path}'."
245
255
 
246
- if yes? "Would you like to create one? (y/N) :", :blue
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
- say "Please re-run the last command to continue.".ljust(terminal_width), [:black, :on_yellow]
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
- say "A config file is needed to continue installation. Aborting mission.".ljust(terminal_width), [:white, :on_red]
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.get_vvv_path}",
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.get_vvv_path)
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.get_vvv_path}/Vagrantfile")).grep(/(config.landrush.enabled = true)/m).any?
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.get_vvv_path}/database/init-custom.sql")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
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.get_vvv_path}/Vagrantfile")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
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
- say "Installing VVV into '#{File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}")}'...", :yellow
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.get_vvv_path}",
396
- "cd #{::ThemeJuice::Utilities.get_vvv_path}/database && touch init-custom.sql"
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
- say "Creating project directory tree in '#{@opts[:site_location]}'...", :yellow
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
- say "Setting up wildcard subdomains...", :yellow
420
- open File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/Vagrantfile"), "a+" do |file|
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
- say "Setting up new development site at '#{@opts[:dev_location]}'...", :yellow
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.get_vvv_path}/www",
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 = ask "Watch command to use :", :blue, default: "bundle exec guard"
457
- server = ask "Deployment command to use :", :blue, default: "bundle exec cap"
458
- vendor = ask "Vendor command to use :", :blue, default: "composer"
459
- install = ask "Commands to run on theme install :", :blue, default: "composer 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
- say "Successfully added 'tj-config.yml' file.", :green
495
+ ::ThemeJuice::UI.speak "Successfully added 'tj-config.yml' file.", {
496
+ color: :green,
497
+ icon: :bullet_solid
498
+ }
471
499
  else
472
- say "Could not create 'tj-config.yml' file.".ljust(terminal_width), [:white, :on_red]
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
- say "Successfully added 'vvv-hosts' file.", :green
515
+ ::ThemeJuice::UI.speak "Successfully added 'vvv-hosts' file.", {
516
+ color: :green,
517
+ icon: :bullet_solid
518
+ }
488
519
  else
489
- say "Could not create 'vvv-hosts' file.".ljust(terminal_width), [:white, :on_red]
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.get_vvv_path}/database/init-custom.sql"), "a+" do |file|
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
- say "Successfully added database to 'init-custom.sql'.", :green
542
+ ::ThemeJuice::UI.speak "Successfully added database to 'init-custom.sql'.", {
543
+ color: :green,
544
+ icon: :bullet_solid
545
+ }
512
546
  else
513
- say "Could not add database info for '#{@opts[:site_name]}' to 'init-custom.sql'.".ljust(terminal_width), [:white, :on_red]
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
- say "Successfully added 'vvv-nginx.conf' file.", :green
567
+ ::ThemeJuice::UI.speak "Successfully added 'vvv-nginx.conf' file.", {
568
+ color: :green,
569
+ icon: :bullet_solid
570
+ }
534
571
  else
535
- say "Could not create 'vvv-nginx.conf' file.".ljust(terminal_width), [:white, :on_red]
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
- say "Successfully added '.env.development' file.", :green
592
+ ::ThemeJuice::UI.speak "Successfully added '.env.development' file.", {
593
+ color: :green,
594
+ icon: :bullet_solid
595
+ }
556
596
  else
557
- say "Could not create '.env.development' file.".ljust(terminal_width), [:white, :on_red]
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
- say "Setting up WordPress...", :yellow
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
- say "Installing theme dependencies...", :yellow
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
- say "Syncing host theme directory '#{@opts[:site_location]}' with VM theme directory '/srv/www/tj-#{@opts[:site_name]}'...", :yellow
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.get_vvv_path}/Vagrantfile"), "a+" do |file|
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
- say "Setting up Git repository at '#{@opts[:repository]}'...", :yellow
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.get_vvv_path} && vagrant ssh-config > /tmp/vagrant_ssh_config && ssh -q %pseudotty% -F /tmp/vagrant_ssh_config default %cmd%"
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
- say "Successfully added ssh settings to 'wp-cli.local.yml' file.", :green
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
- say "Could not create 'wp-cli.local.yml' file.".ljust(terminal_width), [:white, :on_red]
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.get_vvv_path}").include? "www"
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
- say "VVV installation for '#{@opts[:site_name]}' successfully removed.", :yellow
728
+ ::ThemeJuice::UI.speak "VVV installation for '#{@opts[:site_name]}' successfully removed.", {
729
+ color: :green,
730
+ icon: :bullet_solid
731
+ }
674
732
  else
675
- say "Theme '#{@opts[:site_name]}' could not be removed. Make sure you have write capabilities.".ljust(terminal_width), [:white, :on_red]
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.get_vvv_path}/database/init-custom.sql"
686
- say "Database for '#{@opts[:site_name]}' successfully removed.", :yellow
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.get_vvv_path}/Vagrantfile"
697
- say "Synced folders for '#{@opts[:site_name]}' successfully removed.", :yellow
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
- say "Your version of Theme Juice (#{local_version}) is outdated. There is a newer version (#{remote_version}) available. Please update now.".ljust(terminal_width), [:black, :on_yellow]
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
- say "Your version of Theme Juice (#{local_version}) up to date.".ljust(terminal_width), [:black, :on_green]
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
@@ -1,3 +1,3 @@
1
1
  module ThemeJuice
2
- VERSION = "0.3.8"
2
+ VERSION = "0.4.0"
3
3
  end
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.3.8
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-05 00:00:00.000000000 Z
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