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,40 +1,33 @@
1
- class Wallaby::LookupContextWrapper
2
- delegate *begin # origin methods
3
- ActionView::LookupContext.instance_methods \
4
- - Object.instance_methods - %i( find_template )
5
- end, to: :@lookup_context
1
+ module Wallaby
2
+ # Lookup context wrapper.
3
+ # This is to take care of missing template in production to return string
4
+ # template.
5
+ # @see Wallaby::PartialRenderer
6
+ class LookupContextWrapper
7
+ origin_methods = ::ActionView::LookupContext.instance_methods \
8
+ - ::Object.instance_methods - %i(find_template)
9
+ delegate(*origin_methods, to: :@lookup_context)
6
10
 
7
- def initialize(lookup_context)
8
- @lookup_context = lookup_context
9
- end
11
+ def initialize(lookup_context)
12
+ @lookup_context = lookup_context
13
+ end
10
14
 
11
- def find_template(*args)
12
- key = args.join '/'
13
- caching key do
14
- @lookup_context.find_template *args
15
+ def find_template(*args)
16
+ @lookup_context.find_template(*args)
17
+ rescue ::ActionView::MissingTemplate
18
+ raise if Rails.env.development?
19
+ BlankTemplate.new
15
20
  end
16
- end
17
21
 
18
- protected
19
- def caching(key)
20
- @templates ||= {}
21
- unless @templates.has_key? key
22
- @templates[key] = begin
23
- yield
24
- rescue ActionView::MissingTemplate
25
- raise if Rails.env.development?
26
- BlankTemplate.new
22
+ # Blank template to return nil. It should be used by production
23
+ class BlankTemplate < ::ActionView::Template::HTML
24
+ def initialize
25
+ super nil
27
26
  end
28
- end
29
- @templates[key]
30
- end
31
27
 
32
- class BlankTemplate < ActionView::Template::HTML
33
- def initialize
34
- super nil
35
- end
28
+ def render(*args); end
36
29
 
37
- def render(*args)
30
+ def virtual_path(*args); end
38
31
  end
39
32
  end
40
33
  end
@@ -0,0 +1,19 @@
1
+ module Wallaby
2
+ class Map
3
+ # To map model class to mode class so that we know how to handle a model
4
+ class ModeMapper
5
+ def initialize(mode_classes)
6
+ @mode_classes = mode_classes
7
+ end
8
+
9
+ def map
10
+ return {} if @mode_classes.blank?
11
+ @mode_classes.each_with_object({}) do |mode_class, map|
12
+ mode_class.model_finder.new.all.each do |model_class|
13
+ map[model_class] = mode_class
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ module Wallaby
2
+ class Map
3
+ # To collect model classes that are configured to be handled by Wallaby
4
+ class ModelClassCollector
5
+ def initialize(configuration)
6
+ @configuration = configuration
7
+ end
8
+
9
+ def collect
10
+ return all_models - excluded_models if configured_models.blank?
11
+ invalid_models_check
12
+ configured_models
13
+ end
14
+
15
+ private
16
+
17
+ def invalid_models_check
18
+ invalid_models = configured_models - all_models
19
+ return if invalid_models.blank?
20
+ message = "#{invalid_models.to_sentence} are invalid models."
21
+ raise InvalidError, message
22
+ end
23
+
24
+ def models
25
+ @configuration.models
26
+ end
27
+
28
+ def all_models
29
+ Map.mode_map.keys
30
+ end
31
+
32
+ def excluded_models
33
+ models.excludes
34
+ end
35
+
36
+ def configured_models
37
+ models.presence
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ module Wallaby
2
+ class Map
3
+ # To map model class to a klass
4
+ class ModelClassMapper
5
+ def initialize(base_class)
6
+ @base_class = base_class
7
+ end
8
+
9
+ def map
10
+ (@base_class.try(:subclasses) || EMPTY_HASH)
11
+ .each_with_object({}) do |klass, map|
12
+ next if anonymous? klass
13
+ map[klass.model_class] = block_given? ? yield(klass) : klass
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ def anonymous?(klass)
20
+ klass.name.blank?
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,53 +1,90 @@
1
- class Wallaby::Map
2
- def self.mode_map(modes = nil)
3
- Rails.cache.fetch 'wallaby/map/mode_map' do
4
- {}.tap do |map|
5
- (modes || Wallaby::Mode.subclasses).each do |mode_class|
6
- mode_class.model_finder.new.all.each do |model_class|
7
- map[model_class] = mode_class
8
- end
9
- end
10
- end
1
+ module Wallaby
2
+ # Global storage of all the maps for model classes
3
+ class Map
4
+ # { model => mode }
5
+ def self.mode_map
6
+ @mode_map ||= ModeMapper.new(Mode.subclasses).map.freeze
11
7
  end
12
- end
13
8
 
14
- def self.model_classes(configuration = nil)
15
- Rails.cache.fetch 'wallaby/map/model_classes' do
16
- models = (configuration || Wallaby.configuration).models
17
- full_list = mode_map.keys
18
- configed_models = models.presence
9
+ # [ model classes ]
10
+ def self.model_classes
11
+ @model_classes ||=
12
+ ModelClassCollector.new(::Wallaby.configuration).collect.freeze
13
+ end
19
14
 
20
- return full_list - models.excludes unless configed_models
15
+ # { model => controller }
16
+ def self.controller_map(model_class)
17
+ @controller_map ||= ModelClassMapper.new(ResourcesController).map
18
+ @controller_map[model_class] ||= ResourcesController
19
+ end
21
20
 
22
- invalid_models = configed_models - full_list
23
- if invalid_models.length > 0
24
- fail Wallaby::InvalidError, "#{ invalid_models.to_sentence } are invalid models."
21
+ # { model => model decorator }
22
+ def self.model_decorator_map(model_class)
23
+ @model_decorator_map ||= {}
24
+ @model_decorator_map[model_class] ||= begin
25
+ mode = mode_map[model_class]
26
+ mode.model_decorator.new model_class if mode
25
27
  end
26
- configed_models
27
28
  end
28
- end
29
29
 
30
- def self.controller_map
31
- model_class_map Wallaby::ResourcesController, __callee__
32
- end
30
+ # { model => resource decorator }
31
+ def self.resource_decorator_map(model_class)
32
+ @resource_decorator_map ||= ModelClassMapper.new(ResourceDecorator).map
33
+ @resource_decorator_map[model_class] ||= begin
34
+ ResourceDecorator if mode_map[model_class]
35
+ end
36
+ end
33
37
 
34
- def self.decorator_map
35
- model_class_map Wallaby::ResourceDecorator, __callee__
36
- end
38
+ # { model => servicer }
39
+ def self.servicer_map(model_class)
40
+ @servicer_map ||= ModelClassMapper.new(ModelServicer).map
41
+ @servicer_map[model_class] ||= begin
42
+ ModelServicer if mode_map[model_class]
43
+ end
44
+ end
37
45
 
38
- def self.servicer_map
39
- model_class_map Wallaby::ModelServicer, __callee__
40
- end
46
+ # { model => service_provider }
47
+ def self.service_provider_map(model_class)
48
+ @service_provider_map ||= {}
49
+ @service_provider_map[model_class] ||= begin
50
+ mode = mode_map[model_class]
51
+ mode.model_service_provider.new model_class if mode
52
+ end
53
+ end
41
54
 
42
- def self.model_class_map(base_class, method_id)
43
- Rails.cache.fetch "wallaby/map/#{ method_id }" do
44
- {}.tap do |map|
45
- base_class.subclasses
46
- .reject{ |klass| klass.name.blank? }
47
- .each do |klass|
48
- map[klass.model_class] = klass
49
- end
55
+ # { model => paginator }
56
+ def self.paginator_map(model_class)
57
+ @paginator_map ||= ModelClassMapper.new(ResourcePaginator).map
58
+ @paginator_map[model_class] ||= begin
59
+ ResourcePaginator if mode_map[model_class]
50
60
  end
51
61
  end
62
+
63
+ # { model => pagination_provider }
64
+ def self.pagination_provider_map(model_class)
65
+ @pagination_provider_map ||= {}
66
+ @pagination_provider_map[model_class] ||=
67
+ mode_map[model_class].try(:model_pagination_provider)
68
+ end
69
+
70
+ # { model => resources name }
71
+ def self.resources_name_map(model_class)
72
+ @resources_name_map ||= {}
73
+ @resources_name_map[model_class] ||= Utils.to_resources_name model_class
74
+ end
75
+
76
+ # { resources name => model }
77
+ def self.model_class_map(resources_name)
78
+ @model_class_map ||= {}
79
+ @model_class_map[resources_name] ||= Utils.to_model_class resources_name
80
+ end
81
+
82
+ # Clear all the class variables to nil
83
+ def self.clear
84
+ @mode_map, @model_classes, @controller_map, @model_decorator_map,
85
+ @resource_decorator_map, @servicer_map, @service_provider_map,
86
+ @paginator_map, @pagination_provider_map, @model_class_map,
87
+ @resources_name_map = []
88
+ end
52
89
  end
