muck-feedbag 0.6.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -0
- data/Rakefile +59 -0
- data/VERSION +1 -1
- data/bin/feedbag +28 -0
- data/feedbag.gemspec +8 -5
- data/lib/feedbag.rb +41 -29
- data/muck-feedbag.gemspec +62 -0
- data/test/atom_autodiscovery_test.rb +3 -9
- data/test/feedbag_test.rb +19 -0
- data/test/test_helper.rb +11 -0
- metadata +41 -16
- data/.gitignore +0 -30
- data/rails/init.rb +0 -1
data/ChangeLog
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
* 0.6 - Fri Mar 5 20:10:33 EST 2010
|
2
|
+
- Added bin/feedbag.
|
3
|
+
- Removed the args[:narrow] option, not really needed.
|
4
|
+
- Handle case where feed URLs contain GET parameters; add tests
|
5
|
+
by Patrick Reagan <patrick.reagan@viget.com>.
|
6
|
+
|
1
7
|
* 0.5.99 - Tue May 12 12:52:22 EDT 2009
|
2
8
|
- Added rails/init.rb to load easily on a Rails app.
|
3
9
|
|
data/Rakefile
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'rcov/rcovtask'
|
8
|
+
Rcov::RcovTask.new do |t|
|
9
|
+
t.libs << 'lib'
|
10
|
+
t.pattern = 'test/*_test.rb'
|
11
|
+
t.verbose = true
|
12
|
+
t.output_dir = 'coverage'
|
13
|
+
t.rcov_opts << '--exclude "gems/*"'
|
14
|
+
end
|
15
|
+
rescue LoadError
|
16
|
+
task :rcov do
|
17
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Test muck-feedbag.'
|
22
|
+
Rake::TestTask.new(:test) do |t|
|
23
|
+
t.libs << 'test'
|
24
|
+
t.test_files = FileList["test/feedbag_test.rb"]
|
25
|
+
t.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
task :test => :check_dependencies
|
29
|
+
task :default => :test
|
30
|
+
|
31
|
+
begin
|
32
|
+
require 'jeweler'
|
33
|
+
Jeweler::Tasks.new do |gem|
|
34
|
+
gem.name = "muck-feedbag"
|
35
|
+
gem.summary = "Fork of the feedbag gem."
|
36
|
+
gem.description = "This gem will return title and url for each feed discovered at a given url"
|
37
|
+
gem.email = "justin@tatemae.com"
|
38
|
+
gem.homepage = "http://github.com/tatemae/muck-feedbag"
|
39
|
+
gem.authors = ["Axiombox", "David Moreno", "Joel Duffin", "Justin Ball", "Fabien Penso"]
|
40
|
+
gem.add_development_dependency "shoulda"
|
41
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
42
|
+
end
|
43
|
+
Jeweler::GemcutterTasks.new
|
44
|
+
rescue LoadError
|
45
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
46
|
+
end
|
47
|
+
|
48
|
+
Rake::RDocTask.new do |rdoc|
|
49
|
+
if File.exist?('VERSION')
|
50
|
+
version = File.read('VERSION')
|
51
|
+
else
|
52
|
+
version = ""
|
53
|
+
end
|
54
|
+
|
55
|
+
rdoc.rdoc_dir = 'rdoc'
|
56
|
+
rdoc.title = "muck-feedbag #{version}"
|
57
|
+
rdoc.rdoc_files.include('README*')
|
58
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
59
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.1
|
data/bin/feedbag
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "feedbag"
|
5
|
+
|
6
|
+
def usage
|
7
|
+
%Q{
|
8
|
+
#{$0} <url 1> [<url 2> <url 3> ... <url n>]
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
if ARGV.empty?
|
13
|
+
puts usage
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
|
17
|
+
ARGV.each do |url|
|
18
|
+
puts "== #{url}:"
|
19
|
+
feeds = Feedbag.find url
|
20
|
+
if feeds.empty?
|
21
|
+
puts " no feeds found!"
|
22
|
+
else
|
23
|
+
feeds.each do |f|
|
24
|
+
puts " - #{f}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/feedbag.gemspec
CHANGED
@@ -2,19 +2,22 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{feedbag}
|
5
|
-
s.version = "0.
|
6
|
-
|
7
|
-
|
5
|
+
s.version = "0.6"
|
6
|
+
s.homepage = "http://axiombox.com/feedbag"
|
7
|
+
s.rubyforge_project = "feedbag"
|
8
8
|
|
9
9
|
s.authors = ["Axiombox", "David Moreno"]
|
10
|
-
s.date = %q{
|
10
|
+
s.date = %q{2010-03-05}
|
11
11
|
s.description = %q{Ruby's favorite feed auto-discoverty tool}
|
12
12
|
s.email = %q{david@axiombox.com}
|
13
13
|
s.extra_rdoc_files = ["README.markdown", "COPYING"]
|
14
|
-
s.files = ["lib/feedbag.rb", "benchmark/rfeedfinder_benchmark.rb"]
|
14
|
+
s.files = ["lib/feedbag.rb", "benchmark/rfeedfinder_benchmark.rb", "bin/feedbag"]
|
15
15
|
s.has_rdoc = true
|
16
16
|
s.rdoc_options = ["--main", "README.markdown"]
|
17
17
|
s.summary = %q{Ruby's favorite feed auto-discovery tool}
|
18
18
|
s.add_dependency("hpricot", '>= 0.6')
|
19
|
+
s.bindir = 'bin'
|
20
|
+
s.default_executable = %q{feedbag}
|
21
|
+
s.executables = ["feedbag"]
|
19
22
|
end
|
20
23
|
|
data/lib/feedbag.rb
CHANGED
@@ -21,9 +21,10 @@ require "hpricot"
|
|
21
21
|
require "open-uri"
|
22
22
|
require "net/http"
|
23
23
|
require 'timeout'
|
24
|
+
require 'iconv'
|
24
25
|
|
25
26
|
module Feedbag
|
26
|
-
Feed = Struct.new(:url, :title)
|
27
|
+
Feed = Struct.new(:url, :title, :human_url)
|
27
28
|
|
28
29
|
@content_types = [
|
29
30
|
'application/x.atom+xml',
|
@@ -41,6 +42,8 @@ module Feedbag
|
|
41
42
|
# use LWR::Simple.normalize some time
|
42
43
|
url_uri = URI.parse(url)
|
43
44
|
url = "#{url_uri.scheme or 'http'}://#{url_uri.host}#{url_uri.path}"
|
45
|
+
url << "?#{url_uri.query}" if url_uri.query
|
46
|
+
|
44
47
|
# hack:
|
45
48
|
url.sub!(/^feed:\/\//, 'http://')
|
46
49
|
|
@@ -69,31 +72,34 @@ module Feedbag
|
|
69
72
|
return self.add_feed(url, nil) if looks_like_feed? url
|
70
73
|
|
71
74
|
# check if feed_valid is avail
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
75
|
+
begin
|
76
|
+
require "feed_validator"
|
77
|
+
v = W3C::FeedValidator.new
|
78
|
+
v.validate_url(url)
|
79
|
+
return self.add_feed(url, nil) if v.valid?
|
80
|
+
rescue LoadError
|
81
|
+
# scoo
|
82
|
+
rescue REXML::ParseException
|
83
|
+
# usually indicates timeout
|
84
|
+
# TODO: actually find out timeout. use Terminator?
|
85
|
+
# $stderr.puts "Feed looked like feed but might not have passed validation or timed out"
|
86
|
+
rescue => ex
|
87
|
+
$stderr.puts "#{ex.class} error ocurred with: `#{url}': #{ex.message}"
|
88
|
+
end
|
88
89
|
|
89
90
|
begin
|
90
91
|
Timeout::timeout(10) do
|
91
92
|
open(url) do |f|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
93
|
+
content_type = f.content_type.downcase
|
94
|
+
if content_type == "application/octet-stream" # open failed
|
95
|
+
content_type = f.meta["content-type"].gsub(/;.*$/, '')
|
96
|
+
end
|
97
|
+
if @content_types.include?(content_type)
|
98
|
+
return self.add_feed(url, nil)
|
99
|
+
end
|
100
|
+
|
101
|
+
ic = Iconv.new('UTF-8//IGNORE', f.charset)
|
102
|
+
doc = Hpricot(ic.iconv(f.read))
|
97
103
|
|
98
104
|
if doc.at("base") and doc.at("base")["href"]
|
99
105
|
$base_uri = doc.at("base")["href"]
|
@@ -109,14 +115,20 @@ module Feedbag
|
|
109
115
|
end
|
110
116
|
end
|
111
117
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
+
(doc/"a").each do |a|
|
119
|
+
next unless a["href"]
|
120
|
+
if self.looks_like_feed?(a["href"]) and (a["href"] =~ /\// or a["href"] =~ /#{url_uri.host}/)
|
121
|
+
self.add_feed(a["href"], url, $base_uri, a["title"] || a.inner_html || a['alt'])
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
(doc/"a").each do |a|
|
126
|
+
next unless a["href"]
|
127
|
+
if self.looks_like_feed?(a["href"])
|
128
|
+
self.add_feed(a["href"], url, $base_uri, a["title"] || a.inner_html || a['alt'])
|
118
129
|
end
|
119
130
|
end
|
131
|
+
|
120
132
|
end
|
121
133
|
end
|
122
134
|
rescue Timeout::Error => err
|
@@ -161,7 +173,7 @@ module Feedbag
|
|
161
173
|
end
|
162
174
|
|
163
175
|
# verify url is really valid
|
164
|
-
$feeds.push(Feed.new(url, title)) unless $feeds.any? { |f| f.url == url }# if self._is_http_valid(URI.parse(url), orig_url)
|
176
|
+
$feeds.push(Feed.new(url, title, orig_url)) unless $feeds.any? { |f| f.url == url }# if self._is_http_valid(URI.parse(url), orig_url)
|
165
177
|
end
|
166
178
|
|
167
179
|
# not used. yet.
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{muck-feedbag}
|
8
|
+
s.version = "0.7.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Axiombox", "David Moreno", "Joel Duffin", "Justin Ball", "Fabien Penso"]
|
12
|
+
s.date = %q{2011-01-31}
|
13
|
+
s.default_executable = %q{feedbag}
|
14
|
+
s.description = %q{This gem will return title and url for each feed discovered at a given url}
|
15
|
+
s.email = %q{justin@tatemae.com}
|
16
|
+
s.executables = ["feedbag"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"ChangeLog",
|
19
|
+
"README.markdown",
|
20
|
+
"TODO"
|
21
|
+
]
|
22
|
+
s.files = [
|
23
|
+
"COPYING",
|
24
|
+
"ChangeLog",
|
25
|
+
"README.markdown",
|
26
|
+
"Rakefile",
|
27
|
+
"TODO",
|
28
|
+
"VERSION",
|
29
|
+
"benchmark/rfeedfinder_benchmark.rb",
|
30
|
+
"bin/feedbag",
|
31
|
+
"feedbag.gemspec",
|
32
|
+
"index.html",
|
33
|
+
"lib/feedbag.rb",
|
34
|
+
"muck-feedbag.gemspec",
|
35
|
+
"test/atom_autodiscovery_test.rb",
|
36
|
+
"test/feedbag_test.rb",
|
37
|
+
"test/test_helper.rb"
|
38
|
+
]
|
39
|
+
s.homepage = %q{http://github.com/tatemae/muck-feedbag}
|
40
|
+
s.require_paths = ["lib"]
|
41
|
+
s.rubygems_version = %q{1.3.7}
|
42
|
+
s.summary = %q{Fork of the feedbag gem.}
|
43
|
+
s.test_files = [
|
44
|
+
"test/atom_autodiscovery_test.rb",
|
45
|
+
"test/feedbag_test.rb",
|
46
|
+
"test/test_helper.rb"
|
47
|
+
]
|
48
|
+
|
49
|
+
if s.respond_to? :specification_version then
|
50
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
51
|
+
s.specification_version = 3
|
52
|
+
|
53
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
54
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
57
|
+
end
|
58
|
+
else
|
59
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
@@ -1,10 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require "#{File.dirname(__FILE__)}/../feedbag"
|
4
|
-
require "test/unit"
|
5
|
-
require "open-uri"
|
6
|
-
require "hpricot"
|
7
|
-
require "pp"
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
8
2
|
|
9
3
|
class AtomAutoDiscoveryTest < Test::Unit::TestCase
|
10
4
|
def test_autodisc
|
@@ -20,14 +14,14 @@ class AtomAutoDiscoveryTest < Test::Unit::TestCase
|
|
20
14
|
f = Feedbag.find url
|
21
15
|
|
22
16
|
assert_instance_of Array, f
|
23
|
-
|
17
|
+
f.size.should == 1, "Feedbag didn't find a feed on #{url} or found more than one"
|
24
18
|
|
25
19
|
puts " found #{f[0]}"
|
26
20
|
feed = Hpricot(open(f[0]))
|
27
21
|
|
28
22
|
(feed/"link").each do |l|
|
29
23
|
next unless l["rel"] == "alternate"
|
30
|
-
|
24
|
+
url.should == l["href"]
|
31
25
|
end
|
32
26
|
|
33
27
|
# ahora me voy al siguiente
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class FeedbagTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
test "Feedbag.feed? should know that an RSS url is a feed" do
|
6
|
+
rss_url = 'http://example.com/rss/'
|
7
|
+
Feedbag.stubs(:find).with(rss_url).returns([rss_url])
|
8
|
+
|
9
|
+
assert Feedbag.feed?(rss_url)
|
10
|
+
end
|
11
|
+
|
12
|
+
test "Feedbag.feed? should know that an RSS url with parameters is a feed" do
|
13
|
+
rss_url = "http://example.com/data?format=rss"
|
14
|
+
Feedbag.stubs(:find).with(rss_url).returns([rss_url])
|
15
|
+
|
16
|
+
assert Feedbag.feed?(rss_url)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,77 +1,102 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muck-feedbag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 1
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 7
|
9
|
+
- 1
|
10
|
+
version: 0.7.1
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
13
|
+
- Axiombox
|
14
|
+
- David Moreno
|
7
15
|
- Joel Duffin
|
8
16
|
- Justin Ball
|
17
|
+
- Fabien Penso
|
9
18
|
autorequire:
|
10
19
|
bindir: bin
|
11
20
|
cert_chain: []
|
12
21
|
|
13
|
-
date:
|
14
|
-
default_executable:
|
22
|
+
date: 2011-01-31 00:00:00 -07:00
|
23
|
+
default_executable: feedbag
|
15
24
|
dependencies:
|
16
25
|
- !ruby/object:Gem::Dependency
|
17
26
|
name: shoulda
|
18
|
-
|
19
|
-
|
20
|
-
|
27
|
+
prerelease: false
|
28
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
21
30
|
requirements:
|
22
31
|
- - ">="
|
23
32
|
- !ruby/object:Gem::Version
|
33
|
+
hash: 3
|
34
|
+
segments:
|
35
|
+
- 0
|
24
36
|
version: "0"
|
25
|
-
|
37
|
+
type: :development
|
38
|
+
version_requirements: *id001
|
26
39
|
description: This gem will return title and url for each feed discovered at a given url
|
27
40
|
email: justin@tatemae.com
|
28
|
-
executables:
|
29
|
-
|
41
|
+
executables:
|
42
|
+
- feedbag
|
30
43
|
extensions: []
|
31
44
|
|
32
45
|
extra_rdoc_files:
|
33
46
|
- ChangeLog
|
34
47
|
- README.markdown
|
48
|
+
- TODO
|
35
49
|
files:
|
36
|
-
- .gitignore
|
37
50
|
- COPYING
|
38
51
|
- ChangeLog
|
39
52
|
- README.markdown
|
53
|
+
- Rakefile
|
40
54
|
- TODO
|
41
55
|
- VERSION
|
42
56
|
- benchmark/rfeedfinder_benchmark.rb
|
57
|
+
- bin/feedbag
|
43
58
|
- feedbag.gemspec
|
44
59
|
- index.html
|
45
60
|
- lib/feedbag.rb
|
46
|
-
-
|
61
|
+
- muck-feedbag.gemspec
|
47
62
|
- test/atom_autodiscovery_test.rb
|
63
|
+
- test/feedbag_test.rb
|
64
|
+
- test/test_helper.rb
|
48
65
|
has_rdoc: true
|
49
66
|
homepage: http://github.com/tatemae/muck-feedbag
|
50
67
|
licenses: []
|
51
68
|
|
52
69
|
post_install_message:
|
53
|
-
rdoc_options:
|
54
|
-
|
70
|
+
rdoc_options: []
|
71
|
+
|
55
72
|
require_paths:
|
56
73
|
- lib
|
57
74
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
58
76
|
requirements:
|
59
77
|
- - ">="
|
60
78
|
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
61
82
|
version: "0"
|
62
|
-
version:
|
63
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
64
85
|
requirements:
|
65
86
|
- - ">="
|
66
87
|
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
67
91
|
version: "0"
|
68
|
-
version:
|
69
92
|
requirements: []
|
70
93
|
|
71
94
|
rubyforge_project:
|
72
|
-
rubygems_version: 1.3.
|
95
|
+
rubygems_version: 1.3.7
|
73
96
|
signing_key:
|
74
97
|
specification_version: 3
|
75
98
|
summary: Fork of the feedbag gem.
|
76
99
|
test_files:
|
77
100
|
- test/atom_autodiscovery_test.rb
|
101
|
+
- test/feedbag_test.rb
|
102
|
+
- test/test_helper.rb
|
data/.gitignore
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
*.swp
|
2
|
-
**/*.pid
|
3
|
-
log/*.log
|
4
|
-
log/*.pid
|
5
|
-
tmp
|
6
|
-
.DS_Store
|
7
|
-
public/cache/**/*
|
8
|
-
public/system/**/*
|
9
|
-
doc/**/*
|
10
|
-
db/*.sqlite3
|
11
|
-
.project
|
12
|
-
.loadpath
|
13
|
-
nbproject/
|
14
|
-
.idea
|
15
|
-
testjour.log
|
16
|
-
*.so
|
17
|
-
*.o
|
18
|
-
Makefile
|
19
|
-
mkmf.log
|
20
|
-
*.bundle
|
21
|
-
conftest
|
22
|
-
content/
|
23
|
-
.idea
|
24
|
-
*.sw?
|
25
|
-
.DS_Store
|
26
|
-
coverage
|
27
|
-
rdoc
|
28
|
-
pkg
|
29
|
-
pkg/*
|
30
|
-
log/*
|
data/rails/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require File.join File.dirname(__FILE__), "..", "lib", "feedbag"
|