From 3fb243786b2fe35397683ae567b5fe4af569352c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves?= Date: Fri, 29 Jan 2016 10:02:17 +0000 Subject: [PATCH 1/2] adding users count to languages list --- .../api/v0/languages_controller.rb | 5 ++-- app/usecases/languages/index.rb | 24 ++++++++++++++++--- .../api/languages_controller_spec.rb | 12 ++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/v0/languages_controller.rb b/app/controllers/api/v0/languages_controller.rb index 1ec281a..37c3a67 100644 --- a/app/controllers/api/v0/languages_controller.rb +++ b/app/controllers/api/v0/languages_controller.rb @@ -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 diff --git a/app/usecases/languages/index.rb b/app/usecases/languages/index.rb index 387f6d0..c40e70d 100644 --- a/app/usecases/languages/index.rb +++ b/app/usecases/languages/index.rb @@ -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| { "#{l}" => 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 diff --git a/spec/controllers/api/languages_controller_spec.rb b/spec/controllers/api/languages_controller_spec.rb index 6e4fd35..5053ede 100644 --- a/spec/controllers/api/languages_controller_spec.rb +++ b/spec/controllers/api/languages_controller_spec.rb @@ -36,5 +36,17 @@ def response_hash expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"]) end end + + context "return with user count" do + it 'should return a list of languages with users count' do + get :index, sort: :alphabetical, with_count: true + expect(response_hash['languages']).to eq([ + { "C#" => 0 }, + { "JavaScript" => 0 }, + { "Ruby" => 0 } + ]) + end + end + end end \ No newline at end of file From da4766a4c68ea6768010a81368fd17568dab6bf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves?= Date: Fri, 29 Jan 2016 23:05:30 +0000 Subject: [PATCH 2/2] return an object with name and users count keys --- app/usecases/languages/index.rb | 2 +- .../api/languages_controller_spec.rb | 60 +++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/app/usecases/languages/index.rb b/app/usecases/languages/index.rb index c40e70d..a046b99 100644 --- a/app/usecases/languages/index.rb +++ b/app/usecases/languages/index.rb @@ -22,7 +22,7 @@ def read_languages end def add_users_count - languages.map! { |l| { "#{l}" => users_for_language(l) } } + languages.map! { |l| { "name" => "#{l}", "users_count" => users_for_language(l) } } end def languages_file diff --git a/spec/controllers/api/languages_controller_spec.rb b/spec/controllers/api/languages_controller_spec.rb index 5053ede..df13ffb 100644 --- a/spec/controllers/api/languages_controller_spec.rb +++ b/spec/controllers/api/languages_controller_spec.rb @@ -35,16 +35,66 @@ 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([ - { "C#" => 0 }, - { "JavaScript" => 0 }, - { "Ruby" => 0 } - ]) + 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