class SocialSnippet::Repository::RepositoryManager

Attributes

core[R]

Public Class Methods

new(new_core) click to toggle source

Constructor

@param new_core [::SocialSnippet::Core]

# File lib/social_snippet/repository/repository_manager.rb, line 10
def initialize(new_core)
  @core = new_core
end

Public Instance Methods

all_repositories() click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 74
def all_repositories
  Models::Repository.all.map {|repo| repo.name }
end
complete(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 110
def complete(keyword)
  if is_completing_repo_name?(keyword)
    complete_repo_name(keyword)
  elsif is_completing_file_path?(keyword)
    complete_file_name(keyword)
  else
    raise "completion error"
  end
end
complete_file_name(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 95
def complete_file_name(keyword)
  repo_name = get_repo_name(keyword)
  package   = find_package(repo_name)
  file_path = keyword_filepath(keyword)
  glob_path = package_glob_path(package, file_path)

  package.glob(glob_path).map do |path|
    if package.directory?(path)
      ::Pathname.new(path).basename.to_s + "/"
    else
      ::Pathname.new(path).basename.to_s + ">"
    end
  end
end
complete_repo_name(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 78
def complete_repo_name(keyword)
  repo_name = get_repo_name_prefix(keyword)
  if repo_name.empty?
    all_repositories
  else
    find_repositories_start_with(repo_name)
  end
end
create_package(driver, ref) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 158
def create_package(driver, ref)
  repo_name = driver.snippet_json["name"]
  package = Models::Package.create(
    :repo_name => repo_name,
    :rev_hash => driver.rev_hash(ref),
    :name => "#{driver.snippet_json["name"]}##{ref}",
  )

  repo = find_repository(repo_name)
  repo.add_package ref

  driver.each_directory(ref) do |dir|
    package.add_directory dir.path
  end
  driver.each_file(ref) do |content|
    package.add_file content.path, content.data
  end

  unless package.snippet_json["dependencies"].nil?
    package.snippet_json["dependencies"].each do |dep_name, dep_ref|
      package.add_dependency dep_name, dep_ref
    end
  end

  package
end
each_repo(&block) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 200
def each_repo(&block)
  Models::Repository.all.each &block
end
exists?(repo_name, repo_ref = nil) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 185
def exists?(repo_name, repo_ref = nil)
  # not found repo
  return false unless Models::Repository.where(:name => repo_name).exists?

  repo = Models::Repository.find_by(:name => repo_name)
  if repo_ref.nil?
    true
  else
    Models::Package.where(
      :repo_name => repo_name,
      :rev_hash => repo.rev_hash[repo_ref],
    ).exists?
  end
end
find_package(name, ref = nil) click to toggle source

Find repository by repo name

@param name [String] The name of repository

# File lib/social_snippet/repository/repository_manager.rb, line 50
def find_package(name, ref = nil)
  repo = find_repository(name)
  ref ||= repo.latest_package_version || repo.current_ref
  raise "invalid references" unless repo.has_ref?(ref)
  Models::Package.find_by(
    :repo_name => name,
    :rev_hash => repo.rev_hash[ref],
  )
end
find_package_by_tag(tag) click to toggle source

Find repository by tag

@param tag [::SocialSnippet::Tag] The tag of repository

# File lib/social_snippet/repository/repository_manager.rb, line 39
def find_package_by_tag(tag)
  if tag.has_ref?
    find_package(tag.repo, tag.ref)
  else
    find_package(tag.repo)
  end
end
find_repositories_start_with(prefix) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 68
def find_repositories_start_with(prefix)
  Models::Repository.where(:name => /^#{prefix}.*/).map do |repo|
    repo.name
  end
end
find_repository(name) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 60
def find_repository(name)
  Models::Repository.find_by(:name => name)
end
find_repository_by_url(url) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 64
def find_repository_by_url(url)
  Models::Repository.find_by(:url => url)
end
get_repo_name(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 120
def get_repo_name(keyword)
  /^[^@]*@[^<]+<([^:#>]*)/.match(keyword)[1]
end
get_repo_name_prefix(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 124
def get_repo_name_prefix(keyword)
  /^[^@]*@[^<]+<([^:#>]*)$/.match(keyword)[1]
end
get_snippet(context, tag) click to toggle source

Get snippet by context and tag

@param context [::SocialSnippet::Context] The context of snippet @param tag [::SocialSnippet::Tag] The tag of snippet

# File lib/social_snippet/repository/repository_manager.rb, line 18
def get_snippet(context, tag)
  ::SocialSnippet::Snippet.new(core, resolve_snippet_path(context, tag))
end
install(url, ref, options = ::Hash.new) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 140
def install(url, ref, options = ::Hash.new)
  driver = core.driver_factory.clone(url)
  ref ||= resolve_ref_by_driver(driver)
  repo = update_repository(driver, url)
  create_package driver, ref
end
is_completing_file_path?(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 136
def is_completing_file_path?(keyword)
  /^[^@]*@[^<]+<[^#:]+:[^>]*$/ === keyword
end
is_completing_repo_name?(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 132
def is_completing_repo_name?(keyword)
  /^[^@]*@[^<]+<[^:#>]*$/ === keyword
end
keyword_filepath(keyword) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 128
def keyword_filepath(keyword)
  /^[^@]*@[^<]+<[^#:]+:([^>]*)$/.match(keyword)[1]
end
package_glob_path(package, path) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 87
def package_glob_path(package, path)
  if package.snippet_json["main"].nil?
    "#{path}*"
  else
    "#{package.snippet_json["main"]}/#{path}*"
  end
end
resolve_ref_by_driver(driver) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 147
def resolve_ref_by_driver(driver)
  driver.latest_version || driver.current_ref
end
resolve_snippet_path(context, tag) click to toggle source

Resolve snippet path by context and tag

@param context [::SocialSnippet::Context] The context of snippet @param tag [::SocialSnippet::Tag] The tag of snippet

# File lib/social_snippet/repository/repository_manager.rb, line 26
def resolve_snippet_path(context, tag)
  if tag.has_repo?
    pkg = find_package_by_tag(tag)
    pkg.snippet_path tag.path
  else
    new_context = context.clone
    new_context.dirname + "/" + tag.filename
  end
end
update_repository(driver, url) click to toggle source
# File lib/social_snippet/repository/repository_manager.rb, line 151
def update_repository(driver, url)
  repo = Models::Repository.find_or_create_by(:url => url)
  repo.update_attributes! :name => driver.snippet_json["name"]
  driver.each_ref {|ref| repo.add_ref ref, driver.rev_hash(ref) }
  repo
end