underworld 1.0.0

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 (365) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +339 -0
  5. data/Rakefile +48 -0
  6. data/app/assets/fonts/DroidNaskh-Bold.ttf +0 -0
  7. data/app/assets/fonts/DroidNaskh-Regular.ttf +0 -0
  8. data/app/assets/fonts/OpenSans-Bold.ttf +0 -0
  9. data/app/assets/fonts/OpenSans-BoldItalic.ttf +0 -0
  10. data/app/assets/fonts/OpenSans-ExtraBold.ttf +0 -0
  11. data/app/assets/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  12. data/app/assets/fonts/OpenSans-Italic.ttf +0 -0
  13. data/app/assets/fonts/OpenSans-Light.ttf +0 -0
  14. data/app/assets/fonts/OpenSans-LightItalic.ttf +0 -0
  15. data/app/assets/fonts/OpenSans-Regular.ttf +0 -0
  16. data/app/assets/fonts/OpenSans-Semibold.ttf +0 -0
  17. data/app/assets/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  18. data/app/assets/images/underworld/select2-spinner.gif +0 -0
  19. data/app/assets/images/underworld/select2.png +0 -0
  20. data/app/assets/images/underworld/select2x2.png +0 -0
  21. data/app/assets/javascripts/underworld/application.js +16 -0
  22. data/app/assets/javascripts/underworld/dashboard/application.js.erb +30 -0
  23. data/app/assets/javascripts/underworld/dashboard/functions.js.erb +50 -0
  24. data/app/assets/javascripts/underworld/dashboard/init.js.coffee +33 -0
  25. data/app/assets/javascripts/underworld/dashboard/lib/actions.js +7 -0
  26. data/app/assets/javascripts/underworld/dashboard/lib/amd.js.coffee.erb +0 -0
  27. data/app/assets/javascripts/underworld/dashboard/lib/flash_message.js +71 -0
  28. data/app/assets/javascripts/underworld/dashboard/lib/locale.js +14 -0
  29. data/app/assets/javascripts/underworld/dashboard/lib/misc.js +5 -0
  30. data/app/assets/javascripts/underworld/dashboard/lib/string.js +3 -0
  31. data/app/assets/javascripts/underworld/dashboard/lib/ujs_patches.js.coffee +28 -0
  32. data/app/assets/javascripts/underworld/dashboard/manifest.js +5 -0
  33. data/app/assets/javascripts/underworld/dashboard/variables.js.erb +6 -0
  34. data/app/assets/javascripts/underworld/groups.js +2 -0
  35. data/app/assets/javascripts/underworld/home.js +2 -0
  36. data/app/assets/javascripts/underworld/i18n.js +13 -0
  37. data/app/assets/javascripts/underworld/simple.js +20 -0
  38. data/app/assets/javascripts/underworld/users.js +2 -0
  39. data/app/assets/stylesheets/underworld/dashboard/loadindicator.scss +17 -0
  40. data/app/assets/stylesheets/underworld/dashboard/ltr/application.css +38 -0
  41. data/app/assets/stylesheets/underworld/dashboard/ltr/base.css.scss +0 -0
  42. data/app/assets/stylesheets/underworld/dashboard/rtl/application.css +11 -0
  43. data/app/assets/stylesheets/underworld/dashboard/rtl/base.css.scss +0 -0
  44. data/app/assets/stylesheets/underworld/dashboard/share.scss +62 -0
  45. data/app/assets/stylesheets/underworld/dashboard/variables.scss +9 -0
  46. data/app/assets/stylesheets/underworld/ltr/application.css +0 -0
  47. data/app/assets/stylesheets/underworld/rtl/application.css +0 -0
  48. data/app/assets/stylesheets/underworld/simple/ltr/application.css +2 -0
  49. data/app/assets/stylesheets/underworld/simple/rtl/application.css +2 -0
  50. data/app/assets/stylesheets/underworld/simple/rtl/rtl.scss +16 -0
  51. data/app/assets/stylesheets/underworld/simple/share.scss +11 -0
  52. data/app/controllers/underworld/api_controller.rb +133 -0
  53. data/app/controllers/underworld/application_controller.rb +16 -0
  54. data/app/controllers/underworld/assets_controller.rb +6 -0
  55. data/app/controllers/underworld/dashboard/application_controller.rb +43 -0
  56. data/app/controllers/underworld/dashboard/groups_controller.rb +85 -0
  57. data/app/controllers/underworld/dashboard/profile_controller.rb +49 -0
  58. data/app/controllers/underworld/dashboard/user_messages_controller.rb +27 -0
  59. data/app/controllers/underworld/dashboard/users_controller.rb +116 -0
  60. data/app/controllers/underworld/dashboard_controller.rb +16 -0
  61. data/app/controllers/underworld/omniauth/callbacks_controller.rb +24 -0
  62. data/app/helpers/underworld/application_helper.rb +4 -0
  63. data/app/helpers/underworld/dashboard_helper.rb +107 -0
  64. data/app/helpers/underworld/groups_helper.rb +4 -0
  65. data/app/helpers/underworld/home_helper.rb +4 -0
  66. data/app/helpers/underworld/users_helper.rb +8 -0
  67. data/app/models/application_record.rb +3 -0
  68. data/app/models/underworld/concerns/assignment.rb +16 -0
  69. data/app/models/underworld/concerns/user/auth_definitions.rb +87 -0
  70. data/app/models/underworld/concerns/user/gravatar.rb +11 -0
  71. data/app/models/underworld/concerns/user/mongoid_fields.rb +81 -0
  72. data/app/models/underworld/concerns/user/permission.rb +47 -0
  73. data/app/models/underworld/concerns/user/user_roles.rb +24 -0
  74. data/app/models/underworld/group.rb +57 -0
  75. data/app/models/underworld/permission.rb +43 -0
  76. data/app/models/underworld/user.rb +81 -0
  77. data/app/models/underworld/user_message.rb +6 -0
  78. data/app/policies/underworld/admin_only_policy.rb +66 -0
  79. data/app/policies/underworld/application_policy.rb +55 -0
  80. data/app/policies/underworld/group_policy.rb +8 -0
  81. data/app/policies/underworld/user_message_policy.rb +9 -0
  82. data/app/policies/underworld/user_policy.rb +9 -0
  83. data/app/views/angular/auth/groups/details.html +2 -0
  84. data/app/views/angular/auth/groups/index.html +2 -0
  85. data/app/views/angular/auth/groups/new.html +2 -0
  86. data/app/views/angular/auth/index.html +30 -0
  87. data/app/views/angular/auth/profile/edit.html +54 -0
  88. data/app/views/angular/auth/users/details.html +28 -0
  89. data/app/views/angular/auth/users/index.html +6 -0
  90. data/app/views/angular/auth/users/new.html +57 -0
  91. data/app/views/angular/conversations/details.html +19 -0
  92. data/app/views/angular/conversations/index.html +13 -0
  93. data/app/views/angular/conversations/new.html +39 -0
  94. data/app/views/angular/conversations/show.html +6 -0
  95. data/app/views/angular/conversations/show_details.html +15 -0
  96. data/app/views/angular/fields/boolean/boolean.html +4 -0
  97. data/app/views/angular/fields/control-combo/control-list.html +19 -0
  98. data/app/views/angular/fields/datetime/datetime.html +10 -0
  99. data/app/views/angular/fields/datetime/time.html +25 -0
  100. data/app/views/angular/fields/file/file.html.slim +0 -0
  101. data/app/views/angular/fields/float/float.html +4 -0
  102. data/app/views/angular/fields/image/image.html +1 -0
  103. data/app/views/angular/fields/integer/integer.html +4 -0
  104. data/app/views/angular/fields/relation/relation.html +44 -0
  105. data/app/views/angular/fields/string/string.html +22 -0
  106. data/app/views/angular/fields/tag/tag.html +1 -0
  107. data/app/views/angular/fields/text/text.html +4 -0
  108. data/app/views/angular/filter/index.html +15 -0
  109. data/app/views/angular/index.html +3 -0
  110. data/app/views/angular/locale/fa.po +25 -0
  111. data/app/views/angular/locale/templates.pot +24 -0
  112. data/app/views/angular/logs/index.html +6 -0
  113. data/app/views/angular/modules.html +0 -0
  114. data/app/views/angular/nav.html.erb +39 -0
  115. data/app/views/angular/underworld/views/generic_add_view.html.slim +5 -0
  116. data/app/views/devise/registrations/edit.html.erb +29 -0
  117. data/app/views/devise/registrations/new.html.erb +38 -0
  118. data/app/views/devise/sessions/new.html.erb +37 -0
  119. data/app/views/devise/shared/_links.erb +19 -0
  120. data/app/views/devise/shared/_omni_link.erb +33 -0
  121. data/app/views/kaminari/_first_page.html.slim +3 -0
  122. data/app/views/kaminari/_gap.html.slim +2 -0
  123. data/app/views/kaminari/_last_page.html.slim +3 -0
  124. data/app/views/kaminari/_next_page.html.slim +3 -0
  125. data/app/views/kaminari/_page.html.slim +3 -0
  126. data/app/views/kaminari/_paginator.html.slim +13 -0
  127. data/app/views/kaminari/_prev_page.html.slim +3 -0
  128. data/app/views/layouts/underworld/application.html.erb +79 -0
  129. data/app/views/layouts/underworld/dashboard.html.erb +52 -0
  130. data/app/views/layouts/underworld/simple.html.erb +27 -0
  131. data/app/views/underworld/api/v1/conversations/create.json.jbuilder +1 -0
  132. data/app/views/underworld/api/v1/conversations/destroy.json.jbuilder +1 -0
  133. data/app/views/underworld/api/v1/conversations/index.json.jbuilder +1 -0
  134. data/app/views/underworld/api/v1/conversations/reply.json.jbuilder +1 -0
  135. data/app/views/underworld/api/v1/conversations/show.json.jbuilder +14 -0
  136. data/app/views/underworld/api/v1/conversations/trash.json.jbuilder +1 -0
  137. data/app/views/underworld/api/v1/groups/create.json.jbuilder +4 -0
  138. data/app/views/underworld/api/v1/groups/destroy.html.erb +2 -0
  139. data/app/views/underworld/api/v1/groups/destroy.json.jbuilder +1 -0
  140. data/app/views/underworld/api/v1/groups/edit.html.erb +2 -0
  141. data/app/views/underworld/api/v1/groups/index.html.erb +2 -0
  142. data/app/views/underworld/api/v1/groups/index.json.jbuilder +6 -0
  143. data/app/views/underworld/api/v1/groups/new.html.erb +2 -0
  144. data/app/views/underworld/api/v1/groups/show.html.erb +2 -0
  145. data/app/views/underworld/api/v1/groups/show.json.jbuilder +5 -0
  146. data/app/views/underworld/api/v1/groups/update.json.jbuilder +4 -0
  147. data/app/views/underworld/api/v1/logs/index.json.jbuilder +1 -0
  148. data/app/views/underworld/api/v1/permissions/index.json.jbuilder +1 -0
  149. data/app/views/underworld/api/v1/permissions/user_permissions.json.jbuilder +1 -0
  150. data/app/views/underworld/api/v1/users/create.html.erb +2 -0
  151. data/app/views/underworld/api/v1/users/create.json.jbuilder +1 -0
  152. data/app/views/underworld/api/v1/users/destroy.json.jbuilder +1 -0
  153. data/app/views/underworld/api/v1/users/distroy.html.erb +2 -0
  154. data/app/views/underworld/api/v1/users/edit.html.erb +2 -0
  155. data/app/views/underworld/api/v1/users/index.html.erb +2 -0
  156. data/app/views/underworld/api/v1/users/index.json.jbuilder +4 -0
  157. data/app/views/underworld/api/v1/users/show.html.erb +2 -0
  158. data/app/views/underworld/api/v1/users/show.json.jbuilder +2 -0
  159. data/app/views/underworld/api/v1/users/update.json.jbuilder +1 -0
  160. data/app/views/underworld/dashboard/groups/_form.html.slim +68 -0
  161. data/app/views/underworld/dashboard/groups/create.js.erb +3 -0
  162. data/app/views/underworld/dashboard/groups/edit.html.slim +3 -0
  163. data/app/views/underworld/dashboard/groups/errors.js.erb +3 -0
  164. data/app/views/underworld/dashboard/groups/index.html.slim +47 -0
  165. data/app/views/underworld/dashboard/groups/new.html.slim +2 -0
  166. data/app/views/underworld/dashboard/groups/update.js.erb +3 -0
  167. data/app/views/underworld/dashboard/index.html.erb +0 -0
  168. data/app/views/underworld/dashboard/login_required_page.html.erb +5 -0
  169. data/app/views/underworld/dashboard/not_found.html.slim +9 -0
  170. data/app/views/underworld/dashboard/not_found.js.erb +1 -0
  171. data/app/views/underworld/dashboard/profile/_form.html.erb +33 -0
  172. data/app/views/underworld/dashboard/profile/_profile_form.html.erb +33 -0
  173. data/app/views/underworld/dashboard/profile/create.js.erb +3 -0
  174. data/app/views/underworld/dashboard/profile/edit.html.erb +2 -0
  175. data/app/views/underworld/dashboard/profile/edit_password.html.erb +2 -0
  176. data/app/views/underworld/dashboard/profile/errors.js.erb +3 -0
  177. data/app/views/underworld/dashboard/resource/_form.html.slim +33 -0
  178. data/app/views/underworld/dashboard/resource/_input.html.slim +3 -0
  179. data/app/views/underworld/dashboard/resource/create.js.erb +3 -0
  180. data/app/views/underworld/dashboard/resource/destroy.js.erb +2 -0
  181. data/app/views/underworld/dashboard/resource/edit.html.slim +3 -0
  182. data/app/views/underworld/dashboard/resource/index.html.slim +60 -0
  183. data/app/views/underworld/dashboard/resource/new.html.slim +2 -0
  184. data/app/views/underworld/dashboard/resource/show.html.slim +22 -0
  185. data/app/views/underworld/dashboard/resource/update.js.erb +3 -0
  186. data/app/views/underworld/dashboard/shared/_content_header.html.slim +15 -0
  187. data/app/views/underworld/dashboard/shared/_control_sidebar.html.slim +50 -0
  188. data/app/views/underworld/dashboard/shared/_footer.html.slim +7 -0
  189. data/app/views/underworld/dashboard/shared/_header.html.erb +98 -0
  190. data/app/views/underworld/dashboard/shared/_sidebar.html.erb +69 -0
  191. data/app/views/underworld/dashboard/shared/_toolbar.html.slim +0 -0
  192. data/app/views/underworld/dashboard/shared/errors.js.erb +3 -0
  193. data/app/views/underworld/dashboard/user_messages/_form.html.slim +0 -0
  194. data/app/views/underworld/dashboard/user_messages/create.js.erb +0 -0
  195. data/app/views/underworld/dashboard/user_messages/destroy.js.erb +0 -0
  196. data/app/views/underworld/dashboard/user_messages/new.html.slim +72 -0
  197. data/app/views/underworld/dashboard/users/_form.html.slim +73 -0
  198. data/app/views/underworld/dashboard/users/_password_form.html.slim +37 -0
  199. data/app/views/underworld/dashboard/users/create.js.erb +3 -0
  200. data/app/views/underworld/dashboard/users/destroy.js.erb +2 -0
  201. data/app/views/underworld/dashboard/users/edit.html.slim +3 -0
  202. data/app/views/underworld/dashboard/users/edit_password.html.slim +1 -0
  203. data/app/views/underworld/dashboard/users/errors.js.erb +3 -0
  204. data/app/views/underworld/dashboard/users/index.html.slim +66 -0
  205. data/app/views/underworld/dashboard/users/new.html.slim +2 -0
  206. data/app/views/underworld/dashboard/users/show.html.slim +6 -0
  207. data/app/views/underworld/dashboard/users/update.js.erb +3 -0
  208. data/app/views/underworld/dashboard/users/update_password.js.erb +3 -0
  209. data/app/views/underworld/relations/_belongs_to.json.jbuilder +11 -0
  210. data/config/initializers/devise.rb +24 -0
  211. data/config/locales/devise.en.yml +59 -0
  212. data/config/locales/devise.fa.yml +58 -0
  213. data/config/locales/underworld.en.yml +96 -0
  214. data/config/locales/underworld.fa.yml +108 -0
  215. data/config/routes.rb +43 -0
  216. data/config/spring.rb +1 -0
  217. data/db/migrate/20131013091000_devise_create_underworld_users.rb +65 -0
  218. data/db/migrate/20131020124701_create_underworld_groups.rb +15 -0
  219. data/db/migrate/20131021170923_create_underworld_permissions.rb +15 -0
  220. data/db/migrate/20131123120422_add_permissions_groups_table.rb +16 -0
  221. data/db/migrate/20140613120923_add_users_groups_table.rb +13 -0
  222. data/db/migrate/20151122115129_add_uniqueness_index_to_users_groups.rb +11 -0
  223. data/db/migrate/20160310105736_create_underworld_user_messages.rb +25 -0
  224. data/db/seeds.rb +49 -0
  225. data/lib/generators/underworld/install_generator.rb +108 -0
  226. data/lib/generators/underworld/resource_generator.rb +70 -0
  227. data/lib/generators/underworld/resources_generator.rb +20 -0
  228. data/lib/generators/underworld/templates/README +21 -0
  229. data/lib/generators/underworld/templates/SPECS +13 -0
  230. data/lib/generators/underworld/templates/api/controller.rb.erb +60 -0
  231. data/lib/generators/underworld/templates/api_controller.rb +2 -0
  232. data/lib/generators/underworld/templates/dashboard/controller.rb.erb +2 -0
  233. data/lib/generators/underworld/templates/dashboard_controller.rb +18 -0
  234. data/lib/generators/underworld/templates/devise.rb +251 -0
  235. data/lib/generators/underworld/templates/features/api.feature +92 -0
  236. data/lib/generators/underworld/templates/features/api.step.rb +7 -0
  237. data/lib/generators/underworld/templates/features/step_definitions/email_steps.rb +206 -0
  238. data/lib/generators/underworld/templates/features/support/email_spec.rb +1 -0
  239. data/lib/generators/underworld/templates/features/support/env.rb +79 -0
  240. data/lib/generators/underworld/templates/javascripts/application.js +19 -0
  241. data/lib/generators/underworld/templates/policy/application_policy.rb +2 -0
  242. data/lib/generators/underworld/templates/policy/policy.rb.erb +2 -0
  243. data/lib/generators/underworld/templates/seeds.rb +1 -0
  244. data/lib/generators/underworld/templates/spec/factories/groups.rb +5 -0
  245. data/lib/generators/underworld/templates/spec/factories/users.rb +10 -0
  246. data/lib/generators/underworld/templates/spec/spec_helper.rb +69 -0
  247. data/lib/generators/underworld/templates/spec/support/devise.rb +3 -0
  248. data/lib/generators/underworld/templates/stylesheets/dashboard/ltr/application.css +3 -0
  249. data/lib/generators/underworld/templates/stylesheets/dashboard/rtl/application.css +3 -0
  250. data/lib/generators/underworld/templates/stylesheets/ltr/application.css +3 -0
  251. data/lib/generators/underworld/templates/stylesheets/rtl/application.css +3 -0
  252. data/lib/generators/underworld/templates/underworld.rb +12 -0
  253. data/lib/generators/underworld/templates/views/create.json.jbuilder.erb +3 -0
  254. data/lib/generators/underworld/templates/views/destroy.json.jbuilder.erb +1 -0
  255. data/lib/generators/underworld/templates/views/index.json.jbuilder.erb +13 -0
  256. data/lib/generators/underworld/templates/views/show.json.jbuilder.erb +6 -0
  257. data/lib/generators/underworld/templates/views/update.json.jbuilder.erb +6 -0
  258. data/lib/generators/underworld/views_generator.rb +57 -0
  259. data/lib/tasks/docs.rake +6 -0
  260. data/lib/tasks/sync.rake +9 -0
  261. data/lib/tasks/underworld_tasks.rake +38 -0
  262. data/lib/underworld.rb +35 -0
  263. data/lib/underworld/action_dispatch.rb +3 -0
  264. data/lib/underworld/api.rb +42 -0
  265. data/lib/underworld/api/groups_api.rb +41 -0
  266. data/lib/underworld/api/permissions_api.rb +24 -0
  267. data/lib/underworld/api/root.rb +15 -0
  268. data/lib/underworld/api/users_api.rb +20 -0
  269. data/lib/underworld/concerns.rb +7 -0
  270. data/lib/underworld/concerns/authorizable.rb +81 -0
  271. data/lib/underworld/configuration.rb +97 -0
  272. data/lib/underworld/dashboard.rb +11 -0
  273. data/lib/underworld/dashboard/dsl.rb +41 -0
  274. data/lib/underworld/dashboard/dsl/base.rb +133 -0
  275. data/lib/underworld/dashboard/dsl/create.rb +116 -0
  276. data/lib/underworld/dashboard/dsl/form_fields_properties.rb +62 -0
  277. data/lib/underworld/dashboard/dsl/index.rb +45 -0
  278. data/lib/underworld/dashboard/dsl/show.rb +6 -0
  279. data/lib/underworld/dashboard/dsl/update.rb +6 -0
  280. data/lib/underworld/dashboard/helpers/box_helpers.rb +129 -0
  281. data/lib/underworld/dashboard/models.rb +2 -0
  282. data/lib/underworld/dashboard/models/sidebar.rb +139 -0
  283. data/lib/underworld/dashboard/sections.rb +2 -0
  284. data/lib/underworld/dashboard/sections/resource.rb +229 -0
  285. data/lib/underworld/dashboard/sections/resource_create.rb +263 -0
  286. data/lib/underworld/dashboard/sections/resource_destroy.rb +27 -0
  287. data/lib/underworld/dashboard/sections/resource_show.rb +96 -0
  288. data/lib/underworld/dashboard/sections/resources_index.rb +113 -0
  289. data/lib/underworld/dashboard/sections/sidebar.rb +41 -0
  290. data/lib/underworld/discovery.rb +8 -0
  291. data/lib/underworld/discovery/permissions.rb +49 -0
  292. data/lib/underworld/engine.rb +53 -0
  293. data/lib/underworld/exceptions.rb +7 -0
  294. data/lib/underworld/extension.rb +18 -0
  295. data/lib/underworld/extension/base.rb +29 -0
  296. data/lib/underworld/fake_assets.rb +5 -0
  297. data/lib/underworld/i18n.rb +101 -0
  298. data/lib/underworld/initialize.rb +0 -0
  299. data/lib/underworld/liquid.rb +7 -0
  300. data/lib/underworld/liquid/block.rb +14 -0
  301. data/lib/underworld/liquid/render_tag.rb +50 -0
  302. data/lib/underworld/liquid/tag.rb +51 -0
  303. data/lib/underworld/middlewares.rb +1 -0
  304. data/lib/underworld/middlewares/locale.rb +29 -0
  305. data/lib/underworld/omniauth.rb +8 -0
  306. data/lib/underworld/omniauth/callbacks.rb +39 -0
  307. data/lib/underworld/orm.rb +30 -0
  308. data/lib/underworld/routes.rb +117 -0
  309. data/lib/underworld/version.rb +3 -0
  310. data/test/controllers/underworld/dashboard/resource_test.rb +118 -0
  311. data/test/dummy/README.rdoc +28 -0
  312. data/test/dummy/Rakefile +6 -0
  313. data/test/dummy/app/assets/javascripts/application.js +13 -0
  314. data/test/dummy/app/assets/javascripts/dashboard/application.js +19 -0
  315. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  316. data/test/dummy/app/assets/stylesheets/dashboard/ltr/application.css +3 -0
  317. data/test/dummy/app/assets/stylesheets/dashboard/rtl/application.css +3 -0
  318. data/test/dummy/app/assets/stylesheets/ltr/application.css +3 -0
  319. data/test/dummy/app/assets/stylesheets/rtl/application.css +3 -0
  320. data/test/dummy/app/controllers/api_controller.rb +2 -0
  321. data/test/dummy/app/controllers/application_controller.rb +6 -0
  322. data/test/dummy/app/controllers/dashboard/application_controller.rb +18 -0
  323. data/test/dummy/app/helpers/application_helper.rb +2 -0
  324. data/test/dummy/app/policies/application_policy.rb +2 -0
  325. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  326. data/test/dummy/bin/bundle +3 -0
  327. data/test/dummy/bin/rails +4 -0
  328. data/test/dummy/bin/rake +4 -0
  329. data/test/dummy/config.ru +4 -0
  330. data/test/dummy/config/application.rb +23 -0
  331. data/test/dummy/config/boot.rb +5 -0
  332. data/test/dummy/config/database.yml +25 -0
  333. data/test/dummy/config/environment.rb +5 -0
  334. data/test/dummy/config/environments/development.rb +29 -0
  335. data/test/dummy/config/environments/production.rb +80 -0
  336. data/test/dummy/config/environments/test.rb +38 -0
  337. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  338. data/test/dummy/config/initializers/devise.rb +251 -0
  339. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  340. data/test/dummy/config/initializers/formstatic.rb +76 -0
  341. data/test/dummy/config/initializers/formtastic.rb +110 -0
  342. data/test/dummy/config/initializers/inflections.rb +16 -0
  343. data/test/dummy/config/initializers/kaminari_config.rb +10 -0
  344. data/test/dummy/config/initializers/mime_types.rb +5 -0
  345. data/test/dummy/config/initializers/secret_token.rb +12 -0
  346. data/test/dummy/config/initializers/session_store.rb +3 -0
  347. data/test/dummy/config/initializers/underworld.rb +11 -0
  348. data/test/dummy/config/initializers/underworld_assets.rb +1 -0
  349. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  350. data/test/dummy/config/locales/en.yml +23 -0
  351. data/test/dummy/config/routes.rb +13 -0
  352. data/test/dummy/lib/templates/slim/scaffold/_form.html.slim +8 -0
  353. data/test/dummy/public/404.html +58 -0
  354. data/test/dummy/public/422.html +58 -0
  355. data/test/dummy/public/500.html +57 -0
  356. data/test/dummy/public/favicon.ico +0 -0
  357. data/test/fabricators/underworld/groups.rb +27 -0
  358. data/test/fabricators/underworld/permissions.rb +14 -0
  359. data/test/fabricators/underworld/users.rb +17 -0
  360. data/test/generators/install_generator_test.rb +84 -0
  361. data/test/integration/underworld/authentication_test.rb +36 -0
  362. data/test/integration/underworld/dashboard_test.rb +64 -0
  363. data/test/test_helper.rb +72 -0
  364. metadata +1045 -0
  365. metadata.gz.sig +0 -0
