forge-cli 0.0.18 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +106 -0
  3. data/bin/cucumber +16 -0
  4. data/bin/erubis +16 -0
  5. data/bin/htmldiff +16 -0
  6. data/bin/ldiff +16 -0
  7. data/bin/rackup +16 -0
  8. data/bin/rake +16 -0
  9. data/bin/rdoc +16 -0
  10. data/bin/ri +16 -0
  11. data/bin/sprockets +16 -0
  12. data/bin/thor +16 -0
  13. data/bin/tilt +16 -0
  14. data/bin/tt +16 -0
  15. data/lib/forge-cli.rb +1 -0
  16. data/lib/forge-cli/application_creator.rb +25 -6
  17. data/lib/forge-cli/controller_module_includer.rb +43 -0
  18. data/lib/forge-cli/module_installer.rb +18 -13
  19. data/lib/forge-cli/modules/banners/routes.rb +1 -1
  20. data/lib/forge-cli/modules/base/forge_routes.rb +4 -4
  21. data/lib/forge-cli/modules/base/manifest.yml +9 -4
  22. data/lib/forge-cli/modules/base/post_hooks.rb +9 -2
  23. data/lib/forge-cli/modules/base/routes.rb +4 -4
  24. data/lib/forge-cli/modules/dispatches/forge_routes.rb +2 -2
  25. data/lib/forge-cli/modules/dispatches/manifest.yml +2 -1
  26. data/lib/forge-cli/modules/ecommerce/manifest.yml +5 -1
  27. data/lib/forge-cli/modules/ecommerce/post_hooks.rb +13 -21
  28. data/lib/forge-cli/modules/events/routes.rb +1 -1
  29. data/lib/forge-cli/modules/posts/manifest.yml +4 -1
  30. data/lib/forge-cli/modules/posts/post_hooks.rb +9 -17
  31. data/lib/forge-cli/modules/posts/routes.rb +1 -1
  32. data/lib/forge-cli/modules/videos/routes.rb +1 -1
  33. data/lib/forge-cli/version.rb +2 -2
  34. data/lib/forge/Gemfile +3 -9
  35. data/lib/forge/Gemfile.lock +214 -210
  36. data/lib/forge/app/controllers/forge/help_topics_controller.rb +2 -2
  37. data/lib/forge/app/controllers/forge/posts_controller.rb +1 -0
  38. data/lib/forge/app/controllers/forge/products_controller.rb +0 -4
  39. data/lib/forge/app/controllers/forge/users_controller.rb +0 -1
  40. data/lib/forge/app/controllers/forge_controller.rb +7 -6
  41. data/lib/forge/app/controllers/posts_controller.rb +0 -2
  42. data/lib/forge/app/controllers/sessions_controller.rb +2 -3
  43. data/lib/forge/app/helpers/forge_helper.rb +2 -2
  44. data/lib/forge/app/models/address.rb +3 -0
  45. data/lib/forge/app/models/asset.rb +9 -10
  46. data/lib/forge/app/models/banner.rb +3 -1
  47. data/lib/forge/app/models/comment.rb +17 -2
  48. data/lib/forge/app/models/comment_subscriber.rb +3 -0
  49. data/lib/forge/app/models/contact.rb +3 -0
  50. data/lib/forge/app/models/country.rb +5 -2
  51. data/lib/forge/app/models/dispatch.rb +5 -2
  52. data/lib/forge/app/models/dispatch_bounce.rb +3 -0
  53. data/lib/forge/app/models/dispatch_link.rb +4 -1
  54. data/lib/forge/app/models/dispatch_link_click.rb +4 -0
  55. data/lib/forge/app/models/dispatch_open.rb +5 -1
  56. data/lib/forge/app/models/dispatch_unsubscribe.rb +4 -0
  57. data/lib/forge/app/models/event.rb +3 -1
  58. data/lib/forge/app/models/gallery.rb +4 -1
  59. data/lib/forge/app/models/help_topic.rb +4 -1
  60. data/lib/forge/app/models/line_item.rb +2 -2
  61. data/lib/forge/app/models/order.rb +1 -1
  62. data/lib/forge/app/models/order_transaction.rb +3 -0
  63. data/lib/forge/app/models/page.rb +5 -5
  64. data/lib/forge/app/models/photo.rb +5 -1
  65. data/lib/forge/app/models/post.rb +3 -1
  66. data/lib/forge/app/models/post_category.rb +4 -0
  67. data/lib/forge/app/models/product.rb +4 -2
  68. data/lib/forge/app/models/product_category.rb +4 -1
  69. data/lib/forge/app/models/product_image.rb +4 -0
  70. data/lib/forge/app/models/province.rb +4 -1
  71. data/lib/forge/app/models/queued_dispatch.rb +7 -4
  72. data/lib/forge/app/models/role.rb +3 -0
  73. data/lib/forge/app/models/sale.rb +2 -0
  74. data/lib/forge/app/models/subscriber.rb +4 -0
  75. data/lib/forge/app/models/subscriber_group.rb +4 -0
  76. data/lib/forge/app/models/subscriber_group_member.rb +4 -0
  77. data/lib/forge/app/models/tax_rate.rb +5 -2
  78. data/lib/forge/app/models/user.rb +1 -2
  79. data/lib/forge/app/models/video.rb +2 -0
  80. data/lib/forge/app/models/video_feed.rb +2 -2
  81. data/lib/forge/app/views/forge/assets/_asset.html.haml +1 -1
  82. data/lib/forge/app/views/forge/posts/_post.html.haml +5 -2
  83. data/lib/forge/app/views/forge/settings/_ecommerce.html.haml +4 -0
  84. data/lib/forge/app/views/forge/subscribers/_subscriber.html.haml +2 -2
  85. data/lib/forge/app/views/user_mailer/approved.html.haml +1 -1
  86. data/lib/forge/config/application.rb +3 -9
  87. data/lib/forge/config/database.yml.template +30 -0
  88. data/lib/forge/config/environments/development.rb +3 -7
  89. data/lib/forge/config/environments/production.rb +6 -0
  90. data/lib/forge/config/environments/test.rb +5 -3
  91. data/lib/forge/config/initializers/ckeditor.rb +15 -143
  92. data/lib/forge/config/initializers/devise.rb +12 -2
  93. data/lib/forge/config/initializers/ecommerce.rb +1 -1
  94. data/lib/forge/config/initializers/secret_token.rb +1 -10
  95. data/lib/forge/config/routes.rb +7 -11
  96. data/lib/forge/config/settings.yml +82 -5
  97. data/lib/forge/config/sitemap.yml +3 -1
  98. data/lib/forge/db/migrate/20130405172031_create_products_tax_rates.rb +15 -0
  99. data/lib/forge/db/migrate/{20130405172040_create_subscribers copy.rb → 20130405172040_create_subscribers.rb} +0 -0
  100. data/lib/forge/db/seeds.rb +304 -298
  101. data/lib/forge/doc/update_to_rails4_notes.md +15 -0
  102. data/lib/forge/lib/assets/javascripts/forge/features/help.js.erb +5 -4
  103. data/lib/forge/lib/assets/javascripts/forge/forge_manifest.js.erb +2 -2
  104. data/lib/forge/lib/assets/stylesheets/forge/forge.ui.css.scss +4 -3
  105. data/lib/forge/lib/forge/can_use_asset.rb +5 -7
  106. data/lib/forge/lib/forge/config/ecommerce.rb +3 -3
  107. data/lib/forge/lib/forge/shared_controller_methods/ecommerce.rb +3 -3
  108. data/lib/forge/lib/generators/forge/scaffold/USAGE +1 -1
  109. data/lib/forge/lib/tasks/forge.rake +5 -10
  110. data/lib/forge/public/500.html +1 -0
  111. data/lib/forge/public/javascripts/ckeditor/config.js +0 -1
  112. metadata +39 -39
  113. data/README.rdoc +0 -4
  114. data/lib/forge/app/models/comment_observer.rb +0 -9
  115. data/lib/forge/app/sweepers/page_sweeper.rb +0 -11
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e10ec0676cc31af13d158fae4cbfd36751bb7b6c
4
+ data.tar.gz: 2459df7caa0e5c5db327afaefa4c9d7c9b464ae2
5
+ SHA512:
6
+ metadata.gz: c53dd6ce30134a189abd235fd26543cde5157ce99daf8e016c4f407041fae7b03df3bd17effac3f5480364370d915f7a87bf2c88afc3ba747500a255289c0d9e
7
+ data.tar.gz: 38fd8650401584d9f884d5144dad934450faf64ae45d95cc5d62fac30a1ef99715592b89bb102f63b7f4566a363c1f672ab25996bb0ffa6bb1843a37f7b661cf
data/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # forge-cli
2
+
3
+ Command line interface for creating Forge apps, which are Rails-based applications that come with a host of features
4
+ for content management, rapid application development, and improved scaffold generation.
5
+
6
+ Although the end result of this gem is the creation of a Rails 4 application that you can certainly use as the basis
7
+ for a new web application, this gem itself is still alpha quality and is undergoing heavy development. You can, however,
8
+ create production-ready applications with it (and we do all the time). Documentation is also greatly lacking at this
9
+ point.
10
+
11
+ ## Requirements
12
+
13
+ Ruby 1.9.3 or higher. Forge is best at creating Rails 4 applications using Ruby 2.0.
14
+
15
+ ## Installation
16
+
17
+ gem install forge-cli
18
+
19
+ ## Usage
20
+
21
+ ### Installation And Modules
22
+
23
+ To create a new Forge site:
24
+
25
+ forge new APP_NAME LIST,OF,MODULES
26
+
27
+ For example:
28
+
29
+ forge new app banners,dispatches,ecommerce,events,galleries,posts,subscribers,videos
30
+
31
+ The gem will display next steps once you've created the application.
32
+
33
+ Once the app is created, you can see a list of available modules by running:
34
+
35
+ forge list
36
+
37
+ To install a module that is not yet installed, use:
38
+
39
+ forge install MODULE_NAME
40
+
41
+ ### Scaffold Generation
42
+
43
+ Forge comes with an advanced scaffold generation system that makes it extremely simple to create new,
44
+ content-managed entities in the administration panel.
45
+
46
+ To use the scaffold generator, run:
47
+
48
+ rails generate forge:scaffold MODEL_NAME LIST_OF_ATTRIBUTES_IN_STANDARD_RAILS_FORMAT
49
+
50
+ For example:
51
+
52
+ rails generate forge:scaffold vehicle title:string description:text image_file_name:string image_file_size:integer image_content_type:string list_order:integer publish_on:timestamp
53
+
54
+ As well as generating standard text fields as per Rails' normal behaviour, the scaffolder understands the following:
55
+
56
+ * `ATTRIBUTE_NAME:timestamp` (generates a calendar picker with a time field)
57
+ * `title:string` (generates a large text field at the top of the form for the title)
58
+ * `ATTRIBUTE_file_name:string, ATTRIBUTE_file_size:integer, ATTRIBUTE_content_type:string` (generates Paperclip-styled attachments that hook into the Asset Library)
59
+ * `list_order:integer` (makes the list of items in Forge reorderable using drag & drop)
60
+
61
+ You can also generate scaffolds for "small" entities, such as post categories, that have a streamlined interface as follows:
62
+
63
+
64
+
65
+ ## Available Modules
66
+
67
+ * banners (e.g. for image carousels on a homepage)
68
+ * subscribers (subscribe management)
69
+ * dispatches (full-fledged newsletter sending system, installs subscribers as well)
70
+ * ecommerce (the lack of documentation for this module makes it rather hard to use right now)
71
+ * events (including a calendar if you wish)
72
+ * galleries (for photos)
73
+ * posts (i.e. blogging)
74
+ * videos
75
+
76
+ ## Contributing
77
+
78
+ Contributions are welcome. Right now the process of contributing is as follows:
79
+
80
+ 1. Fork the gem
81
+ 2. Use the local copy of the gem to create a new site, e.g: `bin/forge new testapp banners,dispatches`
82
+ 3. Spin up the new app
83
+ 4. Work on the new app as you would work on a normal Rails site
84
+ 5. Copy the changed/new files from the new app into the gem's lib/forge folder. For example, if you changed
85
+ `app/controllers/application_controller.rb` in your new app, you would copy that into the gem's `lib/forge/app/controllers` folder.
86
+ 6. Commit your changes and issue a pull request.
87
+
88
+
89
+ ## LICENSE
90
+
91
+ (The MIT License)
92
+
93
+ Copyright (c) 2013 factor[e] design initiative
94
+
95
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
96
+ documentation files (the 'Software'), to deal in the Software without restriction, including without limitation
97
+ the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
98
+ to permit persons to whom the Software is furnished to do so, subject to the following conditions:
99
+
100
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of
101
+ the Software.
102
+
103
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
104
+ THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
105
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
106
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/bin/cucumber ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'cucumber' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('cucumber', 'cucumber')
data/bin/erubis ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'erubis' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('erubis', 'erubis')
data/bin/htmldiff ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'htmldiff' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('diff-lcs', 'htmldiff')
data/bin/ldiff ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'ldiff' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('diff-lcs', 'ldiff')
data/bin/rackup ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rackup' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rack', 'rackup')
data/bin/rake ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rake', 'rake')
data/bin/rdoc ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rdoc' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rdoc', 'rdoc')
data/bin/ri ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'ri' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rdoc', 'ri')
data/bin/sprockets ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'sprockets' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('sprockets', 'sprockets')
data/bin/thor ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'thor' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('thor', 'thor')
data/bin/tilt ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'tilt' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('tilt', 'tilt')
data/bin/tt ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'tt' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('treetop', 'tt')
data/lib/forge-cli.rb CHANGED
@@ -16,6 +16,7 @@ require 'forge-cli/app.rb'
16
16
  # This is alphabetical
