elucid-rails_admin 0.0.1

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 (348) hide show
  1. data/Gemfile +54 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +1334 -0
  4. data/Rakefile +14 -0
  5. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  6. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  7. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  8. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  9. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  10. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  11. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  12. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  13. data/app/assets/images/rails_admin/calendar.png +0 -0
  14. data/app/assets/images/rails_admin/clock.png +0 -0
  15. data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  16. data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  17. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  18. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  19. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  20. data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  21. data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  22. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  23. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  24. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  25. data/app/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  26. data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  27. data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  28. data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  29. data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  30. data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  31. data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  32. data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  33. data/app/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  34. data/app/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  35. data/app/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  36. data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  37. data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
  38. data/app/assets/images/rails_admin/colorpicker/select2.png +0 -0
  39. data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
  40. data/app/assets/images/rails_admin/logo.png +0 -0
  41. data/app/assets/images/rails_admin/magnifier.png +0 -0
  42. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  43. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  44. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  45. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  46. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  47. data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
  48. data/app/assets/javascripts/rails_admin/jquery-ui-1.8.16.custom.js +5019 -0
  49. data/app/assets/javascripts/rails_admin/jquery.colorpicker.js +484 -0
  50. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +1219 -0
  51. data/app/assets/javascripts/rails_admin/ra.datetimepicker.js +67 -0
  52. data/app/assets/javascripts/rails_admin/ra.filter-box.js +119 -0
  53. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +280 -0
  54. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +181 -0
  55. data/app/assets/javascripts/rails_admin/ra.remote-form.js +147 -0
  56. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +17 -0
  57. data/app/assets/javascripts/rails_admin/themes/default/ui.js +1 -0
  58. data/app/assets/javascripts/rails_admin/ui.js.coffee +30 -0
  59. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  60. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  61. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  62. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  63. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  64. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  65. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss +733 -0
  66. data/app/assets/stylesheets/rails_admin/base/README +2 -0
  67. data/app/assets/stylesheets/rails_admin/base/mixins.css.scss +1 -0
  68. data/app/assets/stylesheets/rails_admin/base/theming.css.scss +102 -0
  69. data/app/assets/stylesheets/rails_admin/base/variables.css.scss +1 -0
  70. data/app/assets/stylesheets/rails_admin/custom/README +3 -0
  71. data/app/assets/stylesheets/rails_admin/custom/mixins.css.scss +9 -0
  72. data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +11 -0
  73. data/app/assets/stylesheets/rails_admin/custom/variables.css.scss +11 -0
  74. data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +51 -0
  75. data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +180 -0
  76. data/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss +53 -0
  77. data/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss +25 -0
  78. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss +85 -0
  79. data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
  80. data/app/assets/stylesheets/rails_admin/themes/README +11 -0
  81. data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +1 -0
  82. data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +1 -0
  83. data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +1 -0
  84. data/app/controllers/rails_admin/application_controller.rb +62 -0
  85. data/app/controllers/rails_admin/history_controller.rb +26 -0
  86. data/app/controllers/rails_admin/main_controller.rb +371 -0
  87. data/app/helpers/rails_admin/application_helper.rb +65 -0
  88. data/app/helpers/rails_admin/form_builder.rb +52 -0
  89. data/app/helpers/rails_admin/main_helper.rb +100 -0
  90. data/app/models/rails_admin/history.rb +64 -0
  91. data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
  92. data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
  93. data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
  94. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
  95. data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
  96. data/app/views/layouts/rails_admin/_navigation.html.haml +19 -0
  97. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +9 -0
  98. data/app/views/layouts/rails_admin/application.html.haml +41 -0
  99. data/app/views/rails_admin/history/_dashboard.html.haml +10 -0
  100. data/app/views/rails_admin/history/show.html.haml +42 -0
  101. data/app/views/rails_admin/main/_delete_notice.html.haml +19 -0
  102. data/app/views/rails_admin/main/_form_colorpicker.html.haml +26 -0
  103. data/app/views/rails_admin/main/_form_datetime.html.haml +7 -0
  104. data/app/views/rails_admin/main/_form_enumeration.html.haml +5 -0
  105. data/app/views/rails_admin/main/_form_field.html.haml +1 -0
  106. data/app/views/rails_admin/main/_form_file_upload.html.haml +19 -0
  107. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +57 -0
  108. data/app/views/rails_admin/main/_form_filtering_select.html.haml +47 -0
  109. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +36 -0
  110. data/app/views/rails_admin/main/_form_text.html.haml +13 -0
  111. data/app/views/rails_admin/main/_models_links.html.haml +31 -0
  112. data/app/views/rails_admin/main/_object_links.html.haml +23 -0
  113. data/app/views/rails_admin/main/_submit_buttons.html.haml +12 -0
  114. data/app/views/rails_admin/main/bulk_delete.html.haml +6 -0
  115. data/app/views/rails_admin/main/dashboard.html.haml +31 -0
  116. data/app/views/rails_admin/main/delete.html.haml +13 -0
  117. data/app/views/rails_admin/main/edit.html.haml +2 -0
  118. data/app/views/rails_admin/main/export.html.haml +70 -0
  119. data/app/views/rails_admin/main/index.html.haml +98 -0
  120. data/app/views/rails_admin/main/new.html.haml +2 -0
  121. data/app/views/rails_admin/main/show.html.haml +14 -0
  122. data/config/initializers/active_record_extensions.rb +19 -0
  123. data/config/initializers/devise_patch.rb +9 -0
  124. data/config/initializers/haml.rb +3 -0
  125. data/config/locales/devise.bg.yml +42 -0
  126. data/config/locales/devise.de.yml +39 -0
  127. data/config/locales/devise.en.yml +39 -0
  128. data/config/locales/devise.es.yml +39 -0
  129. data/config/locales/devise.fi.yml +39 -0
  130. data/config/locales/devise.fr.yml +78 -0
  131. data/config/locales/devise.hr.yml +49 -0
  132. data/config/locales/devise.it.yml +39 -0
  133. data/config/locales/devise.lt.yml +39 -0
  134. data/config/locales/devise.mn.yml +39 -0
  135. data/config/locales/devise.nb.yml +43 -0
  136. data/config/locales/devise.pt-BR.yml +39 -0
  137. data/config/locales/devise.pt-PT.yml +39 -0
  138. data/config/locales/devise.ro.yml +46 -0
  139. data/config/locales/devise.ru.yml +39 -0
  140. data/config/locales/devise.sv.yml +39 -0
  141. data/config/locales/devise.tr.yml +39 -0
  142. data/config/locales/devise.uk.yml +39 -0
  143. data/config/locales/devise.zh-CN.yml +39 -0
  144. data/config/locales/devise.zh_cn.yml +39 -0
  145. data/config/locales/rails_admin.bg.yml +104 -0
  146. data/config/locales/rails_admin.da.yml +99 -0
  147. data/config/locales/rails_admin.de.yml +110 -0
  148. data/config/locales/rails_admin.en.yml +114 -0
  149. data/config/locales/rails_admin.es.yml +112 -0
  150. data/config/locales/rails_admin.fi.yml +107 -0
  151. data/config/locales/rails_admin.fr.yml +110 -0
  152. data/config/locales/rails_admin.hr.yml +81 -0
  153. data/config/locales/rails_admin.it.yml +109 -0
  154. data/config/locales/rails_admin.ja.yml +110 -0
  155. data/config/locales/rails_admin.lt.yml +102 -0
  156. data/config/locales/rails_admin.lv.yml +100 -0
  157. data/config/locales/rails_admin.mn.yml +103 -0
  158. data/config/locales/rails_admin.nb.yml +110 -0
  159. data/config/locales/rails_admin.nl.yml +135 -0
  160. data/config/locales/rails_admin.pl.yml +111 -0
  161. data/config/locales/rails_admin.pt-BR.yml +109 -0
  162. data/config/locales/rails_admin.pt-PT.yml +109 -0
  163. data/config/locales/rails_admin.ro.yml +113 -0
  164. data/config/locales/rails_admin.ru.yml +109 -0
  165. data/config/locales/rails_admin.sv.yml +103 -0
  166. data/config/locales/rails_admin.tr.yml +103 -0
  167. data/config/locales/rails_admin.uk.yml +100 -0
  168. data/config/locales/rails_admin.zh-CN.yml +114 -0
  169. data/config/locales/rails_admin.zh_cn.yml +107 -0
  170. data/config/routes.rb +28 -0
  171. data/lib/generators/rails_admin/install_generator.rb +83 -0
  172. data/lib/generators/rails_admin/templates/drop.rb +18 -0
  173. data/lib/generators/rails_admin/templates/initializer.erb +150 -0
  174. data/lib/generators/rails_admin/templates/migration.rb +18 -0
  175. data/lib/generators/rails_admin/uninstall_generator.rb +22 -0
  176. data/lib/generators/rails_admin/utils.rb +30 -0
  177. data/lib/rails_admin.rb +57 -0
  178. data/lib/rails_admin/abstract_model.rb +73 -0
  179. data/lib/rails_admin/abstract_object.rb +28 -0
  180. data/lib/rails_admin/adapters/active_record.rb +359 -0
  181. data/lib/rails_admin/config.rb +287 -0
  182. data/lib/rails_admin/config/base.rb +111 -0
  183. data/lib/rails_admin/config/fields.rb +99 -0
  184. data/lib/rails_admin/config/fields/association.rb +101 -0
  185. data/lib/rails_admin/config/fields/base.rb +273 -0
  186. data/lib/rails_admin/config/fields/factories/carrierwave.rb +16 -0
  187. data/lib/rails_admin/config/fields/factories/devise.rb +31 -0
  188. data/lib/rails_admin/config/fields/factories/dragonfly.rb +20 -0
  189. data/lib/rails_admin/config/fields/factories/enum.rb +11 -0
  190. data/lib/rails_admin/config/fields/factories/paperclip.rb +26 -0
  191. data/lib/rails_admin/config/fields/factories/password.rb +17 -0
  192. data/lib/rails_admin/config/fields/group.rb +63 -0
  193. data/lib/rails_admin/config/fields/groupable.rb +25 -0
  194. data/lib/rails_admin/config/fields/types.rb +26 -0
  195. data/lib/rails_admin/config/fields/types/all.rb +22 -0
  196. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +51 -0
  197. data/lib/rails_admin/config/fields/types/boolean.rb +29 -0
  198. data/lib/rails_admin/config/fields/types/carrierwave.rb +32 -0
  199. data/lib/rails_admin/config/fields/types/color.rb +37 -0
  200. data/lib/rails_admin/config/fields/types/date.rb +24 -0
  201. data/lib/rails_admin/config/fields/types/datetime.rb +160 -0
  202. data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
  203. data/lib/rails_admin/config/fields/types/dragonfly.rb +51 -0
  204. data/lib/rails_admin/config/fields/types/enum.rb +35 -0
  205. data/lib/rails_admin/config/fields/types/file_upload.rb +54 -0
  206. data/lib/rails_admin/config/fields/types/float.rb +14 -0
  207. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
  208. data/lib/rails_admin/config/fields/types/has_many_association.rb +42 -0
  209. data/lib/rails_admin/config/fields/types/has_one_association.rb +31 -0
  210. data/lib/rails_admin/config/fields/types/integer.rb +24 -0
  211. data/lib/rails_admin/config/fields/types/paperclip.rb +38 -0
  212. data/lib/rails_admin/config/fields/types/password.rb +41 -0
  213. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +78 -0
  214. data/lib/rails_admin/config/fields/types/string.rb +34 -0
  215. data/lib/rails_admin/config/fields/types/text.rb +39 -0
  216. data/lib/rails_admin/config/fields/types/time.rb +31 -0
  217. data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
  218. data/lib/rails_admin/config/has_fields.rb +112 -0
  219. data/lib/rails_admin/config/has_groups.rb +39 -0
  220. data/lib/rails_admin/config/hideable.rb +28 -0
  221. data/lib/rails_admin/config/model.rb +89 -0
  222. data/lib/rails_admin/config/proxy.rb +40 -0
  223. data/lib/rails_admin/config/sections.rb +51 -0
  224. data/lib/rails_admin/config/sections/create.rb +11 -0
  225. data/lib/rails_admin/config/sections/export.rb +18 -0
  226. data/lib/rails_admin/config/sections/list.rb +55 -0
  227. data/lib/rails_admin/config/sections/navigation.rb +21 -0
  228. data/lib/rails_admin/config/sections/show.rb +50 -0
  229. data/lib/rails_admin/config/sections/update.rb +11 -0
  230. data/lib/rails_admin/engine.rb +15 -0
  231. data/lib/rails_admin/extension.rb +23 -0
  232. data/lib/rails_admin/extensions/cancan.rb +5 -0
  233. data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +71 -0
  234. data/lib/rails_admin/generic_support.rb +15 -0
  235. data/lib/rails_admin/i18n_support.rb +43 -0
  236. data/lib/rails_admin/support/core_extensions.rb +44 -0
  237. data/lib/rails_admin/support/csv_converter.rb +109 -0
  238. data/lib/rails_admin/version.rb +6 -0
  239. data/lib/tasks/prepare_ci_env.rake +27 -0
  240. data/lib/tasks/rails_admin.rake +18 -0
  241. data/spec/ci.sh +2 -0
  242. data/spec/controllers/application_controller_spec.rb +30 -0
  243. data/spec/controllers/main_controller_spec.rb +86 -0
  244. data/spec/database_helpers.rb +15 -0
  245. data/spec/dummy_app/Gemfile +52 -0
  246. data/spec/dummy_app/README +256 -0
  247. data/spec/dummy_app/Rakefile +7 -0
  248. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  249. data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
  250. data/spec/dummy_app/app/locales/models.en.yml +8 -0
  251. data/spec/dummy_app/app/models/abstract.rb +5 -0
  252. data/spec/dummy_app/app/models/ball.rb +8 -0
  253. data/spec/dummy_app/app/models/cms.rb +5 -0
  254. data/spec/dummy_app/app/models/cms/basic_page.rb +7 -0
  255. data/spec/dummy_app/app/models/cms/unscoped_page.rb +3 -0
  256. data/spec/dummy_app/app/models/comment.rb +3 -0
  257. data/spec/dummy_app/app/models/division.rb +8 -0
  258. data/spec/dummy_app/app/models/draft.rb +11 -0
  259. data/spec/dummy_app/app/models/fan.rb +5 -0
  260. data/spec/dummy_app/app/models/field_test.rb +13 -0
  261. data/spec/dummy_app/app/models/league.rb +10 -0
  262. data/spec/dummy_app/app/models/player.rb +15 -0
  263. data/spec/dummy_app/app/models/rel_test.rb +6 -0
  264. data/spec/dummy_app/app/models/team.rb +25 -0
  265. data/spec/dummy_app/app/models/user.rb +21 -0
  266. data/spec/dummy_app/app/uploaders/carrierwave_uploader.rb +53 -0
  267. data/spec/dummy_app/app/views/layouts/application.html.erb +13 -0
  268. data/spec/dummy_app/config.ru +4 -0
  269. data/spec/dummy_app/config/application.rb +47 -0
  270. data/spec/dummy_app/config/boot.rb +6 -0
  271. data/spec/dummy_app/config/database.yml +22 -0
  272. data/spec/dummy_app/config/environment.rb +5 -0
  273. data/spec/dummy_app/config/environments/development.rb +27 -0
  274. data/spec/dummy_app/config/environments/production.rb +51 -0
  275. data/spec/dummy_app/config/environments/test.rb +39 -0
  276. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  277. data/spec/dummy_app/config/initializers/devise.rb +142 -0
  278. data/spec/dummy_app/config/initializers/inflections.rb +10 -0
  279. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  280. data/spec/dummy_app/config/initializers/quiet_assets.rb +10 -0
  281. data/spec/dummy_app/config/initializers/rails_admin.rb +10 -0
  282. data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
  283. data/spec/dummy_app/config/initializers/session_store.rb +8 -0
  284. data/spec/dummy_app/config/routes.rb +8 -0
  285. data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
  286. data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
  287. data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
  288. data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
  289. data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
  290. data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +19 -0
  291. data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
  292. data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
  293. data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
  294. data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
  295. data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
  296. data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
  297. data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
  298. data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
  299. data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
  300. data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
  301. data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
  302. data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
  303. data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
  304. data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
  305. data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
  306. data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
  307. data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
  308. data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
  309. data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
  310. data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
  311. data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
  312. data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
  313. data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
  314. data/spec/dummy_app/db/seeds.rb +18 -0
  315. data/spec/dummy_app/doc/README_FOR_APP +2 -0
  316. data/spec/dummy_app/public/404.html +0 -0
  317. data/spec/dummy_app/public/favicon.ico +0 -0
  318. data/spec/dummy_app/script/rails +6 -0
  319. data/spec/factories.rb +62 -0
  320. data/spec/generator_helpers.rb +30 -0
  321. data/spec/generators/install_generator_spec.rb +85 -0
  322. data/spec/generators/uninstall_generator_spec.rb +35 -0
  323. data/spec/lib/abstract_object_spec.rb +119 -0
  324. data/spec/lib/rails_admin_spec.rb +153 -0
  325. data/spec/requests/authorization/cancan_spec.rb +260 -0
  326. data/spec/requests/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
  327. data/spec/requests/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +55 -0
  328. data/spec/requests/basic/create/rails_admin_basic_create_spec.rb +143 -0
  329. data/spec/requests/basic/create/rails_admin_namespaced_model_create_spec.rb +24 -0
  330. data/spec/requests/basic/delete/rails_admin_basic_delete_spec.rb +35 -0
  331. data/spec/requests/basic/destroy/rails_admin_basic_destroy_spec.rb +56 -0
  332. data/spec/requests/basic/edit/rails_admin_basic_edit_spec.rb +98 -0
  333. data/spec/requests/basic/export/rails_admin_basic_export_spec.rb +84 -0
  334. data/spec/requests/basic/list/rails_admin_basic_list_spec.rb +401 -0
  335. data/spec/requests/basic/new/rails_admin_basic_new_spec.rb +74 -0
  336. data/spec/requests/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
  337. data/spec/requests/basic/show/rails_admin_basic_show_spec.rb +83 -0
  338. data/spec/requests/basic/update/rails_admin_basic_update_spec.rb +169 -0
  339. data/spec/requests/config/edit/rails_admin_config_edit_spec.rb +744 -0
  340. data/spec/requests/config/list/rails_admin_config_list_spec.rb +549 -0
  341. data/spec/requests/config/navigation/rails_admin_config_navigation_spec.rb +107 -0
  342. data/spec/requests/config/rails_admin_config_spec.rb +180 -0
  343. data/spec/requests/config/show/rails_admin_config_show_spec.rb +275 -0
  344. data/spec/requests/history/rails_admin_history_spec.rb +57 -0
  345. data/spec/requests/rails_admin_spec.rb +103 -0
  346. data/spec/requests/relation_spec.rb +26 -0
  347. data/spec/spec_helper.rb +88 -0
  348. metadata +717 -0
