user_preferences 1.0.2 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9497008fda8a61268850e1d143b06ef8a3fbb86c3522743937f24c2b52c4ce19
4
- data.tar.gz: 608d6887848c262643377b31e9fe9a0945d74de1fdfb1942cbe9e064fc325a44
3
+ metadata.gz: 56630a9e0cda0587b9e48a3a792348a1d7fba4ca896912a402440637c5d6953a
4
+ data.tar.gz: 85fbca242599c833fc51fa2c40ea0f76e9818456457c1eae59aaec289b96a985
5
5
  SHA512:
6
- metadata.gz: c1cde706556602fecf88ef7d0e79d9529380fd59ced9afedd9e692b8f51b52212d87ddb97c85f7bfadb6587d6bb59991fa079f9652b9a77a782a6b02acc4df83
7
- data.tar.gz: 7390f2ab4cab54c6762af39328909999ac9f3ec1c637eba83cd7e0dd6ae3b1ac78b371269de5c68f7475e3bd1b8fc4f54c9ffbc9f9b2310b057a12948e9b8ad1
6
+ metadata.gz: 348794170b9f325025af4312da74700d5ab49770a6bcc196ced62d32cc65e5e11aa31ca4d16633821e43e3b3d56112779ffe7bb02e330f4deb300d080f2cd76c
7
+ data.tar.gz: 0c0b17c199fe59db5d9e3e072ba665759dcde53a29186124ebae29afe23e2223a5e021d5db5711d3140fd1516a808de69f163eed5494a29b9f25b7ec07c86ce2
@@ -0,0 +1,34 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ ruby-version: ['3.3', '3.4', '4.0']
20
+ gemfile:
21
+ - rails_8.0
22
+ - rails_8.1
23
+ env:
24
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
25
+
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - name: Set up Ruby
29
+ uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby-version }}
32
+ bundler-cache: true
33
+ - name: Run tests
34
+ run: bundle exec rake
data/Appraisals CHANGED
@@ -1,14 +1,11 @@
1
- appraise "rails-4" do
2
- gem "rails", "~> 4"
3
- gem "sprockets", "~> 3.7"
4
- gem "sqlite3", "~> 1.3.6"
1
+ appraise "rails-8.0" do
2
+ gem "rails", "~> 8.0.0"
5
3
  end
6
4
 
7
- appraise "rails-5" do
8
- gem "rails", "~> 5.0"
9
- gem "sprockets", "~> 3.7"
5
+ appraise "rails-8.1" do
6
+ gem "rails", "~> 8.1.0"
10
7
  end
11
8
 
12
- appraise "rails-6" do
13
- gem "rails", "~> 6.0"
9
+ appraise "rails-7" do
10
+ gem "rails", "~> 7.0"
14
11
  end
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.0 2026-07-22
4
+ * Add `acts_as_binary` support for multi-value preferences while preserving binary input compatibility
5
+ * Fix setting binary preferences with integer values on Ruby 3.2 and later
6
+ * Support Rails 8.0 and 8.1 and Ruby 3.3 through 4.0
7
+
3
8
  ## 1.0.1 2019-10-17
4
9
  * Fix compatibility with Rails 6
5
10
  * Support modern Ruby versions
data/README.md CHANGED
@@ -77,6 +77,22 @@ emails:
77
77
  newsletters: false
78
78
  ```
79
79
 
80
+ Binary preferences can be enhanced to support multiple values while maintaining backwards compatibility on the API side:
81
+
82
+ ```yaml
83
+ emails:
84
+ notifications:
85
+ default: true
86
+ acts_as_binary: true
87
+ values:
88
+ - false
89
+ - true
90
+ - email
91
+ - push
92
+ ```
93
+
94
+ This will support setting the preference using integers, booleans, and strings for the first 2 values.
95
+
80
96
  You can add as many categories as you like:
81
97
 
82
98
  ```yaml
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 6.0"
5
+ gem "rails", "~> 8.0.0"
6
6
 
7
7
  gemspec path: "../"
