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,3 @@
1
+ json.id @<%= resource.underscore %>.id.to_s
2
+ json.extract! @<%= resource.underscore %><%= fields_as_params %>
3
+ <% fields.each do |name, type| %><% if type == "has_many" %>json.<%= name %> @<%= resource.underscore %>.<%= name %>, :id, :name<% end %><% end %>
@@ -0,0 +1 @@
1
+ json.msg t"Items removed successfully.")
@@ -0,0 +1,13 @@
1
+ json.array! @<%= resource.pluralize.underscore %> do |<%= resource.underscore %>|
2
+ json.id <%= resource.underscore %>.id.to_s
3
+ json.extract! <%= resource.underscore %><%= fields_as_params %><% fields.each do |name, type| %><% case type
4
+ when "belongs_to" %>
5
+ json.<%= name %> do
6
+ if <%= resource.underscore %>.<%= name %>
7
+ json.id <%= resource.underscore %>.<%= name %>.id
8
+ json.name <%= resource.underscore %>.<%= name %>.name
9
+ end
10
+ end
11
+ <% when "has_many" %>
12
+ json.<%= name %> <%= resource.underscore %>.<%= name %>, :id, :name<% end %><% end %>
13
+ end
@@ -0,0 +1,6 @@
1
+ json.id @<%= resource.underscore %>.id.to_s
2
+ json.extract! @<%= resource.underscore %><%= fields_as_params %><% fields.each do |name, type| %>
3
+ <% case type
4
+ when "belongs_to" %>
5
+ json.partial! 'underworld/relations/belongs_to', object: @<%= resource.underscore %>.<%= name %>, :name => :<%= name %>, :fields => [:id, :name]
6
+ <% when "has_many" %>json.<%= name %> @<%= resource.underscore %>.<%= name %>, :id, :name<% end %><% end %>
@@ -0,0 +1,6 @@
1
+ json.id @<%= resource.underscore %>.id.to_s
2
+ json.extract! @<%= resource.underscore %><%= fields_as_params %>
3
+ <% fields.each do |name, type| %><% if type == "has_many" %>json.<%= name %> @<%= resource.underscore %>.<%= name %>, :id, :name
4
+ <% end %><% if type == "belongs_to" %>
5
+ json.partial! 'underworld/relations/belongs_to', object: @<%= resource.underscore %>.<%= name %>, :name => :<%= name %>, :fields => [:id, :name]
6
+ <% end %><% end %>
@@ -0,0 +1,57 @@
1
+ module Underworld
2
+ module Generators
3
+ class ViewsGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../../../../app/', __FILE__)
5
+
6
+ desc "Copy given views of a resource to the main application"
7
+ argument :resource_name , type: :string, required: true
8
+ argument :views_to_copy , type: :array, default: []
9
+
10
+ def copy_views
11
+ if views_to_copy.empty?
12
+ views = ['index', 'show', 'new', 'edit', 'create', 'update', 'destroy']
13
+ else
14
+ views = views_to_copy
15
+ end
16
+
17
+ empty_directory "app/views/#{resources}"
18
+
19
+ if views.include? 'index'
20
+ copy_file 'views/underworld/dashboard/resource/index.html.slim', "app/views/#{resources}/index.html.slim"
21
+ end
22
+
23
+ if views.include? 'show'
24
+ copy_file 'views/underworld/dashboard/resource/show.html.slim', "app/views/#{resources}/show.html.slim"
25
+ end
26
+
27
+ if views.include? 'new'
28
+ copy_file 'views/underworld/dashboard/resource/new.html.slim', "app/views/#{resources}/new.html.slim"
29
+ copy_file 'views/underworld/dashboard/resource/_form.html.slim', "app/views/#{resources}/_form.html.slim"
30
+ end
31
+
32
+ if views.include? 'edit'
33
+ copy_file 'views/underworld/dashboard/resource/edit.html.slim', "app/views/#{resources}/edit.html.slim"
34
+ copy_file 'views/underworld/dashboard/resource/_form.html.slim', "app/views/#{resources}/_form.html.slim"
35
+ end
36
+
37
+ if views.include? 'create'
38
+ copy_file 'views/underworld/dashboard/resource/create.js.erb', "app/views/#{resources}/create.js.erb"
39
+ end
40
+
41
+ if views.include? 'update'
42
+ copy_file 'views/underworld/dashboard/resource/update.js.erb', "app/views/#{resources}/update.js.erb"
43
+ end
44
+
45
+ if views.include? 'destroy'
46
+ copy_file 'views/underworld/dashboard/resource/destroy.js.erb', "app/views/#{resources}/destroy.js.erb"
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def resources
53
+ resource_name.underscore.pluralize
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,6 @@
1
+ namespace :docs do
2
+ desc "Generate the annotated source code document."
3
+ task :annotated do
4
+ system 'groc **/*.rb **/*.js **/*.js.coffee README.md -o docs/annotated_source'
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ namespace :underworld do
2
+ namespace :sync do
3
+
4
+ desc 'Create missing permissions'
5
+ task :permissions => :environment do
6
+ Underworld::Discovery::Permissions.create_all_permissions
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ namespace :underworld do
2
+ namespace :i18n do
3
+ desc 'Add all the missing keys to the locale files'
4
+ task :collect do
5
+ def merge_recursively(a, b)
6
+ #puts "Rec: ", a, b
7
+ return b if a.is_a?(String)
8
+ a.merge(b) {|key, a_item, b_item| merge_recursively(a_item, b_item) }
9
+ end
10
+
11
+ Dir["#{Rails.root}/tmp/i18n/*"].each do |locale_file|
12
+ locale = locale_file.split('/')[-1]
13
+
14
+ if File.exist? "#{Rails.root}/config/locales/#{locale}.yml"
15
+ raw_data = File.read("#{Rails.root}/config/locales/#{locale}.yml")
16
+ locale_data = YAML.load(raw_data)
17
+ else
18
+ locale_data = {}
19
+ end
20
+
21
+ Dir["#{Rails.root}/tmp/i18n/#{locale}/*"].each do |key_file|
22
+ key = key_file.split('/')[-1]
23
+ #puts "Key", key
24
+
25
+ title = key.split('.')[-1].titleize
26
+ array = ::I18n.normalize_keys(locale, key, nil)
27
+ tmp = array.reverse.inject(title) do |a, n|
28
+ { n.to_s => a }
29
+ end
30
+
31
+ locale_data = merge_recursively(locale_data, tmp)
32
+ end
33
+
34
+ puts YAML.dump(locale_data)[4..-1]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ require 'i18n'
2
+ require 'devise'
3
+ require 'turbolinks'
4
+ require 'modernizr-rails'
5
+ require 'model_discovery'
6
+ require 'pundit'
7
+ require 'slim-rails'
8
+ require 'formtastic'
9
+ require 'kaminari'
10
+ require 'amd'
11
+
12
+ # Underworld Module
13
+ module Underworld
14
+ autoload :Helpers, 'underworld/helpers/autoload_helper'
15
+ autoload :Routes, 'underworld/routes'
16
+ autoload :RouteHelpers, 'underworld/routes'
17
+ autoload :Liquid, 'underworld/liquid'
18
+ # autoload :Engine, 'underworld/engine'
19
+ autoload :Dashboard, 'underworld/dashboard'
20
+ autoload :Concerns, 'underworld/concerns'
21
+ autoload :ORM, 'underworld/orm'
22
+ end
23
+
24
+ require 'underworld/engine'
25
+ #require 'underworld/orm'
26
+ #require 'underworld/concerns'
27
+ #require 'underworld/dashboard'
28
+ require 'underworld/extension'
29
+ require 'underworld/omniauth'
30
+ require 'underworld/i18n'
31
+ #require 'underworld/route'
32
+ require 'underworld/action_dispatch'
33
+ require 'underworld/discovery'
34
+ require 'underworld/fake_assets'
35
+ require 'underworld/version'
@@ -0,0 +1,3 @@
1
+ class ActionDispatch::Routing::Mapper
2
+ include Underworld::RouteHelpers
3
+ end
@@ -0,0 +1,42 @@
1
+ module Underworld
2
+ module API
3
+
4
+ #autoload UsersAPI, "underworld/api/users_api"
5
+ #autoload GroupsAPI, "underworld/api/groups_api"
6
+ #autoload PermissionsAPI, "underworld/api/permissions_api"
7
+
8
+ class Base < Grape::API
9
+
10
+ def self.setup_api
11
+
12
+ # TODO: Allow user to configure this section
13
+ version 'v1', :vendor => "Codamic"
14
+ format :json
15
+ default_format :json
16
+
17
+ # TODO: Give this class a logger
18
+
19
+ helpers do
20
+
21
+ def warden
22
+ env['warden']
23
+ end
24
+
25
+ def current_user
26
+ warden.user
27
+ end
28
+
29
+ def authenticated_user
30
+ if warden.authenticated?
31
+ return true
32
+ else
33
+ error!('401 Unauthorized', 401)
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,41 @@
1
+ module Underworld
2
+ module API
3
+ class GroupsAPI < Grape::API
4
+
5
+ resource :groups do
6
+
7
+ desc "Return all the groups"
8
+ get do
9
+ authenticated_user
10
+ # TODO: Check for admin user only
11
+ Underworld::Group.includes(:permissions)
12
+ end
13
+
14
+ delete do
15
+ authenticated_user
16
+
17
+ #if can? :delete, Group
18
+ #end
19
+ Group.delete(params[:id].split(","))
20
+ end
21
+
22
+ post do
23
+ authenticated_user
24
+
25
+ permissions = [];
26
+
27
+ params[:permissions].each do |perm_string|
28
+ perm, model = perm_string.split "|"
29
+ permission = Permission.find_or_create_by_model_and_permission_type(model, perm)
30
+ permissions << permission
31
+ end
32
+
33
+ Group.create!({
34
+ name: params[:name],
35
+ permissions: permissions,
36
+ })
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ module Underworld
2
+ module API
3
+ class PermissionsAPI < Grape::API
4
+
5
+ resource :permissions do
6
+
7
+ desc "Return all permissions available"
8
+ get do
9
+ authenticated_user
10
+ # TODO: Check for admin user only
11
+ permissions = []
12
+
13
+ Underworld::Engine.models_with_permission.each do |model|
14
+ model = Object.const_get(model)
15
+ permissions.concat(model::Permissions.permission_strings(model))
16
+ end
17
+
18
+ permissions
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ require_dependency "underworld/api/users_api"
2
+ require_dependency "underworld/api/groups_api"
3
+ require_dependency "underworld/api/permissions_api"
4
+
5
+ module Underworld
6
+ module API
7
+ class Root < Grape::API
8
+
9
+ mount API::UsersAPI
10
+ mount API::GroupsAPI
11
+ mount API::PermissionsAPI
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ module Underworld
2
+ module API
3
+ class UsersAPI < Grape::API
4
+
5
+
6
+ resource :users do
7
+
8
+ desc "Return all the users"
9
+ get do
10
+ authenticated_user
11
+ # TODO: Check for admin user only
12
+ Underworld::User.all
13
+ end
14
+
15
+ end
16
+
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module Underworld
2
+ # Underworld Concerns module
3
+ module Concerns
4
+ end
5
+ end
6
+
7
+ require 'underworld/concerns/authorizable'
@@ -0,0 +1,81 @@
1
+ # TODO: This module should be removed
2
+ module Underworld
3
+ module Concerns
4
+ # Authorizable modules of Underworld which each resource model should
5
+ # includes this concern. Without this concern, models can not be authorized
6
+ module Authorizable
7
+ extend ActiveSupport::Concern
8
+
9
+ # Class methods which will add to model by including
10
+ # `Underworld::Concerns::Authorizable`
11
+ module ClassMethods
12
+ # Default permission hash
13
+ @@permissions = {
14
+ index: nil,
15
+ show: nil,
16
+ create: nil,
17
+ update: nil,
18
+ destroy: nil,
19
+ ownership: nil,
20
+ }
21
+
22
+ @@only_owner = false
23
+
24
+ # Return an array of strings representation of permissions
25
+ def permission_strings(model)
26
+ strings = []
27
+ model_name = model.to_s
28
+ humanize_name = ActiveModel::Name.new(model).human
29
+
30
+ if model.respond_to? :model_name
31
+ model_name = model.model_name
32
+ humanize_name = model_name.human
33
+ end
34
+
35
+ @@permissions.each do |key, value|
36
+ strings << {
37
+ name: "#{key}|#{model_name}",
38
+ string: t("underworld.permission_string", action: key.to_s, model: humanize_name)
39
+ }
40
+ end
41
+
42
+ strings
43
+ end
44
+
45
+ def possible_permissions
46
+ @@permissions.keys
47
+ end
48
+
49
+ # Define permissions using this method
50
+ def permissions(*args)
51
+ args.each do |permission|
52
+ if permission.class == Symbol
53
+ if not @@permissions.include? permission
54
+ @@permission[permission] = nil
55
+
56
+ elsif permission.class == Hash
57
+
58
+ permission.each do |key, value|
59
+ @@permissions[key.to_sym] = value
60
+ end
61
+
62
+ end
63
+ end
64
+
65
+
66
+ end
67
+ end
68
+
69
+ # This force user to have access to resources which is his.
70
+ def only_his_objects
71
+ @@only_owner = true
72
+ end
73
+
74
+ def only_his_objects?
75
+ @@only_owner
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,97 @@
1
+ module Underworld
2
+ # This module contains all the configuration of `Underworld::Engine`
3
+ # which can be setup in `config/initializer/underworld.rb`
4
+ module Configuration
5
+
6
+ @@modules_to_load = {}
7
+
8
+ # Configure logger
9
+ mattr_accessor :logger do
10
+ Logger.new(STDOUT)
11
+ end
12
+
13
+ # Dashboard url prefix
14
+ mattr_accessor :dashboard_namespace do
15
+ :dashboard
16
+ end
17
+
18
+ # ==> ORM configuration
19
+ # Load and configure the ORM. Supports :active_record (default) and
20
+ # :mongoid (bson_ext recommended) by default. Other ORMs may be
21
+ # available as additional gems.
22
+ # ORM name to use. either 'active_record' or 'mongoid'
23
+ mattr_accessor :orm
24
+
25
+ def orm=(orm_name)
26
+ @@orm = orm_name
27
+ require "devise/orm/#{orm_name}"
28
+ end
29
+
30
+ # We have to move this method somewhere else
31
+ def collect_i18n_missing_keys=(value)
32
+ if value
33
+ ::I18n.exception_handler = Underworld::I18n::MissingKeyHandler.new
34
+ end
35
+ end
36
+
37
+ mattr_accessor :i18n_debug do
38
+ false
39
+ end
40
+
41
+ # Site Title
42
+ attr_accessor :site_title do
43
+ 'Underworld'
44
+ end
45
+
46
+ mattr_accessor :slug
47
+
48
+ # Dashboard default javascript manifest
49
+ mattr_accessor :dashboard_js_manifest do
50
+ 'dashboard/application.js'
51
+ end
52
+
53
+ # Devise options
54
+ # Include default devise modules. Others available are:
55
+ # :token_authenticatable, :confirmable,
56
+ # :lockable, :timeoutable and :omniauthable
57
+ mattr_accessor :devise_options do
58
+ [:database_authenticatable, :registerable,
59
+ :recoverable, :rememberable, :trackable,
60
+ :lockable, :timeoutable, :validatable]
61
+ end
62
+
63
+ mattr_accessor :devise_for do
64
+ {}
65
+ end
66
+
67
+ # Whether using UUID with models or not.
68
+ mattr_accessor :use_uuid do
69
+ false
70
+ end
71
+
72
+ mattr_accessor :amd_dir do
73
+ 'amd'
74
+ end
75
+
76
+ mattr_accessor :amd do
77
+ true
78
+ end
79
+ # This hash map contains all the features as keys and
80
+ # the required dependencies of each feature in form of
81
+ # an array as value
82
+ @@modules_to_load[:amd] = ['amd']
83
+
84
+ # Load all the features dependencies based on their configuration
85
+ # value. For example if `amd` class method returns true all of its
86
+ # dependencies will be loaded.
87
+ def load_dependencies_based_on_configuration
88
+ @@modules_to_load.each do |k, v|
89
+ v.map { |mod| require mod } if send(k)
90
+ end
91
+ end
92
+
93
+ def enabled?(configuration)
94
+ @@modules_to_load.include? configuration
95
+ end
96
+ end
97
+ end