acts_as_pickable 0.1.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.
Binary file
@@ -0,0 +1,2 @@
1
+ = Version 0.1.0
2
+ * Gem existence started
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Maciej Mensfeld
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.
@@ -0,0 +1,10 @@
1
+ CHANGELOG.rdoc
2
+ Gemfile
3
+ MIT-LICENSE
4
+ Manifest
5
+ README.md
6
+ Rakefile
7
+ init.rb
8
+ lib/acts_as_pickable.rb
9
+ spec/acts_as_pickable_spec.rb
10
+ spec/spec_helper.rb
@@ -0,0 +1,39 @@
1
+ # ActsAsPickable
2
+ ## Install
3
+
4
+ gem install acts_as_pickable
5
+
6
+ and in your Gemfile:
7
+
8
+ gem 'acts_as_pickable'
9
+
10
+ Model declaration:
11
+
12
+ class CoolClass < ActiveRecord::Base
13
+ acts_as_pickable :column_name (default - :picked)
14
+ end
15
+
16
+ ## About
17
+
18
+ Simple Rails gem allowing ActiveRecord models to be picked (selected).
19
+
20
+ Requirements
21
+
22
+ table.boolean :picked, :default => false
23
+
24
+ ## Example
25
+
26
+ Example? Look into spec dir for rspec file :)
27
+
28
+ ## Note on Patches/Pull Requests
29
+
30
+ * Fork the project.
31
+ * Make your feature addition or bug fix.
32
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
33
+ * Commit, do not mess with Rakefile, version, or history.
34
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
35
+ * Send me a pull request. Bonus points for topic branches.
36
+
37
+ ## Copyright
38
+
39
+ Copyright (c) 2011 Maciej Mensfeld. See LICENSE for details.
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('acts_as_pickable', '0.1.0') do |p|
6
+ p.description = "Rails gem allowing ActiveRecord models have always one element picked (selected)."
7
+ p.url = "https://github.com/mensfeld/Acts-as-Pickable"
8
+ p.author = "Maciej Mensfeld"
9
+ p.email = "maciej@mensfeld.pl"
10
+ p.ignore_pattern = ["tmp/*", "script/*"]
11
+ p.development_dependencies = ["rspec >=2.0.0", "active_record"]
12
+ end
13
+
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{acts_as_pickable}
5
+ s.version = "0.1.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Maciej Mensfeld"]
9
+ s.cert_chain = ["/home/mencio/.cert_keys/gem-public_cert.pem"]
10
+ s.date = %q{2011-04-23}
11
+ s.description = %q{Rails gem allowing ActiveRecord models have always one element picked (selected).}
12
+ s.email = %q{maciej@mensfeld.pl}
13
+ s.extra_rdoc_files = ["CHANGELOG.rdoc", "README.md", "lib/acts_as_pickable.rb"]
14
+ s.files = ["CHANGELOG.rdoc", "Gemfile", "MIT-LICENSE", "Manifest", "README.md", "Rakefile", "init.rb", "lib/acts_as_pickable.rb", "spec/acts_as_pickable_spec.rb", "spec/spec_helper.rb", "acts_as_pickable.gemspec"]
15
+ s.homepage = %q{https://github.com/mensfeld/Acts-as-Pickable}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Acts_as_pickable", "--main", "README.md"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{acts_as_pickable}
19
+ s.rubygems_version = %q{1.5.2}
20
+ s.signing_key = %q{/home/mencio/.cert_keys/gem-private_key.pem}
21
+ s.summary = %q{Rails gem allowing ActiveRecord models have always one element picked (selected).}
22
+
23
+ if s.respond_to? :specification_version then
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
+ s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
28
+ s.add_development_dependency(%q<active_record>, [">= 0"])
29
+ else
30
+ s.add_dependency(%q<rspec>, [">= 2.0.0"])
31
+ s.add_dependency(%q<active_record>, [">= 0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<rspec>, [">= 2.0.0"])
35
+ s.add_dependency(%q<active_record>, [">= 0"])
36
+ end
37
+ end
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'acts_as_pickable'
2
+
@@ -0,0 +1,96 @@
1
+ module Acts
2
+ module AsPickable
3
+
4
+ def self.included(base)
5
+ base.extend AddActsAsMethod
6
+ end
7
+
8
+ module AddActsAsMethod
9
+
10
+ def acts_as_pickable(column = :picked)
11
+ class_eval <<-END
12
+ after_create :set_as_picked
13
+ after_destroy :pick_new_one
14
+ include Acts::AsPickable::InstanceMethods
15
+ END
16
+
17
+ cattr_accessor :pickable_column
18
+ self.pickable_column = column
19
+ end
20
+ end
21
+
22
+ module InstanceMethods
23
+
24
+ def self.included(aClass)
25
+ aClass.extend ClassMethods
26
+ end
27
+
28
+ module ClassMethods
29
+
30
+ # Select new picked element
31
+ def new_picked
32
+ c = self.count
33
+ return nil if c == 0
34
+ if c == 1
35
+ return self.first
36
+ end
37
+
38
+ self.all.each do |q|
39
+ q.send("#{self.pickable_column}=",false)
40
+ q.save
41
+ end
42
+
43
+ s = self.random
44
+
45
+ s.send("#{self.pickable_column}=",true)
46
+ s.save
47
+ s
48
+ end
49
+
50
+ def random(skip_cache = false)
51
+ if ActiveRecord::Base.connection.adapter_name == 'SQLite'
52
+ rand = "Random()"
53
+ else
54
+ rand = "Rand()"
55
+ end
56
+
57
+ unless skip_cache
58
+ order(rand).first
59
+ else
60
+ uncached do
61
+ order(rand).first
62
+ end
63
+ end
64
+ end
65
+
66
+ def picked
67
+ self.where(self.pickable_column => true).first
68
+ end
69
+
70
+ end
71
+
72
+ # Sets current object as picked
73
+ def set_as_picked
74
+ self.class.where(self.class.pickable_column => true).each do |q|
75
+ if q.send(self.class.pickable_column)
76
+ q.send("#{self.class.pickable_column}=", false)
77
+ q.save
78
+ end
79
+ end
80
+ self.send("#{self.class.pickable_column}=", true)
81
+ self.save
82
+ end
83
+
84
+ private
85
+
86
+ def pick_new_one
87
+ if self.send(self.class.pickable_column)
88
+ self.class.where("id <> ?", self.id).first.set_as_picked if self.class.count > 0
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+
96
+ ActiveRecord::Base.send(:include, Acts::AsPickable)
@@ -0,0 +1,213 @@
1
+ require 'spec_helper'
2
+
3
+ ROOT = File.expand_path(File.dirname(__FILE__))
4
+
5
+ class CoolElement < ActiveRecord::Base
6
+ acts_as_pickable
7
+ end
8
+
9
+ class CoolerElement < ActiveRecord::Base
10
+ acts_as_pickable :selected
11
+ end
12
+
13
+ describe CoolElement do
14
+ subject { CoolElement }
15
+ before(:each){ subject.destroy_all }
16
+
17
+ context "when there is no elements" do
18
+ it "should return nothing" do
19
+ subject.new_picked.should == nil
20
+ end
21
+ end
22
+
23
+ context "when there is only one element" do
24
+
25
+ it "should be returned all the time" do
26
+ c = subject.create
27
+ 10.times do
28
+ subject.picked.should == c
29
+ end
30
+ end
31
+
32
+ it "should be picked all the time" do
33
+ c = subject.create
34
+ 10.times do
35
+ subject.new_picked.should == c
36
+ end
37
+ end
38
+
39
+ context "and we destroy it" do
40
+ it "should return nothing" do
41
+ c = subject.create
42
+ c.destroy
43
+ subject.picked.should == nil
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ context "when we have a lot of elements" do
50
+ it "should pick each time a new one" do
51
+ n = subject.create
52
+ n.save!
53
+ n.reload
54
+ n.picked.should == true
55
+ s = subject.create
56
+ s.save!
57
+ n.reload
58
+ 10.times do
59
+ if n != s
60
+ n.should_not eql s
61
+ else
62
+ s = subject.new_daylee
63
+ n.reload
64
+ next
65
+ end
66
+ n.should_not eql s
67
+ end
68
+ end
69
+
70
+ it "should set as picked when created" do
71
+ n = subject.create
72
+ n.save!
73
+ n.reload
74
+ n.picked.should == true
75
+ end
76
+
77
+ it "should pick a new when old picked is deleted" do
78
+ 10.times do
79
+ subject.delete_all
80
+ b = subject.create
81
+ n = subject.create
82
+ subject.picked.should == n
83
+ subject.picked.destroy
84
+ b.reload
85
+ subject.picked.should == b
86
+ end
87
+ end
88
+
89
+ it "force all to be daylee and pick new daylee" do
90
+ subject.delete_all
91
+ b = subject.create
92
+ n = subject.create
93
+ c = subject.create
94
+ b.picked = true
95
+ n.picked = true
96
+ b.save!
97
+ n.save!
98
+ c.save!
99
+ c.reload
100
+ n.reload
101
+ b.reload
102
+ subject.new_picked
103
+ subject.all.each do |s|
104
+ if subject.picked != s
105
+ s.picked.should == false
106
+ end
107
+ end
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+
114
+ describe CoolerElement do
115
+ subject { CoolerElement }
116
+ before(:each){ subject.destroy_all }
117
+
118
+ context "when there is no elements" do
119
+ it "should return nothing" do
120
+ subject.new_picked.should == nil
121
+ end
122
+ end
123
+
124
+ context "when there is only one element" do
125
+
126
+ it "should be returned all the time" do
127
+ c = subject.create
128
+ 10.times do
129
+ subject.picked.should == c
130
+ end
131
+ end
132
+
133
+ it "should be picked all the time" do
134
+ c = subject.create
135
+ 10.times do
136
+ subject.new_picked.should == c
137
+ end
138
+ end
139
+
140
+ context "and we destroy it" do
141
+ it "should return nothing" do
142
+ c = subject.create
143
+ c.destroy
144
+ subject.picked.should == nil
145
+ end
146
+ end
147
+
148
+ end
149
+
150
+ context "when we have a lot of elements" do
151
+ it "should pick each time a new one" do
152
+ n = subject.create
153
+ n.save!
154
+ n.reload
155
+ n.selected.should == true
156
+ s = subject.create
157
+ s.save!
158
+ n.reload
159
+ 10.times do
160
+ if n != s
161
+ n.should_not eql s
162
+ else
163
+ s = subject.new_daylee
164
+ n.reload
165
+ next
166
+ end
167
+ n.should_not eql s
168
+ end
169
+ end
170
+
171
+ it "should set as picked when created" do
172
+ n = subject.create
173
+ n.save!
174
+ n.reload
175
+ n.selected.should == true
176
+ end
177
+
178
+ it "should pick a new when old picked is deleted" do
179
+ 10.times do
180
+ subject.delete_all
181
+ b = subject.create
182
+ n = subject.create
183
+ subject.picked.should == n
184
+ subject.picked.destroy
185
+ b.reload
186
+ subject.picked.should == b
187
+ end
188
+ end
189
+
190
+ it "force all to be daylee and pick new daylee" do
191
+ subject.delete_all
192
+ b = subject.create
193
+ n = subject.create
194
+ c = subject.create
195
+ b.selected = true
196
+ n.selected = true
197
+ b.save!
198
+ n.save!
199
+ c.save!
200
+ c.reload
201
+ n.reload
202
+ b.reload
203
+ subject.new_picked
204
+ subject.all.each do |s|
205
+ if subject.picked != s
206
+ s.selected.should == false
207
+ end
208
+ end
209
+ end
210
+
211
+ end
212
+
213
+ end
@@ -0,0 +1,24 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'rubygems'
5
+ require 'sqlite3'
6
+ require 'active_record'
7
+ require 'acts_as_pickable'
8
+
9
+ ActiveRecord::Base.establish_connection(
10
+ :adapter => "sqlite3",
11
+ :database => ":memory:"
12
+ )
13
+
14
+ ActiveRecord::Schema.define do
15
+ create_table :cool_elements do |table|
16
+ table.boolean :picked, :default => 0
17
+ end
18
+
19
+ create_table :cooler_elements do |table|
20
+ table.boolean :selected, :default => 0
21
+ end
22
+
23
+ end
24
+
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_pickable
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Maciej Mensfeld
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain:
12
+ - |
13
+ -----BEGIN CERTIFICATE-----
14
+ MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZtYWNp
15
+ ZWoxGDAWBgoJkiaJk/IsZAEZFghtZW5zZmVsZDESMBAGCgmSJomT8ixkARkWAnBs
16
+ MB4XDTExMDQwOTA5NDcyMloXDTEyMDQwODA5NDcyMlowPzEPMA0GA1UEAwwGbWFj
17
+ aWVqMRgwFgYKCZImiZPyLGQBGRYIbWVuc2ZlbGQxEjAQBgoJkiaJk/IsZAEZFgJw
18
+ bDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL0+nG3V4/exIeiJ0IN+
19
+ wVfq8Utcu4Qpo+58EIVMIu3FiK+8w6MBvatZnUrRu12pqWLw9xrUkCiYeRErD+jF
20
+ AmdggIM/tu9CcjvURXH7VeTzOVA+pnV+eJWMD61o8HljFVcb/nyEYYVKErtr9/O4
21
+ QrIGv5lnszq1PMj2sBMy2gOP1YnzawncMLmkpp/T5SU4JZ5gAktGMRVz8RxmZzF5
22
+ 6NVqFLbuqSRSU5U//WJvZVJt8dycCGgQzBM4Vi3nkOWyjIF0BANf1TqnlU2u6s8d
23
+ UK1AoDZfg5feef5e8eqoomHebX1opNGM/SOQhu3LRgax4rJfnl6VS3I2wighohsf
24
+ AgcCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUGlrWBqxVieAPk7NEzBDp
25
+ kM+iAMMwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAJMoyBaJs8boiz
26
+ lFpbw6MWjk+7ZhqoHpFrWEV4nzb5GzyHZ7GU/pa1fSEQR0SCs+LnTLQbAYNQyUTT
27
+ O+UsTuA7xzI//v6cSodv3Q9NbfoDlou74xv1NXorWoosQFMpVWrXv+c/1RqU3cq4
28
+ WUr+rRiveEXG4tXOwkrpX8KH8xVp2vQZcGw3AXPqhzfqDGzpHd6ws3lk+8HoSrSo
29
+ 2L68tDoxraF2Z2toAg9vfFw1+mOeDk1xVIPVcBy3tJxstHfHGHlQuMiRiDQX2b2D
30
+ YYU8UWVt2841IwB5Dgl4O+atXhe9ZTBO0W32pl4Bq5CP9lhQRT1KL7sxfznJlF7Y
31
+ BH3YFsdk
32
+ -----END CERTIFICATE-----
33
+
34
+ date: 2011-04-23 00:00:00 +02:00
35
+ default_executable:
36
+ dependencies:
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id001 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 2.0.0
46
+ type: :development
47
+ version_requirements: *id001
48
+ - !ruby/object:Gem::Dependency
49
+ name: active_record
50
+ prerelease: false
51
+ requirement: &id002 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id002
59
+ description: Rails gem allowing ActiveRecord models have always one element picked (selected).
60
+ email: maciej@mensfeld.pl
61
+ executables: []
62
+
63
+ extensions: []
64
+
65
+ extra_rdoc_files:
66
+ - CHANGELOG.rdoc
67
+ - README.md
68
+ - lib/acts_as_pickable.rb
69
+ files:
70
+ - CHANGELOG.rdoc
71
+ - Gemfile
72
+ - MIT-LICENSE
73
+ - Manifest
74
+ - README.md
75
+ - Rakefile
76
+ - init.rb
77
+ - lib/acts_as_pickable.rb
78
+ - spec/acts_as_pickable_spec.rb
79
+ - spec/spec_helper.rb
80
+ - acts_as_pickable.gemspec
81
+ has_rdoc: true
82
+ homepage: https://github.com/mensfeld/Acts-as-Pickable
83
+ licenses: []
84
+
85
+ post_install_message:
86
+ rdoc_options:
87
+ - --line-numbers
88
+ - --inline-source
89
+ - --title
90
+ - Acts_as_pickable
91
+ - --main
92
+ - README.md
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: "1.2"
107
+ requirements: []
108
+
109
+ rubyforge_project: acts_as_pickable
110
+ rubygems_version: 1.5.2
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Rails gem allowing ActiveRecord models have always one element picked (selected).
114
+ test_files: []
115
+
Binary file