bento_search 1.4.4 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -19
  3. data/app/models/bento_search/result_item.rb +1 -1
  4. data/app/models/bento_search/search_engine.rb +36 -3
  5. data/app/models/bento_search/search_engine/capabilities.rb +14 -0
  6. data/app/search_engines/bento_search/doaj_articles_engine.rb +279 -0
  7. data/app/search_engines/bento_search/ebsco_host_engine.rb +27 -7
  8. data/app/search_engines/bento_search/google_books_engine.rb +8 -1
  9. data/app/search_engines/bento_search/mock_engine.rb +8 -2
  10. data/app/search_engines/bento_search/scopus_engine.rb +27 -8
  11. data/app/search_engines/bento_search/summon_engine.rb +1 -1
  12. data/app/search_engines/bento_search/worldcat_sru_dc_engine.rb +22 -3
  13. data/config/locales/en.yml +5 -2
  14. data/lib/bento_search/version.rb +1 -1
  15. data/test/dummy/config/environments/development.rb +0 -4
  16. data/test/dummy/config/environments/production.rb +0 -4
  17. data/test/search_engines/doaj_articles_engine_test.rb +200 -0
  18. data/test/search_engines/ebsco_host_engine_test.rb +38 -0
  19. data/test/search_engines/google_books_engine_test.rb +18 -2
  20. data/test/search_engines/scopus_engine_test.rb +45 -1
  21. data/test/search_engines/search_engine_base_test.rb +59 -0
  22. data/test/search_engines/worldcat_sru_dc_engine_test.rb +17 -0
  23. data/test/vcr_cassettes/doaj_articles/basic_search.yml +97 -0
  24. data/test/vcr_cassettes/doaj_articles/catches_errors.yml +42 -0
  25. data/test/vcr_cassettes/doaj_articles/complex_multi-field.yml +67 -0
  26. data/test/vcr_cassettes/doaj_articles/live__get_identifier__round_trip.yml +387 -0
  27. data/test/vcr_cassettes/doaj_articles/live_get_identifier__raises_on_no_results.yml +41 -0
  28. data/test/vcr_cassettes/doaj_articles/multifield_author-title.yml +79 -0
  29. data/test/vcr_cassettes/doaj_articles/pagination.yml +691 -0
  30. data/test/vcr_cassettes/ebscohost/affiliation_search.yml +929 -0
  31. data/test/vcr_cassettes/ebscohost/multi-field_author_title.yml +122 -0
  32. data/test/vcr_cassettes/ebscohost/multi-field_citation_numbers.yml +122 -0
  33. data/test/vcr_cassettes/scopus/multi-field_search.yml +55 -0
  34. data/test/vcr_cassettes/scopus/multi-fielded_citation_details_search.yml +86 -0
  35. data/test/vcr_cassettes/worldcat_sru_dc/multi_field_search.yml +1839 -0
  36. metadata +31 -2
@@ -310,6 +310,36 @@ class EbscoHostEngineTest < ActiveSupport::TestCase
310
310
  end
311
311
  end
312
312
 
313
+ test_with_cassette("multi-field author title", :ebscohost) do
314
+ results = @engine.search(:query => {:title => '"Reflections on the History of Debt Resistance"',
315
+ :author => "Caffentzis"})
316
+
317
+ assert ! results.failed?
318
+
319
+ assert_equal 1, results.total_items
320
+
321
+ result = results.first
322
+
323
+ assert_equal "10.1215/00382876-2345315", result.doi
324
+ end
325
+
326
+ test_with_cassette("multi-field citation numbers", :ebscohost) do
327
+ results = @engine.search(:query => {
328
+ :issn => "00382876",
329
+ :volume => "112",
330
+ :issue => "4",
331
+ :start_page => "824"
332
+ })
333
+
334
+ assert ! results.failed?
335
+
336
+ assert_equal 1, results.total_items
337
+
338
+ result = results.first
339
+
340
+ assert_equal "10.1215/00382876-2345315", result.doi
341
+ end
342
+
313
343
 
314
344
  test("illegal arg for get with id with no colon") do
315
345
  assert_raise ArgumentError do
@@ -328,6 +358,14 @@ class EbscoHostEngineTest < ActiveSupport::TestCase
328
358
  assert_present first.issn
