marionette_rails_generators 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +30 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +71 -0
  6. data/Rakefile +2 -0
  7. data/lib/generators/marionette/attribute.rb +54 -0
  8. data/lib/generators/marionette/controller/controller_generator.rb +57 -0
  9. data/lib/generators/marionette/controller/templates/app/controllers/controller.js.coffee +12 -0
  10. data/lib/generators/marionette/controller/templates/app/controllers/controller_with_views.js.coffee +16 -0
  11. data/lib/generators/marionette/install/install_generator.rb +91 -0
  12. data/lib/generators/marionette/install/templates/after_backbone.js.coffee +8 -0
  13. data/lib/generators/marionette/install/templates/app.js.coffee +21 -0
  14. data/lib/generators/marionette/install/templates/app/templates/index.jst.eco +118 -0
  15. data/lib/generators/marionette/install/templates/base/controllers/_base_controller.js.coffee +42 -0
  16. data/lib/generators/marionette/install/templates/base/models/_base_collection.js.coffee +3 -0
  17. data/lib/generators/marionette/install/templates/base/models/_base_model.js.coffee +40 -0
  18. data/lib/generators/marionette/install/templates/base/views/_view.js.coffee +56 -0
  19. data/lib/generators/marionette/install/templates/base/views/collectionview.js.coffee +4 -0
  20. data/lib/generators/marionette/install/templates/base/views/compositeview.js.coffee +4 -0
  21. data/lib/generators/marionette/install/templates/base/views/itemview.js.coffee +3 -0
  22. data/lib/generators/marionette/install/templates/base/views/layout.js.coffee +3 -0
  23. data/lib/generators/marionette/install/templates/before_backbone.js.coffee +2 -0
  24. data/lib/generators/marionette/install/templates/config/config.js.coffee +72 -0
  25. data/lib/generators/marionette/install/templates/config/controllers/loading/loading_controller.js.coffee +55 -0
  26. data/lib/generators/marionette/install/templates/config/controllers/loading/loading_view.js.coffee +30 -0
  27. data/lib/generators/marionette/install/templates/config/models/fetch.js.coffee +11 -0
  28. data/lib/generators/marionette/install/templates/config/models/sync.js.coffee +19 -0
  29. data/lib/generators/marionette/install/templates/index.html.erb +9 -0
  30. data/lib/generators/marionette/install/templates/routes.js.coffee +13 -0
  31. data/lib/generators/marionette/model/model_generator.rb +42 -0
  32. data/lib/generators/marionette/model/templates/app/models/entity.js.coffee +14 -0
  33. data/lib/generators/marionette/resource_helpers.rb +104 -0
  34. data/lib/generators/marionette/scaffold/scaffold_generator.rb +194 -0
  35. data/lib/generators/marionette/scaffold/templates/templates/_empty.jst.eco +1 -0
  36. data/lib/generators/marionette/scaffold/templates/templates/_form.jst.eco +6 -0
  37. data/lib/generators/marionette/scaffold/templates/templates/_post.jst.eco +6 -0
  38. data/lib/generators/marionette/scaffold/templates/templates/edit.jst.eco +6 -0
  39. data/lib/generators/marionette/scaffold/templates/templates/index.jst.eco +19 -0
  40. data/lib/generators/marionette/scaffold/templates/templates/new.jst.eco +6 -0
  41. data/lib/generators/marionette/scaffold/templates/templates/show.jst.eco +10 -0
  42. data/lib/generators/marionette/view/templates/app/templates/collection_view.jst.eco +1 -0
  43. data/lib/generators/marionette/view/templates/app/templates/composite_view.jst.eco +1 -0
  44. data/lib/generators/marionette/view/templates/app/templates/item_view.jst.eco +10 -0
  45. data/lib/generators/marionette/view/templates/app/templates/layouts/application.jst.eco +2 -0
  46. data/lib/generators/marionette/view/templates/app/views/collection_view.js.coffee +4 -0
  47. data/lib/generators/marionette/view/templates/app/views/composite_view.js.coffee +4 -0
  48. data/lib/generators/marionette/view/templates/app/views/item_view.js.coffee +7 -0
  49. data/lib/generators/marionette/view/view_generator.rb +112 -0
  50. data/lib/marionette_rails_generators.rb +8 -0
  51. data/lib/marionette_rails_generators/version.rb +3 -0
  52. data/marionette_rails_generators.gemspec +33 -0
  53. data/spec/dummy/README.rdoc +28 -0
  54. data/spec/dummy/Rakefile +6 -0
  55. data/spec/dummy/app/assets/images/.keep +0 -0
  56. data/spec/dummy/app/assets/javascripts/application.js +32 -0
  57. data/spec/dummy/app/assets/javascripts/backbone/after_backbone.js.coffee +8 -0
  58. data/spec/dummy/app/assets/javascripts/backbone/app.js.coffee +21 -0
  59. data/spec/dummy/app/assets/javascripts/backbone/app/controllers/all/root_controller.js.coffee +14 -0
  60. data/spec/dummy/app/assets/javascripts/backbone/app/models/admin/books.js.coffee +11 -0
  61. data/spec/dummy/app/assets/javascripts/backbone/app/models/all/posts.js.coffee +13 -0
  62. data/spec/dummy/app/assets/javascripts/backbone/app/models/test_subsubmodule/test_submodule/test_module/stars.js.coffee +11 -0
  63. data/spec/dummy/app/assets/javascripts/backbone/app/templates/admin/test_collection_view2.jst.eco +1 -0
  64. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_collection_view1.jst.eco +1 -0
  65. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_composite_view1.jst.eco +1 -0
  66. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_item_view1.jst.eco +54 -0
  67. data/spec/dummy/app/assets/javascripts/backbone/app/templates/all/test_item_view2.jst.eco +1 -0
  68. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/application.jst.eco +2 -0
  69. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout1.jst.eco +2 -0
  70. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout2.jst.eco +2 -0
  71. data/spec/dummy/app/assets/javascripts/backbone/app/templates/layouts/test_layout3.jst.eco +2 -0
  72. data/spec/dummy/app/assets/javascripts/backbone/app/templates/root/index.jst.eco +118 -0
  73. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_module/test_composite_view2.jst.eco +1 -0
  74. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_module/test_item_view3.jst.eco +1 -0
  75. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_collection_view3.jst.eco +1 -0
  76. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_composite_view3.jst.eco +1 -0
  77. data/spec/dummy/app/assets/javascripts/backbone/app/templates/test_subsubmodule/test_submodule/test_module/test_item_view4.jst.eco +1 -0
  78. data/spec/dummy/app/assets/javascripts/backbone/app/views/admin/test_collection_view2.js.coffee +4 -0
  79. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_collection_view1.js.coffee +4 -0
  80. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_composite_view1.js.coffee +4 -0
  81. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_item_view1.js.coffee +7 -0
  82. data/spec/dummy/app/assets/javascripts/backbone/app/views/all/test_item_view2.js.coffee +7 -0
  83. data/spec/dummy/app/assets/javascripts/backbone/app/views/layouts/layouts.js.coffee +21 -0
  84. data/spec/dummy/app/assets/javascripts/backbone/app/views/root/index.js.coffee +7 -0
  85. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_module/test_composite_view2.js.coffee +4 -0
  86. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_module/test_item_view3.js.coffee +7 -0
  87. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_collection_view3.js.coffee +4 -0
  88. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_composite_view3.js.coffee +4 -0
  89. data/spec/dummy/app/assets/javascripts/backbone/app/views/test_subsubmodule/test_submodule/test_module/test_item_view4.js.coffee +7 -0
  90. data/spec/dummy/app/assets/javascripts/backbone/base/controllers/_base_controller.js.coffee +42 -0
  91. data/spec/dummy/app/assets/javascripts/backbone/base/models/_base_collection.js.coffee +3 -0
  92. data/spec/dummy/app/assets/javascripts/backbone/base/models/_base_model.js.coffee +40 -0
  93. data/spec/dummy/app/assets/javascripts/backbone/base/views/_view.js.coffee +56 -0
  94. data/spec/dummy/app/assets/javascripts/backbone/base/views/collectionview.js.coffee +4 -0
  95. data/spec/dummy/app/assets/javascripts/backbone/base/views/compositeview.js.coffee +4 -0
  96. data/spec/dummy/app/assets/javascripts/backbone/base/views/itemview.js.coffee +3 -0
  97. data/spec/dummy/app/assets/javascripts/backbone/base/views/layout.js.coffee +3 -0
  98. data/spec/dummy/app/assets/javascripts/backbone/before_backbone.js.coffee +2 -0
  99. data/spec/dummy/app/assets/javascripts/backbone/config/config.js.coffee +72 -0
  100. data/spec/dummy/app/assets/javascripts/backbone/config/controllers/loading/loading_controller.js.coffee +55 -0
  101. data/spec/dummy/app/assets/javascripts/backbone/config/controllers/loading/loading_view.js.coffee +30 -0
  102. data/spec/dummy/app/assets/javascripts/backbone/config/models/fetch.js.coffee +11 -0
  103. data/spec/dummy/app/assets/javascripts/backbone/config/models/sync.js.coffee +19 -0
  104. data/spec/dummy/app/assets/javascripts/backbone/routes.js.coffee +14 -0
  105. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  106. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  107. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  108. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  109. data/spec/dummy/app/mailers/.keep +0 -0
  110. data/spec/dummy/app/models/.keep +0 -0
  111. data/spec/dummy/app/models/concerns/.keep +0 -0
  112. data/spec/dummy/app/views/application/index.html.erb +9 -0
  113. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  114. data/spec/dummy/bin/bundle +3 -0
  115. data/spec/dummy/bin/rails +4 -0
  116. data/spec/dummy/bin/rake +4 -0
  117. data/spec/dummy/bin/setup +29 -0
  118. data/spec/dummy/config.ru +4 -0
  119. data/spec/dummy/config/application.rb +30 -0
  120. data/spec/dummy/config/boot.rb +5 -0
  121. data/spec/dummy/config/database.yml +25 -0
  122. data/spec/dummy/config/environment.rb +5 -0
  123. data/spec/dummy/config/environments/development.rb +41 -0
  124. data/spec/dummy/config/environments/production.rb +79 -0
  125. data/spec/dummy/config/environments/test.rb +42 -0
  126. data/spec/dummy/config/initializers/assets.rb +11 -0
  127. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  128. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  129. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  130. data/spec/dummy/config/initializers/inflections.rb +16 -0
  131. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  132. data/spec/dummy/config/initializers/session_store.rb +3 -0
  133. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  134. data/spec/dummy/config/locales/en.yml +23 -0
  135. data/spec/dummy/config/routes.rb +58 -0
  136. data/spec/dummy/config/secrets.yml +22 -0
  137. data/spec/dummy/db/development.sqlite3 +0 -0
  138. data/spec/dummy/lib/assets/.keep +0 -0
  139. data/spec/dummy/public/404.html +67 -0
  140. data/spec/dummy/public/422.html +67 -0
  141. data/spec/dummy/public/500.html +66 -0
  142. data/spec/dummy/public/favicon.ico +0 -0
  143. data/spec/dummy/spec/javascripts/helpers/SpecHelper.coffee +6 -0
  144. data/spec/dummy/spec/javascripts/specs/backbone_install_spec.coffee +78 -0
  145. data/spec/dummy/spec/javascripts/specs/entity_generator_spec.coffee +13 -0
  146. data/spec/dummy/spec/javascripts/specs/view_generator_spec.coffee +44 -0
  147. data/spec/dummy/spec/javascripts/support/jasmine.yml +124 -0
  148. data/spec/dummy/spec/javascripts/support/jasmine_helper.rb +49 -0
  149. data/vendor/assets/javascripts/backbone-syphon.js +469 -0
  150. data/vendor/assets/javascripts/jquery.spin.js +435 -0
  151. metadata +445 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cee686306523c64db40b1b712f7ebfc87833f910
