ptero 1.0.4 → 1.0.5
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 +4 -4
- data/lib/ptero.rb +0 -3
- data/lib/ptero/application.rb +39 -23
- data/lib/ptero/cli.rb +3 -1
- data/lib/ptero/cli/root.rb +2 -14
- data/lib/ptero/exception.rb +2 -1
- data/lib/ptero/generator.rb +7 -2
- data/lib/ptero/generators/javascriptgenerator.rb +1 -1
- data/lib/ptero/generators/layoutgenerator.rb +1 -1
- data/lib/ptero/generators/setupgenerator.rb +5 -0
- data/lib/ptero/generators/stylesheetgenerator.rb +1 -1
- data/lib/ptero/generators/twiggenerator.rb +4 -0
- data/lib/ptero/generators/viewgenerator.rb +3 -3
- data/lib/ptero/templates/controllergenerator.php.erb +1 -1
- data/lib/ptero/templates/landinggenerator.php.erb +1 -1
- data/lib/ptero/templates/modelgenerator.php.erb +1 -1
- data/lib/ptero/templates/phpclassgenerator.php.erb +2 -2
- data/lib/ptero/templates/routesgenerator.php.erb +1 -1
- data/lib/ptero/version.rb +1 -1
- data/test/fixtures/test_generators_fixtures.yaml +3 -4
- data/test/test_application.rb +16 -6
- data/test/test_exceptions.rb +3 -3
- data/test/test_generators.rb +4 -2
- data/test/test_root.rb +4 -10
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a27fb5289bea6827e5b3b7cb7145a06d482cb17f
|
4
|
+
data.tar.gz: 8fd22cae5ea40774e96784ad43c428a8f68a6e39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 919135e5a2ca537f012aa988275e43024901ef35a004d1adca05f168cd4b733442e5bbd8f86ec4b4ca4349dc85e977a0eeb747296f6b12c6997bbd0ba1a1ad49
|
7
|
+
data.tar.gz: 6f63fa5383ce9263dee0365f292975e3fb4b64475a6baf1995cbb2255ccfc7a384f5a21245bb5cb5765e0014b000dd0446eeff04e6535ad178a0693ed598a406
|
data/lib/ptero.rb
CHANGED
data/lib/ptero/application.rb
CHANGED
@@ -18,14 +18,36 @@ module Ptero
|
|
18
18
|
# Input a directory String or Pathname to make a new Application from that path. (Defaults to Dir.pwd)
|
19
19
|
# @param dir [Pathname,String] the Application directory
|
20
20
|
def initialize(dir=Dir.pwd)
|
21
|
-
@name = dir.to_s.split('/').last.capitalize
|
22
21
|
@dir = Pathname.new(dir)
|
23
22
|
|
23
|
+
@name = ''
|
24
|
+
|
25
|
+
composer_path = @dir.join('composer.json')
|
26
|
+
if File.exist? composer_path
|
27
|
+
|
28
|
+
hash = JSON.parse File.read(composer_path)
|
29
|
+
|
30
|
+
if hash['dinosaur'] && hash['dinosaur']['root'].eql?(true) && hash['dinosaur']['name']
|
31
|
+
@name = hash['dinosaur']['name']
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
end
|
24
36
|
|
25
37
|
end
|
26
38
|
|
27
39
|
attr_reader :name,:dir
|
28
40
|
|
41
|
+
# Find out if this folder really contains a Ptero application using metadat
|
42
|
+
# @return [Boolean] whether or not this application was verified successfully
|
43
|
+
def verify
|
44
|
+
composer_path = dir.join('composer.json')
|
45
|
+
return false unless File.exist? composer_path
|
46
|
+
hash = JSON.parse File.read(composer_path)
|
47
|
+
return false unless hash['dinosaur'] && hash['dinosaur']['root']
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
29
51
|
# Find out whether or not the user has the PHP command-line tool installed so that they can use Composer.
|
30
52
|
# @return [Boolean] whether or not the user's PHP command works.
|
31
53
|
def test_php
|
@@ -39,7 +61,7 @@ module Ptero
|
|
39
61
|
#
|
40
62
|
# @return [Application,Boolean] self
|
41
63
|
def get_composer
|
42
|
-
raise Ptero::Exception::ApplicationException, "Application #{self} already has composer.phar file" if has_composer?
|
64
|
+
raise Ptero::Exception::ApplicationException, "Application \"#{self.name}\" already has composer.phar file" if has_composer?
|
43
65
|
Dir.chdir @dir do
|
44
66
|
# Download code from the composer website
|
45
67
|
# https://getcomposer.org
|
@@ -56,7 +78,7 @@ module Ptero
|
|
56
78
|
puts
|
57
79
|
|
58
80
|
unless exit_status.success?
|
59
|
-
raise Ptero::Exception::ApplicationException, "Could not install Composer in Application #{self.
|
81
|
+
raise Ptero::Exception::ApplicationException, "Could not install Composer in Application \"#{self.name}\" with command `#{command}`. Output was: \"#{output.chomp}\""
|
60
82
|
end
|
61
83
|
|
62
84
|
puts 'Done!'
|
@@ -68,7 +90,7 @@ module Ptero
|
|
68
90
|
# Remove the composer.phar file
|
69
91
|
# @return [Application,Boolean] self if composer was removed, flse if composer is not downloaded
|
70
92
|
def remove_composer
|
71
|
-
raise Ptero::Exception::ApplicationException, "Application #{self} does not have a composer.phar file" unless has_composer?
|
93
|
+
raise Ptero::Exception::ApplicationException, "Application \"#{self.name}\" does not have a composer.phar file" unless has_composer?
|
72
94
|
File.unlink(dir.join('composer.phar'))
|
73
95
|
self
|
74
96
|
end
|
@@ -87,7 +109,7 @@ module Ptero
|
|
87
109
|
def install_dependencies
|
88
110
|
raise Ptero::Exception::ApplicationException, "Not a dinosaur root: #{Dir.pwd}" unless verify
|
89
111
|
raise Ptero::Exception::ApplicationException, "PHP command-line tool failed, update your version of PHP" unless test_php
|
90
|
-
|
112
|
+
get_composer unless has_composer?
|
91
113
|
Dir.chdir @dir do
|
92
114
|
# Install dependencies using Composer
|
93
115
|
# https://getcomposer.org
|
@@ -105,7 +127,7 @@ module Ptero
|
|
105
127
|
puts
|
106
128
|
|
107
129
|
unless exit_status.success?
|
108
|
-
raise Ptero::Exception::ApplicationException, "Could not install dependencies in Application #{self.
|
130
|
+
raise Ptero::Exception::ApplicationException, "Could not install dependencies in Application \"#{self.name}\" with command `#{command}`. Output was: \"#{output.chomp}\""
|
109
131
|
end
|
110
132
|
puts 'Done!'
|
111
133
|
end
|
@@ -135,7 +157,7 @@ module Ptero
|
|
135
157
|
puts
|
136
158
|
|
137
159
|
unless exit_status.success?
|
138
|
-
raise Ptero::Exception::ApplicationException, "Could not update dependencies in Application #{self.
|
160
|
+
raise Ptero::Exception::ApplicationException, "Could not update dependencies in Application \"#{self.name}\" with command `#{command}`. Output was: \"#{output.chomp}\""
|
139
161
|
end
|
140
162
|
|
141
163
|
puts 'Done!'
|
@@ -152,16 +174,6 @@ module Ptero
|
|
152
174
|
@dir.join('vendor').directory?
|
153
175
|
end
|
154
176
|
|
155
|
-
# Find out if this folder really contains a Ptero application using metadata in composer.json
|
156
|
-
# @return [Boolean] whether or not this application was verified successfully.
|
157
|
-
def verify
|
158
|
-
composer_path = dir.join('composer.json')
|
159
|
-
return false unless File.exist? composer_path
|
160
|
-
hash = JSON.parse File.read(composer_path)
|
161
|
-
return false unless hash['dinosaur'] && hash['dinosaur']['root']
|
162
|
-
self
|
163
|
-
end
|
164
|
-
|
165
177
|
# Generate a file using the given arguments
|
166
178
|
# @param klass [String,Class] what type of file to generate
|
167
179
|
# @param *params all other parameters to pass to the generator
|
@@ -262,12 +274,14 @@ module Ptero
|
|
262
274
|
# @return [Application] the new Application object
|
263
275
|
def create(name,dir=Pathname.new(Dir.pwd))
|
264
276
|
|
277
|
+
name = "#{name[0].upcase}#{name[1,name.length-1]}"
|
278
|
+
|
265
279
|
Dir.chdir dir do
|
266
|
-
raise Ptero::Exception::ApplicationException, "Cannot create project #{name} because a file already exists with that name" if File.exist? name
|
280
|
+
raise Ptero::Exception::ApplicationException, "Cannot create project \"#{name}\" because a file already exists with that name" if File.exist? name.downcase
|
267
281
|
|
268
|
-
puts "Creating directory #{name} in #{Dir.pwd}"
|
269
|
-
Dir.mkdir(name)
|
270
|
-
Dir.chdir(name) do
|
282
|
+
puts "Creating directory #{name.downcase} in #{Dir.pwd}"
|
283
|
+
Dir.mkdir(name.downcase)
|
284
|
+
Dir.chdir(name.downcase) do
|
271
285
|
|
272
286
|
puts "Loading default composer.json"
|
273
287
|
composer = JSON.parse( File.read("#{__dir__}/composer_default.json") )
|
@@ -298,14 +312,16 @@ module Ptero
|
|
298
312
|
# @return [Application] the verified Application object
|
299
313
|
def app_for(dir=Dir.pwd)
|
300
314
|
path = Pathname.new dir
|
301
|
-
path.
|
302
|
-
app =
|
315
|
+
path.ascend do |level|
|
316
|
+
app = new(level)
|
303
317
|
return app if app.verify
|
304
318
|
end
|
305
319
|
|
306
320
|
raise Ptero::Exception::ApplicationException, "Couldn't find composer.json with dinosaur information in #{dir} or parent directories"
|
307
321
|
end
|
308
322
|
|
323
|
+
|
324
|
+
|
309
325
|
# Return the verified Application object corresponding to Dir.pwd or its parent directories
|
310
326
|
# @return [Application] the Application object that represents the found verified application
|
311
327
|
def current_app
|
data/lib/ptero/cli.rb
CHANGED
@@ -25,7 +25,9 @@ module Ptero
|
|
25
25
|
def const_missing(const_name)
|
26
26
|
# Load the cli
|
27
27
|
require "#{__dir__}/cli/#{const_name.downcase}.rb"
|
28
|
-
return const_get const_name
|
28
|
+
return const_get const_name if const_defined? const_name
|
29
|
+
super
|
30
|
+
# If we couldn't load it, throw an error
|
29
31
|
rescue LoadError
|
30
32
|
super
|
31
33
|
end
|
data/lib/ptero/cli/root.rb
CHANGED
@@ -47,7 +47,7 @@ class Ptero::CLI::Root < Ptero::CLI
|
|
47
47
|
# PHP
|
48
48
|
Dir.mkdir 'php'
|
49
49
|
app.generate('PHP_Info')
|
50
|
-
app.generate_setup
|
50
|
+
app.generate_setup
|
51
51
|
app.generate_routes
|
52
52
|
|
53
53
|
Dir.mkdir 'php/controllers'
|
@@ -151,7 +151,7 @@ class Ptero::CLI::Root < Ptero::CLI
|
|
151
151
|
# and exits.
|
152
152
|
# @param dir [String,Pathname] the directory to destroy
|
153
153
|
def destroy(dir = Dir.pwd)
|
154
|
-
a = Ptero::Application.
|
154
|
+
a = Ptero::Application.app_for(dir)
|
155
155
|
if a.verify
|
156
156
|
puts "Are you sure you want to destroy #{dir}? Type 'Yes' to authorize".yellow
|
157
157
|
print '>> '
|
@@ -176,18 +176,6 @@ class Ptero::CLI::Root < Ptero::CLI
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
-
desc 'update', 'Update dependencies'
|
180
|
-
long_desc <<-LONGDESC
|
181
|
-
Use the composer.json file to update dependencies. Install Composer if it is not already downloaded.
|
182
|
-
LONGDESC
|
183
|
-
# Call the appropriate Application methods to update Composer dependencies.
|
184
|
-
# If verify returns false, install quits with the ptero_dir_message text
|
185
|
-
def update
|
186
|
-
verify do
|
187
|
-
app.update_dependencies
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
179
|
desc 'composer', 'Download composer.phar'
|
192
180
|
long_desc <<-LONGDESC
|
193
181
|
Download the compser.phar file in order to facilitate future downloads
|
data/lib/ptero/exception.rb
CHANGED
@@ -14,7 +14,8 @@ class Ptero::Exception < StandardError
|
|
14
14
|
def const_missing(const_name)
|
15
15
|
# Require the exception
|
16
16
|
require "#{__dir__}/exceptions/#{const_name.downcase}.rb"
|
17
|
-
return const_get const_name
|
17
|
+
return const_get const_name if const_defined? const_name
|
18
|
+
super
|
18
19
|
# If we couldn't load the file, throw an error
|
19
20
|
rescue LoadError
|
20
21
|
super
|
data/lib/ptero/generator.rb
CHANGED
@@ -65,7 +65,7 @@ module Ptero
|
|
65
65
|
# The path to the directory where Ptero templates are stored
|
66
66
|
# @return [String] the aforementioned path
|
67
67
|
def template_path
|
68
|
-
Pathname.new("#{
|
68
|
+
Pathname.new("#{TEMPLATE_PATH}/#{self.class.name.split('::').last.downcase}.#{extension}.erb")
|
69
69
|
end
|
70
70
|
|
71
71
|
# Generate a file and print the location of the generated file
|
@@ -127,6 +127,10 @@ module Ptero
|
|
127
127
|
self
|
128
128
|
end
|
129
129
|
|
130
|
+
|
131
|
+
# The directory location of all Ptero templates for code generation
|
132
|
+
TEMPLATE_PATH = Pathname.new("#{__dir__}/templates")
|
133
|
+
|
130
134
|
|
131
135
|
|
132
136
|
class << self
|
@@ -134,7 +138,8 @@ module Ptero
|
|
134
138
|
def const_missing(const_name)
|
135
139
|
# Require the generator
|
136
140
|
require "#{__dir__}/generators/#{const_name.downcase}.rb"
|
137
|
-
return const_get const_name
|
141
|
+
return const_get const_name if const_defined? const_name
|
142
|
+
super
|
138
143
|
# If we couldn't load the file, throw an error
|
139
144
|
rescue LoadError
|
140
145
|
super
|
@@ -13,7 +13,7 @@ class Ptero::Generator::JavascriptGenerator < Ptero::Generator
|
|
13
13
|
# @param name [String] the name of the Javascript
|
14
14
|
# @param desc [String] a String to describe this script
|
15
15
|
def initialize(name,desc = 'This script does...')
|
16
|
-
super name
|
16
|
+
super name.downcase
|
17
17
|
@desc = desc
|
18
18
|
end
|
19
19
|
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
# Generate application layout template
|
13
13
|
class Ptero::Generator::LayoutGenerator < Ptero::Generator::TwigGenerator
|
14
|
-
# @param name [String] the name of the
|
14
|
+
# @param name [String] the name of the layout
|
15
15
|
def initialize(name='application')
|
16
16
|
super(name)
|
17
17
|
end
|
@@ -10,4 +10,9 @@
|
|
10
10
|
# A generator for "setup" files that load dependencies and initialize the application
|
11
11
|
class Ptero::Generator::SetupGenerator < Ptero::Generator::PHPGenerator
|
12
12
|
|
13
|
+
# The name of the setup is always the same as the name of the Application
|
14
|
+
def initialize
|
15
|
+
super Ptero::Application.app_for(Dir.pwd).name.downcase
|
16
|
+
end
|
17
|
+
|
13
18
|
end
|
@@ -13,7 +13,7 @@ class Ptero::Generator::StylesheetGenerator < Ptero::Generator
|
|
13
13
|
# @param name [String] the name of the stylesheet
|
14
14
|
# @param desc [String] a String to describe this stylesheet
|
15
15
|
def initialize(name,desc = 'The purpose of this stylesheet is...')
|
16
|
-
super name
|
16
|
+
super name.downcase
|
17
17
|
@desc = desc
|
18
18
|
end
|
19
19
|
|
@@ -12,13 +12,13 @@
|
|
12
12
|
# Generator for a view that extends a layout
|
13
13
|
class Ptero::Generator::ViewGenerator < Ptero::Generator::TwigGenerator
|
14
14
|
|
15
|
-
# @param name [String] the name of the view
|
16
|
-
# @param parent [String] the name of the layout to extend
|
15
|
+
# @param name [String] the name of the view
|
16
|
+
# @param parent [String] the name of the layout to extend
|
17
17
|
def initialize(name,parent='application')
|
18
18
|
super(name)
|
19
19
|
@parent = parent
|
20
20
|
end
|
21
21
|
|
22
|
-
attr_reader :parent
|
22
|
+
attr_reader :parent
|
23
23
|
|
24
24
|
end
|
data/lib/ptero/version.rb
CHANGED
data/test/test_application.rb
CHANGED
@@ -71,14 +71,24 @@ class TestApplication < MiniTest::Test
|
|
71
71
|
|
72
72
|
def test_verify_application
|
73
73
|
assert @app.verify
|
74
|
-
|
75
|
-
|
74
|
+
Mute::IO.capture_stdout do
|
75
|
+
a = Ptero::Application.create('throwaway')
|
76
|
+
assert a.verify
|
77
|
+
a.destroy
|
78
|
+
refute a.verify
|
79
|
+
end
|
80
|
+
|
81
|
+
Mute::IO.capture_stdout do
|
82
|
+
assert_raises Ptero::Exception::ApplicationException do
|
83
|
+
app = Ptero::Application.app_for('throwaway')
|
84
|
+
end
|
85
|
+
end
|
76
86
|
end
|
77
87
|
|
78
88
|
def test_application_generate
|
79
89
|
Mute::IO.capture_stdout do
|
80
|
-
['controller','
|
81
|
-
g = Ptero::Generator.const_get("#{str.
|
90
|
+
['controller','model','javascript'].each do |str|
|
91
|
+
g = Ptero::Generator.const_get("#{str[0].upcase}#{str[1,str.length-1]}Generator".intern).new('review')
|
82
92
|
@app.generate(str,'review')
|
83
93
|
assert g.generated?
|
84
94
|
|
@@ -92,9 +102,9 @@ class TestApplication < MiniTest::Test
|
|
92
102
|
end
|
93
103
|
|
94
104
|
def test_generated
|
95
|
-
['controller','
|
105
|
+
['controller','model','javascript'].each do |str|
|
96
106
|
name = 'exams'
|
97
|
-
gen = Ptero::Generator.const_get("#{str.
|
107
|
+
gen = Ptero::Generator.const_get("#{str[0].upcase}#{str[1,str.length-1]}Generator".intern).new(name)
|
98
108
|
Mute::IO.capture_stdout do
|
99
109
|
refute gen.generated?
|
100
110
|
refute @app.generated? gen.class, name
|
data/test/test_exceptions.rb
CHANGED
@@ -8,7 +8,7 @@ require 'ptero'
|
|
8
8
|
|
9
9
|
class TestExceptions < MiniTest::Test
|
10
10
|
|
11
|
-
def
|
11
|
+
def test_exceptions_should_be_exceptions
|
12
12
|
@exceptions.each do |klass|
|
13
13
|
exception = klass.new('Something bad happened!')
|
14
14
|
|
@@ -20,7 +20,7 @@ class TestExceptions < MiniTest::Test
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def test_exceptions_should_raise
|
24
24
|
@exceptions.each do |klass|
|
25
25
|
exception = klass.new('Something bad happened!')
|
26
26
|
|
@@ -39,7 +39,7 @@ class TestExceptions < MiniTest::Test
|
|
39
39
|
require location
|
40
40
|
end
|
41
41
|
|
42
|
-
@exceptions = Ptero::Exception.constants.map { |sym| Ptero::
|
42
|
+
@exceptions = Ptero::Exception.constants.map { |sym| Ptero::Exception.const_get(sym) }
|
43
43
|
end
|
44
44
|
|
45
45
|
|
data/test/test_generators.rb
CHANGED
@@ -59,8 +59,10 @@ class TestGenerators < MiniTest::Test
|
|
59
59
|
def test_generators_should_complain
|
60
60
|
@generators.each do |gen|
|
61
61
|
type = gen.to_s.split('::').last.downcase
|
62
|
+
|
62
63
|
params = @fixture['generators'][type]['params']
|
63
64
|
g = gen.new(*params)
|
65
|
+
|
64
66
|
assert_raises(Ptero::Exception::GeneratorException) do
|
65
67
|
g.remove
|
66
68
|
end
|
@@ -80,7 +82,7 @@ class TestGenerators < MiniTest::Test
|
|
80
82
|
app
|
81
83
|
generators
|
82
84
|
fixture
|
83
|
-
|
85
|
+
end
|
84
86
|
|
85
87
|
def app
|
86
88
|
Dir.chdir __dir__
|
@@ -95,7 +97,7 @@ class TestGenerators < MiniTest::Test
|
|
95
97
|
require location
|
96
98
|
end
|
97
99
|
|
98
|
-
@generators = Ptero::Generator.constants.map { |sym| Ptero::Generator.const_get(sym) }
|
100
|
+
@generators = Ptero::Generator.constants.select { |sym| sym.match /(\w+)Generator/ }.map { |sym| Ptero::Generator.const_get(sym) }
|
99
101
|
end
|
100
102
|
|
101
103
|
def fixture
|
data/test/test_root.rb
CHANGED
@@ -15,12 +15,8 @@ class TestRoot < MiniTest::Test
|
|
15
15
|
def setup
|
16
16
|
@klass = Ptero::CLI::Root
|
17
17
|
Dir.chdir __dir__
|
18
|
-
|
19
|
-
@app = Ptero::Application.
|
20
|
-
else
|
21
|
-
Mute::IO.capture_stdout do
|
22
|
-
@app = Ptero::Application.create('root')
|
23
|
-
end
|
18
|
+
Mute::IO.capture_stdout do
|
19
|
+
@app = Ptero::Application.create('example')
|
24
20
|
end
|
25
21
|
Dir.chdir @app.dir
|
26
22
|
end
|
@@ -51,7 +47,7 @@ class TestRoot < MiniTest::Test
|
|
51
47
|
end
|
52
48
|
|
53
49
|
|
54
|
-
Mute::IO.capture_stdout do
|
50
|
+
Mute::IO.capture_stdout do
|
55
51
|
@app.generate('routes')
|
56
52
|
@klass.start(['route', '/app/path/:number.jpg', 'Photo'])
|
57
53
|
end
|
@@ -69,9 +65,7 @@ class TestRoot < MiniTest::Test
|
|
69
65
|
def test_verify
|
70
66
|
Mute::IO.capture_stdout do
|
71
67
|
Dir.mkdir('notapp')
|
72
|
-
notapp = Ptero::Application.new('notapp')
|
73
68
|
refute @klass.start(['verify','notapp'])
|
74
|
-
refute notapp.verify
|
75
69
|
Dir.chdir 'notapp' do
|
76
70
|
refute @klass.start(['verify'])
|
77
71
|
end
|
@@ -127,7 +121,7 @@ class TestRoot < MiniTest::Test
|
|
127
121
|
end
|
128
122
|
assert @app.has_composer?
|
129
123
|
end
|
130
|
-
|
124
|
+
|
131
125
|
def test_install
|
132
126
|
Mute::IO.capture_stdout do
|
133
127
|
@app.get_composer
|