redcrumbs 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Redcrumbs::Options do
4
+ describe '.redcrumbs_callback_options' do
5
+ context 'with empty configuration' do
6
+ let!(:default_options) { Game.redcrumbs_options.dup }
7
+
8
+ before { Game.prepare_redcrumbed_options({}) }
9
+ after { Game.prepare_redcrumbed_options(default_options) }
10
+
11
+ subject { Game.redcrumbs_callback_options }
12
+
13
+ it { is_expected.not_to have_key(:if) }
14
+ it { is_expected.not_to have_key(:unless) }
15
+ end
16
+
17
+ context 'with explicit configuration' do
18
+ let!(:options){ {:store => {:only =>[:id, :name]}, :if => :new_record?, :unless => :persisted?} }
19
+ let!(:default_options) { Game.redcrumbs_options.dup }
20
+
21
+ before { Game.prepare_redcrumbed_options(options) }
22
+ after { Game.prepare_redcrumbed_options(default_options) }
23
+
24
+ subject { Game.redcrumbs_callback_options }
25
+
26
+ it { is_expected.to have_key(:if) }
27
+ it { is_expected.to have_key(:unless) }
28
+ it { is_expected.not_to have_key(:store) }
29
+
30
+ it { is_expected.to include(:if => :new_record?) }
31
+ it { is_expected.to include(:unless => :persisted?) }
32
+ end
33
+ end
34
+
35
+
36
+ describe '.redcrumbs_options' do
37
+ context 'with empty configuration' do
38
+ let!(:default_options) { Game.redcrumbs_options.dup }
39
+
40
+ before { Game.prepare_redcrumbed_options({}) }
41
+ after { Game.prepare_redcrumbed_options(default_options) }
42
+
43
+ subject { Game.redcrumbs_options }
44
+
45
+ it { is_expected.to have_key(:only) }
46
+ it { is_expected.to have_key(:store) }
47
+
48
+ it { is_expected.to include(:only => []) }
49
+ it { is_expected.to include(:store => {}) }
50
+ end
51
+
52
+ context 'with explicit configuration' do
53
+ let!(:options){ {'only' => [:id, :name], :store => {:only => [:name]}} }
54
+ let!(:default_options) { Game.redcrumbs_options.dup }
55
+
56
+ before { Game.prepare_redcrumbed_options(options) }
57
+ after { Game.prepare_redcrumbed_options(default_options) }
58
+
59
+ subject { Game.redcrumbs_options }
60
+
61
+ it { is_expected.to have_key(:only) }
62
+ it { is_expected.to have_key(:store) }
63
+
64
+ it { is_expected.not_to have_key('only')}
65
+
66
+ it { is_expected.to include(:only => [:id, :name]) }
67
+ it { is_expected.to include(:store => {:only => [:name]}) }
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Redcrumbs::SerializableAssociation do
4
+ let(:foo) { Class.new { include Redcrumbs::SerializableAssociation } }
5
+
6
+ describe 'self.serializable_association' do
7
+ context 'when including module' do
8
+ subject { foo.new }
9
+ it { expect(foo).to respond_to(:serializable_association).with(1).argument }
10
+ end
11
+
12
+ context 'when given a valid association' do
13
+ subject { foo.new }
14
+ before { foo.serializable_association(:creator) }
15
+
16
+ it { expect(foo.serializable_association(:creator)).to be_truthy }
17
+ it { is_expected.to respond_to(:creator_id).with(0).arguments }
18
+ it { is_expected.to respond_to(:creator_id=).with(1).arguments }
19
+ it { is_expected.to respond_to(:creator_type).with(0).arguments }
20
+ it { is_expected.to respond_to(:creator_type=).with(1).arguments }
21
+ it { is_expected.to respond_to(:stored_creator).with(0).arguments }
22
+ it { is_expected.to respond_to(:stored_creator=).with(1).arguments }
23
+ it { is_expected.to respond_to(:creator).with(0).arguments }
24
+ it { is_expected.to respond_to(:creator=).with(1).arguments }
25
+ it { is_expected.to respond_to(:full_creator).with(0).arguments }
26
+ it { is_expected.to respond_to(:has_loaded_creator?).with(0).arguments }
27
+ end
28
+
29
+ context 'when given an invalid association' do
30
+ subject { foo.new }
31
+ it { expect {foo.serializable_association(:bar)}.to raise_error(ArgumentError) }
32
+ end
33
+ end
34
+
35
+ context "inclusion of module" do
36
+ it 'should define a public load_associated method' do
37
+ expect(foo.new).to respond_to(:load_associated).with(1).arguments
38
+ end
39
+ end
40
+
41
+
42
+ describe '.serialize' do
43
+ let(:player) { Player.create(:name => "John Hope") }
44
+ let(:game) { Game.create(:name => 'Paperboy', :highscore => 0)}
45
+ let(:new_foo) { foo.new }
46
+
47
+ before { Redcrumbs.store_creator_attributes = [:id, :name] }
48
+
49
+ context 'when serializing subject' do
50
+ subject { new_foo.send('serialize', :subject, game) }
51
+ it { is_expected.to eq(game.attributes.slice('id', 'name')) }
52
+ end
53
+
54
+ context 'when serializing creator' do
55
+ subject { new_foo.send('serialize', :creator, player) }
56
+ it { is_expected.to eq(player.attributes.slice('id', 'name')) }
57
+ end
58
+ end
59
+
60
+
61
+ describe '.deserialize' do
62
+ let(:player) { Player.create(:name => "John Hope") }
63
+ let(:new_foo) { foo.new }
64
+
65
+ before { foo.serializable_association :creator }
66
+
67
+ context 'with no stored attributes' do
68
+ subject { new_foo.send('deserialize', :creator) }
69
+
70
+ it { is_expected.to be_nil }
71
+ end
72
+
73
+ context 'with stored attributes' do
74
+ before do
75
+ new_foo.creator_type = player.class.name
76
+ new_foo.stored_creator = {id: player.id, name: player.name}
77
+ new_foo.creator_id = player.id
78
+ end
79
+
80
+ subject { new_foo.send('deserialize', :creator) }
81
+
82
+ it { is_expected.to have_attributes(id: player.id) }
83
+ it { is_expected.to have_attributes(name: player.name) }
84
+ end
85
+
86
+ context 'when creator_type nil' do
87
+ before do
88
+ Redcrumbs.creator_class_sym = :player
89
+
90
+ new_foo.stored_creator = { name: player.name }
91
+ new_foo.creator_id = player.id
92
+ end
93
+
94
+ after { Redcrumbs.creator_class_sym = :user }
95
+
96
+ subject { new_foo.send('deserialize', :creator) }
97
+
98
+ it { is_expected.to have_attributes(name: player.name) }
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe Redcrumbs::Users do
4
+ let(:computer_player) { ComputerPlayer.create(:name => 'Jon Hope') }
5
+ let(:player) { Player.create(:name => 'Jon Hope') }
6
+
7
+ let!(:crumb_1) do
8
+ c = Redcrumbs::Crumb.new
9
+ c.creator = computer_player
10
+ c.save
11
+ c
12
+ end
13
+
14
+ let!(:crumb_2) do
15
+ c = Redcrumbs::Crumb.new
16
+ c.creator = computer_player
17
+ c.save
18
+ c
19
+ end
20
+
21
+ let!(:crumb_3) do
22
+ c = Redcrumbs::Crumb.new
23
+ c.creator = player
24
+ c.target = computer_player
25
+ c.save
26
+ c
27
+ end
28
+
29
+
30
+ describe '.crumbs_by' do
31
+ context 'when in reverse order' do
32
+ subject { computer_player.crumbs_by(:order => [:created_at.desc, :id.desc]) }
33
+
34
+ it { is_expected.to eq([crumb_2, crumb_1])}
35
+ end
36
+ end
37
+
38
+
39
+ describe '.crumbs_for' do
40
+ context 'when in reverse order' do
41
+ subject { computer_player.crumbs_for(:order => [:created_at.desc, :id.desc]) }
42
+
43
+ it { is_expected.to eq([crumb_3]) }
44
+ end
45
+ end
46
+
47
+
48
+ describe '.crumbs_as_user' do
49
+ context 'when in reverse order' do
50
+ subject { computer_player.crumbs_as_user(:order => [:created_at.desc, :id.desc]) }
51
+
52
+ it { is_expected.to eq([crumb_3, crumb_2, crumb_1]) }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,27 @@
1
+ require 'codeclimate-test-reporter'
2
+ CodeClimate::TestReporter.start
3
+
4
+ require 'redcrumbs'
5
+
6
+ require 'bundler'
7
+ Bundler.require(:test)
8
+
9
+ RSpec.configure do |c|
10
+ c.before(:suite) do
11
+ Redcrumbs.redis = 'localhost:6379'
12
+ I18n.config.enforce_available_locales = true
13
+ CreateSchema.suppress_messages{ CreateSchema.migrate(:up) }
14
+ end
15
+
16
+ c.before(:each) do
17
+ Redcrumbs.redis.flushdb
18
+ end
19
+
20
+ c.after(:suite) do
21
+ Redcrumbs.redis.flushdb
22
+ end
23
+
24
+ c.mock_with :rspec
25
+ end
26
+
27
+ Dir[File.expand_path('../support/*.rb', __FILE__)].each{|f| require f }
@@ -0,0 +1,34 @@
1
+ class Player < ActiveRecord::Base
2
+ has_many :victories, as: :high_scorer
3
+ end
4
+
5
+ class ComputerPlayer < ActiveRecord::Base
6
+ has_many :victories, as: :high_scorer
7
+ end
8
+
9
+ class Game < ActiveRecord::Base
10
+ redcrumbed only: [:name, :highscore], store: {only: [:id, :name]}
11
+
12
+ belongs_to :high_scorer, polymorphic: true
13
+
14
+ alias :creator :high_scorer
15
+
16
+ # Target is whoever is being dispossessed of the top spot
17
+ #
18
+ def target
19
+ high_scorer_was if high_scorer_changed?
20
+ end
21
+
22
+ private
23
+
24
+ def high_scorer_changed?
25
+ high_scorer_id_was != high_scorer_id or
26
+ high_scorer_type_was != high_scorer_type
27
+ end
28
+
29
+ def high_scorer_was
30
+ if high_scorer_id_was.present? and high_scorer_type_was.present?
31
+ high_scorer_type_was.constantize.find(high_scorer_id_was)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ ActiveRecord::Base.establish_connection(
2
+ :adapter => 'sqlite3',
3
+ :database => ':memory:'
4
+ )
5
+
6
+ class CreateSchema < ActiveRecord::Migration
7
+ def self.up
8
+ create_table :computer_players, :force => true do |t|
9
+ t.string :name
10
+ t.timestamps
11
+ end
12
+
13
+ create_table :players, :force => true do |t|
14
+ t.string :name
15
+ t.timestamps
16
+ end
17
+
18
+ create_table :games, :force => true do |t|
19
+ t.references :high_scorer, :polymorphic => true
20
+ t.string :name
21
+ t.string :platform
22
+ t.integer :highscore
23
+ t.timestamps
24
+ end
25
+ end
26
+ end
metadata CHANGED
@@ -1,109 +1,181 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redcrumbs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
5
- prerelease:
4
+ version: 0.5.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - John Hope
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-05 00:00:00.000000000 Z
11
+ date: 2014-11-28 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: data_mapper
16
- requirement: &70244416746320 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.2.0
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70244416746320
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.2.2
25
41
  - !ruby/object:Gem::Dependency
