Commit 0b3288001e43c8e16ab82700f2f9e539646cbbe4

Authored by Diego de Araújo Martinez Camarinha
2 parents b4fcf54e f0955baf
Exists in colab and in 2 other branches master, stable

Merge pull request #337 from mezuro/update_home_again

Update home and remove menu
CHANGELOG.rdoc
... ... @@ -5,6 +5,10 @@ Prezento is the web interface for Mezuro.
5 5 == Unreleased
6 6  
7 7 * Remove Show button for hotspot metric configurations
  8 +* Remove side menu
  9 +* Refactor footer as a grid
  10 +* Add latest repositories list to the homepage
  11 +* Add latest configurations list to the homepage
8 12  
9 13 == v0.11.3 - 01/04/2016
10 14  
... ...
app/assets/stylesheets/bootstrap_and_overrides.css.less
... ... @@ -40,19 +40,6 @@
40 40  
41 41 //@import "datepicker/datepicker";
42 42  
43   -footer div {
44   - width: 50%;
45   -}
46   -
47   -.footer-right {
48   - float: right;
49   - text-align: right;
50   -}
51   -
52   -.footer-left {
53   - float: left;
54   -}
55   -
56 43 #error_explanation {
57 44 background-color: #F2DEDE;
58 45 border-color: #EED3D7;
... ...
app/controllers/home_controller.rb
1 1 class HomeController < ApplicationController
2 2 def index
3 3 @latest_projects = Project.latest(5)
  4 + @latest_repositories = Repository.latest(5)
  5 + @latest_configurations = KalibroConfiguration.latest(5)
4 6 end
5 7 end
... ...
app/models/kalibro_configuration.rb
... ... @@ -28,4 +28,8 @@ class KalibroConfiguration &lt; KalibroClient::Entities::Configurations::KalibroCon
28 28 @attributes = nil
29 29 super
30 30 end
  31 +
  32 + def self.latest(count=1)
  33 + all.sort { |one, another| another.id <=> one.id }.select { |kalibro_configuration| kalibro_configuration.attributes.public }.first(count)
  34 + end
31 35 end
... ...
app/models/repository.rb
1 1 class Repository < KalibroClient::Entities::Processor::Repository
2 2 include KalibroRecord
  3 +
  4 + def self.latest(count=1)
  5 + all.sort { |one, another| another.id <=> one.id }.first(count)
  6 + end
3 7 end
... ...
app/views/home/index.html.erb
... ... @@ -6,12 +6,40 @@
6 6 </p>
7 7 </div>
8 8  
9   -<h2><%= t('latest_projects') %></h2>
  9 +<div class="container-fluid">
  10 + <div class="row">
  11 + <div class="col-md-4">
  12 + <h2><%= t('latest_projects') %></h2>
10 13  
11   -<ul>
12   - <% cache do %>
13   - <% @latest_projects.each do |project| %>
14   - <li><%= link_to(project.name, project_path(project.id)) %></li>
15   - <% end %>
16   - <% end %>
17   -</ul>
  14 + <ul>
  15 + <% cache action_suffix: 'latest_projects' do %>
  16 + <% @latest_projects.each do |project| %>
  17 + <li><%= link_to(project.name, project_path(project.id)) %></li>
  18 + <% end %>
  19 + <% end %>
  20 + </ul>
  21 + </div>
  22 + <div class="col-md-4">
  23 + <h2><%= t('latest_repositories') %></h2>
  24 +
  25 + <ul>
  26 + <% cache action_suffix: 'latest_repositories' do %>
  27 + <% @latest_repositories.each do |repository| %>
  28 + <li><%= link_to(repository.name, repository_path(repository.id)) %></li>
  29 + <% end %>
  30 + <% end %>
  31 + </ul>
  32 + </div>
  33 + <div class="col-md-4">
  34 + <h2><%= t('latest_configurations') %></h2>
  35 +
  36 + <ul>
  37 + <% cache action_suffix: 'latest_configurations' do %>
  38 + <% @latest_configurations.each do |configuration| %>
  39 + <li><%= link_to(configuration.name, kalibro_configuration_path(configuration.id)) %></li>
  40 + <% end %>
  41 + <% end %>
  42 + </ul>
  43 + </div>
  44 + </div>
  45 +</div>
