ddr-core 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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