koalagator 3.0.0 → 4.0.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/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/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 +38 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e109fa9b8048c1833edf302f80b740a47708b789b36c6462a2af32a3b23827e0
|
4
|
+
data.tar.gz: '039a9c1466b32fd07ca4b0489b753a3e2be0b59258bf94ecb9778abdaa8e0e25'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17489cd62b0f43b196d0bd6b6f2e6c59e1059552411230d127076d45fcccea52f0696b7c548cadacc51deefd8ab9f1f844a5d16b1e3540e8a1abcadaa475a03d
|
7
|
+
data.tar.gz: 3a40b16d6d02c6e8fc1b46a1b0588aca1d2d185521585c72efc3fe00cec1c40477c0da4306932e4ccf14f89c09318ae1da5efe3ac08b3769ef1844bc07ead0a0
|
@@ -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
|
@@ -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/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.0.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.0'
|
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.0'
|
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: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
27
40
|
- !ruby/object:Gem::Dependency
|
28
41
|
name: activemodel-serializers-xml
|
29
42
|
requirement: !ruby/object:Gem::Requirement
|
@@ -246,66 +259,46 @@ dependencies:
|
|
246
259
|
version: '0.1'
|
247
260
|
- !ruby/object:Gem::Dependency
|
248
261
|
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
262
|
requirement: !ruby/object:Gem::Requirement
|
270
263
|
requirements:
|
271
264
|
- - "~>"
|
272
265
|
- !ruby/object:Gem::Version
|
273
|
-
version:
|
266
|
+
version: '4.5'
|
274
267
|
type: :runtime
|
275
268
|
prerelease: false
|
276
269
|
version_requirements: !ruby/object:Gem::Requirement
|
277
270
|
requirements:
|
278
271
|
- - "~>"
|
279
272
|
- !ruby/object:Gem::Version
|
280
|
-
version:
|
273
|
+
version: '4.5'
|
281
274
|
- !ruby/object:Gem::Dependency
|
282
|
-
name:
|
275
|
+
name: nokogiri
|
283
276
|
requirement: !ruby/object:Gem::Requirement
|
284
277
|
requirements:
|
285
278
|
- - "~>"
|
286
279
|
- !ruby/object:Gem::Version
|
287
|
-
version:
|
280
|
+
version: 1.14.5
|
288
281
|
type: :runtime
|
289
282
|
prerelease: false
|
290
283
|
version_requirements: !ruby/object:Gem::Requirement
|
291
284
|
requirements:
|
292
285
|
- - "~>"
|
293
286
|
- !ruby/object:Gem::Version
|
294
|
-
version:
|
287
|
+
version: 1.14.5
|
295
288
|
- !ruby/object:Gem::Dependency
|
296
|
-
name:
|
289
|
+
name: paper_trail
|
297
290
|
requirement: !ruby/object:Gem::Requirement
|
298
291
|
requirements:
|
299
292
|
- - "~>"
|
300
293
|
- !ruby/object:Gem::Version
|
301
|
-
version:
|
294
|
+
version: '15.1'
|
302
295
|
type: :runtime
|
303
296
|
prerelease: false
|
304
297
|
version_requirements: !ruby/object:Gem::Requirement
|
305
298
|
requirements:
|
306
299
|
- - "~>"
|
307
300
|
- !ruby/object:Gem::Version
|
308
|
-
version:
|
301
|
+
version: '15.1'
|
309
302
|
- !ruby/object:Gem::Dependency
|
310
303
|
name: rack-contrib
|
311
304
|
requirement: !ruby/object:Gem::Requirement
|
@@ -500,14 +493,14 @@ dependencies:
|
|
500
493
|
requirements:
|
501
494
|
- - "~>"
|
502
495
|
- !ruby/object:Gem::Version
|
503
|
-
version: 1.
|
496
|
+
version: 1.6.9
|
504
497
|
type: :runtime
|
505
498
|
prerelease: false
|
506
499
|
version_requirements: !ruby/object:Gem::Requirement
|
507
500
|
requirements:
|
508
501
|
- - "~>"
|
509
502
|
- !ruby/object:Gem::Version
|
510
|
-
version: 1.
|
503
|
+
version: 1.6.9
|
511
504
|
- !ruby/object:Gem::Dependency
|
512
505
|
name: appraisal
|
513
506
|
requirement: !ruby/object:Gem::Requirement
|
@@ -668,14 +661,14 @@ dependencies:
|
|
668
661
|
requirements:
|
669
662
|
- - "~>"
|
670
663
|
- !ruby/object:Gem::Version
|
671
|
-
version: 4.
|
664
|
+
version: '4.18'
|
672
665
|
type: :development
|
673
666
|
prerelease: false
|
674
667
|
version_requirements: !ruby/object:Gem::Requirement
|
675
668
|
requirements:
|
676
669
|
- - "~>"
|
677
670
|
- !ruby/object:Gem::Version
|
678
|
-
version: 4.
|
671
|
+
version: '4.18'
|
679
672
|
- !ruby/object:Gem::Dependency
|
680
673
|
name: simplecov
|
681
674
|
requirement: !ruby/object:Gem::Requirement
|
@@ -746,20 +739,6 @@ dependencies:
|
|
746
739
|
- - "~>"
|
747
740
|
- !ruby/object:Gem::Version
|
748
741
|
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
742
|
- !ruby/object:Gem::Dependency
|
764
743
|
name: webmock
|
765
744
|
requirement: !ruby/object:Gem::Requirement
|
@@ -852,6 +831,7 @@ files:
|
|
852
831
|
- app/controllers/calagator/sources_controller.rb
|
853
832
|
- app/controllers/calagator/venues_controller.rb
|
854
833
|
- app/controllers/calagator/versions_controller.rb
|
834
|
+
- app/controllers/paper_trail_manager/changes_controller.rb
|
855
835
|
- app/helpers/calagator/application_helper.rb
|
856
836
|
- app/helpers/calagator/events_helper.rb
|
857
837
|
- app/helpers/calagator/google_event_export_helper.rb
|
@@ -859,6 +839,7 @@ files:
|
|
859
839
|
- app/helpers/calagator/sources_helper.rb
|
860
840
|
- app/helpers/calagator/tags_helper.rb
|
861
841
|
- app/helpers/calagator/time_range_helper.rb
|
842
|
+
- app/helpers/paper_trail_manager/changes_helper.rb
|
862
843
|
- app/models/calagator/application_record.rb
|
863
844
|
- app/models/calagator/event.rb
|
864
845
|
- app/models/calagator/event/browse.rb
|
@@ -935,6 +916,10 @@ files:
|
|
935
916
|
- app/views/layouts/calagator/_global_search.html.erb
|
936
917
|
- app/views/layouts/calagator/_header.html.erb
|
937
918
|
- app/views/layouts/calagator/application.html.erb
|
919
|
+
- app/views/paper_trail_manager/changes/_version.html.erb
|
920
|
+
- app/views/paper_trail_manager/changes/index.atom.builder
|
921
|
+
- app/views/paper_trail_manager/changes/index.html.erb
|
922
|
+
- app/views/paper_trail_manager/changes/show.html.erb
|
938
923
|
- bin/calagator
|
939
924
|
- config/initializers/dates.rb
|
940
925
|
- config/initializers/formtastic.rb
|
@@ -1001,6 +986,7 @@ files:
|
|
1001
986
|
- lib/generators/calagator/templates/config/initializers/01_calagator.rb
|
1002
987
|
- lib/generators/calagator/templates/config/initializers/02_geokit.rb
|
1003
988
|
- lib/generators/calagator/templates/config/initializers/03_recaptcha.rb
|
989
|
+
- lib/paper_trail_manager.rb
|
1004
990
|
- lib/tasks/auto_annotate_models.rake
|
1005
991
|
- lib/tasks/spec_db.rake
|
1006
992
|
- lib/tasks/sunspot_reindex_calagator.rake
|
@@ -1027,7 +1013,6 @@ homepage: https://github.com/koalagator/koalagator
|
|
1027
1013
|
licenses:
|
1028
1014
|
- AGPL-3.0-or-later
|
1029
1015
|
metadata: {}
|
1030
|
-
post_install_message:
|
1031
1016
|
rdoc_options: []
|
1032
1017
|
require_paths:
|
1033
1018
|
- lib
|
@@ -1042,8 +1027,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1042
1027
|
- !ruby/object:Gem::Version
|
1043
1028
|
version: '0'
|
1044
1029
|
requirements: []
|
1045
|
-
rubygems_version: 3.
|
1046
|
-
signing_key:
|
1030
|
+
rubygems_version: 3.6.6
|
1047
1031
|
specification_version: 4
|
1048
1032
|
summary: A calendar for communities
|
1049
1033
|
test_files: []
|