xforge 0.3.5 → 0.4.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/CHANGES +34 -0
- data/Rakefile +5 -5
- data/lib/meta_project.rb +6 -0
- data/lib/meta_project/project.rb +4 -0
- data/lib/meta_project/project/base.rb +7 -0
- data/lib/meta_project/project/codehaus.rb +1 -0
- data/lib/meta_project/project/codehaus/codehaus_project_svn.rb +26 -0
- data/lib/meta_project/project/trac.rb +1 -0
- data/lib/meta_project/project/trac/trac_project.rb +26 -0
- data/lib/meta_project/project/xforge.rb +5 -0
- data/lib/meta_project/project/xforge/ruby_forge.rb +46 -0
- data/lib/meta_project/project/xforge/session.rb +162 -0
- data/lib/meta_project/project/xforge/source_forge.rb +46 -0
- data/lib/meta_project/project/xforge/xfile.rb +45 -0
- data/lib/meta_project/project/xforge/xforge_base.rb +76 -0
- data/lib/meta_project/project_analyzer.rb +36 -0
- data/lib/meta_project/scm_web.rb +53 -0
- data/lib/meta_project/tracker.rb +6 -0
- data/lib/meta_project/tracker/base.rb +18 -0
- data/lib/meta_project/tracker/digit_issues.rb +24 -0
- data/lib/meta_project/tracker/issue.rb +11 -0
- data/lib/meta_project/tracker/jira.rb +1 -0
- data/lib/meta_project/tracker/jira/jira_tracker.rb +68 -0
- data/lib/meta_project/tracker/trac.rb +1 -0
- data/lib/meta_project/tracker/trac/trac_tracker.rb +29 -0
- data/lib/meta_project/tracker/xforge.rb +3 -0
- data/lib/meta_project/tracker/xforge/ruby_forge_tracker.rb +17 -0
- data/lib/meta_project/tracker/xforge/source_forge_tracker.rb +17 -0
- data/lib/meta_project/tracker/xforge/xforge_tracker.rb +83 -0
- data/lib/{xforge → meta_project}/version_parser.rb +6 -6
- data/lib/rake/contrib/xforge/base.rb +2 -3
- data/lib/rake/contrib/xforge/news_publisher.rb +1 -5
- data/lib/rake/contrib/xforge/release.rb +3 -7
- data/lib/xforge.rb +0 -1
- metadata +30 -27
- data/lib/scm_web/base.rb +0 -12
- data/lib/scm_web/file_uri.rb +0 -21
- data/lib/scm_web/view_cvs.rb +0 -44
- data/lib/tracker/base.rb +0 -16
- data/lib/tracker/bugzilla/project.rb +0 -8
- data/lib/tracker/digit_issues.rb +0 -22
- data/lib/tracker/fog_bugz/project.rb +0 -8
- data/lib/tracker/issue.rb +0 -9
- data/lib/tracker/jira.rb +0 -2
- data/lib/tracker/jira/host.rb +0 -40
- data/lib/tracker/jira/project.rb +0 -43
- data/lib/tracker/mantis/project.rb +0 -8
- data/lib/tracker/scarab/project.rb +0 -8
- data/lib/tracker/trac.rb +0 -1
- data/lib/tracker/trac/project.rb +0 -35
- data/lib/tracker/xforge.rb +0 -2
- data/lib/tracker/xforge/base.rb +0 -77
- data/lib/tracker/xforge/rubyforge.rb +0 -7
- data/lib/xforge/host.rb +0 -26
- data/lib/xforge/project.rb +0 -87
- data/lib/xforge/rubyforge.rb +0 -50
- data/lib/xforge/session.rb +0 -158
- data/lib/xforge/sourceforge.rb +0 -46
- data/lib/xforge/xfile.rb +0 -41
data/CHANGES
CHANGED
@@ -1,5 +1,39 @@
|
|
1
1
|
= XForge Changelog
|
2
2
|
|
3
|
+
== Version 0.4.0
|
4
|
+
|
5
|
+
This release of XForge completely reorganises classes and modules into a more
|
6
|
+
coherent API for accessing projects' issue trackers, scms and scm browsers. The toplevel
|
7
|
+
namespace is now MetaProject.
|
8
|
+
|
9
|
+
The new ScmWeb class now supports *any* scm browser through its flexible
|
10
|
+
configuration options.
|
11
|
+
|
12
|
+
In order to easily gather information from various hosting services, XForge comes with a ProjectAnalyzer
|
13
|
+
class, which given an scm browser URL will discover the associated issue tracker, preconfigured scm_web,
|
14
|
+
project home page and of course, an RSCM object.
|
15
|
+
|
16
|
+
Supported project sources:
|
17
|
+
- RubyForge.org
|
18
|
+
- SourceForge.org
|
19
|
+
- Codehaus.org
|
20
|
+
- Trac projects
|
21
|
+
|
22
|
+
Supported issue trackers:
|
23
|
+
- RubyForge.org
|
24
|
+
- SourceForge.org
|
25
|
+
- JIRA
|
26
|
+
- Trac projects
|
27
|
+
|
28
|
+
Supported SCM browsers:
|
29
|
+
- *Any* scm browser through its flexible configuration options.
|
30
|
+
|
31
|
+
Supported SCMs:
|
32
|
+
- Any SCM implemented in the <a href="http://rscm.rubyforge.org/">RSCM</a> project.
|
33
|
+
|
34
|
+
The QRS Rake tasks for releasing files and news on RubyForge has changed slightly. Please refer to XForge's
|
35
|
+
own Rakefile for details.
|
36
|
+
|
3
37
|
== Version 0.3.5
|
4
38
|
|
5
39
|
This is a bugfix release that fixes some bugs in ViewCvs.
|
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# MIT-LICENSE for details.
|
8
8
|
|
9
9
|
$:.unshift('lib')
|
10
|
-
require '
|
10
|
+
require 'meta_project'
|
11
11
|
require 'rake/gempackagetask'
|
12
12
|
require 'rake/contrib/rubyforgepublisher'
|
13
13
|
require 'rake/contrib/xforge'
|
@@ -24,7 +24,7 @@ require 'rake/rdoctask'
|
|
24
24
|
#
|
25
25
|
# REMEMBER TO KEEP PKG_VERSION IN SYNC WITH THE CHANGES FILE!
|
26
26
|
PKG_NAME = "xforge"
|
27
|
-
PKG_VERSION = "0.
|
27
|
+
PKG_VERSION = "0.4.0"
|
28
28
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
29
29
|
PKG_FILES = FileList[
|
30
30
|
'[A-Z]*',
|
@@ -114,7 +114,7 @@ end
|
|
114
114
|
|
115
115
|
desc "Look for TODO and FIXME tags in the code"
|
116
116
|
task :todo do
|
117
|
-
egrep /#.*(FIXME|TODO|TBD)/
|
117
|
+
egrep /#.*(FIXME|TODO|TBD|DEPRECATED)/
|
118
118
|
end
|
119
119
|
|
120
120
|
task :release => [:verify_env_vars, :release_files, :publish_doc, :publish_news, :tag]
|
@@ -135,7 +135,7 @@ task :release_files => [:gem] do
|
|
135
135
|
"pkg/#{PKG_FILE_NAME}.gem"
|
136
136
|
]
|
137
137
|
|
138
|
-
Rake::XForge::Release.new(PKG_NAME) do |release|
|
138
|
+
Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |release|
|
139
139
|
# Never hardcode user name and password in the Rakefile!
|
140
140
|
release.user_name = ENV['RUBYFORGE_USER']
|
141
141
|
release.password = ENV['RUBYFORGE_PASSWORD']
|
@@ -151,7 +151,7 @@ task :publish_news => [:gem] do
|
|
151
151
|
"pkg/#{PKG_FILE_NAME}.gem"
|
152
152
|
]
|
153
153
|
|
154
|
-
Rake::XForge::NewsPublisher.new(PKG_NAME) do |news|
|
154
|
+
Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
|
155
155
|
# Never hardcode user name and password in the Rakefile!
|
156
156
|
news.user_name = ENV['RUBYFORGE_USER']
|
157
157
|
news.password = ENV['RUBYFORGE_PASSWORD']
|
data/lib/meta_project.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'meta_project/project/codehaus/codehaus_project_svn'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MetaProject
|
2
|
+
module Project
|
3
|
+
module Codehaus
|
4
|
+
class CodehausProjectSvn < Base
|
5
|
+
|
6
|
+
def initialize(project_id, svn_path, jira_id)
|
7
|
+
@scm = RSCM::Subversion.new("svn://svn.#{project_id}.codehaus.org/#{project_id}/scm/#{svn_path}", svn_path)
|
8
|
+
@tracker = ::MetaProject::Tracker::Jira::JiraTracker.new("http://jira.codehaus.org", jira_id)
|
9
|
+
|
10
|
+
overview = "http://svn.#{project_id}.codehaus.org/#{svn_path}/"
|
11
|
+
history = "#{overview}\#{path}"
|
12
|
+
raw = "#{history}?rev=\#{revision}"
|
13
|
+
html = "#{raw}&view=markup"
|
14
|
+
# http://svn.picocontainer.codehaus.org/java/picocontainer/trunk/container/project.xml?r1=2220&r2=2234&p1=java/picocontainer/trunk/container/project.xml&p2=java/picocontainer/trunk/container/project.xml
|
15
|
+
diff = "#{history}?r1=\#{previous_revision}&r2=\#{revision}&p1=#{svn_path}/\#{path}&p2=#{svn_path}/\#{path}"
|
16
|
+
@scm_web = ScmWeb.new(overview, history, raw, html, diff)
|
17
|
+
end
|
18
|
+
|
19
|
+
def home_page
|
20
|
+
"http://#{@project_id}.codehaus.org/"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'meta_project/project/trac/trac_project'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MetaProject
|
2
|
+
module Project
|
3
|
+
module Trac
|
4
|
+
class TracProject < Base
|
5
|
+
|
6
|
+
def initialize(trac_base_url, svn_root_url, svn_path)
|
7
|
+
@trac_base_url = trac_base_url
|
8
|
+
@scm = RSCM::Subversion.new("#{svn_root_url}#{svn_path}", svn_path)
|
9
|
+
@tracker = ::MetaProject::Tracker::Trac::TracTracker.new(trac_base_url)
|
10
|
+
|
11
|
+
overview = "#{trac_base_url}/browser/#{svn_path}/"
|
12
|
+
history = "#{trac_base_url}/log/#{svn_path}/\#{path}"
|
13
|
+
html = "#{trac_base_url}/file/#{svn_path}/\#{path}?rev=\#{revision}"
|
14
|
+
raw = "#{html}&format=txt"
|
15
|
+
diff = "#{trac_base_url}/changeset/\#{revision}"
|
16
|
+
@scm_web = ScmWeb.new(overview, history, raw, html, diff)
|
17
|
+
end
|
18
|
+
|
19
|
+
def home_page
|
20
|
+
"#{@trac_base_url}/wiki"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'meta_project/tracker/xforge'
|
2
|
+
|
3
|
+
module MetaProject
|
4
|
+
module Project
|
5
|
+
module XForge
|
6
|
+
class RubyForge < XForgeBase
|
7
|
+
|
8
|
+
def initialize(unix_name, cvs_mod=nil)
|
9
|
+
super("rubyforge.org", unix_name, cvs_mod)
|
10
|
+
end
|
11
|
+
|
12
|
+
def tracker_class
|
13
|
+
::MetaProject::Tracker::XForge::RubyForgeTracker
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def create_cvs(unix_name, mod)
|
19
|
+
RSCM::Cvs.new(":pserver:anonymous@rubyforge.org:/var/cvs/#{unix_name}", mod)
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_view_cvs(unix_name, mod)
|
23
|
+
view_cvs = "http://rubyforge.org/cgi-bin/viewcvs.cgi/"
|
24
|
+
cvsroot = "?cvsroot=#{unix_name}"
|
25
|
+
path_cvs_root = "#{mod}/\#{path}#{cvsroot}"
|
26
|
+
path_cvs_root_rev = "#{path_cvs_root}&rev=\#{revision}"
|
27
|
+
|
28
|
+
overview = "#{view_cvs}#{mod}/#{cvsroot}"
|
29
|
+
history = "#{view_cvs}#{path_cvs_root}"
|
30
|
+
raw = "#{view_cvs}*checkout*/#{path_cvs_root_rev}"
|
31
|
+
html = "#{view_cvs}#{path_cvs_root_rev}&content-type=text/vnd.viewcvs-markup"
|
32
|
+
diff = "#{view_cvs}#{mod}/\#{path}.diff#{cvsroot}&r1=\#{previous_revision}&r2=\#{revision}"
|
33
|
+
|
34
|
+
ScmWeb.new(overview, history, raw, html, diff)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Regexp used to find projects' home page
|
38
|
+
def home_page_regexp
|
39
|
+
# This seems a little volatile
|
40
|
+
/<a href=\"(\w*:\/\/[^\"]*)\"><img src=\"\/themes\/osx\/images\/ic\/home/
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
module MetaProject
|
5
|
+
module Project
|
6
|
+
module XForge
|
7
|
+
|
8
|
+
# A Session object allows authenticated interaction with a Project, such as releasing files.
|
9
|
+
#
|
10
|
+
# A Session object can be obtained via Project.login
|
11
|
+
#
|
12
|
+
class Session
|
13
|
+
|
14
|
+
# Simple enumeration of processors. Used from Session.release
|
15
|
+
class Processor
|
16
|
+
I386 = 1000
|
17
|
+
IA64 = 6000
|
18
|
+
ALPHA = 7000
|
19
|
+
ANY = 8000
|
20
|
+
PPC = 2000
|
21
|
+
MIPS = 3000
|
22
|
+
SPARC = 4000
|
23
|
+
ULTRA_SPARC = 5000
|
24
|
+
OTHER_PLATFORM = 9999
|
25
|
+
end
|
26
|
+
|
27
|
+
BOUNDARY = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
|
28
|
+
|
29
|
+
def initialize(host, project, cookie) # :nodoc:
|
30
|
+
@host = host
|
31
|
+
@project = project
|
32
|
+
@headers = { "Cookie" => cookie }
|
33
|
+
end
|
34
|
+
|
35
|
+
# The package_id of our project
|
36
|
+
def package_id
|
37
|
+
unless(@package_id)
|
38
|
+
release_uri = "http://#{@host}/frs/admin/?group_id=#{@project.group_id}"
|
39
|
+
release_data = open(release_uri, @headers) { |data| data.read }
|
40
|
+
@package_id = release_data[/[?&]package_id=(\d+)/, 1]
|
41
|
+
raise "Couldn't get package_id" unless @package_id
|
42
|
+
end
|
43
|
+
@package_id
|
44
|
+
end
|
45
|
+
|
46
|
+
# Creates a new release containing the files specified by +filenames+ (Array) and named +release_name+.
|
47
|
+
# Optional parameters are +processor+ (which should be one of the Processor constants), +release_notes+,
|
48
|
+
# +release_changes+ and +preformatted+ which will appear on the releas page of the associated project.
|
49
|
+
#
|
50
|
+
def release(release_name, filenames, release_notes="", release_changes="", preformatted=true, processor=Processor::ANY)
|
51
|
+
release_date = Time.now.strftime("%Y-%m-%d %H:%M")
|
52
|
+
release_id = nil
|
53
|
+
|
54
|
+
puts "About to release '#{release_name}'"
|
55
|
+
puts "Files:"
|
56
|
+
puts " " + filenames.join("\n ")
|
57
|
+
puts "\nRelease Notes:\n"
|
58
|
+
puts release_notes
|
59
|
+
puts "\nRelease Changes:\n"
|
60
|
+
puts release_changes
|
61
|
+
puts "\nRelease Settings:\n"
|
62
|
+
puts "Preformatted: #{preformatted}"
|
63
|
+
puts "Processor: #{processor}"
|
64
|
+
puts "\nStarting release..."
|
65
|
+
|
66
|
+
xfiles = filenames.collect{|filename| XFile.new(filename)}
|
67
|
+
xfiles.each_with_index do |xfile, i|
|
68
|
+
first_file = i==0
|
69
|
+
puts "Releasing #{xfile.basename}..."
|
70
|
+
|
71
|
+
release_response = Net::HTTP.start(@host, 80) do |http|
|
72
|
+
query_hash = if first_file then
|
73
|
+
{
|
74
|
+
"group_id" => @project.group_id,
|
75
|
+
"package_id" => package_id,
|
76
|
+
"type_id" => xfile.bin_type_id,
|
77
|
+
"processor_id" => processor,
|
78
|
+
|
79
|
+
"release_name" => release_name,
|
80
|
+
"release_date" => release_date,
|
81
|
+
"release_notes" => release_notes,
|
82
|
+
"release_changes" => release_changes,
|
83
|
+
"preformatted" => preformatted ? "1" : "0",
|
84
|
+
"submit" => "1"
|
85
|
+
}
|
86
|
+
else
|
87
|
+
{
|
88
|
+
"group_id" => @project.group_id,
|
89
|
+
"package_id" => package_id,
|
90
|
+
"type_id" => xfile.bin_type_id,
|
91
|
+
"processor_id" => processor,
|
92
|
+
|
93
|
+
"step2" => "1",
|
94
|
+
"release_id" => release_id,
|
95
|
+
"submit" => "Add This File"
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
query = query(query_hash)
|
100
|
+
|
101
|
+
data = [
|
102
|
+
"--" + BOUNDARY,
|
103
|
+
"Content-Disposition: form-data; name=\"userfile\"; filename=\"#{xfile.basename}\"",
|
104
|
+
"Content-Type: application/octet-stream",
|
105
|
+
"Content-Transfer-Encoding: binary",
|
106
|
+
"", xfile.data, ""
|
107
|
+
].join("\x0D\x0A")
|
108
|
+
|
109
|
+
headers = @headers.merge(
|
110
|
+
"Content-Type" => "multipart/form-data; boundary=#{BOUNDARY}"
|
111
|
+
)
|
112
|
+
|
113
|
+
target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
|
114
|
+
http.post(target + query, data, headers)
|
115
|
+
end
|
116
|
+
|
117
|
+
if first_file then
|
118
|
+
release_id = release_response.body[/release_id=(\d+)/, 1]
|
119
|
+
raise("Couldn't get release id") unless release_id
|
120
|
+
end
|
121
|
+
end
|
122
|
+
puts "Done!"
|
123
|
+
end
|
124
|
+
|
125
|
+
def publish_news(subject, details)
|
126
|
+
puts "About to publish news"
|
127
|
+
puts "Subject: '#{subject}'"
|
128
|
+
puts "Details:"
|
129
|
+
puts details
|
130
|
+
puts ""
|
131
|
+
|
132
|
+
release_response = Net::HTTP.start(@host.name, 80) do |http|
|
133
|
+
query_hash = {
|
134
|
+
"group_id" => @project.group_id,
|
135
|
+
"package_id" => package_id,
|
136
|
+
"post_changes" => "y",
|
137
|
+
"summary" => subject,
|
138
|
+
"details" => details
|
139
|
+
}
|
140
|
+
|
141
|
+
target = "/news/submit.php"
|
142
|
+
headers = @headers.merge(
|
143
|
+
"Content-Type" => "multipart/form-data"
|
144
|
+
)
|
145
|
+
http.post(target + query(query_hash), "", headers)
|
146
|
+
|
147
|
+
end
|
148
|
+
puts "Done!"
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def query(query_hash)
|
154
|
+
"?" + query_hash.map do |(name, value)|
|
155
|
+
[name, URI.encode(value.to_s)].join("=")
|
156
|
+
end.join("&")
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'meta_project/tracker/xforge'
|
2
|
+
|
3
|
+
module MetaProject
|
4
|
+
module Project
|
5
|
+
module XForge
|
6
|
+
class SourceForge < XForgeBase
|
7
|
+
|
8
|
+
def initialize(unix_name, cvs_mod=nil)
|
9
|
+
super("sourceforge.net", unix_name, cvs_mod)
|
10
|
+
end
|
11
|
+
|
12
|
+
def tracker_class
|
13
|
+
::MetaProject::Tracker::XForge::SourceForgeTracker
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def create_cvs(unix_name, mod)
|
19
|
+
RSCM::Cvs.new(":pserver:anonymous@cvs.sourceforge.net:/cvsroot/#{unix_name}", mod)
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_view_cvs(unix_name, mod)
|
23
|
+
view_cvs = "http://cvs.sourceforge.net/viewcvs.py/"
|
24
|
+
unix_name_mod = "#{unix_name}/#{mod}"
|
25
|
+
project_path = "#{unix_name_mod}/\#{path}"
|
26
|
+
rev = "rev=\#{revision}"
|
27
|
+
|
28
|
+
overview = "#{view_cvs}#{unix_name_mod}/"
|
29
|
+
history = "#{view_cvs}#{project_path}"
|
30
|
+
raw = "#{view_cvs}*checkout*/#{project_path}?#{rev}"
|
31
|
+
html = "#{history}?#{rev}&view=markup"
|
32
|
+
diff = "#{history}?r1=\#{previous_revision}&r2=\#{revision}"
|
33
|
+
|
34
|
+
ScmWeb.new(overview, history, raw, html, diff)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Regexp used to find projects' home page
|
38
|
+
def home_page_regexp
|
39
|
+
# This seems a little volatile
|
40
|
+
/<A href=\"(\w*:\/\/[^\"]*)\"> Project Home Page<\/A>/
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module MetaProject
|
2
|
+
module Project
|
3
|
+
module XForge
|
4
|
+
|
5
|
+
class XFile # :nodoc:
|
6
|
+
|
7
|
+
# extension => [mime_type, rubyforge_bin_type_id, rubyforge_src_type_id]
|
8
|
+
FILE_TYPES = {
|
9
|
+
".deb" => ["application/octet-stream", 1000],
|
10
|
+
|
11
|
+
# all of these can be source or binary
|
12
|
+
".rpm" => ["application/octet-stream", 2000, 5100],
|
13
|
+
".zip" => ["application/octet-stream", 3000, 5000],
|
14
|
+
".bz2" => ["application/octet-stream", 3100, 5010],
|
15
|
+
".gz" => ["application/octet-stream", 3110, 5020],
|
16
|
+
".jpg" => ["application/octet-stream", 8000],
|
17
|
+
".jpeg" => ["application/octet-stream", 8000],
|
18
|
+
".txt" => ["text/plain", 8100, 8100],
|
19
|
+
".html" => ["text/html", 8200, 8200],
|
20
|
+
".pdf" => ["application/octet-stream", 8300],
|
21
|
+
".ebuild" => ["application/octet-stream", 1300],
|
22
|
+
".exe" => ["application/octet-stream", 1100],
|
23
|
+
".dmg" => ["application/octet-stream", 1200],
|
24
|
+
".gem" => ["application/octet-stream", 1400],
|
25
|
+
".sig" => ["application/octet-stream", 8150]
|
26
|
+
}
|
27
|
+
FILE_TYPES.default = ["application/octet-stream", 9999, 5900] # default to "other", "other source"
|
28
|
+
|
29
|
+
attr_reader :basename, :ext, :content_type, :bin_type_id, :src_type_id
|
30
|
+
|
31
|
+
def initialize(filename)
|
32
|
+
@filename = filename
|
33
|
+
@basename = File.basename(filename)
|
34
|
+
@ext = File.extname(filename)
|
35
|
+
@content_type = FILE_TYPES[@ext][0]
|
36
|
+
@bin_type_id = FILE_TYPES[@ext][1]
|
37
|
+
end
|
38
|
+
|
39
|
+
def data
|
40
|
+
File.open(@filename, "rb") { |file| file.read }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|