wallaby 5.0.1 → 5.1.3

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 (350) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -3
  3. data/app/assets/images/wallaby/404.png +0 -0
  4. data/app/assets/images/wallaby/422.png +0 -0
  5. data/app/assets/images/wallaby/500.png +0 -0
  6. data/app/assets/javascripts/wallaby/application.js +1 -15
  7. data/app/assets/javascripts/wallaby/auto_select.js +77 -0
  8. data/app/assets/javascripts/wallaby/base.js +17 -0
  9. data/app/assets/javascripts/wallaby/setup.js.erb +60 -0
  10. data/app/assets/stylesheets/wallaby/application.scss +1 -51
  11. data/app/assets/stylesheets/wallaby/base/_layout.scss +257 -9
  12. data/app/assets/stylesheets/wallaby/base/_layout_desktop.scss +53 -0
  13. data/app/assets/stylesheets/wallaby/base/_mixins.scss +119 -0
  14. data/app/assets/stylesheets/wallaby/base/_override.scss +10 -0
  15. data/app/assets/stylesheets/wallaby/base/_vars.scss +72 -2
  16. data/app/assets/stylesheets/wallaby/base.scss +27 -0
  17. data/app/assets/stylesheets/wallaby/components/_auto_select.scss +119 -0
  18. data/app/assets/stylesheets/wallaby/components/_auto_select_desktop.scss +7 -0
  19. data/app/assets/stylesheets/wallaby/components/_color_square.scss +8 -0
  20. data/app/assets/stylesheets/wallaby/components/_filters.scss +14 -0
  21. data/app/assets/stylesheets/wallaby/components/_links.scss +25 -0
  22. data/app/assets/stylesheets/wallaby/components/_pagination.scss +35 -91
  23. data/app/assets/stylesheets/wallaby/components/_query.scss +101 -0
  24. data/app/assets/stylesheets/wallaby/components/_text.scss +6 -6
  25. data/app/assets/stylesheets/wallaby/pages/_error.scss +108 -0
  26. data/app/assets/stylesheets/wallaby/pages/_form.scss +40 -0
  27. data/app/assets/stylesheets/wallaby/pages/_index.scss +193 -0
  28. data/app/assets/stylesheets/wallaby/pages/_index_desktop.scss +22 -0
  29. data/app/assets/stylesheets/wallaby/pages/_show.scss +21 -0
  30. data/app/controllers/wallaby/abstract_resources_controller.rb +334 -0
  31. data/app/controllers/wallaby/application_controller.rb +45 -15
  32. data/app/controllers/wallaby/base_controller.rb +30 -0
  33. data/app/controllers/wallaby/resources_controller.rb +2 -131
  34. data/app/controllers/wallaby/secure_controller.rb +38 -24
  35. data/app/routes/wallaby/resources_router.rb +40 -43
  36. data/app/security/ability.rb +4 -28
  37. data/app/views/layouts/wallaby/application.html.erb +11 -6
  38. data/app/views/layouts/wallaby/error.html.erb +26 -4
  39. data/app/views/wallaby/error.html.erb +11 -0
  40. data/app/views/wallaby/error.json.jbuilder +8 -0
  41. data/app/views/wallaby/{shared → resources}/_flash_messages.html.erb +0 -0
  42. data/app/views/wallaby/resources/_footer.html.erb +1 -0
  43. data/app/views/wallaby/resources/_form.html.erb +2 -2
  44. data/app/views/wallaby/resources/_header.html.erb +38 -0
  45. data/app/views/wallaby/resources/_imodal.html.erb +13 -0
  46. data/app/views/wallaby/resources/_index_actions.html.erb +4 -1
  47. data/app/views/wallaby/resources/_index_filters.html.erb +23 -0
  48. data/app/views/wallaby/resources/_index_pagination.html.erb +63 -0
  49. data/app/views/wallaby/resources/_index_query.html.erb +23 -0
  50. data/app/views/wallaby/resources/_logo.html.erb +1 -0
  51. data/app/views/wallaby/resources/_navs.html.erb +9 -0
  52. data/app/views/wallaby/resources/_resource_actions.html.erb +3 -3
  53. data/app/views/wallaby/resources/{shared/_resource_nav.html.erb → _resource_navs.html.erb} +6 -6
  54. data/app/views/wallaby/resources/_title.html.erb +1 -0
  55. data/app/views/wallaby/resources/_user_menu.html.erb +5 -0
  56. data/app/views/wallaby/resources/bad_request.json.jbuilder +7 -0
  57. data/app/views/wallaby/resources/edit.html.erb +16 -12
  58. data/app/views/wallaby/resources/form/_belongs_to.html.erb +63 -12
  59. data/app/views/wallaby/resources/form/_bigint.html.erb +10 -1
  60. data/app/views/wallaby/resources/form/_bigserial.html.erb +18 -0
  61. data/app/views/wallaby/resources/form/_binary.html.erb +11 -2
  62. data/app/views/wallaby/resources/form/_bit.html.erb +10 -1
  63. data/app/views/wallaby/resources/form/_bit_varying.html.erb +10 -1
  64. data/app/views/wallaby/resources/form/_blob.html.erb +21 -0
  65. data/app/views/wallaby/resources/form/_boolean.html.erb +9 -0
  66. data/app/views/wallaby/resources/form/_box.html.erb +21 -0
  67. data/app/views/wallaby/resources/form/_cidr.html.erb +13 -1
  68. data/app/views/wallaby/resources/form/_circle.html.erb +21 -0
  69. data/app/views/wallaby/resources/form/_citext.html.erb +11 -2
  70. data/app/views/wallaby/resources/form/_color.html.erb +11 -2
  71. data/app/views/wallaby/resources/form/_date.html.erb +12 -3
  72. data/app/views/wallaby/resources/form/_daterange.html.erb +14 -5
  73. data/app/views/wallaby/resources/form/_datetime.html.erb +12 -3
  74. data/app/views/wallaby/resources/form/_decimal.html.erb +10 -1
  75. data/app/views/wallaby/resources/form/_dropdown.html.erb +18 -0
  76. data/app/views/wallaby/resources/form/_email.html.erb +9 -0
  77. data/app/views/wallaby/resources/form/_file.html.erb +21 -0
  78. data/app/views/wallaby/resources/form/_float.html.erb +10 -1
  79. data/app/views/wallaby/resources/form/_has_and_belongs_to_many.html.erb +53 -7
  80. data/app/views/wallaby/resources/form/_has_many.html.erb +52 -7
  81. data/app/views/wallaby/resources/form/_has_one.html.erb +10 -2
  82. data/app/views/wallaby/resources/form/_hstore.html.erb +12 -5
  83. data/app/views/wallaby/resources/form/_inet.html.erb +13 -1
  84. data/app/views/wallaby/resources/form/_int4range.html.erb +11 -2
  85. data/app/views/wallaby/resources/form/_int8range.html.erb +11 -2
  86. data/app/views/wallaby/resources/form/_integer.html.erb +10 -1
  87. data/app/views/wallaby/resources/form/_json.html.erb +13 -6
  88. data/app/views/wallaby/resources/form/_jsonb.html.erb +13 -6
  89. data/app/views/wallaby/resources/form/_line.html.erb +21 -0
  90. data/app/views/wallaby/resources/form/_longblob.html.erb +21 -0
  91. data/app/views/wallaby/resources/form/_longtext.html.erb +30 -0
  92. data/app/views/wallaby/resources/form/_lseg.html.erb +21 -0
  93. data/app/views/wallaby/resources/form/_ltree.html.erb +17 -1
  94. data/app/views/wallaby/resources/form/_macaddr.html.erb +13 -1
  95. data/app/views/wallaby/resources/form/_markdown.html.erb +29 -0
  96. data/app/views/wallaby/resources/form/_mediumblob.html.erb +21 -0
  97. data/app/views/wallaby/resources/form/_mediumtext.html.erb +30 -0
  98. data/app/views/wallaby/resources/form/_money.html.erb +10 -1
  99. data/app/views/wallaby/resources/form/_numrange.html.erb +11 -2
  100. data/app/views/wallaby/resources/form/_password.html.erb +14 -1
  101. data/app/views/wallaby/resources/form/_path.html.erb +17 -0
  102. data/app/views/wallaby/resources/form/_point.html.erb +11 -2
  103. data/app/views/wallaby/resources/form/_polygon.html.erb +17 -0
  104. data/app/views/wallaby/resources/form/_serial.html.erb +18 -0
  105. data/app/views/wallaby/resources/form/_sti.html.erb +18 -0
  106. data/app/views/wallaby/resources/form/_string.html.erb +14 -1
  107. data/app/views/wallaby/resources/form/_text.html.erb +11 -2
  108. data/app/views/wallaby/resources/form/_time.html.erb +12 -3
  109. data/app/views/wallaby/resources/form/_tinyblob.html.erb +21 -0
  110. data/app/views/wallaby/resources/form/_tinytext.html.erb +30 -0
  111. data/app/views/wallaby/resources/form/_tsrange.html.erb +14 -5
  112. data/app/views/wallaby/resources/form/_tstzrange.html.erb +14 -5
  113. data/app/views/wallaby/resources/form/_tsvector.html.erb +9 -0
  114. data/app/views/wallaby/resources/form/_unsigned_bigint.html.erb +18 -0
  115. data/app/views/wallaby/resources/form/_unsigned_decimal.html.erb +18 -0
  116. data/app/views/wallaby/resources/form/_unsigned_float.html.erb +18 -0
  117. data/app/views/wallaby/resources/form/_unsigned_integer.html.erb +18 -0
  118. data/app/views/wallaby/resources/form/_uuid.html.erb +10 -1
  119. data/app/views/wallaby/resources/form/_xml.html.erb +11 -5
  120. data/app/views/wallaby/resources/form.json.jbuilder +5 -0
  121. data/app/views/wallaby/{core → resources}/home.html.erb +1 -1
  122. data/app/views/wallaby/resources/index/_belongs_to.html.erb +5 -1
  123. data/app/views/wallaby/resources/index/_bigint.html.erb +4 -0
  124. data/app/views/wallaby/resources/index/_bigserial.html.erb +5 -0
  125. data/app/views/wallaby/resources/index/_binary.html.erb +5 -1
  126. data/app/views/wallaby/resources/index/_bit.html.erb +4 -0
  127. data/app/views/wallaby/resources/index/_bit_varying.html.erb +4 -0
  128. data/app/views/wallaby/resources/index/_blob.html.erb +5 -0
  129. data/app/views/wallaby/resources/index/_boolean.html.erb +5 -1
  130. data/app/views/wallaby/resources/index/_box.html.erb +16 -0
  131. data/app/views/wallaby/resources/index/_cidr.html.erb +5 -1
  132. data/app/views/wallaby/resources/index/_circle.html.erb +16 -0
  133. data/app/views/wallaby/resources/index/_citext.html.erb +5 -1
  134. data/app/views/wallaby/resources/index/_color.html.erb +6 -1
  135. data/app/views/wallaby/resources/index/_date.html.erb +4 -0
  136. data/app/views/wallaby/resources/index/_daterange.html.erb +5 -1
  137. data/app/views/wallaby/resources/index/_datetime.html.erb +5 -1
  138. data/app/views/wallaby/resources/index/_decimal.html.erb +4 -0
  139. data/app/views/wallaby/resources/index/_email.html.erb +4 -0
  140. data/app/views/wallaby/resources/index/_float.html.erb +4 -0
  141. data/app/views/wallaby/resources/index/_has_and_belongs_to_many.html.erb +6 -2
  142. data/app/views/wallaby/resources/index/_has_many.html.erb +6 -2
  143. data/app/views/wallaby/resources/index/_has_one.html.erb +5 -1
  144. data/app/views/wallaby/resources/index/_hstore.html.erb +6 -2
  145. data/app/views/wallaby/resources/index/_inet.html.erb +5 -1
  146. data/app/views/wallaby/resources/index/_int4range.html.erb +4 -0
  147. data/app/views/wallaby/resources/index/_int8range.html.erb +4 -0
  148. data/app/views/wallaby/resources/index/_integer.html.erb +4 -0
  149. data/app/views/wallaby/resources/index/_json.html.erb +5 -2
  150. data/app/views/wallaby/resources/index/_jsonb.html.erb +5 -2
  151. data/app/views/wallaby/resources/index/_line.html.erb +16 -0
  152. data/app/views/wallaby/resources/index/_longblob.html.erb +5 -0
  153. data/app/views/wallaby/resources/index/_longtext.html.erb +16 -0
  154. data/app/views/wallaby/resources/index/_lseg.html.erb +16 -0
  155. data/app/views/wallaby/resources/index/_ltree.html.erb +5 -1
  156. data/app/views/wallaby/resources/index/_macaddr.html.erb +4 -0
  157. data/app/views/wallaby/resources/index/_mediumblob.html.erb +5 -0
  158. data/app/views/wallaby/resources/index/_mediumtext.html.erb +16 -0
  159. data/app/views/wallaby/resources/index/_money.html.erb +4 -0
  160. data/app/views/wallaby/resources/index/_numrange.html.erb +4 -0
  161. data/app/views/wallaby/resources/index/_password.html.erb +9 -0
  162. data/app/views/wallaby/resources/index/_path.html.erb +16 -0
  163. data/app/views/wallaby/resources/index/_point.html.erb +4 -0
  164. data/app/views/wallaby/resources/index/_polygon.html.erb +16 -0
  165. data/app/views/wallaby/resources/index/_raw.html.erb +9 -0
  166. data/app/views/wallaby/resources/index/_serial.html.erb +5 -0
  167. data/app/views/wallaby/resources/index/_sti.html.erb +16 -0
  168. data/app/views/wallaby/resources/index/_string.html.erb +5 -1
  169. data/app/views/wallaby/resources/index/_text.html.erb +5 -1
  170. data/app/views/wallaby/resources/index/_time.html.erb +4 -0
  171. data/app/views/wallaby/resources/index/_tinyblob.html.erb +5 -0
  172. data/app/views/wallaby/resources/index/_tinytext.html.erb +16 -0
  173. data/app/views/wallaby/resources/index/_tsrange.html.erb +5 -1
  174. data/app/views/wallaby/resources/index/_tstzrange.html.erb +5 -1
  175. data/app/views/wallaby/resources/index/_tsvector.html.erb +5 -1
  176. data/app/views/wallaby/resources/index/_unsigned_bigint.html.erb +5 -0
  177. data/app/views/wallaby/resources/index/_unsigned_decimal.html.erb +5 -0
  178. data/app/views/wallaby/resources/index/_unsigned_float.html.erb +5 -0
  179. data/app/views/wallaby/resources/index/_unsigned_integer.html.erb +5 -0
  180. data/app/views/wallaby/resources/index/_uuid.html.erb +5 -1
  181. data/app/views/wallaby/resources/index/_xml.html.erb +5 -1
  182. data/app/views/wallaby/resources/index.csv.erb +26 -0
  183. data/app/views/wallaby/resources/index.html.erb +47 -59
  184. data/app/views/wallaby/resources/index.json.jbuilder +5 -0
  185. data/app/views/wallaby/resources/new.html.erb +12 -11
  186. data/app/views/wallaby/resources/show/_belongs_to.html.erb +5 -1
  187. data/app/views/wallaby/resources/show/_bigint.html.erb +4 -0
  188. data/app/views/wallaby/resources/show/_bigserial.html.erb +5 -0
  189. data/app/views/wallaby/resources/show/_binary.html.erb +5 -1
  190. data/app/views/wallaby/resources/show/_bit.html.erb +4 -0
  191. data/app/views/wallaby/resources/show/_bit_varying.html.erb +4 -0
  192. data/app/views/wallaby/resources/show/_blob.html.erb +5 -0
  193. data/app/views/wallaby/resources/show/_boolean.html.erb +5 -1
  194. data/app/views/wallaby/resources/show/_box.html.erb +9 -0
  195. data/app/views/wallaby/resources/show/_cidr.html.erb +5 -1
  196. data/app/views/wallaby/resources/show/_circle.html.erb +9 -0
  197. data/app/views/wallaby/resources/show/_citext.html.erb +4 -0
  198. data/app/views/wallaby/resources/show/_color.html.erb +6 -1
  199. data/app/views/wallaby/resources/show/_date.html.erb +4 -0
  200. data/app/views/wallaby/resources/show/_daterange.html.erb +4 -0
  201. data/app/views/wallaby/resources/show/_datetime.html.erb +4 -0
  202. data/app/views/wallaby/resources/show/_decimal.html.erb +4 -0
  203. data/app/views/wallaby/resources/show/_email.html.erb +4 -0
  204. data/app/views/wallaby/resources/show/_float.html.erb +4 -0
  205. data/app/views/wallaby/resources/show/_has_and_belongs_to_many.html.erb +6 -2
  206. data/app/views/wallaby/resources/show/_has_many.html.erb +6 -2
  207. data/app/views/wallaby/resources/show/_has_one.html.erb +5 -1
  208. data/app/views/wallaby/resources/show/_hstore.html.erb +4 -0
  209. data/app/views/wallaby/resources/show/_image.html.erb +9 -0
  210. data/app/views/wallaby/resources/show/_inet.html.erb +5 -1
  211. data/app/views/wallaby/resources/show/_int4range.html.erb +4 -0
  212. data/app/views/wallaby/resources/show/_int8range.html.erb +4 -0
  213. data/app/views/wallaby/resources/show/_integer.html.erb +4 -0
  214. data/app/views/wallaby/resources/show/_json.html.erb +4 -0
  215. data/app/views/wallaby/resources/show/_jsonb.html.erb +4 -0
  216. data/app/views/wallaby/resources/show/_line.html.erb +9 -0
  217. data/app/views/wallaby/resources/show/_longblob.html.erb +5 -0
  218. data/app/views/wallaby/resources/show/_longtext.html.erb +5 -0
  219. data/app/views/wallaby/resources/show/_lseg.html.erb +9 -0
  220. data/app/views/wallaby/resources/show/_ltree.html.erb +4 -0
  221. data/app/views/wallaby/resources/show/_macaddr.html.erb +4 -0
  222. data/app/views/wallaby/resources/show/_mediumblob.html.erb +5 -0
  223. data/app/views/wallaby/resources/show/_mediumtext.html.erb +5 -0
  224. data/app/views/wallaby/resources/show/_money.html.erb +4 -0
  225. data/app/views/wallaby/resources/show/_numrange.html.erb +4 -0
  226. data/app/views/wallaby/resources/show/_password.html.erb +9 -0
  227. data/app/views/wallaby/resources/show/_path.html.erb +9 -0
  228. data/app/views/wallaby/resources/show/_point.html.erb +4 -0
  229. data/app/views/wallaby/resources/show/_polygon.html.erb +9 -0
  230. data/app/views/wallaby/resources/show/_raw.html.erb +9 -0
  231. data/app/views/wallaby/resources/show/_serial.html.erb +5 -0
  232. data/app/views/wallaby/resources/show/_sti.html.erb +5 -0
  233. data/app/views/wallaby/resources/show/_string.html.erb +4 -0
  234. data/app/views/wallaby/resources/show/_text.html.erb +4 -0
  235. data/app/views/wallaby/resources/show/_time.html.erb +4 -0
  236. data/app/views/wallaby/resources/show/_tinyblob.html.erb +5 -0
  237. data/app/views/wallaby/resources/show/_tinytext.html.erb +5 -0
  238. data/app/views/wallaby/resources/show/_tsrange.html.erb +4 -0
  239. data/app/views/wallaby/resources/show/_tstzrange.html.erb +4 -0
  240. data/app/views/wallaby/resources/show/_tsvector.html.erb +4 -0
  241. data/app/views/wallaby/resources/show/_unsigned_bigint.html.erb +5 -0
  242. data/app/views/wallaby/resources/show/_unsigned_decimal.html.erb +5 -0
  243. data/app/views/wallaby/resources/show/_unsigned_float.html.erb +5 -0
  244. data/app/views/wallaby/resources/show/_unsigned_integer.html.erb +5 -0
  245. data/app/views/wallaby/resources/show/_uuid.html.erb +4 -0
  246. data/app/views/wallaby/resources/show/_xml.html.erb +4 -0
  247. data/app/views/wallaby/resources/show.html.erb +14 -24
  248. data/app/views/wallaby/resources/show.json.jbuilder +5 -0
  249. data/config/brakeman.ignore +26 -0
  250. data/config/locales/wallaby.en.yml +91 -0
  251. data/config/massa.yml +45 -0
  252. data/config/rails_best_practices.yml +42 -0
  253. data/config/routes.rb +29 -23
  254. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/association_builder.rb +39 -0
  255. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/polymorphic_builder.rb +44 -0
  256. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +42 -0
  257. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +41 -94
  258. data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +24 -14
  259. data/lib/adaptors/wallaby/active_record/model_decorator.rb +118 -64
  260. data/lib/adaptors/wallaby/active_record/model_finder.rb +44 -15
  261. data/lib/adaptors/wallaby/active_record/model_pagination_provider.rb +30 -0
  262. data/lib/adaptors/wallaby/active_record/model_service_provider/normalizer.rb +42 -0
  263. data/lib/adaptors/wallaby/active_record/model_service_provider/permitter.rb +64 -0
  264. data/lib/adaptors/wallaby/active_record/model_service_provider/querier/transformer.rb +70 -0
  265. data/lib/adaptors/wallaby/active_record/model_service_provider/querier.rb +102 -0
  266. data/lib/adaptors/wallaby/active_record/model_service_provider/validator.rb +29 -0
  267. data/lib/adaptors/wallaby/active_record/model_service_provider.rb +137 -0
  268. data/lib/adaptors/wallaby/active_record.rb +4 -1
  269. data/lib/decorators/wallaby/abstract_resource_decorator.rb +74 -0
  270. data/lib/decorators/wallaby/resource_decorator.rb +5 -76
  271. data/lib/errors/wallaby/model_not_found.rb +5 -1
  272. data/lib/errors/wallaby/not_found.rb +4 -0
  273. data/lib/errors/wallaby/resource_not_found.rb +5 -1
  274. data/lib/forms/wallaby/form_builder.rb +42 -19
  275. data/lib/helpers/wallaby/application_helper.rb +34 -24
  276. data/lib/helpers/wallaby/base_helper.rb +52 -0
  277. data/lib/helpers/wallaby/form_helper.rb +40 -16
  278. data/lib/helpers/wallaby/index_helper.rb +59 -0
  279. data/lib/helpers/wallaby/links_helper.rb +150 -81
  280. data/lib/helpers/wallaby/resources_helper.rb +41 -46
  281. data/lib/helpers/wallaby/secure_helper.rb +36 -19
  282. data/lib/helpers/wallaby/styling_helper.rb +53 -44
  283. data/lib/interfaces/wallaby/mode.rb +19 -12
  284. data/lib/interfaces/wallaby/model_decorator.rb +176 -50
  285. data/lib/interfaces/wallaby/model_finder.rb +7 -3
  286. data/lib/interfaces/wallaby/model_pagination_provider.rb +104 -0
  287. data/lib/interfaces/wallaby/model_service_provider.rb +71 -0
  288. data/lib/paginators/wallaby/abstract_resource_paginator.rb +23 -0
  289. data/lib/paginators/wallaby/resource_paginator.rb +6 -0
  290. data/lib/parsers/wallaby/parser.rb +32 -0
  291. data/lib/responders/wallaby/abstract_responder.rb +68 -0
  292. data/lib/responders/wallaby/resources_responder.rb +6 -0
  293. data/lib/servicers/wallaby/abstract_model_servicer.rb +48 -0
  294. data/lib/servicers/wallaby/model_servicer.rb +5 -0
  295. data/lib/services/wallaby/link_options_normalizer.rb +16 -0
  296. data/lib/services/wallaby/lookup_context_wrapper.rb +23 -30
  297. data/lib/services/wallaby/map/mode_mapper.rb +19 -0
  298. data/lib/services/wallaby/map/model_class_collector.rb +41 -0
  299. data/lib/services/wallaby/map/model_class_mapper.rb +24 -0
  300. data/lib/services/wallaby/map.rb +76 -39
  301. data/lib/services/wallaby/partial_renderer.rb +60 -0
  302. data/lib/services/wallaby/prefixes_builder.rb +54 -0
  303. data/lib/services/wallaby/sorting/hash_builder.rb +16 -0
  304. data/lib/services/wallaby/sorting/link_builder.rb +45 -0
  305. data/lib/services/wallaby/sorting/next_builder.rb +54 -0
  306. data/lib/services/wallaby/url_for.rb +36 -0
  307. data/lib/tree/wallaby/node.rb +17 -0
  308. data/lib/utils/wallaby/utils.rb +67 -22
  309. data/lib/wallaby/configuration/features.rb +12 -0
  310. data/lib/wallaby/configuration/metadata.rb +12 -0
  311. data/lib/wallaby/configuration/models.rb +27 -12
  312. data/lib/wallaby/configuration/pagination.rb +12 -0
  313. data/lib/wallaby/configuration/security.rb +55 -24
  314. data/lib/wallaby/configuration.rb +38 -19
  315. data/lib/wallaby/engine.rb +84 -39
  316. data/lib/wallaby/version.rb +1 -1
  317. data/lib/wallaby.rb +22 -3
  318. metadata +200 -55
  319. data/app/assets/javascripts/wallaby/form.js +0 -8
  320. data/app/assets/stylesheets/wallaby/base/_functions.scss +0 -0
  321. data/app/assets/stylesheets/wallaby/base/_normalize.scss +0 -0
  322. data/app/assets/stylesheets/wallaby/base/_reset.scss +0 -0
  323. data/app/assets/stylesheets/wallaby/components/_forms.scss +0 -53
  324. data/app/assets/stylesheets/wallaby/components/_nav.scss +0 -19
  325. data/app/assets/stylesheets/wallaby/components/_tables.scss +0 -78
  326. data/app/assets/stylesheets/wallaby/form.scss +0 -11
  327. data/app/controllers/wallaby/core_controller.rb +0 -28
  328. data/app/views/layouts/wallaby/_footer.html.erb +0 -2
  329. data/app/views/layouts/wallaby/_header.html.erb +0 -57
  330. data/app/views/layouts/wallaby/_navs.html.erb +0 -1
  331. data/app/views/wallaby/errors/access_denied.html.erb +0 -1
  332. data/app/views/wallaby/errors/not_authenticated.html.erb +0 -1
  333. data/app/views/wallaby/errors/not_found.html.erb +0 -6
  334. data/app/views/wallaby/errors/unprocessable_entity.erb +0 -1
  335. data/config/locales/en.yml +0 -29
  336. data/lib/adaptors/wallaby/active_record/model_operator/normalizer.rb +0 -44
  337. data/lib/adaptors/wallaby/active_record/model_operator/permitter.rb +0 -50
  338. data/lib/adaptors/wallaby/active_record/model_operator/querier.rb +0 -47
  339. data/lib/adaptors/wallaby/active_record/model_operator/validator.rb +0 -16
  340. data/lib/adaptors/wallaby/active_record/model_operator.rb +0 -82
  341. data/lib/errors/wallaby/deprecated.rb +0 -4
  342. data/lib/errors/wallaby/operation_not_found.rb +0 -4
  343. data/lib/handlers/wallaby/cached_compiled_erb.rb +0 -14
  344. data/lib/helpers/wallaby/core_helper.rb +0 -50
  345. data/lib/helpers/wallaby/paginatable_helper.rb +0 -9
  346. data/lib/helpers/wallaby/sorting_helper.rb +0 -43
  347. data/lib/interfaces/wallaby/model_operator.rb +0 -31
  348. data/lib/services/wallaby/decorator_finder.rb +0 -16
  349. data/lib/services/wallaby/model_servicer.rb +0 -38
  350. data/lib/services/wallaby/servicer_finder.rb +0 -5
