theme-juice 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +59 -26
- data/lib/theme-juice.rb +5 -16
- data/lib/theme-juice/cli.rb +116 -90
- data/lib/theme-juice/{scaffold.rb → executor.rb} +158 -48
- data/lib/theme-juice/utilities.rb +70 -0
- data/lib/theme-juice/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47cfb1bd6b78a1ad40cef06b741e60a18fbb3d86
|
4
|
+
data.tar.gz: 0f55c3a06d5b06531eef6b62c8ed52e182cc9621
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dca54558fe02ceb234995e3e2f160c4f5045425ad18564abc06e0f4d535fb5b769e95834caacf430c147b28237e074527833811eb160545cd6a7d36cca0b8048
|
7
|
+
data.tar.gz: 567627416d854968ad33a8fae4c9e810980ef55f5fdb7ba3f42153967377f1ca681fb638df108c66afd484f7a593daf7cb37630d77f9d9170abe15fa4ec20c9b
|
data/README.md
CHANGED
@@ -5,78 +5,111 @@ Command line interface to scaffold out a new WordPress development environment a
|
|
5
5
|
* First, install [Vagrant](https://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) for local development.
|
6
6
|
* Then, install [Composer](https://getcomposer.org/) and [WP-CLI](http://wp-cli.org/) (make sure they're executable).
|
7
7
|
* Finally, install with: `gem install theme-juice`
|
8
|
-
|
9
8
|
That`s it!
|
10
9
|
|
10
|
+
## Config
|
11
|
+
Because everybody likes to use different tools, you can create a `tj-config.yml` file that will house all of your theme-specific commands. This allows you to use a streamlined set of commands that will act as aliases to your per-project configuration. If you're into [Grunt](https://github.com/gruntjs/grunt), then use it. Prefer [Guard](https://github.com/guard/guard)? Go right ahead. This is obviously relative to the starter theme you use, since you can't exactly use Grunt with a starter theme that doesn't support it. Below is the config that comes baked into [our starter theme](https://github.com/ezekg/theme-juice-starter):
|
12
|
+
|
13
|
+
```yml
|
14
|
+
watch: bundle exec guard
|
15
|
+
server: bundle exec cap
|
16
|
+
vendor: composer
|
17
|
+
install:
|
18
|
+
- composer install
|
19
|
+
|
20
|
+
```
|
21
|
+
|
22
|
+
_Note: If you use a starter theme that doesn't have a `tj-config.yml` file, you'll be prompted through a series of steps in order to create one._
|
23
|
+
|
24
|
+
#### Config options:
|
25
|
+
| Option | Usage |
|
26
|
+
|:--------- |:----------------------------------------------------------------------------- |
|
27
|
+
| `watch` | Command to be aliased when you run `tj watch` for bulding assets |
|
28
|
+
| `server` | Command to be aliased when you run `tj server` for deployments |
|
29
|
+
| `vendor` | Command to be aliased when you run `tj vendor` for dependencies |
|
30
|
+
| `install` | Each command is executed when you run `tj install` to prepare a starter theme |
|
31
|
+
|
11
32
|
## Usage
|
12
33
|
|
13
|
-
|
34
|
+
### List available commands:
|
14
35
|
List all commands for `tj`.
|
15
36
|
```bash
|
16
37
|
tj
|
17
38
|
```
|
18
39
|
|
19
|
-
|
40
|
+
### Print version:
|
20
41
|
This command will print the current version of `tj`.
|
21
42
|
```bash
|
22
|
-
tj version
|
43
|
+
tj --version # Aliases: -v, version
|
23
44
|
```
|
24
45
|
|
25
|
-
|
46
|
+
### Setup VVV:
|
26
47
|
This command will _only_ setup [Varying Vagrant Vagrants](https://github.com/Varying-Vagrant-Vagrants/VVV). It will not prompt you to create a new site. _Note: This is automatically run when you create your first site._
|
27
48
|
```bash
|
28
49
|
tj init
|
29
50
|
```
|
30
51
|
|
31
|
-
|
52
|
+
### Creating a new development site:
|
32
53
|
Use this to create a new development site. It will automagically set up your entire development environment, including a local development site at `http://<sites-dev-url>.dev` with WordPress installed and a fresh WP database. It will sync up your local site installation with the Vagrant VM. This task will also install and configure Vagrant/VVV into your `~/` directory if it has not already been installed. Site name is optional, as it will be asked for if not given.
|
33
54
|
```bash
|
34
|
-
tj create [<SITE-NAME>]
|
55
|
+
tj create [<SITE-NAME>] # Aliases: new, build, make
|
35
56
|
```
|
36
57
|
|
37
|
-
####
|
58
|
+
#### Option flags:
|
59
|
+
| Flag | Type | Description |
|
60
|
+
|:--------------------------------------- |:------ |:------------------------------------------------ |
|
61
|
+
| `-b, [--bare], [--no-bare]` | Bool | Create a VVV site without a starter theme |
|
62
|
+
| `-s, [--site=SITE]` | String | Name of the development site |
|
63
|
+
| `-l, [--location=LOCATION]` | Path | Location of the local site |
|
64
|
+
| `-t, [--theme=THEME]` | URL | Starter theme to install (can use `none`) |
|
65
|
+
| `-u, [--url=URL]` | URL | Development URL of the site (must end in `.dev`) |
|
66
|
+
| `-r, [--repository]` | String | Initialize a new Git remote repository |
|
67
|
+
| `[--skip-repo], [--no-skip-repo]` | Bool | Skip repository prompts and set to `none` |
|
68
|
+
| `[--skip-db], [--no-skip-db]` | Bool | Skip database prompts and use defaults |
|
69
|
+
|
70
|
+
### Setting up an existing site:
|
38
71
|
Use this to setup an existing local site installation within the development environment. You will go through the setup process to create the necessary files for the VM, including `vvv-hosts`, `vvv-nginx.conf`, and a fresh database (unless one already exists by the name chosen). Site name is optional, as it will be asked for if not given.
|
39
72
|
```bash
|
40
|
-
tj setup [<SITE-NAME>] #
|
73
|
+
tj setup [<SITE-NAME>] # Aliases: init, prep
|
41
74
|
```
|
42
75
|
|
43
|
-
|
76
|
+
### Deleting a site from the VM: _(Does not remove your local site)_
|
44
77
|
Use this to remove a site from your development environment. This is only remove files that were generated by `tj`. including the database setup, development url, and shared directories. _It will not touch your local files._
|
45
78
|
```bash
|
46
|
-
tj delete <SITE-NAME>
|
79
|
+
tj delete <SITE-NAME> # Aliases: remove, teardown
|
47
80
|
```
|
48
81
|
|
49
|
-
|
82
|
+
### Listing all `tj` sites in the VM:
|
50
83
|
Use this to list all sites within your development environment that were generated by `tj`.
|
51
84
|
```bash
|
52
|
-
tj list
|
85
|
+
tj list # Aliases: sites, show
|
53
86
|
```
|
54
87
|
|
55
|
-
|
56
|
-
Use this to watch and compile assets with [Guard](https://github.com/guard/guard). This is simply a wrapper for
|
88
|
+
### Watching and compiling assets:
|
89
|
+
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.
|
57
90
|
```bash
|
58
|
-
tj watch #
|
91
|
+
tj watch # Aliases: dev
|
59
92
|
```
|
60
93
|
|
61
|
-
|
62
|
-
Use this to easily manage your [Varying Vagrant Vagrants](https://github.com/Varying-Vagrant-Vagrants/VVV) development environment. This is simply a wrapper for Vagrant commands.
|
94
|
+
### Managing development environment:
|
95
|
+
Use this to easily manage your [Varying Vagrant Vagrants](https://github.com/Varying-Vagrant-Vagrants/VVV) development environment. This is simply a wrapper for Vagrant commands executed within your VVV path.
|
63
96
|
```bash
|
64
|
-
tj vm #
|
97
|
+
tj vm # Aliases: vagrant, vvv
|
65
98
|
```
|
66
99
|
|
67
|
-
|
68
|
-
Use this to easily manage your [Composer](https://github.com/composer/composer)
|
100
|
+
### Managing vendor dependencies:
|
101
|
+
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.
|
69
102
|
```bash
|
70
|
-
tj vendor #
|
103
|
+
tj vendor # Aliases: deps
|
71
104
|
```
|
72
105
|
|
73
|
-
|
74
|
-
Use this to easily manage your deployment and migration with [Capistrano](https://github.com/capistrano/capistrano). This is
|
106
|
+
### Managing deployment and migration:
|
107
|
+
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.
|
75
108
|
```bash
|
76
|
-
tj server #
|
109
|
+
tj server # Aliases: deploy
|
77
110
|
```
|
78
111
|
|
79
|
-
|
112
|
+
### Executing WP-CLI locally inside your VM with `wp-cli-ssh`
|
80
113
|
You can run `wp` commands locally if you specify a `--host`. Upon setup, an `ssh` block for the VM is automatically added to the `wp-cli.local.yml` file with all of your development environment paths.
|
81
114
|
```bash
|
82
115
|
wp ssh --host=vagrant [<COMMANDS>]
|
data/lib/theme-juice.rb
CHANGED
@@ -2,26 +2,15 @@ require "securerandom"
|
|
2
2
|
require "fileutils"
|
3
3
|
require "pathname"
|
4
4
|
require "tempfile"
|
5
|
+
require "rubygems"
|
5
6
|
require "thor"
|
7
|
+
require "yaml"
|
6
8
|
|
7
9
|
require_relative "theme-juice/version"
|
8
|
-
require_relative "theme-juice/
|
10
|
+
require_relative "theme-juice/utilities"
|
11
|
+
require_relative "theme-juice/executor"
|
9
12
|
require_relative "theme-juice/cli"
|
10
13
|
|
11
14
|
module ThemeJuice
|
12
|
-
|
13
|
-
|
14
|
-
###
|
15
|
-
# Check if program is installed
|
16
|
-
#
|
17
|
-
# @note Doesn't work on Win
|
18
|
-
#
|
19
|
-
# @param {String} program
|
20
|
-
#
|
21
|
-
# @return {Bool}
|
22
|
-
###
|
23
|
-
def installed?(program)
|
24
|
-
system "which #{program} > /dev/null 2>&1"
|
25
|
-
end
|
26
|
-
end
|
15
|
+
# Silence is golden?
|
27
16
|
end
|
data/lib/theme-juice/cli.rb
CHANGED
@@ -1,11 +1,34 @@
|
|
1
1
|
module ThemeJuice
|
2
2
|
class CLI < ::Thor
|
3
3
|
|
4
|
+
map %w[--version -v] => :version
|
5
|
+
map %w[new, build, make] => :create
|
6
|
+
map %w[setup, init, prep] => :create
|
7
|
+
map %w[remove, teardown] => :delete
|
8
|
+
map %w[sites, show] => :list
|
9
|
+
map %w[dev] => :watch
|
10
|
+
map %w[dep, deps] => :vendor
|
11
|
+
map %w[deploy] => :server
|
12
|
+
map %w[vagrant, vvv] => :vm
|
13
|
+
|
14
|
+
class_option :vvv_path, type: :string, alias: "-fp", default: nil, desc: "Force path to VVV installation"
|
15
|
+
|
4
16
|
###
|
5
|
-
# Non
|
17
|
+
# Non-Thor commands
|
6
18
|
###
|
7
19
|
no_commands do
|
8
20
|
|
21
|
+
###
|
22
|
+
# Set VVV path
|
23
|
+
#
|
24
|
+
# @return {Void}
|
25
|
+
###
|
26
|
+
def force_vvv_path?
|
27
|
+
unless options[:vvv_path].nil?
|
28
|
+
::ThemeJuice::Utilities.set_vvv_path options[:vvv_path]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
9
32
|
###
|
10
33
|
# Welcome message
|
11
34
|
#
|
@@ -30,22 +53,11 @@ module ThemeJuice
|
|
30
53
|
#
|
31
54
|
# @return {String}
|
32
55
|
###
|
33
|
-
desc "version", "Print current version"
|
56
|
+
desc "--version, -v", "Print current version"
|
34
57
|
def version
|
35
|
-
|
36
|
-
end
|
58
|
+
# ::ThemeJuice::Utilities.check_if_current_version_is_outdated
|
37
59
|
|
38
|
-
|
39
|
-
# Install and setup VVV environment
|
40
|
-
#
|
41
|
-
# @return {Void}
|
42
|
-
###
|
43
|
-
desc "init", "Setup the VVV environment"
|
44
|
-
def init
|
45
|
-
self.welcome
|
46
|
-
|
47
|
-
# Setup the VM
|
48
|
-
::ThemeJuice::Scaffold::init
|
60
|
+
say ::ThemeJuice::VERSION, :green
|
49
61
|
end
|
50
62
|
|
51
63
|
###
|
@@ -58,37 +70,17 @@ module ThemeJuice
|
|
58
70
|
#
|
59
71
|
# @return {Void}
|
60
72
|
###
|
61
|
-
desc "create [SITE]", "
|
62
|
-
method_option :bare,
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
method_option :site
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
type: :string,
|
73
|
-
aliases: "-l",
|
74
|
-
default: false,
|
75
|
-
desc: "Location of the local site"
|
76
|
-
method_option :theme,
|
77
|
-
type: :string,
|
78
|
-
aliases: "-t",
|
79
|
-
default: false,
|
80
|
-
desc: "Starter theme to install"
|
81
|
-
method_option :url,
|
82
|
-
type: :string,
|
83
|
-
aliases: "-u",
|
84
|
-
default: false,
|
85
|
-
desc: "Development URL of the site"
|
86
|
-
method_option :repository,
|
87
|
-
type: :boolean,
|
88
|
-
aliases: "-r",
|
89
|
-
default: false,
|
90
|
-
desc: "Initialize a new Git remote repository"
|
91
|
-
def create(site = nil, bare_setup = false)
|
73
|
+
desc "create [SITE]", "Create new SITE and setup the VVV development environment"
|
74
|
+
method_option :bare, type: :boolean, aliases: "-b", desc: "Create a VVV site without a starter theme"
|
75
|
+
method_option :site, type: :string, aliases: "-s", default: false, desc: "Name of the development site"
|
76
|
+
method_option :location, type: :string, aliases: "-l", default: false, desc: "Location of the local site"
|
77
|
+
method_option :theme, type: :string, aliases: "-t", default: false, desc: "Starter theme to install"
|
78
|
+
method_option :url, type: :string, aliases: "-u", default: false, desc: "Development URL of the site"
|
79
|
+
method_option :repository, type: :string, aliases: "-r", desc: "Initialize a new Git remote repository"
|
80
|
+
method_option :skip_repo, type: :boolean, desc: "Skip repository prompts and use defaults"
|
81
|
+
method_option :skip_db, type: :boolean, desc: "Skip database prompts and use defaults"
|
82
|
+
def create(site = nil)
|
83
|
+
self.force_vvv_path?
|
92
84
|
self.welcome
|
93
85
|
|
94
86
|
if options[:site]
|
@@ -96,7 +88,7 @@ module ThemeJuice
|
|
96
88
|
end
|
97
89
|
|
98
90
|
# Check if user passed all required options through flags
|
99
|
-
if options.
|
91
|
+
if options.length >= 6
|
100
92
|
say "Well... looks like you just have everything all figured out, huh?", :yellow
|
101
93
|
elsif site.nil?
|
102
94
|
say "Just a few questions before we begin...", :yellow
|
@@ -128,31 +120,42 @@ module ThemeJuice
|
|
128
120
|
end
|
129
121
|
|
130
122
|
# Starter theme to clone
|
131
|
-
|
123
|
+
if bare_setup
|
124
|
+
starter_theme = "none"
|
125
|
+
else
|
132
126
|
|
133
127
|
if options[:theme]
|
134
128
|
starter_theme = options[:theme]
|
135
129
|
else
|
136
130
|
require "highline/import"
|
137
131
|
|
138
|
-
|
132
|
+
# Hash of baked-in starter themes
|
133
|
+
themes = {
|
134
|
+
"theme-juice/theme-juice-starter" => "https://github.com/ezekg/theme-juice-starter.git"
|
135
|
+
}
|
139
136
|
|
140
137
|
say "Which starter theme would you like to use? :", :blue
|
141
138
|
choose do |menu|
|
142
139
|
menu.index_suffix = ") "
|
143
140
|
|
144
|
-
|
145
|
-
|
146
|
-
|
141
|
+
themes.each do |theme, repo|
|
142
|
+
menu.choice theme do
|
143
|
+
|
144
|
+
if theme == "theme-juice/theme-juice-starter"
|
145
|
+
say "Awesome choice!", :green
|
146
|
+
end
|
147
|
+
|
148
|
+
starter_theme = repo
|
149
|
+
end
|
147
150
|
end
|
148
151
|
|
149
152
|
menu.choice "other" do
|
150
|
-
starter_theme = ask "What is the
|
153
|
+
starter_theme = ask "What is the repository URL for the starter theme you would like to clone? :", :blue
|
151
154
|
end
|
152
155
|
|
153
|
-
menu.choice "none" do |
|
156
|
+
menu.choice "none" do |opt|
|
154
157
|
say "Next time you want to create a site without a starter theme, you can just run the 'setup' command instead.", :yellow
|
155
|
-
starter_theme, bare_setup =
|
158
|
+
starter_theme, bare_setup = opt, true
|
156
159
|
end
|
157
160
|
end
|
158
161
|
end
|
@@ -171,40 +174,44 @@ module ThemeJuice
|
|
171
174
|
end
|
172
175
|
|
173
176
|
# Initialize a git repository on setup
|
174
|
-
if options[:
|
175
|
-
repository =
|
177
|
+
if options[:skip_repo]
|
178
|
+
repository = false
|
176
179
|
else
|
177
|
-
if
|
178
|
-
repository =
|
180
|
+
if options[:repository]
|
181
|
+
repository = options[:repository]
|
179
182
|
else
|
180
|
-
repository
|
183
|
+
if yes? "Would you like to initialize a new Git repository? (y/N) :", :blue
|
184
|
+
repository = ask "What is the repository's URL? :", :blue
|
185
|
+
else
|
186
|
+
repository = false
|
187
|
+
end
|
181
188
|
end
|
182
189
|
end
|
183
190
|
|
184
191
|
# Database host
|
185
|
-
if options[:
|
186
|
-
db_host =
|
192
|
+
if options[:skip_db]
|
193
|
+
db_host = "vvv"
|
187
194
|
else
|
188
195
|
db_host = ask "Database host :", :blue, default: "vvv"
|
189
196
|
end
|
190
197
|
|
191
198
|
# Database name
|
192
|
-
if options[:
|
193
|
-
db_name =
|
199
|
+
if options[:skip_db]
|
200
|
+
db_name = "#{clean_site_name}_db"
|
194
201
|
else
|
195
202
|
db_name = ask "Database name :", :blue, default: "#{clean_site_name}_db"
|
196
203
|
end
|
197
204
|
|
198
205
|
# Database username
|
199
|
-
if options[:
|
200
|
-
db_user =
|
206
|
+
if options[:skip_db]
|
207
|
+
db_user = "#{clean_site_name}_user"
|
201
208
|
else
|
202
209
|
db_user = ask "Database username :", :blue, default: "#{clean_site_name}_user"
|
203
210
|
end
|
204
211
|
|
205
212
|
# Database password
|
206
|
-
if options[:
|
207
|
-
db_pass =
|
213
|
+
if options[:skip_db]
|
214
|
+
db_pass = SecureRandom.base64
|
208
215
|
else
|
209
216
|
db_pass = ask "Database password :", :blue, default: SecureRandom.base64
|
210
217
|
end
|
@@ -215,7 +222,7 @@ module ThemeJuice
|
|
215
222
|
site_location: File.expand_path(site_location),
|
216
223
|
starter_theme: starter_theme,
|
217
224
|
bare_setup: bare_setup,
|
218
|
-
dev_location: File.expand_path("
|
225
|
+
dev_location: File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/www/tj-#{site}"),
|
219
226
|
dev_url: dev_url,
|
220
227
|
repository: repository,
|
221
228
|
db_host: db_host,
|
@@ -237,9 +244,9 @@ module ThemeJuice
|
|
237
244
|
say "---> Database password: #{opts[:db_pass]}", :green
|
238
245
|
|
239
246
|
if yes? "Do the options above look correct? (y/N) :", :blue
|
240
|
-
::ThemeJuice::
|
247
|
+
::ThemeJuice::Executor::create opts
|
241
248
|
else
|
242
|
-
say "
|
249
|
+
say "Dang typos... aborting mission.", :red
|
243
250
|
exit 1
|
244
251
|
end
|
245
252
|
else
|
@@ -256,9 +263,9 @@ module ThemeJuice
|
|
256
263
|
#
|
257
264
|
# @return {Void}
|
258
265
|
###
|
259
|
-
desc "setup [SITE]", "
|
266
|
+
desc "setup [SITE]", "Setup an existing SITE in development environment"
|
260
267
|
def setup(site = nil)
|
261
|
-
|
268
|
+
invoke :create, [site], bare: true
|
262
269
|
end
|
263
270
|
|
264
271
|
###
|
@@ -272,8 +279,10 @@ module ThemeJuice
|
|
272
279
|
desc "delete SITE", "Remove SITE from the VVV development environment (does not remove local site)"
|
273
280
|
method_option :restart, type: :boolean
|
274
281
|
def delete(site)
|
282
|
+
self.force_vvv_path?
|
283
|
+
|
275
284
|
if yes? "Are you sure you want to delete '#{site}'? (y/N)", :red
|
276
|
-
::ThemeJuice::
|
285
|
+
::ThemeJuice::Executor::delete site, options[:restart]
|
277
286
|
end
|
278
287
|
end
|
279
288
|
|
@@ -284,59 +293,76 @@ module ThemeJuice
|
|
284
293
|
###
|
285
294
|
desc "list", "List all sites within the VVV development environment"
|
286
295
|
def list
|
287
|
-
|
296
|
+
self.force_vvv_path?
|
297
|
+
|
298
|
+
::ThemeJuice::Executor::list
|
288
299
|
end
|
289
300
|
|
290
301
|
###
|
291
|
-
#
|
302
|
+
# Install and setup starter theme
|
303
|
+
#
|
304
|
+
# @return {Void}
|
305
|
+
###
|
306
|
+
desc "install", "Run installation for the starter theme"
|
307
|
+
method_option :config, type: :string, aliases: "-c", default: nil, desc: "Force path to config file"
|
308
|
+
def install
|
309
|
+
::ThemeJuice::Executor::install options[:config]
|
310
|
+
end
|
311
|
+
|
312
|
+
###
|
313
|
+
# Assets
|
292
314
|
#
|
293
315
|
# @param {*} commands
|
294
316
|
# Commands to run
|
295
317
|
#
|
296
318
|
# @return {Void}
|
297
319
|
###
|
298
|
-
desc "watch [COMMANDS]", "Watch and compile assets
|
320
|
+
desc "watch [COMMANDS]", "Watch and compile assets"
|
299
321
|
def watch(*commands)
|
300
|
-
|
322
|
+
::ThemeJuice::Executor::subcommand "#{__method__}", commands.join(" ")
|
301
323
|
end
|
302
324
|
|
303
325
|
###
|
304
|
-
#
|
326
|
+
# Vendor dependencies
|
305
327
|
#
|
306
328
|
# @param {*} commands
|
307
329
|
# Commands to run
|
308
330
|
#
|
309
331
|
# @return {Void}
|
310
332
|
###
|
311
|
-
desc "
|
312
|
-
def
|
313
|
-
|
333
|
+
desc "vendor [COMMANDS]", "Manage vendor dependencies"
|
334
|
+
def vendor(*commands)
|
335
|
+
::ThemeJuice::Executor::subcommand "#{__method__}", commands.join(" ")
|
314
336
|
end
|
315
337
|
|
316
338
|
###
|
317
|
-
#
|
339
|
+
# Server/Deployment
|
318
340
|
#
|
319
341
|
# @param {*} commands
|
320
342
|
# Commands to run
|
321
343
|
#
|
322
344
|
# @return {Void}
|
323
345
|
###
|
324
|
-
desc "
|
325
|
-
def
|
326
|
-
|
346
|
+
desc "server [COMMANDS]", "Manage deployment and migration"
|
347
|
+
def server(*commands)
|
348
|
+
self.force_vvv_path?
|
349
|
+
|
350
|
+
::ThemeJuice::Executor::subcommand "#{__method__}", commands.join(" ")
|
327
351
|
end
|
328
352
|
|
329
353
|
###
|
330
|
-
#
|
354
|
+
# Vagrant
|
331
355
|
#
|
332
356
|
# @param {*} commands
|
333
357
|
# Commands to run
|
334
358
|
#
|
335
359
|
# @return {Void}
|
336
360
|
###
|
337
|
-
desc "
|
338
|
-
def
|
339
|
-
|
361
|
+
desc "vm [COMMANDS]", "Manage virtual development environment with Vagrant"
|
362
|
+
def vm(*commands)
|
363
|
+
self.force_vvv_path?
|
364
|
+
|
365
|
+
system "cd #{::ThemeJuice::Utilities.get_vvv_path} && vagrant #{commands.join(" ")}"
|
340
366
|
end
|
341
367
|
end
|
342
368
|
end
|
@@ -1,21 +1,44 @@
|
|
1
1
|
module ThemeJuice
|
2
|
-
module
|
2
|
+
module Executor
|
3
3
|
class << self
|
4
4
|
include ::Thor::Actions
|
5
5
|
include ::Thor::Shell
|
6
6
|
|
7
7
|
###
|
8
|
-
#
|
8
|
+
# Run installation from config
|
9
|
+
#
|
10
|
+
# @param {String} config_path (nil)
|
9
11
|
#
|
10
12
|
# @return {Void}
|
11
13
|
###
|
12
|
-
def
|
13
|
-
|
14
|
+
def install(config_path = nil)
|
15
|
+
config_path ||= File.expand_path(Dir.pwd)
|
16
|
+
|
17
|
+
use_config config_path
|
18
|
+
|
19
|
+
@config["install"].each do |command|
|
20
|
+
run ["cd #{config_path}", command], false
|
21
|
+
end
|
22
|
+
end
|
14
23
|
|
15
|
-
|
16
|
-
|
24
|
+
###
|
25
|
+
# Run subcommand from config
|
26
|
+
#
|
27
|
+
# @param {String} subcommand
|
28
|
+
# @param {String} commands
|
29
|
+
#
|
30
|
+
# @return {Void}
|
31
|
+
###
|
32
|
+
def subcommand(subcommand, commands)
|
33
|
+
config_path = File.expand_path(Dir.pwd)
|
34
|
+
|
35
|
+
use_config config_path
|
36
|
+
|
37
|
+
if @config[subcommand]
|
38
|
+
run ["#{@config[subcommand]} #{commands}"], false
|
17
39
|
else
|
18
|
-
say "
|
40
|
+
say "Unable to find '#{subcommand}' command in '#{config_path}/tj-config.yml'. Aborting mission.", :red
|
41
|
+
exit 1
|
19
42
|
end
|
20
43
|
end
|
21
44
|
|
@@ -31,10 +54,20 @@ module ThemeJuice
|
|
31
54
|
|
32
55
|
say "Running setup for '#{@opts[:site_name]}'...", :yellow
|
33
56
|
|
57
|
+
unless project_dir_is_setup?
|
58
|
+
setup_project_dir
|
59
|
+
end
|
60
|
+
|
34
61
|
unless wordpress_is_setup?
|
35
62
|
setup_wordpress
|
36
63
|
end
|
37
64
|
|
65
|
+
if config_is_setup? @opts[:site_location]
|
66
|
+
use_config @opts[:site_location]
|
67
|
+
|
68
|
+
install_theme_dependencies
|
69
|
+
end
|
70
|
+
|
38
71
|
unless vvv_is_setup?
|
39
72
|
setup_vvv
|
40
73
|
end
|
@@ -125,7 +158,7 @@ module ThemeJuice
|
|
125
158
|
###
|
126
159
|
@opts = {
|
127
160
|
site_name: site,
|
128
|
-
dev_location: File.expand_path("
|
161
|
+
dev_location: File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/www/tj-#{site}")
|
129
162
|
}
|
130
163
|
|
131
164
|
if dev_site_is_setup?
|
@@ -152,6 +185,7 @@ module ThemeJuice
|
|
152
185
|
end
|
153
186
|
else
|
154
187
|
say "Site '#{@opts[:site_name]}' could not be fully be removed.", :red
|
188
|
+
exit 1
|
155
189
|
end
|
156
190
|
end
|
157
191
|
|
@@ -163,16 +197,14 @@ module ThemeJuice
|
|
163
197
|
def list
|
164
198
|
sites = []
|
165
199
|
|
166
|
-
Dir.glob(File.expand_path("
|
200
|
+
Dir.glob(File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/www/*")).each do |f|
|
167
201
|
sites << File.basename(f).gsub(/(tj-)/, "") if File.directory?(f) && f.include?("tj-")
|
168
202
|
end
|
169
203
|
|
170
204
|
if sites.empty?
|
171
205
|
say "Nothing to list. Create a new site!", :yellow
|
172
206
|
else
|
173
|
-
i
|
174
|
-
# Output site to cli
|
175
|
-
sites.each { |site| i += 1; say "#{i}) #{site}", :green }
|
207
|
+
sites.each_with_index { |site, i| say "#{i+1}) #{site}", :green }
|
176
208
|
end
|
177
209
|
|
178
210
|
sites
|
@@ -195,18 +227,48 @@ module ThemeJuice
|
|
195
227
|
system commands.join "&&"
|
196
228
|
end
|
197
229
|
|
230
|
+
###
|
231
|
+
# Verify config is properly setup, set global var
|
232
|
+
#
|
233
|
+
# @param {String} config_path
|
234
|
+
#
|
235
|
+
# @return {Void}
|
236
|
+
###
|
237
|
+
def use_config(config_path)
|
238
|
+
|
239
|
+
if config_is_setup? config_path
|
240
|
+
@config = YAML.load_file "#{config_path}/tj-config.yml"
|
241
|
+
else
|
242
|
+
say "Unable to find 'tj-config.yml' file in '#{config_path}'.", :red
|
243
|
+
|
244
|
+
if yes? "Would you like to create one? (y/N) :", :blue
|
245
|
+
|
246
|
+
setup_config(config_path)
|
247
|
+
|
248
|
+
if config_is_setup? config_path
|
249
|
+
say "Please re-run the last command to continue.", :yellow
|
250
|
+
exit
|
251
|
+
else
|
252
|
+
exit 1
|
253
|
+
end
|
254
|
+
else
|
255
|
+
say "A config file is needed to continue installation. Aborting mission.", :red
|
256
|
+
exit 1
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
198
261
|
###
|
199
262
|
# Restart Vagrant
|
200
263
|
#
|
201
|
-
# @note
|
202
|
-
#
|
203
|
-
# 'vagrant up' to be fired for it to set up the DNS correctly.
|
264
|
+
# @note Normally a simple 'vagrant reload' would work, but Landrush requires
|
265
|
+
# a 'vagrant up' to be fired for it to set up the DNS correctly.
|
204
266
|
#
|
205
267
|
# @return {Void}
|
206
268
|
###
|
207
269
|
def restart_vagrant
|
208
270
|
run [
|
209
|
-
"cd
|
271
|
+
"cd #{::ThemeJuice::Utilities.get_vvv_path}",
|
210
272
|
"vagrant halt",
|
211
273
|
"vagrant up --provision",
|
212
274
|
], false
|
@@ -226,18 +288,32 @@ module ThemeJuice
|
|
226
288
|
!setup_was_successful?
|
227
289
|
end
|
228
290
|
|
291
|
+
###
|
292
|
+
# @return {Bool}
|
293
|
+
###
|
294
|
+
def project_dir_is_setup?
|
295
|
+
Dir.exist? "#{@opts[:site_location]}"
|
296
|
+
end
|
297
|
+
|
298
|
+
###
|
299
|
+
# @return {Bool}
|
300
|
+
###
|
301
|
+
def config_is_setup?(config_path)
|
302
|
+
File.exist? "#{config_path}/tj-config.yml"
|
303
|
+
end
|
304
|
+
|
229
305
|
###
|
230
306
|
# @return {Bool}
|
231
307
|
###
|
232
308
|
def vvv_is_setup?
|
233
|
-
File.exist? File.expand_path(
|
309
|
+
File.exist? File.expand_path(::ThemeJuice::Utilities.get_vvv_path)
|
234
310
|
end
|
235
311
|
|
236
312
|
###
|
237
313
|
# @return {Bool}
|
238
314
|
###
|
239
315
|
def wildcard_subdomains_is_setup?
|
240
|
-
File.readlines(File.expand_path("
|
316
|
+
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/Vagrantfile")).grep(/(config.landrush.enabled = true)/m).any?
|
241
317
|
end
|
242
318
|
|
243
319
|
###
|
@@ -258,7 +334,7 @@ module ThemeJuice
|
|
258
334
|
# @return {Bool}
|
259
335
|
###
|
260
336
|
def database_is_setup?
|
261
|
-
File.readlines(File.expand_path("
|
337
|
+
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/database/init-custom.sql")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
|
262
338
|
end
|
263
339
|
|
264
340
|
###
|
@@ -279,7 +355,7 @@ module ThemeJuice
|
|
279
355
|
# @return {Bool}
|
280
356
|
###
|
281
357
|
def synced_folder_is_setup?
|
282
|
-
File.readlines(File.expand_path("
|
358
|
+
File.readlines(File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/Vagrantfile")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
|
283
359
|
end
|
284
360
|
|
285
361
|
###
|
@@ -309,16 +385,26 @@ module ThemeJuice
|
|
309
385
|
# @return {Void}
|
310
386
|
###
|
311
387
|
def setup_vvv
|
312
|
-
say "Installing VVV into '#{File.expand_path("
|
388
|
+
say "Installing VVV into '#{File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}")}'...", :yellow
|
313
389
|
run [
|
314
390
|
"vagrant plugin install vagrant-hostsupdater",
|
315
391
|
"vagrant plugin install vagrant-triggers",
|
316
392
|
"vagrant plugin install landrush",
|
317
|
-
"git clone https://github.com/Varying-Vagrant-Vagrants/VVV.git
|
318
|
-
"cd
|
393
|
+
"git clone https://github.com/Varying-Vagrant-Vagrants/VVV.git #{::ThemeJuice::Utilities.get_vvv_path}",
|
394
|
+
"cd #{::ThemeJuice::Utilities.get_vvv_path}/database && touch init-custom.sql"
|
319
395
|
]
|
320
396
|
end
|
321
397
|
|
398
|
+
###
|
399
|
+
# Ensure project directory structure
|
400
|
+
#
|
401
|
+
# @return {Void}
|
402
|
+
###
|
403
|
+
def setup_project_dir
|
404
|
+
say "Creating project directory tree in '#{@opts[:site_location]}'...", :yellow
|
405
|
+
run ["mkdir -p #{@opts[:site_location]}"]
|
406
|
+
end
|
407
|
+
|
322
408
|
###
|
323
409
|
# Enable Landrush for wildcard subdomains
|
324
410
|
#
|
@@ -329,7 +415,7 @@ module ThemeJuice
|
|
329
415
|
###
|
330
416
|
def setup_wildcard_subdomains
|
331
417
|
say "Setting up wildcard subdomains...", :yellow
|
332
|
-
open File.expand_path("
|
418
|
+
open File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/Vagrantfile"), "a+" do |file|
|
333
419
|
file.puts "\n"
|
334
420
|
file.puts "###"
|
335
421
|
file.puts "# Enable wildcard subdomains"
|
@@ -352,11 +438,39 @@ module ThemeJuice
|
|
352
438
|
def setup_dev_site
|
353
439
|
say "Setting up new development site at '#{@opts[:dev_location]}'...", :yellow
|
354
440
|
run [
|
355
|
-
"cd
|
441
|
+
"cd #{::ThemeJuice::Utilities.get_vvv_path}/www",
|
356
442
|
"mkdir tj-#{@opts[:site_name]}",
|
357
443
|
]
|
358
444
|
end
|
359
445
|
|
446
|
+
###
|
447
|
+
# Create tj-config.yml file for theme settings
|
448
|
+
#
|
449
|
+
# @param {String} config_path
|
450
|
+
#
|
451
|
+
# @return {Void}
|
452
|
+
###
|
453
|
+
def setup_config(config_path)
|
454
|
+
watch = ask "Watch command to use :", :blue, default: "bundle exec guard"
|
455
|
+
server = ask "Deployment command to use :", :blue, default: "bundle exec cap"
|
456
|
+
vendor = ask "Vendor command to use :", :blue, default: "composer"
|
457
|
+
install = ask "Commands to run on theme install :", :blue, default: "composer install"
|
458
|
+
|
459
|
+
File.open "#{config_path}/tj-config.yml", "w" do |file|
|
460
|
+
file.puts "watch: #{watch}"
|
461
|
+
file.puts "server: #{server}"
|
462
|
+
file.puts "vendor: #{vendor}"
|
463
|
+
file.puts "install:"
|
464
|
+
file.puts "\s\s\s\s- #{install}"
|
465
|
+
end
|
466
|
+
|
467
|
+
if config_is_setup? config_path
|
468
|
+
say "Successfully added 'tj-config.yml' file.", :green
|
469
|
+
else
|
470
|
+
say "Could not create 'tj-config.yml' file.", :red
|
471
|
+
end
|
472
|
+
end
|
473
|
+
|
360
474
|
###
|
361
475
|
# Create vvv-hosts file
|
362
476
|
#
|
@@ -380,7 +494,7 @@ module ThemeJuice
|
|
380
494
|
# @return {Void}
|
381
495
|
###
|
382
496
|
def setup_database
|
383
|
-
File.open File.expand_path("
|
497
|
+
File.open File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/database/init-custom.sql"), "a+" do |file|
|
384
498
|
file.puts "### Begin '#{@opts[:site_name]}'"
|
385
499
|
file.puts "#"
|
386
500
|
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
@@ -445,35 +559,31 @@ module ThemeJuice
|
|
445
559
|
###
|
446
560
|
# Setup WordPress
|
447
561
|
#
|
448
|
-
# Clones starter theme into
|
562
|
+
# Clones starter theme into site location
|
449
563
|
#
|
450
564
|
# @return {Void}
|
451
565
|
###
|
452
566
|
def setup_wordpress
|
453
567
|
say "Setting up WordPress...", :yellow
|
454
568
|
|
455
|
-
|
456
|
-
|
457
|
-
# Create theme dir
|
458
|
-
run [
|
459
|
-
"mkdir -p #{@opts[:site_location]}",
|
460
|
-
]
|
461
|
-
|
462
|
-
else
|
463
|
-
|
464
|
-
# Clone starter theme
|
569
|
+
unless @opts[:bare_setup]
|
465
570
|
run [
|
466
|
-
"mkdir -p #{@opts[:site_location]}",
|
467
571
|
"cd #{@opts[:site_location]}",
|
468
|
-
"git clone --depth 1
|
572
|
+
"git clone --depth 1 #{@opts[:starter_theme]} .",
|
469
573
|
]
|
574
|
+
end
|
575
|
+
end
|
470
576
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
577
|
+
###
|
578
|
+
# Install dependencies for starter theme
|
579
|
+
#
|
580
|
+
# @return {Void}
|
581
|
+
###
|
582
|
+
def install_theme_dependencies
|
583
|
+
say "Installing theme dependencies...", :yellow
|
476
584
|
|
585
|
+
@config["install"].each do |command|
|
586
|
+
run ["cd #{@opts[:site_location]}", command], false
|
477
587
|
end
|
478
588
|
end
|
479
589
|
|
@@ -485,7 +595,7 @@ module ThemeJuice
|
|
485
595
|
def setup_synced_folder
|
486
596
|
say "Syncing host theme directory '#{@opts[:site_location]}' with VM theme directory '/srv/www/tj-#{@opts[:site_name]}'...", :yellow
|
487
597
|
|
488
|
-
open File.expand_path("
|
598
|
+
open File.expand_path("#{::ThemeJuice::Utilities.get_vvv_path}/Vagrantfile"), "a+" do |file|
|
489
599
|
file.puts "### Begin '#{@opts[:site_name]}'"
|
490
600
|
file.puts "#"
|
491
601
|
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
@@ -534,7 +644,7 @@ module ThemeJuice
|
|
534
644
|
file.puts "\tvagrant:"
|
535
645
|
file.puts "\t\turl: #{@opts[:dev_url]}"
|
536
646
|
file.puts "\t\tpath: /srv/www/tj-#{@opts[:site_name]}"
|
537
|
-
file.puts "\t\tcmd: cd
|
647
|
+
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%"
|
538
648
|
file.puts "\n"
|
539
649
|
end
|
540
650
|
|
@@ -564,7 +674,7 @@ module ThemeJuice
|
|
564
674
|
# @return {Void}
|
565
675
|
###
|
566
676
|
def remove_database
|
567
|
-
if remove_traces_from_file "
|
677
|
+
if remove_traces_from_file "#{::ThemeJuice::Utilities.get_vvv_path}/database/init-custom.sql"
|
568
678
|
say "Database for '#{@opts[:site_name]}' successfully removed.", :yellow
|
569
679
|
end
|
570
680
|
end
|
@@ -575,7 +685,7 @@ module ThemeJuice
|
|
575
685
|
# @return {Void}
|
576
686
|
###
|
577
687
|
def remove_synced_folder
|
578
|
-
if remove_traces_from_file "
|
688
|
+
if remove_traces_from_file "#{::ThemeJuice::Utilities.get_vvv_path}/Vagrantfile"
|
579
689
|
say "Synced folders for '#{@opts[:site_name]}' successfully removed.", :yellow
|
580
690
|
end
|
581
691
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module ThemeJuice
|
2
|
+
module Utilities
|
3
|
+
class << self
|
4
|
+
include ::Thor::Actions
|
5
|
+
include ::Thor::Shell
|
6
|
+
|
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.", :red
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
|
32
|
+
@@vvv_path
|
33
|
+
end
|
34
|
+
|
35
|
+
###
|
36
|
+
# Check if program is installed
|
37
|
+
#
|
38
|
+
# @note Doesn't work on Win
|
39
|
+
#
|
40
|
+
# @param {String} program
|
41
|
+
#
|
42
|
+
# @return {Bool}
|
43
|
+
###
|
44
|
+
def installed?(program)
|
45
|
+
system "which #{program} > /dev/null 2>&1"
|
46
|
+
end
|
47
|
+
|
48
|
+
###
|
49
|
+
# Check if current version is outdated
|
50
|
+
#
|
51
|
+
# @return {Bool}
|
52
|
+
###
|
53
|
+
def check_if_current_version_is_outdated
|
54
|
+
local_version = ::ThemeJuice::VERSION
|
55
|
+
|
56
|
+
fetcher = ::Gem::SpecFetcher.fetcher
|
57
|
+
dependency = ::Gem::Dependency.new "theme-juice", ">= #{local_version}"
|
58
|
+
|
59
|
+
remotes, = fetcher.search_for_dependency dependency
|
60
|
+
remote_version = remotes.map { |n, _| n.version }.sort.last
|
61
|
+
|
62
|
+
if ::Gem::Version.new(local_version) < ::Gem::Version.new(remote_version)
|
63
|
+
say "Warning: your version of theme-juice (#{local_version}) is outdated. There is a newer version (#{remote_version}) available. Please update now.", :yellow
|
64
|
+
else
|
65
|
+
say "Up to date.", :green
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/theme-juice/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theme-juice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.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-
|
11
|
+
date: 2015-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -50,7 +50,8 @@ files:
|
|
50
50
|
- lib/theme-juice/ascii/logo.txt
|
51
51
|
- lib/theme-juice/ascii/smiley.txt
|
52
52
|
- lib/theme-juice/cli.rb
|
53
|
-
- lib/theme-juice/
|
53
|
+
- lib/theme-juice/executor.rb
|
54
|
+
- lib/theme-juice/utilities.rb
|
54
55
|
- lib/theme-juice/version.rb
|
55
56
|
- lib/theme-juice.rb
|
56
57
|
- LICENSE
|
@@ -81,3 +82,4 @@ signing_key:
|
|
81
82
|
specification_version: 4
|
82
83
|
summary: A WordPress development framework.
|
83
84
|
test_files: []
|
85
|
+
has_rdoc:
|