sufia 4.2.0 → 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +21 -0
- data/README.md +7 -19
- data/SUFIA_VERSION +1 -1
- data/app/assets/images/orcid.png +0 -0
- data/app/assets/javascripts/sufia.js +6 -1
- data/app/assets/javascripts/sufia/permissions.js +2 -26
- data/app/assets/stylesheets/sufia.css.scss +6 -0
- data/app/assets/stylesheets/sufia/_buttons.scss +6 -1
- data/app/assets/stylesheets/sufia/_dashboard.scss +10 -0
- data/app/assets/stylesheets/sufia/_file-listing.scss +8 -0
- data/app/assets/stylesheets/sufia/_settings.scss +1 -0
- data/app/helpers/batch_edits_helper.rb +1 -1
- data/app/helpers/sufia/sufia_helper_behavior.rb +11 -0
- data/app/models/featured_work_list.rb +4 -1
- data/app/views/batch/edit.html.erb +2 -2
- data/app/views/batch_edits/_check_all.html.erb +8 -6
- data/app/views/collections/_edit_descriptions.html.erb +1 -1
- data/app/views/dashboard/_index_partials/_stats.html.erb +10 -1
- data/app/views/generic_files/_descriptions.html.erb +1 -1
- data/app/views/generic_files/_permission.html.erb +2 -2
- data/app/views/generic_files/_permission_form.html.erb +4 -6
- data/app/views/generic_files/_versioning.html.erb +2 -2
- data/app/views/records/show_fields/_contributor.html.erb +1 -1
- data/app/views/records/show_fields/_creator.html.erb +1 -1
- data/app/views/users/_profile.html.erb +1 -2
- data/app/views/users/_user_info.html.erb +20 -3
- data/app/views/users/edit.html.erb +11 -2
- data/app/views/users/show.html.erb +1 -1
- data/config/locales/sufia.en.yml +5 -0
- data/lib/generators/sufia/install_generator.rb +4 -0
- data/lib/generators/sufia/templates/catalog_controller.rb +4 -0
- data/lib/sufia/version.rb +1 -1
- data/spec/controllers/users_controller_spec.rb +18 -10
- data/spec/features/browse_files_spec.rb +17 -3
- data/spec/features/users_spec.rb +1 -1
- data/spec/helpers/batch_edits_helper_spec.rb +7 -1
- data/spec/lib/sufia/user_stat_importer_spec.rb +206 -0
- data/spec/models/featured_work_list_spec.rb +12 -0
- data/spec/models/file_view_stat_spec.rb +6 -2
- data/spec/models/user_spec.rb +25 -2
- data/spec/models/user_usage_stats_spec.rb +39 -0
- data/spec/views/dashboard/index_spec.rb +4 -0
- data/spec/views/generic_file/_permission_form.html.erb_spec.rb +19 -0
- data/spec/views/generic_file/show.html.erb_spec.rb +2 -2
- data/sufia-models/app/models/concerns/sufia/file_stat_utils.rb +3 -3
- data/sufia-models/app/models/concerns/sufia/user.rb +27 -10
- data/sufia-models/app/models/concerns/sufia/user_usage_stats.rb +15 -0
- data/sufia-models/app/models/file_download_stat.rb +2 -2
- data/sufia-models/app/models/file_usage.rb +7 -3
- data/sufia-models/app/models/file_view_stat.rb +2 -2
- data/sufia-models/app/models/sufia/orcid_validator.rb +8 -0
- data/sufia-models/app/models/user_stat.rb +2 -0
- data/sufia-models/lib/generators/sufia/models/abstract_migration_generator.rb +30 -0
- data/sufia-models/lib/generators/sufia/models/cached_stats_generator.rb +2 -31
- data/sufia-models/lib/generators/sufia/models/install_generator.rb +11 -31
- data/sufia-models/lib/generators/sufia/models/orcid_field_generator.rb +19 -0
- data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +2 -31
- data/sufia-models/lib/generators/sufia/models/templates/config/sufia.rb +3 -5
- data/sufia-models/lib/generators/sufia/models/templates/migrations/add_orcid_to_users.rb +5 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/create_user_stats.rb +19 -0
- data/sufia-models/lib/generators/sufia/models/upgrade400_generator.rb +2 -33
- data/sufia-models/lib/generators/sufia/models/user_stats_generator.rb +31 -0
- data/sufia-models/lib/sufia/models/stats/user_stat_importer.rb +85 -0
- data/sufia-models/lib/sufia/models/version.rb +1 -1
- data/sufia-models/lib/tasks/stats_tasks.rake +12 -0
- data/sufia.gemspec +0 -1
- metadata +21 -19
- data/app/views/users/_social_media_info.html.erb +0 -20
@@ -2,8 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe FileViewStat, :type => :model do
|
4
4
|
let (:file_id) {"99"}
|
5
|
+
let (:user_id) {123}
|
5
6
|
let (:date) {DateTime.new}
|
6
|
-
let (:file_stat) {FileViewStat.create(views:"25", date: date, file_id: file_id)}
|
7
|
+
let (:file_stat) {FileViewStat.create(views:"25", date: date, file_id: file_id, user_id: user_id)}
|
7
8
|
|
8
9
|
it "has attributes" do
|
9
10
|
expect(file_stat).to respond_to(:views)
|
@@ -12,6 +13,7 @@ RSpec.describe FileViewStat, :type => :model do
|
|
12
13
|
expect(file_stat.file_id).to eq("99")
|
13
14
|
expect(file_stat.date).to eq(date)
|
14
15
|
expect(file_stat.views).to eq(25)
|
16
|
+
expect(file_stat.user_id).to eq(user_id)
|
15
17
|
end
|
16
18
|
|
17
19
|
describe "#get_float_statistics" do
|
@@ -46,7 +48,7 @@ RSpec.describe FileViewStat, :type => :model do
|
|
46
48
|
describe "cache empty" do
|
47
49
|
let (:stats) {
|
48
50
|
expect(FileViewStat).to receive(:ga_statistics).and_return(sample_pageview_statistics)
|
49
|
-
FileViewStat.statistics(file_id,Date.today-4.day)
|
51
|
+
FileViewStat.statistics(file_id, Date.today-4.day, user_id)
|
50
52
|
}
|
51
53
|
|
52
54
|
it "includes cached ga data" do
|
@@ -55,6 +57,7 @@ RSpec.describe FileViewStat, :type => :model do
|
|
55
57
|
|
56
58
|
it "caches data" do
|
57
59
|
expect(FileViewStat.to_flots stats).to include(*view_output)
|
60
|
+
expect(stats.first.user_id).to eq user_id
|
58
61
|
|
59
62
|
# at this point all data should be cached
|
60
63
|
allow(FileViewStat).to receive(:ga_statistics).with(Date.today, file_id).and_raise("We should not call Google Analytics All data should be cached!")
|
@@ -79,6 +82,7 @@ RSpec.describe FileViewStat, :type => :model do
|
|
79
82
|
end
|
80
83
|
|
81
84
|
end
|
85
|
+
|
82
86
|
end
|
83
87
|
end
|
84
88
|
|
data/spec/models/user_spec.rb
CHANGED
@@ -6,8 +6,8 @@ describe User, :type => :model do
|
|
6
6
|
@another_user = FactoryGirl.find_or_create(:archivist)
|
7
7
|
end
|
8
8
|
after(:all) do
|
9
|
-
@user.
|
10
|
-
@another_user.
|
9
|
+
@user.destroy
|
10
|
+
@another_user.destroy
|
11
11
|
end
|
12
12
|
it "should have an email" do
|
13
13
|
expect(@user.user_key).to eq("jilluser@example.com")
|
@@ -25,6 +25,29 @@ describe User, :type => :model do
|
|
25
25
|
expect(@user).to respond_to(:facebook_handle)
|
26
26
|
expect(@user).to respond_to(:googleplus_handle)
|
27
27
|
expect(@user).to respond_to(:linkedin_handle)
|
28
|
+
expect(@user).to respond_to(:orcid)
|
29
|
+
end
|
30
|
+
describe 'ORCID validation and normalization' do
|
31
|
+
it 'saves when a valid bare ORCID is supplied' do
|
32
|
+
@user.orcid = '0000-0000-1111-2222'
|
33
|
+
expect(@user).to be_valid
|
34
|
+
expect(@user.save).to be true
|
35
|
+
end
|
36
|
+
it 'saves when a valid ORCID URI is supplied' do
|
37
|
+
@user.orcid = 'http://orcid.org/0000-0000-1111-2222'
|
38
|
+
expect(@user).to be_valid
|
39
|
+
expect(@user.save).to be true
|
40
|
+
end
|
41
|
+
it 'normalizes bare ORCIDs to URIs' do
|
42
|
+
@user.orcid = '0000-0000-1111-2222'
|
43
|
+
@user.save
|
44
|
+
expect(@user.orcid).to eq 'http://orcid.org/0000-0000-1111-2222'
|
45
|
+
end
|
46
|
+
it 'marks bad ORCIDs as invalid' do
|
47
|
+
@user.orcid = '000-000-111-222'
|
48
|
+
expect(@user).not_to be_valid
|
49
|
+
expect(@user.save).to be false
|
50
|
+
end
|
28
51
|
end
|
29
52
|
it "should redefine to_param to make redis keys more recognizable (and useable within Rails URLs)" do
|
30
53
|
expect(@user.to_param).to eq("jilluser@example-dot-com")
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Sufia::UserUsageStats do
|
4
|
+
subject { FactoryGirl.create(:user) }
|
5
|
+
|
6
|
+
describe 'with cached stats' do
|
7
|
+
let!(:stat_1_day_ago) { UserStat.create!(user_id: subject.id, date: 1.days.ago, file_views: 3, file_downloads: 2) }
|
8
|
+
let!(:stat_2_days_ago) { UserStat.create!(user_id: subject.id, date: 2.days.ago, file_views: 2, file_downloads: 1) }
|
9
|
+
|
10
|
+
let!(:someone_elses_user_id) { subject.id + 1 }
|
11
|
+
let!(:not_my_stat) { UserStat.create!(user_id: someone_elses_user_id, date: 2.days.ago, file_views: 10, file_downloads: 11) }
|
12
|
+
|
13
|
+
describe '#total_file_views' do
|
14
|
+
it 'returns the total file views for that user' do
|
15
|
+
expect(subject.total_file_views).to eq 5
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#total_file_downloads' do
|
20
|
+
it 'returns the total file downloads for that user' do
|
21
|
+
expect(subject.total_file_downloads).to eq 3
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'with empty cache' do
|
27
|
+
describe '#total_file_views' do
|
28
|
+
it 'returns the total file views for that user' do
|
29
|
+
expect(subject.total_file_views).to eq 0
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#total_file_downloads' do
|
34
|
+
it 'returns the total file downloads for that user' do
|
35
|
+
expect(subject.total_file_downloads).to eq 0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -12,6 +12,8 @@ describe "dashboard/index.html.erb", :type => :view do
|
|
12
12
|
allow(@user).to receive(:all_following).and_return(["magneto"])
|
13
13
|
allow(@user).to receive(:followers).and_return(["wolverine","storm"])
|
14
14
|
allow(@user).to receive(:can_receive_deposits_from).and_return([])
|
15
|
+
allow(@user).to receive(:total_file_views).and_return(1)
|
16
|
+
allow(@user).to receive(:total_file_downloads).and_return(3)
|
15
17
|
allow(controller).to receive(:current_user).and_return(@user)
|
16
18
|
allow(view).to receive(:number_of_files).and_return("15")
|
17
19
|
allow(view).to receive(:number_of_collections).and_return("3")
|
@@ -62,6 +64,8 @@ describe "dashboard/index.html.erb", :type => :view do
|
|
62
64
|
expect(@sidebar).to include '<span class="badge">2</span>'
|
63
65
|
expect(@sidebar).to include '<span class="badge">15</span>'
|
64
66
|
expect(@sidebar).to include '<span class="badge">3</span>'
|
67
|
+
expect(@sidebar).to include '<span class="badge-optional">1</span> View'
|
68
|
+
expect(@sidebar).to include '<span class="badge-optional">3</span> Downloads'
|
65
69
|
end
|
66
70
|
|
67
71
|
it "should show the statistics before the profile" do
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'generic_files/_permission_form.html.erb', :type => :view do
|
4
|
+
let(:gf) {
|
5
|
+
stub_model(GenericFile, noid: '123',
|
6
|
+
depositor: 'bob',
|
7
|
+
resource_type: ['Dataset'])
|
8
|
+
}
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(controller).to receive(:current_user).and_return(stub_model(User))
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should draw the permissions form without error" do
|
15
|
+
render partial: 'generic_files/permission_form.html.erb', locals: {gf: gf}
|
16
|
+
expect(rendered).to have_css("input#new_user_name_skel")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -73,7 +73,7 @@ describe 'generic_files/show.html.erb', :type => :view do
|
|
73
73
|
contributors = @item.properties['contributor']
|
74
74
|
expect(contributors.count).to eq(2)
|
75
75
|
contributor = contributors.first
|
76
|
-
expect(contributor.type).to eq('http://schema.org/
|
76
|
+
expect(contributor.type).to eq('http://schema.org/Person')
|
77
77
|
expect(contributor.properties['name'].first).to eq('Tweedledee')
|
78
78
|
end
|
79
79
|
|
@@ -81,7 +81,7 @@ describe 'generic_files/show.html.erb', :type => :view do
|
|
81
81
|
creators = @item.properties['creator']
|
82
82
|
expect(creators.count).to eq(2)
|
83
83
|
creator = creators.first
|
84
|
-
expect(creator.type).to eq('http://schema.org/
|
84
|
+
expect(creator.type).to eq('http://schema.org/Person')
|
85
85
|
expect(creator.properties['name'].first).to eq('Doe, John')
|
86
86
|
end
|
87
87
|
|
@@ -17,13 +17,13 @@ module Sufia
|
|
17
17
|
{ga_start_date: ga_start_date, cached_stats: stats.to_a }
|
18
18
|
end
|
19
19
|
|
20
|
-
def combined_stats file_id, start_date, object_method, ga_key
|
20
|
+
def combined_stats file_id, start_date, object_method, ga_key, user_id=nil
|
21
21
|
stat_cache_info = cached_stats( file_id, start_date, object_method)
|
22
22
|
stats = stat_cache_info[:cached_stats]
|
23
23
|
if stat_cache_info[:ga_start_date] < Date.today
|
24
24
|
ga_stats = ga_statistics(stat_cache_info[:ga_start_date], file_id)
|
25
25
|
ga_stats.each do |stat|
|
26
|
-
lstat = self.new file_id:file_id, date: stat[:date], object_method => stat[ga_key]
|
26
|
+
lstat = self.new file_id: file_id, date: stat[:date], object_method => stat[ga_key], user_id: user_id
|
27
27
|
lstat.save unless Date.parse(stat[:date]) == Date.today
|
28
28
|
stats << lstat
|
29
29
|
end
|
@@ -32,4 +32,4 @@ module Sufia
|
|
32
32
|
end
|
33
33
|
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
@@ -18,33 +18,50 @@ module Sufia::User
|
|
18
18
|
# Users should be followable
|
19
19
|
acts_as_followable
|
20
20
|
|
21
|
-
#
|
21
|
+
# Set up proxy-related relationships
|
22
22
|
has_many :proxy_deposit_requests, foreign_key: 'receiving_user_id'
|
23
|
-
|
24
23
|
has_many :deposit_rights_given, foreign_key: 'grantor_id', class_name: 'ProxyDepositRights', dependent: :destroy
|
25
24
|
has_many :can_receive_deposits_from, through: :deposit_rights_given, source: :grantee
|
26
|
-
|
27
25
|
has_many :deposit_rights_received, foreign_key: 'grantee_id', class_name: 'ProxyDepositRights', dependent: :destroy
|
28
26
|
has_many :can_make_deposits_for, through: :deposit_rights_received, source: :grantor
|
29
27
|
|
28
|
+
# Validate and normalize ORCIDs
|
29
|
+
validates_with OrcidValidator
|
30
|
+
after_validation :normalize_orcid
|
31
|
+
|
32
|
+
# Set up user profile avatars
|
30
33
|
mount_uploader :avatar, AvatarUploader, mount_on: :avatar_file_name
|
31
34
|
validates_with AvatarValidator
|
35
|
+
|
32
36
|
has_many :trophies
|
33
37
|
attr_accessor :update_directory
|
34
38
|
end
|
35
39
|
|
40
|
+
# Coerce the ORCID into URL format
|
41
|
+
def normalize_orcid
|
42
|
+
# Skip normalization if:
|
43
|
+
# 1. validation has already flagged the ORCID as invalid
|
44
|
+
# 2. the orcid field is blank
|
45
|
+
# 3. the orcid is already in its normalized form
|
46
|
+
return if self.errors[:orcid].first.present? || self.orcid.blank? || self.orcid.starts_with?('http://orcid.org/')
|
47
|
+
bare_orcid = /\d{4}-\d{4}-\d{4}-\d{4}/.match(self.orcid).string
|
48
|
+
self.orcid = "http://orcid.org/#{bare_orcid}"
|
49
|
+
end
|
50
|
+
|
36
51
|
# Format the json for select2 which requires just an id and a field called text.
|
37
52
|
# If we need an alternate format we should probably look at a json template gem
|
38
53
|
def as_json(opts = nil)
|
39
|
-
{id: user_key, text: display_name ? "#{display_name} (#{user_key})" : user_key}
|
54
|
+
{ id: user_key, text: display_name ? "#{display_name} (#{user_key})" : user_key }
|
40
55
|
end
|
41
56
|
|
42
57
|
def email_address
|
43
|
-
|
58
|
+
self.email
|
44
59
|
end
|
45
60
|
|
46
61
|
def name
|
47
|
-
|
62
|
+
self.display_name.titleize || raise
|
63
|
+
rescue
|
64
|
+
self.user_key
|
48
65
|
end
|
49
66
|
|
50
67
|
# Redefine this for more intuitive keys in Redis
|
@@ -61,7 +78,7 @@ module Sufia::User
|
|
61
78
|
|
62
79
|
# method needed for messaging
|
63
80
|
def mailboxer_email(obj=nil)
|
64
|
-
|
81
|
+
nil
|
65
82
|
end
|
66
83
|
|
67
84
|
# The basic groups method, override or will fallback to Sufia::Ldap::User
|
@@ -85,7 +102,9 @@ module Sufia::User
|
|
85
102
|
[:email, :login, :display_name, :address, :admin_area,
|
86
103
|
:department, :title, :office, :chat_id, :website, :affiliation,
|
87
104
|
:telephone, :avatar, :group_list, :groups_last_update, :facebook_handle,
|
88
|
-
:twitter_handle, :googleplus_handle, :linkedin_handle, :remove_avatar
|
105
|
+
:twitter_handle, :googleplus_handle, :linkedin_handle, :remove_avatar,
|
106
|
+
:orcid
|
107
|
+
]
|
89
108
|
end
|
90
109
|
|
91
110
|
def current
|
@@ -119,7 +138,5 @@ module Sufia::User
|
|
119
138
|
def from_url_component(component)
|
120
139
|
User.find_by_user_key(component.gsub(/-dot-/, '.'))
|
121
140
|
end
|
122
|
-
|
123
141
|
end
|
124
|
-
|
125
142
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Sufia::UserUsageStats
|
2
|
+
|
3
|
+
def stats
|
4
|
+
@stats ||= UserStat.where(user_id: id).order(date: :asc)
|
5
|
+
end
|
6
|
+
|
7
|
+
def total_file_views
|
8
|
+
stats.reduce(0) { |total, stat| total + stat.file_views }
|
9
|
+
end
|
10
|
+
|
11
|
+
def total_file_downloads
|
12
|
+
stats.reduce(0) { |total, stat| total + stat.file_downloads }
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -5,8 +5,8 @@ class FileDownloadStat < ActiveRecord::Base
|
|
5
5
|
[ self.class.convert_date(date), downloads ]
|
6
6
|
end
|
7
7
|
|
8
|
-
def self.statistics file_id, start_date
|
9
|
-
combined_stats file_id, start_date, :downloads, :totalEvents
|
8
|
+
def self.statistics file_id, start_date, user_id=nil
|
9
|
+
combined_stats file_id, start_date, :downloads, :totalEvents, user_id
|
10
10
|
end
|
11
11
|
|
12
12
|
# Sufia::Download is sent to Sufia::Analytics.profile as #sufia__download
|
@@ -3,13 +3,17 @@ class FileUsage
|
|
3
3
|
attr_accessor :id, :created, :path, :downloads, :pageviews
|
4
4
|
|
5
5
|
def initialize id
|
6
|
+
file = ::GenericFile.find(id)
|
7
|
+
user = User.where(email: file.depositor).first
|
8
|
+
user_id = user ? user.id : nil
|
9
|
+
|
6
10
|
self.id = id
|
7
11
|
self.path = Sufia::Engine.routes.url_helpers.generic_file_path(Sufia::Noid.noidify(id))
|
8
12
|
earliest = Sufia.config.analytic_start_date
|
9
|
-
self.created = DateTime.parse(
|
13
|
+
self.created = DateTime.parse(file.create_date)
|
10
14
|
self.created = earliest > created ? earliest : created unless earliest.blank?
|
11
|
-
self.downloads = FileDownloadStat.to_flots FileDownloadStat.statistics(id, created)
|
12
|
-
self.pageviews = FileViewStat.to_flots FileViewStat.statistics(id, created)
|
15
|
+
self.downloads = FileDownloadStat.to_flots FileDownloadStat.statistics(id, created, user_id)
|
16
|
+
self.pageviews = FileViewStat.to_flots FileViewStat.statistics(id, created, user_id)
|
13
17
|
end
|
14
18
|
|
15
19
|
def total_downloads
|
@@ -5,8 +5,8 @@ class FileViewStat < ActiveRecord::Base
|
|
5
5
|
[ self.class.convert_date(date), views ]
|
6
6
|
end
|
7
7
|
|
8
|
-
def self.statistics file_id, start_date
|
9
|
-
combined_stats file_id, start_date, :views, :pageviews
|
8
|
+
def self.statistics file_id, start_date, user_id=nil
|
9
|
+
combined_stats file_id, start_date, :views, :pageviews, user_id
|
10
10
|
end
|
11
11
|
|
12
12
|
# Sufia::Download is sent to Sufia::Analytics.profile as #sufia__download
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module Sufia
|
2
|
+
class OrcidValidator < ActiveModel::Validator
|
3
|
+
def validate(record)
|
4
|
+
return if record.orcid.blank?
|
5
|
+
record.errors.add(:orcid, 'must be a string of 19 characters, e.g., "0000-0000-0000-0000"') unless /\d{4}-\d{4}-\d{4}-\d{4}/.match(record.orcid)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'rails/generators'
|
3
|
+
require 'rails/generators/migration'
|
4
|
+
|
5
|
+
class Sufia::Models::AbstractMigrationGenerator < Rails::Generators::Base
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
# Implement the required interface for Rails::Generators::Migration.
|
9
|
+
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
10
|
+
def self.next_migration_number(path)
|
11
|
+
if @prev_migration_nr
|
12
|
+
@prev_migration_nr += 1
|
13
|
+
else
|
14
|
+
if last_migration = Dir[File.join(path, '*.rb')].sort.last
|
15
|
+
@prev_migration_nr = last_migration.sub(File.join(path, '/'), '').to_i + 1
|
16
|
+
else
|
17
|
+
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
18
|
+
end
|
19
|
+
end
|
20
|
+
@prev_migration_nr.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def better_migration_template(file)
|
26
|
+
migration_template "migrations/#{file}", "db/migrate/#{file}"
|
27
|
+
rescue Rails::Generators::Error => e
|
28
|
+
say_status("warning", e.message, :yellow)
|
29
|
+
end
|
30
|
+
end
|
@@ -1,30 +1,12 @@
|
|
1
|
-
|
2
|
-
require 'rails/generators'
|
3
|
-
require 'rails/generators/migration'
|
4
|
-
|
5
|
-
class Sufia::Models::CachedStatsGenerator < Rails::Generators::Base
|
6
|
-
include Rails::Generators::Migration
|
1
|
+
require_relative 'abstract_migration_generator'
|
7
2
|
|
3
|
+
class Sufia::Models::CachedStatsGenerator < Sufia::Models::AbstractMigrationGenerator
|
8
4
|
source_root File.expand_path('../templates', __FILE__)
|
9
5
|
|
10
6
|
desc """
|
11
7
|
This generator adds the ability to cache usage stats to your application:
|
12
8
|
1. Creates several database migrations if they do not exist in /db/migrate
|
13
9
|
"""
|
14
|
-
# Implement the required interface for Rails::Generators::Migration.
|
15
|
-
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
16
|
-
def self.next_migration_number(path)
|
17
|
-
if @prev_migration_nr
|
18
|
-
@prev_migration_nr += 1
|
19
|
-
else
|
20
|
-
if last_migration = Dir[File.join(path, '*.rb')].sort.last
|
21
|
-
@prev_migration_nr = last_migration.sub(File.join(path, '/'), '').to_i + 1
|
22
|
-
else
|
23
|
-
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
24
|
-
end
|
25
|
-
end
|
26
|
-
@prev_migration_nr.to_s
|
27
|
-
end
|
28
10
|
|
29
11
|
def banner
|
30
12
|
say_status("warning", "ADDING STATS CACHING-RELATED SUFIA MODELS", :yellow)
|
@@ -32,7 +14,6 @@ This generator adds the ability to cache usage stats to your application:
|
|
32
14
|
|
33
15
|
# Setup the database migrations
|
34
16
|
def copy_migrations
|
35
|
-
# Can't get this any more DRY, because we need this order.
|
36
17
|
[
|
37
18
|
'create_file_view_stats.rb',
|
38
19
|
'create_file_download_stats.rb'
|
@@ -40,14 +21,4 @@ This generator adds the ability to cache usage stats to your application:
|
|
40
21
|
better_migration_template file
|
41
22
|
end
|
42
23
|
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def better_migration_template(file)
|
47
|
-
begin
|
48
|
-
migration_template "migrations/#{file}", "db/migrate/#{file}"
|
49
|
-
rescue Rails::Generators::Error => e
|
50
|
-
say_status("warning", e.message, :yellow)
|
51
|
-
end
|
52
|
-
end
|
53
24
|
end
|