atreides 2.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 (309) hide show
  1. data/LICENSE +7 -0
  2. data/README.rdoc +1 -0
  3. data/app/assets/javascripts/atreides/admin.js +22 -0
  4. data/app/assets/javascripts/atreides/admin_base.js.erb +247 -0
  5. data/app/assets/javascripts/atreides/admin_edit.js +9 -0
  6. data/app/assets/javascripts/atreides/application.js +15 -0
  7. data/app/assets/javascripts/atreides/comments.coffee +50 -0
  8. data/app/assets/javascripts/atreides/public.js +24 -0
  9. data/app/assets/javascripts/atreides/public_base.js.erb +119 -0
  10. data/app/assets/javascripts/atreides/terryblr.js +57 -0
  11. data/app/assets/stylesheets/atreides/admin.css +21 -0
  12. data/app/assets/stylesheets/atreides/admin_base.css.erb +1762 -0
  13. data/app/assets/stylesheets/atreides/application.css +13 -0
  14. data/app/assets/stylesheets/atreides/formtastic_changes.css +10 -0
  15. data/app/assets/stylesheets/atreides/iphone-checkboxes.css.erb +97 -0
  16. data/app/assets/stylesheets/atreides/jBreadCrumb.css +109 -0
  17. data/app/assets/stylesheets/atreides/public.css +15 -0
  18. data/app/assets/stylesheets/atreides/public_base.css +101 -0
  19. data/app/assets/stylesheets/atreides/swfupload.css.erb +63 -0
  20. data/app/controllers/admin/atreides/comments_controller.rb +47 -0
  21. data/app/controllers/admin/atreides/content_parts_controller.rb +43 -0
  22. data/app/controllers/admin/atreides/dropbox_controller.rb +40 -0
  23. data/app/controllers/admin/atreides/features_controller.rb +63 -0
  24. data/app/controllers/admin/atreides/github_controller.rb +35 -0
  25. data/app/controllers/admin/atreides/links_controller.rb +3 -0
  26. data/app/controllers/admin/atreides/messages_controller.rb +3 -0
  27. data/app/controllers/admin/atreides/orders_controller.rb +35 -0
  28. data/app/controllers/admin/atreides/pages_controller.rb +59 -0
  29. data/app/controllers/admin/atreides/photos_controller.rb +79 -0
  30. data/app/controllers/admin/atreides/posts_controller.rb +109 -0
  31. data/app/controllers/admin/atreides/products_controller.rb +39 -0
  32. data/app/controllers/admin/atreides/sessions_controller.rb +7 -0
  33. data/app/controllers/admin/atreides/sizes_controller.rb +4 -0
  34. data/app/controllers/admin/atreides/tags_controller.rb +20 -0
  35. data/app/controllers/admin/atreides/users_controller.rb +50 -0
  36. data/app/controllers/admin/atreides/videos_controller.rb +53 -0
  37. data/app/controllers/atreides/admin_controller.rb +96 -0
  38. data/app/controllers/atreides/admin_home_controller.rb +211 -0
  39. data/app/controllers/atreides/application_controller.rb +93 -0
  40. data/app/controllers/atreides/comments_controller.rb +43 -0
  41. data/app/controllers/atreides/home_controller.rb +71 -0
  42. data/app/controllers/atreides/likes_controller.rb +44 -0
  43. data/app/controllers/atreides/pages_controller.rb +34 -0
  44. data/app/controllers/atreides/posts_controller.rb +119 -0
  45. data/app/controllers/atreides/public_controller.rb +43 -0
  46. data/app/helpers/admin/atreides/comments_helper.rb +8 -0
  47. data/app/helpers/admin/atreides/dropbox_helper.rb +42 -0
  48. data/app/helpers/admin/atreides/features_helper.rb +4 -0
  49. data/app/helpers/admin/atreides/github_helper.rb +43 -0
  50. data/app/helpers/admin/atreides/links_helper.rb +4 -0
  51. data/app/helpers/admin/atreides/messages_helper.rb +4 -0
  52. data/app/helpers/admin/atreides/orders_helper.rb +30 -0
  53. data/app/helpers/admin/atreides/pages_helper.rb +17 -0
  54. data/app/helpers/admin/atreides/photos_helper.rb +14 -0
  55. data/app/helpers/admin/atreides/posts_helper.rb +41 -0
  56. data/app/helpers/admin/atreides/products_helper.rb +37 -0
  57. data/app/helpers/admin/atreides/sizes_helper.rb +4 -0
  58. data/app/helpers/admin/atreides/user_sessions_helper.rb +4 -0
  59. data/app/helpers/admin/atreides/users_helper.rb +8 -0
  60. data/app/helpers/admin/atreides/videos_helper.rb +4 -0
  61. data/app/helpers/atreides/admin_helper.rb +243 -0
  62. data/app/helpers/atreides/admin_home_helper.rb +4 -0
  63. data/app/helpers/atreides/application_helper.rb +210 -0
  64. data/app/helpers/atreides/home_helper.rb +4 -0
  65. data/app/helpers/atreides/posts_helper.rb +119 -0
  66. data/app/inputs/files_input.rb +13 -0
  67. data/app/inputs/price_input.rb +18 -0
  68. data/app/inputs/underline_input.rb +16 -0
  69. data/app/models/atreides/ability.rb +24 -0
  70. data/app/models/atreides/comment.rb +93 -0
  71. data/app/models/atreides/content_part.rb +107 -0
  72. data/app/models/atreides/feature.rb +90 -0
  73. data/app/models/atreides/github.rb +74 -0
  74. data/app/models/atreides/like.rb +35 -0
  75. data/app/models/atreides/line_item.rb +4 -0
  76. data/app/models/atreides/link.rb +32 -0
  77. data/app/models/atreides/message.rb +34 -0
  78. data/app/models/atreides/order.rb +209 -0
  79. data/app/models/atreides/page.rb +114 -0
  80. data/app/models/atreides/photo.rb +130 -0
  81. data/app/models/atreides/post.rb +271 -0
  82. data/app/models/atreides/product.rb +75 -0
  83. data/app/models/atreides/site.rb +59 -0
  84. data/app/models/atreides/size.rb +44 -0
  85. data/app/models/atreides/tag.rb +31 -0
  86. data/app/models/atreides/tweet.rb +123 -0
  87. data/app/models/atreides/user.rb +129 -0
  88. data/app/models/atreides/video.rb +206 -0
  89. data/app/models/atreides/vote.rb +43 -0
  90. data/app/models/fb_post_publisher_job.rb +72 -0
  91. data/app/models/settings.rb +19 -0
  92. data/app/models/tumblr_post_publisher_job.rb +75 -0
  93. data/app/models/tw_post_publisher_job.rb +54 -0
  94. data/app/views/admin/_edit_head_content.html.haml +2 -0
  95. data/app/views/admin/atreides/comments/_line.html.haml +60 -0
  96. data/app/views/admin/atreides/comments/_sidebar.html.haml +52 -0
  97. data/app/views/admin/atreides/comments/create.js.haml +1 -0
  98. data/app/views/admin/atreides/comments/index.html.haml +34 -0
  99. data/app/views/admin/atreides/content_parts/_form.html.haml +21 -0
  100. data/app/views/admin/atreides/content_parts/_photos.html.haml +18 -0
  101. data/app/views/admin/atreides/content_parts/_text.html.haml +1 -0
  102. data/app/views/admin/atreides/content_parts/_videos.html.haml +12 -0
  103. data/app/views/admin/atreides/content_parts/destroy.js.haml +3 -0
  104. data/app/views/admin/atreides/content_parts/edit.html.haml +0 -0
  105. data/app/views/admin/atreides/content_parts/new.html.haml +0 -0
  106. data/app/views/admin/atreides/content_parts/new.js.haml +11 -0
  107. data/app/views/admin/atreides/dropbox/_uploader.html.haml +134 -0
  108. data/app/views/admin/atreides/dropbox/list.html.haml +27 -0
  109. data/app/views/admin/atreides/dropbox/setup.html.haml +8 -0
  110. data/app/views/admin/atreides/features/_form.html.haml +60 -0
  111. data/app/views/admin/atreides/features/edit.html.haml +1 -0
  112. data/app/views/admin/atreides/features/index.html.haml +24 -0
  113. data/app/views/admin/atreides/features/new.html.haml +1 -0
  114. data/app/views/admin/atreides/github/index.html.haml +26 -0
  115. data/app/views/admin/atreides/github/show.html.haml +19 -0
  116. data/app/views/admin/atreides/likes/create.js.haml +2 -0
  117. data/app/views/admin/atreides/orders/_sidebar.html.haml +20 -0
  118. data/app/views/admin/atreides/orders/edit.html.haml +52 -0
  119. data/app/views/admin/atreides/orders/index.html.haml +8 -0
  120. data/app/views/admin/atreides/pages/_form.html.haml +31 -0
  121. data/app/views/admin/atreides/pages/edit.html.haml +3 -0
  122. data/app/views/admin/atreides/pages/index.html.haml +15 -0
  123. data/app/views/admin/atreides/pages/index.js.haml +4 -0
  124. data/app/views/admin/atreides/pages/new.html.haml +2 -0
  125. data/app/views/admin/atreides/photos/create.js.haml +18 -0
  126. data/app/views/admin/atreides/photos/destroy.js.haml +3 -0
  127. data/app/views/admin/atreides/posts/_archives.html.haml +19 -0
  128. data/app/views/admin/atreides/posts/_form.html.haml +66 -0
  129. data/app/views/admin/atreides/posts/_form_buttons.html.haml +9 -0
  130. data/app/views/admin/atreides/posts/_form_sidebar.html.haml +85 -0
  131. data/app/views/admin/atreides/posts/edit.html.haml +2 -0
  132. data/app/views/admin/atreides/posts/index.html.haml +24 -0
  133. data/app/views/admin/atreides/posts/index.js.haml +1 -0
  134. data/app/views/admin/atreides/posts/new.html.haml +2 -0
  135. data/app/views/admin/atreides/products/edit.html.haml +69 -0
  136. data/app/views/admin/atreides/products/index.html.haml +31 -0
  137. data/app/views/admin/atreides/sessions/new.html.haml +13 -0
  138. data/app/views/admin/atreides/user_sessions/new.html.haml +10 -0
  139. data/app/views/admin/atreides/users/_form.html.haml +19 -0
  140. data/app/views/admin/atreides/users/edit.html.haml +6 -0
  141. data/app/views/admin/atreides/users/index.html.haml +11 -0
  142. data/app/views/admin/atreides/users/new.html.haml +6 -0
  143. data/app/views/admin/atreides/users/show.html.haml +4 -0
  144. data/app/views/admin/atreides/videos/create.js.haml +9 -0
  145. data/app/views/admin/atreides/videos/destroy.js.haml +3 -0
  146. data/app/views/admin/common/_archive_sidebar.html.haml +29 -0
  147. data/app/views/admin/common/_list_table.html.erb +37 -0
  148. data/app/views/admin/common/_list_table_row.html.erb +18 -0
  149. data/app/views/admin/common/_pagination.html.erb +1 -0
  150. data/app/views/admin/common/_search_form.html.erb +6 -0
  151. data/app/views/admin/common/access_denied.html.haml +1 -0
  152. data/app/views/atreides/admin/_content_nav.html.haml +8 -0
  153. data/app/views/atreides/admin_home/_analytics.html.haml +93 -0
  154. data/app/views/atreides/admin_home/_fb_page_likes_analytics_tbody.haml +10 -0
  155. data/app/views/atreides/admin_home/_fb_page_views_analytics_tbody.haml +10 -0
  156. data/app/views/atreides/admin_home/_top_landing_pages_analytics_tbody.haml +14 -0
  157. data/app/views/atreides/admin_home/_top_referrers_analytics_tbody.haml +12 -0
  158. data/app/views/atreides/admin_home/_tweets_analytics_tbody.html.haml +8 -0
  159. data/app/views/atreides/admin_home/_visitors_analytics_tbody.html.haml +12 -0
  160. data/app/views/atreides/admin_home/index.html.haml +57 -0
  161. data/app/views/atreides/admin_home/search.html.haml +11 -0
  162. data/app/views/atreides/admin_home/setup.html.haml +15 -0
  163. data/app/views/atreides/common/_gallery_params.xml.erb +174 -0
  164. data/app/views/atreides/common/slideshow.xml.haml +6 -0
  165. data/app/views/atreides/errors/404.html.haml +10 -0
  166. data/app/views/atreides/errors/500.html.haml +4 -0
  167. data/app/views/atreides/home/index.html.haml +30 -0
  168. data/app/views/atreides/home/index.js.haml +1 -0
  169. data/app/views/atreides/home/robots.txt.erb +5 -0
  170. data/app/views/atreides/home/sitemap.xml.builder +35 -0
  171. data/app/views/atreides/pages/show.html.haml +3 -0
  172. data/app/views/atreides/posts/_archives.html.haml +19 -0
  173. data/app/views/atreides/posts/_featured_posts.html.haml +10 -0
  174. data/app/views/atreides/posts/_list.html.haml +9 -0
  175. data/app/views/atreides/posts/archives.html.haml +3 -0
  176. data/app/views/atreides/posts/archives.js.haml +1 -0
  177. data/app/views/atreides/posts/gallery_params.xml.haml +1 -0
  178. data/app/views/atreides/posts/index.atom.builder +22 -0
  179. data/app/views/atreides/posts/index.html.haml +13 -0
  180. data/app/views/atreides/posts/index.rss.builder +21 -0
  181. data/app/views/atreides/posts/show.html.haml +23 -0
  182. data/app/views/atreides/posts/tagged.html.haml +4 -0
  183. data/app/views/atreides/posts/tagged.js.haml +1 -0
  184. data/app/views/layouts/admin.html.haml +62 -0
  185. data/app/views/layouts/application.html.haml +37 -0
  186. data/app/views/layouts/atreides/application.html.erb +14 -0
  187. data/app/views/layouts/public.html.haml +39 -0
  188. data/config/cucumber.yml +11 -0
  189. data/config/locales/en.yml +236 -0
  190. data/config/locales/fr.yml +199 -0
  191. data/config/routes.rb +119 -0
  192. data/lib/assets/images/atreides/admin/add.png +0 -0
  193. data/lib/assets/images/atreides/admin/add_btn.png +0 -0
  194. data/lib/assets/images/atreides/admin/add_dashboard.png +0 -0
  195. data/lib/assets/images/atreides/admin/add_photo_button_sprite.png +0 -0
  196. data/lib/assets/images/atreides/admin/add_photos_btn.png +0 -0
  197. data/lib/assets/images/atreides/admin/background.png +0 -0
  198. data/lib/assets/images/atreides/admin/calendar.png +0 -0
  199. data/lib/assets/images/atreides/admin/chevron.gif +0 -0
  200. data/lib/assets/images/atreides/admin/chevron_overlay.png +0 -0
  201. data/lib/assets/images/atreides/admin/choose_photos_button_sprite.png +0 -0
  202. data/lib/assets/images/atreides/admin/content_bg.png +0 -0
  203. data/lib/assets/images/atreides/admin/content_bg_edit_form.png +0 -0
  204. data/lib/assets/images/atreides/admin/content_part_break.png +0 -0
  205. data/lib/assets/images/atreides/admin/content_part_drop_target.png +0 -0
  206. data/lib/assets/images/atreides/admin/content_part_icons.png +0 -0
  207. data/lib/assets/images/atreides/admin/content_part_photos.png +0 -0
  208. data/lib/assets/images/atreides/admin/content_part_text.png +0 -0
  209. data/lib/assets/images/atreides/admin/content_part_videos.png +0 -0
  210. data/lib/assets/images/atreides/admin/content_top_edit_form.png +0 -0
  211. data/lib/assets/images/atreides/admin/dashboard-indicator.gif +0 -0
  212. data/lib/assets/images/atreides/admin/dashboard_controls_activity.png +0 -0
  213. data/lib/assets/images/atreides/admin/dashboard_controls_customize.png +0 -0
  214. data/lib/assets/images/atreides/admin/dashboard_controls_drafts.png +0 -0
  215. data/lib/assets/images/atreides/admin/dashboard_controls_open.png +0 -0
  216. data/lib/assets/images/atreides/admin/dashboard_controls_posts.png +0 -0
  217. data/lib/assets/images/atreides/admin/dashboard_controls_queue.png +0 -0
  218. data/lib/assets/images/atreides/admin/dashboard_nav_border.png +0 -0
  219. data/lib/assets/images/atreides/admin/delete_bg.png +0 -0
  220. data/lib/assets/images/atreides/admin/down_arrow.png +0 -0
  221. data/lib/assets/images/atreides/admin/dropbox_big.jpg +0 -0
  222. data/lib/assets/images/atreides/admin/dropbox_btn.png +0 -0
  223. data/lib/assets/images/atreides/admin/dropbox_folder.png +0 -0
  224. data/lib/assets/images/atreides/admin/dropbox_icon.gif +0 -0
  225. data/lib/assets/images/atreides/admin/dropbox_icon.png +0 -0
  226. data/lib/assets/images/atreides/admin/expand_collapse.png +0 -0
  227. data/lib/assets/images/atreides/admin/form_sidebar_divider.png +0 -0
  228. data/lib/assets/images/atreides/admin/grey_hatch_bg.png +0 -0
  229. data/lib/assets/images/atreides/admin/header.png +0 -0
  230. data/lib/assets/images/atreides/admin/icon_dropbox.gif +0 -0
  231. data/lib/assets/images/atreides/admin/icon_home.gif +0 -0
  232. data/lib/assets/images/atreides/admin/input_bg.gif +0 -0
  233. data/lib/assets/images/atreides/admin/large_loading.gif +0 -0
  234. data/lib/assets/images/atreides/admin/new_content_icons.png +0 -0
  235. data/lib/assets/images/atreides/admin/off.png +0 -0
  236. data/lib/assets/images/atreides/admin/on.png +0 -0
  237. data/lib/assets/images/atreides/admin/page_icon.png +0 -0
  238. data/lib/assets/images/atreides/admin/permalink.png +0 -0
  239. data/lib/assets/images/atreides/admin/photos-display-type-gallery.png +0 -0
  240. data/lib/assets/images/atreides/admin/photos-display-type-photos.png +0 -0
  241. data/lib/assets/images/atreides/admin/product.png +0 -0
  242. data/lib/assets/images/atreides/admin/remove.png +0 -0
  243. data/lib/assets/images/atreides/admin/resize.png +0 -0
  244. data/lib/assets/images/atreides/admin/save_btn.png +0 -0
  245. data/lib/assets/images/atreides/admin/search_icon.png +0 -0
  246. data/lib/assets/images/atreides/admin/select_arrows.png +0 -0
  247. data/lib/assets/images/atreides/admin/slider.png +0 -0
  248. data/lib/assets/images/atreides/admin/slider_center.png +0 -0
  249. data/lib/assets/images/atreides/admin/slider_left.png +0 -0
  250. data/lib/assets/images/atreides/admin/slider_right.png +0 -0
  251. data/lib/assets/images/atreides/admin/sprite.png +0 -0
  252. data/lib/assets/images/atreides/admin/upload_btn.png +0 -0
  253. data/lib/assets/images/atreides/admin/video_bg.png +0 -0
  254. data/lib/assets/images/atreides/blank.gif +0 -0
  255. data/lib/assets/images/atreides/closelabel.png +0 -0
  256. data/lib/assets/images/atreides/loading.gif +0 -0
  257. data/lib/assets/images/atreides/sprite.png +0 -0
  258. data/lib/assets/images/atreides/tipsy.gif +0 -0
  259. data/lib/atreides.rb +82 -0
  260. data/lib/atreides/base/aasmstates.rb +117 -0
  261. data/lib/atreides/base/base.rb +40 -0
  262. data/lib/atreides/base/taggable.rb +43 -0
  263. data/lib/atreides/base/validation.rb +23 -0
  264. data/lib/atreides/configuration.rb +61 -0
  265. data/lib/atreides/engine.rb +41 -0
  266. data/lib/atreides/extendable.rb +12 -0
  267. data/lib/atreides/i18n_helpers.rb +65 -0
  268. data/lib/atreides/railties/tasks.rake +68 -0
  269. data/lib/atreides/time_formats.rb +19 -0
  270. data/lib/atreides/validators.rb +15 -0
  271. data/lib/atreides/version.rb +4 -0
  272. data/lib/generators/atreides/USAGE +0 -0
  273. data/lib/generators/atreides/atreides_generator.rb +58 -0
  274. data/lib/generators/templates/Procfile +2 -0
  275. data/lib/generators/templates/add_role_to_users.rb +16 -0
  276. data/lib/generators/templates/add_userid_to_resources.rb +15 -0
  277. data/lib/generators/templates/create_comments.rb +19 -0
  278. data/lib/generators/templates/create_content_parts.rb +66 -0
  279. data/lib/generators/templates/create_features.rb +21 -0
  280. data/lib/generators/templates/create_likes.rb +16 -0
  281. data/lib/generators/templates/create_line_items.rb +21 -0
  282. data/lib/generators/templates/create_links.rb +16 -0
  283. data/lib/generators/templates/create_messages.rb +24 -0
  284. data/lib/generators/templates/create_orders.rb +31 -0
  285. data/lib/generators/templates/create_pages.rb +31 -0
  286. data/lib/generators/templates/create_photos.rb +22 -0
  287. data/lib/generators/templates/create_posts.rb +38 -0
  288. data/lib/generators/templates/create_products.rb +24 -0
  289. data/lib/generators/templates/create_sessions.rb +16 -0
  290. data/lib/generators/templates/create_sites.rb +35 -0
  291. data/lib/generators/templates/create_sizes.rb +16 -0
  292. data/lib/generators/templates/create_tweets.rb +25 -0
  293. data/lib/generators/templates/create_videos.rb +24 -0
  294. data/lib/generators/templates/create_votes.rb +20 -0
  295. data/lib/generators/templates/delayed_job.rb +5 -0
  296. data/lib/generators/templates/devise_create_users.rb +42 -0
  297. data/lib/generators/templates/disqussion.rb +30 -0
  298. data/lib/generators/templates/em-net-http_override.rb +74 -0
  299. data/lib/generators/templates/initializer.rb +21 -0
  300. data/lib/generators/templates/new_relic.rb +6 -0
  301. data/lib/generators/templates/oembed.yml +63 -0
  302. data/lib/generators/templates/settings.yml +110 -0
  303. data/lib/generators/templates/string_extensions.rb +20 -0
  304. data/lib/generators/templates/unicorn.rb +2 -0
  305. data/lib/tasks/atreides_tasks.rake +4 -0
  306. data/lib/tasks/cucumber.rake +58 -0
  307. data/lib/tasks/tasks.rake +403 -0
  308. data/lib/tasks/yard.rake +18 -0
  309. metadata +1458 -0