... ...
app/views/layouts/application.html.erb
... ... @@ -45,95 +45,29 @@
45 45 </head>
46 46 <body>
47 47  
48   - <div class="navbar navbar-default">
49   - <div class="navbar-inner">
50   - <div class="container-fluid">
51   - <div class="navbar-header">
52   - <button type="button" class="navbar-toggle collapsed" data-target="#nav-collapse" data-toggle="collapse">
53   - <span class="icon-bar"></span>
54   - <span class="icon-bar"></span>
55   - <span class="icon-bar"></span>
56   - </button>
57   - <a><%= link_to image_tag('logo.png'), root_path, class: 'navbar-brand' %></a>
58   - </div>
59   - <div class="collapse navbar-collapse" id="nav-collapse">
60   - <ul class="nav navbar-nav">
61   - <li><%= link_to t('home'), root_path %></li>
62   - <li><%= link_to Project.model_name.human, projects_path %></li>
63   - <li><%= link_to Repository.model_name.human, repositories_path %></li>
64   - <li><%= link_to KalibroConfiguration.model_name.human, kalibro_configurations_path %></li>
65   - <li><%= link_to ReadingGroup.model_name.human, reading_groups_path %></li>
66   - </ul>
67   - <ul class="nav navbar-nav navbar-right">
68   - <% if user_signed_in? %>
69   - <li><%= link_to t('edit_account'), edit_user_registration_path %></li>
70   - <li><%= link_to t('sign_out'), destroy_user_session_path, :method => :delete %></li>
71   - <% else %>
72   - <li><%= link_to t('sign_in'), new_user_session_path %></li>
73   - <li><%= link_to t('sign_up'), new_user_registration_path %></li>
74   - <% end %>
75   - <li class="dropdown">
76   - <a class="dropdown-toggle" aria-expanded="true" role="button" data-toggle="dropdown" href="#">
77   - <%= t('language') %>
78   - <span class="caret"></span>
79   - </a>
80   - <ul class="dropdown-menu" role="menu">
81   - <% I18n.available_locales.each do |locale| %>
82   - <li><%= link_to(locale.to_s, url_for(locale: locale), data: { no_turbolink: true }) %></li>
83   - <% end %>
84   - </ul>
85   - </li>
86   - </ul>
87   - </div><!--/.nav-collapse -->
88   - </div>
89   - </div>
90   - </div>
  48 + <%= render partial: 'shared/navbar' %>
91 49  
92 50 <div class="container-fluid">
93 51 <div class="row">
94   - <div class="col-sm-3 col-md-3">
95   - <div class="well sidebar-nav">
96   - <ul class="list-group">
97   - <% if user_signed_in? %>
98   - <li class="nav-header"><%= t('hello_html', user: current_user.name) %></li>
99   - <li class="list-group-item"><%= link_to t('your_projects'), user_projects_path(current_user.id) %></li>
100   - <% end %>
101   - <li class="nav-header"><%= t('tutorials') %></li>
102   - <li class="list-group-item"><%= link_to t('analysis'), tutorials_path('analyzing') %></li>
103   - <li class="list-group-item"><%= link_to t('configuring'), tutorials_path('configuring') %></li>
104   - <li class="list-group-item" ><%= link_to t('keywords'), tutorials_path('keywords') %></li>
105   - <% if content_for?(:sidebar) %>
106   - <%= yield :sidebar %>
107   - <% else %>
108   - <%= render 'shared/short_about' %>
109   - <% end %>
110   - </ul>
111   - </div><!--/.well -->
112   - </div><!--/col-sm-3 col-md-3-->
113   - <div class="col-sm-9 col-md-9">
114   - <div class="alert alert-info" id="loader"><i class="fa fa-spinner fa-spin fa-lg"></i>&nbsp;&nbsp; <%= t('instant_loading_page') %></div>
  52 + <div class="col-sm-12 col-md-12">
  53 + <div class="alert alert-info" id="loader"><i class="fa fa-spinner fa-spin fa-lg"></i>&nbsp;&nbsp; <%= t('instant_loading_page') %></div>
