ddr-core 0.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.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +12 -0
  3. data/README.md +27 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/config/ddr_core_manifest.js +0 -0
  6. data/app/controllers/users/omniauth_callbacks_controller.rb +11 -0
  7. data/app/controllers/users/sessions_controller.rb +15 -0
  8. data/app/models/concerns/ddr/captionable.rb +25 -0
  9. data/app/models/concerns/ddr/describable.rb +108 -0
  10. data/app/models/concerns/ddr/governable.rb +25 -0
  11. data/app/models/concerns/ddr/has_admin_metadata.rb +141 -0
  12. data/app/models/concerns/ddr/has_attachments.rb +10 -0
  13. data/app/models/concerns/ddr/has_children.rb +10 -0
  14. data/app/models/concerns/ddr/has_content.rb +132 -0
  15. data/app/models/concerns/ddr/has_extracted_text.rb +10 -0
  16. data/app/models/concerns/ddr/has_intermediate_file.rb +25 -0
  17. data/app/models/concerns/ddr/has_multires_image.rb +14 -0
  18. data/app/models/concerns/ddr/has_parent.rb +18 -0
  19. data/app/models/concerns/ddr/has_struct_metadata.rb +21 -0
  20. data/app/models/concerns/ddr/has_thumbnail.rb +33 -0
  21. data/app/models/concerns/ddr/solr_document_behavior.rb +429 -0
  22. data/app/models/concerns/ddr/streamable.rb +25 -0
  23. data/app/models/ddr/admin_set.rb +28 -0
  24. data/app/models/ddr/attachment.rb +14 -0
  25. data/app/models/ddr/collection.rb +28 -0
  26. data/app/models/ddr/component.rb +31 -0
  27. data/app/models/ddr/contact.rb +23 -0
  28. data/app/models/ddr/digest.rb +8 -0
  29. data/app/models/ddr/file.rb +40 -0
  30. data/app/models/ddr/item.rb +36 -0
  31. data/app/models/ddr/language.rb +31 -0
  32. data/app/models/ddr/media_type.rb +22 -0
  33. data/app/models/ddr/resource.rb +94 -0
  34. data/app/models/ddr/rights_statement.rb +25 -0
  35. data/app/models/ddr/target.rb +17 -0
  36. data/config/initializers/devise.rb +262 -0
  37. data/config/locales/ddr-core.en.yml +85 -0
  38. data/config/routes.rb +3 -0
  39. data/db/migrate/20141104181418_create_users.rb +34 -0
  40. data/db/migrate/20141107124012_add_columns_to_user.rb +46 -0
  41. data/lib/ddr-core.rb +1 -0
  42. data/lib/ddr/auth.rb +80 -0
  43. data/lib/ddr/auth/ability.rb +18 -0
  44. data/lib/ddr/auth/ability_definitions.rb +26 -0
  45. data/lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb +9 -0
  46. data/lib/ddr/auth/ability_definitions/alias_ability_definitions.rb +23 -0
  47. data/lib/ddr/auth/ability_definitions/attachment_ability_definitions.rb +13 -0
  48. data/lib/ddr/auth/ability_definitions/collection_ability_definitions.rb +28 -0
  49. data/lib/ddr/auth/ability_definitions/component_ability_definitions.rb +13 -0
  50. data/lib/ddr/auth/ability_definitions/item_ability_definitions.rb +13 -0
  51. data/lib/ddr/auth/ability_definitions/lock_ability_definitions.rb +13 -0
  52. data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +16 -0
  53. data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +39 -0
  54. data/lib/ddr/auth/ability_definitions/superuser_ability_definitions.rb +9 -0
  55. data/lib/ddr/auth/ability_factory.rb +10 -0
  56. data/lib/ddr/auth/abstract_ability.rb +48 -0
  57. data/lib/ddr/auth/affiliation.rb +14 -0
  58. data/lib/ddr/auth/affiliation_groups.rb +20 -0
  59. data/lib/ddr/auth/anonymous_ability.rb +7 -0
  60. data/lib/ddr/auth/auth_context.rb +109 -0
  61. data/lib/ddr/auth/auth_context_factory.rb +13 -0
  62. data/lib/ddr/auth/detached_auth_context.rb +19 -0
  63. data/lib/ddr/auth/dynamic_groups.rb +13 -0
  64. data/lib/ddr/auth/effective_permissions.rb +12 -0
  65. data/lib/ddr/auth/effective_roles.rb +9 -0
  66. data/lib/ddr/auth/failure_app.rb +16 -0
  67. data/lib/ddr/auth/group.rb +40 -0
  68. data/lib/ddr/auth/grouper_gateway.rb +70 -0
  69. data/lib/ddr/auth/groups.rb +32 -0
  70. data/lib/ddr/auth/ldap_gateway.rb +74 -0
  71. data/lib/ddr/auth/permissions.rb +18 -0
  72. data/lib/ddr/auth/remote_groups.rb +14 -0
  73. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +56 -0
  74. data/lib/ddr/auth/roles.rb +28 -0
  75. data/lib/ddr/auth/roles/role.rb +121 -0
  76. data/lib/ddr/auth/roles/role_type.rb +23 -0
  77. data/lib/ddr/auth/roles/role_types.rb +52 -0
  78. data/lib/ddr/auth/superuser_ability.rb +7 -0
  79. data/lib/ddr/auth/test_helpers.rb +22 -0
  80. data/lib/ddr/auth/user.rb +54 -0
  81. data/lib/ddr/auth/web_auth_context.rb +29 -0
  82. data/lib/ddr/core.rb +110 -0
  83. data/lib/ddr/core/engine.rb +8 -0
  84. data/lib/ddr/core/version.rb +5 -0
  85. data/lib/ddr/error.rb +16 -0
  86. data/lib/ddr/files.rb +13 -0
  87. data/lib/ddr/fits.rb +189 -0
  88. data/lib/ddr/index.rb +29 -0
  89. data/lib/ddr/index/abstract_query_result.rb +22 -0
  90. data/lib/ddr/index/connection.rb +38 -0
  91. data/lib/ddr/index/csv_query_result.rb +84 -0
  92. data/lib/ddr/index/document_builder.rb +9 -0
  93. data/lib/ddr/index/field.rb +35 -0
  94. data/lib/ddr/index/field_attribute.rb +22 -0
  95. data/lib/ddr/index/fields.rb +154 -0
  96. data/lib/ddr/index/filter.rb +139 -0
  97. data/lib/ddr/index/query.rb +82 -0
  98. data/lib/ddr/index/query_builder.rb +185 -0
  99. data/lib/ddr/index/query_clause.rb +112 -0
  100. data/lib/ddr/index/query_params.rb +40 -0
  101. data/lib/ddr/index/query_result.rb +102 -0
  102. data/lib/ddr/index/response.rb +30 -0
  103. data/lib/ddr/index/sort_order.rb +28 -0
  104. data/lib/ddr/index/unique_key_field.rb +12 -0
  105. data/lib/ddr/managers.rb +9 -0
  106. data/lib/ddr/managers/manager.rb +13 -0
  107. data/lib/ddr/managers/technical_metadata_manager.rb +141 -0
  108. data/lib/ddr/structure.rb +188 -0
  109. data/lib/ddr/structures/agent.rb +49 -0
  110. data/lib/ddr/structures/component_type_term.rb +29 -0
  111. data/lib/ddr/structures/div.rb +64 -0
  112. data/lib/ddr/structures/f_locat.rb +54 -0
  113. data/lib/ddr/structures/file.rb +52 -0
  114. data/lib/ddr/structures/file_grp.rb +35 -0
  115. data/lib/ddr/structures/file_sec.rb +22 -0
  116. data/lib/ddr/structures/fptr.rb +31 -0
  117. data/lib/ddr/structures/mets_hdr.rb +37 -0
  118. data/lib/ddr/structures/mptr.rb +49 -0
  119. data/lib/ddr/structures/struct_map.rb +40 -0
  120. data/lib/ddr/utils.rb +185 -0
  121. data/lib/ddr/vocab.rb +22 -0
  122. data/lib/ddr/vocab/asset.rb +51 -0
  123. data/lib/ddr/vocab/contact.rb +9 -0
  124. data/lib/ddr/vocab/display.rb +9 -0
  125. data/lib/ddr/vocab/duke_terms.rb +13 -0
  126. data/lib/ddr/vocab/rdf_vocabulary_parser.rb +43 -0
  127. data/lib/ddr/vocab/roles.rb +25 -0
  128. data/lib/ddr/vocab/sources/duketerms.rdf +870 -0
  129. data/lib/ddr/vocab/vocabulary.rb +37 -0
  130. data/lib/ddr/workflow.rb +8 -0
  131. data/lib/tasks/ddr/core_tasks.rake +4 -0
  132. metadata +428 -0