@@ -1,3 +1,7 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
1
5
  <% if value.nil? %>
2
6
  <%= null %>
3
7
  <% else %>
@@ -1,3 +1,7 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
1
5
  <% if value.nil? %>
2
6
  <%= null %>
3
7
  <% else %>
@@ -1 +1,5 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
1
5
  <%= value || null %>
@@ -0,0 +1,5 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
5
+ <%= value || null %>
@@ -0,0 +1,5 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
5
+ <%= value || null %>
@@ -0,0 +1,5 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
5
+ <%= value.try(:to_f) || null %>
@@ -0,0 +1,5 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
5
+ <%= value || null %>
@@ -1,3 +1,7 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
1
5
  <% if value.nil? %>
2
6
  <%= null %>
3
7
  <% else %>
@@ -1,3 +1,7 @@
1
+ <%# @param object [model] model instance %>
2
+ <%# @param field_name [String] name of the field %>
3
+ <%# @param value [Object] value of the field %>
4
+ <%# @param metadata [Hash] metadata of the field %>
1
5
  <% if value.nil? %>
2
6
  <%= null %>
3
7
  <% else %>
@@ -2,30 +2,20 @@
2
2
  # decorate first on every page or partial
3
3
  decorated = decorate resource
4
4
  %>
5
- <article>
6
- <%= render 'wallaby/resources/shared/resource_nav' %>
7
- <div class="page-header">
8
- <h1>
9
- <%= show_title decorated %>
10
- </h1>
5
+ <article class="resource">
6
+ <div class="resource__header">
7
+ <h1><%= show_title decorated %></h1>
8
+ <%= render 'resource_navs' %>
11
9
  </div>
