hydra-works 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.travis.yml +2 -5
  4. data/Gemfile +1 -3
  5. data/README.md +28 -13
  6. data/hydra-works.gemspec +4 -3
  7. data/lib/hydra/works.rb +7 -57
  8. data/lib/hydra/works/models/concerns/block_child_objects.rb +16 -0
  9. data/lib/hydra/works/models/concerns/collection_behavior.rb +27 -2
  10. data/lib/hydra/works/models/concerns/generic_file/contained_files.rb +5 -13
  11. data/lib/hydra/works/models/concerns/generic_file/derivatives.rb +9 -13
  12. data/lib/hydra/works/models/concerns/generic_file/mime_types.rb +14 -9
  13. data/lib/hydra/works/models/concerns/generic_file/versioned_content.rb +18 -0
  14. data/lib/hydra/works/models/concerns/generic_file/virus_check.rb +48 -0
  15. data/lib/hydra/works/models/concerns/generic_file_behavior.rb +24 -1
  16. data/lib/hydra/works/models/concerns/generic_work_behavior.rb +32 -3
  17. data/lib/hydra/works/models/generic_file.rb +3 -0
  18. data/lib/hydra/works/services/generic_file/add_file_to_generic_file.rb +127 -0
  19. data/lib/hydra/works/services/generic_file/generate/thumbnail.rb +1 -2
  20. data/lib/hydra/works/services/generic_file/persist_derivative.rb +22 -0
  21. data/lib/hydra/works/services/generic_file/upload_file.rb +11 -19
  22. data/lib/hydra/works/version.rb +1 -1
  23. data/lib/hydra/works/vocab/works_terms.rb +1 -1
  24. data/spec/fixtures/Example.ogg +0 -0
  25. data/spec/fixtures/charter.docx +0 -0
  26. data/spec/fixtures/countdown.avi +0 -0
  27. data/spec/fixtures/image.jp2 +0 -0
  28. data/spec/fixtures/piano_note.wav +0 -0
  29. data/spec/fixtures/test5.mp3 +0 -0
  30. data/spec/fixtures/world.png +0 -0
  31. data/spec/hydra/works/models/collection_spec.rb +499 -16
  32. data/spec/hydra/works/models/concerns/block_child_objects_spec.rb +19 -0
  33. data/spec/hydra/works/models/concerns/{file → generic_file}/contained_files_spec.rb +20 -17
  34. data/spec/hydra/works/models/concerns/generic_file/mime_types_spec.rb +76 -0
  35. data/spec/hydra/works/models/concerns/generic_file/versioned_content_spec.rb +32 -0
  36. data/spec/hydra/works/models/concerns/generic_file/virus_check_spec.rb +50 -0
  37. data/spec/hydra/works/models/concerns/generic_file_behavior_spec.rb +1 -1
  38. data/spec/hydra/works/models/generic_file_spec.rb +201 -14
  39. data/spec/hydra/works/models/generic_work_spec.rb +530 -14
  40. data/spec/hydra/works/services/generic_file/add_file_to_generic_file_spec.rb +110 -0
  41. data/spec/hydra/works/services/generic_file/upload_file_spec.rb +45 -28
  42. data/spec/hydra/works/services/persist_derivatives_spec.rb +93 -0
  43. data/spec/hydra/works_spec.rb +35 -35
  44. data/spec/spec_helper.rb +6 -0
  45. metadata +56 -95
  46. data/lib/hydra/works/models/concerns/aggregates_collections.rb +0 -16
  47. data/lib/hydra/works/models/concerns/aggregates_generic_files.rb +0 -20
  48. data/lib/hydra/works/models/concerns/aggregates_generic_works.rb +0 -20
  49. data/lib/hydra/works/processor.rb +0 -9
  50. data/lib/hydra/works/services/collection/add_collection.rb +0 -19
  51. data/lib/hydra/works/services/collection/add_generic_work.rb +0 -19
  52. data/lib/hydra/works/services/collection/add_related_object.rb +0 -19
  53. data/lib/hydra/works/services/collection/get_collections.rb +0 -17
  54. data/lib/hydra/works/services/collection/get_generic_works.rb +0 -17
  55. data/lib/hydra/works/services/collection/get_related_objects.rb +0 -17
  56. data/lib/hydra/works/services/collection/remove_collection.rb +0 -19
  57. data/lib/hydra/works/services/collection/remove_generic_work.rb +0 -20
  58. data/lib/hydra/works/services/collection/remove_related_object.rb +0 -19
  59. data/lib/hydra/works/services/generic_file/add_file.rb +0 -55
  60. data/lib/hydra/works/services/generic_file/add_generic_file.rb +0 -19
  61. data/lib/hydra/works/services/generic_file/add_original_file.rb +0 -11
  62. data/lib/hydra/works/services/generic_file/add_related_object.rb +0 -19
  63. data/lib/hydra/works/services/generic_file/add_versioned_original_file.rb +0 -10
  64. data/lib/hydra/works/services/generic_file/get_generic_files.rb +0 -17
  65. data/lib/hydra/works/services/generic_file/get_related_objects.rb +0 -17
  66. data/lib/hydra/works/services/generic_file/remove_generic_file.rb +0 -20
  67. data/lib/hydra/works/services/generic_file/remove_related_object.rb +0 -19
  68. data/lib/hydra/works/services/generic_work/add_generic_file.rb +0 -19
  69. data/lib/hydra/works/services/generic_work/add_generic_work.rb +0 -19
  70. data/lib/hydra/works/services/generic_work/add_related_object.rb +0 -19
  71. data/lib/hydra/works/services/generic_work/get_generic_files.rb +0 -17
  72. data/lib/hydra/works/services/generic_work/get_generic_works.rb +0 -17
  73. data/lib/hydra/works/services/generic_work/get_related_objects.rb +0 -17
  74. data/lib/hydra/works/services/generic_work/move_generic_file.rb +0 -19
  75. data/lib/hydra/works/services/generic_work/remove_generic_file.rb +0 -20
  76. data/lib/hydra/works/services/generic_work/remove_generic_work.rb +0 -20
  77. data/lib/hydra/works/services/generic_work/remove_related_object.rb +0 -19
  78. data/spec/hydra/works/services/collection/add_collection_spec.rb +0 -166
  79. data/spec/hydra/works/services/collection/add_generic_work_spec.rb +0 -155
  80. data/spec/hydra/works/services/collection/add_related_object_spec.rb +0 -149
  81. data/spec/hydra/works/services/collection/get_collections_spec.rb +0 -35
  82. data/spec/hydra/works/services/collection/get_generic_works_spec.rb +0 -35
  83. data/spec/hydra/works/services/collection/get_related_objects_spec.rb +0 -49
  84. data/spec/hydra/works/services/collection/remove_collection_spec.rb +0 -133
  85. data/spec/hydra/works/services/collection/remove_generic_work_spec.rb +0 -133
  86. data/spec/hydra/works/services/collection/remove_related_object_spec.rb +0 -128
  87. data/spec/hydra/works/services/generic_file/add_file_spec.rb +0 -28
  88. data/spec/hydra/works/services/generic_file/add_generic_file_spec.rb +0 -174
  89. data/spec/hydra/works/services/generic_file/add_related_object_spec.rb +0 -150
  90. data/spec/hydra/works/services/generic_file/get_generic_files_spec.rb +0 -19
  91. data/spec/hydra/works/services/generic_file/get_related_objects_spec.rb +0 -45
  92. data/spec/hydra/works/services/generic_file/remove_generic_file_spec.rb +0 -124
  93. data/spec/hydra/works/services/generic_file/remove_related_object_spec.rb +0 -123
  94. data/spec/hydra/works/services/generic_work/add_generic_file_spec.rb +0 -156
  95. data/spec/hydra/works/services/generic_work/add_generic_work_spec.rb +0 -157
  96. data/spec/hydra/works/services/generic_work/add_related_object_spec.rb +0 -148
  97. data/spec/hydra/works/services/generic_work/get_generic_files_spec.rb +0 -35
  98. data/spec/hydra/works/services/generic_work/get_generic_works_spec.rb +0 -35
  99. data/spec/hydra/works/services/generic_work/get_related_objects_spec.rb +0 -46
  100. data/spec/hydra/works/services/generic_work/move_generic_file_spec.rb +0 -21
  101. data/spec/hydra/works/services/generic_work/remove_generic_file_spec.rb +0 -132
  102. data/spec/hydra/works/services/generic_work/remove_generic_work_spec.rb +0 -133
  103. data/spec/hydra/works/services/generic_work/remove_related_object_spec.rb +0 -128
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6c159583f12e0a02124bcf92dce3d86fc33736a
4
- data.tar.gz: 182817aa5b0783ec5f25ff9491c31c1cb69816f1
3
+ metadata.gz: b09c8a80126527ae1e46668a611225e85ed64b85
4
+ data.tar.gz: 863f6a4b6315edbc5825e65d560a24fcb8372910
5
5
  SHA512:
6
- metadata.gz: f644d698b6e0d8a4260b4b42b45abf73ac69b8bdd85b837570edde1ff2d4e00c9520c0e9f3fc2b631b465a74f1643aeca55224ddf444cf74d3dce77de78e10d8
7
- data.tar.gz: 1db7afa2cfdc7635f96f86f2d64664cfac6123ec0dd73714bb6540783af845ecf4ed9484a0fff632d3afa9bb75151e8fc4a6885ddfa4f34cff89ef0ac19ca964
6
+ metadata.gz: 79734196b519492daf40942ba488aedf9f303483dc3527b9f92ee400d04ef51467d69e65b4c0f4fb6ce23a74a836f3188177faeb5a073fc24ec3b6671de89905
7
+ data.tar.gz: 2266310f4f914ca326b95f8f57eb294ef2d75f7170c56620e00dbe5eacc3c629be077d785ef114e711e439221a57506a2105a3209dbc9d23e3dd7b1d2534772e
data/.gitignore CHANGED
@@ -14,4 +14,6 @@ spec/internal
14
14
  *.a
15
15
  mkmf.log
16
16
  jetty
17
- .DS_Store
17
+ .DS_Store
18
+ .ruby-gemset
19
+ .ruby-version
@@ -6,9 +6,6 @@ env:
6
6
  global:
