platform 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. data/.gitignore +21 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +191 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +5 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/images/platform/.gitkeep +0 -0
  9. data/app/assets/images/platform/accept.png +0 -0
  10. data/app/assets/images/platform/action_tab_bkgd.gif +0 -0
  11. data/app/assets/images/platform/action_tab_white_bkgd.gif +0 -0
  12. data/app/assets/images/platform/add.png +0 -0
  13. data/app/assets/images/platform/apps/app_icon.gif +0 -0
  14. data/app/assets/images/platform/apps/app_logo.gif +0 -0
  15. data/app/assets/images/platform/arrow_down.gif +0 -0
  16. data/app/assets/images/platform/arrow_down.png +0 -0
  17. data/app/assets/images/platform/arrow_down_grey.png +0 -0
  18. data/app/assets/images/platform/arrow_right.gif +0 -0
  19. data/app/assets/images/platform/arrow_up.png +0 -0
  20. data/app/assets/images/platform/arrow_up_grey.png +0 -0
  21. data/app/assets/images/platform/bullet_go.png +0 -0
  22. data/app/assets/images/platform/buttons.png +0 -0
  23. data/app/assets/images/platform/cancel.png +0 -0
  24. data/app/assets/images/platform/clipboard_icon.gif +0 -0
  25. data/app/assets/images/platform/close.gif +0 -0
  26. data/app/assets/images/platform/cross.png +0 -0
  27. data/app/assets/images/platform/default_app_icon.gif +0 -0
  28. data/app/assets/images/platform/default_app_logo.gif +0 -0
  29. data/app/assets/images/platform/delete.png +0 -0
  30. data/app/assets/images/platform/disk.png +0 -0
  31. data/app/assets/images/platform/exclamation.png +0 -0
  32. data/app/assets/images/platform/eye.png +0 -0
  33. data/app/assets/images/platform/eye_not.png +0 -0
  34. data/app/assets/images/platform/field_sprite.gif +0 -0
  35. data/app/assets/images/platform/find.png +0 -0
  36. data/app/assets/images/platform/globe.gif +0 -0
  37. data/app/assets/images/platform/help.png +0 -0
  38. data/app/assets/images/platform/help/app_reg.png +0 -0
  39. data/app/assets/images/platform/help/app_reg_ext.png +0 -0
  40. data/app/assets/images/platform/help/app_reg_web.png +0 -0
  41. data/app/assets/images/platform/help/auth_desktop.png +0 -0
  42. data/app/assets/images/platform/help/auth_iframe.png +0 -0
  43. data/app/assets/images/platform/help/auth_iphone.png +0 -0
  44. data/app/assets/images/platform/help/auth_web.png +0 -0
  45. data/app/assets/images/platform/help/authorize.png +0 -0
  46. data/app/assets/images/platform/help/ext.png +0 -0
  47. data/app/assets/images/platform/help/login.png +0 -0
  48. data/app/assets/images/platform/help/login_desktop.png +0 -0
  49. data/app/assets/images/platform/help/login_iphone.png +0 -0
  50. data/app/assets/images/platform/help/login_web.png +0 -0
  51. data/app/assets/images/platform/help2.png +0 -0
  52. data/app/assets/images/platform/information.png +0 -0
  53. data/app/assets/images/platform/keyboard.png +0 -0
  54. data/app/assets/images/platform/language_selector_arrow.gif +0 -0
  55. data/app/assets/images/platform/left_quote.png +0 -0
  56. data/app/assets/images/platform/lightning.png +0 -0
  57. data/app/assets/images/platform/loading.gif +0 -0
  58. data/app/assets/images/platform/loading2.gif +0 -0
  59. data/app/assets/images/platform/loading3.gif +0 -0
  60. data/app/assets/images/platform/loading_animation.gif +0 -0
  61. data/app/assets/images/platform/loading_large.gif +0 -0
  62. data/app/assets/images/platform/lock.png +0 -0
  63. data/app/assets/images/platform/lock_add.png +0 -0
  64. data/app/assets/images/platform/lock_delete.png +0 -0
  65. data/app/assets/images/platform/lock_open.png +0 -0
  66. data/app/assets/images/platform/medals/bronze.png +0 -0
  67. data/app/assets/images/platform/medals/gold.png +0 -0
  68. data/app/assets/images/platform/medals/runner.png +0 -0
  69. data/app/assets/images/platform/medals/silver.png +0 -0
  70. data/app/assets/images/platform/minus_node.png +0 -0
  71. data/app/assets/images/platform/oauth/perm_tile.gif +0 -0
  72. data/app/assets/images/platform/oauth/right_grey.png +0 -0
  73. data/app/assets/images/platform/pencil.png +0 -0
  74. data/app/assets/images/platform/photo_silhouette.gif +0 -0
  75. data/app/assets/images/platform/pixel.gif +0 -0
  76. data/app/assets/images/platform/platform.png +0 -0
  77. data/app/assets/images/platform/platform2.png +0 -0
  78. data/app/assets/images/platform/platform3.png +0 -0
  79. data/app/assets/images/platform/platform4.png +0 -0
  80. data/app/assets/images/platform/platform5.png +0 -0
  81. data/app/assets/images/platform/plus.png +0 -0
  82. data/app/assets/images/platform/plus_node.png +0 -0
  83. data/app/assets/images/platform/random.png +0 -0
  84. data/app/assets/images/platform/random2.png +0 -0
  85. data/app/assets/images/platform/rating_star0.png +0 -0
  86. data/app/assets/images/platform/rating_star05.png +0 -0
  87. data/app/assets/images/platform/rating_star1.png +0 -0
  88. data/app/assets/images/platform/rating_stars.gif +0 -0
  89. data/app/assets/images/platform/rating_stars.psd +0 -0
  90. data/app/assets/images/platform/reply.png +0 -0
  91. data/app/assets/images/platform/right_quote.png +0 -0
  92. data/app/assets/images/platform/rotating_world.gif +0 -0
  93. data/app/assets/images/platform/script.png +0 -0
  94. data/app/assets/images/platform/script_edit.png +0 -0
  95. data/app/assets/images/platform/script_gear.png +0 -0
  96. data/app/assets/images/platform/site_sprite.gif +0 -0
  97. data/app/assets/images/platform/spinner.gif +0 -0
  98. data/app/assets/images/platform/star.png +0 -0
  99. data/app/assets/images/platform/table_edit.png +0 -0
  100. data/app/assets/images/platform/table_gear.png +0 -0
  101. data/app/assets/images/platform/table_multiple.png +0 -0
  102. data/app/assets/images/platform/thumb_down.png +0 -0
  103. data/app/assets/images/platform/thumb_up.png +0 -0
  104. data/app/assets/images/platform/top_left_stem.png +0 -0
  105. data/app/assets/images/platform/top_right_stem.png +0 -0
  106. data/app/assets/images/platform/translate_icn.gif +0 -0
  107. data/app/assets/images/platform/treeview/diffDoc.gif +0 -0
  108. data/app/assets/images/platform/treeview/diffFolder.gif +0 -0
  109. data/app/assets/images/platform/treeview/ftv2blank.gif +0 -0
  110. data/app/assets/images/platform/treeview/ftv2doc.gif +0 -0
  111. data/app/assets/images/platform/treeview/ftv2folderclosed.gif +0 -0
  112. data/app/assets/images/platform/treeview/ftv2folderopen.gif +0 -0
  113. data/app/assets/images/platform/treeview/ftv2lastnode.gif +0 -0
  114. data/app/assets/images/platform/treeview/ftv2link.gif +0 -0
  115. data/app/assets/images/platform/treeview/ftv2mlastnode.gif +0 -0
  116. data/app/assets/images/platform/treeview/ftv2mnode.gif +0 -0
  117. data/app/assets/images/platform/treeview/ftv2node.gif +0 -0
  118. data/app/assets/images/platform/treeview/ftv2plastnode.gif +0 -0
  119. data/app/assets/images/platform/treeview/ftv2pnode.gif +0 -0
  120. data/app/assets/images/platform/treeview/ftv2vertline.gif +0 -0
  121. data/app/assets/images/platform/wizard.png +0 -0
  122. data/app/assets/images/platform/world_link.png +0 -0
  123. data/app/assets/javascripts/platform/api_explorer.js +628 -0
  124. data/app/assets/javascripts/platform/application.js +9 -0
  125. data/app/assets/javascripts/platform/ftiens4.js +1197 -0
  126. data/app/assets/javascripts/platform/jsdk.js +539 -0
  127. data/app/assets/javascripts/platform/platform.js +447 -0
  128. data/app/assets/javascripts/platform/shortcut.js +223 -0
  129. data/app/assets/javascripts/platform/ua.js +147 -0
  130. data/app/assets/stylesheets/platform/api_explorer.css.scss +140 -0
  131. data/app/assets/stylesheets/platform/application.css.scss +6 -0
  132. data/app/assets/stylesheets/platform/components.css.scss +208 -0
  133. data/app/assets/stylesheets/platform/layout.css.scss +119 -0
  134. data/app/assets/stylesheets/platform/oauth.css +51 -0
  135. data/app/assets/stylesheets/platform/platform.css.scss +311 -0
  136. data/app/controllers/platform/admin/apps_controller.rb +99 -0
  137. data/app/controllers/platform/admin/base_controller.rb +60 -0
  138. data/app/controllers/platform/admin/categories_controller.rb +132 -0
  139. data/app/controllers/platform/admin/clientsdk_controller.rb +30 -0
  140. data/app/controllers/platform/admin/developers_controller.rb +30 -0
  141. data/app/controllers/platform/admin/exceptions_controller.rb +30 -0
  142. data/app/controllers/platform/admin/forum_controller.rb +34 -0
  143. data/app/controllers/platform/admin/metrics_controller.rb +42 -0
  144. data/app/controllers/platform/api/apps_controller.rb +40 -0
  145. data/app/controllers/platform/api/base_controller.rb +541 -0
  146. data/app/controllers/platform/apps_controller.rb +142 -0
  147. data/app/controllers/platform/base_controller.rb +127 -0
  148. data/app/controllers/platform/developer/api_explorer_controller.rb +56 -0
  149. data/app/controllers/platform/developer/apps_controller.rb +161 -0
  150. data/app/controllers/platform/developer/base_controller.rb +51 -0
  151. data/app/controllers/platform/developer/blog_controller.rb +29 -0
  152. data/app/controllers/platform/developer/dashboard_controller.rb +63 -0
  153. data/app/controllers/platform/developer/forum_controller.rb +85 -0
  154. data/app/controllers/platform/developer/help_controller.rb +113 -0
  155. data/app/controllers/platform/developer/info_controller.rb +41 -0
  156. data/app/controllers/platform/developer/registration_controller.rb +39 -0
  157. data/app/controllers/platform/developer/resources_controller.rb +30 -0
  158. data/app/controllers/platform/forum_controller.rb +74 -0
  159. data/app/controllers/platform/oauth_controller.rb +421 -0
  160. data/app/controllers/platform/ratings_controller.rb +61 -0
  161. data/app/helpers/platform/admin/categories_helper.rb +54 -0
  162. data/app/helpers/platform/apps_helper.rb +26 -0
  163. data/app/helpers/platform/developer/dashboard_helper.rb +42 -0
  164. data/app/helpers/platform/developer/help_helper.rb +45 -0
  165. data/app/helpers/platform_helper.rb +26 -0
  166. data/app/models/platform/application.rb +394 -0
  167. data/app/models/platform/application_category.rb +34 -0
  168. data/app/models/platform/application_developer.rb +30 -0
  169. data/app/models/platform/application_filter.rb +30 -0
  170. data/app/models/platform/application_log.rb +32 -0
  171. data/app/models/platform/application_log_filter.rb +34 -0
  172. data/app/models/platform/application_metric.rb +58 -0
  173. data/app/models/platform/application_metric_filter.rb +34 -0
  174. data/app/models/platform/application_permission.rb +30 -0
  175. data/app/models/platform/application_permission_filter.rb +30 -0
  176. data/app/models/platform/application_usage_metric.rb +58 -0
  177. data/app/models/platform/application_usage_metric_filter.rb +34 -0
  178. data/app/models/platform/application_user.rb +45 -0
  179. data/app/models/platform/application_user_filter.rb +34 -0
  180. data/app/models/platform/base_filter.rb +46 -0
  181. data/app/models/platform/category.rb +64 -0
  182. data/app/models/platform/daily_application_metric.rb +31 -0
  183. data/app/models/platform/developer.rb +45 -0
  184. data/app/models/platform/developer_filter.rb +26 -0
  185. data/app/models/platform/forum_message.rb +35 -0
  186. data/app/models/platform/forum_message_filter.rb +26 -0
  187. data/app/models/platform/forum_topic.rb +38 -0
  188. data/app/models/platform/forum_topic_filter.rb +26 -0
  189. data/app/models/platform/logged_exception.rb +290 -0
  190. data/app/models/platform/logged_exception_filter.rb +58 -0
  191. data/app/models/platform/media/image.rb +26 -0
  192. data/app/models/platform/media/media.rb +58 -0
  193. data/app/models/platform/monthly_application_metric.rb +31 -0
  194. data/app/models/platform/oauth/access_token.rb +57 -0
  195. data/app/models/platform/oauth/client_token.rb +38 -0
  196. data/app/models/platform/oauth/oauth_model_methods.rb +41 -0
  197. data/app/models/platform/oauth/oauth_token.rb +57 -0
  198. data/app/models/platform/oauth/oauth_token_filter.rb +34 -0
  199. data/app/models/platform/oauth/refresh_token.rb +47 -0
  200. data/app/models/platform/oauth/request_token.rb +50 -0
  201. data/app/models/platform/permission.rb +27 -0
  202. data/app/models/platform/rating.rb +43 -0
  203. data/app/models/platform/rating_filter.rb +30 -0
  204. data/app/models/platform/rollup_log.rb +27 -0
  205. data/app/models/platform/rollup_log_filter.rb +30 -0
  206. data/app/models/platform/total_application_metric.rb +40 -0
  207. data/app/models/platform/weekly_application_metric.rb +31 -0
  208. data/app/views/platform/admin/apps/_categories.html.erb +17 -0
  209. data/app/views/platform/admin/apps/_categories_scripts.html.erb +17 -0
  210. data/app/views/platform/admin/apps/_tabs.html.erb +25 -0
  211. data/app/views/platform/admin/apps/index.html.erb +32 -0
  212. data/app/views/platform/admin/apps/permissions.html.erb +7 -0
  213. data/app/views/platform/admin/apps/ratings.html.erb +7 -0
  214. data/app/views/platform/admin/apps/tokens.html.erb +18 -0
  215. data/app/views/platform/admin/apps/users.html.erb +7 -0
  216. data/app/views/platform/admin/apps/view.html.erb +170 -0
  217. data/app/views/platform/admin/categories/_tabs.html.erb +22 -0
  218. data/app/views/platform/admin/categories/category_assigner.html.erb +9 -0
  219. data/app/views/platform/admin/categories/category_assigner_tree.html.erb +81 -0
  220. data/app/views/platform/admin/categories/index.html.erb +106 -0
  221. data/app/views/platform/admin/categories/items.html.erb +153 -0
  222. data/app/views/platform/admin/categories/lb_update_application_category.html.erb +54 -0
  223. data/app/views/platform/admin/categories/lb_update_category.html.erb +64 -0
  224. data/app/views/platform/admin/categories/tree.html.erb +64 -0
  225. data/app/views/platform/admin/clientsdk/index.html.erb +89 -0
  226. data/app/views/platform/admin/common/_footer.html.erb +1 -0
  227. data/app/views/platform/admin/common/_header.html.erb +32 -0
  228. data/app/views/platform/admin/common/_lightbox_buttons.html.erb +5 -0
  229. data/app/views/platform/admin/common/_paginator.html.erb +20 -0
  230. data/app/views/platform/admin/developers/_tabs.html.erb +22 -0
  231. data/app/views/platform/admin/developers/index.html.erb +7 -0
  232. data/app/views/platform/admin/exceptions/_tabs.html.erb +22 -0
  233. data/app/views/platform/admin/exceptions/index.html.erb +7 -0
  234. data/app/views/platform/admin/forum/_tabs.html.erb +22 -0
  235. data/app/views/platform/admin/forum/index.html.erb +7 -0
  236. data/app/views/platform/admin/forum/messages.html.erb +7 -0
  237. data/app/views/platform/admin/metrics/_tabs.html.erb +25 -0
  238. data/app/views/platform/admin/metrics/application_log.html.erb +7 -0
  239. data/app/views/platform/admin/metrics/index.html.erb +9 -0
  240. data/app/views/platform/admin/metrics/rollup_log.html.erb +7 -0
  241. data/app/views/platform/admin/metrics/usage.html.erb +7 -0
  242. data/app/views/platform/apps/_actions_module.html.erb +3 -0
  243. data/app/views/platform/apps/_app_footer.html.erb +8 -0
  244. data/app/views/platform/apps/_app_header.html.erb +25 -0
  245. data/app/views/platform/apps/_apps_module.html.erb +42 -0
  246. data/app/views/platform/apps/_authorize_form.html.erb +11 -0
  247. data/app/views/platform/apps/_categories_module.html.erb +11 -0
  248. data/app/views/platform/apps/_featured_apps_module.html.erb +40 -0
  249. data/app/views/platform/apps/_left.html.erb +20 -0
  250. data/app/views/platform/apps/_monthly_users_module.html.erb +8 -0
  251. data/app/views/platform/apps/_paginator.html.erb +13 -0
  252. data/app/views/platform/apps/_rank_module.html.erb +18 -0
  253. data/app/views/platform/apps/_search_apps_module.html.erb +35 -0
  254. data/app/views/platform/apps/canvas_app.html.erb +15 -0
  255. data/app/views/platform/apps/index.html.erb +86 -0
  256. data/app/views/platform/apps/view.html.erb +71 -0
  257. data/app/views/platform/apps/xd.html.erb +11 -0
  258. data/app/views/platform/common/_footer.html.erb +1 -0
  259. data/app/views/platform/common/_header.html.erb +4 -0
  260. data/app/views/platform/common/_paginator.html.erb +32 -0
  261. data/app/views/platform/common/_scripts.html.erb +7 -0
  262. data/app/views/platform/common/_user_login.html.erb +11 -0
  263. data/app/views/platform/developer/api_explorer/history.html.erb +31 -0
  264. data/app/views/platform/developer/api_explorer/index.html.erb +134 -0
  265. data/app/views/platform/developer/api_explorer/oauth_lander.html.erb +4 -0
  266. data/app/views/platform/developer/api_explorer/options.html.erb +44 -0
  267. data/app/views/platform/developer/apps/_form.html.erb +340 -0
  268. data/app/views/platform/developer/apps/create_version.html.erb +19 -0
  269. data/app/views/platform/developer/apps/edit.html.erb +21 -0
  270. data/app/views/platform/developer/apps/index.html.erb +375 -0
  271. data/app/views/platform/developer/apps/new.html.erb +20 -0
  272. data/app/views/platform/developer/blog/index.html.erb +7 -0
  273. data/app/views/platform/developer/common/_footer.html.erb +1 -0
  274. data/app/views/platform/developer/common/_header.html.erb +34 -0
  275. data/app/views/platform/developer/dashboard/_apps_info.html.erb +84 -0
  276. data/app/views/platform/developer/dashboard/_discussions.html.erb +68 -0
  277. data/app/views/platform/developer/dashboard/_header.html.erb +12 -0
  278. data/app/views/platform/developer/dashboard/_reviews.html.erb +53 -0
  279. data/app/views/platform/developer/dashboard/_statistics.html.erb +105 -0
  280. data/app/views/platform/developer/dashboard/index.html.erb +85 -0
  281. data/app/views/platform/developer/dashboard/settings.html.erb +23 -0
  282. data/app/views/platform/developer/forum/_message.html.erb +17 -0
  283. data/app/views/platform/developer/forum/_messages.html.erb +14 -0
  284. data/app/views/platform/developer/forum/_new_message.html.erb +28 -0
  285. data/app/views/platform/developer/forum/_new_topic.html.erb +39 -0
  286. data/app/views/platform/developer/forum/index.html.erb +89 -0
  287. data/app/views/platform/developer/forum/topic.html.erb +28 -0
  288. data/app/views/platform/developer/help/_footer.html.erb +4 -0
  289. data/app/views/platform/developer/help/_header.html.erb +95 -0
  290. data/app/views/platform/developer/help/_navigation.html.erb +99 -0
  291. data/app/views/platform/developer/help/api.html.erb +120 -0
  292. data/app/views/platform/developer/help/credits.html.erb +77 -0
  293. data/app/views/platform/developer/help/index.html.erb +19 -0
  294. data/app/views/platform/developer/help/license.html.erb +586 -0
  295. data/app/views/platform/developer/help/oauth_app_login.html.erb +177 -0
  296. data/app/views/platform/developer/help/oauth_client_side.html.erb +264 -0
  297. data/app/views/platform/developer/help/oauth_desktop.html.erb +191 -0
  298. data/app/views/platform/developer/help/oauth_extensions.html.erb +342 -0
  299. data/app/views/platform/developer/help/oauth_intro.html.erb +371 -0
  300. data/app/views/platform/developer/help/oauth_mobile.html.erb +292 -0
  301. data/app/views/platform/developer/help/oauth_server_side.html.erb +603 -0
  302. data/app/views/platform/developer/help/oauth_trusted_client.html.erb +202 -0
  303. data/app/views/platform/developer/help/reference.html.erb +42 -0
  304. data/app/views/platform/developer/help/sdk_ios.html.erb +31 -0
  305. data/app/views/platform/developer/help/sdk_js.html.erb +202 -0
  306. data/app/views/platform/developer/info/_basic_info.html.erb +74 -0
  307. data/app/views/platform/developer/info/_header.html.erb +12 -0
  308. data/app/views/platform/developer/info/index.html.erb +23 -0
  309. data/app/views/platform/developer/registration/index.html.erb +134 -0
  310. data/app/views/platform/developer/resources/index.html.erb +23 -0
  311. data/app/views/platform/forum/_message.html.erb +17 -0
  312. data/app/views/platform/forum/_messages.html.erb +14 -0
  313. data/app/views/platform/forum/_new_message.html.erb +26 -0
  314. data/app/views/platform/forum/_new_topic.html.erb +38 -0
  315. data/app/views/platform/forum/_topic.html.erb +18 -0
  316. data/app/views/platform/forum/_topics.html.erb +74 -0
  317. data/app/views/platform/login/index.html.erb +31 -0
  318. data/app/views/platform/login/register.html.erb +55 -0
  319. data/app/views/platform/oauth/_authorization_box.html.erb +75 -0
  320. data/app/views/platform/oauth/_authorization_popup.html.erb +38 -0
  321. data/app/views/platform/oauth/_authorize_form.html.erb +11 -0
  322. data/app/views/platform/oauth/auth_failed.html.erb +0 -0
  323. data/app/views/platform/oauth/auth_success.html.erb +0 -0
  324. data/app/views/platform/oauth/authorize_desktop.html.erb +76 -0
  325. data/app/views/platform/oauth/authorize_failure_iframe.html.erb +1 -0
  326. data/app/views/platform/oauth/authorize_failure_mobile.html.erb +24 -0
  327. data/app/views/platform/oauth/authorize_failure_popup.html.erb +24 -0
  328. data/app/views/platform/oauth/authorize_failure_web.html.erb +1 -0
  329. data/app/views/platform/oauth/authorize_iframe.html.erb +16 -0
  330. data/app/views/platform/oauth/authorize_mobile.html.erb +1 -0
  331. data/app/views/platform/oauth/authorize_popup.html.erb +1 -0
  332. data/app/views/platform/oauth/authorize_success_iframe.html.erb +1 -0
  333. data/app/views/platform/oauth/authorize_success_mobile.html.erb +24 -0
  334. data/app/views/platform/oauth/authorize_success_popup.html.erb +24 -0
  335. data/app/views/platform/oauth/authorize_success_web.html.erb +1 -0
  336. data/app/views/platform/oauth/authorize_web.html.erb +3 -0
  337. data/app/views/platform/oauth/xd.html.erb +13 -0
  338. data/app/views/platform/ratings/_list.html.erb +30 -0
  339. data/app/views/platform/ratings/_new.html.erb +70 -0
  340. data/app/views/platform/ratings/_rating.html.erb +17 -0
  341. data/config/platform/config.yml +133 -0
  342. data/config/platform/data/default_applications.yml +39 -0
  343. data/config/platform/data/default_categories.yml +56 -0
  344. data/config/platform/data/default_permissions.yml +0 -0
  345. data/config/platform/site/features.yml +66 -0
  346. data/config/routes.rb +59 -0
  347. data/db/migrate/20110602232141_create_platform_tables.rb +262 -0
  348. data/docs/Classes.graffle +7315 -0
  349. data/docs/Classes.pdf +0 -0
  350. data/lib/generators/platform/platform_generator.rb +56 -0
  351. data/lib/generators/platform/templates/db/create_platform_tables.rb +262 -0
  352. data/lib/generators/platform/templates/layouts/platform.html.erb +49 -0
  353. data/lib/generators/platform/templates/layouts/platform_admin.html.erb +60 -0
  354. data/lib/platform.rb +6 -0
  355. data/lib/platform/api/already_jsoned_string.rb +9 -0
  356. data/lib/platform/api/proxy.rb +45 -0
  357. data/lib/platform/api/proxy/base.rb +62 -0
  358. data/lib/platform/cache.rb +78 -0
  359. data/lib/platform/config.rb +666 -0
  360. data/lib/platform/engine.rb +5 -0
  361. data/lib/platform/exception.rb +27 -0
  362. data/lib/platform/extensions/action_controller_extension.rb +65 -0
  363. data/lib/platform/extensions/action_view_extension.rb +168 -0
  364. data/lib/platform/extensions/object_extension.rb +51 -0
  365. data/lib/platform/helper.rb +33 -0
  366. data/lib/platform/logger.rb +62 -0
  367. data/lib/platform/railtie.rb +52 -0
  368. data/lib/platform/random_password_generator.rb +76 -0
  369. data/lib/platform/simple_string_permissions.rb +40 -0
  370. data/lib/platform/version.rb +3 -0
  371. data/lib/tasks/platform.rake +119 -0
  372. data/platform.gemspec +45 -0
  373. data/script/rails +6 -0
  374. data/spec/config/config_spec.rb +10 -0
  375. data/spec/dummy_app.rb +52 -0
  376. data/spec/models/application_spec.rb +53 -0
  377. data/spec/models/developer_spec.rb +23 -0
  378. data/spec/spec_helper.rb +29 -0
  379. data/test/dummy/Rakefile +7 -0
  380. data/test/dummy/app/assets/javascripts/application.js +7 -0
  381. data/test/dummy/app/assets/stylesheets/admin.css +200 -0
  382. data/test/dummy/app/assets/stylesheets/application.css +47 -0
  383. data/test/dummy/app/assets/stylesheets/components.css.scss +211 -0
  384. data/test/dummy/app/assets/stylesheets/layout.css.scss +143 -0
  385. data/test/dummy/app/controllers/admin/admins_controller.rb +7 -0
  386. data/test/dummy/app/controllers/admin/base_controller.rb +12 -0
  387. data/test/dummy/app/controllers/admin/bookmarks_controller.rb +7 -0
  388. data/test/dummy/app/controllers/admin/users_controller.rb +19 -0
  389. data/test/dummy/app/controllers/api/base_controller.rb +5 -0
  390. data/test/dummy/app/controllers/api/bookmarks_controller.rb +35 -0
  391. data/test/dummy/app/controllers/api/users_controller.rb +19 -0
  392. data/test/dummy/app/controllers/application_controller.rb +31 -0
  393. data/test/dummy/app/controllers/home_controller.rb +7 -0
  394. data/test/dummy/app/controllers/login_controller.rb +65 -0
  395. data/test/dummy/app/helpers/application_helper.rb +9 -0
  396. data/test/dummy/app/helpers/home_helper.rb +2 -0
  397. data/test/dummy/app/mailers/.gitkeep +0 -0
  398. data/test/dummy/app/models/.gitkeep +0 -0
  399. data/test/dummy/app/models/admin.rb +4 -0
  400. data/test/dummy/app/models/admin_filter.rb +7 -0
  401. data/test/dummy/app/models/bookmark.rb +7 -0
  402. data/test/dummy/app/models/user.rb +34 -0
  403. data/test/dummy/app/views/admin/admins/index.html.erb +7 -0
  404. data/test/dummy/app/views/admin/bookmarks/index.html.erb +5 -0
  405. data/test/dummy/app/views/admin/users/index.html.erb +10 -0
  406. data/test/dummy/app/views/demo/index.rhtml +108 -0
  407. data/test/dummy/app/views/demo/tokens.rhtml +35 -0
  408. data/test/dummy/app/views/home/index.html.erb +43 -0
  409. data/test/dummy/app/views/layouts/_footer.html.erb +16 -0
  410. data/test/dummy/app/views/layouts/_header.html.erb +22 -0
  411. data/test/dummy/app/views/layouts/admin.html.erb +97 -0
  412. data/test/dummy/app/views/layouts/application.html.erb +25 -0
  413. data/test/dummy/app/views/layouts/minimal.html.erb +37 -0
  414. data/test/dummy/app/views/layouts/popup.html.erb +43 -0
  415. data/test/dummy/app/views/login/index.html.erb +34 -0
  416. data/test/dummy/app/views/login/register.html.erb +51 -0
  417. data/test/dummy/config.ru +4 -0
  418. data/test/dummy/config/application.rb +51 -0
  419. data/test/dummy/config/boot.rb +10 -0
  420. data/test/dummy/config/database.yml +25 -0
  421. data/test/dummy/config/environment.rb +5 -0
  422. data/test/dummy/config/environments/development.rb +30 -0
  423. data/test/dummy/config/environments/production.rb +60 -0
  424. data/test/dummy/config/environments/test.rb +42 -0
  425. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  426. data/test/dummy/config/initializers/inflections.rb +10 -0
  427. data/test/dummy/config/initializers/mime_types.rb +5 -0
  428. data/test/dummy/config/initializers/secret_token.rb +7 -0
  429. data/test/dummy/config/initializers/session_store.rb +8 -0
  430. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  431. data/test/dummy/config/locales/en.yml +5 -0
  432. data/test/dummy/config/platform/api/0/bookmark.yml +18 -0
  433. data/test/dummy/config/platform/api/0/user.yml +17 -0
  434. data/test/dummy/config/platform/api/1/bookmark.yml +58 -0
  435. data/test/dummy/config/platform/api/1/user.yml +36 -0
  436. data/test/dummy/config/platform/config.yml +135 -0
  437. data/test/dummy/config/platform/data/default_applications.yml +39 -0
  438. data/test/dummy/config/platform/data/default_categories.yml +56 -0
  439. data/test/dummy/config/platform/data/default_permissions.yml +0 -0
  440. data/test/dummy/config/platform/site/features.yml +66 -0
  441. data/test/dummy/config/platform/site/sample_apps.yml +100 -0
  442. data/test/dummy/config/routes.rb +30 -0
  443. data/test/dummy/config/tr8n/config.yml +247 -0
  444. data/test/dummy/config/tr8n/data/ip_locations.csv +93460 -0
  445. data/test/dummy/config/tr8n/rules/default_date_rules.yml +20 -0
  446. data/test/dummy/config/tr8n/rules/default_gender_list_rules.yml +82 -0
  447. data/test/dummy/config/tr8n/rules/default_gender_rules.yml +20 -0
  448. data/test/dummy/config/tr8n/rules/default_language_cases.yml +272 -0
  449. data/test/dummy/config/tr8n/rules/default_list_rules.yml +19 -0
  450. data/test/dummy/config/tr8n/rules/default_numeric_rules.yml +42 -0
  451. data/test/dummy/config/tr8n/rules/default_value_rules.yml +18 -0
  452. data/test/dummy/config/tr8n/site/default_glossary.yml +18 -0
  453. data/test/dummy/config/tr8n/site/default_languages.yml +1591 -0
  454. data/test/dummy/config/tr8n/site/features.yml +111 -0
  455. data/test/dummy/config/tr8n/site/shortcuts.yml +55 -0
  456. data/test/dummy/config/tr8n/site/sitemap.json +42 -0
  457. data/test/dummy/config/tr8n/tokens/data.yml +19 -0
  458. data/test/dummy/config/tr8n/tokens/decorations.yml +19 -0
  459. data/test/dummy/config/will_filter/config.yml +99 -0
  460. data/test/dummy/db/migrate/20101207014543_create_users.rb +23 -0
  461. data/test/dummy/db/migrate/20110113223509_create_admins.rb +15 -0
  462. data/test/dummy/db/migrate/20110930041143_create_will_filter_filters.rb +15 -0
  463. data/test/dummy/db/migrate/20110930041150_create_tr8n_tables.rb +350 -0
  464. data/test/dummy/db/migrate/20111004075531_create_platform_tables.rb +262 -0
  465. data/test/dummy/db/migrate/20111012055603_create_bookmarks.rb +10 -0
  466. data/test/dummy/db/schema.rb +683 -0
  467. data/test/dummy/lib/assets/.gitkeep +0 -0
  468. data/test/dummy/lib/platform/api/bookmark_proxy_0.rb +12 -0
  469. data/test/dummy/lib/platform/api/bookmark_proxy_1.rb +12 -0
  470. data/test/dummy/lib/platform/api/user_proxy_0.rb +12 -0
  471. data/test/dummy/lib/platform/api/user_proxy_1.rb +12 -0
  472. data/test/dummy/log/.gitkeep +0 -0
  473. data/test/dummy/public/404.html +26 -0
  474. data/test/dummy/public/422.html +26 -0
  475. data/test/dummy/public/500.html +26 -0
  476. data/test/dummy/public/favicon.ico +0 -0
  477. data/test/dummy/script/rails +6 -0
  478. data/test/dummy/test/fixtures/documents.yml +11 -0
  479. data/test/dummy/test/unit/document_test.rb +7 -0
  480. metadata +886 -0
