oembed 0.0.1 → 0.1.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.
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.2"
4
+ - "1.9.3"
5
+ script: bundle exec rspec spec
data/README.md CHANGED
@@ -40,7 +40,6 @@ Lets start with a simple example. It will be a client for the awesome
40
40
  ```ruby
41
41
  require 'oembed'
42
42
 
43
- # Speaker Deck client
44
43
  class SpeakerDeck
45
44
  include Oembed::Client
46
45
 
@@ -55,12 +54,12 @@ That's it. Now you can use a method `#fetch` to get data from oEmbed enpoint of
55
54
 
56
55
  ```ruby
57
56
  client = SpeakerDeck.new
58
- p client.fetch('https://speakerdeck.com/u/soulim/p/rails')
57
+ client.fetch('https://speakerdeck.com/u/soulim/p/rails')
59
58
  ```
60
59
 
61
60
  The method `#fetch` will return a hash with oEmded data.
62
61
 
63
- ```json
62
+ ```ruby
64
63
  {
65
64
  "type" => "rich",
66
65
  "version" => 1.0,
@@ -70,12 +69,70 @@ The method `#fetch` will return a hash with oEmded data.
70
69
  "author_name" => "Alex Soulim",
71
70
  "author_url" => "https://speakerdeck.com/u/soulim",
72
71
  "html" => "<iframe style=\"border:0; padding:0; margin:0; background:transparent;\" mozallowfullscreen=\"true\" webkitallowfullscreen=\"true\" frameBorder=\"0\" allowTransparency=\"true\" id=\"presentation_frame_4fd3874cebb4b2001f0277e5\" src=\"//speakerdeck.com/embed/4fd3874cebb4b2001f0277e5\" width=\"710\" height=\"596\"></iframe>\n",
73
- "width" => 710,
72
+ "width" => 710,q
74
73
  "height" => 596
75
74
  }
