supplejack_client 1.0.2 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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'} }
|