Skip to content

Instantly share code, notes, and snippets.

@codeimpossible
Created September 27, 2012 18:13
Show Gist options
  • Save codeimpossible/3795496 to your computer and use it in GitHub Desktop.
Save codeimpossible/3795496 to your computer and use it in GitHub Desktop.
Factory pattern in Ruby
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
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
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