theme-juice 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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