From f17a301880cf50ed23815489004aa62d5967d0cc Mon Sep 17 00:00:00 2001 From: loiswells97 Date: Mon, 28 Feb 2022 09:43:58 +0000 Subject: [PATCH 01/12] Create draft PR for #17 From 7e5b44555f02b7731da291a9ca46bb6c5508fb2f Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Mon, 28 Feb 2022 13:59:27 +0000 Subject: [PATCH 02/12] WIP: Adding remixed_from into the model --- app/concepts/project/operation/create_remix.rb | 1 + app/models/project.rb | 1 + ...5_associate_remixed_projects_with_their_parent_project.rb | 5 +++++ db/schema.rb | 4 +++- 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb diff --git a/app/concepts/project/operation/create_remix.rb b/app/concepts/project/operation/create_remix.rb index 298ed876..c274df97 100644 --- a/app/concepts/project/operation/create_remix.rb +++ b/app/concepts/project/operation/create_remix.rb @@ -29,6 +29,7 @@ def remix_project(response, params) response[:project] = original_project.dup.tap do |proj| proj.user_id = params[:remix][:user_id] proj.components = original_project.components.map(&:dup) + proj.remixed_from_id = original_project.id end response[:error] = 'Unable to create project' unless response[:project].save diff --git a/app/models/project.rb b/app/models/project.rb index 23217a0e..f2b16cd0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -5,6 +5,7 @@ class Project < ApplicationRecord before_validation :check_unique_not_null, on: :create validates :identifier, presence: true, uniqueness: true + # belongs_to :parent_project, class_name: "Project", foreign_key: "remixed_from_id" has_many :components, -> { order(:index) }, dependent: :destroy, inverse_of: :project private diff --git a/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb b/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb new file mode 100644 index 00000000..443a11f5 --- /dev/null +++ b/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb @@ -0,0 +1,5 @@ +class AssociateRemixedProjectsWithTheirParentProject < ActiveRecord::Migration[7.0] + def change + add_reference :projects, :remixed_from, references: :projects + end +end diff --git a/db/schema.rb b/db/schema.rb index ec9163cf..ec850910 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2022_02_11_102958) do +ActiveRecord::Schema.define(version: 2022_02_28_094815) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -34,7 +34,9 @@ t.string "project_type", default: "python", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.bigint "remixed_from_id" t.index ["identifier"], name: "index_projects_on_identifier", unique: true + t.index ["remixed_from_id"], name: "index_projects_on_remixed_from_id" end create_table "words", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t| From 2e604529c8d7c9136a840b31f5679175504301ef Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Mon, 28 Feb 2022 14:22:25 +0000 Subject: [PATCH 03/12] Changing remixed from reference to uuid --- app/models/project.rb | 2 +- ...4815_associate_remixed_projects_with_their_parent_project.rb | 2 +- db/schema.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index f2b16cd0..735eccde 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -5,7 +5,7 @@ class Project < ApplicationRecord before_validation :check_unique_not_null, on: :create validates :identifier, presence: true, uniqueness: true - # belongs_to :parent_project, class_name: "Project", foreign_key: "remixed_from_id" + # belongs_to :parent_project, type: :uuid, class_name: "Project" has_many :components, -> { order(:index) }, dependent: :destroy, inverse_of: :project private diff --git a/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb b/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb index 443a11f5..c7b5f6f7 100644 --- a/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb +++ b/db/migrate/20220228094815_associate_remixed_projects_with_their_parent_project.rb @@ -1,5 +1,5 @@ class AssociateRemixedProjectsWithTheirParentProject < ActiveRecord::Migration[7.0] def change - add_reference :projects, :remixed_from, references: :projects + add_reference :projects, :remixed_from, type: :uuid, references: :projects end end diff --git a/db/schema.rb b/db/schema.rb index ec850910..7ebc5b8a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -34,7 +34,7 @@ t.string "project_type", default: "python", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false - t.bigint "remixed_from_id" + t.uuid "remixed_from_id" t.index ["identifier"], name: "index_projects_on_identifier", unique: true t.index ["remixed_from_id"], name: "index_projects_on_remixed_from_id" end From e27216e6bbd85aebc129b650375b5e1e27a40829 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Mon, 28 Feb 2022 16:07:06 +0000 Subject: [PATCH 04/12] Adding parent and children projects into model and returning in api --- app/models/project.rb | 3 ++- app/views/api/projects/show.json.jbuilder | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/models/project.rb b/app/models/project.rb index 735eccde..1f1f5884 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -5,8 +5,9 @@ class Project < ApplicationRecord before_validation :check_unique_not_null, on: :create validates :identifier, presence: true, uniqueness: true - # belongs_to :parent_project, type: :uuid, class_name: "Project" + belongs_to :parent, class_name: "Project", foreign_key: "remixed_from_id", optional: true has_many :components, -> { order(:index) }, dependent: :destroy, inverse_of: :project + has_many :children, class_name: "Project", foreign_key: "remixed_from_id" private diff --git a/app/views/api/projects/show.json.jbuilder b/app/views/api/projects/show.json.jbuilder index 8449e612..b4c9a7b1 100644 --- a/app/views/api/projects/show.json.jbuilder +++ b/app/views/api/projects/show.json.jbuilder @@ -2,4 +2,8 @@ json.call(@project, :identifier, :project_type, :name) +if (@project.parent) + json.parent(@project.parent, :name, :identifier) +end + json.components @project.components, :id, :name, :extension, :content From ecd0ab0dc227b761cbe6ba653ad2ec8c46e95deb Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Mon, 28 Feb 2022 17:37:45 +0000 Subject: [PATCH 05/12] WIP: Adding tests for remix parents and children --- spec/models/project_spec.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 07d217bb..b7452767 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -24,4 +24,21 @@ expect { project2.valid? }.to change(project2, :identifier) end end + + describe 'relationship between parent and child projects' do + before(:each) do + @project1 = create(:project) + remix_params = { phrase_id: @project1.identifier, remix: { user_id: SecureRandom.uuid } } + @project2 = Project::Operation::CreateRemix.call(remix_params)[:project] + @project3 = Project::Operation::CreateRemix.call(remix_params)[:project] + end + + it 'child can access parent project' do + expect(@project2.parent).to eq(@project1) + end + + it 'parent can access child projects' do + expect(@project1.children).to eq([@project2]) + end + end end From ab59c9f978ede9b955460206e585688210950184 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 1 Mar 2022 09:53:41 +0000 Subject: [PATCH 06/12] Testing relationship between parent and child projects --- spec/models/project_spec.rb | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index b7452767..ab890d4d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -5,6 +5,8 @@ RSpec.describe Project, type: :model do describe 'associations' do it { is_expected.to have_many(:components) } + it { is_expected.to have_many(:children) } + it { is_expected.to belong_to(:parent).optional(true) } end describe 'identifier not nil' do @@ -24,21 +26,4 @@ expect { project2.valid? }.to change(project2, :identifier) end end - - describe 'relationship between parent and child projects' do - before(:each) do - @project1 = create(:project) - remix_params = { phrase_id: @project1.identifier, remix: { user_id: SecureRandom.uuid } } - @project2 = Project::Operation::CreateRemix.call(remix_params)[:project] - @project3 = Project::Operation::CreateRemix.call(remix_params)[:project] - end - - it 'child can access parent project' do - expect(@project2.parent).to eq(@project1) - end - - it 'parent can access child projects' do - expect(@project1.children).to eq([@project2]) - end - end end From e49fe923571ae3025c133f094df92bce9e33320d Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 1 Mar 2022 09:59:39 +0000 Subject: [PATCH 07/12] Ignoring coverage directory --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 8080f7e6..f3acc7ce 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ /config/master.key .rubocop-https* + +/coverage From d58cbd9c4ad1a04ece0bed1a2b39eb1859ac1a99 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 1 Mar 2022 11:18:28 +0000 Subject: [PATCH 08/12] Fixing rubocop errors --- app/models/project.rb | 4 ++-- app/views/api/projects/show.json.jbuilder | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 1f1f5884..8830427c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -5,9 +5,9 @@ class Project < ApplicationRecord before_validation :check_unique_not_null, on: :create validates :identifier, presence: true, uniqueness: true - belongs_to :parent, class_name: "Project", foreign_key: "remixed_from_id", optional: true + belongs_to :parent, class_name: 'Project', foreign_key: 'remixed_from_id', optional: true, inverse_of: :children has_many :components, -> { order(:index) }, dependent: :destroy, inverse_of: :project - has_many :children, class_name: "Project", foreign_key: "remixed_from_id" + has_many :children, class_name: 'Project', foreign_key: 'remixed_from_id', dependent: :nullify, inverse_of: :parent private diff --git a/app/views/api/projects/show.json.jbuilder b/app/views/api/projects/show.json.jbuilder index b4c9a7b1..c0e41284 100644 --- a/app/views/api/projects/show.json.jbuilder +++ b/app/views/api/projects/show.json.jbuilder @@ -1,9 +1,7 @@ # frozen_string_literal: true json.call(@project, :identifier, :project_type, :name) - -if (@project.parent) - json.parent(@project.parent, :name, :identifier) -end + +json.parent(@project.parent, :name, :identifier) if @project.parent json.components @project.components, :id, :name, :extension, :content From 2378bf19df8600ac582d34821c4b74c6da2227e0 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 1 Mar 2022 11:19:00 +0000 Subject: [PATCH 09/12] rubocop --- app/views/api/projects/show.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/api/projects/show.json.jbuilder b/app/views/api/projects/show.json.jbuilder index c0e41284..e4462260 100644 --- a/app/views/api/projects/show.json.jbuilder +++ b/app/views/api/projects/show.json.jbuilder @@ -1,7 +1,7 @@ # frozen_string_literal: true json.call(@project, :identifier, :project_type, :name) - + json.parent(@project.parent, :name, :identifier) if @project.parent json.components @project.components, :id, :name, :extension, :content From 1d17abfdd60b42addcc12e2a22d358e684669bd1 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 1 Mar 2022 11:30:50 +0000 Subject: [PATCH 10/12] Refectoring to please rubocop --- app/concepts/project/operation/create_remix.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/concepts/project/operation/create_remix.rb b/app/concepts/project/operation/create_remix.rb index c274df97..e3af2b58 100644 --- a/app/concepts/project/operation/create_remix.rb +++ b/app/concepts/project/operation/create_remix.rb @@ -23,14 +23,19 @@ def validate_params(response, params) response[:error] = 'Invalid parameters' unless valid end - def remix_project(response, params) - original_project = Project.find_by!(identifier: params[:phrase_id]) - - response[:project] = original_project.dup.tap do |proj| + def create_remix(original_project, params) + remixed_project = original_project.dup.tap do |proj| proj.user_id = params[:remix][:user_id] proj.components = original_project.components.map(&:dup) proj.remixed_from_id = original_project.id end + remixed_project + end + + def remix_project(response, params) + original_project = Project.find_by!(identifier: params[:phrase_id]) + + response[:project] = create_remix(original_project, params) response[:error] = 'Unable to create project' unless response[:project].save response From 7edd3e2f489f5f76363b887d478c9fcc7bae0d90 Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Tue, 1 Mar 2022 11:35:12 +0000 Subject: [PATCH 11/12] More rubocop fixes --- app/concepts/project/operation/create_remix.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/concepts/project/operation/create_remix.rb b/app/concepts/project/operation/create_remix.rb index e3af2b58..e80b78bc 100644 --- a/app/concepts/project/operation/create_remix.rb +++ b/app/concepts/project/operation/create_remix.rb @@ -24,12 +24,11 @@ def validate_params(response, params) end def create_remix(original_project, params) - remixed_project = original_project.dup.tap do |proj| + original_project.dup.tap do |proj| proj.user_id = params[:remix][:user_id] proj.components = original_project.components.map(&:dup) proj.remixed_from_id = original_project.id end - remixed_project end def remix_project(response, params) From 9ca50de35ce776eb5536998b15e0f613cd904c7c Mon Sep 17 00:00:00 2001 From: Lois Wells Date: Fri, 4 Mar 2022 09:13:07 +0000 Subject: [PATCH 12/12] Changing order of functions --- app/concepts/project/operation/create_remix.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/concepts/project/operation/create_remix.rb b/app/concepts/project/operation/create_remix.rb index a4390bb4..cb617cec 100644 --- a/app/concepts/project/operation/create_remix.rb +++ b/app/concepts/project/operation/create_remix.rb @@ -23,14 +23,6 @@ def validate_params(response, params, user_id) response[:error] = 'Invalid parameters' unless valid end - def create_remix(original_project, user_id) - original_project.dup.tap do |proj| - proj.user_id = user_id - proj.components = original_project.components.map(&:dup) - proj.remixed_from_id = original_project.id - end - end - def remix_project(response, params, user_id) original_project = Project.find_by!(identifier: params[:phrase_id]) @@ -39,6 +31,14 @@ def remix_project(response, params, user_id) response[:error] = 'Unable to create project' unless response[:project].save response end + + def create_remix(original_project, user_id) + original_project.dup.tap do |proj| + proj.user_id = user_id + proj.components = original_project.components.map(&:dup) + proj.remixed_from_id = original_project.id + end + end end end end