app_drone 0.8.6 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +54 -39
  3. data/lib/app_drone/dependency_chain.rb +8 -1
  4. data/lib/app_drone/drone.rb +9 -0
  5. data/lib/app_drone/drones/carrierwave/carrierwave.rb +20 -0
  6. data/lib/app_drone/drones/chronic/chronic.rb +13 -0
  7. data/lib/app_drone/drones/{easy_roles_45/easy_roles_45.rb~ → easy_rolez/easy_rolez.rb} +1 -1
  8. data/lib/app_drone/drones/factory_girl/factory_girl.rb +13 -0
  9. data/lib/app_drone/drones/has_scope/has_scope.rb +13 -0
  10. data/lib/app_drone/drones/nested_form/nested_form.rb +14 -0
  11. data/lib/app_drone/drones/new_relic/new_relic.rb +13 -0
  12. data/lib/app_drone/drones/nifty_generatorz/nifty_config.erb +1 -0
  13. data/lib/app_drone/drones/nifty_generatorz/nifty_generatorz.rb +19 -0
  14. data/lib/app_drone/drones/remotipart/remotipart.rb +14 -0
  15. data/lib/app_drone/drones/responderz/install.erb +1 -0
  16. data/lib/app_drone/drones/responderz/responderz.rb +17 -0
  17. data/lib/app_drone/drones/rspec/install.erb +1 -0
  18. data/lib/app_drone/drones/rspec/rspec.rb +17 -0
  19. data/lib/app_drone/drones/simple_cov/install.erb +5 -0
  20. data/lib/app_drone/drones/simple_cov/rspec_integration.erb +1 -0
  21. data/lib/app_drone/drones/simple_cov/simple_cov.rb +20 -0
  22. data/lib/app_drone/drones/timecop/timecop.rb +13 -0
  23. data/lib/app_drone/drones/will_paginate/will_paginate.rb +15 -0
  24. data/lib/app_drone/template.erb +14 -0
  25. data/lib/app_drone/template.rb +13 -4
  26. data/lib/app_drone/version.rb +1 -1
  27. data/out.rb +28 -3
  28. data/scraps/App admin +7 -0
  29. data/scraps/TODO +32 -0
  30. data/scraps/blank drone +15 -0
  31. data/test/test_app_drone.rb +8 -1
  32. metadata +26 -79
  33. data/Gemfile~ +0 -4
  34. data/README.md~ +0 -342
  35. data/Rakefile~ +0 -11
  36. data/TODO~ +0 -1
  37. data/app_drone.gemspec~ +0 -20
  38. data/lib/app_drone/dependency.rb~ +0 -5
  39. data/lib/app_drone/dependency_chain.rb~ +0 -55
  40. data/lib/app_drone/drone.rb~ +0 -121
  41. data/lib/app_drone/drones/bootstrap/bootstrap.rb~ +0 -46
  42. data/lib/app_drone/drones/bootstrap/flair.html.slim.erb~ +0 -7
  43. data/lib/app_drone/drones/bundle/bundle.rb~ +0 -22
  44. data/lib/app_drone/drones/bundle/gem.rb~ +0 -23
  45. data/lib/app_drone/drones/bundle/gem_entries.erb~ +0 -6
  46. data/lib/app_drone/drones/bundle/gems.rb~ +0 -23
  47. data/lib/app_drone/drones/cancan/ability.erb~ +0 -1
  48. data/lib/app_drone/drones/cancan/cancan.rb~ +0 -19
  49. data/lib/app_drone/drones/chosen/chosen.rb~ +0 -16
  50. data/lib/app_drone/drones/chosen/showcase.html.slim~ +0 -0
  51. data/lib/app_drone/drones/cleanup/cleanup.rb~ +0 -9
  52. data/lib/app_drone/drones/easy_roles_45/easy_roles.rb~ +0 -13
  53. data/lib/app_drone/drones/easy_roles_45/easy_roles_45.rb +0 -13
  54. data/lib/app_drone/drones/easy_roles_45/easy_rolez.rb~ +0 -13
  55. data/lib/app_drone/drones/ember/ember.rb~ +0 -21
  56. data/lib/app_drone/drones/ember/ember_js.rb~ +0 -21
  57. data/lib/app_drone/drones/ember/install.erb~ +0 -3
  58. data/lib/app_drone/drones/flair/flair.rb~ +0 -39
  59. data/lib/app_drone/drones/flair/flair_page.erb~ +0 -8
  60. data/lib/app_drone/drones/flair/showcase.rb~ +0 -27
  61. data/lib/app_drone/drones/flair/showcase_page.erb~ +0 -11
  62. data/lib/app_drone/drones/gritter/flair.html.slim.erb~ +0 -8
  63. data/lib/app_drone/drones/gritter/gritter.rb~ +0 -21
  64. data/lib/app_drone/drones/gritter/install.erb~ +0 -1
  65. data/lib/app_drone/drones/high_voltage/create_pages_directory.erb~ +0 -1
  66. data/lib/app_drone/drones/high_voltage/high_voltage.rb~ +0 -15
  67. data/lib/app_drone/drones/javascript/application_coffee.erb~ +0 -15
  68. data/lib/app_drone/drones/javascript/javascript.rb~ +0 -26
  69. data/lib/app_drone/drones/javascript/javascripts.rb~ +0 -23
  70. data/lib/app_drone/drones/letter_opener/development_delivery_method.erb~ +0 -1
  71. data/lib/app_drone/drones/letter_opener/development_delivery_method.rb~ +0 -1
  72. data/lib/app_drone/drones/letter_opener/letter_opener.rb~ +0 -17
  73. data/lib/app_drone/drones/migrant/migrant.rb~ +0 -13
  74. data/lib/app_drone/drones/ranked_model/ranked_model.rb~ +0 -13
  75. data/lib/app_drone/drones/simple_form/install.erb~ +0 -1
  76. data/lib/app_drone/drones/simple_form/simple_form.rb~ +0 -21
  77. data/lib/app_drone/drones/slim_view/application_slim.erb~ +0 -15
  78. data/lib/app_drone/drones/slim_view/slim_view.rb~ +0 -16
  79. data/lib/app_drone/drones/slim_view/slim_views.rb~ +0 -14
  80. data/lib/app_drone/drones/sorcery/configure.erb~ +0 -1
  81. data/lib/app_drone/drones/sorcery/sorcery.rb~ +0 -18
  82. data/lib/app_drone/drones/squeel/initializer.erb~ +0 -1
  83. data/lib/app_drone/drones/squeel/squeel.rb~ +0 -19
  84. data/lib/app_drone/drones/stylesheet/application_sass.erb~ +0 -11
  85. data/lib/app_drone/drones/stylesheet/stylesheet.rb~ +0 -26
  86. data/lib/app_drone/drones/stylesheet/stylesheets.rb~ +0 -30
  87. data/lib/app_drone/drones/underscore/flair.html.slim.erb~ +0 -25
  88. data/lib/app_drone/drones/underscore/underscore.rb~ +0 -18
  89. data/lib/app_drone/drones/zzz/factory_girl/factory_girl.rb +0 -13
  90. data/lib/app_drone/drones/zzz/factory_girl/factory_girl.rb~ +0 -13
  91. data/lib/app_drone/drones/zzz/git/git.rb~ +0 -8
  92. data/lib/app_drone/drones/zzz/guard/guard.rb~ +0 -15
  93. data/lib/app_drone/drones/zzz/ranked_model/ranked_model.rb +0 -9
  94. data/lib/app_drone/drones/zzz/ranked_model/ranked_model.rb~ +0 -9
  95. data/lib/app_drone/drones/zzz/rspec/rspec.rb~ +0 -13
  96. data/lib/app_drone/integration.rb~ +0 -48
  97. data/lib/app_drone/object_extensions.rb~ +0 -17
  98. data/lib/app_drone/template.erb~ +0 -33
  99. data/lib/app_drone/template.rb~ +0 -54
  100. data/lib/app_drone/version.rb~ +0 -3
  101. data/lib/app_drone.rb~ +0 -16
  102. data/out.rb~ +0 -161
  103. data/test/app_drone_test.rb~ +0 -19
  104. data/test/test_app_drone.rb~ +0 -74
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ *~
data/README.md CHANGED
@@ -65,6 +65,24 @@ Dependencies are automatically checked, and a template will not render unless th
65
65
 
