lib/octokit/repository.rb in octokit-4.1.0 vs lib/octokit/repository.rb in octokit-4.1.1
- old
+ new
@@ -2,36 +2,39 @@
# Class to parse GitHub repository owner and name from
# URLs and to generate URLs
class Repository
attr_accessor :owner, :name, :id
+ NAME_WITH_OWNER_PATTERN = /\A[\w.-]+\/[\w.-]+\z/i
# Instantiate from a GitHub repository URL
#
# @return [Repository]
def self.from_url(url)
Repository.new(URI.parse(url).path[1..-1])
end
+ # @raise [Octokit::InvalidRepository] if the repository
+ # has an invalid format
def initialize(repo)
case repo
when Integer
@id = repo
- when String
- @owner, @name = repo.split('/')
- unless @owner && @name
- raise ArgumentError, "Invalid Repository. Use user/repo format."
- end
+ when NAME_WITH_OWNER_PATTERN
+ @owner, @name = repo.split("/")
when Repository
@owner = repo.owner
@name = repo.name
when Hash
@name = repo[:repo] ||= repo[:name]
@owner = repo[:owner] ||= repo[:user] ||= repo[:username]
else
- raise ArgumentError, "Invalid Repository. Use user/repo format."
+ raise_invalid_repository!
end
+ if @owner && @name
+ validate_owner_and_name!
+ end
end
# Repository owner/name
# @return [String]
def slug
@@ -69,7 +72,19 @@
end
alias :user :owner
alias :username :owner
alias :repo :name
+
+ private
+
+ def validate_owner_and_name!
+ if @owner.include?('/') || @name.include?('/') || !url.match(/\A#{URI.regexp}\z/)
+ raise_invalid_repository!
+ end
+ end
+
+ def raise_invalid_repository!
+ raise Octokit::InvalidRepository, "Invalid Repository. Use user/repo format."
+ end
end
end