marionette_rails_generators 0.1.2

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 (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,104 @@
1
+ module Marionette
2
+ # Resource helpers
3
+ module ResourceHelpers
4
+ def javascript_path
5
+ 'app/assets/javascripts'
6
+ end
7
+
8
+ def backbone_path
9
+ "#{javascript_path}/backbone"
10
+ end
11
+
12
+ def default_action
13
+ 'index'
14
+ end
15
+
16
+ def default_controller
17
+ 'application'
18
+ end
19
+
20
+ def default_route
21
+ "#{default_controller}##{default_action}"
22
+ end
23
+
24
+ def embed_file(source, indent = '')
25
+ IO.read(File.join(self.class.source_root, source)).gsub(/^/, indent)
26
+ end
27
+
28
+ def embed_template(source, indent = '')
29
+ template = File.join(self.class.source_root, source)
30
+ ERB.new(IO.read(template), nil, '-').result(binding).gsub(/^/, indent)
31
+ end
32
+
33
+ def replace_underscore(string)
34
+ string[0] == '_' ? string[1..-1] : string
35
+ end
36
+
37
+ def controller_attr(file, type, attrs)
38
+ sentinel = /when '#{type.to_s}'$/
39
+ in_root do
40
+ inject_into_file "#{backbone_path}/app/controllers/#{file}.js.coffee", " #{attrs}", { after: sentinel, verbose: false }
41
+ end
42
+ end
43
+
44
+ def view_attr(file, attrs)
45
+ sentinel = /extends.*$/
46
+ in_root do
47
+ inject_into_file "#{backbone_path}/app/views/#{file}.js.coffee", "\n#{attrs}", { after: sentinel, verbose: false }
48
+ end
49
+ end
50
+
51
+ def marionette_route(routing_code, type, modul='All')
52
+ sentinel = /appRoutes\:\s*$/
53
+
54
+ route = routing_code
55
+
56
+ case type
57
+ when :index
58
+ route = " \"#{routing_code}(/)\": \"#{routing_code}_index\""
59
+ when :new
60
+ route = " \"#{routing_code}/new(/)\": \"#{routing_code}_new\""
61
+ when :show
62
+ route = " \"#{routing_code}/:id(/)\": \"#{routing_code}_show\""
63
+ when :edit
64
+ route = " \"#{routing_code}/:id/edit(/)\": \"#{routing_code}_edit\""
65
+ end
66
+
67
+ log :marionette_route, route
68
+
69
+ in_root do
70
+ inject_into_file "#{backbone_path}/routes.js.coffee", "\n #{route}", { after: sentinel, verbose: false }
71
+ end
72
+
73
+
74
+ case type
75
+ when :index
76
+ api = %(
77
+ #{routing_code}_index: ->
78
+ new App.Controllers.#{modul}.#{routing_code.camelize}(action: 'index')
79
+ )
80
+ when :new
81
+ api = %(
82
+ #{routing_code}_new: ->
83
+ new App.Controllers.#{modul}.#{routing_code.camelize}(action: 'new')
84
+ )
85
+ when :show
86
+ api = %(
87
+ #{routing_code}_show: (id) ->
88
+ new App.Controllers.#{modul}.#{routing_code.camelize}(id: id, action: 'show')
89
+ )
90
+ when :edit
91
+ api = %(
92
+ #{routing_code}_edit: (id) ->
93
+ new App.Controllers.#{modul}.#{routing_code.camelize}(id: id, action: 'edit')
94
+ )
95
+ end
96
+
97
+ sentinel = /API \=\s*$/
98
+
99
+ in_root do
100
+ inject_into_file "#{backbone_path}/routes.js.coffee", "\n#{api}", { after: sentinel, verbose: false }
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,194 @@
1
+ require 'generators/marionette/resource_helpers'
2
+ require 'generators/marionette/attribute'
3
+
4
+ # :nodoc:
5
+ class Marionette::ScaffoldGenerator < Rails::Generators::Base
6
+ include Marionette::ResourceHelpers
7
+ desc %(Description:
8
+ Scaffolds an entire resource, from model to controller and
9
+ views. The resource is ready to use as a
10
+ starting point for your RESTful, resource-oriented application.
11
+
12
+ Pass the name of the model (in singular form), either CamelCased or
13
+ under_scored, as the first argument, and an optional list of attribute
14
+ pairs.
15
+
16
+ Attributes are field arguments specifying the model's attributes. For instance:
17
+ 'title:string body:text tracking_id:integer' will generate a title field of
18
+ string type, a body with text type and a tracking_id as an integer.
19
+
20
+ You don't have to think up every attribute up front, but it helps to
21
+ sketch out a few so you can start working with the resource immediately.
22
+
23
+ For example, 'scaffold post title body:text published:boolean' gives
24
+ you a model with those three attributes, a controller that handles
25
+ the create/show/update/destroy, forms to create and edit your posts, and
26
+ an index that lists them all, as well as a resources :posts declaration
27
+ in routes.js.coffee.
28
+
29
+ Examples:
30
+ `rails generate marionette:scaffold post title:string body:text published:boolean`
31
+ )
32
+
33
+ source_root File.expand_path('../templates', __FILE__)
34
+
35
+ argument :title, type: :string, required: true, banner: 'Title'
36
+ argument :schema, type: :hash, default: {}, banner: 'title:string description:text'
37
+ class_option :rails, type: :boolean, default: false,
38
+ desc: 'also run (rails generate scaffold Title [title:string description:text]) and wrap resource route to "/api" scope'
39
+ def vars
40
+ @module = 'All'
41
+ if @title =~ /\//
42
+ parse = @title.match /(.*)\/(.*)/
43
+ @title = parse[2]
44
+ @module = parse[1]
45
+ end
46
+ @rails = options[:rails]
47
+ @one = @title.singularize
48
+ @many = @title.pluralize
49
+ @attributes = []
50
+ @schema.each do |a|
51
+ @attributes << Marionette::Attribute.new(a[0], a[1])
52
+ end
53
+ end
54
+
55
+ def scaffold
56
+ generate "marionette:model #{@one.camelcase} #{@schema.map {|a| "#{a[0]}:#{a[1]}"}.join(' ')}"
57
+
58
+ #form
59
+ template 'templates/_form.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/_form.jst.eco"
60
+ #empty
61
+ generate "marionette:view #{@many.underscore}/_empty ItemView --without-template"
62
+ template 'templates/_empty.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/_empty.jst.eco"
63
+ #post
64
+ generate "marionette:view #{@many.underscore}/_#{@one.underscore} ItemView --without-template"
65
+ view_attr @many.underscore + "/_#{@one.underscore}", %(
66
+ tagName: "tr"
67
+ triggers:
68
+ "click .#{@one.underscore}-delete" : "#{@one.underscore}:delete:clicked"
69
+ )
70
+ template 'templates/_post.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/_#{@one.underscore}.jst.eco"
71
+ #edit
72
+ generate "marionette:view #{@many.underscore}/edit CompositeView --without-template"
73
+ view_attr @many.underscore + '/edit', %(
74
+ triggers:
75
+ "click .#{@one.underscore}-save" : "#{@many.underscore}:save:clicked"
76
+
77
+ onShow: ->
78
+ Backbone.Syphon.deserialize(@, @.model.attributes)
79
+ @listenTo @, "#{@many.underscore}:save:clicked", (child, args) ->
80
+ data = Backbone.Syphon.serialize(@)
81
+ #{@one.underscore} = child.model
82
+ #{@one.underscore}.set(data)
83
+ #{@one.underscore}.saveSuccess = (check, und, model, response) ->
84
+ App.navigate '#{@many.underscore}/' + response.id
85
+ #{@one.underscore}.saveError = (check, und, model, response) ->
86
+ console.log response
87
+ alert('error')
88
+ #{@one.underscore}.save()
89
+ )
90
+ template 'templates/edit.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/edit.jst.eco"
91
+ #index
92
+ generate "marionette:view #{@many.underscore}/index CompositeView --without-template"
93
+ view_attr @many.underscore + '/index', %(
94
+ childView: #{@many.camelcase}.#{@one.camelcase}
95
+ emptyView: #{@many.camelcase}.Empty
96
+ childViewContainer: "tbody"
97
+
98
+ onShow: ->
99
+
100
+ @listenTo @, "childview:#{@one.underscore}:delete:clicked", (child, args) ->
101
+ model = args.model
102
+ if confirm "Are you sure you want to delete \#{model.get("name")}?"
103
+ model.destroy()
104
+ )
105
+ template 'templates/index.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/index.jst.eco"
106
+ #new
107
+ generate "marionette:view #{@many.underscore}/new CompositeView --without-template"
108
+ view_attr @many.underscore + '/new', %(
109
+ triggers:
110
+ "click .#{@one.underscore}-create" : "#{@many.underscore}:create:clicked"
111
+
112
+ onShow: ->
113
+ @listenTo @, "#{@many.underscore}:create:clicked", (child, args) ->
114
+ data = Backbone.Syphon.serialize(@)
115
+ #{@one.underscore} = new App.Entities.All.#{@one.camelcase}
116
+ #{@one.underscore}.set(data)
117
+ #{@one.underscore}.saveSuccess = (check, und, model, response) ->
118
+ App.navigate '#{@many.underscore}/' + response.id
119
+ #{@one.underscore}.saveError = (check, und, model, response) ->
120
+ console.log response
121
+ alert('error')
122
+ #{@one.underscore}.save()
123
+ )
124
+ template 'templates/new.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/new.jst.eco"
125
+ #show
126
+ generate "marionette:view #{@many.underscore}/show CompositeView --without-template"
127
+ view_attr @many.underscore + '/show', %(
128
+ triggers:
129
+ "click .#{@one.underscore}-delete" : "#{@one.underscore}:delete:clicked"
130
+
131
+ onShow: ->
132
+ @listenTo @, "#{@one.underscore}:delete:clicked", (child, args) ->
133
+ model = child.model
134
+ if confirm "Are you sure you want to delete \#{model.get("name")}?"
135
+ model.destroy()
136
+ App.navigate '/#{@many.underscore}'
137
+ )
138
+ template 'templates/show.jst.eco', "#{backbone_path}/app/templates/#{@many.underscore}/show.jst.eco"
139
+
140
+ generate "marionette:controller #{@many.underscore}"
141
+ controller_attr @module.underscore + '/' + @many.underscore + '_controller', :index, %(
142
+ #{@many.underscore} = new App.Entities.All.#{@one.camelcase}Collection
143
+ #{@many.underscore}.fetch
144
+ reset: true
145
+ @layout = new App.Views.Layouts.ApplicationLayout
146
+ @listenTo @layout, "show", =>
147
+ indexView = new App.Views.#{@many.camelcase}.Index(collection: #{@many.underscore})
148
+ @show indexView, region: @layout.bodyRegion, loading: true
149
+ @show @layout, loading: false
150
+ )
151
+ controller_attr @module.underscore + '/' + @many.underscore + '_controller', :new, %(
152
+ @layout = new App.Views.Layouts.ApplicationLayout
153
+ @listenTo @layout, "show", =>
154
+ newView = new App.Views.#{@many.camelcase}.New
155
+ @show newView, region: @layout.bodyRegion, loading: true
156
+ @show @layout, loading: false
157
+ )
158
+ controller_attr @module.underscore + '/' + @many.underscore + '_controller', :show, %(
159
+ #{@one.underscore} = new App.Entities.All.#{@one.camelcase} id: args.id
160
+ #{@one.underscore}.fetch
161
+ reset: true
162
+ @layout = new App.Views.Layouts.ApplicationLayout
163
+ @listenTo @layout, "show", =>
164
+ showView = new App.Views.#{@many.camelcase}.Show(model: #{@one.underscore})
165
+ @show showView, region: @layout.bodyRegion, loading: true
166
+ @show @layout, loading: false
167
+ )
168
+ controller_attr @module.underscore + '/' + @many.underscore + '_controller', :edit, %(
169
+ #{@one.underscore} = new App.Entities.All.#{@one.camelcase} id: args.id
170
+ #{@one.underscore}.fetch
171
+ reset: true
172
+ @layout = new App.Views.Layouts.ApplicationLayout
173
+ @listenTo @layout, "show", =>
174
+ editView = new App.Views.#{@many.camelcase}.Edit(model: #{@one.underscore})
175
+ @show editView, region: @layout.bodyRegion, loading: true
176
+ @show @layout, loading: false
177
+ )
178
+ marionette_route(@many.underscore, :edit)
179
+ marionette_route(@many.underscore, :show)
180
+ marionette_route(@many.underscore, :new)
181
+ marionette_route(@many.underscore, :index)
182
+
183
+ if @rails
184
+ generate "scaffold #{@one.camelcase} #{@schema.map {|a| "#{a[0]}:#{a[1]}"}.join(' ')}"
185
+ gsub_file 'config/routes.rb', "\n resources :#{@many.underscore}" do |match|
186
+ %(
187
+ scope :api, constraints: { format: 'json' } do
188
+ resources :#{@many.underscore}
189
+ end
190
+ )
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,6 @@
1
+ <form action="" method="post">
2
+ <%- @attributes.each do |a| -%>
3
+ <%= a.html %>
4
+
5
+ <%- end -%>
6
+ </form>
@@ -0,0 +1,6 @@
1
+ <% @schema.each do |a| %>
2
+ <td><%%= @<%= a[0] %> %></td>
3
+ <% end %>
4
+ <td><a href="/<%= @many.underscore %>/<%%= @id %>/" class="<%= @one.underscore %>-show">Show</a></td>
5
+ <td><a href="/<%= @many.underscore %>/<%%= @id %>/edit/" class="<%= @one.underscore %>-edit">Edit</a></td>
6
+ <td><a href="" class="<%= @one.underscore %>-delete">Delete</a> </td>
@@ -0,0 +1,6 @@
1
+ <h1>Editing <%= @one.underscore %></h1>
2
+
3
+ <%%- @render_partial '<%= @many.underscore %>/form' %>
4
+
5
+ <a href="" class="<%= @one.underscore %>-save">Save</a>
6
+ <a href="/<%= @many.underscore %>">Back</a>
@@ -0,0 +1,19 @@
1
+ <h1>Listing <%= @many.underscore %></h1>
2
+
3
+ <table cellspacing="0" cellpadding="0">
4
+ <thead>
5
+ <tr>
6
+ <%- @schema.each do |a| -%>
7
+ <td><%= a[0].camelcase %></td>
8
+ <%- end -%>
9
+ <th colspan="3"></th>
10
+ </tr>
11
+ </thead>
12
+
13
+ <tbody>
14
+ </tbody>
15
+ </table>
16
+
17
+ <br>
18
+
19
+ <a href="/<%= @many.underscore %>/new" class="<%= @one.underscore %>-new">New <%= @one.camelcase %></a>
@@ -0,0 +1,6 @@
1
+ <h1>New <%= @one.underscore %></h1>
2
+
3
+ <%%- @render_partial '<%= @many.underscore %>/form' %>
4
+
5
+ <a href="" class="<%= @one.underscore %>-create">Save</a>
6
+ <a href="/<%= @many.underscore %>">Back</a>
@@ -0,0 +1,10 @@
1
+ <% @schema.each do |a| %>
2
+ <p>
3
+ <strong><%= a[0].camelcase %>: </strong>
4
+ <%%= @<%= a[0] %> %>
5
+ </p>
6
+ <% end %>
7
+
8
+ <p><a href="/<%= @many.underscore %>/<%%= @id %>/edit" class="<%= @one.underscore %>-edit">Edit</a></p>
9
+ <p><a href="" class="<%= @one.underscore %>-delete">Delete</a></p>
10
+ <a href="/<%= @many.underscore %>">Back</a>
@@ -0,0 +1 @@
1
+ <p>Find me in app/templates/<%= @module.underscore %>/<%= @titletemplate.underscore %>.jst.eco</p>
@@ -0,0 +1 @@
1
+ <p>Find me in app/templates/<%= @module.underscore %>/<%= @titletemplate.underscore %>.jst.eco</p>
@@ -0,0 +1,10 @@
1
+ <%- if @attributes.blank? -%>
2
+ <p>Find me in app/templates/<%= @module.underscore %>/<%= @titletemplate.underscore %>.jst.eco</p>
3
+ <%- else -%>
4
+ <form action="" method="post">
5
+ <%- @attributes.each do |a| -%>
6
+ <%= a.html %>
7
+
8
+ <%- end -%>
9
+ </form>
10
+ <%- end -%>
@@ -0,0 +1,4 @@
1
+ @Backbone.app.module "Views.<%= @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.Views.CollectionView
4
+ template: '<%= @module.underscore %>/<%= @titletemplate.underscore %>'
@@ -0,0 +1,4 @@
1
+ @Backbone.app.module "Views.<%= @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.Views.CompositeView
4
+ template: '<%= @module.underscore %>/<%= @titletemplate.underscore %>'
@@ -0,0 +1,7 @@
1
+ @Backbone.app.module "Views.<%= @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.Views.ItemView
4
+ template: '<%= @module.underscore %>/<%= @titletemplate.underscore %>'
5
+
6
+
7
+
@@ -0,0 +1,112 @@
1
+ require 'generators/marionette/resource_helpers'
2
+ require 'generators/marionette/attribute'
3
+
4
+ # :nodoc:
5
+ class Marionette::ViewGenerator < Rails::Generators::Base
6
+ include Marionette::ResourceHelpers
7
+ include ActionView::Helpers::FormTagHelper
8
+ desc %(Description:
9
+ Stubs out a new view. Pass the view name, either
10
+ CamelCased or under_scored, and a type of view as argument.
11
+
12
+ Pass an optional list of attribute pairs as arguments for
13
+ filling template with form.
14
+
15
+ To create a view within a module, specify the view name as a
16
+ path like 'parent_module/view_name'.
17
+
18
+ This generates a view class in app/assets/javascripts/backbone/app/views
19
+ and template in app/assets/javascripts/backbone/app/templates folder.
20
+
21
+ Type may take the following values: partial, Layout,
22
+ ItemView, CollectionView, CompositeView
23
+
24
+ Layouts views appends to
25
+ app/assets/javascripts/backbone/app/views/layouts/layouts.js.coffee
26
+
27
+ Example:
28
+ rails g marionette:view index ItemView title:string description:text
29
+ generates ItemView 'Backbone.app.Views.All.Index'
30
+ and template filled with form
31
+ rails g marionette:view posts/index ItemView title:string description:text
32
+ generates ItemView 'Backbone.app.Views.Posts.Index'
33
+ and template filled with form
34
+ rails g marionette:view blogs/posts/index ItemView
35
+ generates ItemView 'Backbone.app.Views.Blogs.Posts.Index'
36
+ and stub template
37
+ )
38
+
39
+ source_root File.expand_path('../templates', __FILE__)
40
+
41
+ argument :title, type: :string
42
+ argument :type, type: :string
43
+ argument :schema, type: :hash, default: {}, banner: 'title:string description:text'
44
+ class_option 'without-template', type: :boolean, default: false, desc: 'generate View without template'
45
+
46
+ def vars
47
+ @module = 'All'
48
+ if @title =~ /\//
49
+ parse = @title.match /(.*)\/(.*)/
50
+ @title = parse[2]
51
+ @module = parse[1]
52
+ end
53
+ @withouttempl = options['without-template']
54
+ @partial = false
55
+ @partial = true if type == 'partial'
56
+ @titletemplate = @title
57
+ @titletemplate = '_' + @titletemplate if @partial
58
+ @attributes = []
59
+ @schema.each do |a|
60
+ @attributes << Marionette::Attribute.new(a[0], a[1])
61
+ end
62
+ end
63
+
64
+ def layout
65
+ @begin_layout = "@Backbone.app.module \"Views.Layouts\", (Layouts, App, Backbone, Marionette, $, _) ->\n"
66
+ @layout = %(
67
+ class Layouts.#{@title.camelcase}Layout extends App.Views.Layout
68
+ template: 'layouts/#{@titletemplate.underscore}'
69
+ regions:
70
+ bodyRegion: "#body"
71
+ )
72
+ @layout = @begin_layout + @layout
73
+ end
74
+
75
+ def generate_view
76
+ case type
77
+ when 'layout', 'Layout'
78
+ unless @partial
79
+ if File.exist?("#{backbone_path}/app/views/layouts/layouts.js.coffee")
80
+ append_file "#{backbone_path}/app/views/layouts/layouts.js.coffee", @layout.gsub(@begin_layout, '')
81
+ else
82
+ create_file "#{backbone_path}/app/views/layouts/layouts.js.coffee", @layout
83
+ end
84
+ end
85
+ template 'app/templates/layouts/application.jst.eco',
86
+ "#{backbone_path}/app/templates/layouts/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
87
+ when 'item_view', 'ItemView', 'partial'
88
+ unless @partial
89
+ template 'app/views/item_view.js.coffee',
90
+ "#{backbone_path}/app/views/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
91
+ end
92
+ template 'app/templates/item_view.jst.eco',
93
+ "#{backbone_path}/app/templates/#{ @module.underscore }/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
94
+ when 'collection_view', 'CollectionView'
95
+ unless @partial
96
+ template 'app/views/collection_view.js.coffee',
97
+ "#{backbone_path}/app/views/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
98
+ end
99
+ template 'app/templates/collection_view.jst.eco',
100
+ "#{backbone_path}/app/templates/#{ @module.underscore }/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
101
+ when 'composite_view', 'CompositeView'
102
+ unless @partial
103
+ template 'app/views/composite_view.js.coffee',
104
+ "#{backbone_path}/app/views/#{ @module.underscore }/#{ @title.underscore }.js.coffee"
105
+ end
106
+ template 'app/templates/composite_view.jst.eco',
107
+ "#{backbone_path}/app/templates/#{ @module.underscore }/#{ @titletemplate.underscore }.jst.eco" unless @withouttempl
108
+ else
109
+ puts "Type [#{type}] didn't supported. Feel free to submit issue https://github.com/itbeaver/marionette_rails_generators/issues"
110
+ end
111
+ end
112
+ end