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
@@ -0,0 +1,47 @@
1
+ module ActiveMetadata
2
+ class AttachmentsController < ApplicationController
3
+
4
+ unloadable
5
+
6
+ def index
7
+ @document = eval(params[:model_name]).find params[:model_id]
8
+ @attachments = @document.attachments_for params[:field_name]
9
+ respond_to do |format|
10
+ format.html { render :layout => false}
11
+ format.xml { render :xml => @histories }
12
+ end
13
+ end
14
+
15
+ def create
16
+ @document = eval(params[:model_name]).find params[:model_id]
17
+ @document.save_attachment_for(params[:field_name], params[:file])
18
+
19
+ #todo: if errors send back the correct answer
20
+ respond_to do |format|
21
+ format.js {render :json => {'success' => true}}
22
+ end
23
+ end
24
+
25
+ def update
26
+ @document = eval(params[:model_name]).find params[:model_id]
27
+ @document.update_attachment_for(params[:field_name],params[:id],params[:file])
28
+
29
+ #todo: if errors send back the correct answer
30
+ respond_to do |format|
31
+ format.js {render :json => {'success' => true}}
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ @document = eval(params[:model_name]).find params[:model_id]
37
+ @document.delete_attachment_for(params[:field_name], params[:id])
38
+
39
+ #todo: if errors send back the correct answer
40
+ respond_to do |format|
41
+ # TODO redirect to index
42
+ format.js
43
+ end
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,16 @@
1
+ module ActiveMetadata
2
+ class HistoriesController < ApplicationController
3
+
4
+ unloadable
5
+
6
+ def index
7
+ @document = eval(params[:model_name]).find params[:model_id]
8
+ @histories = @document.history_for params[:field_name]
9
+ respond_to do |format|
10
+ format.html { render :layout => false}
11
+ format.xml { render :xml => @histories }
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,61 @@
1
+ module ActiveMetadata
2
+ class NotesController < ApplicationController
3
+
4
+ unloadable
5
+
6
+ def index
7
+ @document = eval(params[:model_name]).find params[:model_id]
8
+ @notes = @document.notes_for params[:field_name]
9
+ respond_to do |format|
10
+ format.html { render :layout => false}
11
+ format.xml { render :xml => @notes }
12
+ format.xls { send_data @notes.to_xls_data(:columns => [:note,:created_at], :headers => [:nota,'inserita']), :filename => 'notes.xls' }
13
+ end
14
+ end
15
+
16
+ def edit
17
+ @document = eval(params[:model_name]).find params[:model_id]
18
+ @note = @document.note_for params[:field_name],params[:id]
19
+ end
20
+
21
+ def show
22
+ @document = eval(params[:model_name]).find params[:model_id]
23
+ @note = @document.note_for params[:field_name],params[:id]
24
+ end
25
+
26
+ def create
27
+ @document = eval(params[:model_name]).find params[:model_id]
28
+ @document.create_note_for(params[:field_name], params[:note])
29
+ respond_to do |format|
30
+ # TODO redirect to edit
31
+ format.js
32
+ end
33
+ end
34
+
35
+ def update
36
+ @document = eval(params[:model_name]).find params[:model_id]
37
+ @note = @document.note_for params[:field_name],params[:id]
38
+
39
+ respond_to do |format|
40
+ if @document.update_note(params[:id],params[:note][:note])
41
+ format.html { redirect_to(active_metadata_show_note_path(@document.class,@document.id,@note.label,@note.id), :notice => 'Note was successfully updated.') }
42
+ format.xml { head :ok }
43
+ else
44
+ format.html { render :action => "edit" }
45
+ format.xml { render :xml => @note.errors, :status => :unprocessable_entity }
46
+ end
47
+ end
48
+ end
49
+
50
+ def destroy
51
+ @document = eval(params[:model_name]).find params[:model_id]
52
+ @document.delete_note_for(params[:field_name],params[:id])
53
+ respond_to do |format|
54
+ # TODO redirect to index
55
+ format.js
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveMetadata
2
+ class WatchersController < ApplicationController
3
+ unloadable
4
+
5
+ def index
6
+ @document = eval(params[:model_name]).find params[:model_id]
7
+
8
+ @watchers = @document.watchers_for params[:field_name]
9
+
10
+ respond_to do |format|
11
+ format.html { render :layout => false}
12
+ format.xml { render :xml => @watchers }
13
+ end
14
+ end
15
+
16
+ def create
17
+ @document = eval(params[:model_name]).find params[:model_id]
18
+ @document.create_watcher_for params[:field_name], User.find(params[:user_id])
19
+
20
+ respond_to do |format|
21
+ format.js
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ @document = eval(params[:model_name]).find params[:model_id]
27
+ @document.delete_watcher_for params[:field_name], User.find(params[:user_id])
28
+ respond_to do |format|
29
+ format.js
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,2 @@
1
+ ## Look in lib/application_helper.rb
2
+ ## I can't figure out how to get it included unless I put it that directory
@@ -0,0 +1,11 @@
1
+ <ul>
2
+ <% @attachments.each do |item| %>
3
+ <li>
4
+ <%= link_to "File: #{item.attach.original_filename}", item.attach.url %><br/>
5
+ <%= "Path: #{item.attach.path}"%>
6
+ <%= "Size: #{item.attach.size}"%>
7
+ <%= "Updated at: #{item.attach.instance_read(:updated_at)}"%> <br/>
8
+ <%= link_to "Elimina", active_metadata_destroy_attachment_path(@document.class,@document.id,item.label,item.id), :method => :delete, :remote => true %>
9
+ </li>
10
+ <% end %>
11
+ </ul>
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <% @histories.each do |history| %>
3
+ <li><span><%= history.created_at.strftime("%m/%d/%Y at %I:%M:%S") %></span> <%= history.value %></li>
4
+ <% end %>
5
+ </ul>
@@ -0,0 +1,23 @@
1
+ <%= form_for(@note,:url => active_metadata_update_note_path(@document.class,@document.id,@note.label,@note.id)) do |f| %>
2
+
3
+ <% if @document.errors.any? %>
4
+ <div id = "error_explanation">
5
+ <h2><%= pluralize(@note.errors.count, "error") %> prohibited this document from being saved:</h2>
6
+ <ul>
7
+ <% @note.errors.full_messages.each do |msg| %>
8
+ <li><%= msg %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class = "field">
15
+ <%= f.label :note %><br/>
16
+ <%= f.text_field :note %>
17
+ </div>
18
+
19
+ <div class = "actions">
20
+ <%= f.submit %>
21
+ </div>
22
+
23
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <h1>Editing note</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', active_metadata_show_note_path(@document.class,@document.id,@note.label,@note.id.to_s) %> |
6
+ <%= link_to 'Back', active_metadata_notes_path(@document.class,@document.id,@note.label) %>
7
+
8
+
@@ -0,0 +1,11 @@
1
+ <ul>
2
+ <% @notes.each do |note| %>
3
+ <li>
4
+ <b><%= note.note %></b><br/>
5
+ <%= "Inserita da: #{note.created_by}<br/>" unless note.created_by.nil? %>
6
+ Il: <%= note.created_at.strftime("%m/%d/%Y at %I:%M:%S") %> <br/>
7
+ <%= link_to "Edit", active_metadata_edit_note_path(@document.class,@document.id,note.label,note.id) %>
8
+ <%= link_to "Destroy", active_metadata_destroy_note_path(@document.class,@document.id,note.label,note.id), :method => :delete, :remote => true %>
9
+ </li>
10
+ <% end %>
11
+ </ul>
@@ -0,0 +1 @@
1
+ $(".name_notes").html("<%= escape_javascript(render(:partial => 'active_metadata/notes/notes', :locals => { :field_name => 'name' } )) %>");
@@ -0,0 +1,9 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <p>
4
+ <b>Note:</b>
5
+ <%= @note.note %>
6
+ </p>
7
+
8
+ <%= link_to "Edit", active_metadata_edit_note_path(@document.class,@document.id,@note.label,@note.id) %>|
9
+ <%= link_to 'Back', active_metadata_notes_path(@document.class,@document.id,@note.label) %>
@@ -0,0 +1 @@
1
+ alert('Watcher created');
@@ -0,0 +1 @@
1
+ alert('Watcher deleted');
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <% @watchers.each do |watcher| %>
3
+ <li><span><%= watcher.created_at.strftime("%m/%d/%Y at %I:%M:%S") %></span> <%= watcher.owner_id %></li>
4
+ <% end %>
5
+ </ul>
@@ -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"
File without changes
@@ -0,0 +1,11 @@
1
+ development:
2
+ adapter: sqlite3
3
+ database: db/development.sqlite3
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ test:
8
+ adapter: sqlite3
9
+ database: db/test.sqlite3
10
+ pool: 5
11
+ timeout: 5000
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ ActiveSupport::Inflector.inflections do |inflect|
6
+ inflect.uncountable %w( metadata )
7
+ end
@@ -0,0 +1,28 @@
1
+ development:
2
+ host: localhost
3
+ database: metadata_d
4
+ max_retries_on_connection_failure: 50
5
+
6
+ test:
7
+ hosts:
8
+ - - localhost
9
+ - 27017
10
+ - - localhost
11
+ - 27018
12
+ - - localhost
13
+ - 27019
14
+ database: metadata_t
15
+ max_retries_on_connection_failure: 50
16
+
17
+ # set these environment variables on your prod server
18
+ production:
19
+ host: <%= ENV['MONGOID_HOST'] %>
20
+ port: <%= ENV['MONGOID_PORT'] %>
21
+ username: <%= ENV['MONGOID_USERNAME'] %>
22
+ password: <%= ENV['MONGOID_PASSWORD'] %>
23
+ database: <%= ENV['MONGOID_DATABASE'] %>
24
+ # slaves:
25
+ # - host: slave1.local
26
+ # port: 27018
27
+ # - host: slave2.local
28
+ # port: 27019
data/config/routes.rb ADDED
@@ -0,0 +1,30 @@
1
+ Rails.application.routes.draw do
2
+
3
+ mount_at = ActiveMetadata::Engine.config.mount_at
4
+
5
+ namespace "active_metadata" do
6
+ #note
7
+ match ':model_name/:model_id/:field_name/notes' => 'notes#index', :via => :get, :as => "notes", :path_prefix => mount_at
8
+ match ':model_name/:model_id/:field_name/notes' => 'notes#create', :via => :post, :as => "create_note", :path_prefix => mount_at
9
+ match ':model_name/:model_id/:field_name/note/:id' => 'notes#destroy', :via => :delete, :as => "destroy_note", :path_prefix => mount_at
10
+ match ':model_name/:model_id/:field_name/note/:id/edit' => 'notes#edit', :via => :get, :as => "edit_note", :path_prefix => mount_at
11
+ match ':model_name/:model_id/:field_name/note/:id' => 'notes#update', :via => :put, :as => "update_note", :path_prefix => mount_at
12
+ match ':model_name/:model_id/:field_name/note/:id' => 'notes#show', :via => :get, :as => "show_note", :path_prefix => mount_at
13
+
14
+ #history
15
+ match ':model_name/:model_id/:field_name/histories' => 'histories#index', :via => :get, :as => "histories", :path_prefix => mount_at
16
+
17
+ #attachments
18
+ match ':model_name/:model_id/:field_name/attachments' => 'attachments#index', :via => :get, :as => "attachments", :path_prefix => mount_at
19
+ match ':model_name/:model_id/:field_name/attachments' => 'attachments#create', :via => :post, :as => "create_attachment", :path_prefix => mount_at
20
+ match ':model_name/:model_id/:field_name/attachments/:id' => 'attachments#destroy', :via => :delete, :as => "destroy_attachment", :path_prefix => mount_at
21
+ match ':model_name/:model_id/:field_name/attachments/:id' => 'attachments#update', :via => :put, :as => "update_attachment", :path_prefix => mount_at
22
+
23
+ #alerts
24
+ get ':model_name/:model_id/:field_name/watchers' => 'watchers#index', :as => "watchers", :path_prefix => mount_at
25
+ post ':model_name/:model_id/:field_name/watchers/:user_id' => 'watchers#create',:as => "set_watcher", :path_prefix => mount_at
26
+ delete ':model_name/:model_id/:field_name/watchers/:user_id' => 'watchers#destroy',:as => "unset_watcher", :path_prefix => mount_at
27
+ # TODO missing routes to notice of a read message
28
+ end
29
+
30
+ end
Binary file
@@ -0,0 +1,12 @@
1
+ class CreateDocument < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :documents do |t|
4
+ t.string :name
5
+ t.timestamps
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :documents
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ class AddSurnameToDocument < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :documents, :surname, :string
4
+ end
5
+
6
+ def self.down
7
+ remove_column :documents, :surname
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class CreateSection < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :sections do |t|
4
+ t.string :title
5
+ t.integer :document_id
6
+ t.timestamps
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :sections
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ class CreateUser < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :users do |t|
4
+ t.string :email
5
+ t.string :firstname
6
+ t.string :lastname
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :users
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ class CreateInboxes < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :inboxes do |t|
4
+ t.string :label
5
+ t.string :object_class
6
+ t.integer :object_id
7
+ t.string :alert_type
8
+ t.string :old_value
9
+ t.string :new_value
10
+ t.text :content
11
+ t.integer :user_id
12
+ t.timestamps
13
+ end
14
+ end
15
+
16
+ def self.down
17
+ drop_table :inboxes
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ class CreateAlertMessage < ActiveRecord::Migration
2
+ def self.up
3
+ drop_table :inboxes
4
+
5
+ create_table :inboxes do |t|
6
+ t.integer :user_id
7
+ end
8
+
9
+ create_table :alert_messages do |t|
10
+ t.string :label
11
+ t.string :model_class
12
+ t.integer :model_id
13
+ t.string :alert_type
14
+ t.text :old_value
15
+ t.text :new_value
16
+ t.integer :inbox_id
17
+ t.boolean :read
18
+
19
+ t.timestamps
20
+ end
21
+ end
22
+
23
+ def self.down
24
+ drop_table :alert_messages
25
+ create_table :inboxes do |t|
26
+ t.string :label
27
+ t.string :object_class
28
+ t.integer :object_id
29
+ t.string :alert_type
30
+ t.string :old_value
31
+ t.string :new_value
32
+ t.text :content
33
+ t.integer :user_id
34
+ t.timestamps
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ class CreateNotes < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :notes do |t|
4
+ t.text :note
5
+ t.string :label
6
+ t.integer :document_id
7
+ t.integer :created_by
8
+ t.integer :updated_by
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :notes, :document_id
13
+ add_index :notes, :label
14
+ add_index :notes, :updated_at
15
+
16
+ end
17
+
18
+ def self.down
19
+ drop_table :notes
20
+ end
21
+
22
+ end
@@ -0,0 +1,20 @@
1
+ class CreateHistory < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :histories do |t|
4
+ t.text :value
5
+ t.string :label
6
+ t.integer :document_id
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :histories, :document_id
11
+ add_index :histories, :label
12
+ add_index :histories, :created_at
13
+
14
+ end
15
+
16
+ def self.down
17
+ drop_table :histories
18
+ end
19
+
20
+ end
@@ -0,0 +1,21 @@
1
+ class CreateWatcher < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :watchers do |t|
4
+ t.integer :owner_id
5
+ t.string :label
6
+ t.integer :document_id
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :watchers, :document_id
11
+ add_index :watchers, :label
12
+ add_index :watchers, :owner_id
13
+ add_index :watchers, :created_at
14
+
15
+ end
16
+
17
+ def self.down
18
+ drop_table :watchers
19
+ end
20
+
21
+ end
@@ -0,0 +1,26 @@
1
+ class CreateAttachment < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :attachments do |t|
4
+ t.string :label
5
+ t.integer :document_id
6
+ t.integer :created_by
7
+ t.integer :updated_by
8
+ t.integer :counter
9
+ t.string :attach_file_name
10
+ t.string :attach_content_type
11
+ t.integer :attach_file_size
12
+ t.datetime :attach_updated_at
13
+ t.timestamps
14
+ end
15
+
16
+ add_index :attachments, :document_id
17
+ add_index :attachments, :label
18
+ add_index :attachments, :attach_updated_at
19
+
20
+ end
21
+
22
+ def self.down
23
+ drop_table :attachments
24
+ end
25
+
26
+ end
@@ -0,0 +1,10 @@
1
+ class AddCreatedByToHistories < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :histories, :created_by, :integer
4
+ end
5
+
6
+ def self.down
7
+ remove_column :histories, :created_by
8
+ end
9
+
10
+ end
data/db/test.sqlite3 ADDED
Binary file
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+
3
+ ### Background #
4
+ Given /^an ActiveRecord object instance of 'Document'$/ do
5
+ raise unless Document.ancestors.include?(::ActiveRecord::Base)
6
+ @document = Document.create!(:name => 'Fractal', :surname => 'Garden' )
7
+ end
8
+
9
+ Given /^an ActiveRecord object instance of 'User'$/ do
10
+ raise unless User.ancestors.include?(::ActiveRecord::Base)
11
+ end
12
+
13
+ ### Scenarios #
14
+ Given /^a User "([^"]*)"$/ do |email|
15
+ @current_user = User.create!(:email => email, :firstname => 'John', :lastname => 'smith' )
16
+ end
17
+
18
+ When /^adding the user to the watcherslist of an attribute "([^"]*)"$/ do |attribute|
19
+ @attribute = attribute
20
+ @document.create_watcher_for(@attribute, @current_user)
21
+ end
22
+
23
+ Then /^it should be created a new watcher for that field$/ do
24
+ @document.watchers_for(@attribute).should_not be_nil
25
+ end
26
+
27
+ Then /^added a user to the list of the watcher$/ do
28
+ @document.watchers_for(@attribute).first.owner_id.should be == @current_user.id
29
+ end