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.
- data/LICENSE +7 -0
- data/README.rdoc +1 -0
- data/app/assets/javascripts/atreides/admin.js +22 -0
- data/app/assets/javascripts/atreides/admin_base.js.erb +247 -0
- data/app/assets/javascripts/atreides/admin_edit.js +9 -0
- data/app/assets/javascripts/atreides/application.js +15 -0
- data/app/assets/javascripts/atreides/comments.coffee +50 -0
- data/app/assets/javascripts/atreides/public.js +24 -0
- data/app/assets/javascripts/atreides/public_base.js.erb +119 -0
- data/app/assets/javascripts/atreides/terryblr.js +57 -0
- data/app/assets/stylesheets/atreides/admin.css +21 -0
- data/app/assets/stylesheets/atreides/admin_base.css.erb +1762 -0
- data/app/assets/stylesheets/atreides/application.css +13 -0
- data/app/assets/stylesheets/atreides/formtastic_changes.css +10 -0
- data/app/assets/stylesheets/atreides/iphone-checkboxes.css.erb +97 -0
- data/app/assets/stylesheets/atreides/jBreadCrumb.css +109 -0
- data/app/assets/stylesheets/atreides/public.css +15 -0
- data/app/assets/stylesheets/atreides/public_base.css +101 -0
- data/app/assets/stylesheets/atreides/swfupload.css.erb +63 -0
- data/app/controllers/admin/atreides/comments_controller.rb +47 -0
- data/app/controllers/admin/atreides/content_parts_controller.rb +43 -0
- data/app/controllers/admin/atreides/dropbox_controller.rb +40 -0
- data/app/controllers/admin/atreides/features_controller.rb +63 -0
- data/app/controllers/admin/atreides/github_controller.rb +35 -0
- data/app/controllers/admin/atreides/links_controller.rb +3 -0
- data/app/controllers/admin/atreides/messages_controller.rb +3 -0
- data/app/controllers/admin/atreides/orders_controller.rb +35 -0
- data/app/controllers/admin/atreides/pages_controller.rb +59 -0
- data/app/controllers/admin/atreides/photos_controller.rb +79 -0
- data/app/controllers/admin/atreides/posts_controller.rb +109 -0
- data/app/controllers/admin/atreides/products_controller.rb +39 -0
- data/app/controllers/admin/atreides/sessions_controller.rb +7 -0
- data/app/controllers/admin/atreides/sizes_controller.rb +4 -0
- data/app/controllers/admin/atreides/tags_controller.rb +20 -0
- data/app/controllers/admin/atreides/users_controller.rb +50 -0
- data/app/controllers/admin/atreides/videos_controller.rb +53 -0
- data/app/controllers/atreides/admin_controller.rb +96 -0
- data/app/controllers/atreides/admin_home_controller.rb +211 -0
- data/app/controllers/atreides/application_controller.rb +93 -0
- data/app/controllers/atreides/comments_controller.rb +43 -0
- data/app/controllers/atreides/home_controller.rb +71 -0
- data/app/controllers/atreides/likes_controller.rb +44 -0
- data/app/controllers/atreides/pages_controller.rb +34 -0
- data/app/controllers/atreides/posts_controller.rb +119 -0
- data/app/controllers/atreides/public_controller.rb +43 -0
- data/app/helpers/admin/atreides/comments_helper.rb +8 -0
- data/app/helpers/admin/atreides/dropbox_helper.rb +42 -0
- data/app/helpers/admin/atreides/features_helper.rb +4 -0
- data/app/helpers/admin/atreides/github_helper.rb +43 -0
- data/app/helpers/admin/atreides/links_helper.rb +4 -0
- data/app/helpers/admin/atreides/messages_helper.rb +4 -0
- data/app/helpers/admin/atreides/orders_helper.rb +30 -0
- data/app/helpers/admin/atreides/pages_helper.rb +17 -0
- data/app/helpers/admin/atreides/photos_helper.rb +14 -0
- data/app/helpers/admin/atreides/posts_helper.rb +41 -0
- data/app/helpers/admin/atreides/products_helper.rb +37 -0
- data/app/helpers/admin/atreides/sizes_helper.rb +4 -0
- data/app/helpers/admin/atreides/user_sessions_helper.rb +4 -0
- data/app/helpers/admin/atreides/users_helper.rb +8 -0
- data/app/helpers/admin/atreides/videos_helper.rb +4 -0
- data/app/helpers/atreides/admin_helper.rb +243 -0
- data/app/helpers/atreides/admin_home_helper.rb +4 -0
- data/app/helpers/atreides/application_helper.rb +210 -0
- data/app/helpers/atreides/home_helper.rb +4 -0
- data/app/helpers/atreides/posts_helper.rb +119 -0
- data/app/inputs/files_input.rb +13 -0
- data/app/inputs/price_input.rb +18 -0
- data/app/inputs/underline_input.rb +16 -0
- data/app/models/atreides/ability.rb +24 -0
- data/app/models/atreides/comment.rb +93 -0
- data/app/models/atreides/content_part.rb +107 -0
- data/app/models/atreides/feature.rb +90 -0
- data/app/models/atreides/github.rb +74 -0
- data/app/models/atreides/like.rb +35 -0
- data/app/models/atreides/line_item.rb +4 -0
- data/app/models/atreides/link.rb +32 -0
- data/app/models/atreides/message.rb +34 -0
- data/app/models/atreides/order.rb +209 -0
- data/app/models/atreides/page.rb +114 -0
- data/app/models/atreides/photo.rb +130 -0
- data/app/models/atreides/post.rb +271 -0
- data/app/models/atreides/product.rb +75 -0
- data/app/models/atreides/site.rb +59 -0
- data/app/models/atreides/size.rb +44 -0
- data/app/models/atreides/tag.rb +31 -0
- data/app/models/atreides/tweet.rb +123 -0
- data/app/models/atreides/user.rb +129 -0
- data/app/models/atreides/video.rb +206 -0
- data/app/models/atreides/vote.rb +43 -0
- data/app/models/fb_post_publisher_job.rb +72 -0
- data/app/models/settings.rb +19 -0
- data/app/models/tumblr_post_publisher_job.rb +75 -0
- data/app/models/tw_post_publisher_job.rb +54 -0
- data/app/views/admin/_edit_head_content.html.haml +2 -0
- data/app/views/admin/atreides/comments/_line.html.haml +60 -0
- data/app/views/admin/atreides/comments/_sidebar.html.haml +52 -0
- data/app/views/admin/atreides/comments/create.js.haml +1 -0
- data/app/views/admin/atreides/comments/index.html.haml +34 -0
- data/app/views/admin/atreides/content_parts/_form.html.haml +21 -0
- data/app/views/admin/atreides/content_parts/_photos.html.haml +18 -0
- data/app/views/admin/atreides/content_parts/_text.html.haml +1 -0
- data/app/views/admin/atreides/content_parts/_videos.html.haml +12 -0
- data/app/views/admin/atreides/content_parts/destroy.js.haml +3 -0
- data/app/views/admin/atreides/content_parts/edit.html.haml +0 -0
- data/app/views/admin/atreides/content_parts/new.html.haml +0 -0
- data/app/views/admin/atreides/content_parts/new.js.haml +11 -0
- data/app/views/admin/atreides/dropbox/_uploader.html.haml +134 -0
- data/app/views/admin/atreides/dropbox/list.html.haml +27 -0
- data/app/views/admin/atreides/dropbox/setup.html.haml +8 -0
- data/app/views/admin/atreides/features/_form.html.haml +60 -0
- data/app/views/admin/atreides/features/edit.html.haml +1 -0
- data/app/views/admin/atreides/features/index.html.haml +24 -0
- data/app/views/admin/atreides/features/new.html.haml +1 -0
- data/app/views/admin/atreides/github/index.html.haml +26 -0
- data/app/views/admin/atreides/github/show.html.haml +19 -0
- data/app/views/admin/atreides/likes/create.js.haml +2 -0
- data/app/views/admin/atreides/orders/_sidebar.html.haml +20 -0
- data/app/views/admin/atreides/orders/edit.html.haml +52 -0
- data/app/views/admin/atreides/orders/index.html.haml +8 -0
- data/app/views/admin/atreides/pages/_form.html.haml +31 -0
- data/app/views/admin/atreides/pages/edit.html.haml +3 -0
- data/app/views/admin/atreides/pages/index.html.haml +15 -0
- data/app/views/admin/atreides/pages/index.js.haml +4 -0
- data/app/views/admin/atreides/pages/new.html.haml +2 -0
- data/app/views/admin/atreides/photos/create.js.haml +18 -0
- data/app/views/admin/atreides/photos/destroy.js.haml +3 -0
- data/app/views/admin/atreides/posts/_archives.html.haml +19 -0
- data/app/views/admin/atreides/posts/_form.html.haml +66 -0
- data/app/views/admin/atreides/posts/_form_buttons.html.haml +9 -0
- data/app/views/admin/atreides/posts/_form_sidebar.html.haml +85 -0
- data/app/views/admin/atreides/posts/edit.html.haml +2 -0
- data/app/views/admin/atreides/posts/index.html.haml +24 -0
- data/app/views/admin/atreides/posts/index.js.haml +1 -0
- data/app/views/admin/atreides/posts/new.html.haml +2 -0
- data/app/views/admin/atreides/products/edit.html.haml +69 -0
- data/app/views/admin/atreides/products/index.html.haml +31 -0
- data/app/views/admin/atreides/sessions/new.html.haml +13 -0
- data/app/views/admin/atreides/user_sessions/new.html.haml +10 -0
- data/app/views/admin/atreides/users/_form.html.haml +19 -0
- data/app/views/admin/atreides/users/edit.html.haml +6 -0
- data/app/views/admin/atreides/users/index.html.haml +11 -0
- data/app/views/admin/atreides/users/new.html.haml +6 -0
- data/app/views/admin/atreides/users/show.html.haml +4 -0
- data/app/views/admin/atreides/videos/create.js.haml +9 -0
- data/app/views/admin/atreides/videos/destroy.js.haml +3 -0
- data/app/views/admin/common/_archive_sidebar.html.haml +29 -0
- data/app/views/admin/common/_list_table.html.erb +37 -0
- data/app/views/admin/common/_list_table_row.html.erb +18 -0
- data/app/views/admin/common/_pagination.html.erb +1 -0
- data/app/views/admin/common/_search_form.html.erb +6 -0
- data/app/views/admin/common/access_denied.html.haml +1 -0
- data/app/views/atreides/admin/_content_nav.html.haml +8 -0
- data/app/views/atreides/admin_home/_analytics.html.haml +93 -0
- data/app/views/atreides/admin_home/_fb_page_likes_analytics_tbody.haml +10 -0
- data/app/views/atreides/admin_home/_fb_page_views_analytics_tbody.haml +10 -0
- data/app/views/atreides/admin_home/_top_landing_pages_analytics_tbody.haml +14 -0
- data/app/views/atreides/admin_home/_top_referrers_analytics_tbody.haml +12 -0
- data/app/views/atreides/admin_home/_tweets_analytics_tbody.html.haml +8 -0
- data/app/views/atreides/admin_home/_visitors_analytics_tbody.html.haml +12 -0
- data/app/views/atreides/admin_home/index.html.haml +57 -0
- data/app/views/atreides/admin_home/search.html.haml +11 -0
- data/app/views/atreides/admin_home/setup.html.haml +15 -0
- data/app/views/atreides/common/_gallery_params.xml.erb +174 -0
- data/app/views/atreides/common/slideshow.xml.haml +6 -0
- data/app/views/atreides/errors/404.html.haml +10 -0
- data/app/views/atreides/errors/500.html.haml +4 -0
- data/app/views/atreides/home/index.html.haml +30 -0
- data/app/views/atreides/home/index.js.haml +1 -0
- data/app/views/atreides/home/robots.txt.erb +5 -0
- data/app/views/atreides/home/sitemap.xml.builder +35 -0
- data/app/views/atreides/pages/show.html.haml +3 -0
- data/app/views/atreides/posts/_archives.html.haml +19 -0
- data/app/views/atreides/posts/_featured_posts.html.haml +10 -0
- data/app/views/atreides/posts/_list.html.haml +9 -0
- data/app/views/atreides/posts/archives.html.haml +3 -0
- data/app/views/atreides/posts/archives.js.haml +1 -0
- data/app/views/atreides/posts/gallery_params.xml.haml +1 -0
- data/app/views/atreides/posts/index.atom.builder +22 -0
- data/app/views/atreides/posts/index.html.haml +13 -0
- data/app/views/atreides/posts/index.rss.builder +21 -0
- data/app/views/atreides/posts/show.html.haml +23 -0
- data/app/views/atreides/posts/tagged.html.haml +4 -0
- data/app/views/atreides/posts/tagged.js.haml +1 -0
- data/app/views/layouts/admin.html.haml +62 -0
- data/app/views/layouts/application.html.haml +37 -0
- data/app/views/layouts/atreides/application.html.erb +14 -0
- data/app/views/layouts/public.html.haml +39 -0
- data/config/cucumber.yml +11 -0
- data/config/locales/en.yml +236 -0
- data/config/locales/fr.yml +199 -0
- data/config/routes.rb +119 -0
- data/lib/assets/images/atreides/admin/add.png +0 -0
- data/lib/assets/images/atreides/admin/add_btn.png +0 -0
- data/lib/assets/images/atreides/admin/add_dashboard.png +0 -0
- data/lib/assets/images/atreides/admin/add_photo_button_sprite.png +0 -0
- data/lib/assets/images/atreides/admin/add_photos_btn.png +0 -0
- data/lib/assets/images/atreides/admin/background.png +0 -0
- data/lib/assets/images/atreides/admin/calendar.png +0 -0
- data/lib/assets/images/atreides/admin/chevron.gif +0 -0
- data/lib/assets/images/atreides/admin/chevron_overlay.png +0 -0
- data/lib/assets/images/atreides/admin/choose_photos_button_sprite.png +0 -0
- data/lib/assets/images/atreides/admin/content_bg.png +0 -0
- data/lib/assets/images/atreides/admin/content_bg_edit_form.png +0 -0
- data/lib/assets/images/atreides/admin/content_part_break.png +0 -0
- data/lib/assets/images/atreides/admin/content_part_drop_target.png +0 -0
- data/lib/assets/images/atreides/admin/content_part_icons.png +0 -0
- data/lib/assets/images/atreides/admin/content_part_photos.png +0 -0
- data/lib/assets/images/atreides/admin/content_part_text.png +0 -0
- data/lib/assets/images/atreides/admin/content_part_videos.png +0 -0
- data/lib/assets/images/atreides/admin/content_top_edit_form.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard-indicator.gif +0 -0
- data/lib/assets/images/atreides/admin/dashboard_controls_activity.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard_controls_customize.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard_controls_drafts.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard_controls_open.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard_controls_posts.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard_controls_queue.png +0 -0
- data/lib/assets/images/atreides/admin/dashboard_nav_border.png +0 -0
- data/lib/assets/images/atreides/admin/delete_bg.png +0 -0
- data/lib/assets/images/atreides/admin/down_arrow.png +0 -0
- data/lib/assets/images/atreides/admin/dropbox_big.jpg +0 -0
- data/lib/assets/images/atreides/admin/dropbox_btn.png +0 -0
- data/lib/assets/images/atreides/admin/dropbox_folder.png +0 -0
- data/lib/assets/images/atreides/admin/dropbox_icon.gif +0 -0
- data/lib/assets/images/atreides/admin/dropbox_icon.png +0 -0
- data/lib/assets/images/atreides/admin/expand_collapse.png +0 -0
- data/lib/assets/images/atreides/admin/form_sidebar_divider.png +0 -0
- data/lib/assets/images/atreides/admin/grey_hatch_bg.png +0 -0
- data/lib/assets/images/atreides/admin/header.png +0 -0
- data/lib/assets/images/atreides/admin/icon_dropbox.gif +0 -0
- data/lib/assets/images/atreides/admin/icon_home.gif +0 -0
- data/lib/assets/images/atreides/admin/input_bg.gif +0 -0
- data/lib/assets/images/atreides/admin/large_loading.gif +0 -0
- data/lib/assets/images/atreides/admin/new_content_icons.png +0 -0
- data/lib/assets/images/atreides/admin/off.png +0 -0
- data/lib/assets/images/atreides/admin/on.png +0 -0
- data/lib/assets/images/atreides/admin/page_icon.png +0 -0
- data/lib/assets/images/atreides/admin/permalink.png +0 -0
- data/lib/assets/images/atreides/admin/photos-display-type-gallery.png +0 -0
- data/lib/assets/images/atreides/admin/photos-display-type-photos.png +0 -0
- data/lib/assets/images/atreides/admin/product.png +0 -0
- data/lib/assets/images/atreides/admin/remove.png +0 -0
- data/lib/assets/images/atreides/admin/resize.png +0 -0
- data/lib/assets/images/atreides/admin/save_btn.png +0 -0
- data/lib/assets/images/atreides/admin/search_icon.png +0 -0
- data/lib/assets/images/atreides/admin/select_arrows.png +0 -0
- data/lib/assets/images/atreides/admin/slider.png +0 -0
- data/lib/assets/images/atreides/admin/slider_center.png +0 -0
- data/lib/assets/images/atreides/admin/slider_left.png +0 -0
- data/lib/assets/images/atreides/admin/slider_right.png +0 -0
- data/lib/assets/images/atreides/admin/sprite.png +0 -0
- data/lib/assets/images/atreides/admin/upload_btn.png +0 -0
- data/lib/assets/images/atreides/admin/video_bg.png +0 -0
- data/lib/assets/images/atreides/blank.gif +0 -0
- data/lib/assets/images/atreides/closelabel.png +0 -0
- data/lib/assets/images/atreides/loading.gif +0 -0
- data/lib/assets/images/atreides/sprite.png +0 -0
- data/lib/assets/images/atreides/tipsy.gif +0 -0
- data/lib/atreides.rb +82 -0
- data/lib/atreides/base/aasmstates.rb +117 -0
- data/lib/atreides/base/base.rb +40 -0
- data/lib/atreides/base/taggable.rb +43 -0
- data/lib/atreides/base/validation.rb +23 -0
- data/lib/atreides/configuration.rb +61 -0
- data/lib/atreides/engine.rb +41 -0
- data/lib/atreides/extendable.rb +12 -0
- data/lib/atreides/i18n_helpers.rb +65 -0
- data/lib/atreides/railties/tasks.rake +68 -0
- data/lib/atreides/time_formats.rb +19 -0
- data/lib/atreides/validators.rb +15 -0
- data/lib/atreides/version.rb +4 -0
- data/lib/generators/atreides/USAGE +0 -0
- data/lib/generators/atreides/atreides_generator.rb +58 -0
- data/lib/generators/templates/Procfile +2 -0
- data/lib/generators/templates/add_role_to_users.rb +16 -0
- data/lib/generators/templates/add_userid_to_resources.rb +15 -0
- data/lib/generators/templates/create_comments.rb +19 -0
- data/lib/generators/templates/create_content_parts.rb +66 -0
- data/lib/generators/templates/create_features.rb +21 -0
- data/lib/generators/templates/create_likes.rb +16 -0
- data/lib/generators/templates/create_line_items.rb +21 -0
- data/lib/generators/templates/create_links.rb +16 -0
- data/lib/generators/templates/create_messages.rb +24 -0
- data/lib/generators/templates/create_orders.rb +31 -0
- data/lib/generators/templates/create_pages.rb +31 -0
- data/lib/generators/templates/create_photos.rb +22 -0
- data/lib/generators/templates/create_posts.rb +38 -0
- data/lib/generators/templates/create_products.rb +24 -0
- data/lib/generators/templates/create_sessions.rb +16 -0
- data/lib/generators/templates/create_sites.rb +35 -0
- data/lib/generators/templates/create_sizes.rb +16 -0
- data/lib/generators/templates/create_tweets.rb +25 -0
- data/lib/generators/templates/create_videos.rb +24 -0
- data/lib/generators/templates/create_votes.rb +20 -0
- data/lib/generators/templates/delayed_job.rb +5 -0
- data/lib/generators/templates/devise_create_users.rb +42 -0
- data/lib/generators/templates/disqussion.rb +30 -0
- data/lib/generators/templates/em-net-http_override.rb +74 -0
- data/lib/generators/templates/initializer.rb +21 -0
- data/lib/generators/templates/new_relic.rb +6 -0
- data/lib/generators/templates/oembed.yml +63 -0
- data/lib/generators/templates/settings.yml +110 -0
- data/lib/generators/templates/string_extensions.rb +20 -0
- data/lib/generators/templates/unicorn.rb +2 -0
- data/lib/tasks/atreides_tasks.rake +4 -0
- data/lib/tasks/cucumber.rake +58 -0
- data/lib/tasks/tasks.rake +403 -0
- data/lib/tasks/yard.rake +18 -0
- 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,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
|