theme-juice 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +80 -0
- data/bin/tj +13 -0
- data/lib/theme-juice/ascii/logo.txt +30 -0
- data/lib/theme-juice/ascii/smiley.txt +24 -0
- data/lib/theme-juice/cli.rb +275 -0
- data/lib/theme-juice/scaffold.rb +540 -0
- data/lib/theme-juice/version.rb +3 -0
- data/lib/theme-juice.rb +27 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dc35777e4bd07bd8eae2a314ec39c251f5fa5562
|
4
|
+
data.tar.gz: 989ba458f6709aaa228889afa7198a6d51988e48
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6f88be099cb1768bd1d94a1af73a012353d65ce0946c5e7af354abe0178540d099ac69bef543ecef87d75c7569080c2db3f705823f23de792a99ac4de099d8b8
|
7
|
+
data.tar.gz: 8997b53e9b08991187e6a19b123a0f40fccf0cd81f7a846bab977b3ec672b7ddf4b974ee6a92386da5e0418783370b1178084a2a569fe729989c5ff2fb87cfd5
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Ezekiel Gabrielse
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# Theme Juice
|
2
|
+
Command line interface to scaffold out a new WordPress development environment and countless sites. Everybody loves one command setups, and 'tj' even does one command deployments too.
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
* First, install [Vagrant](https://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) for local development.
|
6
|
+
* Then, install [Composer](https://getcomposer.org/) and [WP-CLI](http://wp-cli.org/). _Make sure that these are executable from the command line._
|
7
|
+
* Finally, you can run: '$ gem install theme-juice-cli'
|
8
|
+
|
9
|
+
That's it!
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
#### List available commands:
|
14
|
+
List all commands for 'tj'.
|
15
|
+
'''bash
|
16
|
+
tj
|
17
|
+
'''
|
18
|
+
|
19
|
+
#### Setup VVV:
|
20
|
+
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._
|
21
|
+
'''bash
|
22
|
+
tj init
|
23
|
+
'''
|
24
|
+
|
25
|
+
#### Create a new development site:
|
26
|
+
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.
|
27
|
+
'''bash
|
28
|
+
tj create [<site-name>]
|
29
|
+
'''
|
30
|
+
|
31
|
+
#### Setup an existing site:
|
32
|
+
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.
|
33
|
+
'''bash
|
34
|
+
tj setup [<site-name>] # Alias for 'tj create [<site-name>] --bare'
|
35
|
+
'''
|
36
|
+
|
37
|
+
#### Delete a site from the VM: _(Does not remove your local site)_
|
38
|
+
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._
|
39
|
+
'''bash
|
40
|
+
tj delete <site-name>
|
41
|
+
'''
|
42
|
+
|
43
|
+
#### List all sites in the VM:
|
44
|
+
Use this to list all sites within your development environment that were generated by 'tj'.
|
45
|
+
'''bash
|
46
|
+
tj list
|
47
|
+
'''
|
48
|
+
|
49
|
+
#### Watch and compile assets: _(Guard)_
|
50
|
+
Use this to watch and compile assets with [Guard](https://github.com/guard/guard). This is simply a wrapper for Guard commands.
|
51
|
+
'''bash
|
52
|
+
tj watch # Alias for 'bundle exec guard #{cmd}'
|
53
|
+
'''
|
54
|
+
|
55
|
+
#### Use for managing development environment: _(Vagrant)_
|
56
|
+
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.
|
57
|
+
'''bash
|
58
|
+
tj vm # Alias for 'cd ~/vagrant && vagrant #{cmd}'
|
59
|
+
'''
|
60
|
+
|
61
|
+
#### Use for managing vendor dependencies: _(Composer)_
|
62
|
+
Use this to easily manage your [Composer](https://github.com/composer/composer) dependencies. This is simply a wrapper for Composer commands.
|
63
|
+
'''bash
|
64
|
+
tj vendor # Alias for 'composer #{cmd}'
|
65
|
+
'''
|
66
|
+
|
67
|
+
#### Use for managing deployment and migration: _(Capistrano)_
|
68
|
+
Use this to easily manage your deployment and migration with [Capistrano](https://github.com/capistrano/capistrano). This is simply a wrapper for Capistrano commands.
|
69
|
+
'''bash
|
70
|
+
tj server # Alias for 'bundle exec cap #{cmd}'
|
71
|
+
'''
|
72
|
+
|
73
|
+
## Contributing
|
74
|
+
|
75
|
+
1. First, create an [issue](https://github.com/ezekg/theme-juice-cli/issues) for your proposed feature. If it's a bug fix, go right to step 2.
|
76
|
+
2. [Fork the repository](https://github.com/ezekg/theme-juice-cli/fork).
|
77
|
+
3. Create a new feature branch. ('git checkout -b my-new-feature')
|
78
|
+
4. Commit your changes. ('git commit -am 'Add some feature'')
|
79
|
+
5. Push to the new branch. ('git push origin my-new-feature')
|
80
|
+
6. Create a new Pull Request.
|
data/bin/tj
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
'-/+osssssssssssso+/-'
|
2
|
+
./oys syo/.
|
3
|
+
.+ys: ..:/osyyhhhhyyso/:.. +sy+.
|
4
|
+
/ys: .+ydmmmmmmmmmmmmmmmmmmmdy+. :sy/
|
5
|
+
/h+' -odmmmmmmmmmmmmmmmmmmmmmmmmmmdo- '+h/
|
6
|
+
:ho' /hmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmds/ 'oh:
|
7
|
+
'sy. /hmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm+ .ys'
|
8
|
+
.ho /mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmy oh.
|
9
|
+
.h+ 'mmmmmmmm' 'mmmmmmmh +h.
|
10
|
+
'ho ' /mmmmmmmmmmo .dmmmmmmmms ~~ oh'
|
11
|
+
oy .h' ymmmmmmmmmm: /mmmmmmmmmy' -d. yo
|
12
|
+
.d- ymy 'dmmmmmmmmmd. ymmmmmmmmmh' /my -d.
|
13
|
+
oy -mmm+ /mmmmmmmmmmy .dmmmmmmmmmy ymm- yo
|
14
|
+
h+ +mmmd- smmmmmmmmmm+ /mmmmmmmmmm- :mmm+ +h
|
15
|
+
d/ smmmmh' 'dmmmmmmmmmd' smmmmmmmmm: 'dmmms /d
|
16
|
+
d/ smmmmms :mmmmmmmmm+ 'dmmmmmmmd. smmmms /d
|
17
|
+
h+ +mmmmmm/ smmmmmmmh + /mmmmmmmy /mmmmm+ +h
|
18
|
+
oy -mmmmmmd. 'dmmmmmd- +m/ smmmmmd. .dmmmmm- yo
|
19
|
+
.d- ymmmmmmh :mmmmm+ .dmd- 'dmmmm/ ymmmmmy -d.
|
20
|
+
oy .dmmmmmmo smmmh hmmmh' :mmmy +mmmmmd. yo
|
21
|
+
'ho -dmmmmmd: 'dmd+ .mmmmms smd- .dmmmmd- oh'
|
22
|
+
.h+ -dmmmmmd' :m+ dmmmmmm: 'do hmmmmd- +h.
|
23
|
+
.ho .ymmmmmy + hmmmmmmmd. :' ommmmy. oh.
|
24
|
+
'sy. /hmmmm+ ommmmmmmmmy -dmmh/ .ys'
|
25
|
+
:ho /hmmd- :mmmmmmmmmmmo 'hmh/ oh:
|
26
|
+
/h+ -odh' 'dmmmmmmmmmmmd: oo- +h/
|
27
|
+
/ys: ~~ smmmmmmmmmmmmmd' :sy/
|
28
|
+
.+ys '/osyyhhhhyyso/:' ./sy+.
|
29
|
+
./oys+ +syo/.
|
30
|
+
'-/+osssssssssssso+/-'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
...gNMMM@@MMMNa+..
|
2
|
+
..M@M#"=!........?7TWMMN&,
|
3
|
+
..MMY=...'.....'...'''....?YMMa.
|
4
|
+
.JM#^..''.'''''''''''''''....'.JW@N.
|
5
|
+
.M#^.''.'.'''''''''''''''.'..''''.,WMh.
|
6
|
+
.MM5.J.J..'''.''''''''..'.JJ.,,'...''.JMN.
|
7
|
+
.MM.JY^' .MMa .'''''''.'.M"= .dMN,'.'.'.MM,
|
8
|
+
.@M.M$ @@MMN.''''''.'dF J@@MMp''''..MM,
|
9
|
+
M@^JF ?WH"Jb .'''''JF "H"^M,..'''.@N
|
10
|
+
JMF dF JN '''''.@F gF '.'.'J@F
|
11
|
+
J@''Jh.........JF .''''.4b...........MF''''.'.@b
|
12
|
+
M@ '.!!!!!!!!!!?''''''''.!!!??????????.'''''' @N
|
13
|
+
M@ '.......'.'.''.'.....'''''.'....'...''''.. @M
|
14
|
+
d@,''.NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNr''''.''.@F
|
15
|
+
J@b '''JNWHHHHHHHHHHHHHHHHHHHHHHHHHHd@ ''''''J@F
|
16
|
+
MM.''' @KHHHHHHHHHHHHHHHHHHHHHHHHHHW@.''''..@M
|
17
|
+
.@N ''.JMKHHHHHHHHHHHHHHHHHHHHHHHHHM@ '''.'dM3
|
18
|
+
J@N.'''?MKHHHHHHHHHHHNHYY9HHHHHHHHMF.''..d@$
|
19
|
+
.MN,''.JMNHHHHHHHNY!.'''''..4NHNM5..''.MM^
|
20
|
+
4Mh,'..TMNHHHH@ ...'''...'..MD..''.JMY'
|
21
|
+
.W@N,''.?HNN# ...'..''J.M#^.'.'.J@#^
|
22
|
+
.TMMa,'..'T"MMQQHMH"T!..''..@MY!
|
23
|
+
'"MMNg...''''''''...+MMM"^
|
24
|
+
'""WMMM@@@MM@M#""!
|
@@ -0,0 +1,275 @@
|
|
1
|
+
module ThemeJuice
|
2
|
+
class CLI < ::Thor
|
3
|
+
|
4
|
+
###
|
5
|
+
# Non Thor commands
|
6
|
+
###
|
7
|
+
no_commands do
|
8
|
+
|
9
|
+
###
|
10
|
+
# Welcome message
|
11
|
+
#
|
12
|
+
# @return {Void}
|
13
|
+
###
|
14
|
+
def welcome
|
15
|
+
|
16
|
+
# Get WP logo ASCII art
|
17
|
+
logo = File.read(File.expand_path("../ascii/logo.txt", __FILE__))
|
18
|
+
|
19
|
+
# Output welcome message
|
20
|
+
say "\n"
|
21
|
+
say logo.gsub(/[m]/) { |char| set_color(char, :green) }.gsub(/[\+\/\-\'\:\.\~dyhos]/) { |char| set_color(char, :yellow) }
|
22
|
+
say "\n"
|
23
|
+
say "Welcome to Theme Juice!".center(60), :green
|
24
|
+
say "\n\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
###
|
29
|
+
# Install and setup VVV environment
|
30
|
+
#
|
31
|
+
# @return {Void}
|
32
|
+
###
|
33
|
+
desc "init", "Setup the VVV environment"
|
34
|
+
def init
|
35
|
+
self.welcome
|
36
|
+
|
37
|
+
# Setup the VM
|
38
|
+
::ThemeJuice::Scaffold::init
|
39
|
+
end
|
40
|
+
|
41
|
+
###
|
42
|
+
# Install and setup VVV environment with new site
|
43
|
+
#
|
44
|
+
# @param {String} site (nil)
|
45
|
+
# Name of the site to create
|
46
|
+
# @param {Bool} bare (false)
|
47
|
+
# Create a bare VVV site without starter
|
48
|
+
#
|
49
|
+
# @return {Void}
|
50
|
+
###
|
51
|
+
desc "create [SITE]", "Setup SITE and the VVV development environment"
|
52
|
+
method_option :bare, type: :boolean, desc: "Create a VVV site without the starter theme"
|
53
|
+
def create(site = nil, bare_setup = false)
|
54
|
+
self.welcome
|
55
|
+
|
56
|
+
###
|
57
|
+
# Theme setup
|
58
|
+
###
|
59
|
+
if site.nil?
|
60
|
+
say "Just a few questions before we begin...", :yellow
|
61
|
+
else
|
62
|
+
say "Your site name shall be #{site}! Just a few more questions before we begin...", :yellow
|
63
|
+
end
|
64
|
+
|
65
|
+
# ask for the Site name if not passed directly
|
66
|
+
site ||= ask "What's the site name? (only ascii characters are allowed) :", :green
|
67
|
+
|
68
|
+
if site.match /[^0-9A-Za-z.\-]/
|
69
|
+
say "Site name contains invalid non-ascii characters. This name is used for creating directories, so that's not gonna work. Aborting mission.", :red
|
70
|
+
exit 1
|
71
|
+
end
|
72
|
+
|
73
|
+
# Bare install
|
74
|
+
bare_setup ||= options[:bare]
|
75
|
+
|
76
|
+
# Make sure Site name was given, else throw err
|
77
|
+
unless site.empty?
|
78
|
+
clean_site_name = site.gsub(/[^\w]/, "_")[0..10]
|
79
|
+
|
80
|
+
###
|
81
|
+
# Location of site installation
|
82
|
+
###
|
83
|
+
site_location = ask "Where do you want to setup the site? :", :green,
|
84
|
+
default: "#{Dir.pwd}/",
|
85
|
+
path: true
|
86
|
+
|
87
|
+
###
|
88
|
+
# Starter theme to clone
|
89
|
+
###
|
90
|
+
unless bare_setup
|
91
|
+
require "highline/import"
|
92
|
+
|
93
|
+
starter_theme = nil
|
94
|
+
|
95
|
+
say "Which starter theme would you like to use? :", :green
|
96
|
+
choose do |menu|
|
97
|
+
menu.index_suffix = ") "
|
98
|
+
|
99
|
+
menu.choice "ezekg/theme-juice-starter" do |c|
|
100
|
+
say "Awesome choice!", :green
|
101
|
+
starter_theme = c
|
102
|
+
end
|
103
|
+
|
104
|
+
menu.choice "other" do
|
105
|
+
starter_theme = ask "What is the user/repository of the starter theme you would like to clone? :", :green
|
106
|
+
end
|
107
|
+
|
108
|
+
menu.choice "none" do |c|
|
109
|
+
say "Next time you want to create a site without a starter theme, you can just run the 'setup' command instead.", :yellow
|
110
|
+
starter_theme, bare_setup = c, true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
###
|
116
|
+
# Development url
|
117
|
+
###
|
118
|
+
dev_url = ask "What do you want the development url to be? (this should end in '.dev') :", :green,
|
119
|
+
default: "#{site}.dev"
|
120
|
+
|
121
|
+
unless dev_url.match /(.dev)$/
|
122
|
+
say "Your development url doesn't end with '.dev'. This is used within Vagrant, so that's not gonna work. Aborting mission.", :red
|
123
|
+
exit 1
|
124
|
+
end
|
125
|
+
|
126
|
+
###
|
127
|
+
# Initialize a git repository on setup
|
128
|
+
###
|
129
|
+
if yes? "Would you like to initialize a new Git repository? (y/N) :", :green
|
130
|
+
repository = ask "Remote URL :", :green
|
131
|
+
else
|
132
|
+
repository = false
|
133
|
+
end
|
134
|
+
|
135
|
+
###
|
136
|
+
# Database host
|
137
|
+
###
|
138
|
+
db_host = ask "Database host :", :green,
|
139
|
+
default: "vvv"
|
140
|
+
|
141
|
+
###
|
142
|
+
# Database name
|
143
|
+
###
|
144
|
+
db_name = ask "Database name :", :green,
|
145
|
+
default: "#{clean_site_name}_db"
|
146
|
+
|
147
|
+
###
|
148
|
+
# Database username
|
149
|
+
###
|
150
|
+
db_user = ask "Database username :", :green,
|
151
|
+
default: "#{clean_site_name}_user"
|
152
|
+
|
153
|
+
###
|
154
|
+
# Database password
|
155
|
+
###
|
156
|
+
db_pass = ask "Database password :", :green,
|
157
|
+
default: SecureRandom.base64
|
158
|
+
|
159
|
+
###
|
160
|
+
# Save options
|
161
|
+
###
|
162
|
+
opts = {
|
163
|
+
site_name: site,
|
164
|
+
site_location: File.expand_path(site_location),
|
165
|
+
starter_theme: starter_theme,
|
166
|
+
bare_setup: bare_setup,
|
167
|
+
dev_location: File.expand_path("~/vagrant/www/tj-#{site}"),
|
168
|
+
dev_url: dev_url,
|
169
|
+
repository: repository,
|
170
|
+
db_host: db_host,
|
171
|
+
db_name: db_name,
|
172
|
+
db_user: db_user,
|
173
|
+
db_pass: db_pass,
|
174
|
+
}
|
175
|
+
|
176
|
+
# Create the theme!
|
177
|
+
::ThemeJuice::Scaffold::create opts
|
178
|
+
else
|
179
|
+
say "Site name is required. Aborting mission.", :red
|
180
|
+
exit 1
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
###
|
185
|
+
# Setup an existing WordPress install in VVV
|
186
|
+
#
|
187
|
+
# @param {String} site (nil)
|
188
|
+
# Name of the theme to create
|
189
|
+
#
|
190
|
+
# @return {Void}
|
191
|
+
###
|
192
|
+
desc "setup [SITE]", "Create a VVV site without starter theme (alias for 'create --bare')"
|
193
|
+
def setup(site = nil)
|
194
|
+
self.create site, true
|
195
|
+
end
|
196
|
+
|
197
|
+
###
|
198
|
+
# Remove all traces of site from Vagrant
|
199
|
+
#
|
200
|
+
# @param {String} site
|
201
|
+
# Theme to delete. This will not delete your local files, only the VVV env.
|
202
|
+
#
|
203
|
+
# @return {Void}
|
204
|
+
###
|
205
|
+
desc "delete SITE", "Remove SITE from the VVV development environment (does not remove local site)"
|
206
|
+
method_option :restart, type: :boolean
|
207
|
+
def delete(site)
|
208
|
+
if yes? "Are you sure you want to delete '#{site}'? (y/N)", :red
|
209
|
+
::ThemeJuice::Scaffold::delete site, options[:restart]
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
###
|
214
|
+
# List all development sites
|
215
|
+
#
|
216
|
+
# @return {Void}
|
217
|
+
###
|
218
|
+
desc "list", "List all sites within the VVV development environment"
|
219
|
+
def list
|
220
|
+
::ThemeJuice::Scaffold::list
|
221
|
+
end
|
222
|
+
|
223
|
+
###
|
224
|
+
# Guard
|
225
|
+
#
|
226
|
+
# @param {*} commands
|
227
|
+
# Commands to run
|
228
|
+
#
|
229
|
+
# @return {Void}
|
230
|
+
###
|
231
|
+
desc "watch [COMMANDS]", "Watch and compile assets with Guard (alias for 'bundle exec guard [COMMANDS]')"
|
232
|
+
def watch(*commands)
|
233
|
+
system "bundle exec guard #{commands.join(" ")}"
|
234
|
+
end
|
235
|
+
|
236
|
+
###
|
237
|
+
# Vagrant
|
238
|
+
#
|
239
|
+
# @param {*} commands
|
240
|
+
# Commands to run
|
241
|
+
#
|
242
|
+
# @return {Void}
|
243
|
+
###
|
244
|
+
desc "vm [COMMANDS]", "Manage virtual development environment with Vagrant (alias for 'vagrant [COMMANDS]')"
|
245
|
+
def vm(*commands)
|
246
|
+
system "cd ~/vagrant && vagrant #{commands.join(" ")}"
|
247
|
+
end
|
248
|
+
|
249
|
+
###
|
250
|
+
# Composer
|
251
|
+
#
|
252
|
+
# @param {*} commands
|
253
|
+
# Commands to run
|
254
|
+
#
|
255
|
+
# @return {Void}
|
256
|
+
###
|
257
|
+
desc "vendor [COMMANDS]", "Manage vendor dependencies with Composer (alias for 'composer [COMMANDS]')"
|
258
|
+
def vendor(*commands)
|
259
|
+
system "composer #{commands.join(" ")}"
|
260
|
+
end
|
261
|
+
|
262
|
+
###
|
263
|
+
# Capistrano
|
264
|
+
#
|
265
|
+
# @param {*} commands
|
266
|
+
# Commands to run
|
267
|
+
#
|
268
|
+
# @return {Void}
|
269
|
+
###
|
270
|
+
desc "server [COMMANDS]", "Manage deployment and migration with Capistrano (alias for 'bundle exec cap [COMMANDS]')"
|
271
|
+
def server(*commands)
|
272
|
+
system "bundle exec cap #{commands.join(" ")}"
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
@@ -0,0 +1,540 @@
|
|
1
|
+
module ThemeJuice
|
2
|
+
module Scaffold
|
3
|
+
class << self
|
4
|
+
include ::Thor::Actions
|
5
|
+
include ::Thor::Shell
|
6
|
+
|
7
|
+
###
|
8
|
+
# Set up local development environment
|
9
|
+
#
|
10
|
+
# @return {Void}
|
11
|
+
###
|
12
|
+
def init
|
13
|
+
say "Initializing development environment...", :yellow
|
14
|
+
|
15
|
+
if vvv_is_setup?
|
16
|
+
say "Development environment is already set up. Aborting mission.", :red
|
17
|
+
else
|
18
|
+
say "Setup successful!", :green if setup_vvv
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
###
|
23
|
+
# Set up local development environment and site
|
24
|
+
#
|
25
|
+
# @param {Hash} opts
|
26
|
+
#
|
27
|
+
# @return {Void}
|
28
|
+
###
|
29
|
+
def create(opts)
|
30
|
+
@opts = opts
|
31
|
+
|
32
|
+
say "Running setup for '#{@opts[:site_name]}'...", :yellow
|
33
|
+
|
34
|
+
unless wordpress_is_setup?
|
35
|
+
setup_wordpress
|
36
|
+
end
|
37
|
+
|
38
|
+
unless vvv_is_setup?
|
39
|
+
setup_vvv
|
40
|
+
end
|
41
|
+
|
42
|
+
unless hosts_is_setup?
|
43
|
+
setup_hosts
|
44
|
+
end
|
45
|
+
|
46
|
+
unless database_is_setup?
|
47
|
+
setup_database
|
48
|
+
end
|
49
|
+
|
50
|
+
unless nginx_is_setup?
|
51
|
+
setup_nginx
|
52
|
+
end
|
53
|
+
|
54
|
+
unless dev_site_is_setup?
|
55
|
+
setup_dev_site
|
56
|
+
end
|
57
|
+
|
58
|
+
unless env_is_setup?
|
59
|
+
setup_env
|
60
|
+
end
|
61
|
+
|
62
|
+
unless synced_folder_is_setup?
|
63
|
+
setup_synced_folder
|
64
|
+
end
|
65
|
+
|
66
|
+
if @opts[:repository]
|
67
|
+
setup_repo
|
68
|
+
end
|
69
|
+
|
70
|
+
if setup_was_successful?
|
71
|
+
say "Restarting VVV...", :yellow
|
72
|
+
|
73
|
+
if restart_vagrant
|
74
|
+
|
75
|
+
# Get smiley ASCII art
|
76
|
+
success = File.read(File.expand_path("../ascii/smiley.txt", __FILE__))
|
77
|
+
|
78
|
+
# Output welcome message
|
79
|
+
say "\n"
|
80
|
+
say set_color(success, :yellow)
|
81
|
+
say "\n"
|
82
|
+
say "Success!".center(48), :green
|
83
|
+
say "\n"
|
84
|
+
|
85
|
+
# Output setup info
|
86
|
+
say "Here's your installation info:", :yellow
|
87
|
+
say "Site name: #{@opts[:site_name]}", :green
|
88
|
+
say "Site location: #{@opts[:site_location]}", :green
|
89
|
+
say "Starter theme: #{@opts[:starter_theme]}", :green
|
90
|
+
say "Development location: #{@opts[:dev_location]}", :green
|
91
|
+
say "Development url: http://#{@opts[:dev_url]}", :green
|
92
|
+
say "Initialized repository: #{@opts[:repository]}", :green
|
93
|
+
say "Database host: #{@opts[:db_host]}", :green
|
94
|
+
say "Database name: #{@opts[:db_name]}", :green
|
95
|
+
say "Database username: #{@opts[:db_user]}", :green
|
96
|
+
say "Database password: #{@opts[:db_pass]}", :green
|
97
|
+
end
|
98
|
+
else
|
99
|
+
say "Setup failed. Running cleanup...", :red
|
100
|
+
delete @opts[:site_name], false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
###
|
105
|
+
# Remove all traces of site from Vagrant
|
106
|
+
#
|
107
|
+
# @param {String} site
|
108
|
+
# @param {Bool} restart
|
109
|
+
#
|
110
|
+
# @return {Void}
|
111
|
+
###
|
112
|
+
def delete(site, restart)
|
113
|
+
|
114
|
+
###
|
115
|
+
# @TODO - This is a really hacky way to remove the theme.
|
116
|
+
# Eventually I'd like to handle state.
|
117
|
+
###
|
118
|
+
@opts = {
|
119
|
+
site_name: site,
|
120
|
+
dev_location: File.expand_path("~/vagrant/www/tj-#{site}")
|
121
|
+
}
|
122
|
+
|
123
|
+
if dev_site_is_setup?
|
124
|
+
remove_dev_site
|
125
|
+
else
|
126
|
+
say "Site '#{@opts[:site_name]}' does not exist.", :red
|
127
|
+
exit 1
|
128
|
+
end
|
129
|
+
|
130
|
+
if database_is_setup?
|
131
|
+
remove_database
|
132
|
+
end
|
133
|
+
|
134
|
+
if synced_folder_is_setup?
|
135
|
+
remove_synced_folder
|
136
|
+
end
|
137
|
+
|
138
|
+
if removal_was_successful?
|
139
|
+
say "Site '#{@opts[:site_name]}' successfully removed!", :green
|
140
|
+
|
141
|
+
unless restart
|
142
|
+
say "Restarting VVV...", :yellow
|
143
|
+
restart_vagrant
|
144
|
+
end
|
145
|
+
else
|
146
|
+
say "Site '#{@opts[:site_name]}' could not be fully be removed.", :red
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
###
|
151
|
+
# List all development sites
|
152
|
+
#
|
153
|
+
# @return {Array}
|
154
|
+
###
|
155
|
+
def list
|
156
|
+
sites = []
|
157
|
+
|
158
|
+
Dir.glob(File.expand_path("~/vagrant/www/*")).each do |f|
|
159
|
+
sites << File.basename(f).gsub(/(tj-)/, "") if File.directory?(f) && f.include?("tj-")
|
160
|
+
end
|
161
|
+
|
162
|
+
if sites.empty?
|
163
|
+
say "Nothing to list. Create a new site!", :yellow
|
164
|
+
else
|
165
|
+
i = 0
|
166
|
+
# Output site to cli
|
167
|
+
sites.each { |site| i += 1; say "#{i}) #{site}", :green }
|
168
|
+
end
|
169
|
+
|
170
|
+
sites
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
###
|
176
|
+
# Restart Vagrant
|
177
|
+
#
|
178
|
+
# @note
|
179
|
+
# Normally a simple 'vagrant reload' would work, but Landrush requires a
|
180
|
+
# 'vagrant up' to be fired for it to set up the DNS correctly.
|
181
|
+
#
|
182
|
+
# @return {Void}
|
183
|
+
###
|
184
|
+
def restart_vagrant
|
185
|
+
system [
|
186
|
+
"cd ~/vagrant",
|
187
|
+
"vagrant halt",
|
188
|
+
"vagrant up --provision"
|
189
|
+
].join " && "
|
190
|
+
end
|
191
|
+
|
192
|
+
###
|
193
|
+
# @return {Bool}
|
194
|
+
###
|
195
|
+
def setup_was_successful?
|
196
|
+
vvv_is_setup? and dev_site_is_setup? and hosts_is_setup? and database_is_setup? and nginx_is_setup?
|
197
|
+
end
|
198
|
+
|
199
|
+
###
|
200
|
+
# @return {Bool}
|
201
|
+
###
|
202
|
+
def removal_was_successful?
|
203
|
+
!setup_was_successful?
|
204
|
+
end
|
205
|
+
|
206
|
+
###
|
207
|
+
# @return {Bool}
|
208
|
+
###
|
209
|
+
def vvv_is_setup?
|
210
|
+
File.exists? File.expand_path("~/vagrant")
|
211
|
+
end
|
212
|
+
|
213
|
+
###
|
214
|
+
# @return {Bool}
|
215
|
+
###
|
216
|
+
def dev_site_is_setup?
|
217
|
+
File.exists? "#{@opts[:dev_location]}"
|
218
|
+
end
|
219
|
+
|
220
|
+
###
|
221
|
+
# @return {Bool}
|
222
|
+
###
|
223
|
+
def hosts_is_setup?
|
224
|
+
File.exists? "#{@opts[:site_location]}/vvv-hosts"
|
225
|
+
end
|
226
|
+
|
227
|
+
###
|
228
|
+
# @return {Bool}
|
229
|
+
###
|
230
|
+
def database_is_setup?
|
231
|
+
File.readlines(File.expand_path("~/vagrant/database/init-custom.sql")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
|
232
|
+
end
|
233
|
+
|
234
|
+
###
|
235
|
+
# @return {Bool}
|
236
|
+
###
|
237
|
+
def nginx_is_setup?
|
238
|
+
File.exists? "#{@opts[:site_location]}/vvv-nginx.conf"
|
239
|
+
end
|
240
|
+
|
241
|
+
###
|
242
|
+
# @return {Bool}
|
243
|
+
###
|
244
|
+
def wordpress_is_setup?
|
245
|
+
File.exists? File.expand_path("#{@opts[:site_location]}/app")
|
246
|
+
end
|
247
|
+
|
248
|
+
###
|
249
|
+
# @return {Bool}
|
250
|
+
###
|
251
|
+
def synced_folder_is_setup?
|
252
|
+
File.readlines(File.expand_path("~/vagrant/Vagrantfile")).grep(/(### Begin '#{@opts[:site_name]}')/m).any?
|
253
|
+
end
|
254
|
+
|
255
|
+
###
|
256
|
+
# @return {Bool}
|
257
|
+
###
|
258
|
+
def repo_is_setup?
|
259
|
+
File.exists? File.expand_path("#{@opts[:site_location]}/.git")
|
260
|
+
end
|
261
|
+
|
262
|
+
###
|
263
|
+
# @return {Bool}
|
264
|
+
###
|
265
|
+
def env_is_setup?
|
266
|
+
File.exists? File.expand_path("#{@opts[:site_location]}/.env.development")
|
267
|
+
end
|
268
|
+
|
269
|
+
###
|
270
|
+
# Install plugins and clone VVV
|
271
|
+
#
|
272
|
+
# @return {Void}
|
273
|
+
###
|
274
|
+
def setup_vvv
|
275
|
+
say "Installing VVV into '#{File.expand_path("~/vagrant")}'.", :yellow
|
276
|
+
system [
|
277
|
+
"vagrant plugin install vagrant-hostsupdater",
|
278
|
+
"vagrant plugin install vagrant-triggers",
|
279
|
+
"vagrant plugin install landrush",
|
280
|
+
"git clone https://github.com/Varying-Vagrant-Vagrants/VVV.git ~/vagrant",
|
281
|
+
"cd ~/vagrant/database && touch init-custom.sql"
|
282
|
+
].join " && "
|
283
|
+
|
284
|
+
setup_wildcard_subdomains
|
285
|
+
end
|
286
|
+
|
287
|
+
###
|
288
|
+
# Enable Landrush for wildcard subdomains
|
289
|
+
#
|
290
|
+
# This will write a Landrush activation block to the global Vagrantfile
|
291
|
+
# if one does not already exist.
|
292
|
+
#
|
293
|
+
# @return {Void}
|
294
|
+
###
|
295
|
+
def setup_wildcard_subdomains
|
296
|
+
say "Setting up wildcard subdomains...", :yellow
|
297
|
+
open File.expand_path("~/vagrant/Vagrantfile"), "a+" do |file|
|
298
|
+
file.puts "###"
|
299
|
+
file.puts "# Enable wildcard subdomains"
|
300
|
+
file.puts "#"
|
301
|
+
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
302
|
+
file.puts "###"
|
303
|
+
file.puts "Vagrant.configure('2') do |config|"
|
304
|
+
file.puts "\tconfig.landrush.enabled = true"
|
305
|
+
file.puts "\tconfig.landrush.tld = 'dev'"
|
306
|
+
file.puts "end"
|
307
|
+
file.puts "\n"
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
###
|
312
|
+
# Create a new directory for site that will be symlinked with the local install
|
313
|
+
#
|
314
|
+
# @return {Void}
|
315
|
+
###
|
316
|
+
def setup_dev_site
|
317
|
+
say "Setting up new development site at '#{@opts[:dev_location]}'.", :yellow
|
318
|
+
system [
|
319
|
+
"cd ~/vagrant/www",
|
320
|
+
"mkdir tj-#{@opts[:site_name]}"
|
321
|
+
].join " && "
|
322
|
+
end
|
323
|
+
|
324
|
+
###
|
325
|
+
# Create vvv-hosts file
|
326
|
+
#
|
327
|
+
# @return {Void}
|
328
|
+
###
|
329
|
+
def setup_hosts
|
330
|
+
File.open "#{@opts[:site_location]}/vvv-hosts", "w" do |file|
|
331
|
+
file.puts @opts[:dev_url]
|
332
|
+
end
|
333
|
+
|
334
|
+
if hosts_is_setup?
|
335
|
+
say "Successfully added 'vvv-hosts' file.", :green
|
336
|
+
else
|
337
|
+
say "Could not create 'vvv-hosts' file.", :red
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
###
|
342
|
+
# Add database block to init-custom.sql, create if not exists
|
343
|
+
#
|
344
|
+
# @return {Void}
|
345
|
+
###
|
346
|
+
def setup_database
|
347
|
+
File.open File.expand_path("~/vagrant/database/init-custom.sql"), "a+" do |file|
|
348
|
+
file.puts "### Begin '#{@opts[:site_name]}'"
|
349
|
+
file.puts "#"
|
350
|
+
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
351
|
+
file.puts "###"
|
352
|
+
file.puts "CREATE DATABASE IF NOT EXISTS `#{@opts[:db_name]}`;"
|
353
|
+
file.puts "GRANT ALL PRIVILEGES ON `#{@opts[:db_name]}`.* TO '#{@opts[:db_user]}'@'localhost' IDENTIFIED BY '#{@opts[:db_pass]}';"
|
354
|
+
file.puts "### End '#{@opts[:site_name]}'"
|
355
|
+
file.puts "\n"
|
356
|
+
end
|
357
|
+
|
358
|
+
if database_is_setup?
|
359
|
+
say "Successfully added database to 'init-custom.sql'.", :green
|
360
|
+
else
|
361
|
+
say "Could not add database info for '#{@opts[:site_name]}' to 'init-custom.sql'.", :red
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
###
|
366
|
+
# Create vvv-nginx.conf file for local development site
|
367
|
+
#
|
368
|
+
# @return {Void}
|
369
|
+
###
|
370
|
+
def setup_nginx
|
371
|
+
File.open "#{@opts[:site_location]}/vvv-nginx.conf", "w" do |file|
|
372
|
+
file.puts "server {"
|
373
|
+
file.puts "\tlisten 80;"
|
374
|
+
file.puts "\tserver_name .#{@opts[:dev_url]};"
|
375
|
+
file.puts "\troot {vvv_path_to_folder};"
|
376
|
+
file.puts "\tinclude /etc/nginx/nginx-wp-common.conf;"
|
377
|
+
file.puts "}"
|
378
|
+
end
|
379
|
+
|
380
|
+
if nginx_is_setup?
|
381
|
+
say "Successfully added 'vvv-nginx.conf' file.", :green
|
382
|
+
else
|
383
|
+
say "Could not create 'vvv-nginx.conf' file.", :red
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
###
|
388
|
+
# Create Dotenv environment file
|
389
|
+
#
|
390
|
+
# @return {Void}
|
391
|
+
###
|
392
|
+
def setup_env
|
393
|
+
File.open "#{@opts[:site_location]}/.env.development", "w" do |file|
|
394
|
+
file.puts "DB_NAME=#{@opts[:db_name]}"
|
395
|
+
file.puts "DB_USER=#{@opts[:db_user]}"
|
396
|
+
file.puts "DB_PASSWORD=#{@opts[:db_pass]}"
|
397
|
+
file.puts "DB_HOST=#{@opts[:db_host]}"
|
398
|
+
file.puts "WP_HOME=http://#{@opts[:dev_url]}"
|
399
|
+
file.puts "WP_SITEURL=http://#{@opts[:dev_url]}/wp"
|
400
|
+
end
|
401
|
+
|
402
|
+
if env_is_setup?
|
403
|
+
say "Successfully added '.env.development' file.", :green
|
404
|
+
else
|
405
|
+
say "Could not create '.env.development' file.", :red
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
###
|
410
|
+
# Setup WordPress
|
411
|
+
#
|
412
|
+
# Clones starter theme into @opts[:site_location]
|
413
|
+
#
|
414
|
+
# @return {Void}
|
415
|
+
###
|
416
|
+
def setup_wordpress
|
417
|
+
say "Setting up WordPress...", :yellow
|
418
|
+
|
419
|
+
if @opts[:bare_setup]
|
420
|
+
# Create theme dir
|
421
|
+
system "mkdir -p #{@opts[:site_location]}"
|
422
|
+
else
|
423
|
+
# Clone starter, install WP
|
424
|
+
system [
|
425
|
+
"mkdir -p #{@opts[:site_location]} && cd $_",
|
426
|
+
"git clone --depth 1 https://github.com/#{@opts[:starter_theme]}.git .",
|
427
|
+
"composer install",
|
428
|
+
].join " && "
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
###
|
433
|
+
# Add synced folder block to Vagrantfile
|
434
|
+
#
|
435
|
+
# @return {Void}
|
436
|
+
###
|
437
|
+
def setup_synced_folder
|
438
|
+
say "Syncing host theme directory '#{@opts[:site_location]}' with VM theme directory '/srv/www/tj-#{@opts[:site_name]}'...", :yellow
|
439
|
+
|
440
|
+
open File.expand_path("~/vagrant/Vagrantfile"), "a+" do |file|
|
441
|
+
file.puts "### Begin '#{@opts[:site_name]}'"
|
442
|
+
file.puts "#"
|
443
|
+
file.puts "# This block is automatically generated by ThemeJuice. Do not edit."
|
444
|
+
file.puts "###"
|
445
|
+
file.puts "Vagrant.configure('2') do |config|"
|
446
|
+
file.puts "\tconfig.vm.synced_folder '#{@opts[:site_location]}', '/srv/www/tj-#{@opts[:site_name]}', mount_options: ['dmode=777,fmode=777']"
|
447
|
+
file.puts "\tconfig.landrush.host '#{@opts[:dev_url]}', '192.168.50.4'"
|
448
|
+
file.puts "end"
|
449
|
+
file.puts "### End '#{@opts[:site_name]}'"
|
450
|
+
file.puts "\n"
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
###
|
455
|
+
# Initialize Git repo, add remote, initial commit
|
456
|
+
#
|
457
|
+
# @return {Void}
|
458
|
+
###
|
459
|
+
def setup_repo
|
460
|
+
say "Setting up Git repository at '#{@opts[:repository]}'...", :yellow
|
461
|
+
|
462
|
+
if repo_is_setup?
|
463
|
+
system [
|
464
|
+
"cd #{@opts[:site_location]}",
|
465
|
+
"rm -rf .git",
|
466
|
+
].join " && "
|
467
|
+
end
|
468
|
+
|
469
|
+
system [
|
470
|
+
"cd #{@opts[:site_location]}",
|
471
|
+
"git init",
|
472
|
+
"git remote add origin #{@opts[:repository]}"
|
473
|
+
].join " && "
|
474
|
+
end
|
475
|
+
|
476
|
+
###
|
477
|
+
# Remove all theme files from Vagrant directory
|
478
|
+
#
|
479
|
+
# @return {Void}
|
480
|
+
###
|
481
|
+
def remove_dev_site
|
482
|
+
if system "rm -rf #{@opts[:dev_location]}"
|
483
|
+
say "VVV installation for '#{@opts[:site_name]}' successfully removed.", :green
|
484
|
+
else
|
485
|
+
say "Theme '#{@opts[:site_name]}' could not be removed. Make sure you have write capabilities.", :red
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
489
|
+
###
|
490
|
+
# Remove database block from init-custom.sql
|
491
|
+
#
|
492
|
+
# @return {Void}
|
493
|
+
###
|
494
|
+
def remove_database
|
495
|
+
if remove_traces_from_file "~/vagrant/database/init-custom.sql"
|
496
|
+
say "Database for '#{@opts[:site_name]}' successfully removed.", :green
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
###
|
501
|
+
# Remove synced folder block from Vagrantfile
|
502
|
+
#
|
503
|
+
# @return {Void}
|
504
|
+
###
|
505
|
+
def remove_synced_folder
|
506
|
+
if remove_traces_from_file "~/vagrant/Vagrantfile"
|
507
|
+
say "Synced folders for '#{@opts[:site_name]}' successfully removed.", :green
|
508
|
+
end
|
509
|
+
end
|
510
|
+
|
511
|
+
###
|
512
|
+
# Remove all traces of auto-generated content from file
|
513
|
+
#
|
514
|
+
# @param {String} input_file
|
515
|
+
#
|
516
|
+
# @return {Void}
|
517
|
+
###
|
518
|
+
def remove_traces_from_file(input_file)
|
519
|
+
begin
|
520
|
+
# Create new tempfile
|
521
|
+
output_file = Tempfile.new File.basename(input_file)
|
522
|
+
# Copy over contents of actual file to tempfile
|
523
|
+
open File.expand_path(input_file), "rb" do |file|
|
524
|
+
# Remove traces of theme from contents
|
525
|
+
output_file.write "#{file.read}".gsub(/(### Begin '#{@opts[:site_name]}')(.*?)(### End '#{@opts[:site_name]}')\n+/m, "")
|
526
|
+
end
|
527
|
+
# Move temp file to actual file location
|
528
|
+
FileUtils.mv output_file, File.expand_path(input_file)
|
529
|
+
rescue LoadError => err
|
530
|
+
say err, :red
|
531
|
+
exit 1
|
532
|
+
ensure
|
533
|
+
# Make sure that the tempfile closes and is cleaned up, regardless of errors
|
534
|
+
output_file.close
|
535
|
+
output_file.unlink
|
536
|
+
end
|
537
|
+
end
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
data/lib/theme-juice.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
require "fileutils"
|
3
|
+
require "pathname"
|
4
|
+
require "tempfile"
|
5
|
+
require "thor"
|
6
|
+
|
7
|
+
require_relative "theme-juice/version"
|
8
|
+
require_relative "theme-juice/scaffold"
|
9
|
+
require_relative "theme-juice/cli"
|
10
|
+
|
11
|
+
module ThemeJuice
|
12
|
+
class << self
|
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
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: theme-juice
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ezekiel Gabrielse
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: highline
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: A WordPress development framework that scaffolds out an entire Vagrant
|
42
|
+
development environment in seconds. Uses trendy tech like Haml, Sass and CoffeeScript.
|
43
|
+
email:
|
44
|
+
- ezekg@yahoo.com
|
45
|
+
executables:
|
46
|
+
- tj
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- lib/theme-juice/ascii/logo.txt
|
51
|
+
- lib/theme-juice/ascii/smiley.txt
|
52
|
+
- lib/theme-juice/cli.rb
|
53
|
+
- lib/theme-juice/scaffold.rb
|
54
|
+
- lib/theme-juice/version.rb
|
55
|
+
- lib/theme-juice.rb
|
56
|
+
- LICENSE
|
57
|
+
- README.md
|
58
|
+
- bin/tj
|
59
|
+
homepage: https://github.com/ezekg/theme-juice-cli.git
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 2.0.0
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project: theme-juice
|
79
|
+
rubygems_version: 2.0.14
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: A WordPress development framework.
|
83
|
+
test_files: []
|