active_metadata 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,7 +24,7 @@ module ActiveMetadata
24
24
 
25
25
  def update
26
26
  @document = eval(params[:model_name]).find params[:model_id]
27
- @document.update_attachment_for(params[:field_name],params[:id],params[:file])
27
+ @document.update_attachment(params[:id],params[:file])
28
28
 
29
29
  #todo: if errors send back the correct answer
30
30
  respond_to do |format|
@@ -34,7 +34,7 @@ module ActiveMetadata
34
34
 
35
35
  def destroy
36
36
  @document = eval(params[:model_name]).find params[:model_id]
37
- @document.delete_attachment_for(params[:field_name], params[:id])
37
+ @document.delete_attachment(params[:id])
38
38
 
39
39
  #todo: if errors send back the correct answer
40
40
  respond_to do |format|
@@ -49,7 +49,7 @@ module ActiveMetadata
49
49
 
50
50
  def destroy
51
51
  @document = eval(params[:model_name]).find params[:model_id]
52
- @document.delete_note_for(params[:field_name],params[:id])
52
+ @document.delete_note(params[:id])
53
53
  respond_to do |format|
54
54
  # TODO redirect to index
55
55
  format.js
data/config/routes.rb CHANGED
@@ -6,11 +6,14 @@ Rails.application.routes.draw do
6
6
  #note
7
7
  match ':model_name/:model_id/:field_name/notes' => 'notes#index', :via => :get, :as => "notes", :path_prefix => mount_at
8
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
-
9
+ match ':model_name/:model_id/:field_name/notes/:id' => 'notes#destroy', :via => :delete, :as => "destroy_note", :path_prefix => mount_at
10
+ match ':model_name/:model_id/:field_name/notes/:id/edit' => 'notes#edit', :via => :get, :as => "edit_note", :path_prefix => mount_at
11
+ match ':model_name/:model_id/:field_name/notes/:id' => 'notes#update', :via => :put, :as => "update_note", :path_prefix => mount_at
12
+ match ':model_name/:model_id/:field_name/notes/:id' => 'notes#show', :via => :get, :as => "show_note", :path_prefix => mount_at
13
+ match ':model_name/:model_id/:field_name/notes/starred' => 'notes#starred', :via => :get, :as => "starred_notes", :path_prefix => mount_at
14
+ match ':model_name/:model_id/:field_name/notes/:id/star' => 'notes#star', :via => :put, :as => "star_note", :path_prefix => mount_at
15
+ match ':model_name/:model_id/:field_name/notes/:id/unstar' => 'notes#unstar', :via => :put, :as => "unstar_note", :path_prefix => mount_at
16
+
14
17
  #history
15
18
  match ':model_name/:model_id/:field_name/histories' => 'histories#index', :via => :get, :as => "histories", :path_prefix => mount_at
16
19
 
@@ -19,7 +22,10 @@ Rails.application.routes.draw do
19
22
  match ':model_name/:model_id/:field_name/attachments' => 'attachments#create', :via => :post, :as => "create_attachment", :path_prefix => mount_at
20
23
  match ':model_name/:model_id/:field_name/attachments/:id' => 'attachments#destroy', :via => :delete, :as => "destroy_attachment", :path_prefix => mount_at
21
24
  match ':model_name/:model_id/:field_name/attachments/:id' => 'attachments#update', :via => :put, :as => "update_attachment", :path_prefix => mount_at
22
-
25
+ match ':model_name/:model_id/:field_name/attachments/starred' => 'attachments#starred', :via => :get, :as => "starred_attachments", :path_prefix => mount_at
26
+ match ':model_name/:model_id/:field_name/attachments/:id/star' => 'attachments#star', :via => :put, :as => "star_attachments", :path_prefix => mount_at
27
+ match ':model_name/:model_id/:field_name/attachments/:id/unstar' => 'attachments#unstar', :via => :put, :as => "unstar_attachments", :path_prefix => mount_at
28
+
23
29
  #alerts
24
30
  get ':model_name/:model_id/:field_name/watchers' => 'watchers#index', :as => "watchers", :path_prefix => mount_at
25
31
  post ':model_name/:model_id/:field_name/watchers/:user_id' => 'watchers#create',:as => "set_watcher", :path_prefix => mount_at
@@ -8,6 +8,7 @@ class ActiveMetadataMigrations < ActiveRecord::Migration
8
8
  t.integer :document_id
9
9
  t.integer :created_by
10
10
  t.integer :updated_by
11
+ t.boolean :starred
11
12
  t.timestamps
12
13
  end
13
14
 
@@ -41,6 +42,7 @@ class ActiveMetadataMigrations < ActiveRecord::Migration
41
42
  t.string :attach_content_type
42
43
  t.integer :attach_file_size
43
44
  t.datetime :attach_updated_at
45
+ t.boolean :starred
44
46
  t.timestamps
45
47
  end
46
48
 
data/db/test.sqlite3 CHANGED
Binary file
@@ -6,8 +6,9 @@ module ActiveMetadata::Persistence::ActiveRecord::Attachment
6
6
 
7
7
  module InstanceMethods
8
8
 
9
- def save_attachment_for(field, file)
10
- attachment = Attachment.create! :document_class => metadata_class, :document_id => metadata_id, :label => field, :attach => file, :created_by => current_user_id
9
+ def save_attachment_for(field, file, starred=false)
10
+ attachment = Attachment.create! :document_class => metadata_class, :document_id => metadata_id, :label => field, :attach => file,
11
+ :starred => starred, :created_by => current_user_id
11
12
  reload_attachments_cache_for field