@@ -0,0 +1,45 @@
1
+ module Platform
2
+ module Api
3
+ module Proxy
4
+
5
+ def self.add(klass, proxy_class)
6
+ proxy_class.ensure_valid_class_name
7
+ (Platform::Config.proxies[klass.name] ||= SortedSet.new) << proxy_class
8
+ end
9
+
10
+ def self.proxy_class_for(klass, version=nil)
11
+ unless proxy_array = proxies_for(klass)
12
+ raise ArgumentError, "No proxy for class: #{klass.name}"
13
+ end
14
+
15
+ proxy_array = proxy_array.to_a
16
+ if version.nil?
17
+ proxy_class = proxy_array.last
18
+ else
19
+ version = version.to_i
20
+ proxy_class = proxy_array.reverse.find {|ii| ii.api_version <= version}
21
+ end
22
+ raise ArgumentError "No proxy for version: #{version}" if proxy_class.nil?
23
+
24
+ proxy_class
25
+ end
26
+
27
+ def self.for(instance, version=nil)
28
+ return proxy_class_for(instance.class, version).new(instance)
29
+ end
30
+
31
+ def self.reset
32
+ Platform::Config.proxies.clear
33
+ end
34
+
35
+ private
36
+
37
+ def self.proxies_for(klass)
38
+ Platform::Config.load_proxies if Platform::Config.proxies.empty?
39
+ klass.ancestors.detect {|ii| return Platform::Config.proxies[ii.name] if Platform::Config.proxies.has_key?(ii.name)}
40
+ return nil
41
+ end
42
+
43
+ end # module Proxy
44
+ end # module Api
45
+ end # module Platform
@@ -0,0 +1,62 @@
1
+ require 'platform/api/proxy'
2
+
3
+ module Platform
4
+ module Api
5
+ module Proxy
6
+ class Base
7
+
8
+ attr_accessor :instance
9
+
10
+ def self.proxy_for(klass)
11
+ Proxy.add(klass, self)
12
+ end
13
+
14
+ def initialize(instance)
15
+ @instance = instance
16
+ end
17
+
18
+ def update_attributes!(attrs)
19
+ instance.update_attributes!(attrs)
20
+ end
21
+
22
+ def to_json(opts={})
23
+ Api::AlreadyJsonedString.new(to_api_hash(opts).to_json(opts))
24
+ end
25
+
26
+ def to_xml(opts={})
27
+ opts = opts.dup
28
+ opts[:root] ||= instance.class.name.underscore.downcase
29
+ to_api_hash(opts).to_xml(opts)
30
+ end
31
+
32
+ def self.<=>(other)
33
+ api_version <=> other.api_version
34
+ end
35
+
36
+ def self.api_version
37
+ @api_version ||= begin
38
+ $1.to_i if name =~ /_(\d+)$/
39
+ end
40
+ end
41
+
42
+ def self.instance_class
43
+ @klass
44
+ end
45
+
46
+ def self.ensure_valid_class_name
47
+ raise NameError.new("Proxy class name (#{name}) must end in _<version>") if api_version.nil?
48
+ end
49
+
50
+ def to_api_hash(opts = {})
51
+ raise NotImplementedError, 'Must be implemented in descendant class'
52
+ end
53
+
54
+ def to_api_path(opts = {})
55
+ "#{Platform::Config.api_scheme}://#{Platform::Config.api_base_url}/#{instance.class.name.underscore}/#{instance.id}"
56
+ end
57
+
58
+ end # class Base
59
+
60
+ end # module Proxy
61
+ end # module Api
62
+ end # module Platform
@@ -0,0 +1,78 @@
1
+ #--
2
+ # Copyright (c) 2011 Michael Berkovich, Geni Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ module Platform
25
+ class Cache
26
+ def self.cache
27
+ @cache ||= begin
28
+ if Platform::Config.cache_adapter == 'ActiveSupport::Cache'
29
+ store_params = [Platform::Config.cache_store].flatten
30
+ store_params[0] = store_params[0].to_sym
31
+ ActiveSupport::Cache.lookup_store(*store_params)
32
+ else
33
+ eval(Platform::Config.cache_adapter)
34
+ end
35
+ end
36
+ end
37
+
38
+ def self.enabled?
39
+ Platform::Config.enable_caching?
40
+ end
41
+
42
+ def self.versioned_key(key)
43
+ "#{Platform::Config.cache_version}_#{key}"
44
+ end
45
+
46
+ def self.fetch(key, options = {})
47
+ return yield unless enabled?
48
+ cache.fetch(versioned_key(key), options) do
49
+ yield
50
+ end
51
+ end
52
+
53
+ def self.delete(key, options = nil)
54
+ return unless enabled?
55
+ cache.delete(versioned_key(key), options)
56
+ end
57
+
58
+ def self.increment(key, amount = 1)
59
+ return unless enabled?
60
+ cache.increment(versioned_key(key), amount)
61
+ end
62
+
63
+ def self.decrement(key, amount = 1)
64
+ return unless enabled?
65
+ cache.decrement(versioned_key(key), amount)
66
+ end
67
+
68
+ def self.set(key, value, options = {})
69
+ return unless enabled?
70
+ cache.set(key, value, options)
71
+ end
72
+
73
+ def self.get(key, options = {})
74
+ return unless enabled?
75
+ cache.get(key, options)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,666 @@
1
+ #--
2
+ # Copyright (c) 2011 Michael Berkovich, Geni Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ module Platform
25
+ class Config
26
+
27
+ def self.init(site_current_user, current_application = nil)
28
+ Thread.current[:platform_current_user] = site_current_user
29
+ Thread.current[:platform_current_developer] = Platform::Developer.for(site_current_user)
30
+ Thread.current[:platform_current_application] = current_application
31
+ end
32
+
33
+ def self.current_user
34
+ Thread.current[:platform_current_user]
35
+ end
36
+
37
+ def self.current_developer
38
+ Thread.current[:platform_current_developer]
39
+ end
40
+
41
+ def self.current_application
42
+ Thread.current[:platform_current_application]
43
+ end
44
+
45
+ def self.current_application=(app)
46
+ Thread.current[:platform_current_application] = app
47
+ end
48
+
49
+ def self.current_user_is_developer?
50
+ Thread.current[:platform_current_developer] != nil
51
+ end
52
+
53
+ def self.reset!
54
+ Thread.current[:platform_current_user] = nil
55
+ Thread.current[:platform_current_developer] = nil
56
+ Thread.current[:platform_current_application] = nil
57
+ end
58
+
59
+ def self.models
60
+ @models ||= begin
61
+ mdls = [
62
+ Platform::ApplicationDeveloper, Platform::ApplicationPermission, Platform::ApplicationUser,
63
+ Platform::ApplicationCategory, Platform::Category,
64
+ Platform::ForumMessage, Platform::ForumTopic,
65
+ Platform::Permission, Platform::Rating,
66
+ Platform::Developer, Platform::Application,
67
+ Platform::Oauth::OauthToken, Platform::Oauth::AccessToken,
68
+ Platform::Oauth::RequestToken, Platform::Oauth::RefreshToken,
69
+ Platform::Media::Media, Platform::Media::Image,
70
+ Platform::ApplicationLog, Platform::RollupLog,
71
+ Platform::ApplicationMetric, Platform::DailyApplicationMetric,
72
+ Platform::WeeklyApplicationMetric, Platform::MonthlyApplicationMetric,
73
+ Platform::TotalApplicationMetric, Platform::ApplicationUsageMetric,
74
+ Platform::LoggedException
75
+ ]
76
+
77
+ if user_class_name == "Platform::PlatformUser" # used for stand-alone deployment only
78
+ mdls << [Platform::PlatformUser, Platform::PlatformAdmin]
79
+ end
80
+
81
+ mdls.flatten
82
+ end
83
+ end
84
+
85
+ def self.reset_all!
86
+ models.each do |cls|
87
+ puts ">> Resetting #{cls.name}..."
88
+ cls.delete_all
89
+ end
90
+
91
+ init_default_categories
92
+ init_default_applications
93
+
94
+ puts "Done."
95
+ end
96
+
97
+ def self.system_user
98
+ if user_class_name == "Platform::PlatformUser"
99
+ @system_user ||= Platform::PlatformUser.first || Platform::PlatformUser.create(:name => "System User")
100
+ return @system_user
101
+ end
102
+
103
+ return nil unless site_info[:system_user_id]
104
+ @system_user ||= user_class_name.constantize.find_by_id(site_info[:system_user_id])
105
+ end
106
+
107
+ def self.system_developer
108
+ @system_developer ||= Platform::Developer.find_or_create(Platform::Config.system_user)
109
+ end
110
+
111
+ def self.init_default_applications
112
+ puts "Initializing default applications..."
113
+ unless system_developer
114
+ puts "Cannot initialize default application because system user id is not specified in the config."
115
+ return
116
+ end
117
+
118
+ default_applications.each do |keyword, description|
119
+ category_keywords = description.delete("category_keywords")
120
+ icon_path = description.delete("icon_path")
121
+ logo_path = description.delete("logo_path")
122
+
123
+ app = Platform::Application.create(description.merge(:developer => system_developer))
124
+ app.store_icon(File.new("#{root}/#{icon_path}", "r")) if icon_path
125
+ app.store_logo(File.new("#{root}/#{logo_path}", "r")) if logo_path
126
+
127
+ puts "Initialized #{app.name}."
128
+ app.approve!
129
+ end
130
+ end
131
+
132
+ def self.init_default_categories
133
+ puts "Initializing default categories..."
134
+ init_categories(Platform::Category.root, default_categories)
135
+ end
136
+
137
+ def self.init_categories(parent, categories)
138
+ categories.each do |keyword, info|
139
+ cat = Platform::Category.create(:parent => parent, :keyword => keyword, :name => info[:name], :position => info[:position])
140
+ init_categories(cat, info[:categories]) if info[:categories]
141
+ end
142
+ end
143
+
144
+ def self.default_applications
145
+ @default_applications ||= load_yml("/config/platform/data/default_applications.yml")
146
+ end
147
+
148
+ def self.default_categories
149
+ @default_categories ||= load_yml("/config/platform/data/default_categories.yml")
150
+ end
151
+
152
+ def self.root
153
+ Rails.root
154
+ end
155
+
156
+ def self.env
157
+ Rails.env
158
+ end
159
+
160
+ def self.load_yml(file_path, for_env = env)
161
+ yml = YAML.load_file("#{root}#{file_path}")
162
+ yml = yml[for_env] unless for_env.nil?
163
+ HashWithIndifferentAccess.new(yml)
164
+ end
165
+
166
+ def self.config
167
+ @config ||= load_yml("/config/platform/config.yml")
168
+ end
169
+
170
+ def self.enabled?
171
+ config[:enable_platform]
172
+ end
173
+
174
+ def self.disabled?
175
+ not enabled?
176
+ end
177
+
178
+ def self.enable_app_directory?
179
+ config[:enable_app_directory]
180
+ end
181
+
182
+ def self.enable_embedded_applications?
183
+ config[:enable_embedded_applications]
184
+ end
185
+
186
+ def self.enable_mobile_applications?
187
+ config[:enable_mobile_applications]
188
+ end
189
+
190
+ def self.enable_developer_agreement?
191
+ config[:enable_developer_agreement]
192
+ end
193
+
194
+ def self.enable_app_statistics?
195
+ config[:enable_app_statistics]
196
+ end
197
+
198
+ def self.enable_api_verification?
199
+ config[:enable_api_verification]
200
+ end
201
+
202
+ def self.default_app_icon
203
+ "/assets/platform/default_app_icon.gif"
204
+ end
205
+
206
+ def self.default_app_logo
207
+ "/assets/platform/default_app_logo.gif"
208
+ end
209
+
210
+ #########################################################
211
+ # Config Sections
212
+ #########################################################
213
+ def self.caching
214
+ config[:caching]
215
+ end
216
+
217
+ def self.logger
218
+ config[:logger]
219
+ end
220
+
221
+ def self.site_info
222
+ config[:site_info]
223
+ end
224
+
225
+ def self.api
226
+ config[:API]
227
+ end
228
+ #########################################################
229
+
230
+ #########################################################
231
+ # Caching
232
+ #########################################################
233
+ def self.enable_caching?
234
+ caching[:enabled]
235
+ end
236
+
237
+ def self.cache_adapter
238
+ caching[:adapter]
239
+ end
240
+
241
+ def self.cache_store
242
+ caching[:store]
243
+ end
244
+
245
+ def self.cache_version
246
+ caching[:version]
247
+ end
248
+ #########################################################
249
+
250
+ #########################################################
251
+ # Logger
252
+ #########################################################
253
+ def self.enable_logger?
254
+ logger[:enabled]
255
+ end
256
+
257
+ def self.log_path
258
+ logger[:log_path]
259
+ end
260
+ #########################################################
261
+
262
+ #########################################################
263
+ # Site Info
264
+ def self.site_title
265
+ site_info[:title]
266
+ end
267
+
268
+ def self.site_logo_url
269
+ site_info[:logo_url]
270
+ end
271
+
272
+ def self.site_base_url
273
+ site_info[:base_url]
274
+ end
275
+
276
+ def self.default_url
277
+ site_info[:default_url]
278
+ end
279
+
280
+ def self.site_layout
281
+ site_info[:platform_layout]
282
+ end
283
+
284
+ def self.admin_layout
285
+ site_info[:admin_layout]
286
+ end
287
+
288
+ def self.oauth_web_layout
289
+ site_info[:oauth_web_layout]
290
+ end
291
+
292
+ def self.oauth_popup_layout
293
+ site_info[:oauth_popup_layout]
294
+ end
295
+
296
+ def self.oauth_mobile_layout
297
+ site_info[:oauth_mobile_layout]
298
+ end
299
+
300
+ def self.oauth_desktop_layout
301
+ site_info[:oauth_desktop_layout]
302
+ end
303
+
304
+ def self.media_directory
305
+ site_info[:media_directory]
306
+ end
307
+
308
+ def self.media_path
309
+ "#{root}/public#{media_directory}"
310
+ end
311
+
312
+ def self.helpers
313
+ return [] unless site_info[:helpers]
314
+ @tr8n_helpers ||= site_info[:helpers].collect{|helper| helper.to_sym}
315
+ end
316
+
317
+ def self.admin_helpers
318
+ return [] unless site_info[:admin_helpers]
319
+ @admin_helpers ||= site_info[:admin_helpers].collect{|helper| helper.to_sym}
320
+ end
321
+
322
+ def self.skip_before_filters
323
+ return [] unless site_info[:skip_before_filters]
324
+ @skip_before_filters ||= site_info[:skip_before_filters].collect{|filter| filter.to_sym}
325
+ end
326
+
327
+ def self.before_filters
328
+ return [] unless site_info[:before_filters]
329
+ @before_filters ||= site_info[:before_filters].collect{|filter| filter.to_sym}
330
+ end
331
+
332
+ def self.after_filters
333
+ return [] unless site_info[:after_filters]
334
+ @after_filters ||= site_info[:after_filters].collect{|filter| filter.to_sym}
335
+ end
336
+
337
+ #########################################################
338
+ # site user info
339
+ # The following methods could be overloaded in the initializer
340
+ #########################################################
341
+ def self.site_user_info
342
+ site_info[:user_info]
343
+ end
344
+
345
+ def self.current_user_method
346
+ site_user_info[:current_user_method]
347
+ end
348
+
349
+ def self.logout_method
350
+ site_user_info[:logout_method]
351
+ end
352
+
353
+ def self.login_url(params = {})
354
+ site_info[:login_url] + (site_info[:logout_url].index('?') ? ':' : '?') + params.collect{|n,v| "#{n}=#{CGI.escape(v.to_s)}"}.join('&')
355
+ end
356
+
357
+ def self.logout_url(params = {})
358
+ site_info[:logout_url] + (site_info[:logout_url].index('?') ? ':' : '?') + params.collect{|n,v| "#{n}=#{CGI.escape(v.to_s)}"}.join('&')
359
+ end
360
+
361
+ def self.site_user_info_enabled?
362
+ site_user_info[:enabled].nil? ? true : site_user_info[:enabled]
363
+ end
364
+
365
+ def self.site_user_info_disabled?
366
+ !site_user_info_enabled?
367
+ end
368
+
369
+ def self.user_class_name
370
+ return site_user_info[:class_name] if site_user_info_enabled?
371
+ "Platform::PlatformUser"
372
+ end
373
+
374
+ def self.user_class
375
+ user_class_name.constantize
376
+ end
377
+
378
+ def self.user_id(user = current_user)
379
+ user.send(site_user_info[:methods][:id])
380
+ rescue Exception => ex
381
+ Platform::Logger.error("Failed to fetch user id: #{ex.to_s}")
382
+ 0
383
+ end
384
+
385
+ def self.user_name(user = current_user)
386
+ user.send(site_user_info[:methods][:name])
387
+ rescue Exception => ex
388
+ Platform::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
389
+ "Unknown user"
390
+ end
391
+
392
+ def self.user_email(user = current_user)
393
+ user.send(site_user_info[:methods][:email])
394
+ rescue Exception => ex
395
+ Platform::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
396
+ nil
397
+ end
398
+
399
+ def self.user_gender(user = current_user)
400
+ user.send(site_user_info[:methods][:gender])
401
+ rescue Exception => ex
402
+ Platform::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
403
+ "unknown"
404
+ end
405
+
406
+ def self.user_mugshot(user = current_user)
407
+ mugshot_image = user.send(site_user_info[:methods][:mugshot])
408
+ return silhouette_image(user) if mugshot_image.blank?
409
+ mugshot_image
410
+ rescue Exception => ex
411
+ Platform::Logger.error("Failed to fetch #{user_class_name} image: #{ex.to_s}")
412
+ silhouette_image
413
+ end
414
+
415
+ def self.user_link(user = current_user)
416
+ user.send(site_user_info[:methods][:link])
417
+ rescue Exception => ex
418
+ Platform::Logger.error("Failed to fetch #{user_class_name} link: #{ex.to_s}")
419
+ "/tr8n"
420
+ end
421
+
422
+ def self.user_locale(user = current_user)
423
+ user.send(site_user_info[:methods][:locale])
424
+ rescue Exception => ex
425
+ Platform::Logger.error("Failed to fetch #{user_class_name} locale: #{ex.to_s}")
426
+ default_locale
427
+ end
428
+
429
+ def self.admin_user?(user = current_user)
430
+ user.send(site_user_info[:methods][:admin])
431
+ rescue Exception => ex
432
+ Platform::Logger.error("Failed to fetch #{user_class_name} admin flag: #{ex.to_s}")
433
+ false
434
+ end
435
+
436
+ def self.current_user_is_admin?
437
+ admin_user?
438
+ end
439
+
440
+ def self.guest_user?(user = current_user)
441
+ return true unless user
442
+ user.send(site_user_info[:methods][:guest])
443
+ rescue Exception => ex
444
+ Platform::Logger.error("Failed to fetch #{user_class_name} guest flag: #{ex.to_s}")
445
+ true
446
+ end
447
+
448
+ def self.current_user_is_guest?
449
+ guest_user?
450
+ end
451
+ #########################################################
452
+
453
+ #########################################################
454
+ # site media info
455
+ # The following methods could be overloaded in the initializer
456
+ #########################################################
457
+ def self.site_media_info
458
+ site_info[:media_info]
459
+ end
460
+
461
+ def self.site_media_enabled?
462
+ site_media_info[:enabled]
463
+ end
464
+
465
+ def self.site_media_class
466
+ return "Platform::Media::Image" unless site_media_enabled?
467
+ site_media_info[:class_name]
468
+ end
469
+
470
+ def self.site_media_write_method
471
+ site_media_info[:write_method]
472
+ end
473
+
474
+ def self.create_media(file)
475
+ media = site_media_class.constantize.create
476
+ media.send(site_media_write_method, file)
477
+ media
478
+ rescue Exception => ex
479
+ pp ex
480
+ Platform::Logger.error("Failed to create media: #{ex.to_s}")
481
+ nil
482
+ end
483
+
484
+ def self.logo_url(media)
485
+ eval("media.#{site_media_info[:logo_url_method]}")
486
+ rescue Exception => ex
487
+ Platform::Logger.error("Failed to fetch logo url: #{ex.to_s}")
488
+ default_app_logo
489
+ end
490
+
491
+ def self.icon_url(media)
492
+ eval("media.#{site_media_info[:icon_url_method]}")
493
+ rescue Exception => ex
494
+ Platform::Logger.error("Failed to fetch icon url: #{ex.to_s}")
495
+ default_app_icon
496
+ end
497
+ #########################################################
498
+
499
+ #########################################################
500
+ # Application Directory
501
+ #########################################################
502
+ def self.featured_apps_enabled?
503
+ true
504
+ end
505
+
506
+ def self.featured_apps_title
507
+ "Featured Applications"
508
+ end
509
+
510
+ def self.featured_apps_per_row
511
+ 2
512
+ end
513
+
514
+ def self.featured_apps_per_page
515
+ 2
516
+ end
517
+
518
+ def self.suggested_apps_title
519
+ "Applications You May Like"
520
+ end
521
+
522
+ def self.suggested_apps_per_row
523
+ 5
524
+ end
525
+
526
+ def self.suggested_apps_per_page
527
+ 20
528
+ end
529
+
530
+ def self.searched_apps_title
531
+ "Search Results"
532
+ end
533
+
534
+ def self.searched_apps_per_page
535
+ 15
536
+ end
537
+
538
+ #########################################################
539
+ # API
540
+ #########################################################
541
+ def self.enable_api?
542
+ api[:enabled]
543
+ end
544
+
545
+ def self.api_config_path
546
+ api[:config_path]
547
+ end
548
+
549
+ def self.api_logging_enabled?
550
+ api[:logging_enabled]
551
+ end
552
+
553
+ def self.api_request_limit
554
+ api[:request_limit]
555
+ end
556
+
557
+ def self.api_cookies_enabled?
558
+ api[:cookies_enabled]
559
+ end
560
+
561
+ def self.api_allow_public?
562
+ api[:allow_public]
563
+ end
564
+
565
+ def self.api_max_models
566
+ api[:max_models]
567
+ end
568
+
569
+ def self.api_request_window
570
+ api[:request_window]
571
+ end
572
+
573
+ def self.api_token_lifetime
574
+ api[:token_lifetime]
575
+ end
576
+
577
+ def self.api_request_limit
578
+ api[:request_limit]
579
+ end
580
+
581
+ def self.api_base_url
582
+ api[:base_url]
583
+ end
584
+
585
+ def self.api_scheme
586
+ api[:scheme]
587
+ end
588
+
589
+ def self.api_supported_versions
590
+ api[:supported_versions]
591
+ end
592
+
593
+ def self.api_supported_version_options
594
+ @api_supported_version_options ||= api[:supported_versions].collect{|v| ["v #{v}", v]}
595
+ end
596
+
597
+ def self.api_default_version
598
+ api[:default_version]
599
+ end
600
+
601
+ def self.api_explorer_app_id
602
+ config[:api_explorer_app_id]
603
+ end
604
+
605
+ def self.api_explorer_app?
606
+ !api_explorer_app_id.blank?
607
+ end
608
+
609
+ def self.proxies_path
610
+ api[:proxies_path]
611
+ end
612
+
613
+ def self.load_proxies
614
+ Dir["#{root}/#{proxies_path}/*_proxy_*.rb"].each do |file|
615
+ require_or_load file
616
+ end
617
+ end
618
+
619
+ def self.proxies
620
+ @proxies ||= {}
621
+ end
622
+
623
+ #########################################################
624
+ # API References
625
+ #########################################################
626
+
627
+ def self.api_reference(api_version = api_default_version)
628
+ @api_reference ||= begin
629
+ ref = HashWithIndifferentAccess.new
630
+ api_supported_versions.each do |version|
631
+ ref[version] = {}
632
+ path = "#{root}/#{api[:config_path]}/#{version}"
633
+ files = Dir.glob("#{path}/*.yml")
634
+ files.each do |file|
635
+ ref[version].merge!(YAML.load_file(file))
636
+ end
637
+ end
638
+ ref.freeze
639
+ end
640
+ @api_reference[api_version]
641
+ end
642
+
643
+ def self.api_explorer_groups(api_version = api_default_version)
644
+ api[:explorer_groups][api_version]
645
+ end
646
+
647
+ #########################################################
648
+
649
+ def self.silhouette_image(user = current_user)
650
+ "/assets/platform/photo_silhouette.gif"
651
+ end
652
+
653
+ def self.features
654
+ @features ||= begin
655
+ defs = load_yml("/config/platform/site/features.yml")
656
+ feats = []
657
+ defs[:enabled_features].each do |key|
658
+ defs[key][:key] = key
659
+ feats << defs[key]
660
+ end
661
+ feats
662
+ end
663
+ end
664
+
665
+ end
666
+ end