329
359
  end
330
360
 
361
+ test_with_cassette("affiliation search", :ebscohost) do
362
+ results = @engine.search('"johns hopkins"', :semantic_search_field => :author_affiliation)
363
+
364
+ assert ! results.failed?
365
+
366
+ assert_present results
367
+ end
368
+
331
369
 
332
370
 
333
371
  end
@@ -122,8 +122,24 @@ class GoogleBooksEngineTest < ActiveSupport::TestCase
122
122
 
123
123
  query_params = CGI.parse( URI.parse(url).query )
124
124
 
125
- assert_match /^|\sintitle\:cancer\s|$/, query_params["q"].first
126
- assert_match /^|\sintitle\:"by radiation"\s|$/, query_params["q"].first
125
+ assert_match /(^|\s)intitle\:cancer(\s|$)/, query_params["q"].first
126
+ assert_match /(^|\s)intitle\:"by radiation"(\s|$)/, query_params["q"].first
127
+ end
128
+
129
+ def test_multi_search
130
+ # Have to use protected methods to get at what we want to test.
131
+ # Is there a better way to factor this for testing?
132
+ norm_args = @engine.send(:parse_search_arguments,
133
+ :query => {:title => "manufacturing consent", :author => "chomsky", "inpublisher" => "something"}
134
+ )
135
+ url = @engine.send(:args_to_search_url, norm_args)
136
+
137
+ query_params = CGI.parse( URI.parse(url).query )
138
+
139
+ assert_match /(^|\s)intitle\:manufacturing(\s|$)/, query_params["q"].first
140
+ assert_match /(^|\s)intitle\:consent(\s|$)/, query_params["q"].first
141
+ assert_match /(^|\s)inauthor\:chomsky(\s|$)/, query_params["q"].first
142
+ assert_match /(^|\s)inpublisher\:something(\s|$)/, query_params["q"].first
127
143
  end
128
144
 
129
145
 
@@ -32,6 +32,20 @@ class ScopusEngineTest < ActiveSupport::TestCase
32
32
 
33
33
  assert_equal "http://api.elsevier.com/content/search/index:SCOPUS?query=AUTH%28one+two%29&sort=refeid", url
34
34
  end
35
+
36
+ def test_construct_multi_field
37
+ url = @engine.send(:scopus_url, :query => {"TITLE" => "Terrible Diseases", "AUTH" => "John Smith"})
38
+
39
+ url = URI.parse(url)
40
+ params = CGI.parse(url.query)
41
+ scopus_query = params["query"].first
42
+
43
+ query_components = scopus_query.split(" AND ")
44
+
45
+ assert_equal 2, query_components.length
46
+ assert_includes query_components, "AUTH(John Smith)"
47
+ assert_includes query_components, "TITLE(Terrible Diseases)"
48
+ end
35
49
 
36
50
  def test_construct_search_with_per_page
37
51
  url = @engine.send(:scopus_url, :query => "one two", :per_page => 30)
@@ -129,7 +143,37 @@ class ScopusEngineTest < ActiveSupport::TestCase
129
143
  assert results.first.title.downcase.include?("cancer"), "Title includes query term"
130
144
  end
131
145
 
132
-
146
+ test_with_cassette("multi-field search", :scopus) do
147
+ results = @engine.search(:query =>
148
+ { :title => "Protein measurement with the folin phenol reagent",
149
+ :author => "Lowry",
150
+ :issn => "0021-9258"
151
+ })
152
+
153
+ assert ! results.failed?
154
+ assert_present results
155
+
156
+ results.each do |result|
157
+ assert_equal "00219258", result.issn
158
+ assert_includes result.title.downcase, "Protein measurement with the folin phenol reagent".downcase
159
+ end
160
+ end
161
+
162
+ test_with_cassette("multi-fielded citation details search", :scopus) do
163
+ results = @engine.search(:query =>{
164
+ :issn => "15385132",
165
+ :volume => "12",
166
+ :issue => "2",
167
+ :start_page => "179"
168
+ })
169
+
170
+ assert ! results.failed?
171
+ assert_equal 1, results.total_items
172
+
173
+ item = results.first
174
+
175
+ assert item.title.start_with?("Architects and planners in the middle of a road war")
176
+ end
133
177
 
134
178
 
