leonardo 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. data/CHANGELOG +9 -3
  2. data/lib/generators/base.rb +262 -24
  3. data/lib/generators/erb/leosca/leosca_generator.rb +38 -22
  4. data/lib/generators/erb/leosca/templates/_form.html.erb +14 -3
  5. data/lib/generators/erb/leosca/templates/_list.erb +13 -20
  6. data/lib/generators/erb/leosca/templates/_show.erb +9 -0
  7. data/lib/generators/erb/leosca/templates/edit.html.erb +3 -5
  8. data/lib/generators/erb/leosca/templates/formtastic/_form.html.erb +10 -4
  9. data/lib/generators/erb/leosca/templates/index.html.erb +15 -4
  10. data/lib/generators/erb/leosca/templates/new.html.erb +1 -1
  11. data/lib/generators/erb/leosca/templates/show.html.erb +5 -22
  12. data/lib/generators/erb/leosca/templates/show.js.erb +7 -0
  13. data/lib/generators/leolay/USAGE +1 -1
  14. data/lib/generators/leolay/install_generator.rb +0 -1
  15. data/lib/generators/leolay/leolay_generator.rb +24 -17
  16. data/lib/generators/leolay/templates/config/locales/devise.en.yml +1 -0
  17. data/lib/generators/leolay/templates/config/locales/devise.it.yml +1 -0
  18. data/lib/generators/leolay/templates/config/locales/en.yml +5 -5
  19. data/lib/generators/leolay/templates/config/locales/it.yml +5 -5
  20. data/lib/generators/leolay/templates/lib/generators/rspec/scaffold/scaffold_generator.rb +173 -0
  21. data/lib/generators/leolay/templates/lib/templates/rspec/scaffold/controller_spec.rb +39 -39
  22. data/lib/generators/leolay/templates/lib/templates/rspec/scaffold/edit_spec.rb +4 -1
  23. data/lib/generators/leolay/templates/lib/templates/rspec/scaffold/index_spec.rb +15 -4
  24. data/lib/generators/leolay/templates/lib/templates/rspec/scaffold/new_spec.rb +5 -2
  25. data/lib/generators/leolay/templates/lib/templates/rspec/scaffold/routing_spec.rb +37 -0
  26. data/lib/generators/leolay/templates/lib/templates/rspec/scaffold/show_spec.rb +3 -0
  27. data/lib/generators/leolay/templates/styles/cloudy/{stylesheet.sass → stylesheets/app/stylesheet.sass} +0 -0
  28. data/lib/generators/leolay/templates/{vendor/assets/stylesheets → styles/cloudy/stylesheets/vendor}/jquery-ui/jquery-ui-1.8.16.redcarpet.css +17 -17
  29. data/lib/generators/leolay/templates/vendor/assets/javascripts/jquery-ui/jquery.ui.datepicker-de.js +1 -1
  30. data/lib/generators/leolay/templates/vendor/assets/javascripts/jquery-ui/jquery.ui.datepicker-en.js +1 -1
  31. data/lib/generators/leolay/templates/vendor/assets/javascripts/jquery-ui/jquery.ui.datepicker-it.js +1 -1
  32. data/lib/generators/leosca/install_generator.rb +1 -1
  33. data/lib/generators/rails/leosca/leosca_generator.rb +21 -0
  34. data/lib/generators/rails/leosca_controller/leosca_controller_generator.rb +41 -114
  35. data/lib/generators/rails/leosca_controller/templates/controller.rb +51 -23
  36. data/template.rb +4 -1
  37. metadata +10 -6
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe <%= controller_class_name %>Controller do
4
+ describe "routing" do
5
+
6
+ <% unless options[:singleton] -%>
7
+ it "routes to #index" do
8
+ get("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>").should route_to("<%= ns_table_name %>#index"<%= nested_params_http_request("1") %>)
9
+ end
10
+
11
+ <% end -%>
12
+ it "routes to #new" do
13
+ get("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>/new").should route_to("<%= ns_table_name %>#new"<%= nested_params_http_request("1") %>)
14
+ end
15
+
16
+ it "routes to #show" do
17
+ get("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>/1").should route_to("<%= ns_table_name %>#show", :id => "1"<%= nested_params_http_request("1") %>)
18
+ end
19
+
20
+ it "routes to #edit" do
21
+ get("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>/1/edit").should route_to("<%= ns_table_name %>#edit", :id => "1"<%= nested_params_http_request("1") %>)
22
+ end
23
+
24
+ it "routes to #create" do
25
+ post("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>").should route_to("<%= ns_table_name %>#create"<%= nested_params_http_request("1") %>)
26
+ end
27
+
28
+ it "routes to #update" do
29
+ put("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>/1").should route_to("<%= ns_table_name %>#update", :id => "1"<%= nested_params_http_request("1") %>)
30
+ end
31
+
32
+ it "routes to #destroy" do
33
+ delete("/<%= plural_parent_resources.join('/1/') %><%= "/1/" if nested? %><%= ns_table_name %>/1").should route_to("<%= ns_table_name %>#destroy", :id => "1"<%= nested_params_http_request("1") %>)
34
+ end
35
+
36
+ end
37
+ end
@@ -17,6 +17,9 @@ end
17
17
  describe "<%= ns_table_name %>/show.html.<%= options[:template_engine] %>" do
