rubydora 1.8.1 → 1.9.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.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +573 -0
- data/.travis.yml +6 -6
- data/Gemfile +2 -3
- data/README.md +86 -0
- data/Rakefile +22 -25
- data/VERSION +1 -1
- data/lib/rubydora.rb +3 -6
- data/lib/rubydora/array_with_callback.rb +4 -4
- data/lib/rubydora/audit_trail.rb +7 -7
- data/lib/rubydora/callbacks.rb +9 -9
- data/lib/rubydora/datastream.rb +43 -39
- data/lib/rubydora/digital_object.rb +31 -33
- data/lib/rubydora/fc3_service.rb +10 -14
- data/lib/rubydora/fedora_url_helpers.rb +21 -22
- data/lib/rubydora/models_mixin.rb +4 -4
- data/lib/rubydora/profile_parser.rb +8 -8
- data/lib/rubydora/relationships_mixin.rb +15 -16
- data/lib/rubydora/repository.rb +11 -11
- data/lib/rubydora/resource_index.rb +10 -14
- data/lib/rubydora/rest_api_client.rb +52 -53
- data/lib/rubydora/transactions.rb +42 -51
- data/rubydora.gemspec +25 -25
- data/spec/audit_trail_spec.rb +1 -1
- data/spec/lib/datastream_spec.rb +34 -32
- data/spec/lib/digital_object_spec.rb +13 -10
- data/spec/lib/integration_test_spec.rb +116 -119
- data/spec/lib/profile_parser_spec.rb +1 -1
- data/spec/lib/repository_spec.rb +5 -5
- data/spec/lib/rest_api_client_spec.rb +60 -66
- data/spec/lib/transactions_spec.rb +4 -6
- data/spec/spec_helper.rb +2 -9
- metadata +30 -31
- data/.gitmodules +0 -0
- data/README.rdoc +0 -79
- data/gemfiles/gemfile.rails3 +0 -11
- data/gemfiles/gemfile.rails4 +0 -10
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module Rubydora
         | 
| 2 2 | 
             
              # Extremely basic (and naive) 'transaction' support for Rubydora. This isn't
         | 
| 3 | 
            -
              # really intended to be used in a production-like situation -- more for | 
| 3 | 
            +
              # really intended to be used in a production-like situation -- more for
         | 
| 4 4 | 
             
              # rolling back (small) changes during testing.
         | 
| 5 5 | 
             
              module Transactions
         | 
| 6 6 | 
             
                extend ActiveSupport::Concern
         | 
| @@ -62,10 +62,9 @@ module Rubydora | |
| 62 62 | 
             
                  end
         | 
| 63 63 |  | 
| 64 64 | 
             
                end
         | 
| 65 | 
            -
                
         | 
| 66 65 |  | 
| 67 66 | 
             
                # Start a transaction
         | 
| 68 | 
            -
                def transaction | 
| 67 | 
            +
                def transaction(&block)
         | 
| 69 68 | 
             
                  Transaction.new self, &block
         | 
| 70 69 | 
             
                  self.transactions_log.clear
         | 
| 71 70 | 
             
                end
         | 
| @@ -73,13 +72,11 @@ module Rubydora | |
| 73 72 | 
             
                # Unshift a transaction entry onto the transaction logs.
         | 
| 74 73 | 
             
                # We want these entries in reverse-chronological order
         | 
| 75 74 | 
             
                # for ease of undoing..
         | 
| 76 | 
            -
                def append_to_transactions_log | 
| 75 | 
            +
                def append_to_transactions_log(method, options = {})
         | 
| 77 76 | 
             
                  return unless Rubydora::Transactions.use_transactions
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                   | 
| 80 | 
            -
             | 
| 81 | 
            -
                    transactions_log.unshift([method, options])
         | 
| 82 | 
            -
                  end
         | 
| 77 | 
            +
                  return if transaction_is_redundant?(method, options)
         | 
| 78 | 
            +
                  options[:foxml] = export(:pid => options[:pid], :context => :archive) if options[:foxml] == true
         | 
| 79 | 
            +
                  transactions_log.unshift([method, options])
         | 
| 83 80 | 
             
                end
         | 
| 84 81 |  | 
| 85 82 | 
             
                # The repository transaction log.
         | 
| @@ -87,12 +84,11 @@ module Rubydora | |
| 87 84 | 
             
                  @log ||= []
         | 
| 88 85 | 
             
                end
         | 
| 89 86 |  | 
| 90 | 
            -
                def transaction_is_redundant? | 
