recommendable 0.1.4 → 0.1.5
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.
- data/CHANGELOG.markdown +30 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +1 -1
- data/TODO +1 -2
- data/app/models/recommendable/dislike.rb +2 -0
- data/app/models/recommendable/ignore.rb +2 -0
- data/app/models/recommendable/like.rb +2 -0
- data/app/models/recommendable/stashed_item.rb +2 -0
- data/db/migrate/20120124193723_create_likes.rb +5 -5
- data/db/migrate/20120124193728_create_dislikes.rb +5 -5
- data/db/migrate/20120127092558_create_ignores.rb +5 -5
- data/db/migrate/20120131173909_create_stashed_items.rb +5 -5
- data/lib/generators/recommendable/templates/initializer.rb +1 -1
- data/lib/recommendable/acts_as_recommended_to.rb +33 -21
- data/lib/recommendable/version.rb +1 -1
- data/spec/dummy/app/models/movie.rb +0 -1
- data/spec/dummy/app/models/user.rb +1 -1
- data/spec/dummy/db/migrate/20120128005553_create_likes.recommendable.rb +6 -6
- data/spec/dummy/db/migrate/20120128005554_create_dislikes.recommendable.rb +6 -6
- data/spec/dummy/db/migrate/20120128005555_create_ignores.recommendable.rb +5 -5
- data/spec/dummy/db/migrate/20120131195416_create_stashed_items.recommendable.rb +5 -5
- data/spec/dummy/db/schema.rb +29 -29
- data/spec/dummy/recommendable_dummy_development +0 -0
- data/spec/dummy/recommendable_dummy_test +0 -0
- metadata +24 -24
data/CHANGELOG.markdown
CHANGED
@@ -1,8 +1,37 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
-
0.1.
|
4
|
+
0.1.5 (current version)
|
5
5
|
-----------------------
|
6
|
+
* Major bugfix: similarity values were, incorrectly, being calculated as 0.0 for every user pair. Sorry!
|
7
|
+
* The tables for all models are now all prepended with "recommendable_" to avoid possible collision. If upgrading from a previous version, please do the following:
|
8
|
+
|
9
|
+
``` bash
|
10
|
+
$ rails g migration RenameRecommendableTables
|
11
|
+
```
|
12
|
+
|
13
|
+
And paste this into your new migration:
|
14
|
+
|
15
|
+
``` ruby
|
16
|
+
class RenameRecommendableTables < ActiveRecord::Migration
|
17
|
+
def up
|
18
|
+
rename_table :likes, :recommendable_likes
|
19
|
+
rename_table :dislikes, :recommendable_dislikes
|
20
|
+
rename_table :ignores, :recommendable_ignores
|
21
|
+
rename_table :stashed_items, :recommendable_stashed_items
|
22
|
+
end
|
23
|
+
|
24
|
+
def down
|
25
|
+
rename_table :recommendable_likes, :likes
|
26
|
+
rename_table :recommendable_dislikes, :dislikes
|
27
|
+
rename_table :recommendable_ignores, :ignores
|
28
|
+
rename_table :recommendable_stashed_items, :stashed_items
|
29
|
+
end
|
30
|
+
end
|
31
|
+
```
|
32
|
+
|
33
|
+
0.1.4
|
34
|
+
-----
|
6
35
|
* `acts_as_recommendable` is no longer needed in your models
|
7
36
|
* Instead of declaring `acts_as_recommended_to` in your User class, please use `recommends` instead, passing in a list of your recommendable models as a list of symbols (e.g. `recommends :movies, :books`)
|
8
37
|
* Your initializer should no longer declare the user class. This is no longer necessary and is deprecated.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/TODO
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
class CreateLikes < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
create_table :
|
3
|
+
create_table :recommendable_likes do |t|
|
4
4
|
t.references :user
|
5
5
|
t.references :likeable, :polymorphic => true
|
6
6
|
t.timestamps
|
7
7
|
end
|
8
8
|
|
9
|
-
add_index :
|
10
|
-
add_index :
|
11
|
-
add_index :
|
9
|
+
add_index :recommendable_likes, :likeable_id
|
10
|
+
add_index :recommendable_likes, :likeable_type
|
11
|
+
add_index :recommendable_likes, [:user_id, :likeable_id, :likeable_type], :unique => true, :name => "user_like_constraint"
|
12
12
|
end
|
13
13
|
|
14
14
|
def down
|
15
|
-
drop_table :
|
15
|
+
drop_table :recommendable_likes
|
16
16
|
end
|
17
17
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
class CreateDislikes < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
create_table :
|
3
|
+
create_table :recommendable_dislikes do |t|
|
4
4
|
t.references :user
|
5
5
|
t.references :dislikeable, :polymorphic => true
|
6
6
|
t.timestamps
|
7
7
|
end
|
8
8
|
|
9
|
-
add_index :
|
10
|
-
add_index :
|
11
|
-
add_index :
|
9
|
+
add_index :recommendable_dislikes, :dislikeable_id
|
10
|
+
add_index :recommendable_dislikes, :dislikeable_type
|
11
|
+
add_index :recommendable_dislikes, [:user_id, :dislikeable_id, :dislikeable_type], :unique => true, :name => "user_dislike_constraint"
|
12
12
|
end
|
13
13
|
|
14
14
|
def down
|
15
|
-
drop_table :
|
15
|
+
drop_table :recommendable_dislikes
|
16
16
|
end
|
17
17
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
class CreateIgnores < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
create_table :
|
3
|
+
create_table :recommendable_ignores do |t|
|
4
4
|
t.references :user
|
5
5
|
t.references :ignoreable, :polymorphic => true
|
6
6
|
t.timestamps
|
7
7
|
end
|
8
8
|
|
9
|
-
add_index :
|
10
|
-
add_index :
|
11
|
-
add_index :
|
9
|
+
add_index :recommendable_ignores, :ignoreable_id
|
10
|
+
add_index :recommendable_ignores, :ignoreable_type
|
11
|
+
add_index :recommendable_ignores, [:user_id, :ignoreable_id, :ignoreable_type], :unique => true, :name => "user_ignore_constraint"
|
12
12
|
end
|
13
13
|
|
14
14
|
def down
|
15
|
-
drop_table :
|
15
|
+
drop_table :recommendable_ignores
|
16
16
|
end
|
17
17
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
class CreateStashedItems < ActiveRecord::Migration
|
2
2
|
def up
|
3
|
-
create_table :
|
3
|
+
create_table :recommendable_stashed_items do |t|
|
4
4
|
t.references :user
|
5
5
|
t.references :stashable, :polymorphic => true
|
6
6
|
t.timestamps
|
7
7
|
end
|
8
8
|
|
9
|
-
add_index :
|
10
|
-
add_index :
|
11
|
-
add_index :
|
9
|
+
add_index :recommendable_stashed_items, :stashable_id
|
10
|
+
add_index :recommendable_stashed_items, :stashable_type
|
11
|
+
add_index :recommendable_stashed_items, [:user_id, :stashable_id, :stashable_type], :unique => true, :name => "user_stashed_constraint"
|
12
12
|
end
|
13
13
|
|
14
14
|
def down
|
15
|
-
drop_table :
|
15
|
+
drop_table :recommendable_stashed_items
|
16
16
|
end
|
17
17
|
end
|
@@ -404,21 +404,25 @@ module Recommendable
|
|
404
404
|
defaults = { :class => nil,
|
405
405
|
:return_records => true }
|
406
406
|
options = defaults.merge(options)
|
407
|
-
|
407
|
+
create_recommended_to_sets and rater.create_recommended_to_sets if options[:return_records]
|
408
|
+
|
408
409
|
if options[:class]
|
409
410
|
in_common = Recommendable.redis.sinter likes_set_for(options[:class]), rater.likes_set_for(options[:class])
|
410
|
-
options[:class].to_s.classify.constantize.find in_common if options[:return_records]
|
411
|
+
in_common = options[:class].to_s.classify.constantize.find in_common if options[:return_records]
|
411
412
|
else
|
412
|
-
Recommendable.recommendable_classes.flat_map do |klass|
|
413
|
-
|
413
|
+
in_common = Recommendable.recommendable_classes.flat_map do |klass|
|
414
|
+
things = Recommendable.redis.sinter(likes_set_for(klass), rater.likes_set_for(klass))
|
414
415
|
|
415
416
|
if options[:return_records]
|
416
|
-
klass.to_s.classify.constantize.find
|
417
|
+
klass.to_s.classify.constantize.find(things)
|
417
418
|
else
|
418
|
-
|
419
|
+
things.map {|id| "#{klass.to_s.classify}:#{id}"}
|
419
420
|
end
|
420
421
|
end
|
421
422
|
end
|
423
|
+
|
424
|
+
destroy_recommended_to_sets and rater.destroy_recommended_to_sets if options[:return_records]
|
425
|
+
in_common
|
422
426
|
end
|
423
427
|
|
424
428
|
# Makes a call to Redis and intersects the sets of dislikes belonging to
|
@@ -433,21 +437,25 @@ module Recommendable
|
|
433
437
|
defaults = { :class => nil,
|
434
438
|
:return_records => true }
|
435
439
|
options = defaults.merge(options)
|
436
|
-
|
440
|
+
create_recommended_to_sets and rater.create_recommended_to_sets if options[:return_records]
|
441
|
+
|
437
442
|
if options[:class]
|
438
443
|
in_common = Recommendable.redis.sinter dislikes_set_for(options[:class]), rater.dislikes_set_for(options[:class])
|
439
|
-
options[:class].to_s.classify.constantize.find in_common if options[:return_records]
|
444
|
+
in_common = options[:class].to_s.classify.constantize.find in_common if options[:return_records]
|
440
445
|
else
|
441
|
-
Recommendable.recommendable_classes.flat_map do |klass|
|
442
|
-
|
446
|
+
in_common = Recommendable.recommendable_classes.flat_map do |klass|
|
447
|
+
things = Recommendable.redis.sinter(dislikes_set_for(klass), rater.dislikes_set_for(klass))
|
443
448
|
|
444
449
|
if options[:return_records]
|
445
|
-
klass.to_s.classify.constantize.find
|
450
|
+
klass.to_s.classify.constantize.find(things)
|
446
451
|
else
|
447
|
-
|
452
|
+
things.map {|id| "#{klass.to_s.classify}:#{id}"}
|
448
453
|
end
|
449
454
|
end
|
450
455
|
end
|
456
|
+
|
457
|
+
destroy_recommended_to_sets and rater.destroy_recommended_to_sets if options[:return_records]
|
458
|
+
in_common
|
451
459
|
end
|
452
460
|
|
453
461
|
# Makes a call to Redis and intersects self's set of likes with rater's
|
@@ -464,23 +472,27 @@ module Recommendable
|
|
464
472
|
defaults = { :class => nil,
|
465
473
|
:return_records => true }
|
466
474
|
options = defaults.merge(options)
|
475
|
+
create_recommended_to_sets and rater.create_recommended_to_sets if options[:return_records]
|
467
476
|
|
468
477
|
if options[:class]
|
469
|
-
disagreements = Recommendable.redis.sinter(likes_set_for(options[:class]), rater.
|
470
|
-
disagreements += Recommendable.redis.sinter(dislikes_set_for(options[:class]), rater.
|
471
|
-
options[:class].to_s.classify.constantize.find disagreements if options[:return_records]
|
478
|
+
disagreements = Recommendable.redis.sinter(likes_set_for(options[:class]), rater.dislikes_set_for(options[:class]))
|
479
|
+
disagreements += Recommendable.redis.sinter(dislikes_set_for(options[:class]), rater.likes_set_for(options[:class]))
|
480
|
+
disagreements = options[:class].to_s.classify.constantize.find disagreements if options[:return_records]
|
472
481
|
else
|
473
|
-
Recommendable.recommendable_classes.flat_map do |klass|
|
474
|
-
|
475
|
-
|
476
|
-
|
482
|
+
disagreements = Recommendable.recommendable_classes.flat_map do |klass|
|
483
|
+
things = Recommendable.redis.sinter(likes_set_for(klass), rater.dislikes_set_for(klass))
|
484
|
+
things += Recommendable.redis.sinter(dislikes_set_for(klass), rater.likes_set_for(klass))
|
485
|
+
|
477
486
|
if options[:return_records]
|
478
|
-
klass.to_s.classify.constantize.find
|
487
|
+
klass.to_s.classify.constantize.find(things)
|
479
488
|
else
|
480
|
-
|
489
|
+
things.map {|id| "#{options[:class].to_s.classify}:#{id}"}
|
481
490
|
end
|
482
491
|
end
|
483
492
|
end
|
493
|
+
|
494
|
+
destroy_recommended_to_sets and rater.destroy_recommended_to_sets if options[:return_records]
|
495
|
+
disagreements
|
484
496
|
end
|
485
497
|
|
486
498
|
# Used internally during liking/disliking/stashing/ignoring objects. This
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# This migration comes from recommendable (originally 20120124193723)
|
2
2
|
class CreateLikes < ActiveRecord::Migration
|
3
3
|
def up
|
4
|
-
create_table :
|
4
|
+
create_table :recommendable_likes, :force => true do |t|
|
5
5
|
t.references :user
|
6
6
|
t.references :likeable, :polymorphic => true
|
7
7
|
t.timestamps
|
8
8
|
end
|
9
9
|
|
10
|
-
add_index :
|
11
|
-
add_index :
|
12
|
-
add_index :
|
10
|
+
add_index :recommendable_likes, :likeable_id
|
11
|
+
add_index :recommendable_likes, :likeable_type
|
12
|
+
add_index :recommendable_likes, [:user_id, :likeable_id, :likeable_type], :unique => true, :name => "user_like_constraint"
|
13
13
|
end
|
14
14
|
|
15
15
|
def down
|
16
|
-
drop_table :
|
16
|
+
drop_table :recommendable_likes
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# This migration comes from recommendable (originally 20120124193728)
|
2
2
|
class CreateDislikes < ActiveRecord::Migration
|
3
3
|
def up
|
4
|
-
create_table :
|
4
|
+
create_table :recommendable_dislikes, :force => true do |t|
|
5
5
|
t.references :user
|
6
6
|
t.references :dislikeable, :polymorphic => true
|
7
7
|
t.timestamps
|
8
8
|
end
|
9
9
|
|
10
|
-
add_index :
|
11
|
-
add_index :
|
12
|
-
add_index :
|
10
|
+
add_index :recommendable_dislikes, :dislikeable_id
|
11
|
+
add_index :recommendable_dislikes, :dislikeable_type
|
12
|
+
add_index :recommendable_dislikes, [:user_id, :dislikeable_id, :dislikeable_type], :unique => true, :name => "user_dislike_constraint"
|
13
13
|
end
|
14
14
|
|
15
15
|
def down
|
16
|
-
drop_table :
|
16
|
+
drop_table :recommendable_dislikes
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# This migration comes from recommendable (originally 20120127092558)
|
2
2
|
class CreateIgnores < ActiveRecord::Migration
|
3
3
|
def up
|
4
|
-
create_table :
|
4
|
+
create_table :recommendable_ignores, :force => true do |t|
|
5
5
|
t.references :user
|
6
6
|
t.references :ignoreable, :polymorphic => true
|
7
7
|
t.timestamps
|
8
8
|
end
|
9
9
|
|
10
|
-
add_index :
|
11
|
-
add_index :
|
12
|
-
add_index :
|
10
|
+
add_index :recommendable_ignores, :ignoreable_id
|
11
|
+
add_index :recommendable_ignores, :ignoreable_type
|
12
|
+
add_index :recommendable_ignores, [:user_id, :ignoreable_id, :ignoreable_type], :unique => true, :name => "user_ignore_constraint"
|
13
13
|
end
|
14
14
|
|
15
15
|
def down
|
16
|
-
drop_table :
|
16
|
+
drop_table :recommendable_ignores
|
17
17
|
end
|
18
18
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# This migration comes from recommendable (originally 20120131173909)
|
2
2
|
class CreateStashedItems < ActiveRecord::Migration
|
3
3
|
def up
|
4
|
-
create_table :
|
4
|
+
create_table :recommendable_stashed_items do |t|
|
5
5
|
t.references :user
|
6
6
|
t.references :stashable, :polymorphic => true
|
7
7
|
t.timestamps
|
8
8
|
end
|
9
9
|
|
10
|
-
add_index :
|
11
|
-
add_index :
|
12
|
-
add_index :
|
10
|
+
add_index :recommendable_stashed_items, :stashable_id
|
11
|
+
add_index :recommendable_stashed_items, :stashable_type
|
12
|
+
add_index :recommendable_stashed_items, [:user_id, :stashable_id, :stashable_type], :unique => true, :name => "user_stashed_constraint"
|
13
13
|
end
|
14
14
|
|
15
15
|
def down
|
16
|
-
drop_table :
|
16
|
+
drop_table :recommendable_stashed_items
|
17
17
|
end
|
18
18
|
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -19,7 +19,20 @@ ActiveRecord::Schema.define(:version => 20120131195416) do
|
|
19
19
|
t.datetime "updated_at", :null => false
|
20
20
|
end
|
21
21
|
|
22
|
-
create_table "
|
22
|
+
create_table "movies", :force => true do |t|
|
23
|
+
t.string "title"
|
24
|
+
t.integer "year"
|
25
|
+
t.datetime "created_at", :null => false
|
26
|
+
t.datetime "updated_at", :null => false
|
27
|
+
end
|
28
|
+
|
29
|
+
create_table "php_frameworks", :force => true do |t|
|
30
|
+
t.string "name"
|
31
|
+
t.datetime "created_at", :null => false
|
32
|
+
t.datetime "updated_at", :null => false
|
33
|
+
end
|
34
|
+
|
35
|
+
create_table "recommendable_dislikes", :force => true do |t|
|
23
36
|
t.integer "user_id"
|
24
37
|
t.integer "dislikeable_id"
|
25
38
|
t.string "dislikeable_type"
|
@@ -27,11 +40,11 @@ ActiveRecord::Schema.define(:version => 20120131195416) do
|
|
27
40
|
t.datetime "updated_at", :null => false
|
28
41
|
end
|
29
42
|
|
30
|
-
add_index "
|
31
|
-
add_index "
|
32
|
-
add_index "
|
43
|
+
add_index "recommendable_dislikes", ["dislikeable_id"], :name => "index_recommendable_dislikes_on_dislikeable_id"
|
44
|
+
add_index "recommendable_dislikes", ["dislikeable_type"], :name => "index_recommendable_dislikes_on_dislikeable_type"
|
45
|
+
add_index "recommendable_dislikes", ["user_id", "dislikeable_id", "dislikeable_type"], :name => "user_dislike_constraint", :unique => true
|
33
46
|
|
34
|
-
create_table "
|
47
|
+
create_table "recommendable_ignores", :force => true do |t|
|
35
48
|
t.integer "user_id"
|
36
49
|
t.integer "ignoreable_id"
|
37
50
|
t.string "ignoreable_type"
|
@@ -39,11 +52,11 @@ ActiveRecord::Schema.define(:version => 20120131195416) do
|
|
39
52
|
t.datetime "updated_at", :null => false
|
40
53
|
end
|
41
54
|
|
42
|
-
add_index "
|
43
|
-
add_index "
|
44
|
-
add_index "
|
55
|
+
add_index "recommendable_ignores", ["ignoreable_id"], :name => "index_recommendable_ignores_on_ignoreable_id"
|
56
|
+
add_index "recommendable_ignores", ["ignoreable_type"], :name => "index_recommendable_ignores_on_ignoreable_type"
|
57
|
+
add_index "recommendable_ignores", ["user_id", "ignoreable_id", "ignoreable_type"], :name => "user_ignore_constraint", :unique => true
|
45
58
|
|
46
|
-
create_table "
|
59
|
+
create_table "recommendable_likes", :force => true do |t|
|
47
60
|
t.integer "user_id"
|
48
61
|
t.integer "likeable_id"
|
49
62
|
t.string "likeable_type"
|
@@ -51,24 +64,11 @@ ActiveRecord::Schema.define(:version => 20120131195416) do
|
|
51
64
|
t.datetime "updated_at", :null => false
|
52
65
|
end
|
53
66
|
|
54
|
-
add_index "
|
55
|
-
add_index "
|
56
|
-
add_index "
|
57
|
-
|
58
|
-
create_table "movies", :force => true do |t|
|
59
|
-
t.string "title"
|
60
|
-
t.integer "year"
|
61
|
-
t.datetime "created_at", :null => false
|
62
|
-
t.datetime "updated_at", :null => false
|
63
|
-
end
|
64
|
-
|
65
|
-
create_table "php_frameworks", :force => true do |t|
|
66
|
-
t.string "name"
|
67
|
-
t.datetime "created_at", :null => false
|
68
|
-
t.datetime "updated_at", :null => false
|
69
|
-
end
|
67
|
+
add_index "recommendable_likes", ["likeable_id"], :name => "index_recommendable_likes_on_likeable_id"
|
68
|
+
add_index "recommendable_likes", ["likeable_type"], :name => "index_recommendable_likes_on_likeable_type"
|
69
|
+
add_index "recommendable_likes", ["user_id", "likeable_id", "likeable_type"], :name => "user_like_constraint", :unique => true
|
70
70
|
|
71
|
-
create_table "
|
71
|
+
create_table "recommendable_stashed_items", :force => true do |t|
|
72
72
|
t.integer "user_id"
|
73
73
|
t.integer "stashable_id"
|
74
74
|
t.string "stashable_type"
|
@@ -76,9 +76,9 @@ ActiveRecord::Schema.define(:version => 20120131195416) do
|
|
76
76
|
t.datetime "updated_at", :null => false
|
77
77
|
end
|
78
78
|
|
79
|
-
add_index "
|
80
|
-
add_index "
|
81
|
-
add_index "
|
79
|
+
add_index "recommendable_stashed_items", ["stashable_id"], :name => "index_recommendable_stashed_items_on_stashable_id"
|
80
|
+
add_index "recommendable_stashed_items", ["stashable_type"], :name => "index_recommendable_stashed_items_on_stashable_type"
|
81
|
+
add_index "recommendable_stashed_items", ["user_id", "stashable_id", "stashable_type"], :name => "user_stashed_constraint", :unique => true
|
82
82
|
|
83
83
|
create_table "users", :force => true do |t|
|
84
84
|
t.string "username"
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: recommendable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sqlite3
|
16
|
-
requirement: &
|
16
|
+
requirement: &70256773489820 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70256773489820
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: minitest
|
27
|
-
requirement: &
|
27
|
+
requirement: &70256773489140 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70256773489140
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: shoulda
|
38
|
-
requirement: &
|
38
|
+
requirement: &70256773488460 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70256773488460
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: yard
|
49
|
-
requirement: &
|
49
|
+
requirement: &70256773487620 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.6.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70256773487620
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: bundler
|
60
|
-
requirement: &
|
60
|
+
requirement: &70256773486820 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.0.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70256773486820
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: jeweler
|
71
|
-
requirement: &
|
71
|
+
requirement: &70256773486040 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.6.4
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70256773486040
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rcov
|
82
|
-
requirement: &
|
82
|
+
requirement: &70256773485460 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70256773485460
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rails
|
93
|
-
requirement: &
|
93
|
+
requirement: &70256773484480 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 3.0.0
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70256773484480
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: redis
|
104
|
-
requirement: &
|
104
|
+
requirement: &70256773483940 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: 2.2.0
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70256773483940
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: resque
|
115
|
-
requirement: &
|
115
|
+
requirement: &70256773483400 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ~>
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: 1.19.0
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *70256773483400
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: resque-loner
|
126
|
-
requirement: &
|
126
|
+
requirement: &70256773482500 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ~>
|
@@ -131,7 +131,7 @@ dependencies:
|
|
131
131
|
version: 1.2.0
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *70256773482500
|
135
135
|
description: Allow a model (typically User) to Like and/or Dislike models in your
|
136
136
|
app. Generate recommendations quickly using redis.
|
137
137
|
email: david@davidcelis.com
|