17
17
  require 'forge-cli/ability_installer.rb'
18
18
  require 'forge-cli/application_creator.rb'
19
+ require 'forge-cli/controller_module_includer.rb'
19
20
  require 'forge-cli/custom_file_copier.rb'
20
21
  require 'forge-cli/forge_addon_requirer.rb'
21
22
  require 'forge-cli/module_installer.rb'
@@ -32,16 +32,26 @@ class ForgeCLI::ApplicationCreator
32
32
  # Rewrite Forge3::Application
33
33
  rewrite_app_name
34
34
 
35
+ # create some new tokens
36
+ generate_devise_tokens
37
+
35
38
  STDOUT.puts completed_message
36
39
  end
37
40
 
38
41
  def completed_message
39
42
  %{
40
43
  #{"Your new Forge site is almost ready! Next steps:".foreground(:cyan)}
41
- 1. Run 'bundle install'
42
- 2. Set up config/database.yml
43
- 3. Run 'rake db:migrate'
44
- 4. Run 'rake forge:create_admin
44
+ 1. Run 'bundle install'
45
+ 2. Set up config/database.yml
46
+ 3. Run 'rake db:create' unless your database already exists
47
+ 4. Run 'rake db:migrate'
48
+ 5. Run 'rake forge:create_admin'
49
+ 6. Run 'rake forge:load_help'
50
+ 7. Edit the contents of config/sitemap.yml, then run 'rake db:seed'
51
+ 8. Set up delayed job with 'rails generate delayed_job:active_record'
52
+ 9. Review the settings in config/initializers/devise.rb and config/settings.yml
53
+ 10. Run 'rails server' to spin up the application
54
+ 11. Access Forge by going to /forge in your browser (e.g. http://localhost:3000/forge)
45
55
  }
46
56
  end
47
57
 
@@ -60,11 +70,20 @@ class ForgeCLI::ApplicationCreator
60
70
  ]