@@ -0,0 +1,27 @@
1
+ module Underworld::Dashboard::Sections
2
+ module ResourceDestroy
3
+
4
+ extend ActiveSupport::Concern
5
+
6
+ # The actual action method of a dashboard controller
7
+ def destroy
8
+ @resource = model.find(params[:id])
9
+ authorize @resource
10
+
11
+ @resource_title = t(_resource_title.singularize)
12
+
13
+ before_destroy_hook(@resource)
14
+ @resource.destroy
15
+
16
+ return if _override_views.include? :destroy
17
+ render 'underworld/dashboard/resource/destroy'
18
+ end
19
+
20
+ private
21
+
22
+ # You can override this method to change the behaviour of `destroy`
23
+ # action
24
+ def before_destroy_hook(resource)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,96 @@
1
+ require_dependency 'underworld/dashboard/dsl/show'
2
+
3
+ module Underworld::Dashboard::Sections
4
+ module ResourceShow
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ # The actual action method of a dashboard controller
9
+ def show
10
+ @resource = model.find(params[:id])
11
+ authorize @resource
12
+
13
+ collect_model_fields_for_show
14
+
15
+ @resource_title = t(_resource_title.singularize)
16
+
17
+ show_hook(@resource)
18
+
19
+ return if _override_views.include? :show
20
+ render 'underworld/dashboard/resource/show'
21
+ end
22
+
23
+ protected
24
+
25
+ def collect_model_fields_for_show
26
+ @_fields ||= show_properties.fields
27
+ #valid_columns = all_valid_columns_for_show
28
+ end
29
+
30
+ def show_properties
31
+ Underworld::Dashboard::DSL::Show.new(model)
32
+ end
33
+
34
+ private
35
+
36
+
37
+ # def all_valid_columns_for_show
38
+ # return @all_valid_columns_for_show unless @all_valid_columns_for_show.nil?
39
+ # columns = model.columns_hash.dup
40
+ # relations = model.reflections
41
+
42
+ # relations.keys.each do |name|
43
+ # col = relations[name]
44
+ # column = columns.delete col.foreign_key
45
+ # columns[name] = column
46
+ # end
47
+
48
+ # @all_valid_columns_for_show = columns
49
+ # end
50
+ def _show_fields
51
+ all_valid_columns_for_show.keys.map(&:to_sym)
52
+ end
53
+
54
+ # You can override this method to change the behaviour of `show`
55
+ # action
56
+ def show_hook(resource)
57
+ end
58
+
59
+ # The actual DSL for index ages
60
+ module ClassMethods
61
+ # To specify any property and action for `show` section
62
+ # you must use `in_index` class method with block of
63
+ # properties. For example:
64
+ #
65
+ # ```ruby
66
+ # class ExamplesController < Dashboard::Application
67
+ # in_show do
68
+ # attributes :name, :description
69
+ # action_button :close, label: 'Close', href: dashboard_example_close_path
70
+ # end
71
+ # end
72
+ # ```
73
+ #
74
+ def in_show(&block)
75
+ name = controller_name
76
+ path = controller_path.gsub(name, '').gsub(/dashboard\//, '')
77
+ model = "#{path}#{name}".classify.constantize
78
+ show_props = Underworld::Dashboard::DSL::Show.new(model)
79
+
80
+ unless block_given?
81
+ fail ArgumentError, "You have to provide a block for 'in_show'"
82
+ end
83
+
84
+ show_props.instance_eval(&block) if block_given?
85
+
86
+ define_method(:show_properties) do
87
+ unless defined? @__show_props__
88
+ instance_exec(show_props, &block)
89
+ @__show_props__ = show_props
90
+ end
91
+ return @__show_props__
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,113 @@
1
+ require_dependency 'underworld/dashboard/dsl/index'
2
+
3
+ module Underworld::Dashboard::Sections
4
+ module ResourcesIndex
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ # The actual action method of a dashboard controller
9
+ def index
10
+ authorize model
11
+ fetch_and_set_all
12
+ action_buttons(index_properties)
13
+
14
+ @_tools_buttons = index_properties.tool_buttons || {}
15
+ index_hook(@resources)
16
+
17
+ return if _override_views.include? :index
18
+ render 'underworld/dashboard/resource/index'
19
+ end
20
+
21
+ protected
22
+
23
+ # Fetch all or part of the corresponding resource
24
+ # from data base with respect to `scope` DSL.
25
+ #
26
+ # The important thing here is that by using `scope`
27
+ # DSL this method will chain the resulted scope
28
+ # with other scopes like `page` and `policy_scope`
29
+ def fetch_index_objects
30
+ scope = index_properties.default_scope
31
+
32
+ if !scope.nil?
33
+
34
+ # If user provided an scope for `index` section.
35
+
36
+ if scope.respond_to? :call
37
+ # If scope provided by a block
38
+ scope = scope.call
39
+ else
40
+ # If scope provided by a symbol
41
+ # which should be a method name
42
+ scope = self.send(scope)
43
+ end
44
+
45
+ else
46
+ scope = model.all
47
+ #scope = ApplicationPolicy::Scope.new(current_user, model.all).resolve
48
+ end
49
+
50
+ scope = scope.order('created_at DESC').page(params[:page])
51
+ policy_scope(scope)
52
+
53
+ end
54
+
55
+ def index_properties
56
+ Underworld::Dashboard::DSL::Index.new(model)
57
+ end
58
+
59
+ private
60
+
61
+ def fetch_and_set_all
62
+ result = fetch_index_objects
63
+ instance_variable_set("@#{plural_name}", result)
64
+
65
+ @index_fields = index_properties.fields
66
+ @resources = result
67
+ end
68
+
69
+ # You can override this method to change the behaviour of `index`
70
+ # action
71
+ def index_hook(resources)
72
+
73
+ end
74
+ # The actual DSL for index ages
75
+ module ClassMethods
76
+
77
+ # To specify any property and action for `index` section
78
+ # you must use `in_index` class method with block of
79
+ # properties. For example:
80
+ #
81
+ # ```ruby
82
+ # class ExamplesController < Dashboard::Application
83
+ # in_index do
84
+ # attributes :name, :description
85
+ # action_button :close, label: 'Close', href: dashboard_example_close_path
86
+ # end
87
+ # end
88
+ # ```
89
+ #
90
+ def in_index(&block)
91
+ name = controller_name
92
+ path = controller_path.gsub(name, '').gsub(/dashboard\//, '')
93
+ model = "#{path}#{name}".classify.constantize
94
+
95
+ index_props = Underworld::Dashboard::DSL::Index.new(model)
96
+
97
+ unless block_given?
98
+ fail ArgumentError, "You have to provide a block for 'in_index'"
99
+ end
100
+
101
+ define_method(:index_properties) do
102
+ unless defined? @__index_props__
103
+ instance_exec(index_props, &block)
104
+ @__index_props__ = index_props
105
+ end
106
+
107
+ return @__index_props__
108
+ end
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,41 @@
1
+ require_dependency 'underworld/dashboard/models/sidebar'
2
+
3
+ module Underworld::Dashboard::Sections
4
+ module Sidebar
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ protected
9
+
10
+ def setup_sidebar
11
+ @sidebar = sidebar(t('dashboard')) do |sidebar|
12
+ sidebar.underworld_entries
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def sidebar(name, **options, &block)
19
+ sidebar = Underworld::Dashboard::Models::Sidebar.new(name, **options)
20
+
21
+ yield sidebar if block_given?
22
+
23
+ sidebar
24
+ end
25
+
26
+ module ClassMethods
27
+
28
+ def sidebar(name, **options, &block)
29
+ side = Underworld::Dashboard::Models::Sidebar.new(name, **options)
30
+
31
+ side.instance_eval do
32
+ block.call if block_given?
33
+ end
34
+
35
+ define_method(:setup_sidebar) do
36
+ instance_variable_set('@sidebar', side)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,8 @@
1
+ module Underworld
2
+ # This module contains all the code snippets
3
+ # to discover special entities in project
4
+ module Discovery
5
+ end
6
+ end
7
+
8
+ require 'underworld/discovery/permissions'
@@ -0,0 +1,49 @@
1
+ module Underworld
2
+ module Discovery
3
+ # This class is responsible to discoering all Permissions
4
+ # classes and provide a list of available permissions
5
+ class Permissions
6
+
7
+ # Run the given block for each object with permissions
8
+ def self.permission_objects(&block)
9
+ objects = []
10
+
11
+ # Walkthrough all models in application by using
12
+ # model_discovery gem and check for `permission_strings`
13
+ # method in models (If `Underworld::Permissions` included in
14
+ # model it has the permission_strings). And concat the
15
+ # permissions to `@permissions` instance method.
16
+ ::ApplicationModels.to_adapter.find_all.each do |m|
17
+ # `m` is a string contains name of a model and
18
+ # we use contstantize to get the model class with
19
+ # such name
20
+ model = m.model.constantize
21
+ if model.respond_to? :permission_strings
22
+ block.call(model)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.all_permissions
28
+ permissions = []
29
+ permission_objects do |object|
30
+ permissions.concat(object.permission_strings(object))
31
+ end
32
+
33
+ permissions.uniq
34
+ end
35
+
36
+ # Creating all possible permissions in database using
37
+ # `Underworld::Permission` model
38
+ def self.create_all_permissions
39
+
40
+ permission_objects do |object|
41
+ object.possible_permissions.each do |perm|
42
+ Underworld::Permission.where(model: object.to_s,
43
+ permission_type: perm).first_or_create
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,53 @@
1
+ require_relative './middlewares/locale'
2
+ require_relative './configuration'
3
+
4
+ module Underworld
5
+
6
+ # `Engine` class of **Underworld**.
7
+ class Engine < ::Rails::Engine
8
+ extend ::Underworld::Configuration
9
+
10
+ # TODO: Add a facility to allow developers to select
11
+ # features of underworld
12
+ isolate_namespace Underworld
13
+ engine_name 'underworld'
14
+
15
+ # Map `api` to `API` in Rails autoload
16
+ ActiveSupport::Inflector.inflections(:en) do |inflect|
17
+ inflect.acronym 'API'
18
+ inflect.acronym 'DSL'
19
+ end
20
+
21
+ config.generators do |g|
22
+ g.test_framework :minitest, fixture_replacement: :fabrication
23
+ g.fixture_replacement :fabrication, dir: "test/fabricators"
24
+ g.integration_tool :minitest
25
+ g.assets false
26
+ g.helper false
27
+ end
28
+
29
+ # The actual setup method which is responsible for configuring
30
+ # `Underworld` environment. This method simply yield the current
31
+ # class and allows developers to change the configuration via
32
+ # the class methods defined in `Underworld::Configuration` ( which is
33
+ # extended in this class ).
34
+ def self.setup
35
+ yield self
36
+
37
+ # Load the dependencies needed by each particular feature.
38
+ load_dependencies_based_on_configuration
39
+ end
40
+
41
+ # Override devise layout
42
+ config.to_prepare do
43
+ Devise::SessionsController.layout 'underworld/simple'
44
+ Devise::RegistrationsController.layout 'underworld/simple'
45
+ Devise::ConfirmationsController.layout 'underworld/application'
46
+ Devise::UnlocksController.layout 'underworld/application'
47
+ Devise::PasswordsController.layout 'underworld/application'
48
+ end
49
+
50
+ middleware.use Underworld::Middlewares::Locale
51
+
52
+ end
53
+ end
@@ -0,0 +1,7 @@
1
+ module Underworld
2
+ module Exceptions
3
+ class AuthorizationError < Exception
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Underworld
2
+ # Extension module of Underworld which contains all the related
3
+ # stuff to a Underworld extension.
4
+ module Extension
5
+
6
+ @@extensions = {}
7
+
8
+ def self.extensions
9
+ @@extensions
10
+ end
11
+
12
+ def self.extensions=(value)
13
+ @@extensions = value
14
+ end
15
+ end
16
+ end
17
+
18
+ require 'underworld/extension/base'
@@ -0,0 +1,29 @@
1
+ module Underworld
2
+ module Extension
3
+ # This module provide basic functionallity of a Underworld extension
4
+ # to a rails engine.
5
+ # It should be included in engine of all the Underworld extionsions
6
+ module Base
7
+
8
+ def included(base)
9
+ extend ClassMethods
10
+ end
11
+
12
+ class ClassMethods
13
+ def register_extension(name, klass)
14
+ # TODO: Replace this mechanism with more elegant one
15
+ # For example use [] method or someting
16
+ Underworld::Extension.extensions[name] = klass
17
+ end
18
+
19
+ # This method tells underworld that this extension will override
20
+ # the generators templates of underworld from `template_path` location
21
+ def override_generator_templates(template_path)
22
+ send(:define_singleton_method, 'generator_templates_path') do
23
+ template_path
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end