active_scaffold 3.4.43 → 3.5.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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +39 -0
  3. data/{LICENSE → LICENSE.md} +1 -1
  4. data/README.md +27 -19
  5. data/app/assets/javascripts/active_scaffold.js.erb +1 -1
  6. data/app/assets/javascripts/jquery/active_scaffold.js +95 -43
  7. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +30 -6
  8. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +11 -1
  9. data/app/assets/stylesheets/active_scaffold_colors.scss +2 -2
  10. data/app/assets/stylesheets/active_scaffold_layout.css +36 -28
  11. data/app/views/active_scaffold_overrides/_base_form.html.erb +2 -3
  12. data/app/views/active_scaffold_overrides/_field_search.html.erb +8 -7
  13. data/app/views/active_scaffold_overrides/_form_association.html.erb +9 -9
  14. data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +6 -6
  15. data/app/views/active_scaffold_overrides/_form_association_record.html.erb +52 -50
  16. data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
  17. data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +1 -1
  18. data/app/views/active_scaffold_overrides/_human_conditions.html.erb +3 -1
  19. data/app/views/active_scaffold_overrides/_list_calculations.html.erb +1 -1
  20. data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +2 -0
  21. data/app/views/active_scaffold_overrides/_list_messages.html.erb +5 -3
  22. data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -1
  23. data/app/views/active_scaffold_overrides/_list_with_header.html.erb +9 -9
  24. data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
  25. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +18 -10
  26. data/app/views/active_scaffold_overrides/_render_field.js.erb +3 -3
  27. data/app/views/active_scaffold_overrides/_search.html.erb +7 -6
  28. data/app/views/active_scaffold_overrides/_show_actions.html.erb +14 -0
  29. data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
  30. data/app/views/active_scaffold_overrides/_update_actions.html.erb +6 -2
  31. data/app/views/active_scaffold_overrides/_update_column.js.erb +1 -1
  32. data/app/views/active_scaffold_overrides/_update_form.html.erb +1 -1
  33. data/app/views/active_scaffold_overrides/destroy.js.erb +2 -3
  34. data/app/views/active_scaffold_overrides/edit_associated.js.erb +4 -3
  35. data/app/views/active_scaffold_overrides/on_action_update.js.erb +5 -3
  36. data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
  37. data/app/views/active_scaffold_overrides/on_update.js.erb +6 -6
  38. data/app/views/active_scaffold_overrides/show.html.erb +6 -0
  39. data/app/views/active_scaffold_overrides/update.html.erb +1 -1
  40. data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
  41. data/config/brakeman.ignore +26 -0
  42. data/config/brakeman.yml +3 -0
  43. data/config/i18n-tasks.yml +121 -0
  44. data/config/locales/de.yml +81 -70
  45. data/config/locales/en.yml +83 -74
  46. data/config/locales/es.yml +82 -73
  47. data/config/locales/fr.yml +86 -75
  48. data/config/locales/hu.yml +81 -70
  49. data/config/locales/ja.yml +71 -60
  50. data/config/locales/ru.yml +85 -74
  51. data/lib/active_scaffold.rb +3 -0
  52. data/lib/active_scaffold/actions/common_search.rb +11 -7
  53. data/lib/active_scaffold/actions/core.rb +119 -47
  54. data/lib/active_scaffold/actions/create.rb +1 -1
  55. data/lib/active_scaffold/actions/delete.rb +11 -8
  56. data/lib/active_scaffold/actions/field_search.rb +104 -6
  57. data/lib/active_scaffold/actions/list.rb +25 -21
  58. data/lib/active_scaffold/actions/mark.rb +12 -4
  59. data/lib/active_scaffold/actions/nested.rb +26 -26
  60. data/lib/active_scaffold/actions/search.rb +2 -2
  61. data/lib/active_scaffold/actions/show.rb +4 -5
  62. data/lib/active_scaffold/actions/subform.rb +9 -7
  63. data/lib/active_scaffold/actions/update.rb +20 -13
  64. data/lib/active_scaffold/active_record_permissions.rb +24 -5
  65. data/lib/active_scaffold/attribute_params.rb +68 -49
  66. data/lib/active_scaffold/bridges.rb +1 -1
  67. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +15 -19
  68. data/lib/active_scaffold/bridges/bitfields.rb +1 -1
  69. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +10 -14
  70. data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -7
  71. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +19 -22
  72. data/lib/active_scaffold/bridges/cancan.rb +4 -3
  73. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +11 -21
  74. data/lib/active_scaffold/bridges/carrierwave.rb +2 -1
  75. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +2 -6
  76. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +6 -39
  77. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
  78. data/lib/active_scaffold/bridges/chosen.rb +4 -1
  79. data/lib/active_scaffold/bridges/chosen/helpers.rb +3 -2
  80. data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +2 -2
  81. data/lib/active_scaffold/bridges/date_picker.rb +3 -0
  82. data/lib/active_scaffold/bridges/date_picker/ext.rb +43 -38
  83. data/lib/active_scaffold/bridges/date_picker/helper.rb +24 -23
  84. data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
  85. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +3 -7
  86. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +3 -25
  87. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +2 -2
  88. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +6 -8
  89. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +1 -1
  90. data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -2
  91. data/lib/active_scaffold/bridges/file_column/list_ui.rb +2 -1
  92. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +1 -1
  93. data/lib/active_scaffold/bridges/paper_trail/actions.rb +1 -1
  94. data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -2
  95. data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +3 -7
  96. data/lib/active_scaffold/bridges/paperclip.rb +1 -1
  97. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +3 -28
  98. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
  99. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +3 -7
  100. data/lib/active_scaffold/bridges/record_select.rb +2 -0
  101. data/lib/active_scaffold/bridges/record_select/helpers.rb +14 -18
  102. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +4 -8
  103. data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -20
  104. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +7 -22
  105. data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +14 -14
  106. data/lib/active_scaffold/config/base.rb +9 -6
  107. data/lib/active_scaffold/config/core.rb +30 -21
  108. data/lib/active_scaffold/config/create.rb +2 -1
  109. data/lib/active_scaffold/config/delete.rb +2 -2
  110. data/lib/active_scaffold/config/field_search.rb +9 -3
  111. data/lib/active_scaffold/config/form.rb +4 -4
  112. data/lib/active_scaffold/config/list.rb +27 -23
  113. data/lib/active_scaffold/config/nested.rb +4 -4
  114. data/lib/active_scaffold/config/search.rb +6 -6
  115. data/lib/active_scaffold/config/show.rb +11 -1
  116. data/lib/active_scaffold/config/subform.rb +1 -1
  117. data/lib/active_scaffold/config/update.rb +4 -2
  118. data/lib/active_scaffold/constraints.rb +39 -36
  119. data/lib/active_scaffold/core.rb +36 -15
  120. data/lib/active_scaffold/data_structures/action_columns.rb +14 -9
  121. data/lib/active_scaffold/data_structures/action_link.rb +4 -5
  122. data/lib/active_scaffold/data_structures/action_links.rb +5 -4
  123. data/lib/active_scaffold/data_structures/actions.rb +2 -2
  124. data/lib/active_scaffold/data_structures/association.rb +8 -0
  125. data/lib/active_scaffold/data_structures/association/abstract.rb +147 -0
  126. data/lib/active_scaffold/data_structures/association/active_mongoid.rb +42 -0
  127. data/lib/active_scaffold/data_structures/association/active_record.rb +94 -0
  128. data/lib/active_scaffold/data_structures/association/mongoid.rb +45 -0
  129. data/lib/active_scaffold/data_structures/bridge.rb +3 -6
  130. data/lib/active_scaffold/data_structures/column.rb +100 -82
  131. data/lib/active_scaffold/data_structures/columns.rb +21 -3
  132. data/lib/active_scaffold/data_structures/nested_info.rb +22 -37
  133. data/lib/active_scaffold/data_structures/set.rb +4 -4
  134. data/lib/active_scaffold/data_structures/sorting.rb +29 -15
  135. data/lib/active_scaffold/engine.rb +3 -1
  136. data/lib/active_scaffold/extensions/action_controller_rendering.rb +10 -5
  137. data/lib/active_scaffold/extensions/action_view_rendering.rb +65 -59
  138. data/lib/active_scaffold/extensions/left_outer_joins.rb +48 -53
  139. data/lib/active_scaffold/extensions/localize.rb +3 -4
  140. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +7 -11
  141. data/lib/active_scaffold/extensions/paginator_extensions.rb +20 -18
  142. data/lib/active_scaffold/extensions/routing_mapper.rb +104 -40
  143. data/lib/active_scaffold/extensions/to_label.rb +1 -1
  144. data/lib/active_scaffold/extensions/unsaved_associated.rb +4 -13
  145. data/lib/active_scaffold/extensions/unsaved_record.rb +12 -1
  146. data/lib/active_scaffold/finder.rb +200 -134
  147. data/lib/active_scaffold/helpers/action_link_helpers.rb +398 -0
  148. data/lib/active_scaffold/helpers/association_helpers.rb +12 -30
  149. data/lib/active_scaffold/helpers/controller_helpers.rb +74 -24
  150. data/lib/active_scaffold/helpers/form_column_helpers.rb +205 -112
  151. data/lib/active_scaffold/helpers/human_condition_helpers.rb +21 -11
  152. data/lib/active_scaffold/helpers/id_helpers.rb +1 -1
  153. data/lib/active_scaffold/helpers/list_column_helpers.rb +117 -39
  154. data/lib/active_scaffold/helpers/pagination_helpers.rb +11 -14
  155. data/lib/active_scaffold/helpers/search_column_helpers.rb +69 -32
  156. data/lib/active_scaffold/helpers/show_column_helpers.rb +9 -3
  157. data/lib/active_scaffold/helpers/view_helpers.rb +41 -426
  158. data/lib/active_scaffold/orm_checks.rb +109 -0
  159. data/lib/active_scaffold/paginator.rb +1 -1
  160. data/lib/active_scaffold/responds_to_parent.rb +12 -10
  161. data/lib/active_scaffold/tableless.rb +81 -43
  162. data/lib/active_scaffold/version.rb +2 -2
  163. data/lib/generators/active_scaffold/controller_generator.rb +49 -0
  164. data/lib/generators/active_scaffold/install_generator.rb +45 -0
  165. data/lib/generators/active_scaffold/resource_generator.rb +56 -0
  166. data/lib/generators/{active_scaffold_controller/templates → templates}/controller.rb +0 -0
  167. data/lib/generators/{active_scaffold_controller/templates → templates}/helper.rb +0 -0
  168. data/shoulda_macros/macros.rb +3 -3
  169. data/test/active_scaffold_config_mock.rb +33 -0
  170. data/test/bridges/bridge_test.rb +9 -9
  171. data/test/bridges/date_picker_test.rb +3 -1
  172. data/test/bridges/paper_trail_test.rb +2 -3
  173. data/test/bridges/paperclip_test.rb +21 -10
  174. data/test/bridges/tiny_mce_test.rb +20 -21
  175. data/test/class_with_finder.rb +42 -0
  176. data/test/company.rb +6 -4
  177. data/test/config/core_test.rb +1 -1
  178. data/test/config/create_test.rb +1 -1
  179. data/test/config/list_test.rb +3 -3
  180. data/test/config/update_test.rb +3 -3
  181. data/test/data_structures/action_columns_test.rb +3 -3
  182. data/test/data_structures/association_column_test.rb +5 -5
  183. data/test/data_structures/column_test.rb +14 -14
  184. data/test/data_structures/columns_test.rb +2 -2
  185. data/test/data_structures/set_test.rb +2 -2
  186. data/test/data_structures/sorting_test.rb +6 -4
  187. data/test/extensions/active_record_test.rb +1 -1
  188. data/test/extensions/routing_mapper_test.rb +64 -13
  189. data/test/helpers/form_column_helpers_test.rb +6 -6
  190. data/test/helpers/list_column_helpers_test.rb +9 -5
  191. data/test/helpers/pagination_helpers_test.rb +1 -0
  192. data/test/misc/active_record_permissions_test.rb +18 -1
  193. data/test/misc/attribute_params_test.rb +26 -17
  194. data/test/misc/calculation_test.rb +8 -31
  195. data/test/misc/configurable_test.rb +3 -2
  196. data/test/misc/constraints_test.rb +33 -22
  197. data/test/misc/convert_numbers_format_test.rb +28 -10
  198. data/test/misc/finder_test.rb +6 -29
  199. data/test/misc/parse_datetime_test.rb +160 -0
  200. data/test/misc/render_test.rb +1 -1
  201. data/test/misc/tableless_test.rb +24 -0
  202. data/test/mock_app/app/models/building.rb +2 -1
  203. data/test/mock_app/config.ru +1 -1
  204. data/test/mock_app/config/environments/test.rb +1 -1
  205. data/test/mock_app/config/routes.rb +11 -3
  206. data/test/model_stub.rb +11 -6
  207. data/test/run_all.rb +1 -1
  208. data/test/test_helper.rb +19 -4
  209. metadata +42 -23
  210. data/lib/active_scaffold/data_structures/error_message.rb +0 -22
  211. data/lib/active_scaffold/extensions/reverse_associations.rb +0 -119
  212. data/lib/generators/active_scaffold/USAGE +0 -29
  213. data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
  214. data/lib/generators/active_scaffold_controller/USAGE +0 -19
  215. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
  216. data/test/data_structures/error_message_test.rb +0 -25