7
7
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
8
8
  rvm:
9
- - 2.1
10
9
  - 2.2
11
- - jruby-19mode
12
- matrix:
13
- allow_failures:
14
- - rvm: jruby-19mode
10
+ before_script:
11
+ - jdk_switcher use oraclejdk8
data/Gemfile CHANGED
@@ -3,12 +3,10 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in hydra-works.gemspec
4
4
  gemspec
5
5
 
6
- gem 'activefedora-aggregation', github: 'projecthydra-labs/activefedora-aggregation'
7
- gem 'active-fedora', github: 'projecthydra/active_fedora', branch: 'master'
8
6
  gem 'slop', '~> 3.6' # For byebug
9
7
 
10
8
  unless ENV['CI']
11
9
  gem 'pry'
12
10
  gem 'pry-byebug'
13
11
  gem 'byebug'
14
- end
12
+ end
data/README.md CHANGED
@@ -36,29 +36,44 @@ class Collection < ActiveFedora::Base
36
36
  include Hydra::Works::CollectionBehavior
37
37
  end
38
38
 
39
- class BookWork < ActiveFedora::Base
39
+ class Book < ActiveFedora::Base
40
40
  include Hydra::Works::GenericWorkBehavior
41
41
  end
42
42
 
43
- class BookFiles < ActiveFedora::Base
43
+ class Page < ActiveFedora::Base
44
44
  include Hydra::Works::GenericFileBehavior
45
45
  end
46
46
 
