Conversion in a gem finished

* specs are working again
* added railitie
* added missing migration (acts-as-taggable)
* cleanups
This commit is contained in:
Marc Remolt 2011-06-02 14:41:31 +02:00
parent dae4c2ea0a
commit a45f502f44
25 changed files with 476 additions and 285 deletions

1
.rspec Normal file
View File

@ -0,0 +1 @@
--color

View File

@ -5,9 +5,12 @@ gem "rails", "3.0.7"
gem "sqlite3"
gem "rspec-rails", ">= 2.6.0"
gem "database_cleaner"
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
# gem 'ruby-debug'
# gem 'ruby-debug19'
gem 'refinerycms'
gem 'refinerycms-blog'
gem 'refinerycms-wordpress-import', :path => './'

View File

@ -4,7 +4,7 @@ PATH
refinerycms-wordpress-import (0.0.1)
nokogiri (~> 1.4.4)
refinerycms (~> 1.0.0)
refinerycms-blog (~> 1.3.2)
refinerycms-blog (~> 1.5.2)
GEM
remote: http://rubygems.org/
@ -36,6 +36,7 @@ GEM
activemodel (= 3.0.7)
activesupport (= 3.0.7)
activesupport (3.0.7)
acts-as-taggable-on (2.0.6)
acts_as_indexed (0.7.2)
arel (2.0.10)
awesome_nested_set (2.0.0)
@ -43,6 +44,7 @@ GEM
babosa (0.3.4)
bcrypt-ruby (2.1.4)
builder (2.1.2)
database_cleaner (0.6.7)
devise (1.3.4)
bcrypt-ruby (~> 2.1.2)
orm_adapter (~> 0.0.3)
@ -104,9 +106,11 @@ GEM
friendly_id_globalize3 (~> 3.2.1)
refinerycms-core (= 1.0.0)
refinerycms-base (1.0.0)
refinerycms-blog (1.3.2)
refinerycms-blog (1.5.2)
acts-as-taggable-on
filters_spam (~> 0.2)
refinerycms (>= 0.9.8)
refinerycms-core (~> 1.0.0)
seo_meta (~> 1.1.0)
refinerycms-core (1.0.0)
acts_as_indexed (~> 0.7)
awesome_nested_set (~> 2.0)
@ -166,7 +170,10 @@ PLATFORMS
ruby
DEPENDENCIES
database_cleaner
rails (= 3.0.7)
refinerycms
refinerycms-blog
refinerycms-wordpress-import!
rspec-rails (>= 2.6.0)
sqlite3

View File

@ -0,0 +1,7 @@
module Refinery
module WordPress
end
end
require 'wordpress'

View File

@ -1,8 +1,7 @@
require 'refinerycms'
require 'refinerycms-blog'
module Refinery
module WordPress
end
end
require 'wordpress'

View File

