activity_engine 0.0.5 → 0.0.6
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.
- 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
|