flag_shih_tzu 0.1.0.pre → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/.travis.yml +7 -0
- data/Gemfile +1 -1
- data/README.rdoc +121 -98
- data/Rakefile +11 -3
- data/flag_shih_tzu.gemspec +11 -2
- data/gemfiles/Gemfile.activerecord-2.3.x +5 -0
- data/gemfiles/Gemfile.activerecord-3.0.x +5 -0
- data/gemfiles/Gemfile.activerecord-3.1.x +5 -0
- data/lib/flag_shih_tzu.rb +24 -10
- data/lib/flag_shih_tzu/version.rb +1 -1
- data/test/database.yml +7 -11
- data/test/flag_shih_tzu_test.rb +85 -43
- data/test/test_helper.rb +11 -32
- metadata +107 -20
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -1,59 +1,76 @@
|
|
1
1
|
=FlagShihTzu
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Bit fields for ActiveRecord
|
4
|
+
|
5
|
+
An extension for {ActiveRecord}[https://rubygems.org/gems/activerecord]
|
6
|
+
to store a collection of boolean attributes in a single integer column
|
7
|
+
as a bit field.
|
5
8
|
|
6
9
|
http://github.com/xing/flag_shih_tzu
|
7
10
|
|
8
|
-
This
|
11
|
+
This gem lets you use a single integer column in an ActiveRecord model
|
9
12
|
to store a collection of boolean attributes (flags). Each flag can be used
|
10
13
|
almost in the same way you would use any boolean attribute on an
|
11
14
|
ActiveRecord object.
|
12
15
|
|
13
16
|
The benefits:
|
14
17
|
* No migrations needed for new boolean attributes. This helps a lot
|
15
|
-
if you have very large db-tables
|
16
|
-
possible.
|
18
|
+
if you have very large db-tables, on which you want to avoid ALTER TABLE
|
19
|
+
whenever possible.
|
17
20
|
* Only the one integer column needs to be indexed.
|
18
21
|
|
19
22
|
Using FlagShihTzu, you can add new boolean attributes whenever you want,
|
20
23
|
without needing any migration. Just add a new flag to the +has_flags+ call.
|
21
24
|
|
22
|
-
And just in case you are wondering what "Shih Tzu"
|
25
|
+
And just in case you are wondering what a "Shih Tzu" is:
|
23
26
|
http://en.wikipedia.org/wiki/Shih_Tzu
|
24
27
|
|
25
28
|
|
29
|
+
==Build status
|
30
|
+
|
31
|
+
{<img src="https://secure.travis-ci.org/xing/flag_shih_tzu.png" />}[http://travis-ci.org/xing/flag_shih_tzu]
|
32
|
+
|
33
|
+
|
26
34
|
==Prerequisites
|
27
35
|
|
28
|
-
|
29
|
-
to store the flags, which should be defined to not allow NULL values and
|
30
|
-
should have a default value of 0 (which means all flags are initially set to
|
31
|
-
false).
|
36
|
+
The gem is actively being tested with:
|
32
37
|
|
33
|
-
|
34
|
-
PostgreSQL and SQLite3 databases
|
35
|
-
|
38
|
+
* ActiveRecord versions 2.3.x, 3.0.x, 3.1.x
|
39
|
+
* MySQL, PostgreSQL and SQLite3 databases
|
40
|
+
* Ruby 1.8.7 and 1.9.2
|
36
41
|
|
37
42
|
|
38
43
|
==Installation
|
39
44
|
|
40
|
-
===
|
45
|
+
===Rails 2.x
|
46
|
+
|
47
|
+
In environment.rb:
|
48
|
+
|
49
|
+
config.gem 'flag_shih_tzu'
|
50
|
+
|
51
|
+
Then:
|
41
52
|
|
42
|
-
|
43
|
-
./script/plugin install git://github.com/xing/flag_shih_tzu.git
|
53
|
+
$ rake gems:install # use sudo if necessary
|
44
54
|
|
45
|
-
===
|
55
|
+
===Rails 3
|
46
56
|
|
47
|
-
|
57
|
+
In Gemfile:
|
48
58
|
|
49
|
-
gem 'flag_shih_tzu'
|
59
|
+
gem 'flag_shih_tzu'
|
50
60
|
|
51
|
-
|
61
|
+
Then:
|
62
|
+
|
63
|
+
$ bundle install
|
52
64
|
|
53
|
-
bundle install
|
54
65
|
|
55
66
|
==Usage
|
56
67
|
|
68
|
+
FlagShihTzu assumes that your ActiveRecord model already has an integer field
|
69
|
+
to store the flags, which should be defined to not allow NULL values and
|
70
|
+
should have a default value of 0 (which means all flags are initially set to
|
71
|
+
false).
|
72
|
+
|
73
|
+
|
57
74
|
===Defining the flags
|
58
75
|
|
59
76
|
class Spaceship < ActiveRecord::Base
|
@@ -71,6 +88,44 @@ That is why the plugin forces you to set them explicitly.
|
|
71
88
|
The values are symbols for the flags being created.
|
72
89
|
|
73
90
|
|
91
|
+
===How it stores the values
|
92
|
+
|
93
|
+
As said, FlagShihTzu uses a single integer column to store the values for all
|
94
|
+
the defined flags as a bit field.
|
95
|
+
|
96
|
+
The bit position of a flag corresponds to the given key.
|
97
|
+
|
98
|
+
This way, we can use bit operators on the stored integer value to set, unset
|
99
|
+
and check individual flags.
|
100
|
+
|
101
|
+
+---+---+---+ +---+---+---+
|
102
|
+
| | | | | | | |
|
103
|
+
Bit position | 3 | 2 | 1 | | 3 | 2 | 1 |
|
104
|
+
(flag key) | | | | | | | |
|
105
|
+
+---+---+---+ +---+---+---+
|
106
|
+
| | | | | | | |
|
107
|
+
Bit value | 4 | 2 | 1 | | 4 | 2 | 1 |
|
108
|
+
| | | | | | | |
|
109
|
+
+---+---+---+ +---+---+---+
|
110
|
+
| e | s | w | | e | s | w |
|
111
|
+
| l | h | a | | l | h | a |
|
112
|
+
| e | i | r | | e | i | r |
|
113
|
+
| c | e | p | | c | e | p |
|
114
|
+
| t | l | d | | t | l | d |
|
115
|
+
| r | d | r | | r | d | r |
|
116
|
+
| o | s | i | | o | s | i |
|
117
|
+
| l | | v | | l | | v |
|
118
|
+
| y | | e | | y | | e |
|
119
|
+
| t | | | | t | | |
|
120
|
+
| e | | | | e | | |
|
121
|
+
| s | | | | s | | |
|
122
|
+
+---+---+---+ +---+---+---+
|
123
|
+
| 1 | 1 | 0 | = 4 + 2 = 6 | 1 | 0 | 1 | = 4 + 1 = 5
|
124
|
+
+---+---+---+ +---+---+---+
|
125
|
+
|
126
|
+
Read more about bit fields here: http://en.wikipedia.org/wiki/Bit_field
|
127
|
+
|
128
|
+
|
74
129
|
===Using a custom column name
|
75
130
|
|
76
131
|
The default column name to store the flags is 'flags', but you can provide a
|
@@ -82,7 +137,7 @@ different columns for separate flags:
|
|
82
137
|
3 => :electrolytes,
|
83
138
|
:column => 'features'
|
84
139
|
|
85
|
-
has_flags 1 => :spock,
|
140
|
+
has_flags 1 => :spock,
|
86
141
|
2 => :scott,
|
87
142
|
3 => :kirk,
|
88
143
|
:column => 'crew'
|
@@ -96,12 +151,17 @@ on Spaceship:
|
|
96
151
|
Spaceship#warpdrive
|
97
152
|
Spaceship#warpdrive?
|
98
153
|
Spaceship#warpdrive=
|
154
|
+
Spaceship#warpdrive_changed?
|
155
|
+
|
99
156
|
Spaceship#shields
|
100
157
|
Spaceship#shields?
|
101
158
|
Spaceship#shields=
|
159
|
+
Spaceship#shields_changed?
|
160
|
+
|
102
161
|
Spaceship#electrolytes
|
103
162
|
Spaceship#electrolytes?
|
104
163
|
Spaceship#electrolytes=
|
164
|
+
Spaceship#electrolytes_changed?
|
105
165
|
|
106
166
|
|
107
167
|
===Generated named scopes
|
@@ -141,44 +201,6 @@ the scopes. The option on has_flags is still named <tt>:named_scopes</tt> howeve
|
|
141
201
|
...
|
142
202
|
|
143
203
|
|
144
|
-
===How it stores the values
|
145
|
-
|
146
|
-
As said, FlagShihTzu uses a single integer column to store the values for all
|
147
|
-
the defined flags as a bit field.
|
148
|
-
|
149
|
-
The bit position of a flag corresponds to the given key.
|
150
|
-
|
151
|
-
This way, we can use bit operators on the stored integer value to set, unset
|
152
|
-
and check individual flags.
|
153
|
-
|
154
|
-
+---+---+---+ +---+---+---+
|
155
|
-
| | | | | | | |
|
156
|
-
Bit position | 3 | 2 | 1 | | 3 | 2 | 1 |
|
157
|
-
(flag key) | | | | | | | |
|
158
|
-
+---+---+---+ +---+---+---+
|
159
|
-
| | | | | | | |
|
160
|
-
Bit value | 4 | 2 | 1 | | 4 | 2 | 1 |
|
161
|
-
| | | | | | | |
|
162
|
-
+---+---+---+ +---+---+---+
|
163
|
-
| e | s | w | | e | s | w |
|
164
|
-
| l | h | a | | l | h | a |
|
165
|
-
| e | i | r | | e | i | r |
|
166
|
-
| c | e | p | | c | e | p |
|
167
|
-
| t | l | d | | t | l | d |
|
168
|
-
| r | d | r | | r | d | r |
|
169
|
-
| o | s | i | | o | s | i |
|
170
|
-
| l | | v | | l | | v |
|
171
|
-
| y | | e | | y | | e |
|
172
|
-
| t | | | | t | | |
|
173
|
-
| e | | | | e | | |
|
174
|
-
| s | | | | s | | |
|
175
|
-
+---+---+---+ +---+---+---+
|
176
|
-
| 1 | 1 | 0 | = 4 + 2 = 6 | 1 | 0 | 1 | = 4 + 1 = 5
|
177
|
-
+---+---+---+ +---+---+---+
|
178
|
-
|
179
|
-
Read more about bit fields here: http://en.wikipedia.org/wiki/Bit_field
|
180
|
-
|
181
|
-
|
182
204
|
===Support for manually building conditions
|
183
205
|
|
184
206
|
The following class methods may support you when manually building
|
@@ -190,8 +212,8 @@ ActiveRecord conditions:
|
|
190
212
|
Spaceship.not_shields_condition # "(spaceships.flags not in (2,3,6,7))"
|
191
213
|
Spaceship.electrolytes_condition # "(spaceships.flags in (4,5,6,7))"
|
192
214
|
Spaceship.not_electrolytes_condition # "(spaceships.flags not in (4,5,6,7))"
|
193
|
-
|
194
|
-
These methods also accept a :table_alias option that can be used when
|
215
|
+
|
216
|
+
These methods also accept a :table_alias option that can be used when
|
195
217
|
generating SQL that references the same table more than once:
|
196
218
|
|
197
219
|
Spaceship.shields_condition(:table_alias => 'evil_spaceships') # "(evil_spaceships.flags in (2,3,6,7))"
|
@@ -209,74 +231,75 @@ For MySQL, depending on your MySQL settings, this can even hit the
|
|
209
231
|
In this case, consider changing the flag query mode to <tt>:bit_operator</tt>
|
210
232
|
instead of <tt>:in_list</tt>, like so:
|
211
233
|
|
212
|
-
has_flags 1 => :warpdrive,
|
213
|
-
2 => :shields,
|
234
|
+
has_flags 1 => :warpdrive,
|
235
|
+
2 => :shields,
|
214
236
|
:flag_query_mode => :bit_operator
|
215
237
|
|
216
238
|
This will modify the generated condition and named_scope methods to use bit
|
217
239
|
operators in the SQL instead of an IN() list:
|
218
240
|
|
219
|
-
Spaceship.warpdrive_condition
|
220
|
-
Spaceship.not_warpdrive_condition
|
221
|
-
Spaceship.shields_condition
|
222
|
-
Spaceship.not_shields_condition
|
241
|
+
Spaceship.warpdrive_condition # "(spaceships.flags & 1 = 1)",
|
242
|
+
Spaceship.not_warpdrive_condition # "(spaceships.flags & 1 = 0)",
|
243
|
+
Spaceship.shields_condition # "(spaceships.flags & 2 = 2)",
|
244
|
+
Spaceship.not_shields_condition # "(spaceships.flags & 2 = 0)",
|
223
245
|
|
224
|
-
Spaceship.warpdrive
|
225
|
-
Spaceship.not_warpdrive
|
226
|
-
Spaceship.shields
|
227
|
-
Spaceship.not_shields
|
246
|
+
Spaceship.warpdrive # :conditions => "(spaceships.flags & 1 = 1)"
|
247
|
+
Spaceship.not_warpdrive # :conditions => "(spaceships.flags & 1 = 0)"
|
248
|
+
Spaceship.shields # :conditions => "(spaceships.flags & 2 = 2)"
|
249
|
+
Spaceship.not_shields # :conditions => "(spaceships.flags & 2 = 0)"
|
228
250
|
|
229
251
|
The drawback is that due to the bit operator, this query can not use an index
|
230
252
|
on the flags column.
|
231
253
|
|
232
254
|
|
233
|
-
==Running the
|
255
|
+
==Running the gem tests
|
256
|
+
|
257
|
+
First, make sure all required gems are installed:
|
258
|
+
|
259
|
+
$ bundle install
|
234
260
|
|
235
|
-
|
236
|
-
|
237
|
-
1. Modify <tt>test/database.yml</tt> to fit your test environment.
|
238
|
-
2. If needed, create the test database you configured in <tt>test/database.yml</tt>.
|
261
|
+
The default rake test task will run the tests against the currently locked
|
262
|
+
ActiveRecord version (see +Gemfile.lock+):
|
239
263
|
|
240
|
-
|
264
|
+
$ bundle exec rake test
|
241
265
|
|
242
|
-
|
266
|
+
If you want to run the tests against all supported ActiveRecord versions:
|
243
267
|
|
244
|
-
|
268
|
+
$ bundle exec rake test:all
|
245
269
|
|
246
|
-
|
270
|
+
This will internally use bundler to load specific ActiveRecord versions
|
271
|
+
before executing the tests (see +gemfiles/+), e.g.:
|
247
272
|
|
248
|
-
|
273
|
+
$ BUNDLE_GEMFILE='gemfiles/Gemfile.activerecord-3.1.x' bundle exec rake test
|
274
|
+
|
275
|
+
|
276
|
+
All tests will use an in-memory sqlite database by default.
|
277
|
+
If you want to use a different database, see <tt>test/database.yml</tt>,
|
278
|
+
install the required adapter gem and use the DB environment variable to
|
279
|
+
specify which config from <tt>test/database.yml</tt> to use, e.g.:
|
280
|
+
|
281
|
+
$ DB=mysql bundle exec rake
|
249
282
|
|
250
283
|
|
251
284
|
==Authors
|
252
285
|
|
253
286
|
{Patryk Peszko}[http://github.com/ppeszko],
|
254
287
|
{Sebastian Roebke}[http://github.com/boosty],
|
255
|
-
{David Anderson}[http://github.com/alpinegizmo]
|
256
|
-
|
288
|
+
{David Anderson}[http://github.com/alpinegizmo],
|
289
|
+
{Tim Payton}[http://github.com/dizzy42]
|
290
|
+
and a helpful group of
|
291
|
+
{contributors}[https://github.com/xing/flag_shih_tzu/contributors].
|
292
|
+
Thanks!
|
257
293
|
|
258
294
|
Please find out more about our work in our
|
259
295
|
{tech blog}[http://blog.xing.com/category/english/tech-blog].
|
260
296
|
|
261
297
|
|
262
|
-
==Contributors
|
263
|
-
|
264
|
-
{TobiTobes}[http://github.com/rngtng],
|
265
|
-
{Martin Stannard}[http://github.com/martinstannard],
|
266
|
-
{Ladislav Martincik}[http://github.com/lacomartincik],
|
267
|
-
{Peter Boling}[http://github.com/pboling],
|
268
|
-
{Daniel Jagszent}[http://github.com/d--j],
|
269
|
-
{Thorsten Boettger}[http://github.com/alto],
|
270
|
-
{Darren Torpey}[http://github.com/darrentorpey],
|
271
|
-
{Joost Baaij}[http://github.com/tilsammans] and
|
272
|
-
{Musy Bite}[http://github.com/musybite]
|
273
|
-
|
274
|
-
|
275
298
|
==License
|
276
299
|
|
277
300
|
The MIT License
|
278
301
|
|
279
|
-
Copyright (c)
|
302
|
+
Copyright (c) 2011 {XING AG}[http://www.xing.com/]
|
280
303
|
|
281
304
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
282
305
|
of this software and associated documentation files (the "Software"), to deal
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/testtask'
|
3
|
-
require '
|
3
|
+
require 'rdoc/task'
|
4
4
|
|
5
5
|
require 'bundler'
|
6
6
|
Bundler::GemHelper.install_tasks
|
@@ -16,15 +16,23 @@ Rake::TestTask.new(:test) do |t|
|
|
16
16
|
end
|
17
17
|
|
18
18
|
desc 'Generate documentation for the flag_shih_tzu plugin.'
|
19
|
-
|
19
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
20
20
|
rdoc.rdoc_dir = 'rdoc'
|
21
21
|
rdoc.title = 'FlagShihTzu'
|
22
|
-
rdoc.options << '--line-numbers'
|
22
|
+
rdoc.options << '--line-numbers'
|
23
23
|
rdoc.rdoc_files.include('README.rdoc')
|
24
24
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
25
|
end
|
26
26
|
|
27
27
|
namespace :test do
|
28
|
+
desc 'Test against all supported ActiveRecord versions'
|
29
|
+
task :all do
|
30
|
+
%w(2.3.x 3.0.x 3.1.x).each do |version|
|
31
|
+
sh "BUNDLE_GEMFILE='gemfiles/Gemfile.activerecord-#{version}' bundle"
|
32
|
+
sh "BUNDLE_GEMFILE='gemfiles/Gemfile.activerecord-#{version}' bundle exec rake test"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
28
36
|
desc 'Measures test coverage'
|
29
37
|
task :coverage do
|
30
38
|
rm_f "coverage"
|
data/flag_shih_tzu.gemspec
CHANGED
@@ -8,9 +8,10 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Patryk Peszko", "Sebastian Roebke", "David Anderson", "Tim Payton"]
|
10
10
|
s.homepage = "https://github.com/xing/flag_shih_tzu"
|
11
|
-
s.summary = %q{
|
11
|
+
s.summary = %q{Bit fields for ActiveRecord}
|
12
12
|
s.description = <<-EODOC
|
13
|
-
|
13
|
+
Bit fields for ActiveRecord:
|
14
|
+
This gem lets you use a single integer column in an ActiveRecord model
|
14
15
|
to store a collection of boolean attributes (flags). Each flag can be used
|
15
16
|
almost in the same way you would use any boolean attribute on an
|
16
17
|
ActiveRecord object.
|
@@ -20,4 +21,12 @@ ActiveRecord object.
|
|
20
21
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
22
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
23
|
s.require_paths = ["lib"]
|
24
|
+
|
25
|
+
s.add_dependency "activerecord", ">= 2.3.0"
|
26
|
+
|
27
|
+
s.add_development_dependency "bundler"
|
28
|
+
s.add_development_dependency "rdoc", ">= 2.4.2"
|
29
|
+
s.add_development_dependency "rake"
|
30
|
+
s.add_development_dependency "rcov"
|
31
|
+
s.add_development_dependency "sqlite3"
|
23
32
|
end
|
data/lib/flag_shih_tzu.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "active_record"
|
3
|
+
require "active_support/all"
|
4
|
+
|
1
5
|
module FlagShihTzu
|
2
|
-
|
6
|
+
# taken from ActiveRecord::ConnectionAdapters::Column
|
7
|
+
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE']
|
8
|
+
|
3
9
|
DEFAULT_COLUMN_NAME = 'flags'
|
4
10
|
|
5
11
|
def self.included(base)
|
6
12
|
base.extend(ClassMethods)
|
13
|
+
base.class_attribute :flag_options
|
14
|
+
base.class_attribute :flag_mapping
|
7
15
|
end
|
8
16
|
|
9
17
|
class IncorrectFlagColumnException < Exception; end
|
@@ -18,19 +26,17 @@ module FlagShihTzu
|
|
18
26
|
:column => DEFAULT_COLUMN_NAME,
|
19
27
|
:flag_query_mode => :in_list
|
20
28
|
}.update(opts)
|
21
|
-
colmn = opts[:column]
|
29
|
+
colmn = opts[:column].to_s
|
22
30
|
|
23
31
|
return unless check_flag_column(colmn)
|
24
32
|
|
25
33
|
# options are stored in a class level hash and apply per-column
|
26
|
-
|
27
|
-
|
28
|
-
flag_options[colmn] = opts
|
34
|
+
self.flag_options ||= {}
|
35
|
+
self.flag_options[colmn] = opts
|
29
36
|
|
30
37
|
# the mappings are stored in this class level hash and apply per-column
|
31
|
-
|
32
|
-
|
33
|
-
flag_mapping[colmn] ||= {}
|
38
|
+
self.flag_mapping ||= {}
|
39
|
+
self.flag_mapping[colmn] ||= {}
|
34
40
|
|
35
41
|
flag_hash.each do |flag_key, flag_name|
|
36
42
|
raise ArgumentError, "has_flags: flag keys should be positive integers, and #{flag_key} is not" unless is_valid_flag_key(flag_key)
|
@@ -53,6 +59,15 @@ module FlagShihTzu
|
|
53
59
|
FlagShihTzu::TRUE_VALUES.include?(value) ? enable_flag(:#{flag_name}, '#{colmn}') : disable_flag(:#{flag_name}, '#{colmn}')
|
54
60
|
end
|
55
61
|
|
62
|
+
def #{flag_name}_changed?
|
63
|
+
if colmn_changes = changes['#{colmn}']
|
64
|
+
flag_bit = self.class.flag_mapping['#{colmn}'][:#{flag_name}]
|
65
|
+
(colmn_changes[0] & flag_bit) != (colmn_changes[1] & flag_bit)
|
66
|
+
else
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
56
71
|
def self.#{flag_name}_condition(options = {})
|
57
72
|
sql_condition_for_flag(:#{flag_name}, '#{colmn}', true, options[:table_alias] || self.table_name)
|
58
73
|
end
|
@@ -98,7 +113,7 @@ module FlagShihTzu
|
|
98
113
|
# If you are using ActiveRecord then you only want to check for the table if the table exists so it won't fail pre-migration
|
99
114
|
has_ar = !!defined?(ActiveRecord) && self.respond_to?(:descends_from_active_record?)
|
100
115
|
# Supposedly Rails 2.3 takes care of this, but this precaution is needed for backwards compatibility
|
101
|
-
has_table = has_ar ?
|
116
|
+
has_table = has_ar ? connection.tables.include?(table_name) : true
|
102
117
|
|
103
118
|
logger.warn("Error: Table '#{table_name}' doesn't exist") and return false unless has_table
|
104
119
|
|
@@ -207,4 +222,3 @@ module FlagShihTzu
|
|
207
222
|
end
|
208
223
|
|
209
224
|
end
|
210
|
-
|
data/test/database.yml
CHANGED
@@ -1,17 +1,13 @@
|
|
1
|
-
|
1
|
+
sqlite:
|
2
2
|
adapter: sqlite3
|
3
|
-
database:
|
4
|
-
|
3
|
+
database: ":memory:"
|
4
|
+
timeout: 500
|
5
5
|
mysql:
|
6
6
|
adapter: mysql2
|
7
|
-
|
8
|
-
username:
|
9
|
-
|
10
|
-
database: flag_shih_tzu_plugin_test
|
11
|
-
|
7
|
+
database: flag_shih_tzu_test
|
8
|
+
username:
|
9
|
+
encoding: utf8
|
12
10
|
postgresql:
|
13
11
|
adapter: postgresql
|
12
|
+
database: flag_shih_tzu_test
|
14
13
|
username: postgres
|
15
|
-
password:
|
16
|
-
database: flag_shih_tzu_plugin_test
|
17
|
-
min_messages: ERROR
|
data/test/flag_shih_tzu_test.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/test_helper.rb')
|
2
|
-
load_schema
|
3
2
|
|
4
3
|
class Spaceship < ActiveRecord::Base
|
5
4
|
set_table_name 'spaceships'
|
6
5
|
include FlagShihTzu
|
7
6
|
|
8
|
-
has_flags 1 => :warpdrive,
|
9
|
-
2 => :shields,
|
7
|
+
has_flags 1 => :warpdrive,
|
8
|
+
2 => :shields,
|
10
9
|
3 => :electrolytes
|
11
10
|
end
|
12
11
|
|
@@ -31,6 +30,13 @@ class SpaceshipWithCustomFlagsColumn < ActiveRecord::Base
|
|
31
30
|
has_flags(1 => :warpdrive, 2 => :hyperspace, :column => 'bits')
|
32
31
|
end
|
33
32
|
|
33
|
+
class SpaceshipWithColumnNameAsSymol < ActiveRecord::Base
|
34
|
+
set_table_name 'spaceships_with_custom_flags_column'
|
35
|
+
include FlagShihTzu
|
36
|
+
|
37
|
+
has_flags(1 => :warpdrive, 2 => :hyperspace, :column => :bits)
|
38
|
+
end
|
39
|
+
|
34
40
|
class SpaceshipWith2CustomFlagsColumn < ActiveRecord::Base
|
35
41
|
set_table_name 'spaceships_with_2_custom_flags_column'
|
36
42
|
include FlagShihTzu
|
@@ -42,7 +48,7 @@ end
|
|
42
48
|
class SpaceshipWithBitOperatorQueryMode < ActiveRecord::Base
|
43
49
|
set_table_name 'spaceships'
|
44
50
|
include FlagShihTzu
|
45
|
-
|
51
|
+
|
46
52
|
has_flags(1 => :warpdrive, 2 => :shields, :flag_query_mode => :bit_operator)
|
47
53
|
end
|
48
54
|
|
@@ -54,7 +60,7 @@ class Planet < ActiveRecord::Base
|
|
54
60
|
end
|
55
61
|
|
56
62
|
class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
57
|
-
|
63
|
+
|
58
64
|
def setup
|
59
65
|
Spaceship.destroy_all
|
60
66
|
end
|
@@ -87,14 +93,14 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
87
93
|
)
|
88
94
|
end
|
89
95
|
end
|
90
|
-
|
96
|
+
|
91
97
|
def test_has_flags_should_raise_an_exception_when_desired_flag_name_method_already_defined
|
92
98
|
assert_raises ArgumentError do
|
93
99
|
eval(<<-EOF
|
94
100
|
class SpaceshipWithAlreadyUsedMethod < ActiveRecord::Base
|
95
101
|
set_table_name 'spaceships_with_2_custom_flags_column'
|
96
102
|
include FlagShihTzu
|
97
|
-
|
103
|
+
|
98
104
|
def jeanluckpicard; end
|
99
105
|
|
100
106
|
has_flags({ 1 => :jeanluckpicard }, :column => 'bits')
|
@@ -110,7 +116,7 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
110
116
|
class SpaceshipWithAlreadyUsedMethodByFlagshitzu < ActiveRecord::Base
|
111
117
|
set_table_name 'spaceships_with_2_custom_flags_column'
|
112
118
|
include FlagShihTzu
|
113
|
-
|
119
|
+
|
114
120
|
has_flags({ 1 => :jeanluckpicard }, :column => 'bits')
|
115
121
|
has_flags({ 1 => :jeanluckpicard }, :column => 'bits')
|
116
122
|
end
|
@@ -138,7 +144,7 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
138
144
|
assert_equal "(spaceships.flags in (2,3,6,7))", Spaceship.shields_condition
|
139
145
|
assert_equal "(spaceships.flags in (4,5,6,7))", Spaceship.electrolytes_condition
|
140
146
|
end
|
141
|
-
|
147
|
+
|
142
148
|
def test_should_accept_a_table_alias_option_for_sql_condition_method
|
143
149
|
assert_equal "(old_spaceships.flags in (1,3,5,7))", Spaceship.warpdrive_condition(:table_alias => 'old_spaceships')
|
144
150
|
end
|
@@ -155,10 +161,10 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
155
161
|
assert_equal "(spaceships.flags not in (2,3,6,7))", Spaceship.not_shields_condition
|
156
162
|
assert_equal "(spaceships.flags not in (4,5,6,7))", Spaceship.not_electrolytes_condition
|
157
163
|
end
|
158
|
-
|
164
|
+
|
159
165
|
def test_should_define_a_sql_condition_method_for_flag_enabled_with_custom_table_name
|
160
|
-
assert_equal "(custom_spaceships.flags in (1,3,5,7))", Spaceship.send(
|
161
|
-
end
|
166
|
+
assert_equal "(custom_spaceships.flags in (1,3,5,7))", Spaceship.send(:sql_condition_for_flag, :warpdrive, 'flags', true, 'custom_spaceships')
|
167
|
+
end
|
162
168
|
|
163
169
|
def test_should_define_a_sql_condition_method_for_flag_enabled_with_2_colmns_not_enabled
|
164
170
|
assert_equal "(spaceships_with_2_custom_flags_column.bits not in (1,3))", SpaceshipWith2CustomFlagsColumn.not_warpdrive_condition
|
@@ -166,7 +172,7 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
166
172
|
assert_equal "(spaceships_with_2_custom_flags_column.commanders not in (1,3))", SpaceshipWith2CustomFlagsColumn.not_jeanlucpicard_condition
|
167
173
|
assert_equal "(spaceships_with_2_custom_flags_column.commanders not in (2,3))", SpaceshipWith2CustomFlagsColumn.not_dajanatroj_condition
|
168
174
|
end
|
169
|
-
|
175
|
+
|
170
176
|
def test_should_define_a_sql_condition_method_for_flag_enabled_using_bit_operators
|
171
177
|
assert_equal "(spaceships.flags & 1 = 1)", SpaceshipWithBitOperatorQueryMode.warpdrive_condition
|
172
178
|
assert_equal "(spaceships.flags & 2 = 2)", SpaceshipWithBitOperatorQueryMode.shields_condition
|
@@ -178,39 +184,39 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
178
184
|
end
|
179
185
|
|
180
186
|
def test_should_define_a_named_scope_for_flag_enabled
|
181
|
-
|
182
|
-
|
183
|
-
|
187
|
+
assert_where_value "(spaceships.flags in (1,3,5,7))", Spaceship.warpdrive
|
188
|
+
assert_where_value "(spaceships.flags in (2,3,6,7))", Spaceship.shields
|
189
|
+
assert_where_value "(spaceships.flags in (4,5,6,7))", Spaceship.electrolytes
|
184
190
|
end
|
185
191
|
|
186
192
|
def test_should_define_a_named_scope_for_flag_not_enabled
|
187
|
-
|
188
|
-
|
189
|
-
|
193
|
+
assert_where_value "(spaceships.flags not in (1,3,5,7))", Spaceship.not_warpdrive
|
194
|
+
assert_where_value "(spaceships.flags not in (2,3,6,7))", Spaceship.not_shields
|
195
|
+
assert_where_value "(spaceships.flags not in (4,5,6,7))", Spaceship.not_electrolytes
|
190
196
|
end
|
191
197
|
|
192
198
|
def test_should_define_a_named_scope_for_flag_enabled_with_2_columns
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
199
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.bits in (1,3))", SpaceshipWith2CustomFlagsColumn.warpdrive
|
200
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.bits in (2,3))", SpaceshipWith2CustomFlagsColumn.hyperspace
|
201
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.commanders in (1,3))", SpaceshipWith2CustomFlagsColumn.jeanlucpicard
|
202
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.commanders in (2,3))", SpaceshipWith2CustomFlagsColumn.dajanatroj
|
197
203
|
end
|
198
204
|
|
199
205
|
def test_should_define_a_named_scope_for_flag_not_enabled_with_2_columns
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
206
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.bits not in (1,3))", SpaceshipWith2CustomFlagsColumn.not_warpdrive
|
207
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.bits not in (2,3))", SpaceshipWith2CustomFlagsColumn.not_hyperspace
|
208
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.commanders not in (1,3))", SpaceshipWith2CustomFlagsColumn.not_jeanlucpicard
|
209
|
+
assert_where_value "(spaceships_with_2_custom_flags_column.commanders not in (2,3))", SpaceshipWith2CustomFlagsColumn.not_dajanatroj
|
204
210
|
end
|
205
|
-
|
211
|
+
|
206
212
|
def test_should_define_a_named_scope_for_flag_enabled_using_bit_operators
|
207
|
-
|
208
|
-
|
213
|
+
assert_where_value "(spaceships.flags & 1 = 1)", SpaceshipWithBitOperatorQueryMode.warpdrive
|
214
|
+
assert_where_value "(spaceships.flags & 2 = 2)", SpaceshipWithBitOperatorQueryMode.shields
|
209
215
|
end
|
210
216
|
|
211
217
|
def test_should_define_a_named_scope_for_flag_not_enabled_using_bit_operators
|
212
|
-
|
213
|
-
|
218
|
+
assert_where_value "(spaceships.flags & 1 = 0)", SpaceshipWithBitOperatorQueryMode.not_warpdrive
|
219
|
+
assert_where_value "(spaceships.flags & 2 = 0)", SpaceshipWithBitOperatorQueryMode.not_shields
|
214
220
|
end
|
215
221
|
|
216
222
|
def test_should_return_the_correct_number_of_items_from_a_named_scope
|
@@ -251,12 +257,20 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
251
257
|
assert_equal "(spaceships_with_custom_flags_column.bits not in (1,3))", SpaceshipWithCustomFlagsColumn.not_warpdrive_condition
|
252
258
|
assert_equal "(spaceships_with_custom_flags_column.bits in (2,3))", SpaceshipWithCustomFlagsColumn.hyperspace_condition
|
253
259
|
assert_equal "(spaceships_with_custom_flags_column.bits not in (2,3))", SpaceshipWithCustomFlagsColumn.not_hyperspace_condition
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
260
|
+
assert_where_value "(spaceships_with_custom_flags_column.bits in (1,3))", SpaceshipWithCustomFlagsColumn.warpdrive
|
261
|
+
assert_where_value "(spaceships_with_custom_flags_column.bits not in (1,3))", SpaceshipWithCustomFlagsColumn.not_warpdrive
|
262
|
+
assert_where_value "(spaceships_with_custom_flags_column.bits in (2,3))", SpaceshipWithCustomFlagsColumn.hyperspace
|
263
|
+
assert_where_value "(spaceships_with_custom_flags_column.bits not in (2,3))", SpaceshipWithCustomFlagsColumn.not_hyperspace
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_should_work_with_a_custom_flags_column_name_as_symbol
|
267
|
+
spaceship = SpaceshipWithColumnNameAsSymol.new
|
268
|
+
spaceship.enable_flag(:warpdrive)
|
269
|
+
spaceship.save!
|
270
|
+
spaceship.reload
|
271
|
+
assert_equal 1, spaceship.flags('bits')
|
258
272
|
end
|
259
|
-
|
273
|
+
|
260
274
|
def test_should_not_error_out_when_table_is_not_present
|
261
275
|
assert_nothing_raised(ActiveRecord::StatementInvalid) do
|
262
276
|
Planet.class_eval do
|
@@ -265,7 +279,14 @@ class FlagShihTzuClassMethodsTest < Test::Unit::TestCase
|
|
265
279
|
end
|
266
280
|
end
|
267
281
|
end
|
268
|
-
|
282
|
+
|
283
|
+
private
|
284
|
+
|
285
|
+
def assert_where_value(expected, scope)
|
286
|
+
assert_equal expected,
|
287
|
+
ActiveRecord::VERSION::MAJOR == 2 ? scope.proxy_options[:conditions] : scope.where_values.first
|
288
|
+
end
|
289
|
+
|
269
290
|
end
|
270
291
|
|
271
292
|
class FlagShihTzuInstanceMethodsTest < Test::Unit::TestCase
|
@@ -364,6 +385,27 @@ class FlagShihTzuInstanceMethodsTest < Test::Unit::TestCase
|
|
364
385
|
assert @spaceship.warpdrive
|
365
386
|
end
|
366
387
|
|
388
|
+
def test_should_define_dirty_suffix_changed?
|
389
|
+
assert !@spaceship.warpdrive_changed?
|
390
|
+
assert !@spaceship.shields_changed?
|
391
|
+
|
392
|
+
@spaceship.enable_flag(:warpdrive)
|
393
|
+
assert @spaceship.warpdrive_changed?
|
394
|
+
assert !@spaceship.shields_changed?
|
395
|
+
|
396
|
+
@spaceship.enable_flag(:shields)
|
397
|
+
assert @spaceship.warpdrive_changed?
|
398
|
+
assert @spaceship.shields_changed?
|
399
|
+
|
400
|
+
@spaceship.disable_flag(:warpdrive)
|
401
|
+
assert !@spaceship.warpdrive_changed?
|
402
|
+
assert @spaceship.shields_changed?
|
403
|
+
|
404
|
+
@spaceship.disable_flag(:shields)
|
405
|
+
assert !@spaceship.warpdrive_changed?
|
406
|
+
assert !@spaceship.shields_changed?
|
407
|
+
end
|
408
|
+
|
367
409
|
def test_should_respect_true_values_like_active_record
|
368
410
|
[true, 1, '1', 't', 'T', 'true', 'TRUE'].each do |true_value|
|
369
411
|
@spaceship.warpdrive = true_value
|
@@ -375,7 +417,7 @@ class FlagShihTzuInstanceMethodsTest < Test::Unit::TestCase
|
|
375
417
|
assert !@spaceship.warpdrive
|
376
418
|
end
|
377
419
|
end
|
378
|
-
|
420
|
+
|
379
421
|
def test_should_ignore_has_flags_call_if_column_does_not_exist_yet
|
380
422
|
assert_nothing_raised do
|
381
423
|
eval(<<-EOF
|
@@ -390,10 +432,10 @@ class FlagShihTzuInstanceMethodsTest < Test::Unit::TestCase
|
|
390
432
|
EOF
|
391
433
|
)
|
392
434
|
end
|
393
|
-
|
435
|
+
|
394
436
|
assert !SpaceshipWithoutFlagsColumn.method_defined?(:warpdrive)
|
395
437
|
end
|
396
|
-
|
438
|
+
|
397
439
|
def test_should_ignore_has_flags_call_if_column_not_integer
|
398
440
|
assert_raises FlagShihTzu::IncorrectFlagColumnException do
|
399
441
|
eval(<<-EOF
|
@@ -463,14 +505,14 @@ class FlagShihTzuDerivedClassTest < Test::Unit::TestCase
|
|
463
505
|
end
|
464
506
|
|
465
507
|
def test_enable_flag_should_leave_the_flag_enabled_when_called_twice
|
466
|
-
2.times do
|
508
|
+
2.times do
|
467
509
|
@spaceship.enable_flag(:warpdrive)
|
468
510
|
assert @spaceship.flag_enabled?(:warpdrive)
|
469
511
|
end
|
470
512
|
end
|
471
513
|
|
472
514
|
def test_disable_flag_should_leave_the_flag_disabled_when_called_twice
|
473
|
-
2.times do
|
515
|
+
2.times do
|
474
516
|
@spaceship.disable_flag(:warpdrive)
|
475
517
|
assert !@spaceship.flag_enabled?(:warpdrive)
|
476
518
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,35 +1,14 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require "test/unit"
|
2
|
+
require "yaml"
|
3
|
+
require "logger"
|
4
|
+
require "flag_shih_tzu"
|
3
5
|
|
4
|
-
|
5
|
-
$LOAD_PATH << 'lib/'
|
6
|
-
$LOAD_PATH << 'vendor/plugins/flag_shih_tzu/lib/'
|
6
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
require 'logger'
|
11
|
-
require 'rubygems'
|
12
|
-
gem 'activerecord', '~> 3.0'
|
13
|
-
require 'active_record'
|
14
|
-
require 'flag_shih_tzu'
|
8
|
+
configs = YAML.load_file(File.dirname(__FILE__) + "/database.yml")
|
9
|
+
ActiveRecord::Base.configurations = configs
|
15
10
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# no DB passed, try sqlite3 by default
|
22
|
-
db_adapter ||=
|
23
|
-
begin
|
24
|
-
require 'sqlite3'
|
25
|
-
'sqlite3'
|
26
|
-
rescue MissingSourceFile
|
27
|
-
end
|
28
|
-
|
29
|
-
if db_adapter.nil?
|
30
|
-
raise "No DB Adapter selected. Configure test/database.yml and use DB=mysql|postgresql|sqlite3 to pick one. sqlite3 will be used by default (gem install sqlite3-ruby)."
|
31
|
-
end
|
32
|
-
|
33
|
-
ActiveRecord::Base.establish_connection(config[db_adapter])
|
34
|
-
load(File.dirname(__FILE__) + "/schema.rb")
|
35
|
-
end
|
11
|
+
db_name = ENV["DB"] || "sqlite"
|
12
|
+
ActiveRecord::Base.establish_connection(db_name)
|
13
|
+
|
14
|
+
load(File.dirname(__FILE__) + "/schema.rb")
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flag_shih_tzu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 17
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
|
11
|
-
version: 0.1.0.pre
|
8
|
+
- 2
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
12
11
|
platform: ruby
|
13
12
|
authors:
|
14
13
|
- Patryk Peszko
|
@@ -19,12 +18,99 @@ autorequire:
|
|
19
18
|
bindir: bin
|
20
19
|
cert_chain: []
|
21
20
|
|
22
|
-
date: 2011-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
date: 2011-10-31 00:00:00 Z
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
24
|
+
name: activerecord
|
25
|
+
prerelease: false
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 3
|
32
|
+
segments:
|
33
|
+
- 2
|
34
|
+
- 3
|
35
|
+
- 0
|
36
|
+
version: 2.3.0
|
37
|
+
type: :runtime
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: bundler
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 3
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
version: "0"
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rdoc
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 27
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 4
|
65
|
+
- 2
|
66
|
+
version: 2.4.2
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
type: :development
|
82
|
+
version_requirements: *id004
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rcov
|
85
|
+
prerelease: false
|
86
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
type: :development
|
96
|
+
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: sqlite3
|
99
|
+
prerelease: false
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 3
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
type: :development
|
110
|
+
version_requirements: *id006
|
26
111
|
description: |
|
27
|
-
|
112
|
+
Bit fields for ActiveRecord:
|
113
|
+
This gem lets you use a single integer column in an ActiveRecord model
|
28
114
|
to store a collection of boolean attributes (flags). Each flag can be used
|
29
115
|
almost in the same way you would use any boolean attribute on an
|
30
116
|
ActiveRecord object.
|
@@ -38,10 +124,14 @@ extra_rdoc_files: []
|
|
38
124
|
|
39
125
|
files:
|
40
126
|
- .gitignore
|
127
|
+
- .travis.yml
|
41
128
|
- Gemfile
|
42
129
|
- README.rdoc
|
43
130
|
- Rakefile
|
44
131
|
- flag_shih_tzu.gemspec
|
132
|
+
- gemfiles/Gemfile.activerecord-2.3.x
|
133
|
+
- gemfiles/Gemfile.activerecord-3.0.x
|
134
|
+
- gemfiles/Gemfile.activerecord-3.1.x
|
45
135
|
- init.rb
|
46
136
|
- lib/flag_shih_tzu.rb
|
47
137
|
- lib/flag_shih_tzu/version.rb
|
@@ -49,7 +139,6 @@ files:
|
|
49
139
|
- test/flag_shih_tzu_test.rb
|
50
140
|
- test/schema.rb
|
51
141
|
- test/test_helper.rb
|
52
|
-
has_rdoc: true
|
53
142
|
homepage: https://github.com/xing/flag_shih_tzu
|
54
143
|
licenses: []
|
55
144
|
|
@@ -70,21 +159,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
160
|
none: false
|
72
161
|
requirements:
|
73
|
-
- - "
|
162
|
+
- - ">="
|
74
163
|
- !ruby/object:Gem::Version
|
75
|
-
hash:
|
164
|
+
hash: 3
|
76
165
|
segments:
|
77
|
-
-
|
78
|
-
|
79
|
-
- 1
|
80
|
-
version: 1.3.1
|
166
|
+
- 0
|
167
|
+
version: "0"
|
81
168
|
requirements: []
|
82
169
|
|
83
170
|
rubyforge_project:
|
84
|
-
rubygems_version: 1.
|
171
|
+
rubygems_version: 1.8.6
|
85
172
|
signing_key:
|
86
173
|
specification_version: 3
|
87
|
-
summary:
|
174
|
+
summary: Bit fields for ActiveRecord
|
88
175
|
test_files:
|
89
176
|
- test/database.yml
|
90
177
|
- test/flag_shih_tzu_test.rb
|