53
90
  end
@@ -0,0 +1,60 @@
1
+ module Wallaby
2
+ # Partial renderer
3
+ class PartialRenderer
4
+ class << self
5
+ # Render form partial
6
+ # @param view [ActionView] view
7
+ # @param options [String] partial name
8
+ # @param locals [Hash]
9
+ # @return [String] HTML
10
+ def render(view, options = {}, locals = {}, action_name = nil, &block)
11
+ decorated = locals[:object]
12
+ field_name = locals[:field_name].to_s
13
+ action_name ||= Utils.to_partial_name view.params[:action]
14
+
15
+ partial_arguments_check decorated, field_name
16
+
17
+ locals[:metadata] =
18
+ decorated.public_send :"#{action_name}_metadata_of", field_name
19
+ locals[:value] = decorated.public_send field_name
20
+
21
+ view.render(options, locals, &block) \
22
+ || view.render('string', locals, &block)
23
+ end
24
+
25
+ # Render form partial
26
+ # @param view [ActionView] view
27
+ # @param options [String] partial name
28
+ # @param locals [Hash]
29
+ # @return [String] HTML
30
+ def render_form(view, options = {}, locals = {}, &block)
31
+ form = locals[:form]
32
+ field_name = locals[:field_name].to_s
33
+
34
+ form_arguments_check form, field_name
35
+
36
+ decorated = locals[:object] = form.object
37
+ locals[:metadata] = decorated.form_metadata_of locals[:field_name]
38
+ locals[:value] = decorated.public_send locals[:field_name]
39
+
40
+ view.render(options, locals, &block) \
41
+ || view.render('string', locals, &block)
42
+ end
43
+
44
+ private
45
+
46
+ def partial_arguments_check(object, field_name)
47
+ raise ArgumentError, 'Field name is required.' if field_name.blank?
48
+ raise ArgumentError, 'Object is not decorated.' \
49
+ unless object.is_a? ResourceDecorator
50
+ end
51
+
52
+ def form_arguments_check(form, field_name)
53
+ raise ArgumentError, 'Form is required.' if form.blank?
54
+ raise ArgumentError, 'Field name is required.' if field_name.blank?
55
+ raise ArgumentError, 'Object is not decorated.' \
56
+ unless form.object.is_a? ResourceDecorator
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,54 @@
1
+ module Wallaby
2
+ # Prefix builder
3
+ class PrefixesBuilder
4
+ def initialize(origin_prefixes, controller_path, resources_name, params)
5
+ @origin_prefixes = origin_prefixes
6
+ @controller_path = controller_path
7
+ @resources_name = resources_name
8
+ @params = params
9
+ end
10
+
11
+ def build
12
+ prefixes = minimal_prefixes
13
+ prefixes.unshift mounted_prefix if resource_path != @controller_path
14
+ suffix = build_suffix(@params)
15
+ prefixes.each_with_object([]) do |prefix, result|
16
+ result << "#{prefix}/#{suffix}" << prefix if prefix
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def minimal_prefixes
23
+ # this should contains only the current controller's path and wallaby path
24
+ index = @origin_prefixes.index wallaby_path
25
+ @origin_prefixes.slice 0..index
26
+ end
27
+
28
+ def mounted_prefix
29
+ prefix = mounted_path.try(:slice, 1..-1) || ''
30
+ prefix << SLASH unless prefix.empty?
31
+ prefix << resource_path if resource_path
32
+ end
33
+
34
+ def build_suffix(params)
35
+ Utils.to_partial_name params[:action]
36
+ end
37
+
38
+ def wallaby_path
39
+ ResourcesController.controller_path
40
+ end
41
+
42
+ def mounted_path
43
+ # TODO: need to find out if this will fail
44
+ # when wallaby is mounted more than once on different namespace?
45
+ Rails.application.routes.named_routes[:wallaby_engine].try do |route|
46
+ route.path.spec.to_s
47
+ end
48
+ end
49
+
50
+ def resource_path
51
+ @resource_path ||= @resources_name.try :gsub, COLONS, SLASH
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,16 @@
1
+ module Wallaby
2
+ module Sorting
3
+ # Turn a string `'name asc,id desc'` into sort hash
4
+ class HashBuilder
5
+ SORT_REGEX = /(([^\s,]+)\s+(asc|desc))\s*,?\s*/i
6
+
7
+ def self.build(sort_string)
8
+ ::ActiveSupport::HashWithIndifferentAccess.new.tap do |hash|
9
+ (sort_string || EMPTY_STRING).scan SORT_REGEX do |_, key, order|
10
+ hash[key] = order
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ module Wallaby
2
+ module Sorting
3
+ # Build the sorting link
4
+ class LinkBuilder
5
+ delegate :model_class, to: :@model_decorator
6
+
7
+ def initialize(model_decorator, params, helper)
8
+ @model_decorator = model_decorator
9
+ @params = params
10
+ @helper = helper
11
+ end
12
+
13
+ # To turn sort string into a hash for later usage
14
+ # @return [Hash]
15
+ def current_sort
16
+ @current_sort ||= HashBuilder.build @params[:sort]
17
+ end
18
+
19
+ # Build sort link for given field name
20
+ # @param field_name [String]
21
+ # @return [String] link
22
+ def build(field_name)
23
+ metadata = @model_decorator.index_metadata_of field_name
24
+ label = Utils.to_field_label field_name, metadata
25
+ return label unless sortable? metadata
26
+ sort_field_name = metadata[:sort_field_name] || field_name
27
+ url_params = next_builder.next_params sort_field_name
28
+ @helper.index_link(model_class, url_params: url_params) { label }
29
+ end
30
+
31
+ private
32
+
33
+ # @see Wallaby::Sorting::NextBuilder
34
+ def next_builder
35
+ @next_builder ||= NextBuilder.new @params, current_sort
36
+ end
37
+
38
+ # If it's non-association field or custom sorting field
39
+ def sortable?(metadata)
40
+ metadata[:is_origin] && !metadata[:is_association] \
41
+ || metadata[:sort_field_name]
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,54 @@
1
+ module Wallaby
2
+ module Sorting
3
+ # Pass field_name to generate sort param
4
+ class NextBuilder
5
+ ASC = 'asc'.freeze
6
+ DESC = 'desc'.freeze
7
+
8
+ def initialize(params, hash = nil)
9
+ @params = params
10
+ @hash = hash || HashBuilder.build(params[:sort])
11
+ end
12
+
13
+ def next_params(field_name)
14
+ params = clean_params
15
+ update params, :sort, complete_sorting_str_with(field_name)
16
+ params
17
+ end
18
+
19
+ protected
20
+
21
+ def clean_params
22
+ @params.except :resources, :controller, :action
23
+ end
24
+
25
+ def complete_sorting_str_with(field_name)
26
+ hash = @hash.except field_name
27
+ current_sort = @hash[field_name]
28
+
29
+ update hash, field_name, next_value_for(current_sort)
30
+ rebuild_str_from hash
31
+ end
32
+
33
+ def rebuild_str_from(hash)
34
+ hash.each_with_object '' do |(name, sort), str|
35
+ str << (str == EMPTY_STRING ? str : COMMA)
36
+ str << name << SPACE << sort
37
+ end
38
+ end
39
+
40
+ def next_value_for(current)
41
+ case current
42
+ when ASC then DESC
43
+ when DESC then nil
44
+ else ASC
45
+ end
46
+ end
47
+
48
+ def update(hash, key, value)
49
+ return hash.delete key if value.blank?
50
+ hash[key] = value
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ module Wallaby
2
+ # Url helper
3
+ class UrlFor
4
+ class << self
5
+ # Handle wallaby engine url properly.
6
+ # @param wallaby_engine [ActionDispatch::Routing::RoutesProxy]
7
+ # @param options [ActionController::Parameters, Hash]
8
+ # @return [String] url string for wallaby engine
9
+ def handle(wallaby_engine, options)
10
+ # NOTE: DEPRECATION WARNING: You are calling a `*_path` helper with the
11
+ # `only_path` option explicitly set to `false`.
12
+ # This option will stop working on path helpers in Rails 5.
13
+ # Use the corresponding `*_url` helper instead.
14
+ hash = normalize_params(options).except(:only_path)
15
+ case hash[:action]
16
+ when 'index', 'create' then wallaby_engine.resources_path hash
17
+ when 'new' then wallaby_engine.new_resource_path hash
18
+ when 'edit' then wallaby_engine.edit_resource_path hash
19
+ else wallaby_engine.resource_path hash
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ # We will need to normalize params and return a hash
26
+ # so that the url helper
27
+ # could build up the url properly.
28
+ # @param options [ActionController::Parameters, Hash]
29
+ # @return [Hash]
30
+ def normalize_params(options)
31
+ return options unless options.is_a? ActionController::Parameters
32
+ options.permit(:resources, :action, :id).to_h
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ module Wallaby
2
+ # Node to present tree structure
3
+ class Node
4
+ attr_reader :klass
5
+ attr_accessor :parent
6
+
7
+ delegate :name, to: :klass
8
+
9
+ def initialize(klass)
10
+ @klass = klass
11
+ end
12
+
13
+ def children
14
+ @children ||= []
15
+ end
16
+ end
17
+ end
@@ -1,31 +1,76 @@
1
- module Wallaby::Utils
2
- def self.to_resources_name(model_class)
3
- return '' if model_class.blank?
4
- model_class.to_s.underscore.gsub('/', '::').pluralize
5
- end
1
+ module Wallaby
2
+ # Utils
3
+ module Utils
4
+ def self.to_resources_name(model_class)
5
+ return EMPTY_STRING if model_class.blank?
6
+ model_class.to_s.underscore.gsub(SLASH, COLONS).pluralize
7
+ end
6
8
 
