Skip to content
Open
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
5 changes: 3 additions & 2 deletions app/controllers/api/v0/languages_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ class LanguagesController < ApiController

def index
sort = params["sort"].try(:to_sym) || :alphabetical
languages = Languages::Index.get(sort: sort)
respond({languages: languages}, :ok)
with_count = params["with_count"] || false
languages = Languages::Index.get({ sort: sort, with_count: with_count })
respond({ languages: languages }, :ok)
end

end
Expand Down
24 changes: 21 additions & 3 deletions app/usecases/languages/index.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,36 @@ class Index

class << self

def get(sort: :alphabetical)
languages = Rails.cache.fetch('languages') do
attr_accessor :languages

def get(context)
read_languages
languages.sort! if context[:sort] == :alphabetical
add_users_count if ["true", true].include?(context[:with_count])
languages
end

private

def read_languages
@languages = Rails.cache.fetch('languages') do
file_contents = File.read(languages_file)
JSON.parse(file_contents).compact
end
sort == :alphabetical ? languages.sort : languages
end

def add_users_count
languages.map! { |l| { "name" => "#{l}", "users_count" => users_for_language(l) } }
end

def languages_file
Rails.root.join('app/assets/json/languages.json')
end

def users_for_language(language)
$redis.zcard("user_#{language}".redis_key)
end

end

end
Expand Down
62 changes: 62 additions & 0 deletions spec/controllers/api/languages_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,68 @@ def response_hash
get :index, sort: :alphabetical
expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"])
end

it 'should return a list of languages ordered alphabetically with count false' do
get :index, sort: :alphabetical, with_count: false
expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"])
end
end

context "return with user count" do

before(:each) do
@vdaubry = FactoryGirl.create(:user, gravatar_url: 'url', login: 'vdaubry', city: 'paris', country: 'france')
FactoryGirl.create(:repository, language: 'ruby', user: @vdaubry)

@nunogoncalves = FactoryGirl.create(:user, gravatar_url: 'url', login: 'nunogoncalves', city: 'lisbon', country: 'portugal')
FactoryGirl.create(:repository, name: 'rails', language: 'ruby', user: @nunogoncalves, stars: 3)

@walterwhite = FactoryGirl.create(:user, login: 'walterwhite', city: 'albuquerque', country: 'usa')
FactoryGirl.create(:repository, language: 'JavaScript', user: @walterwhite, stars: 4)

@sherlockholmes = FactoryGirl.create(:user, login: 'sherlockholmes', city: 'san francisco', country: 'us', gravatar_url: 'url')
FactoryGirl.create(:repository, language: 'C#', user: @sherlockholmes, stars: 5)


$redis.zadd("user_ruby_paris", 1.1, @vdaubry.id)
$redis.zadd("user_ruby", 1.1, @vdaubry.id)
$redis.zadd("user_ruby_lisbon", 1.2, @nunogoncalves.id)
$redis.zadd("user_ruby", 1.2, @nunogoncalves.id)
$redis.zadd("user_javascript_albuquerque", 0.2, @walterwhite.id)
$redis.zadd("user_javascript", 0.2, @walterwhite.id)
$redis.zadd("user_javascript_san_francisco", 0.5, @sherlockholmes.id)
$redis.zadd("user_c#", 0.5, @sherlockholmes.id)
end

let :languages_objects do
[{
"name" => "C#",
"users_count" => 1
}, {
"name" => "JavaScript",
"users_count" => 1
}, {
"name" => "Ruby",
"users_count" => 2
}]
end

it 'should return a list of languages with users count' do
get :index, sort: :alphabetical, with_count: true
expect(response_hash['languages']).to eq(languages_objects)
end

it 'should return a list of languages with users count' do
get :index, sort: :alphabetical, with_count: "true"
expect(response_hash['languages']).to eq(languages_objects)
end


it 'should return a list of languages with users count' do
get :index, sort: :alphabetical, with_count: "some_string_value"
expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"])
end
end

end
end