From 91b72481dab98a7a7244d07efad2e3a38d2442ac Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Sat, 20 Feb 2016 12:36:50 +0100 Subject: [PATCH] server list looks like something --- web/Gemfile | 1 + web/Gemfile.lock | 2 + web/app/assets/images/chub.png | Bin 0 -> 2112 bytes web/app/assets/images/ubuntu.png | Bin 0 -> 42973 bytes web/app/assets/javascripts/application.js | 2 + .../{application.css => application.css.scss} | 14 ++++- .../operating_systems_controller.rb | 4 ++ web/app/controllers/servers_controller.rb | 6 +++ web/app/helpers/operating_systems_helper.rb | 2 + web/app/helpers/servers_helper.rb | 2 + web/app/models/operating_system.rb | 3 ++ web/app/models/server.rb | 8 +++ web/app/views/layouts/application.html.erb | 7 ++- web/app/views/servers/list.html.erb | 23 ++++++++ web/config/initializers/assets.rb | 1 + web/config/routes.rb | 4 +- .../migrate/20160220084417_create_servers.rb | 12 +++++ ...20160220091225_create_operating_systems.rb | 8 +++ web/db/schema.rb | 30 +++++++++++ .../operating_systems_controller_test.rb | 49 ++++++++++++++++++ .../controllers/servers_controller_test.rb | 49 ++++++++++++++++++ web/test/fixtures/operating_systems.yml | 11 ++++ web/test/fixtures/servers.yml | 11 ++++ web/test/models/operating_system_test.rb | 7 +++ web/test/models/server_test.rb | 7 +++ 25 files changed, 258 insertions(+), 5 deletions(-) create mode 100644 web/app/assets/images/chub.png create mode 100644 web/app/assets/images/ubuntu.png rename web/app/assets/stylesheets/{application.css => application.css.scss} (83%) create mode 100644 web/app/controllers/operating_systems_controller.rb create mode 100644 web/app/controllers/servers_controller.rb create mode 100644 web/app/helpers/operating_systems_helper.rb create mode 100644 web/app/helpers/servers_helper.rb create mode 100644 web/app/models/operating_system.rb create mode 100644 web/app/models/server.rb create mode 100644 web/app/views/servers/list.html.erb create mode 100644 web/db/migrate/20160220084417_create_servers.rb create mode 100644 web/db/migrate/20160220091225_create_operating_systems.rb create mode 100644 web/db/schema.rb create mode 100644 web/test/controllers/operating_systems_controller_test.rb create mode 100644 web/test/controllers/servers_controller_test.rb create mode 100644 web/test/fixtures/operating_systems.yml create mode 100644 web/test/fixtures/servers.yml create mode 100644 web/test/models/operating_system_test.rb create mode 100644 web/test/models/server_test.rb diff --git a/web/Gemfile b/web/Gemfile index 23b5783..4218ee1 100644 --- a/web/Gemfile +++ b/web/Gemfile @@ -25,6 +25,7 @@ gem 'sdoc', '~> 0.4.0', group: :doc gem 'active_scaffold' gem 'bootstrap', '~> 4.0.0.alpha3' gem 'ace-rails-ap' +gem 'puma' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' diff --git a/web/Gemfile.lock b/web/Gemfile.lock index 9c00e91..ffa7970 100644 --- a/web/Gemfile.lock +++ b/web/Gemfile.lock @@ -86,6 +86,7 @@ GEM parser (2.3.0.6) ast (~> 2.2) powerpack (0.1.1) + puma (2.16.0) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) @@ -171,6 +172,7 @@ DEPENDENCIES coffee-rails (~> 4.1.0) jbuilder (~> 2.0) jquery-rails + puma rails (= 4.2.5.1) rubocop sass-rails (~> 5.0) diff --git a/web/app/assets/images/chub.png b/web/app/assets/images/chub.png new file mode 100644 index 0000000000000000000000000000000000000000..de339c3a32cdcc083ffffbede32df3f1fabbbc5b GIT binary patch literal 2112 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 - +

+CHUB +

+
<%= yield %> - +
diff --git a/web/app/views/servers/list.html.erb b/web/app/views/servers/list.html.erb new file mode 100644 index 0000000..2de515a --- /dev/null +++ b/web/app/views/servers/list.html.erb @@ -0,0 +1,23 @@ +
+
+

Servers

+
+
+ <%= link_to(new_server_path) do %> + + <% end %> + +
+ +
+ <% @page.items.each do |server| %> +
+
+ <%= image_tag('ubuntu.png', size: '128', class:"img-responsive" ) %> +
+

<%= server.name %>