76
75
  ```
77
76
 
78
- At the moment `oembed` gem supports the JSON format only. I will fix it soon. Stay tuned! :)
77
+ `oembed` gem supports JSON and XML response formats. Here is an example of
78
+ client for XML endpoint.
79
+
80
+ ```ruby
81
+ require 'oembed'
82
+
83
+ class Flickr
84
+ include Oembed::Client
85
+
86
+ def endpoint_uri
87
+ 'http://www.flickr.com/services/oembed.xml'
88
+ end
89
+ end
90
+
91
+ client = Flickr.new
92
+ client.fetch('http://www.flickr.com/photos/alex_soulim/3593916989')
93
+ ```
94
+
95
+ It will return:
96
+
97
+ ```ruby
98
+ {
99
+ "type"=>"photo",
100
+ "title"=>"IMG_2072",
101
+ "author_name"=>"Alex Soulim", "author_url"=>"http://www.flickr.com/photos/alex_soulim/",
102
+ "width"=>"683",
103
+ "height"=>"1024",
104
+ "url"=>"http://farm4.staticflickr.com/3618/3593916989_3d8aa991ea_b.jpg",
105
+ "web_page"=>"http://www.flickr.com/photos/alex_soulim/3593916989/",
106
+ "thumbnail_url"=>"http://farm4.staticflickr.com/3618/3593916989_3d8aa991ea_s.jpg",
107
+ "thumbnail_width"=>"75",
108
+ "thumbnail_height"=>"75",
109
+ "web_page_short_url"=>"http://flic.kr/p/6tzLj2",
110
+ "license"=>"All Rights Reserved",
111
+ "license_id"=>"0",
112
+ "version"=>"1.0",
113
+ "cache_age"=>"3600",
114
+ "provider_name"=>"Flickr",
115
+ "provider_url"=>"http://www.flickr.com/"
116
+ }
117
+ ```
118
+
119
+ You can make requests with additional parameters. Let's build a client for
120
+ Instagram and use `:maxwidth` parameter.
121
+
122
+ ```ruby
123
+ require 'oembed'
124
+
125
+ class Instagram
126
+ include Oembed::Client
127
+
128
+ def endpoint_uri
129
+ 'http://api.instagram.com/oembed'
130
+ end
131
+ end
132
+
133
+ client = Instagram.new
134
+ client.fetch('http://instagr.am/p/BUG/', maxwidth: 300)
135
+ ```
79
136
 
80
137
  ## Contributing
81
138
 
@@ -84,3 +141,10 @@ At the moment `oembed` gem supports the JSON format only. I will fix it soon. St
84
141
  3. Commit your changes (`git commit -am 'Added some feature'`)
85
142
  4. Push to the branch (`git push origin my-new-feature`)
86
143
  5. Create new Pull Request
144
+
145
+ ## Supported Ruby versions [![Build Status](https://secure.travis-ci.org/soulim/oembed.png)](http://travis-ci.org/soulim/oembed) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/soulim/oembed)
146
+
147
+ This library is tested against the following Ruby implementations:
148
+
149
+ - Ruby 1.9.2
150
+ - Ruby 1.9.3
data/lib/oembed/client.rb CHANGED
@@ -12,16 +12,16 @@ module Oembed
12
12
  @http ||= Oembed::Http.new
13
13
  end
14
14
 
15
- def fetch(resource_uri)
15
+ def fetch(resource_uri, params = {})
16
16
  begin
17
- fetch!(resource_uri)
17
+ fetch!(resource_uri, params)
18
18
  rescue Oembed::Error
19
19
  nil
20
20
  end
21
21
  end
22
22
 
23
- def fetch!(resource_uri)
24
- uri = Oembed::Uri.new(endpoint_uri, resource_uri)
23
+ def fetch!(resource_uri, params = {})
24
+ uri = Oembed::Uri.new(endpoint_uri, resource_uri, params)
25
25
  http.get(uri.to_s)
26
26
  end
27
27
  end
data/lib/oembed/parser.rb CHANGED
@@ -29,7 +29,7 @@ module Oembed
29
29
  end
30
30
 
31
31
  def xml(body)
32
- raise NotImplementedError, 'XML parser is not implemented'
32
+ Oembed::XmlParser.parse(body)
33
33
  end
34
34
  end
35
35
  end
data/lib/oembed/uri.rb CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Oembed
4
4
  class Uri
5
- def initialize(endpoint_uri, resource_uri)
5
+ def initialize(endpoint_uri, resource_uri, params = {})
6
6
  @uri = URI.parse(endpoint_uri)
7
- @uri.query = URI.encode_www_form(url: resource_uri)
7
+ @uri.query = URI.encode_www_form(params.merge(url: resource_uri))
8
8
  end
9
9
 
10
10
  def to_s
@@ -1,3 +1,3 @@
1
1
  module Oembed
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ module Oembed
4
+ class XmlParser
5
+ def self.parse(source)
6
+ begin
7
+ document = REXML::Document.new(source)
8
+ traverse(document.root)
9
+ rescue REXML::ParseException => e
10
+ raise Oembed::ParserError.new(e), 'XML parser error'
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def self.traverse(node)
17
+ node.elements.to_a.inject({}) do |accum, elem|
18
+ accum[elem.name] = elem.has_elements? ? traverse(elem) : elem.text
19
+ accum
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/oembed.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  require 'net/http'
3
3
  require 'json'
4
4
  require 'uri'
5
+ require 'rexml/document'
5
6
 
6
7
  module Oembed
7
8
  class Error < StandardError; end
@@ -28,6 +29,7 @@ module Oembed
28
29
 
29
30
  autoload :Client, 'oembed/client'
30
31
  autoload :Parser, 'oembed/parser'
32
+ autoload :XmlParser, 'oembed/xml_parser'
31
33
  autoload :Http, 'oembed/http'
32
34
  autoload :Uri, 'oembed/uri'
33
35
  end
data/oembed.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["soulim@gmail.com"]
7
7
  gem.description = %q{A slim library to work with oEmbed format.}
8
8
  gem.summary = %q{A slim library to work with oEmbed format.}
9
- gem.homepage = "http://github.com/soulim/oembed"
9
+ gem.homepage = "http://soulim.github.com/oembed"
10
10
 
11
11
  gem.files = `git ls-files`.split($\)
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -13,6 +13,10 @@ describe Oembed::Client do
13
13
  end
14
14
 
15
15
  describe '#fetch' do
16
+ it 'should accept optional params' do
17
+ expect {subject.fetch(resource_uri, width: 100) }.not_to raise_error
18
+ end
19
+
16
20
  it 'should fetch the date using self.fetch!' do
17
21
  subject.should_receive(:fetch!)
18
22
  subject.fetch(resource_uri)
@@ -28,9 +32,13 @@ describe Oembed::Client do
28
32
  end
29
33
 
30
34
  describe '#fetch!' do
35
+ it 'should accept optional params' do
36
+ expect {subject.fetch(resource_uri, width: 100) }.not_to raise_error
37
+ end
38
+
31
39
  it 'should prepare request URI' do
32
- Oembed::Uri.should_receive(:new).with(endpoint_uri, resource_uri)
33
- subject.fetch!(resource_uri)
40
+ Oembed::Uri.should_receive(:new).with(endpoint_uri, resource_uri, width: 100)
41
+ subject.fetch!(resource_uri, width: 100)
34
42
  end
35
43
 
36
44
  it 'should get oEmbed data via HTTP client' do
@@ -1,9 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Oembed::Parser do
4
- let(:body) { { 'foo' => 'bar', 'baz' => 1 } }
5
- let(:json_body) { '{"foo":"bar","baz":1}' }
6
- let(:xml_body) { 'xml-body' }
4
+ let(:body) { { 'foo' => 'bar', 'baz' => "1" } }
5
+ let(:json_body) { '{"foo":"bar","baz":"1"}' }
6
+ let(:xml_body) do
7
+ %q(<?xml version="1.0" encoding="utf-8" standalone="yes"?>
8
+ <oembed>
9
+ <foo>bar</foo>
10
+ <baz>1</baz>
11
+ </oembed>)
12
+ end
7
13
 
8
14
  describe '#parse' do
9
15
  context 'when content type is JSON' do
@@ -13,10 +19,8 @@ describe Oembed::Parser do
13
19
  end
14
20
 
15
21
  context 'when content type is XML' do
16
- it 'should raise NotImplementedError' do
17
- expect {
18
- subject.parse(xml_body, 'text/xml')
19
- }.to raise_error(NotImplementedError)
22
+ it 'should return parsed body' do
23
+ expect(subject.parse(xml_body, 'text/xml')).to eq(body)
20
24
  end
21
25
  end
22
26
 
@@ -6,6 +6,16 @@ describe Oembed::Uri do
6
6
 
7
7
  subject { Oembed::Uri.new(endpoint_uri, resource_uri) }
8
8
 
9
+ it 'should accept optional params' do
10
+ uri = Oembed::Uri.new(endpoint_uri, resource_uri, width: 100)
11
+
12
+ query_string = URI.parse(uri.to_s).query
13
+ query_data = URI.decode_www_form(query_string)
14
+ query = Hash[query_data]
15
+
16
+ expect(query['width']).to eq('100')
17
+ end
18
+
9
19
  describe '#to_s' do
10
20
  it 'should return oEmbed URI string' do
11
21
  expect(subject.to_s).to eq('http://example.com/oembed?url=http%3A%2F%2Fexample.com%2Ffoo')
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Oembed::XmlParser do
4
+ let(:source) do
5
+ %q(<?xml version="1.0" encoding="utf-8" standalone="yes"?>
6
+ <oembed>
7
+ <foo>text</foo>
8
+ <bar>
9
+ <baz>1</baz>
10
+ </bar>
11
+ </oembed>)
12
+ end
13
+ let(:result) { { 'foo' => 'text', 'bar' => { 'baz' => '1' } } }
14
+
15
+ describe '.parse' do
16
+ it 'should parse given source' do
17
+ expect(Oembed::XmlParser.parse(source)).to eq(result)
18
+ end
19
+
20
+ context 'when there is an exception during parsing' do
21
+ before do
22
+ REXML::Document.stub(:new).and_raise(REXML::ParseException.new('error'))
23
+ end
24
+
25
+ it 'should raise Oembed::ParserError' do
26
+ expect {
27
+ Oembed::XmlParser.parse(source)
28
+ }.to raise_error(Oembed::ParserError)
29
+ end
30
+ end
31
+ end
32
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oembed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-13 00:00:00.000000000 Z
12
+ date: 2012-09-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -68,6 +68,7 @@ extra_rdoc_files: []
68
68
  files:
69
69
  - .gitignore
70
70
  - .rspec
71
+ - .travis.yml
71
72
  - Gemfile
72
73
  - LICENSE
73
74
  - README.md
@@ -78,14 +79,16 @@ files:
78
79
  - lib/oembed/parser.rb
79
80
  - lib/oembed/uri.rb
80
81
  - lib/oembed/version.rb
82
+ - lib/oembed/xml_parser.rb
81
83
  - oembed.gemspec
82
84
  - spec/oembed/client_spec.rb
83
85
  - spec/oembed/http_spec.rb
84
86
  - spec/oembed/parser_spec.rb
85
87
  - spec/oembed/uri_spec.rb
88
+ - spec/oembed/xml_parser_spec.rb
86
89
  - spec/oembed_spec.rb
87
90
  - spec/spec_helper.rb
88
- homepage: http://github.com/soulim/oembed
91
+ homepage: http://soulim.github.com/oembed
89
92
  licenses: []
90
93
  post_install_message:
91
94
  rdoc_options: []
@@ -114,5 +117,6 @@ test_files:
114
117
  - spec/oembed/http_spec.rb
115
118
  - spec/oembed/parser_spec.rb
116
119
  - spec/oembed/uri_spec.rb
120
+ - spec/oembed/xml_parser_spec.rb
117
121
  - spec/oembed_spec.rb
118
122
  - spec/spec_helper.rb