philologic-client 0.0.5 → 0.0.6
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.
- data/.gitignore +1 -1
- data/HISTORY.rdoc +4 -0
- data/README.rdoc +6 -4
- data/Rakefile +8 -2
- data/lib/philologic-client/version.rb +1 -1
- data/lib/philologic-client.rb +50 -16
- data/philologic-client.gemspec +2 -1
- data/test/test_philologic_client.rb +59 -25
- metadata +27 -16
data/.gitignore
CHANGED
data/HISTORY.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -16,11 +16,16 @@
|
|
16
16
|
doc = first.document
|
17
17
|
txt = doc.text
|
18
18
|
|
19
|
-
#
|
19
|
+
# Simple search
|
20
20
|
client.search('sartre').each do |result|
|
21
21
|
puts [ child['href'], child['author'], child['title'] ].join("\t")
|
22
22
|
end
|
23
23
|
|
24
|
+
# Search by arbitrary key-value pairs
|
25
|
+
client.search( :query => 'sartre', :foo => 1 ).each do |result|
|
26
|
+
puts [ child['href'], child['author'], child['title'] ].join("\t")
|
27
|
+
end
|
28
|
+
|
24
29
|
# Get/Set encoding
|
25
30
|
encoding = client.encoding
|
26
31
|
client.encoding = 'utf-8' # Default
|
@@ -46,10 +51,7 @@ https://github.com/blairc/philologic-client/
|
|
46
51
|
|
47
52
|
== To Do
|
48
53
|
|
49
|
-
* Expand search support
|
50
|
-
* Switch to MiniTest::Mock?
|
51
54
|
* Add +children+ to Philologic::Document
|
52
55
|
* Add +parent+ to Philologic::Document
|
53
56
|
* Unify Philologic::Link and Philologic::Document
|
54
|
-
* Build +RDoc+
|
55
57
|
|
data/Rakefile
CHANGED
@@ -2,9 +2,10 @@ require 'bundler/gem_tasks'
|
|
2
2
|
require 'rake/clean'
|
3
3
|
require 'rake/testtask'
|
4
4
|
require 'rdoc-readme/rake_task'
|
5
|
+
require 'rdoc/task'
|
5
6
|
|
6
|
-
%w{ coverage
|
7
|
-
%w{ build install test }.each
|
7
|
+
%w{ coverage html out.txt pkg }.each { |p| CLEAN.include(p) }
|
8
|
+
%w{ build install rdoc test }.each { |t| task t.to_sym => [ 'rdoc:readme' ] }
|
8
9
|
|
9
10
|
task :default => :test
|
10
11
|
|
@@ -16,3 +17,8 @@ end
|
|
16
17
|
|
17
18
|
RDoc::Readme::RakeTask.new 'lib/philologic-client.rb', 'README.rdoc'
|
18
19
|
|
20
|
+
RDoc::Task.new do |rdoc|
|
21
|
+
rdoc.main = 'README.rdoc'
|
22
|
+
rdoc.rdoc_files.include('README.rdoc', 'lib/**/*.rb')
|
23
|
+
end
|
24
|
+
|
data/lib/philologic-client.rb
CHANGED
@@ -24,11 +24,16 @@ require 'open-uri'
|
|
24
24
|
# doc = first.document
|
25
25
|
# txt = doc.text
|
26
26
|
#
|
27
|
-
# #
|
27
|
+
# # Simple search
|
28
28
|
# client.search('sartre').each do |result|
|
29
29
|
# puts [ child['href'], child['author'], child['title'] ].join("\t")
|
30
30
|
# end
|
31
31
|
#
|
32
|
+
# # Search by arbitrary key-value pairs
|
33
|
+
# client.search( :query => 'sartre', :foo => 1 ).each do |result|
|
34
|
+
# puts [ child['href'], child['author'], child['title'] ].join("\t")
|
35
|
+
# end
|
36
|
+
#
|
32
37
|
# # Get/Set encoding
|
33
38
|
# encoding = client.encoding
|
34
39
|
# client.encoding = 'utf-8' # Default
|
@@ -54,20 +59,22 @@ require 'open-uri'
|
|
54
59
|
#
|
55
60
|
# == To Do
|
56
61
|
#
|
57
|
-
# * Expand search support
|
58
|
-
# * Switch to MiniTest::Mock?
|
59
62
|
# * Add +children+ to Philologic::Document
|
60
63
|
# * Add +parent+ to Philologic::Document
|
61
64
|
# * Unify Philologic::Link and Philologic::Document
|
62
|
-
# * Build +RDoc+
|
63
65
|
#
|
64
|
-
module Philologic
|
66
|
+
module Philologic # :nodoc:
|
65
67
|
|
66
68
|
#
|
67
69
|
# Philologic client.
|
68
70
|
#
|
69
71
|
class Client
|
70
72
|
|
73
|
+
#
|
74
|
+
# Default encoding.
|
75
|
+
#
|
76
|
+
DEFAULT_ENCODING = 'utf-8'
|
77
|
+
|
71
78
|
#
|
72
79
|
# Get/Set +encoding+
|
73
80
|
#
|
@@ -82,10 +89,10 @@ module Philologic
|
|
82
89
|
# Initialize Philologic::Client
|
83
90
|
#
|
84
91
|
# Params:
|
85
|
-
#
|
92
|
+
# +endpoint+:: Philologic endpoint (defaults to +nil+)
|
86
93
|
#
|
87
94
|
def initialize( endpoint = nil )
|
88
|
-
@encoding =
|
95
|
+
@encoding = DEFAULT_ENCODING
|
89
96
|
@endpoint = endpoint
|
90
97
|
yield self if block_given?
|
91
98
|
self
|
@@ -95,7 +102,7 @@ module Philologic
|
|
95
102
|
# Return +Array+ of Philologic::Link objects.
|
96
103
|
#
|
97
104
|
# Params:
|
98
|
-
#
|
105
|
+
# +path+:: Return children of this path (defaults to +/+)
|
99
106
|
#
|
100
107
|
def children( path = '/' )
|
101
108
|
doc = _get(path)
|
@@ -106,7 +113,7 @@ module Philologic
|
|
106
113
|
# Return Philologic::Document object or +nil+.
|
107
114
|
#
|
108
115
|
# Params:
|
109
|
-
#
|
116
|
+
# +path+:: Return document at this path (defaults to +/+)
|
110
117
|
#
|
111
118
|
def document( path = '/' )
|
112
119
|
doc = _get(path)
|
@@ -116,30 +123,41 @@ module Philologic
|
|
116
123
|
#
|
117
124
|
# Return +Array+ of Philologic::Link objects.
|
118
125
|
#
|
119
|
-
# *NOTE:* Currently only returns the first page of results.
|
126
|
+
# *NOTE:* Currently only returns the first page of results by default.
|
120
127
|
#
|
121
128
|
# Params:
|
122
|
-
#
|
129
|
+
# +query+:: Search for this query +String+ or +Hash+ key-value pairs.
|
123
130
|
#
|
124
131
|
def search(query)
|
125
|
-
raise('no query specified') if query.nil?
|
126
|
-
doc = _query(query)
|
132
|
+
raise('no query specified') if ( query.nil? || !( [ Hash, String ].include?( query.class ) )) || query.empty?
|
133
|
+
doc = _query( query.kind_of?(String) ? { :query => query } : query )
|
127
134
|
return doc.kind_of?(Array) ? doc : nil
|
128
135
|
end
|
129
136
|
|
137
|
+
|
130
138
|
private
|
131
139
|
|
132
|
-
|
133
|
-
|
134
|
-
|
140
|
+
#
|
141
|
+
# Build query +String+ from +Hash+.
|
142
|
+
#
|
143
|
+
def _build_query(pairs)
|
144
|
+
raise('no query specified') if pairs.nil? || !pairs.kind_of?(Hash) || pairs.empty?
|
145
|
+
"?" + pairs.map { |k,v| "#{k}=#{v}" }.join('&')
|
135
146
|
end
|
136
147
|
|
148
|
+
#
|
149
|
+
# Return parsed version of +path+.
|
150
|
+
#
|
137
151
|
def _get(path)
|
138
152
|
raise('no endpoint specified') if @endpoint.nil?
|
139
153
|
uri = "#{ @endpoint }#{ @endpoint =~ /\/$/ || '/' }#{ path }"
|
140
154
|
_parse( Nokogiri::HTML( open(uri).read, nil, @encoding ) )
|
141
155
|
end
|
142
156
|
|
157
|
+
#
|
158
|
+
# Return parsed document or +nil+.
|
159
|
+
#
|
160
|
+
# TODO This needs some love.
|
143
161
|
def _parse(doc)
|
144
162
|
if !doc.css('div.philologic_cite_list').first.nil?
|
145
163
|
children = []
|
@@ -159,6 +177,9 @@ module Philologic
|
|
159
177
|
nil
|
160
178
|
end
|
161
179
|
|
180
|
+
#
|
181
|
+
# Build query string from +query+, perform query and return results.
|
182
|
+
#
|
162
183
|
def _query(query)
|
163
184
|
return _get( _build_query(query) )
|
164
185
|
end
|
@@ -171,6 +192,12 @@ module Philologic
|
|
171
192
|
#
|
172
193
|
class Document
|
173
194
|
|
195
|
+
#
|
196
|
+
# Initialize Philologic::Document object.
|
197
|
+
#
|
198
|
+
# Params:
|
199
|
+
# +document+:: Nokogiri document
|
200
|
+
#
|
174
201
|
def initialize(document)
|
175
202
|
@doc = document
|
176
203
|
@text = nil
|
@@ -199,6 +226,13 @@ module Philologic
|
|
199
226
|
#
|
200
227
|
class Link
|
201
228
|
|
229
|
+
#
|
230
|
+
# Initialize Philologic::Link object.
|
231
|
+
#
|
232
|
+
# Params:
|
233
|
+
# +client+:: Philologic::Client object
|
234
|
+
# +document+:: Nokogiri document
|
235
|
+
#
|
202
236
|
def initialize(client, document)
|
203
237
|
@client = client
|
204
238
|
@doc = document
|
data/philologic-client.gemspec
CHANGED
@@ -20,8 +20,9 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
# specify any dependencies here; for example:
|
22
22
|
s.add_development_dependency 'rake'
|
23
|
+
s.add_development_dependency 'rdoc'
|
23
24
|
s.add_development_dependency 'mocha'
|
24
|
-
s.add_development_dependency 'rdoc-readme'
|
25
|
+
s.add_development_dependency 'rdoc-readme', '~> 0.1.2'
|
25
26
|
s.add_development_dependency 'simplecov'
|
26
27
|
s.add_runtime_dependency 'nokogiri'
|
27
28
|
end
|
@@ -52,13 +52,9 @@ class TestPhilologicClient < Test::Unit::TestCase
|
|
52
52
|
|
53
53
|
def test_encoding_accessor
|
54
54
|
Philologic::Client.new do |client|
|
55
|
-
assert_equal
|
56
|
-
assert_equal 'foo',
|
57
|
-
assert_equal 'foo',
|
58
|
-
#
|
59
|
-
# assert_nil client.endpoint, 'defaults to nil'
|
60
|
-
# assert_equal @endpoint, client.endpoint = @endpoint, 'returns value on set'
|
61
|
-
# assert_equal @endpoint, client.endpoint, 'returns value on get'
|
55
|
+
assert_equal Philologic::Client::DEFAULT_ENCODING, client.encoding
|
56
|
+
assert_equal 'foo', client.encoding = 'foo'
|
57
|
+
assert_equal 'foo', client.encoding
|
62
58
|
end
|
63
59
|
end
|
64
60
|
|
@@ -169,44 +165,45 @@ class TestPhilologicClient < Test::Unit::TestCase
|
|
169
165
|
end
|
170
166
|
end
|
171
167
|
|
172
|
-
def
|
168
|
+
def test_underscore_query
|
173
169
|
Philologic::Client.new(@endpoint) do |client|
|
174
|
-
|
170
|
+
doc = client.send( :_parse, Nokogiri::HTML( open(@query_file) ) )
|
171
|
+
client.stubs(:_get).with('?query=sartre').returns(doc)
|
172
|
+
assert_equal doc, client.send( :_query, :query => 'sartre' )
|
175
173
|
end
|
176
174
|
end
|
177
175
|
|
178
|
-
def
|
176
|
+
def test_underscore_build_query_with_invalid_queries
|
179
177
|
Philologic::Client.new(@endpoint) do |client|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
client.
|
184
|
-
|
178
|
+
assert_raise(RuntimeError, 'no query specified') { client.send(:_build_query, nil) }
|
179
|
+
assert_raise(RuntimeError, 'no query specified') { client.send(:_build_query, {}) }
|
180
|
+
assert_raise(RuntimeError, 'no query specified') { client.send(:_build_query, []) }
|
181
|
+
assert_raise(RuntimeError, 'no query specified') { client.send(:_build_query, '') }
|
182
|
+
assert_raise(RuntimeError, 'no query specified') { client.send(:_build_query, 'foo') }
|
185
183
|
end
|
186
184
|
end
|
187
185
|
|
188
|
-
def
|
186
|
+
def test_underscore_build_query
|
189
187
|
Philologic::Client.new(@endpoint) do |client|
|
190
|
-
|
188
|
+
assert_equal '?query=sartre', client.send( :_build_query, :query => 'sartre' )
|
189
|
+
assert_equal '?query=sartre&foo=bar', client.send( :_build_query, :query => 'sartre', :foo => 'bar' )
|
191
190
|
end
|
192
191
|
end
|
193
192
|
|
194
|
-
def
|
193
|
+
def test_search_with_invalid_queries
|
195
194
|
Philologic::Client.new(@endpoint) do |client|
|
196
|
-
|
197
|
-
|
198
|
-
|
195
|
+
[ nil, [], {}, '', [ '' ], [ nil ], Object.new ].each do |q|
|
196
|
+
assert_raise(RuntimeError, 'invalid query') { client.search(q) }
|
197
|
+
end
|
199
198
|
end
|
200
199
|
end
|
201
200
|
|
202
201
|
def test_search
|
203
202
|
Philologic::Client.new(@endpoint) do |client|
|
204
203
|
doc = client.send( :_parse, Nokogiri::HTML( open(@query_file) ) )
|
205
|
-
|
206
|
-
qs = "?query=#{q}"
|
207
|
-
client.stubs(:_get).with(qs).returns(doc)
|
204
|
+
client.stubs(:_get).with('?query=sartre').returns(doc)
|
208
205
|
|
209
|
-
results = client.search(
|
206
|
+
results = client.search('sartre')
|
210
207
|
|
211
208
|
assert_not_nil results
|
212
209
|
assert_kind_of Array, results
|
@@ -236,5 +233,42 @@ class TestPhilologicClient < Test::Unit::TestCase
|
|
236
233
|
|
237
234
|
end
|
238
235
|
end
|
236
|
+
|
237
|
+
def test_search_with_key_value_pairs
|
238
|
+
Philologic::Client.new(@endpoint) do |client|
|
239
|
+
doc = client.send( :_parse, Nokogiri::HTML( open(@query_file) ) )
|
240
|
+
client.stubs(:_get).with('?query=sartre').returns(doc)
|
241
|
+
|
242
|
+
results = client.search( :query => 'sartre' )
|
243
|
+
|
244
|
+
assert_not_nil results
|
245
|
+
assert_kind_of Array, results
|
246
|
+
assert_equal 50, results.size
|
247
|
+
results.each do |result|
|
248
|
+
assert_kind_of Philologic::Link, result
|
249
|
+
assert_equal 'philologic_cite', result['class']
|
250
|
+
assert_not_nil result['href']
|
251
|
+
assert_nil result['some random attribute']
|
252
|
+
assert_not_nil result['author']
|
253
|
+
assert_nil result['filename']
|
254
|
+
assert_not_nil result['title']
|
255
|
+
assert_raise(NoMethodError) { result.text }
|
256
|
+
end
|
257
|
+
|
258
|
+
assert_equal './54/1/0/0', results.first['href']
|
259
|
+
assert_equal 'Peiresc N. de', results.first['author']
|
260
|
+
assert_equal 'Lettres T. 6 1602-1637', results.first['title']
|
261
|
+
assert_nil results.first['filename']
|
262
|
+
assert_raise(NoMethodError) { results.first.text }
|
263
|
+
|
264
|
+
assert_equal './1792/11/0/0', results.last['href']
|
265
|
+
assert_equal 'Gide A.', results.last['author']
|
266
|
+
assert_equal 'Journal 1939-1949', results.last['title']
|
267
|
+
assert_nil results.last['filename']
|
268
|
+
assert_raise(NoMethodError) { results.last.text }
|
269
|
+
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
239
273
|
end
|
240
274
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: philologic-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-04 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70118250803080 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70118250803080
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: rdoc
|
27
|
+
requirement: &70118250802640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70118250802640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: &
|
37
|
+
name: mocha
|
38
|
+
requirement: &70118250802220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,21 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70118250802220
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rdoc-readme
|
49
|
+
requirement: &70118250801720 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.2
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70118250801720
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: simplecov
|
49
|
-
requirement: &
|
60
|
+
requirement: &70118250801300 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70118250801300
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: nokogiri
|
60
|
-
requirement: &
|
71
|
+
requirement: &70118250800840 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,7 +76,7 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :runtime
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70118250800840
|
69
80
|
description: Ruby client for interacting with the Philologic API.
|
70
81
|
email:
|
71
82
|
- blair.christensen@gmail.com
|
@@ -99,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
110
|
version: '0'
|
100
111
|
segments:
|
101
112
|
- 0
|
102
|
-
hash: -
|
113
|
+
hash: -808024732695732071
|
103
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
115
|
none: false
|
105
116
|
requirements:
|
@@ -108,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
119
|
version: '0'
|
109
120
|
segments:
|
110
121
|
- 0
|
111
|
-
hash: -
|
122
|
+
hash: -808024732695732071
|
112
123
|
requirements: []
|
113
124
|
rubyforge_project: philologic-client
|
114
125
|
rubygems_version: 1.8.7
|