capitalist-acts-as-importable 1.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/Gemfile +18 -0
- data/Gemfile.lock +129 -0
- data/README.textile +8 -0
- data/Rakefile +50 -0
- data/VERSION +1 -0
- data/capitalist-acts-as-importable.gemspec +83 -0
- data/init.rb +4 -0
- data/lib/acts_as_importable.rb +77 -0
- data/lib/core_extensions.rb +17 -0
- data/spec/acts_as_importable_spec.rb +117 -0
- data/spec/database.yml +21 -0
- data/spec/schema.rb +13 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +50 -0
- data/tasks/acts_as_importable_tasks.rake +4 -0
- metadata +220 -0
data/Gemfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem "rails", "3.0.3"
|
5
|
+
gem "capybara", ">= 0.4.0"
|
6
|
+
gem "sqlite3-ruby", :require => "sqlite3"
|
7
|
+
gem "rspec-rails", ">= 2.0.0.beta"
|
8
|
+
gem "bundler", "~> 1.0.0"
|
9
|
+
gem "jeweler", "~> 1.5.2"
|
10
|
+
gem "rcov", ">= 0"
|
11
|
+
gem "awesome_print"
|
12
|
+
gem "mysql2"
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
|
17
|
+
# gem 'ruby-debug'
|
18
|
+
# gem 'ruby-debug19'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
abstract (1.0.0)
|
5
|
+
actionmailer (3.0.3)
|
6
|
+
actionpack (= 3.0.3)
|
7
|
+
mail (~> 2.2.9)
|
8
|
+
actionpack (3.0.3)
|
9
|
+
activemodel (= 3.0.3)
|
10
|
+
activesupport (= 3.0.3)
|
11
|
+
builder (~> 2.1.2)
|
12
|
+
erubis (~> 2.6.6)
|
13
|
+
i18n (~> 0.4)
|
14
|
+
rack (~> 1.2.1)
|
15
|
+
rack-mount (~> 0.6.13)
|
16
|
+
rack-test (~> 0.5.6)
|
17
|
+
tzinfo (~> 0.3.23)
|
18
|
+
activemodel (3.0.3)
|
19
|
+
activesupport (= 3.0.3)
|
20
|
+
builder (~> 2.1.2)
|
21
|
+
i18n (~> 0.4)
|
22
|
+
activerecord (3.0.3)
|
23
|
+
activemodel (= 3.0.3)
|
24
|
+
activesupport (= 3.0.3)
|
25
|
+
arel (~> 2.0.2)
|
26
|
+
tzinfo (~> 0.3.23)
|
27
|
+
activeresource (3.0.3)
|
28
|
+
activemodel (= 3.0.3)
|
29
|
+
activesupport (= 3.0.3)
|
30
|
+
activesupport (3.0.3)
|
31
|
+
arel (2.0.7)
|
32
|
+
awesome_print (0.3.1)
|
33
|
+
builder (2.1.2)
|
34
|
+
capybara (0.4.1.1)
|
35
|
+
celerity (>= 0.7.9)
|
36
|
+
culerity (>= 0.2.4)
|
37
|
+
mime-types (>= 1.16)
|
38
|
+
nokogiri (>= 1.3.3)
|
39
|
+
rack (>= 1.0.0)
|
40
|
+
rack-test (>= 0.5.4)
|
41
|
+
selenium-webdriver (>= 0.0.27)
|
42
|
+
xpath (~> 0.1.3)
|
43
|
+
celerity (0.8.7)
|
44
|
+
childprocess (0.1.6)
|
45
|
+
ffi (~> 0.6.3)
|
46
|
+
culerity (0.2.15)
|
47
|
+
diff-lcs (1.1.2)
|
48
|
+
erubis (2.6.6)
|
49
|
+
abstract (>= 1.0.0)
|
50
|
+
ffi (0.6.3)
|
51
|
+
rake (>= 0.8.7)
|
52
|
+
git (1.2.5)
|
53
|
+
i18n (0.5.0)
|
54
|
+
jeweler (1.5.2)
|
55
|
+
bundler (~> 1.0.0)
|
56
|
+
git (>= 1.2.5)
|
57
|
+
rake
|
58
|
+
json_pure (1.5.1)
|
59
|
+
mail (2.2.15)
|
60
|
+
activesupport (>= 2.3.6)
|
61
|
+
i18n (>= 0.4.0)
|
62
|
+
mime-types (~> 1.16)
|
63
|
+
treetop (~> 1.4.8)
|
64
|
+
mime-types (1.16)
|
65
|
+
mysql2 (0.2.6)
|
66
|
+
nokogiri (1.4.4)
|
67
|
+
polyglot (0.3.1)
|
68
|
+
rack (1.2.1)
|
69
|
+
rack-mount (0.6.13)
|
70
|
+
rack (>= 1.0.0)
|
71
|
+
rack-test (0.5.7)
|
72
|
+
rack (>= 1.0)
|
73
|
+
rails (3.0.3)
|
74
|
+
actionmailer (= 3.0.3)
|
75
|
+
actionpack (= 3.0.3)
|
76
|
+
activerecord (= 3.0.3)
|
77
|
+
activeresource (= 3.0.3)
|
78
|
+
activesupport (= 3.0.3)
|
79
|
+
bundler (~> 1.0)
|
80
|
+
railties (= 3.0.3)
|
81
|
+
railties (3.0.3)
|
82
|
+
actionpack (= 3.0.3)
|
83
|
+
activesupport (= 3.0.3)
|
84
|
+
rake (>= 0.8.7)
|
85
|
+
thor (~> 0.14.4)
|
86
|
+
rake (0.8.7)
|
87
|
+
rcov (0.9.9)
|
88
|
+
rspec (2.4.0)
|
89
|
+
rspec-core (~> 2.4.0)
|
90
|
+
rspec-expectations (~> 2.4.0)
|
91
|
+
rspec-mocks (~> 2.4.0)
|
92
|
+
rspec-core (2.4.0)
|
93
|
+
rspec-expectations (2.4.0)
|
94
|
+
diff-lcs (~> 1.1.2)
|
95
|
+
rspec-mocks (2.4.0)
|
96
|
+
rspec-rails (2.4.1)
|
97
|
+
actionpack (~> 3.0)
|
98
|
+
activesupport (~> 3.0)
|
99
|
+
railties (~> 3.0)
|
100
|
+
rspec (~> 2.4.0)
|
101
|
+
rubyzip (0.9.4)
|
102
|
+
selenium-webdriver (0.1.2)
|
103
|
+
childprocess (~> 0.1.5)
|
104
|
+
ffi (~> 0.6.3)
|
105
|
+
json_pure
|
106
|
+
rubyzip
|
107
|
+
sqlite3 (1.3.3)
|
108
|
+
sqlite3-ruby (1.3.3)
|
109
|
+
sqlite3 (>= 1.3.3)
|
110
|
+
thor (0.14.6)
|
111
|
+
treetop (1.4.9)
|
112
|
+
polyglot (>= 0.3.1)
|
113
|
+
tzinfo (0.3.24)
|
114
|
+
xpath (0.1.3)
|
115
|
+
nokogiri (~> 1.3)
|
116
|
+
|
117
|
+
PLATFORMS
|
118
|
+
ruby
|
119
|
+
|
120
|
+
DEPENDENCIES
|
121
|
+
awesome_print
|
122
|
+
bundler (~> 1.0.0)
|
123
|
+
capybara (>= 0.4.0)
|
124
|
+
jeweler (~> 1.5.2)
|
125
|
+
mysql2
|
126
|
+
rails (= 3.0.3)
|
127
|
+
rcov
|
128
|
+
rspec-rails (>= 2.0.0.beta)
|
129
|
+
sqlite3-ruby
|
data/README.textile
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
h1. Acts as Importable
|
2
|
+
|
3
|
+
This gem is from Tim Riley's old plugin for Rails. I've updated it to use with Rails 3. It taste's good with my "model_mill":https://rubygems.org/gems/model_mill/ gem.
|
4
|
+
|
5
|
+
See "Importing Legacy Data in Rails":http://openmonkey.com/articles/2009/05/importing-legacy-data-in-rails for an introduction and documentation.
|
6
|
+
|
7
|
+
Copyright (c) 2009 Tim Riley, released under the MIT license
|
8
|
+
Some bits Copyright (c) 2011 Joe Martinez, released under the same
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'rake'
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |gem|
|
14
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
+
gem.name = "capitalist-acts-as-importable"
|
16
|
+
gem.homepage = "http://github.com/capitalist/acts-as-importable"
|
17
|
+
gem.license = "MIT"
|
18
|
+
gem.summary = %Q{Helps transfer records from one database to another}
|
19
|
+
gem.description = %Q{Allows you to connect to a second database and systematically transfer those records}
|
20
|
+
gem.email = "joe@joemartinez.name"
|
21
|
+
gem.authors = ["Tim Riley", "Joe Martinez"]
|
22
|
+
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
|
+
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
|
+
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
25
|
+
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
26
|
+
end
|
27
|
+
Jeweler::RubygemsDotOrgTasks.new
|
28
|
+
|
29
|
+
require 'rspec/core'
|
30
|
+
require 'rspec/core/rake_task'
|
31
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
32
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
33
|
+
end
|
34
|
+
|
35
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
36
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
37
|
+
spec.rcov = true
|
38
|
+
end
|
39
|
+
|
40
|
+
task :default => :spec
|
41
|
+
|
42
|
+
require 'rake/rdoctask'
|
43
|
+
Rake::RDocTask.new do |rdoc|
|
44
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
45
|
+
|
46
|
+
rdoc.rdoc_dir = 'rdoc'
|
47
|
+
rdoc.title = "Acts As Importable #{version}"
|
48
|
+
rdoc.rdoc_files.include('README*')
|
49
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
50
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{capitalist-acts-as-importable}
|
8
|
+
s.version = "1.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Tim Riley", "Joe Martinez"]
|
12
|
+
s.date = %q{2011-01-26}
|
13
|
+
s.description = %q{Allows you to connect to a second database and systematically transfer those records}
|
14
|
+
s.email = %q{joe@joemartinez.name}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.textile"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"Gemfile",
|
20
|
+
"Gemfile.lock",
|
21
|
+
"README.textile",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"capitalist-acts-as-importable.gemspec",
|
25
|
+
"init.rb",
|
26
|
+
"lib/acts_as_importable.rb",
|
27
|
+
"lib/core_extensions.rb",
|
28
|
+
"spec/acts_as_importable_spec.rb",
|
29
|
+
"spec/database.yml",
|
30
|
+
"spec/schema.rb",
|
31
|
+
"spec/spec.opts",
|
32
|
+
"spec/spec_helper.rb",
|
33
|
+
"tasks/acts_as_importable_tasks.rake"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/capitalist/acts-as-importable}
|
36
|
+
s.licenses = ["MIT"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.3.7}
|
39
|
+
s.summary = %q{Helps transfer records from one database to another}
|
40
|
+
s.test_files = [
|
41
|
+
"spec/acts_as_importable_spec.rb",
|
42
|
+
"spec/schema.rb",
|
43
|
+
"spec/spec_helper.rb"
|
44
|
+
]
|
45
|
+
|
46
|
+
if s.respond_to? :specification_version then
|
47
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
48
|
+
s.specification_version = 3
|
49
|
+
|
50
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_development_dependency(%q<rails>, ["= 3.0.3"])
|
52
|
+
s.add_development_dependency(%q<capybara>, [">= 0.4.0"])
|
53
|
+
s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<rspec-rails>, [">= 2.0.0.beta"])
|
55
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
57
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<awesome_print>, [">= 0"])
|
59
|
+
s.add_development_dependency(%q<mysql2>, [">= 0"])
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<rails>, ["= 3.0.3"])
|
62
|
+
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
63
|
+
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
64
|
+
s.add_dependency(%q<rspec-rails>, [">= 2.0.0.beta"])
|
65
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
66
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
67
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
68
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
69
|
+
s.add_dependency(%q<mysql2>, [">= 0"])
|
70
|
+
end
|
71
|
+
else
|
72
|
+
s.add_dependency(%q<rails>, ["= 3.0.3"])
|
73
|
+
s.add_dependency(%q<capybara>, [">= 0.4.0"])
|
74
|
+
s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
|
75
|
+
s.add_dependency(%q<rspec-rails>, [">= 2.0.0.beta"])
|
76
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
77
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
78
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
79
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
80
|
+
s.add_dependency(%q<mysql2>, [">= 0"])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/init.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
module Acts
|
2
|
+
module Importable
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
def acts_as_importable(options = {})
|
11
|
+
# Store the import target class with the legacy class
|
12
|
+
write_inheritable_attribute :importable_to, options[:to]
|
13
|
+
|
14
|
+
# Don't extend or include twice. This will allow acts_as_importable to be called multiple times.
|
15
|
+
# eg. once in a parent class and once again in the child class, where it can override some options.
|
16
|
+
extend AMC::Acts::Importable::SingletonMethods unless self.methods.include?('import') && self.methods.include?('import_all')
|
17
|
+
include AMC::Acts::Importable::InstanceMethods unless self.included_modules.include?(AMC::Acts::Importable::InstanceMethods)
|
18
|
+
end
|
19
|
+
|
20
|
+
end # ClassMethods
|
21
|
+
|
22
|
+
module SingletonMethods
|
23
|
+
def import(id)
|
24
|
+
find(id).import
|
25
|
+
end
|
26
|
+
|
27
|
+
def import_all
|
28
|
+
all.each do |legacy_model|
|
29
|
+
legacy_model.import
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# This requires a numeric primary key for the legacy tables
|
34
|
+
def import_all_in_batches
|
35
|
+
each do |legacy_model|
|
36
|
+
legacy_model.import
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def lookup(id)
|
41
|
+
lookup_class = read_inheritable_attribute(:importable_to) || "#{self.to_s.split('::').last}"
|
42
|
+
lookups[id] ||= Kernel.const_get(lookup_class).first(:conditions => {:legacy_id => id, :legacy_class => self.to_s}).try(:id__)
|
43
|
+
end
|
44
|
+
|
45
|
+
def flush_lookups!
|
46
|
+
@lookups = {}
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def lookups
|
52
|
+
@lookups ||= {}
|
53
|
+
end
|
54
|
+
|
55
|
+
end # SingletonMethods
|
56
|
+
|
57
|
+
module InstanceMethods
|
58
|
+
|
59
|
+
def import
|
60
|
+
returning to_model do |new_model|
|
61
|
+
if new_model
|
62
|
+
new_model.legacy_id = self.id if new_model.respond_to?(:"legacy_id=")
|
63
|
+
new_model.legacy_class = self.class.to_s if new_model.respond_to?(:"legacy_class=")
|
64
|
+
|
65
|
+
if !new_model.save
|
66
|
+
p new_model.errors
|
67
|
+
# TODO log an error that the model failed to save
|
68
|
+
# TODO remove the raise once we're out of the development cycle
|
69
|
+
raise
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end # InstanceMethods
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# See http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/212639
|
2
|
+
# And http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/210633 for alternative [:id] notation
|
3
|
+
class ActiveRecord::Base
|
4
|
+
alias_method :id__, :id if method_defined? :id
|
5
|
+
end
|
6
|
+
|
7
|
+
# From http://weblog.jamisbuck.org/2007/4/6/faking-cursors-in-activerecord
|
8
|
+
class <<ActiveRecord::Base
|
9
|
+
def each(limit=1000)
|
10
|
+
rows = find(:all, :conditions => ["#{primary_key} > ?", 0], :limit => limit)
|
11
|
+
while rows.any?
|
12
|
+
rows.each { |record| yield record }
|
13
|
+
rows = find(:all, :conditions => ["#{primary_key} > ?", rows.last.id], :limit => limit)
|
14
|
+
end
|
15
|
+
self
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe AMC::Acts::Importable do
|
4
|
+
|
5
|
+
it "should include instance methods" do
|
6
|
+
Legacy::Thing.new.should be_kind_of(AMC::Acts::Importable::InstanceMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should extend singleton methods" do
|
10
|
+
Legacy::Thing.should be_kind_of(AMC::Acts::Importable::SingletonMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "importing from an instance of a single model" do
|
14
|
+
before(:each) do
|
15
|
+
@legacy_thing = create_legacy_thing
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should build the new model using the legacy model's to_model method" do
|
19
|
+
@legacy_thing.should_receive(:to_model)
|
20
|
+
@legacy_thing.import
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should assign the legacy model's ID to the legacy_id attribute in the new model" do
|
24
|
+
new_model = @legacy_thing.import
|
25
|
+
new_model.legacy_id.should == @legacy_thing.id
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should assign the legacy model's class name to the legacy_class attribute of the new model" do
|
29
|
+
new_model = @legacy_thing.import
|
30
|
+
new_model.legacy_class.should == @legacy_thing.class.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should save the new model" do
|
34
|
+
new_model = @legacy_thing.import
|
35
|
+
new_model.should_not be_new_record
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "importing a single model" do
|
40
|
+
before(:each) do
|
41
|
+
@legacy_thing = mock(Legacy::Thing, :import => nil)
|
42
|
+
Legacy::Thing.stub!(:find).and_return(@legacy_thing)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should find the legacy model" do
|
46
|
+
Legacy::Thing.should_receive(:find).with(123)
|
47
|
+
Legacy::Thing.import(123)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should import the legacy model" do
|
51
|
+
@legacy_thing.should_receive(:import)
|
52
|
+
Legacy::Thing.import(123)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "importing all models" do
|
57
|
+
before(:each) do
|
58
|
+
@legacy_thing_1 = mock(Legacy::Thing, :import => nil)
|
59
|
+
@legacy_thing_2 = mock(Legacy::Thing, :import => nil)
|
60
|
+
Legacy::Thing.stub!(:all).and_return([@legacy_thing_1, @legacy_thing_2])
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should find all legacy models" do
|
64
|
+
Legacy::Thing.should_receive(:all)
|
65
|
+
Legacy::Thing.import_all
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should import each of the legacy models" do
|
69
|
+
@legacy_thing_1.should_receive(:import)
|
70
|
+
@legacy_thing_2.should_receive(:import)
|
71
|
+
Legacy::Thing.import_all
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "looking up legcy IDs for already imported models" do
|
76
|
+
before(:all) do
|
77
|
+
@legacy_thing = create_legacy_thing
|
78
|
+
@imported_thing = @legacy_thing.import
|
79
|
+
end
|
80
|
+
|
81
|
+
before(:each) do
|
82
|
+
Legacy::Thing.flush_lookups!
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should attempt to find the imported model by legacy_id" do
|
86
|
+
Thing.should_receive(:first).with(:conditions => {:legacy_id => 123, :legacy_class => 'Legacy::Thing'})
|
87
|
+
Legacy::Thing.lookup(123)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should return the ID of the imported model with a matching legacy_id" do
|
91
|
+
Legacy::Thing.lookup(@legacy_thing.id).should == @imported_thing.id
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should memoize the mapping from the legacy_id to the imported model's ID" do
|
95
|
+
Thing.should_receive(:first).and_return(@imported_thing)
|
96
|
+
Legacy::Thing.lookup(@legacy_thing.id).inspect
|
97
|
+
Thing.should_not_receive(:find_by_legacy_id)
|
98
|
+
Legacy::Thing.lookup(@legacy_thing.id).inspect
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "looking up legacy IDs for already imported models when importing to a model with a different class name to the legacy model" do
|
103
|
+
before(:all) do
|
104
|
+
@other_legacy_thing = create_other_legacy_thing
|
105
|
+
end
|
106
|
+
|
107
|
+
before(:each) do
|
108
|
+
Legacy::Thing.flush_lookups!
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should attempt to find the imported model with the specified class name by legacy_id" do
|
112
|
+
Thing.should_receive(:first).with(:conditions => {:legacy_id => 123, :legacy_class => 'Legacy::OtherThing'})
|
113
|
+
Legacy::OtherThing.lookup(123)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
data/spec/database.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
sqlite:
|
2
|
+
:adapter: sqlite
|
3
|
+
:dbfile: acts_as_importable_plugin.sqlite.db
|
4
|
+
sqlite3mem:
|
5
|
+
:adapter: sqlite3
|
6
|
+
:dbfile: ":memory:"
|
7
|
+
sqlite3:
|
8
|
+
:adapter: sqlite3
|
9
|
+
:dbfile: acts_as_importable_plugin.sqlite3.db
|
10
|
+
postgresql:
|
11
|
+
:adapter: postgresql
|
12
|
+
:username: postgres
|
13
|
+
:password: postgres
|
14
|
+
:database: acts_as_importable_plugin_test
|
15
|
+
:min_messages: ERROR
|
16
|
+
mysql:
|
17
|
+
:adapter: mysql
|
18
|
+
:host: localhost
|
19
|
+
:username: rails
|
20
|
+
:password:
|
21
|
+
:database: acts_as_importable_plugin_test
|
data/spec/schema.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
2
|
+
create_table :legacy_things, :force => true do |t|
|
3
|
+
t.string :legacy_name
|
4
|
+
t.string :legacy_description
|
5
|
+
end
|
6
|
+
|
7
|
+
create_table :things, :force => true do |t|
|
8
|
+
t.string :name
|
9
|
+
t.string :description
|
10
|
+
t.integer :legacy_id
|
11
|
+
t.string :legacy_class
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
ENV['RAILS_ENV'] = 'test'
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'active_record'
|
6
|
+
require File.dirname(__FILE__) + '/../init.rb'
|
7
|
+
|
8
|
+
require 'spec'
|
9
|
+
|
10
|
+
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
11
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
12
|
+
ActiveRecord::Base.establish_connection(config[ENV['DB'] || 'sqlite3mem'])
|
13
|
+
|
14
|
+
ActiveRecord::Migration.verbose = false
|
15
|
+
load(File.dirname(__FILE__) + "/schema.rb")
|
16
|
+
|
17
|
+
class Thing < ActiveRecord::Base
|
18
|
+
end
|
19
|
+
|
20
|
+
module Legacy
|
21
|
+
class Thing < ActiveRecord::Base
|
22
|
+
set_table_name 'legacy_things'
|
23
|
+
|
24
|
+
acts_as_importable
|
25
|
+
|
26
|
+
def to_model
|
27
|
+
::Thing.new do |t|
|
28
|
+
t.name = self.legacy_name
|
29
|
+
t.description = self.legacy_description
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class OtherThing < Thing
|
35
|
+
set_table_name 'legacy_things'
|
36
|
+
|
37
|
+
acts_as_importable :to => 'Thing'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
Spec::Runner.configure do |config|
|
42
|
+
|
43
|
+
def create_legacy_thing(attrs = {})
|
44
|
+
Legacy::Thing.create({:legacy_name => 'Grandfather Clock', :legacy_description => 'Tick tock'}.merge(attrs))
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_other_legacy_thing(attrs = {})
|
48
|
+
Legacy::OtherThing.create({:legacy_name => 'Grandfather Clock', :legacy_description => 'Tick tock'}.merge(attrs))
|
49
|
+
end
|
50
|
+
end
|
metadata
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capitalist-acts-as-importable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Tim Riley
|
14
|
+
- Joe Martinez
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-01-26 00:00:00 -05:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
name: rails
|
26
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - "="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 1
|
32
|
+
segments:
|
33
|
+
- 3
|
34
|
+
- 0
|
35
|
+
- 3
|
36
|
+
version: 3.0.3
|
37
|
+
requirement: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
name: capybara
|
42
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 15
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
- 4
|
51
|
+
- 0
|
52
|
+
version: 0.4.0
|
53
|
+
requirement: *id002
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
name: sqlite3-ruby
|
58
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
requirement: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
name: rspec-rails
|
72
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 31098209
|
78
|
+
segments:
|
79
|
+
- 2
|
80
|
+
- 0
|
81
|
+
- 0
|
82
|
+
- beta
|
83
|
+
version: 2.0.0.beta
|
84
|
+
requirement: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
name: bundler
|
89
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ~>
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 23
|
95
|
+
segments:
|
96
|
+
- 1
|
97
|
+
- 0
|
98
|
+
- 0
|
99
|
+
version: 1.0.0
|
100
|
+
requirement: *id005
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
name: jeweler
|
105
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
hash: 7
|
111
|
+
segments:
|
112
|
+
- 1
|
113
|
+
- 5
|
114
|
+
- 2
|
115
|
+
version: 1.5.2
|
116
|
+
requirement: *id006
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
name: rcov
|
121
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
requirement: *id007
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
name: awesome_print
|
135
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
hash: 3
|
141
|
+
segments:
|
142
|
+
- 0
|
143
|
+
version: "0"
|
144
|
+
requirement: *id008
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
name: mysql2
|
149
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
150
|
+
none: false
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
hash: 3
|
155
|
+
segments:
|
156
|
+
- 0
|
157
|
+
version: "0"
|
158
|
+
requirement: *id009
|
159
|
+
description: Allows you to connect to a second database and systematically transfer those records
|
160
|
+
email: joe@joemartinez.name
|
161
|
+
executables: []
|
162
|
+
|
163
|
+
extensions: []
|
164
|
+
|
165
|
+
extra_rdoc_files:
|
166
|
+
- README.textile
|
167
|
+
files:
|
168
|
+
- Gemfile
|
169
|
+
- Gemfile.lock
|
170
|
+
- README.textile
|
171
|
+
- Rakefile
|
172
|
+
- VERSION
|
173
|
+
- capitalist-acts-as-importable.gemspec
|
174
|
+
- init.rb
|
175
|
+
- lib/acts_as_importable.rb
|
176
|
+
- lib/core_extensions.rb
|
177
|
+
- spec/acts_as_importable_spec.rb
|
178
|
+
- spec/database.yml
|
179
|
+
- spec/schema.rb
|
180
|
+
- spec/spec.opts
|
181
|
+
- spec/spec_helper.rb
|
182
|
+
- tasks/acts_as_importable_tasks.rake
|
183
|
+
has_rdoc: true
|
184
|
+
homepage: http://github.com/capitalist/acts-as-importable
|
185
|
+
licenses:
|
186
|
+
- MIT
|
187
|
+
post_install_message:
|
188
|
+
rdoc_options: []
|
189
|
+
|
190
|
+
require_paths:
|
191
|
+
- lib
|
192
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ">="
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
hash: 3
|
198
|
+
segments:
|
199
|
+
- 0
|
200
|
+
version: "0"
|
201
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
|
+
none: false
|
203
|
+
requirements:
|
204
|
+
- - ">="
|
205
|
+
- !ruby/object:Gem::Version
|
206
|
+
hash: 3
|
207
|
+
segments:
|
208
|
+
- 0
|
209
|
+
version: "0"
|
210
|
+
requirements: []
|
211
|
+
|
212
|
+
rubyforge_project:
|
213
|
+
rubygems_version: 1.3.7
|
214
|
+
signing_key:
|
215
|
+
specification_version: 3
|
216
|
+
summary: Helps transfer records from one database to another
|
217
|
+
test_files:
|
218
|
+
- spec/acts_as_importable_spec.rb
|
219
|
+
- spec/schema.rb
|
220
|
+
- spec/spec_helper.rb
|