moab-versioning 4.2.0 → 4.2.1
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/lib/moab/bagger.rb +17 -19
- data/lib/moab/config.rb +5 -6
- data/lib/moab/deposit_bag_validator.rb +2 -4
- data/lib/moab/exceptions.rb +0 -5
- data/lib/moab/file_group.rb +13 -17
- data/lib/moab/file_group_difference.rb +15 -19
- data/lib/moab/file_group_difference_subset.rb +2 -4
- data/lib/moab/file_instance.rb +3 -8
- data/lib/moab/file_instance_difference.rb +2 -6
- data/lib/moab/file_inventory.rb +18 -22
- data/lib/moab/file_inventory_difference.rb +3 -7
- data/lib/moab/file_manifestation.rb +3 -6
- data/lib/moab/file_signature.rb +45 -33
- data/lib/moab/signature_catalog.rb +13 -16
- data/lib/moab/signature_catalog_entry.rb +3 -7
- data/lib/moab/storage_object.rb +28 -31
- data/lib/moab/storage_object_validator.rb +28 -70
- data/lib/moab/storage_object_version.rb +47 -50
- data/lib/moab/storage_repository.rb +17 -21
- data/lib/moab/storage_services.rb +12 -14
- data/lib/moab/utc_time.rb +18 -19
- data/lib/moab/verification_result.rb +26 -37
- data/lib/moab/version_metadata.rb +1 -5
- data/lib/moab/version_metadata_entry.rb +2 -6
- data/lib/moab/version_metadata_event.rb +2 -7
- data/lib/serializer/manifest.rb +6 -10
- data/lib/serializer/serializable.rb +23 -27
- data/lib/stanford/active_fedora_object.rb +0 -4
- data/lib/stanford/content_inventory.rb +49 -52
- data/lib/stanford/dor_metadata.rb +5 -8
- data/lib/stanford/storage_object_validator.rb +1 -2
- data/lib/stanford/storage_repository.rb +0 -4
- data/lib/stanford/storage_services.rb +6 -10
- metadata +2 -2
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A class to represent the SDR repository store
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -14,7 +13,6 @@ module Moab
|
|
14
13
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
15
14
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
16
15
|
class StorageRepository
|
17
|
-
|
18
16
|
# Note that Moab::Config is not initialized from environment config file until after
|
19
17
|
# this object is initialized by StorageServices
|
20
18
|
# (see sequence of requires in spec_helper.rb and in applications that use)
|
@@ -23,9 +21,9 @@ module Moab
|
|
23
21
|
def storage_roots
|
24
22
|
unless defined?(@storage_roots)
|
25
23
|
raise "Moab::Config.storage_roots not found in config file" if Moab::Config.storage_roots.nil?
|
26
|
-
@storage_roots = [Moab::Config.storage_roots].flatten.collect{|filesystem| Pathname(filesystem)}
|
27
|
-
raise "Moab::Config.storage_roots empty" if
|
28
|
-
@storage_roots.each{|root| raise "Storage root #{root} not found on system" unless root.exist?}
|
24
|
+
@storage_roots = [Moab::Config.storage_roots].flatten.collect { |filesystem| Pathname(filesystem) }
|
25
|
+
raise "Moab::Config.storage_roots empty" if @storage_roots.empty?
|
26
|
+
@storage_roots.each { |root| raise "Storage root #{root} not found on system" unless root.exist? }
|
29
27
|
end
|
30
28
|
@storage_roots
|
31
29
|
end
|
@@ -33,7 +31,7 @@ module Moab
|
|
33
31
|
# @return [String] The trunk segment of the object storage path
|
34
32
|
def storage_trunk
|
35
33
|
unless defined?(@storage_trunk)
|
36
|
-
raise "
|
34
|
+
raise "Moab::Config.storage_trunk not found in config file" if Moab::Config.storage_trunk.nil?
|
37
35
|
@storage_trunk = Moab::Config.storage_trunk
|
38
36
|
end
|
39
37
|
@storage_trunk
|
@@ -69,7 +67,7 @@ module Moab
|
|
69
67
|
# @param object_id [String] The identifier of the digital object whose version is desired
|
70
68
|
# @param include_deposit [Boolean] specifies whether to look in deposit areas for objects in process of initial ingest
|
71
69
|
# @return [Pathname] The location of the desired object's home directory (default=pairtree)
|
72
|
-
def find_storage_root(object_id, include_deposit=false)
|
70
|
+
def find_storage_root(object_id, include_deposit = false)
|
73
71
|
# Search for the object's home directory in the storage areas
|
74
72
|
branch = storage_branch(object_id)
|
75
73
|
storage_roots.each do |root|
|
@@ -95,7 +93,7 @@ module Moab
|
|
95
93
|
# @param object_id [String] The identifier of the digital object whose version is desired
|
96
94
|
# @param include_deposit [Boolean] specifies whether to look in deposit areas for objects in process of initial ingest
|
97
95
|
# @return [StorageObject] The representation of a digitial object's storage directory, which might not exist yet.
|
98
|
-
def find_storage_object(object_id, include_deposit=false)
|
96
|
+
def find_storage_object(object_id, include_deposit = false)
|
99
97
|
root = find_storage_root(object_id, include_deposit)
|
100
98
|
storage_pathname = root.join(storage_trunk, storage_branch(object_id))
|
101
99
|
storage_object = StorageObject.new(object_id, storage_pathname)
|
@@ -106,7 +104,7 @@ module Moab
|
|
106
104
|
# @param object_id [String] The identifier of the digital object whose size is desired
|
107
105
|
# @param include_deposit [Boolean] specifies whether to look in deposit areas for objects in process of initial ingest
|
108
106
|
# @return [Integer] the size occupied on disk by the storage object, in bytes. this is the entire moab (all versions).
|
109
|
-
def object_size(object_id, include_deposit=false)
|
107
|
+
def object_size(object_id, include_deposit = false)
|
110
108
|
storage_pathname = find_storage_object(object_id, include_deposit).object_pathname
|
111
109
|
size = 0
|
112
110
|
Find.find(storage_pathname) do |path|
|
@@ -118,27 +116,25 @@ module Moab
|
|
118
116
|
# @param object_id [String] The identifier of the digital object whose version is desired
|
119
117
|
# @param create [Boolean] If true, the object home directory should be created if it does not exist
|
120
118
|
# @return [StorageObject] The representation of a digitial object's storage directory, which must exist.
|
121
|
-
def storage_object(object_id, create=false)
|
122
|
-
|
123
|
-
|
124
|
-
|
119
|
+
def storage_object(object_id, create = false)
|
120
|
+
storage_object = find_storage_object(object_id)
|
121
|
+
unless storage_object.object_pathname.exist?
|
122
|
+
if create
|
125
123
|
storage_object.object_pathname.mkpath
|
126
|
-
|
127
|
-
|
124
|
+
else
|
125
|
+
raise Moab::ObjectNotFoundException, "No storage object found for #{object_id}"
|
126
|
+
end
|
128
127
|
end
|
129
|
-
|
130
|
-
storage_object
|
128
|
+
storage_object
|
131
129
|
end
|
132
130
|
|
133
131
|
# @depricated Please use StorageObject#ingest_bag
|
134
132
|
# @param druid [String] The object identifier
|
135
133
|
# @return [void] transfer the object to the preservation repository
|
136
|
-
def store_new_object_version(druid, bag_pathname
|
137
|
-
storage_object = self.storage_object(druid, create=true)
|
134
|
+
def store_new_object_version(druid, bag_pathname)
|
135
|
+
storage_object = self.storage_object(druid, create = true)
|
138
136
|
new_version = storage_object.ingest_bag(bag_pathname)
|
139
137
|
new_version
|
140
138
|
end
|
141
|
-
|
142
139
|
end
|
143
|
-
|
144
140
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# An interface class to support access to SDR storage via a RESTful server
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -14,7 +13,6 @@ module Moab
|
|
14
13
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
15
14
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
16
15
|
class StorageServices
|
17
|
-
|
18
16
|
# @return [StorageRepository] an instance of the interface to SDR storage
|
19
17
|
@@repository = Moab::StorageRepository.new
|
20
18
|
|
@@ -41,21 +39,21 @@ module Moab
|
|
41
39
|
# @param object_id [String] The identifier of the digital object
|
42
40
|
# @param [Object] include_deposit
|
43
41
|
# @return [StorageObject] The representation of a digitial object's storage directory, which might not exist yet.
|
44
|
-
def self.find_storage_object(object_id, include_deposit=false)
|
42
|
+
def self.find_storage_object(object_id, include_deposit = false)
|
45
43
|
@@repository.find_storage_object(object_id, include_deposit)
|
46
44
|
end
|
47
45
|
|
48
46
|
# @param object_id [String] The identifier of the digital object whose size is desired
|
49
47
|
# @param include_deposit [Boolean] specifies whether to look in deposit areas for objects in process of initial ingest
|
50
48
|
# @return [Integer] the size occupied on disk by the storage object, in bytes. this is the entire moab (all versions).
|
51
|
-
def self.object_size(object_id, include_deposit=false)
|
49
|
+
def self.object_size(object_id, include_deposit = false)
|
52
50
|
@@repository.object_size(object_id, include_deposit)
|
53
51
|
end
|
54
52
|
|
55
53
|
# @param object_id [String] The identifier of the digital object whose version is desired
|
56
54
|
# @param create [Boolean] If true, the object home directory should be created if it does not exist
|
57
55
|
# @return [StorageObject] The representation of a digitial object's storage directory, which must exist.
|
58
|
-
def self.storage_object(object_id, create=false)
|
56
|
+
def self.storage_object(object_id, create = false)
|
59
57
|
@@repository.storage_object(object_id, create)
|
60
58
|
end
|
61
59
|
|
@@ -68,7 +66,7 @@ module Moab
|
|
68
66
|
# @param object_id [String] The digital object identifier of the object
|
69
67
|
# @param [Integer] version_id The ID of the version, if nil use latest version
|
70
68
|
# @return [String] the location of the storage object version
|
71
|
-
def self.object_version_path(object_id,version_id=nil)
|
69
|
+
def self.object_version_path(object_id, version_id = nil)
|
72
70
|
@@repository.storage_object(object_id).find_object_version(version_id).version_pathname.to_s
|
73
71
|
end
|
74
72
|
|
@@ -87,7 +85,7 @@ module Moab
|
|
87
85
|
# @param [String] object_id The digital object identifier of the object
|
88
86
|
# @param [Integer] version_id The ID of the version, if nil use latest version
|
89
87
|
# @return [FileInventory] the file inventory for the specified object version
|
90
|
-
def self.retrieve_file_group(file_category, object_id, version_id=nil)
|
88
|
+
def self.retrieve_file_group(file_category, object_id, version_id = nil)
|
91
89
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
92
90
|
if file_category =~ /manifest/
|
93
91
|
inventory_type = file_category = 'manifests'
|
@@ -103,7 +101,7 @@ module Moab
|
|
103
101
|
# @param [String] object_id The digital object identifier of the object
|
104
102
|
# @param [Integer] version_id The ID of the version, if nil use latest version
|
105
103
|
# @return [Pathname] Pathname object containing the full path for the specified file
|
106
|
-
def self.retrieve_file(file_category, file_id, object_id, version_id=nil)
|
104
|
+
def self.retrieve_file(file_category, file_id, object_id, version_id = nil)
|
107
105
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
108
106
|
file_pathname = storage_object_version.find_filepath(file_category, file_id)
|
109
107
|
end
|
@@ -113,7 +111,7 @@ module Moab
|
|
113
111
|
# @param [String] object_id The digital object identifier of the object
|
114
112
|
# @param [Integer] version_id The ID of the version, if nil use latest version
|
115
113
|
# @return [Pathname] Pathname object containing the full path for the specified file
|
116
|
-
def self.retrieve_file_using_signature(file_category, file_signature, object_id, version_id=nil)
|
114
|
+
def self.retrieve_file_using_signature(file_category, file_signature, object_id, version_id = nil)
|
117
115
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
118
116
|
file_pathname = storage_object_version.find_filepath_using_signature(file_category, file_signature)
|
119
117
|
end
|
@@ -123,7 +121,7 @@ module Moab
|
|
123
121
|
# @param [String] object_id The digital object identifier of the object
|
124
122
|
# @param [Integer] version_id The ID of the version, if nil use latest version
|
125
123
|
# @return [FileSignature] The signature of the file
|
126
|
-
def self.retrieve_file_signature(file_category, file_id, object_id, version_id=nil)
|
124
|
+
def self.retrieve_file_signature(file_category, file_id, object_id, version_id = nil)
|
127
125
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
128
126
|
file_pathname = storage_object_version.find_signature(file_category, file_id)
|
129
127
|
end
|
@@ -132,12 +130,12 @@ module Moab
|
|
132
130
|
# @param [Object] base_version_id The identifier of the base version to be compared
|
133
131
|
# @param [Object] compare_version_id The identifier of the version to be compared to the base version
|
134
132
|
# @return [FileInventoryDifference] The report of the version differences
|
135
|
-
def self.version_differences(object_id, base_version_id,compare_version_id)
|
133
|
+
def self.version_differences(object_id, base_version_id, compare_version_id)
|
136
134
|
base_version = @@repository.storage_object(object_id).storage_object_version(base_version_id)
|
137
135
|
compare_version = @@repository.storage_object(object_id).storage_object_version(compare_version_id)
|
138
|
-
base_inventory=base_version.file_inventory('version')
|
139
|
-
compare_inventory=compare_version.file_inventory('version')
|
140
|
-
FileInventoryDifference.new.compare(base_inventory,compare_inventory)
|
136
|
+
base_inventory = base_version.file_inventory('version')
|
137
|
+
compare_inventory = compare_version.file_inventory('version')
|
138
|
+
FileInventoryDifference.new.compare(base_inventory, compare_inventory)
|
141
139
|
end
|
142
140
|
end
|
143
141
|
end
|
data/lib/moab/utc_time.rb
CHANGED
@@ -3,21 +3,20 @@ require 'time'
|
|
3
3
|
module Moab
|
4
4
|
# Timestamp conversion methods.
|
5
5
|
class UtcTime
|
6
|
-
|
7
6
|
# @param datetime [Time,String,Nil] The input datetime
|
8
7
|
# @return [void] Convert input datetime to a Time object, or nil if input is empty.
|
9
8
|
def self.input(datetime)
|
10
9
|
case datetime
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
when nil
|
11
|
+
nil
|
12
|
+
when ""
|
13
|
+
nil
|
14
|
+
when String
|
15
|
+
Time.parse(datetime)
|
16
|
+
when Time
|
17
|
+
datetime
|
18
|
+
else
|
19
|
+
raise "unknown time format #{datetime.inspect}"
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
@@ -25,14 +24,14 @@ module Moab
|
|
25
24
|
# @return [String] Convert the datetime into a ISO 8601 formatted string
|
26
25
|
def self.output(datetime)
|
27
26
|
case datetime
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
when nil, ""
|
28
|
+
""
|
29
|
+
when String
|
30
|
+
Time.parse(datetime).utc.iso8601
|
31
|
+
when Time
|
32
|
+
datetime.utc.iso8601
|
33
|
+
else
|
34
|
+
raise "unknown time format #{datetime.inspect}"
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
4
|
+
# A recursive "Tree" type object for verifications
|
5
5
|
class VerificationResult
|
6
|
-
|
7
6
|
# @return [String] The name of the entity that was verified
|
8
7
|
attr_accessor :entity
|
9
8
|
|
@@ -16,69 +15,59 @@ module Moab
|
|
16
15
|
# @return [Array<VerificationResult>] The subentities, if any, on which this verification is based
|
17
16
|
attr_accessor :subentities
|
18
17
|
|
19
|
-
# @param entity [
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@
|
18
|
+
# @param entity [#to_s] The name of the entity being verified
|
19
|
+
# @param verified [Boolean]
|
20
|
+
# @param details [Hash]
|
21
|
+
def initialize(entity, verified = false, details = nil)
|
22
|
+
@entity = entity.to_s # force to string
|
23
|
+
@verified = !!verified # rubocop:disable Style/DoubleNegation
|
24
|
+
@details = details
|
24
25
|
@subentities = Array.new
|
25
26
|
end
|
26
27
|
|
27
|
-
# @param entity [
|
28
|
+
# @param entity [#to_s] The name of the entity being verified
|
28
29
|
# @param expected [Object] The expected value
|
29
30
|
# @param found [Object] The found value
|
30
31
|
# @return [VerificationResult] The result of comparing the expected and found values
|
31
32
|
def self.verify_value(entity, expected, found)
|
32
|
-
|
33
|
-
|
34
|
-
result.details = {'expected' => expected, 'found' => found}
|
35
|
-
result
|
33
|
+
details = { 'expected' => expected, 'found' => found }
|
34
|
+
new(entity, (expected == found), details)
|
36
35
|
end
|
37
36
|
|
38
|
-
# @
|
37
|
+
# @deprecated Just use the constructor
|
38
|
+
# @param entity [#to_s] The name of the entity being verified
|
39
39
|
# @param expression [Object] The expression that will be evaluated as true or false
|
40
40
|
# @param details [Object] optional details that could be reported
|
41
41
|
# @return [VerificationResult] The result of evaluating the expression
|
42
|
-
def self.verify_truth(entity,expression,details=nil)
|
43
|
-
|
44
|
-
# TODO: add expression.empty?
|
45
|
-
result.verified = !(expression.nil? or (expression == false))
|
46
|
-
result.details = details
|
47
|
-
result
|
42
|
+
def self.verify_truth(entity, expression, details = nil)
|
43
|
+
new(entity, expression, details)
|
48
44
|
end
|
49
45
|
|
50
46
|
# @param verbose [Boolean] If true, always provide all details of the verification
|
51
47
|
# @return [String] The verification result serialized to JSON
|
52
|
-
def to_json(verbose=false)
|
48
|
+
def to_json(verbose = false)
|
53
49
|
JSON.pretty_generate(to_hash(verbose))
|
54
50
|
end
|
55
51
|
|
56
52
|
# @param verbose [Boolean] If true, always provide all details of the verification
|
57
53
|
# @param level [Integer] Used to test the depth of recursion
|
58
54
|
# @return [Hash] The verification result serialized to a hash
|
59
|
-
def to_hash(verbose=false,level=0)
|
60
|
-
hash =
|
61
|
-
|
62
|
-
|
63
|
-
hash['details'] = @details ? @details : subentities_to_hash(verbose,level)
|
64
|
-
end
|
65
|
-
if level > 0
|
66
|
-
hash
|
67
|
-
else
|
68
|
-
{@entity => hash}
|
55
|
+
def to_hash(verbose = false, level = 0)
|
56
|
+
hash = { 'verified' => verified }
|
57
|
+
if verbose || !verified
|
58
|
+
hash['details'] = details || subentities_to_hash(verbose, level)
|
69
59
|
end
|
60
|
+
return hash if level > 0
|
61
|
+
{ entity => hash }
|
70
62
|
end
|
71
63
|
|
64
|
+
private
|
65
|
+
|
72
66
|
# @param verbose [Boolean] If true, always provide all details of the verification
|
73
67
|
# @param level [Integer] Used to increment the depth of recursion
|
74
68
|
# @return [Hash] The verification result of subentities serialized to a hash
|
75
|
-
def subentities_to_hash(verbose,level)
|
76
|
-
|
77
|
-
@subentities.each do |s|
|
78
|
-
hash[s.entity] = s.to_hash(verbose, level+1)
|
79
|
-
end
|
80
|
-
hash
|
69
|
+
def subentities_to_hash(verbose, level)
|
70
|
+
subentities.map { |s| [s.entity, s.to_hash(verbose, level + 1)] }.to_h
|
81
71
|
end
|
82
|
-
|
83
72
|
end
|
84
73
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# The descriptive information about a digital object's collection of versions
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -13,14 +12,13 @@ module Moab
|
|
13
12
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
14
13
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
15
14
|
class VersionMetadata < Serializer::Manifest
|
16
|
-
|
17
15
|
include HappyMapper
|
18
16
|
|
19
17
|
# The name of the XML element used to serialize this objects data
|
20
18
|
tag 'versionMetadata'
|
21
19
|
|
22
20
|
# (see Serializable#initialize)
|
23
|
-
def initialize(opts={})
|
21
|
+
def initialize(opts = {})
|
24
22
|
@versions = Array.new
|
25
23
|
super(opts)
|
26
24
|
end
|
@@ -32,7 +30,5 @@ module Moab
|
|
32
30
|
# @attribute
|
33
31
|
# @return [Array<VersionMetadataEntry>] An array of version metadata entries, one per version
|
34
32
|
has_many :versions, VersionMetadataEntry, :tag => 'version'
|
35
|
-
|
36
33
|
end
|
37
|
-
|
38
34
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# The descriptive attributes of a digital object version.
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -12,21 +11,20 @@ module Moab
|
|
12
11
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
13
12
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
14
13
|
class VersionMetadataEntry < Serializer::Serializable
|
15
|
-
|
16
14
|
include HappyMapper
|
17
15
|
|
18
16
|
# The name of the XML element used to serialize this objects data
|
19
17
|
tag 'version'
|
20
18
|
|
21
19
|
# (see Serializable#initialize)
|
22
|
-
def initialize(opts={})
|
20
|
+
def initialize(opts = {})
|
23
21
|
@events = Array.new
|
24
22
|
super(opts)
|
25
23
|
end
|
26
24
|
|
27
25
|
# @attribute
|
28
26
|
# @return [Integer] The object version number (A sequential integer)
|
29
|
-
attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => Proc.new {|n| n.to_s}
|
27
|
+
attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => Proc.new { |n| n.to_s }
|
30
28
|
|
31
29
|
# @attribute
|
32
30
|
# @return [String] "an external version label that increments the most significant digit for major revisions,
|
@@ -57,7 +55,5 @@ module Moab
|
|
57
55
|
# @attribute
|
58
56
|
# @return [Array<VersionMetadataEvent>] Array of events with timestamps that track lifecycle stages
|
59
57
|
has_many :events, VersionMetadataEvent, :tag => 'event'
|
60
|
-
|
61
58
|
end
|
62
|
-
|
63
59
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A container element to record object version lifecycle events with timestamps
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -14,14 +13,13 @@ module Moab
|
|
14
13
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
15
14
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
16
15
|
class VersionMetadataEvent < Serializer::Serializable
|
17
|
-
|
18
16
|
include HappyMapper
|
19
17
|
|
20
18
|
# The name of the XML element used to serialize this objects data
|
21
19
|
tag 'event'
|
22
20
|
|
23
21
|
# (see Serializable#initialize)
|
24
|
-
def initialize(opts={})
|
22
|
+
def initialize(opts = {})
|
25
23
|
super(opts)
|
26
24
|
end
|
27
25
|
|
@@ -29,19 +27,16 @@ module Moab
|
|
29
27
|
# @return [String] The type of event
|
30
28
|
attribute :type, String
|
31
29
|
|
32
|
-
|
33
30
|
# @attribute
|
34
31
|
# @return [String] The date and time of an event
|
35
32
|
attribute :datetime, String
|
36
33
|
|
37
34
|
def datetime=(event_datetime)
|
38
|
-
@datetime=Moab::UtcTime.input(event_datetime)
|
35
|
+
@datetime = Moab::UtcTime.input(event_datetime)
|
39
36
|
end
|
40
37
|
|
41
38
|
def datetime
|
42
39
|
Moab::UtcTime.output(@datetime)
|
43
40
|
end
|
44
|
-
|
45
41
|
end
|
46
|
-
|
47
42
|
end
|