From 9d555023e24470a0100aa2d1d82d1a2643f0632b Mon Sep 17 00:00:00 2001 From: zhanglinjie Date: Sat, 7 Oct 2023 17:00:37 +0800 Subject: [PATCH 1/3] Add wiki front matter title Add support for storing wiki title in the front matter of wiki content. Changelog: added MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133521 --- app/controllers/concerns/wiki_actions.rb | 6 ++- app/models/wiki_page.rb | 7 +++- .../development/wiki_front_matter.yml | 2 +- .../development/wiki_front_matter_title.yml | 8 ++++ ee/spec/requests/api/wikis_spec.rb | 1 + lib/api/entities/wiki_page.rb | 4 ++ lib/api/wikis.rb | 6 +++ spec/lib/api/entities/wiki_page_spec.rb | 6 ++- spec/models/wiki_page_spec.rb | 1 + spec/requests/api/wikis_spec.rb | 38 +++++++++++++++++++ 10 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 config/feature_flags/development/wiki_front_matter_title.yml diff --git a/app/controllers/concerns/wiki_actions.rb b/app/controllers/concerns/wiki_actions.rb index c606ccf4a07e7b..f8c3e125c3beca 100644 --- a/app/controllers/concerns/wiki_actions.rb +++ b/app/controllers/concerns/wiki_actions.rb @@ -246,7 +246,7 @@ def load_sidebar @sidebar_page = wiki.find_sidebar(params[:version_id]) unless @sidebar_page # Fallback to default sidebar - @sidebar_wiki_entries, @sidebar_limited = wiki.sidebar_entries + @sidebar_wiki_entries, @sidebar_limited = wiki.sidebar_entries(load_content: Feature.enabled?(:wiki_front_matter_title, container)) end rescue ::Gitlab::Git::CommandTimedOut => e @sidebar_error = e @@ -326,7 +326,9 @@ def send_wiki_file_blob(wiki, file_blob) end def load_content? - return false if %w[history destroy diff show].include?(params[:action]) + skip_actions = Feature.enabled?(:wiki_front_matter_title, container) ? %w[history destroy diff] : %w[history destroy diff show] + + return false if skip_actions.include?(params[:action]) true end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 2eed693ca760b1..3dd8f334a68b70 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -80,6 +80,7 @@ def slug alias_method :to_param, :slug def human_title + return front_matter_title if Feature.enabled?(:wiki_front_matter_title, container) && front_matter_title.present? return 'Home' if title == Wiki::HOMEPAGE title @@ -95,6 +96,10 @@ def title=(new_title) attributes[:title] = new_title end + def front_matter_title + front_matter[:title] + end + def raw_content attributes[:content] ||= page&.text_data end @@ -320,7 +325,7 @@ def diffs(diff_options = {}) def serialize_front_matter(hash) return '' unless hash.present? - YAML.dump(hash.transform_keys(&:to_s)) + "---\n" + YAML.dump(hash.to_h.transform_keys(&:to_s)) + "---\n" end def update_front_matter(attrs) diff --git a/config/feature_flags/development/wiki_front_matter.yml b/config/feature_flags/development/wiki_front_matter.yml index 39196440d176e5..20316142c41e5d 100644 --- a/config/feature_flags/development/wiki_front_matter.yml +++ b/config/feature_flags/development/wiki_front_matter.yml @@ -1,7 +1,7 @@ --- name: wiki_front_matter introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27706 -rollout_issue_url: +rollout_issue_url: milestone: '12.10' type: development group: group::editor diff --git a/config/feature_flags/development/wiki_front_matter_title.yml b/config/feature_flags/development/wiki_front_matter_title.yml new file mode 100644 index 00000000000000..d2189ffbe781f0 --- /dev/null +++ b/config/feature_flags/development/wiki_front_matter_title.yml @@ -0,0 +1,8 @@ +--- +name: wiki_front_matter_title +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133521/pipelines +rollout_issue_url: +milestone: '16.5' +type: development +group: group::editor +default_enabled: false diff --git a/ee/spec/requests/api/wikis_spec.rb b/ee/spec/requests/api/wikis_spec.rb index c44da5f53be07c..2aa67e9ce382e8 100644 --- a/ee/spec/requests/api/wikis_spec.rb +++ b/ee/spec/requests/api/wikis_spec.rb @@ -26,6 +26,7 @@ before do stub_group_wikis(true) + stub_feature_flags(wiki_front_matter_title: false) end shared_examples_for 'wiki API 404 Group Not Found' do diff --git a/lib/api/entities/wiki_page.rb b/lib/api/entities/wiki_page.rb index 0f3fdd586a350b..8b2c951ecf25d5 100644 --- a/lib/api/entities/wiki_page.rb +++ b/lib/api/entities/wiki_page.rb @@ -22,6 +22,10 @@ class WikiPage < WikiPageBasic expose :encoding, documentation: { type: 'string', example: 'UTF-8' } do |wiki_page| wiki_page.content.encoding.name end + + expose :front_matter, documentation: { type: 'Hash', example: { title: "deploy" } }, if: ->(wiki_page) { + ::Feature.enabled?(:wiki_front_matter_title, wiki_page.container) + } end end end diff --git a/lib/api/wikis.rb b/lib/api/wikis.rb index 2058f5de706530..a7408512102078 100644 --- a/lib/api/wikis.rb +++ b/lib/api/wikis.rb @@ -85,6 +85,9 @@ class Wikis < ::API::Base end params do requires :title, type: String, desc: 'Title of a wiki page' + optional :front_matter, type: Hash do + optional :title, type: String, desc: 'Front matter title of a wiki page' + end requires :content, type: String, desc: 'Content of a wiki page' use :common_wiki_page_params end @@ -112,6 +115,9 @@ class Wikis < ::API::Base end params do optional :title, type: String, desc: 'Title of a wiki page' + optional :front_matter, type: Hash do + optional :title, type: String, desc: 'Front matter title of a wiki page' + end optional :content, type: String, desc: 'Content of a wiki page' use :common_wiki_page_params at_least_one_of :content, :title, :format diff --git a/spec/lib/api/entities/wiki_page_spec.rb b/spec/lib/api/entities/wiki_page_spec.rb index a3566293c5c778..da75ade997bf53 100644 --- a/spec/lib/api/entities/wiki_page_spec.rb +++ b/spec/lib/api/entities/wiki_page_spec.rb @@ -24,7 +24,7 @@ context "with front matter content" do let(:wiki_page) { create(:wiki_page) } - let(:content_with_front_matter) { "---\nxxx: abc\n---\nHome Page" } + let(:content_with_front_matter) { "---\ntitle: abc\n---\nHome Page" } before do wiki_page.update(content: content_with_front_matter) # rubocop:disable Rails/SaveBang @@ -33,6 +33,10 @@ it 'returns the raw wiki page content' do expect(subject[:content]).to eq content_with_front_matter end + + it 'return the front matter title' do + expect(subject[:front_matter]).to eq({ title: "abc" }) + end end context 'when render_html param is passed' do diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 2e1cb9d3d9b653..433ab1ec70e916 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -58,6 +58,7 @@ def force_wiki_change_branch let(:front_matter) { { title: 'Foo', slugs: %w[slug_a slug_b] } } it { expect(wiki_page.front_matter).to eq(front_matter) } + it { expect(wiki_page.front_matter_title).to eq(front_matter[:title]) } end context 'the wiki page has front matter' do diff --git a/spec/requests/api/wikis_spec.rb b/spec/requests/api/wikis_spec.rb index 00e38a5bb7e0ea..20743acf3861ed 100644 --- a/spec/requests/api/wikis_spec.rb +++ b/spec/requests/api/wikis_spec.rb @@ -35,6 +35,10 @@ let(:expected_keys_without_content) { %w(format slug title) } let(:wiki) { project_wiki } + before do + stub_feature_flags(wiki_front_matter_title: false) + end + shared_examples_for 'wiki API 404 Project Not Found' do include_examples 'wiki API 404 Not Found', 'Project' end @@ -354,6 +358,22 @@ end include_examples 'wikis API creates wiki page' + + context "with front matter title" do + let(:payload) { { title: 'title', front_matter: { "title" => "title in front matter" }, content: 'content' } } + + before do + stub_feature_flags(wiki_front_matter_title: true) + end + + it "save front matter" do + post(api(url, user), params: payload) + + expect(response).to have_gitlab_http_status(:created) + expect(json_response['front_matter']).to eq(payload[:front_matter]) + expect(json_response['content']).to include(payload[:front_matter]["title"]) + end + end end context 'when user is maintainer' do @@ -478,6 +498,24 @@ include_examples 'wiki API 404 Wiki Page Not Found' end + + context "with front matter title" do + let(:payload) do + { title: 'new title', front_matter: { "title" => "title in front matter" }, content: 'new content' } + end + + before do + stub_feature_flags(wiki_front_matter_title: true) + end + + it "save front matter" do + put(api(url, user), params: payload) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response['front_matter']).to eq(payload[:front_matter]) + expect(json_response['content']).to include(payload[:front_matter]["title"]) + end + end end context 'when user is maintainer' do -- GitLab From 3d98c592ebf5ad4cd6ca5d6d8771de9abd15de5b Mon Sep 17 00:00:00 2001 From: zhanglinjie Date: Mon, 16 Oct 2023 11:42:59 +0800 Subject: [PATCH 2/3] Update wiki spec --- .../development/wiki_front_matter_title.yml | 8 +++--- ee/spec/requests/api/wikis_spec.rb | 3 +- spec/models/wiki_page_spec.rb | 28 +++++++++++++++++++ spec/requests/api/wikis_spec.rb | 6 +--- .../shared_examples/lib/wikis_api_examples.rb | 6 ++-- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/config/feature_flags/development/wiki_front_matter_title.yml b/config/feature_flags/development/wiki_front_matter_title.yml index d2189ffbe781f0..381bb2e1154e3d 100644 --- a/config/feature_flags/development/wiki_front_matter_title.yml +++ b/config/feature_flags/development/wiki_front_matter_title.yml @@ -1,8 +1,8 @@ --- name: wiki_front_matter_title -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133521/pipelines -rollout_issue_url: -milestone: '16.5' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133521 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/428259 +milestone: '16.6' type: development -group: group::editor +group: group::knowledge default_enabled: false diff --git a/ee/spec/requests/api/wikis_spec.rb b/ee/spec/requests/api/wikis_spec.rb index 2aa67e9ce382e8..39fd18d01ebb7b 100644 --- a/ee/spec/requests/api/wikis_spec.rb +++ b/ee/spec/requests/api/wikis_spec.rb @@ -21,12 +21,11 @@ let(:group) { create(:group, :internal, :wiki_repo) } let(:wiki) { create(:group_wiki, container: group, user: user) } let(:payload) { { content: 'content', format: 'rdoc', title: 'title' } } - let(:expected_keys_with_content) { %w[content format slug title encoding] } + let(:expected_keys_with_content) { %w[content format slug title encoding front_matter] } let(:expected_keys_without_content) { %w[format slug title] } before do stub_group_wikis(true) - stub_feature_flags(wiki_front_matter_title: false) end shared_examples_for 'wiki API 404 Group Not Found' do diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 433ab1ec70e916..27a0c2967e1106 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -1055,4 +1055,32 @@ def force_wiki_change_branch ) end end + + describe "#human_title" do + context "with front matter title" do + let(:front_matter_title) { "abc" } + let(:content_with_front_matter_title) { "---\ntitle: #{front_matter_title}\n---\nHome Page" } + let(:wiki_page) { create(:wiki_page, container: container, content: content_with_front_matter_title) } + + context "when wiki_front_matter_title enabled" do + before do + stub_feature_flags(wiki_front_matter_title: true) + end + + it 'returns the front matter title' do + expect(wiki_page.human_title).to eq front_matter_title + end + end + + context "when wiki_front_matter_title disabled" do + before do + stub_feature_flags(wiki_front_matter_title: false) + end + + it 'returns the page title' do + expect(wiki_page.human_title).to eq wiki_page.title + end + end + end + end end diff --git a/spec/requests/api/wikis_spec.rb b/spec/requests/api/wikis_spec.rb index 20743acf3861ed..8734101f8ca8ca 100644 --- a/spec/requests/api/wikis_spec.rb +++ b/spec/requests/api/wikis_spec.rb @@ -31,14 +31,10 @@ let(:project_wiki) { create(:project_wiki, project: project, user: user) } let(:payload) { { content: 'content', format: 'rdoc', title: 'title' } } - let(:expected_keys_with_content) { %w(content format slug title encoding) } + let(:expected_keys_with_content) { %w(content format slug title encoding front_matter) } let(:expected_keys_without_content) { %w(format slug title) } let(:wiki) { project_wiki } - before do - stub_feature_flags(wiki_front_matter_title: false) - end - shared_examples_for 'wiki API 404 Project Not Found' do include_examples 'wiki API 404 Not Found', 'Project' end diff --git a/spec/support/shared_examples/lib/wikis_api_examples.rb b/spec/support/shared_examples/lib/wikis_api_examples.rb index c57ac328a60a52..162a2b8ea49d2c 100644 --- a/spec/support/shared_examples/lib/wikis_api_examples.rb +++ b/spec/support/shared_examples/lib/wikis_api_examples.rb @@ -53,7 +53,7 @@ specify do expect(response).to have_gitlab_http_status(:ok) - expect(json_response.size).to eq(5) + expect(json_response.size).to eq(6) expect(json_response.keys).to match_array(expected_keys_with_content) expect(json_response['content']).to eq(expected_content) expect(json_response['slug']).to eq(page.slug) @@ -118,7 +118,7 @@ post(api(url, user), params: payload) expect(response).to have_gitlab_http_status(:created) - expect(json_response.size).to eq(5) + expect(json_response.size).to eq(6) expect(json_response.keys).to match_array(expected_keys_with_content) expect(json_response['content']).to eq(payload[:content]) expect(json_response['slug']).to eq(payload[:title].tr(' ', '-')) @@ -145,7 +145,7 @@ put(api(url, user), params: payload) expect(response).to have_gitlab_http_status(:ok) - expect(json_response.size).to eq(5) + expect(json_response.size).to eq(6) expect(json_response.keys).to match_array(expected_keys_with_content) expect(json_response['content']).to eq(payload[:content]) expect(json_response['slug']).to eq(payload[:title].tr(' ', '-')) -- GitLab From 00750f510a77e4b3c7f461ca227a78dfea06073c Mon Sep 17 00:00:00 2001 From: zhanglinjie Date: Fri, 20 Oct 2023 09:23:58 +0800 Subject: [PATCH 3/3] Update wiki spec --- spec/models/wiki_page_spec.rb | 4 ---- spec/requests/api/wikis_spec.rb | 8 -------- 2 files changed, 12 deletions(-) diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 27a0c2967e1106..f3cf8966b9a1d3 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -1063,10 +1063,6 @@ def force_wiki_change_branch let(:wiki_page) { create(:wiki_page, container: container, content: content_with_front_matter_title) } context "when wiki_front_matter_title enabled" do - before do - stub_feature_flags(wiki_front_matter_title: true) - end - it 'returns the front matter title' do expect(wiki_page.human_title).to eq front_matter_title end diff --git a/spec/requests/api/wikis_spec.rb b/spec/requests/api/wikis_spec.rb index 8734101f8ca8ca..95ebe9ae5a86ea 100644 --- a/spec/requests/api/wikis_spec.rb +++ b/spec/requests/api/wikis_spec.rb @@ -358,10 +358,6 @@ context "with front matter title" do let(:payload) { { title: 'title', front_matter: { "title" => "title in front matter" }, content: 'content' } } - before do - stub_feature_flags(wiki_front_matter_title: true) - end - it "save front matter" do post(api(url, user), params: payload) @@ -500,10 +496,6 @@ { title: 'new title', front_matter: { "title" => "title in front matter" }, content: 'new content' } end - before do - stub_feature_flags(wiki_front_matter_title: true) - end - it "save front matter" do put(api(url, user), params: payload) -- GitLab