brain_damage 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (215) hide show
  1. checksums.yaml +7 -0
  2. data/.byebug_history +32 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +4 -0
  6. data/CODE_OF_CONDUCT.md +13 -0
  7. data/Gemfile +7 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +41 -0
  10. data/Rakefile +6 -0
  11. data/app/assets/javascripts/ajax_delete.js.coffee +14 -0
  12. data/app/assets/javascripts/ajax_form.js.coffee +94 -0
  13. data/app/assets/javascripts/autocomplete-input.js.coffee +43 -0
  14. data/app/assets/javascripts/autocomplete-list.js.coffee +41 -0
  15. data/app/assets/javascripts/autocomplete-simple-select.js.coffee +39 -0
  16. data/app/assets/javascripts/autocomplete.js.coffee +17 -0
  17. data/app/assets/javascripts/brain_damage.js +3 -0
  18. data/app/assets/javascripts/datepicker.js.coffee +49 -0
  19. data/app/assets/javascripts/document_validity_input.js.coffee +16 -0
  20. data/app/assets/javascripts/expandable-list.js.coffee +16 -0
  21. data/app/assets/javascripts/form_initializer.js.coffee +8 -0
  22. data/app/assets/javascripts/helpers/conditionally-visible-field.js.coffee +13 -0
  23. data/app/assets/javascripts/hideable_content.js.coffee +25 -0
  24. data/app/assets/javascripts/inline_edit.js.coffee +58 -0
  25. data/app/assets/javascripts/label_file_field.js.coffee +22 -0
  26. data/app/assets/javascripts/label_file_field_ui_initializer.js.coffee +10 -0
  27. data/app/assets/javascripts/list_item.js.coffee +10 -0
  28. data/app/assets/javascripts/nested_form_controls.js.coffee +84 -0
  29. data/app/assets/javascripts/polymorphic_hibrid_input.js.coffee +14 -0
  30. data/app/assets/javascripts/polymorphic_select_input.js.coffee +28 -0
  31. data/app/assets/javascripts/rails.validations.actionView.js.coffee +18 -0
  32. data/app/assets/javascripts/scroll_loader.js.coffee +28 -0
  33. data/app/assets/javascripts/searchable_contents.js.coffee +62 -0
  34. data/app/assets/javascripts/selectable-list.js.coffee +92 -0
  35. data/app/assets/javascripts/sensible_to_ajax_view.js.coffee +60 -0
  36. data/app/assets/javascripts/single_page_manager.js.coffee +60 -0
  37. data/app/assets/javascripts/stylesheets/_custom-best-in-place.css.sass +12 -0
  38. data/app/assets/javascripts/stylesheets/_top-search.css.sass +0 -0
  39. data/app/assets/javascripts/stylesheets/application.css +0 -0
  40. data/app/assets/javascripts/trailing_form.js.coffee +16 -0
  41. data/app/assets/javascripts/ui_initializer.js.coffee +23 -0
  42. data/app/assets/javascripts/underscore.min.js +6 -0
  43. data/app/assets/stylesheets/brain_damage.css.sass +214 -0
  44. data/app/views/brain_damage/_empty.html.haml +1 -0
  45. data/app/views/brain_damage/empty.html.haml +1 -0
  46. data/bin/console +14 -0
  47. data/bin/setup +7 -0
  48. data/brain_damage.gemspec +36 -0
  49. data/lib/brain_damage.rb +16 -0
  50. data/lib/brain_damage/brain_damage_helper.rb +75 -0
  51. data/lib/brain_damage/version.rb +3 -0
  52. data/lib/generators/brain_damage/full/full_generator.rb +37 -0
  53. data/lib/generators/brain_damage/lib/controller/controller_generator.rb +45 -0
  54. data/lib/generators/brain_damage/lib/controller/templates/controller.rb +9 -0
  55. data/lib/generators/brain_damage/lib/controller/templates/private_methods/get_partial_locals.rb +3 -0
  56. data/lib/generators/brain_damage/lib/controller/templates/private_methods/set_singular_table_name.rb +3 -0
  57. data/lib/generators/brain_damage/lib/controller/templates/private_methods/singular_table_name_params.rb +3 -0
  58. data/lib/generators/brain_damage/lib/controller/templates/public_methods/create.rb +21 -0
  59. data/lib/generators/brain_damage/lib/controller/templates/public_methods/destroy.rb +14 -0
  60. data/lib/generators/brain_damage/lib/controller/templates/public_methods/edit.rb +2 -0
  61. data/lib/generators/brain_damage/lib/controller/templates/public_methods/index.rb +3 -0
  62. data/lib/generators/brain_damage/lib/controller/templates/public_methods/new.rb +3 -0
  63. data/lib/generators/brain_damage/lib/controller/templates/public_methods/show.rb +2 -0
  64. data/lib/generators/brain_damage/lib/controller/templates/public_methods/update.rb +25 -0
  65. data/lib/generators/brain_damage/lib/field.rb +163 -0
  66. data/lib/generators/brain_damage/lib/field_white_list.rb +21 -0
  67. data/lib/generators/brain_damage/lib/includes.rb +12 -0
  68. data/lib/generators/brain_damage/lib/migration.rb +76 -0
  69. data/lib/generators/brain_damage/lib/model/model_generator.rb +115 -0
  70. data/lib/generators/brain_damage/lib/model/templates/model.rb +12 -0
  71. data/lib/generators/brain_damage/lib/parametizer.rb +19 -0
  72. data/lib/generators/brain_damage/lib/relation/base.rb +50 -0
  73. data/lib/generators/brain_damage/lib/relation/belongs_to.rb +29 -0
  74. data/lib/generators/brain_damage/lib/relation/has_and_belongs_to_many.rb +22 -0
  75. data/lib/generators/brain_damage/lib/relation/has_many.rb +35 -0
  76. data/lib/generators/brain_damage/lib/relation/has_one.rb +18 -0
  77. data/lib/generators/brain_damage/lib/resource.rb +150 -0
  78. data/lib/generators/brain_damage/lib/ruby_simple_parser/block.rb +33 -0
  79. data/lib/generators/brain_damage/lib/ruby_simple_parser/class_definition.rb +19 -0
  80. data/lib/generators/brain_damage/lib/ruby_simple_parser/code_line.rb +16 -0
  81. data/lib/generators/brain_damage/lib/ruby_simple_parser/global_context.rb +8 -0
  82. data/lib/generators/brain_damage/lib/ruby_simple_parser/line_classifier.rb +107 -0
  83. data/lib/generators/brain_damage/lib/ruby_simple_parser/method.rb +23 -0
  84. data/lib/generators/brain_damage/lib/ruby_simple_parser/parser.rb +114 -0
  85. data/lib/generators/brain_damage/lib/ruby_simple_parser/ruby_simple_parser.rb +11 -0
  86. data/lib/generators/brain_damage/lib/templateable/base.rb +53 -0
  87. data/lib/generators/brain_damage/lib/templateable/class_templateable.rb +88 -0
  88. data/lib/generators/brain_damage/lib/templateable/field_templateable.rb +42 -0
  89. data/lib/generators/brain_damage/lib/templateable/view_templateable.rb +23 -0
  90. data/lib/generators/brain_damage/lib/views/displays/base.rb +14 -0
  91. data/lib/generators/brain_damage/lib/views/displays/bright_text.rb +14 -0
  92. data/lib/generators/brain_damage/lib/views/displays/collection_list.rb +22 -0
  93. data/lib/generators/brain_damage/lib/views/displays/default.rb +11 -0
  94. data/lib/generators/brain_damage/lib/views/displays/foreign_single_page_manager.rb +46 -0
  95. data/lib/generators/brain_damage/lib/views/displays/hidden.rb +26 -0
  96. data/lib/generators/brain_damage/lib/views/displays/inline_editable.rb +27 -0
  97. data/lib/generators/brain_damage/lib/views/displays/link_to.rb +42 -0
  98. data/lib/generators/brain_damage/lib/views/displays/linked_collection_list.rb +26 -0
  99. data/lib/generators/brain_damage/lib/views/displays/templates/bright_text.html.haml +7 -0
  100. data/lib/generators/brain_damage/lib/views/displays/templates/collection_list.html.haml +31 -0
  101. data/lib/generators/brain_damage/lib/views/displays/templates/custom.html.haml +5 -0
  102. data/lib/generators/brain_damage/lib/views/displays/templates/default.html.haml +4 -0
  103. data/lib/generators/brain_damage/lib/views/displays/templates/foreign_single_page_manager.html.haml +1 -0
  104. data/lib/generators/brain_damage/lib/views/displays/templates/inline_editable.html.haml +8 -0
  105. data/lib/generators/brain_damage/lib/views/displays/templates/link_to.html.haml +9 -0
  106. data/lib/generators/brain_damage/lib/views/displays/templates/linked_collection_list.html.haml +31 -0
  107. data/lib/generators/brain_damage/lib/views/displays/templates/text.html.haml +4 -0
  108. data/lib/generators/brain_damage/lib/views/displays/templates/yes_or_no.html.haml +4 -0
  109. data/lib/generators/brain_damage/lib/views/displays/text.rb +43 -0
  110. data/lib/generators/brain_damage/lib/views/factory.rb +29 -0
  111. data/lib/generators/brain_damage/lib/views/inputs/autocompletable.rb +26 -0
  112. data/lib/generators/brain_damage/lib/views/inputs/autocompletable_multiple_selection.rb +25 -0
  113. data/lib/generators/brain_damage/lib/views/inputs/autocompletable_simple_selection.rb +21 -0
  114. data/lib/generators/brain_damage/lib/views/inputs/base.rb +23 -0
  115. data/lib/generators/brain_damage/lib/views/inputs/checkbox.rb +14 -0
  116. data/lib/generators/brain_damage/lib/views/inputs/collection_checkboxes.rb +10 -0
  117. data/lib/generators/brain_damage/lib/views/inputs/collection_select.rb +11 -0
  118. data/lib/generators/brain_damage/lib/views/inputs/default.rb +11 -0
  119. data/lib/generators/brain_damage/lib/views/inputs/hierarchy_picker.rb +11 -0
  120. data/lib/generators/brain_damage/lib/views/inputs/nested_form.rb +34 -0
  121. data/lib/generators/brain_damage/lib/views/inputs/nested_on_hideable.rb +22 -0
  122. data/lib/generators/brain_damage/lib/views/inputs/polymorphic_hybrid.rb +44 -0
  123. data/lib/generators/brain_damage/lib/views/inputs/polymorphic_select.rb +33 -0
  124. data/lib/generators/brain_damage/lib/views/inputs/templates/autocompletable_multiple_selection.html.haml +20 -0
  125. data/lib/generators/brain_damage/lib/views/inputs/templates/autocompletable_simple_selection.html.haml +25 -0
  126. data/lib/generators/brain_damage/lib/views/inputs/templates/checkbox.html.haml +3 -0
  127. data/lib/generators/brain_damage/lib/views/inputs/templates/collection_checkboxes.html.haml +6 -0
  128. data/lib/generators/brain_damage/lib/views/inputs/templates/collection_select.html.haml +9 -0
  129. data/lib/generators/brain_damage/lib/views/inputs/templates/custom.html.haml +5 -0
  130. data/lib/generators/brain_damage/lib/views/inputs/templates/default.html.haml +1 -0
  131. data/lib/generators/brain_damage/lib/views/inputs/templates/file.html.haml +5 -0
  132. data/lib/generators/brain_damage/lib/views/inputs/templates/hierarchy_picker.html.haml +19 -0
  133. data/lib/generators/brain_damage/lib/views/inputs/templates/nested_form.html.haml +2 -0
  134. data/lib/generators/brain_damage/lib/views/inputs/templates/polymorphic_hybrid.html.haml +20 -0
  135. data/lib/generators/brain_damage/lib/views/inputs/templates/polymorphic_select.html.haml +22 -0
  136. data/lib/generators/brain_damage/lib/views/inputs/templates/simple_select.html.haml +1 -0
  137. data/lib/generators/brain_damage/lib/views/inputs/templates/text.html.haml +1 -0
  138. data/lib/generators/brain_damage/lib/views/labels/base.rb +26 -0
  139. data/lib/generators/brain_damage/lib/views/labels/default.rb +15 -0
  140. data/lib/generators/brain_damage/lib/views/labels/templates/default.html.haml +6 -0
  141. data/lib/generators/brain_damage/lib/views/modules/inline_editable.rb +16 -0
  142. data/lib/generators/brain_damage/lib/views/schemas/autocompletable.rb +36 -0
  143. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/base.rb +26 -0
  144. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/templates/_links.html.haml +8 -0
  145. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/templates/_multiple_selection.html.haml +6 -0
  146. data/lib/generators/brain_damage/lib/views/schemas/autocompletable/templates/_simple_selection.html.haml +6 -0
  147. data/lib/generators/brain_damage/lib/views/schemas/base.rb +97 -0
  148. data/lib/generators/brain_damage/lib/views/schemas/base/base.rb +86 -0
  149. data/lib/generators/brain_damage/lib/views/schemas/base/form.rb +24 -0
  150. data/lib/generators/brain_damage/lib/views/schemas/base/templates/_fields.html.haml +10 -0
  151. data/lib/generators/brain_damage/lib/views/schemas/base/templates/_form.html.haml +15 -0
  152. data/lib/generators/brain_damage/lib/views/schemas/base/templates/index.html.haml +16 -0
  153. data/lib/generators/brain_damage/lib/views/schemas/base/templates/list/_index.html.haml +4 -0
  154. data/lib/generators/brain_damage/lib/views/schemas/base/templates/list/_item.html.haml +5 -0
  155. data/lib/generators/brain_damage/lib/views/schemas/base/templates/new.html.haml +3 -0
  156. data/lib/generators/brain_damage/lib/views/schemas/base/templates/show.html.haml +9 -0
  157. data/lib/generators/brain_damage/lib/views/schemas/base/templates/table/_header.html.haml +5 -0
  158. data/lib/generators/brain_damage/lib/views/schemas/base/templates/table/_index.html.haml +8 -0
  159. data/lib/generators/brain_damage/lib/views/schemas/base/templates/table/_item.html.haml +5 -0
  160. data/lib/generators/brain_damage/lib/views/schemas/custom.rb +36 -0
  161. data/lib/generators/brain_damage/lib/views/schemas/factory.rb +13 -0
  162. data/lib/generators/brain_damage/lib/views/schemas/inline_editable.rb +27 -0
  163. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/base.rb +20 -0
  164. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/field.rb +47 -0
  165. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/inline_edit.rb +10 -0
  166. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/templates/inline_edit/_field.html.haml +33 -0
  167. data/lib/generators/brain_damage/lib/views/schemas/inline_editable/templates/inline_edit/_inline_edit.html.haml +0 -0
  168. data/lib/generators/brain_damage/lib/views/schemas/nested_fields.rb +14 -0
  169. data/lib/generators/brain_damage/lib/views/schemas/nested_fields/base.rb +20 -0
  170. data/lib/generators/brain_damage/lib/views/schemas/nested_fields/templates/_nested.fields.html.haml +33 -0
  171. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager.rb +22 -0
  172. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/base.rb +40 -0
  173. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/list_item.rb +16 -0
  174. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/_single_page_manager.html.haml +20 -0
  175. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/index.html.haml +1 -0
  176. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_index.form.html.haml +20 -0
  177. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_index.html.haml +27 -0
  178. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_item.display.html.haml +5 -0
  179. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_item.form.html.haml +21 -0
  180. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_item.html.haml +33 -0
  181. data/lib/generators/brain_damage/lib/views/schemas/single_page_manager/templates/list/_simple.html.haml +4 -0
  182. data/lib/generators/brain_damage/lib/views/views_generator.rb +37 -0
  183. data/lib/generators/brain_damage/resource/USAGE +8 -0
  184. data/lib/generators/brain_damage/resource/helpers.rb +117 -0
  185. data/lib/generators/brain_damage/resource/monkeys/string.rb +17 -0
  186. data/lib/generators/brain_damage/resource/resource_generator.rb +139 -0
  187. data/lib/generators/brain_damage/resource/templates/controller.rb +40 -0
  188. data/lib/generators/brain_damage/resource/templates/inputs/_simple_select.html.haml +1 -0
  189. data/lib/generators/brain_damage/resource/templates/views/common/_fields.html.haml +11 -0
  190. data/lib/generators/brain_damage/resource/templates/views/common/show.html.haml +11 -0
  191. data/lib/generators/brain_damage/resource/templates/views/full_entity/_form.html.haml +13 -0
  192. data/lib/generators/brain_damage/resource/templates/views/full_entity/_index.body.html.haml +4 -0
  193. data/lib/generators/brain_damage/resource/templates/views/full_entity/_index.html.haml +5 -0
  194. data/lib/generators/brain_damage/resource/templates/views/full_entity/_table.header.html.haml +7 -0
  195. data/lib/generators/brain_damage/resource/templates/views/full_entity/_table.item.html.haml +8 -0
  196. data/lib/generators/brain_damage/resource/templates/views/full_entity/index.html.haml +16 -0
  197. data/lib/generators/brain_damage/resource/templates/views/full_entity/new.html.haml +3 -0
  198. data/lib/generators/brain_damage/resource/templates/views/scaffold/_menu.entry.html.haml +1 -0
  199. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_form.html.haml +15 -0
  200. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_index.body.html.haml +4 -0
  201. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_single_page_manager.html.haml +17 -0
  202. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.form.html.haml +21 -0
  203. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.header.html.haml +12 -0
  204. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.html.haml +27 -0
  205. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.item.form.html.haml +21 -0
  206. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.item.html.haml +32 -0
  207. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/_table.item.show.html.haml +13 -0
  208. data/lib/generators/brain_damage/resource/templates/views/single_page_manager/index.html.haml +4 -0
  209. data/lib/generators/brain_damage/resource/templates/views/special/_fields.show.inline.html.haml +10 -0
  210. data/lib/generators/brain_damage/resource/templates/views/special/_inline_edit.html.haml +2 -0
  211. data/lib/generators/brain_damage/resource/templates/views/special/_inner.show.inline.html.haml +20 -0
  212. data/lib/generators/brain_damage/resource/templates/views/special/_nested.fields.html.haml +33 -0
  213. data/lib/generators/brain_damage/resource/templates/views/special/_show.inline.html.haml +10 -0
  214. data/lib/generators/brain_damage/resource/templates/views/special/_trailing_form.show.inline.html.haml +12 -0
  215. metadata +328 -0