115 54  
116 55 <%= bootstrap_flash %>
117 56 <%= yield %>
118 57 </div>
119 58 </div><!--/row-->
120   -
121   - <footer>
122   - <div class="footer-left">&copy; <%= link_to(t('mezuro_team'), '/humans.txt') %> 2013-2015</div>
123   - <div class="footer-right"><%= link_to(image_tag('agplv3-88x31.png'), 'http://www.gnu.org/licenses/agpl-3.0-standalone.html') %> <%= link_to image_tag('fork-me.png'), 'https://github.com/mezuro/prezento' %> <%= image_tag 'usp-cloud-nuvem-logo.png' %> <%= link_to image_tag('banner-ccsl.png', height: '40', width: '190'), 'http://ccsl.ime.usp.br/' %></div>
124   - </footer>
125   -
126   - <script type="text/javascript">
127   - $(function() {
128   - $( "#languages-accordion > div" ).accordion({
129   - heightStyle: "content",
130   - collapsible: true,
131   - active: false
132   - });
133   - });
134   - </script>
135   -
136 59 </div> <!-- /container -->
137 60  
  61 + <%= render partial: 'shared/footer' %>
  62 +
  63 + <script type="text/javascript">
  64 + $(function() {
  65 + $( "#languages-accordion > div" ).accordion({
  66 + heightStyle: "content",
  67 + collapsible: true,
  68 + active: false
  69 + });
  70 + });
  71 + </script>
138 72 </body>
139 73 </html>
... ...
app/views/shared/_footer.html.erb 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +<footer>
  2 + <div class="container-fluid">
  3 + <div class="row">
  4 + <div class="col-md-7">&copy; <%= link_to(t('mezuro_team'), '/humans.txt') %> 2013-2016</div>
  5 + <div class="col-md-5">
  6 + <div class="container-fluid">
  7 + <div class="row">
  8 + <div class="col-md-2"><%= link_to(image_tag('agplv3-88x31.png'), 'http://www.gnu.org/licenses/agpl-3.0-standalone.html') %></div>
  9 + <div class="col-md-2"><%= link_to image_tag('fork-me.png'), 'https://github.com/mezuro/prezento' %></div>
  10 + <div class="col-md-2"><%= image_tag 'usp-cloud-nuvem-logo.png' %></div>
  11 + <div class="col-md-6"><%= link_to image_tag('banner-ccsl.png', height: '40', width: '190'), 'http://ccsl.ime.usp.br/' %></div>
  12 + </div>
  13 + </div>
  14 + </div>
  15 + </div>
  16 + </div>
  17 +</footer>
... ...
app/views/shared/_navbar.html.erb 0 → 100644
... ... @@ -0,0 +1,52 @@
  1 +<div class="navbar navbar-default">
  2 + <div class="navbar-inner">
  3 + <div class="container-fluid">
  4 + <div class="navbar-header">
  5 + <button type="button" class="navbar-toggle collapsed" data-target="#nav-collapse" data-toggle="collapse">
  6 + <span class="icon-bar"></span>
  7 + <span class="icon-bar"></span>
  8 + <span class="icon-bar"></span>
  9 + </button>
  10 + <a><%= link_to image_tag('logo.png'), root_path, class: 'navbar-brand' %></a>
  11 + </div>
  12 + <div class="collapse navbar-collapse" id="nav-collapse">
  13 + <ul class="nav navbar-nav">
  14 + <li><%= link_to t('home'), root_path %></li>
  15 + <li><%= link_to Project.model_name.human, projects_path %></li>
  16 + <li><%= link_to Repository.model_name.human, repositories_path %></li>
  17 + <li><%= link_to KalibroConfiguration.model_name.human, kalibro_configurations_path %></li>
  18 + <li><%= link_to ReadingGroup.model_name.human, reading_groups_path %></li>
  19 + </ul>
  20 + <ul class="nav navbar-nav navbar-right">
  21 + <% if user_signed_in? %>
  22 + <li class="dropdown">
  23 + <a class="dropdown-toggle" aria-expanded="true" role="button" data-toggle="dropdown" href="#">
  24 + <%= current_user.name %>
  25 + <span class="caret"></span>
  26 + </a>
  27 + <ul class="dropdown-menu" role="menu">
  28 + <li><%= link_to t('your_projects'), user_projects_path(current_user.id) %></li>
  29 + <li><%= link_to t('edit_account'), edit_user_registration_path %></li>
  30 + <li><%= link_to t('sign_out'), destroy_user_session_path, :method => :delete %></li>
  31 + </ul>
  32 + </li>
  33 + <% else %>
  34 + <li><%= link_to t('sign_in'), new_user_session_path %></li>
  35 + <li><%= link_to t('sign_up'), new_user_registration_path %></li>
  36 + <% end %>
  37 + <li class="dropdown">
  38 + <a class="dropdown-toggle" aria-expanded="true" role="button" data-toggle="dropdown" href="#">
  39 + <%= t('language') %>
  40 + <span class="caret"></span>
  41 + </a>
  42 + <ul class="dropdown-menu" role="menu">
  43 + <% I18n.available_locales.each do |locale| %>
  44 + <li><%= link_to(locale.to_s, url_for(locale: locale), data: { no_turbolink: true }) %></li>
  45 + <% end %>
  46 + </ul>
  47 + </li>
  48 + </ul>
  49 + </div><!--/.nav-collapse -->
  50 + </div>
  51 + </div>
  52 +</div>
