like_system 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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.empty +0 -0
  3. data/.gitignore +15 -0
  4. data/.keep +0 -0
  5. data/.rspec +2 -0
  6. data/.ruby-gemset +1 -0
  7. data/.ruby-version +1 -0
  8. data/.travis.yml +23 -0
  9. data/Appraisals +7 -0
  10. data/Gemfile +4 -0
  11. data/LICENSE.txt +22 -0
  12. data/README.md +93 -0
  13. data/Rakefile +8 -0
  14. data/gemfiles/.empty +0 -0
  15. data/gemfiles/.gitignore +0 -0
  16. data/gemfiles/.keep +0 -0
  17. data/gemfiles/rails4.1.gemfile +7 -0
  18. data/gemfiles/rails4.2.gemfile +7 -0
  19. data/lib/.empty +0 -0
  20. data/lib/.gitignore +0 -0
  21. data/lib/.keep +0 -0
  22. data/lib/generators/.empty +0 -0
  23. data/lib/generators/.gitignore +0 -0
  24. data/lib/generators/.keep +0 -0
  25. data/lib/generators/like_system/.empty +0 -0
  26. data/lib/generators/like_system/.gitignore +0 -0
  27. data/lib/generators/like_system/.keep +0 -0
  28. data/lib/generators/like_system/like_system_generator.rb +46 -0
  29. data/lib/generators/like_system/templates/.empty +0 -0
  30. data/lib/generators/like_system/templates/.gitignore +0 -0
  31. data/lib/generators/like_system/templates/.keep +0 -0
  32. data/lib/generators/like_system/templates/migration.rb +47 -0
  33. data/lib/like_system.rb +45 -0
  34. data/lib/like_system/.empty +0 -0
  35. data/lib/like_system/.gitignore +0 -0
  36. data/lib/like_system/.keep +0 -0
  37. data/lib/like_system/like.rb +155 -0
  38. data/lib/like_system/likee.rb +58 -0
  39. data/lib/like_system/liker.rb +88 -0
  40. data/lib/like_system/version.rb +12 -0
  41. data/like_system.gemspec +31 -0
  42. data/spec/.empty +0 -0
  43. data/spec/.gitignore +0 -0
  44. data/spec/.keep +0 -0
  45. data/spec/db/.empty +0 -0
  46. data/spec/db/.gitignore +0 -0
  47. data/spec/db/.keep +0 -0
  48. data/spec/db/migrate/.empty +0 -0
  49. data/spec/db/migrate/.gitignore +0 -0
  50. data/spec/db/migrate/.keep +0 -0
  51. data/spec/db/migrate/20140926000000_create_likes.rb +47 -0
  52. data/spec/db/migrate/20140926000005_create_dummy_likers.rb +22 -0
  53. data/spec/db/migrate/20140926000010_create_dummy_likees.rb +22 -0
  54. data/spec/like_system/.empty +0 -0
  55. data/spec/like_system/.gitignore +0 -0
  56. data/spec/like_system/.keep +0 -0
  57. data/spec/like_system/like_spec.rb +177 -0
  58. data/spec/like_system/likee_spec.rb +69 -0
  59. data/spec/like_system/liker_spec.rb +96 -0
  60. data/spec/spec_helper.rb +116 -0
  61. data/spec/support/.empty +0 -0
  62. data/spec/support/.gitignore +0 -0
  63. data/spec/support/.keep +0 -0
  64. data/spec/support/active_record.rb +12 -0
  65. data/spec/support/shoulda_matchers.rb +2 -0
  66. metadata +237 -0
