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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b3dd285966341d3681b39cad40f0ab07fe762be10479b1b0153f53fcda8a51b
4
- data.tar.gz: 067ea9c4a92d31fe94428b93ac485122846df8af9928f84c7c34fece425bec61
3
+ metadata.gz: 21fd3f93b5735a42a88d7dc6f002919a40a8dca0ce3fc450158d27d7d860b2e6
4
+ data.tar.gz: 8d571fd18090c3c9a48c7da67437aa165e3b274bf6474d2c59652ce3b290aa17
5
5
  SHA512:
6
- metadata.gz: f32f5b06541e8f945aaf9fb952fe93b71de08aef0ba685d198e397f44050e7fabb52e73c89de56a40a47325f42ddf8be3563270f1656773a79587b86985e7f41
7
- data.tar.gz: 14e515d7af748832c2309f4f4b6dac10937e07829942afd05a8ab7d88ac40ed63228ababbb27d0233c74fa4785bfc7e707b6f8c654bafc5a178f42605cd22930
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
- require "calagator/source/parser/not_found"
117
- require "calagator/source/parser/ical"
118
- require "calagator/source/parser/hcal"
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'> &rarr; </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 << '&rarr;' }
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'> &mdash; No changes found &mdash; </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
@@ -1,3 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ApplicationRecord.observers << Calagator::CacheObserver
3
+ Rails.configuration.after_initialize do
4
+ ApplicationRecord.observers << Calagator::CacheObserver
5
+ 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
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rack/contrib/jsonp"
4
+ require 'sprockets/railtie'
4
5
 
5
6
  module Calagator
6
7
  class Engine < ::Rails::Engine
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Calagator
4
- VERSION = "3.0.0"
5
- RAILS_VERSION = "~> 6.1"
4
+ VERSION = "4.1.0"
5
+ RAILS_VERSION = "~> 7.1"
6
6
  end
@@ -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: 3.0.0
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-01-01 00:00:00.000000000 Z
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: '6.1'
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: '6.1'
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: '4.0'
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: '4.0'
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: 1.13.10
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: 1.13.10
267
+ version: '4.5'
281
268
  - !ruby/object:Gem::Dependency
282
- name: paper_trail
269
+ name: nokogiri
283
270
  requirement: !ruby/object:Gem::Requirement
284
271
  requirements:
285
272
  - - "~>"
286
273
  - !ruby/object:Gem::Version
287
- version: '11.1'
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: '11.1'
281
+ version: '1.14'
295
282
  - !ruby/object:Gem::Dependency
296
- name: demingfactor-paper_trail_manager
283
+ name: paper_trail
297
284
  requirement: !ruby/object:Gem::Requirement
298
285
  requirements:
299
286
  - - "~>"
300
287
  - !ruby/object:Gem::Version
301
- version: 0.7.3
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: 0.7.3
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.5.4
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.5.4
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: 5.1.2
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: 5.1.2
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.1.0
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.1.0
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.33
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: []