47
- c1 = Collection.create
48
- bw1 = BookWork.create
49
- bf1 = BookFiles.create
47
+ collection = Collection.create
48
+ book = BookWork.create
49
+ page = Page.create
50
+
51
+ collection.child_generic_works << book
52
+ collection.save
53
+ book.generic_files << page
54
+ book.save
55
+
56
+ file = page.files.build
57
+ file.content = "The quick brown fox jumped over the lazy dog."
58
+ page.save
59
+ ```
60
+
61
+ ## Virus Detection
62
+
63
+ To turn on virus detection, install clamav on your system and add the `clamav` gem to your Gemfile
50
64
 
51
- Hydra::Works::AddGenericWorkToCollection(c1,bw1)
52
- Hydra::Works::AddGenericFileToGenericWork(bw1,bf1)
53
- c1.save
54
- bw1.save
55
- bf1.save
65
+ gem 'clamav'
56
66
 
57
- f1 = bf1.files.build
58
- f1.content = "The quick brown fox jumped over the lazy dog."
59
- bf1.save
67
+ Then include the `VirusCheck` module in your `GenericFile` class:
68
+
69
+ ```ruby
70
+ class BookFiles < ActiveFedora::Base
71
+ include Hydra::Works::GenericFileBehavior
72
+ include Hydra::Works::GenericFile::VirusCheck
73
+ end
60
74
  ```
61
75
 
76
+
62
77
  ## Access controls
63
78
 
64
79
  We are using [Web ACL](http://www.w3.org/wiki/WebAccessControl) as implemented by [hydra-access-controls](https://github.com/projecthydra/hydra-head/tree/master/hydra-access-controls).
@@ -18,9 +18,10 @@ 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.0.1"
22
- spec.add_dependency "hydra-derivatives", "~> 1.1.0"
23
- spec.add_dependency "activefedora-aggregation", "~> 0.2.0"
21
+ spec.add_dependency "hydra-pcdm", "~> 0.1"
22
+ spec.add_dependency "hydra-derivatives", "~> 2.0"
23
+ spec.add_dependency "activefedora-aggregation", "~> 0.4"
24
+ spec.add_dependency "active-fedora", "~> 9.2"
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.7"
26
27
  spec.add_development_dependency "rake", "~> 10.0"
@@ -2,10 +2,10 @@ require 'hydra/works/version'
2
2
  require 'active_fedora/aggregation'
3
3
  require 'hydra/pcdm'
4
4
  require 'hydra/derivatives'
5
- require 'hydra/works/processor'
6
5
 
7
6
  module Hydra
8
7
  module Works
8
+ extend ActiveSupport::Autoload
9
9
 
10
10
  # vocabularies
11
11
  autoload :WorksVocabularies, 'hydra/works/vocab/works_terms'
@@ -14,68 +14,18 @@ module Hydra
14
14
  autoload :Collection, 'hydra/works/models/collection'
15
15
  autoload :GenericWork, 'hydra/works/models/generic_work'
16
16
  autoload :GenericFile, 'hydra/works/models/generic_file'
17
-
17
+
18
18
  #behaviors
19
19
  autoload :CollectionBehavior, 'hydra/works/models/concerns/collection_behavior'
20
20
  autoload :GenericWorkBehavior, 'hydra/works/models/concerns/generic_work_behavior'
21
21
  autoload :GenericFileBehavior, 'hydra/works/models/concerns/generic_file_behavior'
22
- autoload :AggregatesGenericFiles, 'hydra/works/models/concerns/aggregates_generic_files'
23
- autoload :AggregatesGenericWorks, 'hydra/works/models/concerns/aggregates_generic_works'
24
- autoload :AggregatesCollections, 'hydra/works/models/concerns/aggregates_collections'
25
22
  autoload :GenericFile, 'hydra/works/models/generic_file'
26
-
27
- # collection services
28
- autoload :AddCollectionToCollection, 'hydra/works/services/collection/add_collection'
29
- autoload :AddGenericWorkToCollection, 'hydra/works/services/collection/add_generic_work'
30
- autoload :AddRelatedObjectToCollection, 'hydra/works/services/collection/add_related_object'
31
- autoload :GetCollectionsFromCollection, 'hydra/works/services/collection/get_collections'
32
- autoload :GetGenericWorksFromCollection, 'hydra/works/services/collection/get_generic_works'
33
- autoload :GetRelatedObjectsFromCollection, 'hydra/works/services/collection/get_related_objects'
34
- autoload :RemoveCollectionFromCollection, 'hydra/works/services/collection/remove_collection'
35
- autoload :RemoveGenericWorkFromCollection, 'hydra/works/services/collection/remove_generic_work'
36
- autoload :RemoveRelatedObjectFromCollection, 'hydra/works/services/collection/remove_related_object'
37
-
38
- # generic_work services
39
- autoload :AddGenericWorkToGenericWork, 'hydra/works/services/generic_work/add_generic_work'
40
- autoload :AddGenericFileToGenericWork, 'hydra/works/services/generic_work/add_generic_file'
41
- autoload :AddRelatedObjectToGenericWork, 'hydra/works/services/generic_work/add_related_object'
42
- autoload :GetGenericWorksFromGenericWork, 'hydra/works/services/generic_work/get_generic_works'
43
- autoload :GetGenericFilesFromGenericWork, 'hydra/works/services/generic_work/get_generic_files'
44
- autoload :GetRelatedObjectsFromGenericWork, 'hydra/works/services/generic_work/get_related_objects'
45
- autoload :MoveGenericFileToGenericWork, 'hydra/works/services/generic_work/move_generic_file'
46
- autoload :RemoveGenericWorkFromGenericWork, 'hydra/works/services/generic_work/remove_generic_work'
47
- autoload :RemoveGenericFileFromGenericWork, 'hydra/works/services/generic_work/remove_generic_file'
48
- autoload :RemoveRelatedObjectFromGenericWork, 'hydra/works/services/generic_work/remove_related_object'
23
+ autoload :BlockChildObjects, 'hydra/works/models/concerns/block_child_objects'
49
24
 
50
25
  # generic_file services
51
- autoload :AddGenericFileToGenericFile, 'hydra/works/services/generic_file/add_generic_file'
52
- autoload :AddFileToGenericFile, 'hydra/works/services/generic_file/add_file'
53
- autoload :AddRelatedObjectToGenericFile, 'hydra/works/services/generic_file/add_related_object'
54
- autoload :GetGenericWorksFromGenericFile, 'hydra/works/services/generic_file/get_generic_works'
55
- autoload :GetGenericFilesFromGenericFile, 'hydra/works/services/generic_file/get_generic_files'
56
- autoload :GetRelatedObjectsFromGenericFile, 'hydra/works/services/generic_file/get_related_objects'
57
- autoload :RemoveGenericFileFromGenericFile, 'hydra/works/services/generic_file/remove_generic_file'
58
- autoload :RemoveRelatedObjectFromGenericFile, 'hydra/works/services/generic_file/remove_related_object'
59
- autoload :UploadFileToGenericFile, 'hydra/works/services/generic_file/upload_file'
60
- autoload :AddOriginalFile, 'hydra/works/services/generic_file/add_original_file'
61
- autoload :AddVersionedOriginalFile, 'hydra/works/services/generic_file/add_versioned_original_file'
62
- autoload :GenerateThumbnail, 'hydra/works/services/generic_file/generate/thumbnail'
63
-
64
- # model validations
65
- def self.collection? collection
66
- return false unless collection.respond_to? :type
67
- collection.type.include? WorksVocabularies::WorksTerms.Collection
68
- end
69
-
70
- def self.generic_work? generic_work
71
- return false unless generic_work.respond_to? :type
72
- generic_work.type.include? WorksVocabularies::WorksTerms.GenericWork
73
- end
74
-
75
- def self.generic_file? generic_file
76
- return false unless generic_file.respond_to? :type
77
- generic_file.type.include? WorksVocabularies::WorksTerms.GenericFile
78
- end
79
-
26
+ autoload :AddFileToGenericFile, 'hydra/works/services/generic_file/add_file_to_generic_file'
27
+ autoload :GenerateThumbnail, 'hydra/works/services/generic_file/generate/thumbnail'
28
+ autoload :UploadFileToGenericFile, 'hydra/works/services/generic_file/upload_file'
29
+ autoload :PersistDerivative, 'hydra/works/services/generic_file/persist_derivative'
80
30
  end
81
31
  end
@@ -0,0 +1,16 @@
1
+ module Hydra::Works
2
+ # Do not allow aggregation of child objects
3
+ module BlockChildObjects
4
+
5
+ def child_objects= objects
6
+ raise StandardError, "method `child_objects=' not allowed for #{self}"
7
+ end
8
+
9
+ def child_objects
10
+ raise StandardError, "method `child_objects' not allowed for #{self}"
11
+ end
12
+
13
+ end
14
+ end
15
+
16
+
@@ -20,8 +20,33 @@ module Hydra::Works
20
20
 