@@ -0,0 +1,29 @@
1
+ module Ddr::Auth
2
+ class WebAuthContext < AuthContext
3
+
4
+ # @return [String] the IP address, or nil
5
+ # @see ActionDispatch::RemoteIp
6
+ def ip_address
7
+ if middleware = env["action_dispatch.remote_ip"]
8
+ middleware.calculate_ip
9
+ end
10
+ end
11
+
12
+ # @return [Array<String>]
13
+ def affiliation
14
+ split_env("affiliation").map { |a| a.sub(/@duke\.edu\z/, "") }
15
+ end
16
+
17
+ # @return [Array<String>]
18
+ def ismemberof
19
+ split_env("ismemberof")
20
+ end
21
+
22
+ private
23
+
24
+ def split_env(attr, delim = ";")
25
+ env.fetch(attr, "").split(delim)
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,110 @@
1
+ require 'ddr/core/engine'
2
+ require 'ddr/vocab'
3
+ require 'ddr/auth'
4
+ require 'ddr/error'
5
+
6
+ module Ddr
7
+ extend ActiveSupport::Autoload
8
+
9
+ autoload :Files
10
+ autoload :NotFoundError, 'ddr/error'
11
+ autoload :Fits
12
+ autoload :Index
13
+ autoload :Managers
14
+ autoload :Utils
15
+ autoload :Workflow
16
+
17
+ autoload :Structure
18
+ module Structures
19
+ extend ActiveSupport::Autoload
20
+ autoload :Agent
21
+ autoload :Div
22
+ autoload :File
23
+ autoload :FileGrp
24
+ autoload :FileSec
25
+ autoload :FLocat
26
+ autoload :Fptr
27
+ autoload :MetsHdr
28
+ autoload :Mptr
29
+ autoload :StructMap
30
+ autoload :ComponentTypeTerm
31
+ end
32
+
33
+ SOLR_DOCUMENT_ID = "id"
34
+
35
+ # Default metadata adapter configured for Valkyrie
36
+ def self.metadata_adapter
37
+ @metadata_adapter ||= Valkyrie.config.metadata_adapter
38
+ end
39
+
40
+ # Persister for default metadata_adapter
41
+ def self.persister
42
+ @persister ||= metadata_adapter.persister
43
+ end
44
+
45
+ # Query Service for default metadata_adapter
46
+ def self.query_service
47
+ @query_service ||= metadata_adapter.query_service
48
+ end
49
+
50
+ # Default storage adapter
51
+ def self.storage_adapter
52
+ @storage_adapter ||= Valkyrie.config.storage_adapter
53
+ end
54
+
55
+ # Convenient to be able to set the default storage adapter in certain cases
56
+ def self.storage_adapter=(storage_adapter)
57
+ @storage_adapter = storage_adapter
58
+ end
59
+
60
+ mattr_accessor :default_mime_type do
61
+ "application/octet-stream"
62
+ end
63
+
64
+ # Maps media types to preferred file extensions
65
+ mattr_accessor :preferred_file_extensions do
66
+ {
67
+ 'application/zip' => 'zip',
68
+ 'audio/mp4' => 'm4a',
69
+ 'audio/mpeg' => 'mp3',
70
+ 'audio/ogg' => 'ogg',
71
+ 'audio/wav' => 'wav',
72
+ 'text/vtt' => 'vtt',
73
+ 'video/flv' => 'flv',
74
+ 'video/mp4' => 'mp4',
75
+ 'video/quicktime' => 'mov',
76
+ 'video/webm' => 'webm'
77
+ }
78
+ end
79
+
80
+ # Maps file extensions to preferred media types
81
+ mattr_accessor :preferred_media_types do
82
+ {
83
+ '.aac' => 'audio/mp4',
84
+ '.f4a' => 'audio/mp4',
85
+ '.flv' => 'video/flv',
86
+ '.m4a' => 'audio/mp4',
87
+ '.mov' => 'video/quicktime',
88
+ '.mp3' => 'audio/mpeg',
89
+ '.mp4' => 'video/mp4',
90
+ '.oga' => 'audio/ogg',
91
+ '.ogg' => 'audio/ogg',
92
+ '.srt' => 'text/plain',
93
+ '.vtt' => 'text/vtt',
94
+ '.wav' => 'audio/wav',
95
+ '.webm' => 'video/webm',
96
+ '.zip' => 'application/zip'
97
+ }
98
+ end
99
+
100
+ # Is repository locked? Default is false.
101
+ # A locked repository behaves as though each object in the repository is locked.
102
+ mattr_accessor :repository_locked do
103
+ false
104
+ end
105
+
106
+ module Core
107
+
108
+ end
109
+
110
+ end
@@ -0,0 +1,8 @@
1
+ require 'valkyrie'
2
+
3
+ module Ddr
4
+ module Core
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Ddr
2
+ module Core
3
+ VERSION = '0.2.1'
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ module Ddr
2
+ # Base class for custom exceptions
3
+ class Error < StandardError; end
4
+
5
+ # # Invalid checksum
6
+ # class ChecksumInvalid < Error; end
7
+ #
8
+ # # Derivative generation failure
9
+ # class DerivativeGenerationFailure < Error; end
10
+ #
11
+ # # Content model casting error
12
+ # class ContentModelError < Error; end
13
+
14
+ # A model instance was not found
15
+ class NotFoundError < Error; end
16
+ end
@@ -0,0 +1,13 @@
1
+ module Ddr
2
+ module Files
3
+
4
+ CHECKSUM_TYPE_MD5 = 'MD5'.freeze
5
+ CHECKSUM_TYPE_SHA1 = 'SHA1'.freeze
6
+ CHECKSUM_TYPE_SHA256 = 'SHA256'.freeze
7
+ CHECKSUM_TYPE_SHA384 = 'SHA384'.freeze
8
+ CHECKSUM_TYPE_SHA512 = 'SHA512'.freeze
9
+
10
+ CHECKSUM_TYPES = Valkyrie::Types::Strict::String.enum(CHECKSUM_TYPE_MD5, CHECKSUM_TYPE_SHA1, CHECKSUM_TYPE_SHA256,
11
+ CHECKSUM_TYPE_SHA384, CHECKSUM_TYPE_SHA512)
12
+ end
13
+ end
@@ -0,0 +1,189 @@
1
+ module Ddr
2
+ class Fits < SimpleDelegator
3
+
4
+ FITS_XMLNS = "http://hul.harvard.edu/ois/xml/ns/fits/fits_output".freeze
5
+ FITS_SCHEMA = "http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd".freeze
6
+
7
+ EXIFTOOL = "Exiftool"
8
+
9
+ def version
10
+ root.xpath('@version').map(&:value)
11
+ end
12
+
13
+ def timestamp
14
+ root.xpath('@timestamp').map(&:value)
15
+ end
16
+
17
+ def format_label
18
+ root.xpath('fits:identification/fits:identity/@format', fits: FITS_XMLNS).map(&:value)
19
+ end
20
+
21
+ def format_version
22
+ root.xpath('fits:identification/fits:identity/fits:version', fits: FITS_XMLNS).map(&:text)
23
+ end
24
+
25
+ def media_type
26
+ root.xpath('fits:identification/fits:identity/@mimetype', fits: FITS_XMLNS).map(&:value)
27
+ end
28
+
29
+ def pronom_identifier
30
+ root.xpath('fits:identification/fits:identity/fits:externalIdentifier[@type = "puid"]', fits: FITS_XMLNS)
31
+ .map(&:text)
32
+ end
33
+
34
+ def valid
35
+ root.xpath('fits:filestatus/fits:valid', fits: FITS_XMLNS).map(&:text)
36
+ end
37
+
38
+ def well_formed
39
+ root.xpath('fits:filestatus/fits:well-formed', fits: FITS_XMLNS).map(&:text)
40
+ end
41
+
42
+ def created
43
+ root.xpath('fits:fileinfo/fits:created', fits: FITS_XMLNS).map(&:text)
44
+ end
45
+
46
+ def creating_application
47
+ root.xpath('fits:fileinfo/fits:creatingApplicationName', fits: FITS_XMLNS).map(&:text)
48
+ end
49
+
50
+ def extent
51
+ root.xpath('fits:fileinfo/fits:size', fits: FITS_XMLNS).map(&:text)
52
+ end
53
+
54
+ def md5
55
+ root.xpath('fits:fileinfo/fits:md5checksum', fits: FITS_XMLNS).map(&:text)
56
+ end
57
+
58
+ def color_space
59
+ root.xpath('fits:metadata/fits:image/fits:colorSpace', fits: FITS_XMLNS).map(&:text)
60
+ end
61
+
62
+ def icc_profile_name
63
+ root.xpath('fits:metadata/fits:image/fits:iccProfileName', fits: FITS_XMLNS).map(&:text)
64
+ end
65
+
66
+ def icc_profile_version
67
+ root.xpath('fits:metadata/fits:image/fits:iccProfileVersion', fits: FITS_XMLNS).map(&:text)
68
+ end
69
+
70
+ def image_height
71
+ root.xpath('fits:metadata/fits:image/fits:imageHeight', fits: FITS_XMLNS).map(&:text)
72
+ end
73
+
74
+ def image_width
75
+ root.xpath('fits:metadata/fits:image/fits:imageWidth', fits: FITS_XMLNS).map(&:text)
76
+ end
77
+
78
+ def modified
79
+ root.xpath("fits:fileinfo/fits:lastmodified[@toolname != '#{EXIFTOOL}']", fits: FITS_XMLNS).map(&:text)
80
+ end
81
+
82
+ def self.xml_template
83
+ builder = Nokogiri::XML::Builder.new do |xml|
84
+ xml.fits("xmlns"=>FITS_XMLNS,
85
+ "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
86
+ "xsi:schemaLocation"=>"http://hul.harvard.edu/ois/xml/ns/fits/fits_output #{FITS_SCHEMA}")
87
+ end
88
+ builder.doc
89
+ end
90
+
91
+ private
92
+
93
+ def root
94
+ xpath('//fits:fits', fits: FITS_XMLNS).first
95
+ end
96
+
97
+ ### DDRevo ##########################################
98
+ # From Ddr::Datastreams::FitsDatastream. Code above accounts for proxy terms from below and has a private 'root'
99
+ # method but does not (yet) provide methods for all the terms in the terminology. Thought it was better to wait
100
+ # and see which ones are actually needed.
101
+ ### DDRevo ##########################################
102
+ # set_terminology do |t|
103
+ # t.root(path: "fits",
104
+ # xmlns: FITS_XMLNS,
105
+ # schema: FITS_SCHEMA)
106
+ # t.version(path: {attribute: "version"})
107
+ # t.timestamp(path: {attribute: "timestamp"})
108
+ # t.identification {
109
+ # t.identity {
110
+ # t.mimetype(path: {attribute: "mimetype"})
111
+ # t.format_label(path: {attribute: "format"})
112
+ # t.version
113
+ # t.externalIdentifier
114
+ # t.pronom_identifier(path: "externalIdentifier", attributes: {type: "puid"})
115
+ # }
116
+ # }
117
+ # t.fileinfo {
118
+ # t.created
119
+ # t.creatingApplicationName
120
+ # t.creatingos
121
+ # t.filename
122
+ # t.filepath
123
+ # t.fslastmodified
124
+ # t.lastmodified
125
+ # t.md5checksum
126
+ # t.size
127
+ # }
128
+ # t.filestatus {
129
+ # t.valid
130
+ # t.well_formed(path: "well-formed")
131
+ # }
132
+ # t.metadata {
133
+ # t.image {
134
+ # t.imageWidth
135
+ # t.imageHeight
136
+ # t.colorSpace
137
+ # t.iccProfileName
138
+ # t.iccProfileVersion
139
+ # }
140
+ # t.document {
141
+ # # TODO - configure to get from Tika?
142
+ # # t.encoding
143
+ # }
144
+ # t.text
145
+ # t.audio
146
+ # t.video
147
+ # }
148
+ #
149
+ # ## proxy terms
150
+ #
151
+ # # identification / identity
152
+ # t.format_label proxy: [:identification, :identity, :format_label]
153
+ # t.format_version proxy: [:identification, :identity, :version]
154
+ # t.media_type proxy: [:identification, :identity, :mimetype]
155
+ # t.pronom_identifier proxy: [:identification, :identity, :pronom_identifier]
156
+ #
157
+ # # filestatus
158
+ # t.valid proxy: [:filestatus, :valid]
159
+ # t.well_formed proxy: [:filestatus, :well_formed]
160
+ #
161
+ # # fileinfo
162
+ # t.created proxy: [:fileinfo, :created]
163
+ # t.creating_application proxy: [:fileinfo, :creatingApplicationName]
164
+ # t.extent proxy: [:fileinfo, :size]
165
+ # t.md5 proxy: [:fileinfo, :md5checksum]
166
+ #
167
+ # # image metadata
168
+ # t.color_space proxy: [:metadata, :image, :colorSpace]
169
+ # t.icc_profile_name proxy: [:metadata, :image, :iccProfileName]
170
+ # t.icc_profile_version proxy: [:metadata, :image, :iccProfileVersion]
171
+ # t.image_height proxy: [:metadata, :image, :imageHeight]
172
+ # t.image_width proxy: [:metadata, :image, :imageWidth]
173
+ # end
174
+ #
175
+ # def self.xml_template
176
+ # builder = Nokogiri::XML::Builder.new do |xml|
177
+ # xml.fits("xmlns"=>FITS_XMLNS,
178
+ # "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
179
+ # "xsi:schemaLocation"=>"http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd")
180
+ # end
181
+ # builder.doc
182
+ # end
183
+ #
184
+ # def prefix
185
+ # "fits__"
186
+ # end
187
+
188
+ end
189
+ end
@@ -0,0 +1,29 @@
1
+ module Ddr
2
+ module Index
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :AbstractQueryResult
6
+ autoload :Connection
7
+ autoload :CSVQueryResult
8
+ autoload :DocumentBuilder
9
+ autoload :Field
10
+ autoload :FieldAttribute
11
+ autoload :Fields
12
+ autoload :Filter
13
+ autoload :Query
14
+ autoload :QueryBuilder
15
+ autoload :QueryClause
16
+ autoload :QueryParams
17
+ autoload :QueryResult
18
+ autoload :Response
19
+ autoload :SortOrder
20
+ autoload :UniqueKeyField
21
+
22
+ def self.pids
23
+ builder = QueryBuilder.new { field UniqueKeyField.instance }
24
+ query = builder.query
25
+ query.pids
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ module Ddr::Index
2
+ class AbstractQueryResult
3
+ include Enumerable
4
+
5
+ attr_reader :query
6
+ delegate :params, to: :query
7
+
8
+ def initialize(query)
9
+ @query = query.dup.freeze
10
+ end
11
+
12
+ def count
13
+ response = Connection.select(params, rows: 0)
14
+ response.num_found
15
+ end
16
+
17
+ def each
18
+ raise NotImplementedError, "Subclasses must implement `#each`."
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,38 @@
1
+ require "rsolr"
2
+ require "forwardable"
3
+
4
+ module Ddr::Index
5
+ #
6
+ # Wraps an RSolr connection
7
+ #
8
+ class Connection
9
+
10
+ module Methods
11
+ extend Forwardable
12
+
13
+ delegate [:get, :post, :paginate] => :solr
14
+
15
+ def solr
16
+ # Changed for Valkyrie
17
+ # RSolr.connect(ActiveFedora.solr_config)
18
+ Blacklight.default_index.connection
19
+ end
20
+
21
+ def select(params, extra={})
22
+ Response.new post("select", params: params.merge(extra))
23
+ end
24
+
25
+ def page(*args)
26
+ Response.new paginate(*args)
27
+ end
28
+
29
+ def count(params)
30
+ select(params, rows: 0).num_found
31
+ end
32
+ end
33
+
34
+ extend Methods
35
+ include Methods
36
+
37
+ end
38
+ end