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.
Files changed (90) hide show
  1. data/app/controllers/active_metadata/attachments_controller.rb +47 -0
  2. data/app/controllers/active_metadata/histories_controller.rb +16 -0
  3. data/app/controllers/active_metadata/notes_controller.rb +61 -0
  4. data/app/controllers/active_metadata/watchers_controller.rb +34 -0
  5. data/app/helpers/application_helper.rb +2 -0
  6. data/app/views/active_metadata/attachments/index.html.erb +11 -0
  7. data/app/views/active_metadata/histories/index.html.erb +5 -0
  8. data/app/views/active_metadata/notes/_form.html.erb +23 -0
  9. data/app/views/active_metadata/notes/edit.html.erb +8 -0
  10. data/app/views/active_metadata/notes/index.html.erb +11 -0
  11. data/app/views/active_metadata/notes/index.js.erb +1 -0
  12. data/app/views/active_metadata/notes/show.html.erb +9 -0
  13. data/app/views/active_metadata/watchers/create.js.erb +1 -0
  14. data/app/views/active_metadata/watchers/destroy.js.erb +1 -0
  15. data/app/views/active_metadata/watchers/index.html.erb +5 -0
  16. data/config/active_metadata.yml +17 -0
  17. data/config/application.rb +0 -0
  18. data/config/database.yml +11 -0
  19. data/config/initializers/inflections.rb +7 -0
  20. data/config/mongoid.yml +28 -0
  21. data/config/routes.rb +30 -0
  22. data/db/development.sqlite3 +0 -0
  23. data/db/migrate/001_create_document.rb +12 -0
  24. data/db/migrate/002_add_surname_to_document.rb +9 -0
  25. data/db/migrate/003_create_section.rb +13 -0
  26. data/db/migrate/004_create_user.rb +14 -0
  27. data/db/migrate/005_create_inboxes.rb +19 -0
  28. data/db/migrate/006_create_alert_message.rb +37 -0
  29. data/db/migrate/007_create_notes.rb +22 -0
  30. data/db/migrate/008_create_history.rb +20 -0
  31. data/db/migrate/009_create_watcher.rb +21 -0
  32. data/db/migrate/010_create_attachment.rb +26 -0
  33. data/db/migrate/011_add_created_by_to_histories.rb +10 -0
  34. data/db/test.sqlite3 +0 -0
  35. data/features/step_definitions/add_a_user_to_a_watcher_steps.rb +29 -0
  36. data/features/step_definitions/trigger_alert_on_modify_steps.rb +86 -0
  37. data/features/supports/file.txt +1 -0
  38. data/features/supports/initializer.rb +1 -0
  39. data/features/supports/updated_file.txt +1 -0
  40. data/features/watchlist/add_a_user_to_a_watcher.feature +19 -0
  41. data/features/watchlist/trigger_alert_on_modify.feature +90 -0
  42. data/lib/active_metadata/base.rb +59 -0
  43. data/lib/active_metadata/persistence/active_record/attachment.rb +42 -0
  44. data/lib/active_metadata/persistence/active_record/history.rb +22 -0
  45. data/lib/active_metadata/persistence/active_record/note.rb +45 -0
  46. data/lib/active_metadata/persistence/active_record/watcher.rb +45 -0
  47. data/lib/active_metadata/persistence/active_record.rb +26 -0
  48. data/lib/active_metadata/persistence/mongoid/attachment.rb +45 -0
  49. data/lib/active_metadata/persistence/mongoid/history.rb +26 -0
  50. data/lib/active_metadata/persistence/mongoid/note.rb +48 -0
  51. data/lib/active_metadata/persistence/mongoid/watcher.rb +43 -0
  52. data/lib/active_metadata/persistence/mongoid.rb +30 -0
  53. data/lib/active_metadata/persistence/persistence.rb +13 -0
  54. data/lib/active_metadata/railtie.rb +6 -0
  55. data/lib/active_metadata/version.rb +1 -1
  56. data/lib/active_metadata.rb +6 -12
  57. data/lib/application_controller.rb +28 -0
  58. data/lib/application_helper.rb +7 -0
  59. data/lib/engine.rb +29 -0
  60. data/lib/model/active_record/attachment.rb +18 -0
  61. data/lib/model/active_record/history.rb +2 -0
  62. data/lib/model/active_record/note.rb +2 -0
  63. data/lib/model/active_record/watcher.rb +4 -0
  64. data/lib/model/mongoid/active_meta.rb +6 -0
  65. data/lib/model/mongoid/attachment.rb +25 -0
  66. data/lib/model/mongoid/history.rb +9 -0
  67. data/lib/model/mongoid/label.rb +14 -0
  68. data/lib/model/mongoid/note.rb +10 -0
  69. data/lib/model/mongoid/watcher.rb +24 -0
  70. data/lib/rails/railties/tasks.rake +8 -0
  71. data/lib/rake/active_record_tasks.rb +77 -0
  72. data/lib/rake/task.rb +18 -0
  73. data/lib/templates/active_metadata.yml +17 -0
  74. data/lib/templates/active_metadata_migrations +67 -0
  75. data/lib/templates/mongoid.yml +20 -0
  76. data/spec/active_metadata_spec.rb +596 -0
  77. data/spec/benchmark_spec.rb +35 -0
  78. data/spec/controllers/metadata_controller_spec.rb +14 -0
  79. data/spec/spec_helper.rb +87 -0
  80. data/spec/support/document.rb +8 -0
  81. data/spec/support/pdf_test.pdf +0 -0
  82. data/spec/support/pdf_test_2.pdf +0 -0
  83. data/spec/support/section.rb +8 -0
  84. data/spec/support/user.rb +13 -0
  85. data/spec/support/watcher_notifier.rb +21 -0
  86. metadata +201 -19
  87. data/.gitignore +0 -4
  88. data/Gemfile +0 -4
  89. data/Rakefile +0 -1
  90. data/active_metadata.gemspec +0 -24