@ -3,56 +3,36 @@ require 'wordpress'
namespace :wordpress do
desc "Reset the blog relevant tables for a clean import"
task :reset do
task :reset_blog do
Rake::Task["environment"].invoke
%w(blog_categories blog_posts).each do |table_name|
%w(taggings tags blog_comments blog_categories blog_posts).each do |table_name|
p "Truncating #{table_name} ..."
ActiveRecord::Base.connection.execute "TRUNCATE TABLE #{table_name}"
ActiveRecord::Base.connection.execute "DELETE FROM #{table_name}"
end
end
desc "Import data from a WordPress XML dump"
desc "import blog data from a Refinery::WordPress XML dump"
task :import_blog, :file_name do |task, params|
Rake::Task["environment"].invoke
dump = Refinery::WordPress::Dump.new(params[:file_name])
dump.authors.each(&:to_refinery)
dump.posts.each(&:to_refinery)
end
desc "Import data from a Refinery::WordPress XML dump"
task :import, :file_name do |task, params|
Rake::Task["environment"].invoke
file_name = File.absolute_path(params[:file_name])
unless File.file?(file_name) && File.readable?(file_name)
raise "Given file '#{file_name}' no file or not readable."
end
file = File.open(file_name)
doc = Nokogiri::XML(file)
file.close
p "Importing blog categories ..."
doc.xpath("//wp:category/wp:cat_name").each do |category|
BlogCategory.exists?(:title => category.text) || BlogCategory.create!(:title => category.text)
end
doc.xpath("//wp:tag/wp:tag_slug").each do |tag|
p tag.text
end
doc.xpath("//item[wp:post_type = 'page']").each do |post|
title = post.xpath("title").text
body = post.xpath("content:encoded").text
author = post.xpath("dc:creator").text
published_at = DateTime.parse(post.xpath("wp:post_date").text)
tags = post.xpath("category[@domain='tag'][not(@nicename)]").collect {|tag| tag.text }
tag_list = tags.join(', ')
categories = post.xpath("category[not(@*)]").collect {|cat| cat.text }
p '*' * 100
p title
p author
p published_at
p tag_list
p categories
end
end
desc "New import (testing)"
@ -64,7 +44,7 @@ namespace :wordpress do
raise "Given file '#{file_name}' no file or not readable."
end
dump = WordPress::Dump.new(file_name)
dump = Refinery::WordPress::Dump.new(file_name)
p dump.authors
p dump.pages
dump.posts.each do |post|
@ -77,7 +57,7 @@ namespace :wordpress do
end
desc "Import data from a WordPress XML dump into a clean database (reset first)"
desc "Import data from a Refinery::WordPress XML dump into a clean database (reset first)"
task :import_clean, :file_name do |task, params|
Rake::Task["wordpress:reset"].invoke
Rake::Task["wordpress:import"].invoke(params[:file_name])

View File

@ -1,7 +1,9 @@
module WordPress
module Refinery
module WordPress
end
end
require 'nokogiri'
require 'wordpress/author'
require 'wordpress/tag'
require 'wordpress/category'
@ -9,3 +11,5 @@ require 'wordpress/page'
require 'wordpress/post'
require 'wordpress/comment'
require 'wordpress/dump'
require "wordpress/railtie"

View File

@ -1,4 +1,5 @@
module WordPress
module Refinery
module WordPress
class Author
attr_reader :author_node
@ -32,4 +33,5 @@ module WordPress
user
end
end
end
end

View File

@ -1,4 +1,5 @@
module WordPress
module Refinery
module WordPress
class Category
attr_accessor :name
@ -14,4 +15,5 @@ module WordPress
BlogCategory.find_or_create_by_title(name)
end
end
end
end

View File

@ -1,4 +1,5 @@
module WordPress
module Refinery
module WordPress
class Comment
attr_reader :node
@ -43,4 +44,5 @@ module WordPress
comment
end
end
end
end

View File

@ -1,41 +1,46 @@
require 'nokogiri'
module WordPress
module Refinery
module WordPress
class Dump
attr_reader :doc
def initialize(file_name)
file_name = File.absolute_path(file_name)
raise "Given file '#{file_name}' no file or not readable." \
unless File.file?(file_name) && File.readable?(file_name)
file = File.open(file_name)
@doc = Nokogiri::XML(file)
end
def authors
doc.xpath("//wp:author").collect do |author|
WordPress::Author.new(author)
Author.new(author)
end
end
def pages
doc.xpath("//item[wp:post_type = 'page']").collect do |page|
WordPress::Page.new(page)
Page.new(page)
end
end
def posts
doc.xpath("//item[wp:post_type = 'post']").collect do |post|
WordPress::Post.new(post)
Post.new(post)
end
end
def tags
doc.xpath("//wp:tag/wp:tag_slug").collect do |tag|
WordPress::Tag.new(tag.text)
Tag.new(tag.text)
end
end
def categories
doc.xpath("//wp:category/wp:cat_name").collect do |category|
WordPress::Category.new(category.text)
Category.new(category.text)
end
end
end
end

View File

@ -1,4 +1,5 @@
module WordPress
module Refinery
module WordPress
class Page
attr_reader :node
@ -54,4 +55,5 @@ module WordPress
page
end
end
end
end

View File