12
- <%= render 'wallaby/shared/flash_messages' %>
13
- <section class="fields">
14
- <table class="detail-table">
15
- <thead>
16
- <tr>
17
- <th>Field</th>
18
- <th>Value</th>
19
- </tr>
20
- </thead>
21
- <tbody>
22
- <% decorated.show_field_names.each do |field_name| %>
23
- <tr>
24
- <th><%= decorated.show_label_of field_name %></th>
25
- <td><%= type_partial_render decorated.show_type_of(field_name).to_s, object: decorated, field_name: field_name %></td>
26
- </tr>
27
- <% end %>
28
- </tbody>
29
- </table>
10
+ <%= render 'flash_messages' %>
11
+ <section>
12
+ <div class="resource__container">
13
+ <% decorated.show_field_names.each do |field_name| %>
14
+ <dl>
15
+ <dt><%= decorated.show_label_of field_name %></dt>
16
+ <dd><%= type_partial_render decorated.show_type_of(field_name), object: decorated, field_name: field_name %></dd>
17
+ </dl>
18
+ <% end %>
19
+ </div>
30
20
  </section>
31
21
  </article>
@@ -0,0 +1,5 @@
1
+ # returned the changed resource if frontend needs it
2
+ decorated = decorate resource
3
+ all_field_names =
4
+ [decorated.primary_key].concat(decorated.show_field_names).uniq
5
+ json.call(decorated, *all_field_names)
@@ -0,0 +1,26 @@
1
+ {
2
+ "ignored_warnings": [
3
+ {
4
+ "warning_type": "Weak Hash",
5
+ "warning_code": 90,
6
+ "fingerprint": "5d66c37f6ad3a0646972a4cc758231c4c0f97dfb156eb73ed07792e19c592b13",
7
+ "check_name": "WeakHash",
8
+ "message": "Weak hashing algorithm (MD5) used",
9
+ "file": "lib/helpers/wallaby/secure_helper.rb",
10
+ "line": 7,
11
+ "link": "http://brakemanscanner.org/docs/warning_types/weak_hash/",
12
+ "code": "Digest::MD5.hexdigest(user.email.downcase)",
13
+ "render_path": null,
14
+ "location": {
15
+ "type": "method",
16
+ "class": "Wallaby::SecureHelper",
17
+ "method": "user_portrait"
18
+ },
19
+ "user_input": null,
20
+ "confidence": "Medium",
21
+ "note": ""
22
+ }
23
+ ],
24
+ "updated": "2017-04-18 13:49:44 +0000",
25
+ "brakeman_version": "3.6.1"
26
+ }
@@ -0,0 +1,91 @@
1
+ # Files in the config/locales directory are used for internationalization
2
+ # and are automatically loaded by Rails. If you want to use locales other
3
+ # than English, add the necessary files in this directory.
4
+ #
5
+ # To use the locales, use `I18n.t`:
6
+ #
7
+ # I18n.t 'hello'
8
+ #
9
+ # In views, this is aliased to just `t`:
10
+ #
11
+ # <%= t('hello') %>
12
+ #
13
+ # To use a different locale, set it with `I18n.locale`:
14
+ #
15
+ # I18n.locale = :es
16
+ #
17
+ # This would use the information in config/locales/es.yml.
18
+ #
19
+ # To learn more, please read the Rails Internationalization guide
20
+ # available at http://guides.rubyonrails.org/i18n.html.
21
+
22
+ en:
23
+ labels:
24
+ count: 'Count: '
25
+ auto_select_hint: 'Type to select...'
26
+ upload: 'Upload'
27
+
28
+ buttons:
29
+ save: 'Save'
30
+
31
+ links:
32
+ new: 'Create %{model}'
33
+ show: 'Show'
34
+ edit: 'Edit'
35
+ delete: 'Delete'
36
+ cancel: 'Cancel'
37
+ confirm:
38
+ delete: 'Please confirm to delete'
39
+ export: 'Export as %{ext}'
40
+
41
+ http_errors:
42
+ report_error_html: '<p>And report the error <a href="https://github.com/reinteractive/wallaby/issues/new" target="_blank">here</a>.</p>'
43
+ internal_server_error: 'Hope you feel better.'
44
+ bad_request: 'Your request is not supported.'
45
+ not_found: 'Not found.'
46
+ unprocessable_entity: 'Your request could not be processed.'
47
+ unauthorized: 'You need to sign in to access this page.'
48
+ forbidden: 'You need permission to access this page.'
49
+
50
+ json_errors:
51
+ internal_server_error: 'Service unavailable.'
52
+ bad_request: 'Your request is not supported.'
53
+ not_found: 'Not found.'
54
+ unprocessable_entity: 'Your request could not be processed.'
55
+ unauthorized: 'You need to sign in to access this page.'
56
+ forbidden: 'You need permission to access this page.'
57
+
58
+ errors:
59
+ not_found:
60
+ collection: 'Records could not be found. Click + button to add one.'
61
+ model: 'Model %{model} could not be found.'
62
+ resource: 'Record %{resource} could not be found.'
63
+
64
+ pagination:
65
+ prev: 'Prev'
66
+ next: 'Next'
67
+ from_to: '%{from} to %{to}'
68
+ of: ' of '
69
+ total_count: '%{total}'
70
+ pers: 'Page Size'
71
+ pages: 'Page Number'
72
+
73
+ filters:
74
+ title: 'Filters'
75
+ all: 'All'
76
+
77
+ search:
78
+ hint: 'Press enter to search.'
79
+
80
+ hints:
81
+ box_html: 'Format: <code>(x1, y1), (x2, y2)</code> where <i>(x1,y1)</i> and <i>(x2,y2)</i> are any two opposite corners of the box.'
82
+ cidr_html: 'Example: <code>192.168.1.1/24</code> which holds an IPv4 or IPv6 network specification.'
83
+ circle_html: 'Format: <code><(x, y), r></code> where <i>(x,y)</i> is the center point and <i>r</i> is the radius of the circle.'
84
+ hstore_html: 'Format: <code>"Key1" => "Value1", "Key2" => "Value2"</code> is used for input and output, includes zero or more <i>key => value</i> pairs separated by commas.'
85
+ inet_html: 'Example: <code>192.168.1.1/24</code> which holds an IPv4 or IPv6 network specification.'
86
+ line_html: 'Format: <code>{ A, B, C }</code> which are represented by the linear equation <i>Ax + By + C = 0</i>.'
87
+ lseg_html: 'Format: <code>[(x1, y1), (x2, y2)]</code> where <i>(x1,y1)</i> and <i>(x2,y2)</i> are the end points of the line segment.'
88
+ ltree_html: 'Example: <code>Top.Countries.Europe.Russia</code> which is a sequence of zero or more labels separated by dots.'
89
+ macaddr_html: 'Example: <code>08:00:2b:01:02:03</code> which stores MAC addresses.'
90
+ path_html: 'Format: <code>((x1, y1) , ... , (xn, yn))</code> where the points are the end points of the line segments comprising the path.'
91
+ polygon_html: 'Format: <code>((x1, y1) , ... , (xn, yn))</code> where the points are the end points of the line segments comprising the boundary of the polygon.'
data/config/massa.yml ADDED
@@ -0,0 +1,45 @@
1
+ # By leaving this file empty, massa will run all default tools. You can check them here:
2
+ # https://github.com/lucascaton/massa/blob/master/config/default_tools.yml
3
+ # Otherwise you can define your own tools like in the following examples:
4
+
5
+ rubocop:
6
+ description: 'Rubocop'
7
+ command: 'bundle exec rubocop'
8
+ required: true
9
+
10
+ haml_lint:
11
+ description: 'HAML lint'
12
+ command: 'bundle exec haml-lint app/views'
13
+ required: true
14
+
15
+ brakeman:
16
+ description: 'Brakeman (security vulnerability scanner)'
17
+ command: 'bundle exec brakeman -Aqz4'
18
+ required: true
19
+
20
+ # rails_best_practices:
21
+ # description: 'Rails Best Practices'
22
+ # command: 'bundle exec rails_best_practices'
23
+ # required: true
24
+ #
25
+ i18n-tasks:
26
+ description: 'I18n translations'
27
+ command: 'bundle exec i18n-tasks missing'
28
+ required: false
29
+
30
+ # es_lint:
31
+ # description: 'ES lint'
32
+ # command: 'npm run eslint --ext js .'
33
+ # gem: false
34
+ # required: true
35
+
36
+ # karma:
37
+ # description: 'Karma (JS specs)'
38
+ # command: 'karma start --single-run --browsers PhantomJS'
39
+ # required: true
40
+ # gem: false
41
+ #
42
+ rspec-rails:
43
+ description: 'RSpec'
44
+ command: 'RAILS_ENV=test bundle exec rspec'
45
+ required: true
@@ -0,0 +1,42 @@
1
+ AddModelVirtualAttributeCheck: { }
2
+ AlwaysAddDbIndexCheck: { }
3
+ #CheckSaveReturnValueCheck: { }
4
+ #CheckDestroyReturnValueCheck: { }
5
+ DefaultScopeIsEvilCheck: { }
6
+ DryBundlerInCapistranoCheck: { }
7
+ #HashSyntaxCheck: { }
8
+ IsolateSeedDataCheck: { }
9
+ KeepFindersOnTheirOwnModelCheck: { }
10
+ LawOfDemeterCheck: { }
11
+ #LongLineCheck: { max_line_length: 80 }
12
+ MoveCodeIntoControllerCheck: { }
13
+ MoveCodeIntoHelperCheck: { array_count: 3 }
14
+ MoveCodeIntoModelCheck: { use_count: 2 }
15
+ MoveFinderToNamedScopeCheck: { }
16
+ MoveModelLogicIntoModelCheck: { use_count: 4 }
17
+ NeedlessDeepNestingCheck: { nested_count: 2 }
18
+ NotRescueExceptionCheck: { }
19
+ NotUseDefaultRouteCheck: { }
20
+ NotUseTimeAgoInWordsCheck: { }
21
+ OveruseRouteCustomizationsCheck: { customize_count: 3 }
22
+ ProtectMassAssignmentCheck: { }
23
+ RemoveEmptyHelpersCheck: { }
24
+ #RemoveTabCheck: { }
25
+ RemoveTrailingWhitespaceCheck: { }
26
+ RemoveUnusedMethodsInControllersCheck: { except_methods: [], ignored_files: 'app/controllers/wallaby/resources_controller.rb' }
27
+ RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
28
+ RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
29
+ ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
30
+ ReplaceInstanceVariableWithLocalVariableCheck: { ignored_files: ['app/views/wallaby/resources/form'] }
31
+ RestrictAutoGeneratedRoutesCheck: { }
32
+ SimplifyRenderInControllersCheck: { }
33
+ SimplifyRenderInViewsCheck: { }
34
+ #UseBeforeFilterCheck: { customize_count: 2 }
35
+ UseModelAssociationCheck: { }
36
+ UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
37
+ #UseParenthesesInMethodDefCheck: { }
38
+ UseObserverCheck: { }
39
+ UseQueryAttributeCheck: { }
40
+ UseSayWithTimeInMigrationsCheck: { }
41
+ UseScopeAccessCheck: { }
42
+ UseTurboSprocketsRails3Check: { }
data/config/routes.rb CHANGED
@@ -1,32 +1,38 @@
1
1
  Wallaby::Engine.routes.draw do
