diff --git a/ticketee/.gitignore b/ticketee/.gitignore
new file mode 100644
index 0000000..6a502e9
--- /dev/null
+++ b/ticketee/.gitignore
@@ -0,0 +1,16 @@
+# See https://help.github.com/articles/ignoring-files for more about ignoring files.
+#
+# If you find yourself ignoring temporary files generated by your text editor
+# or operating system, you probably want to add a global ignore instead:
+# git config --global core.excludesfile '~/.gitignore_global'
+
+# Ignore bundler config.
+/.bundle
+
+# Ignore the default SQLite database.
+/db/*.sqlite3
+/db/*.sqlite3-journal
+
+# Ignore all logfiles and tempfiles.
+/log/*.log
+/tmp
diff --git a/ticketee/.rspec b/ticketee/.rspec
new file mode 100644
index 0000000..83e16f8
--- /dev/null
+++ b/ticketee/.rspec
@@ -0,0 +1,2 @@
+--color
+--require spec_helper
diff --git a/ticketee/Gemfile b/ticketee/Gemfile
new file mode 100644
index 0000000..2f0bdb1
--- /dev/null
+++ b/ticketee/Gemfile
@@ -0,0 +1,54 @@
+source 'https://rubygems.org'
+
+
+# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
+gem 'rails', '4.2.0.beta4'
+# Use sqlite3 as the database for Active Record
+gem 'sqlite3'
+# Use SCSS for stylesheets
+gem 'sass-rails', '~> 5.0.0.beta1'
+# Use Uglifier as compressor for JavaScript assets
+gem 'uglifier', '>= 1.3.0'
+# Use CoffeeScript for .coffee assets and views
+gem 'coffee-rails', '~> 4.1.0'
+# See https://github.com/sstephenson/execjs#readme for more supported runtimes
+# gem 'therubyracer', platforms: :ruby
+
+# Use jQuery as the JavaScript library
+gem 'jquery-rails', '~> 4.0.0.beta2'
+# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
+gem 'turbolinks'
+# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
+gem 'jbuilder', '~> 2.0'
+# bundle exec rake doc:rails generates the API under doc/api.
+gem 'sdoc', '~> 0.4.0', group: :doc
+
+# Use ActiveModel has_secure_password
+# gem 'bcrypt', '~> 3.1.7'
+
+# Use Unicorn as the app server
+# gem 'unicorn'
+
+# Use Capistrano for deployment
+# gem 'capistrano-rails', group: :development
+
+gem 'bootstrap-sass', '~> 3.3'
+
+group :development, :test do
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+ gem 'byebug'
+
+ # Access an IRB console on exception pages or by using <%= console %> in views
+ gem 'web-console', '~> 2.0.0.beta4'
+
+ # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
+ gem 'spring'
+
+ gem 'rspec-rails', '~> 3.1.0'
+end
+
+group :test do
+ gem 'capybara', '~> 2.4'
+ gem 'factory_girl_rails', '~> 4.5'
+end
+
diff --git a/ticketee/Gemfile.lock b/ticketee/Gemfile.lock
new file mode 100644
index 0000000..a5b644b
--- /dev/null
+++ b/ticketee/Gemfile.lock
@@ -0,0 +1,199 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ actionmailer (4.2.0.beta4)
+ actionpack (= 4.2.0.beta4)
+ actionview (= 4.2.0.beta4)
+ activejob (= 4.2.0.beta4)
+ mail (~> 2.5, >= 2.5.4)
+ rails-dom-testing (~> 1.0, >= 1.0.4)
+ actionpack (4.2.0.beta4)
+ actionview (= 4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ rack (~> 1.6.0.beta)
+ rack-test (~> 0.6.2)
+ rails-dom-testing (~> 1.0, >= 1.0.4)
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
+ actionview (4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ builder (~> 3.1)
+ erubis (~> 2.7.0)
+ rails-dom-testing (~> 1.0, >= 1.0.4)
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
+ activejob (4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ globalid (>= 0.3.0)
+ activemodel (4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ builder (~> 3.1)
+ activerecord (4.2.0.beta4)
+ activemodel (= 4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ arel (>= 6.0.0.beta2, < 6.1)
+ activesupport (4.2.0.beta4)
+ i18n (>= 0.7.0.beta1, < 0.8)
+ json (~> 1.7, >= 1.7.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.1)
+ tzinfo (~> 1.1)
+ arel (6.0.0.beta2)
+ binding_of_caller (0.7.3.pre1)
+ debug_inspector (>= 0.0.1)
+ bootstrap-sass (3.3.0.1)
+ sass (~> 3.2)
+ builder (3.2.2)
+ byebug (3.5.1)
+ columnize (~> 0.8)
+ debugger-linecache (~> 1.2)
+ slop (~> 3.6)
+ capybara (2.4.4)
+ mime-types (>= 1.16)
+ nokogiri (>= 1.3.3)
+ rack (>= 1.0.0)
+ rack-test (>= 0.5.4)
+ xpath (~> 2.0)
+ coffee-rails (4.1.0)
+ coffee-script (>= 2.2.0)
+ railties (>= 4.0.0, < 5.0)
+ coffee-script (2.3.0)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.8.0)
+ columnize (0.8.9)
+ debug_inspector (0.0.2)
+ debugger-linecache (1.2.0)
+ diff-lcs (1.2.5)
+ erubis (2.7.0)
+ execjs (2.2.2)
+ factory_girl (4.5.0)
+ activesupport (>= 3.0.0)
+ factory_girl_rails (4.5.0)
+ factory_girl (~> 4.5.0)
+ railties (>= 3.0.0)
+ globalid (0.3.0)
+ activesupport (>= 4.1.0)
+ hike (1.2.3)
+ i18n (0.7.0.beta1)
+ jbuilder (2.2.4)
+ activesupport (>= 3.0.0, < 5)
+ multi_json (~> 1.2)
+ jquery-rails (4.0.0.beta2)
+ rails-dom-testing (~> 1.0)
+ railties (>= 4.2.0.beta, < 5.0)
+ thor (>= 0.14, < 2.0)
+ json (1.8.1)
+ loofah (2.0.1)
+ nokogiri (>= 1.5.9)
+ mail (2.6.1)
+ mime-types (>= 1.16, < 3)
+ mime-types (2.4.3)
+ mini_portile (0.6.0)
+ minitest (5.4.2)
+ multi_json (1.10.1)
+ nokogiri (1.6.3.1)
+ mini_portile (= 0.6.0)
+ rack (1.6.0.beta)
+ rack-test (0.6.2)
+ rack (>= 1.0)
+ rails (4.2.0.beta4)
+ actionmailer (= 4.2.0.beta4)
+ actionpack (= 4.2.0.beta4)
+ actionview (= 4.2.0.beta4)
+ activejob (= 4.2.0.beta4)
+ activemodel (= 4.2.0.beta4)
+ activerecord (= 4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ bundler (>= 1.3.0, < 2.0)
+ railties (= 4.2.0.beta4)
+ sprockets-rails (~> 3.0.0.beta1)
+ rails-deprecated_sanitizer (1.0.3)
+ activesupport (>= 4.2.0.alpha)
+ rails-dom-testing (1.0.4)
+ activesupport (>= 4.2.0.beta, < 5.0)
+ nokogiri (~> 1.6.0)
+ rails-deprecated_sanitizer (>= 1.0.1)
+ rails-html-sanitizer (1.0.1)
+ loofah (~> 2.0)
+ railties (4.2.0.beta4)
+ actionpack (= 4.2.0.beta4)
+ activesupport (= 4.2.0.beta4)
+ rake (>= 0.8.7)
+ thor (>= 0.18.1, < 2.0)
+ rake (10.3.2)
+ rdoc (4.1.2)
+ json (~> 1.4)
+ rspec-core (3.1.7)
+ rspec-support (~> 3.1.0)
+ rspec-expectations (3.1.2)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.1.0)
+ rspec-mocks (3.1.3)
+ rspec-support (~> 3.1.0)
+ rspec-rails (3.1.0)
+ actionpack (>= 3.0)
+ activesupport (>= 3.0)
+ railties (>= 3.0)
+ rspec-core (~> 3.1.0)
+ rspec-expectations (~> 3.1.0)
+ rspec-mocks (~> 3.1.0)
+ rspec-support (~> 3.1.0)
+ rspec-support (3.1.2)
+ sass (3.4.7)
+ sass-rails (5.0.0.beta1)
+ railties (>= 4.0.0, < 5.0)
+ sass (~> 3.2)
+ sprockets (~> 2.12)
+ sprockets-rails (>= 2.0, < 4.0)
+ sdoc (0.4.1)
+ json (~> 1.7, >= 1.7.7)
+ rdoc (~> 4.0)
+ slop (3.6.0)
+ spring (1.1.3)
+ sprockets (2.12.3)
+ hike (~> 1.2)
+ multi_json (~> 1.0)
+ rack (~> 1.0)
+ tilt (~> 1.1, != 1.3.0)
+ sprockets-rails (3.0.0.beta1)
+ actionpack (>= 4.0)
+ activesupport (>= 4.0)
+ sprockets (~> 2.8)
+ sqlite3 (1.3.10)
+ thor (0.19.1)
+ thread_safe (0.3.4)
+ tilt (1.4.1)
+ turbolinks (2.5.1)
+ coffee-rails
+ tzinfo (1.2.2)
+ thread_safe (~> 0.1)
+ uglifier (2.5.3)
+ execjs (>= 0.3.0)
+ json (>= 1.8.0)
+ web-console (2.0.0.beta4)
+ activemodel (~> 4.0)
+ binding_of_caller (= 0.7.3.pre1)
+ railties (~> 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ xpath (2.0.0)
+ nokogiri (~> 1.3)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ bootstrap-sass (~> 3.3)
+ byebug
+ capybara (~> 2.4)
+ coffee-rails (~> 4.1.0)
+ factory_girl_rails (~> 4.5)
+ jbuilder (~> 2.0)
+ jquery-rails (~> 4.0.0.beta2)
+ rails (= 4.2.0.beta4)
+ rspec-rails (~> 3.1.0)
+ sass-rails (~> 5.0.0.beta1)
+ sdoc (~> 0.4.0)
+ spring
+ sqlite3
+ turbolinks
+ uglifier (>= 1.3.0)
+ web-console (~> 2.0.0.beta4)
diff --git a/ticketee/README.rdoc b/ticketee/README.rdoc
new file mode 100644
index 0000000..dd4e97e
--- /dev/null
+++ b/ticketee/README.rdoc
@@ -0,0 +1,28 @@
+== README
+
+This README would normally document whatever steps are necessary to get the
+application up and running.
+
+Things you may want to cover:
+
+* Ruby version
+
+* System dependencies
+
+* Configuration
+
+* Database creation
+
+* Database initialization
+
+* How to run the test suite
+
+* Services (job queues, cache servers, search engines, etc.)
+
+* Deployment instructions
+
+* ...
+
+
+Please feel free to use a different markup language if you do not plan to run
+rake doc:app.
diff --git a/ticketee/Rakefile b/ticketee/Rakefile
new file mode 100644
index 0000000..ba6b733
--- /dev/null
+++ b/ticketee/Rakefile
@@ -0,0 +1,6 @@
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require File.expand_path('../config/application', __FILE__)
+
+Rails.application.load_tasks
diff --git a/ticketee/app/assets/images/.keep b/ticketee/app/assets/images/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/app/assets/javascripts/application.js b/ticketee/app/assets/javascripts/application.js
new file mode 100644
index 0000000..d6925fa
--- /dev/null
+++ b/ticketee/app/assets/javascripts/application.js
@@ -0,0 +1,16 @@
+// This is a manifest file that'll be compiled into application.js, which will include all the files
+// listed below.
+//
+// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
+// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
+//
+// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
+// compiled file.
+//
+// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
+// about supported directives.
+//
+//= require jquery
+//= require jquery_ujs
+//= require turbolinks
+//= require_tree .
diff --git a/ticketee/app/assets/javascripts/projects.coffee b/ticketee/app/assets/javascripts/projects.coffee
new file mode 100644
index 0000000..24f83d1
--- /dev/null
+++ b/ticketee/app/assets/javascripts/projects.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/ticketee/app/assets/stylesheets/_projects.css.scss b/ticketee/app/assets/stylesheets/_projects.css.scss
new file mode 100644
index 0000000..d019266
--- /dev/null
+++ b/ticketee/app/assets/stylesheets/_projects.css.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the projects controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/ticketee/app/assets/stylesheets/application.css.sass b/ticketee/app/assets/stylesheets/application.css.sass
new file mode 100644
index 0000000..8f8519b
--- /dev/null
+++ b/ticketee/app/assets/stylesheets/application.css.sass
@@ -0,0 +1,4 @@
+@import "bootstrap-sprockets"
+@import "bootstrap"
+
+@import "projects"
diff --git a/ticketee/app/controllers/application_controller.rb b/ticketee/app/controllers/application_controller.rb
new file mode 100644
index 0000000..d83690e
--- /dev/null
+++ b/ticketee/app/controllers/application_controller.rb
@@ -0,0 +1,5 @@
+class ApplicationController < ActionController::Base
+ # Prevent CSRF attacks by raising an exception.
+ # For APIs, you may want to use :null_session instead.
+ protect_from_forgery with: :exception
+end
diff --git a/ticketee/app/controllers/concerns/.keep b/ticketee/app/controllers/concerns/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/app/controllers/projects_controller.rb b/ticketee/app/controllers/projects_controller.rb
new file mode 100644
index 0000000..d6d6f35
--- /dev/null
+++ b/ticketee/app/controllers/projects_controller.rb
@@ -0,0 +1,58 @@
+class ProjectsController < ApplicationController
+ before_action :set_project, only: [:show,
+ :edit,
+ :update,
+ :destroy]
+ def index
+ @projects = Project.all
+ end
+
+ def new
+ @project = Project.new
+ end
+
+ def create
+ @project = Project.new(project_params)
+
+ if @project.save
+ flash[:notice] = "Project has been created."
+ redirect_to @project
+ else
+ flash[:alert] = "Project has not been created."
+ render "new"
+ end
+ end
+
+ def update
+ if @project.update(project_params)
+ flash[:notice] = "Project has been updated."
+ redirect_to @project
+ else
+ flash[:alert] = "Project has not been updated."
+ render "edit"
+ end
+ end
+
+ def destroy
+ @project.destroy
+
+ flash[:notice] = "Project has been destroyed."
+
+ redirect_to projects_path
+ end
+
+ private
+
+ def set_project
+ @project = Project.find(params[:id])
+ rescue ActiveRecord::RecordNotFound
+ flash[:alert] = "The project you were looking" +
+ " for could not be found."
+
+ redirect_to projects_path
+ end
+
+ def project_params
+ params.require(:project).permit(:name, :description)
+ end
+end
diff --git a/ticketee/app/helpers/application_helper.rb b/ticketee/app/helpers/application_helper.rb
new file mode 100644
index 0000000..1f1fea7
--- /dev/null
+++ b/ticketee/app/helpers/application_helper.rb
@@ -0,0 +1,9 @@
+module ApplicationHelper
+ def title(*parts)
+ unless parts.empty?
+ content_for :title do
+ (parts << "Ticketee").join(" - ")
+ end
+ end
+ end
+end
diff --git a/ticketee/app/helpers/projects_helper.rb b/ticketee/app/helpers/projects_helper.rb
new file mode 100644
index 0000000..db5c5ce
--- /dev/null
+++ b/ticketee/app/helpers/projects_helper.rb
@@ -0,0 +1,2 @@
+module ProjectsHelper
+end
diff --git a/ticketee/app/mailers/.keep b/ticketee/app/mailers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/app/models/.keep b/ticketee/app/models/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/app/models/concerns/.keep b/ticketee/app/models/concerns/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/app/models/project.rb b/ticketee/app/models/project.rb
new file mode 100644
index 0000000..afcbfc5
--- /dev/null
+++ b/ticketee/app/models/project.rb
@@ -0,0 +1,3 @@
+class Project < ActiveRecord::Base
+ validates :name, presence: true
+end
diff --git a/ticketee/app/views/layouts/application.html.erb b/ticketee/app/views/layouts/application.html.erb
new file mode 100644
index 0000000..36c4cec
--- /dev/null
+++ b/ticketee/app/views/layouts/application.html.erb
@@ -0,0 +1,26 @@
+
+
+
+
+ <% if content_for?(:title) %>
+ <%= yield(:title) %>
+ <% else %>
+ Ticketee
+ <% end %>
+
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
+ <%= csrf_meta_tags %>
+
+
+
+<% flash.each do |key, message| %>
+
+ <%= message %>
+
+<% end %>
+
+<%= yield %>
+
+
+
diff --git a/ticketee/app/views/projects/_form.html.erb b/ticketee/app/views/projects/_form.html.erb
new file mode 100644
index 0000000..d997193
--- /dev/null
+++ b/ticketee/app/views/projects/_form.html.erb
@@ -0,0 +1,25 @@
+<%= form_for(@project) do |f| %>
+ <% if @project.errors.any? %>
+
+
<%= pluralize(@project.errors.count, "error") %>
+ prohibited this project from being saved:
+
+
+ <% @project.errors.full_messages.each do |msg| %>
+ - <%= msg %>
+ <% end %>
+
+
+ <% end %>
+
+ <%= f.label :name %>
+ <%= f.text_field :name %>
+
+
+
+ <%= f.label :description %>
+ <%= f.text_field :description %>
+
+
+ <%= f.submit %>
+<% end %>
diff --git a/ticketee/app/views/projects/edit.html.erb b/ticketee/app/views/projects/edit.html.erb
new file mode 100644
index 0000000..5910726
--- /dev/null
+++ b/ticketee/app/views/projects/edit.html.erb
@@ -0,0 +1,3 @@
+Edit project
+
+<%= render "form" %>
diff --git a/ticketee/app/views/projects/index.html.erb b/ticketee/app/views/projects/index.html.erb
new file mode 100644
index 0000000..74c9f69
--- /dev/null
+++ b/ticketee/app/views/projects/index.html.erb
@@ -0,0 +1,8 @@
+<%= link_to "New Project", new_project_path %>
+
+Projects
+
+ <% @projects.each do |project| %>
+ - <%= link_to project.name, project %>
+ <% end %>
+
diff --git a/ticketee/app/views/projects/new.html.erb b/ticketee/app/views/projects/new.html.erb
new file mode 100644
index 0000000..18a11c8
--- /dev/null
+++ b/ticketee/app/views/projects/new.html.erb
@@ -0,0 +1,3 @@
+New Project
+
+<%= render "form" %>
diff --git a/ticketee/app/views/projects/show.html.erb b/ticketee/app/views/projects/show.html.erb
new file mode 100644
index 0000000..0479bfa
--- /dev/null
+++ b/ticketee/app/views/projects/show.html.erb
@@ -0,0 +1,9 @@
+<% title(@project.name, "Projects") %>
+<%= @project.name %>
+<%= link_to "Edit Project", edit_project_path(@project) %>
+<%= link_to "Delete Project",
+ project_path(@project),
+ method: :delete,
+ data: { confirm:
+ "Are you sure you want to delete this project?"
+ } %>
diff --git a/ticketee/bin/bundle b/ticketee/bin/bundle
new file mode 100755
index 0000000..66e9889
--- /dev/null
+++ b/ticketee/bin/bundle
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+load Gem.bin_path('bundler', 'bundle')
diff --git a/ticketee/bin/rails b/ticketee/bin/rails
new file mode 100755
index 0000000..7feb6a3
--- /dev/null
+++ b/ticketee/bin/rails
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path("../spring", __FILE__)
+rescue LoadError
+end
+APP_PATH = File.expand_path('../../config/application', __FILE__)
+require_relative '../config/boot'
+require 'rails/commands'
diff --git a/ticketee/bin/rake b/ticketee/bin/rake
new file mode 100755
index 0000000..8017a02
--- /dev/null
+++ b/ticketee/bin/rake
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path("../spring", __FILE__)
+rescue LoadError
+end
+require_relative '../config/boot'
+require 'rake'
+Rake.application.run
diff --git a/ticketee/bin/rspec b/ticketee/bin/rspec
new file mode 100755
index 0000000..0c86b5c
--- /dev/null
+++ b/ticketee/bin/rspec
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by Bundler.
+#
+# The application 'rspec' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
+ Pathname.new(__FILE__).realpath)
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('rspec-core', 'rspec')
diff --git a/ticketee/bin/setup b/ticketee/bin/setup
new file mode 100755
index 0000000..acdb2c1
--- /dev/null
+++ b/ticketee/bin/setup
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+require 'pathname'
+
+# path to your application root.
+APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
+
+Dir.chdir APP_ROOT do
+ # This script is a starting point to setup your application.
+ # Add necessary setup steps to this file:
+
+ puts "== Installing dependencies =="
+ system "gem install bundler --conservative"
+ system "bundle check || bundle install"
+
+ # puts "\n== Copying sample files =="
+ # unless File.exist?("config/database.yml")
+ # system "cp config/database.yml.sample config/database.yml"
+ # end
+
+ puts "\n== Preparing database =="
+ system "bin/rake db:setup"
+
+ puts "\n== Removing old logs and tempfiles =="
+ system "rm -f log/*"
+ system "rm -rf tmp/cache"
+
+ puts "\n== Restarting application server =="
+ system "touch tmp/restart.txt"
+end
diff --git a/ticketee/bin/spring b/ticketee/bin/spring
new file mode 100755
index 0000000..253ec37
--- /dev/null
+++ b/ticketee/bin/spring
@@ -0,0 +1,18 @@
+#!/usr/bin/env ruby
+
+# This file loads spring without using Bundler, in order to be fast
+# It gets overwritten when you run the `spring binstub` command
+
+unless defined?(Spring)
+ require "rubygems"
+ require "bundler"
+
+ if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ spring \((.*?)\)$.*?^$/m)
+ ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
+ ENV["GEM_HOME"] = ""
+ Gem.paths = ENV
+
+ gem "spring", match[1]
+ require "spring/binstub"
+ end
+end
diff --git a/ticketee/config.ru b/ticketee/config.ru
new file mode 100644
index 0000000..5bc2a61
--- /dev/null
+++ b/ticketee/config.ru
@@ -0,0 +1,4 @@
+# This file is used by Rack-based servers to start the application.
+
+require ::File.expand_path('../config/environment', __FILE__)
+run Rails.application
diff --git a/ticketee/config/application.rb b/ticketee/config/application.rb
new file mode 100644
index 0000000..503f3d6
--- /dev/null
+++ b/ticketee/config/application.rb
@@ -0,0 +1,26 @@
+require File.expand_path('../boot', __FILE__)
+
+require 'rails/all'
+
+# Require the gems listed in Gemfile, including any gems
+# you've limited to :test, :development, or :production.
+Bundler.require(*Rails.groups)
+
+module Ticketee
+ class Application < Rails::Application
+ # Settings in config/environments/* take precedence over those specified here.
+ # Application configuration should go into files in config/initializers
+ # -- all .rb files in that directory are automatically loaded.
+
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
+ # config.time_zone = 'Central Time (US & Canada)'
+
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
+ # config.i18n.default_locale = :de
+
+ # Do not swallow errors in after_commit/after_rollback callbacks.
+ config.active_record.raise_in_transactional_callbacks = true
+ end
+end
diff --git a/ticketee/config/boot.rb b/ticketee/config/boot.rb
new file mode 100644
index 0000000..6b750f0
--- /dev/null
+++ b/ticketee/config/boot.rb
@@ -0,0 +1,3 @@
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+
+require 'bundler/setup' # Set up gems listed in the Gemfile.
diff --git a/ticketee/config/database.yml b/ticketee/config/database.yml
new file mode 100644
index 0000000..1c1a37c
--- /dev/null
+++ b/ticketee/config/database.yml
@@ -0,0 +1,25 @@
+# SQLite version 3.x
+# gem install sqlite3
+#
+# Ensure the SQLite 3 gem is defined in your Gemfile
+# gem 'sqlite3'
+#
+default: &default
+ adapter: sqlite3
+ pool: 5
+ timeout: 5000
+
+development:
+ <<: *default
+ database: db/development.sqlite3
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ <<: *default
+ database: db/test.sqlite3
+
+production:
+ <<: *default
+ database: db/production.sqlite3
diff --git a/ticketee/config/environment.rb b/ticketee/config/environment.rb
new file mode 100644
index 0000000..ee8d90d
--- /dev/null
+++ b/ticketee/config/environment.rb
@@ -0,0 +1,5 @@
+# Load the Rails application.
+require File.expand_path('../application', __FILE__)
+
+# Initialize the Rails application.
+Rails.application.initialize!
diff --git a/ticketee/config/environments/development.rb b/ticketee/config/environments/development.rb
new file mode 100644
index 0000000..b55e214
--- /dev/null
+++ b/ticketee/config/environments/development.rb
@@ -0,0 +1,41 @@
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # In the development environment your application's code is reloaded on
+ # every request. This slows down response time but is perfect for development
+ # since you don't have to restart the web server when you make code changes.
+ config.cache_classes = false
+
+ # Do not eager load code on boot.
+ config.eager_load = false
+
+ # Show full error reports and disable caching.
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
+
+ # Don't care if the mailer can't send.
+ config.action_mailer.raise_delivery_errors = false
+
+ # Print deprecation notices to the Rails logger.
+ config.active_support.deprecation = :log
+
+ # Raise an error on page load if there are pending migrations.
+ config.active_record.migration_error = :page_load
+
+ # Debug mode disables concatenation and preprocessing of assets.
+ # This option may cause significant delays in view rendering with a large
+ # number of complex assets.
+ config.assets.debug = true
+
+ # Asset digests allow you to set far-future HTTP expiration dates on all assets,
+ # yet still be able to expire them through the digest params.
+ config.assets.digest = true
+
+ # Adds additional error checking when serving assets at runtime.
+ # Checks for improperly declared sprockets dependencies.
+ # Raises helpful error messages.
+ config.assets.raise_runtime_errors = true
+
+ # Raises error for missing translations
+ # config.action_view.raise_on_missing_translations = true
+end
diff --git a/ticketee/config/environments/production.rb b/ticketee/config/environments/production.rb
new file mode 100644
index 0000000..7c01713
--- /dev/null
+++ b/ticketee/config/environments/production.rb
@@ -0,0 +1,77 @@
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # Code is not reloaded between requests.
+ config.cache_classes = true
+
+ # Eager load code on boot. This eager loads most of Rails and
+ # your application in memory, allowing both threaded web servers
+ # and those relying on copy on write to perform better.
+ # Rake tasks automatically ignore this option for performance.
+ config.eager_load = true
+
+ # Full error reports are disabled and caching is turned on.
+ config.consider_all_requests_local = false
+ config.action_controller.perform_caching = true
+
+ # Enable Rack::Cache to put a simple HTTP cache in front of your application
+ # Add `rack-cache` to your Gemfile before enabling this.
+ # For large-scale production use, consider using a caching reverse proxy like
+ # NGINX, varnish or squid.
+ # config.action_dispatch.rack_cache = true
+
+ # Disable Rails's static asset server (Apache or NGINX will already do this).
+ config.serve_static_assets = false
+
+ # Compress JavaScripts and CSS.
+ config.assets.js_compressor = :uglifier
+ # config.assets.css_compressor = :sass
+
+ # Do not fallback to assets pipeline if a precompiled asset is missed.
+ config.assets.compile = false
+
+ # Asset digests allow you to set far-future HTTP expiration dates on all assets,
+ # yet still be able to expire them through the digest params.
+ config.assets.digest = true
+
+ # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
+
+ # Specifies the header that your server uses for sending files.
+ # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
+ # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
+
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+ # config.force_ssl = true
+
+ # Decrease the log volume.
+ # config.log_level = :info
+
+ # Prepend all log lines with the following tags.
+ # config.log_tags = [ :subdomain, :uuid ]
+
+ # Use a different logger for distributed setups.
+ # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
+
+ # Use a different cache store in production.
+ # config.cache_store = :mem_cache_store
+
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server.
+ # config.action_controller.asset_host = 'http://assets.example.com'
+
+ # Ignore bad email addresses and do not raise email delivery errors.
+ # Set this to true and configure the email server for immediate delivery to raise delivery errors.
+ # config.action_mailer.raise_delivery_errors = false
+
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
+ # the I18n.default_locale when a translation cannot be found).
+ config.i18n.fallbacks = true
+
+ # Send deprecation notices to registered listeners.
+ config.active_support.deprecation = :notify
+
+ # Use default logging formatter so that PID and timestamp are not suppressed.
+ config.log_formatter = ::Logger::Formatter.new
+
+ # Do not dump schema after migrations.
+ config.active_record.dump_schema_after_migration = false
+end
diff --git a/ticketee/config/environments/test.rb b/ticketee/config/environments/test.rb
new file mode 100644
index 0000000..32756eb
--- /dev/null
+++ b/ticketee/config/environments/test.rb
@@ -0,0 +1,42 @@
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # The test environment is used exclusively to run your application's
+ # test suite. You never need to work with it otherwise. Remember that
+ # your test database is "scratch space" for the test suite and is wiped
+ # and recreated between test runs. Don't rely on the data there!
+ config.cache_classes = true
+
+ # Do not eager load code on boot. This avoids loading your whole application
+ # just for the purpose of running a single test. If you are using a tool that
+ # preloads Rails for running tests, you may have to set it to true.
+ config.eager_load = false
+
+ # Configure static asset server for tests with Cache-Control for performance.
+ config.serve_static_assets = true
+ config.static_cache_control = 'public, max-age=3600'
+
+ # Show full error reports and disable caching.
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
+
+ # Raise exceptions instead of rendering exception templates.
+ config.action_dispatch.show_exceptions = false
+
+ # Disable request forgery protection in test environment.
+ config.action_controller.allow_forgery_protection = false
+
+ # Tell Action Mailer not to deliver emails to the real world.
+ # The :test delivery method accumulates sent emails in the
+ # ActionMailer::Base.deliveries array.
+ config.action_mailer.delivery_method = :test
+
+ # Randomize the order test cases are executed
+ config.active_support.test_order = :random
+
+ # Print deprecation notices to the stderr.
+ config.active_support.deprecation = :stderr
+
+ # Raises error for missing translations
+ # config.action_view.raise_on_missing_translations = true
+end
diff --git a/ticketee/config/initializers/assets.rb b/ticketee/config/initializers/assets.rb
new file mode 100644
index 0000000..01ef3e6
--- /dev/null
+++ b/ticketee/config/initializers/assets.rb
@@ -0,0 +1,11 @@
+# Be sure to restart your server when you modify this file.
+
+# Version of your assets, change this if you want to expire all your assets.
+Rails.application.config.assets.version = '1.0'
+
+# Add additional assets to the asset load path
+# Rails.application.config.assets.paths << Emoji.images_path
+
+# Precompile additional assets.
+# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
+# Rails.application.config.assets.precompile += %w( search.js )
diff --git a/ticketee/config/initializers/backtrace_silencers.rb b/ticketee/config/initializers/backtrace_silencers.rb
new file mode 100644
index 0000000..59385cd
--- /dev/null
+++ b/ticketee/config/initializers/backtrace_silencers.rb
@@ -0,0 +1,7 @@
+# Be sure to restart your server when you modify this file.
+
+# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
+# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
+
+# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
+# Rails.backtrace_cleaner.remove_silencers!
diff --git a/ticketee/config/initializers/cookies_serializer.rb b/ticketee/config/initializers/cookies_serializer.rb
new file mode 100644
index 0000000..7f70458
--- /dev/null
+++ b/ticketee/config/initializers/cookies_serializer.rb
@@ -0,0 +1,3 @@
+# Be sure to restart your server when you modify this file.
+
+Rails.application.config.action_dispatch.cookies_serializer = :json
diff --git a/ticketee/config/initializers/filter_parameter_logging.rb b/ticketee/config/initializers/filter_parameter_logging.rb
new file mode 100644
index 0000000..4a994e1
--- /dev/null
+++ b/ticketee/config/initializers/filter_parameter_logging.rb
@@ -0,0 +1,4 @@
+# Be sure to restart your server when you modify this file.
+
+# Configure sensitive parameters which will be filtered from the log file.
+Rails.application.config.filter_parameters += [:password]
diff --git a/ticketee/config/initializers/inflections.rb b/ticketee/config/initializers/inflections.rb
new file mode 100644
index 0000000..ac033bf
--- /dev/null
+++ b/ticketee/config/initializers/inflections.rb
@@ -0,0 +1,16 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new inflection rules using the following format. Inflections
+# are locale specific, and you may define rules for as many different
+# locales as you wish. All of these examples are active by default:
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
+# inflect.plural /^(ox)$/i, '\1en'
+# inflect.singular /^(ox)en/i, '\1'
+# inflect.irregular 'person', 'people'
+# inflect.uncountable %w( fish sheep )
+# end
+
+# These inflection rules are supported but not enabled by default:
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
+# inflect.acronym 'RESTful'
+# end
diff --git a/ticketee/config/initializers/mime_types.rb b/ticketee/config/initializers/mime_types.rb
new file mode 100644
index 0000000..dc18996
--- /dev/null
+++ b/ticketee/config/initializers/mime_types.rb
@@ -0,0 +1,4 @@
+# Be sure to restart your server when you modify this file.
+
+# Add new mime types for use in respond_to blocks:
+# Mime::Type.register "text/richtext", :rtf
diff --git a/ticketee/config/initializers/session_store.rb b/ticketee/config/initializers/session_store.rb
new file mode 100644
index 0000000..a83ac4a
--- /dev/null
+++ b/ticketee/config/initializers/session_store.rb
@@ -0,0 +1,3 @@
+# Be sure to restart your server when you modify this file.
+
+Rails.application.config.session_store :cookie_store, key: '_ticketee_session'
diff --git a/ticketee/config/initializers/wrap_parameters.rb b/ticketee/config/initializers/wrap_parameters.rb
new file mode 100644
index 0000000..33725e9
--- /dev/null
+++ b/ticketee/config/initializers/wrap_parameters.rb
@@ -0,0 +1,14 @@
+# Be sure to restart your server when you modify this file.
+
+# This file contains settings for ActionController::ParamsWrapper which
+# is enabled by default.
+
+# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
+ActiveSupport.on_load(:action_controller) do
+ wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
+end
+
+# To enable root element in JSON for ActiveRecord objects.
+# ActiveSupport.on_load(:active_record) do
+# self.include_root_in_json = true
+# end
diff --git a/ticketee/config/locales/en.yml b/ticketee/config/locales/en.yml
new file mode 100644
index 0000000..0653957
--- /dev/null
+++ b/ticketee/config/locales/en.yml
@@ -0,0 +1,23 @@
+# Files in the config/locales directory are used for internationalization
+# and are automatically loaded by Rails. If you want to use locales other
+# than English, add the necessary files in this directory.
+#
+# To use the locales, use `I18n.t`:
+#
+# I18n.t 'hello'
+#
+# In views, this is aliased to just `t`:
+#
+# <%= t('hello') %>
+#
+# To use a different locale, set it with `I18n.locale`:
+#
+# I18n.locale = :es
+#
+# This would use the information in config/locales/es.yml.
+#
+# To learn more, please read the Rails Internationalization guide
+# available at http://guides.rubyonrails.org/i18n.html.
+
+en:
+ hello: "Hello world"
diff --git a/ticketee/config/routes.rb b/ticketee/config/routes.rb
new file mode 100644
index 0000000..dba34bc
--- /dev/null
+++ b/ticketee/config/routes.rb
@@ -0,0 +1,5 @@
+Rails.application.routes.draw do
+ root 'projects#index'
+
+ resources :projects
+end
diff --git a/ticketee/config/secrets.yml b/ticketee/config/secrets.yml
new file mode 100644
index 0000000..dfbb331
--- /dev/null
+++ b/ticketee/config/secrets.yml
@@ -0,0 +1,22 @@
+# Be sure to restart your server when you modify this file.
+
+# Your secret key is used for verifying the integrity of signed cookies.
+# If you change this key, all old signed cookies will become invalid!
+
+# Make sure the secret is at least 30 characters and all random,
+# no regular words or you'll be exposed to dictionary attacks.
+# You can use `rake secret` to generate a secure secret key.
+
+# Make sure the secrets in this file are kept private
+# if you're sharing your code publicly.
+
+development:
+ secret_key_base: dfb61152d39d3585e42319198c202b76fe8cc4c01187aad27ad51e8836f9249a4ea6c36b47746ac455947cdd3a0573ce1dbd99f166b893d5d53a4e13ab80a729
+
+test:
+ secret_key_base: b54f3456d880e6b042720215384c25b82eb7c406b7c954c97829fa14e79dd6e7328de7b12c1908716e2bf7ee3e1443a91c286ac3e1cd6599a31d60ac250944b7
+
+# Do not keep production secrets in the repository,
+# instead read values from the environment.
+production:
+ secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
diff --git a/ticketee/db/migrate/20141103223843_create_projects.rb b/ticketee/db/migrate/20141103223843_create_projects.rb
new file mode 100644
index 0000000..a2905bc
--- /dev/null
+++ b/ticketee/db/migrate/20141103223843_create_projects.rb
@@ -0,0 +1,10 @@
+class CreateProjects < ActiveRecord::Migration
+ def change
+ create_table :projects do |t|
+ t.string :name
+ t.string :description
+
+ t.timestamps null: false
+ end
+ end
+end
diff --git a/ticketee/db/schema.rb b/ticketee/db/schema.rb
new file mode 100644
index 0000000..b298dab
--- /dev/null
+++ b/ticketee/db/schema.rb
@@ -0,0 +1,23 @@
+# encoding: UTF-8
+# This file is auto-generated from the current state of the database. Instead
+# of editing this file, please use the migrations feature of Active Record to
+# incrementally modify your database, and then regenerate this schema definition.
+#
+# Note that this schema.rb definition is the authoritative source for your
+# database schema. If you need to create the application database on another
+# system, you should be using db:schema:load, not running all the migrations
+# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+# you'll amass, the slower it'll run and the greater likelihood for issues).
+#
+# It's strongly recommended that you check this file into your version control system.
+
+ActiveRecord::Schema.define(version: 20141103223843) do
+
+ create_table "projects", force: true do |t|
+ t.string "name"
+ t.string "description"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+end
diff --git a/ticketee/db/seeds.rb b/ticketee/db/seeds.rb
new file mode 100644
index 0000000..4edb1e8
--- /dev/null
+++ b/ticketee/db/seeds.rb
@@ -0,0 +1,7 @@
+# This file should contain all the record creation needed to seed the database with its default values.
+# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
+#
+# Examples:
+#
+# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
+# Mayor.create(name: 'Emanuel', city: cities.first)
diff --git a/ticketee/lib/assets/.keep b/ticketee/lib/assets/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/lib/tasks/.keep b/ticketee/lib/tasks/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/log/.keep b/ticketee/log/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/public/404.html b/ticketee/public/404.html
new file mode 100644
index 0000000..b612547
--- /dev/null
+++ b/ticketee/public/404.html
@@ -0,0 +1,67 @@
+
+
+
+ The page you were looking for doesn't exist (404)
+
+
+
+
+
+
+
+
+
The page you were looking for doesn't exist.
+
You may have mistyped the address or the page may have moved.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/ticketee/public/422.html b/ticketee/public/422.html
new file mode 100644
index 0000000..a21f82b
--- /dev/null
+++ b/ticketee/public/422.html
@@ -0,0 +1,67 @@
+
+
+
+ The change you wanted was rejected (422)
+
+
+
+
+
+
+
+
+
The change you wanted was rejected.
+
Maybe you tried to change something you didn't have access to.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/ticketee/public/500.html b/ticketee/public/500.html
new file mode 100644
index 0000000..061abc5
--- /dev/null
+++ b/ticketee/public/500.html
@@ -0,0 +1,66 @@
+
+
+
+ We're sorry, but something went wrong (500)
+
+
+
+
+
+
+
+
+
We're sorry, but something went wrong.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/ticketee/public/favicon.ico b/ticketee/public/favicon.ico
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/public/robots.txt b/ticketee/public/robots.txt
new file mode 100644
index 0000000..3c9c7c0
--- /dev/null
+++ b/ticketee/public/robots.txt
@@ -0,0 +1,5 @@
+# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
+#
+# To ban all spiders from the entire site uncomment the next two lines:
+# User-agent: *
+# Disallow: /
diff --git a/ticketee/spec/controllers/projects_controller_spec.rb b/ticketee/spec/controllers/projects_controller_spec.rb
new file mode 100644
index 0000000..70fb702
--- /dev/null
+++ b/ticketee/spec/controllers/projects_controller_spec.rb
@@ -0,0 +1,12 @@
+require 'rails_helper'
+
+RSpec.describe ProjectsController, :type => :controller do
+ it "displays an error for a missing project" do
+ get :show, id: "not-here"
+
+ expect(response).to redirect_to(projects_path)
+ message = "The project you were looking for could not be found."
+
+ expect(flash[:alert]).to eql(message)
+ end
+end
diff --git a/ticketee/spec/factories/project_factory.rb b/ticketee/spec/factories/project_factory.rb
new file mode 100644
index 0000000..c9ef96d
--- /dev/null
+++ b/ticketee/spec/factories/project_factory.rb
@@ -0,0 +1,5 @@
+FactoryGirl.define do
+ factory :project do
+ name "Example project"
+ end
+end
diff --git a/ticketee/spec/features/creating_projects_spec.rb b/ticketee/spec/features/creating_projects_spec.rb
new file mode 100644
index 0000000..c4972c7
--- /dev/null
+++ b/ticketee/spec/features/creating_projects_spec.rb
@@ -0,0 +1,31 @@
+require 'rails_helper'
+
+feature 'Creating Projects' do
+ before do
+ visit '/'
+
+ click_link 'New Project'
+ end
+
+ scenario 'can create a project' do
+ fill_in 'Name', with: 'Sublime Text 3'
+ fill_in 'Description', with: 'A text-editor for OS X'
+ click_button 'Create Project'
+
+ expect(page).to have_content('Project has been created.')
+
+ project = Project.where(name: 'Sublime Text 3').first
+
+ expect(page.current_url).to eql(project_url(project))
+
+ title = 'Sublime Text 3 - Projects - Ticketee'
+ expect(page).to have_title(title)
+ end
+
+ scenario "can not create a project without a name" do
+ click_button 'Create Project'
+
+ expect(page).to have_content("Project has not been created.")
+ expect(page).to have_content("Name can't be blank")
+ end
+end
diff --git a/ticketee/spec/features/deleting_projects_spec.rb b/ticketee/spec/features/deleting_projects_spec.rb
new file mode 100644
index 0000000..67e63db
--- /dev/null
+++ b/ticketee/spec/features/deleting_projects_spec.rb
@@ -0,0 +1,17 @@
+require "rails_helper"
+
+feature "Deleting projects" do
+ scenario "Deleting a project" do
+ FactoryGirl.create(:project, name: "Sublime Text 3")
+
+ visit "/"
+ click_link "Sublime Text 3"
+ click_link "Delete Project"
+
+ expect(page).to have_content("Project has been destroyed.")
+
+ visit "/"
+
+ expect(page).to have_no_content("Sublime Text 3")
+ end
+end
diff --git a/ticketee/spec/features/editing_projects_spec.rb b/ticketee/spec/features/editing_projects_spec.rb
new file mode 100644
index 0000000..32d83b2
--- /dev/null
+++ b/ticketee/spec/features/editing_projects_spec.rb
@@ -0,0 +1,18 @@
+require "rails_helper"
+
+feature "Editing Projects" do
+ before do
+ FactoryGirl.create(:project, name: "Sublime Text 3")
+
+ visit "/"
+ click_link "Sublime Text 3"
+ click_link "Edit Project"
+ end
+
+ scenario "Updating a project" do
+ fill_in "Name", with: "Sublime Text 3 beta"
+ click_button "Update Project"
+
+ expect(page).to have_content("Project has been updated.")
+ end
+end
diff --git a/ticketee/spec/features/viewing_projects_spec.rb b/ticketee/spec/features/viewing_projects_spec.rb
new file mode 100644
index 0000000..4b4dfac
--- /dev/null
+++ b/ticketee/spec/features/viewing_projects_spec.rb
@@ -0,0 +1,10 @@
+require 'rails_helper'
+
+feature 'Viewing projects' do
+ scenario 'Listing all projects' do
+ project = FactoryGirl.create(:project, name: 'Sublime Text 3')
+ visit '/'
+ click_link 'Sublime Text 3'
+ expect(page.current_url).to eql(project_url(project))
+ end
+end
diff --git a/ticketee/spec/rails_helper.rb b/ticketee/spec/rails_helper.rb
new file mode 100644
index 0000000..e6c0b68
--- /dev/null
+++ b/ticketee/spec/rails_helper.rb
@@ -0,0 +1,50 @@
+# This file is copied to spec/ when you run 'rails generate rspec:install'
+ENV["RAILS_ENV"] ||= 'test'
+require 'spec_helper'
+require File.expand_path("../../config/environment", __FILE__)
+require 'rspec/rails'
+# Add additional requires below this line. Rails is not loaded until this point!
+
+# Requires supporting ruby files with custom matchers and macros, etc, in
+# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
+# run as spec files by default. This means that files in spec/support that end
+# in _spec.rb will both be required and run as specs, causing the specs to be
+# run twice. It is recommended that you do not name files matching this glob to
+# end with _spec.rb. You can configure this pattern with the --pattern
+# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
+#
+# The following line is provided for convenience purposes. It has the downside
+# of increasing the boot-up time by auto-requiring all files in the support
+# directory. Alternatively, in the individual `*_spec.rb` files, manually
+# require only the support files necessary.
+#
+# Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
+
+# Checks for pending migrations before tests are run.
+# If you are not using ActiveRecord, you can remove this line.
+ActiveRecord::Migration.maintain_test_schema!
+
+RSpec.configure do |config|
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
+
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
+ # examples within a transaction, remove the following line or assign false
+ # instead of true.
+ config.use_transactional_fixtures = true
+
+ # RSpec Rails can automatically mix in different behaviours to your tests
+ # based on their file location, for example enabling you to call `get` and
+ # `post` in specs under `spec/controllers`.
+ #
+ # You can disable this behaviour by removing the line below, and instead
+ # explicitly tag your specs with their type, e.g.:
+ #
+ # RSpec.describe UsersController, :type => :controller do
+ # # ...
+ # end
+ #
+ # The different available types are documented in the features, such as in
+ # https://relishapp.com/rspec/rspec-rails/docs
+ config.infer_spec_type_from_file_location!
+end
diff --git a/ticketee/spec/spec_helper.rb b/ticketee/spec/spec_helper.rb
new file mode 100644
index 0000000..275ba49
--- /dev/null
+++ b/ticketee/spec/spec_helper.rb
@@ -0,0 +1,85 @@
+# This file was generated by the `rails generate rspec:install` command. Conventionally, all
+# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
+# The generated `.rspec` file contains `--require spec_helper` which will cause this
+# file to always be loaded, without a need to explicitly require it in any files.
+#
+# Given that it is always loaded, you are encouraged to keep this file as
+# light-weight as possible. Requiring heavyweight dependencies from this file
+# will add to the boot time of your test suite on EVERY test run, even for an
+# individual file that may not need all of that loaded. Instead, consider making
+# a separate helper file that requires the additional dependencies and performs
+# the additional setup, and require it from the spec files that actually need it.
+#
+# The `.rspec` file also contains a few flags that are not defaults but that
+# users commonly want.
+#
+# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
+RSpec.configure do |config|
+ # rspec-expectations config goes here. You can use an alternate
+ # assertion/expectation library such as wrong or the stdlib/minitest
+ # assertions if you prefer.
+ config.expect_with :rspec do |expectations|
+ # This option will default to `true` in RSpec 4. It makes the `description`
+ # and `failure_message` of custom matchers include text for helper methods
+ # defined using `chain`, e.g.:
+ # be_bigger_than(2).and_smaller_than(4).description
+ # # => "be bigger than 2 and smaller than 4"
+ # ...rather than:
+ # # => "be bigger than 2"
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
+ end
+
+ # rspec-mocks config goes here. You can use an alternate test double
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
+ config.mock_with :rspec do |mocks|
+ # Prevents you from mocking or stubbing a method that does not exist on
+ # a real object. This is generally recommended, and will default to
+ # `true` in RSpec 4.
+ mocks.verify_partial_doubles = true
+ end
+
+# The settings below are suggested to provide a good initial experience
+# with RSpec, but feel free to customize to your heart's content.
+=begin
+ # These two settings work together to allow you to limit a spec run
+ # to individual examples or groups you care about by tagging them with
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
+ # get run.
+ config.filter_run :focus
+ config.run_all_when_everything_filtered = true
+
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
+ # For more details, see:
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
+ config.disable_monkey_patching!
+
+ # Many RSpec users commonly either run the entire suite or an individual
+ # file, and it's useful to allow more verbose output when running an
+ # individual spec file.
+ if config.files_to_run.one?
+ # Use the documentation formatter for detailed output,
+ # unless a formatter has already been configured
+ # (e.g. via a command-line flag).
+ config.default_formatter = 'doc'
+ end
+
+ # Print the 10 slowest examples and example groups at the
+ # end of the spec run, to help surface which specs are running
+ # particularly slow.
+ config.profile_examples = 10
+
+ # Run specs in random order to surface order dependencies. If you find an
+ # order dependency and want to debug it, you can fix the order by providing
+ # the seed, which is printed after each run.
+ # --seed 1234
+ config.order = :random
+
+ # Seed global randomization in this process using the `--seed` CLI option.
+ # Setting this allows you to use `--seed` to deterministically reproduce
+ # test failures related to randomization by passing the same `--seed` value
+ # as the one that triggered the failure.
+ Kernel.srand config.seed
+=end
+end
diff --git a/ticketee/test/controllers/.keep b/ticketee/test/controllers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/test/fixtures/.keep b/ticketee/test/fixtures/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/test/helpers/.keep b/ticketee/test/helpers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/test/integration/.keep b/ticketee/test/integration/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/test/mailers/.keep b/ticketee/test/mailers/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/test/models/.keep b/ticketee/test/models/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/test/test_helper.rb b/ticketee/test/test_helper.rb
new file mode 100644
index 0000000..92e39b2
--- /dev/null
+++ b/ticketee/test/test_helper.rb
@@ -0,0 +1,10 @@
+ENV['RAILS_ENV'] ||= 'test'
+require File.expand_path('../../config/environment', __FILE__)
+require 'rails/test_help'
+
+class ActiveSupport::TestCase
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
+ fixtures :all
+
+ # Add more helper methods to be used by all tests here...
+end
diff --git a/ticketee/vendor/assets/javascripts/.keep b/ticketee/vendor/assets/javascripts/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/ticketee/vendor/assets/stylesheets/.keep b/ticketee/vendor/assets/stylesheets/.keep
new file mode 100644
index 0000000..e69de29