7
- def self.to_model_label(model_class)
8
- model_class_name = to_model_name model_class
9
- model_class_name.titleize.gsub '/', ' / '
10
- end
9
+ def self.to_model_label(model_class)
10
+ return EMPTY_STRING if model_class.blank?
11
+ model_class_name = to_model_name model_class
12
+ model_class_name.titleize.gsub(SLASH, SPACE + SLASH + SPACE)
13
+ end
11
14
 
12
- def self.to_model_name(resources_name)
13
- return '' if resources_name.blank?
14
- resources_name.to_s.singularize.gsub('::', '/').camelize
15
- end
15
+ def self.to_model_name(resources_name)
16
+ return EMPTY_STRING if resources_name.blank?
17
+ resources_name.to_s.singularize.gsub(COLONS, SLASH).camelize
18
+ end
16
19
 
17
- def self.to_model_class(resources_name, source = nil)
18
- return if resources_name.blank?
19
- begin
20
+ def self.to_model_class(resources_name)
21
+ return if resources_name.blank?
20
22
  class_name = to_model_name resources_name
23
+ # NOTE: do not use if statement instead of rescue here
24
+ # we want the class_name to be eagerly loaded
21
25
  class_name.constantize
22
- rescue
23
- message = [ class_name, source ].compact.join(' from ')
24
- fail Wallaby::ModelNotFound, message
26
+ rescue NameError => _error
27
+ raise ModelNotFound, class_name
28
+ end
29
+
30
+ def self.find_filter_name(filter_name, filters)
31
+ filter_name || # from params
32
+ filters.find { |_k, v| v[:default] }.try(:first) || # from default value
33
+ :all # last resort
34
+ end
35
+
36
+ def self.to_field_label(field_name, metadata)
37
+ field_name = field_name.to_s if field_name.is_a? Symbol
38
+ metadata[:label] || field_name.humanize
39
+ end
40
+
41
+ def self.to_partial_name(action_name)
42
+ FORM_ACTIONS.include?(action_name) ? 'form' : action_name
43
+ end
44
+
45
+ def self.to_hash(array)
46
+ Hash[*array.flatten(1)]
25
47
  end