@@ -0,0 +1,109 @@
1
+ module ActiveScaffold
2
+ module OrmChecks
3
+ class << self
4
+ def active_record?(klass)
5
+ return unless defined? ActiveRecord
6
+ klass < ActiveRecord::Base
7
+ end
8
+
9
+ def mongoid?(klass)
10
+ return unless defined? Mongoid
11
+ klass < Mongoid::Document
12
+ end
13
+
14
+ def tableless?(klass)
15
+ klass < ActiveScaffold::Tableless
16
+ end
17
+
18
+ def table_name(klass)
19
+ if active_record? klass
20
+ klass.table_name
21
+ elsif mongoid? klass
22
+ klass.collection.name
23
+ end
24
+ end
25
+
26
+ def quoted_table_name(klass)
27
+ klass.quoted_table_name if active_record? klass
28
+ end
29
+
30
+ def columns(klass)
31
+ if active_record? klass
32
+ klass.columns
33
+ elsif mongoid? klass
34
+ klass.fields.values
35
+ else
36
+ []
37
+ end
38
+ end
39
+
40
+ def columns_hash(klass)
41
+ if active_record? klass
42
+ klass.columns_hash
43
+ elsif mongoid? klass
44
+ klass.fields
45
+ else
46
+ []
47
+ end
48
+ end
49
+
50
+ def reflect_on_all_associations(klass)
51
+ if active_record? klass
52
+ klass.reflect_on_all_associations
53
+ elsif mongoid? klass
54
+ klass.relations.values
55
+ else
56
+ []
57
+ end
58
+ end
59
+
60
+ def content_columns(klass)
61
+ if active_record? klass
62
+ klass.content_columns
63
+ elsif mongoid? klass
64
+ klass.fields.reject { |field, _| field == '_id' }.values
65
+ else
66
+ []
67
+ end
68
+ end
69
+
70
+ def type_for_attribute(klass, column_name)
71
+ if active_record? klass
72
+ if klass.respond_to? :type_for_attribute
73
+ klass.type_for_attribute column_name.to_s
74
+ else # Rails.version < 4.2
75
+ klass.column_types[column_name.to_s]
76
+ end
77
+ elsif mongoid? klass
78
+ klass.fields[column_name.to_s].type
79
+ end
80
+ end
81
+
82
+ def column_type(klass, column_name)
83
+ if active_record? klass
84
+ type_for_attribute(klass, column_name).type
85
+ elsif mongoid? klass
86
+ type_for_attribute(klass, column_name)
87
+ end
88
+ end
89
+ end
90
+
91
+ %i[active_record? mongoid? tableless?].each do |method|
92
+ define_method method do
93
+ ActiveScaffold::OrmChecks.send method, active_record_class
94
+ end
95
+ end
96
+
97
+ %i[_table_name _quoted_table_name _columns _columns_hash _reflect_on_all_associations _content_columns].each do |method|
98
+ define_method method do
99
+ ActiveScaffold::OrmChecks.send method.to_s[1..-1], active_record_class
100
+ end
101
+ end
102
+
103
+ %i[type_for_attribute column_type].each do |method|
104
+ define_method method do |column_name|
105
+ ActiveScaffold::OrmChecks.send method, active_record_class, column_name
106
+ end
107
+ end
108
+ end
109
+ end
@@ -1,7 +1,7 @@
1
1
  require 'forwardable'