@@ -0,0 +1,18 @@
1
+ class CreateRailsAdminHistoriesTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :rails_admin_histories do |t|
4
+ t.text :message # title, name, or object_id
5
+ t.string :username
6
+ t.integer :item
7
+ t.string :table
8
+ t.integer :month, :limit => 2
9
+ t.integer :year, :limit => 5
10
+ t.timestamps
11
+ end
12
+ add_index(:rails_admin_histories, [:item, :table, :month, :year], :name => 'index_rails_admin_histories' )
13
+ end
14
+
15
+ def self.down
16
+ drop_table :rails_admin_histories
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ require 'rails/generators'
2
+ require File.expand_path('../utils', __FILE__)
3
+
4
+ module RailsAdmin
5
+ class UninstallGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+ include Generators::Utils::InstanceMethods
8
+ extend Generators::Utils::ClassMethods
9
+ source_root File.expand_path('../templates', __FILE__)
10
+
11
+ desc "RailsAdmin uninstall"
12
+
13
+ def uninstall
14
+ display "Why you leaving so soon? :("
15
+ migration_template 'drop.rb', 'db/migrate/drop_rails_admin_histories_table.rb'
16
+ remove_file 'config/initializers/rails_admin.rb'
17
+ remove_file 'config/initializers/rails_admin.rb.example'
18
+ gsub_file "config/routes.rb", /mount RailsAdmin::Engine => \'\/.+\', :as => \'rails_admin\'/, ''
19
+ display "Done! Devise has been left untouched."
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ module RailsAdmin
2
+ module Generators
3
+ module Utils
4
+ module InstanceMethods
5
+ def display(output, color = :green)
6
+ say(" - #{output}", color)
7
+ end
8
+
9
+ def ask_for(wording, default_value = nil, override_if_present_value = nil)
10
+ override_if_present_value.present? ?
11
+ display("Using [#{override_if_present_value}] for question '#{wording}'") && override_if_present_value :
12
+ ask(" ? #{wording} Press <enter> for [#{default_value}] >", :yellow).presence || default_value
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+ def next_migration_number(dirname)
18
+ if ActiveRecord::Base.timestamped_migrations
19
+ migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
20
+ migration_number += 1
21
+ migration_number.to_s
22
+ else
23
+ "%.3d" % (current_migration_number(dirname) + 1)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,57 @@
1
+ require 'rails_admin/engine'
2
+ require 'rails_admin/abstract_model'
3
+ require 'rails_admin/config'
4
+ require 'rails_admin/extension'
5
+ require 'rails_admin/extensions/cancan'
6
+ require 'rails_admin/support/csv_converter'
7
+ require 'rails_admin/support/core_extensions'
8
+
9
+ module RailsAdmin
10
+ def self.authenticate_with(&block)
11
+ ActiveSupport::Deprecation.warn("'#{self.name}.authenticate_with { }' is deprecated, use 'RailsAdmin.config{|c| c.authenticate_with }' instead", caller)
12
+ self.config {|c| c.authenticate_with(&block) }
13
+ end
14
+
15
+ def self.authorize_with(*args, &block)
16
+ ActiveSupport::Deprecation.warn("'#{self.name}.authorize_with { }' is deprecated, use 'RailsAdmin.config{|c| c.authorize_with }' instead", caller)
17
+ self.config {|c| c.authorize_with(*args, &block) }
18
+ end
19
+
20
+ def self.current_user_method(&block)
21
+ ActiveSupport::Deprecation.warn("'#{self.name}.current_user_method { }' is deprecated, use 'RailsAdmin.config{|c| c.current_user_method }' instead", caller)
22
+ self.config {|c| c.current_user_method(&block) }
23
+ end
24
+
25
+ def self.configure_with(extension, &block)
26
+ ActiveSupport::Deprecation.warn("'#{self.name}.configure_with { }' is deprecated, use 'RailsAdmin.config{|c| c.configure_with }' instead", caller)
27
+ self.config {|c| c.configure_with(extension, &block) }
28
+ end
29
+
30
+ # Setup RailsAdmin
31
+ #
32
+ # Given the first argument is a model class, a model class name
33
+ # or an abstract model object proxies to model configuration method.
34
+ #
35
+ # If only a block is passed it is stored to initializer stack to be evaluated
36
+ # on first request in production mode and on each request in development. If
37
+ # initialization has already occured (in other words RailsAdmin.setup has
38
+ # been called) the block will be added to stack and evaluated at once.
39
+ #
40
+ # Otherwise returns RailsAdmin::Config class.
41
+ #
42
+ # @see RailsAdmin::Config
43
+ def self.config(entity = nil, &block)
44
+ if entity
45
+ RailsAdmin::Config.model(entity, &block)
46
+ elsif block_given? && ENV['SKIP_RAILS_ADMIN_INITIALIZER'] != "true"
47
+ block.call(RailsAdmin::Config)
48
+ else
49
+ RailsAdmin::Config
50
+ end
51
+ end
52
+
53
+ # Reset RailsAdmin configuration to defaults
54
+ def self.reset
55
+ RailsAdmin::Config.reset
56
+ end
57
+ end
@@ -0,0 +1,73 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+ require 'rails_admin/generic_support'
3
+
4
+ module RailsAdmin
5
+ class AbstractModel
6
+ cattr_accessor :all_models, :all_abstract_models
7
+ @@all_models = nil
8
+ @@all_abstract_models = nil
9
+ # Returns all models for a given Rails app
10
+
11
+ # self.all_abstract_models
12
+ def self.all
13
+ @@all_abstract_models ||= all_models.map{ |model| new(model) }
14
+ end
15
+
16
+ def self.all_models
17
+ @@all_models ||= (
18
+ possible_models = RailsAdmin::Config.included_models.map(&:to_s).presence || ([Rails.application] + Rails::Application::Railties.engines).map do |app|
19
+ (app.paths['app/models'] + app.config.autoload_paths).map do |load_path|
20
+ Dir.glob(app.root.join(load_path)).map do |load_dir|
21
+ Dir.glob(load_dir + "/**/*.rb").map do |filename|
22
+ lchomp(filename, "#{app.root.join(load_dir)}/").chomp('.rb').camelize # app/models/module/class.rb => module/class.rb => module/class => Module::Class
23
+ end
24
+ end
25
+ end
26
+ end.flatten
27
+ excluded_models = (RailsAdmin::Config.excluded_models.map(&:to_s) + ['RailsAdmin::History'])
28
+ (possible_models - excluded_models).uniq.sort{|x, y| x.to_s <=> y.to_s}.map{|model| lookup(model) }.compact
29
+ )
30
+ end
31
+
32
+ # Given a string +model_name+, finds the corresponding model class
33
+ def self.lookup(model_name)
34
+ model = model_name.constantize rescue nil
35
+ if model && model.is_a?(Class) && superclasses(model).include?(ActiveRecord::Base) && !model.abstract_class?
36
+ model
37
+ else
38
+ nil
39
+ end
40
+ rescue LoadError
41
+ Rails.logger.error "Error while loading '#{model_name}': #{$!}"
42
+ nil
43
+ end
44
+
45
+ def initialize(model)
46
+ model = self.class.lookup(model.to_s.camelize) unless model.is_a?(Class)
47
+ @model_name = model.name
48
+ self.extend(GenericSupport)
49
+ ### TODO more ORMs support
50
+ require 'rails_admin/adapters/active_record'
51
+ self.extend(RailsAdmin::Adapters::ActiveRecord)
52
+ end
53
+
54
+ def model
55
+ @model_name.constantize
56
+ end
57
+
58
+ private
59
+
60
+ def self.superclasses(klass)
61
+ superclasses = []
62
+ while klass
63
+ superclasses << klass.superclass if klass && klass.superclass
64
+ klass = klass.superclass
65
+ end
66
+ superclasses
67
+ end
68
+
69
+ def self.lchomp(base, arg) # yeah.. delete was probably safe, but never know.
70
+ base.to_s.reverse.chomp(arg.to_s.reverse).reverse
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,28 @@
1
+ module RailsAdmin
2
+ class AbstractObject
3
+ # undef almost all of this class's methods so it will pass almost
4
+ # everything through to its delegate using method_missing (below).
5
+ instance_methods.each { |m| undef_method m unless m.to_s =~ /(^__|^send$|^object_id$)/ }
6
+ # ^^^^^
7
+ # the unnecessary "to_s" above is a workaround for meta_where, see
8
+ # https://github.com/sferik/rails_admin/issues/374
9
+
10
+ attr_accessor :object
11
+
12
+ def initialize(object)
13
+ self.object = object
14
+ end
15
+
16
+ def set_attributes(attributes, role = nil)
17
+ object.assign_attributes(attributes, :as => role)
18
+ end
19
+
20
+ def method_missing(name, *args, &block)
21
+ self.object.send(name, *args, &block)
22
+ end
23
+
24
+ def save(options = { :validate => true })
25
+ object.save(options)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,359 @@
1
+ require 'active_record'
2
+ require 'rails_admin/config/sections/list'
3
+ require 'rails_admin/abstract_object'
4
+
5
+ module RailsAdmin
6
+ module Adapters
7
+ module ActiveRecord
8
+ DISABLED_COLUMN_TYPES = [:tsvector]
9
+ @@polymorphic_parents = nil
10
+ def self.extended(abstract_model)
11
+
12
+ # ActiveRecord does not handle has_one relationships the way it does for has_many,
13
+ # and does not create any association_id and association_id= methods.
14
+ # Added here for backward compatibility after a refactoring, but it does belong to ActiveRecord IMO.
15
+ # Support is hackish at best. Atomicity is respected for creation, but not while updating.
16
+ # It means a failed validation at update on the parent object could still modify target belongs_to foreign ids.
17
+ #
18
+ #
19
+ abstract_model.model.reflect_on_all_associations.select{|assoc| assoc.macro.to_s == 'has_one'}.each do |association|
20
+ abstract_model.model.send(:define_method, "#{association.name}_id") do
21
+ self.send(association.name).try(:id)
22
+ end
23
+ abstract_model.model.send(:define_method, "#{association.name}_id=") do |id|
24
+ self.send(association.name.to_s + '=', associated = (id.blank? ? nil : association.klass.find_by_id(id)))
25
+ end
26
+ end
27
+ end
28
+
29
+ def self.polymorphic_parents(name)
30
+ @@polymorphic_parents ||= {}.tap do |hash|
31
+ RailsAdmin::AbstractModel.all_models.each do |klass|
32
+ klass.reflect_on_all_associations.select{|r| r.options[:as] }.each do |reflection|
33
+ (hash[reflection.options[:as].to_sym] ||= []) << klass
34
+ end
35
+ end
36
+ end
37
+ @@polymorphic_parents[name.to_sym]
38
+ end
39
+
40
+ def get(id)
41
+ if object = model.where(model.primary_key => id).first
42
+ RailsAdmin::AbstractObject.new object
43
+ else
44
+ nil
45
+ end
46
+ end
47
+
48
+ def count(options = {}, scope = nil)
49
+ all(options.merge({:limit => false, :page => false}), scope).count
50
+ end
51
+
52
+ def first(options = {}, scope = nil)
53
+ all(options, scope).first
54
+ end
55
+
56
+ def all(options = {}, scope = nil)
57
+ scope ||= self.scoped
58
+ scope = scope.includes(options[:include]) if options[:include]
59
+ scope = scope.limit(options[:limit]) if options[:limit]
60
+ scope = scope.where(model.primary_key => options[:bulk_ids]) if options[:bulk_ids]
61
+ scope = scope.where(options[:conditions]) if options[:conditions]
62
+ scope = scope.page(options[:page]).per(options[:per]) if options[:page] && options[:per]
63
+ scope = scope.reorder("#{options[:sort]} #{options[:sort_reverse] ? 'asc' : 'desc'}") if options[:sort]
64
+ scope
65
+ end
66
+
67
+ def scoped
68
+ model.scoped
69
+ end
70
+
71
+ def create(params = {})
72
+ model.create(params)
73
+ end
74
+
75
+ def new(params = {})
76
+ RailsAdmin::AbstractObject.new(model.new(params))
77
+ end
78
+
79
+ def destroy(objects)
80
+ [objects].flatten.map &:destroy
81
+ end
82
+
83
+ def destroy_all!
84
+ model.all.each do |object|
85
+ object.destroy
86
+ end
87
+ end
88
+
89
+ def has_and_belongs_to_many_associations
90
+ associations.select do |association|
91
+ association[:type] == :has_and_belongs_to_many
92
+ end
93
+ end
94
+
95
+ def has_many_associations
96
+ associations.select do |association|
97
+ association[:type] == :has_many
98
+ end
99
+ end
100
+
101
+ def has_one_associations
102
+ associations.select do |association|
103
+ association[:type] == :has_one
104
+ end
105
+ end
106
+
107
+ def belongs_to_associations
108
+ associations.select do |association|
109
+ association[:type] == :belongs_to
110
+ end
111
+ end
112
+
113
+ def associations
114
+ model.reflect_on_all_associations.map do |association|
115
+ {
116
+ :name => association.name.to_sym,
117
+ :pretty_name => association.name.to_s.tr('_', ' ').capitalize,
118
+ :type => association.macro,
119
+ :parent_model => association_parent_model_lookup(association),
120
+ :parent_key => association_parent_key_lookup(association),
121
+ :child_model => association_child_model_lookup(association),
122
+ :child_key => association_child_key_lookup(association),
123
+ :foreign_type => association_foreign_type_lookup(association),
124
+ :as => association_as_lookup(association),
125
+ :polymorphic => association_polymorphic_lookup(association),
126
+ :inverse_of => association_inverse_of_lookup(association),
127
+ :read_only => association_read_only_lookup(association)
128
+ }
129
+ end
130
+ end
131
+
132
+ def polymorphic_associations
133
+ (has_many_associations + has_one_associations).select do |association|
134
+ association[:options][:as]
135
+ end
136
+ end
137
+
138
+ def properties
139
+ columns = model.columns.reject {|c| DISABLED_COLUMN_TYPES.include?(c.type.to_sym) }
140
+ columns.map do |property|
141
+ {
142
+ :name => property.name.to_sym,
143
+ :pretty_name => property.name.to_s.tr('_', ' ').capitalize,
144
+ :type => property.type,
145
+ :length => property.limit,
146
+ :nullable? => property.null,
147
+ :serial? => property.primary,
148
+ }
149
+ end
150
+ end
151
+
152
+ def model_store_exists?
153
+ model.table_exists?
154
+ end
155
+
156
+ def get_conditions_hash(model_config, query, filters)
157
+ @like_operator = "ILIKE" if ::ActiveRecord::Base.configurations[Rails.env]['adapter'] == "postgresql"
158
+ @like_operator ||= "LIKE"
159
+
160
+ query_statements = []
161
+ filters_statements = []
162
+ values = []
163
+ conditions = [""]
164
+
165
+ if query.present?
166
+ queryable_fields = model_config.list.fields.select(&:queryable?)
167
+ queryable_fields.each do |field|
168
+ searchable_columns = field.searchable_columns.flatten
169
+ searchable_columns.each do |field_infos|
170
+ statement, value1, value2 = build_statement(field_infos[:column], field_infos[:type], query, field.search_operator)
171
+ if statement
172
+ query_statements << statement
173
+ values << value1 unless value1.nil?
174
+ values << value2 unless value2.nil?
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ unless query_statements.empty?
181
+ conditions[0] += " AND " unless conditions == [""]
182
+ conditions[0] += "(#{query_statements.join(" OR ")})" # any column field will do
183
+ end
184
+
185
+ if filters.present?
186
+ @filterable_fields = model_config.list.fields.select(&:filterable?).inject({}){ |memo, field| memo[field.name.to_sym] = field.searchable_columns; memo }
187
+ filters.each_pair do |field_name, filters_dump|
188
+ filters_dump.each do |filter_index, filter_dump|
189
+ field_statements = []
190
+ @filterable_fields[field_name.to_sym].each do |field_infos|
191
+ unless filter_dump[:disabled]
192
+ statement, value1, value2 = build_statement(field_infos[:column], field_infos[:type], filter_dump[:value], (filter_dump[:operator] || 'default'))
193
+ if statement
194
+ field_statements << statement
195
+ values << value1 unless value1.nil?
196
+ values << value2 unless value2.nil?
197
+ end
198
+ end
199
+ end
200
+ filters_statements << "(#{field_statements.join(' OR ')})" unless field_statements.empty?
201
+ end
202
+ end
203
+ end
204
+
205
+ unless filters_statements.empty?
206
+ conditions[0] += " AND " unless conditions == [""]
207
+ conditions[0] += "#{filters_statements.join(" AND ")}" # filters should all be true
208
+ end
209
+
210
+ conditions += values
211
+ conditions != [""] ? { :conditions => conditions } : {}
212
+ end
213
+
214
+ def build_statement(column, type, value, operator)
215
+
216
+ # this operator/value has been discarded (but kept in the dom to override the one stored in the various links of the page)
217
+ return if operator == '_discard' || value == '_discard'
218
+
219
+ # filtering data with unary operator, not type dependent
220
+ if operator == '_blank' || value == '_blank'
221
+ return ["(#{column} IS NULL OR #{column} = '')"]
222
+ elsif operator == '_present' || value == '_present'
223
+ return ["(#{column} IS NOT NULL AND #{column} != '')"]
224
+ elsif operator == '_null' || value == '_null'
225
+ return ["(#{column} IS NULL)"]
226
+ elsif operator == '_not_null' || value == '_not_null'
227
+ return ["(#{column} IS NOT NULL)"]
228
+ elsif operator == '_empty' || value == '_empty'
229
+ return ["(#{column} = '')"]
230
+ elsif operator == '_not_empty' || value == '_not_empty'
231
+ return ["(#{column} != '')"]
232
+ end
233
+
234
+ # now we go type specific
235
+ case type
236
+ when :boolean
237
+ return ["(#{column} IS NULL OR #{column} = ?)", false] if ['false', 'f', '0'].include?(value)
238
+ return ["(#{column} = ?)", true] if ['true', 't', '1'].include?(value)
239
+ when :integer, :belongs_to_association
240
+ return if value.blank?
241
+ ["(#{column} = ?)", value.to_i] if value.to_i.to_s == value
242
+ when :string, :text
243
+ return if value.blank?
244
+ value = case operator
245
+ when 'default', 'like'
246
+ "%#{value}%"
247
+ when 'starts_with'
248
+ "#{value}%"
249
+ when 'ends_with'
250
+ "%#{value}"
251
+ when 'is', '='
252
+ "#{value}"
253
+ end
254
+ ["(#{column} #{@like_operator} ?)", value]
255
+ when :datetime, :timestamp, :date
256
+ return unless operator != 'default'
257
+ values = case operator
258
+ when 'today'
259
+ [Date.today.beginning_of_day, Date.today.end_of_day]
260
+ when 'yesterday'
261
+ [Date.yesterday.beginning_of_day, Date.yesterday.end_of_day]
262
+ when 'this_week'
263
+ [Date.today.beginning_of_week.beginning_of_day, Date.today.end_of_week.end_of_day]
264
+ when 'last_week'
265
+ [1.week.ago.to_date.beginning_of_week.beginning_of_day, 1.week.ago.to_date.end_of_week.end_of_day]
266
+ when 'less_than'
267
+ return if value.blank?
268
+ [value.to_i.days.ago, DateTime.now]
269
+ when 'more_than'
270
+ return if value.blank?
271
+ [2000.years.ago, value.to_i.days.ago]
272
+ end
273
+ ["(#{column} BETWEEN ? AND ?)", *values]
274
+ when :enum
275
+ return if value.blank?
276
+ ["(#{column} IN (?))", [value].flatten]
277
+ end
278
+ end
279
+
280
+ def association_options(association)
281
+ if association.options[:polymorphic]
282
+ {
283
+ :polymorphic => true,
284
+ :foreign_type => association.options[:foreign_type] || "#{association.name}_type"
285
+ }
286
+ elsif association.options[:as]
287
+ {
288
+ :as => association.options[:as]
289
+ }
290
+ else
291
+ {}
292
+ end
293
+ end
294
+
295
+ def association_parent_model_lookup(association)
296
+ case association.macro
297
+ when :belongs_to
298
+ if association.options[:polymorphic]
299
+ RailsAdmin::Adapters::ActiveRecord.polymorphic_parents(association.name) || []
300
+ else
301
+ association.klass
302
+ end
303
+ when :has_one, :has_many, :has_and_belongs_to_many
304
+ association.active_record
305
+ else
306
+ raise "Unknown association type: #{association.macro.inspect}"
307
+ end
308
+ end
309
+
310
+ def association_foreign_type_lookup(association)
311
+ if association.options[:polymorphic]
312
+ association.options[:foreign_type].try(:to_sym) || :"#{association.name}_type"
313
+ end
314
+ end
315
+
316
+ def association_as_lookup(association)
317
+ association.options[:as].try :to_sym
318
+ end
319
+
320
+ def association_polymorphic_lookup(association)
321
+ association.options[:polymorphic]
322
+ end
323
+
324
+ def association_parent_key_lookup(association)
325
+ [:id]
326
+ end
327
+
328
+ def association_inverse_of_lookup(association)
329
+ association.options[:inverse_of].try :to_sym
330
+ end
331
+
332
+ def association_read_only_lookup(association)
333
+ association.options[:readonly]
334
+ end
335
+
336
+ def association_child_model_lookup(association)
337
+ case association.macro
338
+ when :belongs_to
339
+ association.active_record
340
+ when :has_one, :has_many, :has_and_belongs_to_many
341
+ association.klass
342
+ else
343
+ raise "Unknown association type: #{association.macro.inspect}"
344
+ end
345
+ end
346
+
347
+ def association_child_key_lookup(association)
348
+ case association.macro
349
+ when :belongs_to
350
+ association.options[:foreign_key].try(:to_sym) || "#{association.name}_id".to_sym
351
+ when :has_one, :has_many, :has_and_belongs_to_many
352
+ association.foreign_key.to_sym
353
+ else
354
+ raise "Unknown association type: #{association.macro.inspect}"
355
+ end
356
+ end
357
+ end
358
+ end
359
+ end