wallaby 5.0.1 → 5.1.3

Sign up to get free protection for your applications and to get access to all the features.
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