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
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
|