streama 0.3.4 → 0.3.5
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/README.md +21 -2
- data/lib/streama/activity.rb +8 -2
- data/lib/streama/actor.rb +6 -0
- data/lib/streama/definition.rb +1 -1
- data/lib/streama/errors.rb +37 -30
- data/lib/streama/version.rb +1 -1
- data/spec/app/models/no_mongoid.rb +10 -0
- data/spec/app/models/user.rb +1 -1
- data/spec/lib/actor_spec.rb +30 -3
- data/spec/lib/definition_spec.rb +1 -1
- data/spec/spec_helper.rb +12 -4
- data/streama.gemspec +1 -0
- metadata +24 -11
data/README.md
CHANGED
@@ -4,8 +4,14 @@
|
|
4
4
|
|
5
5
|
Streama is a simple Ruby activity stream gem for use with the Mongoid ODM framework.
|
6
6
|
|
7
|
+
It works by posting to and querying from a firehose of individual activity items.
|
8
|
+
|
7
9
|
[](http://travis-ci.org/christospappas/streama)
|
8
10
|
|
11
|
+
## Project Tracking
|
12
|
+
|
13
|
+
* [Streama Google Group](http://groups.google.com/group/streama)
|
14
|
+
|
9
15
|
## Install
|
10
16
|
|
11
17
|
gem install streama
|
@@ -88,17 +94,30 @@ current_user.publish_activity(:new_photo, :object => @photo, :target_object => @
|
|
88
94
|
|
89
95
|
## Retrieving Activity
|
90
96
|
|
91
|
-
To retrieve
|
97
|
+
To retrieve the activity stream for an actor
|
92
98
|
|
93
99
|
``` ruby
|
94
100
|
current_user.activity_stream
|
95
101
|
```
|
96
102
|
|
97
|
-
To retrieve and filter
|
103
|
+
To retrieve the activity stream and filter by activity type
|
98
104
|
|
99
105
|
``` ruby
|
100
106
|
current_user.activity_stream(:type => :activity_verb)
|
101
107
|
```
|
108
|
+
|
109
|
+
To retrieve all activities published by an actor
|
110
|
+
|
111
|
+
``` ruby
|
112
|
+
current_user.published_activities
|
113
|
+
```
|
114
|
+
|
115
|
+
To retrieve all activities published by an actor and filtered by activity type
|
116
|
+
|
117
|
+
``` ruby
|
118
|
+
current_user.published_activities(:type => :activity_verb)
|
119
|
+
```
|
120
|
+
|
102
121
|
If you need to return the instance of an :actor, :object or :target_object from an activity call the Activity#load_instance method
|
103
122
|
|
104
123
|
``` ruby
|
data/lib/streama/activity.rb
CHANGED
@@ -60,6 +60,12 @@ module Streama
|
|
60
60
|
query.merge!({:verb => options[:type]}) if options[:type]
|
61
61
|
self.where(query).without(:receivers).desc(:created_at)
|
62
62
|
end
|
63
|
+
|
64
|
+
def stream_of(actor, options={})
|
65
|
+
query = {'actor.id' => actor.id, 'actor.type' => actor.class.to_s}
|
66
|
+
query.merge!({:verb => options[:type]}) if options[:type]
|
67
|
+
self.where(query).without(:receivers).desc(:created_at)
|
68
|
+
end
|
63
69
|
|
64
70
|
end
|
65
71
|
|
@@ -98,13 +104,13 @@ module Streama
|
|
98
104
|
|
99
105
|
class_sym = object.class.name.underscore.to_sym
|
100
106
|
|
101
|
-
raise
|
107
|
+
raise Errors::InvalidData.new(class_sym) unless definition.send(type).has_key?(class_sym)
|
102
108
|
|
103
109
|
hash = {'id' => object.id, 'type' => object.class.name}
|
104
110
|
|
105
111
|
if fields = definition.send(type)[class_sym].try(:[],:cache)
|
106
112
|
fields.each do |field|
|
107
|
-
raise
|
113
|
+
raise Errors::InvalidField.new(field) unless object.respond_to?(field)
|
108
114
|
hash[field.to_s] = object.send(field)
|
109
115
|
end
|
110
116
|
end
|
data/lib/streama/actor.rb
CHANGED
@@ -4,6 +4,8 @@ module Streama
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
+
raise Errors::NotMongoid, "Must be included in a Mongoid::Document" unless self.ancestors.include? Mongoid::Document
|
8
|
+
|
7
9
|
cattr_accessor :activity_klass
|
8
10
|
end
|
9
11
|
|
@@ -31,6 +33,10 @@ module Streama
|
|
31
33
|
activity_class.stream_for(self, options)
|
32
34
|
end
|
33
35
|
|
36
|
+
def published_activities(options = {})
|
37
|
+
activity_class.stream_of(self, options)
|
38
|
+
end
|
39
|
+
|
34
40
|
def activity_class
|
35
41
|
@activity_klass ||= activity_klass ? activity_klass.classify.constantize : ::Activity
|
36
42
|
end
|
data/lib/streama/definition.rb
CHANGED
@@ -32,7 +32,7 @@ module Streama
|
|
32
32
|
|
33
33
|
def self.find(name)
|
34
34
|
unless definition = registered.find{|definition| definition.name == name.to_sym}
|
35
|
-
raise Streama::InvalidActivity, "Could not find a definition for `#{name}`"
|
35
|
+
raise Streama::Errors::InvalidActivity, "Could not find a definition for `#{name}`"
|
36
36
|
else
|
37
37
|
definition
|
38
38
|
end
|
data/lib/streama/errors.rb
CHANGED
@@ -1,44 +1,51 @@
|
|
1
1
|
module Streama
|
2
2
|
|
3
|
-
|
4
|
-
end
|
3
|
+
module Errors
|
5
4
|
|
6
|
-
|
7
|
-
|
5
|
+
class StreamaError < StandardError
|
6
|
+
end
|
8
7
|
|
9
|
-
|
10
|
-
# as an actor, object or target
|
11
|
-
#
|
12
|
-
# Example:
|
13
|
-
#
|
14
|
-
# <tt>InvalidField.new('field_name')</tt>
|
15
|
-
class InvalidData < StreamaError
|
16
|
-
attr_reader :message
|
17
|
-
|
18
|
-
def initialize message
|
19
|
-
@message = "Invalid Data: #{message}"
|
8
|
+
class InvalidActivity < StreamaError
|
20
9
|
end
|
21
|
-
|
22
|
-
end
|
23
10
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
11
|
+
# This error is raised when an object isn't defined
|
12
|
+
# as an actor, object or target
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
#
|
16
|
+
# <tt>InvalidField.new('field_name')</tt>
|
17
|
+
class InvalidData < StreamaError
|
18
|
+
attr_reader :message
|
19
|
+
|
20
|
+
def initialize message
|
21
|
+
@message = "Invalid Data: #{message}"
|
22
|
+
end
|
31
23
|
|
32
|
-
def initialize message
|
33
|
-
@message = "Invalid Field: #{message}"
|
34
24
|
end
|
25
|
+
|
26
|
+
# This error is raised when trying to store a field that doesn't exist
|
27
|
+
#
|
28
|
+
# Example:
|
29
|
+
#
|
30
|
+
# <tt>InvalidField.new('field_name')</tt>
|
31
|
+
class InvalidField < StreamaError
|
32
|
+
attr_reader :message
|
35
33
|
|
36
|
-
|
34
|
+
def initialize message
|
35
|
+
@message = "Invalid Field: #{message}"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
+
class ActivityNotSaved < StreamaError
|
41
|
+
end
|
42
|
+
|
43
|
+
class NoFollowersDefined < StreamaError
|
44
|
+
end
|
40
45
|
|
41
|
-
|
46
|
+
class NotMongoid < StreamaError
|
47
|
+
end
|
48
|
+
|
42
49
|
end
|
43
50
|
|
44
51
|
end
|
data/lib/streama/version.rb
CHANGED
data/spec/app/models/user.rb
CHANGED
data/spec/lib/actor_spec.rb
CHANGED
@@ -5,6 +5,10 @@ describe "Actor" do
|
|
5
5
|
let(:photo) { Photo.create(:comment => "I'm interested") }
|
6
6
|
let(:album) { Album.create(:title => "A test album") }
|
7
7
|
let(:user) { User.create(:full_name => "Christos") }
|
8
|
+
|
9
|
+
it "raises an exception if the class is not a mongoid document" do
|
10
|
+
lambda { NoMongoid.new }.should raise_error Streama::Errors::NotMongoid
|
11
|
+
end
|
8
12
|
|
9
13
|
describe "#publish_activity" do
|
10
14
|
before :each do
|
@@ -26,20 +30,43 @@ describe "Actor" do
|
|
26
30
|
describe "#activity_stream" do
|
27
31
|
|
28
32
|
before :each do
|
29
|
-
2.times { |n| User.create(:full_name => "Receiver #{n}") }
|
30
33
|
user.publish_activity(:new_photo, :object => photo, :target_object => album)
|
31
34
|
user.publish_activity(:new_comment, :object => photo)
|
35
|
+
|
36
|
+
u = User.create(:full_name => "Other User")
|
37
|
+
u.publish_activity(:new_photo, :object => photo, :target_object => album)
|
38
|
+
|
32
39
|
end
|
33
40
|
|
34
41
|
it "retrieves the stream for an actor" do
|
35
|
-
user.activity_stream.size.should eq
|
42
|
+
user.activity_stream.size.should eq 3
|
36
43
|
end
|
37
44
|
|
38
45
|
it "retrieves the stream and filters to a particular activity type" do
|
39
|
-
user.activity_stream(:type => :new_photo).size.should eq
|
46
|
+
user.activity_stream(:type => :new_photo).size.should eq 2
|
40
47
|
end
|
41
48
|
|
42
49
|
end
|
50
|
+
|
51
|
+
describe "#published_activities" do
|
52
|
+
before :each do
|
53
|
+
user.publish_activity(:new_photo, :object => photo, :target_object => album)
|
54
|
+
user.publish_activity(:new_comment, :object => photo)
|
55
|
+
|
56
|
+
u = User.create(:full_name => "Other User")
|
57
|
+
u.publish_activity(:new_photo, :object => photo, :target_object => album)
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
it "retrieves published activities for the actor" do
|
62
|
+
user.published_activities.size.should eq 2
|
63
|
+
end
|
64
|
+
|
65
|
+
it "retrieves and filters published activities by type for the actor" do
|
66
|
+
user.published_activities(:type => :new_photo).size.should eq 1
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
43
70
|
|
44
71
|
|
45
72
|
end
|
data/spec/lib/definition_spec.rb
CHANGED
@@ -57,7 +57,7 @@ describe "Definition" do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it "raises an exception if invalid activity" do
|
60
|
-
lambda { Streama::Definition.find(:unknown_activity) }.should raise_error Streama::InvalidActivity
|
60
|
+
lambda { Streama::Definition.find(:unknown_activity) }.should raise_error Streama::Errors::InvalidActivity
|
61
61
|
end
|
62
62
|
|
63
63
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,13 +9,16 @@ $LOAD_PATH.unshift(SUPPORT)
|
|
9
9
|
require 'streama'
|
10
10
|
require 'mongoid'
|
11
11
|
require 'rspec'
|
12
|
-
|
12
|
+
require 'database_cleaner'
|
13
|
+
|
13
14
|
LOGGER = Logger.new($stdout)
|
14
15
|
DATABASE_ID = Process.pid
|
15
16
|
|
17
|
+
DatabaseCleaner.strategy = :truncation
|
18
|
+
|
16
19
|
Mongoid.configure do |config|
|
17
|
-
database = Mongo::Connection.new.db("
|
18
|
-
database.add_user("
|
20
|
+
database = Mongo::Connection.new.db("streama_#{DATABASE_ID}")
|
21
|
+
database.add_user("streama", "test")
|
19
22
|
config.master = database
|
20
23
|
config.logger = nil
|
21
24
|
end
|
@@ -35,11 +38,16 @@ RSpec.configure do |config|
|
|
35
38
|
config.mock_with :rspec
|
36
39
|
|
37
40
|
config.before(:each) do
|
41
|
+
DatabaseCleaner.start
|
38
42
|
Mongoid::IdentityMap.clear
|
39
43
|
end
|
40
44
|
|
45
|
+
config.after(:each) do
|
46
|
+
DatabaseCleaner.clean
|
47
|
+
end
|
48
|
+
|
41
49
|
config.after :suite do
|
42
|
-
Mongoid.master.connection.drop_database("
|
50
|
+
Mongoid.master.connection.drop_database("streama_#{DATABASE_ID}")
|
43
51
|
end
|
44
52
|
|
45
53
|
end
|
data/streama.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_development_dependency "rspec", "~> 2.5"
|
22
|
+
s.add_development_dependency "database_cleaner", "~> 0.8"
|
22
23
|
s.add_development_dependency "mongoid", "~> 2.4"
|
23
24
|
s.add_development_dependency "bson_ext", "~> 1.5"
|
24
25
|
s.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: streama
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70201716311720 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '2.5'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70201716311720
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: database_cleaner
|
27
|
+
requirement: &70201716311220 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.8'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70201716311220
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: mongoid
|
27
|
-
requirement: &
|
38
|
+
requirement: &70201716310740 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ~>
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: '2.4'
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70201716310740
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: bson_ext
|
38
|
-
requirement: &
|
49
|
+
requirement: &70201716310280 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ~>
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: '1.5'
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70201716310280
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: rake
|
49
|
-
requirement: &
|
60
|
+
requirement: &70201716309880 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,7 +65,7 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70201716309880
|
58
69
|
description: Streama is a simple activity stream gem for use with the Mongoid ODM
|
59
70
|
framework
|
60
71
|
email:
|
@@ -81,6 +92,7 @@ files:
|
|
81
92
|
- lib/streama/version.rb
|
82
93
|
- spec/app/models/activity.rb
|
83
94
|
- spec/app/models/album.rb
|
95
|
+
- spec/app/models/no_mongoid.rb
|
84
96
|
- spec/app/models/photo.rb
|
85
97
|
- spec/app/models/user.rb
|
86
98
|
- spec/lib/activity_spec.rb
|
@@ -109,13 +121,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
121
|
version: '0'
|
110
122
|
requirements: []
|
111
123
|
rubyforge_project: streama
|
112
|
-
rubygems_version: 1.8.
|
124
|
+
rubygems_version: 1.8.17
|
113
125
|
signing_key:
|
114
126
|
specification_version: 3
|
115
127
|
summary: Activity Streams for Mongoid
|
116
128
|
test_files:
|
117
129
|
- spec/app/models/activity.rb
|
118
130
|
- spec/app/models/album.rb
|
131
|
+
- spec/app/models/no_mongoid.rb
|
119
132
|
- spec/app/models/photo.rb
|
120
133
|
- spec/app/models/user.rb
|
121
134
|
- spec/lib/activity_spec.rb
|