26
42
  name: dm-redis-adapter
27
- requirement: &70244416741460 !ruby/object:Gem::Requirement
28
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
29
44
  requirements:
30
- - - ~>
45
+ - - ! '>='
31
46
  - !ruby/object:Gem::Version
32
47
  version: 0.6.2
33
48
  type: :runtime
34
49
  prerelease: false
35
- version_requirements: *70244416741460
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.6.2
36
55
  - !ruby/object:Gem::Dependency
37
- name: redis
38
- requirement: &70244416737940 !ruby/object:Gem::Requirement
39
- none: false
56
+ name: redis-namespace
57
+ requirement: !ruby/object:Gem::Requirement
40
58
  requirements:
41
- - - ~>
59
+ - - ! '>='
42
60
  - !ruby/object:Gem::Version
43
- version: 2.2.2
61
+ version: 1.3.0
44
62
  type: :runtime
45
63
  prerelease: false
46
- version_requirements: *70244416737940
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.0
47
69
  - !ruby/object:Gem::Dependency
48
- name: redis-namespace
49
- requirement: &70244416736920 !ruby/object:Gem::Requirement
50
- none: false
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '3.1'
76
+ - - <
77
+ - !ruby/object:Gem::Version
78
+ version: '5'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '3.1'
86
+ - - <
87
+ - !ruby/object:Gem::Version
88
+ version: '5'
89
+ - !ruby/object:Gem::Dependency
90
+ name: activesupport
91
+ requirement: !ruby/object:Gem::Requirement
51
92
  requirements:
