active_flag 1.3.0 → 1.5.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 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: []