diff --git a/.gitignore b/.gitignore index 4db1a46..7a19e0e 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,5 @@ pickle-email-*.html .idea/ sgemset -# Vagrant images +# Ignore .vagrant folder with images .vagrant - diff --git a/Gemfile b/Gemfile index 9543073..9ab8627 100644 --- a/Gemfile +++ b/Gemfile @@ -64,6 +64,8 @@ gem "shelly-dependencies" group :development do gem "binding_of_caller" gem "better_errors" + gem "rubocop" + gem "haml-lint" end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 6c7021b..6e2f5fe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -51,6 +51,9 @@ GEM arbre (1.0.2) activesupport (>= 3.0.0) arel (5.0.1.20140414130214) + ast (2.0.0) + astrolabe (1.3.0) + parser (>= 2.2.0.pre.3, < 3.0) awesome_print (1.2.0) bcrypt (3.1.7) better_errors (1.0.1) @@ -106,6 +109,10 @@ GEM actionpack (>= 3.0) haml (4.0.5) tilt + haml-lint (0.8.0) + haml (~> 4.0) + rubocop (>= 0.25.0) + sysexits (~> 1.1) haml-rails (0.5.3) actionpack (>= 4.0.1) activesupport (>= 4.0.1) @@ -153,11 +160,15 @@ GEM orm_adapter (0.5.0) paranoia (2.0.0) activerecord (~> 4.0) + parser (2.2.0.pre.8) + ast (>= 1.1, < 3.0) + slop (~> 3.4, >= 3.4.5) pg (0.17.1) pg-hstore (1.2.0) polyamorous (1.0.0) activerecord (>= 3.0) polyglot (0.3.4) + powerpack (0.0.9) pundit (0.3.0) activesupport (>= 3.0.0) rack (1.5.2) @@ -191,6 +202,7 @@ GEM activesupport (= 4.1.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) + rainbow (2.0.0) rake (10.4.0) ransack (1.2.3) actionpack (>= 3.0) @@ -217,7 +229,14 @@ GEM rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) rspec-mocks (~> 2.14.0) + rubocop (0.27.1) + astrolabe (~> 1.3) + parser (>= 2.2.0.pre.7, < 3.0) + powerpack (~> 0.0.6) + rainbow (>= 1.99.1, < 3.0) + ruby-progressbar (~> 1.4) ruby-graphviz (1.0.9) + ruby-progressbar (1.7.0) sass (3.2.19) sass-rails (4.0.5) railties (>= 4.0.0, < 5.0) @@ -230,6 +249,7 @@ GEM simple_form (3.0.2) actionpack (~> 4.0) activemodel (~> 4.0) + slop (3.6.0) sprockets (2.12.3) hike (~> 1.2) multi_json (~> 1.0) @@ -239,6 +259,7 @@ GEM actionpack (>= 3.0) activesupport (>= 3.0) sprockets (>= 2.8, < 4.0) + sysexits (1.2.0) textacular (3.2.0) activerecord (>= 3.0, < 4.2) thin (1.6.2) @@ -282,6 +303,7 @@ DEPENDENCIES fabrication faker foreman + haml-lint haml-rails has_scope high_voltage (~> 2.1.0) @@ -305,6 +327,7 @@ DEPENDENCIES rest-client rollbar rspec-rails (~> 2.14) + rubocop sass-rails (= 4.0.5) shelly-dependencies simple_form (>= 3.0.0) diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..235d282 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,127 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! +VAGRANTFILE_API_VERSION = "2" + +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + # All Vagrant configuration is done here. The most common configuration + # options are documented and commented below. For a complete reference, + # please see the online documentation at vagrantup.com. + + # Every Vagrant virtual environment requires a box to build off of. + config.vm.box = "ubuntu/trusty64" + config.vm.provision :shell, path: "bootstrap.sh" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network "forwarded_port", guest: 80, host: 8080 + config.vm.network "forwarded_port", guest: 3000, host: 3000, auto_correct: true # For rails + config.vm.network "forwarded_port", guest: 4000, host: 4000, auto_correct: true # For nomachine + config.vm.network "forwarded_port", guest: 5432, host: 15432, auto_correct: true # For PostgreSQL access from PgAdmin + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # If true, then any SSH connections made will enable agent forwarding. + # Default value: false + config.ssh.forward_agent = true + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + config.vm.provider "virtualbox" do |vb| + # # Don't boot with headless mode + # vb.gui = true + + # Use VBoxManage to customize the VM. For example to change memory: + #vb.customize ["modifyvm", :id, "--memory", "1024"] + vb.memory = 1024 + end + # + # View the documentation for the provider you're using for more + # information on available options. + + # Enable provisioning with CFEngine. CFEngine Community packages are + # automatically installed. For example, configure the host as a + # policy server and optionally a policy file to run: + # + # config.vm.provision "cfengine" do |cf| + # cf.am_policy_hub = true + # # cf.run_file = "motd.cf" + # end + # + # You can also configure and bootstrap a client to an existing + # policy server: + # + # config.vm.provision "cfengine" do |cf| + # cf.policy_server_address = "10.0.2.15" + # end + + # Enable provisioning with Puppet stand alone. Puppet manifests + # are contained in a directory path relative to this Vagrantfile. + # You will need to create the manifests directory and a manifest in + # the file default.pp in the manifests_path directory. + # + # config.vm.provision "puppet" do |puppet| + # puppet.manifests_path = "manifests" + # puppet.manifest_file = "default.pp" + # end + + # Enable provisioning with chef solo, specifying a cookbooks path, roles + # path, and data_bags path (all relative to this Vagrantfile), and adding + # some recipes and/or roles. + # + # config.vm.provision "chef_solo" do |chef| + # chef.cookbooks_path = "../my-recipes/cookbooks" + # chef.roles_path = "../my-recipes/roles" + # chef.data_bags_path = "../my-recipes/data_bags" + # chef.add_recipe "mysql" + # chef.add_role "web" + # + # # You may also specify custom JSON attributes: + # chef.json = { mysql_password: "foo" } + # end + + # Enable provisioning with chef server, specifying the chef server URL, + # and the path to the validation key (relative to this Vagrantfile). + # + # The Opscode Platform uses HTTPS. Substitute your organization for + # ORGNAME in the URL and validation key. + # + # If you have your own Chef Server, use the appropriate URL, which may be + # HTTP instead of HTTPS depending on your configuration. Also change the + # validation key to validation.pem. + # + # config.vm.provision "chef_client" do |chef| + # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" + # chef.validation_key_path = "ORGNAME-validator.pem" + # end + # + # If you're using the Opscode platform, your validator client is + # ORGNAME-validator, replacing ORGNAME with your organization name. + # + # If you have your own Chef Server, the default validation client name is + # chef-validator, unless you changed the configuration. + # + # chef.validation_client_name = "ORGNAME-validator" +end diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 0000000..d18c836 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +echo '******************************************************' +echo "Vagrant image provisioning started at " +date +date > /etc/vagrant_provisioned_at +echo '******************************************************' +# 1. Apply updates and install essential dependencies +echo '' +echo '******************************************************' +echo '****** STEP 1 of 10 ***** Applying Ubuntu Updates and installing dependencies' +echo '******************************************************' +echo '' +sudo apt-get -y update +sudo apt-get -y upgrade +sudo apt-get -y install git-core build-essential zlib1g-dev nodejs libpq-dev + +# 2. Configure GIT +echo '' +echo '******************************************************' +echo '****** STEP 2 of 10 ***** Configuring GIT' +echo '******************************************************' +echo '' + +cd /vagrant +git config --global core.autocrlf input +git config --global color.ui true +git config --global push.default simple +git config --global pull.rebase true +git config --global alias.changed "show --pretty=\"format:\" --name-only" +git config --global alias.nicelog "log --pretty=format:'%Cgreen%cd [%h] %Cblue<%an> %Cred%s' --date-order" +git config --global alias.s "status -s" +git config --global alias.lg "log --oneline --decorate --all --graph" +git config --global alias.g "grep --break --heading --line-number" +git remote add upstream https://github.com/coopdevs/timeoverflow.git + +# 3.Install RVM +echo '' +echo '******************************************************' +echo '****** STEP 3 of 10 ***** Installing RVM' +echo '******************************************************' +echo '' + +gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 +\curl -L https://get.rvm.io | bash -s stable +source /etc/profile.d/rvm.sh + +# 4.Install ruby 2.1.4 and bundler +echo '' +echo '******************************************************' +echo '****** STEP 4 of 10 ***** Installing ruby 2.1.4' +echo '******************************************************' +echo '' + +rvm install 2.1.4 +rvm use 2.1.4 +rvm --default 2.1.4 + +# 5.Install bundler and apply gems from Gemfile.lock +echo '' +echo '******************************************************' +echo '****** STEP 5 of 10 ***** Installing Bundler and TimeOverflow gems' +echo '******************************************************' +gem install bundler +bundle install + +# 6.Install and setup PostgreSQL 9.3 +echo '' +echo '******************************************************' +echo '****** STEP 6 of 10 ***** Installing and configuring PostgreSQL for development' +echo '******************************************************' +echo '' +sudo apt-get -y install postgresql postgresql-contrib +pg_hba=`sudo find / -name pg_hba.conf -print -quit|head -1` +sudo -u postgres sed -ibak 's/postgres/all/gi' $pg_hba +sudo -u postgres sed -ibak 's/peer/trust/gi' $pg_hba +sudo -u postgres sed -ibak 's/md5/trust/gi' $pg_hba +sudo service postgresql restart +sudo -u postgres -i psql -c 'CREATE EXTENSION hstore;' +sudo -u postgres -i psql -c 'CREATE USER vagrant WITH SUPERUSER CREATEROLE CREATEDB;' +sudo -u postgres -i psql -c 'CREATE USER root WITH SUPERUSER CREATEROLE CREATEDB;' + +# 7.Create all databases +echo '' +echo '******************************************************' +echo '****** STEP 7 of 10 ***** Creating TimeOverflow Databases (development,test,production)' +echo '******************************************************' +echo '' +rake db:create RAILS_ENV=development +rake db:create RAILS_ENV=test +rake db:create RAILS_ENV=production + +# 8.Grant privileges to user vagrant +echo '' +echo '******************************************************' +echo '****** STEP 8 of 10 ***** Granting privileges to User vagrant on these databases' +echo '******************************************************' +echo '' +sudo -u postgres -i psql -c 'GRANT ALL PRIVILEGES ON DATABASE timeoverflow_development to vagrant;' +sudo -u postgres -i psql -c 'GRANT ALL PRIVILEGES ON DATABASE timeoverflow_test to vagrant;' +sudo -u postgres -i psql -c 'GRANT ALL PRIVILEGES ON DATABASE timeoverflow_production to vagrant;' +sudo -u postgres -i psql -c 'GRANT ALL PRIVILEGES ON DATABASE timeoverflow_development to root;' +sudo -u postgres -i psql -c 'GRANT ALL PRIVILEGES ON DATABASE timeoverflow_test to root;' +sudo -u postgres -i psql -c 'GRANT ALL PRIVILEGES ON DATABASE timeoverflow_production to root;' + +# 9.Run DB migrations +echo '' +echo '******************************************************' +echo '****** STEP 9 of 10 ***** Running Databases Migrations' +echo '******************************************************' +echo '' +rake db:migrate RAILS_ENV=development +rake db:migrate RAILS_ENV=test +rake db:migrate RAILS_ENV=production + +# 10.Run DB seeds +echo '' +echo '******************************************************' +echo '****** STEP 9 of 10 ***** Running Database Seeds' +echo '******************************************************' +echo '' +rake db:seed RAILS_ENV=development +rake db:seed RAILS_ENV=test +rake db:seed RAILS_ENV=production + +# 12.Inform we are DONE! +echo '' +echo '********************** DONE! *************************' +echo 'Vagrant image for TimeOverflow development provisioned! :)' +echo "Date of provisioning saved at /etc/vagrant_provisioned_at file" +echo '******************************************************' +echo '' +echo '******************* IMPORTANT ******************' +echo 'Please remember to finish your git configuration' +echo '' +echo 'Configure your user.name and user.email that will show in Github' +echo '$ git config --global user.email "your@email.com"' +echo '$ git config --global user.name "Your name"' +echo '******************* IMPORTANT *****************' +echo '' +echo '**************' +echo 'What is next?' +echo '**************' +echo '1. launch a session of the TimeOverflow Vagrant image and go to /vagrant folder' +echo ' NOTE: /vagrant folder is a shared folder with your host where TimeOverflow code resides' +echo ' $ vagrant ssh' +echo ' $ cd /vagrant' +echo '2. Then develop using your host editor.' +echo '3. Run TimeOverflow by doing' +echo ' $ cd /vagrant' +echo ' $ rails s' +echo 'As we are doing port forwarding for 3000 you can access the running app from your browser at http://localhost:3000' +echo '' +echo '4. For commits and other GIT commands: You can use GIT from vagrant ssh session or from your host computer' +echo ' If using Windows host machine use GIT from vagrant ssh session' +echo '' +echo 'For more details visit the TimeOverflow Wiki at Github, specially following links' +echo 'https://github.com/coopdevs/timeoverflow/wiki/Getting-started' +echo 'https://github.com/coopdevs/timeoverflow/wiki/Configuring-Postgres-to-Avoid-using-environment-variables' +echo '' +echo '' +echo '******************************************************' +echo "Vagrant image provisioning finished at " +date +date >> /etc/vagrant_provisioned_at +echo '******************************************************' diff --git a/db/seeds.rb b/db/seeds.rb index 7e1fe3f..be3ba60 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -33,7 +33,7 @@ User.find_or_create_by(email: "user@example.com") do |user| user.confirmed_at = DateTime.now.utc user.password = "1234test" user.password_confirmation = "1234test" - user.username = "admin" + user.username = "user" user.gender = "male" user.identity_document = "X1111111X" end @@ -43,7 +43,7 @@ User.find_or_create_by(email: "admin2@example.com") do |user| user.confirmed_at = DateTime.now.utc user.password = "1234test" user.password_confirmation = "1234test" - user.username = "admin" + user.username = "admin2" user.gender = "male" user.identity_document = "X2222222X" end @@ -53,7 +53,7 @@ User.find_or_create_by(email: "user2@example.com") do |user| user.confirmed_at = DateTime.now.utc user.password = "1234test" user.password_confirmation = "1234test" - user.username = "admin" + user.username = "user2" user.gender = "male" user.identity_document = "X3333333X" end