66
66
  *Note that most drones depend on `Bundle`, `Stylesheet` and `Javascript`.*
67
67
 
68
+ To make sure a drone's directives are run after another drone's, use `run_after :drone, :another_drone`. Unlike `depends_on`, no dependency checking is done on template render, so you reference paired drones that may or may not exist in the final template. An example:
69
+
70
+ class AppDrone::SimpleCov
71
+ depends_on :bundle
72
+ pairs_with :rspec
73
+ run_after :rspec
74
+
75
+ def align
76
+ bundle.add 'simplecov'
77
+ end
78
+
79
+ def execute
80
+ do! :install
81
+ do! :rspec_integration if pair?(:rspec)
82
+ # we can be certain that rspec's generated files exist to modify
83
+ end
84
+ end
85
+
68
86
 
69
87
  ### Active drones
70
88
 
@@ -244,66 +262,64 @@ AppDrone is not for everyone. It's highly opinionated about how a Rails app shou
244
262
 
245
263
  ### Active drones (put 'em to work!)
246
264
 
247
- - [base] Bundle
248
- - [base] Stylesheet (Sass & Compass)
249
- - [base] Javascript (Coffescript & jQuery)
250
- - [base] SlimView
251
- - [base] Cleanup
252
- - [views] HighVoltage, by ThoughtBot
253
- - [views] Flair (drones use this to demonstrate their working functionality)
254
- - [views] SimpleForm (with optional Country Select and automatic Twitter Bootstrap integration)
255
- - [auth] Sorcery, for no-frills user authentication
256
- - [auth] CanCan, for role-based authorization
257
- - [auth] EasyRoles, to add roles to your User models
258
- - [model] Migrant, for easier schema management
259
- - [model] Squeel, improving on ActiveRelation
260
- - [model] RankedModel, for sorting and ranking objects
261
- - [ui] Chosen select, by harvestHQ
262
- - [ui] Bootstrap, by Twitter
263
- - [ui] Gritter, for jQuery growl-like notifications
264
- - [ui] Underscore.js utility belt
265
- - [ux] Ember (the Ember.js library)
266
- - [dev] LetterOpener, to preview email in the browser instead of sending it
267
-
265
+ - [base] **Bundle** for managing gems
266
+ - [base] **Stylesheet** (Sass & Compass)
267
+ - [base] **Javascript** (Coffescript & jQuery)
268
+ - [base] **SlimView** (Slim, laid out right)
269
+ - [base] **Cleanup**
270
+ - [base] **HighVoltage** by ThoughtBot
271
+ - [base] **Flair** - drones use this to demonstrate their working functionality
272
+ - [views] **SimpleForm** with optional Country Select and automatic Twitter Bootstrap integration
273
+ - [views] **NestedForm** for managing multiple models in a single form
274
+ - [auth] **Sorcery** for no-frills user authentication
275
+ - [auth] **CanCan** for role-based authorization
276
+ - [auth] **EasyRoles**,to add roles to your User models
277
+ - [model] **Migrant** for easier schema management
278
+ - [model] **Squeel** improving on ActiveRelation
279
+ - [model] **RankedModel** for sorting and ranking objects
280
+ - [ui] **Chosen select** by harvestHQ
281
+ - [ui] **Bootstrap** by Twitter
282
+ - [ui] **Gritter** for jQuery growl-like notifications
283
+ - [ui] **Underscore.js** utility belt
284
+ - [ux] **Ember** (the Ember.js library)
285
+ - [requests] **Responders** from Plataformatec
286
+ - [requests] **HasScope** for mapping filters to controller actions
287
+ - [requests] **WillPaginate** with automatic Bootstrap integration
288
+ - [dev] **LetterOpener** to preview email in the browser instead of sending it\
289
+ - [misc] **Chronic** for natural language date parsing
290
+ - [misc] **Timecop** - time travelling for Ruby
291
+ - [misc] **NiftyGenerators**, a collection of useful Rails generator scripts
292
+ - [production] **NewRelic** app performance monitoring
293
+ - [uploads] **Carrierwave** file uploading plus optional Fog cloud storage
294
+ - [uploads] **Remotipart**, for AJAX file uploads with jQuery
295
+ - [test] **RSpec** for BDD
296
+ - [test] **Factory Girl** test fixtures
297
+ - [test] **SimpleCov** code coverage for Ruby 1.9, with automatic RSpec integration
268
298
 
