active_metadata 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/controllers/active_metadata/attachments_controller.rb +1 -1
- data/app/controllers/active_metadata/notes_controller.rb +1 -1
- data/app/controllers/active_metadata/stream_controller.rb +9 -0
- data/app/models/active_metadata/attachment.rb +7 -2
- data/app/models/active_metadata/note.rb +11 -0
- data/app/views/active_metadata/attachments/_attachment.html.erb +1 -1
- data/app/views/active_metadata/attachments/create.js.erb +0 -0
- data/app/views/active_metadata/notes/create.js.erb +0 -0
- data/config/routes.rb +17 -16
- data/db/development.sqlite3 +0 -0
- data/db/migrate/01_create_test_resources.rb +8 -2
- data/db/migrate/02_active_metadata_migrations.rb +2 -0
- data/lib/active_metadata/base.rb +2 -2
- data/lib/active_metadata/persistence/attachment.rb +12 -4
- data/lib/active_metadata/persistence/note.rb +10 -3
- data/lib/active_metadata/stream.rb +50 -0
- data/lib/active_metadata/version.rb +1 -1
- data/spec/controllers/active_metadata/attachments_controller_spec.rb +38 -20
- data/spec/controllers/active_metadata/notes_controller_spec.rb +23 -7
- data/spec/controllers/active_metadata/stream_controller_spec.rb +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +8 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/lib/attachments_spec.rb +18 -2
- data/spec/lib/notes_spec.rb +20 -0
- data/spec/lib/{streamable_spec.rb → stream_spec.rb} +18 -42
- data/spec/routing/active_metadata/stream_controller_routing_spec.rb +7 -2
- data/spec/support/chapter.rb +4 -0
- metadata +13 -8
- data/lib/active_metadata/streamable.rb +0 -40
|
@@ -12,7 +12,7 @@ module ActiveMetadata
|
|
|
12
12
|
|
|
13
13
|
def create
|
|
14
14
|
@document = params[:model_name].to_class.find(params[:model_id])
|
|
15
|
-
@document.save_attachment_for(params[:field_name], params[:file])
|
|
15
|
+
@document.save_attachment_for(params[:field_name], params[:file], params[:starred], params[:group])
|
|
16
16
|
|
|
17
17
|
#todo: if errors send back the correct answer
|
|
18
18
|
respond_to do |format|
|
|
@@ -22,7 +22,7 @@ module ActiveMetadata
|
|
|
22
22
|
|
|
23
23
|
def create
|
|
24
24
|
@document = params[:model_name].to_class.find(params[:model_id])
|
|
25
|
-
@document.create_note_for(params[:field_name], params[:note])
|
|
25
|
+
@document.create_note_for(params[:field_name], params[:note], params[:starred], params[:group])
|
|
26
26
|
respond_to do |format|
|
|
27
27
|
# TODO redirect to edit
|
|
28
28
|
format.js
|
|
@@ -8,5 +8,14 @@ module ActiveMetadata
|
|
|
8
8
|
@stream = @document.stream_for params[:field_name]
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
def index_by_group
|
|
12
|
+
@stream = ActiveMetadata::Stream.by_group params[:group], starred_condition
|
|
13
|
+
render :index
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
def starred_condition
|
|
18
|
+
params[:starred].nil? ? nil : {:starred => true}
|
|
19
|
+
end
|
|
11
20
|
end
|
|
12
21
|
end
|
|
@@ -2,7 +2,6 @@ module ActiveMetadata
|
|
|
2
2
|
|
|
3
3
|
class Attachment < ActiveRecord::Base
|
|
4
4
|
self.table_name = "active_metadata_attachments"
|
|
5
|
-
|
|
6
5
|
include ::Paperclip
|
|
7
6
|
include ::Paperclip::Glue
|
|
8
7
|
|
|
@@ -21,7 +20,13 @@ module ActiveMetadata
|
|
|
21
20
|
Paperclip.interpolates :document_class do |attachment, style|
|
|
22
21
|
attachment.instance.document_class
|
|
23
22
|
end
|
|
23
|
+
class << self
|
|
24
24
|
|
|
25
|
+
def by_group(group, *args)
|
|
26
|
+
options = args.extract_options!
|
|
27
|
+
order_by = options.delete(:order_by) || "created_at DESC"
|
|
28
|
+
ActiveMetadata::Attachment.all(:conditions => options.merge(:group => group), :order => order_by)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
25
31
|
end
|
|
26
|
-
|
|
27
32
|
end
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
module ActiveMetadata
|
|
2
2
|
class Note < ActiveRecord::Base
|
|
3
3
|
self.table_name = "active_metadata_notes"
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
|
|
7
|
+
def by_group(group, *args)
|
|
8
|
+
options = args.extract_options!
|
|
9
|
+
order_by = options.delete(:order_by) || "created_at DESC"
|
|
10
|
+
ActiveMetadata::Note.all(:conditions => options.merge(:group => group), :order => order_by)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
|
|
4
15
|
end
|
|
5
16
|
end
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
<%= "Path: #{attachment.attach.path}"%>
|
|
4
4
|
<%= "Size: #{attachment.attach.size}"%>
|
|
5
5
|
<%= "Updated at: #{attachment.attach.instance_read(:updated_at)}"%> <br/>
|
|
6
|
-
<%= link_to "Elimina", active_metadata_destroy_attachment_path(
|
|
6
|
+
<%= link_to "Elimina", active_metadata_destroy_attachment_path(attachment.document_class, attachment.document_id,attachment.label,attachment.id), :method => :delete, :remote => true %>
|
|
7
7
|
</li>
|
|
File without changes
|
|
File without changes
|
data/config/routes.rb
CHANGED
|
@@ -3,29 +3,30 @@ Rails.application.routes.draw do
|
|
|
3
3
|
namespace :active_metadata do
|
|
4
4
|
#stream
|
|
5
5
|
get ":model_name/:model_id/:field_name/stream" => 'stream#index', :as => 'stream'
|
|
6
|
+
get "groups/:group/stream" => 'stream#index_by_group', :as => 'group_stream'
|
|
6
7
|
|
|
7
8
|
#notes
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
get ':model_name/:model_id/:field_name/notes' => 'notes#index', :as => "notes"
|
|
10
|
+
post ':model_name/:model_id/:field_name/notes' => 'notes#create', :as => "create_note"
|
|
11
|
+
delete ':model_name/:model_id/:field_name/notes/:id' => 'notes#destroy', :as => "destroy_note"
|
|
12
|
+
get ':model_name/:model_id/:field_name/notes/:id/edit' => 'notes#edit', :as => "edit_note"
|
|
13
|
+
put ':model_name/:model_id/:field_name/notes/:id' => 'notes#update', :as => "update_note"
|
|
14
|
+
get ':model_name/:model_id/:field_name/notes/:id' => 'notes#show', :as => "show_note"
|
|
15
|
+
get ':model_name/:model_id/:field_name/notes/starred' => 'notes#starred', :as => "starred_notes"
|
|
16
|
+
put ':model_name/:model_id/:field_name/notes/:id/star' => 'notes#star', :as => "star_note"
|
|
17
|
+
put ':model_name/:model_id/:field_name/notes/:id/unstar' => 'notes#unstar', :as => "unstar_note"
|
|
17
18
|
|
|
18
19
|
#history
|
|
19
20
|
match ':model_name/:model_id/:field_name/histories' => 'histories#index', :via => :get, :as => "histories"
|
|
20
21
|
|
|
21
22
|
#attachments
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
get ':model_name/:model_id/:field_name/attachments' => 'attachments#index', :as => "attachments"
|
|
24
|
+
post ':model_name/:model_id/:field_name/attachments' => 'attachments#create', :as => "create_attachment"
|
|
25
|
+
delete ':model_name/:model_id/:field_name/attachments/:id' => 'attachments#destroy', :as => "destroy_attachment"
|
|
26
|
+
put ':model_name/:model_id/:field_name/attachments/:id' => 'attachments#update', :as => "update_attachment"
|
|
27
|
+
get ':model_name/:model_id/:field_name/attachments/starred' => 'attachments#starred', :as => "starred_attachments"
|
|
28
|
+
put ':model_name/:model_id/:field_name/attachments/:id/star' => 'attachments#star', :as => "star_attachments"
|
|
29
|
+
put ':model_name/:model_id/:field_name/attachments/:id/unstar' => 'attachments#unstar', :as => "unstar_attachments"
|
|
29
30
|
|
|
30
31
|
#alerts
|
|
31
32
|
get ':model_name/:model_id/:field_name/watchers' => 'watchers#index', :as => "watchers"
|
|
Binary file
|
|
@@ -13,6 +13,11 @@ class CreateTestResources < ActiveRecord::Migration
|
|
|
13
13
|
t.timestamps
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
+
create_table :chapters do |t|
|
|
17
|
+
t.string :title
|
|
18
|
+
t.timestamps
|
|
19
|
+
end
|
|
20
|
+
|
|
16
21
|
create_table :users do |t|
|
|
17
22
|
t.string :email
|
|
18
23
|
t.string :firstname
|
|
@@ -23,8 +28,9 @@ class CreateTestResources < ActiveRecord::Migration
|
|
|
23
28
|
end
|
|
24
29
|
|
|
25
30
|
def self.down
|
|
26
|
-
drop_table :documents
|
|
27
|
-
drop_table :sections
|
|
28
31
|
drop_table :users
|
|
32
|
+
drop_table :chapters
|
|
33
|
+
drop_table :sections
|
|
34
|
+
drop_table :documents
|
|
29
35
|
end
|
|
30
36
|
end
|
|
@@ -9,6 +9,7 @@ class ActiveMetadataMigrations < ActiveRecord::Migration
|
|
|
9
9
|
t.integer :created_by
|
|
10
10
|
t.integer :updated_by
|
|
11
11
|
t.boolean :starred
|
|
12
|
+
t.string :group
|
|
12
13
|
t.timestamps
|
|
13
14
|
end
|
|
14
15
|
|
|
@@ -43,6 +44,7 @@ class ActiveMetadataMigrations < ActiveRecord::Migration
|
|
|
43
44
|
t.integer :attach_file_size
|
|
44
45
|
t.datetime :attach_updated_at
|
|
45
46
|
t.boolean :starred
|
|
47
|
+
t.string :group
|
|
46
48
|
t.timestamps
|
|
47
49
|
end
|
|
48
50
|
|
data/lib/active_metadata/base.rb
CHANGED
|
@@ -7,7 +7,7 @@ module ActiveMetadata
|
|
|
7
7
|
module Base
|
|
8
8
|
|
|
9
9
|
require 'active_metadata/helpers'
|
|
10
|
-
require 'active_metadata/
|
|
10
|
+
require 'active_metadata/stream'
|
|
11
11
|
require 'paperclip'
|
|
12
12
|
require 'active_metadata/persistence/persistence'
|
|
13
13
|
|
|
@@ -29,7 +29,7 @@ module ActiveMetadata
|
|
|
29
29
|
|
|
30
30
|
include ActiveMetadata::Base::InstanceMethods
|
|
31
31
|
include ActiveMetadata::Persistence
|
|
32
|
-
include ActiveMetadata::
|
|
32
|
+
include ActiveMetadata::Stream
|
|
33
33
|
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -6,9 +6,16 @@ module ActiveMetadata::Persistence::Attachment
|
|
|
6
6
|
|
|
7
7
|
module InstanceMethods
|
|
8
8
|
|
|
9
|
-
def save_attachment_for(field, file, starred=false)
|
|
10
|
-
attachment = ActiveMetadata::Attachment.create!
|
|
11
|
-
|
|
9
|
+
def save_attachment_for(field, file, starred=false, group=nil)
|
|
10
|
+
attachment = ActiveMetadata::Attachment.create!(
|
|
11
|
+
:document_class => metadata_class,
|
|
12
|
+
:document_id => metadata_id,
|
|
13
|
+
:label => field,
|
|
14
|
+
:attach => file,
|
|
15
|
+
:starred => !!starred,
|
|
16
|
+
:created_by => current_user_id,
|
|
17
|
+
:group => group)
|
|
18
|
+
|
|
12
19
|
reload_attachments_cache_for field
|
|
13
20
|
self.send(:send_notification, field, "", attachment.attach.original_filename, :attachment_message, current_user_id)
|
|
14
21
|
end
|
|
@@ -29,11 +36,12 @@ module ActiveMetadata::Persistence::Attachment
|
|
|
29
36
|
|
|
30
37
|
def update_attachment(id, newfile, starred=nil)
|
|
31
38
|
a = ActiveMetadata::Attachment.find(id)
|
|
39
|
+
puts a
|
|
32
40
|
old_filename = a.attach.original_filename
|
|
33
41
|
a.attach = newfile
|
|
34
42
|
a.updated_by = current_user_id
|
|
35
43
|
a.starred = starred if !starred.nil?
|
|
36
|
-
a.save
|
|
44
|
+
a.save!
|
|
37
45
|
new_filename = a.attach.original_filename
|
|
38
46
|
|
|
39
47
|
reload_attachments_cache_for a.label
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
module ActiveMetadata::Persistence::Note
|
|
2
2
|
|
|
3
|
-
def self.included
|
|
3
|
+
def self.included receiver
|
|
4
4
|
receiver.send :include, InstanceMethods
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
module InstanceMethods
|
|
8
8
|
|
|
9
|
-
def create_note_for(field, note, starred=
|
|
10
|
-
ActiveMetadata::Note.create!
|
|
9
|
+
def create_note_for(field, note, starred=nil, group=nil)
|
|
10
|
+
ActiveMetadata::Note.create!(
|
|
11
|
+
:document_id => metadata_id,
|
|
12
|
+
:document_class => metadata_class,
|
|
13
|
+
:label => field.to_s,
|
|
14
|
+
:note => note,
|
|
15
|
+
:created_by => current_user_id,
|
|
16
|
+
:starred => !!starred,
|
|
17
|
+
:group => group)
|
|
11
18
|
|
|
12
19
|
reload_notes_cache_for field
|
|
13
20
|
self.send(:send_notification, field, "", note, :note_message, current_user_id)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module ActiveMetadata
|
|
2
|
+
module Stream
|
|
3
|
+
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.send :include, InstanceMethods
|
|
6
|
+
end
|
|
7
|
+
class << self
|
|
8
|
+
# same as #stream_for but not filtered by field
|
|
9
|
+
def by_group group, *args
|
|
10
|
+
options = args.extract_options!
|
|
11
|
+
order_by = options.delete(:order_by) || :created_at
|
|
12
|
+
sort_stream(collect_stream_items_by_group(group, options), order_by)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def sort_stream stream, order_by
|
|
16
|
+
stream.sort { |a, b| a.send(order_by) <=> b.send(order_by) }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def collect_stream_items_by_group group, options
|
|
20
|
+
res = []
|
|
21
|
+
ActiveMetadata::CONFIG['streamables'].each do |model|
|
|
22
|
+
res.concat "ActiveMetadata::#{model.to_s.capitalize}".to_class.send(:by_group, group, options).collect { |el| el }
|
|
23
|
+
end
|
|
24
|
+
res
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module InstanceMethods
|
|
29
|
+
|
|
30
|
+
# return the streamables items by field in an ordered array
|
|
31
|
+
# ActiveMetadata::CONFIG['streamables'] defines what models will be retrieved
|
|
32
|
+
def stream_for(field, order_by = :created_at)
|
|
33
|
+
ActiveMetadata::Stream.sort_stream(collect_stream_data(field), order_by)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def collect_stream_data field
|
|
37
|
+
res = []
|
|
38
|
+
ActiveMetadata::CONFIG['streamables'].each do |model|
|
|
39
|
+
res.concat self.send(stream_collect_method(model.to_s), field).collect { |el| el }
|
|
40
|
+
end
|
|
41
|
+
res
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def stream_collect_method model
|
|
45
|
+
model.to_s == 'note' ? 'notes_for' : 'attachments_for'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -2,36 +2,54 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe ActiveMetadata::AttachmentsController do
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
render_views
|
|
6
|
+
|
|
7
|
+
before(:each) do
|
|
8
|
+
@document = Document.create! { |d| d.name = "John" }
|
|
9
|
+
end
|
|
6
10
|
|
|
7
|
-
|
|
11
|
+
|
|
12
|
+
describe "GET 'index'" do
|
|
8
13
|
|
|
9
14
|
before(:each) do
|
|
10
|
-
@document = Document.create! { |d| d.name = "John" }
|
|
11
15
|
(1..2).each do |i|
|
|
12
|
-
@document.save_attachment_for(:name,test_pdf("pdf_test_#{i}"))
|
|
13
|
-
|
|
16
|
+
@document.save_attachment_for(:name, test_pdf("pdf_test_#{i}"))
|
|
17
|
+
end
|
|
14
18
|
end
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
it "should success" do
|
|
21
|
+
get 'index', :model_name => 'document', :model_id => @document.id, :field_name => 'name'
|
|
22
|
+
response.should be_success
|
|
23
|
+
end
|
|
17
24
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
it "should assign attachments" do
|
|
26
|
+
get 'index', :model_name => 'document', :model_id => @document.id, :field_name => 'name'
|
|
27
|
+
assigns(:attachments).should_not be_nil
|
|
28
|
+
assigns(:attachments).size.should eq 2
|
|
29
|
+
end
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
it "should display 3 notes" do
|
|
32
|
+
get 'index', :model_name => 'document', :model_id => @document.id, :field_name => 'name'
|
|
33
|
+
response.body.should match(/pdf_test_1.pdf/)
|
|
34
|
+
response.body.should match(/pdf_test_2.pdf/)
|
|
35
|
+
end
|
|
28
36
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "#create" do
|
|
40
|
+
|
|
41
|
+
it "should create an attachment for a passed group" do
|
|
42
|
+
post :create, :model_name => 'document', :model_id => @document.id, :field_name => 'name', :group => "my_group", :format => :js,
|
|
43
|
+
:file => test_pdf
|
|
44
|
+
response.should be_success
|
|
45
|
+
ActiveMetadata::Stream.by_group("my_group").count.should eq 1
|
|
46
|
+
end
|
|
34
47
|
|
|
48
|
+
it "should create a starred attachment" do
|
|
49
|
+
post :create, :model_name => 'document', :model_id => @document.id, :field_name => 'name', :starred => true, :format => :js,
|
|
50
|
+
:file => test_pdf
|
|
51
|
+
response.should be_success
|
|
52
|
+
@document.attachments_for(:name).last.should be_starred
|
|
35
53
|
end
|
|
36
54
|
|
|
37
55
|
end
|
|
@@ -2,19 +2,21 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe ActiveMetadata::NotesController do
|
|
4
4
|
|
|
5
|
-
context "given 3 notes @document#name" do
|
|
6
|
-
|
|
7
|
-
render_views
|
|
8
5
|
|
|
9
6
|
before(:each) do
|
|
10
7
|
@document = Document.create! { |d| d.name = "John" }
|
|
11
|
-
(1..3).each do |i|
|
|
12
|
-
@document.create_note_for(:name, "note#{i}")
|
|
13
|
-
end
|
|
14
8
|
end
|
|
15
9
|
|
|
16
10
|
describe "GET 'index'" do
|
|
17
11
|
|
|
12
|
+
render_views
|
|
13
|
+
|
|
14
|
+
before(:each) do
|
|
15
|
+
(1..3).each do |i|
|
|
16
|
+
@document.create_note_for(:name, "note#{i}")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
18
20
|
it "should success" do
|
|
19
21
|
get 'index', :model_name => 'document', :model_id => @document.id, :field_name => 'name'
|
|
20
22
|
response.should be_success
|
|
@@ -35,7 +37,21 @@ describe ActiveMetadata::NotesController do
|
|
|
35
37
|
|
|
36
38
|
end
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
describe "#create" do
|
|
41
|
+
|
|
42
|
+
it "should create a note for a passed group" do
|
|
43
|
+
post :create, :model_name => 'document', :model_id => @document.id, :field_name => 'name', :group => "my_group", :format => :js
|
|
44
|
+
response.should be_success
|
|
45
|
+
ActiveMetadata::Stream.by_group("my_group").count.should eq 1
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should create a starred note" do
|
|
49
|
+
post :create, :model_name => 'document', :model_id => @document.id, :field_name => 'name', :starred => true, :format => :js
|
|
50
|
+
response.should be_success
|
|
51
|
+
@document.notes_for(:name).last.should be_starred
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
39
55
|
|
|
40
56
|
|
|
41
57
|
end
|
|
@@ -37,6 +37,28 @@ describe ActiveMetadata::StreamController do
|
|
|
37
37
|
response.body.should match(/nota per name john/)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
describe "GET 'index by group'" do
|
|
41
|
+
before(:each) do
|
|
42
|
+
@chapter = Chapter.create! { |d| d.title = "Cool!" }
|
|
43
|
+
@document.save_attachment_for(:name, test_pdf("pdf_test_1"), false, 'my_group')
|
|
44
|
+
@chapter.save_attachment_for(:title, test_pdf("pdf_test_2"), true, 'my_group')
|
|
45
|
+
@document.create_note_for(:name, "grouped nota per name john", true, 'your_group')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should return the stream of a particular group" do
|
|
49
|
+
get 'index_by_group', :group => 'my_group'
|
|
50
|
+
response.body.should match(/pdf_test_1.pdf/)
|
|
51
|
+
response.body.should match(/pdf_test_2.pdf/)
|
|
52
|
+
response.body.should_not match(/grouped nota/)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should return the stream of a particular group filtered by starred" do
|
|
56
|
+
get 'index_by_group', :group => 'my_group', :starred => true
|
|
57
|
+
response.body.should_not match(/pdf_test_1.pdf/)
|
|
58
|
+
response.body.should match(/pdf_test_2.pdf/)
|
|
59
|
+
response.body.should_not match(/grouped nota/)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
40
62
|
end
|
|
41
63
|
|
|
42
64
|
end
|
|
Binary file
|
data/spec/dummy/db/schema.rb
CHANGED
|
@@ -25,6 +25,7 @@ ActiveRecord::Schema.define(:version => 2) do
|
|
|
25
25
|
t.integer "attach_file_size"
|
|
26
26
|
t.datetime "attach_updated_at"
|
|
27
27
|
t.boolean "starred"
|
|
28
|
+
t.string "group"
|
|
28
29
|
t.datetime "created_at", :null => false
|
|
29
30
|
t.datetime "updated_at", :null => false
|
|
30
31
|
end
|
|
@@ -57,6 +58,7 @@ ActiveRecord::Schema.define(:version => 2) do
|
|
|
57
58
|
t.integer "created_by"
|
|
58
59
|
t.integer "updated_by"
|
|
59
60
|
t.boolean "starred"
|
|
61
|
+
t.string "group"
|
|
60
62
|
t.datetime "created_at", :null => false
|
|
61
63
|
t.datetime "updated_at", :null => false
|
|
62
64
|
end
|
|
@@ -80,6 +82,12 @@ ActiveRecord::Schema.define(:version => 2) do
|
|
|
80
82
|
add_index "active_metadata_watchers", ["label"], :name => "index_active_metadata_watchers_on_label"
|
|
81
83
|
add_index "active_metadata_watchers", ["owner_id"], :name => "index_active_metadata_watchers_on_owner_id"
|
|
82
84
|
|
|
85
|
+
create_table "chapters", :force => true do |t|
|
|
86
|
+
t.string "title"
|
|
87
|
+
t.datetime "created_at", :null => false
|
|
88
|
+
t.datetime "updated_at", :null => false
|
|
89
|
+
end
|
|
90
|
+
|
|
83
91
|
create_table "documents", :force => true do |t|
|
|
84
92
|
t.string "name"
|
|
85
93
|
t.string "surname"
|
data/spec/dummy/db/test.sqlite3
CHANGED
|
Binary file
|
|
@@ -187,11 +187,27 @@ describe ActiveMetadata do
|
|
|
187
187
|
starred.count.should eq 2
|
|
188
188
|
starred.find{|att| att.attach.instance_read(:file_name) == "pdf_test_2.pdf"}.should be_nil
|
|
189
189
|
end
|
|
190
|
-
|
|
191
190
|
end
|
|
192
191
|
|
|
192
|
+
describe "#group" do
|
|
193
|
+
it "should save the associated group when specified" do
|
|
194
|
+
@document.save_attachment_for(:name, @attachment, false, 'my_group')
|
|
195
|
+
@document.attachments_for(:name).last.group.should eq 'my_group'
|
|
196
|
+
end
|
|
193
197
|
|
|
198
|
+
describe ".by_group" do
|
|
194
199
|
|
|
195
|
-
|
|
200
|
+
it "should return all the starred notes of a particular group" do
|
|
201
|
+
@document.save_attachment_for :name, @attachment, false, 'my_group'
|
|
202
|
+
@document.save_attachment_for :title, @attachment, true, 'my_group'
|
|
203
|
+
@document.save_attachment_for :name, @attachment, true, 'my_group'
|
|
204
|
+
@document.save_attachment_for :name, @attachment, false, 'your_group'
|
|
205
|
+
@document.save_attachment_for :name, @attachment, true, 'your_group'
|
|
196
206
|
|
|
207
|
+
ActiveMetadata::Attachment.by_group('my_group', :starred => true).count.should eq 2
|
|
208
|
+
ActiveMetadata::Attachment.by_group('your_group', :starred => true).count.should eq 1
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
197
213
|
end
|
data/spec/lib/notes_spec.rb
CHANGED
|
@@ -217,6 +217,26 @@ describe ActiveMetadata do
|
|
|
217
217
|
end
|
|
218
218
|
|
|
219
219
|
end
|
|
220
|
+
describe "#group" do
|
|
221
|
+
it "should save the associated group when specified" do
|
|
222
|
+
@document.create_note_for :name, "starred note for name", false, 'my_group'
|
|
223
|
+
@document.notes_for(:name).last.group.should eq 'my_group'
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
describe "notes_by_group" do
|
|
227
|
+
it "should return all the starred notes of a particular group" do
|
|
228
|
+
@document.create_note_for :name, "starred note for name", false, 'my_group'
|
|
229
|
+
@document.create_note_for :title, "to be returned", true, 'my_group'
|
|
230
|
+
@document.create_note_for :name, "to be returned", true, 'my_group'
|
|
231
|
+
@document.create_note_for :name, "starred note for name", false, 'your_group'
|
|
232
|
+
@document.create_note_for :name, "starred note for name", true, 'your_group'
|
|
233
|
+
|
|
234
|
+
ActiveMetadata::Note.by_group('my_group', :starred => true).count.should eq 2
|
|
235
|
+
ActiveMetadata::Note.by_group('your_group', :starred => true, :order_by => "created_at ASC").count.should eq 1
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
end
|
|
220
240
|
|
|
221
241
|
end
|
|
222
242
|
end
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
require "spec_helper"
|
|
2
2
|
|
|
3
|
-
describe ActiveMetadata::
|
|
4
|
-
|
|
5
|
-
describe "module" do
|
|
6
|
-
|
|
7
|
-
it "should respond to stream_for" do
|
|
8
|
-
ActiveMetadata::Streamable.instance_eval do
|
|
9
|
-
self.instance_methods.grep(/stream_for/).size.should == 1
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
end
|
|
3
|
+
describe ActiveMetadata::Stream do
|
|
14
4
|
|
|
15
5
|
describe "stream_for" do
|
|
16
6
|
|
|
@@ -40,12 +30,6 @@ describe ActiveMetadata::Streamable do
|
|
|
40
30
|
|
|
41
31
|
describe "collect_data" do
|
|
42
32
|
|
|
43
|
-
it "should exists as private method" do
|
|
44
|
-
ActiveMetadata::Streamable.instance_eval do
|
|
45
|
-
self.private_instance_methods.grep(/collect_stream_data/).size.should == 1
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
33
|
it "should return an array" do
|
|
50
34
|
res = @document.send(:collect_stream_data, :name)
|
|
51
35
|
res.should be_kind_of Array
|
|
@@ -69,14 +53,7 @@ describe ActiveMetadata::Streamable do
|
|
|
69
53
|
|
|
70
54
|
describe "sort_stream" do
|
|
71
55
|
|
|
72
|
-
it "should
|
|
73
|
-
ActiveMetadata::Streamable.instance_eval do
|
|
74
|
-
self.private_instance_methods.grep(/sort_stream/).size.should == 1
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
it "should sort the stream by updated_at DESC" do
|
|
56
|
+
it "should sort the stream by created_at DESC" do
|
|
80
57
|
@document.save_attachment_for(:surname,test_pdf("pdf_test_1"))
|
|
81
58
|
sleep 2.seconds
|
|
82
59
|
@document.create_note_for(:surname, "surname note")
|
|
@@ -84,14 +61,14 @@ describe ActiveMetadata::Streamable do
|
|
|
84
61
|
@document.save_attachment_for(:surname,test_pdf("pdf_test_2"))
|
|
85
62
|
|
|
86
63
|
stream = @document.send(:collect_stream_data, :surname)
|
|
87
|
-
res =
|
|
64
|
+
res = ActiveMetadata::Stream.sort_stream(stream, :updated_at)
|
|
88
65
|
|
|
89
|
-
res[0].attach_file_name.should eq '
|
|
66
|
+
res[0].attach_file_name.should eq 'pdf_test_1.pdf'
|
|
90
67
|
res[1].note.should eq 'surname note'
|
|
91
|
-
res[2].attach_file_name.should eq '
|
|
68
|
+
res[2].attach_file_name.should eq 'pdf_test_2.pdf'
|
|
92
69
|
end
|
|
93
70
|
|
|
94
|
-
it "should sort the stream by
|
|
71
|
+
it "should sort the stream by created_at DESC" do
|
|
95
72
|
@document.create_note_for(:surname, "surname note")
|
|
96
73
|
sleep 2.seconds
|
|
97
74
|
@document.save_attachment_for(:surname,test_pdf("pdf_test_2"))
|
|
@@ -99,11 +76,11 @@ describe ActiveMetadata::Streamable do
|
|
|
99
76
|
@document.save_attachment_for(:surname,test_pdf("pdf_test_1"))
|
|
100
77
|
|
|
101
78
|
stream = @document.send(:collect_stream_data, :surname)
|
|
102
|
-
res =
|
|
79
|
+
res = ActiveMetadata::Stream.sort_stream(stream, :created_at)
|
|
103
80
|
|
|
104
|
-
res[0].
|
|
81
|
+
res[0].note.should eq 'surname note'
|
|
105
82
|
res[1].attach_file_name.should eq 'pdf_test_2.pdf'
|
|
106
|
-
res[2].
|
|
83
|
+
res[2].attach_file_name.should eq 'pdf_test_1.pdf'
|
|
107
84
|
end
|
|
108
85
|
|
|
109
86
|
end
|
|
@@ -131,31 +108,30 @@ describe ActiveMetadata::Streamable do
|
|
|
131
108
|
|
|
132
109
|
end
|
|
133
110
|
|
|
134
|
-
describe "#
|
|
111
|
+
describe "#stream_all_starred_by_group" do
|
|
135
112
|
|
|
136
113
|
context "given 2 notes (only one starred) and 2 attachments (only one starred)" do
|
|
137
114
|
|
|
138
115
|
before(:each) do
|
|
139
116
|
@document = Document.create! { |d| d.name = "John" }
|
|
140
117
|
(1..2).each do |i|
|
|
141
|
-
@document.save_attachment_for(:name,test_pdf("pdf_test_#{i}"), i.odd
|
|
142
|
-
@document.create_note_for(:name, "note_#{i}", i.odd
|
|
118
|
+
@document.save_attachment_for(:name,test_pdf("pdf_test_#{i}"), i.odd?, 'my_group' )
|
|
119
|
+
@document.create_note_for(:name, "note_#{i}", i.odd?, 'my_group' )
|
|
143
120
|
end
|
|
144
121
|
end
|
|
145
122
|
|
|
146
123
|
it "should return 2 elements" do
|
|
147
|
-
|
|
124
|
+
ActiveMetadata::Stream.by_group('my_group', :starred => true).count.should eq 2
|
|
148
125
|
end
|
|
149
126
|
|
|
150
127
|
it "should return only the starred items" do
|
|
151
|
-
|
|
128
|
+
ActiveMetadata::Stream.by_group('my_group', :starred => true).collect{|el| el.starred? }.count.should eq 2
|
|
152
129
|
end
|
|
153
130
|
|
|
154
|
-
it "should return the starred stream ordered by
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
@document.stream_all_starred.first.should be_kind_of ActiveMetadata::Attachment
|
|
131
|
+
it "should return the starred stream ordered by created_at DESC" do
|
|
132
|
+
items = ActiveMetadata::Stream.by_group('my_group', :starred => true)
|
|
133
|
+
items.first.should be_kind_of ActiveMetadata::Attachment
|
|
134
|
+
ActiveMetadata::Stream.by_group('my_group', :starred => true).first.id.should eq items.first.id
|
|
159
135
|
end
|
|
160
136
|
|
|
161
137
|
end
|
|
@@ -7,8 +7,13 @@ describe ActiveMetadata::StreamController do
|
|
|
7
7
|
before(:each) { @routes = Rails.application.routes }
|
|
8
8
|
|
|
9
9
|
it "recognizes and generate :model_name/:model_id/:field_name/stream" do
|
|
10
|
-
{ :get => "/active_metadata/model/12/field/stream" }.should route_to(
|
|
11
|
-
|
|
10
|
+
{ :get => "/active_metadata/model/12/field/stream" }.should route_to(
|
|
11
|
+
:controller => 'active_metadata/stream', :action => 'index', :model_name => 'model', :model_id => '12', :field_name =>'field')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "recognizes and generate group/:group/stream" do
|
|
15
|
+
{ :get => "/active_metadata/groups/my_group/stream" }.should route_to(
|
|
16
|
+
:controller => 'active_metadata/stream', :action => 'index_by_group', :group =>'my_group')
|
|
12
17
|
end
|
|
13
18
|
|
|
14
19
|
|
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.7.
|
|
4
|
+
version: 0.7.1
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2012-
|
|
13
|
+
date: 2012-05-03 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rails
|
|
@@ -145,10 +145,12 @@ files:
|
|
|
145
145
|
- app/models/active_metadata/note.rb
|
|
146
146
|
- app/models/active_metadata/watcher.rb
|
|
147
147
|
- app/views/active_metadata/attachments/_attachment.html.erb
|
|
148
|
+
- app/views/active_metadata/attachments/create.js.erb
|
|
148
149
|
- app/views/active_metadata/attachments/index.html.erb
|
|
149
150
|
- app/views/active_metadata/histories/index.html.erb
|
|
150
151
|
- app/views/active_metadata/notes/_form.html.erb
|
|
151
152
|
- app/views/active_metadata/notes/_note.html.erb
|
|
153
|
+
- app/views/active_metadata/notes/create.js.erb
|
|
152
154
|
- app/views/active_metadata/notes/edit.html.erb
|
|
153
155
|
- app/views/active_metadata/notes/index.html.erb
|
|
154
156
|
- app/views/active_metadata/notes/index.js.erb
|
|
@@ -163,6 +165,7 @@ files:
|
|
|
163
165
|
- config/cucumber.yml
|
|
164
166
|
- config/database.yml
|
|
165
167
|
- config/routes.rb
|
|
168
|
+
- db/development.sqlite3
|
|
166
169
|
- db/migrate/01_create_test_resources.rb
|
|
167
170
|
- db/migrate/02_active_metadata_migrations.rb
|
|
168
171
|
- lib/active_metadata/base.rb
|
|
@@ -174,7 +177,7 @@ files:
|
|
|
174
177
|
- lib/active_metadata/persistence/note.rb
|
|
175
178
|
- lib/active_metadata/persistence/persistence.rb
|
|
176
179
|
- lib/active_metadata/persistence/watcher.rb
|
|
177
|
-
- lib/active_metadata/
|
|
180
|
+
- lib/active_metadata/stream.rb
|
|
178
181
|
- lib/active_metadata/version.rb
|
|
179
182
|
- lib/active_metadata.rb
|
|
180
183
|
- lib/tasks/active_metadata_tasks.rake
|
|
@@ -233,10 +236,11 @@ files:
|
|
|
233
236
|
- spec/lib/concurrency_spec.rb
|
|
234
237
|
- spec/lib/history_spec.rb
|
|
235
238
|
- spec/lib/notes_spec.rb
|
|
236
|
-
- spec/lib/
|
|
239
|
+
- spec/lib/stream_spec.rb
|
|
237
240
|
- spec/lib/watchers_spec.rb
|
|
238
241
|
- spec/routing/active_metadata/stream_controller_routing_spec.rb
|
|
239
242
|
- spec/spec_helper.rb
|
|
243
|
+
- spec/support/chapter.rb
|
|
240
244
|
- spec/support/document.rb
|
|
241
245
|
- spec/support/pdf_test.pdf
|
|
242
246
|
- spec/support/pdf_test_1.pdf
|
|
@@ -259,7 +263,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
259
263
|
version: '0'
|
|
260
264
|
segments:
|
|
261
265
|
- 0
|
|
262
|
-
hash: -
|
|
266
|
+
hash: -1818248447479050482
|
|
263
267
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
264
268
|
none: false
|
|
265
269
|
requirements:
|
|
@@ -268,10 +272,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
268
272
|
version: '0'
|
|
269
273
|
segments:
|
|
270
274
|
- 0
|
|
271
|
-
hash: -
|
|
275
|
+
hash: -1818248447479050482
|
|
272
276
|
requirements: []
|
|
273
277
|
rubyforge_project: active_metadata
|
|
274
|
-
rubygems_version: 1.8.
|
|
278
|
+
rubygems_version: 1.8.21
|
|
275
279
|
signing_key:
|
|
276
280
|
specification_version: 3
|
|
277
281
|
summary: Add metadata to fields in an active record model
|
|
@@ -328,10 +332,11 @@ test_files:
|
|
|
328
332
|
- spec/lib/concurrency_spec.rb
|
|
329
333
|
- spec/lib/history_spec.rb
|
|
330
334
|
- spec/lib/notes_spec.rb
|
|
331
|
-
- spec/lib/
|
|
335
|
+
- spec/lib/stream_spec.rb
|
|
332
336
|
- spec/lib/watchers_spec.rb
|
|
333
337
|
- spec/routing/active_metadata/stream_controller_routing_spec.rb
|
|
334
338
|
- spec/spec_helper.rb
|
|
339
|
+
- spec/support/chapter.rb
|
|
335
340
|
- spec/support/document.rb
|
|
336
341
|
- spec/support/pdf_test.pdf
|
|
337
342
|
- spec/support/pdf_test_1.pdf
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
module ActiveMetadata::Streamable
|
|
2
|
-
|
|
3
|
-
# return the streamables items by field in an ordered array
|
|
4
|
-
# ActiveMetadata::CONFIG['streamables'] defines what models will be retrieved
|
|
5
|
-
def stream_for(field, order_by = :updated_at)
|
|
6
|
-
sort_stream(collect_stream_data(field), order_by)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
# same as #stream_for but not filtered by field
|
|
10
|
-
def stream_all_starred order_by = :updated_at
|
|
11
|
-
sort_stream(collect_starred_stream_data, order_by)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
private
|
|
15
|
-
def sort_stream stream, order_by
|
|
16
|
-
stream.sort{ |a,b| b.send(order_by) <=> a.send(order_by) }
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def collect_stream_data field
|
|
20
|
-
res = []
|
|
21
|
-
ActiveMetadata::CONFIG['streamables'].each do |model|
|
|
22
|
-
res.concat self.send(stream_collect_method(model.to_s),field).collect { |el| el }
|
|
23
|
-
end
|
|
24
|
-
res
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def collect_starred_stream_data
|
|
28
|
-
res = []
|
|
29
|
-
ActiveMetadata::CONFIG['streamables'].each do |model|
|
|
30
|
-
res.concat self.send("starred_#{model.to_s.pluralize}".to_sym).collect { |el| el }
|
|
31
|
-
end
|
|
32
|
-
res
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def stream_collect_method model
|
|
36
|
-
model.to_s == 'note' ? 'notes_for' : 'attachments_for'
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
end
|