lib/octopi/repository.rb in octopi-0.1.0 vs lib/octopi/repository.rb in octopi-0.2.1
- old
+ new
@@ -1,111 +1,132 @@
module Octopi
class Repository < Base
include Resource
+ attr_accessor :description, :url, :forks, :name, :homepage, :watchers,
+ :owner, :private, :fork, :open_issues, :pledgie, :size,
+ # And now for the stuff returned by search results
+ :actions, :score, :language, :followers, :type, :username,
+ :id, :pushed, :created
set_resource_name "repository", "repositories"
create_path "/repos/create"
find_path "/repos/search/:query"
resource_path "/repos/show/:id"
delete_path "/repos/delete/:id"
attr_accessor :private
+ def owner=(owner)
+ @owner = User.find(owner)
+ end
+
# Returns all branches for the Repository
#
# Example:
# repo = Repository.find("fcoury", "octopi")
# repo.branches.each { |r| puts r.name }
#
def branches
- Branch.find(self.owner, self.name,api)
+ Branch.all(:user => self.owner, :repo => self)
end
# Returns all tags for the Repository
#
# Example:
# repo = Repository.find("fcoury", "octopi")
# repo.tags.each { |t| puts t.name }
#
def tags
- Tag.find(self.owner, self.name)
- end
+ Tag.all(:user => self.owner, :repo => self)
+ end
- def clone_url
- if private? || api.login == self.owner
- "git@github.com:#{self.owner}/#{self.name}.git"
- else
- "git://github.com/#{self.owner}/#{self.name}.git"
+
+ # Returns all the comments for a Repository
+ def comments
+ # We have to specify xmlns as a prefix as the document is namespaced.
+ # Be wary!
+ path = "http#{'s' if private}://github.com/#{owner}/#{name}/comments.atom"
+ xml = Nokogiri::XML(Net::HTTP.get(URI.parse(path)))
+ entries = xml.xpath("//xmlns:entry")
+ comments = []
+ for entry in entries
+ content = entry.xpath("xmlns:content").text.gsub("<", "<").gsub(">", ">")
+ comments << Comment.new(
+ :id => entry.xpath("xmlns:id"),
+ :published => Time.parse(entry.xpath("xmlns:published").text),
+ :updated => Time.parse(entry.xpath("xmlns:updated").text),
+ :link => entry.xpath("xmlns:link/@href").text,
+ :title => entry.xpath("xmlns:title").text,
+ :content => content,
+ :author => entry.xpath("xmlns:author/xmlns:name").text,
+ :repository => self
+ )
end
+ comments
end
-
- def self.find_by_user(user, api = ANONYMOUS_API)
- user = user.login if user.is_a? User
- self.validate_args(user => :user)
- find_plural(user, :resource, api)
+
+ def clone_url
+ url = private || Api.api.login == self.owner.login ? "git@github.com:" : "git://github.com/"
+ url += "#{self.owner}/#{self.name}.git"
end
-
- def self.find(*args)
- api = args.last.is_a?(Api) ? args.pop : ANONYMOUS_API
- repo = args.pop
- user = args.pop
+
+ def self.find(options={})
+ ensure_hash(options)
+ # Lots of people call the same thing differently.
+ # Can't call gather_details here because this method is used by it internally.
+ repo = options[:repo] || options[:repository] || options[:name]
+ user = options[:user].to_s
+
+ return find_plural(user, :resource) if repo.nil?
- user = user.login if user.is_a? User
- if repo.is_a? Repository
- repo = repo.name
- user ||= repo.owner
- end
-
self.validate_args(user => :user, repo => :repo)
- super user, repo, api
+ super user, repo
end
def self.find_all(*args)
# FIXME: This should be URI escaped, but have to check how the API
# handles escaped characters first.
super args.join(" ").gsub(/ /,'+')
end
- def self.open_issue(args)
- Issue.open(args[:user], args[:repo], args)
+ class << self
+ alias_method :search, :find_all
end
- def open_issue(args)
- Issue.open(self.owner, self, args, @api)
- end
-
def commits(branch = "master")
- api = self.api || ANONYMOUS_API
- Commit.find_all(self, {:branch => branch}, api)
+ Commit.find_all(:user => self.owner, :repo => self, :branch => branch)
end
def issues(state = "open")
- Issue.find_all(self, :state => state)
+ IssueSet.new(Octopi::Issue.find_all(:user => owner, :repository => self))
end
def all_issues
Issue::STATES.map{|state| self.issues(state)}.flatten
end
def issue(number)
- Issue.find(self, number)
+ Issue.find(:user => self.owner, :repo => self, :number => number)
end
def collaborators
- property('collaborators', [self.owner,self.name].join('/')).values
+ property('collaborators', [self.owner, self.name].join('/')).values.map { |v| User.find(v) }
end
- def self.create(owner, name, opts = {})
- api = owner.is_a?(User) ? owner.api : ANONYMOUS_API
- raise APIError, "To create a repository you must be authenticated." if api.read_only?
- self.validate_args(name => :repo)
- api.post(path_for(:create), opts.merge(:name => name))
- self.find(owner, name, api)
+ def self.create(options={})
+ raise AuthenticationRequired, "To create a repository you must be authenticated." if Api.api.read_only?
+ self.validate_args(options[:name] => :repo)
+ new(Api.api.post(path_for(:create), options)["repository"])
end
- def delete
- token = @api.post(self.class.path_for(:delete), :id => self.name)['delete_token']
- @api.post(self.class.path_for(:delete), :id => self.name, :delete_token => token) unless token.nil?
+ def delete!
+ raise APIError, "You must be authenticated as the owner of this repository to delete it" if Api.me.login != owner.login
+ token = Api.api.post(self.class.path_for(:delete), :id => self.name)['delete_token']
+ Api.api.post(self.class.path_for(:delete), :id => self.name, :delete_token => token) unless token.nil?
+ end
+
+ def to_s
+ name
end
end
end