2
2
 
3
3
  class Paginator
4
- VERSION = '1.0.9'
4
+ VERSION = '1.0.9'.freeze
5
5
 
6
6
  class ArgumentError < ::ArgumentError; end
7
7
  class MissingCountError < ArgumentError; end
@@ -9,12 +9,12 @@ module ActiveScaffold
9
9
  return unless performed?
10
10
 
11
11
  # Either pull out a redirect or the request body
12
- script = if response.headers['Location']
13
- "document.location.href = '#{self.class.helpers.escape_javascript response.headers.delete('Location').to_s}'"
14
- else
15
- response.body || ''
12
+ script = if response.headers['Location']
13
+ "document.location.href = '#{self.class.helpers.escape_javascript response.headers.delete('Location').to_s}'"
14
+ else
15
+ response.body || ''
16
16
  end
17
- response.status = 200 if (300...400).include? response.status
17
+ response.status = 200 if (300...400).cover? response.status
18
18
 
19
19
  # Eval in parent scope and replace document location of this frame
20
20
  # so back button doesn't replay action on targeted forms
@@ -27,9 +27,6 @@ module ActiveScaffold
27
27
  with(window.parent) { setTimeout(function() { window.eval('#{self.class.helpers.escape_javascript script}'); window.loc && loc.replace('about:blank'); }, 1) }
