Browse Source

Dev env Containerized + initial work experience model

main
rodley82 3 years ago
parent
commit
d3bf897550
  1. 34
      Dockerfile
  2. 2
      Gemfile
  3. 70
      app/controllers/work_experiences_controller.rb
  4. 2
      app/helpers/work_experiences_helper.rb
  5. 2
      app/models/work_experience.rb
  6. 42
      app/views/work_experiences/_form.html.erb
  7. 27
      app/views/work_experiences/_work_experience.html.erb
  8. 2
      app/views/work_experiences/_work_experience.json.jbuilder
  9. 10
      app/views/work_experiences/edit.html.erb
  10. 14
      app/views/work_experiences/index.html.erb
  11. 1
      app/views/work_experiences/index.json.jbuilder
  12. 9
      app/views/work_experiences/new.html.erb
  13. 10
      app/views/work_experiences/show.html.erb
  14. 1
      app/views/work_experiences/show.json.jbuilder
  15. 1
      config/routes.rb
  16. 13
      db/migrate/20220830202251_create_work_experiences.rb
  17. 24
      db/schema.rb
  18. 11
      docker-compose.yml
  19. 34
      docker-entrypoint.sh
  20. 48
      test/controllers/work_experiences_controller_test.rb
  21. 15
      test/fixtures/work_experiences.yml
  22. 7
      test/models/work_experience_test.rb
  23. 49
      test/system/work_experiences_test.rb

34
Dockerfile

@ -0,0 +1,34 @@
#FROM ubuntu:focal
FROM ruby:3.1.2
ENV REGULAR_USER=cvrails
ENV REGULAR_USER_UID=1000
ENV REGULAR_USER_GID=1000
ENV REGULAR_USER_HOME=/home/${REGULAR_USER}
ENV REGULAR_USER_APP_HOME=${REGULAR_USER_HOME}/app
RUN groupadd -r --gid ${REGULAR_USER_GID} ${REGULAR_USER}
RUN useradd --system --no-log-init --uid ${REGULAR_USER_UID} --gid ${REGULAR_USER_GID} --home-dir ${REGULAR_USER_HOME} --create-home --shell /bin/bash ${REGULAR_USER}
RUN mkdir -p ${REGULAR_USER_APP_HOME} && chown -R ${REGULAR_USER}:${REGULAR_USER} ${REGULAR_USER_APP_HOME}
RUN apt update && \
apt install -y texlive texinfo texlive-fonts-recommended texlive-latex-extra
USER ${REGULAR_USER}
WORKDIR ${REGULAR_USER_APP_HOME}
# throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1
# ENV RAILS_ENV=production
COPY --chown=${REGULAR_USER}:${REGULAR_USER} Gemfile Gemfile.lock ./
# RUN bundle config set --local without 'development test'
RUN bundle install
COPY --chown=${REGULAR_USER}:${REGULAR_USER} . .
EXPOSE 3000
CMD ["./docker-entrypoint.sh","puma"]

2
Gemfile

@ -1,7 +1,7 @@
source "https://rubygems.org" source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" } git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.1.1" ruby "3.1.2"
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.0.2", ">= 7.0.2.2" gem "rails", "~> 7.0.2", ">= 7.0.2.2"

70
app/controllers/work_experiences_controller.rb