12
13
  self.send(:send_notification, field, "", attachment.attach.original_filename, :attachment_message, current_user_id)
13
14
  end
@@ -18,40 +19,61 @@ module ActiveMetadata::Persistence::ActiveRecord::Attachment
18
19
  end
19
20
  end
20
21
 
21
- def delete_attachment_for(field,id)
22
+ def delete_attachment(id)
22
23
  a = Attachment.find(id)
23
24
  filename = a.attach.original_filename
24
25
  a.destroy
25
- reload_attachments_cache_for field
26
- self.send(:send_notification, field, filename, "", :attachment_message)
26
+ reload_attachments_cache_for a.label
27
+ self.send(:send_notification, a.label, filename, "", :attachment_message)
27
28
  end
28
29
 
29
- def update_attachment_for(field, id, newfile)
30
+ def update_attachment(id, newfile, starred=nil)
30
31
  a = Attachment.find(id)
31
32
  old_filename = a.attach.original_filename
32
33
  a.attach = newfile
33
34
  a.updated_by = current_user_id
34
- a.save
35
+ a.starred = starred if !starred.nil?
36
+ a.save
35
37
  new_filename = a.attach.original_filename
36
38
 
37
- reload_attachments_cache_for field
38
- self.send(:send_notification, field, old_filename, new_filename, :attachment_message, current_user_id)
39
+ reload_attachments_cache_for a.label
40
+ self.send(:send_notification, a.label, old_filename, new_filename, :attachment_message, current_user_id)
39
41
  end
40
42
 
41
43
  def has_attachments_for field
42
44
  attachments_for(field).size == 0 ? false : true
43
45
  end
44
-
46
+
47
+ def find_attachment_by_id(id)
48
+ Attachment.find(id)
49
+ end
50
+
51
+ # not cached
52
+ def starred_attachments_for(field)
53
+ fetch_attachments_for field,true
54
+ end
55
+
56
+ def star_attachment(id)
57
+ n = Attachment.find(id)
58
+ update_attachment id,n.attach,true
59
+ end
60
+
61
+ def unstar_attachment(id)
62
+ n = Attachment.find(id)
63
+ update_attachment id,n.attach,false
64
+ end
65
+
45
66
  private
46
67
 
47
68
  def reload_attachments_cache_for field
48
69
  Rails.cache.write(attachments_cache_key(field),fetch_attachments_for(field), :expires_in => ActiveMetadata::CONFIG['cache_expires_in'].minutes )
49
70
  end
50
71
 
51
- def fetch_attachments_for field
52
- Attachment.all(:conditions => {:document_class => metadata_class, :document_id => metadata_id,:label => field}, :order => "attach_updated_at DESC")
72
+ def fetch_attachments_for field, starred=nil
73
+ conditions = {:document_class => metadata_class, :document_id => metadata_id,:label => field}
74
+ conditions[:starred] = starred if !starred.nil?
75
+ Attachment.all(:conditions => conditions , :order => "attach_updated_at DESC")
53
76
  end
54
-
55
77
 
56
78
  end
57
79
 
@@ -6,16 +6,21 @@ module ActiveMetadata::Persistence::ActiveRecord::Note
6
6
 
7
7
  module InstanceMethods
8
8
 
9
- def create_note_for(field, note)
10
- Note.create! :document_id => metadata_id, :document_class => metadata_class, :label => field.to_s,:note => note, :created_by => current_user_id
11
- reload_notes_cache_for field
9
+ def create_note_for(field, note, starred=false)
10
+ Note.create! :document_id => metadata_id, :document_class => metadata_class, :label => field.to_s,:note => note, :created_by => current_user_id, :starred => starred
11
+ reload_notes_cache_for field
12
12
  self.send(:send_notification, field, "", note, :note_message, current_user_id)
13
13
  end
14
14
 
15
- def update_note(id, note)
15
+ def update_note(id, note, starred=nil)
16
16
  n = Note.find(id)
17
17
  old_value = n.note
18
- n.update_attributes! :note => note, :updated_by => current_user_id, :updated_at => Time.now.utc
18
+ attributes = {:note => note, :updated_by => current_user_id, :updated_at => Time.now.utc}
19
+ #mass assign starred inly if provided
20
+ unless starred.nil?
21
+ attributes[:starred] = starred
22
+ end
23
+ n.update_attributes! attributes
19
24
  reload_notes_cache_for n.label
20
25
  self.send(:send_notification, n.label, old_value, note, :note_message, current_user_id)
21
26
  end
@@ -26,7 +31,7 @@ module ActiveMetadata::Persistence::ActiveRecord::Note
26
31
  end
27
32
  end
28
33
 
29
- def note_for(field,id)
34
+ def find_note_by_id(id)
30
35
  Note.find(id)
31
36
  end
32
37
 
@@ -34,26 +39,45 @@ module ActiveMetadata::Persistence::ActiveRecord::Note
34
39
  notes.each { |note| create_note_for field, note }
35
40
  end
36
41
 
37
- def delete_note_for(field,id)
42
+ def delete_note(id)
38
43
  n = Note.find(id)
39
44
  old_value = n.note
40
45
  n.destroy
41
- reload_notes_cache_for field
42
- self.send(:send_notification, field, old_value, "", :note_message)
46
+ reload_notes_cache_for n.label
47
+ self.send(:send_notification, n.label, old_value, "", :note_message)
43
48
  end
