archivist-client 0.1.0 → 0.1.2
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 +8 -8
- data/archivist-client.gemspec +1 -0
- data/lib/archivist/client/base.rb +34 -30
- data/lib/archivist/client/filters.rb +104 -0
- data/lib/archivist/client/version.rb +1 -1
- data/lib/archivist/models/document.rb +10 -6
- data/lib/archivist/models/format_index.rb +2 -2
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OGMwNzNlM2QxMTcwZjFlMzlmNTBjMGJlODY3YTdkM2M4MTU2YzViYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2RiZjY3Njg4NjIzODQyMmJlZTQ5NDQ3OWNlZDE4YjY4NzBlNmFkZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDJjNmVjZTNmZWQ2YzBjNjMxNDRiNTFlMjRkMmEyZDcwMzFlMDM3NGIyZjU2
|
10
|
+
NGZhNGNmMzI4NWNkMGFlMjI0YmJlYjE3MTVlNzJlMDQ1MTE1OGVlNjYzOGZi
|
11
|
+
MDhjOTAwM2Y2ZmFmMTJkZDAwZDM4ZjdiYTdiOWJhMmU0Mzk3YTY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NzU3MzQ1NDFkNGJiZGMyNWQ4NmYxMDAwMGM2MTBjYTg5NjY0OGYzYTc1MTE5
|
14
|
+
YmFkNjFlMjZmZjhlNTQ4Mjk2NjU1ZjkwNTAwNTQ4Mzc3Mzk1YmYxOTA1NTcw
|
15
|
+
MDE5YTQ4YjcxZTQwMmI0NGJjZTgyZjY1NDdmMzY3NzFiYTg3ZjQ=
|
data/archivist-client.gemspec
CHANGED
@@ -29,6 +29,7 @@ Gem::Specification.new do |gem|
|
|
29
29
|
gem.add_development_dependency "vcr"
|
30
30
|
gem.add_development_dependency "reek", ">= 1.2.8"
|
31
31
|
gem.add_development_dependency "roodi", ">= 2.1.0"
|
32
|
+
gem.add_development_dependency "gem-release", ">= 0.7.1"
|
32
33
|
|
33
34
|
gem.add_dependency "virtus", "~> 1.0.0"
|
34
35
|
gem.add_dependency "representable"
|
@@ -1,46 +1,56 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
require 'faraday_middleware'
|
3
|
+
require 'archivist/client/filters'
|
3
4
|
require 'archivist/representations'
|
4
5
|
|
5
6
|
module Archivist
|
6
7
|
module Client
|
8
|
+
# This is the primary interface of the gem.
|
9
|
+
# Example Usage:
|
10
|
+
# require 'archive-client'
|
11
|
+
# # Create an Archivist client:
|
12
|
+
# client = Archivist::Client::Base.new
|
13
|
+
# # Search for the books you're interested in:
|
14
|
+
# books = client.search(:start_year => 1500, :end_year => 1510)
|
15
|
+
# # Download them:
|
16
|
+
# books.each do |book|
|
17
|
+
# puts book.download
|
18
|
+
# end
|
7
19
|
class Base
|
20
|
+
DEFAULT_CONNECTION = Faraday.new(url: 'http://archive.org') do |faraday|
|
21
|
+
faraday.use FaradayMiddleware::FollowRedirects
|
22
|
+
faraday.request :url_encoded # form-encode POST params
|
23
|
+
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
|
24
|
+
end
|
8
25
|
attr_reader :conn
|
26
|
+
attr_accessor :filters # will be a Filters.new object
|
9
27
|
|
10
|
-
|
28
|
+
# filter_opts can be provided here, or when search is called.
|
29
|
+
# filters_opts are:
|
30
|
+
# :language => if *any* search opts provided there.
|
31
|
+
# :start_year => search opts takes precedence when provided there.
|
32
|
+
def initialize(opts = {}, filter_opts = {})
|
33
|
+
@filters = Archivist::Client::Filters.new(filter_opts)
|
11
34
|
@opts = {
|
12
35
|
page: 1,
|
13
36
|
rows: 50
|
14
37
|
}.merge(opts)
|
15
38
|
|
16
|
-
@conn =
|
17
|
-
faraday.use FaradayMiddleware::FollowRedirects
|
18
|
-
faraday.request :url_encoded # form-encode POST params
|
19
|
-
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
|
20
|
-
end
|
39
|
+
@conn = DEFAULT_CONNECTION
|
21
40
|
end
|
22
41
|
|
23
|
-
def
|
24
|
-
|
25
|
-
'
|
26
|
-
|
27
|
-
]
|
28
|
-
|
29
|
-
filters.concat(opts.delete(:filters)) if opts[:filters]
|
30
|
-
|
31
|
-
filters << if opts[:language]
|
32
|
-
"language:#{opts.delete(:language)}"
|
33
|
-
else
|
34
|
-
'(language:eng OR language:English)'
|
42
|
+
def search(opts = {})
|
43
|
+
Model::QueryResponse.new.tap do |qr|
|
44
|
+
response = @conn.get('/advancedsearch.php', params(opts))
|
45
|
+
Representation::QueryResponse.new(qr).from_json(response.body)
|
35
46
|
end
|
47
|
+
end
|
36
48
|
|
37
|
-
|
38
|
-
start_year = "#{opts.delete(:start_year)}-01-01"
|
39
|
-
end_year = "#{opts.delete(:end_year)}-12-31"
|
40
|
-
filters << "date:[#{start_year} TO #{end_year}]"
|
41
|
-
end
|
49
|
+
private
|
42
50
|
|
43
|
-
|
51
|
+
def query(opts)
|
52
|
+
@filters.update!(opts)
|
53
|
+
@filters.to_query
|
44
54
|
end
|
45
55
|
|
46
56
|
def params(opts = {})
|
@@ -52,12 +62,6 @@ module Archivist
|
|
52
62
|
}.merge(@opts).merge(opts)
|
53
63
|
end
|
54
64
|
|
55
|
-
def search(opts = {})
|
56
|
-
Model::QueryResponse.new.tap do |qr|
|
57
|
-
response = @conn.get('/advancedsearch.php', params(opts))
|
58
|
-
Representation::QueryResponse.new(qr).from_json(response.body)
|
59
|
-
end
|
60
|
-
end
|
61
65
|
end
|
62
66
|
end
|
63
67
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Archivist
|
2
|
+
module Client
|
3
|
+
# Filters class manages the available filters that are configured to work with Archive.org
|
4
|
+
# The public API is very simple, and is used to create Archive.org query strings:
|
5
|
+
# filters = Filters.new(options)
|
6
|
+
# query = filters.to_query
|
7
|
+
class Filters
|
8
|
+
|
9
|
+
# When Filters Provided are impossible try to Fail well.
|
10
|
+
class FilterException < StandardError; end
|
11
|
+
|
12
|
+
STANDARD_OPTIONS = [
|
13
|
+
:filters,
|
14
|
+
:language,
|
15
|
+
:start_year, :end_year
|
16
|
+
]
|
17
|
+
DEFAULT_FILTERS = [
|
18
|
+
'mediatype:texts',
|
19
|
+
'-mediatype:collection'
|
20
|
+
]
|
21
|
+
|
22
|
+
attr_accessor :options,
|
23
|
+
:filters,
|
24
|
+
:language,
|
25
|
+
:start_year, :end_year
|
26
|
+
|
27
|
+
def initialize(opts)
|
28
|
+
@options = {}
|
29
|
+
self.update!(opts)
|
30
|
+
end
|
31
|
+
|
32
|
+
def update!(opts)
|
33
|
+
self.prune_options!(opts)
|
34
|
+
self.set_language!
|
35
|
+
self.set_years!
|
36
|
+
self.set_filters!
|
37
|
+
end
|
38
|
+
|
39
|
+
# May result in a URI with filters looking like:
|
40
|
+
# http://archive.org/advancedsearch.php?fl%5B0%5D=identifier&fl%5B1%5D=title&fl%5B2%5D=creator&fl%5B3%5D=date&fl%5B4%5D=language&fl%5B5%5D=mediattype&output=json&page=1&q=mediatype:texts%20AND%20-mediatype:collection%20AND%20(language:eng%20OR%20language:English)%20AND%20date:%5B1500-01-01%20TO%201550-12-31%5D&rows=50&sort%5B0%5D=date%20asc
|
41
|
+
alias :to_query :to_s
|
42
|
+
def to_query
|
43
|
+
self.finalize_filters!
|
44
|
+
@filters.join(' AND ')
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def prune_options!(opts)
|
50
|
+
# Save the options we need to build the filter
|
51
|
+
@options.merge!(opts)
|
52
|
+
# Remove the options used from the passed in options, so they don't get converted into parameters
|
53
|
+
STANDARD_OPTIONS.each do |opt|
|
54
|
+
opts.delete(opt)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Only overwrite if update! options has language key
|
59
|
+
def set_language!
|
60
|
+
@language = @options[:language] if @options.has_key?(:language)
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_years!
|
64
|
+
start = @options[:start_year]
|
65
|
+
finish = @options[:end_year]
|
66
|
+
@start_year = "#{start}-01-01" if start
|
67
|
+
@end_year = "#{finish}-12-31" if finish
|
68
|
+
self.validate_years!
|
69
|
+
end
|
70
|
+
|
71
|
+
# If one is provided, they must *both* be provided
|
72
|
+
def validate_years!
|
73
|
+
unless @start_year && @end_year
|
74
|
+
raise FilterException, ":start_year and :end_year must always be provided together, but only :start_year provided as #{@start_year}." if @start_year
|
75
|
+
raise FilterException, ":start_year and :end_year must always be provided together, but only :end_year provided as #{@end_year}." if @end_year
|
76
|
+
end
|
77
|
+
return true
|
78
|
+
end
|
79
|
+
|
80
|
+
def set_filters!
|
81
|
+
@filters = Array(@options[:filters]) # If opts[:filters] is nil => self.array is []
|
82
|
+
@filters |= DEFAULT_FILTERS
|
83
|
+
end
|
84
|
+
|
85
|
+
def add_language_filter!
|
86
|
+
@filters << if @language
|
87
|
+
"language:#{@language}"
|
88
|
+
else
|
89
|
+
'(language:eng OR language:English)'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def add_date_filter!
|
94
|
+
@filters << "date:[#{@start_year} TO #{@end_year}]"
|
95
|
+
end
|
96
|
+
|
97
|
+
def finalize_filters!
|
98
|
+
self.add_language_filter!
|
99
|
+
self.add_date_filter!
|
100
|
+
self
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
1
3
|
require 'virtus'
|
2
4
|
require 'date'
|
3
5
|
|
@@ -5,6 +7,13 @@ module Archivist
|
|
5
7
|
module Model
|
6
8
|
class Document
|
7
9
|
include Virtus.model
|
10
|
+
DEFAULT_CONNECTION = Faraday.new(url: 'http://archive.org') do |faraday|
|
11
|
+
faraday.use FaradayMiddleware::FollowRedirects
|
12
|
+
# faraday.response :logger # log requests to STDOUT
|
13
|
+
faraday.request :url_encoded # form-encode POST params
|
14
|
+
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
|
15
|
+
end
|
16
|
+
attr_reader :conn
|
8
17
|
|
9
18
|
attribute :identifier, String
|
10
19
|
attribute :title, String
|
@@ -13,12 +22,7 @@ module Archivist
|
|
13
22
|
attribute :creators, Array[String]
|
14
23
|
|
15
24
|
def initialize
|
16
|
-
@conn =
|
17
|
-
faraday.use FaradayMiddleware::FollowRedirects
|
18
|
-
faraday.request :url_encoded # form-encode POST params
|
19
|
-
# faraday.response :logger # log requests to STDOUT
|
20
|
-
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
|
21
|
-
end
|
25
|
+
@conn = DEFAULT_CONNECTION
|
22
26
|
end
|
23
27
|
|
24
28
|
def format_index
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: archivist-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Duane Johnson
|
@@ -123,6 +123,20 @@ dependencies:
|
|
123
123
|
- - ! '>='
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: 2.1.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: gem-release
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.7.1
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ! '>='
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.7.1
|
126
140
|
- !ruby/object:Gem::Dependency
|
127
141
|
name: virtus
|
128
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -191,6 +205,7 @@ files:
|
|
191
205
|
- archivist-client.gemspec
|
192
206
|
- README.md
|
193
207
|
- lib/archivist/client/base.rb
|
208
|
+
- lib/archivist/client/filters.rb
|
194
209
|
- lib/archivist/client/version.rb
|
195
210
|
- lib/archivist/models/body.rb
|
196
211
|
- lib/archivist/models/document.rb
|