52
93
  - - ! '>='
53
94
  - !ruby/object:Gem::Version
54
- version: 1.1.0
95
+ version: '3.1'
96
+ - - <
97
+ - !ruby/object:Gem::Version
98
+ version: '5'
55
99
  type: :runtime
56
100
  prerelease: false
57
- version_requirements: *70244416736920
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '3.1'
106
+ - - <
107
+ - !ruby/object:Gem::Version
108
+ version: '5'
58
109
  description: Fast and unobtrusive activity tracking of ActiveRecord models using DataMapper
59
110
  and Redis
60
111
  email:
61
- - info@midhirrecords.com
112
+ - john@shiftdock.com
62
113
  executables: []
63
114
  extensions: []
64
115
  extra_rdoc_files: []
65
116
  files:
66
117
  - .gitignore
118
+ - .travis.yml
67
119
  - Gemfile
120
+ - LICENSE
68
121
  - README.md
69
122
  - Rakefile
70
- - app/models/redcrumbs/crumb.rb
71
- - app/models/redcrumbs/crumb/expiry.rb
72
- - app/models/redcrumbs/crumb/getters.rb
73
- - app/models/redcrumbs/crumb/setters.rb
123
+ - gemfiles/Gemfile.rails-3.1.x
124
+ - gemfiles/Gemfile.rails-3.2.x
125
+ - gemfiles/Gemfile.rails-4.0.x
126
+ - gemfiles/Gemfile.rails-4.1.x
74
127
  - lib/generators/redcrumbs/install_generator.rb