44
49
 
45
50
  def has_notes_for field
46
51
  notes_for(field).size == 0 ? false : true
47
52
  end
48
-
53
+
54
+ # not cached
55
+ def starred_notes_for(field)
56
+ fetch_notes_for field,true
57
+ end
58
+
59
+ def star_note(id)
60
+ n = Note.find(id)
61
+ update_note id,n.note,true
62
+ end
63
+
64
+ def unstar_note(id)
65
+ n = Note.find(id)
66
+ update_note id,n.note,false
67
+ end
68
+
49
69
  private
50
70
 
51
71
  def reload_notes_cache_for field
52
72
  Rails.cache.write(notes_cache_key(field),fetch_notes_for(field), :expires_in => ActiveMetadata::CONFIG['cache_expires_in'].minutes )
53
73
  end
54
74
 
55
- def fetch_notes_for field
56
- Note.all(:conditions => {:label => field, :document_class => metadata_class, :document_id => metadata_id}, :order => "updated_at DESC" )
75
+ def fetch_notes_for(field, starred=nil)
76
+ conditions = {:label => field, :document_class => metadata_class, :document_id => metadata_id}
77
+ unless starred.nil?
78
+ conditions[:starred] = starred
79
+ end
80
+ Note.all(:conditions => conditions, :order => "updated_at DESC")
57
81
  end
58
82
 
59
83
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveMetadata
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -28,160 +28,6 @@ describe ActiveMetadata do
28
28
 
29
29
  end
30
30
 
31
- context "saving and quering notes" do
32
-
33
- before(:each) do
34
- @document = Document.create! { |d| d.name = "John" }
35
- @document.reload
36
- end
37
-
38
- it "should create a new note for a given field" do
39
- @document.create_note_for(:name, "Very important note!")
40
- @document.notes_for(:name).should have(1).record
41
- end
42
-
43
-
44
- it "should verify the content of a note created" do
45
- @document.create_note_for(:name, "Very important note!")
46
- @document.notes_for(:name).last.note.should eq "Very important note!"
47
- end
48
-
49
- it "should verify that notes are created for the correct model" do
50
- @document.create_note_for(:name, "Very important note!")
51
- @document.notes_for(:name).last.document_class.should eq(@document.class.to_s)
52
- end
53
-
54
- it "should verify the created_by of a note created" do
55
- @document.create_note_for(:name, "Very important note!")
56
- @document.notes_for(:name).last.created_by.should eq User.current.id
57
- end
58
-
59
- it "should verify that notes_for_name return only notes for the self Document" do
60
- # fixtures
61
- @another_doc = Document.create :name => "Andrea"
62
- @another_doc.create_note_for(:name, "Very important note for doc2!")
63
- @another_doc.reload
64
- @document.create_note_for(:name, "Very important note!")
65
-
66
- # expectations
67
- @document.notes_for(:name).count.should eq(1)
68
- @document.notes_for(:name).last.note.should eq "Very important note!"
69
- @another_doc.notes_for(:name).last.note.should eq "Very important note for doc2!"
70
-
71
- end
72
-
73
- it "should update a note using update_note_for_name" do
74
- @document.create_note_for(:name, "Very important note!")
75
- id = @document.notes_for(:name).last.id
76
- @document.update_note(id, "New note value!")
77
- @document.notes_for(:name).last.note.should eq "New note value!"
78
- end
79
-
80
- it "should verify the content of a note created for a second attribute" do
81
- @document.create_note_for(:name, "Very important note!")
82
- @document.create_note_for(:surname, "Note on surname attribute!")
83
-
84
- @document.notes_for(:name).last.note.should eq "Very important note!"
85
- @document.notes_for(:surname).last.note.should eq "Note on surname attribute!"
86
- end
87
-
88
- it "should save multiple notes" do
89
- notes = ["note number 1", "note number 2"]
90
- @document.create_notes_for(:name, notes)
91
- @document.notes_for(:name).should have(2).record
92
- end
93
-
94
- it "should save the updater id in metadata" do
95
- @document.create_note_for(:name, "Very important note!")
96
- id = @document.notes_for(:name).last.id
97
- @document.update_note id, "new note value"
98
- @document.notes_for(:name).last.updated_by.should eq User.current.id
99
- end
100
-
101
- it "should save the created_at datetime in metadata" do
102
- @document.create_note_for(:name, "Very important note!")
103
- @document.notes_for(:name).last.created_at.should be_a_kind_of Time
104
- end
105
-
106
- it "should save the updated_at datetime in metadata" do
107
- @document.create_note_for(:name, "Very important note!")
108
- @document.notes_for(:name).last.updated_at.should be_a_kind_of Time
109
- end
110
-
111
- it "should update the updated_at field when a note is updated" do
112
- @document.create_note_for(:name, "Very important note!")
113
- id = @document.notes_for(:name).last.id
114
- sleep 1.seconds
115
- @document.update_note id, "new note value"
116
- note = @document.notes_for(:name).last
117
- note.updated_at.should > note.created_at
118
- end
119
-
120
- it "should verify that note are saved with the correct model id if metadata_id_from is defined" do
121
- # fixtures
122
- @document.create_note_for(:name, "Very important note!")
123
- @section = @document.create_section :title => "new section"
124
- @section.reload
125
- @section.create_note_for(:title, "Very important note for section!")
126
-
127
- # expectations
128
- @document.notes_for(:name).last.document_id.should eq @document.id
129
- @section.notes_for(:title).last.document_id.should eq @document.id
130
- end
131
-
132
- it "should delete a note id" do
133
- #fixtures
134
- 2.times do |i|
135
- @document.create_note_for(:name, "Note number #{i}")
136
- end
137
-
138
- #expectations
139
- notes = @document.notes_for(:name)
140
- notes.count.should eq 2
141
- note_to_be_deleted = notes[0].note
142
-
143
- @document.delete_note_for(:name,notes[0].id)
144
-
145
- notes = @document.notes_for(:name)
146
- notes.count.should eq 1
147
- notes.first.note.should_not eq note_to_be_deleted
148
-
149
- end
150
-
151
- it "should verify that notes_for sort by updated_at descending" do
152
- #fixtures
153
- 3.times do |i|
154
- sleep 1.seconds
155
- @document.create_note_for(:name, "Note number #{i}")
156
- end
157
-
158
- #expectations
159
- @document.notes_for(:name).first.note.should eq "Note number 2"
160
- @document.notes_for(:name).last.note.should eq "Note number 0"
161
- end
162
-
163
- it "should find a note by id" do
164
-
165
- 3.times do |i|
166
- @document.create_note_for(:name, "Note number #{i}")
167
- end
168
-
169
- note = @document.notes_for(:name).last
170
- id = note.id
171
-
172
- match_note = @document.note_for :name,id
173
- match_note.id.should eq id
174
-
175
- end
176
-
177
- it "should has_notes_for verify if defined field has notes" do
178
- @document.has_notes_for(:name).should be_false
179
- @document.create_note_for(:name, "new note")
180
- @document.has_notes_for(:name).should be_true
181
- end
182
-
183
- end
184
-
185
31
  context "history" do