21
21
  included do
22
22
  type [RDFVocabularies::PCDMTerms.Collection,WorksVocabularies::WorksTerms.Collection]
23
- include Hydra::Works::AggregatesGenericWorks
24
- include Hydra::Works::AggregatesCollections
23
+ include Hydra::Works::BlockChildObjects
24
+
25
+ filters_association :members, as: :child_collections, condition: :works_collection?
26
+ filters_association :members, as: :child_generic_works, condition: :works_generic_work?
27
+ end
28
+
29
+ # @return [Boolean] whether this instance is a Hydra::Works Collection.
30
+ def works_collection?
31
+ true
32
+ end
33
+
34
+ # @return [Boolean] whether this instance is a Hydra::Works Generic Work.
35
+ def works_generic_work?
36
+ false
37
+ end
38
+
39
+ # @return [Boolean] whether this instance is a Hydra::Works Generic File.
40
+ def works_generic_file?
41
+ false
42
+ end
43
+
44
+ def parents
45
+ aggregated_by
46
+ end
47
+
48
+ def parent_collections
49
+ aggregated_by.select { |parent| parent.class.included_modules.include?(Hydra::Works::CollectionBehavior) }
25
50
  end
26
51
 
27
52
  end
@@ -2,21 +2,13 @@ module Hydra::Works::GenericFile::ContainedFiles
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  # HydraWorks supports only one each of original_file, thumbnail, and extracted_text. However
5
- # you are free to add an unlimited number of addtition types such as different resolutions
5
+ # you are free to add an unlimited number of additional types such as different resolutions
6
6
  # of images, different derivatives, etc, and use any established vocabulary you choose.
