Created
September 27, 2012 18:13
-
-
Save codeimpossible/3795496 to your computer and use it in GitHub Desktop.
Factory pattern in Ruby
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class BlogPostImporter | |
@@subclasses = { } | |
def self.create type | |
c = @@subclasses[type] | |
if c | |
c.new | |
else | |
raise "Bad importer type: #{type}" | |
end | |
end | |
def self.register_importer name | |
@@subclasses[name] = self | |
end | |
end | |
def BlogPostImporter name, superclass=BlogPostImporter, &block | |
Class.new(superclass, &block).register_importer(name) | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Admin::ImportsController < Admin::BaseController | |
def new | |
end | |
def create | |
upload = params[:export_file] | |
content = upload.is_a?(StringIO) ? upload.read : File.read(upload.local_path) | |
importer_type = params[:import_type].parameterize.underscore.to_sym | |
post_type = params[:post_type].parameterize.underscore.to_sym | |
date_type = params[:post_date].parameterize.underscore.to_sym | |
# load the blog post importer from the factory | |
importer = BlogPostImporter.create importer_type | |
@result = importer.import content, post_type, date_type | |
flash[:notice] = @result | |
redirect_to admin_path | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require File.expand_path('../blog_post_importer', __FILE__) | |
require 'rexml/document' | |
BlogPostImporter :wordpress do | |
def import(content, import_types = :all, date_type = :original) | |
doc = REXML::Document.new(content) | |
added = 0 | |
ignored = 0 | |
# loop through each post | |
s = Time.now | |
doc.elements.each('//item') do |ele| | |
if ele.get_text("wp:post_type") == "post" || ele.get_text("wp:post_type") == "draft" # we only do posts | |
draft = ele.get_text("wp:status") == "draft" | |
should_save = (import_types == :all) || (import_types == :published && !draft) || (import_types == :draft && draft) | |
if should_save | |
make_post ele, date_type == :original | |
added += 1 | |
else | |
ignored += 1 | |
end | |
end | |
end | |
bench = Time.now - s | |
"#{added} posts were added to your blog, #{ignored} posts were skipped. It took #{bench} seconds." | |
end | |
def make_post(ele, use_original_date) | |
@original_date = Date.parse(ele.get_text("wp:post_date").to_s) | |
post = Post.new :title => ele.get_text("title").to_s, | |
:summary => ele.get_text("excerpt:encoded").to_s, | |
:body_html => ele.get_text("content:encoded").to_s | |
post.created_at = @original_date if use_original_date | |
post.save | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment