forge-cli 0.0.18 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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