dbla 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dbla.rb +1 -0
- data/lib/dbla/abstract_response.rb +2 -2
- data/lib/dbla/document_presenter.rb +7 -5
- data/lib/dbla/repository.rb +11 -6
- data/lib/dbla/response.rb +25 -0
- data/lib/dbla/response/facets.rb +62 -0
- data/lib/dbla/search_builder_behavior.rb +20 -0
- data/lib/dbla/version.rb +1 -1
- data/lib/generators/dbla/assets_generator.rb +1 -1
- data/lib/generators/dbla/install_generator.rb +6 -6
- data/lib/generators/dbla/routes_generator.rb +5 -5
- data/lib/generators/dbla/templates/collection.rb +2 -2
- data/lib/generators/dbla/templates/item.rb +2 -2
- data/lib/tasks/dbla_key.rake +5 -5
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed3c90144eabe9791538f773b22ba691467248be
|
4
|
+
data.tar.gz: 7cab3b50332d69e51d978538022ff2034b88265f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 276e2e397be231484d882ce6c8111f7905a79e1dbe428be6dff04944c02efa4598f47106c01e454c8f23012714159f52f8c90b4078136114813c237edfea6c68
|
7
|
+
data.tar.gz: 19da1e0593e6f066ac31505d6d9df0a0120685186966fd112ed4481c04ec6e0e7a7e7284df49466f0b1ff91a1fc914b1b40e7d1c7c441b2901934dd8f514858d
|
data/lib/dbla.rb
CHANGED
@@ -49,10 +49,10 @@ module Dbla
|
|
49
49
|
when Array
|
50
50
|
value.each { |v| force_to_utf8(v) }
|
51
51
|
when String
|
52
|
-
value.force_encoding("utf-8") if value.respond_to?(:force_encoding)
|
52
|
+
value.force_encoding("utf-8") if value.respond_to?(:force_encoding)
|
53
53
|
end
|
54
54
|
value
|
55
55
|
end
|
56
56
|
|
57
57
|
end
|
58
|
-
end
|
58
|
+
end
|
@@ -4,6 +4,8 @@ module Dbla
|
|
4
4
|
include ActionView::Helpers::TagHelper
|
5
5
|
extend Deprecation
|
6
6
|
|
7
|
+
DESCRIPTIVE_METADATA_KEY = 'sourceResource'.freeze
|
8
|
+
|
7
9
|
# @param [Item or Collection] document
|
8
10
|
# @param [ActionController::Base] controller scope for linking and generating urls
|
9
11
|
# @param [Blacklight::Configuration] configuration
|
@@ -19,7 +21,7 @@ module Dbla
|
|
19
21
|
# @param [SolrDocument] document
|
20
22
|
# @return [String]
|
21
23
|
def document_heading
|
22
|
-
@document[
|
24
|
+
@document[DESCRIPTIVE_METADATA_KEY]['title']
|
23
25
|
end
|
24
26
|
##
|
25
27
|
# Get the document's "title" to display in the <title> element.
|
@@ -28,7 +30,7 @@ module Dbla
|
|
28
30
|
# @see #document_heading
|
29
31
|
# @return [String]
|
30
32
|
def document_show_html_title
|
31
|
-
@document[
|
33
|
+
@document[DESCRIPTIVE_METADATA_KEY]['title']
|
32
34
|
end
|
33
35
|
##
|
34
36
|
# Render a value (or array of values) from a field
|
@@ -49,7 +51,7 @@ module Dbla
|
|
49
51
|
def render_document_index_label field, opts ={}
|
50
52
|
if Symbol === field
|
51
53
|
# these are shenanigans to find a nested field
|
52
|
-
field.to_s.split('
|
54
|
+
field.to_s.split('.').inject(@document) {|m,v| m[v]}
|
53
55
|
elsif Proc === field
|
54
56
|
field.call
|
55
57
|
else
|
@@ -87,7 +89,7 @@ module Dbla
|
|
87
89
|
# Rendering:
|
88
90
|
# - helper_method
|
89
91
|
# - link_to_search
|
90
|
-
# TODO : maybe this should be merged with render_field_value, and the ugly signature
|
92
|
+
# TODO : maybe this should be merged with render_field_value, and the ugly signature
|
91
93
|
# simplified by pushing some of this logic into the "model"
|
92
94
|
# @param [SolrDocument] document
|
93
95
|
# @param [String] field name
|
@@ -108,4 +110,4 @@ module Dbla
|
|
108
110
|
|
109
111
|
|
110
112
|
end
|
111
|
-
end
|
113
|
+
end
|
data/lib/dbla/repository.rb
CHANGED
@@ -12,12 +12,16 @@ module Dbla
|
|
12
12
|
data = nil
|
13
13
|
#TODO Move this into a SearchBuilder, add a generator
|
14
14
|
if params['q']
|
15
|
-
q = "?api_key=#{api_key}&q=#{params['q']}"
|
15
|
+
q = "?api_key=#{api_key}&q=#{params['q']}&facets=sourceResource.format"
|
16
16
|
if params.page
|
17
|
-
|
17
|
+
q << "&page=#{params.page}"
|
18
18
|
end
|
19
19
|
if params.rows
|
20
|
-
|
20
|
+
q << "&page_size=#{params.rows}"
|
21
|
+
end
|
22
|
+
params.facet_filters do |facet_field, value|
|
23
|
+
value = "\"#{value}\"" if value.index(' ')
|
24
|
+
q << "&#{facet_field}=#{CGI::escape(value)}"
|
21
25
|
end
|
22
26
|
puts url + q
|
23
27
|
data = get(url + q)
|
@@ -34,12 +38,13 @@ module Dbla
|
|
34
38
|
end
|
35
39
|
end
|
36
40
|
def api_key
|
37
|
-
Dbla.config
|
41
|
+
Dbla.config.fetch(:api_key)
|
38
42
|
end
|
39
43
|
|
40
44
|
def url
|
41
|
-
|
45
|
+
# REVIEW: What if the URL does not have a trailing /; Should it be `File.join?`
|
46
|
+
@url ||= (Dbla.config.fetch(:url) + blacklight_config.document_model.name.downcase.pluralize).freeze
|
42
47
|
end
|
43
48
|
|
44
49
|
end
|
45
|
-
end
|
50
|
+
end
|
data/lib/dbla/response.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
module Dbla
|
3
3
|
class Response < AbstractResponse
|
4
|
+
autoload :Facets, 'dbla/response/facets'
|
5
|
+
|
4
6
|
def initialize(data, request_params, options = {})
|
5
7
|
super(force_to_utf8(data))
|
6
8
|
@request_params = request_params
|
@@ -11,6 +13,29 @@ module Dbla
|
|
11
13
|
@documents = (data['docs'] || []).map {|d| document_model.new(d,self)}
|
12
14
|
@start = data['start']
|
13
15
|
@limit = data['limit']
|
16
|
+
@aggregations = (data['facets'] || {})
|
17
|
+
else
|
18
|
+
@aggregations = {}
|
19
|
+
@total = 0
|
20
|
+
@start = 0
|
21
|
+
@limit = 10
|
22
|
+
@documents = []
|
23
|
+
end
|
24
|
+
end
|
25
|
+
def aggregations
|
26
|
+
# "facets":{"sourceResource.format":{"_type":"terms","missing":77,"total":250,"other":16,"terms":[{"term":"Photographs","count":44},
|
27
|
+
Hash[@aggregations.map do |k,v|
|
28
|
+
items = v['terms'].map {|term| Facets::FacetItem.new(value: term['term'], hits: term['count'])}
|
29
|
+
[k, Facets::FacetField.new(k,items)]
|
30
|
+
end]
|
31
|
+
end
|
32
|
+
def spelling
|
33
|
+
Words.new([])
|
34
|
+
end
|
35
|
+
class Words
|
36
|
+
attr_accessor :words
|
37
|
+
def initialize(words)
|
38
|
+
@words = words
|
14
39
|
end
|
15
40
|
end
|
16
41
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
module Dbla::Response::Facets
|
3
|
+
# Borrowed from Blacklight
|
4
|
+
class FacetField
|
5
|
+
attr_reader :name, :items
|
6
|
+
def initialize name, items, options = {}
|
7
|
+
@name, @items = name, items
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def limit
|
12
|
+
@options[:limit] || default_limit
|
13
|
+
end
|
14
|
+
|
15
|
+
def sort
|
16
|
+
@options[:sort] || default_sort
|
17
|
+
end
|
18
|
+
|
19
|
+
def offset
|
20
|
+
@options[:offset] || default_offset
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def default_limit
|
25
|
+
100
|
26
|
+
end
|
27
|
+
|
28
|
+
def default_sort
|
29
|
+
if limit > 0
|
30
|
+
'count'
|
31
|
+
else
|
32
|
+
'index'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def default_offset
|
37
|
+
0
|
38
|
+
end
|
39
|
+
end
|
40
|
+
class FacetItem < OpenStruct
|
41
|
+
def initialize *args
|
42
|
+
options = args.extract_options!
|
43
|
+
|
44
|
+
# Backwards-compat method signature
|
45
|
+
value = args.shift
|
46
|
+
hits = args.shift
|
47
|
+
|
48
|
+
options[:value] = value if value
|
49
|
+
options[:hits] = hits if hits
|
50
|
+
|
51
|
+
super(options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def label
|
55
|
+
super || value
|
56
|
+
end
|
57
|
+
|
58
|
+
def as_json(props = nil)
|
59
|
+
table.as_json(props)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -1,4 +1,24 @@
|
|
1
1
|
module Dbla
|
2
2
|
module SearchBuilderBehavior
|
3
|
+
def processed_parameters
|
4
|
+
request.tap do |request_parameters|
|
5
|
+
if blacklight_params[:q]
|
6
|
+
request_parameters[:q] = blacklight_params[:q]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
def facet_filters
|
11
|
+
# :fq, map from :f.
|
12
|
+
if ( blacklight_params[:f])
|
13
|
+
f_request_params = blacklight_params[:f]
|
14
|
+
|
15
|
+
f_request_params.each_pair do |facet_field, value_list|
|
16
|
+
Array(value_list).each do |value|
|
17
|
+
next if value.blank? # skip empty strings
|
18
|
+
yield *[facet_field, value]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
3
23
|
end
|
4
24
|
end
|
data/lib/dbla/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Dbla
|
2
2
|
class Install < Rails::Generators::Base
|
3
|
-
|
3
|
+
|
4
4
|
source_root File.expand_path('../templates', __FILE__)
|
5
|
-
|
5
|
+
|
6
6
|
argument :controller_name, type: :string , default: "catalog"
|
7
7
|
argument :search_builder_name, type: :string , default: "search_builder"
|
8
8
|
|
@@ -15,11 +15,11 @@ module Dbla
|
|
15
15
|
|
16
16
|
# Copy all files in templates/public/ directory to public/
|
17
17
|
# Call external generator in AssetsGenerator, so we can
|
18
|
-
# leave that callable seperately too.
|
19
|
-
def copy_public_assets
|
18
|
+
# leave that callable seperately too.
|
19
|
+
def copy_public_assets
|
20
20
|
generate "dbla:assets"
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def generate_search_builder
|
24
24
|
generate 'dbla:search_builder', search_builder_name
|
25
25
|
end
|
@@ -32,4 +32,4 @@ module Dbla
|
|
32
32
|
generate 'dbla:routes'
|
33
33
|
end
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Dbla
|
2
2
|
class RoutesGenerator < Rails::Generators::Base
|
3
|
-
|
3
|
+
|
4
4
|
source_root File.expand_path('../templates', __FILE__)
|
5
|
-
|
5
|
+
|
6
6
|
argument :controller_name , type: :string , default: "catalog"
|
7
7
|
|
8
8
|
desc """
|
@@ -12,9 +12,9 @@ module Dbla
|
|
12
12
|
|
13
13
|
def inject_dbla_routes
|
14
14
|
# These will end up in routes.rb file in reverse order
|
15
|
-
# we add em, since each is added at the top of file.
|
16
|
-
# we want "root" to be FIRST for optimal url generation.
|
15
|
+
# we add em, since each is added at the top of file.
|
16
|
+
# we want "root" to be FIRST for optimal url generation.
|
17
17
|
route("Dbla::Routes.for(self, :#{controller_name})")
|
18
18
|
end
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
@@ -35,8 +35,8 @@ class Collection
|
|
35
35
|
|
36
36
|
def has? f, *values
|
37
37
|
# these are shenanigans to find a nested field
|
38
|
-
if f.is_a? String and f.index('
|
39
|
-
f = f.split('
|
38
|
+
if f.is_a? String and f.index('.')
|
39
|
+
f = f.split('.')
|
40
40
|
f.inject(self) {|m,v| (m || {})[v]}
|
41
41
|
else
|
42
42
|
super
|
@@ -35,8 +35,8 @@ class Item
|
|
35
35
|
|
36
36
|
def has? f, *values
|
37
37
|
# these are shenanigans to find a nested field
|
38
|
-
if f.is_a? String and f.index('
|
39
|
-
f = f.split('
|
38
|
+
if f.is_a? String and f.index('.')
|
39
|
+
f = f.split('.')
|
40
40
|
f.inject(self) {|m,v| (m || {})[v]}
|
41
41
|
else
|
42
42
|
super
|
data/lib/tasks/dbla_key.rake
CHANGED
@@ -10,7 +10,7 @@ module Dbla
|
|
10
10
|
}
|
11
11
|
def self.usage(key=:all)
|
12
12
|
puts "Usage:"
|
13
|
-
USAGE.select {|k,v| k == key || key == :all}.each{|k,v| puts v}
|
13
|
+
USAGE.select {|k,v| k == key || key == :all}.each{|k,v| puts v}
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -43,9 +43,9 @@ namespace :dbla do
|
|
43
43
|
end
|
44
44
|
task config: :environment do
|
45
45
|
if ENV['key']
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
open(Dbla.config_path,'a') do |blob|
|
47
|
+
blob.write YAML.dump('api_key' => ENV['key'])
|
48
|
+
end
|
49
49
|
else
|
50
50
|
Dbla::ApiKey.usage(:config)
|
51
51
|
end
|
@@ -54,4 +54,4 @@ namespace :dbla do
|
|
54
54
|
Dbla::ApiKey.usage
|
55
55
|
end
|
56
56
|
end
|
57
|
-
end
|
57
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbla
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Audrey Altman
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 4.1.10
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: blacklight
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '5.10'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '5.10'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: sqlite3
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,6 +118,7 @@ files:
|
|
104
118
|
- lib/dbla/engine.rb
|
105
119
|
- lib/dbla/repository.rb
|
106
120
|
- lib/dbla/response.rb
|
121
|
+
- lib/dbla/response/facets.rb
|
107
122
|
- lib/dbla/routes.rb
|
108
123
|
- lib/dbla/search_builder_behavior.rb
|
109
124
|
- lib/dbla/version.rb
|