somatics3 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. data/.document +5 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +91 -0
  4. data/Rakefile +72 -0
  5. data/VERSION +1 -0
  6. data/bin/somatics +23 -0
  7. data/bin/somatify +21 -0
  8. data/lib/generators/somatics.rb +37 -0
  9. data/lib/generators/somatics/associated/associated_generator.rb +184 -0
  10. data/lib/generators/somatics/associated/templates/migration.rb +11 -0
  11. data/lib/generators/somatics/attributes/attributes_generator.rb +115 -0
  12. data/lib/generators/somatics/attributes/templates/migration.rb +11 -0
  13. data/lib/generators/somatics/authenticated/authenticated_generator.rb +65 -0
  14. data/lib/generators/somatics/authenticated/templates/partial_form.html.erb +23 -0
  15. data/lib/generators/somatics/authenticated_controller/authenticated_controller_generator.rb +38 -0
  16. data/lib/generators/somatics/authenticated_controller/templates/locales_en.yml +6 -0
  17. data/lib/generators/somatics/authenticated_controller/templates/locales_zh-TW.yml +6 -0
  18. data/lib/generators/somatics/authenticated_controller/templates/login.html.erb +31 -0
  19. data/lib/generators/somatics/authenticated_controller/templates/sessions_controller.rb +11 -0
  20. data/lib/generators/somatics/helper/helper_generator.rb +16 -0
  21. data/lib/generators/somatics/install/install_generator.rb +101 -0
  22. data/lib/generators/somatics/install/templates/config/locales/devise_zh-TW.yml +39 -0
  23. data/lib/generators/somatics/install/templates/config/locales/somatics_en.yml +35 -0
  24. data/lib/generators/somatics/install/templates/config/locales/somatics_zh-TW.yml +35 -0
  25. data/lib/generators/somatics/install/templates/controller_admin.rb +17 -0
  26. data/lib/generators/somatics/install/templates/controller_home.rb +4 -0
  27. data/lib/generators/somatics/install/templates/helper_admin.rb +99 -0
  28. data/lib/generators/somatics/install/templates/initializer_paper_trail.rb +2 -0
  29. data/lib/generators/somatics/install/templates/layout_admin.html.erb +87 -0
  30. data/lib/generators/somatics/install/templates/lib/active_record/diff.rb +61 -0
  31. data/lib/generators/somatics/install/templates/lib/somatic_link_renderer.rb +24 -0
  32. data/lib/generators/somatics/install/templates/lib/tasks/heroku.rake +30 -0
  33. data/lib/generators/somatics/install/templates/lib/tasks/svn.rake +47 -0
  34. data/lib/generators/somatics/install/templates/partial_menu.html.erb +1 -0
  35. data/lib/generators/somatics/install/templates/partial_versions.html.erb +56 -0
  36. data/lib/generators/somatics/install/templates/public/images/somatics/add.png +0 -0
  37. data/lib/generators/somatics/install/templates/public/images/somatics/arrow_collapsed.png +0 -0
  38. data/lib/generators/somatics/install/templates/public/images/somatics/arrow_expanded.png +0 -0
  39. data/lib/generators/somatics/install/templates/public/images/somatics/attachment.png +0 -0
  40. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_arrow_left.png +0 -0
  41. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_arrow_right.png +0 -0
  42. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_diamond.png +0 -0
  43. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_end.png +0 -0
  44. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_go.png +0 -0
  45. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_toggle_minus.png +0 -0
  46. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_toggle_plus.png +0 -0
  47. data/lib/generators/somatics/install/templates/public/images/somatics/c.png +0 -0
  48. data/lib/generators/somatics/install/templates/public/images/somatics/cancel.png +0 -0
  49. data/lib/generators/somatics/install/templates/public/images/somatics/changeset.png +0 -0
  50. data/lib/generators/somatics/install/templates/public/images/somatics/comment.png +0 -0
  51. data/lib/generators/somatics/install/templates/public/images/somatics/comments.png +0 -0
  52. data/lib/generators/somatics/install/templates/public/images/somatics/content-left.png +0 -0
  53. data/lib/generators/somatics/install/templates/public/images/somatics/content-right.png +0 -0
  54. data/lib/generators/somatics/install/templates/public/images/somatics/copy.png +0 -0
  55. data/lib/generators/somatics/install/templates/public/images/somatics/csharp.png +0 -0
  56. data/lib/generators/somatics/install/templates/public/images/somatics/database_key.png +0 -0
  57. data/lib/generators/somatics/install/templates/public/images/somatics/default.png +0 -0
  58. data/lib/generators/somatics/install/templates/public/images/somatics/delete.png +0 -0
  59. data/lib/generators/somatics/install/templates/public/images/somatics/document.png +0 -0
  60. data/lib/generators/somatics/install/templates/public/images/somatics/draft.png +0 -0
  61. data/lib/generators/somatics/install/templates/public/images/somatics/duplicate.png +0 -0
  62. data/lib/generators/somatics/install/templates/public/images/somatics/edit.png +0 -0
  63. data/lib/generators/somatics/install/templates/public/images/somatics/exclamation.png +0 -0
  64. data/lib/generators/somatics/install/templates/public/images/somatics/external.png +0 -0
  65. data/lib/generators/somatics/install/templates/public/images/somatics/fav.png +0 -0
  66. data/lib/generators/somatics/install/templates/public/images/somatics/fav_off.png +0 -0
  67. data/lib/generators/somatics/install/templates/public/images/somatics/feed.png +0 -0
  68. data/lib/generators/somatics/install/templates/public/images/somatics/folder.png +0 -0
  69. data/lib/generators/somatics/install/templates/public/images/somatics/folder_open.png +0 -0
  70. data/lib/generators/somatics/install/templates/public/images/somatics/footer-bg.png +0 -0
  71. data/lib/generators/somatics/install/templates/public/images/somatics/footer-left.png +0 -0
  72. data/lib/generators/somatics/install/templates/public/images/somatics/footer-right.png +0 -0
  73. data/lib/generators/somatics/install/templates/public/images/somatics/group.png +0 -0
  74. data/lib/generators/somatics/install/templates/public/images/somatics/help.png +0 -0
  75. data/lib/generators/somatics/install/templates/public/images/somatics/history.png +0 -0
  76. data/lib/generators/somatics/install/templates/public/images/somatics/image.png +0 -0
  77. data/lib/generators/somatics/install/templates/public/images/somatics/lightning.png +0 -0
  78. data/lib/generators/somatics/install/templates/public/images/somatics/link.png +0 -0
  79. data/lib/generators/somatics/install/templates/public/images/somatics/loading.gif +0 -0
  80. data/lib/generators/somatics/install/templates/public/images/somatics/locked.png +0 -0
  81. data/lib/generators/somatics/install/templates/public/images/somatics/message.png +0 -0
  82. data/lib/generators/somatics/install/templates/public/images/somatics/milestone.png +0 -0
  83. data/lib/generators/somatics/install/templates/public/images/somatics/move.png +0 -0
  84. data/lib/generators/somatics/install/templates/public/images/somatics/news.png +0 -0
  85. data/lib/generators/somatics/install/templates/public/images/somatics/openid-bg.gif +0 -0
  86. data/lib/generators/somatics/install/templates/public/images/somatics/package.png +0 -0
  87. data/lib/generators/somatics/install/templates/public/images/somatics/pdf.png +0 -0
  88. data/lib/generators/somatics/install/templates/public/images/somatics/php.png +0 -0
  89. data/lib/generators/somatics/install/templates/public/images/somatics/plugin.png +0 -0
  90. data/lib/generators/somatics/install/templates/public/images/somatics/projects.png +0 -0
  91. data/lib/generators/somatics/install/templates/public/images/somatics/rails.png +0 -0
  92. data/lib/generators/somatics/install/templates/public/images/somatics/reload.png +0 -0
  93. data/lib/generators/somatics/install/templates/public/images/somatics/report.png +0 -0
  94. data/lib/generators/somatics/install/templates/public/images/somatics/ruby.png +0 -0
  95. data/lib/generators/somatics/install/templates/public/images/somatics/save.png +0 -0
  96. data/lib/generators/somatics/install/templates/public/images/somatics/sort_asc.png +0 -0
  97. data/lib/generators/somatics/install/templates/public/images/somatics/sort_desc.png +0 -0
  98. data/lib/generators/somatics/install/templates/public/images/somatics/stats.png +0 -0
  99. data/lib/generators/somatics/install/templates/public/images/somatics/table_multiple.png +0 -0
  100. data/lib/generators/somatics/install/templates/public/images/somatics/task_done.png +0 -0
  101. data/lib/generators/somatics/install/templates/public/images/somatics/task_late.png +0 -0
  102. data/lib/generators/somatics/install/templates/public/images/somatics/task_parent_end.png +0 -0
  103. data/lib/generators/somatics/install/templates/public/images/somatics/task_todo.png +0 -0
  104. data/lib/generators/somatics/install/templates/public/images/somatics/text.png +0 -0
  105. data/lib/generators/somatics/install/templates/public/images/somatics/text_list_bullets.png +0 -0
  106. data/lib/generators/somatics/install/templates/public/images/somatics/textfield.png +0 -0
  107. data/lib/generators/somatics/install/templates/public/images/somatics/ticket.png +0 -0
  108. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_checked.png +0 -0
  109. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_edit.png +0 -0
  110. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_go.png +0 -0
  111. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_note.png +0 -0
  112. data/lib/generators/somatics/install/templates/public/images/somatics/time.png +0 -0
  113. data/lib/generators/somatics/install/templates/public/images/somatics/time_add.png +0 -0
  114. data/lib/generators/somatics/install/templates/public/images/somatics/toggle_check.png +0 -0
  115. data/lib/generators/somatics/install/templates/public/images/somatics/true.png +0 -0
  116. data/lib/generators/somatics/install/templates/public/images/somatics/unlock.png +0 -0
  117. data/lib/generators/somatics/install/templates/public/images/somatics/user.png +0 -0
  118. data/lib/generators/somatics/install/templates/public/images/somatics/warning.png +0 -0
  119. data/lib/generators/somatics/install/templates/public/images/somatics/wiki_edit.png +0 -0
  120. data/lib/generators/somatics/install/templates/public/images/somatics/xml.png +0 -0
  121. data/lib/generators/somatics/install/templates/public/images/somatics/zip.png +0 -0
  122. data/lib/generators/somatics/install/templates/public/images/somatics/zoom_in.png +0 -0
  123. data/lib/generators/somatics/install/templates/public/javascripts/somatics/base.js +237 -0
  124. data/lib/generators/somatics/install/templates/public/javascripts/somatics/context_menu.js +237 -0
  125. data/lib/generators/somatics/install/templates/public/javascripts/somatics/controls.js +965 -0
  126. data/lib/generators/somatics/install/templates/public/javascripts/somatics/dragdrop.js +974 -0
  127. data/lib/generators/somatics/install/templates/public/javascripts/somatics/effects.js +1123 -0
  128. data/lib/generators/somatics/install/templates/public/javascripts/somatics/prototype.js +6001 -0
  129. data/lib/generators/somatics/install/templates/public/javascripts/somatics/rails.js +175 -0
  130. data/lib/generators/somatics/install/templates/public/javascripts/somatics/select_list_move.js +82 -0
  131. data/lib/generators/somatics/install/templates/public/stylesheets/application.css +863 -0
  132. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/base.css +951 -0
  133. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/context_menu.css +52 -0
  134. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/csshover.htc +122 -0
  135. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/jstoolbar.css +95 -0
  136. data/lib/generators/somatics/install/templates/public/themes/default/stylesheets/application.css +951 -0
  137. data/lib/generators/somatics/install/templates/view_index.html.erb +46 -0
  138. data/lib/generators/somatics/relationship/relationship_generator.rb +173 -0
  139. data/lib/generators/somatics/relationship/templates/migration.rb +11 -0
  140. data/lib/generators/somatics/scaffold/scaffold_generator.rb +24 -0
  141. data/lib/generators/somatics/scaffold/templates/_form.html.erb +23 -0
  142. data/lib/generators/somatics/scaffold/templates/edit.html.erb +6 -0
  143. data/lib/generators/somatics/scaffold/templates/index.html.erb +27 -0
  144. data/lib/generators/somatics/scaffold/templates/new.html.erb +5 -0
  145. data/lib/generators/somatics/scaffold/templates/show.html.erb +12 -0
  146. data/lib/generators/somatics/scaffold_controller/USAGE +20 -0
  147. data/lib/generators/somatics/scaffold_controller/scaffold_controller_generator.rb +108 -0
  148. data/lib/generators/somatics/scaffold_controller/templates/builder_index.xls.builder +24 -0
  149. data/lib/generators/somatics/scaffold_controller/templates/builder_index.xml.builder +10 -0
  150. data/lib/generators/somatics/scaffold_controller/templates/controller.rb +123 -0
  151. data/lib/generators/somatics/scaffold_controller/templates/locales_en.yml +17 -0
  152. data/lib/generators/somatics/scaffold_controller/templates/locales_zh-TW.yml +20 -0
  153. data/lib/generators/somatics/scaffold_controller/templates/partial_bulk.html.erb +12 -0
  154. data/lib/generators/somatics/scaffold_controller/templates/partial_edit.html.erb +7 -0
  155. data/lib/generators/somatics/scaffold_controller/templates/partial_form.html.erb +13 -0
  156. data/lib/generators/somatics/scaffold_controller/templates/partial_list.html.erb +30 -0
  157. data/lib/generators/somatics/scaffold_controller/templates/partial_menu.html.erb +1 -0
  158. data/lib/generators/somatics/scaffold_controller/templates/partial_show.html.erb +31 -0
  159. data/lib/generators/somatics/scaffold_controller/templates/view_edit.html.erb +24 -0
  160. data/lib/generators/somatics/scaffold_controller/templates/view_index.html.erb +27 -0
  161. data/lib/generators/somatics/scaffold_controller/templates/view_new.html.erb +14 -0
  162. data/lib/generators/somatics/scaffold_controller/templates/view_show.html.erb +26 -0
  163. data/lib/generators/somatics/settings/settings_generator.rb +86 -0
  164. data/lib/generators/somatics/settings_controller/USAGE +20 -0
  165. data/lib/generators/somatics/settings_controller/settings_controller_generator.rb +11 -0
  166. data/lib/generators/somatics/settings_controller/templates/builder_index.xls.builder +24 -0
  167. data/lib/generators/somatics/settings_controller/templates/builder_index.xml.builder +10 -0
  168. data/lib/generators/somatics/settings_controller/templates/controller.rb +64 -0
  169. data/lib/generators/somatics/settings_controller/templates/helper.rb +2 -0
  170. data/lib/generators/somatics/settings_controller/templates/locales_en.yml +9 -0
  171. data/lib/generators/somatics/settings_controller/templates/locales_zh-TW.yml +28 -0
  172. data/lib/generators/somatics/settings_controller/templates/migration.rb +17 -0
  173. data/lib/generators/somatics/settings_controller/templates/partial_bulk.html.erb +12 -0
  174. data/lib/generators/somatics/settings_controller/templates/partial_edit.html.erb +7 -0
  175. data/lib/generators/somatics/settings_controller/templates/partial_form.html.erb +15 -0
  176. data/lib/generators/somatics/settings_controller/templates/partial_list.html.erb +28 -0
  177. data/lib/generators/somatics/settings_controller/templates/partial_menu.html.erb +1 -0
  178. data/lib/generators/somatics/settings_controller/templates/partial_show.html.erb +13 -0
  179. data/lib/generators/somatics/settings_controller/templates/view_edit.html.erb +23 -0
  180. data/lib/generators/somatics/settings_controller/templates/view_index.html.erb +22 -0
  181. data/lib/generators/somatics/settings_controller/templates/view_new.html.erb +14 -0
  182. data/lib/generators/somatics/settings_controller/templates/view_show.html.erb +23 -0
  183. data/lib/somatics.rb +9 -0
  184. data/somatics.gemspec +249 -0
  185. data/somatics3.gemspec +248 -0
  186. data/templates/somatics.rb +106 -0
  187. data/test/helper.rb +10 -0
  188. data/test/test_somatics3-generators.rb +7 -0
  189. metadata +398 -0