2
- root to: 'wallaby/core#home'
2
+ root to: 'wallaby/resources#home'
3
3
 
4
- get 'status', to: 'wallaby/core#status'
4
+ # NOTE: For health check if needed
5
+ # @see Wallaby::BaseController#healthy
6
+ get 'status', to: 'wallaby/resources#healthy'
5
7
 
8
+ # To generate error pages for all HTTP status
9
+ Wallaby::ERRORS.each do |status|
10
+ code = Rack::Utils::SYMBOL_TO_STATUS_CODE[status]
11
+ get status, to: "wallaby/resources##{status}"
12
+ get code.to_s, to: "wallaby/resources##{status}"
13
+ end
14
+
15
+ # This is to pass :resources and :action params onto
16
+ # `Wallaby::ResourcesRouter`.
17
+ # So that it could handle the request dispatching.
18
+ # Currently, it has implemented general CRUD resourceful routes
6
19
  scope path: ':resources' do
7
20
  with_options to: Wallaby::ResourcesRouter.new do |route|
8
- begin # resourceful routes
9
- route.get '',
10
- defaults: { action: 'index' },
11
- as: :resources
12
- route.get 'new',
13
- defaults: { action: 'new' },
14
- as: :new_resource
15
- route.get ':id/edit',
16
- defaults: { action: 'edit' },
17
- as: :edit_resource
18
- route.get ':id',
19
- defaults: { action: 'show' },
20
- as: :resource
21
+ # @see Wallaby::AbstractResourcesController#index
22
+ route.get '', defaults: { action: 'index' }, as: :resources
23
+ # @see Wallaby::AbstractResourcesController#new
24
+ route.get 'new', defaults: { action: 'new' }, as: :new_resource
25
+ # @see Wallaby::AbstractResourcesController#edit
26
+ route.get ':id/edit', defaults: { action: 'edit' }, as: :edit_resource
27
+ # @see Wallaby::AbstractResourcesController#show
28
+ route.get ':id', defaults: { action: 'show' }, as: :resource
21
29
 