186
32
 
187
33
  before(:each) do
@@ -257,132 +103,7 @@ describe ActiveMetadata do
257
103
 
258
104
  end
259
105
 
260
- context "attachments" do
261
-
262
- before(:each) do
263
- @document = Document.create! { |d| d.name = "John" }
264
- @document.reload
265
- doc = File.expand_path('../support/pdf_test.pdf',__FILE__)
266
- @attachment = Rack::Test::UploadedFile.new(doc, "application/pdf")
267
- doc2 = File.expand_path('../support/pdf_test_2.pdf',__FILE__)
268
- @attachment2 = Rack::Test::UploadedFile.new(doc2, "application/pdf")
269
- end
270
-
271
- it "should save attachment for a given attribute" do
272
- @document.save_attachment_for(:name,@attachment)
273
- @document.attachments_for(:name).should have(1).record
274
- end
275
-
276
- it "should verify that the attachment metadata id refers to the correct self id" do
277
- @document.save_attachment_for(:name,@attachment)
278
- @document.attachments_for(:name).last.document_id.should eq @document.id
279
- end
280
-
281
- it "should verify that the attachment file name is correctly saved" do
282
- @document.save_attachment_for(:name,@attachment)
283
- @document.attachments_for(:name).last.attach.original_filename.should eq @attachment.original_filename
284
- end
285
-
286
- it "should verify that the attachment content type is correctly saved" do
287
- @document.save_attachment_for(:name,@attachment)
288
- @document.attachments_for(:name).last.attach.content_type.should eq @attachment.content_type
289
- end
290
-
291
- it "should verify that the attachment size is correctly saved" do
292
- @document.save_attachment_for(:name,@attachment)
293
- @document.attachments_for(:name).last.attach.size.should eq @attachment.size
294
- end
295
-
296
- it "should verify that the attachment updated_at is correctly saved" do
297
- @document.save_attachment_for(:name,@attachment)
298
- @document.attachments_for(:name).last.attach.instance_read(:updated_at).should be_a_kind_of Time
299
- end
300
-
301
- it "should verify that the document has been saved in the correct position on filesystem" do
302
- @document.save_attachment_for(:name,@attachment)
303
- att = @document.attachments_for(:name).first
304
- expected_path = File.expand_path "#{ActiveMetadata::CONFIG['attachment_base_path']}/#{att.document_class}/#{@document.id}/#{:name.to_s}/#{att.id}/#{@attachment.original_filename}"
305
- File.exists?(expected_path).should be_true
306
- end
307
-
308
- it "should delete an attachment by id" do
309
- #fixtures
310
- 2.times do |i|
311
- @document.save_attachment_for(:name,@attachment)
312
- end
313
-
314
- #expectations
315
- attachments = @document.attachments_for(:name)
316
- attachments.count.should eq 2
317
- attachment_path_to_be_deleted = attachments[0].attach.path
318
-
319
- @document.delete_attachment_for(:name,attachments[0].id)
320
-
321
- attachments = @document.attachments_for(:name)
322
- attachments.count.should eq 1
323
- attachments.first.attach.path.should_not eq attachment_path_to_be_deleted
324
- end
325
-
326
- it "should update an attachment" do
327
- @document.save_attachment_for(:name,@attachment)
328
- att = @document.attachments_for(:name).last
329
- @document.update_attachment_for :name,att.id,@attachment2
330
- att2 = @document.attachments_for(:name).last
331
-
332
- File.exists?(att.attach.path).should be_false
333
- File.exists?(att2.attach.path).should be_true
334
- end
335
-
336
- it "should verify that field attachment_updated_at is modified after an update" do
337
- @document.save_attachment_for(:name,@attachment)
338
- att = @document.attachments_for(:name).last
339
-
340
- sleep 1.seconds
341
-
342
- @document.update_attachment_for :name,att.id,@attachment2
343
- att2 = @document.attachments_for(:name).last
344
-
345
- att2.attach.instance_read(:updated_at).should be > att.attach.instance_read(:updated_at)
346
- end
347
-
348
- it "should verify that is possible to upload 2 files with the same name for the same field" do
349
- 2.times do
350
- @document.save_attachment_for(:name,@attachment)
351
- end
352
-
353
- #expectations
354
- attachments = @document.attachments_for :name
355
- attachments.count.should eq 2
356
- File.exists?(attachments[0].attach.path).should be_true
357
- attachments[0].attach.instance_read(:file_name).should eq "pdf_test.pdf"
358
- File.exists?(attachments[1].attach.path).should be_true
359
- attachments[1].attach.instance_read(:file_name).should eq "pdf_test.pdf"
360
- end
361
-
362
- it "should save the correct creator when an attachment is created" do
363
- @document.save_attachment_for(:name,@attachment)
364
- @document.attachments_for(:name).last.created_by.should eq User.current.id
365
- end
366
-
367
- it "should save the correct updater when anttachment is updated" do
368
- @document.save_attachment_for(:name,@attachment)
369
- att = @document.attachments_for(:name).last
370
-
371
- @document.update_attachment_for :name,att.id,@attachment2
372
- att2 = @document.attachments_for(:name).last
373
-
374
- @document.attachments_for(:name).last.updated_by.should eq User.current.id
375
- end
376
-
377
- it "should has_notes_for verify if defined field has attachments" do
378
- @document.has_attachments_for(:name).should be_false
379
- @document.save_attachment_for(:name,@attachment)
380
- @document.has_attachments_for(:name).should be_true
381
- end
382
-
383
- end
384
-
385
- context "watchers" do
106
+ context "watchers" do
386
107
  before(:each) do