@@ -2,7 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 5.0"
6
- gem "sprockets", "~> 3.7"
5
+ gem "rails", "~> 8.1.0"
7
6
 
8
7
  gemspec path: "../"
@@ -24,12 +24,23 @@ module UserPreferences
24
24
  binary? ? @definition : @definition[:default]
25
25
  end
26
26
 
27
+ def acts_as_binary?
28
+ !binary? && @definition[:acts_as_binary] == true
29
+ end
30
+
27
31
  def lookup(index)
28
32
  permitted_values[index] if index
29
33
  end
30
34
 
31
35
  def to_db(value)
32
- value = to_bool(value) if binary?
36
+ value = if binary?
37
+ to_bool_force(value)
38
+ elsif acts_as_binary?
39
+ to_bool_maybe(value)
40
+ else
41
+ value
42
+ end
43
+
33
44
  permitted_values.index(value)
34
45
  end
35
46
 
@@ -37,11 +48,23 @@ module UserPreferences
37
48
 
38
49
  def to_bool(value)
39
50
  return true if value == 1
40
- return true if value == true || value =~ (/^(true|t|yes|y|1)$/i)
51
+ return true if value == true || value.to_s =~ (/^(true|t|yes|y|1)$/i)
41
52
 
42
53
  return false if value == 0
43
- return false if value == false || value.blank? || value =~ (/^(false|f|no|n|0)$/i)
44
- raise ArgumentError.new("invalid value for Boolean: \"#{value}\"")
54
+ return false if value == false || value.blank? || value.to_s =~ (/^(false|f|no|n|0)$/i)
55
+ end
56
+
57
+ def to_bool_force(value)
58
+ value = to_bool(value)
59
+ raise ArgumentError.new("invalid value for Boolean: \"#{value}\"") if value.nil?
60
+
61
+ value
62
+ end
63
+
64
+ def to_bool_maybe(value)
65
+ boolean = to_bool(value)
66
+
67
+ boolean.nil? ? value : boolean
45
68
  end
46
69
  end
47
70
  end
@@ -1,3 +1,3 @@
1
1
  module UserPreferences
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -17,3 +17,12 @@ food:
17
17
  - red
18
18
  - white
19
19
 
20
+ notifications:
21
+ followed_user:
22
+ acts_as_binary: true
23
+ default: true
24
+ values:
25
+ - false
26
+ - true
27
+ - email
28
+ - push
data/spec/spec_helper.rb CHANGED
@@ -5,12 +5,8 @@ require 'active_record/connection_adapters/sqlite3_adapter'
5
5
  RSpec.configure do |config|
6
6
  $stdout = StringIO.new # silence migrations
7
7
  ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
8
- if ActiveRecord::VERSION::MAJOR >= 5
9
- ActiveRecord::Migrator.migrations_paths = File.expand_path('../migrations', __FILE__)
10
- ActiveRecord::Base.connection.migration_context.migrate
11
- else
12
- ActiveRecord::Migrator.migrate(File.expand_path('../migrations', __FILE__))
13
- end
8
+ migrations_paths = File.expand_path('../migrations', __FILE__)
9
+ ActiveRecord::MigrationContext.new(migrations_paths).migrate
14
10
  $stdout = STDOUT
15
11
 
16
12
  # prevent deprecation warnings
@@ -16,6 +16,9 @@ describe UserPreferences::Defaults do
16
16
  a_la_carte: true,
17
17
  courses: 2,
18
18
  wine: 'red'
19
+ },
20
+ notifications: {
21
+ followed_user: true
19
22
  }
20
23
  }
21
24
  )
@@ -30,4 +33,4 @@ describe UserPreferences::Defaults do
30
33
  end
31
34
  end
32
35
  end
33
- end
36
+ end
@@ -87,4 +87,36 @@ describe UserPreferences::PreferenceDefinition do
87
87
  end
88
88
  end
89
89
  end
