class CommunityZero::CookbooksEndpoint
The endpoint for all cookbooks.
@author Seth Vargo <sethvargo@gmail.com>
Public Instance Methods
get(request)
click to toggle source
GET /cookbooks
# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 27 def get(request) start = Integer(request.query_params['start'] || 0) items = Integer(request.query_params['items'] || 10) cookbooks = store.cookbooks[start...items] || [] respond({ 'items' => cookbooks.collect { |cookbook| { 'cookbook_name' => cookbook.name, 'cookbook_description' => cookbook.description, 'cookbook' => url_for(cookbook), 'cookbook_maintainer' => cookbook.maintainer } }, 'total' => store.size, 'start' => start.to_i, }) end
post(request)
click to toggle source
POST /cookbooks
# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 47 def post(request) params = Rack::Utils::Multipart.parse_multipart(request.env) cookbook = JSON.parse(params['cookbook'], symbolize_names: true) tarball = params['tarball'] metadata = find_metadata(tarball) if store.find(metadata.name, metadata.version) respond(401, { 'error_code' => 'ALREADY_EXISTS', 'error_messages' => ['Resource already exists'], } ) else respond(create_cookbook(metadata, cookbook).to_hash) end end
Private Instance Methods
create_cookbook(metadata, overrides = {})
click to toggle source
Create the cookbook from the metadata.
@param [CommunityZero::Metadata] metadata
the metadata to create the cookbook from
# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 71 def create_cookbook(metadata, overrides = {}) cookbook = Cookbook.new({ :name => metadata.name, :category => nil, :maintainer => metadata.maintainer, :description => metadata.description, :version => metadata.version }.merge(overrides)) store.add(cookbook) cookbook end
find_metadata(tarball)
click to toggle source
Parse the metadata from the tarball.
@param [Tempfile] tarball
the temporarily uploaded file
@return [Metadata]
# File lib/community_zero/endpoints/cookbooks_endpoint.rb, line 91 def find_metadata(tarball) gzip = Zlib::GzipReader.new(tarball[:tempfile]) tar = Gem::Package::TarReader.new(gzip) tar.each do |entry| if entry.full_name =~ /metadata\.json$/ return Metadata.from_json(entry.read) elsif entry.full_name =~ /metadata\.rb$/ return Metadata.from_ruby(entry.read) end end ensure tar.close end