| 91 | 
            -
                  return true if transactions_log.any? { |(t_method, t_options)| | 
| 87 | 
            +
                def transaction_is_redundant?(method, options)
         | 
| 88 | 
            +
                  return true if transactions_log.any? { |(t_method, t_options)|
         | 
| 92 89 | 
             
                    # these methods will rollback ANY object change that happens after it, so there's no need to track future changes to this object
         | 
| 93 | 
            -
                    t_options[:pid] == options[:pid]  | 
| 90 | 
            +
                    t_options[:pid] == options[:pid] && [:ingest, :purge_object, :modify_datastream, :purge_datastream].include?(t_method)
         | 
| 94 91 | 
             
                  }
         | 
| 95 | 
            -
             | 
| 96 92 | 
             
                  false
         | 
| 97 93 | 
             
                end
         | 
| 98 94 | 
             
              end
         | 
| @@ -102,74 +98,69 @@ module Rubydora | |
| 102 98 | 
             
                include Hooks
         | 
| 103 99 | 
             
                define_hook :after_rollback
         | 
| 104 100 |  | 
| 105 | 
            -
                def initialize | 
| 101 | 
            +
                def initialize(repository, &block)
         | 
| 106 102 | 
             
                  @repository = repository
         | 
| 107 103 | 
             
                  with_transactions(&block)
         | 
| 108 104 | 
             
                end
         | 
| 109 105 |  | 
| 110 | 
            -
                def with_transactions | 
| 106 | 
            +
                def with_transactions(&block)
         | 
| 111 107 | 
             
                  old_state = Rubydora::Transactions.use_transactions
         | 
| 112 108 | 
             
                  Rubydora::Transactions.use_transactions = true
         | 
| 113 | 
            -
             | 
| 114 109 | 
             
                  yield(self)
         | 
| 115 | 
            -
             | 
| 116 110 | 
             
                  Rubydora::Transactions.use_transactions = old_state
         | 
| 117 111 | 
             
                end
         | 
| 118 112 |  | 
| 119 | 
            -
                def without_transactions | 
| 113 | 
            +
                def without_transactions(&block)
         | 
| 120 114 | 
             
                  old_state = Rubydora::Transactions.use_transactions
         | 
| 121 115 | 
             
                  Rubydora::Transactions.use_transactions = false
         | 
| 122 | 
            -
             | 
| 123 116 | 
             
                  yield(self)
         | 
| 124 | 
            -
             | 
| 125 117 | 
             
                  Rubydora::Transactions.use_transactions = old_state
         | 
| 126 118 | 
             
                end
         | 
| 127 119 |  | 
| 128 | 
            -
                # Roll-back transactions by reversing their outcomes | 
| 129 | 
            -
                # (or, in some cases, re-ingesting the object at the | 
| 120 | 
            +
                # Roll-back transactions by reversing their outcomes
         | 
| 121 | 
            +
                # (or, in some cases, re-ingesting the object at the
         | 
| 130 122 | 
             
                # previous state.
         | 
| 131 123 | 
             
                def rollback
         | 
| 132 124 | 
             
                  without_transactions do
         | 
| 133 | 
            -
             | 
| 125 | 
            +
                    repository.transactions_log.delete_if do |(method, options)|
         | 
| 134 126 |  | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 127 | 
            +
                      begin
         | 
| 128 | 
            +
                        case method
         | 
| 129 | 
            +
                          when :ingest
         | 
| 130 | 
            +
                            repository.purge_object :pid => options[:pid]
         | 
| 139 131 |  | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 132 | 
            +
                          when :modify_object
         | 
| 133 | 
            +
                            repository.modify_object options
         | 
| 142 134 |  | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 135 | 
            +
                          when :add_datastream
         | 
| 136 | 
            +
                            repository.purge_datastream :pid => options[:pid], :dsid => options[:dsid]
         | 
| 145 137 |  | 
| 146 | 
            -
             | 
| 147 | 
            -
             | 
| 138 | 
            +
                          when :add_relationship
         | 
| 139 | 
            +
                            repository.purge_relationship options[:options].merge(:pid => options[:pid])
         | 
| 148 140 |  | 
| 149 | 
            -
             | 
| 150 | 
            -
             | 
| 141 | 
            +
                          when :purge_relationship
         | 
| 142 | 
            +
                            repository.add_relationship options[:options].merge(:pid => options[:pid])
         | 
| 151 143 |  | 
| 152 | 
            -
             | 
| 153 | 
            -
             | 
| 144 | 
            +
                          when :purge_object
         | 
| 145 | 
            +
                            repository.ingest :pid => options[:pid], :file => options[:foxml]
         | 
| 154 146 |  | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 147 | 
            +
                          when :set_datastream_options
         | 
| 148 | 
            +
                            repository.set_datastream_options options
         | 
| 157 149 |  | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 150 | 
            +
                          when :modify_datastream
         | 
| 151 | 
            +
                            repository.purge_object :pid => options[:pid] rescue nil
         | 
| 152 | 
            +
                            repository.ingest :pid => options[:pid], :file => options[:foxml]
         | 
| 161 153 |  | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 154 | 
            +
                          when :purge_datastream
         | 
| 155 | 
            +
                            repository.purge_object :pid => options[:pid] rescue nil
         | 
| 156 | 
            +
                            repository.ingest :pid => options[:pid], :file => options[:foxml]
         | 
| 157 | 
            +
                        end
         | 
| 158 | 
            +
                      rescue
         | 
| 159 | 
            +
                        # no-op
         | 
| 165 160 | 
             
                      end
         | 
| 166 | 
            -
                    rescue
         | 
| 167 | 
            -
                      # no-op
         | 
| 168 | 
            -
                    end
         | 
| 169 | 
            -
             | 
| 170 | 
            -
                    run_hook :after_rollback, :pid => options[:pid], :method => method, :options => options
         | 
| 171 161 |  | 
| 172 | 
            -
             | 
| 162 | 
            +
                      run_hook :after_rollback, :pid => options[:pid], :method => method, :options => options
         | 
| 163 | 
            +
                    end
         | 
| 173 164 | 
             
                  end
         | 
| 174 165 | 
             
                  true
         | 
| 175 166 | 
             
                end
         | 
    
        data/rubydora.gemspec
    CHANGED
    
    | @@ -1,35 +1,35 @@ | |
| 1 1 | 
             
            # Provide a simple gemspec so you can easily use your enginex
         | 
| 2 2 | 
             
            # project in your rails apps through git.
         | 
| 3 | 
            -
            require File.join(File.dirname(__FILE__),  | 
| 3 | 
            +
            require File.join(File.dirname(__FILE__), 'lib/rubydora/version')
         | 
| 4 4 | 
             
            Gem::Specification.new do |s|
         | 
| 5 | 
            -
              s.name | 
| 6 | 
            -
              s.version | 
| 7 | 
            -
              s.platform | 
| 8 | 
            -
              s.authors | 
| 9 | 
            -
              s.email | 
| 10 | 
            -
              s.summary | 
| 11 | 
            -
              s.description =  | 
| 12 | 
            -
              s.homepage | 
| 5 | 
            +
              s.name        = 'rubydora'
         | 
| 6 | 
            +
              s.version     = Rubydora::VERSION
         | 
| 7 | 
            +
              s.platform    = Gem::Platform::RUBY
         | 
| 8 | 
            +
              s.authors     = ['Chris Beer']
         | 
| 9 | 
            +
              s.email       = ['chris@cbeer.info']
         | 
| 10 | 
            +
              s.summary     = 'Fedora Commons REST API ruby library'
         | 
| 11 | 
            +
              s.description = 'Fedora Commons REST API ruby library'
         | 
| 12 | 
            +
              s.homepage    = 'http://github.com/projecthydra/rubydora'
         | 
| 13 13 |  | 
| 14 14 | 
             
              s.files         = `git ls-files`.split("\n")
         | 
| 15 15 | 
             
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 16 16 | 
             
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 17 | 
            -
              s.require_paths = [ | 
| 17 | 
            +
              s.require_paths = ['lib']
         | 
| 18 18 |  | 
| 19 | 
            -
              s.add_dependency  | 
| 20 | 
            -
              s.add_dependency  | 
| 21 | 
            -
              s.add_dependency  | 
| 22 | 
            -
              s.add_dependency  | 
| 23 | 
            -
              s.add_dependency  | 
| 24 | 
            -
              s.add_dependency  | 
| 25 | 
            -
              s.add_dependency  | 
| 26 | 
            -
              s.add_dependency  | 
| 27 | 
            -
              s.add_dependency "deprecation"
         | 
| 19 | 
            +
              s.add_dependency 'rest-client'
         | 
| 20 | 
            +
              s.add_dependency 'nokogiri'
         | 
| 21 | 
            +
              s.add_dependency 'equivalent-xml'
         | 
| 22 | 
            +
              s.add_dependency 'mime-types'
         | 
| 23 | 
            +
              s.add_dependency 'activesupport'
         | 
| 24 | 
            +
              s.add_dependency 'activemodel'
         | 
| 25 | 
            +
              s.add_dependency 'hooks', '~> 0.3'
         | 
| 26 | 
            +
              s.add_dependency 'deprecation'
         | 
| 28 27 |  | 
| 29 | 
            -
              s.add_development_dependency | 
| 30 | 
            -
              s.add_development_dependency | 
| 31 | 
            -
              s.add_development_dependency | 
| 32 | 
            -
              s.add_development_dependency | 
| 33 | 
            -
              s.add_development_dependency | 
| 34 | 
            -
              s.add_development_dependency | 
| 28 | 
            +
              s.add_development_dependency 'rake'
         | 
| 29 | 
            +
              s.add_development_dependency 'yard'
         | 
| 30 | 
            +
              s.add_development_dependency 'bundler', '>= 1.0.14'
         | 
| 31 | 
            +
              s.add_development_dependency 'rspec', '~> 2.0'
         | 
| 32 | 
            +
              s.add_development_dependency 'jettywrapper', '>= 1.4.0'
         | 
| 33 | 
            +
              s.add_development_dependency 'webmock'
         | 
| 34 | 
            +
              s.add_development_dependency 'simplecov'
         | 
| 35 35 | 
             
            end
         | 
    
        data/spec/audit_trail_spec.rb
    CHANGED
    
    
    
        data/spec/lib/datastream_spec.rb
    CHANGED
    
    | @@ -28,7 +28,7 @@ describe Rubydora::Datastream do | |
| 28 28 | 
             
                  stub_response = double
         | 
| 29 29 | 
             
                  stub_response.stub(:read_body).and_yield("one1").and_yield('two2').and_yield('thre').and_yield('four')
         | 
| 30 30 | 
             
                  allow(stub_response).to receive(:headers) { {content_length: "16"} }
         | 
| 31 | 
            -
                  @mock_api.should_receive(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_yield(stub_response) | 
| 31 | 
            +
                  @mock_api.should_receive(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_yield(stub_response)
         | 
| 32 32 | 
             
                  subject.profile = Rubydora::ProfileParser.parse_datastream_profile(prof)
         | 
| 33 33 | 
             
                end
         | 
| 34 34 | 
             
                shared_examples "a streamable datastream" do
         | 
| @@ -166,7 +166,6 @@ describe Rubydora::Datastream do | |
| 166 166 | 
             
                #   @datastream.versionable.should be true
         | 
| 167 167 | 
             
                # end
         | 
| 168 168 |  | 
| 169 | 
            -
             | 
| 170 169 | 
             
                it "should call the appropriate api on save" do
         | 
| 171 170 | 
             
                  @datastream.stub(:content => 'content')
         | 
| 172 171 | 
             
                  @mock_api.should_receive(:add_datastream).with(hash_including(:content => 'content', :pid => 'pid', :dsid => 'dsid', :controlGroup => 'M', :dsState => 'A'))
         | 
| @@ -221,7 +220,7 @@ describe Rubydora::Datastream do | |
| 221 220 | 
             
                    <datastreamProfile>
         | 
| 222 221 | 
             
                    </datastreamProfile>
         | 
| 223 222 | 
             
                  XML
         | 
| 224 | 
            -
                  @datastream.dsChecksumValid.should be_nil | 
| 223 | 
            +
                  @datastream.dsChecksumValid.should be_nil
         | 
| 225 224 | 
             
                end
         | 
| 226 225 |  | 
| 227 226 | 
             
                it "should be true when it's returned as true" do
         | 
| @@ -268,7 +267,7 @@ describe Rubydora::Datastream do | |
| 268 267 | 
             
                end
         | 
| 269 268 |  | 
| 270 269 | 
             
                it "should mediate access to datastream contents" do
         | 
| 271 | 
            -
                  @mock_api.should_receive(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf') | 
| 270 | 
            +
                  @mock_api.should_receive(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf')
         | 
| 272 271 | 
             
                  @datastream.content.should == "asdf"
         | 
| 273 272 | 
             
                end
         | 
| 274 273 |  | 
| @@ -288,7 +287,6 @@ describe Rubydora::Datastream do | |
| 288 287 |  | 
| 289 288 | 
             
                end
         | 
| 290 289 |  | 
| 291 | 
            -
             | 
| 292 290 | 
             
              end
         | 
| 293 291 |  | 
| 294 292 | 
             
              describe "content changed behavior" do
         | 
| @@ -303,8 +301,13 @@ describe Rubydora::Datastream do | |
| 303 301 | 
             
                    XML
         | 
| 304 302 | 
             
                  end
         | 
| 305 303 |  | 
| 304 | 
            +
                  it "does not retrieve content unnecessarily" do
         | 
| 305 | 
            +
                    @mock_api.should_not_receive(:datastream_dissemination)
         | 
| 306 | 
            +
                    @datastream.content_changed?.should == false
         | 
| 307 | 
            +
                  end
         | 
| 308 | 
            +
             | 
| 306 309 | 
             
                  it "should not be changed after a read-only access" do
         | 
| 307 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf') | 
| 310 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf')
         | 
| 308 311 | 
             
                    @datastream.content
         | 
| 309 312 | 
             
                    @datastream.content_changed?.should == false
         | 
| 310 313 | 
             
                  end
         | 
| @@ -313,29 +316,29 @@ describe Rubydora::Datastream do | |
| 313 316 | 
             
                    @datastream.content_changed?.should == false
         | 
| 314 317 | 
             
                  end
         | 
| 315 318 | 
             
                  it "should be changed when the new content is different than the old content" do
         | 
| 316 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf') | 
| 319 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf')
         | 
| 317 320 | 
             
                    @datastream.content = "test"
         | 
| 318 | 
            -
                    @datastream.content_changed?.should == true | 
| 321 | 
            +
                    @datastream.content_changed?.should == true
         | 
| 319 322 | 
             
                  end
         | 
| 320 323 |  | 
| 321 324 | 
             
                  it "should not be changed when the new content is the same as the existing content (when eager-loading is enabled)" do
         | 
| 322 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('test') | 
| 325 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('test')
         | 
| 323 326 | 
             
                    @datastream.eager_load_datastream_content = true
         | 
| 324 327 | 
             
                    @datastream.content = "test"
         | 
| 325 | 
            -
                    @datastream.content_changed?.should  == false | 
| 328 | 
            +
                    @datastream.content_changed?.should  == false
         | 
| 326 329 | 
             
                  end
         | 
| 327 330 |  | 
| 328 331 | 
             
                  it "should  be changed when the new content is the same as the existing content (without eager loading, the default)" do
         | 
| 329 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('test') | 
| 332 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('test')
         | 
| 330 333 | 
             
                    @datastream.content = "test"
         | 
| 331 334 | 
             
                    @datastream.content_changed?.should  == true
         | 
| 332 335 | 
             
                  end
         | 
| 333 336 |  | 
| 334 337 | 
             
                  it "should not be changed when the new content is the same as the existing content (and we have accessed #content previously)" do
         | 
| 335 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('test') | 
| 338 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('test')
         | 
| 336 339 | 
             
                    @datastream.content
         | 
| 337 340 | 
             
                    @datastream.content = "test"
         | 
| 338 | 
            -
                    @datastream.content_changed?.should  == false | 
| 341 | 
            +
                    @datastream.content_changed?.should  == false
         | 
| 339 342 | 
             
                  end
         | 
| 340 343 | 
             
                end
         | 
| 341 344 |  | 
| @@ -350,14 +353,14 @@ describe Rubydora::Datastream do | |
| 350 353 | 
             
                    @datastream = Rubydora::Datastream.new @mock_object, 'dsid', :controlGroup => 'X'
         | 
| 351 354 | 
             
                  end
         | 
| 352 355 | 
             
                  it "should not be changed when the new content is the same as the existing content (when eager-loading is enabled)" do
         | 
| 353 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('<xml>test</xml>') | 
| 356 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('<xml>test</xml>')
         | 
| 354 357 | 
             
                    @datastream.eager_load_datastream_content = true
         | 
| 355 358 | 
             
                    @datastream.content = "<xml>test</xml>"
         | 
| 356 | 
            -
                    @datastream.content_changed?.should  == false | 
| 359 | 
            +
                    @datastream.content_changed?.should  == false
         | 
| 357 360 | 
             
                  end
         | 
| 358 361 |  | 
| 359 362 | 
             
                  it "should  be changed when the new content is the same as the existing content (without eager loading, the default)" do
         | 
| 360 | 
            -
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('<xml>test</xml>') | 
| 363 | 
            +
                    @mock_api.stub(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('<xml>test</xml>')
         | 
| 361 364 | 
             
                    @datastream.content = "<xml>test</xml>"
         | 
| 362 365 | 
             
                    @datastream.content_changed?.should  == true
         | 
| 363 366 | 
             
                  end
         | 
| @@ -372,12 +375,12 @@ describe Rubydora::Datastream do | |
| 372 375 | 
             
                subject { Rubydora::Datastream.new double(:pid => 'asdf', :new? => false), 'asdf' }
         | 
| 373 376 | 
             
                it "should have content if it is persisted" do
         | 
| 374 377 | 
             
                  subject.stub(:new? => false)
         | 
| 375 | 
            -
                  subject.should have_content | 
| 378 | 
            +
                  subject.should have_content
         | 
| 376 379 | 
             
                end
         | 
| 377 380 |  | 
| 378 381 | 
             
                it "should have content if it has content" do
         | 
| 379 382 | 
             
                  subject.content = "123"
         | 
| 380 | 
            -
                  subject.should have_content | 
| 383 | 
            +
                  subject.should have_content
         | 
| 381 384 | 
             
                end
         | 
| 382 385 |  | 
| 383 386 | 
             
                context "it has a dsLocation" do
         | 
| @@ -398,7 +401,7 @@ describe Rubydora::Datastream do | |
| 398 401 |  | 
| 399 402 | 
             
                it "should not have content otherwise" do
         | 
| 400 403 | 
             
                  subject.stub(:content => nil)
         | 
| 401 | 
            -
                  subject.should_not have_content | 
| 404 | 
            +
                  subject.should_not have_content
         | 
| 402 405 | 
             
                end
         | 
| 403 406 | 
             
              end
         | 
| 404 407 |  | 
| @@ -561,7 +564,7 @@ describe Rubydora::Datastream do | |
| 561 564 | 
             
                  end
         | 
| 562 565 |  | 
| 563 566 | 
             
                end
         | 
| 564 | 
            -
             | 
| 567 | 
            +
             | 
| 565 568 | 
             
              end
         | 
| 566 569 |  | 
| 567 570 | 
             
              describe "datastream attributes" do
         | 
| @@ -609,11 +612,11 @@ describe Rubydora::Datastream do | |
| 609 612 | 
             
                      subject.send("#{method}=", 'zxcv')
         | 
| 610 613 | 
             
                    end
         | 
| 611 614 |  | 
| 612 | 
            -
                    it "should appear in the save request" do | 
| 613 | 
            -
             | 
| 614 | 
            -
             | 
| 615 | 
            -
             | 
| 616 | 
            -
             | 
| 615 | 
            +
                    it "should appear in the save request" do
         | 
| 616 | 
            +
                     @mock_api.should_receive(:modify_datastream).with(hash_including(method.to_sym => 'new_value'))
         | 
| 617 | 
            +
                     subject.send("#{method}=", 'new_value')
         | 
| 618 | 
            +
                     subject.save
         | 
| 619 | 
            +
                     expect(subject).to_not be_changed, "#{subject.changes.inspect}"
         | 
| 617 620 | 
             
                   end
         | 
| 618 621 | 
             
                  end
         | 
| 619 622 | 
             
                end
         | 
| @@ -657,10 +660,10 @@ describe Rubydora::Datastream do | |
| 657 660 | 
             
                  end
         | 
| 658 661 |  | 
| 659 662 | 
             
                  it "should appear in the save request" do
         | 
| 660 | 
            -
             | 
| 661 | 
            -
             | 
| 662 | 
            -
             | 
| 663 | 
            -
             | 
| 663 | 
            +
                    @mock_api.should_receive(:modify_datastream).with(hash_including(method.to_sym => 'http://example.com'))
         | 
| 664 | 
            +
                    subject.stub(:content_changed? => false)
         | 
| 665 | 
            +
                    subject.dsLocation = 'http://example.com'
         | 
| 666 | 
            +
                    subject.save
         | 
| 664 667 | 
             
                  end
         | 
| 665 668 | 
             
                end
         | 
| 666 669 |  | 
| @@ -829,12 +832,12 @@ describe Rubydora::Datastream do | |
| 829 832 | 
             
                  end
         | 
| 830 833 | 
             
                end
         | 
| 831 834 |  | 
| 832 | 
            -
             | 
| 833 835 | 
             
                describe "without existing properties" do
         | 
| 834 836 | 
             
                  before(:each) do
         | 
| 835 837 | 
             
                    @datastream = Rubydora::Datastream.new @mock_object, 'dsid'
         | 
| 836 838 | 
             
                    @datastream.stub(:new? => true )
         | 
| 837 839 | 
             
                    @datastream.stub(:local_or_remote_content => '123')
         | 
| 840 | 
            +
                    @datastream.stub(:content_loaded? => true)
         | 
| 838 841 | 
             
                    @datastream.stub(:profile) { {} }
         | 
| 839 842 | 
             
                  end
         | 
| 840 843 | 
             
                  it "should compile parameters to hash" do
         | 
| @@ -880,7 +883,7 @@ describe Rubydora::Datastream do | |
| 880 883 | 
             
                after(:all) do
         | 
| 881 884 | 
             
                  Object.send(:remove_const, :MyDatastream)
         | 
| 882 885 | 
             
                end
         | 
| 883 | 
            -
             | 
| 886 | 
            +
             | 
| 884 887 | 
             
                describe "saving new datastream" do
         | 
| 885 888 | 
             
                  before do
         | 
| 886 889 | 
             
                    allow(@mock_api).to receive(:add_datastream).with(hash_including(:content => 'content', :pid => 'pid', :dsid => 'dsid', :controlGroup => 'M', :dsState => 'A')) { {} }
         | 
| @@ -913,4 +916,3 @@ describe Rubydora::Datastream do | |
| 913 916 | 
             
              end
         | 
| 914 917 |  | 
| 915 918 | 
             
            end
         | 
| 916 | 
            -
             | 
| @@ -68,7 +68,7 @@ describe Rubydora::DigitalObject do | |
| 68 68 |  | 
| 69 69 | 
             
                describe "without a provided pid" do
         | 
| 70 70 | 
             
                  subject { Rubydora::DigitalObject.new nil, @mock_api }
         | 
| 71 | 
            -
                  it "should create a new Fedora object with a generated PID if no PID is provided" do | 
| 71 | 
            +
                  it "should create a new Fedora object with a generated PID if no PID is provided" do
         | 
| 72 72 | 
             
                    @mock_api.should_receive(:ingest).with(hash_including(:pid => nil)).and_return('pid')
         | 
| 73 73 | 
             
                    @mock_api.should_receive(:datastreams).with(hash_including(:pid => 'pid')).and_raise(RestClient::ResourceNotFound)
         | 
| 74 74 | 
             
                    subject.save
         | 
| @@ -93,13 +93,14 @@ describe Rubydora::DigitalObject do | |
| 93 93 | 
             
              end
         | 
| 94 94 |  | 
| 95 95 | 
             
              describe "retreive datastreams" do
         | 
| 96 | 
            -
                describe "without profiles (fedora < 3.6)" do | 
| 96 | 
            +
                describe "without profiles (fedora < 3.6)" do
         | 
| 97 97 | 
             
                  before(:each) do
         | 
| 98 98 | 
             
                    @mock_api.stub :datastreams do |hash|
         | 
| 99 99 | 
             
                      "<objectDatastreams><datastream dsid='a'></datastream><datastream dsid='b'></datastream><datastream dsid='c'></datastream></objectDatastreams>"
         | 
| 100 100 | 
             
                    end
         | 
| 101 101 | 
             
                    @object = Rubydora::DigitalObject.new 'pid', @mock_api
         | 
| 102 102 | 
             
                    @object.stub(:new_record? => false)
         | 
| 103 | 
            +
                    @object.stub(:new? => false)
         | 
| 103 104 | 
             
                  end
         | 
| 104 105 |  | 
| 105 106 | 
             
                  it "should provide a hash populated by the existing datastreams" do
         | 
| @@ -137,7 +138,7 @@ describe Rubydora::DigitalObject do | |
| 137 138 | 
             
                    object.datastreams['asdf'].should be_a_kind_of(MyCustomDatastreamClass)
         | 
| 138 139 | 
             
                  end
         | 
| 139 140 | 
             
                end
         | 
| 140 | 
            -
                describe "with profiles (fedora >= 3.6)" do | 
| 141 | 
            +
                describe "with profiles (fedora >= 3.6)" do
         | 
| 141 142 | 
             
                  before(:each) do
         | 
| 142 143 | 
             
                    @mock_api.stub :datastreams do |hash|
         | 
| 143 144 | 
             
                      "<objectDatastreams>
         | 
| @@ -148,6 +149,7 @@ describe Rubydora::DigitalObject do | |
| 148 149 | 
             
                    end
         | 
| 149 150 | 
             
                    @object = Rubydora::DigitalObject.new 'pid', @mock_api
         | 
| 150 151 | 
             
                    @object.stub(:new_record? => false)
         | 
| 152 | 
            +
                    @object.stub(:new? => false)
         | 
| 151 153 | 
             
                  end
         | 
| 152 154 |  | 
| 153 155 | 
             
                  it "should provide a hash populated by the existing datastreams" do
         | 
| @@ -185,8 +187,9 @@ describe Rubydora::DigitalObject do | |
| 185 187 | 
             
                    </datastreamProfile>
         | 
| 186 188 | 
             
                  </objectDatastreams>
         | 
| 187 189 | 
             
                  XML
         | 
| 188 | 
            -
             | 
| 190 | 
            +
                  @object = Rubydora::DigitalObject.new 'pid', @mock_api
         | 
| 189 191 | 
             
                  @object.stub(:new_record? => false)
         | 
| 192 | 
            +
                  @object.stub(:new? => false)
         | 
| 190 193 | 
             
                end
         | 
| 191 194 | 
             
                describe "datastreams" do
         | 
| 192 195 | 
             
                  it "should provide a hash populated by the existing datastreams" do
         | 
| @@ -269,7 +272,7 @@ describe Rubydora::DigitalObject do | |
| 269 272 | 
             
                    # object date should be canonicalized and updated
         | 
| 270 273 | 
             
                    @object.lastModifiedDate.should == '2012-01-02:05:15:45.1Z'
         | 
| 271 274 | 
             
                  end
         | 
| 272 | 
            -
             | 
| 275 | 
            +
             | 
| 273 276 | 
             
                  it "should not set lastModifiedDate if the before_save callback is false" do
         | 
| 274 277 | 
             
                    @object.stub(:datastreams) { { :changed_ds => @changed_ds } }
         | 
| 275 278 | 
             
                    @changed_ds.should_receive(:dsCreateDate).and_return(nil)
         | 
| @@ -451,7 +454,7 @@ describe Rubydora::DigitalObject do | |
| 451 454 | 
             
                  Rubydora::Datastream.should_receive(:new).with(anything, 'my_ds', hash_including(:asOfDateTime => '2011-09-26T20:41:02.450Z'))
         | 
| 452 455 | 
             
                  ds = @object.versions.first['my_ds']
         | 
| 453 456 | 
             
                end
         | 
| 454 | 
            -
             | 
| 457 | 
            +
             | 
| 455 458 | 
             
              end
         | 
| 456 459 |  | 
| 457 460 | 
             
              describe "to_api_params" do
         | 
| @@ -479,7 +482,7 @@ describe Rubydora::DigitalObject do | |
| 479 482 |  | 
| 480 483 | 
             
                  it "should fall-back to the set of default attributes" do
         | 
| 481 484 | 
             
                    @mock_api.should_receive(:object).with(:pid=>"pid").and_raise(RestClient::ResourceNotFound)
         | 
| 482 | 
            -
                    Rubydora::DigitalObject::OBJ_DEFAULT_ATTRIBUTES.should_receive(:[]).with(method.to_sym) { 'zxcv'} | 
| 485 | 
            +
                    Rubydora::DigitalObject::OBJ_DEFAULT_ATTRIBUTES.should_receive(:[]).with(method.to_sym) { 'zxcv'}
         | 
| 483 486 | 
             
                    subject.send(method).should == 'zxcv'
         | 
| 484 487 | 
             
                  end
         | 
| 485 488 | 
             
                end
         | 
| @@ -499,7 +502,7 @@ describe Rubydora::DigitalObject do | |
| 499 502 | 
             
                    subject.send("#{method}=", 'zxcv')
         | 
| 500 503 | 
             
                  end
         | 
| 501 504 |  | 
| 502 | 
            -
                  it "should appear in the save request" do | 
| 505 | 
            +
                  it "should appear in the save request" do
         | 
| 503 506 | 
             
                    @mock_api.should_receive(:ingest).with(hash_including(method.to_sym => 'new_value'))
         | 
| 504 507 | 
             
                    @mock_api.should_receive(:object).with(:pid=>"pid").and_raise(RestClient::ResourceNotFound)
         | 
| 505 508 | 
             
                    subject.send("#{method}=", 'new_value')
         | 
| @@ -524,7 +527,7 @@ describe Rubydora::DigitalObject do | |
| 524 527 |  | 
| 525 528 | 
             
                  it "should fall-back to the set of default attributes" do
         | 
| 526 529 | 
             
                    @mock_api.should_receive(:object).with(:pid=>"pid").and_raise(RestClient::ResourceNotFound)
         | 
| 527 | 
            -
                    Rubydora::DigitalObject::OBJ_DEFAULT_ATTRIBUTES.should_receive(:[]).with(:state) { 'zxcv'} | 
| 530 | 
            +
                    Rubydora::DigitalObject::OBJ_DEFAULT_ATTRIBUTES.should_receive(:[]).with(:state) { 'zxcv'}
         | 
| 528 531 | 
             
                    subject.state.should == 'zxcv'
         | 
| 529 532 | 
             
                  end
         | 
| 530 533 | 
             
                end
         | 
| @@ -549,7 +552,7 @@ describe Rubydora::DigitalObject do | |
| 549 552 | 
             
                    subject.should_not be_changed
         | 
| 550 553 | 
             
                  end
         | 
| 551 554 |  | 
| 552 | 
            -
                  it "should appear in the save request" do | 
| 555 | 
            +
                  it "should appear in the save request" do
         | 
| 553 556 | 
             
                    @mock_api.should_receive(:ingest).with(hash_including(:state => 'A'))
         | 
| 554 557 | 
             
                    @mock_api.should_receive(:object).with(:pid=>"pid").and_raise(RestClient::ResourceNotFound)
         | 
| 555 558 | 
             
                    subject.state='A'
         |