@@ -0,0 +1,21 @@
1
+ module BrainDamage
2
+ class FieldWhiteList
3
+ def initialize(field, white_list)
4
+ @field = field
5
+ @white_list = white_list
6
+ end
7
+
8
+ def list
9
+ if @white_list
10
+ return ":#{@white_list.keys.first} => #{@white_list.values.first.inspect}" if @white_list.is_a? Hash
11
+ return @white_list.map{ |item| ":#{item}" }.join ', ' if @white_list.is_a? Array
12
+ return nil if @white_list == ''
13
+ return ":#{@white_list.to_s}"
14
+ end
15
+
16
+ return @field.relation.white_list if @field.relation
17
+
18
+ return ":#{@field.name}"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'relation/base'
2
+ require_relative 'relation/belongs_to'
3
+ require_relative 'relation/has_and_belongs_to_many'
4
+ require_relative 'relation/has_many'
5
+ require_relative 'relation/has_one'
6
+
7
+ require_relative 'parametizer'
8
+ require_relative 'migration'
9
+ require_relative 'field'
10
+ require_relative 'controller/controller_generator'
11
+ require_relative 'model/model_generator'
12
+ require_relative 'views/views_generator'
@@ -0,0 +1,76 @@
1
+ module BrainDamage
2
+ class Migration
3
+ def initialize(resource)
4
+ @resource = resource
5
+ end
6
+
7
+ def migration_file_exists?
8
+ file_name = migration_file_full_path
9
+ file_name && File.exists?(file_name)
10
+ end
11
+
12
+ def migration_file_full_path
13
+ Dir["db/migrate/*"].select { |file_name|
14
+ file_name.split('/').last =~ /\d+_create_#{@resource.name.underscore.pluralize}.rb/
15
+ }.first
16
+ end
17
+
18
+ alias_method :skip?, :migration_file_exists?
19
+
20
+ def improve_code(migration_code)
21
+ @migration_lines = migration_code.split "\n"
22
+
23
+ return migration_code if @migration_lines.length == 2
24
+
25
+ add_options_to_lines
26
+ remake_migration
27
+ end
28
+
29
+ def is_column_line? line
30
+ line =~ /t\..*:\w+/
31
+ end
32
+
33
+ def add_options_to_lines
34
+ @migration_lines.map! { |line|
35
+ if is_column_line? line
36
+ related_column = line.scan(/:(\w+)/).first.first.to_sym
37
+ column_options = @resource.columns[related_column] || {}
38
+
39
+ add_options line, related_column, column_options
40
+ else
41
+ line
42
+ end
43
+ }
44
+ end
45
+
46
+ def add_options(line, related_field, field_options)
47
+ options = belongs_to_options line, related_field, field_options
48
+
49
+ field_options.slice(:default, :precision, :scale).each do |key, value|
50
+ options << "#{key}: #{value.inspect}"
51
+ end
52
+
53
+ options_string = options.join ', '
54
+
55
+ if options.length > 0 and !line.include? options_string
56
+ return "#{line}, #{options_string}"
57
+ end
58
+
59
+ line
60
+ end
61
+
62
+ def belongs_to_options(line, related_field, field_options)
63
+ return [] unless is_belongs_to_line? line
64
+ return ["references: :#{field_options[:class_name].underscore.pluralize}"] if field_options[:class_name]
65
+ []
66
+ end
67
+
68
+ def is_belongs_to_line? line
69
+ line.include? 't.belongs_to'
70
+ end
71
+
72
+ def remake_migration
73
+ @migration_lines.join "\n"
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,115 @@
1
+ require_relative '../templateable/class_templateable'
2
+
3
+ module BrainDamage
4
+ class ModelGenerator < Templateable::ClassTemplateable
5
+ def initialize(resource, options = {})
6
+ @template_file = 'model.rb'
7
+ super
8
+ end
9
+
10
+ def generate
11
+ improve_belongs_to_lines
12
+ add_lines_from_fields
13
+ prettify_lines
14
+ super
15
+ end
16
+
17
+ def prettify_lines
18
+ return if @parser.class_method_calls[:after_class_definition].empty?
19
+
20
+ infos = @parser.class_method_calls[:after_class_definition].map { |line|
21
+ code = line.print.strip
22
+
23
+ order = if code.starts_with? 'include'
24
+ 0
25
+ elsif code.strip[0, 3].upcase == code.strip[0, 3]
26
+ unless ['[', '{'].include? code.split("\n").first[-1]
27
+ 1
28
+ else
29
+ 2
30
+ end
31
+ elsif code.starts_with? 'default_scope'
32
+ 3
33
+ elsif code.starts_with? 'scope :'
34
+ 4
35
+ elsif code.starts_with? 'validates '
36
+ 5
37
+ elsif code =~ /^(has_many)|(has_and_bel)|(belongs_to)/
38
+ 6
39
+ elsif code.starts_with? 'accepts_nested_attributes_for'
40
+ 7
41
+ elsif code.starts_with? 'validates_associated'
42
+ 8
43
+ else
44
+ 9
45
+ end
46
+
47
+ { code: code, line: line, order: order }
48
+
49
+ }.sort { |info_a, info_b|
50
+ order = info_a[:order] <=> info_b[:order]
51
+ if order != 0 then order else info_a[:code] <=> info_b[:code] end
52
+ }
53
+
54
+ @parser.class_method_calls[:after_class_definition] = []
55
+ current_info = infos.first
56
+ new_line_number = 0
57
+
58
+ infos.each do |info|
59
+ if info[:order] != current_info[:order]
60
+ @parser.class_method_calls[:after_class_definition] << RubySimpleParser::CodeLine.new("NEW_LINE_#{new_line_number}")
61
+ new_line_number += 1
62
+ current_info = info
63
+ end
64
+
65
+ @parser.class_method_calls[:after_class_definition] << info[:line]
66
+ end
67
+ end
68
+
69
+ def attribute_white_list
70
+ @resource.fields.values.map(&:attr_white_list).reject(&:nil?).join ', '
71
+ end
72
+
73
+ def improve_belongs_to_lines
74
+ return unless @parser and @parser.class_method_calls[:after_class_definition]
75
+
76
+ belongs_to_lines = @parser.class_method_calls[:after_class_definition].each_with_index.map { |line, index|
77
+ [index, line.print]
78
+ }.select{ |pair|
79
+ pair.second =~ /belongs_to :(\w+)\s*$/
80
+ }.map { |pair|
81
+ [pair.first, add_options_to_belongs_to_line(pair.second) ]
82
+ }.each { |pair|
83
+ @parser.class_method_calls[:after_class_definition][pair.first].line = pair.second
84
+ }
85
+ end
86
+
87
+ def add_lines_from_fields
88
+ @parser.class_method_calls[:after_class_definition] += @resource.fields.values.map(&:model_lines).flatten.reject(&:nil?).reject(&:empty?).map { |line|
89
+ RubySimpleParser::CodeLine.new line
90
+
91
+ }
92
+ end
93
+
94
+ def add_options_to_belongs_to_line(line)
95
+ related_field = line.scan(/:(\w+)/).first.first.to_sym
96
+ options = @resource.columns[related_field].dup
97
+ options.delete :type
98
+
99
+ options = options.map { |key, value|
100
+ "#{key}: '#{value}'"
101
+ }
102
+
103
+ if options.any?
104
+ "#{line}, #{options.join(', ')}"
105
+ else
106
+ line
107
+ end
108
+ end
109
+
110
+ private
111
+ def dir
112
+ __dir__
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,12 @@
1
+ <%= class_definition %>
2
+ <%= leading_class_method_calls -%>
3
+
4
+ <%= public_methods -%>
5
+ <% private_methods_code = private_methods %>
6
+
7
+ <% if private_methods_code.present? %>
8
+ private
9
+ <%= private_methods %>
10
+ <% end %>
11
+
12
+ end
@@ -0,0 +1,19 @@
1
+ module BrainDamage
2
+ class Parametizer
3
+ def initialize(resource)
4
+ @resource = resource
5
+ end
6
+
7
+ def as_cmd_parameters
8
+ [@resource.name] + columns_as_parameters
9
+ end
10
+
11
+ def columns_as_parameters
12
+ @resource.columns.map { |column_name, options| column_as_parameter column_name, options }
13
+ end
14
+
15
+ def column_as_parameter(column_name, options)
16
+ "#{column_name.to_s}:#{options[:type].to_s}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,50 @@
1
+ module BrainDamage
2
+ class Relation
3
+ VALID_RELATION_TYPES = [ :belongs_to, :has_and_belongs_to_many, :has_many, :has_one ]
4
+
5
+ def initialize
6
+ raise "class Relation is an abstract class and can't be instantiated"
7
+ end
8
+
9
+ def resource_name_according_to_foreign
10
+ @options[:as] or @options[:inverse_of] or singular_table_name
11
+ end
12
+
13
+ def nested_on
14
+ resource_name_according_to_foreign
15
+ end
16
+
17
+ def class_name
18
+ return @options[:class_name] if @options[:class_name]
19
+ @options[:field].name.to_s.singularize.camelize
20
+ end
21
+
22
+ def model_lines
23
+ []
24
+ end
25
+
26
+ def add_options_to_line(line, options)
27
+ return line unless options
28
+ ([line] + options.map { |name, value|
29
+ if value.is_a? Symbol
30
+ "#{name}: :#{value}"
31
+ else
32
+ "#{name}: '#{value}'"
33
+ end
34
+ }).join ', '
35
+ end
36
+
37
+ def self.is_valid_relation? type
38
+ VALID_RELATION_TYPES.include? type
39
+ end
40
+
41
+ def self.create(type, options)
42
+ return nil unless Relation.is_valid_relation? type
43
+ "BrainDamage::#{type.to_s.camelize}".constantize.new options
44
+ end
45
+
46
+ def white_list
47
+ nil
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'base'
2
+
3
+ module BrainDamage
4
+ class BelongsTo < Relation
5
+ def initialize(options = {})
6
+ @options = options
7
+ end
8
+
9
+ def white_list
10
+ if @options[:white_list]
11
+ if @options[:white_list] == ''
12
+ return nil
13
+ elsif @options[:white_list].is_a? Array
14
+ return @options[:white_list].map { |field| ":#{field}" }.join ', '
15
+ else
16
+ return @options[:white_list].inspect
17
+ end
18
+ else
19
+ field_name = @options[:field].name.to_s
20
+
21
+ unless @options[:polymorphic]
22
+ return ":#{field_name}_id"
23
+ else
24
+ return ":#{field_name}_id, :#{field_name}_type"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ require_relative 'base'
2
+
3
+ module BrainDamage
4
+ class HasAndBelongsToMany < Relation
5
+ def initialize(options = {})
6
+ @options = options
7
+ end
8
+
9
+ def model_lines
10
+ [relationship_line]
11
+ end
12
+
13
+ def relationship_line
14
+ line = "has_and_belongs_to_many :#{@options[:field].name}".indent
15
+ add_options_to_line line, @options.slice(:class_name, :join_table)
16
+ end
17
+
18
+ def white_list
19
+ return ":#{@options[:field].name.to_s.singularize}_ids => []"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'base'
2
+
3
+ module BrainDamage
4
+ class HasMany < Relation
5
+ def initialize(options = {})
6
+ @options = options
7
+ @name = @options[:field].name
8
+ end
9
+
10
+ def model_lines
11
+ [relationship_line, nested_attributes_line, validates_associated_line ]
12
+ end
13
+
14
+ def relationship_line
15
+ line = "has_many :#{@name}".indent
16
+ add_options_to_line line, @options.slice(:class_name, :join_table, :as, :dependent, :foreign_key, :through)
17
+ end
18
+
19
+ def nested_attributes_line
20
+ "accepts_nested_attributes_for :#{@name}, reject_if: proc { |attributes| attributes.values.uniq.first == '' }".indent unless @options[:skip_nested_form]
21
+ end
22
+
23
+ def validates_associated_line
24
+ "validates_associated :#{@name}".indent unless @options[:skip_nested_form]
25
+ end
26
+
27
+ def white_list
28
+ if @options[:white_list]
29
+ return ":#{@name.to_s.pluralize}_attributes => #{@options[:white_list].inspect}"
30
+ else
31
+ return ":#{@name.to_s.singularize}_ids => []"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'base'
2
+
3
+ module BrainDamage
4
+ class HasOne < Relation
5
+ def initialize(options = {})
6
+ @options = options
7
+ end
8
+
9
+ def model_lines
10
+ [relationship_line]
11
+ end
12
+
13
+ def relationship_line
14
+ line = "has_one :#{@options[:field].name}".indent
15
+ add_options_to_line line, @options.slice(:class_name, :join_table, :dependent)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,150 @@
1
+ # -*- coding: utf-8 -*-
2
+ require_relative 'includes'
3
+
4
+ module BrainDamage
5
+ class Resource
6
+ attr_accessor :name
7
+
8
+ attr_reader :root
9
+ attr_reader :columns
10
+ attr_reader :controller
11
+ attr_reader :fields
12
+ attr_reader :model
13
+ attr_reader :views
14
+ attr_reader :migration
15
+ attr_reader :parametizer
16
+
17
+ def initialize(initializers, options = {})
18
+ @columns = {}
19
+ @fields = {}
20
+ @root = options[:root]
21
+
22
+ @parametizer = BrainDamage::Parametizer.new self
23
+ @migration = BrainDamage::Migration.new self
24
+ @controller = BrainDamage::ControllerGenerator.new self
25
+ @model = BrainDamage::ModelGenerator.new self
26
+ @views = BrainDamage::ViewsGenerator.new self
27
+ @closed_for_field_description = false
28
+
29
+ initializers.each do |initializer|
30
+ instance_eval initializer.read, initializer.path if initializer.is_a? File
31
+ end
32
+
33
+ ensure_every_column_is_described
34
+ end
35
+
36
+ def setup(generator)
37
+ @generator = generator
38
+ ensure_every_column_has_its_generated_attribute_object
39
+ end
40
+
41
+ def column_relation_type(column_name)
42
+ return @columns[column_name][:type] if @columns[column_name] and Relation.is_valid_relation? @columns[column_name][:type]
43
+ nil
44
+ end
45
+
46
+ def columns=(column_hash)
47
+ column_hash.each do |name, options|
48
+ if options.is_a? Symbol
49
+ @columns[name] = { type: options }
50
+ else
51
+ @columns[name] = options
52
+ end
53
+ end
54
+ end
55
+
56
+ def describe(name)
57
+ self.name = name
58
+ yield self if block_given?
59
+ end
60
+
61
+ def describe_field(name)
62
+ if @closed_for_field_description
63
+ puts "ERROR: Trying to describe field #{name} after field description has been closed.
64
+ Are you trying to describe a field after describing the views?"
65
+ return
66
+ end
67
+
68
+ @fields[name] = Field.new(name: name, resource: self) unless @fields[name]
69
+ yield @fields[name] if block_given?
70
+
71
+ unless @fields[name].relation
72
+ @fields[name].relation = {}
73
+ end
74
+ end
75
+
76
+ def describe_controller
77
+ yield @controller if block_given?
78
+ end
79
+
80
+ def describe_model
81
+ yield @model if block_given?
82
+ end
83
+
84
+ def describe_views
85
+ ensure_every_column_is_described
86
+ yield @views if block_given?
87
+ end
88
+
89
+ def inputable_fields(identifier = :default)
90
+ sort_fields(fields.values.select{ |field|
91
+ field.inputable? identifier
92
+ })
93
+ end
94
+
95
+ def uninputable_fields
96
+ fields.values.reject(&:inputable?)
97
+ end
98
+
99
+ def undisplayable_fields
100
+ fields.values.reject(&:displayable?)
101
+ end
102
+
103
+ def displayable_fields(identifier = :default)
104
+ sort_fields(fields.values.select{ |field|
105
+ field.displayable? identifier
106
+ })
107
+ end
108
+
109
+ def sort_fields(fields)
110
+ names = @columns.keys
111
+ fields.sort { |field_a, field_b|
112
+ (names.index(field_a.name) || 999) <=>
113
+ (names.index(field_b.name) || 999)
114
+ }
115
+ end
116
+
117
+ def displayable_and_inputable_fields(identifier = :default)
118
+ inputable_fields(identifier) & displayable_fields(identifier)
119
+ end
120
+
121
+ def ensure_every_column_is_described
122
+ (@columns.keys - @fields.keys).each do |column_name|
123
+ describe_field column_name do |field|
124
+ field.display = :default
125
+ field.input = :default
126
+ end
127
+ end
128
+
129
+ uninputable_fields.each do |field|
130
+ field.input = :default unless field.input(:default) == false
131
+ end
132
+
133
+ undisplayable_fields.each do |field|
134
+ field.display = :default unless field.display(:default) == false
135
+ end
136
+
137
+ @closed_for_field_description = true
138
+ end
139
+
140
+ def ensure_every_column_has_its_generated_attribute_object
141
+ attributes.each do |attribute|
142
+ @fields[attribute.name.to_sym].generated_attribute = attribute
143
+ end
144
+ end
145
+
146
+ def method_missing(method, *args, &block)
147
+ @generator.send method, *args, &block
148
+ end
149
+ end
150
+ end