class Tanuki::Universe::Commands::Generate

Public Class Methods

new(config_file) click to toggle source
# File lib/tanuki/universe/commands/generate.rb, line 12
def initialize(config_file)
  config = Tanuki::Universe::Config.new(config_file)

  config.endpoints.each do |endpoint|
    case endpoint['type']
    when 'gitlab' then type_gitlab(endpoint)
    end
  end
end

Public Instance Methods

parse_metadata(metadata) click to toggle source
# File lib/tanuki/universe/commands/generate.rb, line 64
def parse_metadata(metadata)
  @dependencies = {}
  metadata.each_line do |line|
    @cookbook_name = line.gsub(/^name|'/, '').strip if line.match(/^name/)
    @version = line.gsub(/^version|'/, '').strip if line.match(/^version/)
    if line.match(/^depends/)
      depends_cookbook_name = line.split(',')[0].gsub(/^depends|'/, '').strip
      depends_version = line.split(',')[1].to_s.gsub(/'/, '').strip
      @dependencies = @dependencies.update({depends_cookbook_name => depends_version})
    end
  end
end
type_gitlab(endpoint) click to toggle source
# File lib/tanuki/universe/commands/generate.rb, line 22
def type_gitlab(endpoint)
  universe = {}

  gitlab = Tanuki::Universe::GitlabClient.new(endpoint['options'])
  groups = gitlab.get_groups
  groups.each do |g|
    group = gitlab.get_projects(g.id)
    projects = group.projects
    projects.each do |project|
      versions = {}
  
      git_tags = gitlab.get_git_tags(project['id'])
      next if git_tags.count == 0
  
      git_tags.each do |tag|
        begin
        metadata = gitlab.get_metadata(project['id'], tag.name)
        rescue Exception => e
          next if e.message == "undefined method `message' for {\"message\"=>\"404 File Not Found\"}:Hash"
        end
        parse_metadata(metadata)
  
        dependencies_hash = Hash.new { |h,k| h[k] = {} }
        if @dependencies.count == 0
          dependencies_hash["dependencies"] = {}
        end
        @dependencies.each do |k, v|
          v = '>= 0.0.0' if v.empty?
          dependencies_hash["dependencies"] = dependencies_hash["dependencies"].update({k => v})
        end
        @location_path = project['web_url'] + '/repository/archive.tar.gz?ref=v' + @version
  
        versions = versions.update({ @version => { "location_path" => @location_path, "location_type" => endpoint['type'] }.update(dependencies_hash)})
      end
      universe = universe.update({@cookbook_name => versions })
    end
  end 

  json_str = JSON.pretty_generate(universe)
  puts json_str
end