simple-rss 1.3.3 → 2.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.
- checksums.yaml +4 -4
- data/LICENSE +79 -7
- data/README.md +321 -0
- data/Rakefile +134 -136
- data/lib/simple-rss.rb +541 -154
- data/simple-rss.gemspec +5 -6
- data/test/base/array_tags_test.rb +37 -0
- data/test/base/base_test.rb +76 -77
- data/test/base/empty_tag_test.rb +56 -0
- data/test/base/encoding_test.rb +87 -0
- data/test/base/enumerable_test.rb +101 -0
- data/test/base/feed_attributes_test.rb +26 -0
- data/test/base/fetch_test.rb +117 -0
- data/test/base/hash_xml_serialization_test.rb +142 -0
- data/test/base/item_attributes_test.rb +26 -0
- data/test/base/json_serialization_test.rb +81 -0
- data/test/data/atom_with_entry_attrs.xml +13 -0
- data/test/data/atom_with_feed_attrs.xml +13 -0
- data/test/data/media_rss.xml +465 -0
- data/test/data/rss20_utf8.xml +61 -0
- data/test/data/rss20_with_channel_attrs.xml +13 -0
- data/test/data/rss20_with_item_attrs.xml +13 -0
- data/test/test_helper.rb +10 -3
- metadata +21 -11
- data/README.markdown +0 -47
- data/install.rb +0 -40
data/Rakefile
CHANGED
|
@@ -1,54 +1,53 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "bundler/setup"
|
|
3
|
+
require "rake"
|
|
4
|
+
require "rake/testtask"
|
|
5
|
+
require "rdoc/task"
|
|
6
|
+
require "rubygems/package_task"
|
|
7
|
+
require "./lib/simple-rss"
|
|
8
8
|
|
|
9
9
|
PKG_VERSION = SimpleRSS::VERSION
|
|
10
|
-
PKG_NAME = "simple-rss"
|
|
11
|
-
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
|
12
|
-
RUBY_FORGE_PROJECT = "simple-rss"
|
|
13
|
-
RUBY_FORGE_USER = ENV[
|
|
14
|
-
RELEASE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
|
10
|
+
PKG_NAME = "simple-rss".freeze
|
|
11
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}".freeze
|
|
12
|
+
RUBY_FORGE_PROJECT = "simple-rss".freeze
|
|
13
|
+
RUBY_FORGE_USER = ENV["RUBY_FORGE_USER"] || "cardmagic"
|
|
14
|
+
RELEASE_NAME = "#{PKG_NAME}-#{PKG_VERSION}".freeze
|
|
15
15
|
|
|
16
16
|
PKG_FILES = FileList[
|
|
17
17
|
"lib/*", "bin/*", "test/**/*", "[A-Z]*", "Rakefile", "html/**/*"
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
desc "Default Task"
|
|
21
|
-
task :
|
|
21
|
+
task default: [:test]
|
|
22
22
|
|
|
23
23
|
# Run the unit tests
|
|
24
24
|
desc "Run all unit tests"
|
|
25
|
-
Rake::TestTask.new("test")
|
|
26
|
-
t.libs << [
|
|
27
|
-
t.pattern =
|
|
25
|
+
Rake::TestTask.new("test") do |t|
|
|
26
|
+
t.libs << %w[lib test]
|
|
27
|
+
t.pattern = "test/*/*_test.rb"
|
|
28
28
|
t.verbose = true
|
|
29
|
-
|
|
29
|
+
end
|
|
30
30
|
|
|
31
31
|
# Make a console, useful when working on tests
|
|
32
32
|
desc "Generate a test console"
|
|
33
33
|
task :console do
|
|
34
|
-
|
|
34
|
+
verbose(false) { sh "irb -I lib/ -r 'simple-rss'" }
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# Genereate the RDoc documentation
|
|
38
38
|
desc "Create documentation"
|
|
39
|
-
Rake::RDocTask.new("doc")
|
|
39
|
+
Rake::RDocTask.new("doc") do |rdoc|
|
|
40
40
|
rdoc.title = "Simple RSS - A Flexible RSS and Atom reader for Ruby"
|
|
41
|
-
rdoc.rdoc_dir =
|
|
42
|
-
rdoc.rdoc_files.include(
|
|
43
|
-
rdoc.rdoc_files.include(
|
|
44
|
-
|
|
41
|
+
rdoc.rdoc_dir = "html"
|
|
42
|
+
rdoc.rdoc_files.include("README.markdown")
|
|
43
|
+
rdoc.rdoc_files.include("lib/*.rb")
|
|
44
|
+
end
|
|
45
45
|
|
|
46
46
|
# Genereate the package
|
|
47
47
|
spec = Gem::Specification.new do |s|
|
|
48
|
-
|
|
49
48
|
#### Basic information.
|
|
50
49
|
|
|
51
|
-
s.name =
|
|
50
|
+
s.name = "simple-rss"
|
|
52
51
|
s.version = PKG_VERSION
|
|
53
52
|
s.summary = <<-EOF
|
|
54
53
|
A simple, flexible, extensible, and liberal RSS and Atom reader for Ruby. It is designed to be backwards compatible with the standard RSS parser, but will never do RSS generation.
|
|
@@ -63,7 +62,7 @@ spec = Gem::Specification.new do |s|
|
|
|
63
62
|
|
|
64
63
|
#### Load-time details: library and application (you will need one or both).
|
|
65
64
|
|
|
66
|
-
s.require_path =
|
|
65
|
+
s.require_path = "lib"
|
|
67
66
|
|
|
68
67
|
#### Author and project details.
|
|
69
68
|
|
|
@@ -79,130 +78,129 @@ end
|
|
|
79
78
|
|
|
80
79
|
desc "Report code statistics (KLOCs, etc) from the application"
|
|
81
80
|
task :stats do
|
|
82
|
-
require
|
|
81
|
+
require "code_statistics"
|
|
83
82
|
CodeStatistics.new(
|
|
84
|
-
[
|
|
85
|
-
[
|
|
83
|
+
%w[Library lib],
|
|
84
|
+
%w[Units test]
|
|
86
85
|
).to_s
|
|
87
86
|
end
|
|
88
87
|
|
|
89
88
|
desc "Publish new documentation"
|
|
90
89
|
task :publish do
|
|
91
|
-
|
|
90
|
+
Rake::RubyForgePublisher.new("simple-rss", "cardmagic").upload
|
|
92
91
|
end
|
|
93
92
|
|
|
94
|
-
|
|
95
93
|
desc "Publish the release files to RubyForge."
|
|
96
|
-
task :
|
|
94
|
+
task upload: [:package] do
|
|
97
95
|
files = ["gem", "tar.gz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
|
|
98
96
|
|
|
99
|
-
if RUBY_FORGE_PROJECT
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
97
|
+
if RUBY_FORGE_PROJECT
|
|
98
|
+
require "net/http"
|
|
99
|
+
require "open-uri"
|
|
100
|
+
|
|
101
|
+
project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
|
|
102
|
+
project_data = open(project_uri, &:read)
|
|
103
|
+
group_id = project_data[/[?&]group_id=(\d+)/, 1]
|
|
104
|
+
raise "Couldn't get group id" unless group_id
|
|
105
|
+
|
|
106
|
+
# This echos password to shell which is a bit sucky
|
|
107
|
+
if ENV["RUBY_FORGE_PASSWORD"]
|
|
108
|
+
password = ENV["RUBY_FORGE_PASSWORD"]
|
|
109
|
+
else
|
|
110
|
+
print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
|
|
111
|
+
password = STDIN.gets.chomp
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
|
115
|
+
data = [
|
|
116
|
+
"login=1",
|
|
117
|
+
"form_loginname=#{RUBY_FORGE_USER}",
|
|
118
|
+
"form_pw=#{password}"
|
|
119
|
+
].join("&")
|
|
120
|
+
http.post("/account/login.php", data)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
cookie = login_response["set-cookie"]
|
|
124
|
+
raise "Login failed" unless cookie
|
|
125
|
+
headers = { "Cookie" => cookie }
|
|
126
|
+
|
|
127
|
+
release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
|
|
128
|
+
release_data = open(release_uri, headers, &:read)
|
|
129
|
+
package_id = release_data[/[?&]package_id=(\d+)/, 1]
|
|
130
|
+
raise "Couldn't get package id" unless package_id
|
|
131
|
+
|
|
132
|
+
first_file = true
|
|
133
|
+
release_id = ""
|
|
134
|
+
|
|
135
|
+
files.each do |filename|
|
|
136
|
+
basename = File.basename(filename)
|
|
137
|
+
file_ext = File.extname(filename)
|
|
138
|
+
file_data = File.open(filename, "rb", &:read)
|
|
139
|
+
|
|
140
|
+
puts "Releasing #{basename}..."
|
|
141
|
+
|
|
142
|
+
release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
|
143
|
+
release_date = Time.now.strftime("%Y-%m-%d %H:%M")
|
|
144
|
+
type_map = {
|
|
145
|
+
".zip" => "3000",
|
|
146
|
+
".tgz" => "3110",
|
|
147
|
+
".gz" => "3110",
|
|
148
|
+
".gem" => "1400"
|
|
149
|
+
}; type_map.default = "9999"
|
|
150
|
+
type = type_map[file_ext]
|
|
151
|
+
boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
|
|
152
|
+
|
|
153
|
+
query_hash = if first_file
|
|
154
|
+
{
|
|
155
|
+
"group_id" => group_id,
|
|
156
|
+
"package_id" => package_id,
|
|
157
|
+
"release_name" => RELEASE_NAME,
|
|
158
|
+
"release_date" => release_date,
|
|
159
|
+
"type_id" => type,
|
|
160
|
+
"processor_id" => "8000", # Any
|
|
161
|
+
"release_notes" => "",
|
|
162
|
+
"release_changes" => "",
|
|
163
|
+
"preformatted" => "1",
|
|
164
|
+
"submit" => "1"
|
|
165
|
+
}
|
|
166
|
+
else
|
|
167
|
+
{
|
|
168
|
+
"group_id" => group_id,
|
|
169
|
+
"release_id" => release_id,
|
|
170
|
+
"package_id" => package_id,
|
|
171
|
+
"step2" => "1",
|
|
172
|
+
"type_id" => type,
|
|
173
|
+
"processor_id" => "8000", # Any
|
|
174
|
+
"submit" => "Add This File"
|
|
175
|
+
}
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
query = "?" + query_hash.map do |(name, value)|
|
|
179
|
+
[name, URI.encode(value)].join("=")
|
|
180
|
+
end.join("&")
|
|
181
|
+
|
|
182
|
+
data = [
|
|
183
|
+
"--" + boundary,
|
|
184
|
+
"Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
|
|
185
|
+
"Content-Type: application/octet-stream",
|
|
186
|
+
"Content-Transfer-Encoding: binary",
|
|
187
|
+
"", file_data, ""
|
|
188
|
+
].join("\x0D\x0A")
|
|
189
|
+
|
|
190
|
+
release_headers = headers.merge(
|
|
191
|
+
"Content-Type" => "multipart/form-data; boundary=#{boundary}"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
|
|
195
|
+
http.post(target + query, data, release_headers)
|
|
114
196
|
end
|
|
115
197
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
"form_loginname=#{RUBY_FORGE_USER}",
|
|
120
|
-
"form_pw=#{password}"
|
|
121
|
-
].join("&")
|
|
122
|
-
http.post("/account/login.php", data)
|
|
198
|
+
if first_file
|
|
199
|
+
release_id = release_response.body[/release_id=(\d+)/, 1]
|
|
200
|
+
raise("Couldn't get release id") unless release_id
|
|
123
201
|
end
|
|
124
202
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
headers = { "Cookie" => cookie }
|
|
128
|
-
|
|
129
|
-
release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
|
|
130
|
-
release_data = open(release_uri, headers) { |data| data.read }
|
|
131
|
-
package_id = release_data[/[?&]package_id=(\d+)/, 1]
|
|
132
|
-
raise "Couldn't get package id" unless package_id
|
|
133
|
-
|
|
134
|
-
first_file = true
|
|
135
|
-
release_id = ""
|
|
136
|
-
|
|
137
|
-
files.each do |filename|
|
|
138
|
-
basename = File.basename(filename)
|
|
139
|
-
file_ext = File.extname(filename)
|
|
140
|
-
file_data = File.open(filename, "rb") { |file| file.read }
|
|
141
|
-
|
|
142
|
-
puts "Releasing #{basename}..."
|
|
143
|
-
|
|
144
|
-
release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
|
145
|
-
release_date = Time.now.strftime("%Y-%m-%d %H:%M")
|
|
146
|
-
type_map = {
|
|
147
|
-
".zip" => "3000",
|
|
148
|
-
".tgz" => "3110",
|
|
149
|
-
".gz" => "3110",
|
|
150
|
-
".gem" => "1400"
|
|
151
|
-
}; type_map.default = "9999"
|
|
152
|
-
type = type_map[file_ext]
|
|
153
|
-
boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
|
|
154
|
-
|
|
155
|
-
query_hash = if first_file then
|
|
156
|
-
{
|
|
157
|
-
"group_id" => group_id,
|
|
158
|
-
"package_id" => package_id,
|
|
159
|
-
"release_name" => RELEASE_NAME,
|
|
160
|
-
"release_date" => release_date,
|
|
161
|
-
"type_id" => type,
|
|
162
|
-
"processor_id" => "8000", # Any
|
|
163
|
-
"release_notes" => "",
|
|
164
|
-
"release_changes" => "",
|
|
165
|
-
"preformatted" => "1",
|
|
166
|
-
"submit" => "1"
|
|
167
|
-
}
|
|
168
|
-
else
|
|
169
|
-
{
|
|
170
|
-
"group_id" => group_id,
|
|
171
|
-
"release_id" => release_id,
|
|
172
|
-
"package_id" => package_id,
|
|
173
|
-
"step2" => "1",
|
|
174
|
-
"type_id" => type,
|
|
175
|
-
"processor_id" => "8000", # Any
|
|
176
|
-
"submit" => "Add This File"
|
|
177
|
-
}
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
query = "?" + query_hash.map do |(name, value)|
|
|
181
|
-
[name, URI.encode(value)].join("=")
|
|
182
|
-
end.join("&")
|
|
183
|
-
|
|
184
|
-
data = [
|
|
185
|
-
"--" + boundary,
|
|
186
|
-
"Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
|
|
187
|
-
"Content-Type: application/octet-stream",
|
|
188
|
-
"Content-Transfer-Encoding: binary",
|
|
189
|
-
"", file_data, ""
|
|
190
|
-
].join("\x0D\x0A")
|
|
191
|
-
|
|
192
|
-
release_headers = headers.merge(
|
|
193
|
-
"Content-Type" => "multipart/form-data; boundary=#{boundary}"
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
|
|
197
|
-
http.post(target + query, data, release_headers)
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
if first_file then
|
|
201
|
-
release_id = release_response.body[/release_id=(\d+)/, 1]
|
|
202
|
-
raise("Couldn't get release id") unless release_id
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
first_file = false
|
|
206
|
-
end
|
|
203
|
+
first_file = false
|
|
204
|
+
end
|
|
207
205
|
end
|
|
208
206
|
end
|