61
71
  files.each do |file|
62
72
  old_content = File.read(File.join(@app, file))
63
- app_name = File.basename(@app).classify
73
+ app_name = File.basename(@app).gsub(/\W+/, '_').camelize
64
74
  new_content = old_content.gsub('Forge3', app_name)
65
75
  File.open(File.join(@app, file), 'w') do |f|
66
76
  f.puts new_content
67
77
  end
68
78
  end
69
79
  end
70
- end
80
+
81
+ def generate_devise_tokens
82
+ file = '/config/initializers/devise.rb'
83
+ old_content = File.read(File.join(@app, file))
84
+ new_content = old_content.gsub('DEVISE_SECRET_KEY', SecureRandom.hex(64)).gsub('DEVISE_PEPPER', SecureRandom.hex(64))
85
+ File.open(File.join(@app, file), 'w') do |f|
86
+ f.puts new_content
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,43 @@
1
+ class ForgeCLI::ControllerModuleIncluder
2
+ attr_reader :module_name
3
+
4
+ def initialize(app, module_name)
5
+ @app = app
6
+ @module_name = module_name
7
+ end
8
+
9
+ def run!
10
+ add_initializer_content
11
+ add_controller_content
12
+ end
13
+
14
+ private
15
+ def add_controller_content
16
+ content = app_controller_content.gsub(
17
+ 'class ApplicationController < ActionController::Base',
18
+ "class ApplicationController < ActionController::Base\n include Forge::Controllers::#{module_name.camelize}\n"
19
+ )
20
+ File.open(app_controller_path, 'w') { |f| f.puts content }
21
+ end
22
+
23
+ def add_initializer_content
24
+ content = "require 'forge/shared_controller_methods/#{module_name.downcase.underscore.gsub(/\s/, '_')}.rb'\n" + forge_initializer_content
25
+ File.open(forge_initializer_path, 'w') { |f| f.puts content }
26
+ end
27
+
28
+ def app_controller_path
29
+ File.join(@app, 'app', 'controllers', 'application_controller.rb')
30
+ end
31
+
32
+ def app_controller_content
33
+ @app_controller_content ||= File.read(app_controller_path)
34
+ end
35
+
36
+ def forge_initializer_path
37
+ File.join(@app, 'config', 'initializers', 'forge.rb')
38
+ end
39
+
40
+ def forge_initializer_content
41
+ @forge_initializer_content ||= File.read(forge_initializer_path)
42
+ end
43
+ end
@@ -84,20 +84,25 @@ class ForgeCLI
84
84
  end
