active_flag 1.3.1 → 1.5.2

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
2
  SHA256:
3
- metadata.gz: 82ed02ade36127c22ddb473bdb99f143c24ef947a627471a008ef2eb041fdf7d
4
- data.tar.gz: 8fd425385b261ed0c48d6d8e6c31ea331da15729a4dfdc3180d8b9372a62d8a8
3
+ metadata.gz: 2138875041460aa14daf08205e785d254a98de7480493ba02384b0e7532e46ec
4
+ data.tar.gz: 2d73e184d76e622527418ee6f7d631d94af443d0e64af90784d57e924eee7377
5
5
  SHA512:
6
- metadata.gz: 6201b09680599d5353fb6c92c0dceff510e91c8d546f5ad9ceef1a36a180d6ea2f5c04cf1fc8add40e9333ff0fe3cc837871875ca90990ca18d618a5d6f076cb
7
- data.tar.gz: e6551b8042c69e39371271f8aa7517e83f7db0abf55c6153e9eca01075d0f8e8312b8660230442b2b6a5da4ff2e372db300d8222dcecec59dfc831f1e05d2250
6
+ metadata.gz: d3df91d0240c5974605780a6a20adfbe251421b85232c12fd422bd222f42e5822cb4896aeb08ea6c9e0103cc451c80d6018a1dd0ef1eec4f43f19fc21b4890fd
7
+ data.tar.gz: 455b9ed794b025f0c05235f6163053938565c3762f053469a0c9f3855de83918460bced3b28ebfaa56f2ca77fc41f996ed114fe10e7f99b003a484d7f23e0682
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,13 @@ 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
+ Profile.languages.to_array(3) #=> [:english, :spanish]
43
+
44
+ # Scope methods
45
+ Profile.where_languages(:french, :spanish) #=> SELECT * FROM profiles WHERE languages & 10 > 0
35
46
  Profile.languages.set_all!(:chinese) #=> UPDATE "profiles" SET languages = COALESCE(languages, 0) | 4
36
47
  Profile.languages.unset_all!(:chinese) #=> UPDATE "profiles" SET languages = COALESCE(languages, 0) & ~4
37
48
  ```
@@ -44,7 +55,7 @@ gem 'active_flag'
44
55
 
45
56
  ### Migration
46
57
 
47
- Always set `0` as a default.
58
+ It is recommended to set `0` by default.
48
59
 
49
60
  ```ruby
50
61
  t.integer :languages, null: false, default: 0, limit: 8
@@ -59,7 +70,7 @@ add_column :users, :languages, :integer, null: false, default: 0, limit: 8
59
70
  For a querying purpose, use `where_[column]` scope.
60
71
 
61
72
  ```ruby
62
- Profile.where_languages(:french) #=> SELECT * FROM profiles WHERE languages = 8
73
+ Profile.where_languages(:french) #=> SELECT * FROM profiles WHERE languages & 8 > 0
63
74
  ```
64
75
 
65
76
  Also takes multiple values.
@@ -73,7 +84,7 @@ By default, it searches with `or` operation, so the query above returns profiles
73
84
  If you want to change it to `and` operation, you can specify:
74
85
 
75
86
  ```ruby
76
- Profile.where_languages(:french, :spanish, op: :and)
87
+ Profile.where_languages(:french, :spanish, op: :and) #=> SELECT * FROM profiles WHERE languages = 10
77
88
  ```
78
89
 
79
90
  ## Translation
@@ -110,10 +121,12 @@ Thanks to the translation support, forms just work as you would expect with the
110
121
 
111
122
  ```ruby
112
123
  # With FormBuilder
124
+
113
125
  = form_for(@profile) do |f|
114
126
  = f.collection_check_boxes :languages, Profile.languages.pairs
115
127
 
116
128
  # With SimpleForm
129
+
117
130
  = simple_form_for(@profile) do |f|
118
131
  = f.input :languages, as: :check_boxes, collection: Profile.languages.pairs
119
132
  ```
data/active_flag.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
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
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  module ActiveFlag
2
4
  class Value < Set
3
5
  def with(instance, definition)
@@ -8,7 +10,7 @@ module ActiveFlag
8
10
  end
9
11
 
10
12
  def raw
11
- @instance.read_attribute(@column)
13
+ @instance.read_attribute(@column).to_i
12
14
  end
13
15
 
14
16
  def to_human
@@ -29,12 +31,12 @@ module ActiveFlag
29
31
 
30
32
  def set!(key, options={})
31
33
  set(key)
32
- @instance.save!(options)
34
+ @instance.save!(**options)
33
35
  end
34
36
 
35
37
  def unset!(key, options={})
36
38
  unset(key)
37
- @instance.save!(options)
39
+ @instance.save!(**options)
38
40
  end
39
41
 
40
42
  def set?(key)
@@ -1,3 +1,3 @@
1
1
  module ActiveFlag
2
- VERSION = '1.3.1'
2
+ VERSION = '1.5.2'
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.1
4
+ version: 1.5.2
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: 2018-01-11 00:00:00.000000000 Z
11
+ date: 2022-01-30 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
@@ -90,11 +90,16 @@ files:
90
90
  - ".gitignore"
91
91
  - ".travis.yml"
92
92
  - Gemfile
93
+ - LICENSE
93
94
  - README.md
94
95
  - Rakefile
95
96
  - active_flag.gemspec
96
97
  - bin/console
97
98
  - bin/setup
99
+ - gemfiles/5.0.gemfile
100
+ - gemfiles/5.1.gemfile
101
+ - gemfiles/5.2.gemfile
102
+ - gemfiles/6.0.gemfile
98
103
  - lib/active_flag.rb
99
104
  - lib/active_flag/definition.rb
100
105
  - lib/active_flag/railtie.rb
@@ -103,7 +108,7 @@ files:
103
108
  homepage: https://github.com/kenn/active_flag
104
109
  licenses: []
105
110
  metadata: {}
106
- post_install_message:
111
+ post_install_message:
107
112
  rdoc_options: []
108
113
  require_paths:
109
114
  - lib
@@ -118,9 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
123
  - !ruby/object:Gem::Version
119
124
  version: '0'
120
125
  requirements: []
121
- rubyforge_project:
122
- rubygems_version: 2.7.3
123
- signing_key:
126
+ rubygems_version: 3.0.9
127
+ signing_key:
124
128
  specification_version: 4
125
129
  summary: Bit array for ActiveRecord
126
130
  test_files: []