@@ -0,0 +1,21 @@
1
+ Atreides.configure do |conf|
2
+ # Example of overrides: Atreides::Post will have ::Post included,
3
+ # whereas Atreides::PostsController will have ::PostsControllerOverrides included
4
+ # conf.override 'Post', 'PostsController' => "PostsControllerOverrides"
5
+ end
6
+
7
+ module Rails
8
+ class << self
9
+ def database
10
+ @_database ||= ActiveSupport::StringInquirer.new(Rails.configuration.database_configuration[Rails.env]["adapter"])
11
+ end
12
+
13
+ def app_name
14
+ @_app_name ||= ActiveSupport::StringInquirer.new(APP_NAME || 'gamestore')
15
+ end
16
+
17
+ def host_ip
18
+ @_host_ip ||= host_ip = Rails.env.development? ? "127.0.0.1" : Socket.getaddrinfo(Socket.gethostname, "www", Socket::AF_INET).first[3]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ # Ensure the agent is started using Unicorn
2
+ # This is needed when using Unicorn and preload_app is not set to true.
3
+ # See http://support.newrelic.com/kb/troubleshooting/unicorn-no-data
4
+ unless Rails.env.development? || Rails.env.staging?
5
+ NewRelic::Agent.after_fork(:force_reconnect => true) if defined? Unicorn
6
+ end
@@ -0,0 +1,63 @@
1
+ :config:
2
+ :method: "NetHTTP"
3
+
4
+ :providers:
5
+ :oohembed: "http://oohembed.com/oohembed/"
6
+ :vimeo: "http://vimeo.com/api/oembed.{format}"
7
+ :hulu: "http://www.hulu.com/api/oembed.{format}"
8
+ :flickr: "http://www.flickr.com/services/oembed"
9
+ :viddler: "http://lab.viddler.com/services/oembed/"
10
+ :youtube: "http://www.youtube.com/oembed"
11
+
12
+ :youtube:
13
+ :format: "json"
14
+ :schemes:
15
+ - "http://www.youtube.com/watch?v=*"
16
+ - "http://www.youtube.com/embed/*"
17
+ - "http://www.youtu.be/*"
18
+ - "http://youtube.com/watch?v=*"
19
+ - "http://youtube.com/embed/*"
20
+ - "http://youtu.be/*"
21
+ - "https://www.youtube.com/watch?v=*"
22
+ - "https://www.youtube.com/embed/*"
23
+ - "https://www.youtu.be/*"
24
+ - "https://youtube.com/watch?v=*"
25
+ - "https://youtube.com/embed/*"
26
+
27
+ :oohembed:
28
+ :format: "json"
29
+ :schemes:
30
+ - "http://*.amazon.(com|co.uk|de|ca|jp)/*/(gp/product|o/ASIN|obidos/ASIN|dp)/*"
31
+ - "http://*.amazon.(com|co.uk|de|ca|jp)/(gp/product|o/ASIN|obidos/ASIN|dp)/*"
32
+ - "http://*.collegehumor.com/video:*"
33
+ - "http://*.funnyordie.com/videos/*"
34
+ - "http://video.google.com/videoplay?*"
35
+ - "http://*.imdb.com/title/tt*/"
36
+ - "http://*.metacafe.com/watch/*"
37
+ - "http://*.slideshare.net/*"
38
+ - "http://twitter.com/*/statuses/*"
39
+ - "http://*.wikipedia.org/wiki/*"
40
+ - "http://*.wordpress.com/[0-9]{4}/[0-9]{2}/[0-9]{2}/*"
41
+
42
+ :vimeo:
43
+ :format: "json"
44
+ :schemes:
45
+ - "http://vimeo.com/*"
46
+ - "http://vimeo.com/groups/*/videos/*"
47
+ - "http://www.vimeo.com/*"
48
+ - "http://www.vimeo.com/groups/*/videos/*"
49
+
50
+ :hulu:
51
+ :format: "xml"
52
+ :schemes:
53
+ - "http://www.hulu.com/watch/*"
54
+
55
+ :flickr:
56
+ :format: "xml"
57
+ :schemes:
58
+ - "http://*.flickr.com/*"
59
+
60
+ :viddler:
61
+ :format: "xml"
62
+ :schemes:
63
+ - "http://*.viddler.com/*"
@@ -0,0 +1,110 @@
1
+ common: &common
2
+ app_name: Atreides
3
+ admin_email:
4
+ session_key: '_atreides_web_app_session'
5
+ analytics_backends:
6
+ - console
7
+ - google
8
+ ganalytics:
9
+ code: UA-XXXXXXX-XX
10
+ email:
11
+ password:
12
+ profile_id:
13
+ domain: atreides.dev
14
+ disqus:
15
+ key:
16
+ secret:
17
+ forum:
18
+ tumblr:
19
+ blog:
20
+ email:
21
+ pass:
22
+ dropbox:
23
+ key:
24
+ secret:
25
+ vimeo:
26
+ consumer_key:
27
+ consumer_secret:
28
+ user_token:
29
+ user_secret:
30
+ facebook:
31
+ # GoTo:
32
+ # http://graph.facebook.com/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URL
33
+ # -> Get code param and save as the token
34
+ # GoTo:
35
+ # https://graph.facebook.com/oauth/access_token?client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&client_secret=CLIENT_SECRET&code=CODE
36
+ # -> Put resulting access_token into user_token val below
37
+ # -> Create a OAuth access_token object with: access_token = OAuth2::AccessToken.new(client, Settings.facebook.user_token)
38
+ # -> Get your page's access_token with: access_token.get("/me/accounts")
39
+ # -> Put the page's access_token into page_token below
40
+ secret_key:
41
+ api_key:
42
+ code:
43
+ user_token:
44
+ page_token:
45
+ page_id:
46
+ app_id:
47
+ twitter:
48
+ login:
49
+ consumer_key:
50
+ consumer_secret:
51
+ # oauth = Twitter::OAuth.new(Settings.twitter.consumer_key, Settings.twitter.consumer_secret, :sign_in => true)
52
+ # oauth.set_callback_url(app.root_url(:host => Settings.domain))
53
+ # rtoken = oauth.request_token.token
54
+ # rsecret = oauth.request_token.secret
55
+ # oauth.request_token.authorize_url
56
+ # -- Go to above URL and sign-in/approve the app and retrieve the verifier param from the return-to-app URL
57
+ # oauth_verifier = VERIFIER_KEY
58
+ # oauth.authorize_from_request(rtoken, rsecret, oauth_verifier)
59
+ # oauth.access_token.token -> use below
60
+ # oauth.access_token.secret -> use below
61
+ app_user_token:
62
+ app_user_secret:
63
+ search_for: atreides OR "The 88" OR "Le 88"
64
+ bitly:
65
+ login:
66
+ key:
67
+ tags:
68
+ posts:
69
+ groups: [tags, location]
70
+ tags: []
71
+ location: [blog, featured]
72
+ features: []
73
+ features:
74
+ groups: []
75
+ pages:
76
+ groups: []
77
+ photo_conv_options: "-density 70"
78
+ photo_dimensions:
79
+ thumb: "100x100#"
80
+ small: "156x156#"
81
+ splash: "920x460#"
82
+ list: "515x515>"
83
+ medium: "800x600>"
84
+ full: "2000x2000>"
85
+
86
+ development:
87
+ <<: *common
88
+
89
+ test:
90
+ <<: *common
91
+
92
+ staging:
93
+ <<: *common
94
+ domain: atreides-dev.herokuapp.com
95
+
96
+ production:
97
+ <<: *common
98
+ ganalytics:
99
+ code: UA-XXXXXXX-X
100
+ profile_id:
101
+ domain: atreides.com
102
+ facebook:
103
+ # See instructions above
104
+ secret_key:
105
+ api_key:
106
+ code:
107
+ user_token:
108
+ page_token:
109
+ page_id:
110
+ app_id:
@@ -0,0 +1,20 @@
1
+ class String
2
+
3
+ def capitalize_words
4
+ return self.gsub(/\w+/u) { |word| word.capitalize } #gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
5
+ end
6
+
7
+ # Turns a string like "Devil's Cave.xml" into "Devil\'s\ Cave.xml", i.e. escapes spaces
8
+ # and these: '&
9
+ def escape_filename
10
+ self.split("'").join("\\'").gsub(/(\s)/, '\\\\\1').gsub("&", '\\\\&')
11
+ end
12
+
13
+ # AFAIK this truncate method breaks some plugins like Faraday - Bill Alton 2012.03.02
14
+ # def truncate(length, end_string = ' ...')
15
+ # l = length - end_string.mb_chars.length
16
+ # chars = self.mb_chars rescue self
17
+ # (chars.length > length ? chars[0...l] + end_string : self).to_s
18
+ # end
19
+
20
+ end
@@ -0,0 +1,2 @@
1
+ worker_processes 3 # amount of unicorn workers to spin up
2
+ timeout 30 # restarts workers that hang for 30 seconds
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :atreides do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,58 @@
1
+ # IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
2
+ # It is recommended to regenerate this file in the future when you upgrade to a
3
+ # newer version of cucumber-rails. Consider adding your own code to a new file
4
+ # instead of editing this one. Cucumber will automatically load all features/**/*.rb
5
+ # files.
6
+
7
+
8
+ unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
9
+
10
+ begin
11
+ require 'cucumber/rake/task'
12
+
13
+ namespace :cucumber do
14
+ Cucumber::Rake::Task.new({:ok => 'dummy:db:test:prepare'}, 'Run features that should pass') do |t|
15
+ t.binary = nil # If nil, the gem's binary is used.
16
+ t.fork = false # You may get faster startup if you set this to false
17
+ t.profile = 'default'
18
+ end
19
+
20
+ Cucumber::Rake::Task.new({:html => []}, 'Run all the features, output html') do |t|
21
+ mkdir_p 'tmp/cucumber' unless File.exists? 'tmp/cucumber'
22
+ t.binary = nil # If nil, the gem's binary is used.
23
+ t.fork = false # You may get faster startup if you set this to false
24
+ t.profile = 'html'
25
+ # t.cucumber_opts = '--format html --out tmp/cucumber/index.html'
26
+ end
27
+
28
+ Cucumber::Rake::Task.new({:wip => 'dummy:db:test:prepare'}, 'Run features that are being worked on') do |t|
29
+ t.binary = nil
30
+ t.fork = true # You may get faster startup if you set this to false
31
+ t.profile = 'wip'
32
+ end
33
+
34
+ Cucumber::Rake::Task.new({:rerun => 'dummy:db:test:prepare'}, 'Record failing features and run only them if any exist') do |t|
35
+ t.binary = nil
36
+ t.fork = true # You may get faster startup if you set this to false
37
+ t.profile = 'rerun'
38
+ end
39
+
40
+ desc 'Run all features'
41
+ task :all => [:ok, :wip]
42
+ end
43
+ desc 'Alias for cucumber:ok'
44
+ task :cucumber => 'cucumber:ok'
45
+
46
+ task :default => :cucumber
47
+
48
+ task :features => :cucumber do
49
+ STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
50
+ end
51
+ rescue LoadError
52
+ desc 'cucumber rake task not available (cucumber not installed)'
53
+ task :cucumber do
54
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,403 @@
1
+ require 'open-uri'
2
+ require 'nokogiri'
3
+ require 'xmlsimple'
4
+
5
+ desc "This task is called by the Heroku cron add-on"
6
+ task :cron => :environment do
7
+
8
+ djs = []
9
+ dj_priority = -1
10
+ time = Time.now.in_time_zone
11
+
12
+ # On heroku the daily cron job will run this
13
+ djs << Atreides::Tweet.send_later(:fetch_recent)
14
+
15
+ # Each minute
16
+
17
+ # Each Hour at a certain minute
18
+ case time.min
19
+ when 0
20
+ end
21
+
22
+ # Top of each hour
23
+ case time.hour
24
+ when 0
25
+ when 7
26
+ # At the top of the hour
27
+
28
+ when 8
29
+ # At the top of the hour
30
+
31
+ end if time.min.zero?
32
+
33
+ # Top of each wday
34
+ case time.wday
35
+ when 0
36
+
37
+ end
38
+
39
+ # Set priority on all the delayed-jobs create here
40
+ Delayed::Job.update_all({:priority => dj_priority}, ["id in (?)", djs.map(&:id)])
41
+ end
42
+
43
+ namespace :atreides do
44
+ desc "Greeting rake task from Atreides"
45
+ task :greet do
46
+ puts "Greeting from Atreides"
47
+ end
48
+
49
+ namespace :import do
50
+ namespace :blogger do
51
+ desc "Import published posts from blogger. Provide a FILE=path_to_exported_xml_file as a source."
52
+ task :published => :environment do
53
+ # Read in full file
54
+ blog = Nokogiri::XML(open(ENV['FILE']))
55
+ # Select entries that are blog posts
56
+ entries = blog.css('entry').select{|e| !e.css('content[type=html]').blank? }
57
+ # Import each post
58
+ entries.each { |e| import_post(e) }
59
+ end
60
+
61
+ private
62
+
63
+ def import_post(post)
64
+ #rip out image urls and create associated images; assumes all blog posts are just images
65
+
66
+ require 'htmlentities'
67
+ @decoder ||= HTMLEntities.new
68
+
69
+ content_html = @decoder.decode(post.css('content').text)
70
+ content = Nokogiri::HTML(content_html)
71
+ image_urls = content.css("img").map{|i|i.attributes['src'].to_s}
72
+
73
+ title = post.css('title').text #place and date
74
+ url = post.at_css("link[rel='alternate'][type='text/html']")['href'] rescue nil
75
+
76
+
77
+ # Create Post with photo unless already exists.
78
+ if Atreides::Post.find_by_import_url(url).nil?
79
+ photos = []
80
+ image_urls[0..image_urls.size].each do |url| # limit the images to be imported
81
+ # image_urls.each do |url|
82
+ photo = Atreides::Photo.create(:url => url)
83
+ if photo.valid?
84
+ photos << photo
85
+ else
86
+ puts "Skipping image '#{url}' - #{photo.errors.full_messages.to_sentence}"
87
+ end
88
+ end
89
+
90
+ parts_attributes = [
91
+ {:content_type => "photos", :photos => photos},
92
+ {:content_type => "text", :body => fetch_date(title)}
93
+ ]
94
+
95
+
96
+ options = {
97
+ :slug => fetch_slug(post),
98
+ :parts_attributes => parts_attributes,
99
+ :title => fetch_location(title),
100
+ :tag_list => parse_tags(post),
101
+ :state => "published",
102
+ :published_at => post.css('published').text,
103
+ :import_url => url,
104
+ :site_id => Atreides::Site.first.id
105
+ }
106
+ p = Atreides::Post.create!(options)
107
+ puts "Created post '#{p.title}'"
108
+
109
+ else
110
+ puts "Skipping '#{title}' - already imported!"
111
+
112
+ end
113
+ end
114
+
115
+ #these is used to split appropriately, for example if a post is titled "London, September 21st, 2009" vs "London, England, September 21st, 2009"
116
+ def fetch_date(title)
117
+ #if the split section includes a number, assume it is part of the date
118
+ title.to_s.split(",").select{ |section| section =~ /\d/ }.map(&:strip).join(", ")
119
+ end
120
+
121
+ def fetch_location(title)
122
+ title.to_s.split(",").select{ |section| section !~ /\d/ }.map(&:strip).join(", ")
123
+ end
124
+
125
+ def parse_tags(post)
126
+ post.css("category[scheme$='atom/ns#']").map{|c|c["term"]}
127
+ end
128
+
129
+ def fetch_slug(post)
130
+ if link = post.at_css("link[rel='alternate'][href^='http://yvanrodic.blogspot.com/']")
131
+ link["href"].split("/").last.split(".").first.to_param
132
+ end
133
+ end
134
+ end
135
+
136
+ namespace :tumblr do
137
+ desc "Import published posts from tumblr."
138
+ task :published => :environment do
139
+ printf "** Importing published posts\n"
140
+
141
+ per_page = 50
142
+
143
+ total_posts = get(:num => 1).match(/total="(\d+)"/)[1].to_i
144
+ total_pages = (total_posts / per_page.to_f).ceil
145
+
146
+ printf "** #{total_posts} items to be imported!\n"
147
+
148
+ # FOR DEBUG
149
+ #total_pages, per_page = 1, 1
150
+
151
+ (1..total_pages).each do |current_page|
152
+ printf "\n** Getting page #{current_page} of #{total_pages} ( #{per_page} per page )\n"
153
+
154
+ body = get({ :start => (current_page - 1) * per_page, :num => per_page })
155
+ posts = XmlSimple.xml_in(body)["posts"].first["post"]
156
+
157
+ import_posts(posts)
158
+ end
159
+ end
160
+
161
+ desc "Import drafted posts from tumblr."
162
+ task :drafted => :environment do
163
+ printf "** Importing drafted posts\n"
164
+
165
+ fetch_next_page = true
166
+ current_page = 1
167
+
168
+ per_page = 20 # 20 is the default value per_page from Tumblr API
169
+ # the :num attribute when POST'ing on Tumblr API seems not to be taken into account
170
+ # A bug >_<
171
+
172
+ while fetch_next_page
173
+ printf "\n** Getting page #{current_page}\n"
174
+
175
+ body = get({ :start => (current_page - 1) * per_page, :num => per_page, :state => "draft" }, true)
176
+ posts = XmlSimple.xml_in(body)["posts"].first["post"]
177
+
178
+ if posts.nil? or posts.empty?
179
+ fetch_next_page = false
180
+ else
181
+ printf "** #{posts.count} posts found\n"
182
+
183
+ import_posts(posts, "drafted")
184
+ fetch_next_page = (posts.count == per_page)
185
+ current_page += 1
186
+ end
187
+ end
188
+ end
189
+
190
+ private
191
+
192
+ def import_posts(posts, state="published")
193
+ posts.each do |post|
194
+ url = post['url']
195
+ if Atreides::Post.find_by_import_url(url).nil?
196
+ begin
197
+ case post['type']
198
+ when "photo" then import_photo(post, state)
199
+ when "regular" then import_regular(post, state)
200
+ when "video" then import_video(post, state)
201
+ else
202
+ printf "** Skipping #{post["type"]} post, no handler\n"
203
+ end
204
+ rescue => exc
205
+ puts "Error: #{exc}"
206
+ puts exc.backtrace
207
+ end
208
+ end
209
+ end
210
+ end
211
+
212
+ def get(params = {}, authenticate = false)
213
+ blog_uri = "http://#{Settings.tumblr.blog}.tumblr.com/api/read"
214
+
215
+ if authenticate
216
+ params[:email] = Settings.tumblr.email
217
+ params[:password] = Settings.tumblr.pass
218
+
219
+ Mechanize.new.post(blog_uri, params).body
220
+ else
221
+ Mechanize.new.get("#{blog_uri}?" + params.to_query).body
222
+ end
223
+ end
224
+
225
+ def import_video(post, state = "published")
226
+ printf "* Importing video : #{post.inspect}\n"
227
+
228
+ # Create video first
229
+ video = Atreides::Video.create!(:url => post["video-source"].to_s)
230
+
231
+ title = post["slug"].gsub(/-/, " ").humanize rescue "Draft #{Time.now.to_i}"
232
+
233
+ parts_attributes = [
234
+ {:content_type => "videos", :videos => [video]}
235
+ ]
236
+ url = post['url']
237
+
238
+ options = {
239
+ #:tumblr_id => post['id'],
240
+ :slug => post['slug'],
241
+ :title => title,
242
+ :tag_list => post['tag'].to_a.join(', '),
243
+ :parts_attributes => parts_attributes,
244
+ :state => state,
245
+ :published_at => post['date'],
246
+ :import_url => url,
247
+ :site_id => Atreides::Site.first.id
248
+ }
249
+
250
+ # Create Post with photo
251
+ Atreides::Post.create!(options)
252
+ end
253
+
254
+ def import_regular(post, state = "published")
255
+ printf "* Importing regular post : #{post.inspect}\n"
256
+ parts_attributes = [
257
+ {:content_type => "text", :body => post['regular-body'].join("").gsub("\n","<br>").to_s}
258
+ ]
259
+ url = post['url']
260
+
261
+ options = {
262
+ #:tumblr_id => post['id'],
263
+ :slug => post['slug'],
264
+ :title => post["regular-title"].to_s,
265
+ :parts_attributes => parts_attributes,
266
+ :tag_list => post['tag'].to_a.join(', '),
267
+ :state => state,
268
+ :published_at => post['date'],
269
+ :import_url => url,
270
+ :site_id => Atreides::Site.first.id
271
+ }
272
+
273
+ # Create Post with photo
274
+ Atreides::Post.create!(options)
275
+ end
276
+
277
+ def import_photo(post, state = 'published')
278
+ printf "* Importing photo : #{post.inspect}\n"
279
+
280
+ # Create Photos first
281
+ if post.has_key?("photoset")
282
+ # multiple photos
283
+ photos = Atreides::Photo.create!(post['photoset'].first["photo"].map { |photo| { :url => photo["photo-url"].first["content"] } })
284
+ else
285
+ photos = [ Atreides::Photo.create!(:url => post['photo-url'].first["content"]) ]
286
+ end
287
+
288
+ title = post["slug"].gsub(/-/, " ").humanize rescue ""
289
+
290
+ title = "Draft #{Time.now.to_i}" if title.blank?
291
+
292
+ parts_attributes = [
293
+ {:content_type => "text", :body => post['photo-caption'].join("").gsub("\n","<br>").to_s},
294
+ {:content_type => "photos", :photos => photos}
295
+ ]
296
+ url = post['url']
297
+
298
+ options = {
299
+ #:tumblr_id => post['id'],
300
+ :slug => post['slug'],
301
+ :title => title,
302
+ :parts_attributes => parts_attributes,
303
+ :tag_list => post['tag'].to_a.join(', '),
304
+ :state => state,
305
+ :published_at => post['date'],
306
+ :import_url => url,
307
+ :site_id => Atreides::Site.first.id
308
+ }
309
+
310
+ # Create Post with photo
311
+ Atreides::Post.create!(options)
312
+ end
313
+ end
314
+
315
+ namespace :wordpress do
316
+ task :published => :environment do
317
+ i=11
318
+ continue=true
319
+
320
+ while continue == true
321
+ i+=1
322
+ begin
323
+ puts i
324
+ feed_url ="#{ENV['BASEURI']}/feed/?paged=#{i}"
325
+ puts feed_url
326
+ blog_page = Nokogiri::XML(open(feed_url))
327
+ blog_page.css("item").each do |e|
328
+ import(e)
329
+ end
330
+ rescue => detail
331
+ print detail.backtrace.join("\n")
332
+ continue=false
333
+ end
334
+ end
335
+ end
336
+
337
+ private
338
+
339
+ def import(post, state = "published")
340
+ photos = []
341
+ content = Nokogiri::HTML.parse(post.xpath('.//content:encoded').text)
342
+
343
+ #Download/Reinsert Images
344
+ if content.css('img').at
345
+ content.css('img').each do |i|
346
+ #create photo from a href link source
347
+ original_image_url = i.parent.attribute("href") ? i.parent.attribute("href").value : i.attribute("src").value
348
+ photo = Atreides::Photo.create!(:url => original_image_url)
349
+ #fetch new image urls (thumb and original)
350
+ #modify body to reflect new images
351
+ new_image_url = photo.image.url(:medium)
352
+ i.attribute("src").value = new_image_url
353
+
354
+ if i.parent.attribute("href")
355
+ new_link_url = photo.image.url
356
+ i.parent.attribute("href").value = new_link_url
357
+ end
358
+ photos << photo
359
+ end
360
+ end
361
+
362
+ parts_attributes = [{
363
+ :content_type => "text",
364
+ :body => content.join("").gsub("\n","<br>")
365
+ }]
366
+
367
+ url = video_url(content)
368
+ parts_attributes.unshift({
369
+ :content_type => "videos",
370
+ :videos => [Terrybr::Video.create(:url => url)]
371
+ }) unless url.blank?
372
+
373
+ parts_attributes.unshift({
374
+ :content_type => "photos",
375
+ :photos => photos
376
+ }) unless photos.empty?
377
+
378
+ # Create Post with photo
379
+ Atreides::Post.create!({
380
+ :slug => post.at_css("link").text.split("/").last,
381
+ :parts_attributes => parts_attributes,
382
+ :title => post.at_css("title").text,
383
+ :tag_list => post.css("category").map(&:text).join(", "),
384
+ :state => state,
385
+ :published_at => post.at_css("pubDate").text
386
+ })
387
+ end
388
+
389
+ def video_url(content)
390
+ iframe_node = content.at_css("iframe")
391
+ if iframe_node.attribute("title").value =~ /YouTube/
392
+ return video_url = iframe_node.attribute("src").value.split("/").last.insert(0, "http://www.youtube.com/watch?v=")
393
+ #elsif vimeo..
394
+ #check if vimeo objects contain a "title" attribute structured similarly
395
+ else
396
+ return nil
397
+ end
398
+ rescue Exception => exc
399
+ puts "Error getting video: '#{exc}'"
400
+ end
401
+ end
402
+ end
403
+ end