135
179
  end
@@ -1,6 +1,8 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class ParseSearchArgumentsTest < ActiveSupport::TestCase
4
+ MockEngine = BentoSearch::MockEngine
5
+
4
6
  class Dummy
5
7
  include BentoSearch::SearchEngine
6
8
 
@@ -153,6 +155,63 @@ class ParseSearchArgumentsTest < ActiveSupport::TestCase
153
155
  end
154
156
 
155
157
  end
158
+
159
+
160
+ describe "multi-field search" do
161
+ it "complains with multi-query and search_field" do
162
+ engine = MockEngine.new(:multi_field_search => true)
163
+ assert_raises(ArgumentError) { engine.search(:query => {:title => "foo"}, :semantic_search_field => :author)}
164
+ assert_raises(ArgumentError) { engine.search(:query => {:title => "foo"}, :search_field => "something")}
165
+ end
166
+
167
+ it "rejects if search engine does not support" do
168
+ engine = MockEngine.new(:multi_field_search => false)
169
+ assert_raises(ArgumentError) { engine.search(:query => {:title => "title", :author => "author"}) }
170
+ end
171
+
172
+ it "converts semantic search fields" do
173
+ engine = MockEngine.new(:multi_field_search => true,
174
+ :search_field_definitions => {
175
+ "internal_title_field" => {:semantic => :title},
176
+ "internal_author_field" => {:semantic => :author}
177
+ })
178
+
179
+ engine.search(:query => {:title => "title query", :author => "author query"})
180
+
181
+ assert_equal(
182
+ { "internal_title_field" => "title query",
183
+ "internal_author_field" => "author query"},
184
+ engine.last_args[:query]
185
+ )
186
+ end
187
+
188
+ it "passes through other fields" do
189
+ engine = MockEngine.new(:multi_field_search => true,
190
+ :search_field_definitions => {
191
+ "internal_title_field" => {:semantic => :title},
192
+ "internal_author_field" => {:semantic => :author}
193
+ })
194
+
195
+ engine.search(:query => {"internal_title_field" => "query", "other field" => "query"})
196
+
197
+ assert_equal(
198
+ {"internal_title_field" => "query", "other field" => "query"},
199
+ engine.last_args[:query]
200
+ )
201
+ end
202
+
203
+ it "complains on unrecognized field if configured" do
204
+ engine = MockEngine.new(:multi_field_search => true,
205
+ :unrecognized_search_field => "raise",
206
+ :search_field_definitions => {
207
+ "internal_title_field" => {:semantic => :title},
208
+ "internal_author_field" => {:semantic => :author}
209
+ })
210
+ assert_raises(ArgumentError) do
211
+ engine.search(:query => {"internal_title_field" => "query", "other field" => "query"})
212
+ end
213
+ end
214
+ end
156
215
 
157
216
  def test_semantic_blank_ignored
158
217
  d = Dummy.new
@@ -93,6 +93,18 @@ class WorldcatSruDcEngineTest < ActiveSupport::TestCase
93
93
  assert_includes components, clause
94
94
  end
95
95
  end
96
+
97
+ def test_construt_cql_multi_field
98
+ cql = @engine.construct_cql_query(:query => {"srw.ti" => "manufacturing", "srw.au" => "chomsky"})
99
+
100
+ components = cql.split(" AND ")
101
+
102
+ assert_equal 2, components.length
103
+
104
+ ['srw.au = "chomsky"', 'srw.ti = "manufacturing"'].each do |clause|
105
+ assert_includes components, clause
106
+ end
107
+ end
96
108
 
97
109
  test_with_cassette("max_out_pagination", :worldcat_sru_dc) do
98
110
  #worldcat maxes out at start 9999, we silently correct
@@ -146,6 +158,11 @@ class WorldcatSruDcEngineTest < ActiveSupport::TestCase
146
158
  @engine.get("NOT EXISTING")
147
159
  end
148
160
  end
161
+
162
+ test_with_cassette("multi field search", :worldcat_sru_dc) do
163
+ results = @engine.search(:query => {:author => "Chomsky", :title => "Manufacturing"})
164
+ assert ! results.failed?
165
+ end
149
166
 
150
167
 
151
168
  end
