fav_star 0.2.0
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/.gitignore +1 -0
- data/CHANGELOG.markdown +3 -0
- data/MIT-LICENSE +66 -0
- data/README.markdown +15 -0
- data/Rakefile +19 -0
- data/VERSION +1 -0
- data/fav_star.gemspec +49 -0
- data/lib/acts_as_faveable.rb +41 -0
- data/lib/acts_as_faver.rb +56 -0
- data/lib/fav_star.rb +5 -0
- data/lib/generators/fav_star/fav_star_generator.rb +27 -0
- data/lib/generators/fav_star/templates/fave.rb +15 -0
- data/lib/generators/fav_star/templates/migration.rb +22 -0
- metadata +76 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/CHANGELOG.markdown
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
Copyright (c) 2010 Brady Bouchard (ldawn.com)
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
Major portions of this package were adapted from VoteFu, which is subject to the same license. Here is the original copyright notice for VoteFu:
|
23
|
+
|
24
|
+
Copyright (c) 2008 Peter Jackson (peteonrails.com)
|
25
|
+
|
26
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
27
|
+
a copy of this software and associated documentation files (the
|
28
|
+
"Software"), to deal in the Software without restriction, including
|
29
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
30
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
31
|
+
permit persons to whom the Software is furnished to do so, subject to
|
32
|
+
the following conditions:
|
33
|
+
|
34
|
+
The above copyright notice and this permission notice shall be
|
35
|
+
included in all copies or substantial portions of the Software.
|
36
|
+
|
37
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
38
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
39
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
40
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
41
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
42
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
43
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
44
|
+
|
45
|
+
Major portions of this package were adapted from ActsAsFaveable, which is subject to the same license. Here is the original copyright notice for ActsAsFaveable:
|
46
|
+
|
47
|
+
Copyright (c) 2006 Cosmin Radoi
|
48
|
+
|
49
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
50
|
+
a copy of this software and associated documentation files (the
|
51
|
+
"Software"), to deal in the Software without restriction, including
|
52
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
53
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
54
|
+
permit persons to whom the Software is furnished to do so, subject to
|
55
|
+
the following conditions:
|
56
|
+
|
57
|
+
The above copyright notice and this permission notice shall be
|
58
|
+
included in all copies or substantial portions of the Software.
|
59
|
+
|
60
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
61
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
62
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
63
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
64
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
65
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
66
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "fav_star"
|
9
|
+
gem.summary = "Mark your ActiveRecord models as favourites with only a couple of lines of code."
|
10
|
+
gem.description = "fav_star provides a fairly straightforward module that allows you to keep track of which models your users have favourited."
|
11
|
+
gem.email = "brady@ldawn.com"
|
12
|
+
gem.homepage = "http://github.com/brady8/favstar"
|
13
|
+
gem.authors = ["Brady Bouchard"]
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.0
|
data/fav_star.gemspec
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{fav_star}
|
8
|
+
s.version = "0.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Brady Bouchard"]
|
12
|
+
s.date = %q{2010-08-19}
|
13
|
+
s.description = %q{fav_star provides a fairly straightforward module that allows you to keep track of which models your users have favourited.}
|
14
|
+
s.email = %q{brady@ldawn.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"CHANGELOG.markdown",
|
21
|
+
"MIT-LICENSE",
|
22
|
+
"README.markdown",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"fav_star.gemspec",
|
26
|
+
"lib/acts_as_faveable.rb",
|
27
|
+
"lib/acts_as_faver.rb",
|
28
|
+
"lib/fav_star.rb",
|
29
|
+
"lib/generators/fav_star/fav_star_generator.rb",
|
30
|
+
"lib/generators/fav_star/templates/fave.rb",
|
31
|
+
"lib/generators/fav_star/templates/migration.rb"
|
32
|
+
]
|
33
|
+
s.homepage = %q{http://github.com/brady8/favstar}
|
34
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
35
|
+
s.require_paths = ["lib"]
|
36
|
+
s.rubygems_version = %q{1.3.7}
|
37
|
+
s.summary = %q{Mark your ActiveRecord models as favourites with only a couple of lines of code.}
|
38
|
+
|
39
|
+
if s.respond_to? :specification_version then
|
40
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
41
|
+
s.specification_version = 3
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
else
|
45
|
+
end
|
46
|
+
else
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module FavStar
|
2
|
+
module ActsAsFaveable #:nodoc:
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_faveable
|
10
|
+
has_many :favs, :as => :faveable, :dependent => :nullify
|
11
|
+
|
12
|
+
include FavStar::ActsAsFaveable::InstanceMethods
|
13
|
+
extend FavStar::ActsAsFaveable::SingletonMethods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module SingletonMethods
|
18
|
+
end
|
19
|
+
|
20
|
+
module InstanceMethods
|
21
|
+
|
22
|
+
def favs
|
23
|
+
Fave.where(:faveable_id => id, :faveable_type => self.class.name).count
|
24
|
+
end
|
25
|
+
|
26
|
+
def favers_who_faved
|
27
|
+
self.faves.map(&:faver).uniq
|
28
|
+
end
|
29
|
+
|
30
|
+
def faved_by?(faver)
|
31
|
+
0 < Fave.where(
|
32
|
+
:faveable_id => self.id,
|
33
|
+
:faveable_type => self.class.name,
|
34
|
+
:faver_type => faver.class.name,
|
35
|
+
:faver_id => faver.id
|
36
|
+
).count
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module FavStar #:nodoc:
|
2
|
+
module ActsAsFaver #:nodoc:
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_faver
|
10
|
+
|
11
|
+
has_many :votes, :as => :faver, :dependent => :destroy
|
12
|
+
|
13
|
+
include FavStar::ActsAsFaver::InstanceMethods
|
14
|
+
extend FavStar::ActsAsFaver::SingletonMethods
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module SingletonMethods
|
20
|
+
end
|
21
|
+
|
22
|
+
module InstanceMethods
|
23
|
+
|
24
|
+
def faved?(faveable)
|
25
|
+
0 < Fave.where(
|
26
|
+
:faver_id => self.id,
|
27
|
+
:faver_type => self.class.name,
|
28
|
+
:faveable_id => faveable.id,
|
29
|
+
:faveable_type => faveable.class.name
|
30
|
+
).count
|
31
|
+
end
|
32
|
+
|
33
|
+
def fave!(faveable)
|
34
|
+
Fave.create!(:faveable => faveable, :faver => self) unless self.faved?(faveable)
|
35
|
+
end
|
36
|
+
|
37
|
+
def unfave!(faveable)
|
38
|
+
Fave.where(
|
39
|
+
:faver_id => self.id,
|
40
|
+
:faver_type => self.class.name,
|
41
|
+
:faveable_id => faveable.id,
|
42
|
+
:faveable_type => faveable.class.name
|
43
|
+
).map(&:destroy)
|
44
|
+
end
|
45
|
+
|
46
|
+
def toggle_fave!(faveable)
|
47
|
+
if self.faved?(faveable)
|
48
|
+
unfave!(faveable)
|
49
|
+
else
|
50
|
+
fave!(faveable)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/fav_star.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
|
3
|
+
class FavStarGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
|
9
|
+
# Implement the required interface for Rails::Generators::Migration.
|
10
|
+
def self.next_migration_number(dirname) #:nodoc:
|
11
|
+
next_migration_number = current_migration_number(dirname) + 1
|
12
|
+
if ActiveRecord::Base.timestamped_migrations
|
13
|
+
[Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % next_migration_number].max
|
14
|
+
else
|
15
|
+
"%.3d" % next_migration_number
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_migration
|
20
|
+
migration_template 'migration.rb', File.join('db', 'migrate', 'fav_star_migration.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
def move_fav_model
|
24
|
+
template 'fave.rb', File.join('app', 'models', 'fave.rb')
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Fave < ActiveRecord::Base
|
2
|
+
|
3
|
+
scope :for_faver, lambda { |*args| where(["faver_id = ? AND faver_type = ?", args.first.id, args.first.class.name]) }
|
4
|
+
scope :for_faveable, lambda { |*args| where(["faveable_id = ? AND faveable_type = ?", args.first.id, args.first.class.name]) }
|
5
|
+
scope :recent, lambda { |*args| where(["created_at > ?", (args.first || 2.weeks.ago)]) }
|
6
|
+
scope :descending, order("created_at DESC")
|
7
|
+
|
8
|
+
belongs_to :faveable, :polymorphic => true
|
9
|
+
belongs_to :faver, :polymorphic => true
|
10
|
+
|
11
|
+
attr_accessible :faver, :faveable
|
12
|
+
|
13
|
+
validates_uniqueness_of :faveable_id, :scope => [:faveable_type, :faver_type, :faver_id]
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class FavStarMigration < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
|
4
|
+
create_table :faves, :force => true do |t|
|
5
|
+
t.references :faveable, :polymorphic => true, :null => false
|
6
|
+
t.references :faver, :polymorphic => true
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index :faves, ["faver_id", "faver_type"], :name => "fk_favers"
|
11
|
+
add_index :faves, ["faveable_id", "faveable_type"], :name => "fk_faveables"
|
12
|
+
add_index :faves, ["faver_id", "faver_type", "faveable_id", "faveable_type"], :unique => true, :name => "only_one_fav_per_user"
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.down
|
17
|
+
|
18
|
+
drop_table :faves
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fav_star
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Brady Bouchard
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-08-19 00:00:00 +10:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: fav_star provides a fairly straightforward module that allows you to keep track of which models your users have favourited.
|
22
|
+
email: brady@ldawn.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- README.markdown
|
29
|
+
files:
|
30
|
+
- .gitignore
|
31
|
+
- CHANGELOG.markdown
|
32
|
+
- MIT-LICENSE
|
33
|
+
- README.markdown
|
34
|
+
- Rakefile
|
35
|
+
- VERSION
|
36
|
+
- fav_star.gemspec
|
37
|
+
- lib/acts_as_faveable.rb
|
38
|
+
- lib/acts_as_faver.rb
|
39
|
+
- lib/fav_star.rb
|
40
|
+
- lib/generators/fav_star/fav_star_generator.rb
|
41
|
+
- lib/generators/fav_star/templates/fave.rb
|
42
|
+
- lib/generators/fav_star/templates/migration.rb
|
43
|
+
has_rdoc: true
|
44
|
+
homepage: http://github.com/brady8/favstar
|
45
|
+
licenses: []
|
46
|
+
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options:
|
49
|
+
- --charset=UTF-8
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
version: "0"
|
68
|
+
requirements: []
|
69
|
+
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 1.3.7
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: Mark your ActiveRecord models as favourites with only a couple of lines of code.
|
75
|
+
test_files: []
|
76
|
+
|