22
- route.post '',
23
- defaults: { action: 'create' }
24
- route.match ':id',
25
- via: %i( patch put ),
26
- defaults: { action: 'update' }
27
- route.delete ':id',
28
- defaults: { action: 'destroy' }
29
- end
30
+ # @see Wallaby::AbstractResourcesController#create
31
+ route.post '', defaults: { action: 'create' }
32
+ # @see Wallaby::AbstractResourcesController#update
33
+ route.match ':id', via: %i(patch put), defaults: { action: 'update' }
34
+ # @see Wallaby::AbstractResourcesController#destroy
35
+ route.delete ':id', defaults: { action: 'destroy' }
30
36
  end
31
37
  end
32
38
  end
@@ -0,0 +1,39 @@
1
+ module Wallaby
2
+ class ActiveRecord
3
+ class ModelDecorator
4
+ class FieldsBuilder
5
+ # To build the metadata for associations
6
+ class AssociationBuilder
7
+ def update(metadata, reflection)
8
+ type = reflection.macro
9
+ metadata[:is_association] = true
10
+ metadata[:is_through] = through?(reflection)
11
+ metadata[:has_scope] = scope?(reflection)
12
+ metadata[:foreign_key] = foreign_key_for(reflection, type)
13
+ end
14
+
15
+ private
16
+
17
+ def foreign_key_for(reflection, type)
18
+ if type == :belongs_to || reflection.polymorphic?
19
+ reflection.foreign_key
20
+ elsif reflection.collection?
21
+ # @see https://github.com/rails/rails/blob/92703a9ea5d8b96f30e0b706b801c9185ef14f0e/activerecord/lib/active_record/associations/builder/collection_association.rb#L50
22
+ reflection.name.to_s.singularize << '_ids'
23
+ else
24
+ reflection.association_foreign_key
25
+ end
26
+ end
27
+
28
+ def through?(reflection)
29
+ reflection.is_a? ::ActiveRecord::Reflection::ThroughReflection
30
+ end
31
+
32
+ def scope?(reflection)
33
+ reflection.scope.present?
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ module Wallaby
2
+ class ActiveRecord
3
+ class ModelDecorator
4
+ class FieldsBuilder
5
+ # To build the metadata for polymorphic
6
+ class PolymorphicBuilder
7
+ def update(metadata, reflection)
8
+ if reflection.polymorphic?
9
+ metadata[:is_polymorphic] = true
10
+ metadata[:polymorphic_type] = reflection.foreign_type
11
+ metadata[:polymorphic_list] = polymorphic_list_for(reflection)
12
+ else
13
+ metadata[:class] = reflection.klass
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def polymorphic_list_for(reflection)
20
+ all_model_class.each_with_object([]) do |model_class, list|
21
+ # TODO: need to check the class as well
22
+ if polymorphic_defined? model_class, reflection.name
23
+ list << model_class
24
+ end
25
+ end
26
+ end
27
+
28
+ def all_model_class
29
+ Map
30
+ .mode_map
31
+ .select { |_, mode| mode == ::Wallaby::ActiveRecord }.keys
32
+ end
33
+
34
+ def polymorphic_defined?(model_class, polymorphic_name)
35
+ polymorphic_name_sym = polymorphic_name.try(:to_sym)
36
+ model_class.reflections.any? do |_field_name, reflection|
37
+ reflection.options[:as].try(:to_sym) == polymorphic_name_sym
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,42 @@
1
+ module Wallaby
2
+ class ActiveRecord
3
+ class ModelDecorator
4
+ class FieldsBuilder
5
+ # To build the metadata for sti column
6
+ class StiBuilder
7
+ def initialize(model_class)
8
+ @model_class = model_class
9
+ end
10
+
11
+ def update(metadata, column)
12
+ return unless @model_class.inheritance_column == column.name
13
+ metadata[:type] = 'sti'.freeze
14
+ metadata[:sti_class_list] = sti_list(find_parent_of(@model_class))
15
+ end
16
+
17
+ private
18
+
19
+ def sti_list(klass)
20
+ list = klass
21
+ .descendants
22
+ .each_with_object([klass]) do |child, result|
23
+ result << child
24
+ end
25
+ list.sort_by(&:name)
26
+ end
27
+
28
+ def find_parent_of(model_class)
29
+ parent = model_class
30
+ parent = parent.superclass until top_parent?(parent.superclass)
31
+ parent
32
+ end
33
+
34
+ def top_parent?(klass)
35
+ klass == ModelFinder.base ||
36
+ klass.respond_to?(:abstract_class?) && klass.abstract_class?
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,105 +1,52 @@
1
- class Wallaby::ActiveRecord::ModelDecorator::FieldsBuilder
2
- def initialize(model_class)
3
- @model_class = model_class
4
- end
5
-
6
- def general_fields
7
- @model_class.columns.inject({}) do |fields, column|
8
- fields[column.name] = {
9
- name: column.name,
10
- type: column.type.to_s,
11
- label: @model_class.human_attribute_name(column.name),
12
- is_origin: true
13
- }
14
- fields
15
- end
16
- end
17
-
18
- def association_fields
19
- @model_class.reflections.inject({}) do |fields, (field_name, reflection)|
20
- type = extract_type_from reflection
21
-
22
- fields[field_name] = {
23
- name: field_name,
24
- type: type,
25
- label: field_name.titleize,
26
- is_origin: true,
27
- is_association: true,
28
- is_polymorphic: is_polymorphic?(reflection),
29
- is_through: is_through?(reflection),
30
- has_scope: has_scope?(reflection),
31
- foreign_key: foreign_key_for(reflection, type),
32
- polymorphic_type: polymorphic_type_for(reflection, type),
33
- polymorphic_list: polymorphic_list_for(reflection),
34
- class: class_for(reflection)
35
- }
36
- fields
37
- end
38
- end
39
-
40
- protected
41
- def has_scope?(reflection)
42
- reflection.scope.present?
43
- end
1
+ module Wallaby
2
+ class ActiveRecord
3
+ class ModelDecorator
4
+ # To search and build the metadata for fields
5
+ class FieldsBuilder
6
+ def initialize(model_class)
7
+ @model_class = model_class
8
+ end
44
9
 
