koalagator 3.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/calagator/application_controller.rb +2 -2
- data/app/controllers/paper_trail_manager/changes_controller.rb +131 -0
- data/app/helpers/paper_trail_manager/changes_helper.rb +82 -0
- data/app/models/calagator/source/parser.rb +3 -3
- data/app/views/paper_trail_manager/changes/_version.html.erb +40 -0
- data/app/views/paper_trail_manager/changes/index.atom.builder +48 -0
- data/app/views/paper_trail_manager/changes/index.html.erb +35 -0
- data/app/views/paper_trail_manager/changes/show.html.erb +10 -0
- data/bin/calagator +7 -0
- data/config/initializers/observers.rb +3 -1
- data/config/routes.rb +6 -2
- data/lib/calagator/engine.rb +1 -0
- data/lib/calagator/version.rb +2 -2
- data/lib/generators/calagator/install_generator.rb +8 -0
- data/lib/paper_trail_manager.rb +67 -0
- metadata +58 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21fd3f93b5735a42a88d7dc6f002919a40a8dca0ce3fc450158d27d7d860b2e6
|
4
|
+
data.tar.gz: 8d571fd18090c3c9a48c7da67437aa165e3b274bf6474d2c59652ce3b290aa17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f66cc0bf70751015380321bf4e8df734c96d3ff8e8e100842dd8e8f8f27a6e44c9dc0af74fb6255f06bbc6fc5bab292fd98dc67c28b931ef3b4ec900c752210
|
7
|
+
data.tar.gz: 25521fa4fd1deaf3ac60f6afba643d81d8c5b4611a4a50a23ae412c5804ad536f2afc78352aa911fc313207c8c2cf7b567c24693e2b8b9b9307e3df9f35ebd79
|
@@ -33,11 +33,11 @@ module Calagator
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.require_admin(options = {})
|
36
|
+
return false unless Calagator.admin_username && Calagator.admin_password
|
36
37
|
http_basic_authenticate_with(
|
37
38
|
**options.reverse_merge(
|
38
39
|
name: Calagator.admin_username,
|
39
|
-
password: Calagator.admin_password
|
40
|
-
if: proc { Calagator.admin_username && Calagator.admin_password }
|
40
|
+
password: Calagator.admin_password
|
41
41
|
)
|
42
42
|
)
|
43
43
|
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Allow the parent class of ChangesController to be configured in the host app
|
4
|
+
PaperTrailManager::ChangesController = Class.new(PaperTrailManager.base_controller.constantize)
|
5
|
+
|
6
|
+
class PaperTrailManager
|
7
|
+
class ChangesController
|
8
|
+
# Default number of changes to list on a pagenated index page.
|
9
|
+
PER_PAGE = 50
|
10
|
+
|
11
|
+
helper PaperTrailManager.route_helpers if PaperTrailManager.route_helpers
|
12
|
+
helper PaperTrailManager::ChangesHelper
|
13
|
+
layout PaperTrailManager.layout if PaperTrailManager.layout
|
14
|
+
|
15
|
+
# List changes
|
16
|
+
def index
|
17
|
+
unless change_index_allowed?
|
18
|
+
flash[:error] = 'You do not have permission to list changes.'
|
19
|
+
return(redirect_to root_url)
|
20
|
+
end
|
21
|
+
|
22
|
+
@versions = PaperTrail::Version.order('created_at DESC, id DESC')
|
23
|
+
@versions = @versions.where(item_type: params[:type]) if params[:type]
|
24
|
+
@versions = @versions.where(item_id: params[:id]) if params[:id]
|
25
|
+
|
26
|
+
# Ensure pagination parameters have sensible values
|
27
|
+
@page = params[:page].to_i
|
28
|
+
@page = nil if @page.zero?
|
29
|
+
|
30
|
+
@per_page = params[:per_page].to_i
|
31
|
+
@per_page = nil if @per_page.zero?
|
32
|
+
|
33
|
+
@versions = if defined?(WillPaginate)
|
34
|
+
@versions.paginate(page: @page, per_page: @per_page)
|
35
|
+
else
|
36
|
+
@versions.page(@page).per(@per_page)
|
37
|
+
end
|
38
|
+
|
39
|
+
respond_to do |format|
|
40
|
+
format.html # index.html.erb
|
41
|
+
format.atom # index.atom.builder
|
42
|
+
format.json { render json: @versions }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Show a change
|
47
|
+
def show
|
48
|
+
begin
|
49
|
+
@version = PaperTrail::Version.find(params[:id])
|
50
|
+
rescue ActiveRecord::RecordNotFound
|
51
|
+
flash[:error] = 'No such version.'
|
52
|
+
return(redirect_to action: :index)
|
53
|
+
end
|
54
|
+
|
55
|
+
unless change_show_allowed?(@version)
|
56
|
+
flash[:error] = 'You do not have permission to show that change.'
|
57
|
+
return(redirect_to action: :index)
|
58
|
+
end
|
59
|
+
|
60
|
+
respond_to do |format|
|
61
|
+
format.html # show.html.erb
|
62
|
+
format.json { render json: @version }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Rollback a change
|
67
|
+
def update
|
68
|
+
begin
|
69
|
+
@version = PaperTrail::Version.find(params[:id])
|
70
|
+
rescue ActiveRecord::RecordNotFound
|
71
|
+
flash[:error] = 'No such version.'
|
72
|
+
return(redirect_to(changes_path))
|
73
|
+
end
|
74
|
+
|
75
|
+
unless change_revert_allowed?(@version)
|
76
|
+
flash[:error] = 'You do not have permission to revert this change.'
|
77
|
+
return(redirect_to changes_path)
|
78
|
+
end
|
79
|
+
|
80
|
+
if @version.event == 'create'
|
81
|
+
@record = @version.item_type.constantize.find(@version.item_id)
|
82
|
+
@result = @record.destroy
|
83
|
+
else
|
84
|
+
@record = @version.reify
|
85
|
+
@result = @record.save
|
86
|
+
end
|
87
|
+
|
88
|
+
if @result
|
89
|
+
if @version.event == 'create'
|
90
|
+
flash[:notice] = 'Rolled back newly-created record by destroying it.'
|
91
|
+
redirect_to changes_path
|
92
|
+
else
|
93
|
+
flash[:notice] = 'Rolled back changes to this record.'
|
94
|
+
redirect_to change_item_url(@version)
|
95
|
+
end
|
96
|
+
else
|
97
|
+
flash[:error] = "Couldn't rollback. Sorry."
|
98
|
+
redirect_to changes_path
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
protected
|
103
|
+
|
104
|
+
# Return the URL for the item represented by the +version+, e.g. a Company record instance referenced by a version.
|
105
|
+
def change_item_url(version)
|
106
|
+
version_type = version.item_type.underscore.split('/').last
|
107
|
+
send("#{version_type}_url", version.item_id)
|
108
|
+
rescue NoMethodError
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
helper_method :change_item_url
|
112
|
+
|
113
|
+
# Allow index?
|
114
|
+
def change_index_allowed?
|
115
|
+
PaperTrailManager.allow_index?(self)
|
116
|
+
end
|
117
|
+
helper_method :change_index_allowed?
|
118
|
+
|
119
|
+
# Allow show?
|
120
|
+
def change_show_allowed?(version)
|
121
|
+
PaperTrailManager.allow_show?(self, version)
|
122
|
+
end
|
123
|
+
helper_method :change_show_allowed?
|
124
|
+
|
125
|
+
# Allow revert?
|
126
|
+
def change_revert_allowed?(version)
|
127
|
+
PaperTrailManager.allow_revert?(self, version)
|
128
|
+
end
|
129
|
+
helper_method :change_revert_allowed?
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class PaperTrailManager
|
4
|
+
module ChangesHelper
|
5
|
+
# Return HTML representing the +object+, which is either its text or a stylized "nil".
|
6
|
+
def text_or_nil(object)
|
7
|
+
if object.nil?
|
8
|
+
content_tag('em', 'nil')
|
9
|
+
else
|
10
|
+
h(object)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Return an hash of changes for the given +PaperTrail::Version+ record. The resulting
|
15
|
+
# data structure is a hash whose keys are the names of changed columns and
|
16
|
+
# values containing a hash with current and previous value. E.g.,:
|
17
|
+
#
|
18
|
+
# {
|
19
|
+
# "my_column_name" => {
|
20
|
+
# :previous => "past value",
|
21
|
+
# :current => "current_value",
|
22
|
+
# },
|
23
|
+
# "title" => {
|
24
|
+
# :previous => "puppies",
|
25
|
+
# :current => "kittens",
|
26
|
+
# },
|
27
|
+
# ...
|
28
|
+
# }
|
29
|
+
def changes_for(version)
|
30
|
+
case version.event
|
31
|
+
when 'create', 'update'
|
32
|
+
return {} unless version.changeset
|
33
|
+
|
34
|
+
version.changeset.inject({}) do |changes, (attr, (prev, curr))|
|
35
|
+
changes.store(attr, { previous: prev, current: curr }) && changes
|
36
|
+
end
|
37
|
+
when 'destroy'
|
38
|
+
record = version_reify(version)
|
39
|
+
return {} unless record
|
40
|
+
|
41
|
+
record.attributes.reject { |_k, v| v.nil? }.inject({}) do |changes, (attr, value)|
|
42
|
+
changes.store(attr, { previous: value, current: nil }) && changes
|
43
|
+
end
|
44
|
+
else
|
45
|
+
raise ArgumentError, "Unknown event: #{version.event}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns string title for the versioned record.
|
50
|
+
def change_title_for(version)
|
51
|
+
if PaperTrailManager.item_name_method
|
52
|
+
record = version_reify(version) || version.next.try(:reify) || version.item
|
53
|
+
name = record.send(PaperTrailManager.item_name_method)
|
54
|
+
else
|
55
|
+
name = "#{version.item_type} #{version.item_id}"
|
56
|
+
end
|
57
|
+
|
58
|
+
h(name)
|
59
|
+
end
|
60
|
+
|
61
|
+
def change_item_types
|
62
|
+
ActiveRecord::Base.subclasses.select do |klass|
|
63
|
+
klass.include?(PaperTrail::Model::InstanceMethods)
|
64
|
+
end.map(&:to_s)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns HTML link for the item stored in the version, e.g. a link to a Company record stored in the version.
|
68
|
+
def change_item_link(version)
|
69
|
+
if (url = change_item_url(version))
|
70
|
+
link_to(change_title_for(version), url, class: 'change_item')
|
71
|
+
else
|
72
|
+
content_tag(:span, change_title_for(version), class: 'change_item')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def version_reify(version)
|
77
|
+
version.reify
|
78
|
+
rescue ArgumentError
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -113,6 +113,6 @@ module Calagator
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
require_relative "./parser/not_found"
|
117
|
+
require_relative "./parser/ical"
|
118
|
+
require_relative "./parser/hcal"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<tr class='change_row <%= "change_event_#{version.event} #{version.event} #{version.event}, #{version.item_type.downcase}" %>'>
|
2
|
+
<td class='change_time'>
|
3
|
+
<span class='change_id'>Change #<%= version.id %></span>
|
4
|
+
<div class='date'> <%= version.created_at.strftime('%Y-%m-%d') %> </div>
|
5
|
+
<div class='time'> <%= version.created_at.strftime('%H:%M:%S') %> </div>
|
6
|
+
</td>
|
7
|
+
<td class='change_details'>
|
8
|
+
<p class='change_details_description'>
|
9
|
+
<strong class='event'><%= version.event %></strong>
|
10
|
+
<%= change_item_link(version) %>
|
11
|
+
<% if PaperTrailManager.whodunnit_class && version.whodunnit %>
|
12
|
+
<% if user = PaperTrailManager.whodunnit_class.find(version.whodunnit) rescue nil %>
|
13
|
+
<% if PaperTrailManager.user_path_method && user %>
|
14
|
+
by <%= link_to(h(user.send(PaperTrailManager.whodunnit_name_method)), send(:user_path_method, user)) %>
|
15
|
+
<% else %>
|
16
|
+
by <%= h(user.send(PaperTrailManager.whodunnit_name_method)) %>
|
17
|
+
<% end %>
|
18
|
+
<% else %>
|
19
|
+
by <%= version.whodunnit %>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
<% if change_revert_allowed?(version) %>
|
23
|
+
<%= link_to 'Roll back', change_path(version), :method => 'put', :class => 'rollback', :data => { :confirm => 'Are you sure?' } %>
|
24
|
+
<% end %>
|
25
|
+
</p>
|
26
|
+
<% if version.event == 'update' or version.event == 'create' %>
|
27
|
+
<% changes = changes_for(version) %>
|
28
|
+
<table class='change_details_table'>
|
29
|
+
<% changes.keys.sort.each_with_index do |key, i| %>
|
30
|
+
<tr class='<%= i%2==0 ? 'even' : 'odd' %>'>
|
31
|
+
<td class='change_detail_key previous'><%= key %></td>
|
32
|
+
<td class='change_detail_value previous'><%= text_or_nil(changes[key][:previous]) %></td>
|
33
|
+
<td class='change_detail_spacer'> → </td>
|
34
|
+
<td class='change_detail_value current'><%= text_or_nil(changes[key][:current]) %></td>
|
35
|
+
</tr>
|
36
|
+
<% end %>
|
37
|
+
</table>
|
38
|
+
<% end %>
|
39
|
+
</td>
|
40
|
+
</tr>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
atom_feed do |feed|
|
4
|
+
feed.title('Changes')
|
5
|
+
date = @versions.first.try(:created_at) || Time.zone.at(0)
|
6
|
+
feed.updated(date)
|
7
|
+
|
8
|
+
@versions.each do |version|
|
9
|
+
next unless change_show_allowed?(version)
|
10
|
+
|
11
|
+
feed.entry(version, url: change_url(version)) do |entry|
|
12
|
+
changes = changes_for(version)
|
13
|
+
|
14
|
+
user = if PaperTrailManager.whodunnit_class && version.whodunnit
|
15
|
+
begin
|
16
|
+
PaperTrailManager.whodunnit_class.find(version.whodunnit)
|
17
|
+
rescue StandardError
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
entry.title "#{version.event.upcase} #{version.item_type} «#{change_title_for(version)}» #{user ? 'by ' + user.send(PaperTrailManager.whodunnit_name_method) : ''}"
|
23
|
+
entry.updated version.created_at.utc.xmlschema
|
24
|
+
|
25
|
+
xm = ::Builder::XmlMarkup.new
|
26
|
+
xm.div do
|
27
|
+
xm.p do
|
28
|
+
xm.span << 'Go to: '
|
29
|
+
xm.span << link_to('Change', change_url(version))
|
30
|
+
xm.span << ' | '
|
31
|
+
xm.span << link_to('Record', change_item_url(version))
|
32
|
+
end
|
33
|
+
xm.table do
|
34
|
+
changes.keys.sort.each do |key|
|
35
|
+
xm.tr do
|
36
|
+
xm.td { xm.b key }
|
37
|
+
xm.td changes[key][:previous].inspect
|
38
|
+
xm.td { xm.span << '→' }
|
39
|
+
xm.td changes[key][:current].inspect
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
entry.content(xm.to_s, type: 'html')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<h1>Changes</h1>
|
2
|
+
|
3
|
+
<p class='changes_feed'><%= link_to 'Changes feed', changes_path(:format => 'atom') %></p>
|
4
|
+
|
5
|
+
<p>
|
6
|
+
Show:
|
7
|
+
<%= ([link_to('All', changes_path)] + change_item_types.map { |type| link_to(type.pluralize, changes_path(:type => type)) }).join(' | ').html_safe %>
|
8
|
+
</p>
|
9
|
+
|
10
|
+
<table class='changes_table'>
|
11
|
+
<tfoot>
|
12
|
+
<tr>
|
13
|
+
<td colspan='2'>
|
14
|
+
<%= paginate @versions %>
|
15
|
+
</td>
|
16
|
+
</tr>
|
17
|
+
</tfoot>
|
18
|
+
<thead>
|
19
|
+
<tr class='changes_header'>
|
20
|
+
<th class='change_time'>Time</th>
|
21
|
+
<th class='change_details'>Attribute with previous and current values</th>
|
22
|
+
</tr>
|
23
|
+
</thead>
|
24
|
+
<tbody>
|
25
|
+
<% if @versions.any? %>
|
26
|
+
<% @versions.each do |version| %>
|
27
|
+
<% next unless change_show_allowed?(version) %>
|
28
|
+
<%= render :partial => 'version', :object => version %>
|
29
|
+
<% end %>
|
30
|
+
<% else %>
|
31
|
+
<td rowspan='2'> — No changes found — </td>
|
32
|
+
<% end %>
|
33
|
+
</tbody>
|
34
|
+
</table>
|
35
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<h1>Change <%= @version.id %></h1>
|
2
|
+
|
3
|
+
<table class='changes_table'>
|
4
|
+
<tr class='changes_header'>
|
5
|
+
<th class='change_time'>Time</th>
|
6
|
+
<th class='change_details'>Attribute with previous and current values</th>
|
7
|
+
<%= render :partial => 'version', :object => @version %>
|
8
|
+
</tr>
|
9
|
+
</table>
|
10
|
+
|
data/bin/calagator
CHANGED
@@ -10,6 +10,7 @@ USAGE = <<~END
|
|
10
10
|
Usage:
|
11
11
|
calagator new APP_PATH [options]
|
12
12
|
calagator install
|
13
|
+
calagator --version, -v
|
13
14
|
|
14
15
|
calagator new: generates a new Rails app and install Calagator into it
|
15
16
|
|
@@ -24,6 +25,10 @@ USAGE = <<~END
|
|
24
25
|
|
25
26
|
Options:
|
26
27
|
none
|
28
|
+
|
29
|
+
calagator --version, -v:
|
30
|
+
|
31
|
+
Prints version info
|
27
32
|
END
|
28
33
|
|
29
34
|
TEMPLATE_PATH = File.expand_path('../rails_template.rb', __dir__)
|
@@ -35,6 +40,8 @@ when /_\d+\.\d+\.\d+_/, 'new'
|
|
35
40
|
system "rails #{command} #{ARGV.join(' ')} -m #{TEMPLATE_PATH} --skip-bundle --skip-javascript" # Skip Webpack on Rails 6 as we're on our way to Rails 7.
|
36
41
|
when 'install'
|
37
42
|
system "bundle exec rake rails:template LOCATION=#{TEMPLATE_PATH}"
|
43
|
+
when '--version', '-v'
|
44
|
+
puts "Calagator v#{Calagator::VERSION}"
|
38
45
|
else
|
39
46
|
puts USAGE
|
40
47
|
end
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Calagator::Engine.routes.draw do
|
4
|
+
# Not sure why, but routes is getting loaded twice. This ignores the second load.
|
5
|
+
return unless Calagator::Engine.routes.empty?
|
6
|
+
|
7
|
+
root "site#index"
|
8
|
+
|
4
9
|
get "omfg" => "site#omfg"
|
5
10
|
get "hello" => "site#hello"
|
6
11
|
|
@@ -52,7 +57,6 @@ Calagator::Engine.routes.draw do
|
|
52
57
|
get "css/:name" => "site#style"
|
53
58
|
get "css/:name.:format" => "site#style"
|
54
59
|
|
55
|
-
get "/" => "site#index", :as => :root
|
56
60
|
get "/index" => "site#index"
|
57
61
|
get "/index.:format" => "site#index"
|
58
|
-
end
|
62
|
+
end
|
data/lib/calagator/engine.rb
CHANGED
data/lib/calagator/version.rb
CHANGED
@@ -8,6 +8,7 @@ module Calagator
|
|
8
8
|
|
9
9
|
def install
|
10
10
|
add_route
|
11
|
+
add_yaml_config
|
11
12
|
add_initializers
|
12
13
|
add_javascripts
|
13
14
|
add_stylesheets
|
@@ -27,6 +28,13 @@ module Calagator
|
|
27
28
|
inject_into_file "config/routes.rb", "\s\smount Calagator::Engine => '/'\n", after: "routes.draw do\n"
|
28
29
|
end
|
29
30
|
|
31
|
+
# PaperTrail needs Time and BigDecimal as supported YAML classes
|
32
|
+
def add_yaml_config
|
33
|
+
inject_into_file "config/application.rb",
|
34
|
+
"\s\s\s\sconfig.active_record.yaml_column_permitted_classes = [Time, BigDecimal]",
|
35
|
+
after: /config.load_defaults.+\n/
|
36
|
+
end
|
37
|
+
|
30
38
|
def add_initializers
|
31
39
|
initializer "01_calagator.rb", File.read(File.expand_path("templates/config/initializers/01_calagator.rb", __dir__))
|
32
40
|
initializer "02_geokit.rb", File.read(File.expand_path("templates/config/initializers/02_geokit.rb", __dir__))
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails'
|
4
|
+
require 'paper_trail'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'will_paginate'
|
8
|
+
rescue LoadError
|
9
|
+
begin
|
10
|
+
require 'kaminari'
|
11
|
+
rescue LoadError
|
12
|
+
raise LoadError, 'will_paginate or kaminari must be in Gemfile or load_path'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class PaperTrailManager < Rails::Engine
|
17
|
+
initializer 'paper_trail_manager.pagination' do
|
18
|
+
::ActionView::Base.send(:alias_method, :paginate, :will_paginate) if defined?(WillPaginate)
|
19
|
+
end
|
20
|
+
|
21
|
+
@@whodunnit_name_method = :name
|
22
|
+
cattr_accessor :whodunnit_class, :whodunnit_name_method, :route_helpers,
|
23
|
+
:layout, :base_controller, :user_path_method, :item_name_method
|
24
|
+
|
25
|
+
self.base_controller = 'ApplicationController'
|
26
|
+
self.user_path_method = :user_path
|
27
|
+
|
28
|
+
(Pathname(__FILE__).dirname + '..').tap do |base|
|
29
|
+
paths['app/controller'] = base + 'app/controllers'
|
30
|
+
paths['app/view'] = base + 'app/views'
|
31
|
+
end
|
32
|
+
|
33
|
+
cattr_accessor :allow_index_block, :allow_show_block, :allow_revert_block
|
34
|
+
|
35
|
+
block = proc { true }
|
36
|
+
self.allow_index_block = block
|
37
|
+
self.allow_show_block = block
|
38
|
+
self.allow_revert_block = block
|
39
|
+
|
40
|
+
def self.allow_index_when(&block)
|
41
|
+
self.allow_index_block = block
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.allow_index?(controller)
|
45
|
+
allow_index_block.call controller
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.allow_show_when(&block)
|
49
|
+
self.allow_show_block = block
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.allow_show?(controller, version)
|
53
|
+
allow_index_block.call controller, version
|
54
|
+
end
|
55
|
+
|
56
|
+
# Describe when to allow reverts. Call this with a block that accepts
|
57
|
+
# arguments for +controller+ and +version+.
|
58
|
+
def self.allow_revert_when(&block)
|
59
|
+
self.allow_revert_block = block
|
60
|
+
end
|
61
|
+
|
62
|
+
# Allow revert given the +controller+ and +version+? If no
|
63
|
+
# ::allow_revert_when was specified, always return +true+.
|
64
|
+
def self.allow_revert?(controller, version)
|
65
|
+
allow_revert_block.call controller, version
|
66
|
+
end
|
67
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koalagator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koalagator team
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date: 2025-
|
10
|
+
date: 2025-03-20 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: rails
|
@@ -16,14 +15,28 @@ dependencies:
|
|
16
15
|
requirements:
|
17
16
|
- - "~>"
|
18
17
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
18
|
+
version: '7.1'
|
20
19
|
type: :runtime
|
21
20
|
prerelease: false
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
23
22
|
requirements:
|
24
23
|
- - "~>"
|
25
24
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
25
|
+
version: '7.1'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: sprockets-rails
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.4'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.4'
|
27
40
|
- !ruby/object:Gem::Dependency
|
28
41
|
name: activemodel-serializers-xml
|
29
42
|
requirement: !ruby/object:Gem::Requirement
|
@@ -42,20 +55,14 @@ dependencies:
|
|
42
55
|
name: acts-as-taggable-on
|
43
56
|
requirement: !ruby/object:Gem::Requirement
|
44
57
|
requirements:
|
45
|
-
- - "
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '8.1'
|
48
|
-
- - "<"
|
58
|
+
- - "~>"
|
49
59
|
- !ruby/object:Gem::Version
|
50
60
|
version: '10.0'
|
51
61
|
type: :runtime
|
52
62
|
prerelease: false
|
53
63
|
version_requirements: !ruby/object:Gem::Requirement
|
54
64
|
requirements:
|
55
|
-
- - "
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: '8.1'
|
58
|
-
- - "<"
|
65
|
+
- - "~>"
|
59
66
|
- !ruby/object:Gem::Version
|
60
67
|
version: '10.0'
|
61
68
|
- !ruby/object:Gem::Dependency
|
@@ -126,14 +133,14 @@ dependencies:
|
|
126
133
|
requirements:
|
127
134
|
- - "~>"
|
128
135
|
- !ruby/object:Gem::Version
|
129
|
-
version: '
|
136
|
+
version: '5.0'
|
130
137
|
type: :runtime
|
131
138
|
prerelease: false
|
132
139
|
version_requirements: !ruby/object:Gem::Requirement
|
133
140
|
requirements:
|
134
141
|
- - "~>"
|
135
142
|
- !ruby/object:Gem::Version
|
136
|
-
version: '
|
143
|
+
version: '5.0'
|
137
144
|
- !ruby/object:Gem::Dependency
|
138
145
|
name: geokit
|
139
146
|
requirement: !ruby/object:Gem::Requirement
|
@@ -246,66 +253,46 @@ dependencies:
|
|
246
253
|
version: '0.1'
|
247
254
|
- !ruby/object:Gem::Dependency
|
248
255
|
name: microformats
|
249
|
-
requirement: !ruby/object:Gem::Requirement
|
250
|
-
requirements:
|
251
|
-
- - ">="
|
252
|
-
- !ruby/object:Gem::Version
|
253
|
-
version: 4.0.7
|
254
|
-
- - "<"
|
255
|
-
- !ruby/object:Gem::Version
|
256
|
-
version: 4.5.0
|
257
|
-
type: :runtime
|
258
|
-
prerelease: false
|
259
|
-
version_requirements: !ruby/object:Gem::Requirement
|
260
|
-
requirements:
|
261
|
-
- - ">="
|
262
|
-
- !ruby/object:Gem::Version
|
263
|
-
version: 4.0.7
|
264
|
-
- - "<"
|
265
|
-
- !ruby/object:Gem::Version
|
266
|
-
version: 4.5.0
|
267
|
-
- !ruby/object:Gem::Dependency
|
268
|
-
name: nokogiri
|
269
256
|
requirement: !ruby/object:Gem::Requirement
|
270
257
|
requirements:
|
271
258
|
- - "~>"
|
272
259
|
- !ruby/object:Gem::Version
|
273
|
-
version:
|
260
|
+
version: '4.5'
|
274
261
|
type: :runtime
|
275
262
|
prerelease: false
|
276
263
|
version_requirements: !ruby/object:Gem::Requirement
|
277
264
|
requirements:
|
278
265
|
- - "~>"
|
279
266
|
- !ruby/object:Gem::Version
|
280
|
-
version:
|
267
|
+
version: '4.5'
|
281
268
|
- !ruby/object:Gem::Dependency
|
282
|
-
name:
|
269
|
+
name: nokogiri
|
283
270
|
requirement: !ruby/object:Gem::Requirement
|
284
271
|
requirements:
|
285
272
|
- - "~>"
|
286
273
|
- !ruby/object:Gem::Version
|
287
|
-
version: '
|
274
|
+
version: '1.14'
|
288
275
|
type: :runtime
|
289
276
|
prerelease: false
|
290
277
|
version_requirements: !ruby/object:Gem::Requirement
|
291
278
|
requirements:
|
292
279
|
- - "~>"
|
293
280
|
- !ruby/object:Gem::Version
|
294
|
-
version: '
|
281
|
+
version: '1.14'
|
295
282
|
- !ruby/object:Gem::Dependency
|
296
|
-
name:
|
283
|
+
name: paper_trail
|
297
284
|
requirement: !ruby/object:Gem::Requirement
|
298
285
|
requirements:
|
299
286
|
- - "~>"
|
300
287
|
- !ruby/object:Gem::Version
|
301
|
-
version:
|
288
|
+
version: '15.1'
|
302
289
|
type: :runtime
|
303
290
|
prerelease: false
|
304
291
|
version_requirements: !ruby/object:Gem::Requirement
|
305
292
|
requirements:
|
306
293
|
- - "~>"
|
307
294
|
- !ruby/object:Gem::Version
|
308
|
-
version:
|
295
|
+
version: '15.1'
|
309
296
|
- !ruby/object:Gem::Dependency
|
310
297
|
name: rack-contrib
|
311
298
|
requirement: !ruby/object:Gem::Requirement
|
@@ -500,14 +487,28 @@ dependencies:
|
|
500
487
|
requirements:
|
501
488
|
- - "~>"
|
502
489
|
- !ruby/object:Gem::Version
|
503
|
-
version: 1.
|
490
|
+
version: 1.6.9
|
491
|
+
type: :runtime
|
492
|
+
prerelease: false
|
493
|
+
version_requirements: !ruby/object:Gem::Requirement
|
494
|
+
requirements:
|
495
|
+
- - "~>"
|
496
|
+
- !ruby/object:Gem::Version
|
497
|
+
version: 1.6.9
|
498
|
+
- !ruby/object:Gem::Dependency
|
499
|
+
name: observer
|
500
|
+
requirement: !ruby/object:Gem::Requirement
|
501
|
+
requirements:
|
502
|
+
- - "~>"
|
503
|
+
- !ruby/object:Gem::Version
|
504
|
+
version: '0.1'
|
504
505
|
type: :runtime
|
505
506
|
prerelease: false
|
506
507
|
version_requirements: !ruby/object:Gem::Requirement
|
507
508
|
requirements:
|
508
509
|
- - "~>"
|
509
510
|
- !ruby/object:Gem::Version
|
510
|
-
version: 1
|
511
|
+
version: '0.1'
|
511
512
|
- !ruby/object:Gem::Dependency
|
512
513
|
name: appraisal
|
513
514
|
requirement: !ruby/object:Gem::Requirement
|
@@ -654,28 +655,28 @@ dependencies:
|
|
654
655
|
requirements:
|
655
656
|
- - "~>"
|
656
657
|
- !ruby/object:Gem::Version
|
657
|
-
version:
|
658
|
+
version: '6.1'
|
658
659
|
type: :development
|
659
660
|
prerelease: false
|
660
661
|
version_requirements: !ruby/object:Gem::Requirement
|
661
662
|
requirements:
|
662
663
|
- - "~>"
|
663
664
|
- !ruby/object:Gem::Version
|
664
|
-
version:
|
665
|
+
version: '6.1'
|
665
666
|
- !ruby/object:Gem::Dependency
|
666
667
|
name: selenium-webdriver
|
667
668
|
requirement: !ruby/object:Gem::Requirement
|
668
669
|
requirements:
|
669
670
|
- - "~>"
|
670
671
|
- !ruby/object:Gem::Version
|
671
|
-
version: 4.
|
672
|
+
version: '4.18'
|
672
673
|
type: :development
|
673
674
|
prerelease: false
|
674
675
|
version_requirements: !ruby/object:Gem::Requirement
|
675
676
|
requirements:
|
676
677
|
- - "~>"
|
677
678
|
- !ruby/object:Gem::Version
|
678
|
-
version: 4.
|
679
|
+
version: '4.18'
|
679
680
|
- !ruby/object:Gem::Dependency
|
680
681
|
name: simplecov
|
681
682
|
requirement: !ruby/object:Gem::Requirement
|
@@ -746,20 +747,6 @@ dependencies:
|
|
746
747
|
- - "~>"
|
747
748
|
- !ruby/object:Gem::Version
|
748
749
|
version: 4.2.0
|
749
|
-
- !ruby/object:Gem::Dependency
|
750
|
-
name: webdrivers
|
751
|
-
requirement: !ruby/object:Gem::Requirement
|
752
|
-
requirements:
|
753
|
-
- - "~>"
|
754
|
-
- !ruby/object:Gem::Version
|
755
|
-
version: 5.2.0
|
756
|
-
type: :development
|
757
|
-
prerelease: false
|
758
|
-
version_requirements: !ruby/object:Gem::Requirement
|
759
|
-
requirements:
|
760
|
-
- - "~>"
|
761
|
-
- !ruby/object:Gem::Version
|
762
|
-
version: 5.2.0
|
763
750
|
- !ruby/object:Gem::Dependency
|
764
751
|
name: webmock
|
765
752
|
requirement: !ruby/object:Gem::Requirement
|
@@ -852,6 +839,7 @@ files:
|
|
852
839
|
- app/controllers/calagator/sources_controller.rb
|
853
840
|
- app/controllers/calagator/venues_controller.rb
|
854
841
|
- app/controllers/calagator/versions_controller.rb
|
842
|
+
- app/controllers/paper_trail_manager/changes_controller.rb
|
855
843
|
- app/helpers/calagator/application_helper.rb
|
856
844
|
- app/helpers/calagator/events_helper.rb
|
857
845
|
- app/helpers/calagator/google_event_export_helper.rb
|
@@ -859,6 +847,7 @@ files:
|
|
859
847
|
- app/helpers/calagator/sources_helper.rb
|
860
848
|
- app/helpers/calagator/tags_helper.rb
|
861
849
|
- app/helpers/calagator/time_range_helper.rb
|
850
|
+
- app/helpers/paper_trail_manager/changes_helper.rb
|
862
851
|
- app/models/calagator/application_record.rb
|
863
852
|
- app/models/calagator/event.rb
|
864
853
|
- app/models/calagator/event/browse.rb
|
@@ -935,6 +924,10 @@ files:
|
|
935
924
|
- app/views/layouts/calagator/_global_search.html.erb
|
936
925
|
- app/views/layouts/calagator/_header.html.erb
|
937
926
|
- app/views/layouts/calagator/application.html.erb
|
927
|
+
- app/views/paper_trail_manager/changes/_version.html.erb
|
928
|
+
- app/views/paper_trail_manager/changes/index.atom.builder
|
929
|
+
- app/views/paper_trail_manager/changes/index.html.erb
|
930
|
+
- app/views/paper_trail_manager/changes/show.html.erb
|
938
931
|
- bin/calagator
|
939
932
|
- config/initializers/dates.rb
|
940
933
|
- config/initializers/formtastic.rb
|
@@ -1001,6 +994,7 @@ files:
|
|
1001
994
|
- lib/generators/calagator/templates/config/initializers/01_calagator.rb
|
1002
995
|
- lib/generators/calagator/templates/config/initializers/02_geokit.rb
|
1003
996
|
- lib/generators/calagator/templates/config/initializers/03_recaptcha.rb
|
997
|
+
- lib/paper_trail_manager.rb
|
1004
998
|
- lib/tasks/auto_annotate_models.rake
|
1005
999
|
- lib/tasks/spec_db.rake
|
1006
1000
|
- lib/tasks/sunspot_reindex_calagator.rake
|
@@ -1027,7 +1021,6 @@ homepage: https://github.com/koalagator/koalagator
|
|
1027
1021
|
licenses:
|
1028
1022
|
- AGPL-3.0-or-later
|
1029
1023
|
metadata: {}
|
1030
|
-
post_install_message:
|
1031
1024
|
rdoc_options: []
|
1032
1025
|
require_paths:
|
1033
1026
|
- lib
|
@@ -1042,8 +1035,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1042
1035
|
- !ruby/object:Gem::Version
|
1043
1036
|
version: '0'
|
1044
1037
|
requirements: []
|
1045
|
-
rubygems_version: 3.2
|
1046
|
-
signing_key:
|
1038
|
+
rubygems_version: 3.6.2
|
1047
1039
|
specification_version: 4
|
1048
1040
|
summary: A calendar for communities
|
1049
1041
|
test_files: []
|