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,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