@ -0,0 +1,70 @@
class WorkExperiencesController < ApplicationController
before_action :set_work_experience, only: %i[ show edit update destroy ]
# GET /work_experiences or /work_experiences.json
def index
@work_experiences = WorkExperience.all
end
# GET /work_experiences/1 or /work_experiences/1.json
def show
end
# GET /work_experiences/new
def new
@work_experience = WorkExperience.new
end
# GET /work_experiences/1/edit
def edit
end
# POST /work_experiences or /work_experiences.json
def create
@work_experience = WorkExperience.new(work_experience_params)
respond_to do |format|
if @work_experience.save
format.html { redirect_to work_experience_url(@work_experience), notice: "Work experience was successfully created." }
format.json { render :show, status: :created, location: @work_experience }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @work_experience.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /work_experiences/1 or /work_experiences/1.json
def update
respond_to do |format|
if @work_experience.update(work_experience_params)
format.html { redirect_to work_experience_url(@work_experience), notice: "Work experience was successfully updated." }
format.json { render :show, status: :ok, location: @work_experience }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @work_experience.errors, status: :unprocessable_entity }
end
end
end
# DELETE /work_experiences/1 or /work_experiences/1.json
def destroy
@work_experience.destroy
respond_to do |format|
format.html { redirect_to work_experiences_url, notice: "Work experience was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_work_experience
@work_experience = WorkExperience.find(params[:id])
end
# Only allow a list of trusted parameters through.
def work_experience_params
params.require(:work_experience).permit(:period, :employer, :title, :technologies, :achivements)
end
end

2
app/helpers/work_experiences_helper.rb

@ -0,0 +1,2 @@
module WorkExperiencesHelper
end

2
app/models/work_experience.rb

@ -0,0 +1,2 @@
class WorkExperience < ApplicationRecord
end

42
app/views/work_experiences/_form.html.erb

@ -0,0 +1,42 @@
<%= form_with(model: work_experience) do |form| %>
<% if work_experience.errors.any? %>
<div style="color: red">
<h2><%= pluralize(work_experience.errors.count, "error") %> prohibited this work_experience from being saved:</h2>
<ul>
<% work_experience.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div>
<%= form.label :period, style: "display: block" %>
<%= form.text_field :period %>
</div>
<div>
<%= form.label :employer, style: "display: block" %>
<%= form.text_field :employer %>
</div>
<div>
<%= form.label :title, style: "display: block" %>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :technologies, style: "display: block" %>
<%= form.text_field :technologies %>
</div>
<div>
<%= form.label :achivements, style: "display: block" %>
<%= form.text_field :achivements %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>

27
app/views/work_experiences/_work_experience.html.erb

@ -0,0 +1,27 @@
<div id="<%= dom_id work_experience %>">
<p>
<strong>Period:</strong>
<%= work_experience.period %>
</p>
<p>
<strong>Employer:</strong>
<%= work_experience.employer %>
</p>
<p>
<strong>Title:</strong>
<%= work_experience.title %>
</p>
<p>
<strong>Technologies:</strong>
<%= work_experience.technologies %>
</p>
<p>
<strong>Achivements:</strong>
<%= work_experience.achivements %>
</p>
</div>

2
app/views/work_experiences/_work_experience.json.jbuilder

@ -0,0 +1,2 @@
json.extract! work_experience, :id, :period, :employer, :title, :technologies, :achivements, :created_at, :updated_at
json.url work_experience_url(work_experience, format: :json)

10
app/views/work_experiences/edit.html.erb

@ -0,0 +1,10 @@
<h1>Editing work experience</h1>
<%= render "form", work_experience: @work_experience %>
<br>
<div>
<%= link_to "Show this work experience", @work_experience %> |
<%= link_to "Back to work experiences", work_experiences_path %>
</div>

14
app/views/work_experiences/index.html.erb

@ -0,0 +1,14 @@
<p style="color: green"><%= notice %></p>
<h1>Work experiences</h1>
<div id="work_experiences">
<% @work_experiences.each do |work_experience| %>
<%= render work_experience %>
<p>
<%= link_to "Show this work experience", work_experience %>
</p>
<% end %>
</div>
<%= link_to "New work experience", new_work_experience_path %>

1
app/views/work_experiences/index.json.jbuilder

@ -0,0 +1 @@
json.array! @work_experiences, partial: "work_experiences/work_experience", as: :work_experience

9
app/views/work_experiences/new.html.erb

@ -0,0 +1,9 @@
<h1>New work experience</h1>
<%= render "form", work_experience: @work_experience %>
<br>
<div>
<%= link_to "Back to work experiences", work_experiences_path %>
</div>

10
app/views/work_experiences/show.html.erb

@ -0,0 +1,10 @@
<p style="color: green"><%= notice %></p>
<%= render @work_experience %>
<div>
<%= link_to "Edit this work experience", edit_work_experience_path(@work_experience) %> |
<%= link_to "Back to work experiences", work_experiences_path %>
<%= button_to "Destroy this work experience", @work_experience, method: :delete %>
</div>

1
app/views/work_experiences/show.json.jbuilder

@ -0,0 +1 @@
json.partial! "work_experiences/work_experience", work_experience: @work_experience

1
config/routes.rb

@ -1,4 +1,5 @@
Rails.application.routes.draw do Rails.application.routes.draw do
resources :work_experiences
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
# Defines the root path route ("/") # Defines the root path route ("/")

13
db/migrate/20220830202251_create_work_experiences.rb

@ -0,0 +1,13 @@
class CreateWorkExperiences < ActiveRecord::Migration[7.0]
def change
create_table :work_experiences do |t|
t.string :period
t.string :employer
t.string :title
t.string :technologies
t.string :achivements
t.timestamps
end
end
end

24
db/schema.rb

@ -0,0 +1,24 @@
# 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.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2022_08_30_202251) do
create_table "work_experiences", force: :cascade do |t|
t.string "period"
t.string "employer"
t.string "title"
t.string "technologies"
t.string "achivements"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end

11
docker-compose.yml

@ -0,0 +1,11 @@
version: '3'
services:
web:
image: latext-resumes
build: .
ports:
- 3000:3000
command: tail -F /home/cvrails/app/log/development.log
volumes:
- ./:/home/cvrails/app

34
docker-entrypoint.sh

@ -0,0 +1,34 @@
#!/bin/bash
# TODO: Move the tidying up of sidekiq config file onto a function
# TODO: Have the bundle install for dev- prefix argument
before_commands () {
if [ "$RAILS_ENV" = 'development' ]; then
echo "App in development mode running bundle install and yarn install to update components"
bundle install > /dev/null
yarn install > /dev/null
fi
}
set -e
if [ "$1" = 'dev-server' ]; then
before_commands
exec rails s -b 0.0.0.0 -p 3000
elif [ "$1" = 'puma' ]; then
before_commands
exec bundle exec puma -C config/puma.rb
elif [ "$1" = 'rails' ]; then
echo "Rails command detected!"
before_commands
exec bundle exec "$@"
elif [ "$1" = 'rake' ]; then
echo "Rake command detected!"
before_commands
exec bundle exec "$@"
else
exec bundle exec puma -C config/puma.rb
fi
exec "$@"

48
test/controllers/work_experiences_controller_test.rb

@ -0,0 +1,48 @@
require "test_helper"
class WorkExperiencesControllerTest < ActionDispatch::IntegrationTest
setup do
@work_experience = work_experiences(:one)
end
test "should get index" do
get work_experiences_url
assert_response :success
end
test "should get new" do
get new_work_experience_url
assert_response :success
end
test "should create work_experience" do
assert_difference("WorkExperience.count") do
post work_experiences_url, params: { work_experience: { achivements: @work_experience.achivements, employer: @work_experience.employer, period: @work_experience.period, technologies: @work_experience.technologies, title: @work_experience.title } }
end
assert_redirected_to work_experience_url(WorkExperience.last)
end
test "should show work_experience" do
get work_experience_url(@work_experience)
assert_response :success
end
test "should get edit" do
get edit_work_experience_url(@work_experience)
assert_response :success
end
test "should update work_experience" do
patch work_experience_url(@work_experience), params: { work_experience: { achivements: @work_experience.achivements, employer: @work_experience.employer, period: @work_experience.period, technologies: @work_experience.technologies, title: @work_experience.title } }
assert_redirected_to work_experience_url(@work_experience)
end
test "should destroy work_experience" do
assert_difference("WorkExperience.count", -1) do
delete work_experience_url(@work_experience)
end
assert_redirected_to work_experiences_url
end
end

15
test/fixtures/work_experiences.yml

@ -0,0 +1,15 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
period: MyString
employer: MyString
title: MyString
technologies: MyString
achivements: MyString
two:
period: MyString
employer: MyString
title: MyString
technologies: MyString
achivements: MyString

7
test/models/work_experience_test.rb

@ -0,0 +1,7 @@
require "test_helper"
class WorkExperienceTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end

49
test/system/work_experiences_test.rb

@ -0,0 +1,49 @@
require "application_system_test_case"
class WorkExperiencesTest < ApplicationSystemTestCase
setup do
@work_experience = work_experiences(:one)
end
test "visiting the index" do
visit work_experiences_url
assert_selector "h1", text: "Work experiences"
end
test "should create work experience" do
visit work_experiences_url
click_on "New work experience"
fill_in "Achivements", with: @work_experience.achivements
fill_in "Employer", with: @work_experience.employer
fill_in "Period", with: @work_experience.period
fill_in "Technologies", with: @work_experience.technologies
fill_in "Title", with: @work_experience.title
click_on "Create Work experience"
assert_text "Work experience was successfully created"
click_on "Back"
end
test "should update Work experience" do
visit work_experience_url(@work_experience)
click_on "Edit this work experience", match: :first
fill_in "Achivements", with: @work_experience.achivements
fill_in "Employer", with: @work_experience.employer
fill_in "Period", with: @work_experience.period
fill_in "Technologies", with: @work_experience.technologies
fill_in "Title", with: @work_experience.title
click_on "Update Work experience"
assert_text "Work experience was successfully updated"
click_on "Back"
end
test "should destroy Work experience" do
visit work_experience_url(@work_experience)
click_on "Destroy this work experience", match: :first
assert_text "Work experience was successfully destroyed"
end
end
Loading…
Cancel
Save