supplejack_client 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/supplejack/config.rb +7 -4
- data/lib/supplejack/controllers/helpers.rb +219 -11
- data/lib/supplejack/item.rb +3 -1
- data/lib/supplejack/record.rb +40 -15
- data/lib/supplejack/search.rb +23 -14
- data/lib/supplejack/user.rb +4 -0
- data/lib/supplejack/version.rb +1 -1
- data/spec/supplejack/record_spec.rb +24 -18
- data/spec/supplejack/search_spec.rb +10 -10
- data/spec/supplejack/user_spec.rb +9 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f40b6b28bd0108c37c997ef3fd6c0e346e48341
|
4
|
+
data.tar.gz: 0eb25481a3fdea69d0597739ba2aeb966fc671f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4520818d551545b38294f5d157fe6b52caf1af07379cf329e138ab67b674687944305a3503d807e1f9966834e1e9245a4545228071b12ffed50e32d06d9762e
|
7
|
+
data.tar.gz: 8a72b8a32b0365258c722781db9b52ddcd29705612d7e3a0170f5d1220d6bce9c89b9f5cad4856db6a30de55f4c70f9bd57532aad77cad29634afece752a1d9a
|
data/lib/supplejack/config.rb
CHANGED
@@ -34,12 +34,13 @@ module Supplejack
|
|
34
34
|
SEARCH_KLASS = nil
|
35
35
|
FIELDS = [:default]
|
36
36
|
SUPPLEJACK_FIELDS = []
|
37
|
-
|
37
|
+
SPECIAL_FIELDS = []
|
38
38
|
ENABLE_DEBUGGING = false
|
39
39
|
ENABLE_CACHING = false
|
40
40
|
ATTRIBUTE_TAG = :p
|
41
41
|
LABEL_TAG = :strong
|
42
42
|
LABEL_CLASS = nil
|
43
|
+
STICKY_FACETS = false
|
43
44
|
|
44
45
|
VALID_OPTIONS_KEYS = [
|
45
46
|
:api_key,
|
@@ -58,12 +59,13 @@ module Supplejack
|
|
58
59
|
:search_klass,
|
59
60
|
:fields,
|
60
61
|
:supplejack_fields,
|
61
|
-
:
|
62
|
+
:special_fields,
|
62
63
|
:enable_debugging,
|
63
64
|
:enable_caching,
|
64
65
|
:attribute_tag,
|
65
66
|
:label_tag,
|
66
|
-
:label_class
|
67
|
+
:label_class,
|
68
|
+
:sticky_facets
|
67
69
|
]
|
68
70
|
|
69
71
|
SINGLE_VALUE_METHODS = [
|
@@ -96,6 +98,7 @@ module Supplejack
|
|
96
98
|
self.facets = FACETS
|
97
99
|
self.facets_per_page = FACETS_PER_PAGE
|
98
100
|
self.facets_sort = FACETS_SORT
|
101
|
+
self.sticky_facets = STICKY_FACETS
|
99
102
|
self.single_value_methods = SINGLE_VALUE_METHODS
|
100
103
|
self.search_attributes = SEARCH_ATTRIBUTES
|
101
104
|
self.url_format = URL_FORMAT
|
@@ -107,7 +110,7 @@ module Supplejack
|
|
107
110
|
self.search_klass = SEARCH_KLASS
|
108
111
|
self.fields = FIELDS
|
109
112
|
self.supplejack_fields = SUPPLEJACK_FIELDS
|
110
|
-
self.
|
113
|
+
self.special_fields = SPECIAL_FIELDS
|
111
114
|
self.enable_debugging = ENABLE_DEBUGGING
|
112
115
|
self.enable_caching = ENABLE_CACHING
|
113
116
|
self.attribute_tag = ATTRIBUTE_TAG
|
@@ -41,10 +41,10 @@ module Supplejack
|
|
41
41
|
# @return [ String ] A HTML snippet with the attribute name and value
|
42
42
|
#
|
43
43
|
def attribute(record, attributes, options={})
|
44
|
-
options.reverse_merge!(:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
44
|
+
options.reverse_merge!(label: true, label_inline: true, limit: nil, delimiter: ", ",
|
45
|
+
link_path: false, tag: Supplejack.attribute_tag, label_tag: Supplejack.label_tag,
|
46
|
+
label_class: Supplejack.label_class, trans_key: nil, link: false,
|
47
|
+
extra_html: nil, tag_class: nil)
|
48
48
|
|
49
49
|
value = []
|
50
50
|
attributes = [attributes] unless attributes.is_a?(Array)
|
@@ -72,7 +72,7 @@ module Supplejack
|
|
72
72
|
end
|
73
73
|
|
74
74
|
if options[:link_path]
|
75
|
-
value = value.map {|v| link_to(v, send(options[:link_path], {:
|
75
|
+
value = value.map {|v| link_to(v, send(options[:link_path], {i: {attribute => v}})) }
|
76
76
|
end
|
77
77
|
|
78
78
|
if options[:link]
|
@@ -82,11 +82,11 @@ module Supplejack
|
|
82
82
|
end
|
83
83
|
|
84
84
|
value = value.join(options[:delimiter]).html_safe
|
85
|
-
value = truncate(value, :
|
85
|
+
value = truncate(value, length: options[:limit]) if options[:limit].to_i > 20
|
86
86
|
value
|
87
87
|
else
|
88
88
|
if options[:limit] && options[:limit].to_i > 0
|
89
|
-
value = truncate(value, :
|
89
|
+
value = truncate(value, length: options[:limit].to_i)
|
90
90
|
end
|
91
91
|
|
92
92
|
if options[:link]
|
@@ -97,22 +97,66 @@ module Supplejack
|
|
97
97
|
content = ""
|
98
98
|
if options[:label]
|
99
99
|
if options[:trans_key].present?
|
100
|
-
translation = I18n.t(options[:trans_key], :
|
100
|
+
translation = I18n.t(options[:trans_key], default: attribute.to_s.capitalize) + ": "
|
101
101
|
else
|
102
102
|
i18n_class_name = record.class.to_s.tableize.downcase.gsub(/\//, "_")
|
103
|
-
translation = "#{I18n.t("#{i18n_class_name}.#{attribute}", :
|
103
|
+
translation = "#{I18n.t("#{i18n_class_name}.#{attribute}", default: attribute.to_s.capitalize)}: "
|
104
104
|
end
|
105
|
-
content = content_tag(options[:label_tag], translation, :
|
105
|
+
content = content_tag(options[:label_tag], translation, class: options[:label_class]).html_safe
|
106
106
|
content << "<br/>".html_safe unless options[:label_inline]
|
107
107
|
end
|
108
108
|
|
109
109
|
content << value.to_s
|
110
110
|
content << options[:extra_html] if options[:extra_html]
|
111
111
|
if value.present? and value != "Not specified"
|
112
|
-
options[:tag] ? content_tag(options[:tag], content.html_safe, :
|
112
|
+
options[:tag] ? content_tag(options[:tag], content.html_safe, class: options[:tag_class]) : content.html_safe
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
+
# Displays the next and/or previous links based on the record and current search
|
117
|
+
#
|
118
|
+
# @params [ Dnz::Record ] The record object which has information about the next/previous record and pages.
|
119
|
+
# @params [ Hash ] options Hash of options to customize the output,
|
120
|
+
# supported options: :prev_class, :next_class, :prev_label, :next_label
|
121
|
+
#
|
122
|
+
# @option options [ String ] :prev_class The CSS class to use on the previous button
|
123
|
+
# @option options [ String ] :next_class The CSS class to use on the next button
|
124
|
+
# @option options [ String ] :wrapper_class The CSS class to use on the wrapping span
|
125
|
+
# @option options [ String ] :prev_label Any HTML to be put inside the previous button
|
126
|
+
# @option options [ String ] :next_label Any HTML to be put inside the next button
|
127
|
+
#
|
128
|
+
def next_previous_links(record, html_options={})
|
129
|
+
html_options.reverse_merge!({prev_class: "prev", next_class: "next", wrapper_class: 'nav', prev_label: nil, next_label: nil})
|
130
|
+
|
131
|
+
return "" unless params[:search]
|
132
|
+
links = "".html_safe
|
133
|
+
|
134
|
+
options = search.options
|
135
|
+
|
136
|
+
previous_label = html_options[:prev_label] ||= t('supplejack_client.previous', default: "Previous")
|
137
|
+
next_label = html_options[:next_label] ||= t('supplejack_client.next', default: "Next")
|
138
|
+
previous_label = previous_label.html_safe
|
139
|
+
next_label = next_label.html_safe
|
140
|
+
|
141
|
+
options[:path] = params[:search][:path].gsub(/(\W|\d)/, '') if params[:search] && params[:search][:path]
|
142
|
+
|
143
|
+
if record.previous_record
|
144
|
+
options[:page] = record.previous_page if record.previous_page.to_i > 1
|
145
|
+
links += link_to(raw(previous_label), record_path(record.previous_record, search: options), class: html_options[:prev_class]).html_safe
|
146
|
+
else
|
147
|
+
links += content_tag(:span, previous_label, class: html_options[:prev_class])
|
148
|
+
end
|
149
|
+
|
150
|
+
if record.next_record
|
151
|
+
options[:page] = record.next_page if record.next_page.to_i > 1
|
152
|
+
links += link_to(raw(next_label), record_path(record.next_record, search: options), class: html_options[:next_class]).html_safe
|
153
|
+
else
|
154
|
+
links += content_tag(:span, next_label, class: html_options[:next_class])
|
155
|
+
end
|
156
|
+
|
157
|
+
content_tag(:span, links, class: html_options[:wrapper_class])
|
158
|
+
end
|
159
|
+
|
116
160
|
def attribute_link_replacement(value, link_pattern)
|
117
161
|
if link_pattern.is_a?(String)
|
118
162
|
link_pattern = URI.decode(link_pattern)
|
@@ -123,6 +167,170 @@ module Supplejack
|
|
123
167
|
end
|
124
168
|
end
|
125
169
|
|
170
|
+
# Generates hidden fields with all the filters of a search object
|
171
|
+
# It is used in forms, so that when a user enteres another term in the search
|
172
|
+
# box the state of the search is preserved
|
173
|
+
#
|
174
|
+
# @param [ Dnz::Search ] search A instance of the Dnz::Search class
|
175
|
+
# @param [ Hash ] options Hash of options to remove any filter
|
176
|
+
#
|
177
|
+
# @option options [ Array ] except A array of fields which should not generate a hidden field
|
178
|
+
#
|
179
|
+
# @return [ String ] A HTML snippet with hidden fields
|
180
|
+
#
|
181
|
+
def form_fields(search, options={})
|
182
|
+
if search
|
183
|
+
tags = "".html_safe
|
184
|
+
|
185
|
+
fields = [:record_type, :sort, :direction]
|
186
|
+
fields.delete(:record_type) if search.record?
|
187
|
+
|
188
|
+
if options[:except].try(:any?)
|
189
|
+
fields.delete_if {|field| options[:except].include?(field)}
|
190
|
+
end
|
191
|
+
|
192
|
+
fields.each do |field|
|
193
|
+
tags += hidden_field_tag(field.to_s, search.send(field)) unless search.send(field).blank?
|
194
|
+
end
|
195
|
+
|
196
|
+
{i: :i_unlocked, il: :i_locked, h: :h_unlocked, hl: :h_locked}.each_pair do |symbol, instance_name|
|
197
|
+
if Supplejack.sticky_facets || [:il, :hl].include?(symbol) || options[:all_filters]
|
198
|
+
filters = search.url_format.send(instance_name) rescue {}
|
199
|
+
filters.each do |name, value|
|
200
|
+
field_name = value.is_a?(Array) ? "#{symbol.to_s}[#{name.to_s}][]" : "#{symbol.to_s}[#{name.to_s}]"
|
201
|
+
values = *value
|
202
|
+
values.each {|v| tags << hidden_field_tag(field_name, v) }
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
tags
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Returns a link with all existing search options except the specified in the params
|
212
|
+
#
|
213
|
+
# @param [ Symbol ] name The name of the facet. Ex: :category, :subject
|
214
|
+
# @param [ String ] value The value withing the facet. Ex: "Wellington", "Books", etc..
|
215
|
+
# @param [ String ] path_name The name of the path used to generate the url path.
|
216
|
+
# For example if you have a records_path route in your app, then specify "records"
|
217
|
+
# and it will call the records_path method
|
218
|
+
# @param [ Hash ] options Set of options to customize the output
|
219
|
+
# @param [ Hash ] html_options HTML options that are passed directly to the link_to method
|
220
|
+
#
|
221
|
+
# @return [ String ] A link to with the correct search options.
|
222
|
+
#
|
223
|
+
def link_to_remove_filter(name, value, path_name, options={}, html_options={}, &block)
|
224
|
+
path = generate_path(path_name, search.options(except: [{name => value}, :page]))
|
225
|
+
link_text = options[:display_name].present? ? options[:display_name] : I18n.t("facets.values.#{value}", default: value)
|
226
|
+
link_to block_given? ? capture(&block) : link_text, path.html_safe, html_options
|
227
|
+
end
|
228
|
+
|
229
|
+
# Returns a link with the existing search options and adds the specified facet and value
|
230
|
+
#
|
231
|
+
# @param [ Symbol ] name The name of the facet. Ex: :category, :subject
|
232
|
+
# @param [ String ] value The value withing the facet. Ex: "Wellington", "Books", etc..
|
233
|
+
# @param [ String ] path_name The name of the path used to generate the url path.
|
234
|
+
# For example if you have a records_path route in your app, then specify "records"
|
235
|
+
# and it will call the records_path method
|
236
|
+
# @param [ Hash ] options Set of options to customize the output
|
237
|
+
# @param [ Hash ] html_options HTML options that are passed directly to the link_to method
|
238
|
+
#
|
239
|
+
# @return [ String ] A link to with the correct search options.
|
240
|
+
#
|
241
|
+
def link_to_add_filter(name, value, path_name, options={}, html_options={}, &block)
|
242
|
+
symbol = search.record_type == 0 ? :i : :h
|
243
|
+
options[:except] = Util.array(options[:except]) + [:page]
|
244
|
+
path = generate_path(path_name, search.options(plus: {symbol => {name => value}}, except: options[:except]))
|
245
|
+
link_text = options[:display_name].present? ? options[:display_name] : I18n.t("facets.values.#{value}", default: value)
|
246
|
+
link_to block_given? ? capture(&block) : link_text, path.html_safe, html_options
|
247
|
+
end
|
248
|
+
|
249
|
+
def link_to_lock_filter(name, value, path_name, options={}, html_options={}, &block)
|
250
|
+
symbol = search.record_type == 0 ? :il : :hl
|
251
|
+
path = generate_path(path_name, search.options(except: [{name => value}], plus: {symbol => {name => value}}))
|
252
|
+
link_text = options[:display_name].present? ? options[:display_name] : I18n.t("facets.values.#{value}", default: value)
|
253
|
+
link_to block_given? ? capture(&block) : link_text, path.html_safe, html_options
|
254
|
+
end
|
255
|
+
|
256
|
+
# Provides a link to record landing page that is augmented with a persisted search object
|
257
|
+
# Used in results listings
|
258
|
+
#
|
259
|
+
# @params [ String ] name A text to display in the link (not required if block is passed)
|
260
|
+
# @params [ String ] url The url for the link
|
261
|
+
# @params [ Hash ] search_options The options to pass in the search options (usually @search.options)
|
262
|
+
# @params [ Hash ] html_options The options to pass to link_to
|
263
|
+
# @params [ Block ] &block A block containing ERB, this replaces the name parameter
|
264
|
+
#
|
265
|
+
def link_to_record(*args, &block)
|
266
|
+
if block_given?
|
267
|
+
name = capture(&block)
|
268
|
+
url = args[0]
|
269
|
+
search_options = args[1] || {}
|
270
|
+
html_options = args[2] || {}
|
271
|
+
else
|
272
|
+
name = args[0]
|
273
|
+
url = args[1]
|
274
|
+
search_options = args[2] || {}
|
275
|
+
html_options = args[3] || {}
|
276
|
+
end
|
277
|
+
url = url + "?" + {search: search_options}.to_query if search_options.try(:any?)
|
278
|
+
link_to(name, url, html_options)
|
279
|
+
end
|
280
|
+
|
281
|
+
# Displays the next and/or previous links based on the record and current search
|
282
|
+
#
|
283
|
+
# @params [ Dnz::Record ] The record object which has information about the next/previous record and pages.
|
284
|
+
# @params [ Hash ] options Hash of options to customize the output,
|
285
|
+
# supported options: :prev_class, :next_class, :prev_label, :next_label
|
286
|
+
#
|
287
|
+
# @option options [ String ] :prev_class The CSS class to use on the previous button
|
288
|
+
# @option options [ String ] :next_class The CSS class to use on the next button
|
289
|
+
# @option options [ String ] :wrapper_class The CSS class to use on the wrapping span
|
290
|
+
# @option options [ String ] :prev_label Any HTML to be put inside the previous button
|
291
|
+
# @option options [ String ] :next_label Any HTML to be put inside the next button
|
292
|
+
#
|
293
|
+
def next_previous_links(record, html_options={})
|
294
|
+
html_options.reverse_merge!({prev_class: "prev", next_class: "next", wrapper_class: 'nav', prev_label: nil, next_label: nil})
|
295
|
+
|
296
|
+
return "" unless params[:search]
|
297
|
+
links = "".html_safe
|
298
|
+
|
299
|
+
options = search.options
|
300
|
+
|
301
|
+
previous_label = html_options[:prev_label] ||= t('dnz_client.previous', default: "Previous")
|
302
|
+
next_label = html_options[:next_label] ||= t('dnz_client.next', default: "Next")
|
303
|
+
previous_label = previous_label.html_safe
|
304
|
+
next_label = next_label.html_safe
|
305
|
+
|
306
|
+
options[:path] = params[:search][:path].gsub(/(\W|\d)/, '') if params[:search] && params[:search][:path]
|
307
|
+
|
308
|
+
if record.previous_record
|
309
|
+
options[:page] = record.previous_page if record.previous_page.to_i > 1
|
310
|
+
links += link_to(raw(previous_label), record_path(record.previous_record, search: options), class: html_options[:prev_class]).html_safe
|
311
|
+
else
|
312
|
+
links += content_tag(:span, previous_label, class: html_options[:prev_class])
|
313
|
+
end
|
314
|
+
|
315
|
+
if record.next_record
|
316
|
+
options[:page] = record.next_page if record.next_page.to_i > 1
|
317
|
+
links += link_to(raw(next_label), record_path(record.next_record, search: options), class: html_options[:next_class]).html_safe
|
318
|
+
else
|
319
|
+
links += content_tag(:span, next_label, class: html_options[:next_class])
|
320
|
+
end
|
321
|
+
|
322
|
+
content_tag(:span, links, class: html_options[:wrapper_class])
|
323
|
+
end
|
324
|
+
|
325
|
+
def generate_path(name, options={})
|
326
|
+
segments = name.split(".")
|
327
|
+
if segments.size == 1
|
328
|
+
send("#{segments[0]}_path", options)
|
329
|
+
elsif segments.size == 2
|
330
|
+
send(segments[0]).send("#{segments[1]}_path", options)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
126
334
|
end
|
127
335
|
end
|
128
336
|
end
|
data/lib/supplejack/item.rb
CHANGED
@@ -23,7 +23,9 @@ module Supplejack
|
|
23
23
|
class Item
|
24
24
|
include Supplejack::Request
|
25
25
|
|
26
|
-
ATTRIBUTES = [:record_id, :
|
26
|
+
ATTRIBUTES = [:record_id, :title, :description, :large_thumbnail_url, :thumbnail_url,
|
27
|
+
:contributing_partner, :display_content_partner, :display_collection, :landing_url, :category, :date,
|
28
|
+
:dnz_type, :dc_identifier, :creator]
|
27
29
|
|
28
30
|
attr_reader *ATTRIBUTES
|
29
31
|
attr_reader :attributes, :user_set_id
|
data/lib/supplejack/record.rb
CHANGED
@@ -17,6 +17,16 @@ module Supplejack
|
|
17
17
|
extend Supplejack::Request
|
18
18
|
extend ActiveModel::Naming
|
19
19
|
include ActiveModel::Conversion
|
20
|
+
|
21
|
+
# Some of the records in the API return an array of values, but in practice
|
22
|
+
# most of them have on only one value. What this does is just convert the array
|
23
|
+
# to a string for the methods defined in the configuration.
|
24
|
+
Supplejack.single_value_methods.each do |method|
|
25
|
+
define_method("#{method}") do
|
26
|
+
values = @attributes[method]
|
27
|
+
values.is_a?(Array) ? values.first : values
|
28
|
+
end
|
29
|
+
end
|
20
30
|
end
|
21
31
|
|
22
32
|
def initialize(attributes={})
|
@@ -49,18 +59,25 @@ module Supplejack
|
|
49
59
|
def metadata
|
50
60
|
metadata = []
|
51
61
|
|
52
|
-
|
53
|
-
|
62
|
+
Supplejack.send("special_fields").each do |schema, fields|
|
63
|
+
fields[:fields].each do |field|
|
54
64
|
if @attributes.has_key?(field)
|
55
65
|
values = @attributes[field]
|
56
66
|
values ||= [] unless !!values == values #Testing if boolean
|
57
67
|
values = [values] unless values.is_a?(Array)
|
58
|
-
|
68
|
+
|
69
|
+
case fields[:format]
|
70
|
+
when "uppercase" then field = field.to_s.upcase
|
71
|
+
when "lowercase" then field = field.to_s.downcase
|
72
|
+
when "camelcase" then field = field.to_s.camelcase
|
73
|
+
end
|
74
|
+
|
75
|
+
# field = field.to_s.camelcase(:lower) if schema == :dcterms
|
59
76
|
field = field.to_s.sub(/#{schema}_/, '')
|
60
77
|
values.each do |value|
|
61
|
-
metadata << {:name => field, :schema => schema, :value => value }
|
78
|
+
metadata << {:name => field, :schema => schema.to_s, :value => value }
|
62
79
|
end
|
63
|
-
end
|
80
|
+
end
|
64
81
|
end
|
65
82
|
end
|
66
83
|
|
@@ -72,16 +89,6 @@ module Supplejack
|
|
72
89
|
@attributes[:format]
|
73
90
|
end
|
74
91
|
|
75
|
-
# Some of the records in the API return an array of values, but in practice
|
76
|
-
# most of them have on only one value. What this does is just convert the array
|
77
|
-
# to a string for the methods defined in the configuration.
|
78
|
-
Supplejack.single_value_methods.each do |method|
|
79
|
-
define_method("#{method}") do
|
80
|
-
values = @attributes[method]
|
81
|
-
values.is_a?(Array) ? values.first : values
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
92
|
[:next_page, :previous_page, :next_record, :previous_record].each do |pagination_field|
|
86
93
|
define_method(pagination_field) do
|
87
94
|
@attributes[pagination_field]
|
@@ -92,7 +99,25 @@ module Supplejack
|
|
92
99
|
true
|
93
100
|
end
|
94
101
|
|
102
|
+
# def build_authorities(name)
|
103
|
+
# @attributes[:authorities] ||= []
|
104
|
+
# authorities = @attributes[:authorities].find_all {|authority| authority["name"] == name }
|
105
|
+
# authorities.map {|attributes| Supplejack::Authority.new(attributes) }
|
106
|
+
# end
|
107
|
+
|
95
108
|
def method_missing(symbol, *args, &block)
|
109
|
+
if symbol.to_s.match(/(.+)_authorities/)
|
110
|
+
return build_authorities("#{$1}_authority")
|
111
|
+
end
|
112
|
+
|
113
|
+
if symbol.to_s.match(/(.+)_terms/)
|
114
|
+
return build_authorities("#{$1}_term")
|
115
|
+
end
|
116
|
+
|
117
|
+
if [:series_parent, :child_series, :collection_parent, :collection_root, :collection_mid].include?(symbol)
|
118
|
+
return build_authorities(symbol.to_s)
|
119
|
+
end
|
120
|
+
|
96
121
|
raise NoMethodError, "undefined method '#{symbol.to_s}' for Supplejack::Record:Module" unless @attributes.has_key?(symbol)
|
97
122
|
@attributes[symbol]
|
98
123
|
end
|
data/lib/supplejack/search.rb
CHANGED
@@ -10,13 +10,13 @@ require 'digest/md5'
|
|
10
10
|
|
11
11
|
module Supplejack
|
12
12
|
class Search
|
13
|
-
|
13
|
+
include Supplejack::Request
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
attr_accessor :results, :text, :page, :per_page, :pagination_limit, :direction, :sort, :filters, :record_type, :record_klass
|
16
|
+
attr_accessor :url_format, :without, :and, :or, :params, :api_params
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
def initialize(params={})
|
19
|
+
@params = params.clone rescue {}
|
20
20
|
@params[:facets] ||= Supplejack.facets.join(',')
|
21
21
|
@params[:facets_per_page] ||= Supplejack.facets_per_page
|
22
22
|
[:action, :controller].each {|p| @params.delete(p) }
|
@@ -30,10 +30,10 @@ module Supplejack
|
|
30
30
|
@pagination_limit = @params[:pagination_limit] || Supplejack.pagination_limit
|
31
31
|
@sort = @params[:sort]
|
32
32
|
@direction = @params[:direction]
|
33
|
-
@url_format
|
34
|
-
@filters
|
35
|
-
@api_params
|
36
|
-
@record_klass
|
33
|
+
@url_format = Supplejack.url_format_klass.new(@params, self)
|
34
|
+
@filters = @url_format.filters
|
35
|
+
@api_params = @url_format.to_api_hash
|
36
|
+
@record_klass = @params[:record_klass] || Supplejack.record_klass
|
37
37
|
|
38
38
|
# Do not execute the actual search right away, it should be lazy loaded
|
39
39
|
# when the user needs one of the following values.
|
@@ -49,7 +49,7 @@ module Supplejack
|
|
49
49
|
self.class.send(:attr_accessor, attribute)
|
50
50
|
self.send("#{attribute}=", @filters[attribute]) unless @filters[attribute] == 'all'
|
51
51
|
end
|
52
|
-
|
52
|
+
end
|
53
53
|
|
54
54
|
# Returns by default a array of two element arrays with all the active filters
|
55
55
|
# in the search object and their values
|
@@ -217,9 +217,9 @@ module Supplejack
|
|
217
217
|
#
|
218
218
|
# @return [Hash{String => Integer}] A hash of type names and counts
|
219
219
|
#
|
220
|
-
def
|
221
|
-
return @
|
222
|
-
@
|
220
|
+
def categories(options={})
|
221
|
+
return @categories if @categories
|
222
|
+
@categories = facet_values('category', options)
|
223
223
|
end
|
224
224
|
|
225
225
|
# Gets the facet values unrestricted by the current filter
|
@@ -309,6 +309,15 @@ module Supplejack
|
|
309
309
|
return true
|
310
310
|
end
|
311
311
|
|
312
|
+
# Gets the category facet unrestricted by the current category filter
|
313
|
+
#
|
314
|
+
# @return [Hash{String => Integer}] A hash of category names and counts
|
315
|
+
#
|
316
|
+
def categories(options={})
|
317
|
+
return @categories if @categories
|
318
|
+
@categories = facet_values("category", options)
|
319
|
+
end
|
320
|
+
|
312
321
|
# Convienence method to find out if the search object has any specific filter
|
313
322
|
# applied to it. It works for both single and multiple value filters.
|
314
323
|
# This methods are actually defined on method_missing.
|
@@ -341,6 +350,6 @@ module Supplejack
|
|
341
350
|
|
342
351
|
Util.deep_merge(existing_filters, extra_filters)
|
343
352
|
end
|
344
|
-
|
353
|
+
|
345
354
|
end
|
346
355
|
end
|
data/lib/supplejack/user.rb
CHANGED
data/lib/supplejack/version.rb
CHANGED
@@ -82,10 +82,16 @@ module Supplejack
|
|
82
82
|
end
|
83
83
|
|
84
84
|
describe '#metadata' do
|
85
|
-
it 'returns an array of hashes with
|
86
|
-
Supplejack.stub(:
|
85
|
+
it 'returns an array of hashes with special fields their values and schemas' do
|
86
|
+
Supplejack.stub(:special_fields) { {admin: {fields: [:location]}} }
|
87
87
|
record = SupplejackRecord.new({:location => 'Wellington'})
|
88
|
-
record.metadata.should include({:name => 'location', :schema => '
|
88
|
+
record.metadata.should include({:name => 'location', :schema => 'admin', :value => 'Wellington'})
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'returns an array of hashes with special fields their values and schemas for multiple special_fields configured' do
|
92
|
+
Supplejack.stub(:special_fields) { {admin: {fields: [:location]}, dnz: {fields: [:description]}} }
|
93
|
+
record = SupplejackRecord.new({:location => 'Wellington', :description => "Some description"})
|
94
|
+
record.metadata.should include({:name => 'location', :schema => 'admin', :value => 'Wellington'}, {:name => 'description', :schema => 'dnz', :value => 'Some description'})
|
89
95
|
end
|
90
96
|
|
91
97
|
it 'should not return metadata for inexistent attribtues' do
|
@@ -95,9 +101,9 @@ module Supplejack
|
|
95
101
|
end
|
96
102
|
|
97
103
|
it 'returns multiple elements for a multi value field' do
|
98
|
-
Supplejack.stub(:
|
104
|
+
Supplejack.stub(:special_fields) { {admin: {fields: [:location]}} }
|
99
105
|
record = SupplejackRecord.new({:location => ['Wellington', 'Auckland']})
|
100
|
-
record.metadata.should include({:name => 'location', :schema => '
|
106
|
+
record.metadata.should include({:name => 'location', :schema => 'admin', :value => 'Wellington'}, {:name => 'location', :schema => 'admin', :value => 'Auckland'})
|
101
107
|
end
|
102
108
|
|
103
109
|
it 'returns a empty array for a empty field' do
|
@@ -107,27 +113,27 @@ module Supplejack
|
|
107
113
|
end
|
108
114
|
|
109
115
|
it 'works for boolean fields too' do
|
110
|
-
Supplejack.stub(:
|
116
|
+
Supplejack.stub(:special_fields) { {admin: {fields: [:is_human]}} }
|
111
117
|
record = SupplejackRecord.new({:is_human => true})
|
112
|
-
record.metadata.should include({:name => 'is_human', :schema => '
|
118
|
+
record.metadata.should include({:name => 'is_human', :schema => 'admin', :value => true})
|
113
119
|
end
|
114
120
|
|
115
|
-
it 'works for boolean fields when they are true' do
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
121
|
+
# it 'works for boolean fields when they are true' do
|
122
|
+
# Supplejack.stub(:admin_fields) { [:is_animal] }
|
123
|
+
# record = SupplejackRecord.new({:is_animal => true})
|
124
|
+
# record.metadata.should include({:name => 'is_animal', :schema => 'admin', :value => true})
|
125
|
+
# end
|
120
126
|
|
121
127
|
it 'works for boolean fields when they are false' do
|
122
|
-
Supplejack.stub(:
|
123
|
-
record = SupplejackRecord.new({:
|
124
|
-
record.metadata.should include({:name => '
|
128
|
+
Supplejack.stub(:special_fields) { {admin: {fields: [:is_human]}} }
|
129
|
+
record = SupplejackRecord.new({:is_human => false})
|
130
|
+
record.metadata.should include({:name => 'is_human', :schema => 'admin', :value => false})
|
125
131
|
end
|
126
132
|
|
127
133
|
it 'returns names with the schema removed' do
|
128
|
-
Supplejack.stub(:
|
129
|
-
record = SupplejackRecord.new({:
|
130
|
-
record.metadata.should include({:name => 'identifier', :schema => '
|
134
|
+
Supplejack.stub(:special_fields) { {admin: {fields: [:admin_identifier]}} }
|
135
|
+
record = SupplejackRecord.new({:admin_identifier => 'sj:IE1174615'})
|
136
|
+
record.metadata.should include({:name => 'identifier', :schema => 'admin', :value => 'sj:IE1174615'})
|
131
137
|
end
|
132
138
|
end
|
133
139
|
|
@@ -18,9 +18,9 @@ class TestItem
|
|
18
18
|
end
|
19
19
|
|
20
20
|
module Supplejack
|
21
|
-
|
21
|
+
describe Search do
|
22
22
|
|
23
|
-
|
23
|
+
describe '#initalize' do
|
24
24
|
it 'doesn\'t break when initalized with nil' do
|
25
25
|
Search.new(nil)
|
26
26
|
end
|
@@ -533,7 +533,7 @@ module Supplejack
|
|
533
533
|
end
|
534
534
|
end
|
535
535
|
|
536
|
-
describe '#
|
536
|
+
describe '#categories' do
|
537
537
|
before(:each) do
|
538
538
|
@search = Search.new({:i => {:category => 'Books', :year => 2001}, :text => 'Dogs'})
|
539
539
|
@search.stub(:get) { {'search' => {'facets' => {'category' => {'Books' => 123}}, 'result_count' => 123}} }
|
@@ -541,30 +541,30 @@ module Supplejack
|
|
541
541
|
|
542
542
|
it 'should call the fetch_values method' do
|
543
543
|
@search.should_receive(:facet_values).with('category', {})
|
544
|
-
@search.
|
544
|
+
@search.categories
|
545
545
|
end
|
546
546
|
|
547
547
|
it 'removes category filter from the search request' do
|
548
548
|
@search.should_receive(:get).with('/records', hash_including(:and => {:year => 2001})).and_return({'search' => {'facets' => {'category' => {'Books' => 123}}}})
|
549
|
-
@search.
|
549
|
+
@search.categories
|
550
550
|
end
|
551
551
|
|
552
552
|
it 'returns the category facet hash ' do
|
553
|
-
@search.
|
553
|
+
@search.categories.should include('Books' => 123)
|
554
554
|
end
|
555
555
|
|
556
556
|
it 'asks the API for 0 results' do
|
557
557
|
@search.should_receive(:get).with('/records', hash_including({:per_page => 0}))
|
558
|
-
@search.
|
558
|
+
@search.categories
|
559
559
|
end
|
560
560
|
|
561
561
|
it 'should return add the All count to the hash' do
|
562
|
-
@search.
|
562
|
+
@search.categories['All'].should eq 123
|
563
563
|
end
|
564
564
|
|
565
565
|
it 'orders the category values by :count' do
|
566
566
|
@search.should_receive(:facet_values).with('category', {:sort => :count})
|
567
|
-
@search.
|
567
|
+
@search.categories({:sort => :count})
|
568
568
|
end
|
569
569
|
end
|
570
570
|
|
@@ -723,5 +723,5 @@ module Supplejack
|
|
723
723
|
end
|
724
724
|
end
|
725
725
|
|
726
|
-
|
726
|
+
end
|
727
727
|
end
|
@@ -10,6 +10,7 @@ require 'spec_helper'
|
|
10
10
|
module Supplejack
|
11
11
|
describe User do
|
12
12
|
let(:user) { Supplejack::User.new({'id' => 'abc', 'authentication_token' => '12345'}) }
|
13
|
+
let(:relation) { Supplejack::UserSetRelation.new(user) }
|
13
14
|
|
14
15
|
before(:each) do
|
15
16
|
Supplejack::User.stub(:get) { {'user' => {'id' => 'abc', 'authentication_token' => '12345'}} }
|
@@ -37,6 +38,14 @@ module Supplejack
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
41
|
+
describe "#sets" do
|
42
|
+
it "initializes a Dnz::UserSetRelation object" do
|
43
|
+
@relation = relation
|
44
|
+
Supplejack::UserSetRelation.should_receive(:new).with(user) { @relation }
|
45
|
+
user.sets.should be_a Supplejack::UserSetRelation
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
40
49
|
describe '#save' do
|
41
50
|
it 'should execute a put request with the user attribtues' do
|
42
51
|
user.stub(:api_attributes) { {username: 'John', email: 'john@boost.co.nz'} }
|