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,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