active_metadata 0.0.2 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/active_metadata/attachments_controller.rb +47 -0
- data/app/controllers/active_metadata/histories_controller.rb +16 -0
- data/app/controllers/active_metadata/notes_controller.rb +61 -0
- data/app/controllers/active_metadata/watchers_controller.rb +34 -0
- data/app/helpers/application_helper.rb +2 -0
- data/app/views/active_metadata/attachments/index.html.erb +11 -0
- data/app/views/active_metadata/histories/index.html.erb +5 -0
- data/app/views/active_metadata/notes/_form.html.erb +23 -0
- data/app/views/active_metadata/notes/edit.html.erb +8 -0
- data/app/views/active_metadata/notes/index.html.erb +11 -0
- data/app/views/active_metadata/notes/index.js.erb +1 -0
- data/app/views/active_metadata/notes/show.html.erb +9 -0
- data/app/views/active_metadata/watchers/create.js.erb +1 -0
- data/app/views/active_metadata/watchers/destroy.js.erb +1 -0
- data/app/views/active_metadata/watchers/index.html.erb +5 -0
- data/config/active_metadata.yml +17 -0
- data/config/application.rb +0 -0
- data/config/database.yml +11 -0
- data/config/initializers/inflections.rb +7 -0
- data/config/mongoid.yml +28 -0
- data/config/routes.rb +30 -0
- data/db/development.sqlite3 +0 -0
- data/db/migrate/001_create_document.rb +12 -0
- data/db/migrate/002_add_surname_to_document.rb +9 -0
- data/db/migrate/003_create_section.rb +13 -0
- data/db/migrate/004_create_user.rb +14 -0
- data/db/migrate/005_create_inboxes.rb +19 -0
- data/db/migrate/006_create_alert_message.rb +37 -0
- data/db/migrate/007_create_notes.rb +22 -0
- data/db/migrate/008_create_history.rb +20 -0
- data/db/migrate/009_create_watcher.rb +21 -0
- data/db/migrate/010_create_attachment.rb +26 -0
- data/db/migrate/011_add_created_by_to_histories.rb +10 -0
- data/db/test.sqlite3 +0 -0
- data/features/step_definitions/add_a_user_to_a_watcher_steps.rb +29 -0
- data/features/step_definitions/trigger_alert_on_modify_steps.rb +86 -0
- data/features/supports/file.txt +1 -0
- data/features/supports/initializer.rb +1 -0
- data/features/supports/updated_file.txt +1 -0
- data/features/watchlist/add_a_user_to_a_watcher.feature +19 -0
- data/features/watchlist/trigger_alert_on_modify.feature +90 -0
- data/lib/active_metadata/base.rb +59 -0
- data/lib/active_metadata/persistence/active_record/attachment.rb +42 -0
- data/lib/active_metadata/persistence/active_record/history.rb +22 -0
- data/lib/active_metadata/persistence/active_record/note.rb +45 -0
- data/lib/active_metadata/persistence/active_record/watcher.rb +45 -0
- data/lib/active_metadata/persistence/active_record.rb +26 -0
- data/lib/active_metadata/persistence/mongoid/attachment.rb +45 -0
- data/lib/active_metadata/persistence/mongoid/history.rb +26 -0
- data/lib/active_metadata/persistence/mongoid/note.rb +48 -0
- data/lib/active_metadata/persistence/mongoid/watcher.rb +43 -0
- data/lib/active_metadata/persistence/mongoid.rb +30 -0
- data/lib/active_metadata/persistence/persistence.rb +13 -0
- data/lib/active_metadata/railtie.rb +6 -0
- data/lib/active_metadata/version.rb +1 -1
- data/lib/active_metadata.rb +6 -12
- data/lib/application_controller.rb +28 -0
- data/lib/application_helper.rb +7 -0
- data/lib/engine.rb +29 -0
- data/lib/model/active_record/attachment.rb +18 -0
- data/lib/model/active_record/history.rb +2 -0
- data/lib/model/active_record/note.rb +2 -0
- data/lib/model/active_record/watcher.rb +4 -0
- data/lib/model/mongoid/active_meta.rb +6 -0
- data/lib/model/mongoid/attachment.rb +25 -0
- data/lib/model/mongoid/history.rb +9 -0
- data/lib/model/mongoid/label.rb +14 -0
- data/lib/model/mongoid/note.rb +10 -0
- data/lib/model/mongoid/watcher.rb +24 -0
- data/lib/rails/railties/tasks.rake +8 -0
- data/lib/rake/active_record_tasks.rb +77 -0
- data/lib/rake/task.rb +18 -0
- data/lib/templates/active_metadata.yml +17 -0
- data/lib/templates/active_metadata_migrations +67 -0
- data/lib/templates/mongoid.yml +20 -0
- data/spec/active_metadata_spec.rb +596 -0
- data/spec/benchmark_spec.rb +35 -0
- data/spec/controllers/metadata_controller_spec.rb +14 -0
- data/spec/spec_helper.rb +87 -0
- data/spec/support/document.rb +8 -0
- data/spec/support/pdf_test.pdf +0 -0
- data/spec/support/pdf_test_2.pdf +0 -0
- data/spec/support/section.rb +8 -0
- data/spec/support/user.rb +13 -0
- data/spec/support/watcher_notifier.rb +21 -0
- metadata +201 -19
- data/.gitignore +0 -4
- data/Gemfile +0 -4
- data/Rakefile +0 -1
- data/active_metadata.gemspec +0 -24
data/lib/active_metadata.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
|
-
require "active_metadata/version"
|
2
|
-
require "mongo"
|
3
|
-
|
4
1
|
module ActiveMetadata
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
2
|
+
require 'engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
|
3
|
+
require 'active_metadata/base'
|
4
|
+
require "active_metadata/railtie" if defined?(Rails)
|
5
|
+
require 'application_controller'
|
6
|
+
require "active_metadata/version"
|
7
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# module ActiveMetadata
|
2
|
+
# ## Define ControllerMethods
|
3
|
+
# module Controller
|
4
|
+
# ## this one manages the usual self.included, klass_eval stuff
|
5
|
+
# extend ActiveSupport::Concern
|
6
|
+
#
|
7
|
+
# included do
|
8
|
+
# before_filter :test_controller_instance_method
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# module InstanceMethods
|
12
|
+
# def test_controller_instance_method
|
13
|
+
# puts "###### This text is coming from an application_controller before_filter that is being declared and triggered from inside the engine. This before_filter is automatically integrated in when the engine is installed into an app. Look inside lib/application_controller.rb to find it. ######"
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# # This method is available inside application_controller but it is not being
|
17
|
+
# # automatically executed. Notice the before_filter line above that is automatically
|
18
|
+
# # executing the first method.
|
19
|
+
# def second_controller_instance_method
|
20
|
+
# puts "###### This method is not automatically run inside application_controller, but it is available inside application_controller. To see this example add 'before_filter :second_controller_instance_method' at the top of your app's application_controller.rb ######"
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# ::ActionController::Base.send :include, ActiveMetadata::Controller
|
27
|
+
#
|
28
|
+
#
|
data/lib/engine.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'active_metadata'
|
2
|
+
require 'rails'
|
3
|
+
require 'action_controller'
|
4
|
+
require 'application_helper'
|
5
|
+
|
6
|
+
module ActiveMetadata
|
7
|
+
class Engine < Rails::Engine
|
8
|
+
|
9
|
+
# Config defaults
|
10
|
+
config.mount_at = '/'
|
11
|
+
|
12
|
+
# Load rake tasks
|
13
|
+
rake_tasks do
|
14
|
+
load File.join(File.dirname(__FILE__), 'rails/railties/tasks.rake')
|
15
|
+
end
|
16
|
+
|
17
|
+
# Check the gem config
|
18
|
+
initializer "check config" do |app|
|
19
|
+
|
20
|
+
# make sure mount_at ends with trailing slash
|
21
|
+
config.mount_at += '/' unless config.mount_at.last == '/'
|
22
|
+
end
|
23
|
+
|
24
|
+
initializer "static assets" do |app|
|
25
|
+
app.middleware.use ::ActionDispatch::Static, "#{root}/public"
|
26
|
+
config.generators.orm = :active_record
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Attachment < ActiveRecord::Base
|
2
|
+
|
3
|
+
include ::Paperclip
|
4
|
+
include ::Paperclip::Glue
|
5
|
+
|
6
|
+
has_attached_file :attach,
|
7
|
+
:path => "#{ActiveMetadata::CONFIG['attachment_base_path']}/:document_id/:label/:id/:basename.:extension",
|
8
|
+
:url => "#{ActiveMetadata::CONFIG['attachment_base_url']}/:document_id/:label/:id/:basename.:extension"
|
9
|
+
|
10
|
+
Paperclip.interpolates :document_id do |attachment,style|
|
11
|
+
attachment.instance.document_id
|
12
|
+
end
|
13
|
+
|
14
|
+
Paperclip.interpolates :label do |attachment,style|
|
15
|
+
attachment.instance.label
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Attachment
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Paperclip
|
4
|
+
|
5
|
+
belongs_to :label
|
6
|
+
has_mongoid_attached_file :attach,
|
7
|
+
:path => "#{ActiveMetadata::CONFIG['attachment_base_path']}/:document_id/:label/:counter/:basename.:extension",
|
8
|
+
:url => "#{ActiveMetadata::CONFIG['attachment_base_url']}/:document_id/:label/:counter/:basename.:extension"
|
9
|
+
|
10
|
+
field :created_by, :type => Integer
|
11
|
+
field :counter, :type => Integer
|
12
|
+
|
13
|
+
Paperclip.interpolates :document_id do |attachment,style|
|
14
|
+
attachment.instance.label.active_meta.document_id
|
15
|
+
end
|
16
|
+
|
17
|
+
Paperclip.interpolates :label do |attachment,style|
|
18
|
+
attachment.instance.label.name
|
19
|
+
end
|
20
|
+
|
21
|
+
Paperclip.interpolates :counter do |attachment,style|
|
22
|
+
attachment.instance.counter
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Label
|
2
|
+
include Mongoid::Document
|
3
|
+
field :name
|
4
|
+
|
5
|
+
belongs_to :active_meta, :class_name => "ActiveMeta"
|
6
|
+
|
7
|
+
has_many :notes, :class_name => "Note"
|
8
|
+
has_many :histories, :class_name => "History"
|
9
|
+
has_many :attachments, :class_name => "Attachment"
|
10
|
+
has_many :watchers, :class_name => "Watcher"
|
11
|
+
|
12
|
+
index :name
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Watcher
|
2
|
+
include Mongoid::Document
|
3
|
+
|
4
|
+
belongs_to :label
|
5
|
+
|
6
|
+
field :owner_id, :type => Integer
|
7
|
+
|
8
|
+
def notify_changes(matched_label, old_value, new_value, model_class, model_id)
|
9
|
+
create_inbox_alert(User.find(owner_id).inbox, matched_label, old_value, new_value, model_class, model_id)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_inbox_alert(inbox, label, old_value, new_value, model_class, model_id)
|
13
|
+
Message.create! do |message|
|
14
|
+
message.label = label
|
15
|
+
message.model_class = model_class.to_s
|
16
|
+
message.model_id = model_id
|
17
|
+
message.alert_type = :model_value_changed
|
18
|
+
message.old_value = old_value
|
19
|
+
message.new_value = new_value
|
20
|
+
message.inbox_id = inbox.id
|
21
|
+
message.read = false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'logger'
|
3
|
+
require 'active_record'
|
4
|
+
|
5
|
+
namespace :db do
|
6
|
+
def create_database config
|
7
|
+
options = {:charset => 'utf8', :collation => 'utf8_unicode_ci'}
|
8
|
+
|
9
|
+
create_db = lambda do |config|
|
10
|
+
ActiveRecord::Base.establish_connection config.merge('database' => nil)
|
11
|
+
ActiveRecord::Base.connection.create_database config['database'], options
|
12
|
+
ActiveRecord::Base.establish_connection config
|
13
|
+
end
|
14
|
+
|
15
|
+
begin
|
16
|
+
create_db.call config
|
17
|
+
rescue Mysql::Error => sqlerr
|
18
|
+
if sqlerr.errno == 1405
|
19
|
+
print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
|
20
|
+
root_password = $stdin.gets.strip
|
21
|
+
|
22
|
+
grant_statement = <<-SQL
|
23
|
+
GRANT ALL PRIVILEGES ON #{config['database']}.*
|
24
|
+
TO '#{config['username']}'@'localhost'
|
25
|
+
IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;
|
26
|
+
SQL
|
27
|
+
|
28
|
+
create_db.call config.merge('database' => nil, 'username' => 'root', 'password' => root_password)
|
29
|
+
else
|
30
|
+
$stderr.puts sqlerr.error
|
31
|
+
$stderr.puts "Couldn't create database for #{config.inspect}, charset: utf8, collation: utf8_unicode_ci"
|
32
|
+
$stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['charset']
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
task :environment do
|
38
|
+
DATABASE_ENV = ENV['DATABASE_ENV'] || 'development'
|
39
|
+
MIGRATIONS_DIR = ENV['MIGRATIONS_DIR'] || 'db/migrate'
|
40
|
+
end
|
41
|
+
|
42
|
+
task :configuration => :environment do
|
43
|
+
@config = YAML.load_file('config/database.yml')[DATABASE_ENV]
|
44
|
+
end
|
45
|
+
|
46
|
+
task :configure_connection => :configuration do
|
47
|
+
ActiveRecord::Base.establish_connection @config
|
48
|
+
ActiveRecord::Base.logger = Logger.new STDOUT if @config['logger']
|
49
|
+
end
|
50
|
+
|
51
|
+
desc 'Create the database from config/database.yml for the current DATABASE_ENV'
|
52
|
+
task :create => :configure_connection do
|
53
|
+
create_database @config
|
54
|
+
end
|
55
|
+
|
56
|
+
desc 'Drops the database for the current DATABASE_ENV'
|
57
|
+
task :drop => :configure_connection do
|
58
|
+
ActiveRecord::Base.connection.drop_database @config['database']
|
59
|
+
end
|
60
|
+
|
61
|
+
desc 'Migrate the database (options: VERSION=x, VERBOSE=false).'
|
62
|
+
task :migrate => :configure_connection do
|
63
|
+
ActiveRecord::Migration.verbose = true
|
64
|
+
ActiveRecord::Migrator.migrate MIGRATIONS_DIR, ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
65
|
+
end
|
66
|
+
|
67
|
+
desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
|
68
|
+
task :rollback => :configure_connection do
|
69
|
+
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
70
|
+
ActiveRecord::Migrator.rollback MIGRATIONS_DIR, step
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Retrieves the current schema version number"
|
74
|
+
task :version => :configure_connection do
|
75
|
+
puts "Current version: #{ActiveRecord::Migrator.current_version}"
|
76
|
+
end
|
77
|
+
end
|
data/lib/rake/task.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
namespace :active_metadata do
|
5
|
+
task :install do
|
6
|
+
#FileUtils.cp File.expand_path('../../templates/mongoid.yml',__FILE__), File.expand_path('config/')
|
7
|
+
#puts "Installed mongoid.yml"
|
8
|
+
|
9
|
+
FileUtils.cp File.expand_path('../../templates/active_metadata.yml',__FILE__), File.expand_path('config/')
|
10
|
+
puts "Installed active_metadata.yml"
|
11
|
+
|
12
|
+
puts "Copying migrations"
|
13
|
+
ts = Time.now.utc.strftime('%Y%m%d%H%M%S')
|
14
|
+
FileUtils.cp File.expand_path('../../templates/active_metadata_migrations',__FILE__), File.expand_path("db/migrate/#{ts}_active_metadata_migrations.rb")
|
15
|
+
puts "run rake db:migrate to complete the gem installation"
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
development:
|
2
|
+
persists_with: "active_record"
|
3
|
+
history_skip_fields:
|
4
|
+
- 'id'
|
5
|
+
- 'created_at'
|
6
|
+
- 'updated_at'
|
7
|
+
attachment_base_path: "public/system/metadata_attachments"
|
8
|
+
attachment_base_url: "/system/metadata_attachments"
|
9
|
+
|
10
|
+
test:
|
11
|
+
persists_with: "active_record"
|
12
|
+
history_skip_fields:
|
13
|
+
- 'id'
|
14
|
+
- 'created_at'
|
15
|
+
- 'updated_at'
|
16
|
+
attachment_base_path: "public/system/metadata_attachments"
|
17
|
+
attachment_base_url: "/system/metadata_attachments"
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class ActiveMetadataMigrations < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
|
4
|
+
create_table :notes do |t|
|
5
|
+
t.text :note
|
6
|
+
t.string :label
|
7
|
+
t.integer :document_id
|
8
|
+
t.integer :created_by
|
9
|
+
t.integer :updated_by
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :notes, :document_id
|
14
|
+
add_index :notes, :label
|
15
|
+
add_index :notes, :updated_at
|
16
|
+
|
17
|
+
create_table :histories do |t|
|
18
|
+
t.text :value
|
19
|
+
t.string :label
|
20
|
+
t.integer :document_id
|
21
|
+
t.integer :created_by
|
22
|
+
t.timestamps
|
23
|
+
end
|
24
|
+
|
25
|
+
add_index :histories, :document_id
|
26
|
+
add_index :histories, :label
|
27
|
+
add_index :histories, :created_at
|
28
|
+
|
29
|
+
create_table :attachments do |t|
|
30
|
+
t.string :label
|
31
|
+
t.integer :document_id
|
32
|
+
t.integer :created_by
|
33
|
+
t.integer :updated_by
|
34
|
+
t.integer :counter
|
35
|
+
t.string :attach_file_name
|
36
|
+
t.string :attach_content_type
|
37
|
+
t.integer :attach_file_size
|
38
|
+
t.datetime :attach_updated_at
|
39
|
+
t.timestamps
|
40
|
+
end
|
41
|
+
|
42
|
+
add_index :attachments, :document_id
|
43
|
+
add_index :attachments, :label
|
44
|
+
add_index :attachments, :attach_updated_at
|
45
|
+
|
46
|
+
create_table :watchers do |t|
|
47
|
+
t.integer :owner_id
|
48
|
+
t.string :label
|
49
|
+
t.integer :document_id
|
50
|
+
t.timestamps
|
51
|
+
end
|
52
|
+
|
53
|
+
add_index :watchers, :document_id
|
54
|
+
add_index :watchers, :label
|
55
|
+
add_index :watchers, :owner_id
|
56
|
+
add_index :watchers, :created_at
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.down
|
61
|
+
drop_table :notes
|
62
|
+
drop_table :histories
|
63
|
+
drop_table :attachments
|
64
|
+
drop_table :watchers
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
development:
|
2
|
+
host: localhost
|
3
|
+
database: metadata_d
|
4
|
+
|
5
|
+
test:
|
6
|
+
host: localhost
|
7
|
+
database: metadata_t
|
8
|
+
|
9
|
+
# set these environment variables on your prod server
|
10
|
+
production:
|
11
|
+
host: <%= ENV['MONGOID_HOST'] %>
|
12
|
+
port: <%= ENV['MONGOID_PORT'] %>
|
13
|
+
username: <%= ENV['MONGOID_USERNAME'] %>
|
14
|
+
password: <%= ENV['MONGOID_PASSWORD'] %>
|
15
|
+
database: <%= ENV['MONGOID_DATABASE'] %>
|
16
|
+
# slaves:
|
17
|
+
# - host: slave1.local
|
18
|
+
# port: 27018
|
19
|
+
# - host: slave2.local
|
20
|
+
# port: 27019
|