85
85
  files = Dir[File.join(source_path, '*.rb')]
86
86
  @mod["migrations"].each do |migration|
87
- # Get the old migration
88
- source_file = files.find {|f| f.match(%r{\d+_#{migration}.rb})}
89
- content = File.open(source_file, 'r').read
87
+ # skip the migration if one already exists in the target path, e.g. if one was created
88
+ # as a result of a dependency already
89
+ target_files = Dir[File.join(destination_path, '*.rb')]
90
+ unless target_files.find {|f| f.match(%r{\d+_#{migration}.rb})}
91
+ # Get the old migration
92
+ source_file = files.find {|f| f.match(%r{\d+_#{migration}.rb})}
93
+ content = File.open(source_file, 'r').read
90
94
 
91
- # Write the new one
92
- timestamp = Time.now.strftime('%Y%m%d%H%M%S')
93
- new_file_path = File.join(destination_path, "#{timestamp}_#{migration}.rb")
94
- new_file = File.open(new_file_path, "w")
95
- new_file.puts content
96
- new_file.close
97
- ForgeCLI::Output.write('migration', new_file_path.gsub("#{destination_path}/", ''))
95
+ # Write the new one
96
+ timestamp = Time.now.strftime('%Y%m%d%H%M%S')
97
+ new_file_path = File.join(destination_path, "#{timestamp}_#{migration}.rb")
98
+ new_file = File.open(new_file_path, "w")
99
+ new_file.puts content
100
+ new_file.close
101
+ ForgeCLI::Output.write('migration', new_file_path.gsub("#{destination_path}/", ''))
98
102
 
99
- # So that they have different timestamps
100
- sleep 1
103
+ # So that they have different timestamps
104
+ sleep 1
105
+ end
101
106
  end
102
107
  end
103
108
 
@@ -117,4 +122,4 @@ class ForgeCLI
117
122
  end
118
123
  end
119
124
  end
120
- end
125
+ end