28
28
  </script></body></html>"
29
29
 
30
- # We're returning HTML instead of JS or XML now
31
- response.headers['Content-Type'] = 'text/html; charset=UTF-8'
32
-
33
30
  # Clear out the previous render to prevent double render and then render
34
31
  if respond_to?(:erase_results, true)
35
32
  erase_results
@@ -37,8 +34,13 @@ module ActiveScaffold
37
34
  instance_variable_set(:@_response_body, nil)
38
35
  end
39
36
 
40
- render :text => script
37
+ # We're returning HTML instead of JS now
38
+ if Rails.version < '4.1'
39
+ render text: script, content_type: 'text/html' # remove when rails 4.0 is not supported
40
+ else
41
+ render html: script.html_safe, content_type: 'text/html' # rubocop:disable Rails/OutputSafety
42
+ end
41
43
  end
42
- alias_method :respond_to_parent, :responds_to_parent
44
+ alias respond_to_parent responds_to_parent
43
45
  end
44
46
  end
@@ -1,25 +1,29 @@
1
1
  class ActiveScaffold::Tableless < ActiveRecord::Base
2
2
  class AssociationScope < ActiveRecord::Associations::AssociationScope
3
- def column_for(table_name, column_name, alias_tracker = nil)
4
- klass = alias_tracker ? alias_tracker.connection.klass : self.klass
5
- if table_name == klass.table_name
6
- klass.columns_hash[column_name]
7
- elsif alias_tracker && (klass = alias_tracker.instance_variable_get(:@assoc_klass))
8
- klass.columns_hash[column_name]
9
- else # rails < 4.1
10
- association.klass.columns_hash[column_name]
11
- end
12
- end
13
-
14
3
  if defined?(ActiveRecord::Associations::AssociationScope::INSTANCE) # rails >= 4.1
