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