sn-revisions 0.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/revisions_manifest.js +2 -0
  6. data/app/assets/javascripts/revisions/application.js +13 -0
  7. data/app/assets/javascripts/revisions/extension.js +2 -0
  8. data/app/assets/javascripts/revisions/home.js +2 -0
  9. data/app/assets/javascripts/revisions/items.js +2 -0
  10. data/app/assets/javascripts/revisions/revisions.js +2 -0
  11. data/app/assets/stylesheets/revisions/application.css +32 -0
  12. data/app/assets/stylesheets/revisions/extension.css +4 -0
  13. data/app/assets/stylesheets/revisions/home.css.scss +19 -0
  14. data/app/assets/stylesheets/revisions/items.css +4 -0
  15. data/app/assets/stylesheets/revisions/revisions.css +4 -0
  16. data/app/controllers/revisions/application_controller.rb +25 -0
  17. data/app/controllers/revisions/extension_controller.rb +46 -0
  18. data/app/controllers/revisions/home_controller.rb +24 -0
  19. data/app/controllers/revisions/items_controller.rb +20 -0
  20. data/app/controllers/revisions/revisions_controller.rb +17 -0
  21. data/app/helpers/revisions/application_helper.rb +4 -0
  22. data/app/helpers/revisions/extension_helper.rb +4 -0
  23. data/app/helpers/revisions/home_helper.rb +4 -0
  24. data/app/helpers/revisions/items_helper.rb +4 -0
  25. data/app/helpers/revisions/revisions_helper.rb +4 -0
  26. data/app/jobs/revisions/application_job.rb +4 -0
  27. data/app/models/revisions/application_record.rb +5 -0
  28. data/app/models/revisions/item.rb +37 -0
  29. data/app/models/revisions/revision.rb +5 -0
  30. data/app/models/revisions/user.rb +6 -0
  31. data/app/views/layouts/revisions/application.html.erb +14 -0
  32. data/app/views/revisions/home/index.html.haml +52 -0
  33. data/config/routes.rb +11 -0
  34. data/db/migrate/20170211000200_create_revisions_items.rb +12 -0
  35. data/db/migrate/20170211000426_create_revisions_revisions.rb +15 -0
  36. data/db/migrate/20170211001350_create_revisions_users.rb +8 -0
  37. data/lib/revisions/engine.rb +8 -0
  38. data/lib/revisions/version.rb +3 -0
  39. data/lib/revisions.rb +6 -0
  40. data/lib/tasks/revisions_tasks.rake +4 -0
  41. metadata +99 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f460ba8848953e112bd65cce86087f9cbc94599