@ -1,8 +1,9 @@
module WordPress
module Refinery
module WordPress
class Post < Page
def tags
node.xpath("category[@domain='post_tag']").collect do |tag_node|
WordPress::Tag.new(tag_node.text)
Tag.new(tag_node.text)
end
end
@ -12,26 +13,29 @@ module WordPress
def categories
node.xpath("category[@domain='category']").collect do |cat|
WordPress::Category.new(cat.text)
Category.new(cat.text)
end
end
def comments
node.xpath("wp:comment").collect do |comment_node|
WordPress::Comment.new(comment_node)
Comment.new(comment_node)
end
end
def to_refinery
user = User.find_by_username creator
user = ::User.find_by_username creator
raise "Referenced User doesn't exist! Make sure the authors are imported first." \
unless user
post = BlogPost.create! :title => title, :body => content, :draft => draft?,
post = BlogPost.new
post = ::BlogPost.create! :title => title, :body => content, :draft => draft?,
:published_at => post_date, :created_at => post_date, :author => user,
:tag_list => tag_list
BlogPost.transaction do
::BlogPost.transaction do
categories.each do |category|
post.categories << category.to_refinery
end
@ -46,4 +50,5 @@ module WordPress
post
end
end
end
end

10
lib/wordpress/railtie.rb Normal file
View File

@ -0,0 +1,10 @@
module Refinery
module WordPress
class Railtie < Rails::Railtie
rake_tasks do
load "tasks/wordpress.rake"
end
end
end
end

View File

@ -1,4 +1,5 @@
module WordPress
module Refinery
module WordPress
class Tag
attr_accessor :name
@ -11,8 +12,9 @@ module WordPress
end
def to_refinery
ActsAsTaggableOn::Tag.find_or_create_by_name(name)
::ActsAsTaggableOn::Tag.find_or_create_by_name(name)
end
end
end
end

View File

@ -3,11 +3,17 @@
Gem::Specification.new do |s|
s.name = "refinerycms-wordpress-import"
s.summary = "Import WordPress XML dumps into refinerycms(-blog)."
s.description = "Insert Refinerycms-wordpress-import description."
s.files = Dir["{app,lib,config}/**/*"] + ["MIT-LICENSE", "Rakefile", "Gemfile", "README.rdoc"]
s.description = "This gem imports a WordPress Dump into refinerycms (Page, User) and refinerycms-blog (BlogPost, BlogCategory, Tag, BlogComment)"
s.version = "0.0.1"
s.authors = ['Marc Remolt']
s.date = "2011-06-02"
s.add_dependency 'refinerycms', '~> 1.0.0'
s.add_dependency 'refinerycms-blog', '~> 1.3.2'
s.add_dependency 'refinerycms-blog', '~> 1.5.2'
s.add_dependency 'nokogiri', '~> 1.4.4'
#s.add_dependency 'acts-as-taggable-on'
s.add_development_dependency 'database_cleaner'
s.files = Dir["{app,lib,config}/**/*"] + ["MIT-LICENSE", "Rakefile", "Gemfile", "README.rdoc"]
end

View File

@ -1,13 +1,8 @@
require File.expand_path('../boot', __FILE__)
require "active_model/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_view/railtie"
require "action_mailer/railtie"
require 'rails/all'
Bundler.require
require "refinerycms_wordpress_import"
module Dummy
class Application < Rails::Application

View File

@ -6,5 +6,3 @@ if File.exist?(gemfile)
require 'bundler'
Bundler.setup
end
$:.unshift File.expand_path('../../../../lib', __FILE__)

View File

@ -0,0 +1,20 @@
login: &login
adapter: mysql2
host: localhost
username: root
password:
development: &development
database: your_local_database
<<: *login
test: &test
database: your_test_database
<<: *login
production: &production
adapter: mysql2
host: localhost
database: your_production_database
username: your_production_database_login
password: your_production_database_password

View File

