tennpipes-init 3.6.6

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 (167) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.rdoc +163 -0
  4. data/Rakefile +1 -0
  5. data/bin/tennpipes-init +16 -0
  6. data/lib/tennpipes-init.rb +73 -0
  7. data/lib/tennpipes-init/command.rb +18 -0
  8. data/lib/tennpipes-init/generators/actions.rb +630 -0
  9. data/lib/tennpipes-init/generators/app.rb +75 -0
  10. data/lib/tennpipes-init/generators/app/app.rb.tt +72 -0
  11. data/lib/tennpipes-init/generators/app/app.rb.tt~ +72 -0
  12. data/lib/tennpipes-init/generators/cli.rb +57 -0
  13. data/lib/tennpipes-init/generators/component.rb +73 -0
  14. data/lib/tennpipes-init/generators/components/actions.rb +208 -0
  15. data/lib/tennpipes-init/generators/components/mocks/mocha.rb +10 -0
  16. data/lib/tennpipes-init/generators/components/mocks/rr.rb +13 -0
  17. data/lib/tennpipes-init/generators/components/orms/activerecord.rb +201 -0
  18. data/lib/tennpipes-init/generators/components/orms/couchrest.rb +55 -0
  19. data/lib/tennpipes-init/generators/components/orms/datamapper.rb +140 -0
  20. data/lib/tennpipes-init/generators/components/orms/dynamoid.rb +67 -0
  21. data/lib/tennpipes-init/generators/components/orms/minirecord.rb +165 -0
  22. data/lib/tennpipes-init/generators/components/orms/mongoid.rb +113 -0
  23. data/lib/tennpipes-init/generators/components/orms/mongomapper.rb +43 -0
  24. data/lib/tennpipes-init/generators/components/orms/mongomatic.rb +84 -0
  25. data/lib/tennpipes-init/generators/components/orms/ohm.rb +65 -0
  26. data/lib/tennpipes-init/generators/components/orms/ripple.rb +75 -0
  27. data/lib/tennpipes-init/generators/components/orms/sequel.rb +99 -0
  28. data/lib/tennpipes-init/generators/components/renderers/erb.rb +3 -0
  29. data/lib/tennpipes-init/generators/components/renderers/haml.rb +3 -0
  30. data/lib/tennpipes-init/generators/components/renderers/liquid.rb +4 -0
  31. data/lib/tennpipes-init/generators/components/renderers/slim.rb +3 -0
  32. data/lib/tennpipes-init/generators/components/scripts/dojo.rb +10 -0
  33. data/lib/tennpipes-init/generators/components/scripts/extcore.rb +10 -0
  34. data/lib/tennpipes-init/generators/components/scripts/jquery.rb +10 -0
  35. data/lib/tennpipes-init/generators/components/scripts/mootools.rb +10 -0
  36. data/lib/tennpipes-init/generators/components/scripts/prototype.rb +12 -0
  37. data/lib/tennpipes-init/generators/components/scripts/rightjs.rb +10 -0
  38. data/lib/tennpipes-init/generators/components/stylesheets/compass.rb +39 -0
  39. data/lib/tennpipes-init/generators/components/stylesheets/compass/application.scss +43 -0
  40. data/lib/tennpipes-init/generators/components/stylesheets/compass/partials/_base.scss +12 -0
  41. data/lib/tennpipes-init/generators/components/stylesheets/less.rb +25 -0
  42. data/lib/tennpipes-init/generators/components/stylesheets/sass.rb +15 -0
  43. data/lib/tennpipes-init/generators/components/stylesheets/scss.rb +16 -0
  44. data/lib/tennpipes-init/generators/components/tests/bacon.rb +103 -0
  45. data/lib/tennpipes-init/generators/components/tests/cucumber.rb +86 -0
  46. data/lib/tennpipes-init/generators/components/tests/minitest.rb +110 -0
  47. data/lib/tennpipes-init/generators/components/tests/riot.rb +117 -0
  48. data/lib/tennpipes-init/generators/components/tests/rspec.rb +111 -0
  49. data/lib/tennpipes-init/generators/components/tests/shoulda.rb +114 -0
  50. data/lib/tennpipes-init/generators/components/tests/steak.rb +114 -0
  51. data/lib/tennpipes-init/generators/controller.rb +77 -0
  52. data/lib/tennpipes-init/generators/helper.rb +50 -0
  53. data/lib/tennpipes-init/generators/mailer.rb +52 -0
  54. data/lib/tennpipes-init/generators/migration.rb +43 -0
  55. data/lib/tennpipes-init/generators/model.rb +113 -0
  56. data/lib/tennpipes-init/generators/plugin.rb +67 -0
  57. data/lib/tennpipes-init/generators/project.rb +160 -0
  58. data/lib/tennpipes-init/generators/project/config.ru +9 -0
  59. data/lib/tennpipes-init/generators/project/config/apps.rb.tt +35 -0
  60. data/lib/tennpipes-init/generators/project/config/boot.rb +49 -0
  61. data/lib/tennpipes-init/generators/project/public/favicon.ico +0 -0
  62. data/lib/tennpipes-init/generators/project/public/images/booking.com.png +0 -0
  63. data/lib/tennpipes-init/generators/project/public/images/causes.png +0 -0
  64. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bg.jpg +0 -0
  65. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bluelogo.png +0 -0
  66. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bluelogo.svg +68 -0
  67. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_whitelogo.png +0 -0
  68. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_whitelogo.svg +65 -0
  69. data/lib/tennpipes-init/generators/project/public/images/forever21.png +0 -0
  70. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.eot +0 -0
  71. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.svg +970 -0
  72. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.ttf +0 -0
  73. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.woff +0 -0
  74. data/lib/tennpipes-init/generators/project/public/images/icons/tennpipes-icons.css +598 -0
  75. data/lib/tennpipes-init/generators/project/public/images/image1.jpg +0 -0
  76. data/lib/tennpipes-init/generators/project/public/images/image11.jpg +0 -0
  77. data/lib/tennpipes-init/generators/project/public/images/image2.jpg +0 -0
  78. data/lib/tennpipes-init/generators/project/public/images/image3.jpg +0 -0
  79. data/lib/tennpipes-init/generators/project/public/images/intuit.png +0 -0
  80. data/lib/tennpipes-init/generators/project/public/images/krispykreme.png +0 -0
  81. data/lib/tennpipes-init/generators/project/public/images/placeholders/README.md +302 -0
  82. data/lib/tennpipes-init/generators/project/public/images/placeholders/bower.json +4 -0
  83. data/lib/tennpipes-init/generators/project/public/images/placeholders/composer.json +34 -0
  84. data/lib/tennpipes-init/generators/project/public/images/placeholders/gulpfile.js +92 -0
  85. data/lib/tennpipes-init/generators/project/public/images/placeholders/holder.js +1920 -0
  86. data/lib/tennpipes-init/generators/project/public/images/placeholders/holder.min.js +12 -0
  87. data/lib/tennpipes-init/generators/project/public/images/placeholders/package.json +46 -0
  88. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/holder.js +1411 -0
  89. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/augment.js +27 -0
  90. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/ondomready.js +155 -0
  91. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/polyfills.js +177 -0
  92. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/scenegraph.js +101 -0
  93. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/utils.js +129 -0
  94. data/lib/tennpipes-init/generators/project/public/images/priceline.com.png +0 -0
  95. data/lib/tennpipes-init/generators/project/public/images/stripe.png +0 -0
  96. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes.min.js +6081 -0
  97. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.abide.js +340 -0
  98. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.accordion.js +67 -0
  99. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.alert.js +43 -0
  100. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.clearing.js +556 -0
  101. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.dropdown.js +448 -0
  102. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.equalizer.js +77 -0
  103. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.interchange.js +354 -0
  104. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.joyride.js +932 -0
  105. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.js +703 -0
  106. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.magellan.js +203 -0
  107. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.offcanvas.js +152 -0
  108. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.orbit.js +476 -0
  109. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.reveal.js +471 -0
  110. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.slider.js +263 -0
  111. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.tab.js +237 -0
  112. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.tooltip.js +307 -0
  113. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.topbar.js +452 -0
  114. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/fastclick.js +8 -0
  115. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/jquery.cookie.js +8 -0
  116. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/jquery.js +26 -0
  117. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/modernizr.js +8 -0
  118. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/placeholder.js +2 -0
  119. data/lib/tennpipes-init/generators/project/public/stylesheets/app.css~ +178 -0
  120. data/lib/tennpipes-init/generators/project/public/stylesheets/app1.css~ +177 -0
  121. data/lib/tennpipes-init/generators/project/public/stylesheets/ennkeypee.css +214 -0
  122. data/lib/tennpipes-init/generators/project/public/stylesheets/ennkeypee.css~ +214 -0
  123. data/lib/tennpipes-init/generators/project/public/stylesheets/normalize.css +427 -0
  124. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.css +6201 -0
  125. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.css~ +6201 -0
  126. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.min.css +1 -0
  127. data/lib/tennpipes-init/generators/runner.rb +139 -0
  128. data/lib/tennpipes-init/generators/task.rb +45 -0
  129. data/lib/tennpipes-init/generators/templates/Gemfile.tt +32 -0
  130. data/lib/tennpipes-init/generators/templates/Rakefile.tt +8 -0
  131. data/lib/tennpipes-init/generators/templates/controller.rb.tt +22 -0
  132. data/lib/tennpipes-init/generators/templates/gem/README.md.tt +29 -0
  133. data/lib/tennpipes-init/generators/templates/gem/gemspec.tt +19 -0
  134. data/lib/tennpipes-init/generators/templates/gem/lib/libname.tt +6 -0
  135. data/lib/tennpipes-init/generators/templates/gem/lib/libname/version.tt +3 -0
  136. data/lib/tennpipes-init/generators/templates/helper.rb.tt +13 -0
  137. data/lib/tennpipes-init/generators/templates/initializer.rb.tt +5 -0
  138. data/lib/tennpipes-init/generators/templates/mailer.rb.tt +54 -0
  139. data/lib/tennpipes-init/generators/templates/project_bin.tt +14 -0
  140. data/lib/tennpipes-init/generators/templates/task.rb.tt +7 -0
  141. data/lib/tennpipes-init/tennpipes-tasks/activerecord.rb +377 -0
  142. data/lib/tennpipes-init/tennpipes-tasks/database.rb +12 -0
  143. data/lib/tennpipes-init/tennpipes-tasks/datamapper.rb +94 -0
  144. data/lib/tennpipes-init/tennpipes-tasks/minirecord.rb +19 -0
  145. data/lib/tennpipes-init/tennpipes-tasks/mongoid.rb +215 -0
  146. data/lib/tennpipes-init/tennpipes-tasks/mongomapper.rb +55 -0
  147. data/lib/tennpipes-init/tennpipes-tasks/sequel.rb +85 -0
  148. data/lib/tennpipes-init/tennpipes-tasks/sql-helpers.rb +72 -0
  149. data/test/fixtures/admin_template.rb +7 -0
  150. data/test/fixtures/example_template.rb +15 -0
  151. data/test/fixtures/git_template.rb +4 -0
  152. data/test/fixtures/plugin_template.rb +13 -0
  153. data/test/fixtures/rake_template.rb +9 -0
  154. data/test/helper.rb +103 -0
  155. data/test/test_app_generator.rb +142 -0
  156. data/test/test_cli.rb +27 -0
  157. data/test/test_component_generator.rb +98 -0
  158. data/test/test_controller_generator.rb +272 -0
  159. data/test/test_generator.rb +13 -0
  160. data/test/test_helper_generator.rb +133 -0
  161. data/test/test_mailer_generator.rb +69 -0
  162. data/test/test_migration_generator.rb +222 -0
  163. data/test/test_model_generator.rb +553 -0
  164. data/test/test_plugin_generator.rb +152 -0
  165. data/test/test_project_generator.rb +757 -0
  166. data/test/test_task_generator.rb +53 -0
  167. metadata +285 -0
