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,5 @@
1
+ require 'rails-assets-sugar'
2
+ require 'jquery-rails'
3
+ require 'admin_lte-rails'
4
+ require 'nprogress-rails'
5
+ require 'formtastic-bootstrap'
@@ -0,0 +1,101 @@
1
+ module ::ActionView
2
+ # = Action View Translation Helpers
3
+ module Helpers
4
+ module TranslationHelper
5
+
6
+ def t(key, options = {})
7
+ options = options.dup
8
+ has_default = options.has_key?(:default)
9
+ remaining_defaults = Array(options.delete(:default)).compact
10
+
11
+ if has_default && !remaining_defaults.first.kind_of?(Symbol)
12
+ options[:default] = remaining_defaults
13
+ end
14
+ # If the user has explicitly decided to NOT raise errors, pass that option to I18n.
15
+ # Otherwise, tell I18n to raise an exception, which we rescue further in this method.
16
+ # Note: `raise_error` refers to us re-raising the error in this method. I18n is forced to raise by default.
17
+ if options[:raise] == false
18
+ raise_error = false
19
+ i18n_raise = false
20
+ else
21
+ raise_error = options[:raise] || ActionView::Base.raise_on_missing_translations
22
+ i18n_raise = true
23
+ end
24
+
25
+ if html_safe_translation_key?(key)
26
+ html_safe_options = options.dup
27
+ options.except(*I18n::RESERVED_KEYS).each do |name, value|
28
+ unless name == :count && value.is_a?(Numeric)
29
+ html_safe_options[name] = ERB::Util.html_escape(value.to_s)
30
+ end
31
+ end
32
+ translation = I18n.translate(scope_key_by_partial(key), html_safe_options.merge(raise: i18n_raise))
33
+
34
+ translation.respond_to?(:html_safe) ? translation.html_safe : translation
35
+ else
36
+ I18n.translate(scope_key_by_partial(key), options.merge(raise: i18n_raise))
37
+ end
38
+ rescue I18n::MissingTranslationData => e
39
+ if remaining_defaults.present?
40
+ translate remaining_defaults.shift, options.merge(default: remaining_defaults)
41
+ else
42
+ raise e if raise_error
43
+
44
+ keys = I18n.normalize_keys(e.locale, e.key, e.options[:scope])
45
+ title = keys.last.to_s.humanize
46
+ title = "#{keys.join('.')}" if Underworld::Engine.i18n_debug
47
+
48
+ interpolations = options.except(:default, :scope)
49
+ if interpolations.any?
50
+ title << ", " << interpolations.map { |k, v| "#{k}: #{ERB::Util.html_escape(v)}" }.join(', ')
51
+ end
52
+
53
+ #content_tag('span', keys.last.to_s.titleize, class: 'translation_missing', title: title)
54
+ title
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ module Underworld
62
+ # I18n related utility functions
63
+ class I18n
64
+ RTL = [:fa, :ar]
65
+
66
+ def self.direction(locale)
67
+ if RTL.include? locale.to_sym
68
+ 'rtl'
69
+ else
70
+ 'ltr'
71
+ end
72
+ end
73
+
74
+ module Locale
75
+ def self.default_url_options
76
+ { :locale => I18n.locale }
77
+ end
78
+ end
79
+
80
+ class MissingKeyHandler < ::I18n::ExceptionHandler
81
+ require 'fileutils'
82
+
83
+ def create_key_cache(locale, key)
84
+ locale_dir = "#{Rails.root}/tmp/i18n/#{locale}"
85
+ key_file = "#{locale_dir}/#{key}"
86
+
87
+ FileUtils.mkdir_p locale_dir
88
+ FileUtils.touch [key_file]
89
+ end
90
+
91
+ def call(exception, locale, key, options)
92
+ if exception.is_a?(::I18n::MissingTranslation)
93
+ create_key_cache(locale, key)
94
+ super
95
+ else
96
+ super
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
File without changes
@@ -0,0 +1,7 @@
1
+ module Underworld
2
+ module Liquid
3
+ autoload :Tag, 'underworld/liquid/tag'
4
+ autoload :Block, 'underworld/liquid/block'
5
+ autoload :RenderTag, 'underworld/liquid/render_tag'
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ module Underworld
2
+ module Liquid
3
+ class Block < ::Liquid::Block
4
+
5
+ def self.block_name(name)
6
+ @@name = name
7
+ end
8
+
9
+ def self.name
10
+ @@name
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ module Underworld
2
+ module Liquid
3
+ # In order to use this class make sure to override the `before_render`
4
+ # and implement you logic there, Don't bother to override the `render`
5
+ # method
6
+ class RenderTag < Tag
7
+
8
+ class << self
9
+ def view(value)
10
+ define_method(:_view) do
11
+ value
12
+ end
13
+ end
14
+ end
15
+
16
+ def before_render(context)
17
+ end
18
+
19
+ def render(context)
20
+ before_render(context)
21
+ render_template(context)
22
+ end
23
+
24
+ private
25
+
26
+ def render_template(context)
27
+
28
+ controller = context.registers[:controller]
29
+ view_paths = controller.view_paths
30
+ request = context.registers[:view].request
31
+ controller = controller.class
32
+
33
+ controller.view_paths = view_paths
34
+
35
+ patched_request = assignments.merge(request.env)
36
+ renderer = controller.renderer.new(patched_request)
37
+
38
+ renderer.render _view, layout: nil
39
+ end
40
+
41
+ def assignments
42
+ tmp = instance_variable_names.map do |x|
43
+ [x[1..-1], instance_variable_get(x)]
44
+ end
45
+
46
+ { assigns: Hash[tmp] }
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,51 @@
1
+ module Underworld
2
+ module Liquid
3
+ class Tag < ::Liquid::Tag
4
+
5
+ attr_reader :arguments, :params
6
+
7
+ # This method produce the `tag_name` DSL which is mandatory for
8
+ # each tag and defines the tag name that the tag class should be
9
+ # registered with
10
+ def self.tag_name(name)
11
+ @@name = name
12
+ end
13
+
14
+ def self.name
15
+ @@name
16
+ end
17
+
18
+ def self.argument(options)
19
+ raise ArgumentError.new "'name' is mandatory for argument in '#{self.class.name}'" if options[:name].nil?
20
+
21
+ @arguments ||= []
22
+ @arguments << options
23
+ end
24
+
25
+ def initialize(name, args, options)
26
+ super
27
+
28
+ if !arguments.empty? && (args.nil? || args.empty?)
29
+ count = arguments.length
30
+ raise ArgumentError.new "'#{count}' argument(s) is/are needed for '#{self.class.name}' tag."
31
+ end
32
+
33
+ @direction = ::Underworld::I18n.direction(::I18n.locale)
34
+
35
+ @args = args.split(',').map do |x|
36
+ x.strip.tr('""', '').tr("''", '')
37
+ end
38
+
39
+ @params = {}
40
+
41
+ arguments.each_with_index do |arg, index|
42
+ @params[arg[:name]] = @args.fetch(index, arg[:default])
43
+ end
44
+ end
45
+
46
+ def arguments
47
+ @arguments ||= []
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1 @@
1
+ require 'underworld/middlewares/locale'
@@ -0,0 +1,29 @@
1
+ module Underworld
2
+ module Middlewares
3
+
4
+ # Locale middleware for `Underworld`. This middleware try to set
5
+ # the locale from url.
6
+ class Locale
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ req = Rack::Request.new(env)
13
+
14
+ # Check whether locale is presence or not.
15
+ if locale = req.path_info.match(/^([a-z]{2})\/.*/)
16
+ # If its set the default locale to it.
17
+ locale = locale[1]
18
+ else
19
+ # Use pre-defined default if it isn't
20
+ locale = ::I18n.default_locale
21
+ end
22
+
23
+ req.params['locale'] ||= locale
24
+ ::I18n.locale = locale
25
+ @app.call env
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,8 @@
1
+ module Underworld
2
+ module Omniauth
3
+ # TODO: Autoload ? really ?
4
+ # Change it ASAP. Remember that callback should
5
+ # not included if host project does not have omniauth enabled
6
+ autoload :Callbacks, "underworld/omniauth/callbacks"
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ module Underworld
2
+ module Omniauth
3
+
4
+ module Callbacks
5
+
6
+
7
+ def default_service_callback
8
+
9
+ create_or_find_user
10
+
11
+ if @user.persisted?
12
+ # This will throw if @user is not activated
13
+ sign_in_and_redirect @user, :event => :authentication
14
+ set_flash_message(:notice, :success, :kind => __callee__.to_s) if is_navigational_format?
15
+ else
16
+ session["devise.omni_data"] = request.env["omniauth.auth"]
17
+ redirect_to new_user_registration_url
18
+ end
19
+ end
20
+
21
+
22
+ if Devise.omniauth_configs.any?
23
+ Devise.omniauth_configs.keys.each do |provider|
24
+ unless method_defined? provider
25
+ send(:define_method, provider.to_sym) {default_service_callback}
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def create_or_find_user
33
+ # This method is implemented in User model
34
+ @user = User.find_from_oauth(request.env["omniauth.auth"], current_user)
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,30 @@
1
+ module Underworld
2
+ # A very simple class which provide functionalities to work with
3
+ # current orm
4
+ class ORM
5
+
6
+ def self.active_record?
7
+ current == 'active_record'
8
+ end
9
+
10
+ def self.mongoid?
11
+ current == 'mongoid'
12
+ end
13
+
14
+ # current orm
15
+ def self.current
16
+ ::Underworld::Engine.orm.to_s
17
+ end
18
+
19
+ # This class method returns the base class of current ORM
20
+ # It will be used in models to specify which class to inherit
21
+ # from, based on current ORM
22
+ def self.proper_base_class
23
+ #TODO: fix this for rails 5 which has a new parent for each model
24
+ return ::ActiveRecord::Base if active_record?
25
+ return ::Object if mongoid?
26
+ ::Underworld::Engine.orm = 'active_record'
27
+ ::ActiveRecord::Base
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,117 @@
1
+ module Underworld
2
+ module RouteHelpers
3
+
4
+ # routes to be added to dashboard
5
+ def in_dashboard
6
+ namespace Underworld::Engine.dashboard_namespace do
7
+ yield
8
+ end
9
+ end
10
+
11
+ # Allow localized scope
12
+ def localized_scope
13
+ langs = ::I18n.available_locales.join('|')
14
+ scope '(:locale)', locale: Regexp.new(langs) do
15
+ yield
16
+ end
17
+ end
18
+
19
+ # This method allow user to define his routes in api
20
+ # namespace
21
+ def api_routes(version: :v1)
22
+ # TODO: Add a dynamic solution for formats
23
+ namespace :api, defaults: { format: :json } do
24
+ namespace version do
25
+ # Call user given block to define user routes
26
+ # inside this namespace
27
+ yield if block_given?
28
+ end
29
+ end
30
+
31
+ scope 'module'.to_sym => 'underworld' do
32
+ #dashboard = Underworld::Engine.dashboard_namespace
33
+ #get "#{dashboard}/auth/groups/new", to: "#{dashboard}/groups#new"
34
+ get 'auth/profile/edit', to: "profile#edit"
35
+ post 'auth/profile/edit', to: "profile#update"
36
+ end
37
+
38
+ # TODO: Add a dynamic solution for formats
39
+ namespace :api, defaults: { format: :json } do
40
+ namespace version do
41
+ get 'permissions', to: 'permissions#index'
42
+ get 'permissions/user', to: 'permissions#user_permissions'
43
+ resources :groups, except: [:new]
44
+ resources :users, except: [:new]
45
+ resource :profile, except: [:new, :destroy]
46
+
47
+ get 'logs', to: 'logs#index'
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+
54
+ class Routes
55
+
56
+ class << self
57
+
58
+ attr_accessor :engine
59
+
60
+ def underworld(&block)
61
+ Underworld::Engine.routes.draw(&block)
62
+ end
63
+
64
+ def plugin(&block)
65
+ self.engine.routes.draw(&block)
66
+ end
67
+
68
+ def draw(engine, &block)
69
+ self.engine = engine
70
+
71
+ raise ArgumentError.new 'block is needed' unless block_given?
72
+
73
+ self.class_eval(&block)
74
+ end
75
+
76
+ def localized_scop(router: Rails.application.routes)
77
+ puts '[Warning]: This method is depricated please just use "localized_scope" in your router.'
78
+ langs = ::I18n.available_locales.join('|')
79
+ router.scope '(:locale)', locale: Regexp.new(langs)
80
+ end
81
+
82
+ # This class method will add `Underworld` routes to host application
83
+ # Router
84
+ def define_api_routes(routes: Rails.application.routes,
85
+ version: :v1)
86
+ puts '[Warning]: This method is depricated. Please use "api_routes" directly in your router.'
87
+ routes.draw do
88
+ # TODO: Add a dynamic solution for formats
89
+ namespace :api, defaults: { format: :json } do
90
+ namespace version do
91
+ # Call user given block to define user routes
92
+ # inside this namespace
93
+ yield self if block_given?
94
+
95
+ end
96
+ end
97
+
98
+ scope 'module'.to_sym => 'underworld' do
99
+ # TODO: Add a dynamic solution for formats
100
+ namespace :api, defaults: { format: :json } do
101
+ namespace version do
102
+ get 'permissions', to: 'permissions#index'
103
+ get 'permissions/user', to: 'permissions#user_permissions'
104
+ resources :groups, except: [:new]
105
+ resources :users, except: [:new]
106
+ resource :profile, except: [:new, :destroy]
107
+
108
+ get 'logs', to: 'logs#index'
109
+ end
110
+
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end