@@ -0,0 +1,97 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://doaj.org/api/v1/search/articles/+Breast%20+cancer%20+patients%20+with%20+lobular%20+cancer%20+more%20+commonly%20+have%20+a%20+father%20+than%20+a%20+mother%20+diagnosed%20+with%20+cancer?pageSize=10
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers:
10
+ Cookie:
11
+ - session=UspzkET/3IS3Z8PIxKnLAhLnXDY=?_id=UycyNmYyZmZkMzhkMjA5MWE0NmNjZTU2YTI4OGJjNDZlNycKcDEKLg==
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Server:
18
+ - nginx/1.4.6 (Ubuntu)
19
+ Date:
20
+ - Wed, 23 Sep 2015 15:51:24 GMT
21
+ Content-Type:
22
+ - application/json
23
+ Content-Length:
24
+ - '4515'
25
+ Connection:
26
+ - keep-alive
27
+ Vary:
28
+ - Accept-Encoding
29
+ - Accept-Encoding
30
+ Access-Control-Allow-Origin:
31
+ - "*"
32
+ Set-Cookie:
33
+ - session="UspzkET/3IS3Z8PIxKnLAhLnXDY=?_id=UycyNmYyZmZkMzhkMjA5MWE0NmNjZTU2YTI4OGJjNDZlNycKcDEKLg==";
34
+ Path=/; HttpOnly
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"pageSize": 10, "timestamp": "2015-0923T15:51:24Z", "results": [{"last_updated":
38
+ "2015-04-22T03:59:29Z", "id": "c7cbb0516de24de2bdcfb3d81a40ab1b", "bibjson":
39
+ {"start_page": "497", "title": "Breast cancer patients with lobular cancer
40
+ more commonly have a father than a mother diagnosed with cancer", "journal":
41
+ {"publisher": "BioMed Central", "language": ["English"], "license": [{"type":
42
+ "CC BY", "title": "CC BY"}], "title": "BMC Cancer", "country": "GB", "number":
43
+ "1", "volume": "11"}, "author": [{"name": "Ellberg Carolina"}, {"name": "Olsson
44
+ H\u00e5kan"}], "month": "11", "link": [{"url": "http://www.biomedcentral.com/1471-2407/11/497",
45
+ "type": "fulltext"}], "year": "2011", "identifier": [{"type": "doi", "id":
46
+ "10.1186/1471-2407-11-497"}, {"type": "pissn", "id": "1471-2407"}], "abstract":
47
+ "<p>Abstract</p> <p>Background</p> <p>The association between lobular breast
48
+ cancer and family history is not clear. The aim of the study was to possibly
49
+ identifying new hereditary patterns predisposing for cancer in the different
50
+ histopathologic subtypes of breast cancer, with focus on patients with lobular
51
+ breast cancer and cancer in their first degree relatives.</p> <p>Methods</p>
52
+ <p>In 1676 consecutive breast cancer patients detailed family history of cancer
53
+ was related to histopathologic subtype of breast cancer.</p> <p>Results</p>
54
+ <p>Patients with lobular breast cancer were found to be significantly positively
55
+ associated with having a father diagnosed with cancer, OR 2.17 (95% confidence
56
+ interval (CI) 1.37-3.46). The finding persisted after excluding breast cancer
57
+ in the family. Ductal breast cancer was associated with having a mother diagnosed
58
+ with cancer. There was a significant association between lobular breast cancer
59
+ and having a father with prostate cancer, OR 2.4 (CI 1.1-5.3). The occurrence
60
+ of having a father with prostate cancer for lobular breast cancer patients
61
+ was higher in the younger patient group, OR 2.9 (CI 1.1-7.8), and was still
62
+ high but lost statistical significance in the older patient group, OR 1.9
63
+ (CI 0.5-7.4). The association between lobular breast cancer and a father remained
64
+ significant after excluding fathers with prostate cancer, OR 1.94 (CI 1.20-3.14).
65
+ Other commonly occurring tumor types in the father included sarcoma and leukemia.</p>
66
+ <p>Conclusion</p> <p>We propose that lobular breast cancer is associated with
67
+ having a father diagnosed with cancer, most commonly prostate carcinoma. Since
68
+ the association remained after excluding family history of breast cancer,
69
+ the association seems independent of classical breast cancer heredity. The
70
+ association with a father diagnosed with cancer also remained after removing
71
+ prostate cancer, indicating an independence from prostate cancer as well.
72
+ The reason for this association is genetically unclear, but could involve
73
+ sex-specific imprinting.</p> ", "subject": [{"code": "RC254-282", "term":
74
+ "Neoplasms. Tumors. Oncology. Including cancer and carcinogens", "scheme":
75
+ "LCC"}, {"code": "RC31-1245", "term": "Internal medicine", "scheme": "LCC"},
76
+ {"code": "R", "term": "Medicine", "scheme": "LCC"}, {"term": "Oncology", "scheme":
77
+ "DOAJ"}, {"term": "Medicine (General)", "scheme": "DOAJ"}, {"term": "Health
78
+ Sciences", "scheme": "DOAJ"}, {"code": "RC254-282", "term": "Neoplasms. Tumors.
79
+ Oncology. Including cancer and carcinogens", "scheme": "LCC"}, {"code": "RC31-1245",
80
+ "term": "Internal medicine", "scheme": "LCC"}, {"code": "R", "term": "Medicine",
81
+ "scheme": "LCC"}, {"term": "Oncology", "scheme": "DOAJ"}, {"term": "Medicine
82
+ (General)", "scheme": "DOAJ"}, {"term": "Health Sciences", "scheme": "DOAJ"},
83
+ {"code": "RC254-282", "term": "Neoplasms. Tumors. Oncology. Including cancer
84
+ and carcinogens", "scheme": "LCC"}, {"code": "RC31-1245", "term": "Internal
85
+ medicine", "scheme": "LCC"}, {"code": "R", "term": "Medicine", "scheme": "LCC"},
86
+ {"code": "RC254-282", "term": "Neoplasms. Tumors. Oncology. Including cancer
87
+ and carcinogens", "scheme": "LCC"}, {"code": "RC31-1245", "term": "Internal
88
+ medicine", "scheme": "LCC"}, {"code": "R", "term": "Medicine", "scheme": "LCC"},
89
+ {"code": "RC254-282", "term": "Neoplasms. Tumors. Oncology. Including cancer
90
+ and carcinogens", "scheme": "LCC"}, {"code": "RC31-1245", "term": "Internal
91
+ medicine", "scheme": "LCC"}, {"code": "R", "term": "Medicine", "scheme": "LCC"}]},
92
+ "created_date": "2013-03-12T01:21:44Z"}], "query": "+Breast +cancer +patients
93
+ +with +lobular +cancer +more +commonly +have +a +father +than +a +mother +diagnosed
94
+ +with +cancer", "total": 1, "page": 1}'
95
+ http_version:
96
+ recorded_at: Wed, 23 Sep 2015 15:51:24 GMT
97
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://doaj.org/api/v1/search/articles_bad_url/+something?pageSize=10
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers:
10
+ Cookie:
11
+ - session=UspzkET/3IS3Z8PIxKnLAhLnXDY=?_id=UycyNmYyZmZkMzhkMjA5MWE0NmNjZTU2YTI4OGJjNDZlNycKcDEKLg==
12
+ response:
13
+ status:
14
+ code: 404
15
+ message: NOT FOUND
16
+ headers:
17
+ Server:
18
+ - nginx/1.4.6 (Ubuntu)
19
+ Date:
20
+ - Wed, 23 Sep 2015 15:51:26 GMT
21
+ Content-Type:
22
+ - application/json
23
+ Content-Length:
24
+ - '246'
25
+ Connection:
26
+ - keep-alive
27
+ Vary:
28
+ - Accept-Encoding
29
+ - Accept-Encoding
30
+ Access-Control-Allow-Origin:
31
+ - "*"
32
+ Set-Cookie:
33
+ - session="UspzkET/3IS3Z8PIxKnLAhLnXDY=?_id=UycyNmYyZmZkMzhkMjA5MWE0NmNjZTU2YTI4OGJjNDZlNycKcDEKLg==";
34
+ Path=/; HttpOnly
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"status": "not_found", "error": "No endpoint at search/articles_bad_url/+something.
38
+ See https://doaj.org/api/v1/swagger.json for valid paths or read the documentation
39
+ at https://doaj.org/api/v1/docs. (ref: f2b2e3d2-620a-11e5-b4d0-04014a62b401)"}'
40
+ http_version:
41
+ recorded_at: Wed, 23 Sep 2015 15:51:26 GMT
42
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,67 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://doaj.org/api/v1/search/articles/+Anti%5C-war%20+bibjson.author.name:(+Caffentzis)%20+bibjson.title:(+%22Respect%20Your%20Enemies%22%20+first%20+rule%20+of%20+peace)%20+bibjson.journal.title:(+%22Revista%20Theomai%22)?pageSize=10
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - nginx/1.4.6 (Ubuntu)
17
+ Date:
18
+ - Wed, 23 Sep 2015 15:58:02 GMT
19
+ Content-Type:
20
+ - application/json
21
+ Content-Length:
22
+ - '2314'
23
+ Connection:
24
+ - keep-alive
25
+ Vary:
26
+ - Accept-Encoding
27
+ - Accept-Encoding
28
+ Access-Control-Allow-Origin:
29
+ - "*"
30
+ Set-Cookie:
31
+ - session="UspzkET/3IS3Z8PIxKnLAhLnXDY=?_id=UycyNmYyZmZkMzhkMjA5MWE0NmNjZTU2YTI4OGJjNDZlNycKcDEKLg==";
32
+ Path=/; HttpOnly
33
+ body:
34
+ encoding: UTF-8
35
+ string: '{"pageSize": 10, "timestamp": "2015-0923T15:58:02Z", "results": [{"last_updated":
36
+ "2015-09-18T18:30:31Z", "id": "3de5b56aa21342f6adb2d313c16c6c63", "bibjson":
37
+ {"start_page": "0", "title": "Respect Your Enemies - The First Rule of Peace:
38
+ An Essay Addressed to the U. S. Anti-war Movement", "journal": {"country":
39
+ "AR", "publisher": "Red Internacional de Estudios sobre Sociedad, Naturaleza
40
+ y Desarrollo", "number": "7", "language": ["Spanish", "English", "French",
41
+ "Italian", "Portuguese"], "title": "Revista Theomai"}, "author": [{"name":
42
+ "George Caffentzis"}], "link": [{"url": "http://www.redalyc.org/articulo.oa?id=12400710",
43
+ "type": "fulltext", "content_type": "pdf"}], "year": "2003", "identifier":
44
+ [{"type": "pissn", "id": "1666-2830"}, {"type": "eissn", "id": "1515-6443"}],
45
+ "abstract": "There is now a fledgling anti-interventionist, anti-war movement
46
+ in the US. It will have a lot of work to do in the near future, although the
47
+ present threat of war on Iraq is the most pressing issue it faces. The question
48
+ is: can the antiwar movement do its work effectively and successfully? At
49
+ the moment it is not completely marginalized, if the votes in Congress are
50
+ any indication. On October 9, between one-quarter to one-third of the congressional
51
+ representatives voted against granting George W. Bush \"war powers.\" But
52
+ in order to show itself as expressing the majority perspective in this country,
53
+ it needs new arguments, a new respect (as in \"look again\") for its opponents,
54
+ a deeper understanding of the reasons for the actions of its opponents, and
55
+ a realistic assessment of their weaknesses. For its old arguments do not seem
56
+ convincing to the majority of US citizens, and its lack of curiosity about
57
+ its opponents and their reasoning is dulling its strategic sense.", "subject":
58
+ [{"code": "H1-99", "term": "Social sciences (General)", "scheme": "LCC"},
59
+ {"code": "H", "term": "Social Sciences", "scheme": "LCC"}, {"code": "GE1-350",
60
+ "term": "Environmental sciences", "scheme": "LCC"}, {"code": "G", "term":
61
+ "Geography. Anthropology. Recreation", "scheme": "LCC"}]}, "created_date":
62
+ "2012-03-28T00:03:02Z"}], "query": "+Anti\\-war +bibjson.author.name:(+Caffentzis)
63
+ +bibjson.title:(+\"Respect Your Enemies\" +first +rule +of +peace) +bibjson.journal.title:(+\"Revista
64
+ Theomai\")", "total": 1, "page": 1}'
65
+ http_version:
66
+ recorded_at: Wed, 23 Sep 2015 15:58:02 GMT
67
+ recorded_with: VCR 2.9.3