@ -0,0 +1,57 @@
# PostgreSQL. Versions 7.4 and 8.x are supported.
#
# Install the ruby-postgres driver:
# gem install ruby-postgres
# On Mac OS X:
# gem install ruby-postgres -- --include=/usr/local/pgsql
# On Windows:
# gem install ruby-postgres
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
login: &login
adapter: postgresql
encoding: unicode
username: postgres
password: postgres
pool: 5
development: &development
database: your_local_database
<<: *login
# Connect on a TCP socket. Omitted by default since the client uses a
# domain socket that doesn't need configuration. Windows does not have
# domain sockets, so uncomment these lines.
#host: localhost
#port: 5432
# Schema search path. The server defaults to $user,public
#schema_search_path: myapp,sharedapp,public
# Minimum log levels, in increasing order:
# debug5, debug4, debug3, debug2, debug1,
# log, notice, warning, error, fatal, and panic
# The server defaults to notice.
#min_messages: warning
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test: &test
database: your_test_database
<<: *login
# Warning: The database defined as "cucumber" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
cucumber: &cucumber
database: your_cucumber_database
<<: *login
production: &production
adapter: postgresql
encoding: unicode
pool: 5
database: your_production_database
username: your_production_database_login
password: your_production_database_password

View File

@ -0,0 +1,26 @@
# SQLite version 3.x
development:
adapter: <%= "jdbc" if defined?(JRUBY_PLATFORM) %>sqlite3
database: db/development.sqlite3
timeout: 5000
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: <%= "jdbc" if defined?(JRUBY_PLATFORM) %>sqlite3
database: db/test.sqlite3
timeout: 5000
# Warning: The database defined as 'cucumber' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
cucumber:
adapter: <%= "jdbc" if defined?(JRUBY_PLATFORM) %>sqlite3
database: db/cucumber.sqlite3
timeout: 5000
production:
adapter: <%= "jdbc" if defined?(JRUBY_PLATFORM) %>sqlite3
database: db/production.sqlite3
timeout: 5000

View File

@ -0,0 +1,28 @@
class ActsAsTaggableOnMigration < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.string :name
end
create_table :taggings do |t|
t.references :tag
# You should make sure that the column created is
# long enough to store the required class names.
t.references :taggable, :polymorphic => true
t.references :tagger, :polymorphic => true
t.string :context
t.datetime :created_at
end
add_index :taggings, :tag_id
add_index :taggings, [:taggable_id, :taggable_type, :context]
end
def self.down
drop_table :taggings
drop_table :tags
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20110601190333) do
ActiveRecord::Schema.define(:version => 20110602094445) do
create_table "blog_categories", :force => true do |t|
t.string "title"
@ -184,6 +184,23 @@ ActiveRecord::Schema.define(:version => 20110601190333) do
add_index "slugs", ["name", "sluggable_type", "scope", "sequence"], :name => "index_slugs_on_n_s_s_and_s", :unique => true
add_index "slugs", ["sluggable_id"], :name => "index_slugs_on_sluggable_id"
create_table "taggings", :force => true do |t|
t.integer "tag_id"
t.integer "taggable_id"
t.string "taggable_type"
t.integer "tagger_id"
t.string "tagger_type"
t.string "context"
t.datetime "created_at"
end
add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
create_table "tags", :force => true do |t|
t.string "name"
end
create_table "user_plugins", :force => true do |t|
t.integer "user_id"
t.string "name"

View File