75
128
  - lib/generators/redcrumbs/templates/initializer.rb
76
129
  - lib/redcrumbs.rb
77
130
  - lib/redcrumbs/config.rb
78
131
  - lib/redcrumbs/creation.rb
79
- - lib/redcrumbs/engine.rb
132
+ - lib/redcrumbs/crumb.rb
80
133
  - lib/redcrumbs/options.rb
134
+ - lib/redcrumbs/serializable_association.rb
81
135
  - lib/redcrumbs/users.rb
82
136
  - lib/redcrumbs/version.rb
83
137
  - redcrumbs.gemspec
84
- homepage: https://github.com/projectzebra/Redcrumbs
85
- licenses: []
138
+ - spec/redcrumbs/config_spec.rb
139
+ - spec/redcrumbs/creation_spec.rb
140
+ - spec/redcrumbs/crumb_spec.rb
141
+ - spec/redcrumbs/options_spec.rb
142
+ - spec/redcrumbs/serializable_association_spec.rb
143
+ - spec/redcrumbs/users_spec.rb
144
+ - spec/spec_helper.rb
145
+ - spec/support/models.rb
146
+ - spec/support/schema.rb
147
+ homepage: https://github.com/JonMidhir/Redcrumbs
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
86
151
  post_install_message:
87
152
  rdoc_options: []
88
153
  require_paths:
89
154
  - lib
90
155
  required_ruby_version: !ruby/object:Gem::Requirement
91
- none: false
92
156
  requirements:
93
157
  - - ! '>='
94
158
  - !ruby/object:Gem::Version
95
159
  version: '0'
96
160
  required_rubygems_version: !ruby/object:Gem::Requirement
97
- none: false
98
161
  requirements:
99
162
  - - ! '>='
100
163
  - !ruby/object:Gem::Version
101
164
  version: '0'
102
165
  requirements: []
103
166
  rubyforge_project: redcrumbs
104
- rubygems_version: 1.8.10
167
+ rubygems_version: 2.2.2
105
168
  signing_key:
106
- specification_version: 3
169
+ specification_version: 4
107
170
  summary: Fast and unobtrusive activity tracking of ActiveRecord models using DataMapper
108
171
  and Redis
109
- test_files: []
172
+ test_files:
173
+ - spec/redcrumbs/config_spec.rb
174
+ - spec/redcrumbs/creation_spec.rb
175
+ - spec/redcrumbs/crumb_spec.rb
176
+ - spec/redcrumbs/options_spec.rb
177
+ - spec/redcrumbs/serializable_association_spec.rb
178
+ - spec/redcrumbs/users_spec.rb
179
+ - spec/spec_helper.rb
180
+ - spec/support/models.rb
181
+ - spec/support/schema.rb