attr_bitwise 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c7bc7f15d2c51cdaa8e8fc01987c4b3e500d89a
4
+ data.tar.gz: fe4fbf205f6c998ea684a45f56e61a833623e1fc
5
+ SHA512:
6
+ metadata.gz: 5aaa7af4fc47354187a8c654f296642d7a0699ebac3676d5ef6891895b730da09b674f8dba5f639d9b7e003605d85f5a87fb780da880f29e8531a562dc809866
7
+ data.tar.gz: b70fcaf5b88f2eaea060277a4860c1e018a714002ddcf7fb76f5d33fb4a5a99e5c30a08f42acad45ce4b2c44cb6c7ca50a613c61b7a1d07a9f207e2da5460f83
data/.gitignore ADDED
@@ -0,0 +1,36 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ ## Specific to RubyMotion:
14
+ .dat*
15
+ .repl_history
16
+ build/
17
+
18
+ ## Documentation cache and generated files:
19
+ /.yardoc/
20
+ /_yardoc/
21
+ /doc/
22
+ /rdoc/
23
+
24
+ ## Environment normalization:
25
+ /.bundle/
26
+ /vendor/bundle
27
+ /lib/bundler/man/
28
+
29
+ # for a library or gem, you might want to ignore these files since the code is
30
+ # intended to run in multiple environments; otherwise, check them in:
31
+ # Gemfile.lock
32
+ # .ruby-version
33
+ # .ruby-gemset
34
+
35
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
36
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,45 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ attr_bitwise (0.0.1)
5
+ activesupport
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activesupport (4.2.5.1)
11
+ i18n (~> 0.7)
12
+ json (~> 1.7, >= 1.7.7)
13
+ minitest (~> 5.1)
14
+ thread_safe (~> 0.3, >= 0.3.4)
15
+ tzinfo (~> 1.1)
16
+ diff-lcs (1.2.5)
17
+ i18n (0.7.0)
18
+ json (1.8.3)
19
+ minitest (5.8.4)
20
+ rake (10.5.0)
21
+ rspec (3.4.0)
22
+ rspec-core (~> 3.4.0)
23
+ rspec-expectations (~> 3.4.0)
24
+ rspec-mocks (~> 3.4.0)
25
+ rspec-core (3.4.3)
26
+ rspec-support (~> 3.4.0)
27
+ rspec-expectations (3.4.0)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.4.0)
30
+ rspec-mocks (3.4.1)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.4.0)
33
+ rspec-support (3.4.1)
34
+ thread_safe (0.3.5)
35
+ tzinfo (1.2.2)
36
+ thread_safe (~> 0.1)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ attr_bitwise!
43
+ bundler (~> 1.6)
44
+ rake
45
+ rspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Charly POLY
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # `attr_bitwise`
2
+ Bitwise attribute for ruby class and Rails model
3
+
4
+ ```ruby
5
+ # Helper to define a bits based value on a Rails model attribute
6
+ # this helper expose a set of methods to make bitwise operations
7
+ #
8
+ #
9
+ # Usage :
10
+ # attr_bitwise :<name>, [column_name: <column_name>,] mapping: <values_sym>
11
+ #
12
+ # Example
13
+ # class MyModel < ActiveRecord::Base
14
+ # include BitwiseUtils
15
+ #
16
+ # attr_bitwise :payment_types, mapping: [:slots, :credits]
17
+ # end
18
+ #
19
+ # Will define the following high-level methods :
20
+ # - Class#payment_types => [<Symbol>, ...]
21
+ # - Class#payment_type?(value_or_sym) => Boolean
22
+ # - Class#add_payment_type(value_or_sym) => Fixnum
23
+ # - Class#remove_payment_type(value_or_sym) => Fixnum
24
+ #
25
+ # Will define the following low-level methods :
26
+ # - Class.to_bitwise_values(object, name) => [<Fixnum>, ...]
27
+ # - Class#payment_types_union([Fixnum, ..]) => [Fixnum, ..]
28
+ # - Class.bitwise_union([Fixnum, ..], name) => [Fixnum, ..]
29
+ # - Class#payment_types_intersection([Fixnum, ..]) => [Fixnum, ..]
30
+ # - Class.bitwise_intersection([Fixnum, ..], name) => [Fixnum, ..]
31
+ # - Class#payment_types_mapping => Hash
32
+ #
33
+ ```
34
+
35
+
36
+ ## Install
37
+
38
+
39
+ ### Inline
40
+
41
+ - `gem install bitwise_attr`
42
+
43
+ ### Gemfile
44
+
45
+ - `gem 'bitwise_attr'`
46
+
47
+
48
+ ----------------------------------------
49
+ Maintainers : @wittydeveloper and @FSevaistre
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "attr_bitwise/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "attr_bitwise"
8
+ spec.version = AttrBitwise::VERSION
9
+ spec.authors = ["Charly POLY"]
10
+ spec.email = ["cpoly55@gmail.com"]
11
+ spec.summary = %q{Bitwise attribute for ruby class and Rails model}
12
+ spec.description = %q{Bitwise attribute for ruby class and Rails model}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "activesupport"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ end
@@ -0,0 +1,3 @@
1
+ module AttrBitwise
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,230 @@
1
+ require "active_support"
2
+ require "active_support/concern"
3
+ require "active_support/core_ext"
4
+ require "attr_bitwise/version"
5
+
6
+ # Helper to define a bits based value on a Rails model attribute
7
+ # this helper expose a set of methods to make bitwise operations
8
+ #
9
+ #
10
+ # Usage :
11
+ # attr_bitwise :<name>, [column_name: <column_name>,] mapping: <values_sym>
12
+ #
13
+ # Example
14
+ # class MyModel < ActiveRecord::Base
15
+ # include BitwiseUtils
16
+ #
17
+ # attr_bitwise :payment_types, mapping: [:slots, :credits]
18
+ # end
19
+ #
20
+ # Will define the following high-level methods :
21
+ # - Class#payment_types => [<Symbol>, ...]
22
+ # - Class#payment_type?(value_or_sym) => Boolean
23
+ # - Class#add_payment_type(value_or_sym) => Fixnum
24
+ # - Class#remove_payment_type(value_or_sym) => Fixnum
25
+ #
26
+ # Will define the following low-level methods :
27
+ # - Class.to_bitwise_values(object, name) => [<Fixnum>, ...]
28
+ # - Class#payment_types_union([Fixnum, ..]) => [Fixnum, ..]
29
+ # - Class.bitwise_union([Fixnum, ..], name) => [Fixnum, ..]
30
+ # - Class#payment_types_intersection([Fixnum, ..]) => [Fixnum, ..]
31
+ # - Class.bitwise_intersection([Fixnum, ..], name) => [Fixnum, ..]
32
+ # - Class#payment_types_mapping => Hash
33
+ #
34
+ # More details in methods definition
35
+ module AttrBitwise
36
+ extend ActiveSupport::Concern
37
+
38
+ # ClassMethods
39
+ module ClassMethods
40
+ ######################
41
+ # public class methods
42
+ ######################
43
+
44
+ # Usage :
45
+ # attr_bitwise :payment_types, mapping: [:slots, :credits],
46
+ # column_name: 'payment_types_value'
47
+ #
48
+ def attr_bitwise(name, column_name: nil, mapping:)
49
+ column_name = "#{name}_value" unless column_name.present?
50
+
51
+ # mask attribute_accessor (internals)
52
+ define_method('value') { send(column_name) }
53
+ define_method('value=') { |value| send("#{column_name}=", value) }
54
+
55
+ # build mapping
56
+ bitwise_mapping = build_mapping(mapping, name)
57
+
58
+ # mask to symbols helper
59
+ define_method("#{name}") { send(:value_getter, bitwise_mapping) }
60
+
61
+ define_method("#{name}=") do |values_or_symbols_array|
62
+ unless values_or_symbols_array.is_a?(Array)
63
+ values_or_symbols_array = [values_or_symbols_array]
64
+ end
65
+ send(:value_setter, values_or_symbols_array, bitwise_mapping)
66
+ end
67
+
68
+ # masks symbol presence
69
+ define_method("#{name.to_s.singularize}?") do |value_or_symbol|
70
+ send(:value?, force_to_bitwise_value(value_or_symbol, bitwise_mapping))
71
+ end
72
+
73
+ # add value to mask
74
+ define_method("add_#{name.to_s.singularize}") do |value_or_symbol|
75
+ send(:add_value, force_to_bitwise_value(value_or_symbol, bitwise_mapping))
76
+ end
77
+
78
+ # remove value from mask
79
+ define_method("remove_#{name.to_s.singularize}") do |value_or_symbol|
80
+ send(:remove_value, force_to_bitwise_value(value_or_symbol, bitwise_mapping))
81
+ end
82
+
83
+ # compute values union against mask
84
+ define_method("#{name}_union") do |*mixed_array|
85
+ self.class.bitwise_union(*mixed_array, name)
86
+ end
87
+
88
+ # compute values intersection against mask
89
+ define_method("#{name}_intersection") do |*mixed_array|
90
+ self.class.bitwise_intersection(*mixed_array, name)
91
+ end
92
+ end
93
+
94
+ # given a payment_values array, return a possible matches
95
+ # for a union
96
+ #
97
+ # with PAYMENT_TYPES_MAPPING = { credits: 0b001, slots: 0b010, paypal: 0b100 }
98
+ # see http://www.calleerlandsson.com/2015/02/16/flags-bitmasks-and-unix-file-system-permissions-in-ruby/
99
+ #
100
+ # bitwise_union(:slots, :credits, 'payment_types') => [0b011, 0b111]
101
+ def bitwise_union(*mixed_array, name)
102
+ values_array = mixed_array.map { |v| to_bitwise_values(v, name) }
103
+ mapping = mapping_from_name(name)
104
+ mask = []
105
+
106
+ values_array.each do |pv|
107
+ mapping.values.each do |pvv|
108
+ mask << (pv | pvv)
109
+ end
110
+ end
111
+
112
+ mask.uniq
113
+ end
114
+
115
+ # given a values_arr ay array, return a possible matches
116
+ # for a intersection
117
+ #
118
+ # with PAYMENT_TYPES_MAPPING = { credits: 0b001, slots: 0b010, paypal: 0b100 }
119
+ # see http://www.calleerlandsson.com/2015/02/16/flags-bitmasks-and-unix-file-system-permissions-in-ruby/
120
+ #
121
+ # bitwise_intersection(:slots, :credits, 'payment_types') => [0b101, 0b100, 0b011, 0b111]
122
+ def bitwise_intersection(*mixed_array, name)
123
+ values_array = mixed_array.map { |v| to_bitwise_values(v, name) }
124
+ mapping = mapping_from_name(name)
125
+ mask = []
126
+ val = values_array.reduce(&:|)
127
+
128
+ mapping.values.each do |pv|
129
+ mask << (pv | val)
130
+ end
131
+
132
+ mask.uniq
133
+ end
134
+
135
+ # given an Object, return proper Fixnum value, depending of mapping
136
+ def to_bitwise_values(object, name)
137
+ mapping = mapping_from_name(name)
138
+ if object.is_a?(Array)
139
+ object.map { |v| force_to_bitwise_value(v, mapping) }
140
+ elsif object.is_a?(Hash)
141
+ object.values.map { |v| force_to_bitwise_value(v, mapping) }
142
+ else
143
+ force_to_bitwise_value(object, mapping)
144
+ end
145
+ end
146
+
147
+ # Given a raw value (int) or a symbol, return proper raw value (int)
148
+ def force_to_bitwise_value(value_or_symbol, mapping)
149
+ if value_or_symbol.is_a?(Symbol)
150
+ mapping[value_or_symbol]
151
+ else
152
+ value_or_symbol.to_i
153
+ end
154
+ end
155
+
156
+ #######################
157
+ # Private class methods
158
+ #######################
159
+
160
+ private
161
+
162
+ # return mapping given a bitwise name
163
+ def mapping_from_name(name)
164
+ const_get("#{name}_mapping".upcase)
165
+ end
166
+
167
+ # build internal bitwise key-value mapping
168
+ # it add a zero value, needed for bits operations
169
+ #
170
+ # each sym get a power of 2 value
171
+ def build_mapping(symbols, name)
172
+ mapping = {}.tap do |hash|
173
+ symbols.each_with_index do |key, i|
174
+ hash[key] = 2**i
175
+ end
176
+ hash[:empty] = 0
177
+ end
178
+ # put mapping in unique constant
179
+ const_mapping_name = "#{name}_mapping".upcase
180
+ const_set(const_mapping_name, mapping)
181
+ end
182
+ end
183
+
184
+ ##########################
185
+ # Private instance methods
186
+ ##########################
187
+
188
+ private
189
+
190
+ def force_to_bitwise_value(value_or_symbol, mapping)
191
+ self.class.force_to_bitwise_value(value_or_symbol, mapping)
192
+ end
193
+
194
+ # Given a raw value (int) return proper raw value (int)
195
+ def value_to_sym(value, mapping)
196
+ mapping.invert[value]
197
+ end
198
+
199
+ # Return current value to symbols array
200
+ # Ex : 011 => :slots, :credits
201
+ def value_getter(mapping)
202
+ mapping.values.select { |pv| (value & pv) != 0 }.
203
+ map { |v| value_to_sym(v, mapping) }
204
+ end
205
+
206
+ # Set current values from values array
207
+ def value_setter(values_or_symbols_array, mapping)
208
+ self.value = 0
209
+ values_or_symbols_array.each { |val| add_value(force_to_bitwise_value(val, mapping)) }
210
+ end
211
+
212
+ # Return if value presents in mask (raw value)
213
+ def value?(val)
214
+ value & val != 0
215
+ end
216
+
217
+ # add `value_or_symbol` to mask
218
+ # Ex, with values = `10`
219
+ # add_value(1) => 11
220
+ def add_value(val)
221
+ self.value |= val
222
+ end
223
+
224
+ # remove `value_or_symbol` to mask
225
+ # Ex, with values = `11`
226
+ # remove_value(1) => 10
227
+ def remove_value(val)
228
+ self.value &= ~val
229
+ end
230
+ end
@@ -0,0 +1,163 @@
1
+ require_relative '../lib/attr_bitwise.rb'
2
+
3
+ describe AttrBitwise do
4
+
5
+ # test class in order to test concern
6
+ class TestClass
7
+
8
+ include AttrBitwise
9
+
10
+ attr_accessor :payment_types_value
11
+
12
+ attr_bitwise :payment_types, mapping: [:slots, :credits]
13
+
14
+ def initialize
15
+ @payment_types_value = 0
16
+ end
17
+
18
+ end
19
+
20
+ subject { TestClass.new }
21
+
22
+ context '.to_bitwise_values' do
23
+
24
+ context 'with Hash argument' do
25
+ it do
26
+ expect(
27
+ TestClass.to_bitwise_values(
28
+ {
29
+ a: :credits,
30
+ b: :slots
31
+ },
32
+ 'payment_types'
33
+ )
34
+ ).to eq [2, 1]
35
+ end
36
+ end
37
+
38
+ context 'with Array argument' do
39
+ it do
40
+ expect(TestClass.to_bitwise_values(
41
+ [:credits, :slots],
42
+ 'payment_types'
43
+ )).to eq [2, 1]
44
+ end
45
+ end
46
+
47
+ context 'with Fixnum argument' do
48
+ it do
49
+ expect(TestClass.to_bitwise_values(1, 'payment_types')).to eq 1
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ context 'with `payment_types` attribute_name' do
56
+
57
+ context '#payment_types=' do
58
+
59
+ before { subject.payment_types = [:slots, :credits] }
60
+
61
+ it 'should set proper value' do
62
+ expect(subject.payment_types_value).to eq 3
63
+ expect(subject.payment_types).to eq [:slots, :credits]
64
+ end
65
+
66
+ end
67
+
68
+ context 'with `payment_types_value` = 0' do
69
+ context '#payment_types' do
70
+
71
+ it do
72
+ expect(subject.payment_types).to eq []
73
+ end
74
+
75
+ end
76
+
77
+ context '#add_payment_type' do
78
+
79
+ it do
80
+ subject.add_payment_type(:slots)
81
+ expect(subject.payment_types).to eq [:slots]
82
+ end
83
+
84
+ context 'when called twice, each type remains unique' do
85
+ it do
86
+ subject.add_payment_type(:slots)
87
+ subject.add_payment_type(:slots)
88
+ expect(subject.payment_types).to eq [:slots]
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ context '#payment_type?(:slots)' do
95
+
96
+ it do
97
+ expect(subject.payment_type?(:slots)).to eq false
98
+ end
99
+
100
+ end
101
+ end
102
+
103
+ context 'with `payment_types_value` = 3' do
104
+
105
+ before { subject.payment_types_value = 3 }
106
+
107
+ context '#payment_types' do
108
+
109
+ it do
110
+ expect(subject.payment_types).to eq [:slots, :credits]
111
+ end
112
+
113
+ end
114
+
115
+ context '#payment_type?(:slots)' do
116
+
117
+ it do
118
+ expect(subject.payment_type?(:slots)).to eq true
119
+ end
120
+
121
+ end
122
+
123
+ context '#remove_payment_type' do
124
+
125
+ it do
126
+ subject.remove_payment_type(:slots)
127
+ expect(subject.payment_types).to eq [:credits]
128
+ end
129
+
130
+ end
131
+
132
+ context '#payment_types_union' do
133
+
134
+ it do
135
+ expect(subject.payment_types_union(1, 2)).to eq [1, 3, 2]
136
+ end
137
+
138
+ end
139
+
140
+ context '.bitwise_union' do
141
+
142
+ it do
143
+ expect(
144
+ TestClass.bitwise_union(1, 2, 'payment_types')
145
+ ).to eq [1, 3, 2]
146
+ end
147
+
148
+ end
149
+
150
+ context '#bitwise_intersection' do
151
+
152
+ it do
153
+ expect(
154
+ TestClass.bitwise_intersection(1, 2, 'payment_types')
155
+ ).to eq [3]
156
+ end
157
+
158
+ end
159
+
160
+ end
161
+
162
+ end
163
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attr_bitwise
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Charly POLY
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Bitwise attribute for ruby class and Rails model
70
+ email:
71
+ - cpoly55@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - attr_bitwise.gemspec
83
+ - lib/attr_bitwise.rb
84
+ - lib/attr_bitwise/version.rb
85
+ - spec/attr_bitwise_spec.rb
86
+ homepage: ''
87
+ licenses:
88
+ - MIT
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 2.2.2
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Bitwise attribute for ruby class and Rails model
110
+ test_files:
111
+ - spec/attr_bitwise_spec.rb