@ -1,12 +1,11 @@
require 'spec_helper'
require 'wordpress'
describe WordPress::Dump, :type => :model do
describe Refinery::WordPress::Dump, :type => :model do
let(:file_name) { File.realpath(File.join(File.dirname(__FILE__), '../../fixtures/wordpress_dump.xml')) }
let(:dump) { WordPress::Dump.new(file_name) }
let(:dump) { Refinery::WordPress::Dump.new(file_name) }
it "should create a Dump object given a xml file" do
dump.should be_a WordPress::Dump
dump.should be_a Refinery::WordPress::Dump
end
it "should include a Nokogiri::XML object" do
@ -15,8 +14,8 @@ describe WordPress::Dump, :type => :model do
describe "#tags" do
let(:tags) do
[ WordPress::Tag.new('css'), WordPress::Tag.new('html'),
WordPress::Tag.new('php'), WordPress::Tag.new('ruby')]
[ Refinery::WordPress::Tag.new('css'), Refinery::WordPress::Tag.new('html'),
Refinery::WordPress::Tag.new('php'), Refinery::WordPress::Tag.new('ruby')]
end
it "should return all included tags" do
@ -34,7 +33,7 @@ describe WordPress::Dump, :type => :model do
end
it "should create a ActsAsTaggableOn::Tag" do
ActsAsTaggableOn::Tag.should have(1).record
::ActsAsTaggableOn::Tag.should have(1).record
end
it "should copy the name over to the Tag object" do
@ -46,8 +45,8 @@ describe WordPress::Dump, :type => :model do
describe "#categories" do
let(:categories) do
[ WordPress::Category.new('Rant'), WordPress::Category.new('Tutorials'),
WordPress::Category.new('Uncategorized') ]
[ Refinery::WordPress::Category.new('Rant'), Refinery::WordPress::Category.new('Tutorials'),
Refinery::WordPress::Category.new('Uncategorized') ]
end
it "should return all included categories" do
@ -108,7 +107,7 @@ describe WordPress::Dump, :type => :model do
Page.should have(@count + 1).record
end
it "should copy the attributes from WordPress::Page" do
it "should copy the attributes from Refinery::WordPress::Page" do
@page.title.should == page.title
@page.draft.should == page.draft?
@page.created_at.should == page.post_date
@ -143,7 +142,7 @@ describe WordPress::Dump, :type => :model do
@user.should be_persisted
end
it "should have copied the attributes from WordPress::Author" do
it "should have copied the attributes from Refinery::WordPress::Author" do
author.login.should == @user.username
author.email.should == @user.email
end
@ -172,15 +171,15 @@ describe WordPress::Dump, :type => :model do
describe "#categories" do
it { post.categories.should have(1).category }
it { post.categories.first.should == WordPress::Category.new('Rant') }
it { post.categories.first.should == Refinery::WordPress::Category.new('Rant') }
end
describe "#tags" do
it { post.tags.should have(3).tags }
it { post.tags.should include(WordPress::Tag.new('css')) }
it { post.tags.should include(WordPress::Tag.new('html')) }
it { post.tags.should include(WordPress::Tag.new('php')) }
it { post.tags.should include(Refinery::WordPress::Tag.new('css')) }
it { post.tags.should include(Refinery::WordPress::Tag.new('html')) }
it { post.tags.should include(Refinery::WordPress::Tag.new('php')) }
end
it { post.tag_list.should == 'css,html,php' }
@ -212,7 +211,7 @@ describe WordPress::Dump, :type => :model do
@comment.should be_new_record
end
it "should copy the attributes from WordPress::Comment" do
it "should copy the attributes from Refinery::WordPress::Comment" do
@comment.name.should == comment.author
@comment.email.should == comment.email
@comment.body.should == comment.content
@ -233,7 +232,7 @@ describe WordPress::Dump, :type => :model do
it { BlogPost.should have(1).record }
it "should copy the attributes from WordPress::Page" do
it "should copy the attributes from Refinery::WordPress::Page" do
@post.title.should == post.title
@post.body.should == post.content
@post.draft.should == post.draft?
@ -242,11 +241,11 @@ describe WordPress::Dump, :type => :model do
@post.author.username.should == post.creator
end
it "should assign a category for each WordPress::Category" do
it "should assign a category for each Refinery::WordPress::Category" do
@post.categories.should have(post.categories.count).records
end
it "should assign a comment for each WordPress::Comment" do
it "should assign a comment for each Refinery::WordPress::Comment" do
@post.comments.should have(post.comments.count).records
end

View File

@ -4,6 +4,7 @@ ENV["RAILS_ENV"] = "test"
require File.expand_path("../dummy/config/environment.rb", __FILE__)
require "rails/test_help"
require "rspec/rails"
require "database_cleaner"
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
@ -25,4 +26,17 @@ RSpec.configure do |config|
# == Mock Framework
config.mock_with :rspec
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end