From b830d901cb7cda1fd210d0e05b5decc79f579b5e Mon Sep 17 00:00:00 2001 From: Mike Arnold Date: Tue, 16 Jun 2015 11:06:25 -0500 Subject: [PATCH] adding the ability to save the Compose YAML representation of an app as an anonymous Gist --- app/controllers/apps_controller.rb | 8 +++++ app/models/converters/app_converter.rb | 11 +++++++ config/routes.rb | 1 + spec/controllers/apps_controller_spec.rb | 33 ++++++++++++++++++++ spec/models/converters/app_converter_spec.rb | 22 +++++++++++++ 5 files changed, 75 insertions(+) diff --git a/app/controllers/apps_controller.rb b/app/controllers/apps_controller.rb index 27e13ab..2f48fa6 100644 --- a/app/controllers/apps_controller.rb +++ b/app/controllers/apps_controller.rb @@ -65,6 +65,14 @@ def compose_yml end end + def compose_gist + app = App.find(params[:id]) + gist = Converters::AppConverter.new(app).to_compose_gist + html_url = gist[:html_url] + raw_url = gist[:files][Converters::AppConverter::DOCKER_COMPOSE_FILENAME][:raw_url] + render json: { links: { gist: { href: html_url, raw_url: raw_url } } }, status: 201 + end + private def app_update_params diff --git a/app/models/converters/app_converter.rb b/app/models/converters/app_converter.rb index c36021e..4feda23 100644 --- a/app/models/converters/app_converter.rb +++ b/app/models/converters/app_converter.rb @@ -1,5 +1,6 @@ module Converters class AppConverter + DOCKER_COMPOSE_FILENAME = 'docker-compose.yml' attr_reader :app @@ -19,8 +20,18 @@ def to_compose_yaml compose_hash.to_yaml end + def to_compose_gist(filename=DOCKER_COMPOSE_FILENAME) + github_client.create_gist(description: 'created by Panamax', + public: true, + files: { filename => { content: to_compose_yaml } }) + end + private + def github_client + @github_client ||= Octokit::Client.new + end + def service_to_image(service) ServiceConverter.new(service).to_image end diff --git a/config/routes.rb b/config/routes.rb index 8a82e8f..4bff9b3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -15,6 +15,7 @@ put :rebuild post :template get :compose_yml + post :compose_gist end resources :categories, only: [:index, :show, :create, :update, :destroy] diff --git a/spec/controllers/apps_controller_spec.rb b/spec/controllers/apps_controller_spec.rb index b4174a3..51cae3f 100644 --- a/spec/controllers/apps_controller_spec.rb +++ b/spec/controllers/apps_controller_spec.rb @@ -324,4 +324,37 @@ expect(response.body).to eq('{"compose_yaml":"---\\\\n"}') end end + + describe '#compose_gist' do + fixtures :services + + let(:app) { App.first } + let(:converter_response) do + { + html_url: 'html', + files: { 'docker-compose.yml' => { raw_url: 'raw' } } + } + end + let(:converter) { double('converter', to_compose_gist: converter_response) } + let(:expected_response) { { links: { gist: { href: 'html', raw_url: 'raw' } } } } + + before do + allow(Converters::AppConverter).to receive(:new).with(app).and_return(converter) + end + + it 'invokes the app converter' do + expect(Converters::AppConverter).to receive(:new).with(app) + post :compose_gist, id: app.id, format: :json + end + + it 'returns a created status' do + post :compose_gist, id: app.id, format: :json + expect(response.status).to eq(201) + end + + it 'returns the gist URIs' do + post :compose_gist, id: app.id, format: :json + expect(response.body).to eq expected_response.to_json + end + end end diff --git a/spec/models/converters/app_converter_spec.rb b/spec/models/converters/app_converter_spec.rb index 9e8b68f..9e74bcd 100644 --- a/spec/models/converters/app_converter_spec.rb +++ b/spec/models/converters/app_converter_spec.rb @@ -29,4 +29,26 @@ expect(rb.keys).to match_array apps(:app1).services.map(&:name) end end + + context '#to_compose_gist' do + fixtures :apps, :services + + let(:github_client) { double('github_client', create_gist: {}) } + let(:create_params) do + { + description: 'created by Panamax', + public: true, + files: { 'docker-compose.yml' => { content: subject.to_compose_yaml } } + } + end + + before do + allow(Octokit::Client).to receive(:new).and_return(github_client) + end + + it 'uses Octokit to create a new gist' do + expect(github_client).to receive(:create_gist).with(create_params) + subject.to_compose_gist + end + end end