90
- end
90
+
91
+ context 'non-binary preference acting as binary' do
92
+ subject(:preference) do
93
+ definition = UserPreferences.definitions[:notifications][:followed_user]
94
+ UserPreferences::PreferenceDefinition.new(definition, :notifications, :followed_user)
95
+ end
96
+
97
+ describe '#binary?' do
98
+ it 'is false' do
99
+ expect(preference.binary?).to eq(false)
100
+ end
101
+ end
102
+
103
+ describe '#default' do
104
+ it 'returns the default preference value' do
105
+ expect(preference.default).to eq(true)
106
+ end
107
+ end
108
+
109
+ describe '#to_db' do
110
+ it 'casts the first 2 values to booleans' do
111
+ expect(preference.to_db(0)).to eq(0)
112
+ expect(preference.to_db(1)).to eq(1)
113
+ expect(preference.to_db(2)).to eq(nil)
114
+ end
115
+
116
+ it 'casts true/false strings to booleans' do
117
+ expect(preference.to_db('false')).to eq(0)
118
+ expect(preference.to_db('true')).to eq(1)
119
+ end
120
+ end
121
+ end
122
+ end
@@ -19,11 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency 'activerecord', '>= 4.0'
22
+ spec.add_dependency 'activerecord', '>= 5.0'
23
23
 
24
- spec.add_development_dependency "appraisal"
25
- spec.add_development_dependency "bundler", "~> 1.7"
26
- spec.add_development_dependency "rake", "~> 12.3.3"
27
- spec.add_development_dependency 'rspec', '~> 3.9.0'
24
+ spec.add_development_dependency 'appraisal'
25
+ spec.add_development_dependency 'bundler'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec'
28
28
  spec.add_development_dependency 'sqlite3'
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_preferences
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Dust
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-02 00:00:00.000000000 Z
11
+ date: 2026-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: '5.0'
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: '4.0'
26
+ version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: appraisal
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,44 +42,44 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '1.7'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '1.7'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 12.3.3
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 12.3.3
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 3.9.0
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 3.9.0
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: sqlite3
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -103,17 +103,16 @@ executables: []
103
103
  extensions: []
104
104
  extra_rdoc_files: []
105
105
  files:
106
+ - ".github/workflows/ruby.yml"
106
107
  - ".gitignore"
107
- - ".travis.yml"
108
108
  - Appraisals
109
109
  - CHANGELOG.md
110
110
  - Gemfile
111
111
  - LICENSE.txt
112
112
  - README.md
113
113
  - Rakefile
114
- - gemfiles/rails_4.gemfile
115
- - gemfiles/rails_5.gemfile
116
- - gemfiles/rails_6.gemfile
114
+ - gemfiles/rails_8.0.gemfile
115
+ - gemfiles/rails_8.1.gemfile
117
116
  - lib/generators/user_preferences/install_generator.rb
118
117
  - lib/generators/user_preferences/templates/migration.rb
119
118
  - lib/generators/user_preferences/templates/user_preferences.yml
@@ -140,7 +139,7 @@ homepage: http://github.com/mubi/user_preferences
140
139
  licenses:
141
140
  - MIT
142
141
  metadata: {}
143
- post_install_message:
142
+ post_install_message:
144
143
  rdoc_options: []
145
144
  require_paths:
146
145
  - lib
@@ -155,8 +154,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
154
  - !ruby/object:Gem::Version
156
155
  version: '0'
157
156
  requirements: []
158
- rubygems_version: 3.0.3
159
- signing_key:
157
+ rubygems_version: 3.5.22
158
+ signing_key:
160
159
  specification_version: 4
161
160
  summary: User preferences gem for Rails.
162
161
  test_files:
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.3
5
- - 2.4
6
- - 2.5
7
- - 2.6
8
- gemfile:
9
- - gemfiles/rails_4.gemfile
10
- - gemfiles/rails_5.gemfile
11
- - gemfiles/rails_6.gemfile
12
- matrix:
13
- exclude:
14
- - rvm: 2.3
15
- gemfile: gemfiles/rails_6.gemfile
16
- - rvm: 2.4
17
- gemfile: gemfiles/rails_6.gemfile
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rails", "~> 4"
6
- gem "sprockets", "~> 3.7"
7
- gem "sqlite3", "~> 1.3.6"
8
-
9
- gemspec path: "../"