hydra-migrate 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.md +5 -0
- data/README.md +1 -5
- data/hydra-migrate.gemspec +1 -0
- data/lib/hydra/datastream/migration_info.rb +3 -3
- data/lib/hydra/migrate/dispatcher.rb +30 -12
- data/lib/hydra/migrate/version.rb +1 -1
- data/lib/railties/hydra-migrate.rake +7 -4
- data/spec/unit/migrate_spec.rb +14 -0
- metadata +19 -2
data/HISTORY.md
ADDED
data/README.md
CHANGED
@@ -68,8 +68,4 @@ Or install it yourself as:
|
|
68
68
|
|
69
69
|
## Contributing
|
70
70
|
|
71
|
-
|
72
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
73
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
74
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
75
|
-
5. Create new Pull Request
|
71
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md)
|
data/hydra-migrate.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency 'active-fedora'
|
22
|
+
spec.add_dependency 'activesupport'
|
22
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
23
24
|
spec.add_development_dependency "rake"
|
24
25
|
spec.add_development_dependency "rspec"
|
@@ -8,9 +8,9 @@ module Hydra
|
|
8
8
|
t.current
|
9
9
|
t.history do
|
10
10
|
t.migration do
|
11
|
-
t.from(:path=>'@from')
|
12
|
-
t.to(:path=>'@to')
|
13
|
-
t.at(:path=>'@at')
|
11
|
+
t.from(:path=>'@from', :namespace_prefix=>nil)
|
12
|
+
t.to(:path=>'@to', :namespace_prefix=>nil)
|
13
|
+
t.at(:path=>'@at', :namespace_prefix=>nil)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/class/subclasses'
|
2
|
+
|
1
3
|
module Hydra
|
2
4
|
module Migrate
|
3
5
|
class Dispatcher
|
@@ -11,16 +13,20 @@ module Hydra
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def load_migrations(path)
|
16
|
+
result = []
|
14
17
|
Dir[File.join(path,'**','*.rb')].each { |migration_file|
|
15
|
-
existing_migrations =
|
18
|
+
existing_migrations = Hydra::Migrate::Migration.descendants
|
16
19
|
load(migration_file)
|
17
|
-
new_migrations =
|
20
|
+
new_migrations = Hydra::Migrate::Migration.descendants - existing_migrations
|
18
21
|
new_migrations.each { |klass| klass.new(self) }
|
22
|
+
result = new_migrations
|
19
23
|
}
|
24
|
+
result
|
20
25
|
end
|
21
26
|
|
22
27
|
def define_migration(signature={}, block)
|
23
|
-
|
28
|
+
memo = { :from=>signature[:from].to_s, :to=>signature[:to].to_s, :block=>block }
|
29
|
+
self.migrations[signature[:for]] << memo unless self.migrations[signature[:for]].include?(memo)
|
24
30
|
end
|
25
31
|
|
26
32
|
def migrations_for(target, constraints={})
|
@@ -38,15 +44,27 @@ module Hydra
|
|
38
44
|
object.is_a?(Hydra::ModelMixins::Migratable) and not migrations_for(object, {:from=>object.current_migration}.merge(constraints)).empty?
|
39
45
|
end
|
40
46
|
|
41
|
-
def migrate!(
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
object.
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
def migrate!(*args)
|
48
|
+
opts = args.last.is_a?(Hash) ? args.pop : {}
|
49
|
+
objects=args.flatten
|
50
|
+
objects.each { |object|
|
51
|
+
raise "Not a migratable object: #{object.inspect}" unless object.is_a?(Hydra::ModelMixins::Migratable)
|
52
|
+
}
|
53
|
+
|
54
|
+
objects.collect { |object|
|
55
|
+
migrations_for(object, :from=>object.current_migration, :to=>opts[:to]).each do |migration|
|
56
|
+
yield(object,migration,self) if block_given?
|
57
|
+
migration[:block].call(object, migration[:to], self)
|
58
|
+
object.migrationInfo.migrate(migration[:to])
|
59
|
+
object.current_migration = migration[:to]
|
60
|
+
unless opts[:dry_run]
|
61
|
+
unless object.save
|
62
|
+
raise %{Cannot save #{object.pid}:\n#{object.errors.to_a.join("\n")}}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
object
|
67
|
+
}
|
50
68
|
end
|
51
69
|
end
|
52
70
|
end
|
@@ -5,11 +5,14 @@ namespace :hydra do
|
|
5
5
|
migrator.load_migrations(File.join(Rails.root,'db/hydra'))
|
6
6
|
models = (args[:models] || 'ActiveFedora::Base').split(/[,;\s]+/)
|
7
7
|
models.each do |model|
|
8
|
-
klass = model.split(/::/).inject(Module) { |k,c| k.
|
9
|
-
klass.
|
8
|
+
klass = model.split(/::/).inject(Module) { |k,c| k.const_get(c.to_sym) }
|
9
|
+
klass.find_each({},{:cast=>true}) do |obj|
|
10
10
|
while migrator.can_migrate? obj
|
11
|
-
|
12
|
-
|
11
|
+
migrator.migrate!(obj) do |o,m,d|
|
12
|
+
current = o.current_migration
|
13
|
+
current = 'unknown version' if current.blank?
|
14
|
+
$stderr.puts "Migrating #{o.class} #{o.pid} from #{current} to #{m[:to]}"
|
15
|
+
end
|
13
16
|
end
|
14
17
|
end
|
15
18
|
end
|
data/spec/unit/migrate_spec.rb
CHANGED
@@ -74,6 +74,20 @@ describe Hydra::Migrate do
|
|
74
74
|
expect(subject.myMetadata.migrated).to eq(['yep, YEP!'])
|
75
75
|
expect(subject.current_migration).to eq('2')
|
76
76
|
end
|
77
|
+
|
78
|
+
it "should migrate multiple objects" do
|
79
|
+
subject_2 = subject.class.new
|
80
|
+
expect(subject.current_migration).to be_blank
|
81
|
+
expect(subject.myMetadata.migrated).to be_blank
|
82
|
+
expect(subject_2.current_migration).to be_blank
|
83
|
+
expect(subject_2.myMetadata.migrated).to be_blank
|
84
|
+
|
85
|
+
migrator.migrate!([subject, subject_2], :to=>1)
|
86
|
+
expect(subject.myMetadata.migrated).to eq(['yep'])
|
87
|
+
expect(subject.current_migration).to eq('1')
|
88
|
+
expect(subject_2.myMetadata.migrated).to eq(['yep'])
|
89
|
+
expect(subject_2.current_migration).to eq('1')
|
90
|
+
end
|
77
91
|
end
|
78
92
|
end
|
79
93
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hydra-migrate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active-fedora
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: bundler
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -103,6 +119,7 @@ files:
|
|
103
119
|
- .travis.yml
|
104
120
|
- CONTRIBUTING.md
|
105
121
|
- Gemfile
|
122
|
+
- HISTORY.md
|
106
123
|
- LICENSE.txt
|
107
124
|
- README.md
|
108
125
|
- Rakefile
|