class RubyForge
Attributes
autoconfig[R]
TODO: add an autoconfig method that is self-repairing, removing key checks
userconfig[R]
TODO: add an autoconfig method that is self-repairing, removing key checks
Public Class Methods
new(userconfig=nil, autoconfig=nil, opts=nil)
click to toggle source
# File lib/rubyforge.rb, line 29 def initialize(userconfig=nil, autoconfig=nil, opts=nil) # def initialize(userconfig=CONFIG_F, opts={}) @userconfig, @autoconfig = userconfig, autoconfig @autoconfig ||= CONFIG["rubyforge"].dup @userconfig.merge! opts if opts @client = nil @uri = nil end
Public Instance Methods
add_file(group_name, package_name, release_name, userfile)
click to toggle source
add a file to an existing release under the specified group_id, package_id, and release_id
example :
add_file("codeforpeople", "traits", "0.8.0", "traits-0.8.0.gem") add_file("codeforpeople", "traits", "0.8.0", "traits-0.8.0.tgz") add_file(1024, 1242, "0.8.0", "traits-0.8.0.gem")
# File lib/rubyforge.rb, line 263 def add_file(group_name, package_name, release_name, userfile) type_id = @userconfig["type_id"] group_id = lookup "group", group_name package_id = lookup "package", package_name release_id = (Integer === release_name) ? release_name : lookup("release", package_name)[release_name] url = "/releases/#{release_id}/files.js" userfile = open userfile, 'rb' type_id ||= userfile.path[%r|\.[^\./]+$|] type_id = (lookup "type", type_id rescue lookup "type", ".oth") processor_id = @userconfig["processor_id"] processor_id ||= "Any" processor_id = lookup "processor", processor_id form = { "file[filename]" => File.basename(userfile.path), "file[processor_id]" => processor_id, "file[type_id]" => type_id, "contents" => userfile.read } run url, form end
add_release(group_id, package_id, release_name, *files)
click to toggle source
# File lib/rubyforge.rb, line 206 def add_release(group_id, package_id, release_name, *files) group_id = lookup "group", group_id package_id = lookup "package", package_id release_date = @userconfig["release_date"] release_notes = @userconfig["release_notes"] release_changes = @userconfig["release_changes"] preformatted = @userconfig["preformatted"] release_date ||= Time.now.strftime("%Y-%m-%d %H:%M") release_notes = IO::read(release_notes) if test(?e, release_notes) if release_notes release_changes = IO::read(release_changes) if test(?e, release_changes) if release_changes preformatted = preformatted ? 1 : 0 form = { "release[name]" => release_name, "release[release_date]" => release_date, "release[notes]" => release_notes, "release[changes]" => release_changes, "release[preformatted]" => preformatted, } url = "/packages/#{package_id}/releases" json = run url, form release_id = JSON.parse(json)["release_id"].to_i rescue nil unless release_id then puts json if $DEBUG raise "Couldn't get release_id, upload failed?" end # FIXME #raise "Invalid package_id #{package_id}" if html[/Invalid package_id/] #raise "You have already released this version." if html[/That filename already exists in this project/] files.each do |file| add_file(group_id, package_id, release_id, file) end package_name = @autoconfig["package_ids"].invert[package_id] raise "unknown package name for #{package_id}" if package_name.nil? @autoconfig["release_ids"][package_name] ||= {} @autoconfig["release_ids"][package_name][release_name] = release_id save_autoconfig release_id end
client()
click to toggle source
# File lib/rubyforge.rb, line 289 def client return @client if @client @client = RubyForge::Client::new ENV["HTTP_PROXY"] @client.debug_dev = STDERR if ENV["RUBYFORGE_DEBUG"] || ENV["DEBUG"] || $DEBUG @client end
configure(opts = {})
click to toggle source
# File lib/rubyforge.rb, line 44 def configure opts = {} user_path = CONFIG_F dir, file = File.split(user_path) @userconfig = if test(?e, user_path) then YAML.load_file(user_path) else CONFIG end.merge(opts) @autoconfig_path = File.join(dir, file.sub(/^user/, 'auto')) @autoconfig = if test(?e, @autoconfig_path) then YAML.load_file(@autoconfig_path) else CONFIG["rubyforge"].dup end @autoconfig["type_ids"] = CONFIG['rubyforge']['type_ids'].dup raise "no <username>" unless @userconfig["username"] raise "no <password>" unless @userconfig["password"] self end
create_package(group_id, package_name)
click to toggle source
# File lib/rubyforge.rb, line 163 def create_package(group_id, package_name) page = "/groups/#{group_id}/packages" group_id = lookup "group", group_id is_private = @userconfig["is_private"] is_public = is_private ? 0 : 1 form = { "package[name]" => package_name, "package[is_public]" => is_public } run page, form group_name = @autoconfig["group_ids"].invert[group_id] scrape_project(group_name) end
delete_package(group_id, package_id)
click to toggle source
# File lib/rubyforge.rb, line 195 def delete_package(group_id, package_id) group_id = lookup "group", group_id package_id = lookup "package", package_id package_name = @autoconfig["package_ids"].invert[package_id] @autoconfig["package_ids"].delete package_name @autoconfig["release_ids"].delete package_name save_autoconfig url = "/packages/#{package_id}" run url, {"_method" => "delete"} end
force()
click to toggle source
# File lib/rubyforge.rb, line 67 def force @userconfig['force'] end
get_via_rest_api(path)
click to toggle source
# File lib/rubyforge.rb, line 115 def get_via_rest_api(path) url = "#{self.uri}#{path}" puts "Hitting REST API: #{url}" if $DEBUG JSON.parse(client.get_content(url, {}, {}, @userconfig)) end
login()
click to toggle source
These are no-ops now, but we'll keep them here for backwards compatibility
# File lib/rubyforge.rb, line 41 def login ; end
logout()
click to toggle source
# File lib/rubyforge.rb, line 42 def logout ; end
post_news(group_id, subject, body)
click to toggle source
Posts news item to group_id
(can be name) with subject
and body
# File lib/rubyforge.rb, line 184 def post_news(group_id, subject, body) # TODO - what was the post_changes parameter for? form = { "news_byte[summary]" => subject, "news_byte[details]" => body } group_id = lookup "group", group_id url = "/groups/#{group_id}/news_bytes" run url, form end
save_autoconfig()
click to toggle source
# File lib/rubyforge.rb, line 93 def save_autoconfig File.open(@autoconfig_path, "w") do |file| YAML.dump @autoconfig, file end end
scrape_config()
click to toggle source
# File lib/rubyforge.rb, line 99 def scrape_config username = @userconfig['username'] %w(group package processor release).each do |type| @autoconfig["#{type}_ids"].clear if @autoconfig["#{type}_ids"] end json = get_via_rest_api "/users/#{username}/groups.js" projects = json.collect {|group| group['group']['unix_group_name'] } puts "Fetching #{projects.size} projects" projects.each do |project| scrape_project(project) end end
scrape_project(project)
click to toggle source
# File lib/rubyforge.rb, line 121 def scrape_project(project) data = { "group_ids" => {}, "package_ids" => {}, "processor_ids" => Hash.new { |h,k| h[k] = {} }, "release_ids" => Hash.new { |h,k| h[k] = {} }, } unless data["group_ids"].has_key? project then json = get_via_rest_api "/groups/#{project}.js" group_id = json["group"]["group_id"].to_i data["group_ids"][project] = group_id end # Get project's packages json = get_via_rest_api "/groups/#{project}/packages.js" json.each do |package| data["package_ids"][package["package"]["name"]] = package["package"]["package_id"] # Get releases for this package json = get_via_rest_api "/packages/#{package["package"]["package_id"]}/releases.js" json.each do |release| data["release_ids"][package["package"]["name"]][release["name"]] = release["release_id"] end end # Get processor ids if @autoconfig['processor_ids'].nil? || @autoconfig['processor_ids'].empty? puts "Fetching processor ids" if $DEBUG json = get_via_rest_api "/processors.js" json.each do |processor| data["processor_ids"][processor["processor"]["name"]] = processor["processor"]["processor_id"] end end data.each do |key, val| @autoconfig[key] ||= {} @autoconfig[key].merge! val end save_autoconfig end
setup()
click to toggle source
# File lib/rubyforge.rb, line 80 def setup FileUtils::mkdir_p RUBYFORGE_D, :mode => 0700 unless test ?d, RUBYFORGE_D test ?e, CONFIG_F and FileUtils::mv CONFIG_F, "#{CONFIG_F}.bak" config = CONFIG.dup config.delete "rubyforge" open(CONFIG_F, "w") { |f| f.write YAML.dump(config) } edit = (ENV["EDITOR"] || ENV["EDIT"] || "vi") + " '#{CONFIG_F}'" system edit or puts "edit '#{CONFIG_F}'" end
uri()
click to toggle source
# File lib/rubyforge.rb, line 71 def uri uri = @userconfig['uri'] abort "Using new REST api, but uri isn't api.rubyforge.org. run `rubyforge setup` and fix please" if uri =~ /rubyforge.org/ and uri !~ /api.rubyforge.org/ @uri ||= URI.parse uri end