jameswilding-magpie 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/magpie.rb ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), 'magpie/search')
@@ -0,0 +1,55 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require File.join(File.dirname(__FILE__), 'tweet')
4
+
5
+ module Magpie
6
+ class Search
7
+
8
+ class SearchResponseError < StandardError; end
9
+
10
+ URI_BASE = 'http://search.twitter.com/search.atom?q='
11
+
12
+ attr_reader :uri, :results
13
+
14
+ def initialize(*terms)
15
+ @options = terms.last.is_a?(Hash) ? terms.pop : {}
16
+ xml = xml_search_result_for(terms)
17
+ @results = Tweet.map_from_xml(xml)
18
+ end
19
+
20
+ def inspect
21
+ "#<#{self.class}:#{object_id}>"
22
+ end
23
+
24
+ private
25
+ def xml_search_result_for(terms)
26
+ response = search_response_for(terms)
27
+ case response
28
+ when Net::HTTPOK
29
+ response.body
30
+ else
31
+ raise SearchResponseError,
32
+ "Net::HTTPOK expected but got #{response.class} when connecting to #{search_uri_for(terms)}."
33
+ end
34
+ end
35
+
36
+ def search_response_for(terms)
37
+ Net::HTTP.get_response(search_uri_for(terms))
38
+ end
39
+
40
+ def search_uri_for(terms)
41
+ uri = URI_BASE + sanitize_search_terms(terms) + search_uri_options
42
+ uri = URI.escape(uri)
43
+ @uri = URI.parse(uri)
44
+ end
45
+
46
+ def sanitize_search_terms(terms)
47
+ terms.map { |string| string.gsub(/ /, '+') }.join('+')
48
+ end
49
+
50
+ def search_uri_options
51
+ '&' + @options.map {|k,v| "#{k}=#{v}" }.join('&')
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,43 @@
1
+ require 'nokogiri'
2
+ require 'cgi'
3
+ require File.join(File.dirname(__FILE__), 'tweet/author')
4
+
5
+ module Magpie
6
+ class Tweet
7
+
8
+ attr_reader :author, :published_at, :uri, :xml
9
+
10
+ class << self
11
+
12
+ def map_from_xml(xml)
13
+ parse(xml).map { |tweet| new(tweet) }
14
+ end
15
+
16
+ private
17
+ def parse(xml)
18
+ Nokogiri::XML(xml).search('entry')
19
+ end
20
+
21
+ end
22
+
23
+ def initialize(xml)
24
+ @xml = xml
25
+ @content = xml.search('content').inner_html
26
+ @published_at = DateTime.parse(xml.search('published').inner_html)
27
+ @uri = xml.search('link[@rel="alternate"]').attr('href')
28
+ @author = Author.new(xml)
29
+ end
30
+
31
+ def inspect
32
+ "#<#{self.class}:#{object_id}>"
33
+ end
34
+
35
+ def body(escaped=true)
36
+ escaped ? CGI.unescapeHTML(@content) : @content
37
+ end
38
+
39
+ def id
40
+ @link.split('/').last
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ require 'nokogiri'
2
+
3
+ module Magpie
4
+ class Tweet
5
+ class Author
6
+
7
+ attr_reader :name, :uri, :image_uri
8
+
9
+ def initialize(xml)
10
+ @name = xml.search('author/name').inner_html
11
+ @uri = xml.search('author/uri').inner_html
12
+ @image_uri = xml.search('link[@rel="image"]').attr('href')
13
+ end
14
+
15
+ def inspect
16
+ "#<#{self.class}:#{object_id}>"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jameswilding-magpie
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Wilding
@@ -30,8 +30,11 @@ extensions: []
30
30
 
31
31
  extra_rdoc_files: []
32
32
 
33
- files: []
34
-
33
+ files:
34
+ - lib/magpie.rb
35
+ - lib/magpie/search.rb
36
+ - lib/magpie/tweet.rb
37
+ - lib/magpie/tweet/author.rb
35
38
  has_rdoc: false
36
39
  homepage: http://github.com/jameswilding/magpie/tree/master
37
40
  post_install_message: