ruby-oembed 0.8.1 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/.yardopts ADDED
@@ -0,0 +1,4 @@
1
+ --readme README.rdoc
2
+ --markup rdoc
3
+ --exclude tasks
4
+ lib/**/*.rb - CHANGELOG.rdoc LICENSE
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,17 @@
1
1
  = CHANGELOG
2
2
 
3
+ == 0.8.3 - 26 June 2011
4
+
5
+ * Fixing a circular dependency introduced during my recent Jeweler upgrade. (Marcos Wright Kuhns)
6
+
7
+ == 0.8.2 - 25 June 2011
8
+
9
+ * Added built-in providers for Instagram, Slideshare and Yfrog
10
+ * Improved support (and error detection) for custom OEmbed::Formatter backends. (Marcos Wright Kuhns)
11
+ * DRYed up OEmbed::Formatter::JSON and XML methods into OEmbed::Formatter::Base (Marcos Wright Kuhns)
12
+ * More consistently raise an OEmbed::Parse error if there is any sort of problem parsing the server response, whether it's an expected error type or not. (Marcos Wright Kuhns)
13
+ * Added in-code comments about the oohEmbed service becoming part of Embed.ly
14
+
3
15
  == 0.8.1 - 27 February 2011
4
16
 
5
17
  * Removed all dependencies on external gems. XML is parsed using REXML and JSON can be parsed using YAML thanks to the convert_json_to_yaml method borrowed from Rails! (Marcos Wright Kuhns)
@@ -17,7 +29,7 @@
17
29
  * Provider#url and Provider#name will be removed at some point in the future.
18
30
  * All direct raw calls will be made private at some point in the future (i.e. Provider#raw, Providers#raw, and ProviderDiscovery#raw)
19
31
 
20
- == 0.8.0 - Unreleased
32
+ == 0.8.0 - Not Publicly Released
21
33
 
22
34
  * Added OEmbed::Formatter Backends, to remove the dependency on the json gem and make adding support for other parsing libraries easier. This also fixes GitHub Issue =1. (Marcos Wright Kuhns)
23
35
  * Catch invalid endpoint URLs on OEmbed::Provider instantiation. (Marcos Wright Kuhns)
data/Gemfile CHANGED
@@ -1,4 +1,9 @@
1
- # A sample Gemfile
2
- source "http://rubygems.org"
3
- gem 'jeweler'
4
- gemspec
1
+ source :rubygems
2
+
3
+ group :development, :test do
4
+ gem 'jeweler'
5
+ gem 'rake'
6
+ gem 'json'
7
+ gem 'xml-simple'
8
+ gem 'rspec', '>=2.0'
9
+ end
data/Gemfile.lock CHANGED
@@ -1,31 +1,23 @@
1
- PATH
2
- remote: .
3
- specs:
4
- ruby-oembed (0.8.0)
5
-
6
1
  GEM
7
2
  remote: http://rubygems.org/
8
3
  specs:
9
4
  diff-lcs (1.1.2)
10
- gemcutter (0.6.1)
11
5
  git (1.2.5)
12
- jeweler (1.4.0)
13
- gemcutter (>= 0.1.0)
6
+ jeweler (1.6.2)
7
+ bundler (~> 1.0)
14
8
  git (>= 1.2.5)
15
- rubyforge (>= 2.0.0)
16
- json (1.5.1)
17
- json_pure (1.4.6)
18
- rspec (2.5.0)
19
- rspec-core (~> 2.5.0)
20
- rspec-expectations (~> 2.5.0)
21
- rspec-mocks (~> 2.5.0)
22
- rspec-core (2.5.1)
23
- rspec-expectations (2.5.0)
9
+ rake
10
+ json (1.5.3)
11
+ rake (0.9.2)
12
+ rspec (2.6.0)
13
+ rspec-core (~> 2.6.0)
14
+ rspec-expectations (~> 2.6.0)
15
+ rspec-mocks (~> 2.6.0)
16
+ rspec-core (2.6.4)
17
+ rspec-expectations (2.6.0)
24
18
  diff-lcs (~> 1.1.2)
25
- rspec-mocks (2.5.0)
26
- rubyforge (2.0.4)
27
- json_pure (>= 1.1.7)
28
- xml-simple (1.0.14)
19
+ rspec-mocks (2.6.0)
20
+ xml-simple (1.1.0)
29
21
 
30
22
  PLATFORMS
31
23
  ruby
@@ -33,5 +25,6 @@ PLATFORMS
33
25
  DEPENDENCIES
34
26
  jeweler
35
27
  json
28
+ rake
36
29
  rspec (>= 2.0)
37
- ruby-oembed!
30
+ xml-simple
data/README.rdoc CHANGED
@@ -43,7 +43,7 @@ Last but not least, ruby-oembed supports both {oohEmbed}[http://oohembed.com] an
43
43
 
44
44
  == Formatters
45
45
 
46
- This library works wonderfully on it's on, but can get a speed boost by using 3rd party libraries to parse oEmbed data. To use a 3rd party Formatter, just be sure to require the library _before_ ruby-oembed.
46
+ This library works wonderfully on its own, but can get a speed boost by using 3rd party libraries to parse oEmbed data. To use a 3rd party Formatter, just be sure to require the library _before_ ruby-oembed.
47
47
 
48
48
  require 'json'
49
49
  require 'xmlsimple'
@@ -59,7 +59,7 @@ The following, optional, backends are currently supported:
59
59
 
60
60
  = Lend a Hand
61
61
 
62
- Code for the ruby-oembed library is {hosted on GitHub}[http://github.com/judofyr/ruby-oembed].
62
+ Code for the ruby-oembed library is {hosted on GitHub}[https://github.com/judofyr/ruby-oembed].
63
63
 
64
64
  # Get the code.
65
65
  git clone git://github.com/judofyr/ruby-oembed.git
@@ -70,9 +70,25 @@ Code for the ruby-oembed library is {hosted on GitHub}[http://github.com/judofyr
70
70
  # Run the tests.
71
71
  rake specs
72
72
 
73
- If you encounter any bug, feel free to {create an Issue}[http://github.com/judofyr/ruby-oembed/issues].
73
+ If you encounter any bug, feel free to {create an Issue}[https://github.com/judofyr/ruby-oembed/issues].
74
74
 
75
- To submit a patch, please {fork}[http://help.github.com/forking/] the library and commit your changes along with relevant tests. Once you're happy with the changes, {send a pull request}[http://help.github.com/pull-requests/].
75
+ We gladly accept pull requests! Just {fork}[http://help.github.com/forking/] the library and commit your changes along with relevant tests. Once you're happy with the changes, {send a pull request}[http://help.github.com/pull-requests/].
76
+
77
+ We do our best to {keep our tests green}[http://travis-ci.org/metavida/ruby-oembed] https://secure.travis-ci.org/metavida/ruby-oembed.png
78
+
79
+ = Contributors
80
+
81
+ Thanks to the following people for their contributions to this gem, both large and small:
82
+
83
+ * {Aris Bartee}[https://github.com/arisbartee]
84
+ * {Todd Fisher}[https://github.com/taf2]
85
+ * {Hans de Graff}[https://github.com/graaff]
86
+ * {Magnus Holm}[https://github.com/judofyr] (original author of this library)
87
+ * {Alex Kessinger}[https://github.com/voidfiles]
88
+ * {Ryan Richards}[https://github.com/rrichards]
89
+ * {Colin Shea}[https://github.com/evaryont]
90
+ * {Kyle Slattery}[https://github.com/kyleslattery]
91
+ * {Marcos Wright-Kuhns}[https://github.com/metavida] (current maintainer)
76
92
 
77
93
  = License
78
94
 
data/Rakefile CHANGED
@@ -14,9 +14,6 @@ begin
14
14
  gemspec.license = "MIT"
15
15
  gemspec.email = "arisbartee@gmail.com"
16
16
  gemspec.authors = ["Magnus Holm","Alex Kessinger","Aris Bartee","Marcos Wright Kuhns"]
17
- gemspec.add_development_dependency("json")
18
- gemspec.add_development_dependency("xml-simple")
19
- gemspec.add_development_dependency("rspec", ">=2.0")
20
17
 
21
18
  gemspec.rdoc_options = %W(
22
19
  --main README.rdoc
@@ -26,7 +23,7 @@ begin
26
23
  CHANGELOG.rdoc
27
24
  )
28
25
  end
29
- Jeweler::GemcutterTasks.new
26
+ Jeweler::RubygemsDotOrgTasks.new
30
27
  rescue LoadError
31
28
  puts "Jeweler not available. Install it with: gem install jeweler"
32
29
  end
@@ -1,3 +1,4 @@
1
+ require 'oembed/formatter/base'
1
2
  require 'oembed/formatter/json'
2
3
  require 'oembed/formatter/xml'
3
4
 
@@ -37,19 +38,23 @@ module OEmbed
37
38
  def decode(format, value)
38
39
  supported?(format)
39
40
 
40
- case format.to_s
41
- when 'json'
42
- begin
43
- JSON.decode(value)
44
- rescue JSON.backend::ParseError
45
- raise OEmbed::ParseError, $!.message
46
- end
47
- when 'xml'
48
- begin
49
- XML.decode(value)
50
- rescue XML.backend::ParseError
51
- raise OEmbed::ParseError, $!.message
41
+ begin
42
+ case format.to_s
43
+ when 'json'
44
+ begin
45
+ JSON.decode(value)
46
+ rescue JSON.backend.parse_error
47
+ raise OEmbed::ParseError, $!.message
48
+ end
49
+ when 'xml'
50
+ begin
51
+ XML.decode(value)
52
+ rescue XML.backend.parse_error
53
+ raise OEmbed::ParseError, $!.message
54
+ end
52
55
  end
56
+ rescue
57
+ raise OEmbed::ParseError, "#{$!.class}: #{$!.message}"
53
58
  end
54
59
  end
55
60
 
@@ -91,7 +96,7 @@ module OEmbed
91
96
  !actual.detect { |key, value| value.to_s != expected[key].to_s }
92
97
  end
93
98
 
94
- end
99
+ end # self
95
100
 
96
101
  end
97
102
  end
@@ -0,0 +1,108 @@
1
+ module OEmbed
2
+ module Formatter
3
+ # These are methods that are shared by the OEmbed::Formatter sub-classes
4
+ # (i.e. OEmbed::Formatter:JSON and OEmbed::Formatter::XML).
5
+ module Base
6
+
7
+ # Returns true if there is a valid backend. Otherwise, raises OEmbed::FormatNotSupported
8
+ def supported?
9
+ !!backend
10
+ end
11
+
12
+ # Parses a String or IO and convert it into an Object
13
+ def decode(value)
14
+ backend.decode(value)
15
+ end
16
+
17
+ # Given either a String (the name of the backend to use) or an Object (which
18
+ # must respond to the decode method), sets the current backend. Raises a LoadError
19
+ # if the given backend cannot be loaded (e.g. an invalid String name, or the
20
+ # decode method doesn't work properly).
21
+ # OEmbed::Formatter::XML.backend = 'REXML'
22
+ # OEmbed::Formatter::JSON.backend = MyCustomJsonDecoder.new
23
+ def backend=(new_backend)
24
+ new_backend_obj = case new_backend
25
+ when String
26
+ already_required = false
27
+ begin
28
+ already_required = self::Backends.const_defined?(new_backend, false)
29
+ rescue ArgumentError # we're dealing with ruby < 1.9 where const_defined? only takes 1 argument, but behaves the way we want it to.
30
+ already_required = self::Backends.const_defined?(new_backend)
31
+ rescue NameError # no backends have been loaded yet
32
+ already_required = false
33
+ end
34
+
35
+ require "oembed/formatter/#{backend_path}/#{new_backend.downcase}" unless already_required
36
+ self::Backends.const_get(new_backend)
37
+ else
38
+ new_backend
39
+ end
40
+
41
+ test_backend(new_backend_obj)
42
+
43
+ @backend = new_backend_obj
44
+
45
+ rescue
46
+ raise LoadError, "There was an error setting the backend: #{new_backend.inspect} - #{$!.message}"
47
+ end
48
+
49
+ # Perform a set of operations using a backend other than the current one.
50
+ # OEmbed::Formatter::XML.with_backend('XmlSimple') do
51
+ # OEmbed::Formatter::XML.decode(xml_value)
52
+ # end
53
+ def with_backend(new_backend)
54
+ old_backend, self.backend = backend, new_backend
55
+ yield
56
+ ensure
57
+ self.backend = old_backend
58
+ end
59
+
60
+ private
61
+
62
+ # Makes sure the given backend can correctly parse values using the decode
63
+ # method.
64
+ def test_backend(new_backend)
65
+ raise LoadError, "The given backend must respond to the decode method: #{new_backend.inspect}" unless new_backend.respond_to?(:decode)
66
+
67
+ expected = {
68
+ "version"=>1.0,
69
+ "string"=>"test",
70
+ "int"=>42,
71
+ "html"=>"<i>Cool's</i>\n the \"word\"!",
72
+ }
73
+
74
+ actual = new_backend.decode(test_value)
75
+
76
+ # For the test to be true the actual output Hash should have the
77
+ # exact same list of keys _and_ the values should be the same
78
+ # if we ignoring typecasting.
79
+ if(
80
+ actual.keys.sort != expected.keys.sort ||
81
+ actual.detect { |key, value| value.to_s != expected[key].to_s }
82
+ )
83
+ msg = new_backend.decode_fail_msg rescue nil
84
+ msg ||= "The given backend failed to decode the test string correctly"
85
+ raise LoadError, "#{msg}: #{new_backend.inspect}"
86
+ end
87
+ end
88
+
89
+ # Must return a String representing the sub-directory where in-library
90
+ # backend rb files live (e.g. 'json/backends')
91
+ def backend_path
92
+ raise "This method must be defined by a format-specific OEmbed::Formatter sub-class."
93
+ end
94
+
95
+ # Must return a String that when parsed by a backend returns the following ruby Hash
96
+ # {
97
+ # "version"=>1.0,
98
+ # "string"=>"test",
99
+ # "int"=>42,
100
+ # "html"=>"<i>Cool's</i>\n the \"word\"!",
101
+ # }
102
+ def test_value
103
+ raise "This method must be defined by a format-specific OEmbed::Formatter sub-class."
104
+ end
105
+
106
+ end # SharedMethods
107
+ end
108
+ end
@@ -6,16 +6,7 @@ module OEmbed
6
6
  DECODERS = %w(ActiveSupportJSON JSONGem Yaml)
7
7
 
8
8
  class << self
9
-
10
- # Returns true if there is a valid JSON backend. Otherwise, raises OEmbed::FormatNotSupported
11
- def supported?
12
- !!backend
13
- end
14
-
15
- # Parses a JSON string or IO and convert it into an object
16
- def decode(json)
17
- backend.decode(json)
18
- end
9
+ include ::OEmbed::Formatter::Base
19
10
 
20
11
  # Returns the current JSON backend.
21
12
  def backend
@@ -24,32 +15,6 @@ module OEmbed
24
15
  @backend
25
16
  end
26
17
 
27
- def backend=(name)
28
- if name.is_a?(Module)
29
- @backend = name
30
- else
31
- already_required = false
32
- begin
33
- already_required = OEmbed::Formatter::JSON::Backends.const_defined?(name, false)
34
- rescue ArgumentError # we're dealing with ruby < 1.9 where const_defined? only takes 1 argument, but behaves the way we want it to.
35
- already_required = OEmbed::Formatter::JSON::Backends.const_defined?(name)
36
- rescue NameError # no backends have been loaded yet
37
- already_required = false
38
- end
39
-
40
- require "oembed/formatter/json/backends/#{name.to_s.downcase}" unless already_required
41
- @backend = OEmbed::Formatter::JSON::Backends::const_get(name)
42
- end
43
- @parse_error = @backend::ParseError
44
- end
45
-
46
- def with_backend(name)
47
- old_backend, self.backend = backend, name
48
- yield
49
- ensure
50
- self.backend = old_backend
51
- end
52
-
53
18
  def set_default_backend
54
19
  DECODERS.find do |name|
55
20
  begin
@@ -62,7 +27,19 @@ module OEmbed
62
27
  end
63
28
  end
64
29
 
65
- end
30
+ private
31
+
32
+ def backend_path
33
+ 'json/backends'
34
+ end
35
+
36
+ def test_value
37
+ <<-JSON
38
+ {"version":"1.0", "string":"test", "int":42,"html":"<i>Cool's</i>\\n the \\"word\\"\\u0021"}
39
+ JSON
40
+ end
41
+
42
+ end # self
66
43
 
67
44
  end # JSON
68
45
  end
@@ -6,23 +6,23 @@ module OEmbed
6
6
  module JSON
7
7
  module Backends
8
8
  module ActiveSupportJSON
9
- ParseError = ::ActiveSupport::JSON.parse_error
10
9
  extend self
11
10
 
12
11
  # Parses a JSON string or IO and convert it into an object.
13
12
  def decode(json)
14
13
  ::ActiveSupport::JSON.decode(json)
15
14
  end
15
+
16
+ def decode_fail_msg
17
+ "The version of ActiveSupport::JSON you have installed isn't parsing JSON like ruby-oembed expected."
18
+ end
19
+
20
+ def parse_error
21
+ ::ActiveSupport::JSON.parse_error
22
+ end
16
23
 
17
24
  end
18
25
  end
19
26
  end
20
27
  end
21
28
  end
22
-
23
- # Only allow this backend if it parses JSON strings the way we expect it to
24
- begin
25
- raise unless OEmbed::Formatter.test_backend(OEmbed::Formatter::JSON::Backends::ActiveSupportJSON)
26
- rescue
27
- raise LoadError, "The version of ActiveSupport::JSON you have installed isn't parsing JSON like ruby-oembed expected."
28
- end
@@ -6,7 +6,6 @@ module OEmbed
6
6
  module JSON
7
7
  module Backends
8
8
  module JSONGem
9
- ParseError = ::JSON::ParserError
10
9
  extend self
11
10
 
12
11
  # Parses a JSON string or IO and convert it into an object.
@@ -16,16 +15,17 @@ module OEmbed
16
15
  end
17
16
  ::JSON.parse(json)
18
17
  end
18
+
19
+ def decode_fail_msg
20
+ "The version of the json library you have installed isn't parsing JSON like ruby-oembed expected."
21
+ end
22
+
23
+ def parse_error
24
+ ::JSON::ParserError
25
+ end
19
26
 
20
27
  end
21
28
  end
22
29
  end
23
30
  end
24
31
  end
25
-
26
- # Only allow this backend if it parses JSON strings the way we expect it to
27
- begin
28
- raise unless OEmbed::Formatter.test_backend(OEmbed::Formatter::JSON::Backends::JSONGem)
29
- rescue
30
- raise LoadError, "The version of the json library you have installed isn't parsing JSON like ruby-oembed expected."
31
- end