harrisj-nytimes-articles 0.2.1 → 0.3.0
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/VERSION.yml +2 -2
- data/lib/nytimes_articles/base.rb +9 -3
- data/lib/nytimes_articles/query.rb +28 -0
- data/lib/nytimes_articles.rb +3 -6
- data/test/nytimes/articles/test_base.rb +28 -0
- data/test/nytimes/articles/test_query.rb +89 -0
- metadata +4 -2
data/VERSION.yml
CHANGED
@@ -12,6 +12,7 @@ module Nytimes
|
|
12
12
|
|
13
13
|
@@api_key = nil
|
14
14
|
@@debug = false
|
15
|
+
@@decode_html_entities = true
|
15
16
|
|
16
17
|
##
|
17
18
|
# Set the API key used for operations. This needs to be called before any requests against the API. To obtain an API key, go to http://developer.nytimes.com/
|
@@ -22,6 +23,12 @@ module Nytimes
|
|
22
23
|
def self.debug=(flag)
|
23
24
|
@@debug = flag
|
24
25
|
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Set whether or not to decode HTML entities when returning text fields.
|
29
|
+
def self.decode_html_entities=(flag)
|
30
|
+
@@decode_html_entities = flag
|
31
|
+
end
|
25
32
|
|
26
33
|
##
|
27
34
|
# Returns the current value of the API Key
|
@@ -34,13 +41,12 @@ module Nytimes
|
|
34
41
|
def self.build_request_url(params)
|
35
42
|
URI::HTTP.build :host => API_SERVER,
|
36
43
|
:path => API_BASE,
|
37
|
-
:query => params.map {|k,v| "#{URI.escape(k)}=#{URI.escape(v)}"}.join('&')
|
44
|
+
:query => params.map {|k,v| "#{URI.escape(k)}=#{URI.escape(v.to_s)}"}.join('&')
|
38
45
|
end
|
39
46
|
|
40
47
|
def self.text_field(value)
|
41
48
|
return nil if value.nil?
|
42
|
-
|
43
|
-
coder.decode(value)
|
49
|
+
@@decode_html_entities ? HTMLEntities.new.decode(value) : value
|
44
50
|
end
|
45
51
|
|
46
52
|
def self.integer_field(value)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module Nytimes
|
4
|
+
module Articles
|
5
|
+
##
|
6
|
+
# The Query class represents a single query to the Article Search API. Supports
|
7
|
+
# all of the named parameters to Article.search as accessor methods.
|
8
|
+
#
|
9
|
+
class Query
|
10
|
+
FIELDS = [:only_facets, :except_facets, :begin_date, :end_date, :since,
|
11
|
+
:before, :fee, :has_thumbnail, :facets, :fields, :query, :offset] + Article::TEXT_FIELDS.map(&:to_sym)
|
12
|
+
FIELDS.each {|f| attr_accessor f}
|
13
|
+
|
14
|
+
# Produce a hash which uniquely identifies this query
|
15
|
+
def hash
|
16
|
+
strs = FIELDS.collect {|f| "#{f}:#{send(f).inspect}"}
|
17
|
+
Digest::SHA256.hexdigest(strs.join(' '))
|
18
|
+
end
|
19
|
+
|
20
|
+
# Perform this query. Returns result of Article.search
|
21
|
+
def perform
|
22
|
+
params = {}
|
23
|
+
FIELDS.each {|f| params[f] = send(f) unless send(f).nil?}
|
24
|
+
Article.search(params)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/nytimes_articles.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
# should I be setting this?
|
2
2
|
$KCODE = 'UTF8'
|
3
3
|
|
4
|
-
|
5
|
-
require File.join(File.dirname(__FILE__), 'nytimes_articles',
|
6
|
-
|
7
|
-
require File.join(File.dirname(__FILE__), 'nytimes_articles', 'thumbnail')
|
8
|
-
require File.join(File.dirname(__FILE__), 'nytimes_articles', 'article')
|
9
|
-
require File.join(File.dirname(__FILE__), 'nytimes_articles', 'result_set')
|
4
|
+
%w(exceptions base facet thumbnail article result_set query).each do |f|
|
5
|
+
require File.join(File.dirname(__FILE__), 'nytimes_articles', f)
|
6
|
+
end
|
@@ -88,5 +88,33 @@ class TestNytimes::TestArticles::TestBase < Test::Unit::TestCase
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
91
|
+
|
92
|
+
context "when passing Integer for offset" do
|
93
|
+
# note Article.search requries integer for offset
|
94
|
+
setup do
|
95
|
+
FakeWeb.register_uri(api_url_for('offset' => '1'), :status => ['200', 'OK'], :string => '{}')
|
96
|
+
end
|
97
|
+
|
98
|
+
should "not raise NoMethodError" do
|
99
|
+
assert_nothing_raised(NoMethodError) { Base.invoke('offset' => 1) }
|
100
|
+
end
|
101
|
+
end
|
91
102
|
end
|
103
|
+
|
104
|
+
context "Base#text_field" do
|
105
|
+
context "when decode_html_entities == true" do
|
106
|
+
should "decode HTML entities in text fields" do
|
107
|
+
assert_equal "foó", Base.text_field("foó")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "when decode_html_entities == false" do
|
112
|
+
setup { Base.decode_html_entities = false }
|
113
|
+
teardown { Base.decode_html_entities = true }
|
114
|
+
|
115
|
+
should "not decode HTML entities in text fields" do
|
116
|
+
assert_equal "foó", Base.text_field("foó")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
92
120
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../test_helper.rb'
|
2
|
+
|
3
|
+
class TestNytimes::TestArticles::TestQuery < Test::Unit::TestCase
|
4
|
+
include Nytimes::Articles
|
5
|
+
|
6
|
+
def setup
|
7
|
+
Base.stubs(:invoke)
|
8
|
+
@query = Query.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def assert_has_accessor(obj, name, value='foo')
|
12
|
+
assert_nothing_raised { obj.send("#{name}=", value) }
|
13
|
+
assert_equal value, obj.send(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def expect_search_with(hsh)
|
17
|
+
Article.expects(:search).with(has_entry(hsh))
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.should_proxy_search_param(name, value)
|
21
|
+
should "provide accessor for :#{name}" do
|
22
|
+
assert_has_accessor(@query, name, value)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "pass :#{name} to Article#search" do
|
26
|
+
@query.send("#{name}=", value)
|
27
|
+
expect_search_with name => value
|
28
|
+
@query.perform
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "proxying named parameters to Article.search" do
|
33
|
+
(Article::TEXT_FIELDS + [:query]).each do |name|
|
34
|
+
should_proxy_search_param name.to_sym, 'some text field'
|
35
|
+
end
|
36
|
+
|
37
|
+
[:only_facets, :except_facets].each do |name|
|
38
|
+
should_proxy_search_param name, {'geo_facet' => 'NEW YORK CITY'}
|
39
|
+
end
|
40
|
+
|
41
|
+
[:begin_date, :end_date, :since, :before].each do |name|
|
42
|
+
should_proxy_search_param name, Time.now
|
43
|
+
end
|
44
|
+
|
45
|
+
[:fee, :has_thumbnail].each do |name|
|
46
|
+
should_proxy_search_param name, true
|
47
|
+
end
|
48
|
+
|
49
|
+
should_proxy_search_param :facets, ['geo_facet', 'org_facet', 'per_facet']
|
50
|
+
should_proxy_search_param :fields, ['title', 'abstract']
|
51
|
+
should_proxy_search_param :offset, 99
|
52
|
+
|
53
|
+
should "not pass nil parameters" do
|
54
|
+
@query.query = 'foo'
|
55
|
+
Article.expects(:search).with(:query => 'foo')
|
56
|
+
@query.perform
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "generating hash" do
|
61
|
+
# not sure how one would test this exhaustively, going for coverage + non-regression...
|
62
|
+
|
63
|
+
should "produce the same hash for identical queries" do
|
64
|
+
q0 = Query.new
|
65
|
+
q0.query = 'foo bar baz'
|
66
|
+
q0.only_facets = {'geo_facet' => 'NEW YORK CITY'}
|
67
|
+
|
68
|
+
q1 = Query.new
|
69
|
+
q1.query = 'foo bar baz'
|
70
|
+
q1.only_facets = {'geo_facet' => 'NEW YORK CITY'}
|
71
|
+
|
72
|
+
assert_equal q0.hash, q1.hash
|
73
|
+
end
|
74
|
+
|
75
|
+
should "not produce the same hash for non-identical queries" do
|
76
|
+
q0 = Query.new; q0.query = 'foo'
|
77
|
+
q1 = Query.new; q1.query = 'bar'
|
78
|
+
assert_not_equal q0.hash, q1.hash
|
79
|
+
|
80
|
+
q0 = Query.new; q0.facets = {'geo_facet' => 'NEW YORK CITY'}
|
81
|
+
q1 = Query.new; q1.facets = {'geo_facet' => 'CALIFORNIA'}
|
82
|
+
assert_not_equal q0.hash, q1.hash
|
83
|
+
|
84
|
+
q0 = Query.new; q0.since = Date.parse('1/1/2009')
|
85
|
+
q1 = Query.new; q1.since = Date.parse('1/2/2009')
|
86
|
+
assert_not_equal q0.hash, q1.hash
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harrisj-nytimes-articles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Harris
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-03 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- lib/nytimes_articles/base.rb
|
38
38
|
- lib/nytimes_articles/exceptions.rb
|
39
39
|
- lib/nytimes_articles/facet.rb
|
40
|
+
- lib/nytimes_articles/query.rb
|
40
41
|
- lib/nytimes_articles/result_set.rb
|
41
42
|
- lib/nytimes_articles/thumbnail.rb
|
42
43
|
- lib/nytimes_articles.rb
|
@@ -45,6 +46,7 @@ files:
|
|
45
46
|
- test/nytimes/articles/test_article.rb
|
46
47
|
- test/nytimes/articles/test_base.rb
|
47
48
|
- test/nytimes/articles/test_facet.rb
|
49
|
+
- test/nytimes/articles/test_query.rb
|
48
50
|
- test/nytimes/articles/test_result_set.rb
|
49
51
|
- test/nytimes/articles/test_thumbnail.rb
|
50
52
|
- test/test_helper.rb
|