@@ -0,0 +1,58 @@
1
+ ###
2
+ # LikeSystem module
3
+ #
4
+ # This module defines common behavior in like system
5
+ ###
6
+ module LikeSystem
7
+ ###
8
+ # Likee module
9
+ #
10
+ # This module defines likee behavior in like system
11
+ ###
12
+ module Likee
13
+ ###
14
+ # Extends ActiveSupport::Concern
15
+ ###
16
+ extend ActiveSupport::Concern
17
+
18
+ ###
19
+ # Included configuration
20
+ ###
21
+ included do
22
+ ###
23
+ # Has many likers association configuration
24
+ ###
25
+ has_many :likers, class_name: "LikeSystem::Like", as: :likee, dependent: :destroy
26
+ end
27
+
28
+ ###
29
+ # Specifies if self can be liked by {Liker} objects
30
+ #
31
+ # @return [Boolean]
32
+ ###
33
+ def is_likee?
34
+ true
35
+ end
36
+
37
+ ###
38
+ # Specifies if self is liked by a {Liker} object
39
+ #
40
+ # @param [Liker] liker - the {Liker} object to test against
41
+ # @return [Boolean]
42
+ ###
43
+ def liked_by?(liker)
44
+ Like.likes?(liker, self)
45
+ end
46
+
47
+ ###
48
+ # Retrieves a scope of {Like} objects that likes self filtered {Liker} type
49
+ #
50
+ # @param [Class] klass - the {Class} to filter
51
+ # @return [ActiveRecord::Relation]
52
+ ###
53
+ def likers_by(klass)
54
+ Like.scope_by_likee(self).scope_by_liker_type(klass)
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,88 @@
1
+ ###
2
+ # LikeSystem module
3
+ #
4
+ # This module defines common behavior in like system
5
+ ###
6
+ module LikeSystem
7
+ ###
8
+ # Liker module
9
+ #
10
+ # This module defines liker behavior in like system
11
+ ###
12
+ module Liker
13
+ ###
14
+ # Extends ActiveSupport::Concern
15
+ ###
16
+ extend ActiveSupport::Concern
17
+
18
+ ###
19
+ # Included configuration
20
+ ###
21
+ included do
22
+ ###
23
+ # Has many likees association configuration
24
+ ###
25
+ has_many :likees, class_name: "LikeSystem::Like", as: :liker, dependent: :destroy
26
+ end
27
+
28
+ ###
29
+ # Specifies if self can like {Likee} objects
30
+ #
31
+ # @return [Boolean]
32
+ ###
33
+ def is_liker?
34
+ true
35
+ end
36
+
37
+ ###
38
+ # Creates a {Like} relationship between self and a {Likee} object
39
+ #
40
+ # @param [Likee] likee - the likee of the {Like} relationship
41
+ # @return [Boolean]
42
+ ###
43
+ def like(likee)
44
+ Like.like(self, likee)
45
+ end
46
+
47
+ ###
48
+ # Destroys a {Like} relationship between self and a {Likee} object
49
+ #
50
+ # @param [Likee] likee - the likee of the {Like} relationship
51
+ # @return [Boolean]
52
+ ###
53
+ def unlike(likee)
54
+ Like.unlike(self, likee)
55
+ end
56
+
57
+ ###
58
+ # Toggles a {Like} relationship between self and a {Likee} object
59
+ #
60
+ # @param [Likee] likee - the likee of the {Like} relationship
61
+ # @return [Boolean]
62
+ ###
63
+ def toggle_like(likee)
64
+ Like.toggle_like(self, likee)
65
+ end
66
+
67
+ ###
68
+ # Specifies if self likes a {Liker} object
69
+ #
70
+ # @param [Likee] likee - the {Likee} object to test against
71
+ # @return [Boolean]
72
+ ###
73
+ def likes?(likee)
74
+ Like.likes?(self, likee)
75
+ end
76
+
77
+ ###
78
+ # Retrieves a scope of {Like} objects that are liked by self
79
+ #
80
+ # @param [Class] klass - the {Class} to include
81
+ # @return [ActiveRecord::Relation]
82
+ ###
83
+ def likees_by(klass)
84
+ Like.scope_by_liker(self).scope_by_likee_type(klass)
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,12 @@
1
+ ###
2
+ # LikeSystem module
3
+ #
4
+ # This module defines common behavior in like system
5
+ ###
6
+ module LikeSystem
7
+ ###
8
+ # Version constant definition
9
+ ###
10
+ VERSION = "0.0.6"
11
+ end
12
+
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'like_system/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "like_system"
8
+ spec.version = LikeSystem::VERSION
9
+ spec.authors = ["Pablo Martin Viva"]
10
+ spec.email = ["pmviva@gmail.com"]
11
+ spec.summary = %q{An active record like system.}
12
+ spec.description = %q{An active record like system developed using ruby on rails 4.1 applying domain driven design and test driven development principles.}
13
+ spec.homepage = "http://github.com/pmviva/like_system"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.0.0")
21
+
22
+ spec.add_dependency "rails", [ ">= 4.1", "< 5" ]
23
+
24
+ spec.add_development_dependency "appraisal", "~> 2.0"
25
+ spec.add_development_dependency "bundler", "~> 1.7"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "~> 3.1"
28
+ spec.add_development_dependency "shoulda-matchers", "~> 2.7"
29
+ spec.add_development_dependency "sqlite3", "~> 1.3"
30
+ end
31
+
data/spec/.empty ADDED
File without changes
data/spec/.gitignore ADDED
File without changes
data/spec/.keep ADDED
File without changes
data/spec/db/.empty ADDED
File without changes
File without changes
data/spec/db/.keep ADDED
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,47 @@
1
+ ###
2
+ # CreateLikes class
3
+ #
4
+ # This class defines the test create likes migration in like system
5
+ ###
6
+ class CreateLikes < ActiveRecord::Migration
7
+ ###
8
+ # Changes the database
9
+ ###
10
+ def change
11
+ ###
12
+ # Likes table creation
13
+ ###
14
+ create_table :likes do |t|
15
+ ###
16
+ # Likee id field and likee type field definition
17
+ ###
18
+ t.references :likee, polymorphic: true
19
+
20
+ ###
21
+ # Liker id fiel and liker type field definition
22
+ ###
23
+ t.references :liker, polymorphic: true
24
+
25
+ ###
26
+ # Timestamps fields definition
27
+ ###
28
+ t.timestamps null: false
29
+ end
30
+
31
+ ###
32
+ # Likes table likee id field and likee type field index addition
33
+ ###
34
+ add_index :likes, [:likee_id, :likee_type], name: "likes_likee_idx"
35
+
36
+ ###
37
+ # Likes table liker id field and liker type field index addition
38
+ ###
39
+ add_index :likes, [:liker_id, :liker_type], name: "likes_liker_idx"
40
+
41
+ ###
42
+ # Likes table likee id field and likee type field and liker id field and liker type field unique index addition
43
+ ###
44
+ add_index :likes, [:likee_id, :likee_type, :liker_id, :liker_type], name: "likes_likee_liker_idx", unique: true
45
+ end
46
+ end
47
+
@@ -0,0 +1,22 @@
1
+ ###
2
+ # CreateDummyLikers class
3
+ #
4
+ # This class defines the create dummy likers migration in like system
5
+ ###
6
+ class CreateDummyLikers < ActiveRecord::Migration
7
+ ###
8
+ # Changes the database
9
+ ###
10
+ def change
11
+ ###
12
+ # Dummy likers table creation
13
+ ###
14
+ create_table :dummy_likers do |t|
15
+ ###
16
+ # Timestamps fields definition
17
+ ###
18
+ t.timestamps null: false
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,22 @@
1
+ ###
2
+ # CreateDummyLikees class
3
+ #
4
+ # This class defines the create dummy likees migration in like system
5
+ ###
6
+ class CreateDummyLikees < ActiveRecord::Migration
7
+ ###
8
+ # Changes the database
9
+ ###
10
+ def change
11
+ ###
12
+ # Dummy likees table creation
13
+ ###
14
+ create_table :dummy_likees do |t|
15
+ ###
16
+ # Timestamps fields definition
17
+ ###
18
+ t.timestamps null: false
19
+ end
20
+ end
21
+ end
22
+
File without changes
File without changes
File without changes
@@ -0,0 +1,177 @@
1
+ require 'spec_helper'
2
+
3
+ ###
4
+ # Describes LikeSystem::Like
5
+ ###
6
+ describe LikeSystem::Like do
7
+ ###
8
+ # Let likee be DummyLikee.create
9
+ ###
10
+ let(:likee) { DummyLikee.create }
11
+
12
+ ###
13
+ # Let liker be DummyLiker.create
14
+ ###
15
+ let(:liker) { DummyLiker.create }
16
+
17
+ ###
18
+ # Describes associations
19
+ ###
20
+ describe "associations" do
21
+ ###
22
+ # Should belong to likee
23
+ ###
24
+ it "should belong to likee" do
25
+ should belong_to(:likee)
26
+ end
27
+
28
+ ###
29
+ # Should belong to liker
30
+ ###
31
+ it "should belong to liker" do
32
+ should belong_to(:liker)
33
+ end
34
+ end
35
+
36
+ ###
37
+ # Describes class methods
38
+ ###
39
+ describe "class methods" do
40
+ ###
41
+ # Should raise argument error on invalid likee when likes
42
+ ###
43
+ it "should raise argument error on invalid likee when likes" do
44
+ expect { LikeSystem::Like.like(liker, liker) }.to raise_error ArgumentError
45
+ end
46
+
47
+ ###
48
+ # Should raise argument error on invalid liker when likes
49
+ ###
50
+ it "should raise argument error on invalid liker when likes " do
51
+ expect { LikeSystem::Like.like(likee, likee) }.to raise_error ArgumentError
52
+ end
53
+
54
+ ###
55
+ # Should like
56
+ ###
57
+ it "should like" do
58
+ expect(LikeSystem::Like.like(liker, likee)).to equal(true)
59
+ end
60
+
61
+ ###
62
+ # Should not like
63
+ ###
64
+ it "should not like" do
65
+ LikeSystem::Like.like(liker, likee)
66
+
67
+ expect(LikeSystem::Like.like(liker, likee)).to equal(false)
68
+ end
69
+
70
+ ###
71
+ # Should raise argument error on invalid likee when unlikes
72
+ ###
73
+ it "should raise argument error on invalid likee when unlikes" do
74
+ expect { LikeSystem::Like.unlike(liker, liker) }.to raise_error ArgumentError
75
+ end
76
+
77
+ ###
78
+ # Should raise argument error on invalid liker when unlikes
79
+ ###
80
+ it "should raise argument error on invalid liker when unlikes" do
81
+ expect { LikeSystem::Like.unlike(likee, likee) }.to raise_error ArgumentError
82
+ end
83
+
84
+ ###
85
+ # Should unlike
86
+ ###
87
+ it "should unlike" do
88
+ LikeSystem::Like.like(liker, likee)
89
+
90
+ expect(LikeSystem::Like.unlike(liker, likee)).to equal(true)
91
+ end
92
+
93
+ ###
94
+ # Should not unlike
95
+ ###
96
+ it "should not unlike" do
97
+ expect(LikeSystem::Like.unlike(liker, likee)).to equal(false)
98
+ end
99
+
100
+ ###
101
+ # Should raise argument error on invalid likee when toggle like
102
+ ###
103
+ it "should raise argument error on invalid likee when toggle like" do
104
+ expect { LikeSystem::Like.toggle_like(liker, liker) }.to raise_error ArgumentError
105
+ end
106
+
107
+ ###
108
+ # Should raise argument error on invalid liker when toggle like
109
+ ###
110
+ it "should raise argument error on invalid liker when toggle like" do
111
+ expect { LikeSystem::Like.toggle_like(likee, likee) }.to raise_error ArgumentError
112
+ end
113
+
114
+ ###
115
+ # Should toggle like
116
+ ###
117
+ it "should toggle like" do
118
+ expect(LikeSystem::Like.likes?(liker, likee)).to equal(false)
119
+
120
+ LikeSystem::Like.toggle_like(liker, likee)
121
+
122
+ expect(LikeSystem::Like.likes?(liker, likee)).to equal(true)
123
+
124
+ LikeSystem::Like.toggle_like(liker, likee)
125
+
126
+ expect(LikeSystem::Like.likes?(liker, likee)).to equal(false)
127
+ end
128
+
129
+ ###
130
+ # Should specify if likes
131
+ ###
132
+ it "should specify if likes" do
133
+ expect(LikeSystem::Like.likes?(liker, likee)).to equal(false)
134
+
135
+ LikeSystem::Like.like(liker, likee)
136
+
137
+ expect(LikeSystem::Like.likes?(liker, likee)).to equal(true)
138
+ end
139
+
140
+ ###
141
+ # Should scope likes by likee
142
+ ###
143
+ it "should scope likes by likee" do
144
+ scope = LikeSystem::Like.where(likee: likee)
145
+
146
+ expect(LikeSystem::Like.scope_by_likee(likee)).to eq(scope)
147
+ end
148
+
149
+ ###
150
+ # Should scope likes by likee type
151
+ ####
152
+ it "should scope likes by likee type" do
153
+ scope = LikeSystem::Like.where(likee_type: DummyLikee)
154
+
155
+ expect(LikeSystem::Like.scope_by_likee_type(DummyLikee)).to eq(scope)
156
+ end
157
+
158
+ ###
159
+ # Should scope likes by liker
160
+ ###
161
+ it "should scope likes by liker" do
162
+ scope = LikeSystem::Like.where(liker: liker)
163
+
164
+ expect(LikeSystem::Like.scope_by_liker(liker)).to eq(scope)
165
+ end
166
+
167
+ ###
168
+ # Should scope likes by liker type
169
+ ####
170
+ it "should scope likes by liker type" do
171
+ scope = LikeSystem::Like.where(liker_type: DummyLiker)
172
+
173
+ expect(LikeSystem::Like.scope_by_liker_type(DummyLiker)).to eq(scope)
174
+ end
175
+ end
176
+ end
177
+