@@ -1,3 +1,3 @@
1
1
  module ActiveMetadata
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.9"
3
3
  end
@@ -1,13 +1,7 @@
1
- require "active_metadata/version"
2
- require "mongo"
3
-
4
1
  module ActiveMetadata
5
-
6
- #TODO add a configure routine
7
- MONGO = Mongo::Connection.new.db "metadata"
8
-
9
- def act_as_metadata
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
+ #
@@ -0,0 +1,7 @@
1
+ module ApplicationHelper
2
+
3
+ def app_wide_helper_method
4
+ "this output is from an app-wide helper method that is declared within the gem"
5
+ end
6
+
7
+ end
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,2 @@
1
+ class History < ActiveRecord::Base
2
+ end
@@ -0,0 +1,2 @@
1
+ class Note < ActiveRecord::Base
2
+ end
@@ -0,0 +1,4 @@
1
+ class Watcher < ActiveRecord::Base
2
+ attr_reader :notifier
3
+
4
+ end
@@ -0,0 +1,6 @@
1
+ class ActiveMeta
2
+ include Mongoid::Document
3
+ field :document_id, type: Integer
4
+ has_many :labels, :class_name => "Label"
5
+ index :document_id
6
+ 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,9 @@
1
+ class History
2
+ include Mongoid::Document
3
+ store_in :history
4
+
5
+ belongs_to :label
6
+
7
+ field :value, :type => String
8
+
9
+ 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,10 @@
1
+ class Note
2
+ include Mongoid::Document
3
+ belongs_to :label
4
+
5
+ field :note, :type => String
6
+ field :updated_by, :type => Integer
7
+ field :updated_at, :type => Time
8
+
9
+ index :updated_at
10
+ 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,8 @@
1
+ namespace :cheese do
2
+
3
+ desc "example gem rake task"
4
+ task :report => :environment do
5
+ puts "you just ran the example gem rake task"
6
+ end
7
+
8
+ 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