15
4
  INSTANCE = respond_to?(:create) ? create : new # create for rails >= 4.2
16
5
  def self.scope(association, connection)
17
6
  INSTANCE.scope association, connection
18
7
  end
8
+ end
19
9
 
20
- def add_constraints(scope, owner, assoc_klass, refl, tracker)
21
- tracker.instance_variable_set(:@assoc_klass, assoc_klass)
22
- super
10
+ if Rails.version < '5.0.0'
11
+ def column_for(table_name, column_name, alias_tracker = nil)
12
+ klass = alias_tracker ? alias_tracker.connection.klass : self.klass
13
+ if table_name == klass.table_name
14
+ klass.columns_hash[column_name]
15
+ elsif alias_tracker && (klass = alias_tracker.instance_variable_get(:@assoc_klass))
16
+ klass.columns_hash[column_name]
17
+ else # rails < 4.1
18
+ association.klass.columns_hash[column_name]
19
+ end
20
+ end
21
+
22
+ if Rails.version >= '4.1'
23
+ def add_constraints(scope, owner, assoc_klass, refl, tracker)
24
+ tracker.instance_variable_set(:@assoc_klass, assoc_klass)
25
+ super
26
+ end
23
27
  end
24
28
  end
25
29
  end
@@ -30,10 +34,19 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
30
34
  super(nil, *args)
