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/ptero.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ptero/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ptero"
|
8
|
+
spec.version = Ptero::VERSION
|
9
|
+
spec.authors = ["LuminousRubyist"]
|
10
|
+
spec.email = ["luminousrubyist@zoho.com"]
|
11
|
+
spec.summary = "Command-line interface for Dinosaur projects."
|
12
|
+
spec.description = "Command-line interface for Dinosaur projects. Use this tool to generate components of Dinosaur applications."
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7.4"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "colorize", "~>0.7.3"
|
24
|
+
spec.add_development_dependency "erubis", "~>2.7.0"
|
25
|
+
spec.add_development_dependency "thor", "~>0.19.1"
|
26
|
+
spec.add_development_dependency "mute", "~> 1.1.0"
|
27
|
+
spec.add_development_dependency "minitest", "~> 5.4.3"
|
28
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#
|
2
|
+
# test_generators_fixtures.yaml
|
3
|
+
# =============================
|
4
|
+
#
|
5
|
+
# fixtures for testing generators
|
6
|
+
#
|
7
|
+
---
|
8
|
+
generators:
|
9
|
+
javascriptgenerator:
|
10
|
+
params:
|
11
|
+
- blog
|
12
|
+
- Javascript for the blog
|
13
|
+
applicationjavascriptgenerator:
|
14
|
+
params:
|
15
|
+
- layout_javascript
|
16
|
+
- Javascript for the layout
|
17
|
+
stylesheetgenerator:
|
18
|
+
params:
|
19
|
+
- blog
|
20
|
+
- CSS for the blog
|
21
|
+
applicationstylesheetgenerator:
|
22
|
+
params:
|
23
|
+
- layout_style
|
24
|
+
- Application-wide styles
|
25
|
+
phpgenerator:
|
26
|
+
params:
|
27
|
+
- name
|
28
|
+
configgenerator:
|
29
|
+
params:
|
30
|
+
- name: hello
|
31
|
+
phpclassgenerator:
|
32
|
+
params:
|
33
|
+
- child
|
34
|
+
- parent
|
35
|
+
controllergenerator:
|
36
|
+
params:
|
37
|
+
- person
|
38
|
+
- animal
|
39
|
+
htaccessgenerator:
|
40
|
+
params:
|
41
|
+
landinggenerator:
|
42
|
+
params:
|
43
|
+
twiggenerator:
|
44
|
+
params:
|
45
|
+
- airplane
|
46
|
+
layoutgenerator:
|
47
|
+
params:
|
48
|
+
- global_template
|
49
|
+
loadallgenerator:
|
50
|
+
params:
|
51
|
+
- php/controllers
|
52
|
+
- priority1
|
53
|
+
- priority2
|
54
|
+
modelgenerator:
|
55
|
+
params:
|
56
|
+
- post
|
57
|
+
pagegenerator:
|
58
|
+
params:
|
59
|
+
- helicopter
|
60
|
+
viewgenerator:
|
61
|
+
params:
|
62
|
+
- rewind
|
63
|
+
pagenotfoundgenerator:
|
64
|
+
params:
|
65
|
+
- global_template
|
66
|
+
phpinfogenerator:
|
67
|
+
params:
|
68
|
+
routesgenerator:
|
69
|
+
params:
|
70
|
+
- routes:
|
71
|
+
asdf: Asdf
|
72
|
+
setupgenerator:
|
73
|
+
params:
|
74
|
+
- nm
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#
|
2
|
+
# test_application.rb
|
3
|
+
# ===================
|
4
|
+
#
|
5
|
+
# Test the Ptero::Application class
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'minitest/autorun'
|
9
|
+
require 'mute'
|
10
|
+
|
11
|
+
|
12
|
+
class TestApplication < MiniTest::Test
|
13
|
+
|
14
|
+
def setup
|
15
|
+
Dir.chdir __dir__
|
16
|
+
Mute::IO.capture_stdout do
|
17
|
+
@app = Ptero::Application.create('tester')
|
18
|
+
end
|
19
|
+
Dir.chdir @app.dir
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_application_creates_and_destroys
|
23
|
+
Dir.chdir __dir__ do
|
24
|
+
Mute::IO.capture_stdout do
|
25
|
+
app = Ptero::Application.create('appname')
|
26
|
+
assert File.directory?('appname')
|
27
|
+
app.destroy
|
28
|
+
refute File.exist?('appname')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_app_test_php
|
34
|
+
php_works = `php -r'echo "hello";'` == 'hello'
|
35
|
+
assert_equal php_works, @app.test_php
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_get_composer_has_composer
|
39
|
+
refute @app.has_composer?
|
40
|
+
Mute::IO.capture_stdout do
|
41
|
+
@app.get_composer
|
42
|
+
end
|
43
|
+
assert @app.has_composer?
|
44
|
+
assert_raises Ptero::Exception::ApplicationException do
|
45
|
+
Mute::IO.capture_stdout do
|
46
|
+
@app.get_composer
|
47
|
+
end
|
48
|
+
end
|
49
|
+
@app.remove_composer
|
50
|
+
refute @app.has_composer?
|
51
|
+
|
52
|
+
assert_raises Ptero::Exception::ApplicationException do
|
53
|
+
@app.remove_composer
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_install_dependencies
|
59
|
+
Mute::IO.capture_stdout do
|
60
|
+
@app.get_composer
|
61
|
+
@app.install_dependencies
|
62
|
+
end
|
63
|
+
assert File.directory? 'vendor'
|
64
|
+
assert @app.dependencies_installed?
|
65
|
+
|
66
|
+
@app.remove_dependencies
|
67
|
+
refute File.exist? 'vendor'
|
68
|
+
refute @app.dependencies_installed?
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_verify_application
|
72
|
+
assert @app.verify
|
73
|
+
a = Ptero::Application.new(__dir__)
|
74
|
+
refute a.verify
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_application_generate
|
78
|
+
Mute::IO.capture_stdout do
|
79
|
+
['controller','setup','javascript'].each do |str|
|
80
|
+
g = Ptero::Generator.const_get("#{str.capitalize}Generator".intern).new('review')
|
81
|
+
@app.generate(str,'review')
|
82
|
+
assert g.generated?
|
83
|
+
|
84
|
+
@app.reload(str,'review')
|
85
|
+
assert g.generated?
|
86
|
+
|
87
|
+
@app.remove(str,'review')
|
88
|
+
refute g.generated?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_generated
|
94
|
+
['controller','setup','javascript'].each do |str|
|
95
|
+
name = 'exams'
|
96
|
+
gen = Ptero::Generator.const_get("#{str.capitalize}Generator".intern).new(name)
|
97
|
+
Mute::IO.capture_stdout do
|
98
|
+
refute gen.generated?
|
99
|
+
refute @app.generated? gen.class, name
|
100
|
+
refute @app.generated? str, name
|
101
|
+
|
102
|
+
gen.generate
|
103
|
+
|
104
|
+
assert gen.generated?
|
105
|
+
assert @app.generated? gen.class, name
|
106
|
+
assert @app.generated? str, name
|
107
|
+
|
108
|
+
gen.remove
|
109
|
+
|
110
|
+
|
111
|
+
refute gen.generated?
|
112
|
+
refute @app.generated? gen.class, name
|
113
|
+
refute @app.generated? str, name
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def teardown
|
119
|
+
@app.destroy
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# test_exceptions.rb
|
2
|
+
# ==================
|
3
|
+
#
|
4
|
+
# Test Ptero Exceptions
|
5
|
+
|
6
|
+
require 'minitest/autorun'
|
7
|
+
require 'ptero'
|
8
|
+
|
9
|
+
class TestExceptions < MiniTest::Test
|
10
|
+
|
11
|
+
def exceptions_should_be_exceptions
|
12
|
+
@exceptions.each do |klass|
|
13
|
+
exception = klass.new('Something bad happened!')
|
14
|
+
|
15
|
+
assert exception.is_a? Exception
|
16
|
+
assert exception.is_a? StandardError
|
17
|
+
assert exception.is_a? klass
|
18
|
+
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def exceptions_should_raise
|
24
|
+
@exceptions.each do |klass|
|
25
|
+
exception = klass.new('Something bad happened!')
|
26
|
+
|
27
|
+
assert_raises klass do
|
28
|
+
raise exception
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup
|
34
|
+
exceptions
|
35
|
+
end
|
36
|
+
|
37
|
+
def exceptions
|
38
|
+
Dir.glob("#{__dir__}/../lib/ptero/exceptions/*exception.rb").each do |location|
|
39
|
+
require location
|
40
|
+
end
|
41
|
+
|
42
|
+
@exceptions = Ptero::Exception.constants.map { |sym| Ptero::Generator.const_get(sym) }
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def teardown
|
47
|
+
super
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'mute'
|
3
|
+
require 'ptero'
|
4
|
+
require 'yaml'
|
5
|
+
require 'erubis'
|
6
|
+
|
7
|
+
|
8
|
+
class TestGenerators < MiniTest::Test
|
9
|
+
|
10
|
+
|
11
|
+
def test_generators_should_generate
|
12
|
+
@generators.each do |gen|
|
13
|
+
type = gen.to_s.split('::').last.downcase
|
14
|
+
params = @fixture['generators'][type]['params']
|
15
|
+
g = gen.new(*params)
|
16
|
+
assert File.exist? g.template_path
|
17
|
+
|
18
|
+
# Test #generate
|
19
|
+
output = Mute::IO.capture_stdout do
|
20
|
+
g.generate
|
21
|
+
assert File.exist? g.location
|
22
|
+
assert g.generated?
|
23
|
+
end
|
24
|
+
assert_equal "GENERATE - #{g.to_s}".green, output.split("\n").first
|
25
|
+
|
26
|
+
|
27
|
+
# Test #reload
|
28
|
+
output = Mute::IO.capture_stdout do
|
29
|
+
g.reload
|
30
|
+
assert File.exist? g.location
|
31
|
+
assert g.generated?
|
32
|
+
end
|
33
|
+
assert_equal "RELOAD - #{g.to_s}".blue, output.split("\n").first
|
34
|
+
|
35
|
+
# Test #remove
|
36
|
+
output = Mute::IO.capture_stdout do
|
37
|
+
g.remove
|
38
|
+
refute File.exist? g.location
|
39
|
+
refute g.generated?
|
40
|
+
end
|
41
|
+
assert_equal "REMOVE - #{g.to_s}".red, output.split("\n").first
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_generators_should_produce_content
|
48
|
+
@generators.each do |gen|
|
49
|
+
type = gen.to_s.split('::').last.downcase
|
50
|
+
params = @fixture['generators'][type]['params']
|
51
|
+
g = gen.new(*params)
|
52
|
+
|
53
|
+
temp_content = File.read(g.template_path)
|
54
|
+
eruby = Erubis::Eruby.new(temp_content)
|
55
|
+
assert_equal g.content, eruby.evaluate(g.content_params)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_generators_should_complain
|
60
|
+
@generators.each do |gen|
|
61
|
+
type = gen.to_s.split('::').last.downcase
|
62
|
+
params = @fixture['generators'][type]['params']
|
63
|
+
g = gen.new(*params)
|
64
|
+
assert_raises(Ptero::Exception::GeneratorException) do
|
65
|
+
g.remove
|
66
|
+
end
|
67
|
+
Mute::IO.capture_stdout do
|
68
|
+
g.generate
|
69
|
+
end
|
70
|
+
assert_raises(Ptero::Exception::GeneratorException) do
|
71
|
+
g.generate
|
72
|
+
end
|
73
|
+
Mute::IO.capture_stdout do
|
74
|
+
g.remove
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def setup
|
80
|
+
app
|
81
|
+
generators
|
82
|
+
fixture
|
83
|
+
end
|
84
|
+
|
85
|
+
def app
|
86
|
+
Dir.chdir __dir__
|
87
|
+
Mute::IO.capture_stdout do
|
88
|
+
@app = Ptero::Application.create('app')
|
89
|
+
end
|
90
|
+
Dir.chdir @app.dir
|
91
|
+
end
|
92
|
+
|
93
|
+
def generators
|
94
|
+
Dir.glob("#{__dir__}/../lib/ptero/generators/*generator.rb").each do |location|
|
95
|
+
require location
|
96
|
+
end
|
97
|
+
|
98
|
+
@generators = Ptero::Generator.constants.map { |sym| Ptero::Generator.const_get(sym) }
|
99
|
+
end
|
100
|
+
|
101
|
+
def fixture
|
102
|
+
@fixture = YAML.load(File.read("#{__dir__}/fixtures/test_generators_fixtures.yaml"))
|
103
|
+
end
|
104
|
+
|
105
|
+
def teardown
|
106
|
+
@app.destroy
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
end
|
data/test/test_root.rb
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
#
|
2
|
+
# test_root.rb
|
3
|
+
# ============
|
4
|
+
#
|
5
|
+
# Test the Root CLI
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'minitest/autorun'
|
9
|
+
require 'ptero'
|
10
|
+
require 'mute'
|
11
|
+
require 'fileutils'
|
12
|
+
|
13
|
+
class TestRoot < MiniTest::Test
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@klass = Ptero::CLI::Root
|
17
|
+
Dir.chdir __dir__
|
18
|
+
if FileTest.directory? 'root'
|
19
|
+
@app = Ptero::Application.new('root')
|
20
|
+
else
|
21
|
+
Mute::IO.capture_stdout do
|
22
|
+
@app = Ptero::Application.create('root')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
Dir.chdir @app.dir
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_new
|
29
|
+
Mute::IO.capture_stdout do
|
30
|
+
@klass.start(['new', 'boat'])
|
31
|
+
end
|
32
|
+
app = Ptero::Application.app_for('boat')
|
33
|
+
assert app.verify
|
34
|
+
assert app.dependencies_installed?
|
35
|
+
app.destroy
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_seed
|
39
|
+
Mute::IO.capture_stdout do
|
40
|
+
@klass.start(['seed', 'boat'])
|
41
|
+
end
|
42
|
+
app = Ptero::Application.app_for('boat')
|
43
|
+
assert app.verify
|
44
|
+
refute app.dependencies_installed?
|
45
|
+
app.destroy
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_route_unroute
|
49
|
+
assert_raises Ptero::Exception::GeneratorException do
|
50
|
+
@klass.start(['route', '/app/path/:number.jpg', 'Photo'])
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
Mute::IO.capture_stdout do
|
55
|
+
@app.generate('routes')
|
56
|
+
@klass.start(['route', '/app/path/:number.jpg', 'Photo'])
|
57
|
+
end
|
58
|
+
|
59
|
+
assert @app.routes['/app/path/:number.jpg'] == 'Photo'
|
60
|
+
|
61
|
+
Mute::IO.capture_stdout do
|
62
|
+
@klass.start(['unroute', '/app/path/:number.jpg'])
|
63
|
+
refute @app.routes.has_key? '/app/path/:number.jpg'
|
64
|
+
@app.remove('routes')
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_verify
|
70
|
+
Mute::IO.capture_stdout do
|
71
|
+
Dir.mkdir('notapp')
|
72
|
+
notapp = Ptero::Application.new('notapp')
|
73
|
+
refute @klass.start(['verify','notapp'])
|
74
|
+
refute notapp.verify
|
75
|
+
Dir.chdir 'notapp' do
|
76
|
+
refute @klass.start(['verify'])
|
77
|
+
end
|
78
|
+
Dir.rmdir('notapp')
|
79
|
+
|
80
|
+
app = Ptero::Application.create('yesapp')
|
81
|
+
assert app.verify
|
82
|
+
assert @klass.start(['verify','yesapp'])
|
83
|
+
Dir.chdir 'yesapp' do
|
84
|
+
assert @klass.start(['verify'])
|
85
|
+
end
|
86
|
+
app.destroy
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_destroy
|
92
|
+
Dir.chdir __dir__ do
|
93
|
+
Mute::IO.capture_stdout do
|
94
|
+
give_stdin do |stdin|
|
95
|
+
app = Ptero::Application.create('appp')
|
96
|
+
assert app.verify
|
97
|
+
stdin.puts 'Yes'
|
98
|
+
@klass.start(['destroy','appp'])
|
99
|
+
refute app.verify
|
100
|
+
refute File.exist? 'appp'
|
101
|
+
|
102
|
+
app = Ptero::Application.create('appp')
|
103
|
+
assert app.verify
|
104
|
+
Dir.chdir 'appp' do
|
105
|
+
stdin.puts 'Yes'
|
106
|
+
@klass.start(['destroy'])
|
107
|
+
end
|
108
|
+
|
109
|
+
refute app.verify
|
110
|
+
refute File.exist? 'appp'
|
111
|
+
|
112
|
+
app = Ptero::Application.create('appp')
|
113
|
+
stdin.puts 'not yes'
|
114
|
+
@klass.start(['destroy','appp'])
|
115
|
+
assert app.verify
|
116
|
+
app.destroy
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_composer
|
124
|
+
refute @app.has_composer?
|
125
|
+
Mute::IO.capture_stdout do
|
126
|
+
@klass.start(['composer'])
|
127
|
+
end
|
128
|
+
assert @app.has_composer?
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_install
|
132
|
+
Mute::IO.capture_stdout do
|
133
|
+
@app.get_composer
|
134
|
+
end
|
135
|
+
refute @app.dependencies_installed?
|
136
|
+
Mute::IO.capture_stdout do
|
137
|
+
@klass.start(['install'])
|
138
|
+
end
|
139
|
+
assert @app.dependencies_installed?
|
140
|
+
@app.remove_composer
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_generate_reload_remove
|
144
|
+
['javascript','view','controller'].each do |str|
|
145
|
+
name = 'puppy'
|
146
|
+
gen = Ptero::Generator.const_get("#{str.capitalize}Generator".intern).new(name)
|
147
|
+
refute gen.generated?
|
148
|
+
Mute::IO.capture_stdout do
|
149
|
+
@klass.start ['generate',str,name]
|
150
|
+
assert gen.generated?
|
151
|
+
@klass.start ['reload',str,name]
|
152
|
+
assert gen.generated?
|
153
|
+
@klass.start ['remove',str,name]
|
154
|
+
refute gen.generated?
|
155
|
+
@klass.start ['reload',str,name]
|
156
|
+
assert gen.generated?
|
157
|
+
gen.remove
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_routes
|
163
|
+
refute @app.generated? 'routes'
|
164
|
+
pairs = {
|
165
|
+
'/phony/1.jpg' => 'Apple',
|
166
|
+
'awesome/:number' => 'Bumblebee',
|
167
|
+
'eriuvd' => 'SarumanTheWhite'
|
168
|
+
}
|
169
|
+
Mute::IO.capture_stdout do
|
170
|
+
@app.generate_routes
|
171
|
+
pairs.each_pair do |key,value|
|
172
|
+
@app.route(key,value)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
lines = Mute::IO.capture_stdout { @klass.start ['routes'] }.chomp.split("\n")
|
177
|
+
|
178
|
+
assert_equal pairs.length, lines.length
|
179
|
+
|
180
|
+
lines.each do |line|
|
181
|
+
assert line.match(/^\s*([\/\w:\.]+)\s*=>\s*(\w+)Controller,?\s*$/)
|
182
|
+
|
183
|
+
assert pairs[$~[1]] == $~[2]
|
184
|
+
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_version
|
189
|
+
# Make sure Ptero::VERSION is the same as the output of $ ptero version
|
190
|
+
output = Mute::IO.capture_stdout { @klass.start ['version'] }.chomp
|
191
|
+
assert_equal Ptero::VERSION, output
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
def teardown
|
196
|
+
@app.destroy
|
197
|
+
Dir.chdir __dir__
|
198
|
+
end
|
199
|
+
|
200
|
+
private
|
201
|
+
|
202
|
+
def give_stdin
|
203
|
+
stdin = $stdin
|
204
|
+
$stdin,write = IO.pipe
|
205
|
+
yield write
|
206
|
+
ensure
|
207
|
+
write.close
|
208
|
+
$stdin = stdin
|
209
|
+
end
|
210
|
+
|
211
|
+
|
212
|
+
end
|