4
+ data.tar.gz: cf5c519441ba9bf8f6fe800dd4da4d55fb1affad
5
+ SHA512:
6
+ metadata.gz: 3bae24d76abf1178d30d37163ed0ec573b9290c4ccfe95041a889df1f5987a09fa3c5d58ed40de1aa97ddd36802a601f82f2e1bbc7c166124217f3802c21d470
7
+ data.tar.gz: 55c3305669b4c8e7c143ffda12cfd6362f0de882b9458d2d6acd0c07155392813e80a70291405ee5ce9ac455566c5efe53edbe25edfb357b31ecfc4370a2025e
@@ -0,0 +1,30 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+
16
+ spec/dummy/.bundle/
17
+ spec/dummy/.yardoc
18
+ spec/dummy/Gemfile.lock
19
+ spec/dummy/_yardoc/
20
+ spec/dummy/coverage/
21
+ spec/dummy/doc/
22
+ spec/dummy/pkg/
23
+ spec/dummy/spec/reports/
24
+ spec/dummy/tmp/
25
+ spec/dummy/*.bundle
26
+ spec/dummy/*.so
27
+ spec/dummy/*.o
28
+ spec/dummy/*.a
29
+ spec/dummy/mkmf.log
30
+ spec/dummy/log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in marionette_rails_generators.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Russkikh Artem
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,71 @@
1
+ # MarionetteRailsGenerators
2
+
3
+ [![Code Climate](https://codeclimate.com/github/itbeaver/marionette_rails_generators/badges/gpa.svg)](https://codeclimate.com/github/itbeaver/marionette_rails_generators)
4
+
5
+ With MarionetteRailsGenerators you can generate entities, controllers, views and scaffold BackboneMarionette app with rails-like structure
6
+ Simply try this!
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'marionette_rails_generators'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Backbone(1.1.2) and Marionette(2.4.1) are loaded from the gem 'backbone-rails' and gem 'marionette-rails' accordingly.
21
+ To install backbone-marionette app, execute:
22
+ ```ruby
23
+ rails generate marionette:install
24
+ ```
25
+
26
+ So now in your `application.js` you can see:
27
+
28
+ ```
29
+ //= require jquery.spin
30
+ //= require underscore
31
+ //= require backbone
32
+ //= require backbone.marionette
33
+ //= require backbone-syphon // For forms serialize and deserialize
34
+
35
+ //= require ./backbone/before_backbone
36
+ //= require ./backbone/app // App initializer
37
+ //= require_tree ./backbone/base // Base views, controller, entity, entitycollection
38
+ //= require_tree ./backbone/config // Configuration (sync method, helper controllers, views and entities)
39
+ //= require_tree ./backbone/app/templates // jst.eco templates
40
+ //= require_tree ./backbone/app/views // View class
41
+ //= require_tree ./backbone/app/models // Entities
42
+ //= require_tree ./backbone/app/controllers // Controllers
43
+ //= require ./backbone/routes // navigate to controller#action (initialize controller with specified action)
44
+ //= require ./backbone/after_backbone
45
+ ```
46
+
47
+ ## Usage
48
+
49
+ After install, start server, at the root you will see welcome page.
50
+
51
+ You can use these generators:
52
+
53
+ `rails generate marionette:scaffold Title [title:string description:text] [options]`
54
+
55
+ `rails generate marionette:model Title [title:string description:text] [options]`
56
+
57
+ `rails generate marionette:view Title Type [title:string description:text] [options]`
58
+
59
+ `rails generate marionette:controller Title [action action] [options]`
60
+
61
+ For more information about command run it in console
62
+
63
+ ## Contributing
64
+
65
+ Feel free to contribute!
66
+
67
+ 1. Fork it ( https://github.com/itbeaver/marionette_rails_generators/fork )
68
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
69
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
70
+ 4. Push to the branch (`git push origin my-new-feature`)
71
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,54 @@
1
+
2
+ # :nodoc:
3
+ class Marionette::Attribute
4
+ include ActionView::Helpers::FormTagHelper
5
+ include ActionView::Context
6
+ attr_accessor :column_name, :type, :field_type
7
+
8
+ def initialize(name, type=nil)
9
+ @column_name = name
10
+ @type = type || :string
11
+ end
12
+
13
+ def password_digest?
14
+ @column_name == 'password' && @type == 'digest'
15
+ end
16
+
17
+ def label_html
18
+ label_tag(column_name.to_sym)
19
+ end
20
+
21
+ def input_html
22
+ eval("#{self.field_type}_tag(:#{self.column_name})")
23
+ end
24
+
25
+ def wrapper(&block)
26
+ output = "<div class=\"field\">\n".html_safe
27
+ output << capture(&block)
28
+ output.safe_concat("\n </div>")
29
+ end
30
+
31
+ def html
32
+ capture do
33
+ wrapper = self.wrapper do
34
+ concat((' '*4 + label_html).html_safe)
35
+ concat "\n"
36
+ concat((' '*4 + input_html).html_safe)
37
+ end
38
+ end
39
+ end
40
+
41
+ def field_type
42
+ @field_type ||= case @type
43
+ when 'integer' then :number_field
44
+ when 'float', 'decimal' then :text_field
45
+ when 'time' then :time_select
46
+ when 'datetime', 'timestamp' then :datetime_select
47
+ when 'date' then :date_select
48
+ when 'text' then :text_area
49
+ when 'boolean' then :check_box
50
+ else
51
+ :text_field
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,57 @@
1
+ require 'generators/marionette/resource_helpers'
2
+
3
+ # :nodoc:
4
+ class Marionette::ControllerGenerator < Rails::Generators::Base
5
+ include Marionette::ResourceHelpers
6
+ desc %(Description:
7
+ Stubs out a new controller. Pass the controller name, either
8
+ CamelCased or under_scored, and a optional list of views as arguments.
9
+
10
+ To create a controller within a module, specify the controller name as a
11
+ path like 'parent_module/controller_name'.
12
+
13
+ This generates a controller class in
14
+ app/assets/javascripts/backbone/app/controllers/
15
+ and invokes view generator if --with-views options is passed.
16
+
17
+ Example:
18
+ `rails generate marionette:controller CreditCards open debit credit close --with-views`
19
+
20
+ CreditCardsController with URLs like /credit_cards/debit at app/assets/javascripts/backbone/
21
+ Controller: .../app/controllers/all/credit_cards_controller.js.coffee
22
+ View: .../app/views/all/credit_cards/debit.js.coffee
23
+ Template: .../app/templates/all/credit_cards/debit.js.eco
24
+ )
25
+
26
+ source_root File.expand_path('../templates', __FILE__)
27
+
28
+ argument :title, type: :string, banner: "Title",
29
+ desc: "controller title"
30
+ argument :actions, type: :array, banner: "ACTION ACTION", default: ['index', 'new', 'show', 'edit'],
31
+ desc: "actions for the resource controller"
32
+ class_option :with_views, type: :boolean, default: false,
33
+ desc: "generate with views"
34
+
35
+ def vars
36
+ @module = 'All'
37
+ if @title =~ /\//
38
+ parse = @title.match /(.*)\/(.*)/
39
+ @title = parse[2]
40
+ @module = parse[1]
41
+ end
42
+ end
43
+
44
+ def generate_view
45
+ @with_views = options[:with_views]
46
+ if @with_views
47
+ template 'app/controllers/controller_with_views.js.coffee',
48
+ "#{backbone_path}/app/controllers/#{@module.underscore}/#{@title.underscore}_controller.js.coffee"
49
+ @actions.each do |act|
50
+ generate 'marionette:view', "#{@title}/#{act}", 'ItemView'
51
+ end
52
+ else
53
+ template 'app/controllers/controller.js.coffee',
54
+ "#{backbone_path}/app/controllers/#{@module.underscore}/#{@title.underscore}_controller.js.coffee"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,12 @@
1
+ @Backbone.app.module "Controllers.<%= @module.split('/').map{ |v| v.camelcase }.join('.') %>", (<%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>, App, Backbone, Marionette, $, _) ->
2
+
3
+ class <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %> extends App.Controllers.Application
4
+ initialize: (args={}) ->
5
+ args.action = '' unless args.action
6
+ switch args.action
7
+ <%- @actions.each do |a| -%>
8
+ when '<%= a %>'
9
+ console.log '<%= a %> action is fired!'
10
+ <%- end -%>
11
+ else
12
+ console.log('Not found')
@@ -0,0 +1,16 @@
1
+ @Backbone.app.module "Controllers.<%= @module.split('/').map{ |v| v.camelcase }.join('.') %>", (<%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>, App, Backbone, Marionette, $, _) ->
2
+
3
+ class <%= @module.split('/').map{ |v| v.camelcase }.last.to_s %>.<%= @title.camelcase %> extends App.Controllers.Application
4
+ initialize: (args={}) ->
5
+ args.action = '' unless args.action
6
+ switch args.action
7
+ <%- @actions.each do |a| -%>
8
+ when '<%= a %>'
9
+ @layout = new App.Views.Layouts.ApplicationLayout
10
+ @listenTo @layout, "show", =>
11
+ <%= a %>View = new App.Views.<%= @title.camelcase %>.<%= a.camelcase %>
12
+ @show <%= a %>View, region: @layout.bodyRegion
13
+ @show @layout
14
+ <%- end -%>
15
+ else
16
+ console.log('Not found')
@@ -0,0 +1,91 @@
1
+ require 'generators/marionette/resource_helpers'
2
+
3
+ # Install generator
4
+ #
5
+ # Example:
6
+ #
7
+ # rails g marionette:install
8
+ class Marionette::InstallGenerator < Rails::Generators::Base
9
+ include Marionette::ResourceHelpers
10
+
11
+ source_root File.expand_path('../templates', __FILE__)
12
+
13
+ def append_vendor_dependencies
14
+ inject_into_file "#{javascript_path}/application.js", before: "//= require_tree ." do %(
15
+ //= require jquery.spin
16
+ //= require underscore
17
+ //= require backbone
18
+ //= require backbone.marionette
19
+ //= require backbone-syphon
20
+
21
+ )
22
+ end
23
+ end
24
+
25
+ def append_app_files
26
+ inject_into_file "#{javascript_path}/application.js", before: "\n//= require_tree ." do %(
27
+ //= require ./backbone/before_backbone
28
+ //= require ./backbone/app
29
+ //= require_tree ./backbone/base
30
+ //= require_tree ./backbone/config
31
+ //= require_tree ./backbone/app/templates
32
+ //= require_tree ./backbone/app/views
33
+ //= require_tree ./backbone/app/models
34
+ //= require_tree ./backbone/app/controllers
35
+ //= require ./backbone/routes
36
+ //= require ./backbone/after_backbone
37
+ )
38
+ end
39
+ end
40
+
41
+ def create_dir_layout
42
+ empty_directory "#{backbone_path}"
43
+ %w(base config app).each { |dir| empty_directory "#{backbone_path}/#{dir}" }
44
+ %w(controllers models views).each { |dir| empty_directory "#{backbone_path}/base/#{dir}" }
45
+ %w(controllers models views).each { |dir| empty_directory "#{backbone_path}/config/#{dir}" }
46
+ %w(templates views models controllers).each { |dir| empty_directory "#{backbone_path}/app/#{dir}" }
47
+ end
48
+
49
+ def create_app_file
50
+ template 'app.js.coffee', "#{backbone_path}/app.js.coffee"
51
+ template 'after_backbone.js.coffee', "#{backbone_path}/after_backbone.js.coffee"
52
+ template 'before_backbone.js.coffee', "#{backbone_path}/before_backbone.js.coffee"
53
+ template 'routes.js.coffee', "#{backbone_path}/routes.js.coffee"
54
+ end
55
+
56
+ def start_marionette_app
57
+ destination = "app/views/#{default_controller}/#{default_action}.html.erb"
58
+ create_file destination unless File.exist? destination
59
+ append_to_file destination do
60
+ embed_template 'index.html.erb'
61
+ end
62
+ end
63
+
64
+ def copy_base
65
+ directory 'base', "#{backbone_path}/base/"
66
+ end
67
+
68
+ def copy_config
69
+ directory 'config', "#{backbone_path}/config/"
70
+ end
71
+
72
+ def add_routes
73
+ route "root '#{default_route}'"
74
+ route "get '*path' => '#{default_route}'"
75
+ end
76
+
77
+ def generate_application_layout
78
+ generate 'marionette:view', 'application', 'Layout'
79
+ end
80
+
81
+ def root_page
82
+ generate 'marionette:controller root index --with-views'
83
+ if File.exist? "#{backbone_path}/routes.js.coffee"
84
+ inject_into_file "#{backbone_path}/routes.js.coffee", after: "console.log 'Hello world!'\n" do <<-'COFFEE'
85
+ new App.Controllers.All.Root(action: 'index')
86
+ COFFEE
87
+ end
88
+ end
89
+ template 'app/templates/index.jst.eco', "#{backbone_path}/app/templates/root/index.jst.eco", force: true
90
+ end
91
+ end
@@ -0,0 +1,8 @@
1
+ $(document).on 'click', 'a:not([data-bypass])', (evt) ->
2
+ href =
3
+ prop: $(this).prop('href')
4
+ attr: $(this).attr('href')
5
+ root = location.protocol + '//' + location.host + Backbone.history.options.root
6
+ if href.prop and href.prop.slice(0, root.length) == root
7
+ evt.preventDefault()
8
+ Backbone.app.navigate href.attr
@@ -0,0 +1,21 @@
1
+ @Backbone.app = do (Backbone, Marionette) ->
2
+
3
+ App = new Marionette.Application
4
+
5
+ App.on "before:start", (options) ->
6
+ if options
7
+ App.environment = options.environment if options.environment
8
+
9
+ App.addRegions
10
+ mainRegion: "#main-region"
11
+
12
+ App.reqres.setHandler "default:region", ->
13
+ App.mainRegion
14
+
15
+ App.on "start", ->
16
+ if @startHistory
17
+ @startHistory()
18
+ else
19
+ Backbone.history.start if Backbone.history
20
+
21
+ App
@@ -0,0 +1,118 @@
1
+ <style media="screen">
2
+ body {
3
+ margin: 0;
4
+ margin-bottom: 25px;
5
+ padding: 0;
6
+ background-color: #f0f0f0;
7
+ font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
8
+ font-size: 13px;
9
+ color: #333;
10
+ }
11
+ h1 {
12
+ font-size: 28px;
13
+ color: #000;
14
+ }
15
+ a {color: #03c}
16
+ a:hover {
17
+ background-color: #03c;
18
+ color: white;
19
+ text-decoration: none;
20
+ }
21
+ #page {
22
+ background-color: #f0f0f0;
23
+ width: 750px;
24
+ margin: 0;
25
+ margin-left: auto;
26
+ margin-right: auto;
27
+ }
28
+ #content {
29
+ float: left;
30
+ background-color: white;
31
+ border: 3px solid #aaa;
32
+ border-top: none;
33
+ padding: 25px;
34
+ width: 675px;
35
+ }
36
+ #footer {
37
+ clear: both;
38
+ }
39
+ #header, #getting-started {
40
+ padding-left: 75px;
41
+ padding-right: 30px;
42
+ }
43
+ #header {
44
+ background-image: url(data:image/png;base64,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);
45
+ background-size: contain;
46
+ background-repeat: no-repeat;
47
+ background-position: top left;
48
+ height: 64px;
49
+ }
50
+ #header h1, #header h2 {margin: 0; margin-bottom: 15px;}
51
+ #header h2 {
52
+ color: #888;
53
+ font-weight: normal;
54
+ font-size: 16px;
55
+ }
56
+ #getting-started {
57
+ border-top: 1px solid #ccc;
58
+ margin-top: 25px;
59
+ padding-top: 15px;
60
+ }
61
+ #getting-started h1 {
62
+ margin: 0;
63
+ font-size: 20px;
64
+ }
65
+ #getting-started h2 {
66
+ margin: 0;
67
+ font-size: 14px;
68
+ font-weight: normal;
69
+ color: #333;
70
+ margin-bottom: 25px;
71
+ }
72
+ #getting-started ol {
73
+ margin-left: 0;
74
+ padding-left: 0;
75
+ }
76
+ #getting-started li {
77
+ font-size: 18px;
78
+ color: #888;
79
+ margin-bottom: 25px;
80
+ }
81
+ #getting-started li h2 {
82
+ margin: 0;
83
+ font-weight: normal;
84
+ font-size: 18px;
85
+ color: #333;
86
+ }
87
+ </style>
88
+
89
+ <div id="page">
90
+
91
+ <div id="content">
92
+ <div id="header">
93
+ <h1>Welcome aboard</h1>
94
+ <h2>You&rsquo;re riding Ruby on Rails with <a href='https://github.com/itbeaver/marionette_rails_generators' target="_blank">MarionetteRailsGenerators</a>!</h2>
95
+ </div>
96
+
97
+ <div id="getting-started">
98
+ <h1>Here&rsquo;s available generators:</h1>
99
+ <p>To get more information about command run it in console</p>
100
+ <ol>
101
+ <li>
102
+ <h2><code>rails generate marionette:scaffold</code></h2>
103
+ </li>
104
+ <li>
105
+ <h2><code>rails generate marionette:controller</code></h2>
106
+ </li>
107
+ <li>
108
+ <h2><code>rails generate marionette:view</code></h2>
109
+ </li>
110
+ <li>
111
+ <h2><code>rails generate marionette:model</code></h2>
112
+ </li>
113
+ </ol>
114
+ </div>
115
+ </div>
116
+
117
+ <div id="footer">&nbsp;</div>
118
+ </div>