31
35
  @klass = klass
32
36
  end
37
+
38
+ def columns(table_name)
39
+ klass.columns
40
+ end
33
41
  end
34
42
 
35
43
  class Column < ActiveRecord::ConnectionAdapters::Column
36
- if instance_method(:initialize).arity == -4 # rails >= 4.2
44
+ if Rails.version >= '5.0.0'
45
+ def initialize(name, default, sql_type = nil, null = true)
46
+ metadata = ActiveRecord::Base.connection.send :fetch_type_metadata, sql_type
47
+ super(name, default, metadata, null)
48
+ end
49
+ elsif Rails.version >= '4.2.0'
37
50
  def initialize(name, default, sql_type = nil, null = true)
38
51
  cast_type = ActiveRecord::Base.connection.send :lookup_cast_type, sql_type
39
52
  super(name, default, cast_type, sql_type, null)
@@ -41,15 +54,10 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
41
54
  end
42
55
  end
43
56
 
44
- module Association
45
- def self.included(base)
46
- base.alias_method_chain :association_scope, :tableless
47
- base.alias_method_chain :target_scope, :tableless
48
- end
49
-
50
- def association_scope_with_tableless
57
+ module Tableless
58
+ def association_scope
51
59
  @association_scope ||= overrided_association_scope if klass < ActiveScaffold::Tableless
52
- association_scope_without_tableless
60
+ super
53
61
  end
54
62
 
55
63
  def overrided_association_scope
@@ -60,8 +68,8 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
60
68
  end
61
69
  end
62
70
 
63
- def target_scope_with_tableless
64
- target_scope_without_tableless.tap do |scope|
71
+ def target_scope
72
+ super.tap do |scope|
65
73
  if klass < ActiveScaffold::Tableless
66
74
  class << scope; include RelationExtension; end
67
75
  end
@@ -69,30 +77,49 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
69
77
  end
70
78
  end
71
79
 
80
+ module Association
81
+ def self.included(base)
82
+ base.prepend Tableless
83
+ end
84
+ end
85
+
86
+ module TablelessCollectionAssociation
87
+ def get_records
88
+ klass < ActiveScaffold::Tableless ? scope.to_a : super
89
+ end
90
+ end
91
+
72
92
  module CollectionAssociation
73
93
  def self.included(base)
74
- base.alias_method_chain :get_records, :tableless if Rails.version >= '4.2'
94
+ base.prepend TablelessCollectionAssociation if Rails.version >= '4.2'
75
95
  end
