brain_damage 0.1.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 (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