387
108
  @document = Document.create! { |d| d.name = "John" }
388
109
  end
@@ -434,4 +155,5 @@ describe ActiveMetadata do
434
155
  end
435
156
 
436
157
  end
158
+
437
159
  end
@@ -0,0 +1,182 @@
1
+ require "spec_helper"
2
+ require "rack/test/uploaded_file"
3
+ require "time"
4
+
5
+ describe ActiveMetadata do
6
+
7
+ context "attachments" do
8
+
9
+ before(:each) do
10
+ @document = Document.create! { |d| d.name = "John" }
11
+ @document.reload
12
+ doc = File.expand_path('../support/pdf_test.pdf', __FILE__)
13
+ @attachment = Rack::Test::UploadedFile.new(doc, "application/pdf")
14
+ doc2 = File.expand_path('../support/pdf_test_2.pdf', __FILE__)
15
+ @attachment2 = Rack::Test::UploadedFile.new(doc2, "application/pdf")
16
+ end
17
+
18
+
19
+ context "saving and quering" do
20
+
21
+ it "should save attachment for a given attribute" do
22
+ @document.save_attachment_for(:name, @attachment)
23
+ @document.attachments_for(:name).should have(1).record
24
+ end
25
+
26
+ it "should verify that the attachment metadata id refers to the correct self id" do
27
+ @document.save_attachment_for(:name, @attachment)
28
+ @document.attachments_for(:name).last.document_id.should eq @document.id
29
+ end
30
+
31
+ it "should verify that the attachment file name is correctly saved" do
32
+ @document.save_attachment_for(:name, @attachment)
33
+ @document.attachments_for(:name).last.attach.original_filename.should eq @attachment.original_filename
34
+ end
35
+
36
+ it "should verify that the attachment content type is correctly saved" do
37
+ @document.save_attachment_for(:name, @attachment)
38
+ @document.attachments_for(:name).last.attach.content_type.should eq @attachment.content_type
39
+ end
40
+
41
+ it "should verify that the attachment size is correctly saved" do
42
+ @document.save_attachment_for(:name, @attachment)
43
+ @document.attachments_for(:name).last.attach.size.should eq @attachment.size
44
+ end
45
+
46
+ it "should verify that the attachment updated_at is correctly saved" do
47
+ @document.save_attachment_for(:name, @attachment)
48
+ @document.attachments_for(:name).last.attach.instance_read(:updated_at).should be_a_kind_of Time
49
+ end
50
+
51
+ it "should verify that the document has been saved in the correct position on filesystem" do
52
+ @document.save_attachment_for(:name, @attachment)
53
+ att = @document.attachments_for(:name).first
54
+ expected_path = File.expand_path "#{ActiveMetadata::CONFIG['attachment_base_path']}/#{att.document_class}/#{@document.id}/#{:name.to_s}/#{att.id}/#{@attachment.original_filename}"
55
+ File.exists?(expected_path).should be_true
56
+ end
57
+
58
+ it "should delete an attachment by id" do
59
+ #fixtures
60
+ 2.times do |i|
61
+ @document.save_attachment_for(:name, @attachment)
62
+ end
63
+
64
+ #expectations
65
+ attachments = @document.attachments_for(:name)
66
+ attachments.count.should eq 2
67
+ attachment_path_to_be_deleted = attachments[0].attach.path
68
+
69
+ @document.delete_attachment(attachments[0].id)
70
+
71
+ attachments = @document.attachments_for(:name)
72
+ attachments.count.should eq 1
73
+ attachments.first.attach.path.should_not eq attachment_path_to_be_deleted
74
+ end
75
+
76
+ it "should update an attachment" do
77
+ @document.save_attachment_for(:name, @attachment)
78
+ att = @document.attachments_for(:name).last
79
+ @document.update_attachment att.id, @attachment2
80
+ att2 = @document.attachments_for(:name).last
81
+
82
+ File.exists?(att.attach.path).should be_false
83
+ File.exists?(att2.attach.path).should be_true
84
+ end
85
+
86
+ it "should verify that field attachment_updated_at is modified after an update" do
87
+ @document.save_attachment_for(:name, @attachment)
88
+ att = @document.attachments_for(:name).last
89
+
90
+ sleep 1.seconds
91
+
92
+ @document.update_attachment att.id, @attachment2
93
+ att2 = @document.attachments_for(:name).last
94
+
95
+ att2.attach.instance_read(:updated_at).should be > att.attach.instance_read(:updated_at)
96
+ end
97
+
98
+ it "should verify that is possible to upload 2 files with the same name for the same field" do
99
+ 2.times do
100
+ @document.save_attachment_for(:name, @attachment)
101
+ end
102
+
103
+ #expectations
104
+ attachments = @document.attachments_for :name
105
+ attachments.count.should eq 2
106
+ File.exists?(attachments[0].attach.path).should be_true
107
+ attachments[0].attach.instance_read(:file_name).should eq "pdf_test.pdf"
108
+ File.exists?(attachments[1].attach.path).should be_true
109
+ attachments[1].attach.instance_read(:file_name).should eq "pdf_test.pdf"
110
+ end
111
+
112
+ it "should save the correct creator when an attachment is created" do
113
+ @document.save_attachment_for(:name, @attachment)
114
+ @document.attachments_for(:name).last.created_by.should eq User.current.id
115
+ end
116
+
117
+ it "should save the correct updater when anttachment is updated" do
118
+ @document.save_attachment_for(:name, @attachment)
119
+ att = @document.attachments_for(:name).last
120
+
121
+ @document.update_attachment att.id, @attachment2
122
+ att2 = @document.attachments_for(:name).last
123
+
124
+ @document.attachments_for(:name).last.updated_by.should eq User.current.id
125
+ end
126
+
127
+ it "should has_notes_for verify if defined field has attachments" do
128
+ @document.has_attachments_for(:name).should be_false
129
+ @document.save_attachment_for(:name, @attachment)
130
+ @document.has_attachments_for(:name).should be_true
131
+ end
132
+
133
+ end
134
+
135
+ describe "managing starred" do
136
+
137
+ it "should craete starred attachments" do
138
+ @document.save_attachment_for(:name, @attachment, true)
139
+ @document.attachments_for(:name).first.starred?.should be_true
140
+ end
141
+
142
+ it "should update an attachment as starred" do
143
+ @document.save_attachment_for(:name, @attachment)
144
+ attachment = @document.attachments_for(:name).first
145
+ @document.update_attachment(attachment.id, attachment.attach, true)
146
+ @document.attachments_for(:name).first.starred?.should be_true
147
+ end
148
+
149
+ it "should retrieve only starred attachments for a given label" do
150
+ @document.save_attachment_for(:name, @attachment, true)
151
+ @document.save_attachment_for(:name, @attachment2)
152
+
153
+ atts = @document.starred_attachments_for(:name)
154
+ atts.size.should eq 1
155
+ end
156
+
157
+ it "should set an attachment as starred using star method" do
158
+ @document.save_attachment_for(:name, @attachment2)
159
+ att = @document.attachments_for(:name).first
160
+
161
+ @document.star_attachment(att.id)
162
+
163
+ att = @document.find_attachment_by_id(att.id)
164
+ att.starred?.should be_true
165
+ end
166
+
167
+ it "should unstar" do
168
+ @document.save_attachment_for(:name, @attachment, true)
169
+ att = @document.starred_attachments_for(:name).first
170
+
171
+ @document.unstar_attachment(att.id)
172
+
173
+ att = @document.find_attachment_by_id(att.id)
174
+ att.starred?.should be_false
175
+ end
176
+
177
+ end
178
+
179
+
180
+ end
181
+
182
+ end
@@ -0,0 +1,208 @@
1
+ require "spec_helper"
2
+ require "time"
3
+
4
+ describe ActiveMetadata do
5
+
6
+ before(:each) do
7
+ @document = Document.create! { |d| d.name = "John" }
8
+ @document.reload
9
+ end
10
+
11
+ describe "notes" do
12
+
13
+ context "saving and quering" do
14
+
15
+ it "should create a new note for a given field" do
16
+ @document.create_note_for(:name, "Very important note!")
17
+ @document.notes_for(:name).should have(1).record
18
+ end
19
+
20
+
21
+ it "should verify the content of a note created" do
22
+ @document.create_note_for(:name, "Very important note!")
23
+ @document.notes_for(:name).last.note.should eq "Very important note!"
24
+ end
25
+
26
+ it "should verify that notes are created for the correct model" do
27
+ @document.create_note_for(:name, "Very important note!")
28
+ @document.notes_for(:name).last.document_class.should eq(@document.class.to_s)
29
+ end
30
+
31
+ it "should verify the created_by of a note created" do
32
+ @document.create_note_for(:name, "Very important note!")
33
+ @document.notes_for(:name).last.created_by.should eq User.current.id
34
+ end
35
+
36
+ it "should verify that notes_for_name return only notes for the self Document" do
37
+ # fixtures
38
+ @another_doc = Document.create :name => "Andrea"
39
+ @another_doc.create_note_for(:name, "Very important note for doc2!")
40
+ @another_doc.reload
41
+ @document.create_note_for(:name, "Very important note!")
42
+
43
+ # expectations
44
+ @document.notes_for(:name).count.should eq(1)
45
+ @document.notes_for(:name).last.note.should eq "Very important note!"
46
+ @another_doc.notes_for(:name).last.note.should eq "Very important note for doc2!"
47
+
48
+ end
49
+
50
+ it "should update a note using update_note_for_name" do
51
+ @document.create_note_for(:name, "Very important note!")
52
+ id = @document.notes_for(:name).last.id
53
+ @document.update_note(id, "New note value!")
54
+ @document.notes_for(:name).last.note.should eq "New note value!"
55
+ end
56
+
57
+ it "should verify the content of a note created for a second attribute" do
58
+ @document.create_note_for(:name, "Very important note!")
59
+ @document.create_note_for(:surname, "Note on surname attribute!")
60
+
61
+ @document.notes_for(:name).last.note.should eq "Very important note!"
62
+ @document.notes_for(:surname).last.note.should eq "Note on surname attribute!"
63
+ end
64
+
65
+ it "should save multiple notes" do
66
+ notes = ["note number 1", "note number 2"]
67
+ @document.create_notes_for(:name, notes)
68
+ @document.notes_for(:name).should have(2).record
69
+ end
70
+
71
+ it "should save the updater id in metadata" do
72
+ @document.create_note_for(:name, "Very important note!")
73
+ id = @document.notes_for(:name).last.id
74
+ @document.update_note id, "new note value"
75
+ @document.notes_for(:name).last.updated_by.should eq User.current.id
76
+ end
77
+
78
+ it "should save the created_at datetime in metadata" do
79
+ @document.create_note_for(:name, "Very important note!")
80
+ @document.notes_for(:name).last.created_at.should be_a_kind_of Time
81
+ end
82
+
83
+ it "should save the updated_at datetime in metadata" do
84
+ @document.create_note_for(:name, "Very important note!")
85
+ @document.notes_for(:name).last.updated_at.should be_a_kind_of Time
86
+ end
87
+
88
+ it "should update the updated_at field when a note is updated" do
89
+ @document.create_note_for(:name, "Very important note!")
90
+ id = @document.notes_for(:name).last.id
91
+ sleep 1.seconds
92
+ @document.update_note id, "new note value"
93
+ note = @document.notes_for(:name).last
94
+ note.updated_at.should > note.created_at
95
+ end
96
+
97
+ it "should verify that note are saved with the correct model id if metadata_id_from is defined" do
98
+ # fixtures
99
+ @document.create_note_for(:name, "Very important note!")
100
+ @section = @document.create_section :title => "new section"
101
+ @section.reload
102
+ @section.create_note_for(:title, "Very important note for section!")
103
+
104
+ # expectations
105
+ @document.notes_for(:name).last.document_id.should eq @document.id
106
+ @section.notes_for(:title).last.document_id.should eq @document.id
107
+ end
108
+
109
+ it "should delete a note id" do
110
+ #fixtures
111
+ 2.times do |i|
112
+ @document.create_note_for(:name, "Note number #{i}")
113
+ end
114
+
115
+ #expectations
116
+ notes = @document.notes_for(:name)
117
+ notes.count.should eq 2
118
+ note_to_be_deleted = notes[0].note
119
+
120
+ @document.delete_note(notes[0].id)
121
+
122
+ notes = @document.notes_for(:name)
123
+ notes.count.should eq 1
124
+ notes.first.note.should_not eq note_to_be_deleted
125
+
126
+ end
127
+
128
+ it "should verify that notes_for sort by updated_at descending" do
129
+ #fixtures
130
+ 3.times do |i|
131
+ sleep 1.seconds
132
+ @document.create_note_for(:name, "Note number #{i}")
133
+ end
134
+
135
+ #expectations
136
+ @document.notes_for(:name).first.note.should eq "Note number 2"
137
+ @document.notes_for(:name).last.note.should eq "Note number 0"
138
+ end
139
+
140
+ it "should find a note by id" do
141
+
142
+ 3.times do |i|
143
+ @document.create_note_for(:name, "Note number #{i}")
144
+ end
145
+
146
+ note = @document.notes_for(:name).last
147
+ id = note.id
148
+
149
+ match_note = @document.find_note_by_id id
150
+ match_note.id.should eq id
151
+
152
+ end
153
+
154
+ it "should has_notes_for verify if defined field has notes" do
155
+ @document.has_notes_for(:name).should be_false
156
+ @document.create_note_for(:name, "new note")
157
+ @document.has_notes_for(:name).should be_true
158
+ end
159
+
160
+ end
161
+
162
+ describe "managing starred" do
163
+
164
+ it "should craete starred note" do
165
+ @document.create_note_for(:name, "nuova nota", true)
166
+ @document.notes_for(:name).first.starred?.should be_true
167
+ end
168
+
169
+ it "should update a note as starred" do
170
+ @document.create_note_for(:name, "nuova nota")
171
+ note = @document.notes_for(:name).first
172
+ @document.update_note(note.id, note.note, true)
173
+ @document.notes_for(:name).first.starred?.should be_true
174
+ end
175
+
176
+ it "should retrieve only starred notes for a given label" do
177
+ @document.create_note_for(:name, "starred note", true)
178
+ @document.create_note_for(:name, "nuova nota")
179
+
180
+ notes = @document.starred_notes_for(:name)
181
+ notes.size.should eq 1
182
+ notes.first.note.should eq "starred note"
183
+ end
184
+
185
+ it "should set a note as starred using star method" do
186
+ @document.create_note_for(:name, "nota 1")
187
+ nota = @document.notes_for(:name).first
188
+
189
+ @document.star_note(nota.id)
190
+
191
+ nota = @document.find_note_by_id(nota.id)
192
+ nota.starred?.should be_true
193
+ end
194
+
195
+ it "should unstar a note" do
196
+ @document.create_note_for(:name, "nota 1", true)
197
+ nota = @document.notes_for(:name).first
198
+
199
+ @document.unstar_note(nota.id)
200
+
201
+ nota = @document.find_note_by_id(nota.id)
202
+ nota.starred?.should be_false
203
+ end
204
+
205
+ end
206
+
207
+ end
208
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_metadata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-11-14 00:00:00.000000000Z
13
+ date: 2011-11-21 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec-rails
17
- requirement: &2165112740 !ruby/object:Gem::Requirement
17
+ requirement: &70240621249380 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2165112740
25
+ version_requirements: *70240621249380
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: sqlite3
28
- requirement: &2165106080 !ruby/object:Gem::Requirement
28
+ requirement: &70240621248800 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2165106080
36
+ version_requirements: *70240621248800
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3-ruby
39
- requirement: &2165094420 !ruby/object:Gem::Requirement
39
+ requirement: &70240621247520 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2165094420
47
+ version_requirements: *70240621247520
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cucumber
50
- requirement: &2165088920 !ruby/object:Gem::Requirement
50
+ requirement: &70240621247060 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2165088920
58
+ version_requirements: *70240621247060
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ci_reporter
61
- requirement: &2165079800 !ruby/object:Gem::Requirement
61
+ requirement: &70240621246620 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2165079800
69
+ version_requirements: *70240621246620
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rails
72
- requirement: &2165077260 !ruby/object:Gem::Requirement
72
+ requirement: &70240621245860 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - =
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 3.0.1
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *2165077260
80
+ version_requirements: *70240621245860
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: activerecord
83
- requirement: &2165073960 !ruby/object:Gem::Requirement
83
+ requirement: &70240621245240 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - =
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 3.0.1
89
89
  type: :runtime