76
- def get_records_with_tableless
77
- klass < ActiveScaffold::Tableless ? scope.to_a : get_records_without_tableless
96
+ end
97
+
98
+ module TablelessSingularAssociation
99
+ def get_records
100
+ klass < ActiveScaffold::Tableless ? scope.limit(1).to_a : super
78
101
  end
79
102
  end
80
103
 
81
104
  module SingularAssociation
82
105
  def self.included(base)
83
- base.alias_method_chain :get_records, :tableless if Rails.version >= '4.2'
84
- end
85
- def get_records_with_tableless
86
- klass < ActiveScaffold::Tableless ? scope.limit(1).to_a : get_records_without_tableless
106
+ base.prepend TablelessSingularAssociation
87
107
  end
88
108
  end
89
109
 
90
110
  module RelationExtension
91
111
  attr_reader :conditions
92
112
 
93
- def initialize(klass, table)
94
- super
95
- @conditions ||= []
113
+ if Rails.version >= '5.0'
114
+ def initialize(klass, table, predicate_builder, values = {})
115
+ super
116
+ @conditions ||= []
117
+ end
118
+ else
119
+ def initialize(klass, table)
120
+ super
121
+ @conditions ||= []
122
+ end
96
123
  end
97
124
 
98
125
  def initialize_copy(other)
@@ -101,7 +128,7 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
101
128
  end
102
129
 
103
130
  def where(opts, *rest)
104
- unless opts.blank?
131
+ if opts.present?
105
132
  opts = opts.with_indifferent_access if opts.is_a? Hash
106
133
  @conditions << (rest.empty? ? opts : [opts, *rest])
107
134
  end
@@ -140,7 +167,9 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
140
167
  private
141
168
 
142
169
  def relation
143
- ActiveScaffold::Tableless::Relation.new(self, arel_table)
170
+ args = [self, arel_table]
171
+ args << predicate_builder if Rails.version >= '5.0.0'
172
+ ActiveScaffold::Tableless::Relation.new(*args)
144
173
  end
145
174
  end
146
175
 
@@ -162,17 +191,28 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
162
191
  super
163
192
  end
164
193
  end
165
- def self.initialize_find_by_cache
166
- self.find_by_statement_cache = Hash.new { |h, k| h[k] = StatementCache.new(k) }
194
+ if Rails.version >= '5.0'
195
+ def self.initialize_find_by_cache
196
+ @find_by_statement_cache = {
197
+ true => Hash.new { |h, k| h[k] = StatementCache.new(k) },
198
+ false => Hash.new { |h, k| h[k] = StatementCache.new(k) }
199
+ }
200
+ end
201
+ else
202
+ def self.initialize_find_by_cache
203
+ self.find_by_statement_cache = Hash.new { |h, k| h[k] = StatementCache.new(k) }
204
+ end
167
205
  end
168
206
  end
169
207
 
170
208
  def self.columns
171
209
  @tableless_columns ||= []
172
210
  end
211
+
173
212
  def self.table_name
174
213
  @table_name ||= ActiveModel::Naming.plural(self)
175
214
  end
215
+
176
216
  def self.table_exists?
177
217
  true
178
218
  end
@@ -210,12 +250,10 @@ class ActiveScaffold::Tableless < ActiveRecord::Base
210
250
  def _create_record #:nodoc:
211
251
  run_callbacks(:create) {}
212
252
  end
213
- alias_method :create_record, :_create_record # for rails4 < 4.0.6, < 4.1.2
214
- alias_method :create, :_create_record # for rails3
253
+ alias create_record _create_record # for rails4 < 4.0.6, < 4.1.2
215
254
 
216
255
  def _update_record(*) #:nodoc:
217
256
  run_callbacks(:update) {}
218
257
  end
219
- alias_method :update_record, :_update_record # for rails4 < 4.0.6, < 4.1.2
220
- alias_method :update, :_update_record # for rails3
258
+ alias update_record _update_record # for rails4 < 4.0.6, < 4.1.2
221
259
  end