45
- def is_through?(reflection)
46
- reflection.respond_to? :delegate_reflection
47
- end
10
+ def general_fields
11
+ @model_class.columns.each_with_object({}) do |column, fields|
12
+ metadata = {
13
+ name: column.name,
14
+ type: column.type.to_s.freeze,
15
+ label: @model_class.human_attribute_name(column.name),
16
+ is_origin: true
17
+ }
18
+ sti_builder.update(metadata, column)
19
+ fields[column.name] = metadata
20
+ end
21
+ end
48
22
 
49
- def is_polymorphic?(reflection)
50
- reflection.options[:polymorphic].present?
51
- end
23
+ def association_fields
24
+ @model_class.reflections.each_with_object({}) do |(name, ref), fields|
25
+ metadata = {
26
+ name: name, type: ref.macro.to_s,
27
+ label: @model_class.human_attribute_name(name),
28
+ is_origin: true
29
+ }
30
+ association_builder.update(metadata, ref)
31
+ polymorphic_builder.update(metadata, ref)
32
+ fields[name] = metadata
33
+ end
34
+ end
52
35
 
53
- def extract_type_from(reflection)
54
- target = if is_through?(reflection)
55
- reflection.delegate_reflection
56
- else
57
- reflection
58
- end
59
- target.class.name.match(/([^:]+)Reflection/)[1].underscore
60
- end
36
+ protected
61
37
 