0 53 \ No newline at end of file
... ...
config/locales/views/home/en.yml
1 1 en:
2 2 title_home_index: "Understanding Code Metrics"
3   - body_home_index_html: "<p>This is Mezuro! A <strong>free/libre</strong> web platform for <strong>collaborative</strong> source code <strong>evaluation</strong>.</p> <p>Here you can evaluate your source code with the most popular SCMs (like Git and SVN), just by providing its URL. For now, you can evaluate <strong>C</strong>, <strong>C++</strong>, <strong>Java</strong>, <strong>Ruby</strong> and <strong>Python</strong> source codes, but we are looking forward to supporting more languages in the future (PHP is coming soon).</p>"
  3 + body_home_index_html: "<p>This is Mezuro! A <strong>free/libre</strong> web platform for <strong>collaborative</strong> source code <strong>evaluation</strong>.</p> <p>Here you can evaluate your source code with the most popular SCMs (like Git and SVN), just by providing its URL. For now, you can evaluate <strong>C</strong>, <strong>C++</strong>, <strong>Java</strong>, <strong>Ruby</strong>, <strong>Python</strong> and <strong>PHP</strong> source codes, but we are looking forward to supporting more languages in the future.</p>"
4 4 body_feedback_home_index_html: "Mezuro is continuously under development. Try it and give us your %{href}."
5 5 latest_projects: "Latest projects"
  6 + latest_repositories: "Latest repositories"
  7 + latest_configurations: "Latest configurations"
... ...
config/locales/views/home/pt.yml
1 1 pt:
2 2 title_home_index: "Entendendo Métricas de Código"
3   - body_home_index_html: "<p>Este é o Mezuro! Uma plataforma web <strong>livre</strong> para <strong>avaliação colaborativa</strong> de código fonte.</p> <p>Aqui você pode avaliar seu código fonte com os SCMs mais populares (como Git e SVN), apenas fornecendo sua URL. Por enquanto, você pode avaliar códigos em <strong>C</strong>, <strong>C++</strong>, <strong>Java</strong>, <strong>Ruby</strong> e <strong>Python<strong> mas nós pretendemos dar suporte a mais linguagens no futuro (PHP está muito próximo).</p>"
  3 + body_home_index_html: "<p>Este é o Mezuro! Uma plataforma web <strong>livre</strong> para <strong>avaliação colaborativa</strong> de código fonte.</p> <p>Aqui você pode avaliar seu código fonte com os SCMs mais populares (como Git e SVN), apenas fornecendo sua URL. Por enquanto, você pode avaliar códigos em <strong>C</strong>, <strong>C++</strong>, <strong>Java</strong>, <strong>Ruby</strong>, <strong>Python</strong> e <strong>PHP</strong> mas nós pretendemos dar suporte a mais linguagens no futuro.</p>"
4 4 body_feedback_home_index_html: "Mezuro está sob constante desenvolvimento. Experimente e nos dê o seu %{href}."
5 5 latest_projects: "Últimos projetos"
  6 + latest_repositories: "Últimos repositórios"
  7 + latest_configurations: "Últimas configurações"
... ...
config/locales/views/layouts/en.yml
1 1 en:
2   - hello_html: "Hello, %{user}"
3 2 instant_loading_page: "Wait an instant while we are loading the page that you have requested."
4 3 home: "Home"
5 4 edit_account: "Edit Account"
... ...
config/locales/views/layouts/pt.yml
1 1 pt:
2   - hello_html: "Olá, %{user}"
3 2 instant_loading_page: "Espere um instante enquanto estamos carregando a página que você solicitou."
4 3 home: "Início"
5 4 edit_account: "Editar Conta"
... ...
features/homepage.feature
... ... @@ -3,21 +3,29 @@ Feature: Homepage
3 3 As a regular user
4 4 I want to have in one page useful links to manage my account and session
5 5  
  6 + @kalibro_processor_restart
6 7 Scenario: Before signing in
7   - Given I am at the homepage
8   - Then I should see "Sign In"
  8 + Given I have a project named "GCC"
  9 + Then I am at the homepage
  10 + And I should see "Home"
  11 + And I should see "Project"
  12 + And I should see "Repository"
  13 + And I should see "Configuration"
  14 + And I should see "Reading Group"
  15 + And I should see "Sign In"
