solrizer 0.2.0 → 0.3.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.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solrizer
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Zumwalt
@@ -15,57 +15,151 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-15 00:00:00 -05:00
18
+ date: 2010-10-26 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: active-fedora
22
+ name: solr-ruby
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 25
29
+ hash: 3
30
30
  segments:
31
- - 1
32
- - 1
33
- - 5
34
- version: 1.1.5
31
+ - 0
32
+ version: "0"
35
33
  type: :runtime
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
38
- name: om
36
+ name: nokogiri
39
37
  prerelease: false
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
41
  - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 23
43
+ hash: 3
46
44
  segments:
47
- - 1
48
- - 0
49
45
  - 0
50
- version: 1.0.0
46
+ version: "0"
51
47
  type: :runtime
52
48
  version_requirements: *id002
53
49
  - !ruby/object:Gem::Dependency
54
- name: rspec
50
+ name: om
55
51
  prerelease: false
56
52
  requirement: &id003 !ruby/object:Gem::Requirement
57
53
  none: false
58
54
  requirements:
59
55
  - - ">="
60
56
  - !ruby/object:Gem::Version
61
- hash: 13
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: nokogiri
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :runtime
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: mediashelf-loggable
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :runtime
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: jeweler
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :development
104
+ version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: ruby-debug
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :development
118
+ version_requirements: *id007
119
+ - !ruby/object:Gem::Dependency
120
+ name: ruby-debug-base
121
+ prerelease: false
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ type: :development
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: rspec
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - <
140
+ - !ruby/object:Gem::Version
141
+ hash: 15
62
142
  segments:
63
- - 1
64
143
  - 2
65
- - 9
66
- version: 1.2.9
144
+ - 0
145
+ - 0
146
+ version: 2.0.0
67
147
  type: :development
68
- version_requirements: *id003
148
+ version_requirements: *id009
149
+ - !ruby/object:Gem::Dependency
150
+ name: mocha
151
+ prerelease: false
152
+ requirement: &id010 !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ hash: 3
158
+ segments:
159
+ - 0
160
+ version: "0"
161
+ type: :development
162
+ version_requirements: *id010
69
163
  description: Use solrizer to populate solr indexes from Fedora repository content or from other sources. You can run solrizer from within your apps, using the provided rake tasks, or as a JMS listener
70
164
  email: matt.zumwalt@yourmediashelf.com
71
165
  executables: []
@@ -77,6 +171,8 @@ extra_rdoc_files:
77
171
  - README.textile
78
172
  files:
79
173
  - .gitignore
174
+ - Gemfile
175
+ - Gemfile.lock
80
176
  - History.txt
81
177
  - LICENSE
82
178
  - README.textile
@@ -86,34 +182,32 @@ files:
86
182
  - config/hydra_types.yml
87
183
  - config/solr.yml
88
184
  - config/solr_mappings.yml
185
+ - config/solr_mappings_af_0.1.yml
89
186
  - lib/solrizer.rb
90
- - lib/solrizer/configuration.rb
91
187
  - lib/solrizer/extractor.rb
188
+ - lib/solrizer/field_mapper.rb
92
189
  - lib/solrizer/field_name_mapper.rb
93
- - lib/solrizer/indexer.rb
94
- - lib/solrizer/main.rb
95
- - lib/solrizer/replicator.rb
96
- - lib/solrizer/repository.rb
190
+ - lib/solrizer/html.rb
191
+ - lib/solrizer/html/extractor.rb
97
192
  - lib/solrizer/xml.rb
193
+ - lib/solrizer/xml/extractor.rb
98
194
  - lib/solrizer/xml/terminology_based_solrizer.rb
99
195
  - lib/tasks/solrizer.rake
100
196
  - solrizer.gemspec
197
+ - spec/.rspec
101
198
  - spec/fixtures/druid-bv448hq0314-descMetadata.xml
102
199
  - spec/fixtures/druid-bv448hq0314-extProperties.xml
103
200
  - spec/fixtures/druid-cm234kq4672-extProperties.xml
104
201
  - spec/fixtures/druid-cm234kq4672-stories.xml
105
202
  - spec/fixtures/druid-hc513kw4806-descMetadata.xml
106
203
  - spec/fixtures/mods_articles/hydrangea_article1.xml
107
- - spec/fixtures/rels_ext_cmodel.xml
108
- - spec/fixtures/solr_mappings_af_0.1.yml
109
- - spec/integration/indexer_spec.rb
204
+ - spec/fixtures/test_solr_mappings.yml
110
205
  - spec/rcov.opts