62
- def foreign_key_for(reflection, type)
63
- if 'belongs_to' == type
64
- reflection.foreign_key
65
- else
66
- reflection.association_foreign_key.try do |foreign_key|
67
- /many/ =~ type ? "#{ foreign_key }s" : foreign_key
68
- end
69
- end
70
- end
38
+ def sti_builder
39
+ @sti_builder ||= StiBuilder.new(@model_class)
40
+ end
71
41
 
72
- def polymorphic_type_for(reflection, type)
73
- if is_polymorphic? reflection
74
- foreign_key = foreign_key_for reflection, type
75
- foreign_key.gsub %r(_ids?$), '_type'
76
- end
77
- end
42
+ def association_builder
43
+ @association_builder ||= AssociationBuilder.new
44
+ end
78
45
 
79
- def polymorphic_list_for(reflection)
80
- if is_polymorphic? reflection
81
- available_model_class.inject([]) do |list, model_class|
82
- if model_defined_polymorphic_name? model_class, reflection.name
83
- list << model_class
46
+ def polymorphic_builder
47
+ @polymorphic_builder ||= PolymorphicBuilder.new
84
48
  end
85
- list
86
49
  end
87
- end || []
88
- end
89
-
90
- def model_defined_polymorphic_name?(model_class, polymorphic_name)
91
- model_class.reflections.any? do |field_name, reflection|
92
- reflection.options[:as].to_s == polymorphic_name.to_s
93
50
  end
94
51
  end
95
-
96
- def available_model_class
97
- Wallaby::Map.mode_map.select do |_, mode|
98
- mode == Wallaby::ActiveRecord
99
- end.keys
100
- end
101
-
102
- def class_for(reflection)
103
- reflection.class_name.constantize if !is_polymorphic? reflection
104
- end
105
52
  end