ptero 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +350 -0
- data/Rakefile +10 -0
- data/bin/ptero +13 -0
- data/lib/ptero.rb +14 -0
- data/lib/ptero/application.rb +281 -0
- data/lib/ptero/cli.rb +35 -0
- data/lib/ptero/cli/root.rb +282 -0
- data/lib/ptero/composer_default.json +8 -0
- data/lib/ptero/exception.rb +26 -0
- data/lib/ptero/exceptions/applicationexception.rb +9 -0
- data/lib/ptero/exceptions/generatorexception.rb +9 -0
- data/lib/ptero/generator.rb +146 -0
- data/lib/ptero/generators/applicationjavascriptgenerator.rb +19 -0
- data/lib/ptero/generators/applicationstylesheetgenerator.rb +18 -0
- data/lib/ptero/generators/configgenerator.rb +34 -0
- data/lib/ptero/generators/controllergenerator.rb +23 -0
- data/lib/ptero/generators/htaccessgenerator.rb +27 -0
- data/lib/ptero/generators/javascriptgenerator.rb +34 -0
- data/lib/ptero/generators/landinggenerator.rb +23 -0
- data/lib/ptero/generators/layoutgenerator.rb +19 -0
- data/lib/ptero/generators/loadallgenerator.rb +26 -0
- data/lib/ptero/generators/modelgenerator.rb +22 -0
- data/lib/ptero/generators/pagegenerator.rb +56 -0
- data/lib/ptero/generators/pagenotfoundgenerator.rb +16 -0
- data/lib/ptero/generators/phpclassgenerator.rb +27 -0
- data/lib/ptero/generators/phpgenerator.rb +18 -0
- data/lib/ptero/generators/phpinfogenerator.rb +16 -0
- data/lib/ptero/generators/routesgenerator.rb +68 -0
- data/lib/ptero/generators/setupgenerator.rb +13 -0
- data/lib/ptero/generators/stylesheetgenerator.rb +33 -0
- data/lib/ptero/generators/twiggenerator.rb +24 -0
- data/lib/ptero/generators/viewgenerator.rb +24 -0
- data/lib/ptero/templates/applicationjavascriptgenerator.js.erb +11 -0
- data/lib/ptero/templates/applicationstylesheetgenerator.css.erb +40 -0
- data/lib/ptero/templates/configgenerator.php.erb +26 -0
- data/lib/ptero/templates/controllergenerator.php.erb +25 -0
- data/lib/ptero/templates/generator.txt.erb +1 -0
- data/lib/ptero/templates/htaccessgenerator.htaccess.erb +9 -0
- data/lib/ptero/templates/javascriptgenerator.js.erb +11 -0
- data/lib/ptero/templates/landinggenerator.php.erb +3 -0
- data/lib/ptero/templates/layoutgenerator.html.twig.erb +37 -0
- data/lib/ptero/templates/loadallgenerator.php.erb +12 -0
- data/lib/ptero/templates/modelgenerator.php.erb +21 -0
- data/lib/ptero/templates/pagegenerator.html.twig.erb +13 -0
- data/lib/ptero/templates/pagenotfoundgenerator.html.twig.erb +13 -0
- data/lib/ptero/templates/phpclassgenerator.php.erb +24 -0
- data/lib/ptero/templates/phpgenerator.php.erb +3 -0
- data/lib/ptero/templates/phpinfogenerator.php.erb +3 -0
- data/lib/ptero/templates/routesgenerator.php.erb +13 -0
- data/lib/ptero/templates/setupgenerator.php.erb +19 -0
- data/lib/ptero/templates/stylesheetgenerator.css.erb +8 -0
- data/lib/ptero/templates/twiggenerator.html.twig.erb +5 -0
- data/lib/ptero/templates/viewgenerator.html.twig.erb +13 -0
- data/lib/ptero/version.rb +4 -0
- data/ptero.gemspec +28 -0
- data/test/fixtures/test_generators_fixtures.yaml +74 -0
- data/test/test_application.rb +123 -0
- data/test/test_exceptions.rb +52 -0
- data/test/test_generators.rb +110 -0
- data/test/test_root.rb +212 -0
- metadata +212 -0
data/lib/ptero/cli.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# cli.rb
|
4
|
+
# ======
|
5
|
+
#
|
6
|
+
# Superclass and container for all Thor command-line tools in Ptero
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'thor'
|
10
|
+
|
11
|
+
module Ptero
|
12
|
+
# The superclass of all Ptero command-line interfaces
|
13
|
+
class CLI < Thor
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
# eigenclass for autoloading
|
21
|
+
class << self
|
22
|
+
|
23
|
+
# autoload and return any cli that is missing
|
24
|
+
# @param const_name [Symbol] the name of the constant to be found
|
25
|
+
def const_missing(const_name)
|
26
|
+
# Load the cli
|
27
|
+
require "#{__dir__}/cli/#{const_name.downcase}.rb"
|
28
|
+
return const_get const_name
|
29
|
+
rescue LoadError
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,282 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# root.rb
|
4
|
+
# =======
|
5
|
+
# The root CLI that is run with arguments passed to the ptero tool
|
6
|
+
#
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'colorize'
|
10
|
+
|
11
|
+
# The principal Ptero CLI, the one that is called with the 'ptero' command
|
12
|
+
class Ptero::CLI::Root < Ptero::CLI
|
13
|
+
desc 'new NAME', 'Create a new application called NAME'
|
14
|
+
long_desc <<-LONGDESC
|
15
|
+
`$ ptero new NAME` will create a new directory called NAME in the current working directory and
|
16
|
+
set up a new Dinosaur PHP project inside the directory. The ptero tool:
|
17
|
+
|
18
|
+
\n\n* Creates a new directory, called NAME, in the current pwd
|
19
|
+
\n\n* Initializes a basic composer.json file in the root of the new project that includes all Dinosaur dependencies, as well as project metadata for future use
|
20
|
+
\n\n* After checking for the presence of PHP, installs the composer.phar executable and uses it to install all Dinosaur dependencies
|
21
|
+
\n\n* Generates basic templates for models, views, and controllers for the beginning of the project
|
22
|
+
|
23
|
+
\n\nAfter this command is executed, you can use further `$ ptero generate` commands to create your project content once in the root of your project
|
24
|
+
LONGDESC
|
25
|
+
# Seed a new Application, then download composer.phar and all dependencies
|
26
|
+
# @param name [String] the name of the new application
|
27
|
+
def new(name)
|
28
|
+
seed(name)
|
29
|
+
Dir.chdir name do
|
30
|
+
composer()
|
31
|
+
install()
|
32
|
+
end
|
33
|
+
puts "Change your working directory to '#{Dir.pwd}/#{name}' and starting generating files with 'ptero generate' to start your application"
|
34
|
+
end
|
35
|
+
|
36
|
+
desc 'seed NAME', 'Seed a new application'
|
37
|
+
long_desc <<-LONGDESC
|
38
|
+
`$ ptero seed NAME` generates the necessary files for a new application in a new directory called NAME. It generates all default models, views, and controllers
|
39
|
+
without accessing the internet. This means that it does not download composer and does not install composer dependencies, but performs all other application setup.
|
40
|
+
The execution of new consists of calling seed NAME, then changing to the new project's directory and calling composer, then install.
|
41
|
+
LONGDESC
|
42
|
+
# Seed a new Application by generating a new application directory and generating all necessary files, without accessing the internet or getting dependencies
|
43
|
+
# @param name [String] the name of the new application
|
44
|
+
def seed(name)
|
45
|
+
Ptero::Application.create(name) do |app|
|
46
|
+
|
47
|
+
# PHP
|
48
|
+
Dir.mkdir 'php'
|
49
|
+
app.generate('PHP_Info')
|
50
|
+
app.generate_setup(app.name.downcase)
|
51
|
+
app.generate_routes
|
52
|
+
|
53
|
+
Dir.mkdir 'php/controllers'
|
54
|
+
app.generate_controller('Application','\Dinosaur\\')
|
55
|
+
app.generate_load_all('php/controllers','ApplicationController')
|
56
|
+
|
57
|
+
Dir.mkdir 'php/models'
|
58
|
+
app.generate_load_all('php/models')
|
59
|
+
|
60
|
+
# Configuration
|
61
|
+
Dir.mkdir 'config'
|
62
|
+
app.generate_config
|
63
|
+
|
64
|
+
# Templates
|
65
|
+
Dir.mkdir 'views'
|
66
|
+
app.generate_layout
|
67
|
+
app.generate_page_not_found
|
68
|
+
|
69
|
+
# Document Root
|
70
|
+
Dir.mkdir 'www'
|
71
|
+
app.generate('HTAccess')
|
72
|
+
app.generate_landing
|
73
|
+
|
74
|
+
# CSS, Javascripts, Images
|
75
|
+
Dir.mkdir 'www/assets'
|
76
|
+
|
77
|
+
# CSS
|
78
|
+
Dir.mkdir 'www/assets/css'
|
79
|
+
app.generate_application_stylesheet('application','This is the main CSS stylesheet for application-wide styles. It is included in all pages by default.')
|
80
|
+
|
81
|
+
# JS
|
82
|
+
Dir.mkdir 'www/assets/js'
|
83
|
+
app.generate_application_javascript('application','This is the main file that is loaded along with every page. Put application-wide behavior here.')
|
84
|
+
|
85
|
+
# Images
|
86
|
+
Dir.mkdir 'www/assets/images'
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
desc 'route PATH, CONTROLLER', 'add a new route'
|
92
|
+
long_desc <<-LONGDESC
|
93
|
+
'ptero route PATH, CONTROLLER' saves all current routes to a new RoutesGenerator object, adds the new route specified by PATH => CONTROLLER to this generator,
|
94
|
+
then removes and regenerates the routes.php file with the new route in place.
|
95
|
+
LONGDESC
|
96
|
+
# Add a new route to the Application routes file
|
97
|
+
# @param path [String] the path to route
|
98
|
+
# @param controller [String] the name of the controller to route
|
99
|
+
def route(path,controller)
|
100
|
+
verify do
|
101
|
+
app.route(path,controller)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
desc 'unroute PATH', 'remove the PATH route in the routes.php file'
|
106
|
+
long_desc <<-LONGDESC
|
107
|
+
'ptero unroute PATH' performs the inverse of the 'ptero route PATH, CONTROLLER' command. It captures all existing routes in a RoutesGenerator object,
|
108
|
+
removes the route specified by PATH from this list, then removes and regenerates the routes.php file without the named route.
|
109
|
+
LONGDESC
|
110
|
+
# Remove a route from the Application routes file
|
111
|
+
# @param path [String] the path to unroute
|
112
|
+
def unroute(path)
|
113
|
+
verify do
|
114
|
+
app.unroute(path)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
desc 'verify DIR', "Verify that DIR is a dinosaur project"
|
119
|
+
long_desc <<-LONGDESC
|
120
|
+
`$ ptero verify DIR` checks the dinosaur.root property DIR/composer.json for a non-null, non-false value that signifies that DIR is the root directory of a dinosaur project.
|
121
|
+
\n\nIf no DIR is specified, the current working directory is used, so running `$ ptero verify` is a quick way to check if the current directory is a dinosaur project
|
122
|
+
LONGDESC
|
123
|
+
# Tell the user whether or not the specified directory is a Ptero directory.
|
124
|
+
# Print "#{dir} is a dinosaur directory" if so or call ptero_dir_message if not
|
125
|
+
# If a block is given and dir is a dinosaur directory, yield control to the block (without arguments) rather than displaying output
|
126
|
+
# @param dir [String,Pathname] the directory to check
|
127
|
+
def verify(dir=Dir.pwd)
|
128
|
+
a = Ptero::Application.new(dir)
|
129
|
+
if a.verify
|
130
|
+
if block_given?
|
131
|
+
yield
|
132
|
+
else
|
133
|
+
puts "#{dir} is a dinosaur project root.".green
|
134
|
+
end
|
135
|
+
true
|
136
|
+
else
|
137
|
+
ptero_dir_message
|
138
|
+
false
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
desc 'destroy DIR', "Delete DIR"
|
143
|
+
long_desc <<-LONGDESC
|
144
|
+
After asking for confirmation, ptero destroy DIR will recursively remove an entire dinosaur application folder. DIR is set to the current working directory by default
|
145
|
+
LONGDESC
|
146
|
+
# Destroy dir if dir is a dinosaur directory
|
147
|
+
# This method will ask for confirmation by prompting to the user to type "Yes" (case sensitive) before destroying the directory.
|
148
|
+
# If the user types this exactly, destroy will recursively delete dir and
|
149
|
+
# print "Removed dir".green. If the user types anything else, the method will exit without output.
|
150
|
+
# If the call to verify fails and the application is not a dinosaur directory, destroy prints "Cannot destroy dir because it is not a dinosaur directory".red
|
151
|
+
# and exits.
|
152
|
+
# @param dir [String,Pathname] the directory to destroy
|
153
|
+
def destroy(dir = Dir.pwd)
|
154
|
+
a = Ptero::Application.new(dir)
|
155
|
+
if a.verify
|
156
|
+
puts "Are you sure you want to destroy #{dir}? Type 'Yes' to authorize".yellow
|
157
|
+
print '>> '
|
158
|
+
return unless $stdin.gets.chomp == 'Yes'
|
159
|
+
a.destroy
|
160
|
+
puts "Removed #{dir}".green
|
161
|
+
|
162
|
+
else
|
163
|
+
puts "Cannot destroy #{dir} because it is not a dinosaur directory.".red
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
desc 'install', 'Install dependencies'
|
168
|
+
long_desc <<-LONGDESC
|
169
|
+
Use the composer.json file to install dependencies
|
170
|
+
LONGDESC
|
171
|
+
# Call the appropriate Application methods on the current Application to install Composer dependencies.
|
172
|
+
# If verify returns false, install quits with the ptero_dir_message text
|
173
|
+
def install
|
174
|
+
verify do
|
175
|
+
app.install_dependencies
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
desc 'composer', 'Download composer.phar'
|
180
|
+
long_desc <<-LONGDESC
|
181
|
+
Download the compser.phar file in order to facilitate future downloads
|
182
|
+
LONGDESC
|
183
|
+
# Call the appropriate Application methods on the current Application to download composer.phar.
|
184
|
+
# If verify returns false, composer quits with the ptero_dir_message text
|
185
|
+
def composer
|
186
|
+
verify do
|
187
|
+
app.get_composer
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
desc 'generate TYPE, *ARGS', 'Generate a file of type TYPE with ARGS'
|
193
|
+
long_desc <<-LONGDESC
|
194
|
+
The generate command creates a new file from ptero-generator TYPE, names it name, and passes it the following arguments as generator params.
|
195
|
+
This often results in the creation of a file called NAME + TYPE in a specific directory, as determined by the generator. For a more concrete example:
|
196
|
+
\n\n `$ ptero generate controller blog`
|
197
|
+
\n\n results in the creation of the file ./php/controllers/BlogController.php. Default output from the generate command will tell you what file was generated.
|
198
|
+
LONGDESC
|
199
|
+
# Use the appropriate Application methods to generate new files and components.
|
200
|
+
# As with other methods, this one runs a check with the verify method before undertaking any action
|
201
|
+
# @param type [String] the type of file to generate
|
202
|
+
# @param *args other parameters for the generator
|
203
|
+
def generate(type,*args)
|
204
|
+
verify do
|
205
|
+
app.generate(type,*args)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
desc 'reload TYPE, *ARGS', 'Remove and regenerate TYPE,*ARGS'
|
211
|
+
long_desc <<-LONGDESC
|
212
|
+
The reload command removes and regenerates generator TYPE with *ARGS.
|
213
|
+
** USE WITH CAUTION ON UNCOMMITTED FILES, THIS WILL OVERWRITE EXISTING CHANGES **
|
214
|
+
LONGDESC
|
215
|
+
# Use the Application object to remove and regenerate a file or component
|
216
|
+
# As with other methods, this one runs a check with the verify method before undertaking any action
|
217
|
+
# @param type [String] the type of file to reload
|
218
|
+
# @param *args other parameters
|
219
|
+
def reload(type,*args)
|
220
|
+
verify do
|
221
|
+
app.reload(type,*args)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
desc 'remove TYPE, NAME', 'Remove a file'
|
226
|
+
long_desc <<-LONGDESC
|
227
|
+
The remove command is the inverse of the generate command. (see $ ptero help generate) It locates the file that would be generated from a $ ptero generate command and
|
228
|
+
deletes it. Like the generate command, the remove command will tell you what file(s) it has removed.
|
229
|
+
LONGDESC
|
230
|
+
# Reload is the inverse of generate. Use the Application object to remove a file.
|
231
|
+
# It runs verify on the Application before taking any action.
|
232
|
+
# @param type [String] the type of file to remove
|
233
|
+
# @param *args other arguments to remove the file
|
234
|
+
def remove(type,*args)
|
235
|
+
verify do
|
236
|
+
app.remove(type,*args)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
|
241
|
+
desc 'routes', 'Display current routes'
|
242
|
+
long_desc <<-LONGDESC
|
243
|
+
The routes command takes no arguments and displays all current routes in the application.
|
244
|
+
LONGDESC
|
245
|
+
# If verify succeeds, display all routes of the current application
|
246
|
+
def routes
|
247
|
+
verify do
|
248
|
+
app.routes.each_pair do |key,value|
|
249
|
+
puts "#{key} => #{value}Controller"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
desc 'version', 'Display Ptero version number'
|
255
|
+
long_desc <<-LONGDESC
|
256
|
+
Use the Ptero::VERSION constant to represent the version number
|
257
|
+
LONGDESC
|
258
|
+
# Print the Ptero version number
|
259
|
+
def version
|
260
|
+
puts Ptero::VERSION
|
261
|
+
end
|
262
|
+
|
263
|
+
private
|
264
|
+
@@cache = {}
|
265
|
+
def app
|
266
|
+
if @@cache[Pathname.new(Dir.pwd)]
|
267
|
+
@@cache[Pathname.new(Dir.pwd)]
|
268
|
+
else
|
269
|
+
@@cache[Pathname.new(Dir.pwd)] = Ptero::Application.new(Dir.pwd)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
def ptero_dir_message
|
274
|
+
puts
|
275
|
+
puts 'The current directory is not a dinosaur root directory.'
|
276
|
+
puts 'Run the following command:'
|
277
|
+
puts ' $ ptero new NAME'
|
278
|
+
puts 'Then run the desired command inside the NAME directory.'
|
279
|
+
puts
|
280
|
+
end
|
281
|
+
|
282
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# exception.rb
|
3
|
+
# ============
|
4
|
+
# The superclass of all Ptero-related exceptions
|
5
|
+
#
|
6
|
+
#
|
7
|
+
|
8
|
+
# The superclass of Ptero-related Exceptions
|
9
|
+
class Ptero::Exception < StandardError
|
10
|
+
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# Autoload exceptions
|
14
|
+
def const_missing(const_name)
|
15
|
+
# Require the exception
|
16
|
+
require "#{__dir__}/exceptions/#{const_name.downcase}.rb"
|
17
|
+
return const_get const_name
|
18
|
+
# If we couldn't load the file, throw an error
|
19
|
+
rescue LoadError
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# Generator.rb
|
4
|
+
# ============
|
5
|
+
#
|
6
|
+
# Generates files from templates
|
7
|
+
#
|
8
|
+
require 'ptero'
|
9
|
+
require 'erubis'
|
10
|
+
require 'pathname'
|
11
|
+
require 'colorize'
|
12
|
+
require 'mute'
|
13
|
+
|
14
|
+
module Ptero
|
15
|
+
# An object that generates files for an application
|
16
|
+
class Generator
|
17
|
+
|
18
|
+
# Input the generator's name and the Application to generate for
|
19
|
+
# @param name [String] the generator's name
|
20
|
+
# @param app [Application] the application in which to generate files
|
21
|
+
def initialize(name,app=Application.app_for(Dir.pwd))
|
22
|
+
@name = name
|
23
|
+
@dir = Pathname.new(app.dir)
|
24
|
+
@app = app
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :name, :app, :dir
|
28
|
+
|
29
|
+
# The filename of the generated file
|
30
|
+
# @return [String] an unqualifed filename, name and extension
|
31
|
+
def filename
|
32
|
+
"#{@name}.#{extension}"
|
33
|
+
end
|
34
|
+
|
35
|
+
# The extension of the file to be generated
|
36
|
+
# @return [String] "txt"
|
37
|
+
def extension
|
38
|
+
'txt'
|
39
|
+
end
|
40
|
+
|
41
|
+
# The unqualified name of the class, e.g. 'Controller' for an object of class Ptero::Generator::ControllerGenerator
|
42
|
+
# @return [String] the unqualified name of the class
|
43
|
+
def type
|
44
|
+
self.class.name.split('::').last
|
45
|
+
end
|
46
|
+
|
47
|
+
# Simple string representation of this object, represented by the unqualified class name and filename of the current object
|
48
|
+
# @return [String] a string representation of this object, of type "[type - filename]"
|
49
|
+
def to_s
|
50
|
+
"[#{type} - #{filename}]"
|
51
|
+
end
|
52
|
+
|
53
|
+
# Default path to write to, used along with filename to determine the destination of the generated file\
|
54
|
+
# @return [String] the empty string
|
55
|
+
def path
|
56
|
+
''
|
57
|
+
end
|
58
|
+
|
59
|
+
# The fully-qualified filename of the file to be generated by this object.
|
60
|
+
# @return [String] a fully-qualified pathname to the file to be generated by this object.
|
61
|
+
def location
|
62
|
+
dir.join(path).join(filename)
|
63
|
+
end
|
64
|
+
|
65
|
+
# The path to the directory where Ptero templates are stored
|
66
|
+
# @return [String] the aforementioned path
|
67
|
+
def template_path
|
68
|
+
Pathname.new("#{Ptero::TEMPLATE_PATH}/#{self.class.name.split('::').last.downcase}.#{extension}.erb")
|
69
|
+
end
|
70
|
+
|
71
|
+
# Generate a file and print the location of the generated file
|
72
|
+
# @return [Generator] self
|
73
|
+
def generate
|
74
|
+
loc = location
|
75
|
+
raise Ptero::Exception::GeneratorException, "Generator is already generated: #{self}" if generated?
|
76
|
+
unless loc.dirname.exist?
|
77
|
+
loc.dirname.descend do |dir|
|
78
|
+
Dir.mkdir dir unless dir.exist?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
File.open(loc,'w') do |file|
|
82
|
+
file.puts content
|
83
|
+
end
|
84
|
+
puts "GENERATE - #{self}".green
|
85
|
+
self
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
# Remove the file corresponding to self and print its location
|
90
|
+
# @return [Generator] self
|
91
|
+
def remove
|
92
|
+
loc = location
|
93
|
+
raise Ptero::Exception::GeneratorException, "Cannot remove because generator is already generated: #{self}" unless generated?
|
94
|
+
File.unlink(loc);
|
95
|
+
puts "REMOVE - #{self}".red
|
96
|
+
self
|
97
|
+
end
|
98
|
+
|
99
|
+
# Find out if this Generator's file is generated
|
100
|
+
# @return [Boolean] Does the file exist?
|
101
|
+
def generated?
|
102
|
+
File.exist? location
|
103
|
+
end
|
104
|
+
|
105
|
+
# Remove and regenerate and print the regenerated file
|
106
|
+
# @return [Generator] self
|
107
|
+
def reload
|
108
|
+
Mute::IO.capture_stdout do
|
109
|
+
remove if generated?
|
110
|
+
generate
|
111
|
+
end
|
112
|
+
puts "RELOAD - #{self}".blue
|
113
|
+
self
|
114
|
+
end
|
115
|
+
|
116
|
+
# Return the content of the file to be generated by inputting content_params into an erubis template
|
117
|
+
# @return [String] the content of the file to be generated
|
118
|
+
def content
|
119
|
+
File.open(template_path, 'r') do |file|
|
120
|
+
eruby = Erubis::Eruby.new(file.read)
|
121
|
+
eruby.evaluate(content_params)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
# The context for generating a template, default to self
|
125
|
+
# @return [Generator] self
|
126
|
+
def content_params
|
127
|
+
self
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
class << self
|
133
|
+
# Autoload Generators
|
134
|
+
def const_missing(const_name)
|
135
|
+
# Require the generator
|
136
|
+
require "#{__dir__}/generators/#{const_name.downcase}.rb"
|
137
|
+
return const_get const_name
|
138
|
+
# If we couldn't load the file, throw an error
|
139
|
+
rescue LoadError
|
140
|
+
super
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
end
|