ptero 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# applicationjavascriptgenerator.rb
|
4
|
+
# =================================
|
5
|
+
# Generate application-wide Javascripts
|
6
|
+
#
|
7
|
+
|
8
|
+
# Generate Javascript for the default page layout
|
9
|
+
class Ptero::Generator::ApplicationJavascriptGenerator < Ptero::Generator::JavascriptGenerator
|
10
|
+
|
11
|
+
# @param name [String] The name of the Javscript, defaults to "application"
|
12
|
+
# @param desc [String] The description of the Javascript, defaults to "The application-wide Javascript file"
|
13
|
+
def initialize(name='application',desc = 'The application-wide Javascript file')
|
14
|
+
super name,desc
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# applicationstylesheetgenerator.rb
|
3
|
+
# =================================
|
4
|
+
# Generate application-wide CSS stylesheets
|
5
|
+
#
|
6
|
+
#
|
7
|
+
|
8
|
+
# Generate stylesheets to be used by application layouts
|
9
|
+
class Ptero::Generator::ApplicationStylesheetGenerator < Ptero::Generator::StylesheetGenerator
|
10
|
+
# Initialize with name and description
|
11
|
+
# @param name [String] the stylesheet's name
|
12
|
+
# @param desc [String] the stylesheet's description
|
13
|
+
def initialize(name='application',desc='The main application stylesheet')
|
14
|
+
super(name,desc)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# configgenerator.rb
|
3
|
+
# ==================
|
4
|
+
# Generate the config.php file for each application
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
# Generator for the config.php file
|
9
|
+
class Ptero::Generator::ConfigGenerator < Ptero::Generator::PHPGenerator
|
10
|
+
# Automatically with name "config". Pass a hash of mappings to be included in the config file
|
11
|
+
# @param options [Hash] a mapping of keys and values to be included in the config.php file
|
12
|
+
def initialize(options={})
|
13
|
+
super 'config'
|
14
|
+
@options = options
|
15
|
+
|
16
|
+
# Defaults
|
17
|
+
@options[:templates_path] ||= 'views'
|
18
|
+
@options[:controllers_path] ||= 'php/controllers'
|
19
|
+
@options[:models_path] ||= 'php/models'
|
20
|
+
|
21
|
+
@options[:database] ||= {
|
22
|
+
name: 'database-name',
|
23
|
+
user: 'username',
|
24
|
+
password: 'password',
|
25
|
+
server: 'localhost'
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :options
|
30
|
+
# @return [String] "config"
|
31
|
+
def path
|
32
|
+
"config"
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#
|
2
|
+
# controllergenerator.rb
|
3
|
+
# ======================
|
4
|
+
# generate Dinosaur controller objects
|
5
|
+
#
|
6
|
+
#
|
7
|
+
#
|
8
|
+
|
9
|
+
class Ptero::Generator::ControllerGenerator < Ptero::Generator::PHPClassGenerator
|
10
|
+
# @param name [String] the name of the controller
|
11
|
+
# @param parent [String] the name of the controller's parent
|
12
|
+
def initialize(name,parent='Application')
|
13
|
+
super("#{name}Controller","#{parent}Controller")
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [String] superclass_path/controllers
|
17
|
+
def path
|
18
|
+
"#{super}/controllers"
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# htaccessgenerator.rb
|
3
|
+
# ====================
|
4
|
+
# Generate the Apache .htaccess file for redirects
|
5
|
+
#
|
6
|
+
#
|
7
|
+
#
|
8
|
+
|
9
|
+
# Generate .htaccess files for apache routing
|
10
|
+
class Ptero::Generator::HTAccessGenerator < Ptero::Generator
|
11
|
+
|
12
|
+
# This is a dotfile, there are no parameters, and the name is always ""
|
13
|
+
def initialize
|
14
|
+
super ''
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [String] "htaccess"
|
18
|
+
def extension
|
19
|
+
'htaccess'
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [String] "www"
|
23
|
+
def path
|
24
|
+
'www'
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# javascriptgenerator.rb
|
4
|
+
# ======================
|
5
|
+
# Generate javascripts
|
6
|
+
#
|
7
|
+
|
8
|
+
# Generate Javascripts
|
9
|
+
class Ptero::Generator::JavascriptGenerator < Ptero::Generator
|
10
|
+
|
11
|
+
# Initialize with name and an optional description that will be generated in a comment.
|
12
|
+
# (Defaults to "This script does...")
|
13
|
+
# @param name [String] the name of the Javascript
|
14
|
+
# @param desc [String] a String to describe this script
|
15
|
+
def initialize(name,desc = 'This script does...')
|
16
|
+
super name
|
17
|
+
@desc = desc
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :desc
|
21
|
+
|
22
|
+
# @return [String] "www/assets/js"
|
23
|
+
def path
|
24
|
+
'www/assets/js'
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [String] "js"
|
28
|
+
def extension
|
29
|
+
'js'
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# landinggenerator.rb
|
4
|
+
# ===================
|
5
|
+
# The landing redirect page
|
6
|
+
#
|
7
|
+
#
|
8
|
+
|
9
|
+
# Generator for the global landing page of the application that handles all incoming requests and initiates Routing
|
10
|
+
class Ptero::Generator::LandingGenerator < Ptero::Generator::PHPGenerator
|
11
|
+
|
12
|
+
# Initialize with name "index"
|
13
|
+
def initialize
|
14
|
+
super 'index'
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return "www"
|
18
|
+
def path
|
19
|
+
'www'
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# layoutgenerator.rb
|
5
|
+
# ==================
|
6
|
+
#
|
7
|
+
# Generate the application layout twig file
|
8
|
+
#
|
9
|
+
#
|
10
|
+
#
|
11
|
+
|
12
|
+
# Generate application layout template
|
13
|
+
class Ptero::Generator::LayoutGenerator < Ptero::Generator::TwigGenerator
|
14
|
+
# @param name [String] the name of the application
|
15
|
+
def initialize(name='application')
|
16
|
+
super(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# loadallgenerator.rb
|
3
|
+
# ===================
|
4
|
+
# Generate a PHP file to run all other PHP files in the same directory
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
require 'pathname'
|
9
|
+
|
10
|
+
|
11
|
+
# Generator for the loadall.php file that is tasked with running all other PHP files in its directory
|
12
|
+
class Ptero::Generator::LoadAllGenerator < Ptero::Generator::PHPGenerator
|
13
|
+
# Send the directory in which to generate as a parameter, as well as the names of files that need to be loaded first
|
14
|
+
# @param path [String] the path to the file that will be generated
|
15
|
+
# @param priorities [Array] all files that need to be required first, in order of priority
|
16
|
+
def initialize(path,*priorities)
|
17
|
+
super 'loadall'
|
18
|
+
# Stuff to load first, should be an array
|
19
|
+
@path = Pathname.new(path)
|
20
|
+
@priorities = priorities
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :path, :priorities
|
24
|
+
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# modelgenerator.rb
|
4
|
+
# =================
|
5
|
+
# Generate PHPActiveRecord models
|
6
|
+
# http://www.phpactiverecord.org/
|
7
|
+
#
|
8
|
+
|
9
|
+
# A generator for PHP ActiveRecord Models
|
10
|
+
class Ptero::Generator::ModelGenerator < Ptero::Generator::PHPClassGenerator
|
11
|
+
def initialize(name)
|
12
|
+
super(name)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [String] superclass_path/models
|
16
|
+
def path
|
17
|
+
"#{super}/models"
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# pagegenerator.rb
|
4
|
+
# ================
|
5
|
+
#
|
6
|
+
# Generate necessary elements for a full-fledged template page
|
7
|
+
#
|
8
|
+
#
|
9
|
+
|
10
|
+
# Generate all elements of a page
|
11
|
+
class Ptero::Generator::PageGenerator < Ptero::Generator::ViewGenerator
|
12
|
+
# Initialize a ControllerGenerator, JavascriptGenerator, and StylesheetGenerator with parameter name
|
13
|
+
def initialize(name,parent='application')
|
14
|
+
super name,parent
|
15
|
+
@controller = Ptero::Generator::ControllerGenerator.new(name)
|
16
|
+
@js = Ptero::Generator::JavascriptGenerator.new(name.downcase)
|
17
|
+
@css = Ptero::Generator::StylesheetGenerator.new(name.downcase)
|
18
|
+
@elements = [ @controller, @js, @css ]
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :controller,:js,:css,:elements
|
22
|
+
|
23
|
+
# Call the #generate method on all Generator instance variables and self
|
24
|
+
# @return [Ptero::Generator::PageGenerator] self
|
25
|
+
def generate
|
26
|
+
super
|
27
|
+
@controller.generate
|
28
|
+
@js.generate
|
29
|
+
@css.generate
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Call the #remove method on all Generator instance variables and self
|
34
|
+
# @return [Ptero::Generator::PageGenerator] self
|
35
|
+
def remove
|
36
|
+
super
|
37
|
+
@controller.remove
|
38
|
+
@js.remove
|
39
|
+
@css.remove
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def reload
|
44
|
+
super
|
45
|
+
@controller.reload
|
46
|
+
@js.reload
|
47
|
+
@css.reload
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
# @return [Boolean] whether or not every Generator instance variable is generated
|
52
|
+
def generated?
|
53
|
+
@controller.generated? and @js.generated? and @css.generated? and super
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# pagenotfoundgenerator.rb
|
4
|
+
# ========================
|
5
|
+
# Generate the HTTP 404 template
|
6
|
+
#
|
7
|
+
#
|
8
|
+
class Ptero::Generator::PageNotFoundGenerator < Ptero::Generator::ViewGenerator
|
9
|
+
|
10
|
+
# @param parent [String] the layout to extend
|
11
|
+
def initialize(parent = 'application')
|
12
|
+
super '404',parent
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# phpclassgenerator.rb
|
4
|
+
# ====================
|
5
|
+
#
|
6
|
+
# Generate a PHP class file
|
7
|
+
#
|
8
|
+
#
|
9
|
+
#
|
10
|
+
|
11
|
+
# A generator for PHP classes
|
12
|
+
class Ptero::Generator::PHPClassGenerator < Ptero::Generator::PHPGenerator
|
13
|
+
# @param name [String] the name of the class, it will be capitalized
|
14
|
+
# @param parent [String] the name of the class's superclass
|
15
|
+
def initialize(name,parent=nil)
|
16
|
+
# Capitalize class names
|
17
|
+
super("#{name[0].upcase}#{name[1,name.length-1]}")
|
18
|
+
@parent = "#{parent[0].upcase}#{parent[1,parent.length-1]}"if parent
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :parent
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
# phpgenerator.rb
|
4
|
+
# ===============
|
5
|
+
# Generate PHP files
|
6
|
+
|
7
|
+
# Generator for PHP files
|
8
|
+
class Ptero::Generator::PHPGenerator < Ptero::Generator
|
9
|
+
|
10
|
+
# @return [String] "php"
|
11
|
+
def extension
|
12
|
+
'php'
|
13
|
+
end
|
14
|
+
# @return [String] "php"
|
15
|
+
def path
|
16
|
+
'php'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#
|
2
|
+
# phpinfogenerator.rb
|
3
|
+
# ===================
|
4
|
+
# Generate phpinfo files
|
5
|
+
|
6
|
+
# A generator for files that call phpinfo(); to show PHP configuration
|
7
|
+
class Ptero::Generator::PHPInfoGenerator < Ptero::Generator::PHPGenerator
|
8
|
+
|
9
|
+
# Name is always "phpinfo"
|
10
|
+
def initialize
|
11
|
+
super 'phpinfo'
|
12
|
+
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#
|
2
|
+
#
|
3
|
+
#
|
4
|
+
# routesgenerator.rb
|
5
|
+
# ==================
|
6
|
+
#
|
7
|
+
# Generate the application's routing file
|
8
|
+
#
|
9
|
+
#
|
10
|
+
|
11
|
+
# A generator for the application routes file
|
12
|
+
class Ptero::Generator::RoutesGenerator < Ptero::Generator::PHPGenerator
|
13
|
+
|
14
|
+
# Initialize as a generator, name is always "routes"
|
15
|
+
# @param routes [Hash] a list of route mappings from path to controller-name
|
16
|
+
def initialize(routes = {})
|
17
|
+
super('routes')
|
18
|
+
@routes = routes
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader :routes
|
23
|
+
|
24
|
+
# Add a new route to routes.php
|
25
|
+
# @param path [String] the path of the new route
|
26
|
+
# @param controller [String] the name of the route's controller
|
27
|
+
def route(path,controller)
|
28
|
+
get_current_routes
|
29
|
+
raise Ptero::Exception::GeneratorException, "Route #{path} already exists" if @routes.has_key? path
|
30
|
+
controller = "#{controller[0].upcase}#{controller[1,controller.length-1]}"
|
31
|
+
@routes[path] = controller
|
32
|
+
Mute::IO.capture_stdout do
|
33
|
+
reload
|
34
|
+
end
|
35
|
+
puts "ROUTE - #{path} => #{controller}Controller".blue
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
# Remove a route from routes.php
|
40
|
+
# @param path [String] the path of the route to be deleted
|
41
|
+
def unroute(path)
|
42
|
+
get_current_routes
|
43
|
+
raise Ptero::Exception::GeneratorException, "No such route #{path}" unless @routes.has_key? path
|
44
|
+
@routes.delete path
|
45
|
+
Mute::IO.capture_stdout do
|
46
|
+
reload
|
47
|
+
end
|
48
|
+
puts "UNROUTE - #{path}".red
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Open the routes.rb file and parse out any existing routes into this object
|
53
|
+
# @return [Ptero::Generator::RoutesGenerator] self
|
54
|
+
def get_current_routes
|
55
|
+
raise Ptero::Exception::GeneratorException, "Routes file: #{location} not found" unless File.exist? location
|
56
|
+
File.open(location,'r') do |file|
|
57
|
+
file.each_line do |line|
|
58
|
+
line.match( /^\s*(['"])([\/\w:\.]+)\1\s*=>\s*(['"])#{app.name}\\Controllers\\(\w+)Controller\3,?\s*$/ ) do |match|
|
59
|
+
key = match[2]
|
60
|
+
value = match[4]
|
61
|
+
@routes[key] = value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|