269
299
  ### Frozen drones (currently in development)
270
300
 
271
- - [base] Database (currenly rake db:migrate in template will break non-sqlite dbs)
272
- - [auth] CanCan
273
- - [auth] Sorcery
301
+ - [base] Database (currently rake db:migrate in template will break non-sqlite dbs)
274
302
  - [auth] Devise
275
- - [auth] EasyRoles
276
- - [test] RSpec
277
- - [test] FactoryGirl
278
303
  - [test] DatabaseCleaner
279
304
  - [test] TimeCop
280
305
  - [test] Capybara
281
306
  - [test] Shoulda
282
- - [test?] Chronic
283
- - [dev] Migrant (+ Pickle support?)
284
307
  - [dev] Guard
285
308
  - [source-control] Git
286
- - [model] RankedModel
287
- - [model] Squeel
288
- - [requests] Responders
289
309
  - [requests] InheritedResources (deprecated)
290
310
  - [requests] UserAgent blocking script
291
- - [dev] Letter opener
292
- - [ui] Underscore Rails
293
311
  - [mailing] SendGrid
294
312
 
295
313
  ### Future drones (TODO - I'll get there some day!)
296
314
 
297
315
  - [ui] Stylesheet utils
316
+ - [ui] Calendrical for jQuery
298
317
  - [ui] SlimViews: Add browser-specific classes to <html> via useragent + helpers..
