ptero 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +350 -0
  6. data/Rakefile +10 -0
  7. data/bin/ptero +13 -0
  8. data/lib/ptero.rb +14 -0
  9. data/lib/ptero/application.rb +281 -0
  10. data/lib/ptero/cli.rb +35 -0
  11. data/lib/ptero/cli/root.rb +282 -0
  12. data/lib/ptero/composer_default.json +8 -0
  13. data/lib/ptero/exception.rb +26 -0
  14. data/lib/ptero/exceptions/applicationexception.rb +9 -0
  15. data/lib/ptero/exceptions/generatorexception.rb +9 -0
  16. data/lib/ptero/generator.rb +146 -0
  17. data/lib/ptero/generators/applicationjavascriptgenerator.rb +19 -0
  18. data/lib/ptero/generators/applicationstylesheetgenerator.rb +18 -0
  19. data/lib/ptero/generators/configgenerator.rb +34 -0
  20. data/lib/ptero/generators/controllergenerator.rb +23 -0
  21. data/lib/ptero/generators/htaccessgenerator.rb +27 -0
  22. data/lib/ptero/generators/javascriptgenerator.rb +34 -0
  23. data/lib/ptero/generators/landinggenerator.rb +23 -0
  24. data/lib/ptero/generators/layoutgenerator.rb +19 -0
  25. data/lib/ptero/generators/loadallgenerator.rb +26 -0
  26. data/lib/ptero/generators/modelgenerator.rb +22 -0
  27. data/lib/ptero/generators/pagegenerator.rb +56 -0
  28. data/lib/ptero/generators/pagenotfoundgenerator.rb +16 -0
  29. data/lib/ptero/generators/phpclassgenerator.rb +27 -0
  30. data/lib/ptero/generators/phpgenerator.rb +18 -0
  31. data/lib/ptero/generators/phpinfogenerator.rb +16 -0
  32. data/lib/ptero/generators/routesgenerator.rb +68 -0
  33. data/lib/ptero/generators/setupgenerator.rb +13 -0
  34. data/lib/ptero/generators/stylesheetgenerator.rb +33 -0
  35. data/lib/ptero/generators/twiggenerator.rb +24 -0
  36. data/lib/ptero/generators/viewgenerator.rb +24 -0
  37. data/lib/ptero/templates/applicationjavascriptgenerator.js.erb +11 -0
  38. data/lib/ptero/templates/applicationstylesheetgenerator.css.erb +40 -0
  39. data/lib/ptero/templates/configgenerator.php.erb +26 -0
  40. data/lib/ptero/templates/controllergenerator.php.erb +25 -0
  41. data/lib/ptero/templates/generator.txt.erb +1 -0
  42. data/lib/ptero/templates/htaccessgenerator.htaccess.erb +9 -0
  43. data/lib/ptero/templates/javascriptgenerator.js.erb +11 -0
  44. data/lib/ptero/templates/landinggenerator.php.erb +3 -0
  45. data/lib/ptero/templates/layoutgenerator.html.twig.erb +37 -0
  46. data/lib/ptero/templates/loadallgenerator.php.erb +12 -0
  47. data/lib/ptero/templates/modelgenerator.php.erb +21 -0
  48. data/lib/ptero/templates/pagegenerator.html.twig.erb +13 -0
  49. data/lib/ptero/templates/pagenotfoundgenerator.html.twig.erb +13 -0
  50. data/lib/ptero/templates/phpclassgenerator.php.erb +24 -0
  51. data/lib/ptero/templates/phpgenerator.php.erb +3 -0
  52. data/lib/ptero/templates/phpinfogenerator.php.erb +3 -0
  53. data/lib/ptero/templates/routesgenerator.php.erb +13 -0
  54. data/lib/ptero/templates/setupgenerator.php.erb +19 -0
  55. data/lib/ptero/templates/stylesheetgenerator.css.erb +8 -0
  56. data/lib/ptero/templates/twiggenerator.html.twig.erb +5 -0
  57. data/lib/ptero/templates/viewgenerator.html.twig.erb +13 -0
  58. data/lib/ptero/version.rb +4 -0
  59. data/ptero.gemspec +28 -0
  60. data/test/fixtures/test_generators_fixtures.yaml +74 -0
  61. data/test/test_application.rb +123 -0
  62. data/test/test_exceptions.rb +52 -0
  63. data/test/test_generators.rb +110 -0
  64. data/test/test_root.rb +212 -0
  65. metadata +212 -0
@@ -0,0 +1,4 @@
1
+ module Ptero
2
+ # Do you I need to explain this?
3
+ VERSION = "1.0.0"
4
+ end
@@ -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
@@ -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