joevandyk-evri 0.01

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,6 @@
1
+ === 0.0.1 / 2008-09-25
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
data/Manifest.txt ADDED
@@ -0,0 +1,14 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ TODO
6
+ lib/evri.rb
7
+ lib/evri/entity.rb
8
+ lib/evri/media.rb
9
+ lib/evri/relation.rb
10
+ lib/evri/zeitgeist.rb
11
+ test/test_entity.rb
12
+ test/test_evri.rb
13
+ test/test_media.rb
14
+ test/test_zeitgeist.rb
data/README.txt ADDED
@@ -0,0 +1,48 @@
1
+ = evri-api
2
+
3
+ * http://github.com/joevandyk/evri-api
4
+
5
+ == DESCRIPTION:
6
+
7
+ A beautiful API that wraps the RESTful services provided by evri.com.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ None yet.
12
+
13
+ == SYNOPSIS:
14
+
15
+ None yet.
16
+
17
+ == REQUIREMENTS:
18
+
19
+ none yet.
20
+
21
+ == INSTALL:
22
+
23
+ gem install evri-api
24
+
25
+ == LICENSE:
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) 2008 Joe Van Dyk
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/evri.rb'
6
+
7
+ Hoe.new('evri', Evri::VERSION) do |p|
8
+ p.developer('Joe Van Dyk', 'joe@@fixieconsulting.com')
9
+ end
10
+
11
+ # vim: syntax=Ruby
data/TODO ADDED
@@ -0,0 +1,13 @@
1
+ STUFF LEFT TO DO
2
+
3
+ * Handle Query Tokens
4
+ - QTs are initially generated here:
5
+ - query token for whole medias/entity document
6
+ - query token for each entity in the returned results of ^
7
+ - query token for each pair of entities in above ^
8
+ - Then pass them into the calls that can take them (and handle the returned QTs)
9
+
10
+ * Refactor code to make Resource and JSON handling flexible (after API is done)
11
+
12
+ * Ability to batch requests (via threading)
13
+ - see how facebooker does it
@@ -0,0 +1,222 @@
1
+ module Evri
2
+ # Represents an Evri Entity.
3
+ class Entity
4
+ attr_reader :properties
5
+
6
+ def self.find id
7
+ @entended_properties = true
8
+ @results ||= {}
9
+ id = "/" + id unless id =~ /\A\//
10
+ return @results[id] if @results[id]
11
+ @results[id] = create_from_json do
12
+ Evri.query(:type => :uri, :query => id)
13
+ end
14
+ end
15
+
16
+ def self.search name
17
+ create_from_jsons do
18
+ Evri.query(:type => :search, :query => name)
19
+ end
20
+ end
21
+
22
+ def self.search_by_prefix prefix
23
+ create_from_jsons do
24
+ Evri.query(:type => :prefix, :query => prefix)
25
+ end
26
+ end
27
+
28
+ def self.from_media options={}
29
+ uri, text = options[:uri], options[:text]
30
+ raise ArgumentError, "Must specify URI via the :uri option" unless uri
31
+ raise ArgumentError, "Must specify some text via the :text option" unless text
32
+
33
+ json = Evri.parse_json(Evri.query(:type => :from_media, :uri => uri, :text => text))
34
+ json["graph"]["entities"].map do |e, entity_json|
35
+ Entity.new entity_json
36
+ end
37
+ end
38
+
39
+ def source_url
40
+ @source_url
41
+ end
42
+
43
+ def info option=nil
44
+ @properties ||= {}
45
+ if defined?(@extended_properties)
46
+ if option
47
+ @properties[option]
48
+ else
49
+ @properties
50
+ end
51
+ else
52
+ @properties = Entity.find(uri).properties
53
+ @extended_properties = true
54
+ info(option)
55
+ end
56
+ end
57
+
58
+ def to_s
59
+ "#{name} <#{ id }>"
60
+ end
61
+
62
+ def name
63
+ @parsed_json["name"]["$"] || @parsed_json["name"]
64
+ end
65
+
66
+ def initialize json
67
+ @parsed_json = json
68
+ @relations = []
69
+ @source_url = Evri.source_url
70
+ if json["properties"]
71
+ set_properties json["properties"]
72
+ end
73
+ end
74
+
75
+ def == b
76
+ self.id == b.id
77
+ end
78
+
79
+ def href
80
+ @parsed_json["@href"]
81
+ end
82
+
83
+ alias id href
84
+ alias uri href
85
+
86
+ def target_href
87
+ @parsed_json["@targetHref"]
88
+ end
89
+
90
+ def relations options={}
91
+ from_domains = nil
92
+ if options[:from]
93
+ if options[:from].class == String
94
+ from_domains = options[:from]
95
+ else
96
+ from_domains = options[:from].join(',')
97
+ end
98
+ end
99
+ json = Evri.query(:type => :relations, :query => id, :from_domains => from_domains)
100
+ Evri.parse_json(json)["relations"].each do |type, relation_json|
101
+ next if type != 'relation'
102
+ relation_json.each do |r|
103
+ @relations << Relation.new(r)
104
+ end
105
+ end
106
+ @relations
107
+ end
108
+
109
+ def related_by options={}
110
+ media, verb, verb_value, entity, uri = nil, nil, nil, nil, nil
111
+ options.each do |key, value|
112
+ if key == :entity
113
+ entity = value
114
+ elsif key == :uri
115
+ uri = value
116
+ elsif key == :type
117
+ media = value
118
+ else
119
+ verb = key
120
+ verb_value = value
121
+ end
122
+ end
123
+ @entities = []
124
+ json = Evri.query(:type => :related_by, :media => media, :query => id, :uri => uri, :entity => entity, :verb => verb, :value => verb_value)
125
+ Evri.parse_json(json)["relations"].each do |type, relation_json|
126
+ next if type != 'relation'
127
+ relation_json["targets"].each do |type, r|
128
+ r.each do |entity|
129
+ if entity.class == Hash
130
+ if entity["@href"]
131
+ @entities << Entity.new(entity)
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ @entities
138
+ end
139
+
140
+ def images options={}
141
+ medias = []
142
+ if options[:entities]
143
+ entity_uris = options[:entities].map do |e|
144
+ if e.class == Evri::Entity
145
+ e.uri
146
+ else
147
+ e
148
+ end
149
+ end
150
+ end
151
+
152
+ json = Evri.parse_json(Evri.query(:type => :related_medias, :query => href, :entities => entity_uris, :media => 'image'))
153
+ # TODO handle images here
154
+ if json["mediaResult"]["imageList"]
155
+ json["mediaResult"]["imageList"]["image"].each do |media_json|
156
+ medias << Image.new(media_json)
157
+ end
158
+ end
159
+ medias
160
+ end
161
+
162
+ def articles options={}
163
+ medias = []
164
+ if options[:entities]
165
+ entity_uris = options[:entities].map do |e|
166
+ if e.class == Evri::Entity
167
+ e.uri
168
+ else
169
+ e
170
+ end
171
+ end
172
+ end
173
+
174
+ type = options[:type] ? options[:type] : nil
175
+ json = Evri.parse_json(Evri.query(:type => :related_medias, :query => href, :entities => entity_uris, :media => type))
176
+ if json["mediaResult"]["articleList"]
177
+ json["mediaResult"]["articleList"]["article"].each do |media_json|
178
+ medias << Article.new(media_json)
179
+ end
180
+ end
181
+ medias
182
+ end
183
+
184
+
185
+ private
186
+
187
+ def self.create_from_json json=nil, &block
188
+ begin
189
+ json = block.call if block
190
+ Entity.new Evri.parse_json(json)["entity"]
191
+ rescue Evri::Error => e
192
+ raise Evri::EntityNotFound.new(e.message)
193
+ end
194
+ end
195
+
196
+ def self.create_from_jsons jsons=nil, &block
197
+ jsons = block.call if block
198
+ result = []
199
+ Evri.parse_json(jsons)["entities"].each do |type, entity|
200
+ if entity.class == Array
201
+ entity.each do |e|
202
+ result << Entity.new(e)
203
+ end
204
+ else
205
+ result << Entity.new(entity)
206
+ end
207
+ end
208
+ result
209
+ end
210
+
211
+ def set_properties json
212
+ @properties = {}
213
+ json["property"].each do |prop|
214
+ if prop.class == Array
215
+ @properties[prop.first.to_sym] = prop.last["$"]
216
+ else
217
+ @properties[prop["name"]["$"].to_sym] = prop["value"]["$"]
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
data/lib/evri/media.rb ADDED
@@ -0,0 +1,44 @@
1
+ module Evri
2
+ class Media
3
+ end
4
+
5
+ class Article < Media
6
+ attr_accessor :title, :href, :uri, :author, :published_at, :content
7
+ def initialize json
8
+ @title = json["title"]["$"]
9
+ @author = json["author"]["$"]
10
+ @content = json["content"] ? json["content"]["$"] : "No content provided"
11
+ @published_at = json["published"]["$"]
12
+ @href = Evri.api_host + json["link"]["@href"]
13
+ @uri = json["link"]["@hostName"] + json["link"]["@path"]
14
+ end
15
+ end
16
+
17
+ class Image < Media
18
+ attr_accessor :size, :title, :article_href, :mime_type, :thumbnail, :date, :content, :width, :url, :click_url, :height
19
+ def initialize json
20
+ @title = json["title"]
21
+ @width = json["@width"]
22
+ @height = json["@height"]
23
+ @url = json["@url"]
24
+ @size = json["size"]
25
+ @title = json["title"]
26
+ @article_href = json["articleHref"]["$"]
27
+ @mime_type = json["mimeType"]
28
+ @date = Date.parse(json["date"]["$"])
29
+ @content = json["content"]["$"]
30
+ @click_url = json["clickUrl"]["$"]
31
+ @thumbnail = Thumbnail.new(json["thumbnail"])
32
+ end
33
+
34
+ class Thumbnail
35
+ attr_accessor :size, :width, :height, :url
36
+ def initialize json
37
+ @size = json["size"]
38
+ @width = json["@width"]
39
+ @height = json["@height"]
40
+ @url = json["@url"]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ module Evri
2
+ class Relation
3
+ attr_accessor :name, :href, :type
4
+ def initialize json
5
+ @name = json["name"]["$"]
6
+ @href = json["@href"]
7
+ @type = json["type"]["$"]
8
+ @entities = []
9
+ end
10
+
11
+ def entities
12
+ return @entities unless @entities.empty?
13
+ json = JSON.parse(Evri.query(:type => :uri, :query => @href))
14
+ json["relations"]["relation"]["targets"]["entity"].each do |entity_json|
15
+ @entities << Entity.new(entity_json)
16
+ end
17
+ @entities
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module Evri
2
+ class Zeitgeist
3
+ ENTITY_TYPES = %w( animal backterium checmical concept disorder event location organization person plant product virus )
4
+ TYPES = %w( all popular rising falling )
5
+
6
+ TYPES.each do |t|
7
+ ENTITY_TYPES.each do |et|
8
+ eval %(
9
+ def self.#{t}_#{et}
10
+ json = Evri.parse_json(Evri.query :type => :zeitgeist, :query => "#{et}/#{t}")
11
+ json["zeitgeist"]["#{t}"]["entities"]["entity"].map do |entity_json|
12
+ Entity.new(entity_json)
13
+ end
14
+ end
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/evri.rb ADDED
@@ -0,0 +1,137 @@
1
+ $: << File.dirname(__FILE__)
2
+
3
+ require 'uri'
4
+ require 'net/http'
5
+ require 'cgi'
6
+
7
+ begin
8
+ require 'rubygems'
9
+ rescue LoadError
10
+ nil
11
+ end
12
+
13
+ require 'json'
14
+
15
+ for file in Dir[File.join(File.dirname(__FILE__), 'evri', '*')]
16
+ require file
17
+ end
18
+
19
+ module Evri
20
+
21
+ # A general error.
22
+ class Error < Exception; end
23
+
24
+ # Raised whenever the entity you are searching for cannot be found.
25
+ class EntityNotFound < Error; end
26
+
27
+ VERSION = "0.01"
28
+ @@api_host = "api.evri.com"
29
+ @@source_host = @@api_host
30
+ @@source_url = nil
31
+
32
+ def self.api_host= host
33
+ @@api_host = validate_host(host)
34
+ end
35
+
36
+ def self.api_host
37
+ @@api_host
38
+ end
39
+
40
+ def self.source_host
41
+ @@source_host
42
+ end
43
+
44
+ def self.source_host= host
45
+ @@source_host = validate_host(host)
46
+ end
47
+
48
+ def self.source_url
49
+ @@source_url
50
+ end
51
+
52
+ def self.parse_json json
53
+ begin
54
+ JSON.parse(json)
55
+ rescue JSON::ParserError => e
56
+ # puts "Error!"
57
+ # puts e.message
58
+ # puts json
59
+ raise Error.new(e)
60
+ end
61
+ end
62
+
63
+ # TODO Rewrite
64
+ def self.query options={}
65
+ query = ""
66
+ case options[:type]
67
+ when :uri
68
+ path = options[:query]
69
+ when :relations
70
+ path = options[:query] + "/relations"
71
+ if options[:from_domains]
72
+ query = "includeDomain=#{options[:from_domains]}"
73
+ end
74
+ when :related_by
75
+ if options[:uri]
76
+ path = options[:query] + "/related/entities"
77
+ query = "uri=#{escape(options[:uri])}"
78
+ else
79
+ path = options[:query] + "/relations"
80
+ if options[:verb]
81
+ path += "/#{options[:verb]}/#{escape(options[:value])}"
82
+ if options[:entity]
83
+ path += options[:entity].href
84
+ end
85
+ end
86
+ if options[:media]
87
+ query += "media=#{options[:media]}"
88
+ end
89
+ end
90
+ when :zeitgeist
91
+ path = "/zeitgeist/entities/" + options[:query]
92
+ when :related_medias
93
+ path = options[:query] + "/media/related"
94
+ if options[:entities]
95
+ query = options[:entities].map do |e|
96
+ "entityURI=#{e}&"
97
+ end
98
+ query = query.join
99
+ end
100
+ query += "type=#{options[:media]}" if options[:media]
101
+ when :from_media
102
+ path = "/media/entities"
103
+ query = "uri=#{escape(options[:uri])}&text=#{escape(options[:text])}"
104
+ when :search
105
+ path = "/entities/find"
106
+ query = "name=#{escape(options[:query])}"
107
+ when :prefix
108
+ path = "/entities/find"
109
+ query = "prefix=#{escape(options[:query])}"
110
+ else
111
+ raise ArgumentError, "unexpected type #{ options[:type] }"
112
+ end
113
+ query = nil if query.empty?
114
+ uri = URI::HTTP.build :host => self.api_host, :path => path + '.json', :query => query
115
+ # puts "getting #{ uri }"
116
+ response = Net::HTTP.get_response(uri)
117
+ raise Error.new("unexpected http response: #{ response.code }") unless response.code == "200"
118
+ @@source_url = @@source_host + uri.request_uri
119
+ response.body
120
+ end
121
+
122
+ def self.escape text
123
+ text ? CGI.escape(text.to_s) : ''
124
+ end
125
+
126
+ private
127
+
128
+ def self.validate_host host
129
+ host = host.to_s
130
+ begin
131
+ URI::HTTP.build(:host => host)
132
+ host
133
+ rescue URI::InvalidComponentError
134
+ raise ArgumentError.new("Invalid host name specified (#{host}). Use something like 'api.evri.com'")
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,144 @@
1
+ require 'test/unit'
2
+ require 'lib/evri'
3
+ require 'mocha'
4
+
5
+ class TestEntity < Test::Unit::TestCase
6
+ BARACK_ID = "/person/barack-obama-0x16f69"
7
+ MICHELLE_ID = "person/michelle-obama-0x4c6e8" # Works without leading slash
8
+ MCCAIN_ID = "/person/john-mccain-0x2a2a7"
9
+
10
+ def setup
11
+ @obama = Evri::Entity.find BARACK_ID
12
+ @michelle = Evri::Entity.find MICHELLE_ID
13
+ @mccain = Evri::Entity.find MCCAIN_ID
14
+ end
15
+
16
+ def test_failed_http_get_raises_good_error
17
+ bad_response = stub(:code => "500")
18
+ Net::HTTP.expects(:get_response).returns(bad_response)
19
+ assert_raises(Evri::Error) { @obama.relations }
20
+ end
21
+
22
+ # Ensure that when we search for Barack, we get the @obama and @michelle objects returned
23
+ def test_class_find
24
+ results = Evri::Entity.search "obama"
25
+ [@obama, @michelle].each do |person|
26
+ assert results.include?(person), "Expected search to contain #{ person }"
27
+ end
28
+ end
29
+
30
+ def test_find_raises_for_missing_ids
31
+ assert_raises(Evri::EntityNotFound) { Evri::Entity.find "crap" }
32
+ end
33
+
34
+ def test_failed_search_returns_empty_array
35
+ assert Evri::Entity.search("asdfasdfasdfasdfjlskdjflkasdjfkljasdklfjkladsjfklajsdl;kfjlaksdjfadklsjfkladsjlfkjasdfkljas#").empty?
36
+ end
37
+
38
+ def test_class_find_with_prefix
39
+ results = Evri::Entity.search_by_prefix "ob"
40
+ assert results.include?(@obama), "Expected search to contain #{ @obama }"
41
+ end
42
+
43
+ def test_name
44
+ assert_equal @obama.name, "Barack Obama"
45
+ end
46
+
47
+ def test_id
48
+ assert_equal @obama.id, BARACK_ID
49
+ end
50
+
51
+ def test_properties
52
+ vandyk_parks = Evri::Entity.find "/person/van-dyke-parks-0x16b10"
53
+ assert vandyk_parks.info(:occupation).include?("Composer")
54
+ end
55
+
56
+ def test_properties_from_search
57
+ vandyk_parks = Evri::Entity.search_by_prefix("van dyke parks").first
58
+ assert vandyk_parks.info(:occupation).include?("Composer")
59
+ end
60
+
61
+ def test_properties_from_related_by
62
+ loaded_entity = @obama.related_by(:verb => :kill).first
63
+ assert loaded_entity.info(:name)
64
+ end
65
+
66
+ def test_relations
67
+ assert @obama.relations.find { |r| r.name == "US Politician" }
68
+ assert @obama.relations.find { |r| r.href == "#{@obama.href}/relations/facet/politician" }
69
+ end
70
+
71
+ def test_related_by_from_uri
72
+ # Sends right data, but bug in API prevents it from knowing about the URI
73
+ # assert !@obama.related_by(:uri => "www.boston.com/news/nation/articles/2008/10/23/obama_takes_campaign_break_to_visit_ill_grandmother/?rss_id=Boston.com+--+Latest+news")
74
+ end
75
+
76
+ def test_relations_from_domains
77
+ assert !@obama.relations(:from => "time.com").empty?
78
+ assert !@obama.relations(:from => ["time.com", "nytimes.com"]).empty?
79
+ end
80
+
81
+ def test_relations_with_type
82
+ # TODO tests
83
+ @obama.related_by(:verb => :kill, :type => :image)
84
+ end
85
+
86
+ def test_relations_related_to
87
+ # TODO tests
88
+ @obama.related_by(:facet => :musical_artist)
89
+ @obama.related_by(:qt => "joined-by-0x78")
90
+ @mccain.related_by(:verb => :kill, :entity => @obama)
91
+ @obama.related_by(:facet => :politician, :entity => @mccain)
92
+ end
93
+
94
+ def test_source_url
95
+ dude = @obama.related_by(:facet => :politician).first
96
+ assert_equal "#{Evri.source_host}#{@obama.uri}/relations/facet/politician.json", dude.source_url
97
+ end
98
+
99
+ def test_media_related_to_entities_about_an_entity
100
+ # articles takes either entities or entity URIs
101
+ # NOTE: the plural of 'media' is 'media'
102
+ medias = @obama.articles(:entities => [@mccain, "/person/bill-ayers-0x27a65"])
103
+ assert medias.size > 1
104
+ end
105
+
106
+ def test_medias_with_type_of_image
107
+ image = @obama.images.first
108
+ %w( size title article_href mime_type thumbnail date content width url click_url height).each do |field|
109
+ assert image.send(field), "Expected #{ image.inspect }'s #{ field } field to be larger than zero"
110
+ end
111
+ %w( size width height url).each do |field|
112
+ assert image.thumbnail.send(field), "Expected #{ image.thumbnail.inspect }'s #{ field } field to be larger than zero"
113
+ end
114
+ end
115
+
116
+ def test_relations_loading
117
+ politician_relation = @obama.relations.find { |r| r.name == "US Politician" }
118
+ assert politician_relation.entities.include?(@mccain)
119
+ end
120
+
121
+ def test_relations_with_verb
122
+ entities = @obama.related_by(:verb => :attack)
123
+ assert entities.first.target_href.include?("attack")
124
+
125
+ assert @obama.related_by(:qt => "joined-by-0x78").find { |e| e.name == "Joe Biden" }
126
+
127
+ assert @obama.related_by(:facet => :politician).include?(@mccain)
128
+ end
129
+
130
+ def test_media
131
+ media = @obama.articles.first
132
+ # check for media.title, media.uri, etc
133
+ %w( title author published_at content href uri).each do |field|
134
+ assert media.send(field).size > 0, "Expected #{ media.inspect }'s #{ field } field to be larger than zero"
135
+ end
136
+ end
137
+
138
+ def test_find_by_media
139
+ uri = "http://www.reuters.com/article/industryNews/idUSTRE4981RO20081009"
140
+ dreamworks = Evri::Entity.find "/organization/dreamworks-0x3c510"
141
+ entities = Evri::Entity.from_media(:uri => uri, :text => "Dreamworks")
142
+ assert entities.include?(dreamworks)
143
+ end
144
+ end
data/test/test_evri.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require 'lib/evri'
3
+ require 'mocha'
4
+
5
+ class TestModuleEvri < Test::Unit::TestCase
6
+ def test_setting_invalid_new_api_host
7
+ remember_original_settings(:api_host) do
8
+ assert_raise(ArgumentError) { Evri.api_host = "http://slashdot.org" }
9
+ assert_raise(ArgumentError) { Evri.api_host = "Joe's Cat" }
10
+ assert_raise(ArgumentError) { Evri.api_host = 3 }
11
+ end
12
+ end
13
+
14
+ def test_setting_new_api_host
15
+ remember_original_settings(:api_host) do
16
+ Evri.api_host = "new.api.evri.com"
17
+ assert_equal Evri.api_host, "new.api.evri.com"
18
+ end
19
+ end
20
+
21
+ def test_source_host
22
+ remember_original_settings(:source_host) do
23
+ Evri.source_host = "new.api.evri.com"
24
+ assert_equal Evri.source_host, "new.api.evri.com"
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def remember_original_settings method
31
+ original = Evri.send method
32
+ yield ensure Evri.send"#{method}=", original
33
+ end
34
+ end
35
+
@@ -0,0 +1,10 @@
1
+ require 'test/unit'
2
+ require 'lib/evri'
3
+
4
+ class TestMedia < Test::Unit::TestCase
5
+ BARACK_ID = "person/barack-obama-0x16f69"
6
+
7
+ def test_this
8
+ end
9
+
10
+ end
@@ -0,0 +1,19 @@
1
+ require 'test/unit'
2
+ require 'lib/evri'
3
+
4
+ class TestZeitgeist < Test::Unit::TestCase
5
+ BARACK_ID = "person/barack-obama-0x16f69"
6
+
7
+ def setup
8
+ @obama = Evri::Entity.find BARACK_ID
9
+ end
10
+
11
+ def test_popular_person
12
+ assert Evri::Zeitgeist.popular_person.include?(@obama)
13
+ end
14
+
15
+ def test_falling_product
16
+ # just check to see that the first falling product's name is not blank.
17
+ assert Evri::Zeitgeist.falling_product.first.name.size > 0
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: joevandyk-evri
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.01"
5
+ platform: ruby
6
+ authors:
7
+ - Joe Van Dyk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-27 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.7.0
23
+ version:
24
+ description: A beautiful API that wraps the RESTful services provided by evri.com.
25
+ email:
26
+ - joe@@fixieconsulting.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
35
+ files:
36
+ - History.txt
37
+ - Manifest.txt
38
+ - README.txt
39
+ - Rakefile
40
+ - TODO
41
+ - lib/evri.rb
42
+ - lib/evri/entity.rb
43
+ - lib/evri/media.rb
44
+ - lib/evri/relation.rb
45
+ - lib/evri/zeitgeist.rb
46
+ - test/test_entity.rb
47
+ - test/test_evri.rb
48
+ - test/test_media.rb
49
+ - test/test_zeitgeist.rb
50
+ has_rdoc: true
51
+ homepage: http://github.com/joevandyk/evri-api
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --main
55
+ - README.txt
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project: evri
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: A beautiful API that wraps the RESTful services provided by evri.com.
77
+ test_files:
78
+ - test/test_media.rb
79
+ - test/test_zeitgeist.rb
80
+ - test/test_entity.rb
81
+ - test/test_evri.rb