From 899ca04664f99ebec730c862c81fb131e35b4ea8 Mon Sep 17 00:00:00 2001 From: Keenan Brock Date: Fri, 10 Oct 2014 15:47:41 -0400 Subject: [PATCH 1/4] linkset responds to uri names from api --- app/models/linkset.rb | 15 ++++++++++++--- app/views/rubygems/_aside.html.erb | 2 +- test/unit/linkset_test.rb | 12 +++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/models/linkset.rb b/app/models/linkset.rb index e1f042f194e..9d4fd2f33a4 100644 --- a/app/models/linkset.rb +++ b/app/models/linkset.rb @@ -1,18 +1,27 @@ class Linkset < ActiveRecord::Base belongs_to :rubygem - LINKS = %w(home code docs wiki mail bugs).freeze + LINKS = { + 'home' => 'homepage_uri', + 'code' => 'source_code_uri', + 'docs' => 'documentation_uri', + 'wiki' => 'wiki_uri', + 'mail' => 'mailing_list_uri', + 'bugs' => 'bug_tracker_uri' + }.freeze - LINKS.each do |url| + LINKS.each do |url, aka| validates_formatting_of url.to_sym, using: :url, allow_nil: true, allow_blank: true, message: "does not appear to be a valid URL" + + alias_attribute aka.to_sym, url.to_sym end def empty? - LINKS.map { |link| attributes[link] }.all?(&:blank?) + LINKS.keys.map { |link| attributes[link] }.all?(&:blank?) end def update_attributes_from_gem_specification!(spec) diff --git a/app/views/rubygems/_aside.html.erb b/app/views/rubygems/_aside.html.erb index c9a337ef9d8..7690f7b4d57 100644 --- a/app/views/rubygems/_aside.html.erb +++ b/app/views/rubygems/_aside.html.erb @@ -63,7 +63,7 @@ <% if @latest_version.indexed %> <% if @rubygem.linkset.present? %> - <%- Linkset::LINKS.each do |link| %> + <%- Linkset::LINKS.keys.each do |link| %> <%= link_to_page link, @rubygem.linkset.public_send(link) %> <%- end %> <% end %> diff --git a/test/unit/linkset_test.rb b/test/unit/linkset_test.rb index 5bd874872a5..0a910cb6e76 100644 --- a/test/unit/linkset_test.rb +++ b/test/unit/linkset_test.rb @@ -17,11 +17,21 @@ class LinksetTest < ActiveSupport::TestCase end should "be empty with no links filled out" do - Linkset::LINKS.each do |link| + Linkset::LINKS.keys.each do |link| @linkset.send("#{link}=", nil) end assert @linkset.empty? end + + should "have api uri getter" do + @linkset.docs = "http://example.com/docs" + assert_equal "http://example.com/docs", @linkset.documentation_uri + end + + should "have api uri setter" do + @linkset.documentation_uri = "http://example.com/docs" + assert_equal "http://example.com/docs", @linkset.docs + end end context "with a Gem::Specification" do From e29d1fe7a1ee2d33fa06769c31111cdce0fe8871 Mon Sep 17 00:00:00 2001 From: Keenan Brock Date: Sun, 18 Oct 2015 16:36:55 -0400 Subject: [PATCH 2/4] ruby gems api uses metadata or linkset uris --- app/models/rubygem.rb | 12 ++++++------ app/models/version.rb | 4 ++++ test/unit/rubygem_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/app/models/rubygem.rb b/app/models/rubygem.rb index e1131cb9672..4b78fa0783d 100644 --- a/app/models/rubygem.rb +++ b/app/models/rubygem.rb @@ -156,12 +156,12 @@ def payload(version = versions.most_recent, protocol = Gemcutter::PROTOCOL, host 'sha' => version.sha256_hex, 'project_uri' => "#{protocol}://#{host_with_port}/gems/#{name}", 'gem_uri' => "#{protocol}://#{host_with_port}/gems/#{version.full_name}.gem", - 'homepage_uri' => linkset.try(:home), - 'wiki_uri' => linkset.try(:wiki), - 'documentation_uri' => linkset.try(:docs).presence || version.documentation_path, - 'mailing_list_uri' => linkset.try(:mail), - 'source_code_uri' => linkset.try(:code), - 'bug_tracker_uri' => linkset.try(:bugs), + 'homepage_uri' => version.link_uri(:homepage_uri, linkset), + 'wiki_uri' => version.link_uri(:wiki_uri, linkset), + 'documentation_uri' => version.link_uri(:documentation_uri, linkset).presence || version.documentation_path, + 'mailing_list_uri' => version.link_uri(:mailing_list_uri, linkset), + 'source_code_uri' => version.link_uri(:source_code_uri, linkset), + 'bug_tracker_uri' => version.link_uri(:bug_tracker_uri, linkset), 'dependencies' => { 'development' => deps.select { |r| r.rubygem && 'development' == r.scope }, 'runtime' => deps.select { |r| r.rubygem && 'runtime' == r.scope } diff --git a/app/models/version.rb b/app/models/version.rb index e8eed164c47..607dfb6edcd 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -350,6 +350,10 @@ def assign_required_rubygems_version! update_column(:required_rubygems_version, required_rubygems_version.to_s) end + def link_uri(name, linkset = nil) + metadata[name.to_s].presence || linkset.try(name).presence + end + def documentation_path "http://www.rubydoc.info/gems/#{rubygem.name}/#{number}" end diff --git a/test/unit/rubygem_test.rb b/test/unit/rubygem_test.rb index 5a92063c48b..d44f759d3ea 100644 --- a/test/unit/rubygem_test.rb +++ b/test/unit/rubygem_test.rb @@ -458,6 +458,44 @@ class RubygemTest < ActiveSupport::TestCase assert_equal run_dep.name, doc.at_css("dependencies runtime dependency name").content end + context "with metadata" do + setup do + @rubygem = build(:rubygem) + @version = create(:version, rubygem: @rubygem) + end + + should "prefer metadata over links in JSON" do + @version.update_attributes!( + metadata: { + "homepage_uri" => "http://example.com/home", + "wiki_uri" => "http://example.com/wiki", + "documentation_uri" => "http://example.com/docs", + "mailing_list_uri" => "http://example.com/mail", + "source_code_uri" => "http://example.com/code", + "bug_tracker_uri" => "http://example.com/bugs" + } + ) + + hash = MultiJson.load(@rubygem.to_json) + + assert_equal "http://example.com/home", hash["homepage_uri"] + assert_equal "http://example.com/wiki", hash["wiki_uri"] + assert_equal "http://example.com/docs", hash["documentation_uri"] + assert_equal "http://example.com/mail", hash["mailing_list_uri"] + assert_equal "http://example.com/code", hash["source_code_uri"] + assert_equal "http://example.com/bugs", hash["bug_tracker_uri"] + end + + should "return version documentation url if metadata and linkset docs is empty" do + @version.update_attributes!(metadata: {}) + @rubygem.linkset.docs = "" + @rubygem.save + hash = JSON.load(@rubygem.to_json) + + assert_equal @version.documentation_path, hash["documentation_uri"] + end + end + context "with a linkset" do setup do @rubygem = build(:rubygem) From 48b415521c0868a95cfb01330f37e755fcb32eaa Mon Sep 17 00:00:00 2001 From: Keenan Brock Date: Sun, 18 Oct 2015 17:31:57 -0400 Subject: [PATCH 3/4] ruby gems ui uses metadata or linkset uris --- app/views/rubygems/_aside.html.erb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/views/rubygems/_aside.html.erb b/app/views/rubygems/_aside.html.erb index 7690f7b4d57..aa11c1929d2 100644 --- a/app/views/rubygems/_aside.html.erb +++ b/app/views/rubygems/_aside.html.erb @@ -62,11 +62,9 @@ <%= link_to t('edit'), edit_rubygem_path(@rubygem), :class => "gem__link t-list__item", :id => "edit" if @rubygem.owned_by?(current_user) %> <% if @latest_version.indexed %> - <% if @rubygem.linkset.present? %> - <%- Linkset::LINKS.keys.each do |link| %> - <%= link_to_page link, @rubygem.linkset.public_send(link) %> - <%- end %> - <% end %> + <%- Linkset::LINKS.each do |link, attribute| %> + <%= link_to_page link, @latest_version.link_uri(attribute, @rubygem.linkset) %> + <%- end %> <%= download_link(@latest_version) %> <% end %> From 1f8738f4ce118541d9bd88836b14e5a78c40cc6d Mon Sep 17 00:00:00 2001 From: Keenan Brock Date: Sun, 18 Oct 2015 17:33:42 -0400 Subject: [PATCH 4/4] embed default documentation uri in version model --- app/helpers/rubygems_helper.rb | 5 ----- app/models/rubygem.rb | 2 +- app/models/version.rb | 3 ++- app/views/rubygems/_aside.html.erb | 1 - test/unit/helpers/rubygems_helper_test.rb | 17 ----------------- 5 files changed, 3 insertions(+), 25 deletions(-) diff --git a/app/helpers/rubygems_helper.rb b/app/helpers/rubygems_helper.rb index 700fc5dee4f..0acf5048a95 100644 --- a/app/helpers/rubygems_helper.rb +++ b/app/helpers/rubygems_helper.rb @@ -76,11 +76,6 @@ def download_link(version) link_to_page :download, "/downloads/#{version.full_name}.gem" end - def documentation_link(version, linkset) - return unless linkset.nil? || linkset.docs.blank? - link_to_page :docs, version.documentation_path - end - def badge_link(rubygem) badge_url = "https://badge.fury.io/rb/#{rubygem.name}/install" link_to t(".links.badge"), badge_url, class: "gem__link t-list__item", id: :badge diff --git a/app/models/rubygem.rb b/app/models/rubygem.rb index 4b78fa0783d..76fc6f73a11 100644 --- a/app/models/rubygem.rb +++ b/app/models/rubygem.rb @@ -158,7 +158,7 @@ def payload(version = versions.most_recent, protocol = Gemcutter::PROTOCOL, host 'gem_uri' => "#{protocol}://#{host_with_port}/gems/#{version.full_name}.gem", 'homepage_uri' => version.link_uri(:homepage_uri, linkset), 'wiki_uri' => version.link_uri(:wiki_uri, linkset), - 'documentation_uri' => version.link_uri(:documentation_uri, linkset).presence || version.documentation_path, + 'documentation_uri' => version.link_uri(:documentation_uri, linkset), 'mailing_list_uri' => version.link_uri(:mailing_list_uri, linkset), 'source_code_uri' => version.link_uri(:source_code_uri, linkset), 'bug_tracker_uri' => version.link_uri(:bug_tracker_uri, linkset), diff --git a/app/models/version.rb b/app/models/version.rb index 607dfb6edcd..1366881df0c 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -351,7 +351,8 @@ def assign_required_rubygems_version! end def link_uri(name, linkset = nil) - metadata[name.to_s].presence || linkset.try(name).presence + metadata[name.to_s].presence || linkset.try(name).presence || + (name.to_s == "documentation_uri" ? documentation_path : nil) end def documentation_path diff --git a/app/views/rubygems/_aside.html.erb b/app/views/rubygems/_aside.html.erb index aa11c1929d2..b3b3601b1f8 100644 --- a/app/views/rubygems/_aside.html.erb +++ b/app/views/rubygems/_aside.html.erb @@ -69,7 +69,6 @@ <%= download_link(@latest_version) %> <% end %> - <%= documentation_link(@latest_version, @rubygem.linkset) %> <%= badge_link(@rubygem) %> <%= subscribe_link(@rubygem) if @latest_version.indexed %> <%= unsubscribe_link(@rubygem) %> diff --git a/test/unit/helpers/rubygems_helper_test.rb b/test/unit/helpers/rubygems_helper_test.rb index d3b79e85af5..8247036348f 100644 --- a/test/unit/helpers/rubygems_helper_test.rb +++ b/test/unit/helpers/rubygems_helper_test.rb @@ -56,23 +56,6 @@ class RubygemsHelperTest < ActionView::TestCase assert_equal "March 18, 2011", nice_date_for(time) end - should "link to docs if no docs link is set" do - version = build(:version) - linkset = build(:linkset, docs: nil) - - @virtual_path = "rubygems.show" - link = documentation_link(version, linkset) - assert link.include?(version.documentation_path) - end - - should "not link to docs if docs link is set" do - version = build(:version) - linkset = build(:linkset) - - link = documentation_link(version, linkset) - assert link.blank? - end - should "link to the badge" do rubygem = create(:rubygem) url = "https://badge.fury.io/rb/#{rubygem.name}/install"