7
7
 
8
8
  # TODO: se PCDM vocab class when projecthydra-labs/hydra-pcdm#80 is merged
9
-
10
- def original_file
11
- file_of_type(::RDF::URI("http://pcdm.org/OriginalFile"))
9
+ included do
10
+ directly_contains_one :original_file, through: :files, type: ::RDF::URI("http://pcdm.org/use#OriginalFile"), class_name: "Hydra::PCDM::File"
11
+ directly_contains_one :thumbnail, through: :files, type: ::RDF::URI("http://pcdm.org/use#ThumbnailImage"), class_name: "Hydra::PCDM::File"
12
+ directly_contains_one :extracted_text, through: :files, type: ::RDF::URI("http://pcdm.org/use#ExtractedText"), class_name: "Hydra::PCDM::File"
12
13
  end
13
-
14
- def thumbnail
15
- file_of_type(::RDF::URI("http://pcdm.org/ThumbnailImage"))
16
- end
17
-
18
- def extracted_text
19
- file_of_type(::RDF::URI("http://pcdm.org/ExtractedText"))
20
- end
21
-
22
14
  end
@@ -5,28 +5,24 @@ module Hydra::Works::GenericFile
5
5
  included do
6
6
  include Hydra::Derivatives
7
7
 
8
+ # Sets output_file_service to PersistDerivative instead of default Hydra::Derivatives::PersistBasicContainedOutputFileService
9
+ Hydra::Derivatives.output_file_service = Hydra::Works::PersistDerivative
10
+
8
11
  # This was taken directly from Sufia's GenericFile::Derivatives and modified to exclude any processing that modified the original file
9
12
  makes_derivatives do |obj|
10
- case obj.mime_type
13
+ case obj.original_file.mime_type
11
14
  when *pdf_mime_types
12
- obj.transform_file :original_file, { thumbnail: { format: 'jpg', size: '338x493', datastream: 'thumbnail' } }, processor: :work
15
+ obj.transform_file :original_file, thumbnail: { format: 'jpg', size: '338x493' }
13
16
  when *office_document_mime_types
14
- obj.transform_file :original_file, { thumbnail: { format: 'jpg', size: '200x150>', datastream: 'thumbnail' } }, processor: :document
17
+ obj.transform_file :original_file, { thumbnail: { format: 'jpg', size: '200x150>' } }, processor: :document
15
18
  when *video_mime_types
16
- obj.transform_file :original_file, { thumbnail: { format: 'jpg', datastream: 'thumbnail' } }, processor: :video
19
+ obj.transform_file :original_file, { thumbnail: { format: 'jpg' } }, processor: :video
17
20
  when *image_mime_types
18
- obj.transform_file :original_file, { thumbnail: { format: 'jpg', size: '200x150>', datastream: 'thumbnail' } }, processor: :work
21
+ obj.transform_file :original_file, thumbnail: { format: 'jpg', size: '200x150>' }
19
22
  end
20
23
  end
21
24
 
22
25
  end
23
26
 
24
- # This bit was not in Sufia, but needs to be here for derivatives to work
25
- # TODO: delegate mime type somewhere else?
26
- def mime_type
27
- return nil unless self.original_file
28
- self.original_file.mime_type
29
- end
30
-
31
27
  end
32
- end
28
+ end
@@ -4,23 +4,23 @@ module Hydra::Works::GenericFile
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  def pdf?
7
- self.class.pdf_mime_types.include? self.mime_type
7
+ self.class.pdf_mime_types.include? mime_type
8
8
  end
9
9
 
10
10
  def image?
11
- self.class.image_mime_types.include? self.mime_type
11
+ self.class.image_mime_types.include? mime_type
12
12
  end
13
13
 
14
14
  def video?