299
318
  - [ui] Bootstrap: vendor files rather than gem require (is this necessary? seems all variables can be customized in an external sheet as long as it's required before compass_twitter_bootstrap)
300
319
  - [ui] jQuery shims
301
320
  - [ui] jQuery UI (vendor + theme etc.)
302
321
  - [ui] pie.htc for IE
303
322
  - [ui] HTML5 shim for IE
304
- - [uploads] CarrierWave (and optional cloud resizing thingy)
305
- - [uploads] Fog
306
- - [uploads] Remotipart
307
323
  - [uploads?] RMagick / minimagick
308
324
  - [requests] HasScope
309
325
  - [requests] will-paginate (+bootstrap-will-paginate)
@@ -311,7 +327,6 @@ AppDrone is not for everyone. It's highly opinionated about how a Rails app shou
311
327
  - [dev] Pivotal tracker
312
328
  - [dev] RailsErd
313
329
  - [production] Airbrake + API Key
314
- - [production] NewRelic
315
330
  - [production] EngineYard for deployment
316
331
  - [ux] Backbone integration + Skim
317
332
  - [views] Nested Form
@@ -323,8 +338,8 @@ AppDrone is not for everyone. It's highly opinionated about how a Rails app shou
323
338
  - [?] Nokogiri
324
339
  - [?] Mechanize
325
340
  - [?] Money
326
- - [misc] NiftyGenerators
327
341
  - [ui] jQuery.transit
342
+ - [ui] jQuery joyride
328
343
  - [ui] Ember Touch (gesture support for Ember: pinch, pan etc.)
329
344
 
330
345
 
@@ -42,7 +42,14 @@ class DependencyChain
42
42
 
43
43
  private
44
44
  def dependency_indices(drones,drone)
45
- drone.dependencies.map { |d| drones.index(d) }
45
+ dependencies = drone.dependencies
46
+
47
+ precursors = drone.precursors
48
+ active_precursors = drones & precursors
49
+
50
+ preceding_drones = (dependencies + active_precursors).uniq
51
+
52
+ preceding_drones.map { |d| drones.index(d) }
46
53
  end
47
54
 
48
55
  def last_dependency_index(drones,drone)
@@ -37,6 +37,10 @@ class Drone
37
37
  return @template.hook?(drone_klass)
38
38
  end
39
39
 
40
+ def notify!(notice)
41
+ @template.notify! notice, self
42
+ end
43
+
40
44
  # Expected implementations
41
45
  def align; end
42
46
  def execute; end
@@ -95,6 +99,11 @@ class Drone
95
99
  (@pairs || []).map(&:to_app_drone_class)
96
100
  end
97
101
 
102
+ def run_after(*klass_symbols); @precursors = klass_symbols end
103
+ def precursors
104
+ (@precursors || []).map(&:to_app_drone_class)
105
+ end
106
+
98
107
  def owns_generator_method(m); @generator_method = m end
99
108
  def generator_method; @generator_method end
100
109
 
@@ -0,0 +1,20 @@
1
+ module AppDrone
2
+ class Carrierwave < Drone
3
+ desc "Classy file uploads"
4
+ category :uploads
5
+
6
+ depends_on :bundle
7
+
8
+ param :fog, :boolean, info: 'Install Fog for cloud storage'
9
+
10
+ def align
11
+ bundle.add 'carrierwave'
12
+ bundle.add 'fog' if param(:fog)
13
+ end
14
+
15
+ def execute
16
+ notify! 'Create "config/initializers/fog.rb" and load your Fog credentials into Carrierwave!' if param(:fog)
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module AppDrone
2
+ class Chronic < Drone
3
+ desc "Natural language date parsing"
4
+ category :misc
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'chronic'
10
+ end
11
+
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  module AppDrone
2
- class EasyRoles45 < Drone
2
+ class EasyRolez < Drone
3
3
  desc "Add roles to your User models"
4
4
  category :auth
5
5
 
@@ -0,0 +1,13 @@
1
+ module AppDrone
2
+ class FactoryGirl < Drone
3
+ desc "Test fixtures"
4
+ category :test
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'factory_girl_rails', group: %w(development test)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module AppDrone
2
+ class HasScope < Drone
3
+ desc "Filter controller actions with scopes"
4
+ category :requests
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'has_scope'
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module AppDrone
2
+ class NestedForm < Drone
3
+ desc "Conveniently manage multiple models in a single form"
4
+ category :views
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'nested_form'
10
+ javascript.pipeline 'jquery_nested_form'
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module AppDrone
2
+ class NewRelic < Drone
3
+ desc "App performance monitoring"
4
+ category :production
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'newrelic_rpm'
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1 @@
1
+ generate 'nifty:config'
@@ -0,0 +1,19 @@
1
+ module AppDrone
2
+ class NiftyGeneratorz < Drone
3
+ desc "A collection of useful Rails generator scripts"
4
+ category :misc
5
+
6
+ depends_on :bundle
7
+
8
+ param :nifty_config, :boolean, info: 'generate a config YAML file and loader'
9
+
10
+ def align
11
+ bundle.add 'nifty-generators', group: :development
12
+ end
13
+
14
+ def execute
15
+ do! :nifty_config if param(:nifty_config)
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ module AppDrone
2
+ class Remotipart < Drone
3
+ desc "AJAX file uploads with jQuery"
4
+ category :uploads
5
+
6
+ depends_on :bundle, :stylesheet, :javascript
7
+
8
+ def align
9
+ bundle.add 'remotipart'
10
+ javascript.pipeline 'jquery.remotipart'
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ generate 'responders:install'
@@ -0,0 +1,17 @@
1
+ module AppDrone
2
+ class Responderz < Drone
3
+ desc "DRY up your controllers"
4
+ category :requests
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'responders'
10
+ end
11
+
12
+ def execute
13
+ do! :install
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ generate "rspec:install"
@@ -0,0 +1,17 @@
1
+ module AppDrone
2
+ class Rspec < Drone
3
+ desc "Behaviour Driven Development"
4
+ category :test
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'rspec-rails', group: %w(development test)
10
+ end
11
+
12
+ def execute
13
+ do! :install
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ @generator.create_file '.simplecov', <<-SIMPLECOV
2
+ SimpleCov.start 'rails' do
3
+ # any custom configs like groups and filters can be here at a central place
4
+ end
5
+ SIMPLECOV
@@ -0,0 +1 @@
1
+ @generator.prepend_file 'spec/spec_helper.rb', "require 'simplecov'\n"
@@ -0,0 +1,20 @@
1
+ module AppDrone
2
+ class SimpleCov < Drone
3
+ desc "Code coverage for Ruby 1.9, with RSpec integration"
4
+ category :test
5
+
6
+ depends_on :bundle
7
+ pairs_with :rspec
8
+ run_after :rspec
9
+
10
+ def align
11
+ bundle.add 'simplecov', require: false, group: :test
12
+ end
13
+
14
+ def execute
15
+ do! :install
16
+ do! :rspec_integration if pair?(:rspec)
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module AppDrone
2
+ class Timecop < Drone
3
+ desc "Time-travelling, Ruby style"
4
+ category :misc
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ bundle.add 'timecop'
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module AppDrone
2
+ class WillPaginate < Drone
3
+ desc "Simple pagination library, with automatic Bootstrap integration"
4
+ category :requests
5
+
6
+ depends_on :bundle
7
+ pairs_with :bootstrap
8
+
9
+ def align
10
+ bundle.add 'will_paginate'
11
+ bundle.add 'bootstrap-will_paginate' if pair?(:bootstrap)
12
+ end
13
+
14
+ end
15
+ end
@@ -25,9 +25,23 @@ class AppBuilder < Rails::AppBuilder
25
25
  <% end %>
26
26
 
27
27
  def leftovers
28
+
28
29
  <%= leftover_directives.join("\n") %>
30
+
31
+ # This should be removed when the database drone is installed
32
+ rake 'db:create'
29
33
  rake 'db:migrate'
34
+
35
+
36
+ # Drone Notices
37
+ <% drone_notices.each do |drone, notices| %>
38
+ <% notices.each do |notice| %>
39
+ say "[<%= drone.human_name %>] <%= notice %>", :red
40
+ <% end %>
41
+ <% end %>
42
+
30
43
  say "She's all yours, sparky!\n\n", :green
44
+
31
45
  end
32
46
 
33
47
  end
@@ -1,6 +1,6 @@
1
1
  module AppDrone
2
2
  class Template
3
- def initialize; @drones = {}; @directives = {} end
3
+ def initialize; @drones = {}; @directives = {}; @drone_notices = {} end
4
4
 
5
5
  def add(ref,*params)
6
6
  klass = ref.is_a?(Class)? ref : ('AppDrone::' + ref.to_s.classify).constantize
@@ -9,6 +9,7 @@ class Template
9
9
 
10
10
  def drone_objects; @drones.values end
11
11
  def drone_classes; @drones.keys end
12
+ def drone_notices; @drone_notices end
12
13
  def hook?(klass); !@drones[klass].nil? end
13
14
  def hook(klass)
14
15
  raise "No such drone: #{klass}" unless i_klass = @drones[klass]
@@ -18,16 +19,24 @@ class Template
18
19
  def leftover_directives; @directives[:leftovers] || [] end
19
20
  def overridden_generator_methods; @directives.keys - [:leftovers] end
20
21
 
21
- def do!(d,drone);
22
+ def do!(d,drone)
22
23
  generator_method = drone.class.generator_method || :leftovers
23
24
  (@directives[generator_method] ||= []) << d
24
25
  end
26
+
27
+ def notify!(notice,drone)
28
+ (@drone_notices[drone.class] ||= []) << notice.gsub("'","\\'").gsub('"','\\"') # escape quotes
29
+ end
25
30
 
26
31
  def render!
27
32
  return if @rendered
28
33
  DependencyChain.check_dependencies!(drone_classes)
29
- drone_objects.map(&:align)
30
- drone_objects.map(&:execute)
34
+
35
+ ordered_chain = AppDrone::DependencyChain.sort(drone_classes)
36
+
37
+ ordered_chain.each { |klass| hook(klass).align }
38
+ ordered_chain.each { |klass| hook(klass).execute }
39
+
31
40
  @rendered = true
32
41
  end
33
42
 
@@ -1,3 +1,3 @@
1
1
  module AppDrone
2
- VERSION = "0.8.6"
2
+ VERSION = "0.9.1"
3
3
  end
data/out.rb CHANGED
@@ -27,7 +27,8 @@ class AppBuilder < Rails::AppBuilder
27
27
  @generator.gem 'compass-rails'
28
28
  @generator.gem 'slim-rails'
29
29
  @generator.gem 'high_voltage'
30
- @generator.gem 'letter_opener', :group=>:development
30
+ @generator.gem 'rspec-rails', :group=>["development", "test"]
31
+ @generator.gem 'simplecov', :require=>false, :group=>:test
31
32
 
32
33
  run_bundle
33
34
  @generator.options = @generator.options.dup
@@ -38,6 +39,7 @@ run_bundle
38
39
 
39
40
 
40
41
  def leftovers
42
+
41
43
  # ---
42
44
  # AppDrone::Javascript
43
45
  # ---
@@ -113,12 +115,35 @@ FLAIR
113
115
  @generator.remove_file File.join %w(README.rdoc)
114
116
 
115
117
  # ---
116
- # AppDrone::LetterOpener
118
+ # AppDrone::Rspec
117
119
  # ---
118
- @generator.inject_into_file 'config/environments/development.rb', "\n\n config.action_mailer.delivery_method = :letter_opener", before: "\nend"
120
+ generate "rspec:install"
119
121
 
122
+ # ---
123
+ # AppDrone::SimpleCov
124
+ # ---
125
+ @generator.create_file '.simplecov', <<-SIMPLECOV
126
+ SimpleCov.start 'rails' do
127
+ # any custom configs like groups and filters can be here at a central place
128
+ end
129
+ SIMPLECOV
130
+
131
+ # ---
132
+ # AppDrone::SimpleCov
133
+ # ---
134
+ @generator.prepend_file 'spec/spec_helper.rb', "require 'simplecov'\n"
135
+
136
+
137
+ # This should be removed when the database drone is installed
138
+ rake 'db:create'
120
139
  rake 'db:migrate'
140
+
141
+
142
+ # Drone Notices
143
+
144
+
121
145
  say "She's all yours, sparky!\n\n", :green
146
+
122
147
  end
123
148
 
124
149
  end
@@ -0,0 +1,7 @@
1
+ APP:
2
+
3
+ - add data-related="whoisdandavey(:description)" to share link
4
+ - add platform 45 logo to footer
5
+ - choose, configure, compile: add 1, 2, 3 somewhere
6
+
7
+ - choose_one dropdown in ember app
data/scraps/TODO ADDED
@@ -0,0 +1,32 @@
1
+ ** When finished: if Flair, say: 'Boot your app and visit /pages/flair to see a functionality demo'
2
+ ** When finished: general stats/instructions?
3
+ ** Will-paginate bootstrap flair?
4
+
5
+ - [uploads] Cloudinary
6
+ - [misc] Spork
7
+ - [test] DatabaseCleaner
8
+ - [test] Capybara
9
+ - [test] Shoulda
10
+
11
+ - [ui] jQuery UI (vendor + theme etc.)
12
+ - [ui_shim] HTML5 placeholder shim - https://github.com/parndt/jquery-html5-placeholder-shim
13
+ - [ui_shim] HTML5 shim/shiv for IE -- http://ejohn.org/blog/html5-shiv/ http://code.google.com/p/html5shiv/ (or use modernizr?)
14
+ - [ui_shim] pie.htc for IE
15
+ - [ui_shim] jQuery shims
16
+
17
+ - [mailing] SendGrid https://github.com/stephenb/sendgrid
18
+ - [mailing] Postmark https://github.com/wildbit/postmark-rails
19
+
20
+ - [?] DelayedJob
21
+ - [search] Sphinx
22
+ - put has_scope in [search]?
23
+
24
+ LATER:
25
+ - [?] Resque
26
+ - [?] Redis
27
+ - [dev] rails-best-practices (and the other output gem for debugging)
28
+ - [dev] RailsErd
29
+ - [production] Airbrake + API Key
30
+ - [?] Launchy
31
+ - [base] Database: rake [db:create, db:migrate] at very end of generator, options? postgres etc. (will need a dropdown option in the app for this)
32
+ - [auth] Devise
@@ -0,0 +1,15 @@
1
+ module AppDrone
2
+ class < Drone
3
+ desc ""
4
+ category :
5
+
6
+ depends_on :bundle
7
+
8
+ def align
9
+ end
10
+
11
+ def execute
12
+ end
13
+
14
+ end
15
+ end
@@ -24,7 +24,8 @@ class AppDroneTest < Test::Unit::TestCase
24
24
  template = Template.new
25
25
  add_defaults_to_template(template)
26
26
 
27
- template.add :letter_opener
27
+ template.add :simple_cov
28
+ template.add :rspec
28
29
 
29
30
  template.render_to_file
30
31
  end
@@ -64,6 +65,12 @@ class AppDroneTest < Test::Unit::TestCase
64
65
  assert_equal DependencyChain.sort(chain), sorted_chain
65
66
  end
66
67
 
68
+ def test_dependency_chain_run_after
69
+ chain = [AppDrone::SimpleCov, AppDrone::Rspec, AppDrone::Bundle]
70
+ sorted_chain = [AppDrone::Bundle, AppDrone::Rspec, AppDrone::SimpleCov]
71
+ assert_equal DependencyChain.sort(chain), sorted_chain
72
+ end
73
+
67
74
  private
68
75
  def add_defaults_to_template(template)
69
76
  defaults = [:bundle, :javascript, :stylesheet, :slim_view, :high_voltage, :flair, :cleanup]