active_flag 1.3.0 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 920b4e8334a939be9b99d1a2cec584337b95392c
4
- data.tar.gz: 487d5d96abf070e1d55e0f61b2d8e1b4ea6cb627
2
+ SHA256:
3
+ metadata.gz: e4a88c02a655b6b16a83ffd290972fb07c8aa9dfa3b3576a3ba8f610b500891a
4
+ data.tar.gz: 1574b03e53e7d06d5bfba726e893a9ee57216f683fef7b964c119fe439feab42
5
5
  SHA512:
6
- metadata.gz: 52d1ac341b2cbc1e6f12107603885be37f9e0f71de5a6b1b62a12dc65332dff684a65bd3d4c0ea39fbf931945870e8f1dc7e7eca14e5b7c22f135fe14e4efbc6
7
- data.tar.gz: 17e0b5863656d817a284a3e766f97134c178d0db9acb8a6aa66a54830bdbf93101261cfaeaa790bd61c9101542f1eea6edeeab18027baaa8395124c4b1e92cbd
6
+ metadata.gz: 7d896dd686fc5aef5020c0f1042534c9e8764ae3c7fe1fcc66785a3655bf9b5745e874bbba177f5d5d379bfc5902b8c98344bf2f6d8f7be7ea3784080095fce1
7
+ data.tar.gz: 4ca09aeaa35f658ce10ce29a760a8c2844c074413d2629b9509056de0263a0771d57997a144caf8de61cb3e7be1125e454bcde24df5a93d20e8ff7267a637139
data/.travis.yml CHANGED
@@ -1,5 +1,11 @@
1
- sudo: false
2
1
  language: ruby
3
2
  rvm:
4
- - 2.3.3
5
- before_install: gem install bundler -v 1.13.6
3
+ - 2.5
4
+ - 2.6
5
+ - 2.7
6
+ before_install: gem install bundler -v 1.16.2
7
+ gemfile:
8
+ - gemfiles/5.0.gemfile
9
+ - gemfiles/5.1.gemfile
10
+ - gemfiles/5.2.gemfile
11
+ - gemfiles/6.0.gemfile
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 Kenn Ejima
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 CHANGED
@@ -9,6 +9,10 @@ Perfect solution to store multiple boolean values such as preferences, notificat
9
9
  * **Single column to group multiple boolean values.** You don't need to have many separate columns. You don't even need a migration when you add a new flag item to the list.
10
10
  * **Fast bitwise operations.** `WHERE languages & 3 > 0` is faster than `WHERE (english = true) OR (spanish = true) OR ...`
11
11
 
