activity_engine 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +12 -0
- data/Gemfile +11 -3
- data/Guardfile +2 -0
- data/Rakefile +16 -0
- data/app/models/activity_engine/activity.rb +13 -0
- data/app/models/activity_engine/statistic.rb +12 -0
- data/lib/activity_engine/activity_data_structure.rb +7 -9
- data/lib/activity_engine/activity_sweeper.rb +39 -0
- data/lib/activity_engine/engine.rb +7 -8
- data/lib/activity_engine/version.rb +1 -1
- data/lib/activity_engine.rb +11 -5
- data/spec/dummy/db/.gitkeep +0 -0
- data/spec/lib/activity_engine/activity_sweeper_spec.rb +24 -0
- data/spec/models/activity_engine/activity_spec.rb +26 -0
- data/spec/models/activity_engine/statistic_spec.rb +18 -0
- data/spec/spec_helper.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe36940c0dacb58105501173923de40fd93f05c3
|
4
|
+
data.tar.gz: d4895b0c5e7ed3e764e0061e9d076286d869d89d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 596cd8e2e546555d3cb3ad035459344d32f12e07149b344487b5c1800fc28b1ccb57d34179766f85d09595cc830cab62d76963c020dcbf0f8089deb253fbc8f2
|
7
|
+
data.tar.gz: aede8f94b3cd189e83a6fd7110d3d7e7e42c097acd840386f2f26424d05ef3289a07b9c1f09597b5b035b718b074c4eb7e732911e51a12ee47b4a31b4e88e96e
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -16,10 +16,18 @@ gem "jquery-rails"
|
|
16
16
|
# To use debugger
|
17
17
|
# gem 'debugger'
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
gem
|
19
|
+
|
20
|
+
group :test, :development do
|
21
|
+
gem 'guard'
|
22
22
|
gem "guard-rspec"
|
23
23
|
gem 'guard-bundler'
|
24
|
+
gem 'guard-livereload'
|
25
|
+
gem 'highline'
|
26
|
+
gem 'rb-inotify', require: false
|
27
|
+
gem 'rb-fsevent', require: false if RUBY_PLATFORM =~ /darwin/i
|
28
|
+
gem 'rb-fchange', require: false
|
29
|
+
gem 'terminal-notifier-guard' if RUBY_PLATFORM =~ /darwin/i
|
30
|
+
gem 'ruby_gntp'
|
31
|
+
gem 'simplecov', require: false
|
24
32
|
gem 'database_cleaner'
|
25
33
|
end
|
data/Guardfile
CHANGED
data/Rakefile
CHANGED
@@ -9,3 +9,19 @@ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
|
9
9
|
load 'rails/tasks/engine.rake'
|
10
10
|
|
11
11
|
Bundler::GemHelper.install_tasks
|
12
|
+
|
13
|
+
task :spec do
|
14
|
+
require 'rspec/core/rake_task'
|
15
|
+
ENV['RAILS_ENV'] = 'test'
|
16
|
+
Rails.env = 'test'
|
17
|
+
Rake::Task["db:drop"].invoke rescue true
|
18
|
+
Rake::Task["db:create"].invoke
|
19
|
+
Rake::Task['environment'].invoke
|
20
|
+
Rake::Task['db:schema:load'].invoke
|
21
|
+
RSpec::Core::RakeTask.new(:__spec) do |t|
|
22
|
+
t.pattern = "./spec/**/*_spec.rb"
|
23
|
+
end
|
24
|
+
Rake::Task['__spec'].invoke
|
25
|
+
end
|
26
|
+
|
27
|
+
task default: :spec
|
@@ -21,6 +21,19 @@ module ActivityEngine
|
|
21
21
|
scope :ascending_date, lambda { order("created_at ASC") }
|
22
22
|
scope :descending_date, lambda { order("created_at DESC") }
|
23
23
|
|
24
|
+
scope :for_stats, lambda {
|
25
|
+
group("#{quoted_table_name}.activity_type").
|
26
|
+
select("#{quoted_table_name}.activity_type,
|
27
|
+
MAX(#{quoted_table_name}.created_at) AS last_activity_date,
|
28
|
+
COUNT(#{quoted_table_name}.id) AS count"
|
29
|
+
)
|
30
|
+
}
|
31
|
+
|
32
|
+
def self.statistics_for_subject(subject)
|
33
|
+
for_subject(subject).for_stats.each_with_object([]) {|stat, collector|
|
34
|
+
collector << ActivityEngine::Statistic.new(subject,stat.attributes)
|
35
|
+
}
|
36
|
+
end
|
24
37
|
|
25
38
|
belongs_to :user
|
26
39
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
module ActivityEngine
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
end
|
2
|
+
ActivityDataStructure = Struct.new(
|
3
|
+
:subject,
|
4
|
+
:current_user,
|
5
|
+
:message,
|
6
|
+
:activity_type
|
7
|
+
)
|
8
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ActivityEngine
|
2
|
+
class ActivitySweeper < ActionController::Caching::Sweeper
|
3
|
+
class << self
|
4
|
+
def observe(*models)
|
5
|
+
models.flatten!
|
6
|
+
models.collect! { |model| model.respond_to?(:to_sym) ? model.to_s.camelize.constantize : model }
|
7
|
+
models.each {|model|
|
8
|
+
model.send(:include, ActiveModel::Observing) unless model.included_modules.include?(ActiveModel::Observing)
|
9
|
+
}
|
10
|
+
models_to_observe = (observed_classes + models).uniq
|
11
|
+
singleton_class.redefine_method(:observed_classes) { models_to_observe }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_accessor :records_processed
|
16
|
+
|
17
|
+
def after(controller)
|
18
|
+
self.controller = controller
|
19
|
+
self.records_processed = []
|
20
|
+
callback(:after)
|
21
|
+
self.records_processed = []
|
22
|
+
self.controller = nil
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def after_save(record)
|
27
|
+
self.records_processed ||= []
|
28
|
+
if ! self.records_processed.include?(record)
|
29
|
+
self.records_processed << record
|
30
|
+
ActivityEngine::Activity.new.tap {|activity|
|
31
|
+
activity.subject = record
|
32
|
+
activity.user = current_user
|
33
|
+
activity.activity_type = "#{controller_name}##{action_name}"
|
34
|
+
}.save!
|
35
|
+
end
|
36
|
+
true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -5,13 +5,12 @@ module ActivityEngine
|
|
5
5
|
config.generators do |g|
|
6
6
|
g.test_framework :rspec, :fixture => false
|
7
7
|
end
|
8
|
-
|
9
|
-
extend ActiveSupport::Autoload
|
10
|
-
eager_autoload do
|
11
|
-
autoload :ContextBuilder
|
12
|
-
autoload :ActivityBuilder
|
13
|
-
autoload :ActivityDataStructure
|
14
|
-
autoload :Activity
|
15
|
-
end
|
16
8
|
end
|
9
|
+
|
10
|
+
extend ActiveSupport::Autoload
|
11
|
+
autoload :ContextBuilder
|
12
|
+
autoload :ActivityBuilder
|
13
|
+
autoload :ActivityDataStructure
|
14
|
+
autoload :ActivitySweeper
|
15
|
+
autoload :Activity
|
17
16
|
end
|
data/lib/activity_engine.rb
CHANGED
@@ -1,11 +1,17 @@
|
|
1
|
-
require
|
2
|
-
require 'activity_engine/context_builder'
|
3
|
-
require 'activity_engine/activity_builder'
|
4
|
-
|
1
|
+
require 'activity_engine/engine'
|
5
2
|
module ActivityEngine
|
6
3
|
module_function
|
4
|
+
def register_models(*models)
|
5
|
+
ActivitySweeper.observe(*models)
|
6
|
+
end
|
7
|
+
|
8
|
+
def register_controller(controller_name, actions)
|
9
|
+
controller_name.constantize.module_exec(actions) do
|
10
|
+
cache_sweeper ActivitySweeper, only: actions
|
11
|
+
end
|
12
|
+
end
|
7
13
|
|
8
|
-
def register(class_name, method_name, activity_receiver =
|
14
|
+
def register(class_name, method_name, activity_receiver = Activity, &config_block)
|
9
15
|
context_builder = ContextBuilder.new(class_name, method_name)
|
10
16
|
activity_builder = ActivityBuilder.new(activity_receiver, config_block)
|
11
17
|
context_builder.wrap!(activity_builder)
|
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActivityEngine::ActivitySweeper do
|
4
|
+
class TestSweeper < ActivityEngine::ActivitySweeper
|
5
|
+
end
|
6
|
+
|
7
|
+
class Book
|
8
|
+
end
|
9
|
+
|
10
|
+
class Animal
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#observe' do
|
14
|
+
it 'should allow multiple registrations' do
|
15
|
+
expect {
|
16
|
+
TestSweeper.observe(:book)
|
17
|
+
}.to change{TestSweeper.observed_classes}.from([]).to([Book])
|
18
|
+
|
19
|
+
expect {
|
20
|
+
TestSweeper.observe(:animal)
|
21
|
+
}.to change{TestSweeper.observed_classes}.from([Book]).to([Book, Animal])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -23,6 +23,32 @@ module ActivityEngine
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
describe '.statistics_for_subject' do
|
27
|
+
let(:stats_builder) {
|
28
|
+
{"hello" => 3, "good_bye" => 2}
|
29
|
+
}
|
30
|
+
before(:each) do
|
31
|
+
stats_builder.each do |activity_type, times|
|
32
|
+
(1..times).each {
|
33
|
+
ActivityEngine::Activity.create { |a|
|
34
|
+
a.subject = object; a.activity_type = activity_type
|
35
|
+
}
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'returns an array of statistics' do
|
41
|
+
stats = ActivityEngine::Activity.statistics_for_subject(object)
|
42
|
+
expect(stats.size).to eq(stats_builder.size)
|
43
|
+
|
44
|
+
stats.each do |stat|
|
45
|
+
expected_count = stats_builder.fetch(stat.activity_type)
|
46
|
+
expect(stat.count).to eq(expected_count)
|
47
|
+
expect(stat).to respond_to(:last_activity_date)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
26
52
|
describe '#subject=' do
|
27
53
|
describe 'with persisted object' do
|
28
54
|
it 'should marshal the subject' do
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe ActivityEngine::Statistic do
|
3
|
+
subject{
|
4
|
+
ActivityEngine::Statistic.new(object, opts)
|
5
|
+
}
|
6
|
+
let(:opts) { {activity_type: activity_type} }
|
7
|
+
let(:object){ Object.new }
|
8
|
+
|
9
|
+
let(:activity_type){ 'activity_type' }
|
10
|
+
it 'should have activity_type and subject when created' do
|
11
|
+
expect( subject.subject ).to eq object
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should assign activity type' do
|
15
|
+
expect( subject.activity_type ).to eq activity_type
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,12 +8,12 @@ if ENV['COVERAGE']
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
11
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
13
12
|
require File.expand_path('../spec_patch', __FILE__)
|
14
13
|
require "rails/test_help"
|
15
14
|
require 'rspec/rails'
|
16
15
|
require 'database_cleaner'
|
16
|
+
require 'activity_engine'
|
17
17
|
|
18
18
|
|
19
19
|
Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activity_engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Friesen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -61,6 +61,7 @@ extra_rdoc_files: []
|
|
61
61
|
files:
|
62
62
|
- .gitignore
|
63
63
|
- .rspec
|
64
|
+
- .travis.yml
|
64
65
|
- Gemfile
|
65
66
|
- Guardfile
|
66
67
|
- LICENSE.txt
|
@@ -74,12 +75,14 @@ files:
|
|
74
75
|
- app/controllers/activity_engine/application_controller.rb
|
75
76
|
- app/helpers/activity_engine/application_helper.rb
|
76
77
|
- app/models/activity_engine/activity.rb
|
78
|
+
- app/models/activity_engine/statistic.rb
|
77
79
|
- app/views/layouts/activity_engine/application.html.erb
|
78
80
|
- config/routes.rb
|
79
81
|
- db/migrate/20130722162331_create_activity_engine_activities.rb
|
80
82
|
- lib/activity_engine.rb
|
81
83
|
- lib/activity_engine/activity_builder.rb
|
82
84
|
- lib/activity_engine/activity_data_structure.rb
|
85
|
+
- lib/activity_engine/activity_sweeper.rb
|
83
86
|
- lib/activity_engine/context_builder.rb
|
84
87
|
- lib/activity_engine/engine.rb
|
85
88
|
- lib/activity_engine/exceptions.rb
|
@@ -114,6 +117,7 @@ files:
|
|
114
117
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
115
118
|
- spec/dummy/config/locales/en.yml
|
116
119
|
- spec/dummy/config/routes.rb
|
120
|
+
- spec/dummy/db/.gitkeep
|
117
121
|
- spec/dummy/db/schema.rb
|
118
122
|
- spec/dummy/lib/assets/.gitkeep
|
119
123
|
- spec/dummy/log/.gitkeep
|
@@ -124,9 +128,11 @@ files:
|
|
124
128
|
- spec/dummy/script/rails
|
125
129
|
- spec/lib/activity_engine/activity_builder_spec.rb
|
126
130
|
- spec/lib/activity_engine/activity_data_structure_spec.rb
|
131
|
+
- spec/lib/activity_engine/activity_sweeper_spec.rb
|
127
132
|
- spec/lib/activity_engine/context_builder_spec.rb
|
128
133
|
- spec/lib/activity_engine_spec.rb
|
129
134
|
- spec/models/activity_engine/activity_spec.rb
|
135
|
+
- spec/models/activity_engine/statistic_spec.rb
|
130
136
|
- spec/spec_helper.rb
|
131
137
|
- spec/spec_patch.rb
|
132
138
|
- spec/support/persistence_layer.rb
|
@@ -180,6 +186,7 @@ test_files:
|
|
180
186
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
181
187
|
- spec/dummy/config/locales/en.yml
|
182
188
|
- spec/dummy/config/routes.rb
|
189
|
+
- spec/dummy/db/.gitkeep
|
183
190
|
- spec/dummy/db/schema.rb
|
184
191
|
- spec/dummy/lib/assets/.gitkeep
|
185
192
|
- spec/dummy/log/.gitkeep
|
@@ -190,9 +197,11 @@ test_files:
|
|
190
197
|
- spec/dummy/script/rails
|
191
198
|
- spec/lib/activity_engine/activity_builder_spec.rb
|
192
199
|
- spec/lib/activity_engine/activity_data_structure_spec.rb
|
200
|
+
- spec/lib/activity_engine/activity_sweeper_spec.rb
|
193
201
|
- spec/lib/activity_engine/context_builder_spec.rb
|
194
202
|
- spec/lib/activity_engine_spec.rb
|
195
203
|
- spec/models/activity_engine/activity_spec.rb
|
204
|
+
- spec/models/activity_engine/statistic_spec.rb
|
196
205
|
- spec/spec_helper.rb
|
197
206
|
- spec/spec_patch.rb
|
198
207
|
- spec/support/persistence_layer.rb
|