emotions 0.1.7 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/emotions.rb +21 -0
- data/lib/emotions/emotional.rb +64 -15
- data/lib/emotions/emotive.rb +3 -1
- data/lib/emotions/errors.rb +9 -0
- data/lib/emotions/railtie.rb +1 -17
- data/lib/emotions/version.rb +1 -1
- data/spec/emotions/emotional_spec.rb +65 -14
- data/spec/spec_helper.rb +3 -1
- metadata +5 -6
- data/spec/support/extensions/active_record.rb +0 -17
data/lib/emotions.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'emotions/version'
|
2
2
|
|
3
3
|
require 'active_record'
|
4
|
+
require 'emotions/errors'
|
4
5
|
require 'emotions/emotion'
|
5
6
|
require 'emotions/emotive'
|
6
7
|
require 'emotions/emotional'
|
@@ -14,6 +15,26 @@ module Emotions
|
|
14
15
|
def self.emotions
|
15
16
|
@configuration.emotions ||= []
|
16
17
|
end
|
18
|
+
|
19
|
+
def self.inject_into_active_record
|
20
|
+
@inject_into_active_record ||= Proc.new do
|
21
|
+
def self.acts_as_emotive
|
22
|
+
self.send :include, Emotions::Emotive
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.acts_as_emotional
|
26
|
+
self.send :include, Emotions::Emotional
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.emotional?
|
30
|
+
@emotional ||= self.ancestors.include?(Emotions::Emotional)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.emotive?
|
34
|
+
@emotive ||= self.ancestors.include?(Emotions::Emotive)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
17
38
|
end
|
18
39
|
|
19
40
|
require 'emotions/railtie' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
|
data/lib/emotions/emotional.rb
CHANGED
@@ -10,58 +10,107 @@ module Emotions
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
# @private
|
13
14
|
def _emotions_about(emotive)
|
14
15
|
self.emotions.where(emotive_id: emotive.id, emotive_type: emotive.class.name)
|
15
16
|
end
|
16
17
|
|
18
|
+
# Return all emotions expressed by the emotional record
|
19
|
+
# towards another emotive record
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# user = User.first
|
23
|
+
# picture = Picture.first
|
24
|
+
# user.express! :happy, picture
|
25
|
+
# user.emotions_about(picture)
|
26
|
+
# # => [:happy]
|
17
27
|
def emotions_about(emotive)
|
18
28
|
_emotions_about(emotive).pluck(:emotion).map(&:to_sym)
|
19
29
|
end
|
20
30
|
|
31
|
+
# Express an emotion towards another record
|
32
|
+
#
|
33
|
+
# @example
|
34
|
+
# user = User.first
|
35
|
+
# picture = Picture.first
|
36
|
+
# user.express! :happy, picture
|
21
37
|
def express!(emotion, emotive)
|
22
|
-
|
38
|
+
emotion = _emotions_about(emotive).where(emotion: emotion).first_or_initialize
|
39
|
+
|
40
|
+
begin
|
41
|
+
emotion.tap(&:save!)
|
42
|
+
rescue ActiveRecord::RecordInvalid => e
|
43
|
+
raise InvalidEmotion.new(e.record)
|
44
|
+
end
|
23
45
|
end
|
24
46
|
|
47
|
+
# No longer express an emotion towards another record
|
48
|
+
#
|
49
|
+
# @example
|
50
|
+
# user = User.first
|
51
|
+
# picture = Picture.first
|
52
|
+
# user.no_longer_express! :happy, picture
|
25
53
|
def no_longer_express!(emotion, emotive)
|
26
|
-
|
54
|
+
_emotions_about(emotive).where(emotion: emotion).first.tap { |e| e.try(:destroy) }
|
27
55
|
end
|
28
56
|
|
29
57
|
module ClassMethods
|
58
|
+
# Return an `ActiveRecord::Relation` containing the emotional records
|
59
|
+
# that expressed a specific emotion towards an emotive record
|
60
|
+
#
|
61
|
+
# @example
|
62
|
+
# user = User.first
|
63
|
+
# picture = Picture.first
|
64
|
+
# user.express! :happy, picture
|
65
|
+
# User.emotional_about(:happy, picture)
|
66
|
+
# # => #<ActiveRecord::Relation [#<User id=1>]>
|
67
|
+
def emotional_about(emotion, emotive)
|
68
|
+
if emotive.class.emotive?
|
69
|
+
emotional_ids = emotive.emotions.where(emotion: emotion).where(emotional_type: self.name).pluck(:emotional_id)
|
70
|
+
where(id: emotional_ids)
|
71
|
+
else
|
72
|
+
# ActiveRecord 4 supports `.none`, not ActiveRecord 3
|
73
|
+
respond_to?(:none) ? none : where('1 = 0')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
30
77
|
def define_emotion_methods(emotion)
|
31
78
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
32
79
|
def #{emotion}_about?(emotive)
|
33
80
|
!!#{emotion}_about(emotive).exists?
|
34
81
|
end
|
35
|
-
alias #{emotion}? #{emotion}_about?
|
36
|
-
alias #{emotion}_with? #{emotion}_about?
|
37
|
-
alias #{emotion}_over? #{emotion}_about?
|
38
82
|
|
39
83
|
def #{emotion}_about!(emotive)
|
40
|
-
|
41
|
-
emotion.tap(&:save!)
|
84
|
+
express! #{emotion.inspect}, emotive
|
42
85
|
end
|
43
|
-
alias #{emotion}_with! #{emotion}_about!
|
44
|
-
alias #{emotion}_over! #{emotion}_about!
|
45
86
|
|
46
87
|
def no_longer_#{emotion}_about!(emotive)
|
47
|
-
#{emotion}
|
88
|
+
no_longer_express! #{emotion.inspect}, emotive
|
48
89
|
end
|
49
|
-
alias no_longer_#{emotion}_with! no_longer_#{emotion}_about!
|
50
|
-
alias no_longer_#{emotion}_over! no_longer_#{emotion}_about!
|
51
90
|
|
52
91
|
def #{emotion}_about(emotive)
|
53
92
|
_emotions_about(emotive).where(emotion: #{emotion.to_s.inspect})
|
54
93
|
end
|
94
|
+
|
95
|
+
alias #{emotion}? #{emotion}_about?
|
96
|
+
alias #{emotion}_with? #{emotion}_about?
|
97
|
+
alias #{emotion}_over? #{emotion}_about?
|
98
|
+
|
99
|
+
alias #{emotion}_with! #{emotion}_about!
|
100
|
+
alias #{emotion}_over! #{emotion}_about!
|
101
|
+
|
102
|
+
alias no_longer_#{emotion}_with! no_longer_#{emotion}_about!
|
103
|
+
alias no_longer_#{emotion}_over! no_longer_#{emotion}_about!
|
104
|
+
|
55
105
|
alias #{emotion}_with #{emotion}_about
|
56
106
|
alias #{emotion}_over #{emotion}_about
|
57
|
-
|
58
107
|
RUBY
|
59
108
|
|
60
109
|
instance_eval <<-RUBY, __FILE__, __LINE__ + 1
|
61
110
|
def #{emotion}_about(emotive)
|
62
|
-
|
63
|
-
self.where(id: emotional_ids)
|
111
|
+
emotional_about(#{emotion.inspect}, emotive)
|
64
112
|
end
|
113
|
+
|
65
114
|
alias #{emotion}_with #{emotion}_about
|
66
115
|
alias #{emotion}_over #{emotion}_about
|
67
116
|
RUBY
|
data/lib/emotions/emotive.rb
CHANGED
@@ -10,14 +10,16 @@ module Emotions
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
# @private
|
13
14
|
def update_emotion_counter(emotion)
|
14
|
-
attribute =
|
15
|
+
attribute = "#{emotion}_emotions_count"
|
15
16
|
|
16
17
|
if self.respond_to?(attribute)
|
17
18
|
self.update_attribute(attribute, self.send("#{emotion}_about").count)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
22
|
+
# @private
|
21
23
|
module ClassMethods
|
22
24
|
def define_emotion_methods(emotion)
|
23
25
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
data/lib/emotions/railtie.rb
CHANGED
@@ -4,23 +4,7 @@ require 'rails'
|
|
4
4
|
module Emotions
|
5
5
|
class Railtie < Rails::Railtie
|
6
6
|
initializer 'emotions.active_record' do |app|
|
7
|
-
ActiveSupport.on_load :active_record
|
8
|
-
def self.acts_as_emotive
|
9
|
-
self.send :include, Emotions::Emotive
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.acts_as_emotional
|
13
|
-
self.send :include, Emotions::Emotional
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.emotional?
|
17
|
-
!!@emotional
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.emotive?
|
21
|
-
!!@emotive
|
22
|
-
end
|
23
|
-
end
|
7
|
+
ActiveSupport.on_load :active_record, {}, &Emotions.inject_into_active_record
|
24
8
|
end
|
25
9
|
end
|
26
10
|
end
|
data/lib/emotions/version.rb
CHANGED
@@ -53,21 +53,46 @@ describe Emotions::Emotional do
|
|
53
53
|
context 'for user without emotions' do
|
54
54
|
it { expect(user.emotions_about(picture)).to be_empty }
|
55
55
|
end
|
56
|
+
|
57
|
+
context 'for invalid emotive' do
|
58
|
+
it { expect(user.emotions_about(user)).to be_empty }
|
59
|
+
it { expect{ user.emotions_about(user) }.to_not raise_error }
|
60
|
+
end
|
56
61
|
end
|
57
62
|
|
58
63
|
describe :express! do
|
59
64
|
let(:picture) { Picture.create }
|
60
65
|
|
61
|
-
|
62
|
-
|
66
|
+
context 'with valid emotive and emotion' do
|
67
|
+
it { expect{ user.express! :happy, picture }.to change{ Emotions::Emotion.count }.from(0).to(1) }
|
68
|
+
it { expect{ user.express! :happy, picture }.to change{ user.happy_about? picture }.from(false).to(true) }
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'with invalid emotive' do
|
72
|
+
it { expect{ user.express! :happy, user }.to raise_error(Emotions::InvalidEmotion) }
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with invalid emotion' do
|
76
|
+
it { expect{ user.express! :mad, picture }.to raise_error(Emotions::InvalidEmotion) }
|
77
|
+
end
|
63
78
|
end
|
64
79
|
|
65
80
|
describe :no_longer_express! do
|
66
81
|
let(:picture) { Picture.create }
|
67
82
|
before { user.happy_about!(picture) }
|
68
83
|
|
69
|
-
|
70
|
-
|
84
|
+
context 'with valid emotive and emotion' do
|
85
|
+
it { expect{ user.no_longer_express! :happy, picture }.to change{ Emotions::Emotion.count }.from(1).to(0) }
|
86
|
+
it { expect{ user.no_longer_express! :happy, picture }.to change{ user.happy_about? picture }.from(true).to(false) }
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with invalid emotive' do
|
90
|
+
it { expect{ user.no_longer_express! :happy, user }.to_not raise_error }
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'with invalid emotion' do
|
94
|
+
it { expect{ user.no_longer_express! :mad, user }.to_not raise_error }
|
95
|
+
end
|
71
96
|
end
|
72
97
|
|
73
98
|
describe :DynamicMethods do
|
@@ -76,25 +101,44 @@ describe Emotions::Emotional do
|
|
76
101
|
let(:picture) { Picture.create }
|
77
102
|
let(:other_picture) { Picture.create }
|
78
103
|
|
79
|
-
|
80
|
-
|
104
|
+
context 'with valid emotive' do
|
105
|
+
it { expect(user.happy_about? picture).to be_true }
|
106
|
+
it { expect(user.happy_about? other_picture).to be_false }
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'with invalid emotive' do
|
110
|
+
it { expect{ user.happy_about? user }.to_not raise_error }
|
111
|
+
end
|
81
112
|
end
|
82
113
|
|
83
114
|
describe :emotion_about! do
|
84
115
|
let(:picture) { Picture.create }
|
85
116
|
|
86
|
-
|
87
|
-
|
88
|
-
|
117
|
+
context 'with valid emotive' do
|
118
|
+
it { expect(user.happy_about! picture).to be_instance_of(Emotions::Emotion) }
|
119
|
+
it { expect{ user.happy_about! picture }.to change{ Emotions::Emotion.count }.from(0).to(1) }
|
120
|
+
it { expect{ user.happy_about! picture }.to change{ user.happy_about? picture }.from(false).to(true) }
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'with invalid emotive' do
|
124
|
+
it { expect{ user.happy_about! user }.to raise_error(Emotions::InvalidEmotion) }
|
125
|
+
end
|
89
126
|
end
|
90
127
|
|
91
128
|
describe :no_longer_emotion_about! do
|
92
129
|
before { user.happy_about!(picture) }
|
93
130
|
let(:picture) { Picture.create }
|
94
131
|
|
95
|
-
|
96
|
-
|
97
|
-
|
132
|
+
context 'with valid emotive' do
|
133
|
+
it { expect(user.no_longer_happy_about! picture).to be_instance_of(Emotions::Emotion) }
|
134
|
+
it { expect{ user.no_longer_happy_about! picture }.to change{ Emotions::Emotion.count }.from(1).to(0) }
|
135
|
+
it { expect{ user.no_longer_happy_about! picture }.to change{ user.happy_about? picture }.from(true).to(false) }
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'with invalid emotive' do
|
139
|
+
it { expect(user.no_longer_happy_about! user).to be_nil }
|
140
|
+
it { expect{ user.no_longer_happy_about! user }.to_not raise_error }
|
141
|
+
end
|
98
142
|
end
|
99
143
|
end
|
100
144
|
end
|
@@ -119,8 +163,15 @@ describe Emotions::Emotional do
|
|
119
163
|
first_other_user.happy_about! picture
|
120
164
|
end
|
121
165
|
|
122
|
-
|
123
|
-
|
166
|
+
context 'with valid emotive' do
|
167
|
+
it { expect(User.happy_about(picture).to_a).to eql [user, first_other_user] }
|
168
|
+
it { expect(User.happy_about(picture).where('id != ?', first_other_user.id).to_a).to eql [user] }
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'with invalid emotive' do
|
172
|
+
it { expect(User.happy_about(user).to_a).to be_empty }
|
173
|
+
it { expect{ User.happy_about(user).to_a }.to_not raise_error }
|
174
|
+
end
|
124
175
|
end
|
125
176
|
end
|
126
177
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,9 @@ require 'emotions'
|
|
7
7
|
|
8
8
|
# Require our macros and extensions
|
9
9
|
Dir[File.expand_path('../../spec/support/macros/*.rb', __FILE__)].map(&method(:require))
|
10
|
-
|
10
|
+
|
11
|
+
# Inject our methods into ActiveRecord (like our railtie does)
|
12
|
+
ActiveRecord::Base.class_eval(&Emotions.inject_into_active_record)
|
11
13
|
|
12
14
|
RSpec.configure do |config|
|
13
15
|
# Include our macros
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: emotions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -110,6 +110,7 @@ files:
|
|
110
110
|
- lib/emotions/emotion.rb
|
111
111
|
- lib/emotions/emotional.rb
|
112
112
|
- lib/emotions/emotive.rb
|
113
|
+
- lib/emotions/errors.rb
|
113
114
|
- lib/emotions/railtie.rb
|
114
115
|
- lib/emotions/version.rb
|
115
116
|
- lib/generators/emotions/USAGE
|
@@ -119,7 +120,6 @@ files:
|
|
119
120
|
- spec/emotions/emotional_spec.rb
|
120
121
|
- spec/emotions/emotive_spec.rb
|
121
122
|
- spec/spec_helper.rb
|
122
|
-
- spec/support/extensions/active_record.rb
|
123
123
|
- spec/support/macros/database_macros.rb
|
124
124
|
- spec/support/macros/model_macros.rb
|
125
125
|
homepage: https://github.com/mirego/emotions
|
@@ -137,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
137
137
|
version: '0'
|
138
138
|
segments:
|
139
139
|
- 0
|
140
|
-
hash: -
|
140
|
+
hash: -451133210429222225
|
141
141
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
142
|
none: false
|
143
143
|
requirements:
|
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
segments:
|
148
148
|
- 0
|
149
|
-
hash: -
|
149
|
+
hash: -451133210429222225
|
150
150
|
requirements: []
|
151
151
|
rubyforge_project:
|
152
152
|
rubygems_version: 1.8.23
|
@@ -159,6 +159,5 @@ test_files:
|
|
159
159
|
- spec/emotions/emotional_spec.rb
|
160
160
|
- spec/emotions/emotive_spec.rb
|
161
161
|
- spec/spec_helper.rb
|
162
|
-
- spec/support/extensions/active_record.rb
|
163
162
|
- spec/support/macros/database_macros.rb
|
164
163
|
- spec/support/macros/model_macros.rb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class ActiveRecord::Base
|
2
|
-
def self.acts_as_emotive
|
3
|
-
self.send :include, Emotions::Emotive
|
4
|
-
end
|
5
|
-
|
6
|
-
def self.acts_as_emotional
|
7
|
-
self.send :include, Emotions::Emotional
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.emotive?
|
11
|
-
@emotive ||= self.ancestors.include?(Emotions::Emotive)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.emotional?
|
15
|
-
@emotional ||= self.ancestors.include?(Emotions::Emotional)
|
16
|
-
end
|
17
|
-
end
|