Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions app/controllers/concerns/latest_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module LatestVersion
extend ActiveSupport::Concern

included do
def latest_version
@latest_version ||= @rubygem.versions.most_recent
end
end
end
16 changes: 16 additions & 0 deletions app/controllers/reverse_dependencies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class ReverseDependenciesController < ApplicationController
include LatestVersion
before_action :find_rubygem, only: [:index]
before_action :latest_version, only: [:index]
before_action :set_page, only: [:index]

def index
@reverse_dependencies = @rubygem.reverse_dependencies
.by_downloads
.includes(:latest_version, :gem_download)
if params[:rdeps_query] && params[:rdeps_query].is_a?(String)
@reverse_dependencies = @reverse_dependencies.search(params[:rdeps_query])
end
@reverse_dependencies = @reverse_dependencies.paginate(page: @page)
end
end
5 changes: 3 additions & 2 deletions app/controllers/rubygems_controller.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
class RubygemsController < ApplicationController
include LatestVersion
before_action :redirect_to_root, only: [:edit, :update], unless: :signed_in?
before_action :set_blacklisted_gem, only: [:show], if: :blacklisted?
before_action :find_rubygem, only: [:edit, :update, :show], unless: :blacklisted?
before_action :latest_version, only: [:show], unless: :blacklisted?
before_action :load_gem, only: [:edit, :update]
before_action :set_page, only: :index

Expand All @@ -22,8 +24,7 @@ def show
if @blacklisted_gem
render 'blacklisted'
else
@latest_version = @rubygem.versions.most_recent
@versions = @rubygem.public_versions(5)
@versions = @rubygem.public_versions(5)
if @rubygem.public_versions.any?
render 'show'
else
Expand Down
4 changes: 4 additions & 0 deletions app/helpers/rubygems_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ def download_link(version)
link_to_page :download, "/downloads/#{version.full_name}.gem"
end

def reverse_dependencies_link(rubygem)
link_to_page :reverse_dependencies, rubygem_reverse_dependencies_path(rubygem)
end

def documentation_link(version, linkset)
return unless linkset.nil? || linkset.docs.blank?
link_to_page :docs, version.documentation_path
Expand Down
4 changes: 4 additions & 0 deletions app/models/rubygem.rb
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,10 @@ def protected_days
(updated_at + 101.days - Time.zone.now).to_i / 1.day
end

def reverse_dependencies
self.class.reverse_dependencies(name)
end

private

# a gem namespace is not protected if it is
Expand Down
12 changes: 12 additions & 0 deletions app/views/reverse_dependencies/_reverse_dependencies.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<header class="gems__header push">
<%= form_tag rubygem_reverse_dependencies_path(@rubygem),
id: "rdeps-search", class: "header__search-wrap", method: :get do %>
<%= search_field_tag :rdeps_query, params[:rdeps_query], placeholder: t('.search_reverse_dependencies').html_safe, class: "header__search" %>
<%= label_tag :rdeps_query do %>
<span class="t-hidden"><%= t('.search_reverse_dependencies').html_safe %></span>
<% end %>
<%= submit_tag '⌕', id: 'rdeps_search_submit', name: nil, class: "header__search__icon" %>
<% end %>
</header>

<%= render dependencies %>
11 changes: 11 additions & 0 deletions app/views/reverse_dependencies/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<% @title = t('.title', name: @rubygem.name) %>
<% @subtitle = @latest_version.try(:slug) %>

<div class="l-overflow">
<div class="l-colspan--l colspan--l--has-border">
<%= render partial: "reverse_dependencies",
locals: { dependencies: @reverse_dependencies } %>
<%= will_paginate @reverse_dependencies %>
</div>
<%= render 'rubygems/aside' %>
</div>
1 change: 1 addition & 0 deletions app/views/rubygems/_aside.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,6 @@
<%= unsubscribe_link(@rubygem) %>
<%= atom_link(@rubygem) %>
<%= report_abuse_link(@rubygem) %>
<%= reverse_dependencies_link(@rubygem) %>
</div>
</div>
7 changes: 7 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ en:
report_abuse: Report Abuse
badge: Badge
rss: RSS
reverse_dependencies: Reverse dependencies
downloads_for_this_version: "For this version"
bundler_header: Gemfile
copy_to_clipboard: Copy to clipboard
Expand All @@ -164,6 +165,12 @@ en:
no_licenses: N/A
requirements_header: Requirements

reverse_dependencies:
index:
title: "Reverse dependencies for %{name}"
reverse_dependencies:
search_reverse_dependencies: "Search reverse dependencies Gems&hellip;"

searches:
show:
subtitle: "for %{query}"
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@
constraints: { format: :js },
defaults: { format: :js }
resources :versions, only: [:show, :index]
resources :reverse_dependencies, only: [:index]
end
end

Expand Down
53 changes: 53 additions & 0 deletions test/functional/reverse_dependencies_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
require 'test_helper'

class ReverseDependenciesControllerTest < ActionController::TestCase
context "On GET to show for a gem reverse dependencies" do
setup do
@version_one = create(:version)
@rubygem_one = @version_one.rubygem
@version_two = create(:version)
@rubygem_two = @version_two.rubygem
@version_three = create(:version)
@rubygem_three = @version_three.rubygem
@version_four = create(:version)
@rubygem_four = @version_four.rubygem

@version_two.dependencies << create(:dependency,
version: @version_two,
rubygem: @rubygem_one)
@version_three.dependencies << create(:dependency,
version: @version_three,
rubygem: @rubygem_two)
@version_four.dependencies << create(:dependency,
version: @version_four,
rubygem: @rubygem_two)
end

should "render template" do
get :index, rubygem_id: @rubygem_one.to_param
respond_with :success
render_template :index
end

should "show reverse dependencies" do
get :index, rubygem_id: @rubygem_one.to_param
assert page.has_content?(@rubygem_two.name)
refute page.has_content?(@rubygem_three.name)
end

should "search reverse dependencies" do
get :index,
rubygem_id: @rubygem_two.to_param,
rdeps_query: @rubygem_three.name
assert page.has_content?(@rubygem_three.name)
refute page.has_content?(@rubygem_four.name)
end

should "search only current reverse dependencies" do
get :index,
rubygem_id: @rubygem_two.to_param,
rdeps_query: @rubygem_one.name
refute page.has_content?(@rubygem_one.name)
end
end
end