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 +4 -4
- data/.github/workflows/ruby.yml +34 -0
- data/Appraisals +6 -9
- data/CHANGELOG.md +5 -0
- data/README.md +16 -0
- data/gemfiles/{rails_6.gemfile → rails_8.0.gemfile} +1 -1
- data/gemfiles/{rails_5.gemfile → rails_8.1.gemfile} +1 -2
- data/lib/user_preferences/preference_definition.rb +27 -4
- data/lib/user_preferences/version.rb +1 -1
- data/spec/fixtures/user_preferences.yml +9 -0
- data/spec/spec_helper.rb +2 -6
- data/spec/user_preferences/defaults_spec.rb +4 -1
- data/spec/user_preferences/preference_definition_spec.rb +33 -1
- data/user_preferences.gemspec +5 -5
- metadata +23 -24
- data/.travis.yml +0 -17
- data/gemfiles/rails_4.gemfile +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 56630a9e0cda0587b9e48a3a792348a1d7fba4ca896912a402440637c5d6953a
|
|
4
|
+
data.tar.gz: 85fbca242599c833fc51fa2c40ea0f76e9818456457c1eae59aaec289b96a985
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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-
|
|
2
|
-
gem "rails", "~>
|
|
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-
|
|
8
|
-
gem "rails", "~>
|
|
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-
|
|
13
|
-
gem "rails", "~>
|
|
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
|
|
@@ -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 =
|
|
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
|
-
|
|
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
|
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
|
-
|
|
9
|
-
|
|
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
|
|
@@ -87,4 +87,36 @@ describe UserPreferences::PreferenceDefinition do
|
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
|
-
|
|
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
|
data/user_preferences.gemspec
CHANGED
|
@@ -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', '>=
|
|
22
|
+
spec.add_dependency 'activerecord', '>= 5.0'
|
|
23
23
|
|
|
24
|
-
spec.add_development_dependency
|
|
25
|
-
spec.add_development_dependency
|
|
26
|
-
spec.add_development_dependency
|
|
27
|
-
spec.add_development_dependency 'rspec'
|
|
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
|
|
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:
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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/
|
|
115
|
-
- gemfiles/
|
|
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.
|
|
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
|