18
18
  before(:each) do
19
19
  @<%= ns_file_name %> = assign(:<%= ns_file_name %>, Factory(:<%= ns_file_name %>) )
20
+ <%- base_parent_resources.each do |parent| -%>
21
+ @<%= parent %> = assign(:<%= parent %>, @<%= ns_file_name %>.<%= parent %>)
22
+ <%- end -%>
20
23
  end
21
24
 
22
25
  it "renders attributes" do
@@ -59,26 +59,26 @@
59
59
  .ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
60
60
  .ui-widget .ui-widget { font-size: 1em; }
61
61
  .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
62
- .ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(styles/cloudy/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
62
+ .ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(../styles/cloudy/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
63
63
  .ui-widget-content a { color: #333333; }
64
- .ui-widget-header { border: 1px solid #990000; background: #cc0000 url(styles/cloudy/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
64
+ .ui-widget-header { border: 1px solid #990000; background: #cc0000 url(../styles/cloudy/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
65
65
  .ui-widget-header a { color: #ffffff; }
66
66
 
67
67
  /* Interaction states
68
68
  ----------------------------------*/
69
- .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(styles/cloudy/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
69
+ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(../styles/cloudy/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
70
70
  .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
71
- .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #ff0000; background: #fdf5ce url(styles/cloudy/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #990000; }
71
+ .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #ff0000; background: #fdf5ce url(../styles/cloudy/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #990000; }
72
72
  .ui-state-hover a, .ui-state-hover a:hover { color: #990000; text-decoration: none; }
73
- .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #ff0000; background: #ffffff url(styles/cloudy/jquery-ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #990000; }
73
+ .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #ff0000; background: #ffffff url(../styles/cloudy/jquery-ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #990000; }
74
74
  .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #990000; text-decoration: none; }
75
75
  .ui-widget :active { outline: none; }
76
76
 
77
77
  /* Interaction Cues
78
78
  ----------------------------------*/
79
- .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #ff0000; background: #ff0000 url(styles/cloudy/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
79
+ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #ff0000; background: #ff0000 url(../styles/cloudy/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
80
80
  .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
81
- .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(styles/cloudy/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
81
+ .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(../styles/cloudy/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
82
82
  .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
83
83
  .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
84
84
  .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
@@ -89,14 +89,14 @@
89
89
  ----------------------------------*/
90
90
 
91
91
  /* states and images */
92
- .ui-icon { width: 16px; height: 16px; background-image: url(styles/cloudy/jquery-ui/ui-icons_222222_256x240.png); }
93
- .ui-widget-content .ui-icon {background-image: url(styles/cloudy/jquery-ui/ui-icons_222222_256x240.png); }
94
- .ui-widget-header .ui-icon {background-image: url(styles/cloudy/jquery-ui/ui-icons_ffffff_256x240.png); }
95
- .ui-state-default .ui-icon { background-image: url(styles/cloudy/jquery-ui/ui-icons_ef8c08_256x240.png); }
96
- .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(styles/cloudy/jquery-ui/ui-icons_ef8c08_256x240.png); }
97
- .ui-state-active .ui-icon {background-image: url(styles/cloudy/jquery-ui/ui-icons_ef8c08_256x240.png); }
98
- .ui-state-highlight .ui-icon {background-image: url(styles/cloudy/jquery-ui/ui-icons_228ef1_256x240.png); }
99
- .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(styles/cloudy/jquery-ui/ui-icons_ffd27a_256x240.png); }
92
+ .ui-icon { width: 16px; height: 16px; background-image: url(../styles/cloudy/jquery-ui/ui-icons_222222_256x240.png); }
93
+ .ui-widget-content .ui-icon {background-image: url(../styles/cloudy/jquery-ui/ui-icons_222222_256x240.png); }
94
+ .ui-widget-header .ui-icon {background-image: url(../styles/cloudy/jquery-ui/ui-icons_ffffff_256x240.png); }
95
+ .ui-state-default .ui-icon { background-image: url(../styles/cloudy/jquery-ui/ui-icons_ef8c08_256x240.png); }
96
+ .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../styles/cloudy/jquery-ui/ui-icons_ef8c08_256x240.png); }
97
+ .ui-state-active .ui-icon {background-image: url(../styles/cloudy/jquery-ui/ui-icons_ef8c08_256x240.png); }
98
+ .ui-state-highlight .ui-icon {background-image: url(../styles/cloudy/jquery-ui/ui-icons_228ef1_256x240.png); }
99
+ .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../styles/cloudy/jquery-ui/ui-icons_ffd27a_256x240.png); }
100
100
 
101
101
  /* positioning */
102
102
  .ui-icon-carat-1-n { background-position: 0 0; }
@@ -286,8 +286,8 @@
286
286
  .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
287
287
 
288
288
  /* Overlays */
289
- .ui-widget-overlay { background: #666666 url(styles/cloudy/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
290
- .ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(styles/cloudy/jquery-ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
289
+ .ui-widget-overlay { background: #666666 url(../styles/cloudy/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
290
+ .ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(../styles/cloudy/jquery-ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
291
291
  * jQuery UI Resizable 1.8.16
292
292
  *
293
293
  * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
@@ -14,7 +14,7 @@ jQuery(function($){
14
14
  dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
15
15
  dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
16
16
  weekHeader: 'Wo',
17
- dateFormat: 'dd.mm.yy',
17
+ dateFormat: 'dd-mm-yy',
18
18
  firstDay: 1,
19
19
  isRTL: false,
20
20
  showMonthAfterYear: false,
@@ -14,7 +14,7 @@ jQuery(function($){
14
14
  dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
15
15
  dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
16
16
  weekHeader: 'Wk',
17
- dateFormat: 'dd/mm/yy',
17
+ dateFormat: 'dd-mm-yy',
18
18
  firstDay: 1,
19
19
  isRTL: false,
20
20
  showMonthAfterYear: false,
@@ -14,7 +14,7 @@ jQuery(function($){
14
14
  dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
15
15
  dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
16
16
  weekHeader: 'Sm',
17
- dateFormat: 'dd/mm/yy',
17
+ dateFormat: 'dd-mm-yy',
18
18
  firstDay: 1,
19
19
  isRTL: false,
20
20
  showMonthAfterYear: false,
@@ -8,7 +8,7 @@ module Leosca
8
8
  directory "erb/leosca", "lib/generators/erb/leosca" if options.erb?
9
9
  directory "rails/leosca", "lib/generators/rails/leosca"
10
10
  directory "rails/leosca_controller", "lib/generators/rails/leosca_controller"
11
- #copy_file "leonardo_shared.rb", "lib/generators/leonardo_shared.rb"
11
+ copy_file "base.rb", "lib/generators/base.rb"
12
12
  end
13
13
  end
14
14
  end
@@ -1,8 +1,10 @@
1
1
  require 'rails/generators/rails/resource/resource_generator'
2
+ require File.join(File.dirname(__FILE__), '../../base')
2
3
 
3
4
  module Rails
4
5
  module Generators
5
6
  class LeoscaGenerator < ResourceGenerator #metagenerator
7
+ include ::Leonardo::Nested
6
8
  #puts 'rails:leosca'
7
9
 
8
10
  remove_hook_for :resource_controller
@@ -10,6 +12,7 @@ module Rails
10
12
 
11
13
  class_option :stylesheets, :type => :boolean, :default => false, :desc => "Generate Stylesheets"
12
14
  class_option :stylesheet_engine, :desc => "Engine for Stylesheets"
15
+ class_option :under, :type => :string, :default => "", :banner => "brand/category", :desc => "Choose namespace(s) if resource must be nested"
13
16
 
14
17
  hook_for :leosca_controller, :required => true
15
18
 
@@ -21,6 +24,24 @@ module Rails
21
24
  invoke stylesheet_engine, [controller_name] if options[:stylesheets] && behavior == :invoke
22
25
  end
23
26
 
27
+ #Override resource def
28
+ def add_resource_route
29
+ return if options[:actions].present?
30
+
31
+ if options[:under].present?
32
+ route_resources = plural_parent_resources
33
+ route_map = "resources"
34
+ else
35
+ route_resources = regular_class_path
36
+ route_map = "namespace"
37
+ end
38
+
39
+ route_config = route_resources.collect{|m| "#{route_map} :#{m} do " }.join(" ")
40
+ route_config << "resources :#{file_name.pluralize}"
41
+ route_config << " end" * route_resources.size
42
+ route route_config
43
+ end
44
+
24
45
  end
25
46
  end
26
47
  end
@@ -1,5 +1,5 @@
1
1
  require 'rails/generators/resource_helpers'
2
- #require '../../leonardo_shared' #I'd like to share common code but it can't find that module :(
2
+ require File.join(File.dirname(__FILE__), '../../base')
3
3
 
4
4
  WINDOWS = (RUBY_PLATFORM =~ /dos|win32|cygwin/i) || (RUBY_PLATFORM =~ /(:?mswin|mingw)/)
5
5
  CRLF = WINDOWS ? "\r\n" : "\n"
@@ -8,14 +8,17 @@ module Rails
8
8
  module Generators
9
9
  class LeoscaControllerGenerator < NamedBase
10
10
  include ResourceHelpers
11
- #include LeonardoShared
11
+ include ::Leonardo::Leosca
12
+ include ::Leonardo::Nested
13
+ include ::Leonardo::Nested::Test
12
14
  #puts 'rails:leosca_controller'
13
15
 
14
16
  source_root File.expand_path('../templates', __FILE__)
15
17
  argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
16
- class_option :seeds, :type => :boolean, :default => true, :description => "Create seeds to run with rake db:seed"
17
- class_option :seeds_elements, :type => :string, :default => "30", :description => "Choose seeds elements", :banner => "NUMBER OF ARRAY ELEMENTS"
18
- class_option :remote, :type => :boolean, :default => true, :description => "Enable ajax. You can also do later set remote to true into index view."
18
+ class_option :seeds, :type => :boolean, :default => true, :desc => "Create seeds to run with rake db:seed"
19
+ class_option :seeds_elements, :type => :string, :default => "30", :desc => "Choose seeds elements", :banner => "NUMBER"
20
+ class_option :remote, :type => :boolean, :default => true, :desc => "Enable ajax. You can also do later set remote to true into index view."
21
+ class_option :under, :type => :string, :default => "", :banner => "brand/category", :desc => "Nested resources"
19
22
 
20
23
 
21
24
  check_class_collision :suffix => "Controller"
@@ -48,17 +51,21 @@ module Rails
48
51
  inject_into_file file, :after => "#Attributes zone - do not remove#{CRLF}" do
49
52
  content = " #{file_name}:#{CRLF}"
50
53
  attributes.each do |attribute|
51
- content << " #{attribute.name}: \"#{camel_case attribute.name}\"#{CRLF}"
54
+ content << " #{attribute.name}: \"#{attribute.name.humanize}\"#{CRLF}"
52
55
  end
53
56
  content << " op_new: \"New #{singular_table_name}\"#{CRLF}"
54
57
  content << " op_edit: \"Editing #{singular_table_name}\"#{CRLF}"
55
- content << " op_index: \"Listing #{plural_table_name}\"#{CRLF}"
58
+ if nested?
59
+ content << " op_index: \"Listing #{plural_table_name} belongings to %{parent} %{name}\"#{CRLF}"
60
+ else
61
+ content << " op_index: \"Listing #{plural_table_name}\"#{CRLF}"
62
+ end
56
63
  content
57
64
  end
58
65
 
59
66
  #Model name
60
67
  inject_into_file file, :after => "models: &models#{CRLF}" do
61
- <<-FILE.gsub(/^ /, '')
68
+ <<-FILE.gsub(/^ /, '')
62
69
  #{file_name}: "#{file_name.capitalize}"
63
70
  #{controller_name}: "#{controller_name.capitalize}"
64
71
  FILE
@@ -68,7 +75,7 @@ module Rails
68
75
  inject_into_file file, :after => " hints:#{CRLF}" do
69
76
  content = " #{file_name}:#{CRLF}"
70
77
  attributes.each do |attribute|
71
- attr_name = attribute.name.gsub '_', ''
78
+ attr_name = attribute.name.humanize
72
79
  case attribute.type
73
80
  when :integer, :decimal, :float
74
81
  content << " #{attribute.name}: \"Fill the #{attr_name} with a#{"n" if attribute.type == :integer} #{attribute.type.to_s} number\"#{CRLF}"
@@ -76,7 +83,7 @@ module Rails
76
83
  content << " #{attribute.name}: \"Select if this #{file_name} should be #{attr_name} or not\"#{CRLF}"
77
84
  when :string, :text
78
85
  content << " #{attribute.name}: \"Choose a good #{attr_name} for this #{file_name}\"#{CRLF}"
79
- when :date, :datetime, :time
86
+ when :date, :datetime, :time, :timestamp
80
87
  content << " #{attribute.name}: \"Choose a #{attribute.type.to_s} for #{attr_name}\"#{CRLF}"
81
88
  else
82
89
  content << " #{attribute.name}: \"Choose a #{attr_name}\"#{CRLF}"
@@ -88,17 +95,6 @@ module Rails
88
95
  end
89
96
  end
90
97
 
91
- def update_layout_html
92
- file = "app/views/layouts/_#{CONFIG[:default_style]}.html.erb"
93
- inject_into_file file, :after => "<!-- Insert below other elements -->#{CRLF}" do
94
- <<-FILE.gsub(/^ /, '')
95
- #{"<% if can? :read, #{class_name} -%>" if authorization?}
96
- <li class="<%= controller.controller_path == '#{controller_name}' ? 'active' : '' %>"><a href="<%= #{controller_name}_path %>"><%= t('models.#{controller_name}') %></a></li>
97
- #{"<% end -%>" if authorization?}
98
- FILE
99
- end if File.exists?(file)
100
- end
101
-
102
98
  def update_ability_model
103
99
  file = "app/models/ability.rb"
104
100
  return unless File.exists?(file)
@@ -148,7 +144,7 @@ module Rails
148
144
 
149
145
  check_attr_to_have, check_attr_to_not_have = get_attr_to_match
150
146
 
151
- file = "spec/requests/#{plural_table_name}_spec.rb"
147
+ file = "spec/requests/#{plural_path_file_name}_spec.rb"
152
148
  remove = <<-FILE.gsub(/^ /, '')
153
149
  it "works! (now write some real specs)" do
154
150
  # Run the generator again with the --webrat flag if you want to use webrat methods/matchers
@@ -163,23 +159,12 @@ module Rails
163
159
 
164
160
  it "displays #{plural_table_name}" do
165
161
  #{singular_table_name} = Factory(:#{singular_table_name})
166
- visit #{plural_table_name}_path
167
- login_view_as(:user_guest)
162
+ visit #{list_resources_path_test}
163
+ #{"login_view_as(:user_guest)" if authentication?}
168
164
  #save_and_open_page #uncomment to debug
169
165
  page.should #{check_attr_to_have}
170
166
  assert page.find("#tr\#{#{singular_table_name}.id}").visible?
171
167
  end
172
- it "checks ajax", :js => true do
173
- #{singular_table_name} = Factory(:#{singular_table_name})
174
- visit #{plural_table_name}_path
175
- login_view_as(:user_manager)
176
- page.should #{check_attr_to_have}
177
- click_link "Destroy"
178
- page.driver.browser.switch_to.alert.accept
179
- #save_and_open_page #uncomment to debug
180
- page.should #{check_attr_to_not_have}
181
- assert !find("#tr\#{#{singular_table_name}.id}").visible?
182
- end
183
168
  FILE
184
169
  end
185
170
 
@@ -193,8 +178,8 @@ module Rails
193
178
  describe "POST /#{plural_table_name}" do
194
179
  it "creates a new #{singular_table_name}" do
195
180
  #{singular_table_name} = Factory.build(:#{singular_table_name})
196
- visit new_#{singular_table_name}_path
197
- login_view_as(:user)
181
+ visit #{new_resource_path_test}
182
+ #{"login_view_as(:user_admin)" if authentication?}
198
183
  #{items.join(CRLF)}
199
184
  click_button "Create \#{I18n.t('models.#{singular_table_name}')}"
200
185
  #save_and_open_page #uncomment to debug
@@ -202,11 +187,29 @@ module Rails
202
187
  page.should #{check_attr_to_have}
203
188
  end
204
189
  end
190
+
191
+ describe "Check ajax /#{plural_table_name}" do
192
+ it "checks links on list page", :js => true do
193
+ #{singular_table_name} = Factory(:#{singular_table_name})
194
+ visit #{list_resources_path_test}
195
+ #{"login_view_as(:user_manager)" if authentication?} #authentication
196
+ page.find("div#list").should #{check_attr_to_have}
197
+ click_link I18n.t(:show)
198
+ page.find("div.ui-dialog").should #{check_attr_to_have} #checks if dialog is appeared
199
+ click_link "close" #close dialog
200
+ !page.find("div.ui-dialog").visible? #checks if dialog has been closed
201
+ click_link I18n.t(:destroy) #check ajax destroy
202
+ page.driver.browser.switch_to.alert.accept #confirms destroy
203
+ #save_and_open_page #uncomment to debug
204
+ page.find("div#list").should #{check_attr_to_not_have} #checks if content has been removed
205
+ !page.find("#tr\#{#{singular_table_name}.id}").visible? #checks if row has been hidden
206
+ end
207
+ end
205
208
  FILE
206
209
  end
207
210
 
208
211
  file = "spec/factories.rb"
209
- inject_into_file file, :after => "### Leonardo creates here below your factories ###" do
212
+ inject_into_file file, :before => " ### Insert below here other your factories ###" do
210
213
  items = []
211
214
  attributes.each do |attribute|
212
215
  items << attribute_to_factories(attribute)
@@ -221,82 +224,6 @@ module Rails
221
224
 
222
225
  end
223
226
 
224
- protected
225
- def authorization?
226
- File.exists? "app/models/ability.rb"
227
- end
228
- def authentication?
229
- return true if File.exists? "app/models/user.rb"
230
- File.exists? "config/initializers/devise.rb"
231
- end
232
- def camel_case(str)
233
- return str if str !~ /_/ && str =~ /[A-Z]+.*/
234
- str.split('_').map { |i| i.capitalize }.join
235
- end
236
- def formtastic?
237
- return false unless options.formtastic?
238
- File.exists? "config/initializers/formtastic.rb"
239
- end
240
- def jquery_ui?
241
- File.exists? "vendor/assets/javascripts/jquery-ui"
242
- end
243
- def pagination?
244
- File.exists? "config/initializers/kaminari_config.rb"
245
- end
246
- def attribute_to_hash(attribute)
247
- name = case attribute.type
248
- when :references, :belongs_to then ":#{attribute.name}_id"
249
- else ":#{attribute.name}"
250
- end
251
- value = case attribute.type
252
- when :boolean then "true"
253
- when :integer then "#"
254
- when :float, :decimal then "#.46"
255
- when :references, :belongs_to then "#"
256
- when :date then "#{Time.now.strftime("%Y-%m-%d 00:00:00.000")}".inspect
257
- when :datetime then "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.000")}".inspect
258
- when :time then "#{Time.now.strftime("%H:%M:%S.000")}".inspect
259
- else "#{attribute.name.titleize}\#".inspect
260
- end
261
- " #{name} => #{value}"
262
- end
263
- def attribute_to_factories(attribute)
264
- name = case attribute.type
265
- when :references, :belongs_to then "#{singular_table_name[0..0]}.association "
266
- when :boolean, :datetime, :time then "#{singular_table_name[0..0]}.#{attribute.name} "
267
- else "#{singular_table_name[0..0]}.sequence(:#{attribute.name}) "
268
- end
269
- value = case attribute.type
270
- when :boolean then "true"
271
- when :integer then "{|n| n }"
272
- when :float, :decimal then "{|n| n }"
273
- when :references, :belongs_to then ":#{attribute.name}"
274
- when :date then "{|n| n.month.ago }"
275
- when :datetime then "#{Time.now.strftime("%Y-%m-%d %H:%M:%S.000")}".inspect
276
- when :time then "#{Time.now.strftime("%H:%M:%S.000")}".inspect
277
- else "{|n| \"#{attribute.name.titleize}\#{n}\" }"
278
- end
279
- " #{name} #{value}"
280
- end
281
- def attribute_to_requests(attribute)
282
- case attribute.type
283
- when :boolean then " check '#{singular_table_name}_#{attribute.name}' if #{singular_table_name}.#{attribute.name}"
284
- when :references, :belongs_to then " select #{singular_table_name}.#{attribute.name}.name, :from => '#{singular_table_name}_#{attribute.name}_id'"
285
- when :datetime, :time then ""
286
- when :date then " fill_in '#{singular_table_name}_#{attribute.name}', :with => #{singular_table_name}.#{attribute.name}.strftime('%d/%m/%Y')"
287
- else " fill_in '#{singular_table_name}_#{attribute.name}', :with => #{singular_table_name}.#{attribute.name}"
288
- end
289
- end
290
- def get_attr_to_match
291
- attributes.each do |attribute|
292
- return "have_content(#{singular_table_name}.#{attribute.name})",
293
- "have_no_content(#{singular_table_name}.#{attribute.name})" if attribute.type==:string
294
- end
295
- #If there are not string attributes
296
- return "have_xpath('//table/tbody/tr')",
297
- "have_no_xpath('//table/tbody/tr')"
298
- end
299
-
300
227
  end
301
228
  end
302
229
  end
@@ -1,38 +1,59 @@
1
1
  <% module_namespacing do -%>
2
2
  class <%= controller_class_name %>Controller < ApplicationController
3
- <%= "before_filter :authenticate_user!" if authentication? %>
4
- <%= "load_and_authorize_resource" if authorization? %>
3
+ <%= "before_filter :authenticate_user!#{CRLF}" if authentication? -%>
4
+ <%= "load_and_authorize_resource#{CRLF}" if authorization? -%>
5
+ <%= "before_filter :load_parents#{CRLF}" if nested? -%>
6
+
7
+ <% if nested? -%>
8
+ def load_parents
9
+ <% base_parent_resources.each do |parent| -%>
10
+ @<%= parent %> = <%= parent.classify %>.find params[:<%= parent %>_id]
11
+ <% end -%>
12
+ end
13
+ <% end -%>
5
14
 
6
15
  # GET <%= route_url %>
7
16
  # GET <%= route_url %>.json
8
17
  def index
9
18
  @<%= singular_table_name %> = <%= orm_class.build(class_name) %>
10
- conditions = nil
19
+ conditions_fields = []
20
+ conditions_values = []
11
21
 
12
- if params[:<%= singular_table_name %>]
13
- request.format = :csv if params[:commit] == 'Csv'
14
- conditions_fields = []
15
- conditions_values = []
22
+ <%- attributes.each do |attribute| -%>
23
+ <% if nested? && (attribute.type == :references || attribute.type == :belongs_to) -%>
24
+ conditions_fields << "#{<%= class_name %>.table_name}.<%= base_parent_resources.last %>_id = ?"
25
+ conditions_values << @<%= base_parent_resources.last %>.id
26
+ <%- end -%>
27
+ <%- end -%>
16
28
 
29
+ if params[:<%= singular_table_name %>]
17
30
  <%- attributes.each do |attribute| -%>
18
- if params[:<%= singular_table_name %>][:<%= attribute.name %>] && params[:<%= singular_table_name %>][:<%= attribute.name %>].length>0
19
- <%- conditions_operator_sign = case attribute.type
20
- when :string, :text then "LIKE"
21
- else "="
22
- end -%>
23
- <%- conditions_operator_value = case attribute.type
24
- when :string, :text then "%"
25
- else ""
26
- end -%>
27
- conditions_fields << "#{<%= class_name %>.table_name}.<%= attribute.name %> <%= conditions_operator_sign %> ?"
28
- conditions_values << "<%= conditions_operator_value %>#{params[:<%= singular_table_name %>][:<%= attribute.name %>]}<%= conditions_operator_value %>"
29
- @<%= singular_table_name %>.<%= attribute.name %> = params[:<%= singular_table_name %>][:<%= attribute.name %>]
31
+ <%- attr_name = case attribute.type
32
+ when :references, :belongs_to then "#{attribute.name}_id"
33
+ else attribute.name
34
+ end -%>
35
+ <%- conditions_operator_sign = case attribute.type
36
+ when :string, :text then "LIKE"
37
+ else "="
38
+ end -%>
39
+ <%- conditions_operator_value = case attribute.type
40
+ when :string, :text then "%"
41
+ else ""
42
+ end -%>
43
+ <% unless nested? && (attribute.type == :references || attribute.type == :belongs_to) -%>
44
+
45
+ if params[:<%= singular_table_name %>][:<%= attr_name %>] && params[:<%= singular_table_name %>][:<%= attr_name %>].length>0
46
+ conditions_fields << "#{<%= class_name %>.table_name}.<%= attr_name %> <%= conditions_operator_sign %> ?"
47
+ conditions_values << "<%= conditions_operator_value %>#{params[:<%= singular_table_name %>][:<%= attr_name %>]}<%= conditions_operator_value %>"
48
+ @<%= singular_table_name %>.<%= attr_name %> = params[:<%= singular_table_name %>][:<%= attr_name %>]
30
49
  end
31
50
  <%- end -%>
51
+ <%- end -%>
32
52
 
33
- conditions = conditions_fields.join(' and ').to_a + conditions_values
34
53
  end
35
54
 
55
+ conditions = conditions_fields.join(' and ').to_a + conditions_values
56
+
36
57
  request.format = :csv if params[:commit] == 'Csv'
37
58
 
38
59
  @<%= plural_table_name %> = case request.format
@@ -65,6 +86,7 @@ class <%= controller_class_name %>Controller < ApplicationController
65
86
  respond_to do |format|
66
87
  format.html # show.html.erb
67
88
  format.json { render <%= key_value :json, "@#{singular_table_name}" %> }
89
+ format.js
68
90
  end
69
91
  end
70
92
 
@@ -72,6 +94,9 @@ class <%= controller_class_name %>Controller < ApplicationController
72
94
  # GET <%= route_url %>/new.json
73
95
  def new
74
96
  @<%= singular_table_name %> = <%= orm_class.build(class_name) %>
97
+ <%- if nested? -%>
98
+ @<%= singular_table_name %>.<%= last_parent %>_id = @<%= last_parent %>.id
99
+ <%- end -%>
75
100
 
76
101
  respond_to do |format|
77
102
  format.html # new.html.erb
@@ -88,10 +113,13 @@ class <%= controller_class_name %>Controller < ApplicationController
88
113
  # POST <%= route_url %>.json
89
114
  def create
90
115
  @<%= singular_table_name %> = <%= orm_class.build(class_name, "params[:#{singular_table_name}]") %>
116
+ <%- if nested? -%>
117
+ @<%= singular_table_name %>.<%= last_parent %>_id ||= @<%= last_parent %>.id
118
+ <%- end -%>
91
119
 
92
120
  respond_to do |format|
93
121
  if @<%= orm_instance.save %>
94
- format.html { redirect_to @<%= singular_table_name %>, <%= key_value :notice, "I18n.t(:created, :model => I18n.t('models.#{singular_table_name}'))" %> }
122
+ format.html { redirect_to <%= show_resource_path("@") %>, <%= key_value :notice, "I18n.t(:created, :model => I18n.t('models.#{singular_table_name}'))" %> }
95
123
  format.json { render <%= key_value :json, "@#{singular_table_name}" %>, <%= key_value :status, ':created' %>, <%= key_value :location, "@#{singular_table_name}" %> }
96
124
  else
97
125
  format.html { render <%= key_value :action, '"new"' %> }
@@ -107,7 +135,7 @@ class <%= controller_class_name %>Controller < ApplicationController
107
135
 
108
136
  respond_to do |format|
109
137
  if @<%= orm_instance.update_attributes("params[:#{singular_table_name}]") %>
110
- format.html { redirect_to @<%= singular_table_name %>, <%= key_value :notice, "I18n.t(:updated, :model => I18n.t('models.#{singular_table_name}'))" %> }
138
+ format.html { redirect_to <%= show_resource_path("@") %>, <%= key_value :notice, "I18n.t(:updated, :model => I18n.t('models.#{singular_table_name}'))" %> }
111
139
  format.json { head :ok }
112
140
  else
113
141
  format.html { render <%= key_value :action, '"edit"' %> }
@@ -123,7 +151,7 @@ class <%= controller_class_name %>Controller < ApplicationController
123
151
  @<%= orm_instance.destroy %>
124
152
 
125
153
  respond_to do |format|
126
- format.html { redirect_to <%= index_helper %>_url }
154
+ format.html { redirect_to <%= list_resources_path %> }
127
155
  format.json { head :ok }
128
156
  format.js
129
157
  end
data/template.rb CHANGED
@@ -27,7 +27,8 @@ if use_git
27
27
  EOS
28
28
  end
29
29
 
30
- gem 'kaminari' if yes?("Pagination ?")
30
+ pagination = yes?("Pagination ?")
31
+ gem 'kaminari' if pagination
31
32
 
32
33
  gem 'paperclip' if yes?("Attachment ?")
33
34
 
@@ -80,6 +81,8 @@ end
80
81
 
81
82
  run "bundle install"
82
83
 
84
+ generate "kaminari:config" if pagination
85
+
83
86
  generate "rspec:install" if rspec
84
87
 
85
88
  generate "formtastic:install" if formtastic