26
- end
27
48
 
28
- def self.to_hash(array)
29
- Hash[ *array.flatten(1) ]
49
+ # @see http://stackoverflow.com/a/8710663/1326499
50
+ def self.clone(object)
51
+ ::Marshal.load(::Marshal.dump(object))
52
+ end
53
+
54
+ def self.preload_all
55
+ ::Wallaby::ApplicationController.to_s
56
+ preload 'app/models/**/*.rb'
57
+ preload 'app/decorators/**/*.rb'
58
+ preload 'app/controllers/**/*.rb'
59
+ preload 'app/servicers/**/*.rb'
60
+ preload 'app/**/*.rb'
61
+ end
62
+
63
+ def self.preload(file_pattern)
64
+ Dir[file_pattern].each do |file_path|
65
+ begin
66
+ name = file_path[%r{app/[^/]+/(.+)\.rb}, 1].gsub('concerns/', '')
67
+ class_name = name.classify
68
+ class_name.constantize unless Module.const_defined? class_name
69
+ rescue NameError, LoadError => e
70
+ Rails.logger.debug ">>>>>>>>> PRELOAD ERROR: #{e.message}"
71
+ Rails.logger.debug e.backtrace.slice(0, 5)
72
+ end
73
+ end
74
+ end
30
75
  end
31
76
  end
@@ -0,0 +1,12 @@
1
+ module Wallaby
2
+ class Configuration
3
+ # Configuration for metadata
4
+ class Features
5
+ attr_writer :turbolinks_enabled
6
+
7
+ def turbolinks_enabled
8
+ @turbolinks_enabled ||= false
9
+ end
10
+ end
11
+ end
12
+ end