redcrumbs 0.5.0 → 0.5.1

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.
@@ -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