app_drone 0.8.6 → 0.9.1

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