+
+
+
+ <% end %> +
diff --git a/web/config/initializers/assets.rb b/web/config/initializers/assets.rb index 01ef3e6..e8b03f6 100644 --- a/web/config/initializers/assets.rb +++ b/web/config/initializers/assets.rb @@ -9,3 +9,4 @@ Rails.application.config.assets.version = '1.0' # 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 ) +Rails.application.config.assets.precompile += %w( active_scaffold/indicator.gif ) diff --git a/web/config/routes.rb b/web/config/routes.rb index 3f66539..83441d0 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -1,9 +1,11 @@ Rails.application.routes.draw do + resources :operating_systems do as_routes end + resources :servers do as_routes end # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". # You can have the root of your site routed with "root" - # root 'welcome#index' + root 'servers#index' # Example of regular route: # get 'products/:id' => 'catalog#view' diff --git a/web/db/migrate/20160220084417_create_servers.rb b/web/db/migrate/20160220084417_create_servers.rb new file mode 100644 index 0000000..358a7f4 --- /dev/null +++ b/web/db/migrate/20160220084417_create_servers.rb @@ -0,0 +1,12 @@ +class CreateServers < ActiveRecord::Migration + def change + create_table :servers do |t| + t.string :name, null: false + t.string :namehash, null: false + t.integer :operating_system_id, null: false + t.boolean :initialized, null: false, default: false + t.string :hostname + t.timestamps null: false + end + end +end diff --git a/web/db/migrate/20160220091225_create_operating_systems.rb b/web/db/migrate/20160220091225_create_operating_systems.rb new file mode 100644 index 0000000..4dfc35e --- /dev/null +++ b/web/db/migrate/20160220091225_create_operating_systems.rb @@ -0,0 +1,8 @@ +class CreateOperatingSystems < ActiveRecord::Migration + def change + create_table :operating_systems do |t| + t.string :name, null: false + t.timestamps null: false + end + end +end diff --git a/web/db/schema.rb b/web/db/schema.rb new file mode 100644 index 0000000..f1ca930 --- /dev/null +++ b/web/db/schema.rb @@ -0,0 +1,30 @@ +# 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: 20_160_220_091_225) do + create_table 'operating_systems', force: :cascade do |t| + t.string 'name', null: false + t.datetime 'created_at', null: false + t.datetime 'updated_at', null: false + end + + create_table 'servers', force: :cascade do |t| + t.string 'name', null: false + t.string 'namehash', null: false + t.integer 'operating_system_id', null: false + t.boolean 'initialized', default: false, null: false + t.string 'hostname' + t.datetime 'created_at', null: false + t.datetime 'updated_at', null: false + end +end diff --git a/web/test/controllers/operating_systems_controller_test.rb b/web/test/controllers/operating_systems_controller_test.rb new file mode 100644 index 0000000..1037a18 --- /dev/null +++ b/web/test/controllers/operating_systems_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class OperatingSystemsControllerTest < ActionController::TestCase + setup do + @operating_system = operating_systems(:one) + end + + test 'should get index' do + get :index + assert_response :success + assert_not_nil assigns(:operating_systems) + end + + test 'should get new' do + get :new + assert_response :success + end + + test 'should create operating_system' do + assert_difference('OperatingSystem.count') do + post :create, operating_system: {} + end + + assert_redirected_to operating_system_path(assigns(:operating_system)) + end + + test 'should show operating_system' do + get :show, id: @operating_system + assert_response :success + end + + test 'should get edit' do + get :edit, id: @operating_system + assert_response :success + end + + test 'should update operating_system' do + patch :update, id: @operating_system, operating_system: {} + assert_redirected_to operating_system_path(assigns(:operating_system)) + end + + test 'should destroy operating_system' do + assert_difference('OperatingSystem.count', -1) do + delete :destroy, id: @operating_system + end + + assert_redirected_to operating_systems_path + end +end diff --git a/web/test/controllers/servers_controller_test.rb b/web/test/controllers/servers_controller_test.rb new file mode 100644 index 0000000..733a349 --- /dev/null +++ b/web/test/controllers/servers_controller_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' + +class ServersControllerTest < ActionController::TestCase + setup do + @server = servers(:one) + end + + test 'should get index' do + get :index + assert_response :success + assert_not_nil assigns(:servers) + end + + test 'should get new' do + get :new + assert_response :success + end + + test 'should create server' do + assert_difference('Server.count') do + post :create, server: {} + end + + assert_redirected_to server_path(assigns(:server)) + end + + test 'should show server' do + get :show, id: @server + assert_response :success + end + + test 'should get edit' do + get :edit, id: @server + assert_response :success + end + + test 'should update server' do + patch :update, id: @server, server: {} + assert_redirected_to server_path(assigns(:server)) + end + + test 'should destroy server' do + assert_difference('Server.count', -1) do + delete :destroy, id: @server + end + + assert_redirected_to servers_path + end +end diff --git a/web/test/fixtures/operating_systems.yml b/web/test/fixtures/operating_systems.yml new file mode 100644 index 0000000..937a0c0 --- /dev/null +++ b/web/test/fixtures/operating_systems.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/web/test/fixtures/servers.yml b/web/test/fixtures/servers.yml new file mode 100644 index 0000000..937a0c0 --- /dev/null +++ b/web/test/fixtures/servers.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/web/test/models/operating_system_test.rb b/web/test/models/operating_system_test.rb new file mode 100644 index 0000000..46f9239 --- /dev/null +++ b/web/test/models/operating_system_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class OperatingSystemTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/web/test/models/server_test.rb b/web/test/models/server_test.rb new file mode 100644 index 0000000..125ffc9 --- /dev/null +++ b/web/test/models/server_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ServerTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end