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