@@ -0,0 +1,46 @@
1
+ <h2><%%= t('Overview') %></h2>
2
+ <div id="activity">
3
+ <%% [Date.today, Date.yesterday, 2.days.ago.to_date].each do |day|%>
4
+ <h3><%%= date_to_words day %></h3>
5
+ <dl>
6
+ <%% (versions = Version.where(:created_at => day.beginning_of_day..day.end_of_day ).order('created_at desc')).each do |version|%>
7
+ <dt class="issue-closed me">
8
+ <img class="gravatar" alt="" width="24" height="24" src="http://www.gravatar.com/avatar/<%%=Digest::MD5::hexdigest((User.find(version.whodunnit.to_i).email rescue ''))%>?rating=PG&amp;size=24">
9
+ <span class="time"><%%=version.created_at.to_s(:db)%></span>
10
+ <%% description = "" %>
11
+ <%% [:name,:title,:label].each do |d|
12
+ description = version.item.send(d) if version.item.respond_to? d
13
+ end
14
+ %>
15
+ <%%= link_to "#{version.item.class.model_name.human} ##{version.item.id} - #{description}", [:admin, version.item]%>
16
+ </dt>
17
+ <dd>
18
+ <span class="description">
19
+ <%% if version.event == 'create'%>
20
+ Initial Create
21
+ <%% else %>
22
+ <%% unless version.next.nil? %>
23
+ <%% version.reify.diff(version.next.reify).each do |t| %>
24
+ <%% unless t.first == :updated_at %>
25
+ <p>"<b><%%= t.first.to_s.humanize %></b>" was changed from "<b><%%= t.last.first.to_s rescue '' %></b>" to "<b><%%= t.last.last.to_s rescue '' %></b>"</p>
26
+ <%% end %>
27
+ <%% end rescue 'Undetermined Changes'%>
28
+ <%% else %>
29
+ <%% version.reify.diff(obj).each do |t| %>
30
+ <%% unless t.first == :updated_at %>
31
+ <p>"<b><%%= t.first.to_s.humanize %></b>" was changed from "<b><%%= t.last.first.to_s rescue '' %></b>" to "<b><%%= t.last.last.to_s rescue '' %></b>"</p>
32
+ <%% end %>
33
+ <%% end rescue 'Undetermined Changes'%>
34
+ <%% end %>
35
+ <%% end %></span>
36
+ <span class="author"><%%=User.find(version.whodunnit.to_i).name rescue 'Unknown'%></span>
37
+ </dd>
38
+ <%% end %>
39
+ <%% if versions.blank?%>
40
+ No Changes in <%%= day %>
41
+ <%% end %>
42
+ </dl>
43
+ <%% end %>
44
+
45
+ </div>
46
+ <div style="clear:both;"></div>
@@ -0,0 +1,173 @@
1
+ require 'generators/somatics'
2
+ require 'rails/generators/named_base'
3
+ require 'rails/generators/migration'
4
+
5
+ module Somatics
6
+ module Generators
7
+ class RelationshipGenerator < Rails::Generators::NamedBase
8
+ extend TemplatePath
9
+ include Rails::Generators::Migration
10
+ # include Rails::Generators::ResourceHelpers
11
+ class_option :skip_migration, :type => :boolean, :desc => "Don't generate a migration file for this model."
12
+ class_option :namespace, :banner => "NAME", :type => :string, :default => 'admin'
13
+
14
+ def dump_generator_attribute_names
15
+ generator_attribute_names = [
16
+ :name,
17
+ :singular_name,
18
+ :human_name,
19
+ :plural_name,
20
+ :relationship,
21
+ :model_name,
22
+ :class_name,
23
+ :reference_model_name,
24
+ :reference_class_name,
25
+ :reference_value,
26
+ :migration_model_name,
27
+ :migration_table_name,
28
+ :migration_attribute ,
29
+ :table_name
30
+
31
+ ]
32
+
33
+ generator_attribute_names.each do |attr|
34
+ puts "%-40s %s" % ["#{attr}:", self.send(attr.to_s)] # instance_variable_get("@#{attr.to_s}"
35
+ end
36
+
37
+ end
38
+
39
+ def add_relationship_to_model
40
+ relation = " has_many :#{reference_value}\n"
41
+ # sentinel = "class #{class_name} < ActiveRecord::Base\n"
42
+ inject_into_class "app/models/#{model_name}.rb", class_name, relation
43
+
44
+ relation = " belongs_to :#{model_name}\n"
45
+ # sentinel = "class #{reference_class_name} < ActiveRecord::Base\n"
46
+ inject_into_class "app/models/#{reference_model_name}.rb",reference_class_name, relation
47
+
48
+ end
49
+
50
+ def add_show_view_to_model_show
51
+ sentinel = "<!-- More List View -->\n"
52
+ reference_list = <<-CODE
53
+ <% if @#{reference_model_name}.#{model_name} %>
54
+ <h3><%=link_to "\#{#{class_name}.model_name.human} #\#{@#{reference_model_name}.#{model_name}.id}", [:admin, @#{reference_model_name}.#{model_name}] %></h3>
55
+ <div class="issue detail">
56
+ <%= render :partial => 'admin/#{model_name.pluralize}/show' , :locals => {:#{model_name} => @#{reference_model_name}.#{model_name}} %>
57
+ </div>
58
+ <% end %>
59
+ CODE
60
+ inject_into_file File.join('app/views',options[:namespace], reference_model_name.pluralize, 'show.html.erb'), :after => sentinel do
61
+ "#{reference_list}"
62
+ end
63
+
64
+ inject_into_file File.join('app/views',options[:namespace], reference_model_name.pluralize, 'edit.html.erb'), :after => sentinel do
65
+ "#{reference_list}"
66
+ end
67
+ end
68
+
69
+ def add_list_view_to_model_show
70
+ sentinel = "<!-- More List View -->\n"
71
+ reference_list = <<-CODE
72
+ <div class="contextual">
73
+ <%= link_to "\#{t 'Add'} \#{#{reference_class_name}.model_name.human}", '#', :class => "icon icon-add", :onclick => "showAndScrollTo('add_#{reference_model_name}','focus_#{reference_model_name}'); return false;"%>
74
+ </div>
75
+ <h3><%=#{reference_class_name}.model_name.human%></h3>
76
+ <% @#{reference_value} = @#{model_name}.#{reference_value}.paginate(:page => params[:#{reference_model_name}_page], :order => (params[:#{reference_model_name}_sort].gsub('_reverse', ' DESC') unless params[:#{reference_model_name}_sort].blank?))%>
77
+ <div class="autoscroll">
78
+ <%= render :partial => 'admin/#{reference_value}/list', :locals => {:#{reference_value} => @#{reference_value}} %>
79
+ </div>
80
+ <%= will_paginate @#{reference_value}, :renderer => SomaticLinkRenderer %>
81
+ <div id="add_#{reference_model_name}" style="display:none">
82
+ <h3><%= "\#{t('New')} \#{#{reference_class_name}.model_name.human}" %></h3>
83
+ <div id="focus_#{reference_model_name}"></div>
84
+ <% form_for([:admin, @#{model_name}.#{reference_value}.build]) do |f| %>
85
+ <%= f.error_messages %>
86
+ <div class="issue">
87
+ <%= render :partial => 'admin/#{reference_value}/form' , :locals => {:f => f} %>
88
+ </div>
89
+ <%= hidden_field_tag :return_to, url_for%>
90
+ <%= f.submit t('Create') %>
91
+ <% end %>
92
+ <%= link_to_function t('Cancel'), "$('add_#{reference_model_name}').hide()"%>
93
+ </div>
94
+ CODE
95
+ inject_into_file File.join('app/views',options[:namespace], model_name.pluralize, 'show.html.erb'), :after => sentinel do
96
+ "#{reference_list}"
97
+ end
98
+
99
+ inject_into_file File.join('app/views',options[:namespace], model_name.pluralize, 'edit.html.erb'), :after => sentinel do
100
+ "#{reference_list}"
101
+ end
102
+ end
103
+
104
+ def add_hidden_field_to_edit_view
105
+ prepend_file File.join('app/views',options[:namespace], reference_model_name.pluralize, '_form.html.erb'), "<%= f.hidden_field :#{migration_attribute} %>"
106
+ end
107
+
108
+ def migrations
109
+ if relationship == 'has_many'
110
+ unless options[:skip_migration]
111
+ invoke "migration", [%(add_#{migration_attribute}_to_#{migration_table_name}), "#{migration_attribute}:integer"]
112
+ end
113
+ end
114
+ end
115
+
116
+
117
+ protected
118
+
119
+ def match_data
120
+ @match_data ||= name.match(/(.*)_(has_many|belongs_to)_(.*)/)
121
+ end
122
+
123
+ def relationship
124
+ match_data[2]
125
+ end
126
+
127
+ def model_name
128
+ match_data[1].singularize
129
+ end
130
+
131
+ def class_name
132
+ model_name.classify
133
+ end
134
+
135
+ def reference_model_name
136
+ match_data[3].singularize
137
+ end
138
+
139
+ def reference_class_name
140
+ reference_model_name.classify
141
+ end
142
+
143
+ def reference_value
144
+ reference_model_name.pluralize
145
+ end
146
+
147
+ def migration_table_name
148
+ reference_value
149
+ end
150
+
151
+ def migration_model_name
152
+ reference_model_name
153
+ end
154
+
155
+ def migration_attribute
156
+ "#{model_name}_id"
157
+ end
158
+
159
+ #
160
+ # Implement the required interface for Rails::Generators::Migration.
161
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
162
+ #
163
+ def self.next_migration_number(dirname) #:nodoc:
164
+ if ActiveRecord::Base.timestamped_migrations
165
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
166
+ else
167
+ "%.3d" % (current_migration_number(dirname) + 1)
168
+ end
169
+ end
170
+
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,11 @@
1
+ class <%= "add_#{migration_attribute}_to_#{migration_table_name}".camelize %> < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :<%= migration_table_name %>, :<%= migration_attribute %>, :integer
4
+ add_index :<%= migration_table_name %>, :<%= migration_attribute %>
5
+ end
6
+
7
+ def self.down
8
+ remove_index :<%= migration_table_name %>, :<%= migration_attribute %>
9
+ remove_column :<%= migration_table_name %>, :<%= migration_attribute %>
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'generators/somatics'
2
+ require 'rails/generators/rails/resource/resource_generator'
3
+ require 'rails/generators/resource_helpers'
4
+
5
+ module Somatics
6
+ module Generators
7
+ class ScaffoldGenerator < Rails::Generators::ModelGenerator #metagenerator
8
+ include Rails::Generators::ResourceHelpers
9
+
10
+ hook_for :scaffold_controller, :required => true # do |controller|
11
+ # invoke controller, [ controller_name, attributes], {:namespace => 'admin' }
12
+ # end
13
+
14
+ #
15
+ # class_option :namespace, :banner => "NAME", :type => :string, :required => false, :default => "admin",
16
+ # :desc => "namespace to generate the controller for"
17
+
18
+ # include SomaticsHelpers
19
+
20
+ # remove_hook_for :resource_controller
21
+ # remove_class_option :actions
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ <%%= form_for(@<%= singular_name %>) do |f| %>
2
+ <%% if @<%= singular_name %>.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%%= pluralize(@<%= singular_name %>.errors.count, "error") %> prohibited this <%= singular_name %> from being saved:</h2>
5
+
6
+ <ul>
7
+ <%% @<%= singular_name %>.errors.full_messages.each do |msg| %>
8
+ <li><%%= msg %></li>
9
+ <%% end %>
10
+ </ul>
11
+ </div>
12
+ <%% end %>
13
+
14
+ <% for attribute in attributes -%>
15
+ <div class="field">
16
+ <%%= f.label :<%= attribute.name %> %><br />
17
+ <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
18
+ </div>
19
+ <% end -%>
20
+ <div class="actions">
21
+ <%%= f.submit %>
22
+ </div>
23
+ <%% end %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing <%= singular_name %></h1>
2
+
3
+ <%%= render 'form' %>
4
+
5
+ <%%= link_to 'Show', @<%= singular_name %> %> |
6
+ <%%= link_to 'Back', <%= plural_name %>_path %>
@@ -0,0 +1,27 @@
1
+ <h1>Listing <%= plural_name %></h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <% for attribute in attributes -%>
6
+ <th><%= attribute.human_name %></th>
7
+ <% end -%>
8
+ <th></th>
9
+ <th></th>
10
+ <th></th>
11
+ </tr>
12
+
13
+ <%% @<%= plural_name %>.each do |<%= singular_name %>| %>
14
+ <tr>
15
+ <% for attribute in attributes -%>
16
+ <td><%%= <%= singular_name %>.<%= attribute.name %> %></td>
17
+ <% end -%>
18
+ <td><%%= link_to 'Show', <%= singular_name %> %></td>
19
+ <td><%%= link_to 'Edit', edit_<%= singular_name %>_path(<%= singular_name %>) %></td>
20
+ <td><%%= link_to 'Destroy', <%= singular_name %>, :confirm => 'Are you sure?', :method => :delete %></td>
21
+ </tr>
22
+ <%% end %>
23
+ </table>
24
+
25
+ <br />
26
+
27
+ <%%= link_to 'New <%= human_name %>', new_<%= singular_name %>_path %>
@@ -0,0 +1,5 @@
1
+ <h1>New <%= singular_name %></h1>
2
+
3
+ <%%= render 'form' %>
4
+
5
+ <%%= link_to 'Back', <%= plural_name %>_path %>
@@ -0,0 +1,12 @@
1
+ <p id="notice"><%%= notice %></p>
2
+
3
+ <% for attribute in attributes -%>
4
+ <p>
5
+ <b><%= attribute.human_name %>:</b>
6
+ <%%= @<%= singular_name %>.<%= attribute.name %> %>
7
+ </p>
8
+
9
+ <% end -%>
10
+
11
+ <%%= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) %> |
12
+ <%%= link_to 'Back', <%= plural_name %>_path %>
@@ -0,0 +1,20 @@
1
+ Description:
2
+ Stubs out a scaffolded controller and its views. Pass the model name,
3
+ either CamelCased or under_scored, and a list of views as arguments.
4
+ The controller name is retrieved as a pluralized version of the model
5
+ name.
6
+
7
+ To create a controller within a module, specify the model name as a
8
+ path like 'parent_module/controller_name'.
9
+
10
+ This generates a controller class in app/controllers and invokes helper,
11
+ template engine and test framework generators.
12
+
13
+ Example:
14
+ `rails generate scaffold_controller CreditCard`
15
+
16
+ Credit card controller with URLs like /credit_card/debit.
17
+ Controller: app/controllers/credit_cards_controller.rb
18
+ Functional Test: test/functional/credit_cards_controller_test.rb
19
+ Views: app/views/credit_cards/index.html.erb [...]
20
+ Helper: app/helpers/credit_cards_helper.rb
@@ -0,0 +1,108 @@
1
+ require 'generators/somatics'
2
+ require 'rails/generators/resource_helpers'
3
+
4
+ module Somatics
5
+ module Generators
6
+ class ScaffoldControllerGenerator < Rails::Generators::NamedBase
7
+ extend TemplatePath
8
+ include Rails::Generators::ResourceHelpers
9
+
10
+ check_class_collision :suffix => "Controller"
11
+ # remove_hook_for :template_engine, :test_framework, :helper # TODO
12
+
13
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
14
+
15
+ class_option :orm, :banner => "NAME", :type => :string, :required => true,
16
+ :desc => "ORM to generate the controller for"
17
+ class_option :namespace, :banner => "NAME", :type => :string, :required => false, :default => "admin", :desc => "namespace to generate the controller for"
18
+ class_option :header, :type => :boolean, :default => true, :desc => "generate header menu tab"
19
+ class_option :locales, :type => :array, :banner => "LOCALE LOCALE", :default => %w( en zh-TW ),
20
+ :desc => "Supported Locales"
21
+ class_option :skip_auditing, :type => :boolean, :default => false, :desc => "Don't generate auditing information."
22
+
23
+ def create_controller_files
24
+ template 'controller.rb', File.join('app/controllers', options[:namespace], class_path, "#{controller_file_name}_controller.rb")
25
+ end
26
+ def create_view_files
27
+ template "partial_form.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "_form.html.erb" )
28
+ template "partial_list.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "_list.html.erb" )
29
+ template "partial_show.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "_show.html.erb" )
30
+ template "partial_edit.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "_edit.html.erb" )
31
+ template "partial_bulk.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "_bulk.html.erb" )
32
+ template "view_index.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "index.html.erb" )
33
+ template "view_new.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "new.html.erb" )
34
+ template "view_show.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "show.html.erb" )
35
+ template "view_edit.html.erb", File.join('app/views',options[:namespace], class_path, controller_file_name, "edit.html.erb" )
36
+ template "builder_index.xml.builder", File.join('app/views',options[:namespace], class_path, controller_file_name, "index.xml.builder")
37
+ template "builder_index.xls.builder", File.join('app/views',options[:namespace], class_path, controller_file_name, "index.xls.builder")
38
+ end
39
+
40
+ def add_header_menu_tab
41
+ if options[:header]
42
+ look_for = "<li><%= link_to '#{file_name.humanize}', '/admin/#{controller_file_name}', :class => (match_controller?('#{controller_file_name}')) ? 'selected' : ''%>\n\t<ul class='sub'></ul></li>\n"
43
+ gsub_file File.join('app/views/admin/shared', "_menu.html.erb"), look_for, ''
44
+ append_file File.join('app/views/admin/shared', "_menu.html.erb"), look_for
45
+ end
46
+ end
47
+
48
+ def create_locales_files
49
+ # # Locales templates
50
+ options[:locales].each do |locale|
51
+ template "locales_#{locale}.yml", File.join('config/locales', "#{controller_file_name}_#{locale}.yml")
52
+ end
53
+ end
54
+
55
+ def add_resource_route
56
+ route_config = "namespace :#{namespace_name} do "
57
+ route_config << class_path.collect{|namespace| "namespace :#{namespace} do " }.join(" ")
58
+ route_config << "resources :#{file_name.pluralize}"
59
+ route_config << " end" * class_path.size
60
+ route_config << " end"
61
+ route route_config
62
+ end
63
+
64
+ def inject_somatics_filters
65
+ filters = [" has_filter :id, :integer, :default => true\n", " has_filter :created_at, :date\n"]
66
+ filters |= attributes.collect do |attribute|
67
+ " has_filter :#{attribute.name}, :#{attribute.type}\n"
68
+ end
69
+ # FIXME The model generator removes the model.rb already
70
+ if File.exists?("app/models/#{singular_name}.rb")
71
+ inject_into_class "app/models/#{singular_name}.rb", class_name, filters.join('')
72
+ inject_into_class "app/models/#{singular_name}.rb", class_name,
73
+ <<-RUBY
74
+ # Somatics Filter (Reference: http://github.com/inspiresynergy/somatics_filter)
75
+ RUBY
76
+ end
77
+ end
78
+
79
+ def inject_paper_trail
80
+ unless options[:skip_auditing]
81
+ # FIXME The model generator removes the model.rb already
82
+ if File.exists?("app/models/#{singular_name}.rb")
83
+ inject_into_class "app/models/#{singular_name}.rb", class_name, " has_paper_trail :ignore => [:updated_at]\n"
84
+ end
85
+ end
86
+ end
87
+
88
+ # Test Cases
89
+ hook_for :test_framework, :as => :scaffold
90
+
91
+ protected
92
+
93
+ def namespace_class
94
+ options[:namespace].classify
95
+ end
96
+
97
+ def namespace_name
98
+ options[:namespace].underscore
99
+ end
100
+
101
+ # hook_for :template_engine, :test_framework, :as => :somatics_scaffold
102
+ # Invoke the helper using the controller name (pluralized)
103
+ # hook_for :helper, :as => :scaffold do |invoked|
104
+ # invoke invoked, [ controller_name ]
105
+ # end
106
+ end
107
+ end
108
+ end