12
+ If you want a simple enum column, take a look at [EnumAccessor](https://github.com/kenn/enum_accessor).
13
+
14
+ If you need to work with huge bit arrays, take a look at [Bitwise](https://github.com/kenn/bitwise).
15
+
12
16
  ## Usage
13
17
 
14
18
  ```ruby
@@ -16,6 +20,8 @@ class Profile < ActiveRecord::Base
16
20
  flag :languages, [:english, :spanish, :chinese, :french, :japanese]
17
21
  end
18
22
 
23
+ # {:english=>1, :spanish=>2, :chinese=>4, :french=>8, :japanese=>16 }
24
+
19
25
  # Instance methods
20
26
  profile.languages #=> #<ActiveFlag::Value: {:english, :japanese}>
21
27
  profile.languages.english? #=> true
@@ -30,8 +36,12 @@ profile.languages.to_a #=> [:english, :spanish]
30
36
  profile.languages = [:spanish, :japanese] # Direct assignment that works with forms
31
37
 
32
38
  # Class methods
33
- Profile.where_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 > 0
34
39
  Profile.languages.maps #=> {:english=>1, :spanish=>2, :chinese=>4, :french=>8, :japanese=>16 }
40
+ Profile.languages.humans #=> {:english=>"English", :spanish=>"Spanish", :chinese=>"Chinese", :french=>"French", :japanese=>"Japanese"}
41
+ Profile.languages.pairs #=> {"English"=>:english, "Spanish"=>:spanish, "Chinese"=>:chinese, "French"=>:french, "Japanese"=>:japanese}
42
+
43
+ # Scope methods
44
+ Profile.where_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 > 0
35
45
  Profile.languages.set_all!(:chinese) #=> UPDATE "profiles" SET languages = COALESCE(languages, 0) | 4
36
46
  Profile.languages.unset_all!(:chinese) #=> UPDATE "profiles" SET languages = COALESCE(languages, 0) & ~4
37
47
  ```
@@ -44,7 +54,7 @@ gem 'active_flag'
44
54
 
45
55
  ### Migration
46
56
 
47
- Always set `0` as a default.
57
+ It is recommended to set `0` by default.
48
58
 
49
59
  ```ruby
50
60
  t.integer :languages, null: false, default: 0, limit: 8
@@ -59,7 +69,7 @@ add_column :users, :languages, :integer, null: false, default: 0, limit: 8
59
69
  For a querying purpose, use `where_[column]` scope.
60
70
 
61
71
  ```ruby
62
- Profile.where_languages(:french) #=> SELECT * FROM profiles WHERE languages = 8
72
+ Profile.where_languages(:french) #=> SELECT * FROM profiles WHERE languages & 8 > 0
63
73
  ```
64
74
 
65
75
  Also takes multiple values.
@@ -73,7 +83,7 @@ By default, it searches with `or` operation, so the query above returns profiles
73
83
  If you want to change it to `and` operation, you can specify:
74
84
 
75
85
  ```ruby
76
- Profile.where_languages(:french, :spanish, op: :and)
86
+ Profile.where_languages(:french, :spanish, op: :and) #=> SELECT * FROM profiles WHERE languages = 10
77
87
  ```
78
88
 
79
89
  ## Translation
@@ -110,10 +120,12 @@ Thanks to the translation support, forms just work as you would expect with the
110
120
 
111
121
  ```ruby
112
122
  # With FormBuilder
123
+
113
124
  = form_for(@profile) do |f|
114
125
  = f.collection_check_boxes :languages, Profile.languages.pairs
115
126
 
116
127
  # With SimpleForm
128
+
117
129
  = simple_form_for(@profile) do |f|
118
130
  = f.input :languages, as: :check_boxes, collection: Profile.languages.pairs
119
131
  ```
data/active_flag.gemspec CHANGED
@@ -16,10 +16,10 @@ Gem::Specification.new do |spec|
16
16
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
17
  f.match(%r{^(test|spec|features)/})
18
18
  end
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_runtime_dependency 'activerecord', '< 6'
22
+ spec.add_runtime_dependency 'activerecord', '>= 5'
23
23
  spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake'
25
25
  spec.add_development_dependency 'minitest'
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "activerecord", "~> 5.0"
4
+
5
+ group :development, :test do
6
+ gem "bundler"
7
+ gem "rake"
8
+ gem "minitest"
9
+ gem "sqlite3"
10
+ end
11
+
12
+ gemspec :path => "../"
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "activerecord", "~> 5.1"
4
+
5
+ group :development, :test do
6
+ gem "bundler"
7
+ gem "rake"
8
+ gem "minitest"
9
+ gem "sqlite3"
10
+ end
11
+
12
+ gemspec :path => "../"
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "activerecord", "~> 5.2"
4
+
5
+ group :development, :test do
6
+ gem "bundler"
7
+ gem "rake"
8
+ gem "minitest"
9
+ gem "sqlite3"
10
+ end
11
+
12
+ gemspec :path => "../"
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "activerecord", "~> 6"
4
+
5
+ group :development, :test do
6
+ gem "bundler"
7
+ gem "rake"
8
+ gem "minitest"
9
+ gem "sqlite3"
10
+ end
11
+
12
+ gemspec :path => "../"
@@ -5,14 +5,14 @@ module ActiveFlag
5
5
  def initialize(column, keys, klass)
6
6
  @column = column
7
7
  @keys = keys.freeze
8
- @maps = Hash[keys.map.with_index{|key, i| [key, 2**i] }].freeze
8
+ @maps = Hash[keys.map.with_index{ |key, i| [key, 2**i] }].freeze
9
9
  @klass = klass
10
10
  end
11
11
 
12
12
  def humans
13
13
  @humans ||= {}
14
14
  @humans[I18n.locale] ||= begin
15
- @keys.map{|key| [key, human(key)] }.to_h
15
+ @keys.map { |key| [key, human(key)] }.to_h
16
16
  end
17
17
  end
18
18
 
@@ -34,7 +34,8 @@ module ActiveFlag
34
34
 
35
35
  def to_i(arg)
36
36
  arg = [arg] unless arg.is_a?(Enumerable)
37
- arg.map{|s| s && @maps[s.to_s.to_sym] || 0 }.sum
37
+ arg = arg.uniq
38
+ arg.map { |s| s && @maps[s.to_s.to_sym] || 0 }.sum
38
39
  end
39
40
 
40
41
  def to_value(instance, integer)
@@ -42,7 +43,7 @@ module ActiveFlag
42
43
  end
43
44
 
44
45
  def to_array(integer)
45
- @maps.map{|key, mask| (integer & mask > 0) ? key : nil }.compact
46
+ @maps.map { |key, mask| (integer & mask > 0) ? key : nil }.compact
46
47
  end
47
48
 
48
49
  private
@@ -58,7 +59,7 @@ module ActiveFlag
58
59
  defaults << :"active_flag.#{@column}.#{key}"
59
60
  defaults << options.delete(:default) if options[:default]
60
61
  defaults << key.to_s.humanize
61
- I18n.translate defaults.shift, options.reverse_merge(count: 1, default: defaults)
62
+ I18n.translate defaults.shift, **options.reverse_merge(count: 1, default: defaults)
62
63
  end
63
64
  end
64
65
  end
@@ -8,7 +8,7 @@ module ActiveFlag
8
8
  end
9
9
 
10
10
  def raw
11
- @instance.read_attribute(@column)
11
+ @instance.read_attribute(@column).to_i
12
12
  end
13
13
 
14
14
  def to_human
@@ -29,12 +29,12 @@ module ActiveFlag
29
29
 
30
30
  def set!(key, options={})
31
31
  set(key)
32
- @instance.save!(options)
32
+ @instance.save!(**options)
33
33
  end
34
34
 
35
35
  def unset!(key, options={})
36
36
  unset(key)
37
- @instance.save!(options)
37
+ @instance.save!(**options)
38
38
  end
39
39
 
40
40
  def set?(key)
@@ -1,3 +1,3 @@
1
1
  module ActiveFlag
2
- VERSION = '1.3.0'
2
+ VERSION = '1.5.1'
3
3
  end
data/lib/active_flag.rb CHANGED
@@ -20,7 +20,7 @@ module ActiveFlag
20
20
 
21
21
  # Getter
22
22
  define_method column do
23
- self.class.active_flags[column].to_value(self, read_attribute(column))
23
+ self.class.active_flags[column].to_value(self, read_attribute(column).to_i)
24
24
  end
25
25
 
26
26
  # Setter
@@ -41,11 +41,7 @@ module ActiveFlag
41
41
  if options[:op] == :and
42
42
  where("#{column_name} & #{integer} = #{integer}")
43
43
  else
44
- if integer & (integer - 1) == 0 # Power of 2, single bit
45
- where("#{column_name} = #{integer}")
46
- else
47
- where("#{column_name} & #{integer} > 0")
48
- end
44
+ where("#{column_name} & #{integer} > 0")
49
45
  end
50
46
  end
51
47
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_flag
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenn Ejima
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-30 00:00:00.000000000 Z
11
+ date: 2021-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "<"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '6'
19
+ version: '5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "<"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '6'
26
+ version: '5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -83,20 +83,23 @@ dependencies:
83
83
  description: Bit array for ActiveRecord
84
84
  email:
85
85
  - kenn.ejima@gmail.com
86
- executables:
87
- - console
88
- - setup
86
+ executables: []
89
87
  extensions: []
90
88
  extra_rdoc_files: []
91
89
  files:
92
90
  - ".gitignore"
93
91
  - ".travis.yml"
94
92
  - Gemfile
93
+ - LICENSE
95
94
  - README.md
96
95
  - Rakefile
97
96
  - active_flag.gemspec
98
97
  - bin/console
99
98
  - bin/setup
99
+ - gemfiles/5.0.gemfile
100
+ - gemfiles/5.1.gemfile
101
+ - gemfiles/5.2.gemfile
102
+ - gemfiles/6.0.gemfile
100
103
  - lib/active_flag.rb
101
104
  - lib/active_flag/definition.rb
102
105
  - lib/active_flag/railtie.rb
@@ -105,7 +108,7 @@ files:
105
108
  homepage: https://github.com/kenn/active_flag
106
109
  licenses: []
107
110
  metadata: {}
108
- post_install_message:
111
+ post_install_message:
109
112
  rdoc_options: []
110
113
  require_paths:
111
114
  - lib
@@ -120,9 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
123
  - !ruby/object:Gem::Version
121
124
  version: '0'
122
125
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.6.13
125
- signing_key:
126
+ rubygems_version: 3.0.9
127
+ signing_key:
126
128
  specification_version: 4
127
129
  summary: Bit array for ActiveRecord
128
130
  test_files: []