111
- - spec/spec.opts
112
206
  - spec/spec_helper.rb
113
207
  - spec/units/extractor_spec.rb
208
+ - spec/units/field_mapper_spec.rb
114
209
  - spec/units/field_name_mapper_spec.rb
115
- - spec/units/indexer_spec.rb
116
- - spec/units/shelver_spec.rb
210
+ - spec/units/xml_extractor_spec.rb
117
211
  - spec/units/xml_terminology_based_solrizer_spec.rb
118
212
  has_rdoc: true
119
213
  homepage: http://github.com/projecthydra/solrizer
@@ -150,10 +244,9 @@ signing_key:
150
244
  specification_version: 3
151
245
  summary: A utility for building solr indexes, usually from Fedora repository content.
152
246
  test_files:
153
- - spec/integration/indexer_spec.rb
154
247
  - spec/spec_helper.rb
155
248
  - spec/units/extractor_spec.rb
249
+ - spec/units/field_mapper_spec.rb
156
250
  - spec/units/field_name_mapper_spec.rb
157
- - spec/units/indexer_spec.rb
158
- - spec/units/shelver_spec.rb
251
+ - spec/units/xml_extractor_spec.rb
159
252
  - spec/units/xml_terminology_based_solrizer_spec.rb
@@ -1,8 +0,0 @@
1
-
2
- # FEDORA_URL = 'http://fedoraAdmin:fedoraAdmin@salt-dev.stanford.edu/fedora'
3
- # FEDORA_SOLR_URL = 'http://salt-dev.stanford.edu:8080/solr'
4
- # SHELVER_SOLR_URL = 'http://sulwebappdev1.stanford.edu:8100/salt_solr'
5
- FEDORA_URL = 'http://fedoraAdmin:fedoraAdmin@localhost:8080/fedora'
6
- FEDORA_SOLR_URL = 'http://localhost:8080/solr'
7
- SHELVER_SOLR_URL = 'http://localhost:8080/bl_solr'
8
-
@@ -1,261 +0,0 @@
1
- require 'solr'
2
- require 'solrizer/extractor'
3
- require 'solrizer/repository'
4
-
5
-
6
- module Solrizer
7
- class Indexer
8
- #
9
- # Class variables
10
- #
11
- @@unique_id = 0
12
-
13
- def self.unique_id
14
- @@unique_id
15
- end
16
-
17
- #
18
- # Member variables
19
- #
20
- attr_accessor :connection, :extractor, :index_full_text
21
-
22
- #
23
- # This method performs initialization tasks
24
- #
25
- def initialize( opts={} )
26
- @@index_list = false unless defined?(@@index_list)
27
- @extractor = Extractor.new
28
-
29
- if opts[:index_full_text] == true || opts[:index_full_text] == "true"
30
- @index_full_text = true
31
- else
32
- @index_full_text = false
33
- end
34
-
35
- connect
36
- end
37
-
38
- #
39
- # This method connects to the Solr instance
40
- #
41
- def connect
42
-
43
- if ActiveFedora.fedora_config.empty?
44
- ActiveFedora.init
45
- end
46
-
47
- if defined?(Blacklight)
48
- solr_config = Blacklight.solr_config
49
- else
50
-
51
- if defined?(RAILS_ROOT)
52
- config_path = File.join(RAILS_ROOT, "config")
53
- yaml = YAML.load(File.open(File.join(config_path, "solr.yml")))
54
- solr_config = yaml[RAILS_ENV]
55
- puts solr_config.inspect
56
- else
57
- config_path = File.join(File.dirname(__FILE__), "..", "..", "config")
58
- yaml = YAML.load(File.open(File.join(config_path, "solr.yml")))
59
-
60
-
61
- if ENV["environment"].nil?
62
- environment = "development"
63
- else
64
- environment = ENV["environment"]
65
- end
66
-
67
- solr_config = yaml[environment]
68
- puts solr_config.inspect
69
- end
70
-
71
- end
72
-
73
- if index_full_text == true
74
- url = solr_config['fulltext']['url']
75
- elsif solr_config.has_key?("default")
76
- url = solr_config['default']['url']
77
- else
78
- url = solr_config['url']
79
- end
80
- @connection = Solr::Connection.new(url, :autocommit => :on )
81
- end
82
-
83
- #
84
- # This method extracts the facet categories from the given Fedora object's external tag datastream
85
- #
86
- def extract_xml_to_solr( obj, ds_name, solr_doc=Solr::Document.new )
87
- xml_ds = Repository.get_datastream( obj, ds_name )
88
- extractor.xml_to_solr( xml_ds.content, solr_doc )
89
- end
90
-
91
- #
92
- #
93
- #
94
- def extract_rels_ext( obj, ds_name, solr_doc=Solr::Document.new )
95
- rels_ext_ds = Repository.get_datastream( obj, ds_name )
96
- extractor.extract_rels_ext( rels_ext_ds.content, solr_doc )
97
- end
98
-
99
- #
100
- # This method generates the month and day facets from the date_t in solr_doc
101
- #
102
-
103
- def generate_dates(solr_doc)
104
-
105
- # This will check for valid dates, but it seems most of the dates are currently invalid....
106
- #date_check = /^(19|20)\d\d([- \/.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])/
107
-
108
- #if there is not date_t, add on with easy-to-find value
109
- if solr_doc[:date_t].nil?
110
- solr_doc << Solr::Field.new( :date_t => "9999-99-99")
111
- end #if
112
-
113
- # unless date_check !~ solr_doc[:date_t]
114
- date_obj = Date._parse(solr_doc[:date_t])
115
-
116
- if date_obj[:mon].nil?
117
- solr_doc << Solr::Field.new(:month_facet => 99)
118
- elsif 0 < date_obj[:mon] && date_obj[:mon] < 13
119
- solr_doc << Solr::Field.new( :month_facet => date_obj[:mon].to_s.rjust(2, '0'))
120
- else
121
- solr_doc << Solr::Field.new( :month_facet => 99)
122
- end
123
-
124
- if date_obj[:mday].nil?
125
- solr_doc << Solr::Field.new( :day_facet => 99)
126
- elsif 0 < date_obj[:mday] && date_obj[:mday] < 32
127
- solr_doc << Solr::Field.new( :day_facet => date_obj[:mday].to_s.rjust(2, '0'))
128
- else
129
- solr_doc << Solr::Field.new( :day_facet => 99)
130
- end
131
-
132
- return solr_doc
133
- # end
134
-
135
- end
136
-
137
-
138
- #
139
- # This method creates a Solr-formatted XML document
140
- #
141
- def create_document( obj )
142
-
143
- solr_doc = Solr::Document.new
144
-
145
- model_klazz_array = ActiveFedora::ContentModel.known_models_for( obj )
146
- model_klazz_array.delete(ActiveFedora::Base)
147
-
148
- # If the object was passed in as an ActiveFedora::Base, call to_solr in order to get the base field entries from ActiveFedora::Base
149
- # Otherwise, the object was passed in as a model instance other than ActiveFedora::Base,so call its to_solr method & allow it to insert the fields from ActiveFedora::Base
150
- if obj.class == ActiveFedora::Base
151
- solr_doc = obj.to_solr(solr_doc)
152
- puts " added base fields from #{obj.class.to_s}"
153
- else
154
- solr_doc = obj.to_solr(solr_doc)
155
- model_klazz_array.delete(obj.class)
156
- puts " added base fields from #{obj.class.to_s} and model fields from #{obj.class.to_s}"
157
- end
158
-
159
- # Load the object as an instance of each of its other models and get the corresponding solr fields
160
- # Include :model_only=>true in the options in order to avoid adding the metadata from ActiveFedora::Base every time.
161
- model_klazz_array.each do |klazz|
162
- instance = klazz.load_instance(obj.pid)
163
- solr_doc = instance.to_solr(solr_doc, :model_only=>true)
164
- puts " added solr fields from #{klazz.to_s}"
165
- end
166
-
167
- solr_doc << Solr::Field.new( :id_t => "#{obj.pid}" )
168
- solr_doc << Solr::Field.new( :id => "#{obj.pid}" ) unless solr_doc[:id]
169
-
170
- # increment the unique id to ensure that all documents in the search index are unique
171
- @@unique_id += 1
172
-
173
- return solr_doc
174
- end
175
-
176
- #
177
- # This method adds a document to the Solr search index
178
- #
179
- def index( obj )
180
- # print "Indexing '#{obj.pid}'..."
181
- begin
182
-
183
- solr_doc = create_document( obj )
184
- connection.add( solr_doc )
185
-
186
- # puts connection.url
187
- #puts solr_doc
188
- # puts "done"
189
-
190
- # rescue Exception => e
191
- # p "unable to index #{obj.pid}. Failed with #{e.inspect}"
192
- end
193
-
194
- end
195
-
196
- #
197
- # This method queries the Solr search index and returns a response
198
- #
199
- def query( query_str )
200
- response = conn.query( query_str )
201
- end
202
-
203
- #
204
- # This method prints out the results of the given query string by iterating through all the hits
205
- #
206
- def printResults( query_str )
207
- query( query_str ) do |hit|
208
- puts hit.inspect
209
- end
210
- end
211
-
212
- #
213
- # This method deletes a document from the Solr search index by id
214
- #
215
- def deleteDocument( id )
216
- connection.delete( id )
217
- end
218
-
219
- # Populates a solr doc with values from a hash.
220
- # Accepts two forms of hashes:
221
- # => {'technology'=>["t1", "t2"], 'company'=>"c1", "person"=>["p1", "p2"]}
222
- # or
223
- # => {:facets => {'technology'=>["t1", "t2"], 'company'=>"c1", "person"=>["p1", "p2"]} }
224
- #
225
- # Note that values for individual fields can be a single string or an array of strings.
226
- def self.solrize( input_hash, solr_doc=Solr::Document.new )
227
- facets = input_hash.has_key?(:facets) ? input_hash[:facets] : input_hash
228
- facets.each_pair do |facet_name, value|
229
- case value.class.to_s
230
- when "String"
231
- solr_doc << Solr::Field.new( :"#{facet_name}_facet" => "#{value}" )
232
- when "Array"
233
- value.each { |v| solr_doc << Solr::Field.new( :"#{facet_name}_facet" => "#{v}" ) }
234
- end
235
- end
236
-
237
- if input_hash.has_key?(:symbols)
238
- input_hash[:symbols].each do |symbol_name, value|
239
- case value.class.to_s
240
- when "String"
241
- solr_doc << Solr::Field.new( :"#{symbol_name}_s" => "#{value}" )
242
- when "Array"
243
- value.each { |v| solr_doc << Solr::Field.new( :"#{symbol_name}_s" => "#{v}" ) }
244
- end
245
- end
246
- end
247
- return solr_doc
248
- end
249
-
250
-
251
- private :connect, :create_document
252
-
253
- def class_exists?(class_name)
254
- klass = Module.const_get(class_name)
255
- return klass.is_a?(Class)
256
- rescue NameError
257
- return false
258
- end
259
-
260
- end
261
- end
data/lib/solrizer/main.rb DELETED
@@ -1,17 +0,0 @@
1
- #!/bin/env ruby
2
-
3
- @index_full_text = false
4
-
5
- require 'rubygems'
6
- load 'configuration.rb'
7
- load 'repository.rb'
8
- load 'solrizer.rb'
9
-
10
- # initialize connection to Fedora repository
11
- repository = Repository.new
12
- repository.initialize_repository
13
-
14
- # solrize all objects in the Fedora repository
15
- solrizer = Solrizer.new
16
- solrizer.solrize_objects
17
-
@@ -1,143 +0,0 @@
1
- require 'fastercsv'
2
- REPLICATOR_LIST = false unless defined?(REPLICATOR_LIST)
3
-
4
-
5
- module Solrizer
6
- class Replicator
7
-
8
- include Stanford::SaltControllerHelper
9
- attr_accessor :dest_repo, :configs
10
-
11
- def initialize
12
- config_path = "#{RAILS_ROOT}/config/replicator.yml"
13
- raw_configs = YAML::load(File.open(config_path))
14
- @configs = raw_configs[RAILS_ENV]
15
- @dest_repo = Fedora::Repository.new(configs["destination"]["fedora"]["url"])
16
-
17
- ActiveFedora.fedora_config[:url] = configs["source"]["fedora"]["url"]
18
- logger.info("REPLICATOR: re-initializing Fedora with fedora_config: #{ActiveFedora.fedora_config.inspect}")
19
-
20
- Fedora::Repository.register(ActiveFedora.fedora_config[:url])
21
- logger.info("REPLICATOR: re-initialized Fedora as: #{Fedora::Repository.instance.inspect}")
22
-
23
- # Register Solr
24
- ActiveFedora.solr_config[:url] = configs["source"]["solr"]["url"]
25
-
26
- logger.info("REPLICATOR: re-initializing ActiveFedora::SolrService with solr_config: #{ActiveFedora.solr_config.inspect}")
27
-
28
- ActiveFedora::SolrService.register(ActiveFedora.solr_config[:url])
29
-
30
- end
31
-
32
- def replicate_objects
33
- # retrieve a list of all the pids in the fedora repository
34
- num_docs = 1000000 # modify this number to guarantee that all the objects are retrieved from the repository
35
-
36
- if REPLICATOR_LIST == false
37
-
38
- pids = Repository.get_pids( num_docs )
39
- puts "Replicating #{pids.length} Fedora objects"
40
- pids.each do |pid|
41
- unless pid[0].empty? || pid[0].nil? || !pid[0].include?("druid:")
42
- puts "Processing #{pid}"
43
- replicate_object( pid )
44
- end #unless
45
- end #pids.each
46
-
47
- else
48
-
49
- if File.exists?(REPLICATOR_LIST)
50
- arr_of_pids = FasterCSV.read(REPLICATOR_LIST, :headers=>false)
51
-
52
- puts "Replicating from list at #{REPLICATOR_LIST}"
53
- puts "Replicating #{arr_of_pids.length} Fedora objects"
54
-
55
- arr_of_pids.each do |row|
56
- pid = row[0]
57
- replicate_object( pid )
58
- end #FASTERCSV
59
-
60
- else
61
- puts "#{REPLICATOR_LIST} does not exists!"
62
- end #if File.exists
63
-
64
- end #if Index_LISTS
65
- end #replicate_objects
66
-
67
-
68
- def replicate_object(obj)
69
- #source_doc = Document.load_instance(pid)
70
- obj = obj.kind_of?(ActiveFedora::Base) ? obj : Repository.get_object( obj )
71
- p "Indexing object #{obj.pid} with label #{obj.label}"
72
- begin
73
- unless obj.nil?
74
- create_stub(obj)
75
- p "Successfully replicated #{obj.pid}"
76
- end
77
- rescue Exception => e
78
- p "unable to create stub. Failed with #{e.inspect}"
79
- end
80
- end
81
-
82
- # Creates a stub object in @dest_repo with the datastreams that we need in the stubs
83
- def create_stub(source_object)
84
-
85
- begin
86
-
87
- jp2 = downloadables(source_object, :canonical=>true, :mime_type=>"image/jp2")
88
- jp2.new_object = true
89
- jp2.control_group = 'M'
90
- jp2.blob = jp2.content
91
-
92
- stub_object = Fedora::FedoraObject.new(:pid=>source_object.pid)
93
- dest_repo.save(stub_object)
94
- dest_repo.save(jp2)
95
-
96
- ["properties", "extProperties", "descMetadata", "location"].each do |ds_name|
97
- ds = source_object.datastreams[ds_name]
98
- ds.new_object = true
99
- ds.blob = ds.content
100
- dest_repo.save(ds)
101
- end
102
-
103
- rescue
104
- #for object without jp2s
105
- #this is a temp fix to the downloadables() issue
106
-
107
-
108
- pid = source_object.pid
109
- p "> #{pid}"
110
-
111
- jp2_file = File.new('spec/fixtures/image.jp2')
112
- ds = ActiveFedora::Datastream.new(:dsID => "image.jp2", :dsLabel => 'image.jp2', :controlGroup => 'M', :blob => jp2_file)
113
- source_object.add_datastream(ds)
114
- source_object.save
115
- # source_object = Document.load_instance(pid)
116
- source_object = ActiveFedora::Base.load_instance(pid)
117
- stub_object = Fedora::FedoraObject.new(:pid=>source_object.pid)
118
- dest_repo.save(stub_object)
119
-
120
- jp2 = downloadables(source_object, :canonical=>true, :mime_type=>"image/jp2")
121
- jp2.new_object = true
122
- jp2.control_group = 'M'
123
- jp2.blob = jp2.content
124
-
125
- stub_object = Fedora::FedoraObject.new(:pid=>source_object.pid)
126
- dest_repo.save(stub_object)
127
- dest_repo.save(jp2)
128
-
129
- ["properties", "extProperties", "descMetadata", "location"].each do |ds_name|
130
- ds = source_object.datastreams[ds_name]
131
- ds.new_object = true
132
- ds.blob = ds.content
133
- dest_repo.save(ds)
134
- end
135
-
136
- end
137
- end
138
- def logger
139
- @logger ||= defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : Logger.new(STDOUT)
140
- end
141
-
142
- end
143
- end