@@ -1,8 +1,8 @@
1
1
  module ActiveScaffold
2
2
  module Version
3
3
  MAJOR = 3
4
- MINOR = 4
5
- PATCH = 43
4
+ MINOR = 5
5
+ PATCH = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
@@ -0,0 +1,49 @@
1
+ # require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
2
+
3
+ module ActiveScaffold
4
+ module Generators
5
+ class ControllerGenerator < Rails::Generators::NamedBase # metagenerator
6
+ include Rails::Generators::ResourceHelpers
7
+
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ check_class_collision :suffix => 'Controller'
11
+
12
+ class_option :orm, :banner => 'NAME', :type => :string, :required => true,
13
+ :desc => 'ORM to generate the controller for'
14
+
15
+ desc <<-DESC.strip_heredoc
16
+ Description:
17
+ Stubs out a active_scaffolded controller. Pass the model name,
18
+ either CamelCased or under_scored.
19
+ The controller name is retrieved as a pluralized version of the model
20
+ name.
21
+
22
+ To create a controller within a module, specify the model name as a
23
+ path like 'parent_module/controller_name'.
24
+
25
+ This generates a controller class in app/controllers and invokes helper,
26
+ template engine and test framework generators.
27
+
28
+ Example:
29
+ `rails generate active_scaffold:controller CreditCard`
30
+
31
+ Credit card controller with URLs like /credit_card/debit.
32
+ Controller: app/controllers/credit_cards_controller.rb
33
+ Functional Test: test/functional/credit_cards_controller_test.rb
34
+ Helper: app/helpers/credit_cards_helper.rb
35
+ DESC
36
+
37
+ def create_controller_files
38
+ template 'controller.rb', File.join('app/controllers', class_path, "#{controller_file_name}_controller.rb")
39
+ template 'helper.rb', File.join('app/helpers', class_path, "#{controller_file_name}_helper.rb")
40
+ end
41
+
42
+ hook_for :test_framework, :as => :scaffold
43
+
44
+ def create_view_root_folder
45
+ empty_directory File.join('app/views', controller_file_path)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,45 @@
1
+ require 'rails/generators/base'
2
+ # require 'generators/active_scaffold_controller/active_scaffold_controller_generator'
3
+
4
+ module ActiveScaffold
5
+ module Generators
6
+ class InstallGenerator < Rails::Generators::Base # metagenerator
7
+ desc 'Add concerns to routes and require lines to assets manifest files'
8
+
9
+ def add_concern_routes
10
+ route 'concern :active_scaffold, ActiveScaffold::Routing::Basic.new(association: true)'
11
+ route 'concern :active_scaffold_association, ActiveScaffold::Routing::Association.new'
12
+ end
13
+
14
+ def add_to_javascript_manifest
15
+ file = 'app/assets/javascripts/application.js'
16
+ unless File.exist?(file)
17
+ say_status :missing, file, :red
18
+ return if options[:pretend]
19
+ raise Thor::Error, "JS file #{file} is required for ActiveScaffold"
20
+ end
21
+ original_js = File.binread(file)
22
+ if original_js.include?('require active_scaffold')
23
+ say_status('skipped', 'insert into app/assets/javascripts/application.js', :yellow)
24
+ else
25
+ insert_into_file 'app/assets/javascripts/application.js', :after => %r{//= require +.*ujs['"]?\n} do
26
+ "//= require active_scaffold\n"
27
+ end
28
+ end
29
+ end
30
+
31
+ def add_to_stylesheet_manifest
32
+ file = 'app/assets/stylesheets/application.css'
33
+ return unless File.exist?(file)
34
+ original_css = File.binread(file)
35
+ if original_css =~ /require active_scaffold$/
36
+ say_status('skipped', 'insert into app/assets/stylesheets/application.css', :yellow)
37
+ else
38
+ insert_into_file 'app/assets/stylesheets/application.css', :before => %r{[ ]*\*/} do
39
+ " *= require active_scaffold\n"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end