4
+ data.tar.gz: 71e86814e0c89437dc81b9394bd21262583c3cad
5
+ SHA512:
6
+ metadata.gz: b62494241c021ad1ef98976bce8b8b9729177055523be5905b7299a4cca67425523feb723b773070679e1bb6b4807444fbc84defd2fc6af0572c995b0a6b08f9
7
+ data.tar.gz: fa2840c85d43b55fdb35af2ef8530bde23558374c0d54c90fcd4f8a2d6331ae76ace870056e19581b8a1f868adeedd420b557abd20cf8b0c1fd5efe92f959dae
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # Revisions
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'revisions'
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install revisions
22
+ ```
23
+
24
+ ## Contributing
25
+ Contribution directions go here.
26
+
27
+ ## License
28
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Revisions'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ require 'bundler/gem_tasks'
26
+
27
+ require 'rake/testtask'
28
+
29
+ Rake::TestTask.new(:test) do |t|
30
+ t.libs << 'lib'
31
+ t.libs << 'test'
32
+ t.pattern = 'test/**/*_test.rb'
33
+ t.verbose = false
34
+ end
35
+
36
+
37
+ task default: :test
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/revisions .js
2
+ //= link_directory ../stylesheets/revisions .css
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,32 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
16
+
17
+ html, body {
18
+ font-family: sans-serif;
19
+ -webkit-font-smoothing: antialiased;
20
+ margin: 20px;
21
+ }
22
+
23
+ h1 {
24
+ margin-top: 2rem;
25
+ margin-bottom: 1rem;
26
+ font-weight: normal;
27
+ color: black;
28
+
29
+ border-bottom: 1px solid black;
30
+ font-size: 2em;
31
+ margin: 0.67em 0;
32
+ }
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,19 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ .button-link {
7
+ border: 0;
8
+ background-color: black;
9
+ color: white;
10
+ padding: 10px;
11
+ font-weight: bold;
12
+ font-size: 15px;
13
+ min-width: 150px;
14
+ cursor: pointer;
15
+
16
+ &:hover {
17
+ text-decoration: underline;
18
+ }
19
+ }
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,25 @@
1
+ module Revisions
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :null_session
4
+ attr_accessor :current_user
5
+
6
+ before_action :authenticate_user
7
+
8
+ def authenticate_user
9
+ user = Revisions::User.find(params[:uid])
10
+ if user.key != params[:key]
11
+ render_unauthorized
12
+ return
13
+ end
14
+ self.current_user = user
15
+ end
16
+
17
+ def build_url(path)
18
+ "#{Revisions.mount_host}/#{params[:user_key]}/#{params[:email]}/#{Revisions.mount_name}/#{path}"
19
+ end
20
+
21
+ def render_unauthorized
22
+ render :json => {:error => {:tag => "unauthorized", :message => "You are unauthorized to access this page."}}, :status => 401
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ require_dependency "revisions/application_controller"
2
+
3
+ module Revisions
4
+ class ExtensionController < ApplicationController
5
+
6
+ def index
7
+ key = params[:key]
8
+ actions = []
9
+
10
+ item_uuid = params[:item_uuid]
11
+ if item_uuid
12
+ item = current_user.items.find_by_item_uuid(item_uuid)
13
+ end
14
+
15
+ if item
16
+ item.revisions.each_with_index do |rev, index|
17
+ action = {
18
+ :label => "#{rev.num} - #{rev.created_at.strftime('%a %b %d, %Y at %I:%M%p %Z')}" + (index == 0 ? " (current)" : ""),
19
+ :desc => "",
20
+ :verb => "nested",
21
+ :context => "Item",
22
+ :content_types => ["Note"],
23
+ :subactions => [
24
+ {
25
+ :label => "Preview",
26
+ :desc => "",
27
+ :url => build_url("#{rev.id}?uid=#{params[:uid]}&key=#{params[:key]}"),
28
+ :verb => "render",
29
+ },
30
+ {
31
+ :label => "Restore",
32
+ :desc => "",
33
+ :url => build_url("#{rev.id}?uid=#{params[:uid]}&key=#{params[:key]}"),
34
+ :verb => "get",
35
+ }
36
+ ]
37
+ }
38
+ actions.push(action)
39
+ end
40
+ end
41
+
42
+ render :json => {:name => "Note History", :supported_types => [:Note], :actions => actions}
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ require_dependency "revisions/application_controller"
2
+
3
+ module Revisions
4
+ class HomeController < ApplicationController
5
+
6
+ skip_before_action :authenticate_user
7
+
8
+ def index
9
+
10
+ end
11
+
12
+ def register
13
+ user = Revisions::User.new
14
+ user.key = Digest::SHA256.hexdigest(SecureRandom.random_bytes(32))
15
+ user.save
16
+
17
+ @server_url = build_url("items?key=#{user.key}&uid=#{user.id}")
18
+ @client_url = build_url("ext?key=#{user.key}&uid=#{user.id}")
19
+
20
+ render "index"
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ require_dependency "revisions/application_controller"
2
+
3
+ module Revisions
4
+ class ItemsController < ApplicationController
5
+
6
+ def save
7
+ items = params[:items]
8
+ items.each do |item_hash|
9
+ item = current_user.items.find_or_create_by(:item_uuid => item_hash["uuid"])
10
+ item.add_revision(item_hash["content"], item_hash["enc_item_key"], item_hash["auth_hash"])
11
+ item.condense_history
12
+ if item.content_type == nil
13
+ item.content_type = item_hash["content_type"]
14
+ item.save
15
+ end
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ require_dependency "revisions/application_controller"
2
+
3
+ module Revisions
4
+ class RevisionsController < ApplicationController
5
+
6
+ def show
7
+ revision = Revision.find(params[:id])
8
+ if revision.item.user_id != current_user.id
9
+ render_unauthorized
10
+ return
11
+ end
12
+
13
+ render :json => {:item => revision.as_json.merge({:uuid => revision.item.item_uuid, :content_type => revision.item.content_type})}
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ module Revisions
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Revisions
2
+ module ExtensionHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Revisions
2
+ module HomeHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Revisions
2
+ module ItemsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Revisions
2
+ module RevisionsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Revisions
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module Revisions
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ module Revisions
2
+ class Item < ApplicationRecord
3
+
4
+ has_many :revisions, -> { order 'created_at desc' }
5
+
6
+ def add_revision(content, item_key, auth_hash)
7
+ revision = self.revisions.new
8
+ revision.content = content
9
+ revision.enc_item_key = item_key
10
+ revision.auth_hash = auth_hash
11
+ revision.save
12
+ end
13
+
14
+
15
+ def condense_history
16
+ # revisions past 30 days are limited to 1 revision per day
17
+ # any revision within 30 days is capped to 30-days_from_today revisions per day
18
+ # so if there are 50 revisions from 5 days ago, 50 - (30-5) = 25 revisions are allowed
19
+ days = 30
20
+ min_revs = 3
21
+ days.times do |days_from_today|
22
+ date = Time.now.utc.to_date - days_from_today
23
+ num_revs_allowed = days - days_from_today + min_revs
24
+ revs = self.revisions.where(:created_at => date.midnight..date.end_of_day).pluck(:id)
25
+ if revs.length > num_revs_allowed
26
+ num_to_remove = revs.length - num_revs_allowed
27
+ num_to_remove.times do |time|
28
+ index = revs.length/2 - 1
29
+ Revision.destroy(revs[index])
30
+ revs.delete_at(index)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ module Revisions
2
+ class Revision < ApplicationRecord
3
+ belongs_to :item
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Revisions
2
+ class User < ApplicationRecord
3
+ has_many :items
4
+
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Revisions</title>
5
+ <%= stylesheet_link_tag "revisions/application", media: "all" %>
6
+ <%= javascript_include_tag "revisions/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,52 @@
1
+ %h1 Note History Extension for Standard Notes
2
+ %p The note history extension keeps track of changes, and allows you to restore a note to a previous version.
3
+
4
+ - if @server_url
5
+ %p
6
+ %strong
7
+ Your secret
8
+ %span{:style => "text-decoration:underline;"} server extension
9
+ URL is:
10
+ = @server_url
11
+ %p
12
+ %strong
13
+ Your secret
14
+ %span{:style => "text-decoration:underline;"} app extension
15
+ URL is:
16
+ = @client_url
17
+ - else
18
+ = button_to "Generate URLs", {:controller => "home", :action => "register", :method => "post"}, {:class => "button-link"}
19
+ %h3 Instructions
20
+
21
+ %p
22
+ %strong To get started:
23
+ %ol
24
+ %li Press "Generate URLs" above to generate your server and app extension URLs.
25
+
26
+ %p Once you've generated your URLs, it's time to register the extensions.
27
+
28
+ %p
29
+ %strong To register your server extension:
30
+ %ol
31
+ %li In the Standard Notes app, find and click "Account" in the lower left corner.
32
+ %li Click "Standard File Dashboard".
33
+ %li After logging in, click "Extensions" in the left panel.
34
+ %li In the add new extension section, paste in the server secret URL, and submit.
35
+ %p Registering the server extension allows your main Standard File server to forward encrypted data to the Note History extension server.
36
+
37
+ %p
38
+ %strong To register your app extension:
39
+ %ol
40
+ %li In the Standard Notes app, find and click "Extensions" in the lower left corner.
41
+ %li Click "Add new extension".
42
+ %li Paste in the app secret URL and submit.
43
+
44
+ %p The app extension allows you to view previous versions of the note.
45
+
46
+ %p
47
+ %strong To restore a note to a previous version:
48
+
49
+ %ol
50
+ %li In the Standard Notes app, select the note you'd like to revisit.
51
+ %li Click "Extensions" under the note title.
52
+ %li Here you'll see all of the revisions for this note. You can preview the content of each version before choosing to restore to that version.
data/config/routes.rb ADDED
@@ -0,0 +1,11 @@
1
+ Revisions::Engine.routes.draw do
2
+ post "items" => "items#save"
3
+
4
+ post "register" => "home#register"
5
+
6
+ get "ext" => "extension#index"
7
+
8
+ get ":id" => "revisions#show"
9
+
10
+ root "home#index"
11
+ end
@@ -0,0 +1,12 @@
1
+ class CreateRevisionsItems < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :revisions_items do |t|
4
+ t.string :item_uuid, limit: 36, null: false
5
+ t.string :content_type
6
+ t.integer :user_id
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :revisions_items, :item_uuid
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ class CreateRevisionsRevisions < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :revisions_revisions do |t|
4
+ t.text :content, :limit => 16.megabytes - 1
5
+ t.string :enc_item_key
6
+ t.string :auth_hash
7
+
8
+ t.integer :item_id
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :revisions_revisions, :item_id
13
+ add_index :revisions_revisions, :created_at
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ class CreateRevisionsUsers < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :revisions_users do |t|
4
+ t.string :key
5
+ t.timestamps
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Revisions
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Revisions
4
+ config.generators do |g|
5
+ g.template_engine :haml
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Revisions
2
+ VERSION = '0.1.0'
3
+ end
data/lib/revisions.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "revisions/engine"
2
+
3
+ module Revisions
4
+ mattr_accessor :mount_host
5
+ mattr_accessor :mount_name
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :revisions do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sn-revisions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Standard Notes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.0.1
27
+ description: The Note History extension for Standard Notes allows you to track changes
28
+ to your notes, and restore them to previous versions.
29
+ email:
30
+ - hello@standardnotes.org
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - MIT-LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - app/assets/config/revisions_manifest.js
39
+ - app/assets/javascripts/revisions/application.js
40
+ - app/assets/javascripts/revisions/extension.js
41
+ - app/assets/javascripts/revisions/home.js
42
+ - app/assets/javascripts/revisions/items.js
43
+ - app/assets/javascripts/revisions/revisions.js
44
+ - app/assets/stylesheets/revisions/application.css
45
+ - app/assets/stylesheets/revisions/extension.css
46
+ - app/assets/stylesheets/revisions/home.css.scss
47
+ - app/assets/stylesheets/revisions/items.css
48
+ - app/assets/stylesheets/revisions/revisions.css
49
+ - app/controllers/revisions/application_controller.rb
50
+ - app/controllers/revisions/extension_controller.rb
51
+ - app/controllers/revisions/home_controller.rb
52
+ - app/controllers/revisions/items_controller.rb
53
+ - app/controllers/revisions/revisions_controller.rb
54
+ - app/helpers/revisions/application_helper.rb
55
+ - app/helpers/revisions/extension_helper.rb
56
+ - app/helpers/revisions/home_helper.rb
57
+ - app/helpers/revisions/items_helper.rb
58
+ - app/helpers/revisions/revisions_helper.rb
59
+ - app/jobs/revisions/application_job.rb
60
+ - app/models/revisions/application_record.rb
61
+ - app/models/revisions/item.rb
62
+ - app/models/revisions/revision.rb
63
+ - app/models/revisions/user.rb
64
+ - app/views/layouts/revisions/application.html.erb
65
+ - app/views/revisions/home/index.html.haml
66
+ - config/routes.rb
67
+ - db/migrate/20170211000200_create_revisions_items.rb
68
+ - db/migrate/20170211000426_create_revisions_revisions.rb
69
+ - db/migrate/20170211001350_create_revisions_users.rb
70
+ - lib/revisions.rb
71
+ - lib/revisions/engine.rb
72
+ - lib/revisions/version.rb
73
+ - lib/tasks/revisions_tasks.rake
74
+ homepage: https://standardnotes.org
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.4.8
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: The Note History extension for Standard Notes allows you to track changes
98
+ to your notes, and restore them to previous versions.
99
+ test_files: []