bitswitch 0.0.3 → 1.0.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/README.md +4 -0
- data/lib/bitswitch.rb +103 -5
- data/lib/bitswitch/version.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
@@ -31,6 +31,10 @@ https://github.com/KellyLSB/Bitswitch/wiki/How-to-use
|
|
31
31
|
|
32
32
|
* Think about new stuff to add in.
|
33
33
|
|
34
|
+
## Other Languages
|
35
|
+
|
36
|
+
BitSwitch is also available in Ruby, [PHP](http://github.com/KellyLSB/Bitswitch-PHP)
|
37
|
+
|
34
38
|
## Copyright
|
35
39
|
|
36
40
|
Copyright (c) 2012 Kelly Becker. See LICENSE.txt for
|
data/lib/bitswitch.rb
CHANGED
@@ -8,11 +8,20 @@ class BitSwitch
|
|
8
8
|
@labels = {}
|
9
9
|
@val = 0
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
if labels.empty?
|
12
|
+
# Loop through the hash and set the switches
|
13
|
+
i=0; n.each do |label, tf|
|
14
|
+
self[i] = tf ? 1 : 0
|
15
|
+
@labels[i] = label.to_s
|
16
|
+
i += 1
|
17
|
+
end
|
18
|
+
else
|
19
|
+
# Set the switches
|
20
|
+
@labels = labels
|
21
|
+
|
22
|
+
n.each do |label, tf|
|
23
|
+
self[label.to_s] = tf ? 1 : 0
|
24
|
+
end
|
16
25
|
end
|
17
26
|
|
18
27
|
# Return the BitSwitch object
|
@@ -29,6 +38,7 @@ class BitSwitch
|
|
29
38
|
val = val > 0
|
30
39
|
|
31
40
|
# If a string representation of a bit was provided get the numerical
|
41
|
+
bit.to_s if bit.is_a?(Symbol)
|
32
42
|
bit = @labels.invert[bit] if bit.is_a?(String)
|
33
43
|
|
34
44
|
# If nil return false
|
@@ -46,6 +56,7 @@ class BitSwitch
|
|
46
56
|
def [](bit)
|
47
57
|
|
48
58
|
# If a string representation of a bit was provided get the numerical
|
59
|
+
bit.to_s if bit.is_a?(Symbol)
|
49
60
|
bit = @labels.invert[bit] if bit.is_a?(String)
|
50
61
|
|
51
62
|
# If nil return false
|
@@ -100,8 +111,95 @@ class BitSwitch
|
|
100
111
|
end
|
101
112
|
end
|
102
113
|
|
114
|
+
# Convert Fixnum to Switch
|
103
115
|
class Fixnum
|
104
116
|
def to_switch(labels = {})
|
105
117
|
BitSwitch.new(self, labels)
|
106
118
|
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Convert hash of booleans to Switch
|
122
|
+
class Hash
|
123
|
+
def to_switch(labels = {})
|
124
|
+
cleaned = self.delete_if{|k,v| ![true, false].include?(v)}
|
125
|
+
return BitSwitch.new(0, labels) if cleaned.empty?
|
126
|
+
return BitSwitch.new(cleaned, labels)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Rails 3 Extension
|
131
|
+
if defined? ActiveRecord::Base
|
132
|
+
module KellyLSB
|
133
|
+
module BitSwitch
|
134
|
+
extend ActiveSupport::Concern
|
135
|
+
|
136
|
+
module ClassMethods
|
137
|
+
def bitswitch(column, hash = {})
|
138
|
+
|
139
|
+
KellyLSB::BitSwitch::LocalInstanceMethods.send(:define_method, column.to_sym) do |*args|
|
140
|
+
val = read_attribute(column)
|
141
|
+
|
142
|
+
# Make sure the value is an integer
|
143
|
+
raise KellyLSB::BitSwitch::Error, "Column: #{column} is not an integer!" unless val.is_a?(Fixnum)
|
144
|
+
|
145
|
+
# Get the BitSwitch
|
146
|
+
val = val.to_switch hash
|
147
|
+
|
148
|
+
# Return the value of a specific key
|
149
|
+
return val[args.first.to_s] unless args[0].nil?
|
150
|
+
|
151
|
+
# Return the switch
|
152
|
+
return val
|
153
|
+
end
|
154
|
+
|
155
|
+
columne = column.to_s + '='
|
156
|
+
KellyLSB::BitSwitch::LocalInstanceMethods.send(:define_method, columne.to_sym) do |input|
|
157
|
+
val = read_attribute(column)
|
158
|
+
|
159
|
+
# Make sure the value is an integer
|
160
|
+
raise KellyLSB::BitSwitch::Error, "Column: #{column} is not an integer!" unless val.is_a?(Fixnum)
|
161
|
+
|
162
|
+
# Get the BitSwitch
|
163
|
+
val = val.to_switch(hash).to_hash.merge(input).to_switch(hash)
|
164
|
+
|
165
|
+
# Write the updated value
|
166
|
+
update_column(column, val.to_i)
|
167
|
+
|
168
|
+
# Return the switch
|
169
|
+
return self.send(column)
|
170
|
+
end
|
171
|
+
|
172
|
+
KellyLSB::BitSwitch::SingletonMethods.send(:define_method, column.to_sym) do |*args|
|
173
|
+
raise KellyLSB::BitSwitch::Error, "Missing arguments!" if args.empty?
|
174
|
+
bits = hash.invert
|
175
|
+
|
176
|
+
query = self
|
177
|
+
|
178
|
+
# Perform conditions
|
179
|
+
args.each do |slug|
|
180
|
+
query = query.where("POW(2, ?) & `#{self.table_name}`.`#{column}` > 0", bits[slug.to_s])
|
181
|
+
end
|
182
|
+
|
183
|
+
# Return results
|
184
|
+
return query
|
185
|
+
end
|
186
|
+
|
187
|
+
include KellyLSB::BitSwitch::LocalInstanceMethods
|
188
|
+
extend KellyLSB::BitSwitch::SingletonMethods
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# This module contains class methods
|
193
|
+
module SingletonMethods
|
194
|
+
end
|
195
|
+
|
196
|
+
module LocalInstanceMethods
|
197
|
+
end
|
198
|
+
|
199
|
+
class Error < StandardError
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
ActiveRecord::Base.send(:include, KellyLSB::BitSwitch)
|
107
205
|
end
|
data/lib/bitswitch/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitswitch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-27 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Have you ever wanted to store multiple true/false values in your database,
|
15
15
|
but annoyed with how many fields your tables have, then BitSwitcher is good for
|
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
49
|
version: '0'
|
50
50
|
requirements: []
|
51
51
|
rubyforge_project:
|
52
|
-
rubygems_version: 1.8.
|
52
|
+
rubygems_version: 1.8.23
|
53
53
|
signing_key:
|
54
54
|
specification_version: 3
|
55
55
|
summary: Bitswitch lets you store multiple true/false values in an integer using boolean
|