alchemy-api-rb-gem 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/dog.jpg +0 -0
  3. data/lib/alchemyapi.rb +652 -0
  4. data/tests/test_alchemyapi.rb +258 -0
  5. metadata +135 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f37f93f69daee2305f5deeb42dd884729d8d45cd
4
+ data.tar.gz: 40614dfad6f1c7155e034a644540b32950d446a6
5
+ SHA512:
6
+ metadata.gz: 5dce6cfe12c8abc35569f7884f5920bed2e150f77fc745701516587a4e58caab588185f5adb23ceabbeab3fb1759fc284c6da8af4bb0bf75ee9015301db19212
7
+ data.tar.gz: 0369c4d6b359ea79ea94eecde89f34c55af0642d5bd059f03fd12ff49d80676aad59b9a53100b9b54ef30e40db727fe353f1f7198d3e9a0674bedde9a613a3be
data/dog.jpg ADDED
Binary file
@@ -0,0 +1,652 @@
1
+
2
+ # Copyright 2013 AlchemyAPI
3
+ # Copyright 2014 Piero Dotti
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'rubygems'
18
+ require 'uri'
19
+ require 'json'
20
+ require 'faraday'
21
+
22
+ class AlchemyAPI
23
+ # Setup the endpoints
24
+ @@ENDPOINTS = {}
25
+ @@ENDPOINTS['sentiment'] = {}
26
+ @@ENDPOINTS['sentiment']['url'] = '/url/URLGetTextSentiment'
27
+ @@ENDPOINTS['sentiment']['text'] = '/text/TextGetTextSentiment'
28
+ @@ENDPOINTS['sentiment']['html'] = '/html/HTMLGetTextSentiment'
29
+ @@ENDPOINTS['sentiment_targeted'] = {}
30
+ @@ENDPOINTS['sentiment_targeted']['url'] = '/url/URLGetTargetedSentiment'
31
+ @@ENDPOINTS['sentiment_targeted']['text'] = '/text/TextGetTargetedSentiment'
32
+ @@ENDPOINTS['sentiment_targeted']['html'] = '/html/HTMLGetTargetedSentiment'
33
+ @@ENDPOINTS['author'] = {}
34
+ @@ENDPOINTS['author']['url'] = '/url/URLGetAuthor'
35
+ @@ENDPOINTS['author']['html'] = '/html/HTMLGetAuthor'
36
+ @@ENDPOINTS['keywords'] = {}
37
+ @@ENDPOINTS['keywords']['url'] = '/url/URLGetRankedKeywords'
38
+ @@ENDPOINTS['keywords']['text'] = '/text/TextGetRankedKeywords'
39
+ @@ENDPOINTS['keywords']['html'] = '/html/HTMLGetRankedKeywords'
40
+ @@ENDPOINTS['concepts'] = {}
41
+ @@ENDPOINTS['concepts']['url'] = '/url/URLGetRankedConcepts'
42
+ @@ENDPOINTS['concepts']['text'] = '/text/TextGetRankedConcepts'
43
+ @@ENDPOINTS['concepts']['html'] = '/html/HTMLGetRankedConcepts'
44
+ @@ENDPOINTS['entities'] = {}
45
+ @@ENDPOINTS['entities']['url'] = '/url/URLGetRankedNamedEntities'
46
+ @@ENDPOINTS['entities']['text'] = '/text/TextGetRankedNamedEntities'
47
+ @@ENDPOINTS['entities']['html'] = '/html/HTMLGetRankedNamedEntities'
48
+ @@ENDPOINTS['category'] = {}
49
+ @@ENDPOINTS['category']['url'] = '/url/URLGetCategory'
50
+ @@ENDPOINTS['category']['text'] = '/text/TextGetCategory'
51
+ @@ENDPOINTS['category']['html'] = '/html/HTMLGetCategory'
52
+ @@ENDPOINTS['relations'] = {}
53
+ @@ENDPOINTS['relations']['url'] = '/url/URLGetRelations'
54
+ @@ENDPOINTS['relations']['text'] = '/text/TextGetRelations'
55
+ @@ENDPOINTS['relations']['html'] = '/html/HTMLGetRelations'
56
+ @@ENDPOINTS['language'] = {}
57
+ @@ENDPOINTS['language']['url'] = '/url/URLGetLanguage'
58
+ @@ENDPOINTS['language']['text'] = '/text/TextGetLanguage'
59
+ @@ENDPOINTS['language']['html'] = '/html/HTMLGetLanguage'
60
+ @@ENDPOINTS['text'] = {}
61
+ @@ENDPOINTS['text']['url'] = '/url/URLGetText'
62
+ @@ENDPOINTS['text']['html'] = '/html/HTMLGetText'
63
+ @@ENDPOINTS['text_raw'] = {}
64
+ @@ENDPOINTS['text_raw']['url'] = '/url/URLGetRawText'
65
+ @@ENDPOINTS['text_raw']['html'] = '/html/HTMLGetRawText'
66
+ @@ENDPOINTS['title'] = {}
67
+ @@ENDPOINTS['title']['url'] = '/url/URLGetTitle'
68
+ @@ENDPOINTS['title']['html'] = '/html/HTMLGetTitle'
69
+ @@ENDPOINTS['feeds'] = {}
70
+ @@ENDPOINTS['feeds']['url'] = '/url/URLGetFeedLinks'
71
+ @@ENDPOINTS['feeds']['html'] = '/html/HTMLGetFeedLinks'
72
+ @@ENDPOINTS['microformats'] = {}
73
+ @@ENDPOINTS['microformats']['url'] = '/url/URLGetMicroformatData'
74
+ @@ENDPOINTS['microformats']['html'] = '/html/HTMLGetMicroformatData'
75
+ @@ENDPOINTS['taxonomy'] = {}
76
+ @@ENDPOINTS['taxonomy']['url'] = '/url/URLGetRankedTaxonomy'
77
+ @@ENDPOINTS['taxonomy']['text'] = '/text/TextGetRankedTaxonomy'
78
+ @@ENDPOINTS['taxonomy']['html'] = '/html/HTMLGetRankedTaxonomy'
79
+ @@ENDPOINTS['combined'] = {}
80
+ @@ENDPOINTS['combined']['url'] = '/url/URLGetCombinedData'
81
+ @@ENDPOINTS['combined']['text'] = '/text/TextGetCombinedData'
82
+ @@ENDPOINTS['image_extract'] = {}
83
+ @@ENDPOINTS['image_extract']['url'] = '/url/URLGetImage'
84
+ @@ENDPOINTS['image_tag'] = {}
85
+ @@ENDPOINTS['image_tag']['url'] = '/url/URLGetRankedImageKeywords'
86
+ @@ENDPOINTS['image_tag']['image'] = '/image/ImageGetRankedImageKeywords'
87
+
88
+ @@BASE_URL = 'http://access.alchemyapi.com/calls'
89
+
90
+ def initialize(key)
91
+
92
+ if key.is_a?(String) && key.size == 40
93
+ @apiKey = key
94
+ else
95
+ raise 'Invalid key for AlchemyAPI.'
96
+ end
97
+ end
98
+
99
+ # Calculates the sentiment for text, a URL or HTML.
100
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/sentiment-analysis/
101
+ # For the docs, please refer to: http://www.alchemyapi.com/api/sentiment-analysis/
102
+ #
103
+ # INPUT:
104
+ # flavor -> which version of the call, i.e. text, url or html.
105
+ # data -> the data to analyze, either the text, the url or html code.
106
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
107
+ #
108
+ # Available Options:
109
+ # showSourceText -> 0: disabled (default), 1: enabled
110
+ #
111
+ # OUTPUT:
112
+ # The response, already converted from JSON to a Ruby object.
113
+ #
114
+ def sentiment(flavor, data, options = {})
115
+ unless @@ENDPOINTS['sentiment'].key?(flavor)
116
+ return { 'status' => 'ERROR', 'statusInfo' => 'sentiment analysis for ' + flavor + ' not available' }
117
+ end
118
+
119
+ # Add the URL encoded data to the options and analyze
120
+ options[flavor] = data
121
+ return analyze(@@ENDPOINTS['sentiment'][flavor], options)
122
+ end
123
+
124
+ # Calculates the targeted sentiment for text, a URL or HTML.
125
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/sentiment-analysis/
126
+ # For the docs, please refer to: http://www.alchemyapi.com/api/sentiment-analysis/
127
+ #
128
+ # INPUT:
129
+ # flavor -> which version of the call, i.e. text, url or html.
130
+ # data -> the data to analyze, either the text, the url or html code.
131
+ # target -> the word or phrase to run sentiment analysis on.
132
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
133
+ #
134
+ # Available Options:
135
+ # showSourceText -> 0: disabled, 1: enabled
136
+ #
137
+ # OUTPUT:
138
+ # The response, already converted from JSON to a Ruby object.
139
+ #
140
+ def sentiment_targeted(flavor, data, target, options = {})
141
+ if target == '' || target.nil?
142
+ return { 'status' => 'ERROR', 'statusMessage' => 'targeted sentiment requires a non-null target' }
143
+ end
144
+
145
+ unless @@ENDPOINTS['sentiment_targeted'].key?(flavor)
146
+ return { 'status' => 'ERROR', 'statusInfo' => 'targeted sentiment analysis for ' + flavor + ' not available' }
147
+ end
148
+
149
+ # Add the URL encoded data and the target to the options and analyze
150
+ options[flavor] = data
151
+ options['target'] = target
152
+ return analyze(@@ENDPOINTS['sentiment_targeted'][flavor], options)
153
+ end
154
+
155
+ # Extracts the entities for text, a URL or HTML.
156
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/entity-extraction/
157
+ # For the docs, please refer to: http://www.alchemyapi.com/api/entity-extraction/
158
+ #
159
+ # INPUT:
160
+ # flavor -> which version of the call, i.e. text, url or html.
161
+ # data -> the data to analyze, either the text, the url or html code.
162
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
163
+ #
164
+ # Available Options:
165
+ # disambiguate -> disambiguate entities (i.e. Apple the company vs. apple the fruit). 0: disabled, 1: enabled (default)
166
+ # linkedData -> include linked data on disambiguated entities. 0: disabled, 1: enabled (default)
167
+ # coreference -> resolve coreferences (i.e. the pronouns that correspond to named entities). 0: disabled, 1: enabled (default)
168
+ # quotations -> extract quotations by entities. 0: disabled (default), 1: enabled.
169
+ # sentiment -> analyze sentiment for each entity. 0: disabled (default), 1: enabled. Requires 1 additional API transction if enabled.
170
+ # showSourceText -> 0: disabled (default), 1: enabled
171
+ # maxRetrieve -> the maximum number of entities to retrieve (default: 50)
172
+ #
173
+ # OUTPUT:
174
+ # The response, already converted from JSON to a Ruby object.
175
+ #
176
+ def entities(flavor, data, options = {})
177
+ unless @@ENDPOINTS['entities'].key?(flavor)
178
+ return { 'status' => 'ERROR', 'statusInfo' => 'entity extraction for ' + flavor + ' not available' }
179
+ end
180
+
181
+ # Add the URL encoded data to the options and analyze
182
+ options[flavor] = data
183
+ return analyze(@@ENDPOINTS['entities'][flavor], options)
184
+ end
185
+
186
+ # Extracts the author from a URL or HTML.
187
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/author-extraction/
188
+ # For the docs, please refer to: http://www.alchemyapi.com/api/author-extraction/
189
+ #
190
+ # INPUT:
191
+ # flavor -> which version of the call, i.e. text, url or html.
192
+ # data -> the data to analyze, either the text, the url or html code.
193
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
194
+ #
195
+ # Available Options:
196
+ # none
197
+ #
198
+ # OUTPUT:
199
+ # The response, already converted from JSON to a Ruby object.
200
+ #
201
+ def author(flavor, data, options = {})
202
+ unless @@ENDPOINTS['author'].key?(flavor)
203
+ return { 'status' => 'ERROR', 'statusInfo' => 'author extraction for ' + flavor + ' not available' }
204
+ end
205
+
206
+ # Add the URL encoded data to the options and analyze
207
+ options[flavor] = data
208
+ return analyze(@@ENDPOINTS['author'][flavor], options)
209
+ end
210
+
211
+ # Extracts the keywords from text, a URL or HTML.
212
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/keyword-extraction/
213
+ # For the docs, please refer to: http://www.alchemyapi.com/api/keyword-extraction/
214
+ #
215
+ # INPUT:
216
+ # flavor -> which version of the call, i.e. text, url or html.
217
+ # data -> the data to analyze, either the text, the url or html code.
218
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
219
+ #
220
+ # Available Options:
221
+ # keywordExtractMode -> normal (default), strict
222
+ # sentiment -> analyze sentiment for each keyword. 0: disabled (default), 1: enabled. Requires 1 additional API transaction if enabled.
223
+ # showSourceText -> 0: disabled (default), 1: enabled.
224
+ # maxRetrieve -> the max number of keywords returned (default: 50)
225
+ #
226
+ # OUTPUT:
227
+ # The response, already converted from JSON to a Ruby object.
228
+ #
229
+ def keywords(flavor, data, options = {})
230
+ unless @@ENDPOINTS['keywords'].key?(flavor)
231
+ return { 'status' => 'ERROR', 'statusInfo' => 'keyword extraction for ' + flavor + ' not available' }
232
+ end
233
+
234
+ # Add the URL encoded data to the options and analyze
235
+ options[flavor] = data
236
+ return analyze(@@ENDPOINTS['keywords'][flavor], options)
237
+ end
238
+
239
+ # Tags the concepts for text, a URL or HTML.
240
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/concept-tagging/
241
+ # For the docs, please refer to: http://www.alchemyapi.com/api/concept-tagging/
242
+ #
243
+ # Available Options:
244
+ # maxRetrieve -> the maximum number of concepts to retrieve (default: 8)
245
+ # linkedData -> include linked data, 0: disabled, 1: enabled (default)
246
+ # showSourceText -> 0:disabled (default), 1: enabled
247
+ #
248
+ # OUTPUT:
249
+ # The response, already converted from JSON to a Ruby object.
250
+ #
251
+ def concepts(flavor, data, options = {})
252
+ unless @@ENDPOINTS['concepts'].key?(flavor)
253
+ return { 'status' => 'ERROR', 'statusInfo' => 'concept tagging for ' + flavor + ' not available' }
254
+ end
255
+
256
+ # Add the URL encoded data to the options and analyze
257
+ options[flavor] = data
258
+ return analyze(@@ENDPOINTS['concepts'][flavor], options)
259
+ end
260
+
261
+ # Categorizes the text for text, a URL or HTML.
262
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/text-categorization/
263
+ # For the docs, please refer to: http://www.alchemyapi.com/api/text-categorization/
264
+ #
265
+ # INPUT:
266
+ # flavor -> which version of the call, i.e. text, url or html.
267
+ # data -> the data to analyze, either the text, the url or html code.
268
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
269
+ #
270
+ # Available Options:
271
+ # showSourceText -> 0: disabled (default), 1: enabled
272
+ #
273
+ # OUTPUT:
274
+ # The response, already converted from JSON to a Ruby object.
275
+ #
276
+ def category(flavor, data, options = {})
277
+ unless @@ENDPOINTS['category'].key?(flavor)
278
+ return { 'status' => 'ERROR', 'statusInfo' => 'text categorization for ' + flavor + ' not available' }
279
+ end
280
+
281
+ # Add the URL encoded data to the options and analyze
282
+ options[flavor] = data
283
+ return analyze(@@ENDPOINTS['category'][flavor], options)
284
+ end
285
+
286
+ # Extracts the relations for text, a URL or HTML.
287
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/relation-extraction/
288
+ # For the docs, please refer to: http://www.alchemyapi.com/api/relation-extraction/
289
+ #
290
+ # INPUT:
291
+ # flavor -> which version of the call, i.e. text, url or html.
292
+ # data -> the data to analyze, either the text, the url or html code.
293
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
294
+ #
295
+ # Available Options:
296
+ # sentiment -> 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled.
297
+ # keywords -> extract keywords from the subject and object. 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled.
298
+ # entities -> extract entities from the subject and object. 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled.
299
+ # requireEntities -> only extract relations that have entities. 0: disabled (default), 1: enabled.
300
+ # sentimentExcludeEntities -> exclude full entity name in sentiment analysis. 0: disabled, 1: enabled (default)
301
+ # disambiguate -> disambiguate entities (i.e. Apple the company vs. apple the fruit). 0: disabled, 1: enabled (default)
302
+ # linkedData -> include linked data with disambiguated entities. 0: disabled, 1: enabled (default).
303
+ # coreference -> resolve entity coreferences. 0: disabled, 1: enabled (default)
304
+ # showSourceText -> 0: disabled (default), 1: enabled.
305
+ # maxRetrieve -> the maximum number of relations to extract (default: 50, max: 100)
306
+ #
307
+ # OUTPUT:
308
+ # The response, already converted from JSON to a Ruby object.
309
+ #
310
+ def relations(flavor, data, options = {})
311
+ unless @@ENDPOINTS['relations'].key?(flavor)
312
+ return { 'status' => 'ERROR', 'statusInfo' => 'relation extraction for ' + flavor + ' not available' }
313
+ end
314
+
315
+ # Add the URL encoded data to the options and analyze
316
+ options[flavor] = data
317
+ return analyze(@@ENDPOINTS['relations'][flavor], options)
318
+ end
319
+
320
+ # Detects the language for text, a URL or HTML.
321
+ # For an overview, please refer to: http://www.alchemyapi.com/api/language-detection/
322
+ # For the docs, please refer to: http://www.alchemyapi.com/products/features/language-detection/
323
+ #
324
+ # INPUT:
325
+ # flavor -> which version of the call, i.e. text, url or html.
326
+ # data -> the data to analyze, either the text, the url or html code.
327
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
328
+ #
329
+ # Available Options:
330
+ # none
331
+ #
332
+ # OUTPUT:
333
+ # The response, already converted from JSON to a Ruby object.
334
+ #
335
+ def language(flavor, data, options = {})
336
+ unless @@ENDPOINTS['language'].key?(flavor)
337
+ return { 'status' => 'ERROR', 'statusInfo' => 'language detection for ' + flavor + ' not available' }
338
+ end
339
+
340
+ # Add the URL encoded data to the options and analyze
341
+ options[flavor] = data
342
+ return analyze(@@ENDPOINTS['language'][flavor], options)
343
+ end
344
+
345
+ # Extracts the cleaned text (removes ads, navigation, etc.) for text, a URL or HTML.
346
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/text-extraction/
347
+ # For the docs, please refer to: http://www.alchemyapi.com/api/text-extraction/
348
+ #
349
+ # INPUT:
350
+ # flavor -> which version of the call, i.e. text, url or html.
351
+ # data -> the data to analyze, either the text, the url or html code.
352
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
353
+ #
354
+ # Available Options:
355
+ # useMetadata -> utilize meta description data, 0: disabled, 1: enabled (default)
356
+ # extractLinks -> include links, 0: disabled (default), 1: enabled.
357
+ #
358
+ # OUTPUT:
359
+ # The response, already converted from JSON to a Ruby object.
360
+ #
361
+ def text(flavor, data, options = {})
362
+ unless @@ENDPOINTS['text'].key?(flavor)
363
+ return { 'status' => 'ERROR', 'statusInfo' => 'clean text extraction for ' + flavor + ' not available' }
364
+ end
365
+
366
+ # Add the URL encoded data to the options and analyze
367
+ options[flavor] = data
368
+ return analyze(@@ENDPOINTS['text'][flavor], options)
369
+ end
370
+
371
+ # Extracts the raw text (includes ads, navigation, etc.) for a URL or HTML.
372
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/text-extraction/
373
+ # For the docs, please refer to: http://www.alchemyapi.com/api/text-extraction/
374
+ #
375
+ # INPUT:
376
+ # flavor -> which version of the call, i.e. text, url or html.
377
+ # data -> the data to analyze, either the text, the url or html code.
378
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
379
+ #
380
+ # Available Options:
381
+ # none
382
+ #
383
+ # OUTPUT:
384
+ # The response, already converted from JSON to a Ruby object.
385
+ #
386
+ def text_raw(flavor, data, options = {})
387
+ unless @@ENDPOINTS['text_raw'].key?(flavor)
388
+ return { 'status' => 'ERROR', 'statusInfo' => 'raw text extraction for ' + flavor + ' not available' }
389
+ end
390
+
391
+ # Add the URL encoded data to the options and analyze
392
+ options[flavor] = data
393
+ return analyze(@@ENDPOINTS['text_raw'][flavor], options)
394
+ end
395
+
396
+ # Extracts the title for a URL or HTML.
397
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/text-extraction/
398
+ # For the docs, please refer to: http://www.alchemyapi.com/api/text-extraction/
399
+ #
400
+ # INPUT:
401
+ # flavor -> which version of the call, i.e. text, url or html.
402
+ # data -> the data to analyze, either the text, the url or html code.
403
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
404
+ #
405
+ # Available Options:
406
+ # useMetadata -> utilize title info embedded in meta data, 0: disabled, 1: enabled (default)
407
+
408
+ # OUTPUT:
409
+ # The response, already converted from JSON to a Ruby object.
410
+ #
411
+ def title(flavor, data, options = {})
412
+ unless @@ENDPOINTS['title'].key?(flavor)
413
+ return { 'status' => 'ERROR', 'statusInfo' => 'title extraction for ' + flavor + ' not available' }
414
+ end
415
+
416
+ # Add the URL encoded data to the options and analyze
417
+ options[flavor] = data
418
+ return analyze(@@ENDPOINTS['title'][flavor], options)
419
+ end
420
+
421
+ # Parses the microformats for a URL or HTML.
422
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/microformats-parsing/
423
+ # For the docs, please refer to: http://www.alchemyapi.com/api/microformats-parsing/
424
+ #
425
+ # INPUT:
426
+ # flavor -> which version of the call, i.e. url or html.
427
+ # data -> the data to analyze, either the the url or html code.
428
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
429
+ #
430
+ # Available Options:
431
+ # none
432
+ #
433
+ # OUTPUT:
434
+ # The response, already converted from JSON to a Ruby object.
435
+ #
436
+ def microformats(flavor, data, options = {})
437
+ unless @@ENDPOINTS['microformats'].key?(flavor)
438
+ return { 'status' => 'ERROR', 'statusInfo' => 'microformats parsing for ' + flavor + ' not available' }
439
+ end
440
+
441
+ # Add the URL encoded data to the options and analyze
442
+ options[flavor] = data
443
+ return analyze(@@ENDPOINTS['microformats'][flavor], options)
444
+ end
445
+
446
+ # Detects the RSS/ATOM feeds for a URL or HTML.
447
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/feed-detection/
448
+ # For the docs, please refer to: http://www.alchemyapi.com/api/feed-detection/
449
+ #
450
+ # INPUT:
451
+ # flavor -> which version of the call, i.e. url or html.
452
+ # data -> the data to analyze, either the the url or html code.
453
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
454
+ #
455
+ # Available Options:
456
+ # none
457
+ #
458
+ # OUTPUT:
459
+ # The response, already converted from JSON to a Ruby object.
460
+ #
461
+ def feeds(flavor, data, options = {})
462
+ unless @@ENDPOINTS['feeds'].key?(flavor)
463
+ return { 'status' => 'ERROR', 'statusInfo' => 'feed detection for ' + flavor + ' not available' }
464
+ end
465
+
466
+ # Add the URL encoded data to the options and analyze
467
+ options[flavor] = data
468
+ return analyze(@@ENDPOINTS['feeds'][flavor], options)
469
+ end
470
+
471
+ # Categorizes the text for a URL, text or HTML.
472
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/text-categorization/
473
+ # For the docs, please refer to: http://www.alchemyapi.com/api/taxonomy/
474
+ #
475
+ # INPUT:
476
+ # flavor -> which version of the call, i.e. url, text or html.
477
+ # data -> the data to analyze, either the the url, text or html code.
478
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
479
+ #
480
+ # Available Options:
481
+ # showSourceText -> 0: disabled (default), 1: enabled.
482
+ #
483
+ # OUTPUT:
484
+ # The response, already converted from JSON to a Ruby object.
485
+ #
486
+ def taxonomy(flavor, data, options = {})
487
+ unless @@ENDPOINTS['taxonomy'].key?(flavor)
488
+ return { 'status' => 'ERROR', 'statusInfo' => 'Taxonomy info for ' + flavor + ' not available' }
489
+ end
490
+
491
+ # Add the URL encoded data to the options and analyze
492
+ options[flavor] = data
493
+ return analyze(@@ENDPOINTS['taxonomy'][flavor], options)
494
+ end
495
+
496
+ # Combined call (see options below for available extractions) for a URL or text.
497
+ #
498
+ # INPUT:
499
+ # flavor -> which version of the call, i.e. url or text.
500
+ # data -> the data to analyze, either the the url or text.
501
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
502
+ #
503
+ # Available Options:
504
+ # extract -> VALUE,VALUE,VALUE,... (possible VALUEs: page-image,entity,keyword,title,author,taxonomy,concept,relation,doc-sentiment)
505
+ # extractMode -> (only applies when 'page-image' VALUE passed to 'extract' option)
506
+ # trust-metadata: less CPU-intensive, less accurate
507
+ # always-infer: more CPU-intensive, more accurate
508
+ # disambiguate -> whether to disambiguate detected entities, 0: disabled, 1: enabled (default)
509
+ # linkedData -> whether to include Linked Data content links with disambiguated entities, 0: disabled, 1: enabled (default). disambiguate must be enabled to use this.
510
+ # coreference -> whether to he/she/etc coreferences into detected entities, 0: disabled, 1: enabled (default)
511
+ # quotations -> whether to enable quotations extraction, 0: disabled (default), 1: enabled
512
+ # sentiment -> whether to enable entity-level sentiment analysis, 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled.
513
+ # showSourceText -> 0: disabled (default), 1: enabled.
514
+ # maxRetrieve -> maximum number of named entities to extract (default: 50)
515
+ #
516
+ # OUTPUT:
517
+ # The response, already converted from JSON to a Ruby object.
518
+ #
519
+ def combined(flavor, data, options = {})
520
+ unless @@ENDPOINTS['combined'].key?(flavor)
521
+ return { 'status' => 'ERROR', 'statusInfo' => 'Combined data for ' + flavor + ' not available' }
522
+ end
523
+
524
+ # Add the URL encoded data to the options and analyze
525
+ options[flavor] = data
526
+ return analyze(@@ENDPOINTS['combined'][flavor], options)
527
+ end
528
+
529
+ # Extract image from a URL.
530
+ #
531
+ # INPUT:
532
+ # flavor -> which version of the call, i.e. url.
533
+ # data -> the data to analyze, i.e. the url.
534
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
535
+ #
536
+ # Available Options:
537
+ # extractMode -> trust-metadata: less CPU-intensive and less accurate, always-infer: more CPU-intensive and more accurate
538
+ #
539
+ # OUTPUT:
540
+ # The response, already converted from JSON to a Ruby object.
541
+ #
542
+ def image_extract(flavor, data, options = {})
543
+ unless @@ENDPOINTS['image_extract'].key?(flavor)
544
+ return { 'status' => 'ERROR', 'statusInfo' => 'Image for ' + flavor + ' not available' }
545
+ end
546
+
547
+ # Add the URL encoded data to the options and analyze
548
+ options[flavor] = data
549
+ return analyze(@@ENDPOINTS['image_extract'][flavor], options)
550
+ end
551
+
552
+ # Tag image from a URL or raw image data.
553
+ # For an overview, please refer to: http://www.alchemyapi.com/products/features/image-tagging/
554
+ # For the docs, please refer to: http://www.alchemyapi.com/api/image-tagging/
555
+ #
556
+ # INPUT:
557
+ # flavor -> which version of the call, i.e. url or image.
558
+ # data -> the data to analyze, the url
559
+ # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
560
+ #
561
+ # Available Options:
562
+ # extractMode -> trust-metadata: less CPU-intensive and less accurate, always-infer: more CPU-intensive and more accurate
563
+ # (image flavor only)
564
+ # imagePostMode -> how you will post the image
565
+ # raw: pass an unencoded image file using POST
566
+ #
567
+ # OUTPUT:
568
+ # The response, already converted from JSON to a Ruby object.
569
+ #
570
+ def image_tag(flavor, data, options = {}, image = '')
571
+ unless @@ENDPOINTS['image_tag'].key?(flavor)
572
+ return { 'status' => 'ERROR', 'statusInfo' => 'Image tagging for ' + flavor + ' not available' }
573
+ end
574
+
575
+ # Add the URL encoded data to the options and analyze
576
+ unless data.empty?
577
+ options[flavor] = data
578
+ end
579
+ return analyze_image(@@ENDPOINTS['image_tag'][flavor], options, image)
580
+ end
581
+
582
+ private
583
+
584
+ # HTTP Request wrapper that is called by the endpoint functions. This function is not intended to be called through an external interface.
585
+ # It makes the call, then converts the returned JSON string into a Ruby object.
586
+ #
587
+ # INPUT:
588
+ # url -> the full URI encoded url
589
+ #
590
+ # OUTPUT:
591
+ # The response, already converted from JSON to a Ruby object.
592
+ #
593
+ def analyze(url, options)
594
+ # Insert the base URL
595
+ url = @@BASE_URL + url
596
+
597
+ # Add the API key and set the output mode to JSON
598
+ options['apikey'] = @apiKey
599
+ options['outputMode'] = 'json'
600
+
601
+ uri = URI.parse(url)
602
+
603
+ # Force Faraday using excon, to avoid Zlib::BufError: buffer error
604
+ Faraday.default_adapter = :excon
605
+
606
+ request = Faraday.new(url: "#{uri.scheme}://#{uri.host}")
607
+
608
+ # Fire off the HTTP request
609
+ res = request.post uri.request_uri, options
610
+
611
+ # parse and return the response
612
+ return JSON.parse(res.body)
613
+ end
614
+
615
+ # HTTP Request wrapper that is called by the endpoint functions. This function is not intended to be called through an external interface.
616
+ # It makes the call, then converts the returned JSON string into a Ruby object.
617
+ #
618
+ # INPUT:
619
+ # url -> the full URI encoded url
620
+ # body -> the raw binary image data
621
+ #
622
+ # OUTPUT:
623
+ # The response, already converted from JSON to a Ruby object.
624
+ #
625
+ def analyze_image(url, options, body)
626
+ # Insert the base URL
627
+ url = @@BASE_URL + url
628
+
629
+ # Add the API key and set the output mode to JSON
630
+ options['apikey'] = @apiKey
631
+ options['outputMode'] = 'json'
632
+
633
+ url += '?'
634
+ options.each { |h, v|
635
+ url += h + '=' + v + '&'
636
+ }
637
+
638
+ # Parse URL
639
+ uri = URI.parse(url)
640
+
641
+ # Force Faraday using excon, to avoid Zlib::BufError: buffer error
642
+ Faraday.default_adapter = :excon
643
+
644
+ request = Faraday.new(url: "#{uri.scheme}://#{uri.host}")
645
+
646
+ # Fire off the HTTP request
647
+ res = request.post uri.request_uri, body.to_s
648
+
649
+ # parse and return the response
650
+ return JSON.parse(res.body)
651
+ end
652
+ end
@@ -0,0 +1,258 @@
1
+
2
+ # Copyright 2013 AlchemyAPI
3
+ # Copyright 2014 Piero Dotti
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'alchemyapi'
18
+
19
+ if RUBY_VERSION < '2.0'
20
+ require 'test/unit'
21
+ class MyTest < Test::Unit::TestCase
22
+ end
23
+ else
24
+ require 'minitest/autorun'
25
+ class MyTest < MiniTest::Test
26
+ end
27
+ end
28
+ class AlchemyAPITest < MyTest
29
+ @@alchemyapi = AlchemyAPI.new(IO.read('alchemy.key'))
30
+ @@test_text = 'Bob broke my heart, and then made up this silly sentence to test the Ruby SDK'
31
+ @@test_html = '<html><head><title>The best SDK Test | AlchemyAPI</title></head><body><h1>Hello World!</h1><p>My favorite language is Ruby</p></body></html>'
32
+ @@test_url = 'http://www.nytimes.com/2013/07/13/us/politics/a-day-of-friction-notable-even-for-a-fractious-congress.html?_r=0'
33
+ @@test_image = File.binread('dog.jpg')
34
+
35
+ def test_entities
36
+ puts 'Checking entities . . . '
37
+ response = @@alchemyapi.entities('text', @@test_text)
38
+ assert_equal response['status'], 'OK'
39
+ response = @@alchemyapi.entities('html', @@test_html)
40
+ assert_equal response['status'], 'OK'
41
+ response = @@alchemyapi.entities('url', @@test_url)
42
+ assert_equal response['status'], 'OK'
43
+ response = @@alchemyapi.entities('random', @@test_text)
44
+ assert_equal response['status'], 'ERROR' # invalid flavor
45
+ puts 'Entity tests complete'
46
+ puts ''
47
+ end
48
+
49
+ def test_keywords
50
+ puts 'Checking keywords . . . '
51
+ response = @@alchemyapi.keywords('text', @@test_text)
52
+ assert_equal response['status'], 'OK'
53
+ response = @@alchemyapi.keywords('html', @@test_html)
54
+ assert_equal response['status'], 'OK'
55
+ response = @@alchemyapi.keywords('url', @@test_url)
56
+ assert_equal response['status'], 'OK'
57
+ response = @@alchemyapi.keywords('random', @@test_text)
58
+ assert_equal response['status'], 'ERROR' # invalid flavor
59
+ puts 'Keyword tests complete'
60
+ puts ''
61
+ end
62
+
63
+ def test_concepts
64
+ puts 'Checking concepts . . . '
65
+ response = @@alchemyapi.concepts('text', @@test_text)
66
+ assert_equal response['status'], 'OK'
67
+ response = @@alchemyapi.concepts('html', @@test_html)
68
+ assert_equal response['status'], 'OK'
69
+ response = @@alchemyapi.concepts('url', @@test_url)
70
+ assert_equal response['status'], 'OK'
71
+ response = @@alchemyapi.concepts('random', @@test_text)
72
+ assert_equal response['status'], 'ERROR' # invalid flavor
73
+ puts 'Concept tests complete'
74
+ puts ''
75
+ end
76
+
77
+ def test_sentiment
78
+ puts 'Checking sentiment . . . '
79
+ response = @@alchemyapi.sentiment('text', @@test_text)
80
+ assert_equal response['status'], 'OK'
81
+ response = @@alchemyapi.sentiment('html', @@test_html)
82
+ assert_equal response['status'], 'OK'
83
+ response = @@alchemyapi.sentiment('url', @@test_url)
84
+ assert_equal response['status'], 'OK'
85
+ response = @@alchemyapi.sentiment('random', @@test_text)
86
+ assert_equal response['status'], 'ERROR' # invalid flavor
87
+ puts 'Sentiment tests complete'
88
+ puts ''
89
+ end
90
+
91
+ def test_sentiment_targeted
92
+ puts 'Checking targeted sentiment . . . '
93
+ response = @@alchemyapi.sentiment_targeted('text', @@test_text, 'heart')
94
+ assert_equal response['status'], 'OK'
95
+ response = @@alchemyapi.sentiment_targeted('html', @@test_html, 'language')
96
+ assert_equal response['status'], 'OK'
97
+ response = @@alchemyapi.sentiment_targeted('url', @@test_url, 'Congress')
98
+ assert_equal response['status'], 'OK'
99
+ response = @@alchemyapi.sentiment_targeted('text', @@test_text, nil)
100
+ assert_equal response['status'], 'ERROR' # invalid target
101
+ response = @@alchemyapi.sentiment_targeted('random', @@test_url, 'Congress')
102
+ assert_equal response['status'], 'ERROR' # invalid flavor
103
+ puts 'Targeted sentiment tests complete'
104
+ puts ''
105
+ end
106
+
107
+ def test_text
108
+ puts 'Checking clean text . . . '
109
+ response = @@alchemyapi.text('text', @@test_text)
110
+ assert_equal response['status'], 'ERROR' # only valid for HTML and URL content
111
+ response = @@alchemyapi.text('html', @@test_html)
112
+ assert_equal response['status'], 'OK'
113
+ response = @@alchemyapi.text('url', @@test_url)
114
+ assert_equal response['status'], 'OK'
115
+ puts 'Clean text tests complete'
116
+ puts ''
117
+ end
118
+
119
+ def test_text_raw
120
+ puts 'Checking raw text . . . '
121
+ response = @@alchemyapi.text_raw('text', @@test_text)
122
+ assert_equal response['status'], 'ERROR' # only valid for HTML and URL content
123
+ response = @@alchemyapi.text_raw('html', @@test_html)
124
+ assert_equal response['status'], 'OK'
125
+ response = @@alchemyapi.text_raw('url', @@test_url)
126
+ assert_equal response['status'], 'OK'
127
+ puts 'Raw text tests complete'
128
+ puts ''
129
+ end
130
+
131
+ def test_text_author
132
+ puts 'Checking author. . . '
133
+ response = @@alchemyapi.author('text', @@test_text)
134
+ assert_equal response['status'], 'ERROR' # only valid for HTML and URL content
135
+ response = @@alchemyapi.author('html', @@test_html)
136
+ assert_equal response['status'], 'ERROR' # there is no author information in the test HTML
137
+ response = @@alchemyapi.author('url', @@test_url)
138
+ assert_equal response['status'], 'OK'
139
+ puts 'Author tests complete'
140
+ puts ''
141
+ end
142
+
143
+ def test_title
144
+ puts 'Checking title . . . '
145
+ response = @@alchemyapi.title('text', @@test_text)
146
+ assert_equal response['status'], 'ERROR' # only valid for HTML and URL content
147
+ response = @@alchemyapi.title('html', @@test_html)
148
+ assert_equal response['status'], 'OK'
149
+ response = @@alchemyapi.title('url', @@test_url)
150
+ assert_equal response['status'], 'OK'
151
+ puts 'Title tests complete'
152
+ puts ''
153
+ end
154
+
155
+ def test_relations
156
+ puts 'Checking relations . . . '
157
+ response = @@alchemyapi.relations('text', @@test_text)
158
+ assert_equal response['status'], 'OK'
159
+ response = @@alchemyapi.relations('html', @@test_html)
160
+ assert_equal response['status'], 'OK'
161
+ response = @@alchemyapi.relations('url', @@test_url)
162
+ assert_equal response['status'], 'OK'
163
+ response = @@alchemyapi.relations('random', @@test_text)
164
+ assert_equal response['status'], 'ERROR' # invalid flavor
165
+ puts 'Relations tests complete'
166
+ puts ''
167
+ end
168
+
169
+ def test_category
170
+ puts 'Checking category . . . '
171
+ response = @@alchemyapi.category('text', @@test_text)
172
+ assert_equal response['status'], 'OK'
173
+ response = @@alchemyapi.category('html', @@test_html, { 'url' => 'test' })
174
+ assert_equal response['status'], 'OK'
175
+ response = @@alchemyapi.category('url', @@test_url)
176
+ assert_equal response['status'], 'OK'
177
+ response = @@alchemyapi.category('random', @@test_text)
178
+ assert_equal response['status'], 'ERROR' # invalid flavor
179
+ puts 'Category tests complete'
180
+ puts ''
181
+ end
182
+
183
+ def test_feeds
184
+ puts 'Checking feeds . . . '
185
+ response = @@alchemyapi.feeds('text', @@test_text)
186
+ assert_equal response['status'], 'ERROR' # only valid for HTML and URL content
187
+ response = @@alchemyapi.feeds('html', @@test_html, { 'url' => 'test' })
188
+ assert_equal response['status'], 'OK'
189
+ response = @@alchemyapi.feeds('url', @@test_url)
190
+ assert_equal response['status'], 'OK'
191
+ puts 'Feed tests complete'
192
+ puts ''
193
+ end
194
+
195
+ def test_microformats
196
+ puts 'Checking microformats . . . '
197
+ response = @@alchemyapi.microformats('text', @@test_text)
198
+ assert_equal response['status'], 'ERROR' # only valid for HTML and URL content
199
+ response = @@alchemyapi.microformats('html', @@test_html, { 'url' => 'test' })
200
+ assert_equal response['status'], 'OK'
201
+ response = @@alchemyapi.microformats('url', @@test_url)
202
+ assert_equal response['status'], 'OK'
203
+ puts 'Microformat tests complete'
204
+ puts ''
205
+ end
206
+
207
+ def test_taxonomy
208
+ puts 'Checking taxonomy . . . '
209
+ response = @@alchemyapi.taxonomy('text', @@test_text)
210
+ assert_equal response['status'], 'OK'
211
+ response = @@alchemyapi.taxonomy('url', @@test_url)
212
+ assert_equal response['status'], 'OK'
213
+ response = @@alchemyapi.taxonomy('html', @@test_html, { 'url' => 'test' })
214
+ assert_equal response['status'], 'OK'
215
+ response = @@alchemyapi.taxonomy('random', @@test_text)
216
+ assert_equal response['status'], 'ERROR' # invalid flavor
217
+ puts 'Taxonomy tests complete'
218
+ puts ''
219
+ end
220
+
221
+ def test_combined
222
+ puts 'Checking combined . . . '
223
+ response = @@alchemyapi.combined('html', @@test_html, { 'url' => 'test' })
224
+ assert_equal response['status'], 'ERROR' # only valid for text and URL content
225
+ response = @@alchemyapi.combined('text', @@test_text)
226
+ assert_equal response['status'], 'OK'
227
+ response = @@alchemyapi.combined('url', @@test_url)
228
+ assert_equal response['status'], 'OK'
229
+ puts 'Combined tests complete'
230
+ puts ''
231
+ end
232
+
233
+ def test_image_extract
234
+ puts 'Checking image extract . . . '
235
+ response = @@alchemyapi.image_extract('text', @@test_text)
236
+ assert_equal response['status'], 'ERROR' # only valid for URL content
237
+ response = @@alchemyapi.image_extract('html', @@test_html, { 'url' => 'test' })
238
+ assert_equal response['status'], 'ERROR' # only valid for URL content
239
+ response = @@alchemyapi.image_extract('url', @@test_url)
240
+ assert_equal response['status'], 'OK'
241
+ puts 'Image extract tests complete'
242
+ puts ''
243
+ end
244
+
245
+ def test_image_tag
246
+ puts 'Checking image tag . . . '
247
+ response = @@alchemyapi.image_tag('text', @@test_text)
248
+ assert_equal response['status'], 'ERROR' # only valid for URL or image content
249
+ response = @@alchemyapi.image_tag('html', @@test_html, { 'url' => 'test' })
250
+ assert_equal response['status'], 'ERROR' # only valid for URL or image content
251
+ response = @@alchemyapi.image_tag('url', @@test_url)
252
+ assert_equal response['status'], 'OK'
253
+ response = @@alchemyapi.image_tag('image', '', { 'imagePostMode' => 'raw' }, @@test_image)
254
+ assert_equal response['status'], 'OK'
255
+ puts 'Image tag tests complete'
256
+ puts ''
257
+ end
258
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alchemy-api-rb-gem
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ platform: ruby
6
+ authors:
7
+ - AlchemyAPI
8
+ - ProGM
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.8'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.1
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '1.8'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.1
34
+ - !ruby/object:Gem::Dependency
35
+ name: faraday
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.8'
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.8.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '0.8'
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.8.1
54
+ - !ruby/object:Gem::Dependency
55
+ name: excon
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.28'
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.28.0
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.28'
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.28.0
74
+ - !ruby/object:Gem::Dependency
75
+ name: minitest
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '5.3'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '5.3'
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '10.3'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '10.3'
102
+ description: A gem distribution for AlchemyAPI for ruby, see https://github.com/AlchemyAPI/alchemyapi_ruby
103
+ email: progiemmeh@gmail.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files: []
107
+ files:
108
+ - dog.jpg
109
+ - lib/alchemyapi.rb
110
+ - tests/test_alchemyapi.rb
111
+ homepage: https://github.com/ProGM/alchemy-api-rb-gem
112
+ licenses:
113
+ - Apache License 2.0
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.4.1
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: AlchemyAPI
135
+ test_files: []