@@ -0,0 +1,75 @@
1
+ module Tennpipes
2
+ module Generators
3
+
4
+ ##
5
+ # Responsible for applications within a Tennpipes project. Creates and mounts
6
+ # the application and gives the user related information.
7
+ #
8
+ class App < Thor::Group
9
+
10
+ Tennpipes::Generators.add_generator(:app, self)
11
+
12
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
13
+ def self.banner; "tennpipes-init app [name]"; end
14
+
15
+ include Thor::Actions
16
+ include Tennpipes::Generators::Actions
17
+
18
+ desc "Description:\n\n\ttennpipes-init app generates a new Tennpipes application"
19
+ argument :name, :desc => 'The name of your tennpipes application'
20
+ class_option :root, :desc => 'The root destination', :aliases => '-r', :default => '.', :type => :string
21
+ class_option :destroy, :aliases => '-d', :default => false, :type => :boolean
22
+ class_option :tiny, :desc => 'Generate tiny app skeleton', :aliases => '-i', :default => false, :type => :boolean
23
+ class_option :namespace, :desc => 'The name space of your tennpipes project', :aliases => '-n', :default => '', :type => :string
24
+ class_option :force, :desc => 'Generate app files if app already exists', :aliases => '-f', :default => false, :type => :boolean
25
+
26
+ # Show help if no ARGV given
27
+ require_arguments!
28
+
29
+ ##
30
+ # Copies over the Tennpipes base admin application.
31
+ #
32
+ def create_app
33
+ self.destination_root = options[:root]
34
+ underscore_name = name.gsub(/\W/, '_')
35
+ @app_folder = underscore_name.underscore
36
+ @app_name = underscore_name.camelize
37
+ if in_app_root?
38
+ @project_name = options[:namespace].underscore.camelize
39
+ @project_name = fetch_project_name(@app_folder) if @project_name.empty?
40
+
41
+ if options[:destroy]
42
+ self.behavior = :revoke
43
+ else
44
+ unless options[:force]
45
+ say "#{@app_name} already exists."
46
+ say "Please, change the name."
47
+ return
48
+ end
49
+ end if already_exists?(@app_name, @project_name)
50
+
51
+ lowercase_app_folder = @app_folder.downcase
52
+ app_skeleton(lowercase_app_folder, options[:tiny])
53
+ empty_directory destination_root("public/#{lowercase_app_folder}")
54
+
55
+ mount_command = "\nTennpipes.mount('#{@project_name}::#{@app_name}', :app_file => Tennpipes.root('#{lowercase_app_folder}/app.rb')).to('/#{lowercase_app_folder}')\n"
56
+ if File.read(destination_root('config/apps.rb')).match(/^Tennpipes.mount.*\.to\('\/'\)$/)
57
+ inject_into_file destination_root('config/apps.rb'), mount_command, :before => /^Tennpipes.mount.*\.to\('\/'\)$/
58
+ else
59
+ append_file destination_root('config/apps.rb'), mount_command
60
+ end
61
+
62
+ return if self.behavior == :revoke
63
+ say
64
+ say '=' * 65, :green
65
+ say "Your #{@app_name} application has been installed."
66
+ say '=' * 65, :green
67
+ say "This application has been mounted to /#{@app_name.downcase}"
68
+ say "You can configure a different path by editing 'config/apps.rb'"
69
+ else
70
+ say 'You are not at the root of a Tennpipes application! (config/boot.rb not found)'
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,72 @@
1
+ module <%= @project_name %>
2
+ class <%= @app_name %> < Tennpipes::Application
3
+ register Tennpipes::Mailer
4
+ register Tennpipes::Helpers
5
+
6
+ enable :sessions
7
+
8
+ class <%= @project_name %>::<%= @app_name %>
9
+ get '/' do
10
+ erb :home
11
+ end
12
+ end
13
+
14
+
15
+ ##
16
+ # Caching support.
17
+ #
18
+ # register Tennpipes::Cache
19
+ # enable :caching
20
+ #
21
+ # You can customize caching store engines:
22
+ #
23
+ # set :cache, Tennpipes::Cache.new(:LRUHash) # Keeps cached values in memory
24
+ # set :cache, Tennpipes::Cache.new(:Memcached) # Uses default server at localhost
25
+ # set :cache, Tennpipes::Cache.new(:Memcached, '127.0.0.1:11211', :exception_retry_limit => 1)
26
+ # set :cache, Tennpipes::Cache.new(:Memcached, :backend => memcached_or_dalli_instance)
27
+ # set :cache, Tennpipes::Cache.new(:Redis) # Uses default server at localhost
28
+ # set :cache, Tennpipes::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0)
29
+ # set :cache, Tennpipes::Cache.new(:Redis, :backend => redis_instance)
30
+ # set :cache, Tennpipes::Cache.new(:Mongo) # Uses default server at localhost
31
+ # set :cache, Tennpipes::Cache.new(:Mongo, :backend => mongo_client_instance)
32
+ # set :cache, Tennpipes::Cache.new(:File, :dir => Tennpipes.root('tmp', app_name.to_s, 'cache')) # default choice
33
+ #
34
+
35
+ ##
36
+ # Application configuration options.
37
+ #
38
+ # set :raise_errors, true # Raise exceptions (will stop application) (default for test)
39
+ # set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development)
40
+ # set :show_exceptions, true # Shows a stack trace in browser (default for development)
41
+ # set :logging, true # Logging in STDOUT for development and file for production (default only for development)
42
+ # set :public_folder, 'foo/bar' # Location for static assets (default root/public)
43
+ # set :reload, false # Reload application files (default in development)
44
+ # set :default_builder, 'foo' # Set a custom form builder (default 'StandardFormBuilder')
45
+ # set :locale_path, 'bar' # Set path for I18n translations (default your_apps_root_path/locale)
46
+ # disable :sessions # Disabled sessions by default (enable if needed)
47
+ # disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined)
48
+ # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
49
+ #
50
+
51
+ ##
52
+ # You can configure for a specified environment like:
53
+ #
54
+ # configure :development do
55
+ # set :foo, :bar
56
+ # disable :asset_stamp # no asset timestamping for dev
57
+ # end
58
+ #
59
+
60
+ ##
61
+ # You can manage errors like:
62
+ #
63
+ # error 404 do
64
+ # render 'errors/404'
65
+ # end
66
+ #
67
+ # error 500 do
68
+ # render 'errors/500'
69
+ # end
70
+ #
71
+ end
72
+ end
@@ -0,0 +1,72 @@
1
+ module <%= @project_name %>
2
+ class <%= @app_name %> < Tennpipes::Application
3
+ register Tennpipes::Mailer
4
+ register Tennpipes::Helpers
5
+
6
+ enable :sessions
7
+
8
+ class <%= @project_name %>::<%= @app_name %>
9
+ get '/' do
10
+ erb :<%= @app_name.downcase %>
11
+ end
12
+ end
13
+
14
+
15
+ ##
16
+ # Caching support.
17
+ #
18
+ # register Tennpipes::Cache
19
+ # enable :caching
20
+ #
21
+ # You can customize caching store engines:
22
+ #
23
+ # set :cache, Tennpipes::Cache.new(:LRUHash) # Keeps cached values in memory
24
+ # set :cache, Tennpipes::Cache.new(:Memcached) # Uses default server at localhost
25
+ # set :cache, Tennpipes::Cache.new(:Memcached, '127.0.0.1:11211', :exception_retry_limit => 1)
26
+ # set :cache, Tennpipes::Cache.new(:Memcached, :backend => memcached_or_dalli_instance)
27
+ # set :cache, Tennpipes::Cache.new(:Redis) # Uses default server at localhost
28
+ # set :cache, Tennpipes::Cache.new(:Redis, :host => '127.0.0.1', :port => 6379, :db => 0)
29
+ # set :cache, Tennpipes::Cache.new(:Redis, :backend => redis_instance)
30
+ # set :cache, Tennpipes::Cache.new(:Mongo) # Uses default server at localhost
31
+ # set :cache, Tennpipes::Cache.new(:Mongo, :backend => mongo_client_instance)
32
+ # set :cache, Tennpipes::Cache.new(:File, :dir => Tennpipes.root('tmp', app_name.to_s, 'cache')) # default choice
33
+ #
34
+
35
+ ##
36
+ # Application configuration options.
37
+ #
38
+ # set :raise_errors, true # Raise exceptions (will stop application) (default for test)
39
+ # set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development)
40
+ # set :show_exceptions, true # Shows a stack trace in browser (default for development)
41
+ # set :logging, true # Logging in STDOUT for development and file for production (default only for development)
42
+ # set :public_folder, 'foo/bar' # Location for static assets (default root/public)
43
+ # set :reload, false # Reload application files (default in development)
44
+ # set :default_builder, 'foo' # Set a custom form builder (default 'StandardFormBuilder')
45
+ # set :locale_path, 'bar' # Set path for I18n translations (default your_apps_root_path/locale)
46
+ # disable :sessions # Disabled sessions by default (enable if needed)
47
+ # disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined)
48
+ # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
49
+ #
50
+
51
+ ##
52
+ # You can configure for a specified environment like:
53
+ #
54
+ # configure :development do
55
+ # set :foo, :bar
56
+ # disable :asset_stamp # no asset timestamping for dev
57
+ # end
58
+ #
59
+
60
+ ##
61
+ # You can manage errors like:
62
+ #
63
+ # error 404 do
64
+ # render 'errors/404'
65
+ # end
66
+ #
67
+ # error 500 do
68
+ # render 'errors/500'
69
+ # end
70
+ #
71
+ end
72
+ end
@@ -0,0 +1,57 @@
1
+ require 'thor/group'
2
+
3
+ module Tennpipes
4
+ module Generators
5
+ ##
6
+ # This class bootstrap +config/boot+ and perform
7
+ # +Tennpipes::Generators.load_components!+ for handle 3rd party generators.
8
+ #
9
+ class Cli < Thor::Group
10
+
11
+ include Thor::Actions
12
+
13
+ class_option :root, :desc => "The root destination", :aliases => '-r', :default => ".", :type => :string
14
+ class_option :help, :type => :boolean, :desc => "Show help usage"
15
+
16
+ ##
17
+ # We need to try to load boot because some of our app dependencies maybe have
18
+ # custom generators, so is necessary know who are.
19
+ #
20
+ def load_boot
21
+ begin
22
+ ENV['TENNPIPES_LOG_LEVEL'] ||= 'test'
23
+ ENV['BUNDLE_GEMFILE'] = File.join(options[:root], 'Gemfile') if options[:root]
24
+ boot = options[:root] ? File.join(options[:root], 'config/boot.rb') : 'config/boot.rb'
25
+ if File.exist?(boot)
26
+ require File.expand_path(boot)
27
+ else
28
+ require 'tennpipes-assist'
29
+ end
30
+ rescue StandardError => e
31
+ puts "=> Problem loading #{boot}"
32
+ puts ["=> #{e.message}", *e.backtrace].join("\n ")
33
+ ensure
34
+ ENV.delete('BUNDLE_GEMFILE')
35
+ ENV.delete('TENNPIPES_LOG_LEVEL')
36
+ end
37
+ end
38
+
39
+ ##
40
+ # Loads the components available for all generators.
41
+ #
42
+ def setup
43
+ Tennpipes::Generators.load_components!
44
+
45
+ generator_kind = ARGV.delete_at(0).to_s.downcase.to_sym if ARGV[0].present?
46
+ generator_class = Tennpipes::Generators.mappings[generator_kind]
47
+
48
+ if generator_class
49
+ args = ARGV.empty? && generator_class.require_arguments? ? ['-h'] : ARGV
50
+ generator_class.start(args)
51
+ else
52
+ puts "Please specify generator to use (#{Tennpipes::Generators.mappings.keys.join(", ")})"
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,73 @@
1
+ module Tennpipes
2
+ module Generators
3
+
4
+ ##
5
+ # Responsible for add components within a Tennpipes project.
6
+ #
7
+ class Component < Thor::Group
8
+
9
+ Tennpipes::Generators.add_generator(:component, self)
10
+
11
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
12
+ def self.banner; "tennpipes-init component [options]"; end
13
+
14
+ include Thor::Actions
15
+ include Tennpipes::Generators::Actions
16
+ include Tennpipes::Generators::Components::Actions
17
+
18
+ desc "Description:\n\n\ttennpipes-init component add components into a Tennpipes project"
19
+
20
+ class_option :app, :desc => 'The application name', :aliases => '-n', :default => nil, :type => :string
21
+ class_option :root, :desc => 'The root destination', :aliases => '-r', :default => '.', :type => :string
22
+ class_option :adapter, :desc => 'SQL adapter for ORM (sqlite, mysql, mysql2, mysql-gem, postgres)', :aliases => '-a', :default => 'sqlite', :type => :string
23
+
24
+ defines_component_options :default => false
25
+
26
+ ##
27
+ # For each component, retrieve a valid choice and then execute the associated generator.
28
+ #
29
+ def setup_components
30
+ self.destination_root = options[:root]
31
+ if in_app_root?
32
+ @_components = options.dup.slice(*self.class.component_types)
33
+ @app_name = (options[:app] || "App").gsub(/\W/, '_').camelize
34
+ if @_components.values.delete_if(&:blank?).empty?
35
+ self.class.start(["-h"])
36
+ say
37
+ say "Current Selected Components:"
38
+ list = []
39
+ self.class.component_types.each do |comp|
40
+ list << [comp, fetch_component_choice(comp)]
41
+ end
42
+ print_table(list, :indent => 2)
43
+ exit
44
+ end
45
+
46
+ self.class.component_types.each do |comp|
47
+ next if @_components[comp].blank?
48
+
49
+ choice = @_components[comp] = resolve_valid_choice(comp)
50
+ existing = fetch_component_choice(comp)
51
+ if existing != 'none' && existing != choice
52
+ next unless yes?("Switch #{comp} to '#{choice}' from '#{existing}' ?[yes/no]:")
53
+ end
54
+ @project_name = fetch_component_choice(:namespace)
55
+ if comp.to_s == 'test' && !already_exists?(@app_name, @project_name)
56
+ say "#{@project_name}::#{@app_name} does not exist."
57
+ say "Please, change app name."
58
+ next
59
+ end
60
+ execute_component_setup(comp, choice)
61
+ store_component_choice(comp, choice)
62
+ if comp.to_s == 'orm' && choice.to_s != 'none'
63
+ inject_into_file destination_root('Rakefile'), "TennpipesTasks.use(:database)\n", :before => "TennpipesTasks.init"
64
+ inject_into_file destination_root('Rakefile'), "TennpipesTasks.use(#{choice.to_sym.inspect})\n", :before => "TennpipesTasks.init"
65
+ end
66
+ end
67
+ else
68
+ say 'You are not at the root of a Tennpipes application! (config/boot.rb not found)'
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,208 @@
1
+ module Tennpipes
2
+ module Generators
3
+ module Components
4
+ module Actions
5
+ ##
6
+ # Generates the model migration file created when generating a new model.
7
+ #
8
+ # @param [String] filename
9
+ # File name of model migration.
10
+ # @param [String] name
11
+ # Name of model.
12
+ # @param [Array<String>] columns
13
+ # Array of column names and property type.
14
+ # @param [Hash] options
15
+ # Additional migration options, e.g
16
+ # { :base => "....text...", :up => "..text...",
17
+ # :down => "..text...", column_format => "t.column :#{field}, :#{kind}" }
18
+ # @example
19
+ # output_model_migration("AddPerson", "person", ["name:string", "age:integer"],
20
+ # :base => AR_MIGRATION,
21
+ # :column_format => Proc.new { |field, kind| "t.#{kind.underscore.gsub(/_/, '')} :#{field}" },
22
+ # :up => AR_MODEL_UP_MG, :down => AR_MODEL_DOWN_MG)
23
+ #
24
+ def output_model_migration(filename, name, columns, options={})
25
+ if behavior == :revoke
26
+ remove_migration(filename)
27
+ else
28
+ return if migration_exist?(filename)
29
+ model_name = name.to_s.pluralize
30
+ field_tuples = columns.map { |value| value.split(":") }
31
+ field_tuples.map! { |field, kind| kind =~ /datetime/i ? [field, 'DateTime'] : [field, kind] }
32
+ column_declarations = field_tuples.map(&options[:column_format]).join("\n ")
33
+ contents = options[:base].dup.gsub(/\s{4}!UP!\n/m, options[:up]).gsub(/!DOWN!\n/m, options[:down])
34
+ contents = contents.gsub(/!NAME!/, model_name.underscore.camelize).gsub(/!TABLE!/, model_name.underscore)
35
+ contents = contents.gsub(/!FILENAME!/, filename.underscore).gsub(/!FILECLASS!/, filename.underscore.camelize)
36
+ migration_number = current_migration_number
37
+ contents = contents.gsub(/!FIELDS!/, column_declarations).gsub(/!VERSION!/, migration_number)
38
+ migration_filename = "#{format("%03d", migration_number)}_#{filename.underscore}.rb"
39
+ create_file(destination_root('db/migrate/', migration_filename), contents, :skip => true)
40
+ end
41
+ end
42
+
43
+ ##
44
+ # Generates a standalone migration file based on the given options and columns.
45
+ #
46
+ # @param [String] filename
47
+ # File name of model migration.
48
+ # @param [String] name
49
+ # Name of model.
50
+ # @param [Array<String>] columns
51
+ # Array of column names and property type.
52
+ # @param [Hash] options
53
+ # Additional migration options, e.g
54
+ # { :base "...text...", :change_format => "...text...",
55
+ # :add => proc { |field, kind| "add_column :#{table_name}, :#{field}, :#{kind}" },
56
+ # :remove => proc { |field, kind| "remove_column :#{table_name}, :#{field}" }
57
+ # @example
58
+ # output_migration_file(migration_name, name, columns,
59
+ # :base => AR_MIGRATION, :change_format => AR_CHANGE_MG,
60
+ # :add => Proc.new { |field, kind| "t.#{kind.underscore.gsub(/_/, '')} :#{field}" },
61
+ # :remove => Proc.new { |field, kind| "t.remove :#{field}" }
62
+ # )
63
+ #
64
+ def output_migration_file(filename, name, columns, options={})
65
+ if behavior == :revoke
66
+ remove_migration(name)
67
+ else
68
+ return if migration_exist?(filename)
69
+ change_format = options[:change_format]
70
+ migration_scan = filename.underscore.camelize.scan(/(Add|Remove).*?(?:(?:To|From).+?)*(?:To|From)((?:To|From)?.*?)$/).flatten
71
+ direction, table_name = migration_scan[0].downcase, migration_scan[1].downcase.pluralize if migration_scan.any?
72
+ tuples = direction ? columns.map { |value| value.split(":") } : []
73
+ tuples.map! { |field, kind| kind =~ /datetime/i ? [field, 'DateTime'] : [field, kind] }
74
+ add_columns = tuples.map(&options[:add]).join("\n ")
75
+ remove_columns = tuples.map(&options[:remove]).join("\n ")
76
+ forward_text = change_format.gsub(/!TABLE!/, table_name).gsub(/!COLUMNS!/, add_columns) if tuples.any?
77
+ back_text = change_format.gsub(/!TABLE!/, table_name).gsub(/!COLUMNS!/, remove_columns) if tuples.any?
78
+ contents = options[:base].dup.gsub(/\s{4}!UP!\n/m, (direction == 'add' ? forward_text.to_s : back_text.to_s))
79
+ contents.gsub!(/\s{4}!DOWN!\n/m, (direction == 'add' ? back_text.to_s : forward_text.to_s))
80
+ contents = contents.gsub(/!FILENAME!/, filename.underscore).gsub(/!FILECLASS!/, filename.underscore.camelize)
81
+ migration_number = current_migration_number
82
+ contents.gsub!(/!VERSION!/, migration_number)
83
+ migration_filename = "#{format("%03d", migration_number)}_#{filename.underscore}.rb"
84
+ create_file(destination_root('db/migrate/', migration_filename), contents, :skip => true)
85
+ end
86
+ end
87
+
88
+ ##
89
+ # Returns the number of the latest(most current) migration file.
90
+ #
91
+ def return_last_migration_number
92
+ Dir[destination_root('db/migrate/*.rb')].map { |f|
93
+ File.basename(f).match(/^(\d+)/)[0].to_i
94
+ }.max.to_i || 0
95
+ end
96
+
97
+ ##
98
+ # Returns timestamp instead if :migration_format: in .components is "timestamp"
99
+ #
100
+ def current_migration_number
101
+ if fetch_component_choice(:migration_format).to_s == 'timestamp'
102
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
103
+ else
104
+ return_last_migration_number + 1
105
+ end.to_s
106
+ end
107
+
108
+ ##
109
+ # Return true if the migration already exist.
110
+ #
111
+ # @param [String] filename
112
+ # File name of the migration file.
113
+ #
114
+ def migration_exist?(filename)
115
+ Dir[destination_root("db/migrate/*_#{filename.underscore}.rb")].size > 0
116
+ end
117
+
118
+ ##
119
+ # Removes the migration file based on the migration name.
120
+ #
121
+ # @param [String] name
122
+ # File name of the migration.
123
+ #
124
+ def remove_migration(name)
125
+ migration_path = Dir[destination_root('db/migrate/*.rb')].find do |f|
126
+ File.basename(f) =~ /#{name.to_s.underscore}/
127
+ end
128
+ return unless migration_path
129
+ if behavior == :revoke
130
+ create_file migration_path # we use create to reverse the operation of a revoke
131
+ end
132
+ end
133
+
134
+ ##
135
+ # Injects the test class text into the test_config file for setting up the test gen.
136
+ #
137
+ # @param [String] suite_text
138
+ # Class name for test suite.
139
+ # @param [Hash] options
140
+ # Additional options to pass into injection.
141
+ #
142
+ # @example
143
+ # insert_test_suite_setup('...CLASS_NAME...')
144
+ # => inject_into_file("test/test_config.rb", TEST.gsub(/CLASS_NAME/, @app_name), :after => "set :environment, :test")
145
+ #
146
+ def insert_test_suite_setup(suite_text, options={})
147
+ options.reverse_merge!(:path => "test/test_config.rb")
148
+ create_file(options[:path], suite_text.gsub(/CLASS_NAME/, "#{@project_name}::#{@app_name}"))
149
+ end
150
+
151
+ ##
152
+ # Injects the mock library include into the test class in test_config
153
+ # for setting up mock gen
154
+ #
155
+ # @param [String] library_name
156
+ # Name of mocking library.
157
+ # @param [Hash] options
158
+ #
159
+ # @example
160
+ # insert_mocking_include('Mocha::API'):
161
+ # => inject_into_file("test/test_config.rb", " include Mocha::API\n", :after => /class.*?\n/)
162
+ #
163
+ def insert_mocking_include(library_name, options={})
164
+ options.reverse_merge!(:indent => 2, :after => /class.*?\n/, :path => "test/test_config.rb")
165
+ return unless File.exist?(destination_root(options[:path]))
166
+ include_text = indent_spaces(2) + "include #{library_name}\n"
167
+ inject_into_file(options[:path], include_text, :after => options[:after])
168
+ end
169
+
170
+ ##
171
+ # Returns space characters of given count.
172
+ #
173
+ # @example
174
+ # indent_spaces(2)
175
+ #
176
+ def indent_spaces(count)
177
+ ' ' * count
178
+ end
179
+
180
+ ##
181
+ # Takes in fields for routes in the form of get:index post:test delete:yada.
182
+ #
183
+ # @param [Array<String>] fields
184
+ # Array of controller actions and route name.
185
+ #
186
+ # @example
187
+ # controller_actions("get:index", "post:test")
188
+ #
189
+ def controller_actions(fields)
190
+ field_tuples = fields.map { |value| value.split(":") }
191
+ action_declarations = field_tuples.map do |request, name|
192
+ "#{request} :#{name} do\n\nend\n"
193
+ end
194
+ action_declarations.join("\n").gsub(/^/, " " * 2).gsub(/^\s*$/, "")
195
+ end
196
+
197
+ def create_helper_files(app, name)
198
+ @helper_name = "#{name.to_s.underscore.camelize}Helper"
199
+ template 'templates/helper.rb.tt', destination_root(app, 'helpers', "#{name.to_s.underscore}_helper.rb")
200
+ if test?
201
+ include_component_module_for(:test)
202
+ generate_helper_test(@helper_name, @project_name, @app_name)
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end