evilmarty_activity_stream 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ test/debug.log
18
+ tmp
19
+ .rbenv-gemsets
20
+ .rbenv-version
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in activity_stream.gemspec
4
+ gemspec
5
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 erikecoologic
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,113 @@
1
+ # ActivityStream
2
+
3
+ Activity Stream will keep trace of your activity on the db.
4
+
5
+ This Gem is sutable for whom have installed [the plugin activity_stream by evilmarty](https://github.com/evilmarty/activity_stream) and want to use it with a Gem.
6
+
7
+ All tests are passing.
8
+
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'activity_stream'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install activity_stream
23
+
24
+ ## Usage
25
+
26
+ See below original readme.
27
+
28
+ ## Contributing
29
+
30
+ Contributions are welcome, but be aware that we're not the original developers of the code and our own part was to move the existing code into a Gem.
31
+
32
+ 1. Fork it
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create new Pull Request
37
+
38
+
39
+
40
+
41
+ ActivityStream
42
+ ==============
43
+
44
+ A dead easy way to log activity streams.
45
+
46
+ Installation
47
+ ============
48
+
49
+ script/plugin install http://github.com/evilmarty/activity_stream
50
+
51
+ Then run...
52
+
53
+ script/generate activity_stream
54
+
55
+ this will create the Activity model and place it in your app/models path as a migration file.
56
+
57
+
58
+ DON'T FORGET to add :activity_observer to your config.active_record.observers in environments.rb like so...
59
+
60
+ config.active_record.observers = :activity_observer
61
+
62
+ Usage
63
+ =====
64
+
65
+ For all the models you want to log an activity for do the following...
66
+
67
+ class Comment < ActiveRecord::Base
68
+ log_activities
69
+ end
70
+
71
+ this will log an activity for :create, :update and :destroy. To only log an activity for :create simply say so...
72
+
73
+ class Comment < ActiveRecord::Base
74
+ log_activities :create
75
+ end
76
+
77
+ You can also pass a Proc which can be used to check whether to log the activity or not, just return false
78
+
79
+ class Comment < ActiveRecord::Base
80
+ log_activities :create, :destroy
81
+ log_activities :update do |record|
82
+ record.status == 1
83
+ end
84
+ end
85
+
86
+ and you can call it multiple times for different actions with different Procs
87
+
88
+
89
+ Now once your done with your logging, it's time to define your actors. Like so...
90
+
91
+ class User < ActiveRecord::Base
92
+ acts_as_actor
93
+ end
94
+
95
+ and now when you want to log activities simply do the following in your controllers or wherever you please
96
+
97
+ class CommentsController < ApplicationController
98
+ def create
99
+ current_user.log_activity('web') do
100
+ Comment.create params[:comment]
101
+ end
102
+ end
103
+ end
104
+
105
+ that little argument for log_activity is the context of the activity but you can omit it should you feel so.
106
+
107
+ TODO
108
+ ====
109
+
110
+ * write better doc
111
+ * add support for indirect objects maybe?
112
+
113
+ Copyright (c) 2009 Marty Zalega (evil.marty@gmail.com), released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake'
4
+ require 'rake/testtask'
5
+ require 'rake/rdoctask'
6
+
7
+ desc 'Default: run unit tests.'
8
+ task :default => :test
9
+
10
+ desc 'Test the retrieve_resource plugin.'
11
+ Rake::TestTask.new(:test) do |t|
12
+ t.libs << 'lib'
13
+ t.libs << 'test'
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = true
16
+ end
17
+
18
+ desc 'Generate documentation for the retrieve_resource plugin.'
19
+ Rake::RDocTask.new(:rdoc) do |rdoc|
20
+ rdoc.rdoc_dir = 'rdoc'
21
+ rdoc.title = 'RetrieveResource'
22
+ rdoc.options << '--line-numbers' << '--inline-source'
23
+ rdoc.rdoc_files.include('README')
24
+ rdoc.rdoc_files.include('lib/**/*.rb')
25
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'activity_stream/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "evilmarty_activity_stream"
8
+ gem.version = ActivityStream::VERSION
9
+ gem.authors = ["ecoologic"]
10
+ gem.email = ["erik@netengine.com.au"]
11
+ gem.description = %q{A Gem for the plugin: https://github.com/evilmarty/activity_stream}
12
+ gem.summary = %q{This is a dependency we intend to maintain in order to upgrade our own projects from Rails 2.3.5 to 3.2 (or 4?)}
13
+ gem.homepage = "https://github.com/organizations/net-engine/activity_stream"
14
+
15
+ gem.add_development_dependency 'rake', ['0.8.7']
16
+ gem.add_development_dependency 'rails', ['2.3.16']
17
+ gem.add_development_dependency 'sqlite3'
18
+
19
+
20
+ gem.files = `git ls-files`.split($/)
21
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
22
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
23
+ gem.require_paths = ["lib"]
24
+ end
@@ -0,0 +1 @@
1
+ Just run with no arguments
@@ -0,0 +1,12 @@
1
+ class ActivityStreamGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.file 'models/activity.rb', 'app/models/activity.rb'
5
+ m.migration_template 'migrate/create_activities.rb', 'db/migrate'
6
+ end
7
+ end
8
+
9
+ def file_name
10
+ 'create_activities'
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ class CreateActivities < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :activities do |t|
4
+ t.string :verb, :null => false, :limit => 24
5
+ t.references :actor, :polymorphic => true
6
+ t.references :object, :polymorphic => true
7
+ t.references :indirect_object, :polymorphic => true
8
+ t.string :context, :limit => 32
9
+ t.datetime :timestamp, :null => false
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :activities
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ class Activity < ActiveRecord::Base
2
+ default_scope :order => 'timestamp DESC'
3
+
4
+ belongs_to :actor, :polymorphic => true
5
+ belongs_to :object, :polymorphic => true
6
+ belongs_to :indirect_object, :polymorphic => true
7
+
8
+ validates_presence_of :actor, :object, :verb
9
+
10
+ def before_create
11
+ self.timestamp ||= Time.now
12
+ end
13
+
14
+ def to_s
15
+ default = ["objects.#{object_type.underscore}.#{verb}".intern, "verbs.#{verb}".intern, "#{actor_type.underscore} #{verb} #{object_type.intern}"]
16
+ I18n.t "actors.#{actor_type.underscore}.#{object_type.underscore}.#{verb}", :scope => 'activity_streams', :default => default, :actor => actor, :verb => verb, :object => object, :object_type => object_type
17
+ end
18
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'rails/init.rb'
@@ -0,0 +1,23 @@
1
+ class ActivityObserver < ActiveRecord::Observer
2
+ class << self
3
+ # we don't want to include the activity model
4
+ def observed_class
5
+ nil
6
+ end
7
+ end
8
+
9
+ def update(observed_method, object)
10
+ # check the object isn't an activity
11
+ return if object.is_a? Activity
12
+ context, block = Thread.current[:activity_stream_context], object.class.activity_triggers[observed_method]
13
+ # lets not log an activity if we don't have an actor or isn't an allowed callback
14
+ return unless !!context and (block.is_a?(Proc) ? block.call(object) != false : block == true)
15
+
16
+ verb = observed_method.to_s.gsub /^after_/, ''
17
+
18
+ attributes = context.attributes.merge :verb => verb, :object => object
19
+ attributes[:indirect_object] ||= object.instance_variable_get('@_indirect_object')
20
+
21
+ Activity.create(attributes)
22
+ end
23
+ end
@@ -0,0 +1,223 @@
1
+ require "activity_stream/version"
2
+
3
+ module ActivityStream
4
+ class Context
5
+ attr_reader :attributes
6
+
7
+ def initialize(attributes = {})
8
+ @attributes = attributes
9
+ end
10
+
11
+ def call(&block)
12
+ raise ArgumentError unless block_given?
13
+ current_context = Thread.current[:activity_stream_context]
14
+ Thread.current[:activity_stream_context] = self
15
+
16
+ yield
17
+
18
+ Thread.current[:activity_stream_context] = current_context
19
+ end
20
+
21
+ def to_s
22
+ attributes[:context].to_s
23
+ end
24
+ end
25
+
26
+ module ActiveRecord
27
+ def self.included(base)
28
+ base.extend ClassMethods
29
+ end
30
+
31
+ module ClassMethods
32
+ def activity_triggers
33
+ read_inheritable_attribute(:activity_triggers) || {}
34
+ end
35
+
36
+ def log_activities(*args, &block)
37
+ args = [:create, :update, :destroy] if args.length == 0
38
+
39
+ activity_triggers = self.activity_triggers
40
+ callback = block_given?? block : true
41
+ args.each { |verb| activity_triggers["after_#{verb}".intern] = callback }
42
+ write_inheritable_attribute :activity_triggers, activity_triggers
43
+
44
+ unless defined? @_activity_observed
45
+ has_many :activities, :as => :object do
46
+ def all(options = {})
47
+ klass = proxy_owner.klass
48
+ Scope.new scope_for_reflection(:find => {:conditions => ['object_type = ? OR indirect_object_type = ?', klass.name, klass.name]}), :find => options
49
+ end
50
+
51
+ def indirectly(options = {})
52
+ klass = proxy_owner.klass
53
+ Scope.new scope_for_reflection(:find => {:conditions => {:indirect_object_type => klass.name}}), :find => options
54
+ end
55
+
56
+ def directly(options = {})
57
+ klass = proxy_owner.klass
58
+ Scope.new scope_for_reflection(:find => {:conditions => {:object_type => klass.name}}), :find => options
59
+ end
60
+
61
+ private
62
+ def scope_for_reflection(options)
63
+ Scope.new proxy_reflection.klass, options
64
+ end
65
+ end
66
+
67
+ add_observer ActivityObserver.instance
68
+ # to ensure we don't add the observer multiple times
69
+ @_activity_observed = true
70
+ end
71
+ end
72
+
73
+ def skip_log_activity(*args)
74
+ args = args.map(&:to_sym)
75
+ write_inheritable_attribute :activity_triggers, activity_triggers.reject { |k, v| args.include?("after_#{k}".intern) }
76
+ end
77
+
78
+ def acts_as_actor
79
+ class_eval do
80
+ def log_activity(options = {}, &block)
81
+ raise ArgumentError unless block_given?
82
+
83
+ context = ActivityStream::Context.new options.merge(:actor => self)
84
+ context.call(&block)
85
+ end
86
+
87
+ def log_activity_indirectly_for(record, options = {}, &block)
88
+ log_activity options.merge(:indirect_object => record), &block
89
+ end
90
+ end
91
+
92
+ has_many :activities, :as => :actor
93
+ end
94
+ end
95
+ end
96
+
97
+ module AssociationProxy
98
+ def self.included(base)
99
+ base.class_eval do
100
+ private
101
+ def find_indirect_object
102
+ # we don't want activity to be our indirect object
103
+ return nil if @owner.class == Activity
104
+
105
+ # tried to use memoize but too many errors, bah!
106
+ @indirect_object ||= if @owner.class.respond_to?(:activity_triggers)
107
+ @owner
108
+ elsif ivar = @owner.instance_variable_get('@_indirect_object')
109
+ ivar
110
+ else
111
+ nil
112
+ end
113
+ end
114
+
115
+ def tag_with_indirect_object(record)
116
+ record.instance_variable_set '@_indirect_object', find_indirect_object if find_indirect_object
117
+ end
118
+
119
+ def set_belongs_to_association_for_with_indirect_object(record)
120
+ tag_with_indirect_object record
121
+ set_belongs_to_association_for_without_indirect_object record
122
+ end
123
+ alias_method_chain :set_belongs_to_association_for, :indirect_object
124
+ end
125
+ end
126
+ end
127
+
128
+ module AssociationCollection
129
+ def self.included(base)
130
+ base.class_eval do
131
+
132
+ end
133
+ end
134
+ end
135
+
136
+ module BelongsToAssociation
137
+ def self.included(base)
138
+ base.class_eval do
139
+ def replace_with_indirect_object(record)
140
+ tag_with_indirect_object record
141
+ replace_without_indirect_object record
142
+ end
143
+ alias_method_chain :replace, :indirect_object
144
+
145
+ def find_target_with_indirect_object
146
+ record = find_target_without_indirect_object
147
+ tag_with_indirect_object record
148
+ record
149
+ end
150
+ alias_method_chain :find_target, :indirect_object
151
+ end
152
+ end
153
+ end
154
+
155
+ module HasOneAssociation
156
+ def self.included(base)
157
+ base.class_eval do
158
+ def replace_with_indirect_object(*args)
159
+ tag_with_indirect_object args.first
160
+ replace_without_indirect_object *args
161
+ end
162
+ alias_method_chain :replace, :indirect_object
163
+
164
+ def new_record_with_indirect_object(replace_existing, &block)
165
+ new_record_without_indirect_object replace_existing do |reflection|
166
+ record = block.call reflection
167
+ # if we are going to replace_existing, this'll get done in our
168
+ # replace_with_parental_control above - no point in doing it twice
169
+ tag_with_indirect_object record unless replace_existing
170
+ record
171
+ end
172
+ end
173
+ alias_method_chain :new_record, :indirect_object
174
+
175
+ def find_target_with_indirect_object
176
+ record = find_target_without_indirect_object
177
+ tag_with_indirect_object record
178
+ record
179
+ end
180
+ alias_method_chain :find_target, :indirect_object
181
+ end
182
+ end
183
+ end
184
+
185
+ module HasManyAssociation
186
+ def self.included(base)
187
+ base.class_eval do
188
+ def add_record_to_target_with_callbacks_with_indirect_object(record, &block)
189
+ tag_with_indirect_object record
190
+ add_record_to_target_with_callbacks_without_indirect_object record, &block
191
+ end
192
+ alias_method_chain :add_record_to_target_with_callbacks, :indirect_object
193
+
194
+ def find_target_with_indirect_object
195
+ records = find_target_without_indirect_object
196
+ records.each { |record| tag_with_indirect_object(record) }
197
+ records
198
+ end
199
+ alias_method_chain :find_target, :indirect_object
200
+ end
201
+
202
+ end
203
+ end
204
+
205
+ module BelongsToPolymorphicAssociation
206
+ def self.included(base)
207
+ base.class_eval do
208
+ def replace_with_indirect_object(record)
209
+ tag_with_indirect_object record
210
+ replace_without_indirect_object record
211
+ end
212
+ alias_method_chain :replace, :indirect_object
213
+
214
+ def find_target_with_indirect_object
215
+ record = find_target_without_indirect_object
216
+ tag_with_indirect_object record
217
+ record
218
+ end
219
+ alias_method_chain :find_target, :indirect_object
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,2 @@
1
+ ## v1.0.0
2
+ * 2/2/2013 ecoologic - releasing the gem (for rake 0.8.7)
@@ -0,0 +1,3 @@
1
+ module ActivityStream
2
+ VERSION = "1.0.0" # for rails 2.3.5, rake 0.8.7
3
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module ActivityStream
2
+ VERSION = "1.0.0" # for rails 2.3.5, rake 0.8.7
3
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'activity_stream'
2
+ require 'activity_observer'
3
+
4
+ ActiveRecord::Base.class_eval { include ActivityStream::ActiveRecord }
5
+ ActiveRecord::Associations::AssociationProxy.class_eval { include ActivityStream::AssociationProxy }
6
+ ActiveRecord::Associations::BelongsToAssociation.class_eval { include ActivityStream::BelongsToAssociation }
7
+ ActiveRecord::Associations::HasOneAssociation.class_eval { include ActivityStream::HasOneAssociation }
8
+ ActiveRecord::Associations::HasManyAssociation.class_eval { include ActivityStream::HasManyAssociation }
9
+ ActiveRecord::Associations::BelongsToPolymorphicAssociation.class_eval { include ActivityStream::BelongsToPolymorphicAssociation }
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :activity_stream do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,68 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+
3
+ class ActivityStreamTest < ActiveSupport::TestCase
4
+ load_schema
5
+ load_fixtures
6
+ load_activity_model
7
+
8
+ def test_model_actor_setup
9
+ assert @person = Person.first
10
+ assert_respond_to @person, :log_activity
11
+ assert_respond_to @person, :activities
12
+ end
13
+
14
+ def test_model_activity_setup
15
+ assert @comment = Comment.first
16
+ assert_respond_to Comment, :log_activities
17
+ assert_respond_to Comment, :activity_triggers
18
+ assert_instance_of Hash, Comment.activity_triggers
19
+ assert_equal true, Comment.activity_triggers[:after_create]
20
+ assert_instance_of Proc, Comment.activity_triggers[:after_update]
21
+ assert_instance_of Proc, Comment.activity_triggers[:after_destroy]
22
+ assert_equal 1, Comment.count_observers
23
+ assert_respond_to @comment, :activities
24
+ assert_respond_to @comment.activities, :indirectly
25
+ assert_respond_to @comment.activities, :directly
26
+ end
27
+
28
+ def test_activity_observer
29
+ assert_respond_to ActivityObserver, :instance
30
+ end
31
+
32
+ def test_log_activity
33
+ assert @person = Person.first
34
+ Activity.delete_all
35
+ @person.log_activity do
36
+ @comment = @person.comments.build(:message => "I'm going to leave an activity")
37
+ assert @comment.save
38
+ end
39
+ assert @activity = Activity.first
40
+ assert_equal @person, @activity.actor
41
+ assert_equal @comment, @activity.object
42
+ end
43
+
44
+ def test_indirect_object
45
+ Activity.delete_all
46
+ assert @person = Person.last
47
+ assert @post = Post.first
48
+ assert @comment = @post.comments.build(:message => 'testing indirect object')
49
+
50
+ @person.log_activity do
51
+ assert @comment.save
52
+ end
53
+ assert_equal @post, Activity.first.indirect_object
54
+ end
55
+
56
+ def test_explicit_indirect_object
57
+ Activity.delete_all
58
+ assert @person = Person.last
59
+ assert @post = Post.first
60
+ assert @other_post = Post.last
61
+ assert_not_equal @post, @other_post
62
+
63
+ @person.log_activity_indirectly_for(@other_post) do
64
+ assert @post.comments.create :message => 'testing explicit indirect'
65
+ end
66
+ assert_equal @other_post, Activity.first.indirect_object
67
+ end
68
+ end
data/test/database.yml ADDED
@@ -0,0 +1,22 @@
1
+ sqlite3:
2
+ database: ":memory:"
3
+ adapter: sqlite3
4
+ timeout: 500
5
+
6
+ sqlite2:
7
+ database: ":memory:"
8
+ adapter: sqlite2
9
+
10
+ mysql:
11
+ adapter: mysql
12
+ username: root
13
+ password:
14
+ encoding: utf8
15
+ database: activity_stream_unittest
16
+
17
+ postgres:
18
+ adapter: postgresql
19
+ username: root
20
+ password:
21
+ database: activity_stream_unittest
22
+ min_messages: warning
@@ -0,0 +1,16 @@
1
+ class Comment < ActiveRecord::Base
2
+ belongs_to :person
3
+ belongs_to :post
4
+
5
+ log_activities :create
6
+ log_activities :update do |record|
7
+ true
8
+ end
9
+ log_activities :destroy do |record|
10
+ false
11
+ end
12
+
13
+ def to_s
14
+ message
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ witty_comment:
2
+ id: 1
3
+ person_id: 1
4
+ post_id: 1
5
+ message: "Birdman is better!"
6
+
7
+ plea_comment:
8
+ id: 2
9
+ person_id: 1
10
+ post_id: 1
11
+ message: "I beg of you wont someone please think of the children"
12
+
13
+ robbery:
14
+ id: 3
15
+ person_id: 2
16
+ post_id: 2
17
+ message: "Nobody this is a robbery!"
@@ -0,0 +1,9 @@
1
+ john:
2
+ id: 1
3
+ firstname: John
4
+ lastname: Doe
5
+
6
+ jane:
7
+ id: 2
8
+ firstname: Jane
9
+ lastname: Doe
@@ -0,0 +1,10 @@
1
+ class Person < ActiveRecord::Base
2
+ has_many :comments
3
+ has_many :posts
4
+
5
+ acts_as_actor
6
+
7
+ def to_s
8
+ "#{firstname} #{lastname}"
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class Post < ActiveRecord::Base
2
+ belongs_to :person
3
+
4
+ has_many :comments
5
+
6
+ log_activities
7
+
8
+ def to_s
9
+ message
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ simple_post:
2
+ id: 1
3
+ message: "Blah blah blah, yap yap yap"
4
+ person_id: 1
5
+
6
+ simpler_post:
7
+ id: 2
8
+ message: "hello!"
9
+ person_id: 2
data/test/schema.rb ADDED
@@ -0,0 +1,15 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+ create_table :people, :force => true do |t|
3
+ t.string :firstname
4
+ t.string :lastname
5
+ t.timestamps
6
+ end
7
+ create_table :posts, :force => true do |t|
8
+ t.string :message
9
+ t.references :person
10
+ end
11
+ create_table :comments, :force => true do |t|
12
+ t.string :message
13
+ t.references :person, :post
14
+ end
15
+ end
@@ -0,0 +1,54 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+ ENV['RAILS_ROOT'] ||= File.dirname(__FILE__) + '/../../../..'
3
+
4
+ require 'test/unit'
5
+ require 'yaml'
6
+ require 'rubygems'
7
+ require 'active_record'
8
+ require 'active_record/version'
9
+ require 'active_record/fixtures'
10
+
11
+ require File.join(File.dirname(__FILE__), '..', 'init.rb')
12
+
13
+ def load_schema
14
+ config = YAML::load(IO.read(File.join(File.dirname(__FILE__), 'database.yml')))
15
+ ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "/debug.log"))
16
+
17
+ db_adapter = ENV['DB']
18
+
19
+ # no db passed, try one of these fine config-free DBs before bombing.
20
+ db_adapter ||=
21
+ begin
22
+ require 'rubygems'
23
+ require 'sqlite'
24
+ 'sqlite'
25
+ rescue MissingSourceFile
26
+ begin
27
+ require 'sqlite3'
28
+ 'sqlite3'
29
+ rescue MissingSourceFile
30
+ end
31
+ end
32
+
33
+ if db_adapter.nil?
34
+ raise "No DB Adapter selected. Pass the DB= option to pick one, or install Sqlite or Sqlite3."
35
+ end
36
+
37
+ ActiveRecord::Base.establish_connection(config[db_adapter])
38
+ load(File.join(File.dirname(__FILE__), "schema.rb"))
39
+ end
40
+
41
+ def load_fixtures
42
+ filepath = File.join(File.dirname(__FILE__), 'fixtures')
43
+ ActiveSupport::Dependencies.load_paths.unshift filepath
44
+ Fixtures.create_fixtures(filepath, ActiveRecord::Base.connection.tables)
45
+ end
46
+
47
+ def load_activity_model
48
+ template_path = File.join(File.dirname(__FILE__), '..', 'generators', 'activity_stream', 'templates')
49
+
50
+ load(File.join(template_path, 'migrate', 'create_activities.rb'))
51
+ CreateActivities.up
52
+
53
+ load(File.join(template_path, 'models', 'activity.rb'))
54
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evilmarty_activity_stream
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - ecoologic
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-02-02 00:00:00 +10:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rake
23
+ prerelease: false
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 49
30
+ segments:
31
+ - 0
32
+ - 8
33
+ - 7
34
+ version: 0.8.7
35
+ type: :development
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rails
39
+ prerelease: false
40
+ version_requirements: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - "="
44
+ - !ruby/object:Gem::Version
45
+ hash: 35
46
+ segments:
47
+ - 2
48
+ - 3
49
+ - 16
50
+ version: 2.3.16
51
+ type: :development
52
+ requirement: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: sqlite3
55
+ prerelease: false
56
+ version_requirements: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ requirement: *id003
67
+ description: "A Gem for the plugin: https://github.com/evilmarty/activity_stream"
68
+ email:
69
+ - erik@netengine.com.au
70
+ executables: []
71
+
72
+ extensions: []
73
+
74
+ extra_rdoc_files: []
75
+
76
+ files:
77
+ - .gitignore
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README
81
+ - Rakefile
82
+ - activity_stream.gemspec
83
+ - generators/activity_stream/USAGE
84
+ - generators/activity_stream/activity_stream_generator.rb
85
+ - generators/activity_stream/templates/migrate/create_activities.rb
86
+ - generators/activity_stream/templates/models/activity.rb
87
+ - init.rb
88
+ - lib/activity_observer.rb
89
+ - lib/activity_stream.rb
90
+ - lib/activity_stream/CHANGELOG.md
91
+ - lib/activity_stream/version.rb
92
+ - lib/version.rb
93
+ - rails/init.rb
94
+ - tasks/activity_stream_tasks.rake
95
+ - test/activity_stream_test.rb
96
+ - test/database.yml
97
+ - test/fixtures/comment.rb
98
+ - test/fixtures/comments.yml
99
+ - test/fixtures/people.yml
100
+ - test/fixtures/person.rb
101
+ - test/fixtures/post.rb
102
+ - test/fixtures/posts.yml
103
+ - test/schema.rb
104
+ - test/test_helper.rb
105
+ has_rdoc: true
106
+ homepage: https://github.com/organizations/net-engine/activity_stream
107
+ licenses: []
108
+
109
+ post_install_message:
110
+ rdoc_options: []
111
+
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ requirements: []
133
+
134
+ rubyforge_project:
135
+ rubygems_version: 1.6.2
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: This is a dependency we intend to maintain in order to upgrade our own projects from Rails 2.3.5 to 3.2 (or 4?)
139
+ test_files:
140
+ - test/activity_stream_test.rb
141
+ - test/database.yml
142
+ - test/fixtures/comment.rb
143
+ - test/fixtures/comments.yml
144
+ - test/fixtures/people.yml
145
+ - test/fixtures/person.rb
146
+ - test/fixtures/post.rb
147
+ - test/fixtures/posts.yml
148
+ - test/schema.rb
149
+ - test/test_helper.rb