hydra-works 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +17 -8
- data/README.md +9 -9
- data/hydra-works.gemspec +3 -4
- data/lib/hydra/works.rb +22 -13
- data/lib/hydra/works/characterization.rb +31 -0
- data/lib/hydra/works/characterization/schema/audio_schema.rb +12 -0
- data/lib/hydra/works/characterization/schema/base_schema.rb +17 -0
- data/lib/hydra/works/characterization/schema/document_schema.rb +18 -0
- data/lib/hydra/works/characterization/schema/image_schema.rb +22 -0
- data/lib/hydra/works/characterization/schema/video_schema.rb +9 -0
- data/lib/hydra/works/models/characterization/already_there_strategy.rb +12 -0
- data/lib/hydra/works/models/characterization/fits_datastream.rb +162 -0
- data/lib/hydra/works/models/concerns/collection_behavior.rb +42 -34
- data/lib/hydra/works/models/concerns/file_set/characterization/audio.rb +14 -0
- data/lib/hydra/works/models/concerns/file_set/characterization/base.rb +23 -0
- data/lib/hydra/works/models/concerns/file_set/characterization/document.rb +10 -0
- data/lib/hydra/works/models/concerns/file_set/characterization/image.rb +10 -0
- data/lib/hydra/works/models/concerns/file_set/characterization/video.rb +17 -0
- data/lib/hydra/works/models/concerns/{generic_file → file_set}/contained_files.rb +1 -1
- data/lib/hydra/works/models/concerns/file_set/derivatives.rb +27 -0
- data/lib/hydra/works/models/concerns/{generic_file → file_set}/mime_types.rb +1 -1
- data/lib/hydra/works/models/concerns/{generic_file → file_set}/versioned_content.rb +2 -2
- data/lib/hydra/works/models/concerns/{generic_file → file_set}/virus_check.rb +1 -1
- data/lib/hydra/works/models/concerns/file_set_behavior.rb +67 -0
- data/lib/hydra/works/models/concerns/generic_file_behavior.rb +4 -50
- data/lib/hydra/works/models/concerns/generic_work_behavior.rb +5 -77
- data/lib/hydra/works/models/concerns/work_behavior.rb +118 -0
- data/lib/hydra/works/models/file_set.rb +7 -0
- data/lib/hydra/works/models/generic_file.rb +8 -8
- data/lib/hydra/works/models/generic_work.rb +15 -4
- data/lib/hydra/works/models/work.rb +6 -0
- data/lib/hydra/works/services/{generic_file/add_file_to_generic_file.rb → add_file_to_file_set.rb} +20 -20
- data/lib/hydra/works/services/add_file_to_generic_file.rb +8 -0
- data/lib/hydra/works/services/characterization_service.rb +118 -0
- data/lib/hydra/works/services/persist_derivative.rb +35 -0
- data/lib/hydra/works/services/{generic_file/upload_file_to_generic_file.rb → upload_file_to_file_set.rb} +3 -3
- data/lib/hydra/works/services/upload_file_to_generic_file.rb +8 -0
- data/lib/hydra/works/version.rb +1 -1
- data/lib/hydra/works/vocab/works_terms.rb +2 -2
- data/spec/fixtures/fits_0.6.2_avi.xml +29 -0
- data/spec/fixtures/fits_0.6.2_jp2.xml +36 -0
- data/spec/fixtures/fits_0.6.2_jpg.xml +43 -0
- data/spec/fixtures/fits_0.6.2_pdf.xml +42 -0
- data/spec/fixtures/fits_0.8.5_avi.xml +50 -0
- data/spec/fixtures/fits_0.8.5_docx.xml +41 -0
- data/spec/fixtures/fits_0.8.5_jp2.xml +51 -0
- data/spec/fixtures/fits_0.8.5_mp3.xml +47 -0
- data/spec/fixtures/fits_0.8.5_mp4.xml +47 -0
- data/spec/fixtures/fits_0.8.5_pdf.xml +54 -0
- data/spec/fixtures/pdf_fits.xml +54 -0
- data/spec/hydra/works/models/collection_spec.rb +58 -326
- data/spec/hydra/works/models/concerns/{generic_file → file_set}/contained_files_spec.rb +16 -16
- data/spec/hydra/works/models/concerns/{generic_file → file_set}/mime_types_spec.rb +2 -2
- data/spec/hydra/works/models/concerns/file_set/versioned_content_spec.rb +32 -0
- data/spec/hydra/works/models/concerns/{generic_file → file_set}/virus_check_spec.rb +3 -3
- data/spec/hydra/works/models/concerns/file_set_behavior_spec.rb +12 -0
- data/spec/hydra/works/models/generic_file_spec.rb +16 -13
- data/spec/hydra/works/models/generic_work_spec.rb +148 -318
- data/spec/hydra/works/services/{generic_file/add_file_to_generic_file_spec.rb → add_file_to_file_set_spec.rb} +4 -4
- data/spec/hydra/works/services/characterization_service_spec.rb +199 -0
- data/spec/hydra/works/services/persist_derivatives_spec.rb +57 -29
- data/spec/hydra/works/services/{generic_file/upload_file_spec.rb → upload_file_spec.rb} +7 -17
- data/spec/hydra/works_spec.rb +23 -59
- data/spec/spec_helper.rb +4 -2
- data/spec/support/file_set_helper.rb +14 -0
- metadata +84 -55
- data/lib/hydra/works/errors/full_text_extraction_error.rb +0 -5
- data/lib/hydra/works/models/concerns/block_child_objects.rb +0 -22
- data/lib/hydra/works/models/concerns/generic_file/derivatives.rb +0 -26
- data/lib/hydra/works/services/generic_file/full_text_extraction_service.rb +0 -57
- data/lib/hydra/works/services/generic_file/generate_thumbnail.rb +0 -13
- data/lib/hydra/works/services/generic_file/persist_derivative.rb +0 -20
- data/spec/hydra/works/models/concerns/block_child_objects_spec.rb +0 -17
- data/spec/hydra/works/models/concerns/generic_file/versioned_content_spec.rb +0 -32
- data/spec/hydra/works/models/concerns/generic_file_behavior_spec.rb +0 -12
- data/spec/hydra/works/services/full_text_extraction_service_spec.rb +0 -89
- data/spec/hydra/works/services/generic_file/generate/thumbnail_spec.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f59d9e4057f3221480712f84c8c1eca414d64c1
|
4
|
+
data.tar.gz: 9aaa3a1afbcb5e27e5998822959d988f34d01101
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 539c2c4c03e59c2e4d1ee667ad087bf0aa28551b7862acf32df477d42a137e03f1024b7f94fad1bb1fc12bbab6a82338f443b568762470c0f092c8d6c86934bf
|
7
|
+
data.tar.gz: 43ae1663d7070c525b6be37a1cb03ded81c4a7fa135ecb243d8fe639806414325ff4401c5d5fcde35415a153479daa7a3c6185b55281328dc705ad6f4fe32b42
|
data/.rubocop.yml
CHANGED
@@ -15,23 +15,28 @@ Metrics/LineLength:
|
|
15
15
|
|
16
16
|
Metrics/CyclomaticComplexity:
|
17
17
|
Exclude:
|
18
|
-
- lib/hydra/works/services/
|
18
|
+
- lib/hydra/works/services/add_file_to_file_set.rb
|
19
19
|
|
20
20
|
Metrics/PerceivedComplexity:
|
21
21
|
Exclude:
|
22
|
-
- lib/hydra/works/services/
|
22
|
+
- lib/hydra/works/services/add_file_to_file_set.rb
|
23
23
|
|
24
24
|
Metrics/MethodLength:
|
25
25
|
Exclude:
|
26
|
-
- lib/hydra/works/services/
|
27
|
-
- lib/hydra/works/models/concerns/
|
26
|
+
- lib/hydra/works/services/add_file_to_file_set.rb
|
27
|
+
- lib/hydra/works/models/concerns/file_set/virus_check.rb
|
28
|
+
- lib/hydra/works/models/characterization/fits_datastream.rb
|
29
|
+
|
30
|
+
Metrics/ClassLength:
|
31
|
+
Exclude:
|
32
|
+
- lib/hydra/works/models/characterization/fits_datastream.rb
|
28
33
|
|
29
34
|
Metrics/AbcSize:
|
30
35
|
Exclude:
|
31
|
-
- lib/hydra/works/services/
|
32
|
-
- lib/hydra/works/services/
|
33
|
-
- lib/hydra/works/models/concerns/
|
34
|
-
- lib/hydra/works/models/concerns/
|
36
|
+
- lib/hydra/works/services/add_file_to_file_set.rb
|
37
|
+
- lib/hydra/works/services/full_text_extraction_service.rb
|
38
|
+
- lib/hydra/works/models/concerns/file_set/mime_types.rb
|
39
|
+
- lib/hydra/works/models/concerns/file_set/virus_check.rb
|
35
40
|
|
36
41
|
Style/CollectionMethods:
|
37
42
|
PreferredMethods:
|
@@ -70,3 +75,7 @@ RSpec/FilePath:
|
|
70
75
|
|
71
76
|
RSpec/InstanceVariable:
|
72
77
|
Enabled: false
|
78
|
+
|
79
|
+
RSpec/DescribedClass:
|
80
|
+
Exclude:
|
81
|
+
- spec/hydra/works/models/concerns/generic_file/characterization_spec.rb
|
data/README.md
CHANGED
@@ -11,9 +11,9 @@
|
|
11
11
|
|
12
12
|
The Hydra::Works gem provides a set of [Portland Common Data Model](https://github.com/duraspace/pcdm/wiki)-compliant ActiveFedora models and associated behaviors around the broad concept of multi-file "works", the need for which was expressed by a variety of [community use cases](https://github.com/projecthydra-labs/hydra-works/tree/master/use-cases). The Hydra::Works domain model includes:
|
13
13
|
|
14
|
-
* **
|
15
|
-
* **GenericWork**: a *Hydra::PCDM::Object* that holds zero or more **
|
16
|
-
* **Collection**: a *Hydra::PCDM::Collection* that indirectly contains zero or more **
|
14
|
+
* **FileSet**: a *Hydra::PCDM::Object* that encapsulates one or more directly related *Hydra::PCDM::File*s, such as a PDF document, its derivatives, and extracted full-text
|
15
|
+
* **GenericWork**: a *Hydra::PCDM::Object* that holds zero or more **FileSets**s and zero or more **Work**s (often you won't use GenericWork, but instead write your own Work class)
|
16
|
+
* **Collection**: a *Hydra::PCDM::Collection* that indirectly contains zero or more **Work**s and zero or more **Collection**s
|
17
17
|
|
18
18
|
View [a diagram of the domain model](https://docs.google.com/drawings/d/1-NkkRPpGpZGoTimEpYTaGM1uUPRaT0SamuWDITvtG_8/edit).
|
19
19
|
|
@@ -43,18 +43,18 @@ class Collection < ActiveFedora::Base
|
|
43
43
|
end
|
44
44
|
|
45
45
|
class Book < ActiveFedora::Base
|
46
|
-
include Hydra::Works::
|
46
|
+
include Hydra::Works::WorkBehavior
|
47
47
|
end
|
48
48
|
|
49
49
|
class Page < ActiveFedora::Base
|
50
|
-
include Hydra::Works::
|
50
|
+
include Hydra::Works::FileSetBehavior
|
51
51
|
end
|
52
52
|
|
53
53
|
collection = Collection.create
|
54
54
|
book = BookWork.create
|
55
55
|
page = Page.create
|
56
56
|
|
57
|
-
collection.
|
57
|
+
collection.works << book
|
58
58
|
collection.save
|
59
59
|
book.generic_files << page
|
60
60
|
book.save
|
@@ -70,12 +70,12 @@ To turn on virus detection, install clamav on your system and add the `clamav` g
|
|
70
70
|
|
71
71
|
gem 'clamav'
|
72
72
|
|
73
|
-
Then include the `VirusCheck` module in your `
|
73
|
+
Then include the `VirusCheck` module in your `FileSet` class:
|
74
74
|
|
75
75
|
```ruby
|
76
76
|
class BookFiles < ActiveFedora::Base
|
77
|
-
include Hydra::Works::
|
78
|
-
include Hydra::Works::
|
77
|
+
include Hydra::Works::FileSetBehavior
|
78
|
+
include Hydra::Works::VirusCheck
|
79
79
|
end
|
80
80
|
```
|
81
81
|
|
data/hydra-works.gemspec
CHANGED
@@ -18,10 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency 'hydra-pcdm', '~> 0.
|
22
|
-
spec.add_dependency 'hydra-derivatives', '~>
|
23
|
-
spec.add_dependency '
|
24
|
-
spec.add_dependency 'activefedora-aggregation', '~> 0.4'
|
21
|
+
spec.add_dependency 'hydra-pcdm', '~> 0.3'
|
22
|
+
spec.add_dependency 'hydra-derivatives', '~> 3.0'
|
23
|
+
spec.add_dependency 'hydra-file_characterization', '~> 0.3', '>= 0.3.3'
|
25
24
|
|
26
25
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
27
26
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/lib/hydra/works.rb
CHANGED
@@ -14,29 +14,38 @@ module Hydra
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
autoload_under 'models/concerns/file_set' do
|
18
|
+
autoload :Derivatives
|
19
|
+
autoload :MimeTypes
|
20
|
+
autoload :ContainedFiles
|
21
|
+
autoload :VersionedContent
|
22
|
+
autoload :VirusCheck
|
23
|
+
end
|
24
|
+
|
25
|
+
autoload :Characterization
|
26
|
+
|
17
27
|
autoload_under 'models' do
|
18
28
|
autoload :Collection
|
29
|
+
autoload :FileSet
|
19
30
|
autoload :GenericWork
|
20
|
-
autoload :GenericFile
|
31
|
+
autoload :GenericFile # Deprecated. Remove in 0.4.0
|
21
32
|
end
|
22
33
|
|
23
34
|
autoload_under 'models/concerns' do
|
24
35
|
autoload :CollectionBehavior
|
25
|
-
autoload :
|
26
|
-
autoload :
|
27
|
-
autoload :
|
36
|
+
autoload :FileSetBehavior
|
37
|
+
autoload :GenericWorkBehavior # Deprecated. Remove in 0.4.0
|
38
|
+
autoload :GenericFileBehavior # Deprecated. Remove in 0.4.0
|
39
|
+
autoload :WorkBehavior
|
28
40
|
end
|
29
41
|
|
30
|
-
autoload_under 'services
|
31
|
-
autoload :
|
32
|
-
autoload :
|
33
|
-
autoload :
|
42
|
+
autoload_under 'services' do
|
43
|
+
autoload :AddFileToFileSet
|
44
|
+
autoload :AddFileToGenericFile # Deprecated. Remove in 0.4.0
|
45
|
+
autoload :UploadFileToFileSet
|
46
|
+
autoload :UploadFileToGenericFile # Deprecated. Remove in 0.4.0
|
34
47
|
autoload :PersistDerivative
|
35
|
-
autoload :
|
36
|
-
end
|
37
|
-
|
38
|
-
autoload_under 'errors' do
|
39
|
-
autoload :FullTextExtractionError
|
48
|
+
autoload :CharacterizationService
|
40
49
|
end
|
41
50
|
end
|
42
51
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Hydra::Works
|
2
|
+
module Characterization
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
extend ActiveSupport::Autoload
|
5
|
+
|
6
|
+
autoload :FitsDatastream, 'hydra/works/models/characterization/fits_datastream.rb'
|
7
|
+
autoload :AlreadyThereStrategy, 'hydra/works/models/characterization/already_there_strategy.rb'
|
8
|
+
|
9
|
+
autoload_under 'schema' do
|
10
|
+
autoload :AudioSchema
|
11
|
+
autoload :BaseSchema
|
12
|
+
autoload :DocumentSchema
|
13
|
+
autoload :ImageSchema
|
14
|
+
autoload :VideoSchema
|
15
|
+
end
|
16
|
+
|
17
|
+
autoload :Base, 'hydra/works/models/concerns/file_set/characterization/base.rb'
|
18
|
+
autoload :Image, 'hydra/works/models/concerns/file_set/characterization/image.rb'
|
19
|
+
autoload :Document, 'hydra/works/models/concerns/file_set/characterization/document.rb'
|
20
|
+
autoload :Video, 'hydra/works/models/concerns/file_set/characterization/video.rb'
|
21
|
+
autoload :Audio, 'hydra/works/models/concerns/file_set/characterization/audio.rb'
|
22
|
+
|
23
|
+
included do
|
24
|
+
include Base
|
25
|
+
include Image
|
26
|
+
include Audio
|
27
|
+
include Video
|
28
|
+
include Document
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class AudioSchema < ActiveTriples::Schema
|
3
|
+
property :bit_depth, predicate: RDF::Vocab::NFO.bitDepth
|
4
|
+
property :channels, predicate: RDF::Vocab::NFO.channels
|
5
|
+
property :data_format, predicate: RDF::Vocab::EBUCore.hasDataFormat
|
6
|
+
property :frame_rate, predicate: RDF::Vocab::NFO.frameRate
|
7
|
+
property :duration, predicate: RDF::Vocab::NFO.duration
|
8
|
+
property :sample_rate, predicate: RDF::Vocab::EBUCore.sampleRate
|
9
|
+
# properties without cannonical URIs
|
10
|
+
property :offset, predicate: RDF::URI('http://projecthydra.org/ns/audio/offset')
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class BaseSchema < ActiveTriples::Schema
|
3
|
+
property :filename, predicate: RDF::Vocab::EBUCore.filename, multiple: false
|
4
|
+
property :format_label, predicate: RDF::Vocab::PREMIS.hasFormatName
|
5
|
+
property :file_size, predicate: RDF::Vocab::EBUCore.fileSize
|
6
|
+
property :well_formed, predicate: RDF::URI.new("http://projecthydra.org/ns/fits/wellFormed")
|
7
|
+
property :valid, predicate: RDF::URI.new("http://projecthydra.org/ns/fits/valid")
|
8
|
+
property :date_created, predicate: RDF::Vocab::EBUCore.dateCreated
|
9
|
+
property :last_modified, predicate: RDF::Vocab::EBUCore.dateModified
|
10
|
+
property :fits_version, predicate: RDF::Vocab::PREMIS.hasCreatingApplicationVersion
|
11
|
+
property :exif_version, predicate: RDF::Vocab::EXIF.exifVersion
|
12
|
+
property :original_checksum, predicate: RDF::Vocab::NFO.hashValue
|
13
|
+
property :mime_type, predicate: RDF::Vocab::EBUCore.hasMimeType, multiple: false do |index|
|
14
|
+
index.as :stored_searchable
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class DocumentSchema < ActiveTriples::Schema
|
3
|
+
property :file_title, predicate: RDF::DC11.title
|
4
|
+
property :file_author, predicate: RDF::DC11.creator
|
5
|
+
property :page_count, predicate: RDF::Vocab::NFO.pageCount
|
6
|
+
property :file_language, predicate: RDF::DC11.language
|
7
|
+
property :word_count, predicate: RDF::Vocab::NFO.wordCount
|
8
|
+
property :character_count, predicate: RDF::Vocab::NFO.characterCount
|
9
|
+
property :line_count, predicate: RDF::Vocab::NFO.lineCount
|
10
|
+
property :character_set, predicate: RDF::URI.new("http://www.w3.org/2011/content#characterEncoding")
|
11
|
+
property :markup_basis, predicate: RDF::URI.new("http://www.w3.org/2011/content#doctypeName")
|
12
|
+
property :markup_language, predicate: RDF::URI.new("http://www.w3.org/2011/content#systemId")
|
13
|
+
# properties without canonical URIs
|
14
|
+
property :paragraph_count, predicate: RDF::URI.new("http://projecthydra.org/ns/odf/paragraphCount")
|
15
|
+
property :table_count, predicate: RDF::URI.new("http://projecthydra.org/ns/odf/tableCount")
|
16
|
+
property :graphics_count, predicate: RDF::URI.new("http://projecthydra.org/ns/odf/graphicsCount")
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class ImageSchema < ActiveTriples::Schema
|
3
|
+
property :byte_order, predicate: RDF::URI('http://sweet.jpl.nasa.gov/2.2/reprDataFormat.owl#byteOrder'), multiple: false
|
4
|
+
property :compression, predicate: RDF::URI('http://projecthydra.org/ns/mix/compressionScheme'), multiple: false
|
5
|
+
property :height, predicate: RDF::Vocab::EBUCore.height
|
6
|
+
property :width, predicate: RDF::Vocab::EBUCore.width
|
7
|
+
# property :width, predicate: RDF::Vocab::EXIF.imageWidth, multiple: false
|
8
|
+
# property :height, predicate: RDF::Vocab::EXIF.imageLength, multiple: false
|
9
|
+
property :color_space, predicate: RDF::Vocab::EXIF.colorSpace, multiple: false
|
10
|
+
property :profile_name, predicate: RDF::URI('http://projecthydra.org/ns/mix/colorProfileName')
|
11
|
+
property :profile_version, predicate: RDF::URI('http://projecthydra.org/ns/mix/colorProfileVersion')
|
12
|
+
property :orientation, predicate: RDF::Vocab::EXIF.orientation, multiple: false
|
13
|
+
property :color_map, predicate: RDF::URI('http://projecthydra.org/ns/mix/colorMap')
|
14
|
+
property :image_producer, predicate: RDF::Vocab::MARCRelators.pht
|
15
|
+
property :capture_device, predicate: RDF::Vocab::EXIF.model
|
16
|
+
property :scanning_software, predicate: RDF::Vocab::EXIF.software
|
17
|
+
# exif_version is in core set of tehcnical metadata
|
18
|
+
property :gps_timestamp, predicate: RDF::Vocab::EXIF.gpsTimeStamp
|
19
|
+
property :latitude, predicate: RDF::Vocab::EXIF.gpsLatitude
|
20
|
+
property :longitude, predicate: RDF::Vocab::EXIF.gpsLongitude
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class VideoSchema < ActiveTriples::Schema
|
3
|
+
property :height, predicate: RDF::Vocab::EBUCore.height
|
4
|
+
property :width, predicate: RDF::Vocab::EBUCore.width
|
5
|
+
property :frame_rate, predicate: RDF::Vocab::NFO.frameRate
|
6
|
+
property :duration, predicate: RDF::Vocab::NFO.duration
|
7
|
+
property :sample_rate, predicate: RDF::Vocab::EBUCore.sampleRate
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class AlreadyThereStrategy < ActiveTriples::ExtensionStrategy
|
3
|
+
# override apply method to check if property already exists or reciever already has predicate defined.
|
4
|
+
# Do not add property if the rdf_resource already responds to the property name
|
5
|
+
# Do not add property if the rdf_resource already has a property with the same predicate.
|
6
|
+
def self.apply(resource, property)
|
7
|
+
return if resource.respond_to?(property.name)
|
8
|
+
return if resource.properties.any? { |p| p[1].predicate == property.predicate }
|
9
|
+
resource.property property.name, property.to_h
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module Hydra::Works::Characterization
|
2
|
+
class FitsDatastream < ActiveFedora::OmDatastream
|
3
|
+
include OM::XML::Document
|
4
|
+
|
5
|
+
set_terminology do |t|
|
6
|
+
t.root(path: 'fits',
|
7
|
+
xmlns: 'http://hul.harvard.edu/ois/xml/ns/fits/fits_output',
|
8
|
+
schema: 'http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd')
|
9
|
+
t.fits_v(path: { attribute: 'version' })
|
10
|
+
t.identification do
|
11
|
+
t.identity do
|
12
|
+
t.format_label(path: { attribute: 'format' })
|
13
|
+
t.mime_type(path: { attribute: 'mimetype' })
|
14
|
+
t.tool(attributes: { toolname: "Exiftool" }) do
|
15
|
+
t.exif_tool_version(path: { attribute: 'toolversion' })
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
t.fileinfo do
|
20
|
+
t.file_size(path: 'size')
|
21
|
+
t.last_modified(path: 'lastmodified', attributes: { toolname: "Exiftool" })
|
22
|
+
t.filename(path: 'filename')
|
23
|
+
t.original_checksum(path: 'md5checksum')
|
24
|
+
t.date_created(path: 'created')
|
25
|
+
t.rights_basis(path: 'rightsBasis')
|
26
|
+
t.copyright_basis(path: 'copyrightBasis')
|
27
|
+
t.copyright_note(path: 'copyrightNote')
|
28
|
+
end
|
29
|
+
t.filestatus do
|
30
|
+
t.well_formed(path: 'well-formed')
|
31
|
+
t.valid(path: 'valid')
|
32
|
+
t.status_message(path: 'message')
|
33
|
+
end
|
34
|
+
t.metadata do
|
35
|
+
t.document do
|
36
|
+
t.file_title(path: 'title')
|
37
|
+
t.file_author(path: 'author')
|
38
|
+
t.file_language(path: 'language')
|
39
|
+
t.page_count(path: 'pageCount')
|
40
|
+
t.word_count(path: 'wordCount')
|
41
|
+
t.character_count(path: 'characterCount')
|
42
|
+
t.paragraph_count(path: 'paragraphCount')
|
43
|
+
t.line_count(path: 'lineCount')
|
44
|
+
t.table_count(path: 'tableCount')
|
45
|
+
t.graphics_count(path: 'graphicsCount')
|
46
|
+
end
|
47
|
+
t.image do
|
48
|
+
t.byte_order(path: 'byteOrder')
|
49
|
+
t.compression(path: 'compressionScheme')
|
50
|
+
t.width(path: 'imageWidth')
|
51
|
+
t.height(path: 'imageHeight')
|
52
|
+
t.color_space(path: 'colorSpace')
|
53
|
+
t.profile_name(path: 'iccProfileName')
|
54
|
+
t.profile_version(path: 'iccProfileVersion')
|
55
|
+
t.orientation(path: 'orientation')
|
56
|
+
t.color_map(path: 'colorMap')
|
57
|
+
t.image_producer(path: 'imageProducer')
|
58
|
+
t.capture_device(path: 'captureDevice')
|
59
|
+
t.scanning_software(path: 'scanningSoftwareName')
|
60
|
+
t.exif_version(path: 'exifVersion')
|
61
|
+
t.gps_timestamp(path: 'gpsTimeStamp')
|
62
|
+
t.latitude(path: 'gpsDestLatitude')
|
63
|
+
t.longitude(path: 'gpsDestLongitude')
|
64
|
+
end
|
65
|
+
t.text do
|
66
|
+
t.character_set(path: 'charset')
|
67
|
+
t.markup_basis(path: 'markupBasis')
|
68
|
+
t.markup_language(path: 'markupLanguage')
|
69
|
+
end
|
70
|
+
t.audio do
|
71
|
+
t.duration(path: 'duration')
|
72
|
+
t.bit_depth(path: 'bitDepth')
|
73
|
+
t.sample_rate(path: 'sampleRate')
|
74
|
+
t.channels(path: 'channels')
|
75
|
+
t.data_format(path: 'dataFormatType')
|
76
|
+
t.offset(path: 'offset')
|
77
|
+
end
|
78
|
+
t.video do
|
79
|
+
t.width(path: 'imageWidth')
|
80
|
+
t.height(path: 'imageHeight')
|
81
|
+
t.duration(path: 'duration')
|
82
|
+
t.sample_rate(path: 'sampleRate')
|
83
|
+
t.audio_sample_rate(path: 'audioSampleRate')
|
84
|
+
t.frame_rate(path: 'frameRate')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
# fits_version needs a different name than it's target node since they're at the same level
|
88
|
+
t.fits_version(proxy: [:fits, :fits_v])
|
89
|
+
t.format_label(proxy: [:identification, :identity, :format_label])
|
90
|
+
# Can't use .mime_type because it's already defined for datastream so method missing won't work.
|
91
|
+
t.file_mime_type(proxy: [:identification, :identity, :mime_type])
|
92
|
+
t.exif_tool_version(proxy: [:identification, :identity, :tool, :exif_tool_version])
|
93
|
+
t.file_size(proxy: [:fileinfo, :file_size])
|
94
|
+
t.last_modified(proxy: [:fileinfo, :last_modified])
|
95
|
+
t.filename(proxy: [:fileinfo, :filename])
|
96
|
+
t.original_checksum(proxy: [:fileinfo, :original_checksum])
|
97
|
+
t.date_created(proxy: [:fileinfo, :date_created])
|
98
|
+
t.rights_basis(proxy: [:fileinfo, :rights_basis])
|
99
|
+
t.copyright_basis(proxy: [:fileinfo, :copyright_basis])
|
100
|
+
t.copyright_note(proxy: [:fileinfo, :copyright_note])
|
101
|
+
t.well_formed(proxy: [:filestatus, :well_formed])
|
102
|
+
t.valid(proxy: [:filestatus, :valid])
|
103
|
+
t.status_message(proxy: [:filestatus, :status_message])
|
104
|
+
t.file_title(proxy: [:metadata, :document, :file_title])
|
105
|
+
t.file_author(proxy: [:metadata, :document, :file_author])
|
106
|
+
t.page_count(proxy: [:metadata, :document, :page_count])
|
107
|
+
t.file_language(proxy: [:metadata, :document, :file_language])
|
108
|
+
t.word_count(proxy: [:metadata, :document, :word_count])
|
109
|
+
t.character_count(proxy: [:metadata, :document, :character_count])
|
110
|
+
t.paragraph_count(proxy: [:metadata, :document, :paragraph_count])
|
111
|
+
t.line_count(proxy: [:metadata, :document, :line_count])
|
112
|
+
t.table_count(proxy: [:metadata, :document, :table_count])
|
113
|
+
t.graphics_count(proxy: [:metadata, :document, :graphics_count])
|
114
|
+
t.byte_order(proxy: [:metadata, :image, :byte_order])
|
115
|
+
t.compression(proxy: [:metadata, :image, :compression])
|
116
|
+
t.width(proxy: [:metadata, :image, :width])
|
117
|
+
t.video_width(proxy: [:metadata, :video, :width])
|
118
|
+
t.height(proxy: [:metadata, :image, :height])
|
119
|
+
t.video_height(proxy: [:metadata, :video, :height])
|
120
|
+
t.color_space(proxy: [:metadata, :image, :color_space])
|
121
|
+
t.profile_name(proxy: [:metadata, :image, :profile_name])
|
122
|
+
t.profile_version(proxy: [:metadata, :image, :profile_version])
|
123
|
+
t.orientation(proxy: [:metadata, :image, :orientation])
|
124
|
+
t.color_map(proxy: [:metadata, :image, :color_map])
|
125
|
+
t.image_producer(proxy: [:metadata, :image, :image_producer])
|
126
|
+
t.capture_device(proxy: [:metadata, :image, :capture_device])
|
127
|
+
t.scanning_software(proxy: [:metadata, :image, :scanning_software])
|
128
|
+
t.exif_version(proxy: [:metadata, :image, :exif_version])
|
129
|
+
t.gps_timestamp(proxy: [:metadata, :image, :gps_timestamp])
|
130
|
+
t.latitude(proxy: [:metadata, :image, :latitude])
|
131
|
+
t.longitude(proxy: [:metadata, :image, :longitude])
|
132
|
+
t.character_set(proxy: [:metadata, :text, :character_set])
|
133
|
+
t.markup_basis(proxy: [:metadata, :text, :markup_basis])
|
134
|
+
t.markup_language(proxy: [:metadata, :text, :markup_language])
|
135
|
+
t.audio_duration(proxy: [:metadata, :audio, :duration])
|
136
|
+
t.video_duration(proxy: [:metadata, :video, :duration])
|
137
|
+
t.bit_depth(proxy: [:metadata, :audio, :bit_depth])
|
138
|
+
t.audio_sample_rate(proxy: [:metadata, :audio, :sample_rate])
|
139
|
+
t.video_sample_rate(proxy: [:metadata, :video, :sample_rate])
|
140
|
+
t.video_audio_sample_rate(proxy: [:metadata, :video, :audio_sample_rate])
|
141
|
+
t.channels(proxy: [:metadata, :audio, :channels])
|
142
|
+
t.data_format(proxy: [:metadata, :audio, :data_format])
|
143
|
+
t.offset(proxy: [:metadata, :audio, :offset])
|
144
|
+
t.frame_rate(proxy: [:metadata, :video, :frame_rate])
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.xml_template
|
148
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
149
|
+
xml.fits(xmlns: 'http://hul.harvard.edu/ois/xml/ns/fits/fits_output',
|
150
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
151
|
+
'xsi:schemaLocation' =>
|
152
|
+
"http://hul.harvard.edu/ois/xml/ns/fits/fits_output
|
153
|
+
http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd",
|
154
|
+
version: '0.6.0',
|
155
|
+
timestamp: '1/25/12 11:04 AM') do
|
156
|
+
xml.identification { xml.identity(toolname: 'FITS') }
|
157
|
+
end
|
158
|
+
end
|
159
|
+
builder.doc
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|