15
- self.class.video_mime_types.include? self.mime_type
15
+ self.class.video_mime_types.include? mime_type
16
16
  end
17
17
 
18
18
  def audio?
19
- self.class.audio_mime_types.include? self.mime_type
19
+ self.class.audio_mime_types.include? mime_type
20
20
  end
21
21
 
22
22
  def office_document?
23
- self.class.office_document_mime_types.include? self.mime_type
23
+ self.class.office_document_mime_types.include? mime_type
24
24
  end
25
25
 
26
26
  # TODO: remove?
@@ -29,10 +29,15 @@ module Hydra::Works::GenericFile
29
29
  end
30
30
 
31
31
  def file_format
32
- return nil if self.mime_type.blank? and self.format_label.blank?
33
- return self.mime_type.split('/')[1]+ " ("+self.format_label.join(", ")+")" unless self.mime_type.blank? or self.format_label.blank?
34
- return self.mime_type.split('/')[1] unless self.mime_type.blank?
35
- return self.format_label
32
+ if mime_type.present? && format_label.present?
33
+ "#{mime_type.split('/').last} (#{format_label.join(", ")})"
34
+ elsif mime_type.present?
35
+ mime_type.split('/').last
36
+ elsif format_label.present?
37
+ format_label
38
+ else
39
+ nil
40
+ end
36
41
  end
37
42
 
38
43
  module ClassMethods
@@ -0,0 +1,18 @@
1
+ module Hydra::Works::GenericFile
2
+ # Allows a GenericFile to treat the version history of the original_file as the GenericFile's version history
3
+ module VersionedContent
4
+
5
+ def content_versions
6
+ self.original_file.versions.all
7
+ end
8
+
9
+ def latest_content_version
10
+ self.original_file.versions.last
11
+ end
12
+
13
+ def current_content_version_uri
14
+ self.original_file.versions.last.uri
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,48 @@
1
+ module Hydra::Works::GenericFile
2
+ module VirusCheck
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ validate :detect_viruses
7
+ end
8
+
9
+ # Default behavior is to raise a validation error and halt the save if a virus is found
10
+ def detect_viruses
11
+ return unless original_file && original_file.new_record?
12
+
13
+ path = original_file.is_a?(String) ? original_file : local_path_for_file(original_file)
14
+ unless defined?(ClamAV)
15
+ warn "Virus checking disabled, #{path} not checked"
16
+ return
17
+ end
18
+
19
+ scan_result = ClamAV.instance.scanfile(path)
20
+ if scan_result == 0
21
+ true
22
+ else
23
+ virus_message = "A virus was found in #{path}: #{scan_result}"
24
+ warn(virus_message)
25
+ errors.add(:base, virus_message)
26
+ false
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ # Returns a path for reading the content of +file+
33
+ # @param [File] file object to retrieve a path for
34
+ def local_path_for_file(file)
35
+ if file.respond_to?(:path)
36
+ file.path
37
+ else
38
+ Tempfile.open('') do |t|
39
+ t.binmode
40
+ t.write(file)
41
+ t.close
42
+ t.path
43
+ end
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -15,11 +15,34 @@ module Hydra::Works
15
15
  included do
16
16
  type [RDFVocabularies::PCDMTerms.Object,WorksVocabularies::WorksTerms.GenericFile]
17
17
 
18
- include Hydra::Works::AggregatesGenericFiles
19
18
  include Hydra::Works::GenericFile::ContainedFiles
20
19
  include Hydra::Works::GenericFile::Derivatives
21
20
  include Hydra::Works::GenericFile::MimeTypes
21
+ include Hydra::Works::GenericFile::VersionedContent
22
+ include Hydra::Works::BlockChildObjects
22
23
  end
23
24
 
25
+ # @return [Boolean] whether this instance is a Hydra::Works Collection.
26
+ def works_collection?
27
+ false
28
+ end
29
+
30
+ # @return [Boolean] whether this instance is a Hydra::Works Generic Work.
31
+ def works_generic_work?
32
+ false
33
+ end
34
+
35
+ # @return [Boolean] whether this instance is a Hydra::Works Generic File.
36
+ def works_generic_file?
37
+ true
38
+ end
39
+
40
+ def parents
41
+ aggregated_by
42
+ end
43
+
44
+ def generic_works
45
+ aggregated_by.select { |parent| parent.class.included_modules.include?(Hydra::Works::GenericWorkBehavior) }
46
+ end
24
47
  end
25
48
  end