90
90
  prerelease: false
91
- version_requirements: *2165073960
91
+ version_requirements: *70240621245240
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: paperclip
94
- requirement: &2165067820 !ruby/object:Gem::Requirement
94
+ requirement: &70240621236040 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,18 +99,7 @@ dependencies:
99
99
  version: '0'
100
100
  type: :runtime
101
101
  prerelease: false
102
- version_requirements: *2165067820
103
- - !ruby/object:Gem::Dependency
104
- name: to_xls
105
- requirement: &2165056320 !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- type: :runtime
112
- prerelease: false
113
- version_requirements: *2165056320
102
+ version_requirements: *70240621236040
114
103
  description: First implementation will write metadata on mongodb
115
104
  email:
116
105
  - acampolonghi@gmail.com
@@ -175,9 +164,11 @@ files:
175
164
  - features/watchlist/add_a_user_to_a_watcher.feature
176
165
  - features/watchlist/trigger_alert_on_modify.feature
177
166
  - spec/active_metadata_spec.rb
167
+ - spec/attachments_spec.rb
178
168
  - spec/benchmark_spec.rb
179
169
  - spec/concurrency_spec.rb
180
170
  - spec/controllers/metadata_controller_spec.rb
171
+ - spec/notes_spec.rb
181
172
  - spec/spec_helper.rb
