deployments-app 0.0.1 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -1
- data/Gemfile +21 -4
- data/Gemfile.lock +266 -0
- data/Guardfile +3 -0
- data/Rakefile +2 -0
- data/config.ru +5 -0
- data/config/deployments.yml.example +6 -0
- data/deployments-app.gemspec +3 -0
- data/features/deployments/view_deployments.feature +3 -0
- data/features/home/view_home.feature +22 -0
- data/features/pivotal_tracker/view_pivotal_tracker_story.feature +14 -0
- data/features/projects/new_project.feature +20 -0
- data/features/projects/view_deployments_by_project.feature +15 -0
- data/features/projects/view_projects.feature +12 -0
- data/features/step_definitions/common_steps.rb +4 -0
- data/features/step_definitions/deployments/view_deployments_by_project_steps.rb +11 -0
- data/features/step_definitions/deployments/view_deployments_steps.rb +17 -8
- data/features/step_definitions/home/view_home_steps.rb +16 -0
- data/features/step_definitions/pivotal_tracker/view_pivotal_tracker_steps.rb +16 -0
- data/features/step_definitions/projects/new_project_steps.rb +35 -0
- data/features/step_definitions/projects/view_projects_steps.rb +18 -0
- data/features/support/env.rb +8 -0
- data/lib/deployments-app.rb +19 -6
- data/lib/deployments-app/models/commit.rb +14 -16
- data/lib/deployments-app/models/deployment.rb +18 -21
- data/lib/deployments-app/models/project.rb +9 -13
- data/lib/deployments-app/routes/authentication.rb +1 -3
- data/lib/deployments-app/routes/extensions.rb +1 -3
- data/lib/deployments-app/routes/projects.rb +28 -0
- data/lib/deployments-app/routes/root.rb +7 -2
- data/lib/deployments-app/server.rb +13 -0
- data/lib/deployments-app/version.rb +1 -1
- data/lib/deployments-app/views/deployments/index.haml +13 -5
- data/lib/deployments-app/views/layouts/application.haml +39 -0
- data/lib/deployments-app/views/projects/index.haml +10 -0
- data/lib/deployments-app/views/projects/new.haml +7 -0
- data/public/css/bootstrap-responsive.min.css +9 -0
- data/public/css/bootstrap.min.css +622 -0
- data/public/img/glyphicons-halflings-white.png +0 -0
- data/public/img/glyphicons-halflings.png +0 -0
- data/public/js/bootstrap.min.js +6 -0
- data/public/js/jquery.min.js +4 -0
- data/spec/factories/commits.rb +1 -1
- data/spec/factories/deployments.rb +14 -2
- data/spec/factories/projects.rb +3 -2
- data/spec/models/commit_spec.rb +1 -3
- data/spec/models/deployment_spec.rb +13 -27
- data/spec/models/project_spec.rb +16 -7
- data/spec/routes/projects_spec.rb +31 -0
- data/spec/routes/root_spec.rb +50 -0
- data/spec/spec_helper.rb +15 -2
- data/spec/support/data_mapper.rb +1 -4
- data/spec/support/factory_girl.rb +18 -0
- metadata +91 -5
- data/config/database.yml.example +0 -6
- data/spec/routes/deployments_spec.rb +0 -20
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: View deployments following by name of the project
|
2
|
+
In order to view deployments
|
3
|
+
As an user
|
4
|
+
I want to be able navigate to the selected project to see deployments from the projects list page
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I have project with deployments
|
8
|
+
|
9
|
+
When I am on the projects page
|
10
|
+
|
11
|
+
Scenario: View deployments following by name
|
12
|
+
When I follow by name of the project
|
13
|
+
Then I should see deployments of staging
|
14
|
+
And I should see commits that was deployed to the staging
|
15
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Feature: View projects
|
2
|
+
In order to view existing projects in the app
|
3
|
+
As an user
|
4
|
+
I want to be able to open projects page and see list of projects
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I have few projects
|
8
|
+
|
9
|
+
Scenario: View list of projects
|
10
|
+
When I am on the projects page
|
11
|
+
Then I should see list of projects
|
12
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
include Deployments::App
|
2
|
+
|
3
|
+
Given /^I have project with deployments$/ do
|
4
|
+
@project = create(:project)
|
5
|
+
@deployment = create(:deployment_with_commits, :env => 'staging', :project => @project)
|
6
|
+
end
|
7
|
+
|
8
|
+
When /^I follow by name of the project$/ do
|
9
|
+
click_link @project.name
|
10
|
+
end
|
11
|
+
|
@@ -1,6 +1,7 @@
|
|
1
|
+
include Deployments::App
|
2
|
+
|
1
3
|
Given /^I have already deployed project to the (staging|production)$/ do |env|
|
2
|
-
@deployment =
|
3
|
-
@deployment.save
|
4
|
+
@deployment = create(:deployment_with_commits, :env => env, :project => @project)
|
4
5
|
end
|
5
6
|
|
6
7
|
When /^I am on the deployments page$/ do
|
@@ -8,13 +9,13 @@ When /^I am on the deployments page$/ do
|
|
8
9
|
end
|
9
10
|
|
10
11
|
Then /^I should see deployments of (staging|production)$/ do |env|
|
11
|
-
|
12
|
+
deployment = Deployment.first(:env => env)
|
12
13
|
|
13
|
-
within(
|
14
|
-
find('.env').should have_content(
|
15
|
-
find('.host_name').should have_content(
|
16
|
-
find('.author').should have_content(
|
17
|
-
find('.version').should have_content(
|
14
|
+
within("#deployments #deployments_app_deployment_#{deployment.id}") do
|
15
|
+
find('.env').should have_content(deployment.env)
|
16
|
+
find('.host_name').should have_content(deployment.host_name)
|
17
|
+
find('.author').should have_content(deployment.author)
|
18
|
+
find('.version').should have_content(deployment.version)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
@@ -22,3 +23,11 @@ Given /^I have a project$/ do
|
|
22
23
|
@project = create(:project)
|
23
24
|
end
|
24
25
|
|
26
|
+
Then /^I should see commits that was deployed to the (staging|production)$/ do |env|
|
27
|
+
deployment = Deployment.first(:env => env)
|
28
|
+
|
29
|
+
within("#deployments .commits") do
|
30
|
+
find('.message').should have_content('Added file')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
When /^I am on the home page$/ do
|
2
|
+
visit '/projects'
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I click on the logo of the website$/ do
|
6
|
+
click_on "Deployments"
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^I should be on the home page$/ do
|
10
|
+
current_path.should match(/\/projects/)
|
11
|
+
end
|
12
|
+
|
13
|
+
When /^I click on the home tab$/ do
|
14
|
+
click_on "Home"
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Given /^I have a deployments with pivotal tracker stories$/ do
|
2
|
+
pending # express the regexp above with the code you wish you had
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I am on the project page$/ do
|
6
|
+
pending # express the regexp above with the code you wish you had
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^I should see ids of pivotal tracker stories$/ do
|
10
|
+
pending # express the regexp above with the code you wish you had
|
11
|
+
end
|
12
|
+
|
13
|
+
Then /^I should be abe to navigate following id$/ do
|
14
|
+
pending # express the regexp above with the code you wish you had
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
include Deployments::App
|
2
|
+
|
3
|
+
Given /^I am on the new project page$/ do
|
4
|
+
visit '/projects/new'
|
5
|
+
end
|
6
|
+
|
7
|
+
When /^I fill all required fields$/ do
|
8
|
+
fill_in 'Name', :with => "Tetris"
|
9
|
+
end
|
10
|
+
|
11
|
+
When /^I save changes$/ do
|
12
|
+
click_on "Save"
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^I should see new project in the list$/ do
|
16
|
+
project = Project.last
|
17
|
+
|
18
|
+
within '#projects' do
|
19
|
+
find('.name').should have_content(project.name)
|
20
|
+
find('.api_key').should have_content(project.api_key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
When /^I don't fill one required field$/ do
|
25
|
+
fill_in 'Name', :with => ''
|
26
|
+
end
|
27
|
+
|
28
|
+
Then /^I should see error notification$/ do
|
29
|
+
pending # express the regexp above with the code you wish you had
|
30
|
+
end
|
31
|
+
|
32
|
+
When /^I click on the new project button$/ do
|
33
|
+
click_on "New"
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Given /^I have few projects$/ do
|
2
|
+
@projects = []
|
3
|
+
2.times { @projects << create(:project) }
|
4
|
+
end
|
5
|
+
|
6
|
+
When /^I am on the projects page$/ do
|
7
|
+
visit '/projects'
|
8
|
+
end
|
9
|
+
|
10
|
+
Then /^I should see list of projects$/ do
|
11
|
+
@projects.each do |project|
|
12
|
+
within("#projects #deployments_app_project_#{project.id}") do
|
13
|
+
find('.name').should have_content(project.name)
|
14
|
+
find('.api_key').should have_content(project.api_key)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
data/features/support/env.rb
CHANGED
@@ -9,6 +9,7 @@ require 'factory_girl'
|
|
9
9
|
|
10
10
|
Dir[File.join(File.dirname(__FILE__), "../../spec/factories/*.rb")].each {|f| require f}
|
11
11
|
require File.join(File.dirname(__FILE__), '../../spec/support/data_mapper')
|
12
|
+
require File.join(File.dirname(__FILE__), '../../spec/support/factory_girl')
|
12
13
|
|
13
14
|
Capybara.app = Deployments::App::Server
|
14
15
|
|
@@ -17,3 +18,10 @@ World(RSpec::Expectations)
|
|
17
18
|
World(RSpec::Matchers)
|
18
19
|
World(FactoryGirl::Syntax::Methods)
|
19
20
|
|
21
|
+
begin
|
22
|
+
require 'database_cleaner'
|
23
|
+
require 'database_cleaner/cucumber'
|
24
|
+
DatabaseCleaner.strategy = :truncation
|
25
|
+
rescue NameError
|
26
|
+
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
|
27
|
+
end
|
data/lib/deployments-app.rb
CHANGED
@@ -1,18 +1,31 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
2
|
+
|
3
|
+
require 'dm-core'
|
4
|
+
require 'dm-validations'
|
5
|
+
require 'dm-migrations'
|
6
|
+
require 'dm-transactions'
|
7
|
+
require 'dm-serializer'
|
8
|
+
require 'dm-timestamps'
|
9
|
+
require 'dm-types'
|
10
|
+
require 'dm-constraints'
|
11
|
+
|
3
12
|
require 'sinatra'
|
4
13
|
|
5
14
|
require "deployments-app/version"
|
15
|
+
|
6
16
|
require 'deployments-app/models/commit'
|
7
17
|
require 'deployments-app/models/deployment'
|
8
18
|
require 'deployments-app/models/project'
|
9
19
|
|
10
|
-
require 'deployments-app/routes/authentication'
|
11
|
-
require 'deployments-app/routes/root'
|
12
|
-
require 'deployments-app/routes/extensions'
|
13
|
-
require 'deployments-app/server'
|
14
|
-
|
15
20
|
module Deployments
|
16
21
|
module App
|
22
|
+
module Routes
|
23
|
+
autoload :Extensions, 'deployments-app/routes/extensions'
|
24
|
+
autoload :Root, 'deployments-app/routes/root'
|
25
|
+
autoload :Projects, 'deployments-app/routes/projects'
|
26
|
+
autoload :Authentication, 'deployments-app/routes/authentication'
|
27
|
+
end
|
28
|
+
|
29
|
+
autoload :Server, 'deployments-app/server'
|
17
30
|
end
|
18
31
|
end
|
@@ -1,29 +1,27 @@
|
|
1
1
|
module Deployments
|
2
2
|
module App
|
3
|
-
|
4
|
-
|
5
|
-
include DataMapper::Resource
|
3
|
+
class Commit
|
4
|
+
include DataMapper::Resource
|
6
5
|
|
7
|
-
|
6
|
+
property :id, Serial
|
8
7
|
|
9
|
-
|
10
|
-
|
8
|
+
property :sha, String, :required => true
|
9
|
+
validates_presence_of :sha
|
11
10
|
|
12
|
-
|
13
|
-
|
11
|
+
property :message, Text, :required => true
|
12
|
+
validates_presence_of :message
|
14
13
|
|
15
|
-
|
16
|
-
|
14
|
+
property :created_at, DateTime, :required => true
|
15
|
+
validates_presence_of :created_at
|
17
16
|
|
18
|
-
|
17
|
+
has n, :deployments, :through => Resource
|
19
18
|
|
20
|
-
|
21
|
-
|
19
|
+
def self.find_by_sha_or_create(commit)
|
20
|
+
existing = first(:sha => commit[:sha])
|
22
21
|
|
23
|
-
|
22
|
+
return Commit.create(commit) unless existing
|
24
23
|
|
25
|
-
|
26
|
-
end
|
24
|
+
existing
|
27
25
|
end
|
28
26
|
end
|
29
27
|
end
|
@@ -1,35 +1,32 @@
|
|
1
1
|
module Deployments
|
2
2
|
module App
|
3
|
-
|
3
|
+
class Deployment
|
4
|
+
include DataMapper::Resource
|
4
5
|
|
5
|
-
|
6
|
-
include DataMapper::Resource
|
6
|
+
property :id, Serial
|
7
7
|
|
8
|
-
|
8
|
+
property :author, String, :required => true
|
9
|
+
validates_presence_of :author
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
property :env, String, :required => true
|
12
|
+
validates_presence_of :env
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
property :host_name, String, :required => true
|
15
|
+
validates_presence_of :host_name
|
15
16
|
|
16
|
-
|
17
|
-
|
17
|
+
property :version, String, :required => true
|
18
|
+
validates_presence_of :version
|
18
19
|
|
19
|
-
|
20
|
-
|
20
|
+
attr_accessor :commit_attributes
|
21
|
+
validates_presence_of :commit_attributes
|
21
22
|
|
22
|
-
|
23
|
-
validates_presence_of :commit_attributes
|
23
|
+
belongs_to :project
|
24
24
|
|
25
|
-
|
25
|
+
has n, :commits, :through => Resource
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
self.commit_attributes.each do |commit|
|
31
|
-
self.commits << Commit.find_by_sha_or_create(commit)
|
32
|
-
end
|
27
|
+
before :create do
|
28
|
+
self.commit_attributes.each do |sha, commit|
|
29
|
+
self.commits << Commit.find_by_sha_or_create(commit.merge(:sha => sha))
|
33
30
|
end
|
34
31
|
end
|
35
32
|
end
|
@@ -2,23 +2,19 @@ require 'uniquify'
|
|
2
2
|
|
3
3
|
module Deployments
|
4
4
|
module App
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
include Uniquify
|
5
|
+
class Project
|
6
|
+
include DataMapper::Resource
|
7
|
+
include Uniquify
|
9
8
|
|
10
|
-
|
9
|
+
property :id, Serial
|
11
10
|
|
12
|
-
|
13
|
-
|
11
|
+
property :name, String
|
12
|
+
validates_presence_of :name
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
validates_presence_of :api_key
|
18
|
-
validates_uniqueness_of :api_key
|
14
|
+
property :api_key, String
|
15
|
+
uniquify :api_key
|
19
16
|
|
20
|
-
|
21
|
-
end
|
17
|
+
has n, :deployments
|
22
18
|
end
|
23
19
|
end
|
24
20
|
end
|
@@ -2,10 +2,8 @@ module Deployments
|
|
2
2
|
module App
|
3
3
|
module Routes
|
4
4
|
class Authentication < Sinatra::Base
|
5
|
-
include Deployments::App::Models
|
6
|
-
|
7
5
|
before '/deployments' do
|
8
|
-
projects = Project.
|
6
|
+
projects = Project.all(:api_key => params[:api_key]).count
|
9
7
|
|
10
8
|
return halt(401) if projects.zero?
|
11
9
|
end
|
@@ -2,15 +2,13 @@ module Deployments
|
|
2
2
|
module App
|
3
3
|
module Routes
|
4
4
|
module Extensions
|
5
|
-
|
6
5
|
def self.included(base)
|
7
6
|
base.class_eval do
|
8
7
|
def current_project
|
9
|
-
@project ||=
|
8
|
+
@project ||= Project.first(:api_key => params[:api_key])
|
10
9
|
end
|
11
10
|
end
|
12
11
|
end
|
13
|
-
|
14
12
|
end
|
15
13
|
end
|
16
14
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Deployments
|
2
|
+
module App
|
3
|
+
module Routes
|
4
|
+
class Projects < Sinatra::Base
|
5
|
+
set :views, File.expand_path(settings.root + "/../views/projects")
|
6
|
+
set :haml, :layout => :"../layouts/application"
|
7
|
+
|
8
|
+
get '/projects' do
|
9
|
+
@projects = Project.all
|
10
|
+
|
11
|
+
haml :index
|
12
|
+
end
|
13
|
+
|
14
|
+
get '/projects/new' do
|
15
|
+
haml :new
|
16
|
+
end
|
17
|
+
|
18
|
+
post '/projects' do
|
19
|
+
@project = Project.new(params[:project])
|
20
|
+
@project.save
|
21
|
+
|
22
|
+
redirect '/projects'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -2,15 +2,20 @@ module Deployments
|
|
2
2
|
module App
|
3
3
|
module Routes
|
4
4
|
class Root < Sinatra::Base
|
5
|
-
include Deployments::App::Models
|
6
|
-
|
7
5
|
set :views, File.expand_path(settings.root + "/../views/deployments")
|
6
|
+
set :haml, :layout => :"../layouts/application"
|
8
7
|
|
9
8
|
get "/deployments" do
|
10
9
|
@deployments = current_project.deployments
|
11
10
|
|
12
11
|
haml :index
|
13
12
|
end
|
13
|
+
|
14
|
+
post "/deployments" do
|
15
|
+
deployment = Deployment.new(params[:deployment])
|
16
|
+
deployment.project = current_project
|
17
|
+
deployment.save
|
18
|
+
end
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|