bento_search 1.4.4 → 1.5.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.
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