9 16 And I should see "Sign Up"
  17 + And I should see "Language"
10 18 And I should see "Latest projects"
11   - And I should see "Project"
  19 + And I should see "Latest repositories"
  20 + And I should see "Latest configurations"
  21 + Then I should see "GCC" only "1" times
12 22  
13 23 Scenario: Signed in
14 24 Given I am a regular user
15 25 And I am signed in
16 26 And I am at the homepage
17   - Then I should see "Edit"
  27 + Then I should see "Edit Account"
18 28 And I should see "Sign Out"
19   - And I should see "Latest projects"
20   - And I should see "Project"
21 29 And I should see "Your projects"
22 30  
23 31 Scenario: Language selection
... ...
features/step_definitions/homepage_steps.rb
... ... @@ -12,4 +12,8 @@ end
12 12  
13 13 Then(/^I should see "(.+)"$/) do |text|
14 14 expect(page).to have_content(text)
15   -end
16 15 \ No newline at end of file
  16 +end
  17 +
  18 +Then(/^I should see "(.*?)" only "(.*?)" times$/) do |text, times|
  19 + expect(page).to have_content(text, count: times.to_i)
  20 +end
... ...
features/users/user_update.feature
... ... @@ -8,7 +8,9 @@ Feature: User update
8 8 Given I am a regular user
9 9 And I am signed in
10 10 And I am at the homepage
11   - When I click the Edit link
  11 + And I take a picture of the page
  12 + When I click the Diego Martinez link
  13 + And I click the Edit Account link
12 14 And I fill the Name field with "Rafael Manzo"
13 15 And I fill the Current password field with "password"
14 16 And I press the Update button
... ...
spec/controllers/home_controller_spec.rb
... ... @@ -5,6 +5,8 @@ describe HomeController, :type =&gt; :controller do
5 5 context '#index' do
6 6 before :each do
7 7 Project.expects(:latest).with(5).returns([])
  8 + Repository.expects(:latest).with(5).returns([])
  9 + KalibroConfiguration.expects(:latest).with(5).returns([])
8 10 end
9 11  
10 12 describe 'Rendering' do
... ...
spec/models/kalibro_configuration_spec.rb
... ... @@ -70,6 +70,29 @@ describe KalibroConfiguration, :type =&gt; :model do
70 70 end
71 71 end
72 72 end
  73 +
  74 + describe 'latest' do
  75 + let!(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, id: 1) }
  76 + let!(:another_kalibro_configuration) { FactoryGirl.build(:another_kalibro_configuration, id: 2) }
  77 + let!(:kalibro_configuration_attributes) { FactoryGirl.build(:kalibro_configuration_attributes) }
  78 +
  79 + before :each do
  80 + kalibro_configuration.expects(:attributes).returns(kalibro_configuration_attributes)
  81 + another_kalibro_configuration.expects(:attributes).returns(kalibro_configuration_attributes)
  82 +
  83 + KalibroConfiguration.expects(:all).returns([kalibro_configuration, another_kalibro_configuration])
  84 + end
  85 +
  86 + it 'should return the two kalibro_configurations ordered' do
  87 + expect(KalibroConfiguration.latest(2)).to eq([another_kalibro_configuration, kalibro_configuration])
  88 + end
  89 +
  90 + context 'when no parameter is passed' do
  91 + it 'should return just the most recent kalibro_configuration' do
  92 + expect(KalibroConfiguration.latest).to eq([another_kalibro_configuration])
  93 + end
  94 + end
  95 + end
73 96 end
74 97  
75 98 describe 'destroy' do
... ...
spec/models/repository_spec.rb 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +require 'rails_helper'
  2 +
  3 +describe Repository do
  4 + describe 'class method' do
  5 + describe 'latest' do
  6 + let!(:repository) { FactoryGirl.build(:repository, id: 1) }
  7 + let!(:another_repository) { FactoryGirl.build(:another_repository, id: 2) }
  8 +
  9 + before do
  10 + Repository.expects(:all).returns([repository, another_repository])
  11 + end
  12 +
  13 + it 'should return the two repositorys ordered' do
  14 + expect(Repository.latest(2)).to eq([another_repository, repository])
  15 + end
  16 +
  17 + context 'when no parameter is passed' do
  18 + it 'should return just the most recent repository' do
  19 + expect(Repository.latest).to eq([another_repository])
  20 + end
  21 + end
  22 + end
  23 + end
  24 +end
0 25 \ No newline at end of file
... ...