sufia 6.1.0 → 6.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +11 -1
- data/SUFIA_VERSION +1 -1
- data/app/assets/javascripts/sufia/edit_metadata.js +2 -2
- data/app/controllers/admin/stats_controller.rb +20 -8
- data/app/controllers/concerns/sufia/my_controller_behavior.rb +3 -3
- data/app/views/admin/stats/_files.html.erb +16 -0
- data/app/views/admin/stats/_new_users.html.erb +30 -0
- data/app/views/admin/stats/index.html.erb +2 -36
- data/app/views/batch/_metadata.html.erb +1 -1
- data/app/views/collections/_form_for_select_collection.html.erb +1 -2
- data/app/views/users/_user_info.html.erb +1 -1
- data/config/locales/sufia.en.yml +4 -0
- data/lib/sufia/version.rb +1 -1
- data/spec/controllers/admin_stats_controller_spec.rb +44 -15
- data/spec/controllers/my/files_controller_spec.rb +16 -2
- data/spec/features/browse_dashboard_files_spec.rb +83 -64
- data/spec/javascripts/autocomplete_spec.js.coffee +137 -0
- data/spec/models/generic_file_spec.rb +100 -0
- data/spec/models/user_spec.rb +27 -0
- data/spec/spec_helper.rb +7 -3
- data/spec/support/fixture_helpers.rb +1 -2
- data/spec/views/users/_user_info.html.erb_spec.rb +29 -0
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5983e2ea047b6ee6b08ef678cb233a8f20b68a3
|
4
|
+
data.tar.gz: 73adb6f66582d0b1021d0addba02efb4e15ee8ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e378ea0a2b5e17b0f86ab170c276d92863a8933468c4b5af31e472b2d226a096f9f9475e51a41ce3f9f9523df83f069c0605f24a08973888f79b425943cf0db7
|
7
|
+
data.tar.gz: b4e5438fbd558768b324b336a5c1d9b0194c44c56360c66069bfee3d38bac696998d1115160194a150e9832cd9ee3297f1ec18bbfc3a43bb0ea9282693724938
|
data/History.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# History of Sufia releases
|
2
2
|
|
3
|
+
## 6.2.0
|
4
|
+
|
5
|
+
* Check to make sure Zotero integration is enabled before asking user instances if they have a Zotero user ID. Fixes #1235 [Michael J. Giarlo]
|
6
|
+
* Make my controller retrieve only user's own collections. [Olli Lyytinen]
|
7
|
+
* Adding date range queries for deposited files. fixes #1189 [Carolyn Cole]
|
8
|
+
* Allowing the second input to also auto complete. fixes #1222 [Carolyn Cole]
|
9
|
+
* Removing any calls to the sort! method [Carolyn Cole]
|
10
|
+
* Adding recent users query end date so a range can be queried. fixes #1187 [Carolyn Cole]
|
11
|
+
* Don't calculate coverage of code found in spec/ directory [Michael J. Giarlo]
|
12
|
+
* Refactoring feature test to make it more efficient [Carolyn Cole]
|
13
|
+
|
3
14
|
## 6.1.0
|
4
15
|
|
5
16
|
* Making the image thumbnail alt tag empty for better accessibility, since there is more information about title and description in the result. [Michael Tribone]
|
@@ -68,7 +79,6 @@
|
|
68
79
|
* Noid service extracted out into its own gem [Michael J. Giarlo]
|
69
80
|
* Correct version of Sufia in README [Michael J. Giarlo]
|
70
81
|
|
71
|
-
|
72
82
|
## 6.0.0
|
73
83
|
|
74
84
|
* Replace pid with id in config [Adam Wead]
|
data/SUFIA_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.
|
1
|
+
6.2.0
|
@@ -45,7 +45,7 @@ Blacklight.onLoad(function() {
|
|
45
45
|
},
|
46
46
|
minLength: 2
|
47
47
|
};
|
48
|
-
$("
|
48
|
+
$("input.generic_file_based_near").autocomplete(get_autocomplete_opts("location"));
|
49
49
|
|
50
50
|
var autocomplete_vocab = new Object();
|
51
51
|
|
@@ -57,7 +57,7 @@ Blacklight.onLoad(function() {
|
|
57
57
|
for (var i=0; i < autocomplete_vocab.url_var.length; i++) {
|
58
58
|
autocomplete_vocab.field_name.push('generic_file_' + autocomplete_vocab.url_var[i]);
|
59
59
|
// autocompletes
|
60
|
-
$("
|
60
|
+
$("input." + autocomplete_vocab.field_name[i])
|
61
61
|
// don't navigate away from the field on tab when selecting an item
|
62
62
|
.bind( "keydown", function( event ) {
|
63
63
|
if ( event.keyCode === $.ui.keyCode.TAB &&
|
@@ -29,10 +29,23 @@ class Admin::StatsController < ApplicationController
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def document_by_permission
|
32
|
+
return document_by_date_by_permission if @users_stats[:file_start_date]
|
33
|
+
|
32
34
|
files_count = {}
|
33
35
|
files_count[:total] = GenericFile.count
|
34
|
-
files_count[:public] = GenericFile.
|
35
|
-
files_count[:registered] = GenericFile.
|
36
|
+
files_count[:public] = GenericFile.where_public.count
|
37
|
+
files_count[:registered] = GenericFile.where_registered.count
|
38
|
+
files_count[:private] = files_count[:total] - (files_count[:registered] + files_count[:public])
|
39
|
+
files_count
|
40
|
+
end
|
41
|
+
|
42
|
+
def document_by_date_by_permission
|
43
|
+
start_date = DateTime.parse(@users_stats[:file_start_date])
|
44
|
+
end_date = DateTime.parse(@users_stats[:file_end_date]).end_of_day unless @users_stats[:file_end_date].blank?
|
45
|
+
files_count = {}
|
46
|
+
files_count[:total] = GenericFile.find_by_date_created(start_date, end_date).count
|
47
|
+
files_count[:public] = GenericFile.find_by_date_created(start_date, end_date).merge(GenericFile.where_public).count
|
48
|
+
files_count[:registered] = GenericFile.find_by_date_created(start_date, end_date).merge(GenericFile.where_registered).count
|
36
49
|
files_count[:private] = files_count[:total] - (files_count[:registered] + files_count[:public])
|
37
50
|
files_count
|
38
51
|
end
|
@@ -57,12 +70,11 @@ class Admin::StatsController < ApplicationController
|
|
57
70
|
end
|
58
71
|
|
59
72
|
def recent_users
|
60
|
-
#
|
61
|
-
if @users_stats[:start_date]
|
62
|
-
return User.where('created_at >= ?', @users_stats[:start_date])
|
63
|
-
end
|
73
|
+
# no dates return the top 5
|
74
|
+
return User.order('created_at DESC').limit(5) if @users_stats[:start_date].blank?
|
64
75
|
|
65
|
-
|
66
|
-
|
76
|
+
start_date = DateTime.parse @users_stats[:start_date]
|
77
|
+
end_date = DateTime.parse(@users_stats[:end_date]).end_of_day unless @users_stats[:end_date].blank?
|
78
|
+
User.recent_users start_date, end_date
|
67
79
|
end
|
68
80
|
end
|
@@ -6,17 +6,17 @@ module Sufia
|
|
6
6
|
include Hydra::Catalog
|
7
7
|
include Hydra::BatchEditBehavior
|
8
8
|
include Hydra::Collections::SelectsCollections
|
9
|
-
|
9
|
+
|
10
10
|
included do
|
11
11
|
include Blacklight::Configurable
|
12
12
|
|
13
13
|
self.copy_blacklight_config_from(CatalogController)
|
14
14
|
self.blacklight_config.search_builder_class = Sufia::MySearchBuilder
|
15
|
-
|
15
|
+
|
16
16
|
before_filter :authenticate_user!
|
17
17
|
before_filter :enforce_show_permissions, only: :show
|
18
18
|
before_filter :enforce_viewing_context_for_show_requests, only: :show
|
19
|
-
before_filter :
|
19
|
+
before_filter :find_collections_with_edit_access, only: :index
|
20
20
|
|
21
21
|
self.search_params_logic += [:add_access_controls_to_solr_params, :add_advanced_parse_q_to_solr]
|
22
22
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<h2>File Statistics</h2>
|
2
|
+
<%= form_for "users_stats", url: sufia.admin_stats_path, method: "GET" do |f| %>
|
3
|
+
<%= f.label "#{ t("sufia.admin.stats.deposited_form.heading") } #{ t("sufia.admin.stats.deposited_form.start_label") }" %>
|
4
|
+
<input type="date" name="users_stats[file_start_date]" value="<%= @users_stats[:file_start_date] %>"></input>
|
5
|
+
<%= f.label t("sufia.admin.stats.deposited_form.end_label") %>
|
6
|
+
<input type="date" name="users_stats[file_end_date]" value="<%= @users_stats[:file_end_date] %>"></input>
|
7
|
+
<%= f.submit "Load Stats" %>
|
8
|
+
<h3>Total Files: <%= @files_count[:total] %> </h3>
|
9
|
+
<br/>
|
10
|
+
<%- end %>
|
11
|
+
<h3>Totals by Visibility</h3>
|
12
|
+
<ul>
|
13
|
+
<li>Open Access <span class="count">(<%= @files_count[:public] %>)</span></li>
|
14
|
+
<li><%= t("sufia.admin.stats.registered") %> <span class="count">(<%= @files_count[:registered] %>)</span></li>
|
15
|
+
<li>Private <span class="count">(<%= @files_count[:private] %>)</span></li>
|
16
|
+
</ul>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<h3>Newest Users</h3>
|
2
|
+
<%= form_for "users_stats", url: sufia.admin_stats_path, method: "GET" do |f| %>
|
3
|
+
<%= f.label "Display users registered: Start" %>
|
4
|
+
<input type="date" name="users_stats[start_date]" value="<%= @users_stats[:start_date] %>"></input>
|
5
|
+
<%= f.label "end [defaults to now]" %>
|
6
|
+
<input type="date" name="users_stats[end_date]" value="<%= @users_stats[:end_date] %>"></input>
|
7
|
+
<%= f.submit "Load Stats" %>
|
8
|
+
<%- end %>
|
9
|
+
|
10
|
+
<%- if @users_stats[:start_date] %>
|
11
|
+
<div>Total: <%= @recent_users.count %></div>
|
12
|
+
<%- else %>
|
13
|
+
Five most recent users:
|
14
|
+
<%- end %>
|
15
|
+
|
16
|
+
<ul>
|
17
|
+
<% @recent_users.each do |usr| %>
|
18
|
+
<li>
|
19
|
+
<a href="<%= sufia.profile_path(usr.user_key) %>" title="View user's profile"><%= usr.name %></a>
|
20
|
+
<%- if usr.department %>
|
21
|
+
of <%= usr.department %>
|
22
|
+
<%- end %>
|
23
|
+
registered
|
24
|
+
<span class="date">
|
25
|
+
<%= usr.created_at.to_time.strftime("%m/%d/%Y") %>
|
26
|
+
</span>
|
27
|
+
</li>
|
28
|
+
<% end %>
|
29
|
+
</ul>
|
30
|
+
|
@@ -3,14 +3,7 @@
|
|
3
3
|
<%= Sufia::VERSION %></h1>
|
4
4
|
<br/>
|
5
5
|
|
6
|
-
|
7
|
-
<br/>
|
8
|
-
<h3>Totals by Visibility</h3>
|
9
|
-
<ul>
|
10
|
-
<li>Open Access <span class="count">(<%= @files_count[:public] %>)</span></li>
|
11
|
-
<li><%= t("sufia.admin.stats.registered") %> <span class="count">(<%= @files_count[:registered] %>)</span></li>
|
12
|
-
<li>Private <span class="count">(<%= @files_count[:private] %>)</span></li>
|
13
|
-
</ul>
|
6
|
+
<%= render "admin/stats/files" %>
|
14
7
|
|
15
8
|
<h3>Top File Formats</h3>
|
16
9
|
<ul>
|
@@ -24,34 +17,7 @@
|
|
24
17
|
<h2>Total <%= application_name %> Users: <%= @users_count %> </h2>
|
25
18
|
<br/>
|
26
19
|
|
27
|
-
|
28
|
-
<%= form_for "users_stats", url: sufia.admin_stats_path, method: "GET" do |f| %>
|
29
|
-
<%= f.label "Display users registered since" %>
|
30
|
-
<input type="date" name="users_stats[start_date]" value="<%= @users_stats[:start_date] %>"></input>
|
31
|
-
<%= f.submit "Load Stats" %>
|
32
|
-
<%- end %>
|
33
|
-
|
34
|
-
<%- if @users_stats[:start_date] %>
|
35
|
-
<div>Total: <%= @recent_users.count %></div>
|
36
|
-
<%- else %>
|
37
|
-
Five most recent users:
|
38
|
-
<%- end %>
|
39
|
-
|
40
|
-
<ul>
|
41
|
-
<% @recent_users.each do |usr| %>
|
42
|
-
<li>
|
43
|
-
<a href="<%= sufia.profile_path(usr.user_key) %>" title="View user's profile"><%= usr.name %></a>
|
44
|
-
<%- if usr.department %>
|
45
|
-
of <%= usr.department %>
|
46
|
-
<%- end %>
|
47
|
-
registered
|
48
|
-
<span class="date">
|
49
|
-
<%= usr.created_at.to_time.strftime("%m/%d/%Y") %>
|
50
|
-
</span>
|
51
|
-
</li>
|
52
|
-
<% end %>
|
53
|
-
</ul>
|
54
|
-
|
20
|
+
<%= render "admin/stats/new_users" %>
|
55
21
|
|
56
22
|
<br/>
|
57
23
|
<h3>Most Active Users (top <%= @active_users.count %>)</h3>
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<div class="col-sm-8">
|
5
5
|
<h3>Applies to individual files uploaded</h3>
|
6
6
|
<%= content_tag :p, t('sufia.batch.help.title'), class: "help-block" %>
|
7
|
-
<% @batch.generic_files.sort
|
7
|
+
<% @batch.generic_files.sort { |a,b| a.label.downcase <=> b.label.downcase }.each_with_index do |gen_f, index| %>
|
8
8
|
<div class="form-group">
|
9
9
|
<%= f.input_label :title, as: :multi_value_with_help, label: "Title #{index + 1}" %>
|
10
10
|
<div id="additional_title_clone">
|
@@ -13,8 +13,7 @@
|
|
13
13
|
<fieldset>
|
14
14
|
<legend><%= t("sufia.collection.select_form.select_heading") %></legend>
|
15
15
|
<ul>
|
16
|
-
<% user_collections.sort
|
17
|
-
<% user_collections.each do |collection| %>
|
16
|
+
<% user_collections.sort { |c1,c2| c1['date_modified_dtsi'] <=> c2['date_modified_dtsi'] }.each do |collection| %>
|
18
17
|
<li> <label for="id_<%= collection.id %>" class="sr-only">Add to <%=collection.title%></label>
|
19
18
|
<%= radio_button_tag(:id, collection.id, true, class: "collection-selector") %>
|
20
19
|
<%= label_tag(:collection, collection.title, "aria-hidden" =>true) %>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<dd class="col-xs-7"><%= link_to user.orcid, user.orcid, { target: '_blank' } %></dd>
|
6
6
|
<% end %>
|
7
7
|
|
8
|
-
<% if user.zotero_userid.present? %>
|
8
|
+
<% if Sufia.config.arkivo_api && user.zotero_userid.present? %>
|
9
9
|
<dt class="col-xs-5"><%= zotero_label(html_class: 'profile') %></dt>
|
10
10
|
<dd class="col-xs-7"><%= link_to zotero_profile_url(user.zotero_userid), zotero_profile_url(user.zotero_userid), { target: '_blank' } %></dd>
|
11
11
|
<% end %>
|
data/config/locales/sufia.en.yml
CHANGED
data/lib/sufia/version.rb
CHANGED
@@ -23,14 +23,24 @@ describe Admin::StatsController, type: :controller do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
describe "querying user_stats" do
|
26
|
+
let(:one_day_ago_date) { 1.days.ago.to_datetime }
|
27
|
+
let(:two_days_ago_date) { 2.days.ago.to_datetime.end_of_day }
|
28
|
+
let(:one_day_ago) { one_day_ago_date.strftime("%Y-%m-%d") }
|
29
|
+
let(:two_days_ago) { two_days_ago_date.strftime("%Y-%m-%d") }
|
30
|
+
|
26
31
|
it "defaults to latest 5 users" do
|
27
32
|
get :index
|
28
33
|
expect(assigns[:recent_users]).to eq(User.order('created_at DESC').limit(5))
|
29
34
|
end
|
30
|
-
it "allows queries against user_stats" do
|
35
|
+
it "allows queries against user_stats without an end date " do
|
31
36
|
expect(User).to receive(:where).with('id' => user1.id).once.and_return([user1])
|
32
|
-
expect(User).to receive(:
|
33
|
-
get :index, users_stats: {start_date:
|
37
|
+
expect(User).to receive(:recent_users).with(one_day_ago_date, nil).and_return([user2])
|
38
|
+
get :index, users_stats: { start_date: one_day_ago }
|
39
|
+
expect(assigns[:recent_users]).to eq([user2])
|
40
|
+
end
|
41
|
+
it "allows queries against user_stats with an end date" do
|
42
|
+
expect(User).to receive(:recent_users).with(two_days_ago_date, one_day_ago_date).and_return([user2])
|
43
|
+
get :index, users_stats: { start_date: two_days_ago, end_date: one_day_ago }
|
34
44
|
expect(assigns[:recent_users]).to eq([user2])
|
35
45
|
end
|
36
46
|
end
|
@@ -51,21 +61,40 @@ describe Admin::StatsController, type: :controller do
|
|
51
61
|
end
|
52
62
|
|
53
63
|
describe "counts" do
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
64
|
+
context "when date range not set" do
|
65
|
+
before do
|
66
|
+
FactoryGirl.create(:generic_file, depositor: user1)
|
67
|
+
FactoryGirl.create(:public_file, depositor: user1)
|
68
|
+
FactoryGirl.create(:registered_file, depositor: user1)
|
69
|
+
Collection.create(title: "test") do |c|
|
70
|
+
c.apply_depositor_metadata(user1.user_key)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
it "includes files but not collections" do
|
74
|
+
get :index
|
75
|
+
expect(assigns[:files_count][:total]).to eq(3)
|
76
|
+
expect(assigns[:files_count][:public]).to eq(1)
|
77
|
+
expect(assigns[:files_count][:registered]).to eq(1)
|
78
|
+
expect(assigns[:files_count][:private]).to eq(1)
|
60
79
|
end
|
61
80
|
end
|
62
81
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
82
|
+
context "when start date set" do
|
83
|
+
it "queries by start date" do
|
84
|
+
expect(GenericFile).to receive(:find_by_date_created).exactly(3).times.with(1.days.ago.to_datetime, nil).and_call_original
|
85
|
+
expect(GenericFile).to receive(:where_public).and_call_original
|
86
|
+
expect(GenericFile).to receive(:where_registered).and_call_original
|
87
|
+
get :index, users_stats: { file_start_date: 1.days.ago.strftime("%Y-%m-%d") }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "when date range set" do
|
92
|
+
it "queries by start and date" do
|
93
|
+
expect(GenericFile).to receive(:find_by_date_created).exactly(3).times.with(1.days.ago.to_datetime, 0.days.ago.to_datetime.end_of_day).and_call_original
|
94
|
+
expect(GenericFile).to receive(:where_public).and_call_original
|
95
|
+
expect(GenericFile).to receive(:where_registered).and_call_original
|
96
|
+
get :index, users_stats: { file_start_date: 1.days.ago.strftime("%Y-%m-%d"), file_end_date: 0.days.ago.strftime("%Y-%m-%d") }
|
97
|
+
end
|
69
98
|
end
|
70
99
|
end
|
71
100
|
|
@@ -3,9 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe My::FilesController, :type => :controller do
|
4
4
|
|
5
5
|
let(:my_collection) do
|
6
|
-
Collection.
|
6
|
+
Collection.create(title: 'test collection') do |c|
|
7
7
|
c.apply_depositor_metadata(user.user_key)
|
8
|
-
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:other_collection) do
|
12
|
+
Collection.create(title: 'other test collection') do |c|
|
13
|
+
c.apply_depositor_metadata(another_user.user_key)
|
9
14
|
end
|
10
15
|
end
|
11
16
|
|
@@ -19,10 +24,13 @@ describe My::FilesController, :type => :controller do
|
|
19
24
|
|
20
25
|
let(:user) { FactoryGirl.find_or_create(:archivist) }
|
21
26
|
|
27
|
+
let(:another_user) { FactoryGirl.find_or_create(:jill) }
|
28
|
+
|
22
29
|
before do
|
23
30
|
sign_in user
|
24
31
|
@my_file = FactoryGirl.create(:generic_file, depositor: user)
|
25
32
|
@my_collection = my_collection
|
33
|
+
@other_collection = other_collection
|
26
34
|
@shared_file = shared_file
|
27
35
|
@unrelated_file = FactoryGirl.create(:generic_file, depositor: FactoryGirl.create(:user))
|
28
36
|
@wrong_type = Batch.create
|
@@ -56,6 +64,12 @@ describe My::FilesController, :type => :controller do
|
|
56
64
|
expect(assigns[:document_list].map(&:id)).to_not include(@wrong_type.id)
|
57
65
|
end
|
58
66
|
|
67
|
+
it "has the correct collections" do
|
68
|
+
get :index
|
69
|
+
expect(assigns[:user_collections].map(&:id)).to include(@my_collection.id)
|
70
|
+
expect(assigns[:user_collections].map(&:id)).to_not include(@other_collection.id)
|
71
|
+
end
|
72
|
+
|
59
73
|
describe "batch processing" do
|
60
74
|
include Sufia::Messages
|
61
75
|
let(:batch_id) {"batch_id"}
|
@@ -2,17 +2,21 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "Browse Dashboard", type: :feature do
|
4
4
|
let(:user) { FactoryGirl.create(:user) }
|
5
|
-
let!(:fixtures) { create_file_fixtures(user.user_key) }
|
5
|
+
let!(:fixtures) { create_file_fixtures(user.user_key, handles) }
|
6
6
|
|
7
7
|
before do
|
8
8
|
sign_in user
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
context "within dashboard" do
|
12
|
+
let(:handles) { [:public_pdf] }
|
13
|
+
|
14
|
+
it "should search your files by default" do
|
15
|
+
visit "/dashboard"
|
16
|
+
fill_in "q", with: "PDF"
|
17
|
+
click_button "search-submit-header"
|
18
|
+
expect(page).to have_content("Fake PDF Title")
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
context "within my files page" do
|
@@ -21,78 +25,93 @@ describe "Browse Dashboard", type: :feature do
|
|
21
25
|
visit "/dashboard/files"
|
22
26
|
end
|
23
27
|
|
24
|
-
|
25
|
-
|
26
|
-
within("#document_#{fixtures.first.id}") do
|
27
|
-
click_button("Select an action")
|
28
|
-
end
|
29
|
-
expect(page).to have_content("Edit File")
|
30
|
-
expect(page).to have_content("Download File")
|
31
|
-
expect(page).to_not have_content("Is part of:")
|
32
|
-
first(".label-success") do
|
33
|
-
expect(page).to have_content("Open Access")
|
34
|
-
end
|
35
|
-
expect(page).to have_link("Create Collection")
|
36
|
-
expect(page).to have_link("Upload")
|
37
|
-
end
|
28
|
+
context "no files" do
|
29
|
+
let(:handles) { [ ] }
|
38
30
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
31
|
+
it "should link to my other tabs" do
|
32
|
+
# TODO this would make a good view test.
|
33
|
+
["My Collections", "My Highlights", "Files Shared with Me"].each do |tab|
|
34
|
+
within("#my_nav") do
|
35
|
+
click_link(tab)
|
36
|
+
end
|
37
|
+
expect(page).to have_content(tab)
|
38
|
+
end
|
47
39
|
end
|
48
|
-
expect(page).to have_content("Fake Wav File")
|
49
40
|
end
|
50
41
|
|
51
|
-
|
52
|
-
|
53
|
-
click_link "more Subjects"
|
54
|
-
click_link "consectetur"
|
55
|
-
within("#document_#{fixtures[1].id}") do
|
56
|
-
click_link "Display all details of Test Document MP3.mp3"
|
57
|
-
end
|
58
|
-
expect(page).to have_content("File Details")
|
59
|
-
end
|
42
|
+
context "with one file" do
|
43
|
+
let(:handles) { [ :public_pdf ] }
|
60
44
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
click_link "Edit File"
|
67
|
-
expect(page).to have_content("Edit Fake Wav File.wav")
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should refresh the page of files" do
|
71
|
-
# TODO this would make a good view test.
|
72
|
-
click_button "Refresh"
|
73
|
-
within("#document_#{fixtures.first.id}") do
|
74
|
-
click_button("Select an action")
|
45
|
+
it "should display all the necessary information" do
|
46
|
+
# TODO this would make a good view test.
|
47
|
+
within("#document_#{fixtures.first.id}") do
|
48
|
+
click_button("Select an action")
|
49
|
+
end
|
75
50
|
expect(page).to have_content("Edit File")
|
76
51
|
expect(page).to have_content("Download File")
|
52
|
+
expect(page).to_not have_content("Is part of:")
|
53
|
+
first(".label-success") do
|
54
|
+
expect(page).to have_content("Open Access")
|
55
|
+
end
|
56
|
+
expect(page).to have_link("Create Collection")
|
57
|
+
expect(page).to have_link("Upload")
|
77
58
|
end
|
78
59
|
end
|
79
60
|
|
80
|
-
|
81
|
-
|
82
|
-
click_button('Edit Selected')
|
83
|
-
expect(page).to have_content('3 files')
|
84
|
-
end
|
61
|
+
context "with three files" do
|
62
|
+
let(:handles) { [:public_pdf, :public_mp3, :public_wav] }
|
85
63
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
64
|
+
it "allows you to interact your own files" do
|
65
|
+
|
66
|
+
#refreshes the page of files
|
67
|
+
# TODO this would make a good view test.
|
68
|
+
click_button "Refresh"
|
69
|
+
within("#document_#{fixtures.first.id}") do
|
70
|
+
click_button("Select an action")
|
71
|
+
expect(page).to have_content("Edit File")
|
72
|
+
expect(page).to have_content("Download File")
|
73
|
+
end
|
74
|
+
|
75
|
+
# allows you to search your own files and remove constraints
|
76
|
+
fill_in "q", with: "PDF"
|
77
|
+
click_button "search-submit-header"
|
78
|
+
expect(page).to have_content("Fake PDF Title")
|
79
|
+
within(".constraints-container") do
|
80
|
+
expect(page).to have_content("You searched for:")
|
81
|
+
expect(page).to have_css("span.glyphicon-remove")
|
82
|
+
find(".dropdown-toggle").click
|
91
83
|
end
|
92
|
-
expect(page).to have_content(
|
84
|
+
expect(page).to have_content("Fake Wav File")
|
85
|
+
|
86
|
+
# allows you to browse facets
|
87
|
+
visit "/dashboard/files"
|
88
|
+
click_link "Subject"
|
89
|
+
click_link "more Subjects"
|
90
|
+
click_link "consectetur"
|
91
|
+
within("#document_#{fixtures[1].id}") do
|
92
|
+
click_link "Display all details of Test Document MP3.mp3"
|
93
|
+
end
|
94
|
+
expect(page).to have_content("File Details")
|
95
|
+
|
96
|
+
# allows me to edit files (from the fixtures)
|
97
|
+
# TODO this would make a good view test.
|
98
|
+
visit "/dashboard/files"
|
99
|
+
|
100
|
+
fill_in "q", with: "Wav"
|
101
|
+
click_button "search-submit-header"
|
102
|
+
click_button "Select an action"
|
103
|
+
click_link "Edit File"
|
104
|
+
expect(page).to have_content("Edit Fake Wav File.wav")
|
105
|
+
|
106
|
+
# allows me to edit files in batches"
|
107
|
+
visit "/dashboard/files"
|
108
|
+
|
109
|
+
first('input#check_all').click
|
110
|
+
click_button('Edit Selected')
|
111
|
+
expect(page).to have_content('3 files')
|
112
|
+
|
93
113
|
end
|
94
114
|
end
|
95
|
-
|
96
115
|
end
|
97
116
|
|
98
117
|
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
describe "auto complete", ->
|
2
|
+
beforeEach ->
|
3
|
+
# set up the spy to see in the autocomplete is called
|
4
|
+
resp = [{"uri":"http://lexvo.org/id/iso639-3/fra","label":"French"},{"uri":"http://lexvo.org/id/iso639-3/fsl","label":"French Sign Language"}]
|
5
|
+
@spy_on_json = spyOn($, 'getJSON').and.returnValue resp
|
6
|
+
|
7
|
+
#set up a key down event to trigger the auto complete
|
8
|
+
@typeEvent = $.Event( 'keydown' )
|
9
|
+
@typeEvent.keyCode = 70 # lower case f
|
10
|
+
|
11
|
+
#define the jasmine clock so we can control time
|
12
|
+
jasmine.clock().install()
|
13
|
+
|
14
|
+
afterEach ->
|
15
|
+
#undefine the jasmine clock so time goes back to normal
|
16
|
+
jasmine.clock().uninstall()
|
17
|
+
|
18
|
+
describe "language", ->
|
19
|
+
beforeEach ->
|
20
|
+
# setup two inputs for us to attach auto complete to
|
21
|
+
setFixtures '<input class="generic_file_language" value="" id="generic_file_language" type="text" >
|
22
|
+
<input class="generic_file_language" value="" type="text">'
|
23
|
+
|
24
|
+
# run all Blacklight.onload functions
|
25
|
+
Blacklight.activate()
|
26
|
+
|
27
|
+
describe "first input", ->
|
28
|
+
|
29
|
+
# field triggers auto complete
|
30
|
+
it "auto completes on typing", ->
|
31
|
+
# send a key stroke to the target input to activate the auto complete
|
32
|
+
target = $($("input.generic_file_language")[0])
|
33
|
+
target.val('fre')
|
34
|
+
target.trigger(@typeEvent)
|
35
|
+
|
36
|
+
# move time along so that events have a chance to happen
|
37
|
+
jasmine.clock().tick(800);
|
38
|
+
|
39
|
+
# verify that the ajax call was made
|
40
|
+
expect(@spy_on_json).toHaveBeenCalled()
|
41
|
+
|
42
|
+
|
43
|
+
describe "second input", ->
|
44
|
+
|
45
|
+
# field triggers auto complete
|
46
|
+
it "auto completes on typing", ->
|
47
|
+
# send a key stroke to the target input to activate the auto complete
|
48
|
+
target = $($("input.generic_file_language")[1])
|
49
|
+
target.val('fre')
|
50
|
+
target.trigger(@typeEvent)
|
51
|
+
|
52
|
+
# move time along so that events have a chance to happen
|
53
|
+
jasmine.clock().tick(800);
|
54
|
+
|
55
|
+
# verify that the ajax call was made
|
56
|
+
expect(@spy_on_json).toHaveBeenCalled()
|
57
|
+
|
58
|
+
describe "subject", ->
|
59
|
+
beforeEach ->
|
60
|
+
# setup two inputs for us to attach auto complete to
|
61
|
+
setFixtures '<input class="generic_file_subject" value="" id="generic_file_subject" type="text" >
|
62
|
+
<input class="generic_file_subject" value="" type="text">'
|
63
|
+
|
64
|
+
# run all Blacklight.onload functions
|
65
|
+
Blacklight.activate()
|
66
|
+
|
67
|
+
describe "first input", ->
|
68
|
+
|
69
|
+
# field triggers auto complete
|
70
|
+
it "auto completes on typing", ->
|
71
|
+
# send a key stroke to the target input to activate the auto complete
|
72
|
+
target = $($("input.generic_file_subject")[0])
|
73
|
+
target.val('fre')
|
74
|
+
target.trigger(@typeEvent)
|
75
|
+
|
76
|
+
# move time along so that events have a chance to happen
|
77
|
+
jasmine.clock().tick(800);
|
78
|
+
|
79
|
+
# verify that the ajax call was made
|
80
|
+
expect(@spy_on_json).toHaveBeenCalled()
|
81
|
+
|
82
|
+
|
83
|
+
describe "second input", ->
|
84
|
+
|
85
|
+
# field triggers auto complete
|
86
|
+
it "auto completes on typing", ->
|
87
|
+
# send a key stroke to the target input to activate the auto complete
|
88
|
+
target = $($("input.generic_file_subject")[1])
|
89
|
+
target.val('fre')
|
90
|
+
target.trigger(@typeEvent)
|
91
|
+
|
92
|
+
# move time along so that events have a chance to happen
|
93
|
+
jasmine.clock().tick(800);
|
94
|
+
|
95
|
+
# verify that the ajax call was made
|
96
|
+
expect(@spy_on_json).toHaveBeenCalled()
|
97
|
+
|
98
|
+
|
99
|
+
describe "location", ->
|
100
|
+
beforeEach ->
|
101
|
+
# setup two inputs for us to attach auto complete to
|
102
|
+
setFixtures '<input class="generic_file_based_near" value="" id="generic_file_based_near" type="text" >
|
103
|
+
<input class="generic_file_based_near" value="" type="text">'
|
104
|
+
|
105
|
+
# run all Blacklight.onload functions
|
106
|
+
Blacklight.activate()
|
107
|
+
|
108
|
+
describe "first input", ->
|
109
|
+
|
110
|
+
# field triggers auto complete
|
111
|
+
it "auto completes on typing", ->
|
112
|
+
# send a key stroke to the target input to activate the auto complete
|
113
|
+
target = $($("input.generic_file_based_near")[0])
|
114
|
+
target.val('fre')
|
115
|
+
target.trigger(@typeEvent)
|
116
|
+
|
117
|
+
# move time along so that events have a chance to happen
|
118
|
+
jasmine.clock().tick(800);
|
119
|
+
|
120
|
+
# verify that the ajax call was made
|
121
|
+
expect(@spy_on_json).toHaveBeenCalled()
|
122
|
+
|
123
|
+
|
124
|
+
describe "second input", ->
|
125
|
+
|
126
|
+
# field triggers auto complete
|
127
|
+
it "auto completes on typing", ->
|
128
|
+
# send a key stroke to the target input to activate the auto complete
|
129
|
+
target = $($("input.generic_file_based_near")[1])
|
130
|
+
target.val('fre')
|
131
|
+
target.trigger(@typeEvent)
|
132
|
+
|
133
|
+
# move time along so that events have a chance to happen
|
134
|
+
jasmine.clock().tick(800);
|
135
|
+
|
136
|
+
# verify that the ajax call was made
|
137
|
+
expect(@spy_on_json).toHaveBeenCalled()
|
@@ -634,4 +634,104 @@ describe GenericFile, :type => :model do
|
|
634
634
|
it { is_expected.not_to be_public }
|
635
635
|
end
|
636
636
|
end
|
637
|
+
|
638
|
+
describe "find_by_date_created" do
|
639
|
+
subject { GenericFile.find_by_date_created(start_date, end_date) }
|
640
|
+
|
641
|
+
context "with no start date" do
|
642
|
+
let(:start_date) { nil }
|
643
|
+
let(:end_date) { nil }
|
644
|
+
it { is_expected.to eq [] }
|
645
|
+
end
|
646
|
+
|
647
|
+
context "with no end date" do
|
648
|
+
let(:start_date) {1.days.ago}
|
649
|
+
let(:end_date) {nil}
|
650
|
+
before do
|
651
|
+
@file.save
|
652
|
+
end
|
653
|
+
it { is_expected.to eq [@file] }
|
654
|
+
end
|
655
|
+
|
656
|
+
context "with an end date" do
|
657
|
+
let(:start_date) { 1.days.ago }
|
658
|
+
let(:end_date) { DateTime.now }
|
659
|
+
before do
|
660
|
+
@file.save
|
661
|
+
end
|
662
|
+
it { is_expected.to eq [@file] }
|
663
|
+
end
|
664
|
+
end
|
665
|
+
|
666
|
+
describe "where_access_is" do
|
667
|
+
subject { GenericFile.where_access_is access_level }
|
668
|
+
before do
|
669
|
+
@file.read_groups = read_groups
|
670
|
+
@file.save
|
671
|
+
end
|
672
|
+
|
673
|
+
context "when file is private" do
|
674
|
+
let(:read_groups) { ["private"] }
|
675
|
+
context "when access level is private" do
|
676
|
+
let(:access_level) { 'private' }
|
677
|
+
it { is_expected.to eq [@file]}
|
678
|
+
end
|
679
|
+
context "when access level is public" do
|
680
|
+
let(:access_level) { 'public' }
|
681
|
+
it { is_expected.to eq []}
|
682
|
+
end
|
683
|
+
context "when access level is registered" do
|
684
|
+
let(:access_level) { 'registered' }
|
685
|
+
it { is_expected.to eq []}
|
686
|
+
end
|
687
|
+
end
|
688
|
+
context "when file is public" do
|
689
|
+
let(:read_groups) { ["public"] }
|
690
|
+
context "when access level is private" do
|
691
|
+
let(:access_level) { 'private' }
|
692
|
+
it { is_expected.to eq []}
|
693
|
+
end
|
694
|
+
context "when access level is public" do
|
695
|
+
let(:access_level) { 'public' }
|
696
|
+
it { is_expected.to eq [@file]}
|
697
|
+
end
|
698
|
+
context "when access level is registered" do
|
699
|
+
let(:access_level) { 'registered' }
|
700
|
+
it { is_expected.to eq []}
|
701
|
+
end
|
702
|
+
end
|
703
|
+
context "when file is registered" do
|
704
|
+
let(:read_groups) { ["registered"] }
|
705
|
+
context "when access level is private" do
|
706
|
+
let(:access_level) { 'private' }
|
707
|
+
it { is_expected.to eq []}
|
708
|
+
end
|
709
|
+
context "when access level is public" do
|
710
|
+
let(:access_level) {'public'}
|
711
|
+
it { is_expected.to eq []}
|
712
|
+
end
|
713
|
+
context "when access level is registered" do
|
714
|
+
let(:access_level) { 'registered' }
|
715
|
+
it { is_expected.to eq [@file]}
|
716
|
+
end
|
717
|
+
end
|
718
|
+
end
|
719
|
+
describe "where_private" do
|
720
|
+
it "calls where_access_is with private" do
|
721
|
+
expect(GenericFile).to receive(:where_access_is).with('private')
|
722
|
+
GenericFile.where_private
|
723
|
+
end
|
724
|
+
end
|
725
|
+
describe "where_registered" do
|
726
|
+
it "calls where_access_is with registered" do
|
727
|
+
expect(GenericFile).to receive(:where_access_is).with('registered')
|
728
|
+
GenericFile.where_registered
|
729
|
+
end
|
730
|
+
end
|
731
|
+
describe "where_public" do
|
732
|
+
it "calls where_access_is with public" do
|
733
|
+
expect(GenericFile).to receive(:where_access_is).with('public')
|
734
|
+
GenericFile.where_public
|
735
|
+
end
|
736
|
+
end
|
637
737
|
end
|
data/spec/models/user_spec.rb
CHANGED
@@ -172,4 +172,31 @@ describe User, :type => :model do
|
|
172
172
|
expect(another_user.can_receive_deposits_from.to_a).to eq [@subject]
|
173
173
|
end
|
174
174
|
end
|
175
|
+
describe "class methods" do
|
176
|
+
describe "recent_users" do
|
177
|
+
let(:new_users) { User.all.order(created_at: :desc) }
|
178
|
+
|
179
|
+
before do
|
180
|
+
(1..3).each {|i| User.create(email: "abc#{i}@blah.frg", password: "blarg1234", created_at:DateTime.now - i.days) }
|
181
|
+
end
|
182
|
+
|
183
|
+
context "when has a start date" do
|
184
|
+
subject { User.recent_users(Date.today - 2.days) }
|
185
|
+
it "returns valid data" do
|
186
|
+
expect(subject.count).to eq 2
|
187
|
+
is_expected.to include(new_users[0],new_users[1])
|
188
|
+
is_expected.not_to include(new_users[2])
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context "when has start and end date" do
|
193
|
+
subject { User.recent_users(Date.today - 2.days, Date.today - 1.days) }
|
194
|
+
it "returns valid data" do
|
195
|
+
expect(subject.count).to eq 1
|
196
|
+
is_expected.to include(new_users[1])
|
197
|
+
is_expected.not_to include(new_users[2], new_users[0])
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
175
202
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -25,10 +25,14 @@ require 'support/rake'
|
|
25
25
|
require 'support/input_support'
|
26
26
|
require 'byebug' unless ENV['TRAVIS']
|
27
27
|
|
28
|
-
if ENV['COVERAGE']
|
28
|
+
if ENV['COVERAGE'] || ENV['TRAVIS']
|
29
29
|
require 'simplecov'
|
30
|
-
SimpleCov.
|
31
|
-
SimpleCov.
|
30
|
+
SimpleCov.root(File.expand_path('../..', __FILE__))
|
31
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
32
|
+
SimpleCov.start('rails') do
|
33
|
+
add_filter '/spec'
|
34
|
+
end
|
35
|
+
SimpleCov.command_name 'spec'
|
32
36
|
end
|
33
37
|
|
34
38
|
Capybara.default_driver = :rack_test # This is a faster driver
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# spec/support/fixture_helpers.rb
|
2
2
|
module FixtureHelpers
|
3
|
-
def create_file_fixtures(depositor = 'archivist1@example.com')
|
4
|
-
handles = [:public_pdf, :public_mp3, :public_wav]
|
3
|
+
def create_file_fixtures(depositor = 'archivist1@example.com', handles = [:public_pdf, :public_mp3, :public_wav])
|
5
4
|
handles.map { |handle| FactoryGirl.create(handle, depositor: depositor) }
|
6
5
|
end
|
7
6
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'users/_user_info.html.erb', type: :view do
|
4
|
+
let(:user) { stub_model(User, user_key: 'jdoe42') }
|
5
|
+
|
6
|
+
context 'with Zotero disabled' do
|
7
|
+
before do
|
8
|
+
allow(Sufia.config).to receive(:arkivo_api) { false }
|
9
|
+
allow(user).to receive(:zotero_userid).and_raise(NoMethodError)
|
10
|
+
render "users/user_info", user: user
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'does not display a Zotero profile link' do
|
14
|
+
expect(rendered).not_to match(/Zotero Profile/)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with Zotero enabled' do
|
19
|
+
before do
|
20
|
+
allow(Sufia.config).to receive(:arkivo_api) { true }
|
21
|
+
allow(user).to receive(:zotero_userid) { 'jdoe42zotero' }
|
22
|
+
render "users/user_info", user: user
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'displays a Zotero profile link' do
|
26
|
+
expect(rendered).to match(/Zotero Profile/)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sufia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-07-
|
12
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sufia-models
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - '='
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 6.
|
20
|
+
version: 6.2.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - '='
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 6.
|
27
|
+
version: 6.2.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: blacklight_advanced_search
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -683,6 +683,8 @@ files:
|
|
683
683
|
- app/views/_logo.html.erb
|
684
684
|
- app/views/_masthead.html.erb
|
685
685
|
- app/views/_user_util_links.html.erb
|
686
|
+
- app/views/admin/stats/_files.html.erb
|
687
|
+
- app/views/admin/stats/_new_users.html.erb
|
686
688
|
- app/views/admin/stats/index.html.erb
|
687
689
|
- app/views/advanced/_advanced_search_facets.html.erb
|
688
690
|
- app/views/advanced/_advanced_search_fields.html.erb
|
@@ -1031,6 +1033,7 @@ files:
|
|
1031
1033
|
- spec/inputs/multi_value_with_help_input_spec.rb
|
1032
1034
|
- spec/inputs/select_with_help_input_spec.rb
|
1033
1035
|
- spec/inputs/select_with_modal_help_input_spec.rb
|
1036
|
+
- spec/javascripts/autocomplete_spec.js.coffee
|
1034
1037
|
- spec/javascripts/helpers/.gitkeep
|
1035
1038
|
- spec/javascripts/helpers/jasmine-jquery.js
|
1036
1039
|
- spec/javascripts/jasmine_spec.rb
|
@@ -1134,6 +1137,7 @@ files:
|
|
1134
1137
|
- spec/views/users/_follower_modal.html.erb_spec.rb
|
1135
1138
|
- spec/views/users/_following_modal.html.erb_spec.rb
|
1136
1139
|
- spec/views/users/_notify_number.html.erb_spec.rb
|
1140
|
+
- spec/views/users/_user_info.html.erb_spec.rb
|
1137
1141
|
- spec/views/users/_user_util_links.html.erb_spec.rb
|
1138
1142
|
- spec/views/users/edit.html.erb_spec.rb
|
1139
1143
|
- spec/views/users/index.html.erb_spec.rb
|
@@ -1201,7 +1205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1201
1205
|
version: '0'
|
1202
1206
|
requirements: []
|
1203
1207
|
rubyforge_project:
|
1204
|
-
rubygems_version: 2.4.
|
1208
|
+
rubygems_version: 2.4.6
|
1205
1209
|
signing_key:
|
1206
1210
|
specification_version: 4
|
1207
1211
|
summary: Sufia was extracted from ScholarSphere developed by Penn State University
|
@@ -1304,6 +1308,7 @@ test_files:
|
|
1304
1308
|
- spec/inputs/multi_value_with_help_input_spec.rb
|
1305
1309
|
- spec/inputs/select_with_help_input_spec.rb
|
1306
1310
|
- spec/inputs/select_with_modal_help_input_spec.rb
|
1311
|
+
- spec/javascripts/autocomplete_spec.js.coffee
|
1307
1312
|
- spec/javascripts/helpers/.gitkeep
|
1308
1313
|
- spec/javascripts/helpers/jasmine-jquery.js
|
1309
1314
|
- spec/javascripts/jasmine_spec.rb
|
@@ -1407,6 +1412,7 @@ test_files:
|
|
1407
1412
|
- spec/views/users/_follower_modal.html.erb_spec.rb
|
1408
1413
|
- spec/views/users/_following_modal.html.erb_spec.rb
|
1409
1414
|
- spec/views/users/_notify_number.html.erb_spec.rb
|
1415
|
+
- spec/views/users/_user_info.html.erb_spec.rb
|
1410
1416
|
- spec/views/users/_user_util_links.html.erb_spec.rb
|
1411
1417
|
- spec/views/users/edit.html.erb_spec.rb
|
1412
1418
|
- spec/views/users/index.html.erb_spec.rb
|