182
173
  - spec/support/document.rb
183
174
  - spec/support/pdf_test.pdf
@@ -199,7 +190,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
199
190
  version: '0'
200
191
  segments:
201
192
  - 0
202
- hash: 1217831110724826394
193
+ hash: -4250317635104951696
203
194
  required_rubygems_version: !ruby/object:Gem::Requirement
204
195
  none: false
205
196
  requirements:
@@ -208,10 +199,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
199
  version: '0'
209
200
  segments:
210
201
  - 0
211
- hash: 1217831110724826394
202
+ hash: -4250317635104951696
212
203
  requirements: []
213
204
  rubyforge_project: active_metadata
214
- rubygems_version: 1.8.11
205
+ rubygems_version: 1.8.10
215
206
  signing_key:
216
207
  specification_version: 3
217
208
  summary: Add metadata to fields in an active record model
@@ -224,9 +215,11 @@ test_files:
224
215
  - features/watchlist/add_a_user_to_a_watcher.feature
225
216
  - features/watchlist/trigger_alert_on_modify.feature
226
217
  - spec/active_metadata_spec.rb
218
+ - spec/attachments_spec.rb
227
219
  - spec/benchmark_spec.rb
228
220
  - spec/concurrency_spec.rb
229
221
  - spec/controllers/metadata_controller_spec.rb
222
+ - spec/notes_spec.rb
230
223
  - spec/spec_helper.rb
231
224
  - spec/support/document.rb
232
225
  - spec/support/pdf_test.pdf